merge mainline into newreloc
This commit is contained in:
commit
13f58ea31f
59 changed files with 1342 additions and 11023 deletions
299
ChangeLog
299
ChangeLog
|
@ -1,3 +1,302 @@
|
|||
2010-05-17 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
Remove grub-mkisofs.
|
||||
|
||||
* conf/common.rmk (bin_UTILITIES): Remove grub-mkisofs.
|
||||
(grub_mkisofs_SOURCES): Removed.
|
||||
(grub_mkisofs_CFLAGS): Removed.
|
||||
* util/mkisofs/defaults.h: Removed.
|
||||
* util/mkisofs/eltorito.c: Likewise.
|
||||
* util/mkisofs/exclude.h: Likewise.
|
||||
* util/mkisofs/hash.c: Likewise.
|
||||
* util/mkisofs/include/: Likewise.
|
||||
* util/mkisofs/include/fctldefs.h: Likewise.
|
||||
* util/mkisofs/include/mconfig.h: Likewise.
|
||||
* util/mkisofs/include/prototyp.h: Likewise.
|
||||
* util/mkisofs/include/statdefs.h: Likewise.
|
||||
* util/mkisofs/iso9660.h: Likewise.
|
||||
* util/mkisofs/joliet.c: Likewise.
|
||||
* util/mkisofs/match.c: Likewise.
|
||||
* util/mkisofs/match.h: Likewise.
|
||||
* util/mkisofs/mkisofs.c: Likewise.
|
||||
* util/mkisofs/mkisofs.h: Likewise.
|
||||
* util/mkisofs/msdos_partition.h: Likewise.
|
||||
* util/mkisofs/multi.c: Likewise.
|
||||
* util/mkisofs/name.c: Likewise.
|
||||
* util/mkisofs/rock.c: Likewise.
|
||||
* util/mkisofs/tree.c: Likewise.
|
||||
* util/mkisofs/write.c: Likewise.
|
||||
|
||||
2010-05-17 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
Unify grub-mkimage accross platforms.
|
||||
|
||||
* Makefile.in (CPPFLAGS): Set GRUB_LIBDIR to $(libdir).
|
||||
* conf/common.rmk (bin_UTILITIES): Removed grub-mkelfimage.
|
||||
(grub_mkelfimage_SOURCES): Removed.
|
||||
(util/elf/grub-mkimage.c_DEPENDENCIES): Renamed to ..
|
||||
(util/grub-mkimage.c_DEPENDENCIES): .. this.
|
||||
(bin_UTILITIES): Add grub-mkimage.
|
||||
(grub_mkimage_SOURCES): New variable.
|
||||
(kernel_img_HEADERS): Remove machine/kernel.h.
|
||||
* conf/i386-pc.rmk (pkglib_IMAGES): Remove kernel.img.
|
||||
(pkglib_PROGRAMS): Add kernel.img.
|
||||
(kernel_img_HEADERS): Add machine/kernel.h.
|
||||
(kernel_img_FORMAT): Removed.
|
||||
(bin_UTILITIES): Remove grub-mkimage.
|
||||
(grub_mkimage_SOURCES): Removed.
|
||||
(grub_mkimage_CFLAGS): Likewise.
|
||||
(util/grub-mkrawimage.c_DEPENDENCIES): Likewise.
|
||||
* conf/i386-qemu.rmk (pkglib_IMAGES): Remove kernel.img.
|
||||
(pkglib_PROGRAMS): Add kernel.img.
|
||||
(bin_UTILITIES): Remove grub-mkimage.
|
||||
(grub_mkimage_SOURCES): Removed.
|
||||
(grub_mkimage_CFLAGS): Likewise.
|
||||
(util/grub-mkrawimage.c_DEPENDENCIES): Likewise.
|
||||
* conf/mips-qemu-mips.rmk (pkglib_IMAGES): Remove kernel.img.
|
||||
(pkglib_PROGRAMS): Add kernel.img.
|
||||
* conf/mips-yeeloong.rmk (pkglib_IMAGES): Remove kernel.img.
|
||||
(pkglib_PROGRAMS): Add kernel.img.
|
||||
* conf/mips.rmk (bin_UTILITIES): Remove grub-mkimage.
|
||||
(grub_mkimage_SOURCES): Removed.
|
||||
(grub_mkimage_CFLAGS): Likewise.
|
||||
(util/grub-mkrawimage.c_DEPENDENCIES): Likewise.
|
||||
* conf/sparc64-ieee1275.rmk (pkglib_IMAGES): Remove kernel.img.
|
||||
(pkglib_PROGRAMS): Add kernel.img.
|
||||
(bin_UTILITIES): Remove grub-mkimage.
|
||||
(grub_mkimage_SOURCES): Removed.
|
||||
(grub_mkimage_CFLAGS): Likewise.
|
||||
(util/grub-mkrawimage.c_DEPENDENCIES): Likewise.
|
||||
* conf/x86-efi.rmk (bin_UTILITIES): Remove grub-mkimage.
|
||||
(grub_mkimage_SOURCES): Removed.
|
||||
(grub_mkimage_CFLAGS): Likewise.
|
||||
(util/grub-mkrawimage.c_DEPENDENCIES): Likewise.
|
||||
* configure.ac (machine_CFLAGS): Add "-DMACHINE".
|
||||
* include/grub/efi/pe32.h (grub_pe32_optional_header): Split into ...
|
||||
(grub_pe32_optional_header): ... this.
|
||||
(grub_pe64_optional_header): ... and this. All users updated.
|
||||
(GRUB_PE32_PE32_MAGIC): Split into ..
|
||||
(GRUB_PE32_PE32_MAGIC): .. this.
|
||||
(GRUB_PE32_PE64_MAGIC): .. and this.
|
||||
(GRUB_PE32_SIGNATURE_SIZE): New definition.
|
||||
* include/grub/elf.h (PT_GNU_STACK): New definition.
|
||||
* include/grub/i386/coreboot/kernel.h: Merged into include/grub/offsets.h. All users updated.
|
||||
* include/grub/i386/efi/kernel.h: Likewise.
|
||||
* include/grub/i386/kernel.h: Likewise.
|
||||
* include/grub/i386/pc/kernel.h: Likewise.
|
||||
* include/grub/i386/qemu/boot.h: Likewise.
|
||||
* include/grub/mips/kernel.h: Likewise.
|
||||
* include/grub/mips/qemu-mips/kernel.h: Likewise.
|
||||
* include/grub/powerpc/ieee1275/kernel.h: Likewise.
|
||||
* include/grub/powerpc/kernel.h: Likewise.
|
||||
* include/grub/sparc64/ieee1275/boot.h: Likewise.
|
||||
* include/grub/sparc64/ieee1275/kernel.h: Likewise.
|
||||
* include/grub/sparc64/kernel.h: Likewise.
|
||||
* include/grub/x86_64/efi/kernel.h: Likewise.
|
||||
* include/grub/x86_64/kernel.h: Likewise.
|
||||
* include/grub/offsets.h: New file.
|
||||
* include/grub/kernel.h (grub_module_info): Split into ...
|
||||
(grub_module_info32): ... this.
|
||||
(grub_module_info64): ... and this.
|
||||
* include/grub/i386/pc/boot.h (GRUB_BOOT_MACHINE_KERNEL_SEG): Moved from here ...
|
||||
* include/grub/offsets.h (GRUB_BOOT_I386_PC_KERNEL_SEG): ... here.
|
||||
(grub_boot_blocklist): Moved from here ...
|
||||
* include/grub/offsets.h (grub_pc_bios_boot_blocklist): ... here.
|
||||
* include/grub/i386/pc/memory.h (GRUB_MEMORY_MACHINE_UPPER): Moved from here.
|
||||
* include/grub/offsets.h (GRUB_MEMORY_I386_PC_UPPER): .. here.
|
||||
* include/grub/types.h (grub_target_to_host16): Removed.
|
||||
(grub_target_to_host32): Likewise.
|
||||
(grub_target_to_host64): Likewise.
|
||||
(grub_host_to_target16): Likewise.
|
||||
(grub_host_to_target32): Likewise.
|
||||
(grub_host_to_target64): Likewise.
|
||||
(grub_host_to_target_addr): Likewise.
|
||||
|
||||
Support grub-mkrescue for efi, coreboot and qemu.
|
||||
|
||||
* conf/x86-efi.rmk (bin_SCRIPTS): Add grub-mkrescue.
|
||||
* kern/efi/init.c (grub_efi_set_prefix): Handle baked in prefix.
|
||||
* util/elf/grub-mkimage.c: Merged into util/grub-mkimage.c.
|
||||
* util/grub-mkrawimage.c: Moved from here ...
|
||||
* util/grub-mkimage.c: ... here. All users updated.
|
||||
(ALIGN_ADDR): Use image_target.
|
||||
(TARGET_NO_FIELD): New const.
|
||||
(image_target_desc): New type.
|
||||
(image_targets): New array.
|
||||
(grub_target_to_host64): Use image_target.
|
||||
(grub_target_to_host32): Likewise.
|
||||
(grub_target_to_host16): Likewise.
|
||||
(grub_host_to_target64): Likewise.
|
||||
(grub_host_to_target32): Likewise.
|
||||
(grub_host_to_target16): Likewise.
|
||||
(grub_host_to_target_addr): Likewise.
|
||||
(generate_image): Handle multiimage.
|
||||
(main): Require -O parameter. All users updated.
|
||||
* util/grub-mkimagexx.c: New file. Based on util/grub-mkrawimage.c and
|
||||
util/efi/grub-mkimage.c
|
||||
* util/grub-mkrescue.in: Handle coreboot, efi and qemu.
|
||||
New option --rom-directory.
|
||||
Use xorriso.
|
||||
* util/i386/efi/grub-mkimage.c: Removed.
|
||||
* util/i386/pc/grub-setup.c (grub_target_to_host16): New definition.
|
||||
(grub_target_to_host32): Likewise.
|
||||
(grub_target_to_host64): Likewise.
|
||||
(grub_host_to_target16): Likewise.
|
||||
(grub_host_to_target32): Likewise.
|
||||
(grub_host_to_target64): Likewise.
|
||||
* util/sparc64/ieee1275/grub-setup.c (grub_target_to_host16): New definition.
|
||||
(grub_target_to_host32): Likewise.
|
||||
(grub_target_to_host64): Likewise.
|
||||
(grub_host_to_target16): Likewise.
|
||||
(grub_host_to_target32): Likewise.
|
||||
(grub_host_to_target64): Likewise.
|
||||
|
||||
2010-05-17 BVK Chaitanya <bvk.groups@gmail.com>
|
||||
|
||||
Source tree is reorganized for emu build.
|
||||
|
||||
* include/grub/util/console.h: Move from here...
|
||||
* include/grub/emu/console.h: ...to here.
|
||||
* include/grub/util/getroot.h: Move from here...
|
||||
* include/grub/emu/getroot.h: ...to here.
|
||||
* include/grub/util/hostdisk.h: Move from here...
|
||||
* include/grub/emu/hostdisk.h: ...to here.
|
||||
* util/console.c: Move from here...
|
||||
* kern/emu/console.c: ...to here.
|
||||
* util/getroot.c: Move from here...
|
||||
* kern/emu/getroot.c: ...to here.
|
||||
* util/grub-emu.c: Move from here...
|
||||
* kern/emu/main.c: ...to here.
|
||||
* util/hostdisk.c: Move from here...
|
||||
* kern/emu/hostdisk.c: ...to here.
|
||||
* util/hostfs.c: Move from here...
|
||||
* kern/emu/hostfs.c: ...to here.
|
||||
* util/mm.c: Move from here...
|
||||
* kern/emu/mm.c: ...to here.
|
||||
* util/pci.c: Move from here...
|
||||
* bus/emu/pci.c: ...to here.
|
||||
* util/sdl.c: Move from here...
|
||||
* video/emu/sdl.c: ...to here.
|
||||
* util/time.c: Move from here...
|
||||
* kern/emu/time.c: ...to here.
|
||||
* util/usb.c: Move from here...
|
||||
* bus/usb/emu/usb.c: ...to here.
|
||||
|
||||
* include/grub/emu/misc.h: New header for grub-emu functions.
|
||||
* kern/emu/misc.c: grub-emu functions separated from util/misc.c
|
||||
|
||||
* conf/any-emu.rmk: Rule updates for above renames.
|
||||
* conf/common.rmk: Likewise.
|
||||
* conf/i386-pc.rmk: Likewise.
|
||||
* conf/i386-qemu.rmk: Likewise.
|
||||
* conf/mips.rmk: Likewise.
|
||||
* conf/sparc64-ieee1275.rmk: Likewise.
|
||||
* conf/x86-efi.rmk: Likewise.
|
||||
|
||||
* disk/lvm.h: #include updates for above renames.
|
||||
* util/grub-mkrelpath.c: Likewise.
|
||||
* util/grub-probe.c: Likewise.
|
||||
* util/i386/pc/grub-setup.c: Likewise.
|
||||
* util/sparc64/ieee1275/grub-setup.c: Likewise.
|
||||
* kern/emu/console.c: Likewise.
|
||||
* kern/emu/getroot.c: Likewise.
|
||||
* kern/emu/hostdisk.c: Likewise.
|
||||
* kern/emu/main.c: Likewise. (was grub-emu.c earlier)
|
||||
|
||||
* include/grub/dl.h: Remove grub_dl_{ref,unref}.
|
||||
* include/grub/util/misc.h: Move grub-emu functions to emu/misc.h.
|
||||
* kern/dl.c: Handle null mod in grub_dl_{ref,unref}.
|
||||
* util/misc.c: Remove grub-emu functions.
|
||||
|
||||
2010-05-13 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
Fix gfxmenu crash.
|
||||
Reported by: Thorsten Grützmacher.
|
||||
|
||||
* gfxmenu/gui_circular_progress.c (circprog_destroy): Unregister
|
||||
timeout hook.
|
||||
(circprog_set_property): Register and unregister timeout hook.
|
||||
* gfxmenu/gui_label.c (grub_gui_label): New fields template and value.
|
||||
(label_destroy): Free template. and unregister hook.
|
||||
(label_set_state): New function.
|
||||
(label_set_property): Handle templates and hooks.
|
||||
* gfxmenu/gui_progress_bar.c (progress_bar_destroy): Unregister
|
||||
timeout hook.
|
||||
(progress_bar_set_property): Register and unregister timeout hook.
|
||||
* gfxmenu/view.c (TIMEOUT_COMPONENT_ID): Move from here ...
|
||||
* include/grub/gui.h (GRUB_GFXMENU_TIMEOUT_COMPONENT_ID): ...to here
|
||||
* gfxmenu/view.c (grub_gfxmenu_timeout_notifications): New variable.
|
||||
(update_timeout_visit): Removed.
|
||||
(update_timeouts): New function.
|
||||
(redraw_timeouts): Likewise.
|
||||
(grub_gfxmenu_print_timeout): Use update_timeouts and redraw_timeouts.
|
||||
(grub_gfxmenu_clear_timeout): Likewise.
|
||||
* include/grub/gui.h (grub_gfxmenu_set_state_t): New type.
|
||||
(grub_gfxmenu_timeout_notify): Likewise.
|
||||
(grub_gfxmenu_timeout_notifications): New external variable.
|
||||
(grub_gfxmenu_timeout_register): New function.
|
||||
(grub_gfxmenu_timeout_unregister): Likewise.
|
||||
|
||||
2010-05-09 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
Transform (broken) vga terminal into (working) vga video driver.
|
||||
|
||||
* conf/i386-pc.rmk (vga_mod_SOURCES): Change term/i386/pc/vga.c to
|
||||
video/i386/pc/vga.c.
|
||||
* include/grub/video.h (grub_video_driver_id):
|
||||
Add GRUB_VIDEO_DRIVER_VGA.
|
||||
* term/i386/pc/vga.c: Renamed to ...
|
||||
* video/i386/pc/vga.c: ...this
|
||||
(DEBUG_VGA): Removed.
|
||||
(CHAR_WIDTH): Likewise.
|
||||
(CHAR_HEIGHT): Likewise.
|
||||
(TEXT_WIDTH): Likewise.
|
||||
(TEXT_HEIGHT): Likewise.
|
||||
(DEFAULT_FG_COLOR): Likewise.
|
||||
(DEFAULT_BG_COLOR): Likewise.
|
||||
(colored_char): Likewise.
|
||||
(xpos): Likewise.
|
||||
(ypos): Likewise.
|
||||
(cursor_state): Likewise.
|
||||
(fg_color): Likewise.
|
||||
(bg_color): Likewise.
|
||||
(text_buf): Likewise.
|
||||
(page): Likewise.
|
||||
(font): Likewise.
|
||||
(framebuffer): New variable.
|
||||
(set_read_map): Disabled.
|
||||
(setup): New variable.
|
||||
(is_target): Likewise.
|
||||
(grub_vga_mod_init): Likewise.
|
||||
(grub_vga_mod_fini): Likewise.
|
||||
(check_vga_mem): Likewise.
|
||||
(write_char): Likewise.
|
||||
(write_cursor): Likewise.
|
||||
(scroll_up): Likewise.
|
||||
(grub_vga_putchar): Likewise.
|
||||
(grub_vga_getcharwidth): Likewise.
|
||||
(grub_vga_getwh): Likewise.
|
||||
(grub_vga_getxy): Likewise.
|
||||
(grub_vga_gotoxy): Likewise.
|
||||
(grub_vga_cls): Likewise.
|
||||
(grub_vga_setcolorstate): Likewise.
|
||||
(grub_vga_setcursor): Likewise.
|
||||
(grub_video_vga_init): New function.
|
||||
(grub_video_vga_setup): Likewise.
|
||||
(grub_video_vga_fini): Likewise.
|
||||
(update_target): Likewise.
|
||||
(grub_video_vga_blit_bitmap): Likewise.
|
||||
(grub_video_vga_blit_render_target): Likewise.
|
||||
(grub_video_vga_set_active_render_target): Likewise.
|
||||
(grub_video_vga_get_active_render_target): Likewise.
|
||||
(grub_video_vga_swap_buffers): Likewise.
|
||||
(grub_video_vga_set_palette): Likewise.
|
||||
(grub_video_vga_get_info_and_fini): Likewise.
|
||||
(grub_vga_term): Removed.
|
||||
(grub_video_vga_adapter): New variable.
|
||||
(GRUB_MOD_INIT): Register a video driver instead of terminal.
|
||||
(GRUB_MOD_FINI): Unrefister a video driver instead of terminal.
|
||||
|
||||
2010-05-05 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* video/readers/jpeg.c: Indented.
|
||||
|
|
|
@ -287,7 +287,7 @@ build_env.mk: Makefile
|
|||
echo "TARGET_CC=$(TARGET_CC)" ; \
|
||||
echo "TARGET_CFLAGS=$(TARGET_CFLAGS)" ; \
|
||||
echo "TARGET_ASFLAGS=$(TARGET_ASFLAGS)" ; \
|
||||
echo "TARGET_CPPFLAGS=$(TARGET_CPPFLAGS) -I$(libdir) -I$(includedir)" ; \
|
||||
echo "TARGET_CPPFLAGS=$(TARGET_CPPFLAGS) -I$(pkglibdir) -I$(includedir)" ; \
|
||||
echo "STRIP=$(STRIP)" ; \
|
||||
echo "OBJCONV=$(OBJCONV)" ; \
|
||||
echo "TARGET_MODULE_FORMAT=$(TARGET_MODULE_FORMAT)" ; \
|
||||
|
|
|
@ -105,14 +105,14 @@ grub_usb_root_hub (grub_usb_controller_t controller __attribute__((unused)))
|
|||
grub_usb_err_t
|
||||
grub_usb_control_msg (grub_usb_device_t dev, grub_uint8_t reqtype,
|
||||
grub_uint8_t request, grub_uint16_t value,
|
||||
grub_uint16_t index, grub_size_t size, char *data)
|
||||
grub_uint16_t idx, grub_size_t size, char *data)
|
||||
{
|
||||
usb_dev_handle *devh;
|
||||
struct usb_device *d = dev->data;
|
||||
|
||||
devh = usb_open (d);
|
||||
if (usb_control_msg (devh, reqtype, request,
|
||||
value, index, data, size, 20) < 0)
|
||||
value, idx, data, size, 20) < 0)
|
||||
{
|
||||
usb_close (devh);
|
||||
return GRUB_USB_ERR_STALL;
|
|
@ -10,12 +10,13 @@ kernel_img_SOURCES = kern/device.c kern/disk.c kern/dl.c kern/env.c \
|
|||
kern/parser.c kern/partition.c kern/term.c \
|
||||
kern/rescue_reader.c kern/rescue_parser.c \
|
||||
\
|
||||
util/console.c util/grub-emu.c util/misc.c \
|
||||
util/hostdisk.c util/getroot.c util/mm.c util/time.c \
|
||||
kern/emu/main.c kern/emu/mm.c kern/emu/misc.c \
|
||||
kern/emu/getroot.c kern/emu/time.c kern/emu/hostdisk.c \
|
||||
kern/emu/hostfs.c kern/emu/console.c \
|
||||
\
|
||||
gnulib/progname.c util/hostfs.c disk/host.c
|
||||
kernel_img_HEADERS += datetime.h util/misc.h
|
||||
kernel_img_CFLAGS = $(TARGET_CPPFLAGS) $(TARGET_CFLAGS) -Wno-undef -I$(srcdir)/gnulib
|
||||
gnulib/progname.c disk/host.c
|
||||
kernel_img_HEADERS += datetime.h emu/misc.h
|
||||
kernel_img_CFLAGS = $(TARGET_CPPFLAGS) $(TARGET_CFLAGS) -Wno-char-subscripts -Wno-unused -Wno-deprecated-declarations -Wno-undef -I$(srcdir)/gnulib
|
||||
kernel_img_LDFLAGS = $(COMMON_LDFLAGS)
|
||||
TARGET_NO_STRIP = yes
|
||||
|
||||
|
@ -49,7 +50,7 @@ ifeq ($(enable_grub_emu_usb), yes)
|
|||
kernel_img_HEADERS += libusb.h
|
||||
|
||||
pkglib_MODULES += libusb.mod
|
||||
libusb_mod_SOURCES = util/usb.c
|
||||
libusb_mod_SOURCES = bus/usb/emu/usb.c
|
||||
libusb_mod_CFLAGS =
|
||||
libusb_mod_LDFLAGS = $(COMMON_LDFLAGS)
|
||||
|
||||
|
@ -76,7 +77,7 @@ endif
|
|||
|
||||
ifeq ($(enable_grub_emu_sdl), yes)
|
||||
pkglib_MODULES += sdl.mod
|
||||
sdl_mod_SOURCES = util/sdl.c
|
||||
sdl_mod_SOURCES = video/emu/sdl.c
|
||||
sdl_mod_CFLAGS =
|
||||
sdl_mod_LDFLAGS = $(COMMON_LDFLAGS)
|
||||
grub_emu_LDFLAGS += $(LIBSDL)
|
||||
|
@ -85,7 +86,7 @@ endif
|
|||
|
||||
ifeq ($(enable_grub_emu_pci), yes)
|
||||
pkglib_MODULES += pci.mod
|
||||
pci_mod_SOURCES = util/pci.c commands/lspci.c
|
||||
pci_mod_SOURCES = bus/emu/pci.c commands/lspci.c
|
||||
pci_mod_LDFLAGS = $(COMMON_LDFLAGS)
|
||||
grub_emu_LDFLAGS += $(LIBPCIACCESS)
|
||||
kernel_img_HEADERS += libpciaccess.h
|
||||
|
@ -104,10 +105,10 @@ DISTCLEANFILES += grub_emu_init.c
|
|||
CLEANFILES += grub-emu
|
||||
ifneq ($(TARGET_NO_MODULES), yes)
|
||||
grub-emu: $(pkglib_PROGRAMS)
|
||||
$(CC) -o $@ $(pkglib_PROGRAMS) $(grub_emu_LDFLAGS) $(LDFLAGS)
|
||||
$(CC) -o $@ $^ $(grub_emu_LDFLAGS) $(LDFLAGS)
|
||||
else
|
||||
grub-emu: $(pkglib_MODULES) $(pkglib_PROGRAMS)
|
||||
$(CC) -o $@ $(pkglib_MODULES) $(pkglib_PROGRAMS) $(grub_emu_LDFLAGS) $(LDFLAGS)
|
||||
$(CC) -o $@ $^ $(grub_emu_LDFLAGS) $(LDFLAGS)
|
||||
endif
|
||||
GRUB_EMU=grub-emu
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@ script/lexer.c_DEPENDENCIES = grub_script.tab.h
|
|||
sbin_UTILITIES += grub-mkdevicemap
|
||||
grub_mkdevicemap_SOURCES = gnulib/progname.c util/grub-mkdevicemap.c \
|
||||
util/deviceiter.c \
|
||||
util/misc.c
|
||||
util/misc.c kern/emu/misc.c
|
||||
|
||||
ifeq ($(target_cpu)-$(platform), sparc64-ieee1275)
|
||||
grub_mkdevicemap_SOURCES += util/ieee1275/ofpath.c util/ieee1275/devicemap.c
|
||||
|
@ -17,14 +17,14 @@ endif
|
|||
# For grub-mkimage.
|
||||
bin_UTILITIES += grub-mkimage
|
||||
grub_mkimage_SOURCES = gnulib/progname.c util/grub-mkimage.c util/misc.c \
|
||||
util/resolve.c lib/LzmaEnc.c lib/LzFind.c
|
||||
util/resolve.c kern/emu/misc.c lib/LzmaEnc.c lib/LzFind.c
|
||||
util/grub-mkimage.c_DEPENDENCIES = Makefile
|
||||
|
||||
# For grub-probe.
|
||||
sbin_UTILITIES += grub-probe
|
||||
util/grub-probe.c_DEPENDENCIES = grub_probe_init.h
|
||||
grub_probe_SOURCES = gnulib/progname.c util/grub-probe.c \
|
||||
util/hostdisk.c util/misc.c util/getroot.c util/mm.c \
|
||||
kern/emu/hostdisk.c util/misc.c kern/emu/misc.c kern/emu/getroot.c kern/emu/mm.c \
|
||||
kern/device.c kern/disk.c kern/err.c kern/misc.c \
|
||||
kern/parser.c kern/partition.c kern/file.c kern/list.c \
|
||||
\
|
||||
|
@ -43,24 +43,10 @@ ifeq ($(enable_grub_fstest), yes)
|
|||
bin_UTILITIES += grub-fstest
|
||||
endif
|
||||
|
||||
bin_UTILITIES += grub-mkisofs
|
||||
grub_mkisofs_SOURCES = util/mkisofs/eltorito.c \
|
||||
util/mkisofs/hash.c util/mkisofs/joliet.c \
|
||||
util/mkisofs/match.c util/mkisofs/mkisofs.c \
|
||||
util/mkisofs/multi.c util/mkisofs/name.c \
|
||||
util/mkisofs/rock.c util/mkisofs/tree.c \
|
||||
util/mkisofs/write.c \
|
||||
\
|
||||
gnulib/fnmatch.c gnulib/getopt1.c gnulib/getopt.c \
|
||||
gnulib/error.c gnulib/progname.c
|
||||
grub_mkisofs_CFLAGS = -D_FILE_OFFSET_BITS=64 \
|
||||
-I$(srcdir)/util/mkisofs/include \
|
||||
-Wno-all -Werror $(GNULIB_UTIL_CFLAGS)
|
||||
|
||||
# For grub-fstest.
|
||||
util/grub-fstest.c_DEPENDENCIES = grub_fstest_init.h
|
||||
grub_fstest_SOURCES = gnulib/progname.c util/grub-fstest.c util/hostfs.c \
|
||||
util/misc.c util/mm.c \
|
||||
grub_fstest_SOURCES = gnulib/progname.c util/grub-fstest.c kern/emu/hostfs.c \
|
||||
util/misc.c kern/emu/misc.c kern/emu/mm.c \
|
||||
kern/file.c kern/device.c kern/disk.c kern/err.c kern/misc.c \
|
||||
disk/host.c disk/loopback.c kern/list.c kern/command.c \
|
||||
lib/arg.c commands/extcmd.c normal/datetime.c normal/misc.c \
|
||||
|
@ -82,14 +68,14 @@ grub_fstest_SOURCES = gnulib/progname.c util/grub-fstest.c util/hostfs.c \
|
|||
# For grub-mkfont.
|
||||
ifeq ($(enable_grub_mkfont), yes)
|
||||
bin_UTILITIES += grub-mkfont
|
||||
grub_mkfont_SOURCES = gnulib/progname.c util/grub-mkfont.c util/misc.c
|
||||
grub_mkfont_SOURCES = gnulib/progname.c util/grub-mkfont.c util/misc.c kern/emu/misc.c
|
||||
grub_mkfont_CFLAGS = $(freetype_cflags)
|
||||
grub_mkfont_LDFLAGS = $(freetype_libs)
|
||||
endif
|
||||
|
||||
# For grub-mkrelpath.
|
||||
bin_UTILITIES += grub-mkrelpath
|
||||
grub_mkrelpath_SOURCES = gnulib/progname.c util/grub-mkrelpath.c util/misc.c
|
||||
grub_mkrelpath_SOURCES = gnulib/progname.c util/grub-mkrelpath.c util/misc.c kern/emu/misc.c
|
||||
|
||||
bin_UTILITIES += grub-bin2h
|
||||
grub_bin2h_SOURCES = gnulib/progname.c util/bin2h.c
|
||||
|
@ -103,7 +89,7 @@ DISTCLEANFILES += grub_script.yy.c grub_script.yy.h
|
|||
bin_UTILITIES += grub-script-check
|
||||
util/grub-script-check.c_DEPENDENCIES = grub_script_check_init.h
|
||||
grub_script_check_SOURCES = gnulib/progname.c gnulib/getdelim.c gnulib/getline.c \
|
||||
util/grub-script-check.c util/misc.c util/mm.c \
|
||||
util/grub-script-check.c util/misc.c kern/emu/misc.c kern/emu/mm.c \
|
||||
script/main.c script/script.c script/function.c script/lexer.c \
|
||||
kern/handler.c kern/err.c kern/parser.c kern/list.c \
|
||||
kern/misc.c kern/env.c grub_script_check_init.c grub_script.tab.c \
|
||||
|
@ -186,7 +172,7 @@ DISTCLEANFILES += grub_fstest_init.c
|
|||
|
||||
# for grub-editenv
|
||||
bin_UTILITIES += grub-editenv
|
||||
grub_editenv_SOURCES = gnulib/progname.c util/grub-editenv.c lib/envblk.c util/misc.c util/mm.c kern/misc.c kern/err.c
|
||||
grub_editenv_SOURCES = gnulib/progname.c util/grub-editenv.c lib/envblk.c util/misc.c kern/emu/misc.c kern/emu/mm.c kern/misc.c kern/err.c
|
||||
CLEANFILES += grub-editenv
|
||||
|
||||
# Needed for genmk.rb to work
|
||||
|
@ -194,7 +180,7 @@ ifeq (0,1)
|
|||
bin_UTILITIES += grub-macho2img grub-pe2elf
|
||||
endif
|
||||
|
||||
grub_pe2elf_SOURCES = gnulib/progname.c util/grub-pe2elf.c util/misc.c
|
||||
grub_pe2elf_SOURCES = gnulib/progname.c util/grub-pe2elf.c util/misc.c kern/emu/misc.c
|
||||
CLEANFILES += grub-pe2elf
|
||||
|
||||
grub_macho2img_SOURCES = util/grub-macho2img.c
|
||||
|
@ -860,7 +846,7 @@ boot_mod_CFLAGS = $(COMMON_CFLAGS)
|
|||
boot_mod_LDFLAGS = $(COMMON_LDFLAGS)
|
||||
|
||||
bin_UTILITIES += grub-mkpasswd-pbkdf2
|
||||
grub_mkpasswd_pbkdf2_SOURCES = gnulib/progname.c gnulib/getdelim.c gnulib/getline.c util/grub-mkpasswd-pbkdf2.c lib/crypto.c lib/libgcrypt-grub/cipher/sha512.c lib/pbkdf2.c util/misc.c util/mm.c kern/err.c
|
||||
grub_mkpasswd_pbkdf2_SOURCES = gnulib/progname.c gnulib/getdelim.c gnulib/getline.c util/grub-mkpasswd-pbkdf2.c lib/crypto.c lib/libgcrypt-grub/cipher/sha512.c lib/pbkdf2.c util/misc.c kern/emu/misc.c kern/emu/mm.c kern/err.c
|
||||
grub_mkpasswd_pbkdf2_CFLAGS += -Wno-missing-field-initializers -Wno-error -I$(srcdir)/lib/libgcrypt_wrap -DGRUB_MKPASSWD=1
|
||||
|
||||
# Randomly generated
|
||||
|
|
|
@ -63,12 +63,11 @@ sbin_UTILITIES = grub-setup
|
|||
|
||||
# For grub-setup.
|
||||
util/i386/pc/grub-setup.c_DEPENDENCIES = grub_setup_init.h
|
||||
grub_setup_SOURCES = gnulib/progname.c \
|
||||
util/i386/pc/grub-setup.c util/hostdisk.c \
|
||||
util/misc.c util/getroot.c kern/device.c kern/disk.c \
|
||||
kern/err.c kern/misc.c kern/parser.c kern/partition.c \
|
||||
kern/file.c kern/fs.c kern/env.c kern/list.c \
|
||||
fs/fshelp.c \
|
||||
grub_setup_SOURCES = gnulib/progname.c util/i386/pc/grub-setup.c \
|
||||
util/misc.c kern/emu/misc.c kern/emu/getroot.c \
|
||||
kern/emu/hostdisk.c kern/device.c kern/disk.c kern/err.c \
|
||||
kern/misc.c kern/parser.c kern/partition.c kern/file.c \
|
||||
kern/emu/mm.c kern/fs.c kern/env.c kern/list.c fs/fshelp.c \
|
||||
\
|
||||
fs/affs.c fs/cpio.c fs/ext2.c fs/fat.c fs/hfs.c \
|
||||
fs/hfsplus.c fs/iso9660.c fs/udf.c fs/jfs.c fs/minix.c \
|
||||
|
@ -80,7 +79,7 @@ grub_setup_SOURCES = gnulib/progname.c \
|
|||
partmap/gpt.c \
|
||||
\
|
||||
disk/raid.c disk/mdraid_linux.c disk/lvm.c \
|
||||
util/raid.c util/lvm.c util/mm.c \
|
||||
util/raid.c util/lvm.c \
|
||||
grub_setup_init.c
|
||||
|
||||
sbin_SCRIPTS += grub-install
|
||||
|
@ -166,7 +165,7 @@ vbetest_mod_CFLAGS = $(COMMON_CFLAGS)
|
|||
vbetest_mod_LDFLAGS = $(COMMON_LDFLAGS)
|
||||
|
||||
# For vga.mod.
|
||||
vga_mod_SOURCES = term/i386/pc/vga.c
|
||||
vga_mod_SOURCES = video/i386/pc/vga.c
|
||||
vga_mod_CFLAGS = $(COMMON_CFLAGS)
|
||||
vga_mod_LDFLAGS = $(COMMON_LDFLAGS)
|
||||
|
||||
|
|
|
@ -45,11 +45,11 @@ sbin_UTILITIES = grub-setup grub-ofpathname
|
|||
|
||||
# For grub-setup.
|
||||
util/sparc64/ieee1275/grub-setup.c_DEPENDENCIES = grub_setup_init.h
|
||||
grub_setup_SOURCES = util/sparc64/ieee1275/grub-setup.c util/hostdisk.c \
|
||||
util/ieee1275/ofpath.c \
|
||||
util/misc.c util/getroot.c kern/device.c kern/disk.c \
|
||||
kern/err.c kern/misc.c kern/parser.c kern/partition.c \
|
||||
kern/file.c kern/fs.c kern/env.c kern/list.c \
|
||||
grub_setup_SOURCES = util/sparc64/ieee1275/grub-setup.c \
|
||||
util/ieee1275/ofpath.c util/misc.c kern/emu/hostdisk.c \
|
||||
kern/emu/misc.c kern/emu/getroot.c kern/emu/mm.c kern/device.c \
|
||||
kern/disk.c kern/err.c kern/misc.c kern/parser.c \
|
||||
kern/partition.c kern/file.c kern/fs.c kern/env.c kern/list.c \
|
||||
fs/fshelp.c \
|
||||
\
|
||||
fs/affs.c fs/cpio.c fs/ext2.c fs/fat.c fs/hfs.c \
|
||||
|
@ -61,13 +61,13 @@ grub_setup_SOURCES = util/sparc64/ieee1275/grub-setup.c util/hostdisk.c \
|
|||
partmap/amiga.c partmap/apple.c partmap/msdos.c \
|
||||
partmap/bsdlabel.c partmap/sun.c partmap/acorn.c \
|
||||
\
|
||||
disk/raid.c disk/mdraid_linux.c disk/lvm.c \
|
||||
util/raid.c util/lvm.c util/mm.c gnulib/progname.c \
|
||||
grub_setup_init.c
|
||||
disk/raid.c disk/mdraid_linux.c disk/lvm.c util/raid.c \
|
||||
util/lvm.c gnulib/progname.c grub_setup_init.c
|
||||
|
||||
# For grub-ofpathname.
|
||||
grub_ofpathname_SOURCES = util/ieee1275/grub-ofpathname.c \
|
||||
util/ieee1275/ofpath.c util/misc.c gnulib/progname.c
|
||||
util/ieee1275/ofpath.c util/misc.c kern/emu/misc.c \
|
||||
gnulib/progname.c
|
||||
|
||||
# Scripts.
|
||||
sbin_SCRIPTS = grub-install
|
||||
|
|
|
@ -25,7 +25,7 @@
|
|||
#include <grub/lvm.h>
|
||||
|
||||
#ifdef GRUB_UTIL
|
||||
#include <grub/util/misc.h>
|
||||
#include <grub/emu/misc.h>
|
||||
#endif
|
||||
|
||||
static struct grub_lvm_vg *vg_list;
|
||||
|
|
|
@ -54,6 +54,7 @@ static void
|
|||
circprog_destroy (void *vself)
|
||||
{
|
||||
circular_progress_t self = vself;
|
||||
grub_gfxmenu_timeout_unregister ((grub_gui_component_t) self);
|
||||
grub_free (self);
|
||||
}
|
||||
|
||||
|
@ -211,6 +212,17 @@ circprog_get_bounds (void *vself, grub_video_rect_t *bounds)
|
|||
*bounds = self->bounds;
|
||||
}
|
||||
|
||||
static void
|
||||
circprog_set_state (void *vself, int visible, int start,
|
||||
int current, int end)
|
||||
{
|
||||
circular_progress_t self = vself;
|
||||
self->visible = visible;
|
||||
self->start = start;
|
||||
self->value = current;
|
||||
self->end = end;
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
circprog_set_property (void *vself, const char *name, const char *value)
|
||||
{
|
||||
|
@ -247,26 +259,20 @@ circprog_set_property (void *vself, const char *name, const char *value)
|
|||
}
|
||||
else if (grub_strcmp (name, "id") == 0)
|
||||
{
|
||||
grub_gfxmenu_timeout_unregister ((grub_gui_component_t) self);
|
||||
grub_free (self->id);
|
||||
if (value)
|
||||
self->id = grub_strdup (value);
|
||||
else
|
||||
self->id = 0;
|
||||
if (self->id && grub_strcmp (self->id, GRUB_GFXMENU_TIMEOUT_COMPONENT_ID)
|
||||
== 0)
|
||||
grub_gfxmenu_timeout_register ((grub_gui_component_t) self,
|
||||
circprog_set_state);
|
||||
}
|
||||
return grub_errno;
|
||||
}
|
||||
|
||||
static void
|
||||
circprog_set_state (void *vself, int visible, int start,
|
||||
int current, int end)
|
||||
{
|
||||
circular_progress_t self = vself;
|
||||
self->visible = visible;
|
||||
self->start = start;
|
||||
self->value = current;
|
||||
self->end = end;
|
||||
}
|
||||
|
||||
static struct grub_gui_component_ops circprog_ops =
|
||||
{
|
||||
.destroy = circprog_destroy,
|
||||
|
|
|
@ -46,8 +46,10 @@ struct grub_gui_label
|
|||
char *id;
|
||||
int visible;
|
||||
char *text;
|
||||
char *template;
|
||||
grub_font_t font;
|
||||
grub_gui_color_t color;
|
||||
int value;
|
||||
enum align_mode align;
|
||||
};
|
||||
|
||||
|
@ -57,7 +59,9 @@ static void
|
|||
label_destroy (void *vself)
|
||||
{
|
||||
grub_gui_label_t self = vself;
|
||||
grub_gfxmenu_timeout_unregister ((grub_gui_component_t) self);
|
||||
grub_free (self->text);
|
||||
grub_free (self->template);
|
||||
grub_free (self);
|
||||
}
|
||||
|
||||
|
@ -146,6 +150,17 @@ label_get_minimal_size (void *vself, unsigned *width, unsigned *height)
|
|||
+ grub_font_get_descent (self->font));
|
||||
}
|
||||
|
||||
static void
|
||||
label_set_state (void *vself, int visible, int start __attribute__ ((unused)),
|
||||
int current, int end __attribute__ ((unused)))
|
||||
{
|
||||
grub_gui_label_t self = vself;
|
||||
self->value = -current;
|
||||
self->visible = visible;
|
||||
grub_free (self->text);
|
||||
self->text = grub_xasprintf (self->template ? : "%d", self->value);
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
label_set_property (void *vself, const char *name, const char *value)
|
||||
{
|
||||
|
@ -153,9 +168,17 @@ label_set_property (void *vself, const char *name, const char *value)
|
|||
if (grub_strcmp (name, "text") == 0)
|
||||
{
|
||||
grub_free (self->text);
|
||||
grub_free (self->template);
|
||||
if (! value)
|
||||
value = "";
|
||||
self->text = grub_strdup (value);
|
||||
{
|
||||
self->template = NULL;
|
||||
self->text = grub_strdup ("");
|
||||
}
|
||||
else
|
||||
{
|
||||
self->template = grub_strdup (value);
|
||||
self->text = grub_xasprintf (value, self->value);
|
||||
}
|
||||
}
|
||||
else if (grub_strcmp (name, "font") == 0)
|
||||
{
|
||||
|
@ -183,11 +206,16 @@ label_set_property (void *vself, const char *name, const char *value)
|
|||
}
|
||||
else if (grub_strcmp (name, "id") == 0)
|
||||
{
|
||||
grub_gfxmenu_timeout_unregister ((grub_gui_component_t) self);
|
||||
grub_free (self->id);
|
||||
if (value)
|
||||
self->id = grub_strdup (value);
|
||||
else
|
||||
self->id = 0;
|
||||
if (self->id && grub_strcmp (self->id, GRUB_GFXMENU_TIMEOUT_COMPONENT_ID)
|
||||
== 0)
|
||||
grub_gfxmenu_timeout_register ((grub_gui_component_t) self,
|
||||
label_set_state);
|
||||
}
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
|
|
@ -60,6 +60,7 @@ static void
|
|||
progress_bar_destroy (void *vself)
|
||||
{
|
||||
grub_gui_progress_bar_t self = vself;
|
||||
grub_gfxmenu_timeout_unregister ((grub_gui_component_t) self);
|
||||
grub_free (self);
|
||||
}
|
||||
|
||||
|
@ -333,11 +334,16 @@ progress_bar_set_property (void *vself, const char *name, const char *value)
|
|||
}
|
||||
else if (grub_strcmp (name, "id") == 0)
|
||||
{
|
||||
grub_gfxmenu_timeout_unregister ((grub_gui_component_t) self);
|
||||
grub_free (self->id);
|
||||
if (value)
|
||||
self->id = grub_strdup (value);
|
||||
else
|
||||
self->id = 0;
|
||||
/* if (self->id && grub_strcmp (self->id, GRUB_GFXMENU_TIMEOUT_COMPONENT_ID)
|
||||
== 0)*/
|
||||
grub_gfxmenu_timeout_register ((grub_gui_component_t) self,
|
||||
progress_bar_set_state);
|
||||
}
|
||||
return grub_errno;
|
||||
}
|
||||
|
@ -368,6 +374,7 @@ grub_gui_progress_bar_new (void)
|
|||
self = grub_zalloc (sizeof (*self));
|
||||
if (! self)
|
||||
return 0;
|
||||
|
||||
self->progress.ops = &progress_bar_pb_ops;
|
||||
self->progress.component.ops = &progress_bar_ops;
|
||||
self->visible = 1;
|
||||
|
|
|
@ -37,10 +37,6 @@
|
|||
#include <grub/gui_string_util.h>
|
||||
#include <grub/icon_manager.h>
|
||||
|
||||
/* The component ID identifying GUI components to be updated as the timeout
|
||||
status changes. */
|
||||
#define TIMEOUT_COMPONENT_ID "__timeout__"
|
||||
|
||||
static void
|
||||
init_terminal (grub_gfxmenu_view_t view);
|
||||
static grub_video_rect_t term_rect;
|
||||
|
@ -166,16 +162,28 @@ struct progress_value_data
|
|||
int value;
|
||||
};
|
||||
|
||||
static void
|
||||
update_timeout_visit (grub_gui_component_t component,
|
||||
void *userdata)
|
||||
{
|
||||
struct progress_value_data *pv;
|
||||
pv = (struct progress_value_data *) userdata;
|
||||
struct grub_gfxmenu_timeout_notify *grub_gfxmenu_timeout_notifications;
|
||||
|
||||
((struct grub_gui_progress *) component)->ops
|
||||
->set_state ((struct grub_gui_progress *) component,
|
||||
pv->visible, pv->start, pv->value, pv->end);
|
||||
static void
|
||||
update_timeouts (int visible, int start, int value, int end)
|
||||
{
|
||||
struct grub_gfxmenu_timeout_notify *cur;
|
||||
|
||||
for (cur = grub_gfxmenu_timeout_notifications; cur; cur = cur->next)
|
||||
cur->set_state (cur->self, visible, start, value, end);
|
||||
}
|
||||
|
||||
static void
|
||||
redraw_timeouts (struct grub_gfxmenu_view *view)
|
||||
{
|
||||
struct grub_gfxmenu_timeout_notify *cur;
|
||||
|
||||
for (cur = grub_gfxmenu_timeout_notifications; cur; cur = cur->next)
|
||||
{
|
||||
grub_video_rect_t bounds;
|
||||
cur->self->ops->get_bounds (cur->self, &bounds);
|
||||
grub_gfxmenu_view_redraw (view, &bounds);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -183,67 +191,26 @@ grub_gfxmenu_print_timeout (int timeout, void *data)
|
|||
{
|
||||
struct grub_gfxmenu_view *view = data;
|
||||
|
||||
struct progress_value_data pv;
|
||||
|
||||
auto void redraw_timeout_visit (grub_gui_component_t component,
|
||||
void *userdata __attribute__ ((unused)));
|
||||
|
||||
auto void redraw_timeout_visit (grub_gui_component_t component,
|
||||
void *userdata __attribute__ ((unused)))
|
||||
{
|
||||
grub_video_rect_t bounds;
|
||||
component->ops->get_bounds (component, &bounds);
|
||||
grub_gfxmenu_view_redraw (view, &bounds);
|
||||
}
|
||||
|
||||
if (view->first_timeout == -1)
|
||||
view->first_timeout = timeout;
|
||||
|
||||
pv.visible = 1;
|
||||
pv.start = -(view->first_timeout + 1);
|
||||
pv.end = 0;
|
||||
pv.value = -timeout;
|
||||
|
||||
grub_gui_find_by_id ((grub_gui_component_t) view->canvas,
|
||||
TIMEOUT_COMPONENT_ID, update_timeout_visit, &pv);
|
||||
grub_gui_find_by_id ((grub_gui_component_t) view->canvas,
|
||||
TIMEOUT_COMPONENT_ID, redraw_timeout_visit, &pv);
|
||||
update_timeouts (1, -(view->first_timeout + 1), -timeout, 0);
|
||||
redraw_timeouts (view);
|
||||
grub_video_swap_buffers ();
|
||||
if (view->double_repaint)
|
||||
grub_gui_find_by_id ((grub_gui_component_t) view->canvas,
|
||||
TIMEOUT_COMPONENT_ID, redraw_timeout_visit, &pv);
|
||||
redraw_timeouts (view);
|
||||
}
|
||||
|
||||
void
|
||||
grub_gfxmenu_clear_timeout (void *data)
|
||||
{
|
||||
struct progress_value_data pv;
|
||||
struct grub_gfxmenu_view *view = data;
|
||||
|
||||
auto void redraw_timeout_visit (grub_gui_component_t component,
|
||||
void *userdata __attribute__ ((unused)));
|
||||
|
||||
auto void redraw_timeout_visit (grub_gui_component_t component,
|
||||
void *userdata __attribute__ ((unused)))
|
||||
{
|
||||
grub_video_rect_t bounds;
|
||||
component->ops->get_bounds (component, &bounds);
|
||||
grub_gfxmenu_view_redraw (view, &bounds);
|
||||
}
|
||||
|
||||
pv.visible = 0;
|
||||
pv.start = 1;
|
||||
pv.end = 0;
|
||||
pv.value = 0;
|
||||
|
||||
grub_gui_find_by_id ((grub_gui_component_t) view->canvas,
|
||||
TIMEOUT_COMPONENT_ID, update_timeout_visit, &pv);
|
||||
grub_gui_find_by_id ((grub_gui_component_t) view->canvas,
|
||||
TIMEOUT_COMPONENT_ID, redraw_timeout_visit, &pv);
|
||||
update_timeouts (0, 1, 0, 0);
|
||||
redraw_timeouts (view);
|
||||
grub_video_swap_buffers ();
|
||||
if (view->double_repaint)
|
||||
grub_gui_find_by_id ((grub_gui_component_t) view->canvas,
|
||||
TIMEOUT_COMPONENT_ID, redraw_timeout_visit, &pv);
|
||||
redraw_timeouts (view);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
@ -96,23 +96,8 @@ void grub_dl_unload_all (void);
|
|||
#else
|
||||
#define GRUB_NO_MODULES 0
|
||||
#endif
|
||||
#if GRUB_NO_MODULES
|
||||
static inline int
|
||||
grub_dl_ref (grub_dl_t mod)
|
||||
{
|
||||
(void) mod;
|
||||
return 0;
|
||||
}
|
||||
static inline int
|
||||
grub_dl_unref (grub_dl_t mod)
|
||||
{
|
||||
(void) mod;
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
int EXPORT_FUNC(grub_dl_ref) (grub_dl_t mod);
|
||||
int EXPORT_FUNC(grub_dl_unref) (grub_dl_t mod);
|
||||
#endif
|
||||
void EXPORT_FUNC(grub_dl_iterate) (int (*hook) (grub_dl_t mod));
|
||||
grub_dl_t EXPORT_FUNC(grub_dl_get) (const char *name);
|
||||
grub_err_t grub_dl_register_symbol (const char *name, void *addr,
|
||||
|
|
50
include/grub/emu/misc.h
Normal file
50
include/grub/emu/misc.h
Normal file
|
@ -0,0 +1,50 @@
|
|||
#ifndef GRUB_EMU_MISC_H
|
||||
#define GRUB_EMU_MISC_H 1
|
||||
|
||||
#include <grub/symbol.h>
|
||||
#include <grub/types.h>
|
||||
|
||||
#ifdef __CYGWIN__
|
||||
# include <sys/fcntl.h>
|
||||
# include <sys/cygwin.h>
|
||||
# include <limits.h>
|
||||
# define DEV_CYGDRIVE_MAJOR 98
|
||||
#endif
|
||||
|
||||
#ifdef __NetBSD__
|
||||
/* NetBSD uses /boot for its boot block. */
|
||||
# define DEFAULT_DIRECTORY "/grub"
|
||||
#else
|
||||
# define DEFAULT_DIRECTORY "/boot/grub"
|
||||
#endif
|
||||
|
||||
#define DEFAULT_DEVICE_MAP DEFAULT_DIRECTORY "/device.map"
|
||||
|
||||
extern int verbosity;
|
||||
extern const char *program_name;
|
||||
|
||||
void grub_init_all (void);
|
||||
void grub_fini_all (void);
|
||||
|
||||
char *grub_make_system_path_relative_to_its_root (const char *path);
|
||||
|
||||
void * EXPORT_FUNC(xmalloc) (grub_size_t size);
|
||||
void * EXPORT_FUNC(xrealloc) (void *ptr, grub_size_t size);
|
||||
char * EXPORT_FUNC(xstrdup) (const char *str);
|
||||
char * EXPORT_FUNC(xasprintf) (const char *fmt, ...);
|
||||
|
||||
void EXPORT_FUNC(grub_util_warn) (const char *fmt, ...);
|
||||
void EXPORT_FUNC(grub_util_info) (const char *fmt, ...);
|
||||
void EXPORT_FUNC(grub_util_error) (const char *fmt, ...) __attribute__ ((noreturn));
|
||||
|
||||
#ifndef HAVE_VASPRINTF
|
||||
int EXPORT_FUNC(vasprintf) (char **buf, const char *fmt, va_list ap);
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_ASPRINTF
|
||||
int EXPORT_FUNC(asprintf) (char **buf, const char *fmt, ...);
|
||||
#endif
|
||||
|
||||
char * EXPORT_FUNC(xasprintf) (const char *fmt, ...);
|
||||
|
||||
#endif /* GRUB_EMU_MISC_H */
|
|
@ -22,10 +22,15 @@
|
|||
#include <grub/video.h>
|
||||
#include <grub/bitmap.h>
|
||||
#include <grub/gfxmenu_view.h>
|
||||
#include <grub/mm.h>
|
||||
|
||||
#ifndef GRUB_GUI_H
|
||||
#define GRUB_GUI_H 1
|
||||
|
||||
/* The component ID identifying GUI components to be updated as the timeout
|
||||
status changes. */
|
||||
#define GRUB_GFXMENU_TIMEOUT_COMPONENT_ID "__timeout__"
|
||||
|
||||
/* A representation of a color. Unlike grub_video_color_t, this
|
||||
representation is independent of any video mode specifics. */
|
||||
typedef struct grub_gui_color
|
||||
|
@ -79,6 +84,46 @@ struct grub_gui_progress_ops
|
|||
void (*set_state) (void *self, int visible, int start, int current, int end);
|
||||
};
|
||||
|
||||
typedef void (*grub_gfxmenu_set_state_t) (void *self, int visible, int start,
|
||||
int current, int end);
|
||||
|
||||
struct grub_gfxmenu_timeout_notify
|
||||
{
|
||||
struct grub_gfxmenu_timeout_notify *next;
|
||||
grub_gfxmenu_set_state_t set_state;
|
||||
grub_gui_component_t self;
|
||||
};
|
||||
|
||||
extern struct grub_gfxmenu_timeout_notify *grub_gfxmenu_timeout_notifications;
|
||||
|
||||
static inline grub_err_t
|
||||
grub_gfxmenu_timeout_register (grub_gui_component_t self,
|
||||
grub_gfxmenu_set_state_t set_state)
|
||||
{
|
||||
struct grub_gfxmenu_timeout_notify *ne = grub_malloc (sizeof (*ne));
|
||||
if (!ne)
|
||||
return grub_errno;
|
||||
ne->set_state = set_state;
|
||||
ne->self = self;
|
||||
ne->next = grub_gfxmenu_timeout_notifications;
|
||||
grub_gfxmenu_timeout_notifications = ne;
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
static inline void
|
||||
grub_gfxmenu_timeout_unregister (grub_gui_component_t self)
|
||||
{
|
||||
struct grub_gfxmenu_timeout_notify **p, *q;
|
||||
|
||||
for (p = &grub_gfxmenu_timeout_notifications, q = *p;
|
||||
q; p = &(q->next), q = q->next)
|
||||
if (q->self == self)
|
||||
{
|
||||
*p = q->next;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
typedef signed grub_fixed_signed_t;
|
||||
#define GRUB_FIXED_1 0x10000
|
||||
|
||||
|
|
|
@ -28,26 +28,7 @@
|
|||
#include <config.h>
|
||||
#include <grub/types.h>
|
||||
#include <grub/symbol.h>
|
||||
|
||||
#ifdef __NetBSD__
|
||||
/* NetBSD uses /boot for its boot block. */
|
||||
# define DEFAULT_DIRECTORY "/grub"
|
||||
#else
|
||||
# define DEFAULT_DIRECTORY "/boot/grub"
|
||||
#endif
|
||||
|
||||
#define DEFAULT_DEVICE_MAP DEFAULT_DIRECTORY "/device.map"
|
||||
|
||||
extern char *progname;
|
||||
extern int verbosity;
|
||||
|
||||
void EXPORT_FUNC(grub_util_warn) (const char *fmt, ...);
|
||||
void EXPORT_FUNC(grub_util_info) (const char *fmt, ...);
|
||||
void EXPORT_FUNC(grub_util_error) (const char *fmt, ...) __attribute__ ((noreturn));
|
||||
|
||||
void *xmalloc (size_t size);
|
||||
void *xrealloc (void *ptr, size_t size);
|
||||
char *xstrdup (const char *str);
|
||||
#include <grub/emu/misc.h>
|
||||
|
||||
char *grub_util_get_path (const char *dir, const char *file);
|
||||
size_t grub_util_get_fp_size (FILE *fp);
|
||||
|
@ -59,20 +40,6 @@ void grub_util_write_image (const char *img, size_t size, FILE *out);
|
|||
void grub_util_write_image_at (const void *img, size_t size, off_t offset,
|
||||
FILE *out);
|
||||
|
||||
#ifndef HAVE_VASPRINTF
|
||||
|
||||
int vasprintf (char **buf, const char *fmt, va_list ap);
|
||||
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_ASPRINTF
|
||||
|
||||
int asprintf (char **buf, const char *fmt, ...);
|
||||
|
||||
#endif
|
||||
|
||||
char *xasprintf (const char *fmt, ...);
|
||||
|
||||
#ifdef __MINGW32__
|
||||
|
||||
#define fseeko fseeko64
|
||||
|
|
|
@ -181,7 +181,8 @@ typedef enum grub_video_driver_id
|
|||
GRUB_VIDEO_DRIVER_VBE,
|
||||
GRUB_VIDEO_DRIVER_EFI_UGA,
|
||||
GRUB_VIDEO_DRIVER_EFI_GOP,
|
||||
GRUB_VIDEO_DRIVER_SM712
|
||||
GRUB_VIDEO_DRIVER_SM712,
|
||||
GRUB_VIDEO_DRIVER_VGA
|
||||
} grub_video_driver_id_t;
|
||||
|
||||
struct grub_video_adapter
|
||||
|
|
|
@ -469,12 +469,14 @@ grub_dl_resolve_dependencies (grub_dl_t mod, Elf_Ehdr *e)
|
|||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
#if !GRUB_NO_MODULES
|
||||
int
|
||||
grub_dl_ref (grub_dl_t mod)
|
||||
{
|
||||
grub_dl_dep_t dep;
|
||||
|
||||
if (!mod)
|
||||
return 0;
|
||||
|
||||
for (dep = mod->dep; dep; dep = dep->next)
|
||||
grub_dl_ref (dep->mod);
|
||||
|
||||
|
@ -486,12 +488,14 @@ grub_dl_unref (grub_dl_t mod)
|
|||
{
|
||||
grub_dl_dep_t dep;
|
||||
|
||||
if (!mod)
|
||||
return 0;
|
||||
|
||||
for (dep = mod->dep; dep; dep = dep->next)
|
||||
grub_dl_unref (dep->mod);
|
||||
|
||||
return --mod->ref_count;
|
||||
}
|
||||
#endif
|
||||
|
||||
static void
|
||||
grub_dl_flush_cache (grub_dl_t mod)
|
||||
|
|
|
@ -27,7 +27,7 @@
|
|||
# define A_STANDOUT 0
|
||||
#endif /* ! A_STANDOUT */
|
||||
|
||||
#include <grub/util/console.h>
|
||||
#include <grub/emu/console.h>
|
||||
#include <grub/term.h>
|
||||
#include <grub/types.h>
|
||||
|
|
@ -19,16 +19,15 @@
|
|||
|
||||
#include <config.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include <dirent.h>
|
||||
|
||||
#ifdef __CYGWIN__
|
||||
# include <sys/fcntl.h>
|
||||
# include <sys/cygwin.h>
|
||||
# include <limits.h>
|
||||
# define DEV_CYGDRIVE_MAJOR 98
|
||||
#endif
|
||||
#include <errno.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#ifdef __GNU__
|
||||
#include <hurd.h>
|
||||
|
@ -36,9 +35,11 @@
|
|||
#include <hurd/fs.h>
|
||||
#endif
|
||||
|
||||
#include <grub/util/misc.h>
|
||||
#include <grub/util/hostdisk.h>
|
||||
#include <grub/util/getroot.h>
|
||||
#include <grub/mm.h>
|
||||
#include <grub/misc.h>
|
||||
#include <grub/emu/misc.h>
|
||||
#include <grub/emu/hostdisk.h>
|
||||
#include <grub/emu/getroot.h>
|
||||
|
||||
static void
|
||||
strip_extra_slashes (char *dir)
|
||||
|
@ -540,4 +541,3 @@ grub_util_check_char_device (const char *blk_dev)
|
|||
else
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -22,8 +22,8 @@
|
|||
#include <grub/msdos_partition.h>
|
||||
#include <grub/types.h>
|
||||
#include <grub/err.h>
|
||||
#include <grub/util/misc.h>
|
||||
#include <grub/util/hostdisk.h>
|
||||
#include <grub/emu/misc.h>
|
||||
#include <grub/emu/hostdisk.h>
|
||||
#include <grub/misc.h>
|
||||
#include <grub/i18n.h>
|
||||
#include <grub/list.h>
|
|
@ -16,7 +16,10 @@
|
|||
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <time.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <setjmp.h>
|
||||
#include <sys/stat.h>
|
||||
#include <getopt.h>
|
||||
#include <string.h>
|
||||
|
@ -24,16 +27,17 @@
|
|||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <grub/dl.h>
|
||||
#include <grub/mm.h>
|
||||
#include <grub/setjmp.h>
|
||||
#include <grub/fs.h>
|
||||
#include <grub/util/hostdisk.h>
|
||||
#include <grub/dl.h>
|
||||
#include <grub/util/console.h>
|
||||
#include <grub/util/misc.h>
|
||||
#include <grub/emu/hostdisk.h>
|
||||
#include <grub/time.h>
|
||||
#include <grub/emu/console.h>
|
||||
#include <grub/emu/misc.h>
|
||||
#include <grub/kernel.h>
|
||||
#include <grub/normal.h>
|
||||
#include <grub/util/getroot.h>
|
||||
#include <grub/emu/getroot.h>
|
||||
#include <grub/env.h>
|
||||
#include <grub/partition.h>
|
||||
#include <grub/i18n.h>
|
||||
|
@ -242,7 +246,7 @@ main (int argc, char *argv[])
|
|||
if (strcmp (root_dev, "host") == 0)
|
||||
dir = xstrdup (dir);
|
||||
else
|
||||
dir = make_system_path_relative_to_its_root (dir);
|
||||
dir = grub_make_system_path_relative_to_its_root (dir);
|
||||
prefix = xmalloc (strlen (root_dev) + 2 + strlen (dir) + 1);
|
||||
sprintf (prefix, "(%s)%s", root_dev, dir);
|
||||
free (dir);
|
||||
|
@ -261,3 +265,32 @@ main (int argc, char *argv[])
|
|||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef __MINGW32__
|
||||
|
||||
void
|
||||
grub_millisleep (grub_uint32_t ms)
|
||||
{
|
||||
Sleep (ms);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
void
|
||||
grub_millisleep (grub_uint32_t ms)
|
||||
{
|
||||
struct timespec ts;
|
||||
|
||||
ts.tv_sec = ms / 1000;
|
||||
ts.tv_nsec = (ms % 1000) * 1000000;
|
||||
nanosleep (&ts, NULL);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#if GRUB_NO_MODULES
|
||||
void
|
||||
grub_register_exported_symbols (void)
|
||||
{
|
||||
}
|
||||
#endif
|
296
kern/emu/misc.c
Normal file
296
kern/emu/misc.c
Normal file
|
@ -0,0 +1,296 @@
|
|||
#include <config.h>
|
||||
|
||||
#include <errno.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <grub/mm.h>
|
||||
#include <grub/err.h>
|
||||
#include <grub/env.h>
|
||||
#include <grub/types.h>
|
||||
#include <grub/misc.h>
|
||||
#include <grub/i18n.h>
|
||||
#include <grub/time.h>
|
||||
#include <grub/emu/misc.h>
|
||||
|
||||
int verbosity;
|
||||
|
||||
void
|
||||
grub_util_warn (const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
|
||||
fprintf (stderr, _("%s: warn:"), program_name);
|
||||
fprintf (stderr, " ");
|
||||
va_start (ap, fmt);
|
||||
vfprintf (stderr, fmt, ap);
|
||||
va_end (ap);
|
||||
fprintf (stderr, ".\n");
|
||||
fflush (stderr);
|
||||
}
|
||||
|
||||
void
|
||||
grub_util_info (const char *fmt, ...)
|
||||
{
|
||||
if (verbosity > 0)
|
||||
{
|
||||
va_list ap;
|
||||
|
||||
fprintf (stderr, _("%s: info:"), program_name);
|
||||
fprintf (stderr, " ");
|
||||
va_start (ap, fmt);
|
||||
vfprintf (stderr, fmt, ap);
|
||||
va_end (ap);
|
||||
fprintf (stderr, ".\n");
|
||||
fflush (stderr);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
grub_util_error (const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
|
||||
fprintf (stderr, _("%s: error:"), program_name);
|
||||
fprintf (stderr, " ");
|
||||
va_start (ap, fmt);
|
||||
vfprintf (stderr, fmt, ap);
|
||||
va_end (ap);
|
||||
fprintf (stderr, ".\n");
|
||||
exit (1);
|
||||
}
|
||||
|
||||
void *
|
||||
xmalloc (grub_size_t size)
|
||||
{
|
||||
void *p;
|
||||
|
||||
p = malloc (size);
|
||||
if (! p)
|
||||
grub_util_error ("out of memory");
|
||||
|
||||
return p;
|
||||
}
|
||||
|
||||
void *
|
||||
xrealloc (void *ptr, grub_size_t size)
|
||||
{
|
||||
ptr = realloc (ptr, size);
|
||||
if (! ptr)
|
||||
grub_util_error ("out of memory");
|
||||
|
||||
return ptr;
|
||||
}
|
||||
|
||||
char *
|
||||
xstrdup (const char *str)
|
||||
{
|
||||
size_t len;
|
||||
char *newstr;
|
||||
|
||||
len = strlen (str);
|
||||
newstr = (char *) xmalloc (len + 1);
|
||||
memcpy (newstr, str, len + 1);
|
||||
|
||||
return newstr;
|
||||
}
|
||||
|
||||
#ifndef HAVE_VASPRINTF
|
||||
|
||||
int
|
||||
vasprintf (char **buf, const char *fmt, va_list ap)
|
||||
{
|
||||
/* Should be large enough. */
|
||||
*buf = xmalloc (512);
|
||||
|
||||
return vsprintf (*buf, fmt, ap);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_ASPRINTF
|
||||
|
||||
int
|
||||
asprintf (char **buf, const char *fmt, ...)
|
||||
{
|
||||
int status;
|
||||
va_list ap;
|
||||
|
||||
va_start (ap, fmt);
|
||||
status = vasprintf (*buf, fmt, ap);
|
||||
va_end (ap);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
char *
|
||||
xasprintf (const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
char *result;
|
||||
|
||||
va_start (ap, fmt);
|
||||
if (vasprintf (&result, fmt, ap) < 0)
|
||||
{
|
||||
if (errno == ENOMEM)
|
||||
grub_util_error ("out of memory");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
void
|
||||
grub_exit (void)
|
||||
{
|
||||
exit (1);
|
||||
}
|
||||
|
||||
grub_uint64_t
|
||||
grub_get_time_ms (void)
|
||||
{
|
||||
struct timeval tv;
|
||||
|
||||
gettimeofday (&tv, 0);
|
||||
|
||||
return (tv.tv_sec * 1000 + tv.tv_usec / 1000);
|
||||
}
|
||||
|
||||
grub_uint32_t
|
||||
grub_get_rtc (void)
|
||||
{
|
||||
struct timeval tv;
|
||||
|
||||
gettimeofday (&tv, 0);
|
||||
|
||||
return (tv.tv_sec * GRUB_TICKS_PER_SECOND
|
||||
+ (((tv.tv_sec % GRUB_TICKS_PER_SECOND) * 1000000 + tv.tv_usec)
|
||||
* GRUB_TICKS_PER_SECOND / 1000000));
|
||||
}
|
||||
|
||||
#ifdef __CYGWIN__
|
||||
/* Convert POSIX path to Win32 path,
|
||||
remove drive letter, replace backslashes. */
|
||||
static char *
|
||||
get_win32_path (const char *path)
|
||||
{
|
||||
char winpath[PATH_MAX];
|
||||
if (cygwin_conv_path (CCP_POSIX_TO_WIN_A, path, winpath, sizeof(winpath)))
|
||||
grub_util_error ("cygwin_conv_path() failed");
|
||||
|
||||
int len = strlen (winpath);
|
||||
int offs = (len > 2 && winpath[1] == ':' ? 2 : 0);
|
||||
|
||||
int i;
|
||||
for (i = offs; i < len; i++)
|
||||
if (winpath[i] == '\\')
|
||||
winpath[i] = '/';
|
||||
return xstrdup (winpath + offs);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* This function never prints trailing slashes (so that its output
|
||||
can be appended a slash unconditionally). */
|
||||
char *
|
||||
grub_make_system_path_relative_to_its_root (const char *path)
|
||||
{
|
||||
struct stat st;
|
||||
char *p, *buf, *buf2, *buf3;
|
||||
uintptr_t offset = 0;
|
||||
dev_t num;
|
||||
size_t len;
|
||||
|
||||
/* canonicalize. */
|
||||
p = canonicalize_file_name (path);
|
||||
|
||||
if (p == NULL)
|
||||
grub_util_error ("failed to get canonical path of %s", path);
|
||||
|
||||
len = strlen (p) + 1;
|
||||
buf = xstrdup (p);
|
||||
free (p);
|
||||
|
||||
if (stat (buf, &st) < 0)
|
||||
grub_util_error ("cannot stat %s: %s", buf, strerror (errno));
|
||||
|
||||
buf2 = xstrdup (buf);
|
||||
num = st.st_dev;
|
||||
|
||||
/* This loop sets offset to the number of chars of the root
|
||||
directory we're inspecting. */
|
||||
while (1)
|
||||
{
|
||||
p = strrchr (buf, '/');
|
||||
if (p == NULL)
|
||||
/* This should never happen. */
|
||||
grub_util_error ("FIXME: no / in buf. (make_system_path_relative_to_its_root)");
|
||||
if (p != buf)
|
||||
*p = 0;
|
||||
else
|
||||
*++p = 0;
|
||||
|
||||
if (stat (buf, &st) < 0)
|
||||
grub_util_error ("cannot stat %s: %s", buf, strerror (errno));
|
||||
|
||||
/* buf is another filesystem; we found it. */
|
||||
if (st.st_dev != num)
|
||||
{
|
||||
/* offset == 0 means path given is the mount point.
|
||||
This works around special-casing of "/" in Un*x. This function never
|
||||
prints trailing slashes (so that its output can be appended a slash
|
||||
unconditionally). Each slash in is considered a preceding slash, and
|
||||
therefore the root directory is an empty string. */
|
||||
if (offset == 0)
|
||||
{
|
||||
free (buf);
|
||||
free (buf2);
|
||||
return xstrdup ("");
|
||||
}
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
offset = p - buf;
|
||||
/* offset == 1 means root directory. */
|
||||
if (offset == 1)
|
||||
{
|
||||
/* Include leading slash. */
|
||||
offset = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
free (buf);
|
||||
buf3 = xstrdup (buf2 + offset);
|
||||
free (buf2);
|
||||
|
||||
#ifdef __CYGWIN__
|
||||
if (st.st_dev != (DEV_CYGDRIVE_MAJOR << 16))
|
||||
{
|
||||
/* Reached some mount point not below /cygdrive.
|
||||
GRUB does not know Cygwin's emulated mounts,
|
||||
convert to Win32 path. */
|
||||
grub_util_info ("Cygwin path = %s\n", buf3);
|
||||
char * temp = get_win32_path (buf3);
|
||||
free (buf3);
|
||||
buf3 = temp;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Remove trailing slashes, return empty string if root directory. */
|
||||
len = strlen (buf3);
|
||||
while (len > 0 && buf3[len - 1] == '/')
|
||||
{
|
||||
buf3[len - 1] = '\0';
|
||||
len--;
|
||||
}
|
||||
|
||||
return buf3;
|
||||
}
|
|
@ -1,513 +0,0 @@
|
|||
/*
|
||||
* GRUB -- GRand Unified Bootloader
|
||||
* Copyright (C) 2000,2001,2002,2003,2004,2005,2007,2008,2009 Free Software Foundation, Inc.
|
||||
*
|
||||
* GRUB is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* GRUB is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
// TODO: Deprecated and broken. Needs to be converted to Video Driver!
|
||||
|
||||
#include <grub/machine/vga.h>
|
||||
#include <grub/machine/console.h>
|
||||
#include <grub/cpu/io.h>
|
||||
#include <grub/term.h>
|
||||
#include <grub/types.h>
|
||||
#include <grub/dl.h>
|
||||
#include <grub/misc.h>
|
||||
#include <grub/font.h>
|
||||
|
||||
#define DEBUG_VGA 0
|
||||
|
||||
#define VGA_WIDTH 640
|
||||
#define VGA_HEIGHT 350
|
||||
#define CHAR_WIDTH 8
|
||||
#define CHAR_HEIGHT 16
|
||||
#define TEXT_WIDTH (VGA_WIDTH / CHAR_WIDTH)
|
||||
#define TEXT_HEIGHT (VGA_HEIGHT / CHAR_HEIGHT)
|
||||
#define VGA_MEM ((grub_uint8_t *) GRUB_MEMORY_MACHINE_VGA_ADDR)
|
||||
#define PAGE_OFFSET(x) ((x) * (VGA_WIDTH * VGA_HEIGHT / 8))
|
||||
|
||||
#define DEFAULT_FG_COLOR 0xa
|
||||
#define DEFAULT_BG_COLOR 0x0
|
||||
|
||||
struct colored_char
|
||||
{
|
||||
/* An Unicode codepoint. */
|
||||
grub_uint32_t code;
|
||||
|
||||
/* Color indexes. */
|
||||
unsigned char fg_color;
|
||||
unsigned char bg_color;
|
||||
|
||||
/* The width of this character minus one. */
|
||||
unsigned char width;
|
||||
|
||||
/* The column index of this character. */
|
||||
unsigned char index;
|
||||
};
|
||||
|
||||
static unsigned char text_mode;
|
||||
static unsigned xpos, ypos;
|
||||
static int cursor_state;
|
||||
static unsigned char fg_color, bg_color;
|
||||
static struct colored_char text_buf[TEXT_WIDTH * TEXT_HEIGHT];
|
||||
static unsigned char saved_map_mask;
|
||||
static int page = 0;
|
||||
static grub_font_t font = 0;
|
||||
|
||||
#define SEQUENCER_ADDR_PORT 0x3C4
|
||||
#define SEQUENCER_DATA_PORT 0x3C5
|
||||
#define MAP_MASK_REGISTER 0x02
|
||||
|
||||
#define CRTC_ADDR_PORT 0x3D4
|
||||
#define CRTC_DATA_PORT 0x3D5
|
||||
#define START_ADDR_HIGH_REGISTER 0x0C
|
||||
#define START_ADDR_LOW_REGISTER 0x0D
|
||||
|
||||
#define GRAPHICS_ADDR_PORT 0x3CE
|
||||
#define GRAPHICS_DATA_PORT 0x3CF
|
||||
#define READ_MAP_REGISTER 0x04
|
||||
|
||||
#define INPUT_STATUS1_REGISTER 0x3DA
|
||||
#define INPUT_STATUS1_VERTR_BIT 0x08
|
||||
|
||||
static inline void
|
||||
wait_vretrace (void)
|
||||
{
|
||||
/* Wait until there is a vertical retrace. */
|
||||
while (! (grub_inb (INPUT_STATUS1_REGISTER) & INPUT_STATUS1_VERTR_BIT));
|
||||
}
|
||||
|
||||
/* Get Map Mask Register. */
|
||||
static unsigned char
|
||||
get_map_mask (void)
|
||||
{
|
||||
unsigned char old_addr;
|
||||
unsigned char old_data;
|
||||
|
||||
old_addr = grub_inb (SEQUENCER_ADDR_PORT);
|
||||
grub_outb (MAP_MASK_REGISTER, SEQUENCER_ADDR_PORT);
|
||||
|
||||
old_data = grub_inb (SEQUENCER_DATA_PORT);
|
||||
|
||||
grub_outb (old_addr, SEQUENCER_ADDR_PORT);
|
||||
|
||||
return old_data;
|
||||
}
|
||||
|
||||
/* Set Map Mask Register. */
|
||||
static void
|
||||
set_map_mask (unsigned char mask)
|
||||
{
|
||||
unsigned char old_addr;
|
||||
|
||||
old_addr = grub_inb (SEQUENCER_ADDR_PORT);
|
||||
grub_outb (MAP_MASK_REGISTER, SEQUENCER_ADDR_PORT);
|
||||
|
||||
grub_outb (mask, SEQUENCER_DATA_PORT);
|
||||
|
||||
grub_outb (old_addr, SEQUENCER_ADDR_PORT);
|
||||
}
|
||||
|
||||
/* Set Read Map Register. */
|
||||
static void
|
||||
set_read_map (unsigned char map)
|
||||
{
|
||||
unsigned char old_addr;
|
||||
|
||||
old_addr = grub_inb (GRAPHICS_ADDR_PORT);
|
||||
|
||||
grub_outb (READ_MAP_REGISTER, GRAPHICS_ADDR_PORT);
|
||||
grub_outb (map, GRAPHICS_DATA_PORT);
|
||||
|
||||
grub_outb (old_addr, GRAPHICS_ADDR_PORT);
|
||||
}
|
||||
|
||||
/* Set start address. */
|
||||
static void
|
||||
set_start_address (unsigned int start)
|
||||
{
|
||||
unsigned char old_addr;
|
||||
|
||||
old_addr = grub_inb (CRTC_ADDR_PORT);
|
||||
|
||||
grub_outb (START_ADDR_LOW_REGISTER, CRTC_ADDR_PORT);
|
||||
grub_outb (start & 0xFF, CRTC_DATA_PORT);
|
||||
|
||||
grub_outb (START_ADDR_HIGH_REGISTER, CRTC_ADDR_PORT);
|
||||
grub_outb (start >> 8, CRTC_DATA_PORT);
|
||||
|
||||
grub_outb (old_addr, CRTC_ADDR_PORT);
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
grub_vga_mod_init (void)
|
||||
{
|
||||
text_mode = grub_vga_set_mode (0x10);
|
||||
cursor_state = 1;
|
||||
fg_color = DEFAULT_FG_COLOR;
|
||||
bg_color = DEFAULT_BG_COLOR;
|
||||
saved_map_mask = get_map_mask ();
|
||||
set_map_mask (0x0f);
|
||||
set_start_address (PAGE_OFFSET (page));
|
||||
font = grub_font_get (""); /* Choose any font, for now. */
|
||||
if (!font)
|
||||
return grub_error (GRUB_ERR_BAD_FONT, "no font loaded");
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
grub_vga_mod_fini (void)
|
||||
{
|
||||
set_map_mask (saved_map_mask);
|
||||
grub_vga_set_mode (text_mode);
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
static int
|
||||
check_vga_mem (void *p)
|
||||
{
|
||||
return (p >= (void *) (VGA_MEM + PAGE_OFFSET (page))
|
||||
&& p <= (void *) (VGA_MEM + PAGE_OFFSET (page)
|
||||
+ VGA_WIDTH * VGA_HEIGHT / 8));
|
||||
}
|
||||
|
||||
static void
|
||||
write_char (void)
|
||||
{
|
||||
struct colored_char *p = text_buf + xpos + ypos * TEXT_WIDTH;
|
||||
struct grub_font_glyph *glyph;
|
||||
unsigned char *mem_base;
|
||||
unsigned plane;
|
||||
|
||||
mem_base = (VGA_MEM + xpos +
|
||||
ypos * CHAR_HEIGHT * TEXT_WIDTH + PAGE_OFFSET (page)) - p->index;
|
||||
p -= p->index;
|
||||
|
||||
/* Get glyph for character. */
|
||||
glyph = grub_font_get_glyph (font, p->code);
|
||||
|
||||
for (plane = 0x01; plane <= 0x08; plane <<= 1)
|
||||
{
|
||||
unsigned y;
|
||||
unsigned offset;
|
||||
unsigned char *mem;
|
||||
|
||||
set_map_mask (plane);
|
||||
|
||||
for (y = 0, offset = 0, mem = mem_base;
|
||||
y < CHAR_HEIGHT;
|
||||
y++, mem += TEXT_WIDTH)
|
||||
{
|
||||
/* TODO Re-implement glyph drawing for vga module. */
|
||||
#if 0
|
||||
unsigned i;
|
||||
|
||||
unsigned char_width = 1; /* TODO Figure out wide characters. */
|
||||
for (i = 0; i < char_width && offset < 32; i++)
|
||||
{
|
||||
unsigned char fg_mask, bg_mask;
|
||||
|
||||
fg_mask = (p->fg_color & plane) ? glyph->bitmap[offset] : 0;
|
||||
bg_mask = (p->bg_color & plane) ? ~(glyph->bitmap[offset]) : 0;
|
||||
offset++;
|
||||
|
||||
if (check_vga_mem (mem + i))
|
||||
mem[i] = (fg_mask | bg_mask);
|
||||
}
|
||||
#endif /* 0 */
|
||||
}
|
||||
}
|
||||
|
||||
set_map_mask (0x0f);
|
||||
}
|
||||
|
||||
static void
|
||||
write_cursor (void)
|
||||
{
|
||||
unsigned char *mem = (VGA_MEM + PAGE_OFFSET (page) + xpos
|
||||
+ (ypos * CHAR_HEIGHT + CHAR_HEIGHT - 3) * TEXT_WIDTH);
|
||||
if (check_vga_mem (mem))
|
||||
*mem = 0xff;
|
||||
|
||||
mem += TEXT_WIDTH;
|
||||
if (check_vga_mem (mem))
|
||||
*mem = 0xff;
|
||||
}
|
||||
|
||||
static void
|
||||
scroll_up (void)
|
||||
{
|
||||
unsigned i;
|
||||
unsigned plane;
|
||||
|
||||
/* Do all the work in the other page. */
|
||||
grub_memmove (text_buf, text_buf + TEXT_WIDTH,
|
||||
sizeof (struct colored_char) * TEXT_WIDTH * (TEXT_HEIGHT - 1));
|
||||
|
||||
for (i = TEXT_WIDTH * (TEXT_HEIGHT - 1); i < TEXT_WIDTH * TEXT_HEIGHT; i++)
|
||||
{
|
||||
text_buf[i].code = ' ';
|
||||
text_buf[i].fg_color = 0;
|
||||
text_buf[i].bg_color = 0;
|
||||
text_buf[i].width = 0;
|
||||
text_buf[i].index = 0;
|
||||
}
|
||||
|
||||
for (plane = 1; plane <= 4; plane++)
|
||||
{
|
||||
set_read_map (plane);
|
||||
set_map_mask (1 << plane);
|
||||
grub_memmove (VGA_MEM + PAGE_OFFSET (1 - page), VGA_MEM
|
||||
+ PAGE_OFFSET (page) + VGA_WIDTH * CHAR_HEIGHT / 8,
|
||||
VGA_WIDTH * (VGA_HEIGHT - CHAR_HEIGHT) / 8);
|
||||
}
|
||||
|
||||
set_map_mask (0x0f);
|
||||
grub_memset (VGA_MEM + PAGE_OFFSET (1 - page)
|
||||
+ VGA_WIDTH * (VGA_HEIGHT - CHAR_HEIGHT) / 8, 0,
|
||||
VGA_WIDTH * CHAR_HEIGHT / 8);
|
||||
|
||||
/* Activate the other page. */
|
||||
page = 1 - page;
|
||||
wait_vretrace ();
|
||||
set_start_address (PAGE_OFFSET (page));
|
||||
}
|
||||
|
||||
static void
|
||||
grub_vga_putchar (grub_uint32_t c)
|
||||
{
|
||||
#if DEBUG_VGA
|
||||
static int show = 1;
|
||||
#endif
|
||||
|
||||
if (c == '\a')
|
||||
/* FIXME */
|
||||
return;
|
||||
|
||||
if (c == '\b' || c == '\n' || c == '\r')
|
||||
{
|
||||
/* Erase current cursor, if any. */
|
||||
if (cursor_state)
|
||||
write_char ();
|
||||
|
||||
switch (c)
|
||||
{
|
||||
case '\b':
|
||||
if (xpos > 0)
|
||||
xpos--;
|
||||
break;
|
||||
|
||||
case '\n':
|
||||
if (ypos >= TEXT_HEIGHT - 1)
|
||||
scroll_up ();
|
||||
else
|
||||
ypos++;
|
||||
break;
|
||||
|
||||
case '\r':
|
||||
xpos = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
if (cursor_state)
|
||||
write_cursor ();
|
||||
}
|
||||
else
|
||||
{
|
||||
struct grub_font_glyph *glyph;
|
||||
struct colored_char *p;
|
||||
unsigned char_width = 1;
|
||||
|
||||
glyph = grub_font_get_glyph(font, c);
|
||||
|
||||
if (xpos + char_width > TEXT_WIDTH)
|
||||
grub_putchar ('\n');
|
||||
|
||||
p = text_buf + xpos + ypos * TEXT_WIDTH;
|
||||
p->code = c;
|
||||
p->fg_color = fg_color;
|
||||
p->bg_color = bg_color;
|
||||
p->width = char_width - 1;
|
||||
p->index = 0;
|
||||
|
||||
if (char_width > 1)
|
||||
{
|
||||
unsigned i;
|
||||
|
||||
for (i = 1; i < char_width; i++)
|
||||
{
|
||||
p[i].code = ' ';
|
||||
p[i].width = char_width - 1;
|
||||
p[i].index = i;
|
||||
}
|
||||
}
|
||||
|
||||
write_char ();
|
||||
|
||||
xpos += char_width;
|
||||
if (xpos >= TEXT_WIDTH)
|
||||
{
|
||||
xpos = 0;
|
||||
|
||||
if (ypos >= TEXT_HEIGHT - 1)
|
||||
scroll_up ();
|
||||
else
|
||||
ypos++;
|
||||
}
|
||||
|
||||
if (cursor_state)
|
||||
write_cursor ();
|
||||
}
|
||||
|
||||
#if DEBUG_VGA
|
||||
if (show)
|
||||
{
|
||||
grub_uint16_t pos = grub_getxy ();
|
||||
|
||||
show = 0;
|
||||
grub_gotoxy (0, 0);
|
||||
grub_printf ("[%u:%u]", (unsigned) (pos >> 8), (unsigned) (pos & 0xff));
|
||||
grub_gotoxy (pos >> 8, pos & 0xff);
|
||||
show = 1;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
static grub_ssize_t
|
||||
grub_vga_getcharwidth (grub_uint32_t c)
|
||||
{
|
||||
#if 0
|
||||
struct grub_font_glyph glyph;
|
||||
|
||||
glyph = grub_font_get_glyph (c);
|
||||
|
||||
return glyph.char_width;
|
||||
#else
|
||||
(void) c; /* Prevent warning. */
|
||||
return 1; /* TODO Fix wide characters? */
|
||||
#endif
|
||||
}
|
||||
|
||||
static grub_uint16_t
|
||||
grub_vga_getwh (void)
|
||||
{
|
||||
return (TEXT_WIDTH << 8) | TEXT_HEIGHT;
|
||||
}
|
||||
|
||||
static grub_uint16_t
|
||||
grub_vga_getxy (void)
|
||||
{
|
||||
return ((xpos << 8) | ypos);
|
||||
}
|
||||
|
||||
static void
|
||||
grub_vga_gotoxy (grub_uint8_t x, grub_uint8_t y)
|
||||
{
|
||||
if (x >= TEXT_WIDTH || y >= TEXT_HEIGHT)
|
||||
{
|
||||
grub_error (GRUB_ERR_OUT_OF_RANGE, "invalid point (%u,%u)",
|
||||
(unsigned) x, (unsigned) y);
|
||||
return;
|
||||
}
|
||||
|
||||
if (cursor_state)
|
||||
write_char ();
|
||||
|
||||
xpos = x;
|
||||
ypos = y;
|
||||
|
||||
if (cursor_state)
|
||||
write_cursor ();
|
||||
}
|
||||
|
||||
static void
|
||||
grub_vga_cls (void)
|
||||
{
|
||||
unsigned i;
|
||||
|
||||
wait_vretrace ();
|
||||
for (i = 0; i < TEXT_WIDTH * TEXT_HEIGHT; i++)
|
||||
{
|
||||
text_buf[i].code = ' ';
|
||||
text_buf[i].fg_color = 0;
|
||||
text_buf[i].bg_color = 0;
|
||||
text_buf[i].width = 0;
|
||||
text_buf[i].index = 0;
|
||||
}
|
||||
|
||||
grub_memset (VGA_MEM + PAGE_OFFSET (page), 0, VGA_WIDTH * VGA_HEIGHT / 8);
|
||||
|
||||
xpos = ypos = 0;
|
||||
}
|
||||
|
||||
static void
|
||||
grub_vga_setcolorstate (grub_term_color_state state)
|
||||
{
|
||||
switch (state)
|
||||
{
|
||||
case GRUB_TERM_COLOR_STANDARD:
|
||||
case GRUB_TERM_COLOR_NORMAL:
|
||||
fg_color = DEFAULT_FG_COLOR;
|
||||
bg_color = DEFAULT_BG_COLOR;
|
||||
break;
|
||||
case GRUB_TERM_COLOR_HIGHLIGHT:
|
||||
fg_color = DEFAULT_BG_COLOR;
|
||||
bg_color = DEFAULT_FG_COLOR;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
grub_vga_setcursor (int on)
|
||||
{
|
||||
if (cursor_state != on)
|
||||
{
|
||||
if (cursor_state)
|
||||
write_char ();
|
||||
else
|
||||
write_cursor ();
|
||||
|
||||
cursor_state = on;
|
||||
}
|
||||
}
|
||||
|
||||
static struct grub_term_output grub_vga_term =
|
||||
{
|
||||
.name = "vga",
|
||||
.init = grub_vga_mod_init,
|
||||
.fini = grub_vga_mod_fini,
|
||||
.putchar = grub_vga_putchar,
|
||||
.getcharwidth = grub_vga_getcharwidth,
|
||||
.getwh = grub_vga_getwh,
|
||||
.getxy = grub_vga_getxy,
|
||||
.gotoxy = grub_vga_gotoxy,
|
||||
.cls = grub_vga_cls,
|
||||
.setcolorstate = grub_vga_setcolorstate,
|
||||
.setcursor = grub_vga_setcursor,
|
||||
.flags = 0,
|
||||
};
|
||||
|
||||
GRUB_MOD_INIT(vga)
|
||||
{
|
||||
grub_term_register_output ("vga", &grub_vga_term);
|
||||
}
|
||||
|
||||
GRUB_MOD_FINI(vga)
|
||||
{
|
||||
grub_term_unregister_output (&grub_vga_term);
|
||||
}
|
|
@ -17,7 +17,9 @@
|
|||
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <grub/util/misc.h>
|
||||
#include <grub/emu/misc.h>
|
||||
#include <grub/i18n.h>
|
||||
#include <getopt.h>
|
||||
|
||||
|
@ -97,7 +99,7 @@ main (int argc, char *argv[])
|
|||
|
||||
argument = argv[optind];
|
||||
|
||||
relpath = make_system_path_relative_to_its_root (argument);
|
||||
relpath = grub_make_system_path_relative_to_its_root (argument);
|
||||
printf ("%s\n", relpath);
|
||||
free (relpath);
|
||||
|
||||
|
|
|
@ -47,8 +47,8 @@ Make GRUB rescue image.
|
|||
|
||||
-h, --help print this message and exit
|
||||
-v, --version print the version information and exit
|
||||
--modules=MODULES pre-load specified modules MODULES
|
||||
--output=FILE save output in FILE [required]
|
||||
--modules=MODULES pre-load specified modules MODULES
|
||||
--rom-directory=DIR save rom images in DIR [optional]
|
||||
|
||||
$0 generates a bootable rescue image with specified source files or directories.
|
||||
|
@ -158,7 +158,7 @@ EOF
|
|||
tar -C ${memdisk_dir} -cf ${memdisk_img} boot
|
||||
rm -rf ${memdisk_dir}
|
||||
grub-mkimage -O ${platform} -d "${source_directory}" -m "${memdisk_img}" -o "$3" --prefix='(memdisk)/boot/grub' \
|
||||
search iso9660 configfile sh memdisk tar $4
|
||||
search iso9660 configfile normal sh memdisk tar $4
|
||||
rm -rf ${memdisk_img}
|
||||
}
|
||||
|
||||
|
|
|
@ -20,14 +20,15 @@
|
|||
#include <config.h>
|
||||
#include <grub/types.h>
|
||||
#include <grub/util/misc.h>
|
||||
#include <grub/util/misc.h>
|
||||
#include <grub/device.h>
|
||||
#include <grub/disk.h>
|
||||
#include <grub/file.h>
|
||||
#include <grub/fs.h>
|
||||
#include <grub/partition.h>
|
||||
#include <grub/msdos_partition.h>
|
||||
#include <grub/util/hostdisk.h>
|
||||
#include <grub/util/getroot.h>
|
||||
#include <grub/emu/hostdisk.h>
|
||||
#include <grub/emu/getroot.h>
|
||||
#include <grub/term.h>
|
||||
#include <grub/env.h>
|
||||
#include <grub/raid.h>
|
||||
|
@ -261,7 +262,7 @@ probe (const char *path, char *device_name)
|
|||
grub_util_info ("reading %s via OS facilities", path);
|
||||
filebuf_via_sys = grub_util_read_image (path);
|
||||
|
||||
rel_path = make_system_path_relative_to_its_root (path);
|
||||
rel_path = grub_make_system_path_relative_to_its_root (path);
|
||||
grub_path = xasprintf ("(%s)%s", drive_name, rel_path);
|
||||
free (rel_path);
|
||||
grub_util_info ("reading %s via GRUB facilities", grub_path);
|
||||
|
|
|
@ -28,14 +28,14 @@
|
|||
#include <grub/msdos_partition.h>
|
||||
#include <grub/gpt_partition.h>
|
||||
#include <grub/env.h>
|
||||
#include <grub/util/hostdisk.h>
|
||||
#include <grub/emu/hostdisk.h>
|
||||
#include <grub/machine/boot.h>
|
||||
#include <grub/machine/kernel.h>
|
||||
#include <grub/term.h>
|
||||
#include <grub/i18n.h>
|
||||
#include <grub/util/raid.h>
|
||||
#include <grub/util/lvm.h>
|
||||
#include <grub/util/getroot.h>
|
||||
#include <grub/emu/getroot.h>
|
||||
|
||||
static const grub_gpt_part_type_t grub_gpt_partition_type_bios_boot = GRUB_GPT_PARTITION_TYPE_BIOS_BOOT;
|
||||
|
||||
|
@ -430,7 +430,7 @@ unable_to_embed:
|
|||
/* Make sure that GRUB reads the identical image as the OS. */
|
||||
tmp_img = xmalloc (core_size);
|
||||
core_path_dev_full = grub_util_get_path (dir, core_file);
|
||||
core_path_dev = make_system_path_relative_to_its_root (core_path_dev_full);
|
||||
core_path_dev = grub_make_system_path_relative_to_its_root (core_path_dev_full);
|
||||
free (core_path_dev_full);
|
||||
|
||||
/* It is a Good Thing to sync two times. */
|
||||
|
|
295
util/misc.c
295
util/misc.c
|
@ -53,63 +53,11 @@
|
|||
# include <malloc.h>
|
||||
#endif
|
||||
|
||||
#ifdef __CYGWIN__
|
||||
# include <sys/cygwin.h>
|
||||
# define DEV_CYGDRIVE_MAJOR 98
|
||||
#endif
|
||||
|
||||
#ifdef __MINGW32__
|
||||
#include <windows.h>
|
||||
#include <winioctl.h>
|
||||
#endif
|
||||
|
||||
int verbosity = 0;
|
||||
|
||||
void
|
||||
grub_util_warn (const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
|
||||
fprintf (stderr, _("%s: warn:"), program_name);
|
||||
fprintf (stderr, " ");
|
||||
va_start (ap, fmt);
|
||||
vfprintf (stderr, fmt, ap);
|
||||
va_end (ap);
|
||||
fprintf (stderr, ".\n");
|
||||
fflush (stderr);
|
||||
}
|
||||
|
||||
void
|
||||
grub_util_info (const char *fmt, ...)
|
||||
{
|
||||
if (verbosity > 0)
|
||||
{
|
||||
va_list ap;
|
||||
|
||||
fprintf (stderr, _("%s: info:"), program_name);
|
||||
fprintf (stderr, " ");
|
||||
va_start (ap, fmt);
|
||||
vfprintf (stderr, fmt, ap);
|
||||
va_end (ap);
|
||||
fprintf (stderr, ".\n");
|
||||
fflush (stderr);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
grub_util_error (const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
|
||||
fprintf (stderr, _("%s: error:"), program_name);
|
||||
fprintf (stderr, " ");
|
||||
va_start (ap, fmt);
|
||||
vfprintf (stderr, fmt, ap);
|
||||
va_end (ap);
|
||||
fprintf (stderr, ".\n");
|
||||
exit (1);
|
||||
}
|
||||
|
||||
#ifdef GRUB_UTIL
|
||||
int
|
||||
grub_err_printf (const char *fmt, ...)
|
||||
|
@ -125,41 +73,6 @@ grub_err_printf (const char *fmt, ...)
|
|||
}
|
||||
#endif
|
||||
|
||||
void *
|
||||
xmalloc (size_t size)
|
||||
{
|
||||
void *p;
|
||||
|
||||
p = malloc (size);
|
||||
if (! p)
|
||||
grub_util_error ("out of memory");
|
||||
|
||||
return p;
|
||||
}
|
||||
|
||||
void *
|
||||
xrealloc (void *ptr, size_t size)
|
||||
{
|
||||
ptr = realloc (ptr, size);
|
||||
if (! ptr)
|
||||
grub_util_error ("out of memory");
|
||||
|
||||
return ptr;
|
||||
}
|
||||
|
||||
char *
|
||||
xstrdup (const char *str)
|
||||
{
|
||||
size_t len;
|
||||
char *newstr;
|
||||
|
||||
len = strlen (str);
|
||||
newstr = (char *) xmalloc (len + 1);
|
||||
memcpy (newstr, str, len + 1);
|
||||
|
||||
return newstr;
|
||||
}
|
||||
|
||||
char *
|
||||
grub_util_get_path (const char *dir, const char *file)
|
||||
{
|
||||
|
@ -282,34 +195,6 @@ grub_register_exported_symbols (void)
|
|||
}
|
||||
#endif
|
||||
|
||||
void
|
||||
grub_exit (void)
|
||||
{
|
||||
exit (1);
|
||||
}
|
||||
|
||||
grub_uint32_t
|
||||
grub_get_rtc (void)
|
||||
{
|
||||
struct timeval tv;
|
||||
|
||||
gettimeofday (&tv, 0);
|
||||
|
||||
return (tv.tv_sec * GRUB_TICKS_PER_SECOND
|
||||
+ (((tv.tv_sec % GRUB_TICKS_PER_SECOND) * 1000000 + tv.tv_usec)
|
||||
* GRUB_TICKS_PER_SECOND / 1000000));
|
||||
}
|
||||
|
||||
grub_uint64_t
|
||||
grub_get_time_ms (void)
|
||||
{
|
||||
struct timeval tv;
|
||||
|
||||
gettimeofday (&tv, 0);
|
||||
|
||||
return (tv.tv_sec * 1000 + tv.tv_usec / 1000);
|
||||
}
|
||||
|
||||
#ifdef __MINGW32__
|
||||
|
||||
void
|
||||
|
@ -340,53 +225,6 @@ grub_arch_sync_caches (void *address __attribute__ ((unused)),
|
|||
}
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_VASPRINTF
|
||||
|
||||
int
|
||||
vasprintf (char **buf, const char *fmt, va_list ap)
|
||||
{
|
||||
/* Should be large enough. */
|
||||
*buf = xmalloc (512);
|
||||
|
||||
return vsprintf (*buf, fmt, ap);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_ASPRINTF
|
||||
|
||||
int
|
||||
asprintf (char **buf, const char *fmt, ...)
|
||||
{
|
||||
int status;
|
||||
va_list ap;
|
||||
|
||||
va_start (ap, fmt);
|
||||
status = vasprintf (*buf, fmt, ap);
|
||||
va_end (ap);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
char *
|
||||
xasprintf (const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
char *result;
|
||||
|
||||
va_start (ap, fmt);
|
||||
if (vasprintf (&result, fmt, ap) < 0)
|
||||
{
|
||||
if (errno == ENOMEM)
|
||||
grub_util_error ("out of memory");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
#ifdef __MINGW32__
|
||||
|
||||
void sync (void)
|
||||
|
@ -461,125 +299,6 @@ canonicalize_file_name (const char *path)
|
|||
return ret;
|
||||
}
|
||||
|
||||
#ifdef __CYGWIN__
|
||||
/* Convert POSIX path to Win32 path,
|
||||
remove drive letter, replace backslashes. */
|
||||
static char *
|
||||
get_win32_path (const char *path)
|
||||
{
|
||||
char winpath[PATH_MAX];
|
||||
if (cygwin_conv_path (CCP_POSIX_TO_WIN_A, path, winpath, sizeof(winpath)))
|
||||
grub_util_error ("cygwin_conv_path() failed");
|
||||
|
||||
int len = strlen (winpath);
|
||||
int offs = (len > 2 && winpath[1] == ':' ? 2 : 0);
|
||||
|
||||
int i;
|
||||
for (i = offs; i < len; i++)
|
||||
if (winpath[i] == '\\')
|
||||
winpath[i] = '/';
|
||||
return xstrdup (winpath + offs);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* This function never prints trailing slashes (so that its output
|
||||
can be appended a slash unconditionally). */
|
||||
char *
|
||||
make_system_path_relative_to_its_root (const char *path)
|
||||
{
|
||||
struct stat st;
|
||||
char *p, *buf, *buf2, *buf3;
|
||||
uintptr_t offset = 0;
|
||||
dev_t num;
|
||||
size_t len;
|
||||
|
||||
/* canonicalize. */
|
||||
p = canonicalize_file_name (path);
|
||||
|
||||
if (p == NULL)
|
||||
grub_util_error ("failed to get canonical path of %s", path);
|
||||
|
||||
len = strlen (p) + 1;
|
||||
buf = xstrdup (p);
|
||||
free (p);
|
||||
|
||||
if (stat (buf, &st) < 0)
|
||||
grub_util_error ("cannot stat %s: %s", buf, strerror (errno));
|
||||
|
||||
buf2 = xstrdup (buf);
|
||||
num = st.st_dev;
|
||||
|
||||
/* This loop sets offset to the number of chars of the root
|
||||
directory we're inspecting. */
|
||||
while (1)
|
||||
{
|
||||
p = strrchr (buf, '/');
|
||||
if (p == NULL)
|
||||
/* This should never happen. */
|
||||
grub_util_error ("FIXME: no / in buf. (make_system_path_relative_to_its_root)");
|
||||
if (p != buf)
|
||||
*p = 0;
|
||||
else
|
||||
*++p = 0;
|
||||
|
||||
if (stat (buf, &st) < 0)
|
||||
grub_util_error ("cannot stat %s: %s", buf, strerror (errno));
|
||||
|
||||
/* buf is another filesystem; we found it. */
|
||||
if (st.st_dev != num)
|
||||
{
|
||||
/* offset == 0 means path given is the mount point.
|
||||
This works around special-casing of "/" in Un*x. This function never
|
||||
prints trailing slashes (so that its output can be appended a slash
|
||||
unconditionally). Each slash in is considered a preceding slash, and
|
||||
therefore the root directory is an empty string. */
|
||||
if (offset == 0)
|
||||
{
|
||||
free (buf);
|
||||
free (buf2);
|
||||
return xstrdup ("");
|
||||
}
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
offset = p - buf;
|
||||
/* offset == 1 means root directory. */
|
||||
if (offset == 1)
|
||||
{
|
||||
/* Include leading slash. */
|
||||
offset = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
free (buf);
|
||||
buf3 = xstrdup (buf2 + offset);
|
||||
free (buf2);
|
||||
|
||||
#ifdef __CYGWIN__
|
||||
if (st.st_dev != (DEV_CYGDRIVE_MAJOR << 16))
|
||||
{
|
||||
/* Reached some mount point not below /cygdrive.
|
||||
GRUB does not know Cygwin's emulated mounts,
|
||||
convert to Win32 path. */
|
||||
grub_util_info ("Cygwin path = %s\n", buf3);
|
||||
char * temp = get_win32_path (buf3);
|
||||
free (buf3);
|
||||
buf3 = temp;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Remove trailing slashes, return empty string if root directory. */
|
||||
len = strlen (buf3);
|
||||
while (len > 0 && buf3[len - 1] == '/')
|
||||
{
|
||||
buf3[len - 1] = '\0';
|
||||
len--;
|
||||
}
|
||||
|
||||
return buf3;
|
||||
}
|
||||
|
||||
#ifdef GRUB_UTIL
|
||||
void
|
||||
grub_util_init_nls (void)
|
||||
|
@ -591,3 +310,17 @@ grub_util_init_nls (void)
|
|||
#endif /* (defined(ENABLE_NLS) && ENABLE_NLS) */
|
||||
}
|
||||
#endif
|
||||
|
||||
int
|
||||
grub_dl_ref (grub_dl_t mod)
|
||||
{
|
||||
(void) mod;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
grub_dl_unref (grub_dl_t mod)
|
||||
{
|
||||
(void) mod;
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -1,20 +0,0 @@
|
|||
/*
|
||||
* Header file defaults.h - assorted default values for character strings in
|
||||
* the volume descriptor.
|
||||
*
|
||||
* $Id: defaults.h,v 1.8 1999/03/02 03:41:25 eric Exp $
|
||||
*/
|
||||
|
||||
#define PREPARER_DEFAULT NULL
|
||||
#define PUBLISHER_DEFAULT NULL
|
||||
#ifndef APPID_DEFAULT
|
||||
#define APPID_DEFAULT PACKAGE_NAME " ISO 9660 filesystem builder"
|
||||
#endif
|
||||
#define COPYRIGHT_DEFAULT NULL
|
||||
#define BIBLIO_DEFAULT NULL
|
||||
#define ABSTRACT_DEFAULT NULL
|
||||
#define VOLSET_ID_DEFAULT NULL
|
||||
#define VOLUME_ID_DEFAULT "CDROM"
|
||||
#define BOOT_CATALOG_DEFAULT "boot.catalog"
|
||||
#define BOOT_IMAGE_DEFAULT NULL
|
||||
#define SYSTEM_ID_DEFAULT "GNU"
|
|
@ -1,343 +0,0 @@
|
|||
/*
|
||||
* Program eltorito.c - Handle El Torito specific extensions to iso9660.
|
||||
*
|
||||
|
||||
Written by Michael Fulbright <msf@redhat.com> (1996).
|
||||
|
||||
Copyright 1996 RedHat Software, Incorporated
|
||||
|
||||
Copyright (C) 2009 Free Software Foundation, Inc.
|
||||
|
||||
Boot Info Table generation based on code from genisoimage.c
|
||||
(from cdrkit 1.1.9), which was originally licensed under GPLv2+.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdlib.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include "config.h"
|
||||
#include "mkisofs.h"
|
||||
#include "iso9660.h"
|
||||
|
||||
/* used by Win32 for opening binary file - not used by Unix */
|
||||
#ifndef O_BINARY
|
||||
#define O_BINARY 0
|
||||
#endif /* O_BINARY */
|
||||
|
||||
#undef MIN
|
||||
#define MIN(a, b) (((a) < (b))? (a): (b))
|
||||
|
||||
static struct eltorito_validation_entry valid_desc;
|
||||
static struct eltorito_defaultboot_entry default_desc;
|
||||
static struct eltorito_boot_descriptor gboot_desc;
|
||||
|
||||
static int tvd_write __PR((FILE * outfile));
|
||||
|
||||
/*
|
||||
* Check for presence of boot catalog. If it does not exist then make it
|
||||
*/
|
||||
void FDECL1(init_boot_catalog, const char *, path)
|
||||
{
|
||||
FILE *bcat;
|
||||
char * bootpath; /* filename of boot catalog */
|
||||
char * buf;
|
||||
struct stat statbuf;
|
||||
|
||||
bootpath = (char *) e_malloc(strlen(boot_catalog)+strlen(path)+2);
|
||||
strcpy(bootpath, path);
|
||||
if (bootpath[strlen(bootpath)-1] != '/')
|
||||
{
|
||||
strcat(bootpath,"/");
|
||||
}
|
||||
|
||||
strcat(bootpath, boot_catalog);
|
||||
|
||||
/*
|
||||
* check for the file existing
|
||||
*/
|
||||
#ifdef DEBUG_TORITO
|
||||
fprintf(stderr,"Looking for boot catalog file %s\n",bootpath);
|
||||
#endif
|
||||
|
||||
if (!stat_filter(bootpath, &statbuf))
|
||||
{
|
||||
/*
|
||||
* make sure its big enough to hold what we want
|
||||
*/
|
||||
if (statbuf.st_size == 2048)
|
||||
{
|
||||
/*
|
||||
* printf("Boot catalog exists, so we do nothing\n");
|
||||
*/
|
||||
free(bootpath);
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf (stderr, _("A boot catalog exists and appears corrupted.\n"));
|
||||
fprintf (stderr, _("Please check the following file: %s.\n"), bootpath);
|
||||
fprintf (stderr, _("This file must be removed before a bootable CD can be done.\n"));
|
||||
free (bootpath);
|
||||
exit (1);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* file does not exist, so we create it
|
||||
* make it one CD sector long
|
||||
*/
|
||||
bcat = fopen (bootpath, "wb");
|
||||
if (bcat == NULL)
|
||||
error (1, errno, _("Error creating boot catalog (%s)"), bootpath);
|
||||
|
||||
buf = (char *) e_malloc( 2048 );
|
||||
if (fwrite (buf, 1, 2048, bcat) != 2048)
|
||||
error (1, errno, _("Error writing to boot catalog (%s)"), bootpath);
|
||||
fclose (bcat);
|
||||
chmod (bootpath, S_IROTH | S_IRGRP | S_IRWXU);
|
||||
|
||||
free(bootpath);
|
||||
} /* init_boot_catalog(... */
|
||||
|
||||
void FDECL1(get_torito_desc, struct eltorito_boot_descriptor *, boot_desc)
|
||||
{
|
||||
FILE *bootcat;
|
||||
int checksum;
|
||||
unsigned char * checksum_ptr;
|
||||
struct directory_entry * de;
|
||||
struct directory_entry * de2;
|
||||
unsigned int i;
|
||||
int nsectors;
|
||||
|
||||
memset(boot_desc, 0, sizeof(*boot_desc));
|
||||
boot_desc->id[0] = 0;
|
||||
memcpy(boot_desc->id2, ISO_STANDARD_ID, sizeof(ISO_STANDARD_ID));
|
||||
boot_desc->version[0] = 1;
|
||||
|
||||
memcpy(boot_desc->system_id, EL_TORITO_ID, sizeof(EL_TORITO_ID));
|
||||
|
||||
/*
|
||||
* search from root of iso fs to find boot catalog
|
||||
*/
|
||||
de2 = search_tree_file(root, boot_catalog);
|
||||
if (!de2)
|
||||
{
|
||||
fprintf (stderr, _("Boot catalog cannot be found!\n"));
|
||||
exit (1);
|
||||
}
|
||||
|
||||
set_731(boot_desc->bootcat_ptr,
|
||||
(unsigned int) get_733(de2->isorec.extent));
|
||||
|
||||
/*
|
||||
* now adjust boot catalog
|
||||
* lets find boot image first
|
||||
*/
|
||||
de=search_tree_file(root, boot_image);
|
||||
if (!de)
|
||||
{
|
||||
fprintf (stderr, _("Boot image cannot be found!\n"));
|
||||
exit (1);
|
||||
}
|
||||
|
||||
/*
|
||||
* we have the boot image, so write boot catalog information
|
||||
* Next we write out the primary descriptor for the disc
|
||||
*/
|
||||
memset(&valid_desc, 0, sizeof(valid_desc));
|
||||
valid_desc.headerid[0] = 1;
|
||||
valid_desc.arch[0] = EL_TORITO_ARCH_x86;
|
||||
|
||||
/*
|
||||
* we'll shove start of publisher id into id field, may get truncated
|
||||
* but who really reads this stuff!
|
||||
*/
|
||||
if (publisher)
|
||||
memcpy_max(valid_desc.id, publisher, MIN(23, strlen(publisher)));
|
||||
|
||||
valid_desc.key1[0] = 0x55;
|
||||
valid_desc.key2[0] = 0xAA;
|
||||
|
||||
/*
|
||||
* compute the checksum
|
||||
*/
|
||||
checksum=0;
|
||||
checksum_ptr = (unsigned char *) &valid_desc;
|
||||
for (i=0; i<sizeof(valid_desc); i+=2)
|
||||
{
|
||||
/*
|
||||
* skip adding in ckecksum word, since we dont have it yet!
|
||||
*/
|
||||
if (i == 28)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
checksum += (unsigned int)checksum_ptr[i];
|
||||
checksum += ((unsigned int)checksum_ptr[i+1])*256;
|
||||
}
|
||||
|
||||
/*
|
||||
* now find out the real checksum
|
||||
*/
|
||||
checksum = -checksum;
|
||||
set_721(valid_desc.cksum, (unsigned int) checksum);
|
||||
|
||||
/*
|
||||
* now make the initial/default entry for boot catalog
|
||||
*/
|
||||
memset(&default_desc, 0, sizeof(default_desc));
|
||||
default_desc.boot_id[0] = EL_TORITO_BOOTABLE;
|
||||
|
||||
/*
|
||||
* use default BIOS loadpnt
|
||||
*/
|
||||
set_721(default_desc.loadseg, 0);
|
||||
default_desc.arch[0] = EL_TORITO_ARCH_x86;
|
||||
|
||||
/*
|
||||
* figure out size of boot image in sectors, for now hard code to
|
||||
* assume 512 bytes/sector on a bootable floppy
|
||||
*/
|
||||
nsectors = ((de->size + 511) & ~(511))/512;
|
||||
fprintf (stderr, _("\nSize of boot image is %d sectors"), nsectors);
|
||||
fprintf (stderr, " -> ");
|
||||
|
||||
if (! use_eltorito_emul_floppy)
|
||||
{
|
||||
default_desc.boot_media[0] = EL_TORITO_MEDIA_NOEMUL;
|
||||
fprintf (stderr, _("No emulation\n"));
|
||||
}
|
||||
else if (nsectors == 2880 )
|
||||
/*
|
||||
* choose size of emulated floppy based on boot image size
|
||||
*/
|
||||
{
|
||||
default_desc.boot_media[0] = EL_TORITO_MEDIA_144FLOP;
|
||||
fprintf (stderr, _("Emulating a 1.44 meg floppy\n"));
|
||||
}
|
||||
else if (nsectors == 5760 )
|
||||
{
|
||||
default_desc.boot_media[0] = EL_TORITO_MEDIA_288FLOP;
|
||||
fprintf (stderr, _("Emulating a 2.88 meg floppy\n"));
|
||||
}
|
||||
else if (nsectors == 2400 )
|
||||
{
|
||||
default_desc.boot_media[0] = EL_TORITO_MEDIA_12FLOP;
|
||||
fprintf (stderr, _("Emulating a 1.2 meg floppy\n"));
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf (stderr, _("\nError - boot image is not the an allowable size.\n"));
|
||||
exit (1);
|
||||
}
|
||||
|
||||
/*
|
||||
* FOR NOW LOAD 1 SECTOR, JUST LIKE FLOPPY BOOT!!!
|
||||
*/
|
||||
nsectors = 1;
|
||||
set_721(default_desc.nsect, (unsigned int) nsectors );
|
||||
#ifdef DEBUG_TORITO
|
||||
fprintf(stderr,"Extent of boot images is %d\n",get_733(de->isorec.extent));
|
||||
#endif
|
||||
set_731(default_desc.bootoff,
|
||||
(unsigned int) get_733(de->isorec.extent));
|
||||
|
||||
/*
|
||||
* now write it to disk
|
||||
*/
|
||||
bootcat = fopen (de2->whole_name, "r+b");
|
||||
if (bootcat == NULL)
|
||||
error (1, errno, _("Error opening boot catalog for update"));
|
||||
|
||||
/*
|
||||
* write out
|
||||
*/
|
||||
if (fwrite (&valid_desc, 1, 32, bootcat) != 32)
|
||||
error (1, errno, _("Error writing to boot catalog"));
|
||||
if (fwrite (&default_desc, 1, 32, bootcat) != 32)
|
||||
error (1, errno, _("Error writing to boot catalog"));
|
||||
fclose (bootcat);
|
||||
|
||||
/* If the user has asked for it, patch the boot image */
|
||||
if (use_boot_info_table)
|
||||
{
|
||||
FILE *bootimage;
|
||||
uint32_t bi_checksum;
|
||||
unsigned int total_len;
|
||||
static char csum_buffer[SECTOR_SIZE];
|
||||
int len;
|
||||
struct eltorito_boot_info bi_table;
|
||||
bootimage = fopen (de->whole_name, "r+b");
|
||||
if (bootimage == NULL)
|
||||
error (1, errno, _("Error opening boot image file `%s' for update"),
|
||||
de->whole_name);
|
||||
/* Compute checksum of boot image, sans 64 bytes */
|
||||
total_len = 0;
|
||||
bi_checksum = 0;
|
||||
while ((len = fread (csum_buffer, 1, SECTOR_SIZE, bootimage)) > 0)
|
||||
{
|
||||
if (total_len & 3)
|
||||
error (1, 0, _("Odd alignment at non-end-of-file in boot image `%s'"),
|
||||
de->whole_name);
|
||||
if (total_len < 64)
|
||||
memset (csum_buffer, 0, 64 - total_len);
|
||||
if (len < SECTOR_SIZE)
|
||||
memset (csum_buffer + len, 0, SECTOR_SIZE - len);
|
||||
for (i = 0; i < SECTOR_SIZE; i += 4)
|
||||
bi_checksum += get_731 (&csum_buffer[i]);
|
||||
total_len += len;
|
||||
}
|
||||
|
||||
if (total_len != de->size)
|
||||
error (1, 0, _("Boot image file `%s' changed unexpectedly"),
|
||||
de->whole_name);
|
||||
/* End of file, set position to byte 8 */
|
||||
fseeko (bootimage, (off_t) 8, SEEK_SET);
|
||||
memset (&bi_table, 0, sizeof (bi_table));
|
||||
/* Is it always safe to assume PVD is at session_start+16? */
|
||||
set_731 (bi_table.pvd_addr, session_start + 16);
|
||||
set_731 (bi_table.file_addr, de->starting_block);
|
||||
set_731 (bi_table.file_length, de->size);
|
||||
set_731 (bi_table.file_checksum, bi_checksum);
|
||||
|
||||
if (fwrite (&bi_table, 1, sizeof (bi_table), bootimage) != sizeof (bi_table))
|
||||
error (1, errno, _("Error writing to boot image (%s)"), bootimage);
|
||||
fclose (bootimage);
|
||||
}
|
||||
|
||||
} /* get_torito_desc(... */
|
||||
|
||||
/*
|
||||
* Function to write the EVD for the disc.
|
||||
*/
|
||||
static int FDECL1(tvd_write, FILE *, outfile)
|
||||
{
|
||||
/*
|
||||
* Next we write out the boot volume descriptor for the disc
|
||||
*/
|
||||
get_torito_desc(&gboot_desc);
|
||||
xfwrite(&gboot_desc, 1, 2048, outfile);
|
||||
last_extent_written ++;
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct output_fragment torito_desc = {NULL, oneblock_size, NULL, tvd_write};
|
|
@ -1,10 +0,0 @@
|
|||
/*
|
||||
* 9-Dec-93 R.-D. Marzusch, marzusch@odiehh.hanse.de:
|
||||
* added 'exclude' option (-x) to specify pathnames NOT to be included in
|
||||
* CD image.
|
||||
*
|
||||
* $Id: exclude.h,v 1.2 1999/03/02 03:41:25 eric Exp $
|
||||
*/
|
||||
|
||||
void exclude __PR((char * fn));
|
||||
int is_excluded __PR((char * fn));
|
|
@ -1,225 +0,0 @@
|
|||
/*
|
||||
* File hash.c - generate hash tables for iso9660 filesystem.
|
||||
|
||||
Written by Eric Youngdale (1993).
|
||||
|
||||
Copyright 1993 Yggdrasil Computing, Incorporated
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
|
||||
#include <stdlib.h>
|
||||
#include "config.h"
|
||||
#include "mkisofs.h"
|
||||
|
||||
#define NR_HASH 1024
|
||||
|
||||
#define HASH_FN(DEV, INO) ((DEV + INO + (INO >> 2) + (INO << 8)) % NR_HASH)
|
||||
|
||||
static struct file_hash * hash_table[NR_HASH] = {0,};
|
||||
|
||||
void FDECL1(add_hash, struct directory_entry *, spnt){
|
||||
struct file_hash * s_hash;
|
||||
unsigned int hash_number;
|
||||
|
||||
if(spnt->size == 0 || spnt->starting_block == 0)
|
||||
if(spnt->size != 0 || spnt->starting_block != 0) {
|
||||
fprintf(stderr,"Non zero-length file assigned zero extent.\n");
|
||||
exit(1);
|
||||
};
|
||||
|
||||
if (spnt->dev == (dev_t) UNCACHED_DEVICE || spnt->inode == UNCACHED_INODE) return;
|
||||
hash_number = HASH_FN((unsigned int) spnt->dev, (unsigned int) spnt->inode);
|
||||
|
||||
#if 0
|
||||
if (verbose > 1) fprintf(stderr,"%s ",spnt->name);
|
||||
#endif
|
||||
s_hash = (struct file_hash *) e_malloc(sizeof(struct file_hash));
|
||||
s_hash->next = hash_table[hash_number];
|
||||
s_hash->inode = spnt->inode;
|
||||
s_hash->dev = spnt->dev;
|
||||
s_hash->starting_block = spnt->starting_block;
|
||||
s_hash->size = spnt->size;
|
||||
hash_table[hash_number] = s_hash;
|
||||
}
|
||||
|
||||
struct file_hash * FDECL2(find_hash, dev_t, dev, ino_t, inode){
|
||||
unsigned int hash_number;
|
||||
struct file_hash * spnt;
|
||||
hash_number = HASH_FN((unsigned int) dev, (unsigned int) inode);
|
||||
if (dev == (dev_t) UNCACHED_DEVICE || inode == UNCACHED_INODE) return NULL;
|
||||
|
||||
spnt = hash_table[hash_number];
|
||||
while(spnt){
|
||||
if(spnt->inode == inode && spnt->dev == dev) return spnt;
|
||||
spnt = spnt->next;
|
||||
};
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
static struct file_hash * directory_hash_table[NR_HASH] = {0,};
|
||||
|
||||
void FDECL2(add_directory_hash, dev_t, dev, ino_t, inode){
|
||||
struct file_hash * s_hash;
|
||||
unsigned int hash_number;
|
||||
|
||||
if (dev == (dev_t) UNCACHED_DEVICE || inode == UNCACHED_INODE) return;
|
||||
hash_number = HASH_FN((unsigned int) dev, (unsigned int) inode);
|
||||
|
||||
s_hash = (struct file_hash *) e_malloc(sizeof(struct file_hash));
|
||||
s_hash->next = directory_hash_table[hash_number];
|
||||
s_hash->inode = inode;
|
||||
s_hash->dev = dev;
|
||||
directory_hash_table[hash_number] = s_hash;
|
||||
}
|
||||
|
||||
struct file_hash * FDECL2(find_directory_hash, dev_t, dev, ino_t, inode){
|
||||
unsigned int hash_number;
|
||||
struct file_hash * spnt;
|
||||
hash_number = HASH_FN((unsigned int) dev, (unsigned int) inode);
|
||||
if (dev == (dev_t) UNCACHED_DEVICE || inode == UNCACHED_INODE) return NULL;
|
||||
|
||||
spnt = directory_hash_table[hash_number];
|
||||
while(spnt){
|
||||
if(spnt->inode == inode && spnt->dev == dev) return spnt;
|
||||
spnt = spnt->next;
|
||||
};
|
||||
return NULL;
|
||||
}
|
||||
|
||||
struct name_hash
|
||||
{
|
||||
struct name_hash * next;
|
||||
struct directory_entry * de;
|
||||
};
|
||||
|
||||
#define NR_NAME_HASH 128
|
||||
|
||||
static struct name_hash * name_hash_table[NR_NAME_HASH] = {0,};
|
||||
|
||||
/*
|
||||
* Find the hash bucket for this name.
|
||||
*/
|
||||
static unsigned int FDECL1(name_hash, const char *, name)
|
||||
{
|
||||
unsigned int hash = 0;
|
||||
const char * p;
|
||||
|
||||
p = name;
|
||||
|
||||
while (*p)
|
||||
{
|
||||
/*
|
||||
* Don't hash the iso9660 version number. This way
|
||||
* we can detect duplicates in cases where we have
|
||||
* directories (i.e. foo) and non-directories
|
||||
* (i.e. foo;1).
|
||||
*/
|
||||
if( *p == ';' )
|
||||
{
|
||||
break;
|
||||
}
|
||||
hash = (hash << 15) + (hash << 3) + (hash >> 3) + *p++;
|
||||
}
|
||||
return hash % NR_NAME_HASH;
|
||||
}
|
||||
|
||||
void FDECL1(add_file_hash, struct directory_entry *, de){
|
||||
struct name_hash * new;
|
||||
int hash;
|
||||
|
||||
new = (struct name_hash *) e_malloc(sizeof(struct name_hash));
|
||||
new->de = de;
|
||||
new->next = NULL;
|
||||
hash = name_hash(de->isorec.name);
|
||||
|
||||
/* Now insert into the hash table */
|
||||
new->next = name_hash_table[hash];
|
||||
name_hash_table[hash] = new;
|
||||
}
|
||||
|
||||
struct directory_entry * FDECL1(find_file_hash, char *, name)
|
||||
{
|
||||
struct name_hash * nh;
|
||||
char * p1;
|
||||
char * p2;
|
||||
|
||||
for(nh = name_hash_table[name_hash(name)]; nh; nh = nh->next)
|
||||
{
|
||||
p1 = name;
|
||||
p2 = nh->de->isorec.name;
|
||||
|
||||
/*
|
||||
* Look for end of string, or a mismatch.
|
||||
*/
|
||||
while(1==1)
|
||||
{
|
||||
if( (*p1 == '\0' || *p1 == ';')
|
||||
|| (*p2 == '\0' || *p2 == ';')
|
||||
|| (*p1 != *p2) )
|
||||
{
|
||||
break;
|
||||
}
|
||||
p1++;
|
||||
p2++;
|
||||
}
|
||||
|
||||
/*
|
||||
* If we are at the end of both strings, then
|
||||
* we have a match.
|
||||
*/
|
||||
if( (*p1 == '\0' || *p1 == ';')
|
||||
&& (*p2 == '\0' || *p2 == ';') )
|
||||
{
|
||||
return nh->de;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int FDECL1(delete_file_hash, struct directory_entry *, de){
|
||||
struct name_hash * nh, *prev;
|
||||
int hash;
|
||||
|
||||
prev = NULL;
|
||||
hash = name_hash(de->isorec.name);
|
||||
for(nh = name_hash_table[hash]; nh; nh = nh->next) {
|
||||
if(nh->de == de) break;
|
||||
prev = nh;
|
||||
}
|
||||
if(!nh) return 1;
|
||||
if(!prev)
|
||||
name_hash_table[hash] = nh->next;
|
||||
else
|
||||
prev->next = nh->next;
|
||||
free(nh);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void flush_file_hash(){
|
||||
struct name_hash * nh, *nh1;
|
||||
int i;
|
||||
|
||||
for(i=0; i<NR_NAME_HASH; i++) {
|
||||
nh = name_hash_table[i];
|
||||
while(nh) {
|
||||
nh1 = nh->next;
|
||||
free(nh);
|
||||
nh = nh1;
|
||||
}
|
||||
name_hash_table[i] = NULL;
|
||||
|
||||
}
|
||||
}
|
|
@ -1,57 +0,0 @@
|
|||
/* @(#)fctldefs.h 1.2 98/10/08 Copyright 1996 J. Schilling */
|
||||
/*
|
||||
* Generic header for users of open(), creat() and chmod()
|
||||
*
|
||||
* Copyright (c) 1996 J. Schilling
|
||||
*/
|
||||
/*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; see the file COPYING. If not, write to
|
||||
* the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#ifndef _FCTLDEFS_H
|
||||
#define _FCTLDEFS_H
|
||||
|
||||
#ifndef _MCONFIG_H
|
||||
#include <mconfig.h>
|
||||
#endif
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
#ifdef HAVE_FCNTL_H
|
||||
|
||||
# include <fcntl.h>
|
||||
|
||||
#else /* HAVE_FCNTL_H */
|
||||
|
||||
# include <sys/file.h>
|
||||
|
||||
#endif /* HAVE_FCNTL_H */
|
||||
|
||||
/*
|
||||
* Do not define more than O_RDONLY / O_WRONLY / O_RDWR
|
||||
* The values may differ.
|
||||
*/
|
||||
#ifndef O_RDONLY
|
||||
#define O_RDONLY 0
|
||||
#endif
|
||||
#ifndef O_WRONLY
|
||||
#define O_WRONLY 1
|
||||
#endif
|
||||
#ifndef O_RDWR
|
||||
#define O_RDWR 2
|
||||
#endif
|
||||
|
||||
#endif /* _FCTLDEFS_H */
|
|
@ -1,253 +0,0 @@
|
|||
/* @(#)mconfig.h 1.24 98/12/14 Copyright 1995 J. Schilling */
|
||||
/*
|
||||
* definitions for machine configuration
|
||||
*
|
||||
* Copyright (c) 1995 J. Schilling
|
||||
*
|
||||
* This file must be included before any other file.
|
||||
* Use only cpp instructions.
|
||||
*
|
||||
* NOTE: SING: (Schily Is Not Gnu)
|
||||
*/
|
||||
/*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; see the file COPYING. If not, write to
|
||||
* the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#ifndef _MCONFIG_H
|
||||
#define _MCONFIG_H
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#if defined(unix) || defined(__unix) || defined(__unix__)
|
||||
# define IS_UNIX
|
||||
#endif
|
||||
|
||||
#ifdef __MSDOS__
|
||||
# define IS_MSDOS
|
||||
#endif
|
||||
|
||||
#if defined(tos) || defined(__tos)
|
||||
# define IS_TOS
|
||||
#endif
|
||||
|
||||
#ifdef THINK_C
|
||||
# define IS_MAC
|
||||
#endif
|
||||
|
||||
#if defined(sun) || defined(__sun) || defined(__sun__)
|
||||
# define IS_SUN
|
||||
#endif
|
||||
|
||||
#if defined(__CYGWIN32__)
|
||||
# define IS_GCC_WIN32
|
||||
#endif
|
||||
|
||||
/*--------------------------------------------------------------------------*/
|
||||
/*
|
||||
* Some magic that cannot (yet) be figured out with autoconf.
|
||||
*/
|
||||
|
||||
#ifdef sparc
|
||||
# ifndef HAVE_LDSTUB
|
||||
# define HAVE_LDSTUB
|
||||
# endif
|
||||
# ifndef HAVE_SCANSTACK
|
||||
# define HAVE_SCANSTACK
|
||||
# endif
|
||||
#endif
|
||||
#if defined(__i386_) || defined(i386)
|
||||
# ifndef HAVE_XCHG
|
||||
# define HAVE_XCHG
|
||||
# endif
|
||||
# ifndef HAVE_SCANSTACK
|
||||
# define HAVE_SCANSTACK
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if defined(SOL2) || defined(SOL2) || defined(S5R4) || defined(__S5R4) \
|
||||
|| defined(SVR4)
|
||||
# ifndef __SVR4
|
||||
# define __SVR4
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef __SVR4
|
||||
# ifndef SVR4
|
||||
# define SVR4
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/*
|
||||
* SunOS 4.x / SunOS 5.x
|
||||
*/
|
||||
#if defined(IS_SUN)
|
||||
# define HAVE_GETAV0
|
||||
#endif
|
||||
|
||||
/*
|
||||
* AIX
|
||||
*/
|
||||
#if defined(_IBMR2) || defined(_AIX)
|
||||
# define IS_UNIX /* ??? really ??? */
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Silicon Graphics (must be before SVR4)
|
||||
*/
|
||||
#if defined(sgi) || defined(__sgi)
|
||||
# define __NOT_SVR4__ /* Not a real SVR4 implementation */
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Data General
|
||||
*/
|
||||
#if defined(__DGUX__)
|
||||
#ifdef XXXXXXX
|
||||
# undef HAVE_MTGET_DSREG
|
||||
# undef HAVE_MTGET_RESID
|
||||
# undef HAVE_MTGET_FILENO
|
||||
# undef HAVE_MTGET_BLKNO
|
||||
#endif
|
||||
# define mt_type mt_model
|
||||
# define mt_dsreg mt_status1
|
||||
# define mt_erreg mt_status2
|
||||
/*
|
||||
* DGUX hides its flock as dg_flock.
|
||||
*/
|
||||
# define HAVE_FLOCK
|
||||
# define flock dg_flock
|
||||
/*
|
||||
* Use the BSD style wait on DGUX to get the resource usages of child
|
||||
* processes.
|
||||
*/
|
||||
# define _BSD_WAIT_FLAVOR
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Apple Rhapsody
|
||||
*/
|
||||
#if defined(__NeXT__) && defined(__TARGET_OSNAME) && __TARGET_OSNAME == rhapsody
|
||||
# define HAVE_OSDEF /* prevent later definitions to overwrite current */
|
||||
#endif
|
||||
|
||||
/*
|
||||
* NextStep
|
||||
*/
|
||||
#if defined(__NeXT__) && !defined(HAVE_OSDEF)
|
||||
#define NO_PRINT_OVR
|
||||
#undef HAVE_USG_STDIO /*
|
||||
* NeXT Step 3.x uses __flsbuf(unsigned char , FILE *)
|
||||
* instead of __flsbuf(int, FILE *)
|
||||
*/
|
||||
#endif
|
||||
|
||||
/*
|
||||
* NextStep 3.x has a broken linker that does not allow us to override
|
||||
* these functions.
|
||||
*/
|
||||
#ifndef __OPRINTF__
|
||||
|
||||
#ifdef NO_PRINT_OVR
|
||||
# define printf Xprintf
|
||||
# define fprintf Xfprintf
|
||||
# define sprintf Xsprintf
|
||||
#endif
|
||||
|
||||
#endif /* __OPRINTF__ */
|
||||
|
||||
/*--------------------------------------------------------------------------*/
|
||||
/*
|
||||
* If there is no flock defined by the system, use emulation
|
||||
* through fcntl record locking.
|
||||
*/
|
||||
#ifndef HAVE_FLOCK
|
||||
#define LOCK_SH 1 /* shared lock */
|
||||
#define LOCK_EX 2 /* exclusive lock */
|
||||
#define LOCK_NB 4 /* don't block when locking */
|
||||
#define LOCK_UN 8 /* unlock */
|
||||
#endif
|
||||
|
||||
#include <prototyp.h>
|
||||
|
||||
/*
|
||||
* gcc 2.x generally implements the long long type.
|
||||
*/
|
||||
#ifdef __GNUC__
|
||||
# if __GNUC__ > 1
|
||||
# ifndef HAVE_LONGLONG
|
||||
# define HAVE_LONGLONG
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Convert to GNU name
|
||||
*/
|
||||
#ifdef HAVE_STDC_HEADERS
|
||||
# ifndef STDC_HEADERS
|
||||
# define STDC_HEADERS
|
||||
# endif
|
||||
#endif
|
||||
/*
|
||||
* Convert to SCHILY name
|
||||
*/
|
||||
#ifdef STDC_HEADERS
|
||||
# ifndef HAVE_STDC_HEADERS
|
||||
# define HAVE_STDC_HEADERS
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef IS_UNIX
|
||||
# define PATH_DELIM '/'
|
||||
# define PATH_DELIM_STR "/"
|
||||
# define far
|
||||
# define near
|
||||
#endif
|
||||
|
||||
#ifdef IS_GCC_WIN32
|
||||
# define PATH_DELIM '/'
|
||||
# define PATH_DELIM_STR "/"
|
||||
# define far
|
||||
# define near
|
||||
#endif
|
||||
|
||||
#ifdef IS_MSDOS
|
||||
# define PATH_DELIM '\\'
|
||||
# define PATH_DELIM_STR "\\"
|
||||
#endif
|
||||
|
||||
#ifdef IS_TOS
|
||||
# define PATH_DELIM '\\'
|
||||
# define PATH_DELIM_STR "\\"
|
||||
# define far
|
||||
# define near
|
||||
#endif
|
||||
|
||||
#ifdef IS_MAC
|
||||
# define PATH_DELIM ':'
|
||||
# define PATH_DELIM_STR ":"
|
||||
# define far
|
||||
# define near
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _MCONFIG_H */
|
|
@ -1,74 +0,0 @@
|
|||
/* @(#)prototyp.h 1.7 98/10/08 Copyright 1995 J. Schilling */
|
||||
/*
|
||||
* Definitions for dealing with ANSI / KR C-Compilers
|
||||
*
|
||||
* Copyright (c) 1995 J. Schilling
|
||||
*/
|
||||
/*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; see the file COPYING. If not, write to
|
||||
* the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#ifndef _PROTOTYP_H
|
||||
#define _PROTOTYP_H
|
||||
|
||||
#ifndef PROTOTYPES
|
||||
/*
|
||||
* If this has already been defined,
|
||||
* someone else knows better than us...
|
||||
*/
|
||||
# ifdef __STDC__
|
||||
# if __STDC__ /* ANSI C */
|
||||
# define PROTOTYPES
|
||||
# endif
|
||||
# if defined(sun) && __STDC__ - 0 == 0 /* Sun C */
|
||||
# define PROTOTYPES
|
||||
# endif
|
||||
# endif
|
||||
#endif /* PROTOTYPES */
|
||||
|
||||
/*
|
||||
* If we have prototypes, we should have stdlib.h string.h stdarg.h
|
||||
*/
|
||||
#ifdef PROTOTYPES
|
||||
#if !(defined(SABER) && defined(sun))
|
||||
# ifndef HAVE_STDARG_H
|
||||
# define HAVE_STDARG_H
|
||||
# endif
|
||||
#endif
|
||||
# ifndef HAVE_STDLIB_H
|
||||
# define HAVE_STDLIB_H
|
||||
# endif
|
||||
# ifndef HAVE_STRING_H
|
||||
# define HAVE_STRING_H
|
||||
# endif
|
||||
# ifndef HAVE_STDC_HEADERS
|
||||
# define HAVE_STDC_HEADERS
|
||||
# endif
|
||||
# ifndef STDC_HEADERS
|
||||
# define STDC_HEADERS /* GNU name */
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef NO_PROTOTYPES /* Force not to use prototypes */
|
||||
# undef PROTOTYPES
|
||||
#endif
|
||||
|
||||
#ifdef PROTOTYPES
|
||||
# define __PR(a) a
|
||||
#else
|
||||
# define __PR(a) ()
|
||||
#endif
|
||||
|
||||
#endif /* _PROTOTYP_H */
|
|
@ -1,139 +0,0 @@
|
|||
/* @(#)statdefs.h 1.1 98/11/22 Copyright 1998 J. Schilling */
|
||||
/*
|
||||
* Definitions for stat() file mode
|
||||
*
|
||||
* Copyright (c) 1998 J. Schilling
|
||||
*/
|
||||
/*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; see the file COPYING. If not, write to
|
||||
* the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#ifndef _STATDEFS_H
|
||||
#define _STATDEFS_H
|
||||
|
||||
#ifndef _MCONFIG_H
|
||||
#include <mconfig.h>
|
||||
#endif
|
||||
|
||||
#ifdef STAT_MACROS_BROKEN
|
||||
#undef S_ISFIFO /* Named pipe */
|
||||
#undef S_ISCHR /* Character special */
|
||||
#undef S_ISMPC /* UNUSED multiplexed c */
|
||||
#undef S_ISDIR /* Directory */
|
||||
#undef S_ISNAM /* Named file (XENIX) */
|
||||
#undef S_ISBLK /* Block special */
|
||||
#undef S_ISMPB /* UNUSED multiplexed b */
|
||||
#undef S_ISREG /* Regular file */
|
||||
#undef S_ISCNT /* Contiguous file */
|
||||
#undef S_ISLNK /* Symbolic link */
|
||||
#undef S_ISSHAD /* Solaris shadow inode */
|
||||
#undef S_ISSOCK /* UNIX domain socket */
|
||||
#undef S_ISDOOR /* Solaris DOOR */
|
||||
#endif
|
||||
|
||||
#ifndef S_ISFIFO /* Named pipe */
|
||||
# ifdef S_IFIFO
|
||||
# define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO)
|
||||
# else
|
||||
# define S_ISFIFO(m) (0)
|
||||
# endif
|
||||
#endif
|
||||
#ifndef S_ISCHR /* Character special */
|
||||
# ifdef S_IFCHR
|
||||
# define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR)
|
||||
# else
|
||||
# define S_ISCHR(m) (0)
|
||||
# endif
|
||||
#endif
|
||||
#ifndef S_ISMPC /* UNUSED multiplexed c */
|
||||
# ifdef S_IFMPC
|
||||
# define S_ISMPC(m) (((m) & S_IFMT) == S_IFMPC)
|
||||
# else
|
||||
# define S_ISMPC(m) (0)
|
||||
# endif
|
||||
#endif
|
||||
#ifndef S_ISDIR /* Directory */
|
||||
# ifdef S_IFDIR
|
||||
# define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
|
||||
# else
|
||||
# define S_ISDIR(m) (0)
|
||||
# endif
|
||||
#endif
|
||||
#ifndef S_ISNAM /* Named file (XENIX) */
|
||||
# ifdef S_IFNAM
|
||||
# define S_ISNAM(m) (((m) & S_IFMT) == S_IFNAM)
|
||||
# else
|
||||
# define S_ISNAM(m) (0)
|
||||
# endif
|
||||
#endif
|
||||
#ifndef S_ISBLK /* Block special */
|
||||
# ifdef S_IFBLK
|
||||
# define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK)
|
||||
# else
|
||||
# define S_ISBLK(m) (0)
|
||||
# endif
|
||||
#endif
|
||||
#ifndef S_ISMPB /* UNUSED multiplexed b */
|
||||
# ifdef S_IFMPB
|
||||
# define S_ISMPB(m) (((m) & S_IFMT) == S_IFMPB)
|
||||
# else
|
||||
# define S_ISMPB(m) (0)
|
||||
# endif
|
||||
#endif
|
||||
#ifndef S_ISREG /* Regular file */
|
||||
# ifdef S_IFREG
|
||||
# define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
|
||||
# else
|
||||
# define S_ISREG(m) (0)
|
||||
# endif
|
||||
#endif
|
||||
#ifndef S_ISCNT /* Contiguous file */
|
||||
# ifdef S_IFCNT
|
||||
# define S_ISCNT(m) (((m) & S_IFMT) == S_IFCNT)
|
||||
# else
|
||||
# define S_ISCNT(m) (0)
|
||||
# endif
|
||||
#endif
|
||||
#ifndef S_ISLNK /* Symbolic link */
|
||||
# ifdef S_IFLNK
|
||||
# define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK)
|
||||
# else
|
||||
# define S_ISLNK(m) (0)
|
||||
# endif
|
||||
#endif
|
||||
#ifndef S_ISSHAD /* Solaris shadow inode */
|
||||
# ifdef S_IFSHAD
|
||||
# define S_ISSHAD(m) (((m) & S_IFMT) == S_IFSHAD)
|
||||
# else
|
||||
# define S_ISSHAD(m) (0)
|
||||
# endif
|
||||
#endif
|
||||
#ifndef S_ISSOCK /* UNIX domain socket */
|
||||
# ifdef S_IFSOCK
|
||||
# define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK)
|
||||
# else
|
||||
# define S_ISSOCK(m) (0)
|
||||
# endif
|
||||
#endif
|
||||
#ifndef S_ISDOOR /* Solaris DOOR */
|
||||
# ifdef S_IFDOOR
|
||||
# define S_ISDOOR(m) (((m) & S_IFMT) == S_IFDOOR)
|
||||
# else
|
||||
# define S_ISDOOR(m) (0)
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#endif /* _STATDEFS_H */
|
||||
|
|
@ -1,174 +0,0 @@
|
|||
/*
|
||||
* Header file iso9660.h - assorted structure definitions and typecasts.
|
||||
* specific to iso9660 filesystem.
|
||||
|
||||
Written by Eric Youngdale (1993).
|
||||
|
||||
Copyright 1993 Yggdrasil Computing, Incorporated
|
||||
|
||||
Copyright (C) 2009 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/*
|
||||
* $Id: iso9660.h,v 1.2 1997/05/17 15:46:44 eric Exp $
|
||||
*/
|
||||
|
||||
#ifndef _ISOFS_FS_H
|
||||
#define _ISOFS_FS_H
|
||||
|
||||
/*
|
||||
* The isofs filesystem constants/structures
|
||||
*/
|
||||
|
||||
/* This part borrowed from the bsd386 isofs */
|
||||
#define ISODCL(from, to) (to - from + 1)
|
||||
|
||||
struct iso_volume_descriptor {
|
||||
char type[ISODCL(1,1)]; /* 711 */
|
||||
char id[ISODCL(2,6)];
|
||||
char version[ISODCL(7,7)];
|
||||
char data[ISODCL(8,2048)];
|
||||
};
|
||||
|
||||
/* volume descriptor types */
|
||||
#define ISO_VD_PRIMARY 1
|
||||
#define ISO_VD_SUPPLEMENTARY 2 /* Used by Joliet */
|
||||
#define ISO_VD_END 255
|
||||
|
||||
#define ISO_STANDARD_ID "CD001"
|
||||
|
||||
#define EL_TORITO_ID "EL TORITO SPECIFICATION"
|
||||
#define EL_TORITO_ARCH_x86 0
|
||||
#define EL_TORITO_ARCH_PPC 1
|
||||
#define EL_TORITO_ARCH_MAC 2
|
||||
#define EL_TORITO_BOOTABLE 0x88
|
||||
#define EL_TORITO_MEDIA_NOEMUL 0
|
||||
#define EL_TORITO_MEDIA_12FLOP 1
|
||||
#define EL_TORITO_MEDIA_144FLOP 2
|
||||
#define EL_TORITO_MEDIA_288FLOP 3
|
||||
#define EL_TORITO_MEDIA_HD 4
|
||||
|
||||
struct iso_primary_descriptor {
|
||||
char type [ISODCL ( 1, 1)]; /* 711 */
|
||||
char id [ISODCL ( 2, 6)];
|
||||
char version [ISODCL ( 7, 7)]; /* 711 */
|
||||
char unused1 [ISODCL ( 8, 8)];
|
||||
char system_id [ISODCL ( 9, 40)]; /* achars */
|
||||
char volume_id [ISODCL ( 41, 72)]; /* dchars */
|
||||
char unused2 [ISODCL ( 73, 80)];
|
||||
char volume_space_size [ISODCL ( 81, 88)]; /* 733 */
|
||||
char escape_sequences [ISODCL ( 89, 120)];
|
||||
char volume_set_size [ISODCL (121, 124)]; /* 723 */
|
||||
char volume_sequence_number [ISODCL (125, 128)]; /* 723 */
|
||||
char logical_block_size [ISODCL (129, 132)]; /* 723 */
|
||||
char path_table_size [ISODCL (133, 140)]; /* 733 */
|
||||
char type_l_path_table [ISODCL (141, 144)]; /* 731 */
|
||||
char opt_type_l_path_table [ISODCL (145, 148)]; /* 731 */
|
||||
char type_m_path_table [ISODCL (149, 152)]; /* 732 */
|
||||
char opt_type_m_path_table [ISODCL (153, 156)]; /* 732 */
|
||||
char root_directory_record [ISODCL (157, 190)]; /* 9.1 */
|
||||
char volume_set_id [ISODCL (191, 318)]; /* dchars */
|
||||
char publisher_id [ISODCL (319, 446)]; /* achars */
|
||||
char preparer_id [ISODCL (447, 574)]; /* achars */
|
||||
char application_id [ISODCL (575, 702)]; /* achars */
|
||||
char copyright_file_id [ISODCL (703, 739)]; /* 7.5 dchars */
|
||||
char abstract_file_id [ISODCL (740, 776)]; /* 7.5 dchars */
|
||||
char bibliographic_file_id [ISODCL (777, 813)]; /* 7.5 dchars */
|
||||
char creation_date [ISODCL (814, 830)]; /* 8.4.26.1 */
|
||||
char modification_date [ISODCL (831, 847)]; /* 8.4.26.1 */
|
||||
char expiration_date [ISODCL (848, 864)]; /* 8.4.26.1 */
|
||||
char effective_date [ISODCL (865, 881)]; /* 8.4.26.1 */
|
||||
char file_structure_version [ISODCL (882, 882)]; /* 711 */
|
||||
char unused4 [ISODCL (883, 883)];
|
||||
char application_data [ISODCL (884, 1395)];
|
||||
char unused5 [ISODCL (1396, 2048)];
|
||||
};
|
||||
|
||||
/* El Torito Boot Record Volume Descriptor */
|
||||
struct eltorito_boot_descriptor {
|
||||
char id [ISODCL ( 1, 1)]; /* 711 */
|
||||
char id2 [ISODCL ( 2, 6)];
|
||||
char version [ISODCL ( 7, 7)]; /* 711 */
|
||||
char system_id [ISODCL ( 8, 39)];
|
||||
char unused2 [ISODCL ( 40, 71)];
|
||||
char bootcat_ptr [ISODCL ( 72 , 75)];
|
||||
char unused5 [ISODCL ( 76, 2048)];
|
||||
};
|
||||
|
||||
/* Validation entry for El Torito */
|
||||
struct eltorito_validation_entry {
|
||||
char headerid [ISODCL ( 1, 1)]; /* 711 */
|
||||
char arch [ISODCL ( 2, 2)];
|
||||
char pad1 [ISODCL ( 3, 4)]; /* 711 */
|
||||
char id [ISODCL ( 5, 28)];
|
||||
char cksum [ISODCL ( 29, 30)];
|
||||
char key1 [ISODCL ( 31, 31)];
|
||||
char key2 [ISODCL ( 32, 32)];
|
||||
};
|
||||
|
||||
/* El Torito initial/default entry in boot catalog */
|
||||
struct eltorito_defaultboot_entry {
|
||||
char boot_id [ISODCL ( 1, 1)]; /* 711 */
|
||||
char boot_media [ISODCL ( 2, 2)];
|
||||
char loadseg [ISODCL ( 3, 4)]; /* 711 */
|
||||
char arch [ISODCL ( 5, 5)];
|
||||
char pad1 [ISODCL ( 6, 6)];
|
||||
char nsect [ISODCL ( 7, 8)];
|
||||
char bootoff [ISODCL ( 9, 12)];
|
||||
char pad2 [ISODCL ( 13, 32)];
|
||||
};
|
||||
|
||||
/* El Torito boot information table */
|
||||
struct eltorito_boot_info
|
||||
{
|
||||
/* Address of Primary Volume Descriptor. */
|
||||
char pvd_addr[ISODCL (1, 4)];
|
||||
/* Boot file address. */
|
||||
char file_addr[ISODCL (5, 8)];
|
||||
/* Boot file length. */
|
||||
char file_length[ISODCL (9, 12)];
|
||||
/* Boot file checksum. */
|
||||
char file_checksum[ISODCL (13, 16)];
|
||||
char dummy[ISODCL (17, 56)];
|
||||
};
|
||||
|
||||
|
||||
/* We use this to help us look up the parent inode numbers. */
|
||||
|
||||
struct iso_path_table{
|
||||
unsigned char name_len[2]; /* 721 */
|
||||
char extent[4]; /* 731 */
|
||||
char parent[2]; /* 721 */
|
||||
char name[1];
|
||||
};
|
||||
|
||||
struct iso_directory_record {
|
||||
unsigned char length [ISODCL (1, 1)]; /* 711 */
|
||||
char ext_attr_length [ISODCL (2, 2)]; /* 711 */
|
||||
char extent [ISODCL (3, 10)]; /* 733 */
|
||||
char size [ISODCL (11, 18)]; /* 733 */
|
||||
char date [ISODCL (19, 25)]; /* 7 by 711 */
|
||||
char flags [ISODCL (26, 26)];
|
||||
char file_unit_size [ISODCL (27, 27)]; /* 711 */
|
||||
char interleave [ISODCL (28, 28)]; /* 711 */
|
||||
char volume_sequence_number [ISODCL (29, 32)]; /* 723 */
|
||||
unsigned char name_len [ISODCL (33, 33)]; /* 711 */
|
||||
char name [34]; /* Not really, but we need something here */
|
||||
};
|
||||
#endif
|
||||
|
||||
|
||||
|
File diff suppressed because it is too large
Load diff
|
@ -1,76 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2009 Free Software Foundation, Inc.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include "fnmatch.h"
|
||||
|
||||
#include "match.h"
|
||||
|
||||
struct pattern
|
||||
{
|
||||
char *str;
|
||||
struct pattern *next;
|
||||
};
|
||||
|
||||
static struct pattern *patlist = NULL;
|
||||
static struct pattern *i_patlist = NULL; /* ISO9660/RR */
|
||||
static struct pattern *j_patlist = NULL; /* Joliet */
|
||||
|
||||
#define DECL_ADD_MATCH(function, list) \
|
||||
void \
|
||||
function (char *pattern) \
|
||||
{ \
|
||||
struct pattern *new; \
|
||||
new = malloc (sizeof (*new)); \
|
||||
new->str = strdup (pattern); \
|
||||
new->next = list; \
|
||||
list = new; \
|
||||
}
|
||||
|
||||
DECL_ADD_MATCH (add_match, patlist)
|
||||
DECL_ADD_MATCH (i_add_match, i_patlist)
|
||||
DECL_ADD_MATCH (j_add_match, j_patlist)
|
||||
|
||||
#define DECL_MATCHES(function, list) \
|
||||
int \
|
||||
function (char *str) \
|
||||
{ \
|
||||
struct pattern *i; \
|
||||
for (i = list; i != NULL; i = i->next) \
|
||||
if (fnmatch (i->str, str, FNM_FILE_NAME) != FNM_NOMATCH) \
|
||||
return 1; \
|
||||
return 0; \
|
||||
}
|
||||
|
||||
DECL_MATCHES (matches, patlist)
|
||||
DECL_MATCHES (i_matches, i_patlist)
|
||||
DECL_MATCHES (j_matches, j_patlist)
|
||||
|
||||
int
|
||||
i_ishidden()
|
||||
{
|
||||
return (i_patlist != NULL);
|
||||
}
|
||||
|
||||
|
||||
int j_ishidden()
|
||||
{
|
||||
return (j_patlist != NULL);
|
||||
}
|
|
@ -1,29 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2009 Free Software Foundation, Inc.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
extern void add_match (char *);
|
||||
extern void i_add_match (char *);
|
||||
extern void j_add_match (char *);
|
||||
|
||||
extern int matches (char *);
|
||||
extern int i_matches (char *);
|
||||
extern int j_matches (char *);
|
||||
|
||||
extern int i_ishidden ();
|
||||
extern int j_ishidden ();
|
File diff suppressed because it is too large
Load diff
|
@ -1,530 +0,0 @@
|
|||
/*
|
||||
* Header file mkisofs.h - assorted structure definitions and typecasts.
|
||||
|
||||
Written by Eric Youngdale (1993).
|
||||
|
||||
Copyright 1993 Yggdrasil Computing, Incorporated
|
||||
|
||||
Copyright (C) 2009,2010 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/*
|
||||
* $Id: mkisofs.h,v 1.20 1999/03/02 04:16:41 eric Exp $
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include <prototyp.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
#if (defined(ENABLE_NLS) && ENABLE_NLS)
|
||||
|
||||
# include <locale.h>
|
||||
# include <libintl.h>
|
||||
|
||||
#else /* ! (defined(ENABLE_NLS) && ENABLE_NLS) */
|
||||
|
||||
/* Disabled NLS.
|
||||
The casts to 'const char *' serve the purpose of producing warnings
|
||||
for invalid uses of the value returned from these functions.
|
||||
On pre-ANSI systems without 'const', the config.h file is supposed to
|
||||
contain "#define const". */
|
||||
# define gettext(Msgid) ((const char *) (Msgid))
|
||||
#endif /* (defined(ENABLE_NLS) && ENABLE_NLS) */
|
||||
|
||||
#define _(str) gettext(str)
|
||||
#define N_(str) str
|
||||
|
||||
/* This symbol is used to indicate that we do not have things like
|
||||
symlinks, devices, and so forth available. Just files and dirs */
|
||||
|
||||
#ifdef VMS
|
||||
#define NON_UNIXFS
|
||||
#endif
|
||||
|
||||
#ifdef DJGPP
|
||||
#define NON_UNIXFS
|
||||
#endif
|
||||
|
||||
#ifdef VMS
|
||||
#include <sys/dir.h>
|
||||
#define dirent direct
|
||||
#endif
|
||||
|
||||
#ifdef _WIN32
|
||||
#define NON_UNIXFS
|
||||
#endif /* _WIN32 */
|
||||
|
||||
#ifndef S_IROTH
|
||||
#define S_IROTH 0
|
||||
#endif
|
||||
|
||||
#ifndef S_IRGRP
|
||||
#define S_IRGRP 0
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_GETUID
|
||||
static inline int
|
||||
getuid ()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_GETGID
|
||||
static inline int
|
||||
getgid ()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_LSTAT
|
||||
static inline int
|
||||
lstat (const char *filename, struct stat *buf)
|
||||
{
|
||||
return stat (filename, buf);
|
||||
}
|
||||
#endif
|
||||
|
||||
#include <string.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
#if defined(HAVE_DIRENT_H)
|
||||
# include <dirent.h>
|
||||
# define NAMLEN(dirent) strlen((dirent)->d_name)
|
||||
#else
|
||||
# define dirent direct
|
||||
# define NAMLEN(dirent) (dirent)->d_namlen
|
||||
# if defined(HAVE_SYS_NDIR_H)
|
||||
# include <sys/ndir.h>
|
||||
# endif
|
||||
# if defined(HAVE_SYS_DIR_H)
|
||||
# include <sys/dir.h>
|
||||
# endif
|
||||
# if defined(HAVE_NDIR_H)
|
||||
# include <ndir.h>
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if defined(HAVE_STRING_H)
|
||||
#include <string.h>
|
||||
#else
|
||||
#if defined(HAVE_STRINGS_H)
|
||||
#include <strings.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef ultrix
|
||||
extern char *strdup();
|
||||
#endif
|
||||
|
||||
#ifdef __STDC__
|
||||
#define DECL(NAME,ARGS) NAME ARGS
|
||||
#define FDECL1(NAME,TYPE0, ARG0) \
|
||||
NAME(TYPE0 ARG0)
|
||||
#define FDECL2(NAME,TYPE0, ARG0,TYPE1, ARG1) \
|
||||
NAME(TYPE0 ARG0, TYPE1 ARG1)
|
||||
#define FDECL3(NAME,TYPE0, ARG0,TYPE1, ARG1, TYPE2, ARG2) \
|
||||
NAME(TYPE0 ARG0, TYPE1 ARG1, TYPE2 ARG2)
|
||||
#define FDECL4(NAME,TYPE0, ARG0,TYPE1, ARG1, TYPE2, ARG2, TYPE3, ARG3) \
|
||||
NAME(TYPE0 ARG0, TYPE1 ARG1, TYPE2 ARG2, TYPE3 ARG3)
|
||||
#define FDECL5(NAME,TYPE0, ARG0,TYPE1, ARG1, TYPE2, ARG2, TYPE3, ARG3, TYPE4, ARG4) \
|
||||
NAME(TYPE0 ARG0, TYPE1 ARG1, TYPE2 ARG2, TYPE3 ARG3, TYPE4 ARG4)
|
||||
#define FDECL6(NAME,TYPE0, ARG0,TYPE1, ARG1, TYPE2, ARG2, TYPE3, ARG3, TYPE4, ARG4, TYPE5, ARG5) \
|
||||
NAME(TYPE0 ARG0, TYPE1 ARG1, TYPE2 ARG2, TYPE3 ARG3, TYPE4 ARG4, TYPE5 ARG5)
|
||||
#else
|
||||
#define DECL(NAME,ARGS) NAME()
|
||||
#define FDECL1(NAME,TYPE0, ARG0) NAME(ARG0) TYPE0 ARG0;
|
||||
#define FDECL2(NAME,TYPE0, ARG0,TYPE1, ARG1) NAME(ARG0, ARG1) TYPE0 ARG0; TYPE1 ARG1;
|
||||
#define FDECL3(NAME,TYPE0, ARG0,TYPE1, ARG1, TYPE2, ARG2) \
|
||||
NAME(ARG0, ARG1, ARG2) TYPE0 ARG0; TYPE1 ARG1; TYPE2 ARG2;
|
||||
#define FDECL4(NAME,TYPE0, ARG0,TYPE1, ARG1, TYPE2, ARG2, TYPE3, ARG3) \
|
||||
NAME(ARG0, ARG1, ARG2, ARG3, ARG4) TYPE0 ARG0; TYPE1 ARG1; TYPE2 ARG2; TYPE3 ARG3;
|
||||
#define FDECL5(NAME,TYPE0, ARG0,TYPE1, ARG1, TYPE2, ARG2, TYPE3, ARG3, TYPE4, ARG4) \
|
||||
NAME(ARG0, ARG1, ARG2, ARG3, ARG4) TYPE0 ARG0; TYPE1 ARG1; TYPE2 ARG2; TYPE3 ARG3; TYPE4 ARG4;
|
||||
#define FDECL6(NAME,TYPE0, ARG0,TYPE1, ARG1, TYPE2, ARG2, TYPE3, ARG3, TYPE4, ARG4, TYPE5, ARG5) \
|
||||
NAME(ARG0, ARG1, ARG2, ARG3, ARG4, ARG5) TYPE0 ARG0; TYPE1 ARG1; TYPE2 ARG2; TYPE3 ARG3; TYPE4 ARG4; TYPE5 ARG5;
|
||||
#define const
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef __SVR4
|
||||
#include <stdlib.h>
|
||||
#else
|
||||
extern int optind;
|
||||
extern char *optarg;
|
||||
/* extern int getopt (int __argc, char **__argv, char *__optstring); */
|
||||
#endif
|
||||
|
||||
#include "iso9660.h"
|
||||
#include "defaults.h"
|
||||
|
||||
struct directory_entry{
|
||||
struct directory_entry * next;
|
||||
struct directory_entry * jnext;
|
||||
struct iso_directory_record isorec;
|
||||
uint64_t starting_block;
|
||||
uint64_t size;
|
||||
unsigned short priority;
|
||||
unsigned char jreclen; /* Joliet record len */
|
||||
char * name;
|
||||
char * table;
|
||||
char * whole_name;
|
||||
struct directory * filedir;
|
||||
struct directory_entry * parent_rec;
|
||||
unsigned int de_flags;
|
||||
ino_t inode; /* Used in the hash table */
|
||||
dev_t dev; /* Used in the hash table */
|
||||
unsigned char * rr_attributes;
|
||||
unsigned int rr_attr_size;
|
||||
unsigned int total_rr_attr_size;
|
||||
unsigned int got_rr_name;
|
||||
};
|
||||
|
||||
struct file_hash{
|
||||
struct file_hash * next;
|
||||
ino_t inode; /* Used in the hash table */
|
||||
dev_t dev; /* Used in the hash table */
|
||||
unsigned int starting_block;
|
||||
unsigned int size;
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* This structure is used to control the output of fragments to the cdrom
|
||||
* image. Everything that will be written to the output image will eventually
|
||||
* go through this structure. There are two pieces - first is the sizing where
|
||||
* we establish extent numbers for everything, and the second is when we actually
|
||||
* generate the contents and write it to the output image.
|
||||
*
|
||||
* This makes it trivial to extend mkisofs to write special things in the image.
|
||||
* All you need to do is hook an additional structure in the list, and the rest
|
||||
* works like magic.
|
||||
*
|
||||
* The three passes each do the following:
|
||||
*
|
||||
* The 'size' pass determines the size of each component and assigns the extent number
|
||||
* for that component.
|
||||
*
|
||||
* The 'generate' pass will adjust the contents and pointers as required now that extent
|
||||
* numbers are assigned. In some cases, the contents of the record are also generated.
|
||||
*
|
||||
* The 'write' pass actually writes the data to the disc.
|
||||
*/
|
||||
struct output_fragment
|
||||
{
|
||||
struct output_fragment * of_next;
|
||||
#ifdef __STDC__
|
||||
int (*of_size)(int);
|
||||
int (*of_generate)(void);
|
||||
int (*of_write)(FILE *);
|
||||
#else
|
||||
int (*of_size)();
|
||||
int (*of_generate)();
|
||||
int (*of_write)();
|
||||
#endif
|
||||
};
|
||||
|
||||
extern struct output_fragment * out_list;
|
||||
extern struct output_fragment * out_tail;
|
||||
|
||||
extern struct output_fragment padblock_desc;
|
||||
extern struct output_fragment voldesc_desc;
|
||||
extern struct output_fragment joliet_desc;
|
||||
extern struct output_fragment torito_desc;
|
||||
extern struct output_fragment end_vol;
|
||||
extern struct output_fragment pathtable_desc;
|
||||
extern struct output_fragment jpathtable_desc;
|
||||
extern struct output_fragment dirtree_desc;
|
||||
extern struct output_fragment dirtree_clean;
|
||||
extern struct output_fragment jdirtree_desc;
|
||||
extern struct output_fragment extension_desc;
|
||||
extern struct output_fragment files_desc;
|
||||
|
||||
/*
|
||||
* This structure describes one complete directory. It has pointers
|
||||
* to other directories in the overall tree so that it is clear where
|
||||
* this directory lives in the tree, and it also must contain pointers
|
||||
* to the contents of the directory. Note that subdirectories of this
|
||||
* directory exist twice in this stucture. Once in the subdir chain,
|
||||
* and again in the contents chain.
|
||||
*/
|
||||
struct directory{
|
||||
struct directory * next; /* Next directory at same level as this one */
|
||||
struct directory * subdir; /* First subdirectory in this directory */
|
||||
struct directory * parent;
|
||||
struct directory_entry * contents;
|
||||
struct directory_entry * jcontents;
|
||||
struct directory_entry * self;
|
||||
char * whole_name; /* Entire path */
|
||||
char * de_name; /* Entire path */
|
||||
unsigned int ce_bytes; /* Number of bytes of CE entries reqd for this dir */
|
||||
unsigned int depth;
|
||||
unsigned int size;
|
||||
unsigned int extent;
|
||||
unsigned int jsize;
|
||||
unsigned int jextent;
|
||||
unsigned short path_index;
|
||||
unsigned short jpath_index;
|
||||
unsigned short dir_flags;
|
||||
unsigned short dir_nlink;
|
||||
};
|
||||
|
||||
extern int goof;
|
||||
extern struct directory * root;
|
||||
extern struct directory * reloc_dir;
|
||||
extern uint64_t next_extent;
|
||||
extern uint64_t last_extent;
|
||||
extern uint64_t last_extent_written;
|
||||
extern uint64_t session_start;
|
||||
|
||||
extern unsigned int path_table_size;
|
||||
extern unsigned int path_table[4];
|
||||
extern unsigned int path_blocks;
|
||||
extern char * path_table_l;
|
||||
extern char * path_table_m;
|
||||
|
||||
extern unsigned int jpath_table_size;
|
||||
extern unsigned int jpath_table[4];
|
||||
extern unsigned int jpath_blocks;
|
||||
extern char * jpath_table_l;
|
||||
extern char * jpath_table_m;
|
||||
|
||||
extern struct iso_directory_record root_record;
|
||||
extern struct iso_directory_record jroot_record;
|
||||
|
||||
extern int use_eltorito;
|
||||
extern int use_embedded_boot;
|
||||
extern int use_protective_msdos_label;
|
||||
extern int use_eltorito_emul_floppy;
|
||||
extern int use_boot_info_table;
|
||||
extern int use_RockRidge;
|
||||
extern int use_Joliet;
|
||||
extern int rationalize;
|
||||
extern int follow_links;
|
||||
extern int verbose;
|
||||
extern int all_files;
|
||||
extern int generate_tables;
|
||||
extern int print_size;
|
||||
extern int split_output;
|
||||
extern int omit_period;
|
||||
extern int omit_version_number;
|
||||
extern int transparent_compression;
|
||||
extern unsigned int RR_relocation_depth;
|
||||
extern int full_iso9660_filenames;
|
||||
extern int split_SL_component;
|
||||
extern int split_SL_field;
|
||||
|
||||
/* tree.c */
|
||||
extern int DECL(stat_filter, (char *, struct stat *));
|
||||
extern int DECL(lstat_filter, (char *, struct stat *));
|
||||
extern int DECL(sort_tree,(struct directory *));
|
||||
extern struct directory *
|
||||
DECL(find_or_create_directory,(struct directory *, const char *,
|
||||
struct directory_entry * self, int));
|
||||
extern void DECL (finish_cl_pl_entries, (void));
|
||||
extern int DECL(scan_directory_tree,(struct directory * this_dir,
|
||||
char * path,
|
||||
struct directory_entry * self));
|
||||
extern int DECL(insert_file_entry,(struct directory *, char *,
|
||||
char *));
|
||||
|
||||
extern void DECL(generate_iso9660_directories,(struct directory *, FILE*));
|
||||
extern void DECL(dump_tree,(struct directory * node));
|
||||
extern struct directory_entry * DECL(search_tree_file, (struct
|
||||
directory * node,char * filename));
|
||||
extern void DECL(update_nlink_field,(struct directory * node));
|
||||
extern void DECL (init_fstatbuf, (void));
|
||||
extern struct stat root_statbuf;
|
||||
|
||||
/* eltorito.c */
|
||||
extern void DECL(init_boot_catalog, (const char * path ));
|
||||
extern void DECL(get_torito_desc, (struct eltorito_boot_descriptor * path ));
|
||||
|
||||
/* write.c */
|
||||
extern int DECL(get_731,(char *));
|
||||
extern int DECL(get_733,(char *));
|
||||
extern int DECL(isonum_733,(unsigned char *));
|
||||
extern void DECL(set_723,(char *, unsigned int));
|
||||
extern void DECL(set_731,(char *, unsigned int));
|
||||
extern void DECL(set_721,(char *, unsigned int));
|
||||
extern void DECL(set_733,(char *, unsigned int));
|
||||
extern int DECL(sort_directory,(struct directory_entry **));
|
||||
extern void DECL(generate_one_directory,(struct directory *, FILE*));
|
||||
extern void DECL(memcpy_max, (char *, char *, int));
|
||||
extern int DECL(oneblock_size, (int starting_extent));
|
||||
extern struct iso_primary_descriptor vol_desc;
|
||||
extern void DECL(xfwrite, (void * buffer, uint64_t count, uint64_t size, FILE * file));
|
||||
extern void DECL(set_732, (char * pnt, unsigned int i));
|
||||
extern void DECL(set_722, (char * pnt, unsigned int i));
|
||||
extern void DECL(outputlist_insert, (struct output_fragment * frag));
|
||||
|
||||
/*
|
||||
* Set by user command-line to override default date values
|
||||
*/
|
||||
|
||||
extern char *creation_date;
|
||||
extern char *modification_date;
|
||||
extern char *expiration_date;
|
||||
extern char *effective_date;
|
||||
|
||||
/* multi.c */
|
||||
|
||||
extern FILE * in_image;
|
||||
extern struct iso_directory_record *
|
||||
DECL(merge_isofs,(char * path));
|
||||
|
||||
extern int DECL(free_mdinfo, (struct directory_entry **, int len));
|
||||
|
||||
extern struct directory_entry **
|
||||
DECL(read_merging_directory,(struct iso_directory_record *, int*));
|
||||
extern void
|
||||
DECL(merge_remaining_entries, (struct directory *,
|
||||
struct directory_entry **, int));
|
||||
extern int
|
||||
DECL(merge_previous_session, (struct directory *,
|
||||
struct iso_directory_record *));
|
||||
|
||||
extern int DECL(get_session_start, (int *));
|
||||
|
||||
/* joliet.c */
|
||||
int DECL(joliet_sort_tree, (struct directory * node));
|
||||
|
||||
/* match.c */
|
||||
extern int DECL(matches, (char *));
|
||||
extern void DECL(add_match, (char *));
|
||||
|
||||
/* files.c */
|
||||
struct dirent * DECL(readdir_add_files, (char **, char *, DIR *));
|
||||
|
||||
/* */
|
||||
|
||||
extern int DECL(iso9660_file_length,(const char* name,
|
||||
struct directory_entry * sresult, int flag));
|
||||
extern int DECL(iso9660_date,(char *, time_t));
|
||||
extern void DECL(add_hash,(struct directory_entry *));
|
||||
extern struct file_hash * DECL(find_hash,(dev_t, ino_t));
|
||||
extern void DECL(add_directory_hash,(dev_t, ino_t));
|
||||
extern struct file_hash * DECL(find_directory_hash,(dev_t, ino_t));
|
||||
extern void DECL (flush_file_hash, (void));
|
||||
extern int DECL(delete_file_hash,(struct directory_entry *));
|
||||
extern struct directory_entry * DECL(find_file_hash,(char *));
|
||||
extern void DECL(add_file_hash,(struct directory_entry *));
|
||||
extern int DECL(generate_rock_ridge_attributes,(char *, char *,
|
||||
struct directory_entry *,
|
||||
struct stat *, struct stat *,
|
||||
int deep_flag));
|
||||
extern char * DECL(generate_rr_extension_record,(char * id, char * descriptor,
|
||||
char * source, int * size));
|
||||
|
||||
extern int DECL(check_prev_session, (struct directory_entry **, int len,
|
||||
struct directory_entry *,
|
||||
struct stat *,
|
||||
struct stat *,
|
||||
struct directory_entry **));
|
||||
|
||||
#ifdef USE_SCG
|
||||
/* scsi.c */
|
||||
#ifdef __STDC__
|
||||
extern int readsecs(int startsecno, void *buffer, int sectorcount);
|
||||
extern int scsidev_open(char *path);
|
||||
#else
|
||||
extern int readsecs();
|
||||
extern int scsidev_open();
|
||||
#endif
|
||||
#endif
|
||||
|
||||
extern char * extension_record;
|
||||
extern int extension_record_extent;
|
||||
extern int n_data_extents;
|
||||
|
||||
/* These are a few goodies that can be specified on the command line, and are
|
||||
filled into the root record */
|
||||
|
||||
extern char *preparer;
|
||||
extern char *publisher;
|
||||
extern char *copyright;
|
||||
extern char *biblio;
|
||||
extern char *abstract;
|
||||
extern char *appid;
|
||||
extern char *volset_id;
|
||||
extern char *system_id;
|
||||
extern char *volume_id;
|
||||
extern char *boot_catalog;
|
||||
extern char *boot_image;
|
||||
extern char *boot_image_embed;
|
||||
extern int volume_set_size;
|
||||
extern int volume_sequence_number;
|
||||
|
||||
extern void * DECL(e_malloc,(size_t));
|
||||
|
||||
|
||||
#define SECTOR_SIZE (2048)
|
||||
#define ROUND_UP(X) ((X + (SECTOR_SIZE - 1)) & ~(SECTOR_SIZE - 1))
|
||||
|
||||
#define NEED_RE 1
|
||||
#define NEED_PL 2
|
||||
#define NEED_CL 4
|
||||
#define NEED_CE 8
|
||||
#define NEED_SP 16
|
||||
|
||||
#define PREV_SESS_DEV (sizeof(dev_t) >= 4 ? 0x7ffffffd : 0x7ffd)
|
||||
#define TABLE_INODE (sizeof(ino_t) >= 4 ? 0x7ffffffe : 0x7ffe)
|
||||
#define UNCACHED_INODE (sizeof(ino_t) >= 4 ? 0x7fffffff : 0x7fff)
|
||||
#define UNCACHED_DEVICE (sizeof(dev_t) >= 4 ? 0x7fffffff : 0x7fff)
|
||||
|
||||
#ifdef VMS
|
||||
#define STAT_INODE(X) (X.st_ino[0])
|
||||
#define PATH_SEPARATOR ']'
|
||||
#define SPATH_SEPARATOR ""
|
||||
#else
|
||||
#define STAT_INODE(X) (X.st_ino)
|
||||
#define PATH_SEPARATOR '/'
|
||||
#define SPATH_SEPARATOR "/"
|
||||
#endif
|
||||
|
||||
/*
|
||||
* When using multi-session, indicates that we can reuse the
|
||||
* TRANS.TBL information for this directory entry. If this flag
|
||||
* is set for all entries in a directory, it means we can just
|
||||
* reuse the TRANS.TBL and not generate a new one.
|
||||
*/
|
||||
#define SAFE_TO_REUSE_TABLE_ENTRY 0x01
|
||||
#define DIR_HAS_DOT 0x02
|
||||
#define DIR_HAS_DOTDOT 0x04
|
||||
#define INHIBIT_JOLIET_ENTRY 0x08
|
||||
#define INHIBIT_RR_ENTRY 0x10
|
||||
#define RELOCATED_DIRECTORY 0x20
|
||||
#define INHIBIT_ISO9660_ENTRY 0x40
|
||||
|
||||
/*
|
||||
* Volume sequence number to use in all of the iso directory records.
|
||||
*/
|
||||
#define DEF_VSN 1
|
||||
|
||||
/*
|
||||
* Make sure we have a definition for this. If not, take a very conservative
|
||||
* guess. From what I can tell SunOS is the only one with this trouble.
|
||||
*/
|
||||
#ifndef NAME_MAX
|
||||
#ifdef FILENAME_MAX
|
||||
#define NAME_MAX FILENAME_MAX
|
||||
#else
|
||||
#define NAME_MAX 128
|
||||
#endif
|
||||
#endif
|
|
@ -1,75 +0,0 @@
|
|||
/*
|
||||
* GRUB -- GRand Unified Bootloader
|
||||
* Copyright (C) 1999,2000,2001,2002,2004,2007 Free Software Foundation, Inc.
|
||||
*
|
||||
* GRUB is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* GRUB is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef MSDOS_PARTITION_H
|
||||
#define MSDOS_PARTITION_H 1
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
/* The signature. */
|
||||
#define MSDOS_PARTITION_SIGNATURE ((0xaa << 8) | 0x55)
|
||||
|
||||
/* This is not a flag actually, but used as if it were a flag. */
|
||||
#define MSDOS_PARTITION_TYPE_HIDDEN_FLAG 0x10
|
||||
|
||||
/* The partition entry. */
|
||||
struct msdos_partition_entry
|
||||
{
|
||||
/* If active, 0x80, otherwise, 0x00. */
|
||||
uint8_t flag;
|
||||
|
||||
/* The head of the start. */
|
||||
uint8_t start_head;
|
||||
|
||||
/* (S | ((C >> 2) & 0xC0)) where S is the sector of the start and C
|
||||
is the cylinder of the start. Note that S is counted from one. */
|
||||
uint8_t start_sector;
|
||||
|
||||
/* (C & 0xFF) where C is the cylinder of the start. */
|
||||
uint8_t start_cylinder;
|
||||
|
||||
/* The partition type. */
|
||||
uint8_t type;
|
||||
|
||||
/* The end versions of start_head, start_sector and start_cylinder,
|
||||
respectively. */
|
||||
uint8_t end_head;
|
||||
uint8_t end_sector;
|
||||
uint8_t end_cylinder;
|
||||
|
||||
/* The start sector. Note that this is counted from zero. */
|
||||
uint32_t start;
|
||||
|
||||
/* The length in sector units. */
|
||||
uint32_t length;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/* The structure of MBR. */
|
||||
struct msdos_partition_mbr
|
||||
{
|
||||
/* The code area (actually, including BPB). */
|
||||
uint8_t code[446];
|
||||
|
||||
/* Four partition entries. */
|
||||
struct msdos_partition_entry entries[4];
|
||||
|
||||
/* The signature 0xaa55. */
|
||||
uint16_t signature;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
#endif
|
1201
util/mkisofs/multi.c
1201
util/mkisofs/multi.c
File diff suppressed because it is too large
Load diff
|
@ -1,394 +0,0 @@
|
|||
/*
|
||||
* File name.c - map full Unix file names to unique 8.3 names that
|
||||
* would be valid on DOS.
|
||||
*
|
||||
|
||||
Written by Eric Youngdale (1993).
|
||||
|
||||
Copyright 1993 Yggdrasil Computing, Incorporated
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
|
||||
#include "config.h"
|
||||
#include "mkisofs.h"
|
||||
|
||||
#include <ctype.h>
|
||||
|
||||
extern int allow_leading_dots;
|
||||
|
||||
/*
|
||||
* Function: iso9660_file_length
|
||||
*
|
||||
* Purpose: Map file name to 8.3 format, return length
|
||||
* of result.
|
||||
*
|
||||
* Arguments: name file name we need to map.
|
||||
* sresult directory entry structure to contain mapped name.
|
||||
* dirflag flag indicating whether this is a directory or not.
|
||||
*
|
||||
* Notes: This procedure probably needs to be rationalized somehow.
|
||||
* New options to affect the behavior of this function
|
||||
* would also be nice to have.
|
||||
*/
|
||||
int FDECL3(iso9660_file_length,
|
||||
const char*, name,
|
||||
struct directory_entry *, sresult,
|
||||
int, dirflag)
|
||||
{
|
||||
char * c;
|
||||
int chars_after_dot = 0;
|
||||
int chars_before_dot = 0;
|
||||
int current_length = 0;
|
||||
int extra = 0;
|
||||
int ignore = 0;
|
||||
char * last_dot;
|
||||
const char * pnt;
|
||||
int priority = 32767;
|
||||
char * result;
|
||||
int seen_dot = 0;
|
||||
int seen_semic = 0;
|
||||
int tildes = 0;
|
||||
|
||||
result = sresult->isorec.name;
|
||||
|
||||
/*
|
||||
* For the '.' entry, generate the correct record, and return
|
||||
* 1 for the length.
|
||||
*/
|
||||
if(strcmp(name,".") == 0)
|
||||
{
|
||||
if(result)
|
||||
{
|
||||
*result = 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* For the '..' entry, generate the correct record, and return
|
||||
* 1 for the length.
|
||||
*/
|
||||
if(strcmp(name,"..") == 0)
|
||||
{
|
||||
if(result)
|
||||
{
|
||||
*result++ = 1;
|
||||
*result++ = 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Now scan the directory one character at a time, and figure out
|
||||
* what to do.
|
||||
*/
|
||||
pnt = name;
|
||||
|
||||
/*
|
||||
* Find the '.' that we intend to use for the extension. Usually this
|
||||
* is the last dot, but if we have . followed by nothing or a ~, we
|
||||
* would consider this to be unsatisfactory, and we keep searching.
|
||||
*/
|
||||
last_dot = strrchr (pnt,'.');
|
||||
if( (last_dot != NULL)
|
||||
&& ( (last_dot[1] == '~')
|
||||
|| (last_dot[1] == '\0')) )
|
||||
{
|
||||
c = last_dot;
|
||||
*c = '\0';
|
||||
last_dot = strrchr (pnt,'.');
|
||||
*c = '.';
|
||||
}
|
||||
|
||||
while(*pnt)
|
||||
{
|
||||
#ifdef VMS
|
||||
if( strcmp(pnt,".DIR;1") == 0 )
|
||||
{
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* This character indicates a Unix style of backup file
|
||||
* generated by some editors. Lower the priority of
|
||||
* the file.
|
||||
*/
|
||||
if(*pnt == '#')
|
||||
{
|
||||
priority = 1;
|
||||
pnt++;
|
||||
continue;
|
||||
}
|
||||
|
||||
/*
|
||||
* This character indicates a Unix style of backup file
|
||||
* generated by some editors. Lower the priority of
|
||||
* the file.
|
||||
*/
|
||||
if(*pnt == '~')
|
||||
{
|
||||
priority = 1;
|
||||
tildes++;
|
||||
pnt++;
|
||||
continue;
|
||||
}
|
||||
|
||||
/*
|
||||
* This might come up if we had some joker already try and put
|
||||
* iso9660 version numbers into the file names. This would be
|
||||
* a silly thing to do on a Unix box, but we check for it
|
||||
* anyways. If we see this, then we don't have to add our
|
||||
* own version number at the end.
|
||||
* UNLESS the ';' is part of the filename and no version
|
||||
* number is following. [VK]
|
||||
*/
|
||||
if(*pnt == ';')
|
||||
{
|
||||
/* [VK] */
|
||||
if (pnt[1] != '\0' && (pnt[1] < '0' || pnt[1] > '9'))
|
||||
{
|
||||
pnt++;
|
||||
ignore++;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* If we have a name with multiple '.' characters, we ignore everything
|
||||
* after we have gotten the extension.
|
||||
*/
|
||||
if(ignore)
|
||||
{
|
||||
pnt++;
|
||||
continue;
|
||||
}
|
||||
|
||||
/*
|
||||
* Spin past any iso9660 version number we might have.
|
||||
*/
|
||||
if(seen_semic)
|
||||
{
|
||||
if(*pnt >= '0' && *pnt <= '9')
|
||||
{
|
||||
*result++ = *pnt;
|
||||
}
|
||||
extra++;
|
||||
pnt++;
|
||||
continue;
|
||||
}
|
||||
|
||||
/*
|
||||
* If we have full names, the names we generate will not
|
||||
* work on a DOS machine, since they are not guaranteed
|
||||
* to be 8.3. Nonetheless, in many cases this is a useful
|
||||
* option. We still only allow one '.' character in the
|
||||
* name, however.
|
||||
*/
|
||||
if(full_iso9660_filenames)
|
||||
{
|
||||
/* Here we allow a more relaxed syntax. */
|
||||
if(*pnt == '.')
|
||||
{
|
||||
if (seen_dot)
|
||||
{
|
||||
ignore++;
|
||||
continue;
|
||||
}
|
||||
seen_dot++;
|
||||
}
|
||||
if(current_length < 30)
|
||||
{
|
||||
if( !isascii (*pnt))
|
||||
{
|
||||
*result++ = '_';
|
||||
}
|
||||
else
|
||||
{
|
||||
*result++ = (islower((unsigned char)*pnt) ? toupper((unsigned char)*pnt) : *pnt);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
* Dos style filenames. We really restrict the
|
||||
* names here.
|
||||
*/
|
||||
/* It would be nice to have .tar.gz transform to .tgz,
|
||||
* .ps.gz to .psz, ...
|
||||
*/
|
||||
if(*pnt == '.')
|
||||
{
|
||||
if (!chars_before_dot && !allow_leading_dots)
|
||||
{
|
||||
/* DOS can't read files with dot first */
|
||||
chars_before_dot++;
|
||||
if (result)
|
||||
{
|
||||
*result++ = '_'; /* Substitute underscore */
|
||||
}
|
||||
}
|
||||
else if( pnt != last_dot )
|
||||
{
|
||||
/*
|
||||
* If this isn't the dot that we use for the extension,
|
||||
* then change the character into a '_' instead.
|
||||
*/
|
||||
if(chars_before_dot < 8)
|
||||
{
|
||||
chars_before_dot++;
|
||||
if(result)
|
||||
{
|
||||
*result++ = '_';
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (seen_dot)
|
||||
{
|
||||
ignore++; continue;
|
||||
}
|
||||
if(result)
|
||||
{
|
||||
*result++ = '.';
|
||||
}
|
||||
seen_dot++;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if( (seen_dot && (chars_after_dot < 3) && ++chars_after_dot)
|
||||
|| (!seen_dot && (chars_before_dot < 8) && ++chars_before_dot) )
|
||||
{
|
||||
if(result)
|
||||
{
|
||||
switch (*pnt)
|
||||
{
|
||||
default:
|
||||
if( !isascii (*pnt) )
|
||||
{
|
||||
*result++ = '_';
|
||||
}
|
||||
else
|
||||
{
|
||||
*result++ = islower((unsigned char)*pnt) ? toupper((unsigned char)*pnt) : *pnt;
|
||||
}
|
||||
break;
|
||||
|
||||
/*
|
||||
* Descriptions of DOS's 'Parse Filename'
|
||||
* (function 29H) describes V1 and V2.0+
|
||||
* separator and terminator characters.
|
||||
* These characters in a DOS name make
|
||||
* the file visible but un-manipulable
|
||||
* (all useful operations error off.
|
||||
*/
|
||||
/* separators */
|
||||
case '+':
|
||||
case '=':
|
||||
case '%': /* not legal DOS filename */
|
||||
case ':':
|
||||
case ';': /* already handled */
|
||||
case '.': /* already handled */
|
||||
case ',': /* already handled */
|
||||
case '\t':
|
||||
case ' ':
|
||||
/* V1 only separators */
|
||||
case '/':
|
||||
case '"':
|
||||
case '[':
|
||||
case ']':
|
||||
/* terminators */
|
||||
case '>':
|
||||
case '<':
|
||||
case '|':
|
||||
/* Hmm - what to do here? Skip?
|
||||
* Win95 looks like it substitutes '_'
|
||||
*/
|
||||
*result++ = '_';
|
||||
break;
|
||||
} /* switch (*pnt) */
|
||||
} /* if (result) */
|
||||
} /* if (chars_{after,before}_dot) ... */
|
||||
} /* else *pnt == '.' */
|
||||
} /* else DOS file names */
|
||||
current_length++;
|
||||
pnt++;
|
||||
} /* while (*pnt) */
|
||||
|
||||
/*
|
||||
* OK, that wraps up the scan of the name. Now tidy up a few other
|
||||
* things.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Look for emacs style of numbered backups, like foo.c.~3~. If
|
||||
* we see this, convert the version number into the priority
|
||||
* number. In case of name conflicts, this is what would end
|
||||
* up being used as the 'extension'.
|
||||
*/
|
||||
if(tildes == 2)
|
||||
{
|
||||
int prio1 = 0;
|
||||
pnt = name;
|
||||
while (*pnt && *pnt != '~')
|
||||
{
|
||||
pnt++;
|
||||
}
|
||||
if (*pnt)
|
||||
{
|
||||
pnt++;
|
||||
}
|
||||
while(*pnt && *pnt != '~')
|
||||
{
|
||||
prio1 = 10*prio1 + *pnt - '0';
|
||||
pnt++;
|
||||
}
|
||||
priority = prio1;
|
||||
}
|
||||
|
||||
/*
|
||||
* If this is not a directory, force a '.' in case we haven't
|
||||
* seen one, and add a version number if we haven't seen one
|
||||
* of those either.
|
||||
*/
|
||||
if (!dirflag)
|
||||
{
|
||||
if (!seen_dot && !omit_period)
|
||||
{
|
||||
if (result) *result++ = '.';
|
||||
extra++;
|
||||
}
|
||||
if(!omit_version_number && !seen_semic)
|
||||
{
|
||||
if(result)
|
||||
{
|
||||
*result++ = ';';
|
||||
*result++ = '1';
|
||||
};
|
||||
extra += 2;
|
||||
}
|
||||
}
|
||||
|
||||
if(result)
|
||||
{
|
||||
*result++ = 0;
|
||||
}
|
||||
sresult->priority = priority;
|
||||
|
||||
return (chars_before_dot + chars_after_dot + seen_dot + extra);
|
||||
}
|
|
@ -1,597 +0,0 @@
|
|||
/*
|
||||
* File rock.c - generate RRIP records for iso9660 filesystems.
|
||||
|
||||
Written by Eric Youngdale (1993).
|
||||
|
||||
Copyright 1993 Yggdrasil Computing, Incorporated
|
||||
|
||||
Copyright (C) 2009,2010 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#ifndef VMS
|
||||
#if defined(MAJOR_IN_SYSMACROS)
|
||||
#include <sys/sysmacros.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
#endif
|
||||
#if defined(MAJOR_IN_MKDEV)
|
||||
#include <sys/types.h>
|
||||
#include <sys/mkdev.h>
|
||||
#endif
|
||||
|
||||
#include "mkisofs.h"
|
||||
#include "iso9660.h"
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
|
||||
#ifdef DOESNT_WORK
|
||||
|
||||
#ifdef NON_UNIXFS
|
||||
#define S_ISLNK(m) (0)
|
||||
#else
|
||||
#ifndef S_ISLNK
|
||||
#define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#else
|
||||
#include <statdefs.h>
|
||||
#endif
|
||||
|
||||
#define SU_VERSION 1
|
||||
|
||||
#define SL_ROOT 8
|
||||
#define SL_PARENT 4
|
||||
#define SL_CURRENT 2
|
||||
#define SL_CONTINUE 1
|
||||
|
||||
#define CE_SIZE 28
|
||||
#define CL_SIZE 12
|
||||
#define ER_SIZE 8
|
||||
#define NM_SIZE 5
|
||||
#define PL_SIZE 12
|
||||
#define PN_SIZE 20
|
||||
#define PX_SIZE 36
|
||||
#define RE_SIZE 4
|
||||
#define SL_SIZE 20
|
||||
#define ZZ_SIZE 15
|
||||
#ifdef __QNX__
|
||||
#define TF_SIZE (5 + 4 * 7)
|
||||
#else
|
||||
#define TF_SIZE (5 + 3 * 7)
|
||||
#endif
|
||||
|
||||
/* If we need to store this number of bytes, make sure we
|
||||
do not box ourselves in so that we do not have room for
|
||||
a CE entry for the continuation record */
|
||||
|
||||
#define MAYBE_ADD_CE_ENTRY(BYTES) \
|
||||
((unsigned) ((BYTES) + CE_SIZE + currlen + ipnt) > (unsigned) (recstart + reclimit) ? 1 : 0)
|
||||
|
||||
/*
|
||||
* Buffer to build RR attributes
|
||||
*/
|
||||
|
||||
static unsigned char Rock[16384];
|
||||
static unsigned char symlink_buff[256];
|
||||
static int ipnt = 0;
|
||||
static int recstart = 0;
|
||||
static int currlen = 0;
|
||||
static int mainrec = 0;
|
||||
static int reclimit;
|
||||
|
||||
static void add_CE_entry __PR((void));
|
||||
|
||||
static void add_CE_entry(){
|
||||
if(recstart)
|
||||
set_733((char*)Rock + recstart - 8, ipnt + 28 - recstart);
|
||||
Rock[ipnt++] ='C';
|
||||
Rock[ipnt++] ='E';
|
||||
Rock[ipnt++] = CE_SIZE;
|
||||
Rock[ipnt++] = SU_VERSION;
|
||||
set_733((char*)Rock + ipnt, 0);
|
||||
ipnt += 8;
|
||||
set_733((char*)Rock + ipnt, 0);
|
||||
ipnt += 8;
|
||||
set_733((char*)Rock + ipnt, 0);
|
||||
ipnt += 8;
|
||||
recstart = ipnt;
|
||||
currlen = 0;
|
||||
if(!mainrec) mainrec = ipnt;
|
||||
reclimit = SECTOR_SIZE - 8; /* Limit to one sector */
|
||||
}
|
||||
|
||||
#ifdef __STDC__
|
||||
int generate_rock_ridge_attributes (char * whole_name, char * name,
|
||||
struct directory_entry * s_entry,
|
||||
struct stat * statbuf,
|
||||
struct stat * lstatbuf,
|
||||
int deep_opt)
|
||||
#else
|
||||
int generate_rock_ridge_attributes (whole_name, name,
|
||||
s_entry,
|
||||
statbuf,
|
||||
lstatbuf,
|
||||
deep_opt)
|
||||
char * whole_name; char * name; struct directory_entry * s_entry;
|
||||
struct stat * statbuf, *lstatbuf;
|
||||
int deep_opt;
|
||||
#endif
|
||||
{
|
||||
int flagpos, flagval;
|
||||
int need_ce;
|
||||
|
||||
statbuf = statbuf; /* this shuts up unreferenced compiler warnings */
|
||||
mainrec = recstart = ipnt = 0;
|
||||
reclimit = 0xf8;
|
||||
|
||||
/* no need to fill in the RR stuff if we won't see the file */
|
||||
if (s_entry->de_flags & INHIBIT_ISO9660_ENTRY)
|
||||
return 0;
|
||||
|
||||
/* Obtain the amount of space that is currently used for the directory
|
||||
record. Assume max for name, since name conflicts may cause us
|
||||
to rename the file later on */
|
||||
currlen = sizeof(s_entry->isorec);
|
||||
|
||||
/* Identify that we are using the SUSP protocol */
|
||||
if(deep_opt & NEED_SP){
|
||||
Rock[ipnt++] ='S';
|
||||
Rock[ipnt++] ='P';
|
||||
Rock[ipnt++] = 7;
|
||||
Rock[ipnt++] = SU_VERSION;
|
||||
Rock[ipnt++] = 0xbe;
|
||||
Rock[ipnt++] = 0xef;
|
||||
Rock[ipnt++] = 0;
|
||||
};
|
||||
|
||||
/* First build the posix name field */
|
||||
Rock[ipnt++] ='R';
|
||||
Rock[ipnt++] ='R';
|
||||
Rock[ipnt++] = 5;
|
||||
Rock[ipnt++] = SU_VERSION;
|
||||
flagpos = ipnt;
|
||||
flagval = 0;
|
||||
Rock[ipnt++] = 0; /* We go back and fix this later */
|
||||
|
||||
if(strcmp(name,".") && strcmp(name,"..")){
|
||||
char * npnt;
|
||||
int remain, use;
|
||||
|
||||
remain = strlen(name);
|
||||
npnt = name;
|
||||
|
||||
while(remain){
|
||||
use = remain;
|
||||
need_ce = 0;
|
||||
/* Can we fit this SUSP and a CE entry? */
|
||||
if(use + currlen + CE_SIZE + (ipnt - recstart) > reclimit) {
|
||||
use = reclimit - currlen - CE_SIZE - (ipnt - recstart);
|
||||
need_ce++;
|
||||
}
|
||||
|
||||
/* Only room for 256 per SUSP field */
|
||||
if(use > 0xf8) use = 0xf8;
|
||||
|
||||
/* First build the posix name field */
|
||||
Rock[ipnt++] ='N';
|
||||
Rock[ipnt++] ='M';
|
||||
Rock[ipnt++] = NM_SIZE + use;
|
||||
Rock[ipnt++] = SU_VERSION;
|
||||
Rock[ipnt++] = (remain != use ? 1 : 0);
|
||||
flagval |= (1<<3);
|
||||
strncpy((char *)&Rock[ipnt], npnt, use);
|
||||
npnt += use;
|
||||
ipnt += use;
|
||||
remain -= use;
|
||||
if(remain && need_ce) add_CE_entry();
|
||||
};
|
||||
};
|
||||
|
||||
/*
|
||||
* Add the posix modes
|
||||
*/
|
||||
if(MAYBE_ADD_CE_ENTRY(PX_SIZE)) add_CE_entry();
|
||||
Rock[ipnt++] ='P';
|
||||
Rock[ipnt++] ='X';
|
||||
Rock[ipnt++] = PX_SIZE;
|
||||
Rock[ipnt++] = SU_VERSION;
|
||||
flagval |= (1<<0);
|
||||
set_733((char*)Rock + ipnt, lstatbuf->st_mode);
|
||||
ipnt += 8;
|
||||
set_733((char*)Rock + ipnt, lstatbuf->st_nlink);
|
||||
ipnt += 8;
|
||||
set_733((char*)Rock + ipnt, lstatbuf->st_uid);
|
||||
ipnt += 8;
|
||||
set_733((char*)Rock + ipnt, lstatbuf->st_gid);
|
||||
ipnt += 8;
|
||||
|
||||
/*
|
||||
* Check for special devices
|
||||
*/
|
||||
#ifndef NON_UNIXFS
|
||||
if (S_ISCHR(lstatbuf->st_mode) || S_ISBLK(lstatbuf->st_mode)) {
|
||||
if(MAYBE_ADD_CE_ENTRY(PN_SIZE)) add_CE_entry();
|
||||
Rock[ipnt++] ='P';
|
||||
Rock[ipnt++] ='N';
|
||||
Rock[ipnt++] = PN_SIZE;
|
||||
Rock[ipnt++] = SU_VERSION;
|
||||
flagval |= (1<<1);
|
||||
#if defined(MAJOR_IN_SYSMACROS) || defined(MAJOR_IN_MKDEV)
|
||||
set_733((char*)Rock + ipnt, major(lstatbuf->st_rdev ));
|
||||
ipnt += 8;
|
||||
set_733((char*)Rock + ipnt, minor(lstatbuf->st_rdev));
|
||||
ipnt += 8;
|
||||
#else
|
||||
/*
|
||||
* If we don't have sysmacros.h, then we have to guess as to how
|
||||
* best to pick apart the device number for major/minor.
|
||||
* Note: this may very well be wrong for many systems, so
|
||||
* it is always best to use the major/minor macros if the
|
||||
* system supports it.
|
||||
*/
|
||||
if(sizeof(dev_t) <= 2) {
|
||||
set_733((char*)Rock + ipnt, (lstatbuf->st_rdev >> 8));
|
||||
ipnt += 8;
|
||||
set_733((char*)Rock + ipnt, lstatbuf->st_rdev & 0xff);
|
||||
ipnt += 8;
|
||||
}
|
||||
else if(sizeof(dev_t) <= 4) {
|
||||
set_733((char*)Rock + ipnt, (lstatbuf->st_rdev >> 8) >> 8);
|
||||
ipnt += 8;
|
||||
set_733((char*)Rock + ipnt, lstatbuf->st_rdev & 0xffff);
|
||||
ipnt += 8;
|
||||
}
|
||||
else {
|
||||
set_733((char*)Rock + ipnt, (lstatbuf->st_rdev >> 16) >> 16);
|
||||
ipnt += 8;
|
||||
set_733((char*)Rock + ipnt, lstatbuf->st_rdev);
|
||||
ipnt += 8;
|
||||
}
|
||||
#endif
|
||||
};
|
||||
#endif
|
||||
/*
|
||||
* Check for and symbolic links. VMS does not have these.
|
||||
*/
|
||||
if (S_ISLNK(lstatbuf->st_mode)){
|
||||
int lenpos, lenval, j0, j1;
|
||||
int nchar;
|
||||
unsigned char * cpnt, *cpnt1;
|
||||
nchar = readlink(whole_name, (char *)symlink_buff, sizeof(symlink_buff));
|
||||
symlink_buff[nchar < 0 ? 0 : nchar] = 0;
|
||||
nchar = strlen((char *) symlink_buff);
|
||||
set_733(s_entry->isorec.size, 0);
|
||||
cpnt = &symlink_buff[0];
|
||||
flagval |= (1<<2);
|
||||
|
||||
if (! split_SL_field)
|
||||
{
|
||||
int sl_bytes = 0;
|
||||
for (cpnt1 = cpnt; *cpnt1 != '\0'; cpnt1++)
|
||||
{
|
||||
if (*cpnt1 == '/')
|
||||
{
|
||||
sl_bytes += 4;
|
||||
}
|
||||
else
|
||||
{
|
||||
sl_bytes += 1;
|
||||
}
|
||||
}
|
||||
if (sl_bytes > 250)
|
||||
{
|
||||
/*
|
||||
* the symbolic link won't fit into one SL System Use Field
|
||||
* print an error message and continue with splited one
|
||||
*/
|
||||
fprintf (stderr, _("symbolic link `%s' too long for one SL System Use Field, splitting"), cpnt);
|
||||
}
|
||||
if(MAYBE_ADD_CE_ENTRY(SL_SIZE + sl_bytes)) add_CE_entry();
|
||||
}
|
||||
|
||||
while(nchar){
|
||||
if(MAYBE_ADD_CE_ENTRY(SL_SIZE)) add_CE_entry();
|
||||
Rock[ipnt++] ='S';
|
||||
Rock[ipnt++] ='L';
|
||||
lenpos = ipnt;
|
||||
Rock[ipnt++] = SL_SIZE;
|
||||
Rock[ipnt++] = SU_VERSION;
|
||||
Rock[ipnt++] = 0; /* Flags */
|
||||
lenval = 5;
|
||||
while(*cpnt){
|
||||
cpnt1 = (unsigned char *) strchr((char *) cpnt, '/');
|
||||
if(cpnt1) {
|
||||
nchar--;
|
||||
*cpnt1 = 0;
|
||||
};
|
||||
|
||||
/* We treat certain components in a special way. */
|
||||
if(cpnt[0] == '.' && cpnt[1] == '.' && cpnt[2] == 0){
|
||||
if(MAYBE_ADD_CE_ENTRY(2)) add_CE_entry();
|
||||
Rock[ipnt++] = SL_PARENT;
|
||||
Rock[ipnt++] = 0; /* length is zero */
|
||||
lenval += 2;
|
||||
nchar -= 2;
|
||||
} else if(cpnt[0] == '.' && cpnt[1] == 0){
|
||||
if(MAYBE_ADD_CE_ENTRY(2)) add_CE_entry();
|
||||
Rock[ipnt++] = SL_CURRENT;
|
||||
Rock[ipnt++] = 0; /* length is zero */
|
||||
lenval += 2;
|
||||
nchar -= 1;
|
||||
} else if(cpnt[0] == 0){
|
||||
if(MAYBE_ADD_CE_ENTRY(2)) add_CE_entry();
|
||||
Rock[ipnt++] = SL_ROOT;
|
||||
Rock[ipnt++] = 0; /* length is zero */
|
||||
lenval += 2;
|
||||
} else {
|
||||
/* If we do not have enough room for a component, start
|
||||
a new continuations segment now */
|
||||
if(split_SL_component ? MAYBE_ADD_CE_ENTRY(6) :
|
||||
MAYBE_ADD_CE_ENTRY(6 + strlen ((char *) cpnt)))
|
||||
{
|
||||
add_CE_entry();
|
||||
if(cpnt1)
|
||||
{
|
||||
*cpnt1 = '/';
|
||||
nchar++;
|
||||
cpnt1 = NULL; /* A kluge so that we can restart properly */
|
||||
}
|
||||
break;
|
||||
}
|
||||
j0 = strlen((char *) cpnt);
|
||||
while(j0) {
|
||||
j1 = j0;
|
||||
if(j1 > 0xf8) j1 = 0xf8;
|
||||
need_ce = 0;
|
||||
if(j1 + currlen + CE_SIZE + (ipnt - recstart) > reclimit) {
|
||||
j1 = reclimit - currlen - CE_SIZE - (ipnt - recstart);
|
||||
need_ce++;
|
||||
}
|
||||
Rock[ipnt++] = (j1 != j0 ? SL_CONTINUE : 0);
|
||||
Rock[ipnt++] = j1;
|
||||
strncpy((char *) Rock + ipnt, (char *) cpnt, j1);
|
||||
ipnt += j1;
|
||||
lenval += j1 + 2;
|
||||
cpnt += j1;
|
||||
nchar -= j1; /* Number we processed this time */
|
||||
j0 -= j1;
|
||||
if(need_ce) {
|
||||
add_CE_entry();
|
||||
if(cpnt1) {
|
||||
*cpnt1 = '/';
|
||||
nchar++;
|
||||
cpnt1 = NULL; /* A kluge so that we can restart properly */
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
};
|
||||
if(cpnt1) {
|
||||
cpnt = cpnt1 + 1;
|
||||
} else
|
||||
break;
|
||||
}
|
||||
Rock[lenpos] = lenval;
|
||||
if(nchar) Rock[lenpos + 2] = SL_CONTINUE; /* We need another SL entry */
|
||||
} /* while nchar */
|
||||
} /* Is a symbolic link */
|
||||
/*
|
||||
* Add in the Rock Ridge TF time field
|
||||
*/
|
||||
if(MAYBE_ADD_CE_ENTRY(TF_SIZE)) add_CE_entry();
|
||||
Rock[ipnt++] ='T';
|
||||
Rock[ipnt++] ='F';
|
||||
Rock[ipnt++] = TF_SIZE;
|
||||
Rock[ipnt++] = SU_VERSION;
|
||||
#ifdef __QNX__
|
||||
Rock[ipnt++] = 0x0f;
|
||||
#else
|
||||
Rock[ipnt++] = 0x0e;
|
||||
#endif
|
||||
flagval |= (1<<7);
|
||||
#ifdef __QNX__
|
||||
iso9660_date((char *) &Rock[ipnt], lstatbuf->st_ftime);
|
||||
ipnt += 7;
|
||||
#endif
|
||||
iso9660_date((char *) &Rock[ipnt], lstatbuf->st_mtime);
|
||||
ipnt += 7;
|
||||
iso9660_date((char *) &Rock[ipnt], lstatbuf->st_atime);
|
||||
ipnt += 7;
|
||||
iso9660_date((char *) &Rock[ipnt], lstatbuf->st_ctime);
|
||||
ipnt += 7;
|
||||
|
||||
/*
|
||||
* Add in the Rock Ridge RE time field
|
||||
*/
|
||||
if(deep_opt & NEED_RE){
|
||||
if(MAYBE_ADD_CE_ENTRY(RE_SIZE)) add_CE_entry();
|
||||
Rock[ipnt++] ='R';
|
||||
Rock[ipnt++] ='E';
|
||||
Rock[ipnt++] = RE_SIZE;
|
||||
Rock[ipnt++] = SU_VERSION;
|
||||
flagval |= (1<<6);
|
||||
};
|
||||
/*
|
||||
* Add in the Rock Ridge PL record, if required.
|
||||
*/
|
||||
if(deep_opt & NEED_PL){
|
||||
if(MAYBE_ADD_CE_ENTRY(PL_SIZE)) add_CE_entry();
|
||||
Rock[ipnt++] ='P';
|
||||
Rock[ipnt++] ='L';
|
||||
Rock[ipnt++] = PL_SIZE;
|
||||
Rock[ipnt++] = SU_VERSION;
|
||||
set_733((char*)Rock + ipnt, 0);
|
||||
ipnt += 8;
|
||||
flagval |= (1<<5);
|
||||
};
|
||||
|
||||
/*
|
||||
* Add in the Rock Ridge CL field, if required.
|
||||
*/
|
||||
if(deep_opt & NEED_CL){
|
||||
if(MAYBE_ADD_CE_ENTRY(CL_SIZE)) add_CE_entry();
|
||||
Rock[ipnt++] ='C';
|
||||
Rock[ipnt++] ='L';
|
||||
Rock[ipnt++] = CL_SIZE;
|
||||
Rock[ipnt++] = SU_VERSION;
|
||||
set_733((char*)Rock + ipnt, 0);
|
||||
ipnt += 8;
|
||||
flagval |= (1<<4);
|
||||
};
|
||||
|
||||
#ifndef VMS
|
||||
/* If transparent compression was requested, fill in the correct
|
||||
field for this file */
|
||||
if(transparent_compression &&
|
||||
S_ISREG(lstatbuf->st_mode) &&
|
||||
strlen(name) > 3 &&
|
||||
strcmp(name + strlen(name) - 3,".gZ") == 0){
|
||||
FILE * zipfile;
|
||||
char * checkname;
|
||||
unsigned int file_size;
|
||||
unsigned char header[8];
|
||||
int OK_flag;
|
||||
|
||||
/* First open file and verify that the correct algorithm was used */
|
||||
file_size = 0;
|
||||
OK_flag = 1;
|
||||
|
||||
zipfile = fopen(whole_name, "rb");
|
||||
if (fread (header, 1, sizeof (header), zipfile) != sizeof(header))
|
||||
error (1, errno, "fread");
|
||||
|
||||
/* Check some magic numbers from gzip. */
|
||||
if(header[0] != 0x1f || header[1] != 0x8b || header[2] != 8) OK_flag = 0;
|
||||
/* Make sure file was blocksized. */
|
||||
if(((header[3] & 0x40) == 0)) OK_flag = 0;
|
||||
/* OK, now go to the end of the file and get some more info */
|
||||
if(OK_flag){
|
||||
int status;
|
||||
status = (long)lseek(fileno(zipfile), (off_t)(-8), SEEK_END);
|
||||
if(status == -1) OK_flag = 0;
|
||||
}
|
||||
if(OK_flag){
|
||||
if(read(fileno(zipfile), (char*)header, sizeof(header)) != sizeof(header))
|
||||
OK_flag = 0;
|
||||
else {
|
||||
int blocksize;
|
||||
blocksize = (header[3] << 8) | header[2];
|
||||
file_size = ((unsigned int)header[7] << 24) |
|
||||
((unsigned int)header[6] << 16) |
|
||||
((unsigned int)header[5] << 8) | header[4];
|
||||
#if 0
|
||||
fprintf(stderr,"Blocksize = %d %d\n", blocksize, file_size);
|
||||
#endif
|
||||
if(blocksize != SECTOR_SIZE) OK_flag = 0;
|
||||
}
|
||||
}
|
||||
fclose(zipfile);
|
||||
|
||||
checkname = strdup(whole_name);
|
||||
checkname[strlen(whole_name)-3] = 0;
|
||||
zipfile = fopen(checkname, "rb");
|
||||
if(zipfile) {
|
||||
OK_flag = 0;
|
||||
fprintf (stderr, _("Unable to insert transparent compressed file - name conflict\n"));
|
||||
fclose(zipfile);
|
||||
}
|
||||
|
||||
free(checkname);
|
||||
|
||||
if(OK_flag){
|
||||
if(MAYBE_ADD_CE_ENTRY(ZZ_SIZE)) add_CE_entry();
|
||||
Rock[ipnt++] ='Z';
|
||||
Rock[ipnt++] ='Z';
|
||||
Rock[ipnt++] = ZZ_SIZE;
|
||||
Rock[ipnt++] = SU_VERSION;
|
||||
Rock[ipnt++] = 'g'; /* Identify compression technique used */
|
||||
Rock[ipnt++] = 'z';
|
||||
Rock[ipnt++] = 3;
|
||||
set_733((char*)Rock + ipnt, file_size); /* Real file size */
|
||||
ipnt += 8;
|
||||
};
|
||||
}
|
||||
#endif
|
||||
/*
|
||||
* Add in the Rock Ridge CE field, if required. We use this for the
|
||||
* extension record that is stored in the root directory.
|
||||
*/
|
||||
if(deep_opt & NEED_CE) add_CE_entry();
|
||||
/*
|
||||
* Done filling in all of the fields. Now copy it back to a buffer for the
|
||||
* file in question.
|
||||
*/
|
||||
|
||||
/* Now copy this back to the buffer for the file */
|
||||
Rock[flagpos] = flagval;
|
||||
|
||||
/* If there was a CE, fill in the size field */
|
||||
if(recstart)
|
||||
set_733((char*)Rock + recstart - 8, ipnt - recstart);
|
||||
|
||||
s_entry->rr_attributes = (unsigned char *) e_malloc(ipnt);
|
||||
s_entry->total_rr_attr_size = ipnt;
|
||||
s_entry->rr_attr_size = (mainrec ? mainrec : ipnt);
|
||||
memcpy(s_entry->rr_attributes, Rock, ipnt);
|
||||
return ipnt;
|
||||
}
|
||||
|
||||
/* Guaranteed to return a single sector with the relevant info */
|
||||
|
||||
char * FDECL4(generate_rr_extension_record, char *, id, char *, descriptor,
|
||||
char *, source, int *, size){
|
||||
int lipnt = 0;
|
||||
char * pnt;
|
||||
int len_id, len_des, len_src;
|
||||
|
||||
len_id = strlen(id);
|
||||
len_des = strlen(descriptor);
|
||||
len_src = strlen(source);
|
||||
Rock[lipnt++] ='E';
|
||||
Rock[lipnt++] ='R';
|
||||
Rock[lipnt++] = ER_SIZE + len_id + len_des + len_src;
|
||||
Rock[lipnt++] = 1;
|
||||
Rock[lipnt++] = len_id;
|
||||
Rock[lipnt++] = len_des;
|
||||
Rock[lipnt++] = len_src;
|
||||
Rock[lipnt++] = 1;
|
||||
|
||||
memcpy(Rock + lipnt, id, len_id);
|
||||
lipnt += len_id;
|
||||
|
||||
memcpy(Rock + lipnt, descriptor, len_des);
|
||||
lipnt += len_des;
|
||||
|
||||
memcpy(Rock + lipnt, source, len_src);
|
||||
lipnt += len_src;
|
||||
|
||||
if(lipnt > SECTOR_SIZE)
|
||||
error (1, 0, _("Extension record too long\n"));
|
||||
pnt = (char *) e_malloc(SECTOR_SIZE);
|
||||
memset(pnt, 0, SECTOR_SIZE);
|
||||
memcpy(pnt, Rock, lipnt);
|
||||
*size = lipnt;
|
||||
return pnt;
|
||||
}
|
1865
util/mkisofs/tree.c
1865
util/mkisofs/tree.c
File diff suppressed because it is too large
Load diff
1483
util/mkisofs/write.c
1483
util/mkisofs/write.c
File diff suppressed because it is too large
Load diff
|
@ -29,7 +29,7 @@
|
|||
#include <grub/msdos_partition.h>
|
||||
#include <grub/gpt_partition.h>
|
||||
#include <grub/env.h>
|
||||
#include <grub/util/hostdisk.h>
|
||||
#include <grub/emu/hostdisk.h>
|
||||
#include <grub/machine/boot.h>
|
||||
#include <grub/machine/kernel.h>
|
||||
#include <grub/term.h>
|
||||
|
@ -46,7 +46,7 @@
|
|||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <dirent.h>
|
||||
#include <grub/util/getroot.h>
|
||||
#include <grub/emu/getroot.h>
|
||||
|
||||
#define _GNU_SOURCE 1
|
||||
#include <getopt.h>
|
||||
|
@ -634,7 +634,7 @@ main (int argc, char *argv[])
|
|||
|
||||
find_dest_dev (&ginfo, argv);
|
||||
|
||||
ginfo.prefix = make_system_path_relative_to_its_root (ginfo.dir ?
|
||||
ginfo.prefix = grub_make_system_path_relative_to_its_root (ginfo.dir ?
|
||||
: DEFAULT_DIRECTORY);
|
||||
|
||||
check_root_dev (&ginfo);
|
||||
|
|
412
video/i386/pc/vga.c
Normal file
412
video/i386/pc/vga.c
Normal file
|
@ -0,0 +1,412 @@
|
|||
/*
|
||||
* GRUB -- GRand Unified Bootloader
|
||||
* Copyright (C) 2000,2001,2002,2003,2004,2005,2007,2008,2009,2010 Free Software Foundation, Inc.
|
||||
*
|
||||
* GRUB is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* GRUB is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#define grub_video_render_target grub_video_fbrender_target
|
||||
|
||||
#include <grub/machine/vga.h>
|
||||
#include <grub/machine/console.h>
|
||||
#include <grub/cpu/io.h>
|
||||
#include <grub/mm.h>
|
||||
#include <grub/video.h>
|
||||
#include <grub/video_fb.h>
|
||||
#include <grub/types.h>
|
||||
#include <grub/dl.h>
|
||||
#include <grub/misc.h>
|
||||
|
||||
#define VGA_WIDTH 640
|
||||
#define VGA_HEIGHT 350
|
||||
#define VGA_MEM ((grub_uint8_t *) GRUB_MEMORY_MACHINE_VGA_ADDR)
|
||||
#define PAGE_OFFSET(x) ((x) * (VGA_WIDTH * VGA_HEIGHT / 8))
|
||||
|
||||
static unsigned char text_mode;
|
||||
static unsigned char saved_map_mask;
|
||||
|
||||
static struct
|
||||
{
|
||||
struct grub_video_mode_info mode_info;
|
||||
struct grub_video_render_target *render_target;
|
||||
grub_uint8_t *temporary_buffer;
|
||||
int front_page;
|
||||
int back_page;
|
||||
} framebuffer;
|
||||
|
||||
#define SEQUENCER_ADDR_PORT 0x3C4
|
||||
#define SEQUENCER_DATA_PORT 0x3C5
|
||||
#define MAP_MASK_REGISTER 0x02
|
||||
|
||||
#define CRTC_ADDR_PORT 0x3D4
|
||||
#define CRTC_DATA_PORT 0x3D5
|
||||
#define START_ADDR_HIGH_REGISTER 0x0C
|
||||
#define START_ADDR_LOW_REGISTER 0x0D
|
||||
|
||||
#define GRAPHICS_ADDR_PORT 0x3CE
|
||||
#define GRAPHICS_DATA_PORT 0x3CF
|
||||
#define READ_MAP_REGISTER 0x04
|
||||
|
||||
#define INPUT_STATUS1_REGISTER 0x3DA
|
||||
#define INPUT_STATUS1_VERTR_BIT 0x08
|
||||
|
||||
static inline void
|
||||
wait_vretrace (void)
|
||||
{
|
||||
/* Wait until there is a vertical retrace. */
|
||||
while (! (grub_inb (INPUT_STATUS1_REGISTER) & INPUT_STATUS1_VERTR_BIT));
|
||||
}
|
||||
|
||||
/* Get Map Mask Register. */
|
||||
static unsigned char
|
||||
get_map_mask (void)
|
||||
{
|
||||
unsigned char old_addr;
|
||||
unsigned char old_data;
|
||||
|
||||
old_addr = grub_inb (SEQUENCER_ADDR_PORT);
|
||||
grub_outb (MAP_MASK_REGISTER, SEQUENCER_ADDR_PORT);
|
||||
|
||||
old_data = grub_inb (SEQUENCER_DATA_PORT);
|
||||
|
||||
grub_outb (old_addr, SEQUENCER_ADDR_PORT);
|
||||
|
||||
return old_data;
|
||||
}
|
||||
|
||||
/* Set Map Mask Register. */
|
||||
static void
|
||||
set_map_mask (unsigned char mask)
|
||||
{
|
||||
unsigned char old_addr;
|
||||
|
||||
old_addr = grub_inb (SEQUENCER_ADDR_PORT);
|
||||
grub_outb (MAP_MASK_REGISTER, SEQUENCER_ADDR_PORT);
|
||||
|
||||
grub_outb (mask, SEQUENCER_DATA_PORT);
|
||||
|
||||
grub_outb (old_addr, SEQUENCER_ADDR_PORT);
|
||||
}
|
||||
|
||||
#if 0
|
||||
/* Set Read Map Register. */
|
||||
static void
|
||||
set_read_map (unsigned char map)
|
||||
{
|
||||
unsigned char old_addr;
|
||||
|
||||
old_addr = grub_inb (GRAPHICS_ADDR_PORT);
|
||||
|
||||
grub_outb (READ_MAP_REGISTER, GRAPHICS_ADDR_PORT);
|
||||
grub_outb (map, GRAPHICS_DATA_PORT);
|
||||
|
||||
grub_outb (old_addr, GRAPHICS_ADDR_PORT);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Set start address. */
|
||||
static void
|
||||
set_start_address (unsigned int start)
|
||||
{
|
||||
unsigned char old_addr;
|
||||
|
||||
old_addr = grub_inb (CRTC_ADDR_PORT);
|
||||
|
||||
grub_outb (START_ADDR_LOW_REGISTER, CRTC_ADDR_PORT);
|
||||
grub_outb (start & 0xFF, CRTC_DATA_PORT);
|
||||
|
||||
grub_outb (START_ADDR_HIGH_REGISTER, CRTC_ADDR_PORT);
|
||||
grub_outb (start >> 8, CRTC_DATA_PORT);
|
||||
|
||||
grub_outb (old_addr, CRTC_ADDR_PORT);
|
||||
}
|
||||
|
||||
static int setup = 0;
|
||||
static int is_target = 0;
|
||||
|
||||
static grub_err_t
|
||||
grub_video_vga_init (void)
|
||||
{
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
grub_video_vga_setup (unsigned int width, unsigned int height,
|
||||
unsigned int mode_type, unsigned int mode_mask)
|
||||
{
|
||||
grub_err_t err;
|
||||
|
||||
if ((width && width != VGA_WIDTH) || (height && height != VGA_HEIGHT))
|
||||
return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "no matching mode found");
|
||||
|
||||
framebuffer.temporary_buffer = grub_malloc (VGA_HEIGHT * VGA_WIDTH);
|
||||
framebuffer.front_page = 0;
|
||||
framebuffer.back_page = 0;
|
||||
if (!framebuffer.temporary_buffer)
|
||||
return grub_errno;
|
||||
|
||||
saved_map_mask = get_map_mask ();
|
||||
|
||||
text_mode = grub_vga_set_mode (0x10);
|
||||
setup = 1;
|
||||
set_map_mask (0x0f);
|
||||
set_start_address (PAGE_OFFSET (framebuffer.front_page));
|
||||
|
||||
framebuffer.mode_info.width = VGA_WIDTH;
|
||||
framebuffer.mode_info.height = VGA_HEIGHT;
|
||||
|
||||
framebuffer.mode_info.mode_type = GRUB_VIDEO_MODE_TYPE_INDEX_COLOR;
|
||||
|
||||
if (grub_video_check_mode_flag (mode_type, mode_mask,
|
||||
GRUB_VIDEO_MODE_TYPE_DOUBLE_BUFFERED, 1))
|
||||
{
|
||||
framebuffer.back_page = 1;
|
||||
framebuffer.mode_info.mode_type |= GRUB_VIDEO_MODE_TYPE_DOUBLE_BUFFERED;
|
||||
}
|
||||
|
||||
framebuffer.mode_info.bpp = 8;
|
||||
framebuffer.mode_info.bytes_per_pixel = 1;
|
||||
framebuffer.mode_info.pitch = VGA_WIDTH;
|
||||
framebuffer.mode_info.number_of_colors = 16;
|
||||
framebuffer.mode_info.red_mask_size = 0;
|
||||
framebuffer.mode_info.red_field_pos = 0;
|
||||
framebuffer.mode_info.green_mask_size = 0;
|
||||
framebuffer.mode_info.green_field_pos = 0;
|
||||
framebuffer.mode_info.blue_mask_size = 0;
|
||||
framebuffer.mode_info.blue_field_pos = 0;
|
||||
framebuffer.mode_info.reserved_mask_size = 0;
|
||||
framebuffer.mode_info.reserved_field_pos = 0;
|
||||
|
||||
framebuffer.mode_info.blit_format
|
||||
= grub_video_get_blit_format (&framebuffer.mode_info);
|
||||
|
||||
err = grub_video_fb_create_render_target_from_pointer (&framebuffer.render_target,
|
||||
&framebuffer.mode_info,
|
||||
framebuffer.temporary_buffer);
|
||||
|
||||
if (err)
|
||||
{
|
||||
grub_dprintf ("video", "Couldn't create FB target\n");
|
||||
return err;
|
||||
}
|
||||
|
||||
is_target = 1;
|
||||
err = grub_video_fb_set_active_render_target (framebuffer.render_target);
|
||||
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = grub_video_fb_set_palette (0, GRUB_VIDEO_FBSTD_NUMCOLORS,
|
||||
grub_video_fbstd_colors);
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
grub_video_vga_fini (void)
|
||||
{
|
||||
if (setup)
|
||||
{
|
||||
set_map_mask (saved_map_mask);
|
||||
grub_vga_set_mode (text_mode);
|
||||
}
|
||||
setup = 0;
|
||||
grub_free (framebuffer.temporary_buffer);
|
||||
framebuffer.temporary_buffer = 0;
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
static inline void
|
||||
update_target (void)
|
||||
{
|
||||
int plane;
|
||||
|
||||
if (!is_target)
|
||||
return;
|
||||
|
||||
for (plane = 0x01; plane <= 0x08; plane <<= 1)
|
||||
{
|
||||
grub_uint8_t *ptr;
|
||||
volatile grub_uint8_t *ptr2;
|
||||
unsigned cbyte = 0;
|
||||
int shift = 7;
|
||||
set_map_mask (plane);
|
||||
for (ptr = framebuffer.temporary_buffer,
|
||||
ptr2 = VGA_MEM + PAGE_OFFSET (framebuffer.back_page);
|
||||
ptr < framebuffer.temporary_buffer + VGA_WIDTH * VGA_HEIGHT; ptr++)
|
||||
{
|
||||
cbyte |= (!!(plane & *ptr)) << shift;
|
||||
shift--;
|
||||
if (shift == -1)
|
||||
{
|
||||
*ptr2++ = cbyte;
|
||||
shift = 7;
|
||||
cbyte = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
grub_video_vga_blit_bitmap (struct grub_video_bitmap *bitmap,
|
||||
enum grub_video_blit_operators oper, int x, int y,
|
||||
int offset_x, int offset_y,
|
||||
unsigned int width, unsigned int height)
|
||||
{
|
||||
grub_err_t ret;
|
||||
ret = grub_video_fb_blit_bitmap (bitmap, oper, x, y, offset_x, offset_y,
|
||||
width, height);
|
||||
update_target ();
|
||||
return ret;
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
grub_video_vga_blit_render_target (struct grub_video_fbrender_target *source,
|
||||
enum grub_video_blit_operators oper,
|
||||
int x, int y, int offset_x, int offset_y,
|
||||
unsigned int width, unsigned int height)
|
||||
{
|
||||
grub_err_t ret;
|
||||
|
||||
ret = grub_video_fb_blit_render_target (source, oper, x, y,
|
||||
offset_x, offset_y, width, height);
|
||||
update_target ();
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
grub_video_vga_set_active_render_target (struct grub_video_render_target *target)
|
||||
{
|
||||
if (target == GRUB_VIDEO_RENDER_TARGET_DISPLAY)
|
||||
{
|
||||
is_target = 1;
|
||||
target = framebuffer.render_target;
|
||||
}
|
||||
else
|
||||
is_target = 0;
|
||||
|
||||
return grub_video_fb_set_active_render_target (target);
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
grub_video_vga_get_active_render_target (struct grub_video_render_target **target)
|
||||
{
|
||||
grub_err_t err;
|
||||
err = grub_video_fb_get_active_render_target (target);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if (*target == framebuffer.render_target)
|
||||
*target = GRUB_VIDEO_RENDER_TARGET_DISPLAY;
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
grub_video_vga_swap_buffers (void)
|
||||
{
|
||||
if (!(framebuffer.mode_info.mode_type & GRUB_VIDEO_MODE_TYPE_DOUBLE_BUFFERED))
|
||||
return GRUB_ERR_NONE;
|
||||
|
||||
/* Activate the other page. */
|
||||
framebuffer.front_page = !framebuffer.front_page;
|
||||
framebuffer.back_page = !framebuffer.back_page;
|
||||
wait_vretrace ();
|
||||
set_start_address (PAGE_OFFSET (framebuffer.front_page));
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
grub_video_vga_set_palette (unsigned int start __attribute__ ((unused)),
|
||||
unsigned int count __attribute__ ((unused)),
|
||||
struct grub_video_palette_data *palette_data __attribute__ ((unused)))
|
||||
{
|
||||
return grub_error (GRUB_ERR_IO, "can't change palette");
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
grub_video_vga_get_info_and_fini (struct grub_video_mode_info *mode_info,
|
||||
void **framebuf)
|
||||
{
|
||||
set_map_mask (0xf);
|
||||
|
||||
grub_memcpy (mode_info, &(framebuffer.mode_info), sizeof (*mode_info));
|
||||
mode_info->bpp = 1;
|
||||
mode_info->bytes_per_pixel = 0;
|
||||
mode_info->pitch = VGA_WIDTH / 8;
|
||||
mode_info->number_of_colors = 1;
|
||||
|
||||
mode_info->bg_red = 0;
|
||||
mode_info->bg_green = 0;
|
||||
mode_info->bg_blue = 0;
|
||||
mode_info->bg_alpha = 255;
|
||||
|
||||
mode_info->fg_red = 255;
|
||||
mode_info->fg_green = 255;
|
||||
mode_info->fg_blue = 255;
|
||||
mode_info->fg_alpha = 255;
|
||||
|
||||
*framebuf = VGA_MEM + PAGE_OFFSET (framebuffer.front_page);
|
||||
|
||||
grub_video_fb_fini ();
|
||||
grub_free (framebuffer.temporary_buffer);
|
||||
framebuffer.temporary_buffer = 0;
|
||||
setup = 0;
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
|
||||
static struct grub_video_adapter grub_video_vga_adapter =
|
||||
{
|
||||
.name = "VGA Video Driver",
|
||||
.id = GRUB_VIDEO_DRIVER_VGA,
|
||||
|
||||
.init = grub_video_vga_init,
|
||||
.fini = grub_video_vga_fini,
|
||||
.setup = grub_video_vga_setup,
|
||||
.get_info = grub_video_fb_get_info,
|
||||
.get_info_and_fini = grub_video_vga_get_info_and_fini,
|
||||
.set_palette = grub_video_vga_set_palette,
|
||||
.get_palette = grub_video_fb_get_palette,
|
||||
.set_viewport = grub_video_fb_set_viewport,
|
||||
.get_viewport = grub_video_fb_get_viewport,
|
||||
.map_color = grub_video_fb_map_color,
|
||||
.map_rgb = grub_video_fb_map_rgb,
|
||||
.map_rgba = grub_video_fb_map_rgba,
|
||||
.unmap_color = grub_video_fb_unmap_color,
|
||||
.fill_rect = grub_video_fb_fill_rect,
|
||||
.blit_bitmap = grub_video_vga_blit_bitmap,
|
||||
.blit_render_target = grub_video_vga_blit_render_target,
|
||||
.scroll = grub_video_fb_scroll,
|
||||
.swap_buffers = grub_video_vga_swap_buffers,
|
||||
.create_render_target = grub_video_fb_create_render_target,
|
||||
.delete_render_target = grub_video_fb_delete_render_target,
|
||||
.set_active_render_target = grub_video_vga_set_active_render_target,
|
||||
.get_active_render_target = grub_video_vga_get_active_render_target,
|
||||
|
||||
.next = 0
|
||||
};
|
||||
|
||||
GRUB_MOD_INIT(vga)
|
||||
{
|
||||
grub_video_register (&grub_video_vga_adapter);
|
||||
}
|
||||
|
||||
GRUB_MOD_FINI(vga)
|
||||
{
|
||||
grub_video_unregister (&grub_video_vga_adapter);
|
||||
}
|
Loading…
Reference in a new issue