diff options
Diffstat (limited to 'mdk-stage1')
521 files changed, 8386 insertions, 42369 deletions
diff --git a/mdk-stage1/.cvsignore b/mdk-stage1/.cvsignore deleted file mode 100644 index 55cc430b7..000000000 --- a/mdk-stage1/.cvsignore +++ /dev/null @@ -1,7 +0,0 @@ -init -stage1-full -stage1-cdrom -stage1-disk -stage1-network -debug.log -.depend diff --git a/mdk-stage1/.gitignore b/mdk-stage1/.gitignore new file mode 100644 index 000000000..fe2469cea --- /dev/null +++ b/mdk-stage1/.gitignore @@ -0,0 +1,13 @@ +*.o +dhcp-client +init +probe-modules +rescue-gui +stage1 +pci-resource/pci-ids.h +usb-resource/usb-ids.h +pcmcia-resource/pcmcia-ids.h +pcmcia/lex_config.c +pcmcia/libpcmcia.a +pcmcia/yacc_config.c +pcmcia/yacc_config.h diff --git a/mdk-stage1/Makefile b/mdk-stage1/Makefile index d6135bc8b..1d66d22fe 100644 --- a/mdk-stage1/Makefile +++ b/mdk-stage1/Makefile @@ -2,11 +2,9 @@ # # mdk-stage1 - the program that will load second-stage install # - # $Id$ + # Pixel (pixel) (mostly done by Guillaume Cottenceau) # - # Guillaume Cottenceau (gc@mandrakesoft.com) - # - # Copyright 2000 MandrakeSoft + # Copyright 2000-2004 Mandriva # # This software may be freely redistributed under the terms of the GNU # public license. @@ -14,182 +12,166 @@ # 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. + +VERSION=2.62 +PRODUCT=drakx-installer-binaries + # # Portions from Erik Troan (ewt@redhat.com) Copyright 1996 Red Hat Software # - #***************************************************************************** -VERSION = 8.0beta top_dir = . include $(top_dir)/Makefile.common +include $(top_dir)/../Makefile.config +ARCHDIR=$(ARCH) +ifeq (i386, $(ARCH)) +ARCHDIR=i686 +endif +DEFS = -DDISTRIB_NAME=\"$(DISTRIB_NAME)\" -DDISTRIB_VERSION=\"$(DISTRIB_VERSION)\" -DDISTRIB_TYPE=\"$(DISTRIB_TYPE)\" -DDISTRIB_DESCR=\"$(DISTRIB_DESCR)\" $(ADDITIONAL_DEFS) -D_FILE_OFFSET_BITS=64 -DARCH=\"$(ARCHDIR)\" -DCONFIG_USE_ZLIB -CFLAGS = -Os -pipe -Wall -Werror -fomit-frame-pointer - -DEFS = -DVERSION=\"$(VERSION)\" - -COMPILE = $(CC) $(DEFS) $(CFLAGS) - +COMPILE = $(CC) $(DEFS) $(CFLAGS) -Wno-error=format-truncation - #- stage1 "loader" -ifeq (i386, $(ARCH)) -INITSRC = minilibc.c init.c -INIT_DEFS = -DINIT_HEADERS=\"minilibc.h\" -else INITSRC = init.c -INIT_DEFS = -DINIT_HEADERS=\"init-libc-headers.h\" $(DIETLIBC_INCLUDES) -endif -INITOBJS = $(subst .c,.o,$(INITSRC)) +STAGE1_DEFS=-DDISABLE_KA + +INITOBJS = $(INITSRC:.c=.o) #- frontends NEWT_FRONTEND_SRC = newt-frontend.c -NEWT_FRONTEND_LIBS = /usr/lib/libnewt.a /usr/lib/libslang.a +NEWT_FRONTEND_LIBS = -lnewt -lslang STDIO_FRONTEND_SRC = stdio-frontend.c STDIO_FRONTEND_LIBS = -WSLIB_FRONTEND_SRC = wslib-frontend.c -WSLIB_FRONTEND_LIBS = /usr/lib/libwslib.a - - -FRONTEND_OBJS = $(subst .c,.o,$($(F)_FRONTEND_SRC)) -FRONTEND_LIBS = $($(F)_FRONTEND_LIBS) +FRONTEND_OBJS = $($(F)_FRONTEND_SRC:.c=.o) -FRONTEND_LINK = $(FRONTEND_OBJS) $(FRONTEND_LIBS) -MEDIAS_FRONTEND_LINK = $(FRONTEND_LINK) - -ifeq (DIETLIBC, $(L)) -ifeq (NEWT, $(F)) -MEDIAS_FRONTEND_LINK = $(subst .c,.o,$(STDIO_FRONTEND_SRC)) $(STDIO_FRONTEND_LIBS) -else -MEDIAS_FRONTEND_LINK = $(FRONTEND_LINK) -endif -endif - -ifeq (i386, $(ARCH)) -INSMOD = insmod-busybox -else -INSMOD = insmod-modutils -endif - -GLIBC_STAGE1_OWN_LIBS = $(INSMOD)/libinsmod.a mar/libmar.a bzlib/libbzlib.a -DIETLIBC_STAGE1_OWN_LIBS = $(INSMOD)/libinsmod-DIET.a mar/libmar-DIET.a bzlib/libbzlib-DIET.a -STAGE1_OWN_LIBS = $($(L)_STAGE1_OWN_LIBS) +FRONTEND_LINK = $(FRONTEND_OBJS) $($(F)_FRONTEND_LIBS) +STAGE1_OWN_LIBS = -lz -lldetect -lkmod -lpci -llzma -lsysfs -STAGE1_NETWORK_LIBS = /usr/lib/libresolv.a #- stage1 itself -STAGE1SRC = stage1.c log.c tools.c modules.c probing.c mount.c automatic.c +STAGE1SRC = stage1.c log.c utils.c params.c tools.c modules.c probing.c mount.c automatic.c frontend-common.c lomount.c thirdparty.c zlibsupport.c CDROMSRC = cdrom.c -DISKSRC = disk.c lomount.c -NETWORKSRC = network.c dns.c nfsmount.c dhcp.c url.c +DISKSRC = disk.c directory.c partition.c +NETWORKSRC = network.c dhcp.c url.c dns.c adsl.c directory.c wireless.c +#KASRC = ka.c -ALLSRC = $(INITSRC) $(STAGE1SRC) $(CDROMSRC) $(DISKSRC) $(NETWORKSRC) +# use sort to remove duplicates +STAGE1_ALLSRC = $(sort $(STAGE1SRC) $(CDROMSRC) $(DISKSRC) $(NETWORKSRC) $(KASRC)) +ALLSRC = $(INITSRC) $(STAGE1_ALLSRC) -STAGE1OBJS = $(subst .c,.o,$(STAGE1SRC) $(CDROMSRC) $(DISKSRC) $(NETWORKSRC)) - -STAGE1OBJS-CDROM = $(subst .c,-CDROM.o,$(STAGE1SRC) $(CDROMSRC)) - -CDROM_DEFS = -DDISABLE_DISK -DDISABLE_NETWORK - - -STAGE1OBJS-DISK = $(subst .c,-DISK.o,$(STAGE1SRC) $(DISKSRC)) - -DISK_DEFS = -DDISABLE_CDROM -DDISABLE_NETWORK +CDROM_DEFS = -DSPAWN_SHELL -DDISABLE_DISK -DDISABLE_NETWORK STAGE1OBJS-NETWORK = $(subst .c,-NETWORK.o,$(STAGE1SRC) $(NETWORKSRC)) -NETWORK_DEFS = -DDISABLE_CDROM -DDISABLE_DISK +NETWORK_DEFS = -DSPAWN_SHELL -DDISABLE_CDROM -DDISABLE_DISK -DDISABLE_KA -ifeq (i386, $(ARCH)) -LDFLAGS_INIT = -static -nostdlib /usr/lib/crt1.o -else -LDFLAGS_INIT = $(DIETLIBC_LDFLAGS_STAGE1) -INIT_LIBC = $(DIETLIBC_LIBC) -endif +STAGE1OBJS-NETWORK-STANDALONE = $(subst .c,-NETWORK-STANDALONE.o,$(STAGE1SRC) $(NETWORKSRC)) +NETWORK_STANDALONE_DEFS = -DDISABLE_CDROM -DDISABLE_DISK -DENABLE_NETWORK_STANDALONE -DDISABLE_KA -BINS = init stage1-full -ifeq (i386, $(ARCH)) -BINS += stage1-cdrom stage1-disk stage1-network -endif +STAGE1OBJS-FULL = $(STAGE1_ALLSRC:.c=-FULL.o) +BINS = init stage1 dhcp-client rescue-gui probe-modules -DIRS = dietlibc mar pci-resource bzlib $(INSMOD) -ifeq (i386,$(ARCH)) -DIRS += pcmcia -endif - - -ifeq (i386,$(ARCH)) +OTHERS = pci-ids.h usb-ids.h +ifneq (,$(filter $(ARCH),i386 x86_64)) +OTHERS += pcmcia-ids.h pcmcia PCMCIA_LIB = pcmcia/libpcmcia.a PCMCIA_DEFS = -DENABLE_PCMCIA endif +USB_DEFS_GEN = -DENABLE_USB +USB_DEFS = -DENABLE_USB -DDISABLE_PCIADAPTERS -all: dirs $(BINS) +all: $(OTHERS) $(BINS) -dirs: - @for n in . $(DIRS); do \ - [ "$$n" = "." ] || make -C $$n ;\ - done +pci-ids.h: /usr/share/ldetect-lst/pcitable.gz update-pci-ids.pl + perl update-pci-ids.pl > $@ || { rm -f $@; exit 1; } -init: $(INITOBJS) $(INIT_LIBC) - $(CC) $(LDFLAGS_INIT) -o $@ $^ - $(STRIPCMD) $@ +usb-ids.h: /usr/share/ldetect-lst/usbtable.gz update-usb-ids.pl + perl update-usb-ids.pl > $@ || rm -f $@ -stage1-cdrom: $(STAGE1OBJS-CDROM) $(STAGE1_OWN_LIBS) $(STAGE1_OWN_LIBS) $(MEDIAS_FRONTEND_LINK) $(STAGE1_LIBC) - $(CC) $(LDFLAGS_STAGE1) -o $@ $^ - $(STRIPCMD) $@ +pcmcia-ids.h: update-pcmcia-ids.pl + perl update-pcmcia-ids.pl > $@ || { rm -f $@; exit 1; } + +pcmcia/libpcmcia.a: + make -j -C pcmcia -stage1-disk: $(STAGE1OBJS-DISK) $(STAGE1_OWN_LIBS) $(MEDIAS_FRONTEND_LINK) $(STAGE1_LIBC) - $(CC) $(LDFLAGS_STAGE1) -o $@ $^ +probing.c: pci-ids.h + +init: $(INITOBJS) + $(CC) $(LDFLAGS) -o $@ $^ $(STRIPCMD) $@ -stage1-network: $(STAGE1OBJS-NETWORK) $(GLIBC_STAGE1_OWN_LIBS) $(STAGE1_NETWORK_LIBS) $(FRONTEND_LINK) - $(CC) $(GLIBC_LDFLAGS_STAGE1) -o $@ $^ +stage1: $(STAGE1OBJS-FULL) $(STAGE1_OWN_LIBS) $(FRONTEND_LINK) $(PCMCIA_LIB) + $(CC) $(LDFLAGS) -o $@ $^ $(STRIPCMD) $@ -stage1-full: $(STAGE1OBJS) $(GLIBC_STAGE1_OWN_LIBS) $(STAGE1_NETWORK_LIBS) $(FRONTEND_LINK) $(PCMCIA_LIB) - $(CC) $(GLIBC_LDFLAGS_STAGE1) -o $@ $^ +dhcp-client: $(STAGE1OBJS-NETWORK-STANDALONE) $(STAGE1_OWN_LIBS) $(FRONTEND_LINK) + $(CC) $(LDFLAGS) -o $@ $^ $(STRIPCMD) $@ -$(STAGE1OBJS-CDROM): %-CDROM.o: %.c .depend - $(COMPILE) $(INCLUDES) $(CDROM_DEFS) -c $< -o $@ +$(INITOBJS): %.o: %.c + $(COMPILE) -c $< -$(STAGE1OBJS-DISK): %-DISK.o: %.c .depend - $(COMPILE) $(INCLUDES) $(DISK_DEFS) -c $< -o $@ +$(STAGE1OBJS-NETWORK): %-NETWORK.o: %.c + $(COMPILE) $(INCLUDES) $(NETWORK_DEFS) $(PCMCIA_DEFS) $(USB_DEFS_GEN) -DENABLE_ADDITIONAL_MODULES -c $< -o $@ -$(STAGE1OBJS-NETWORK): %-NETWORK.o: %.c .depend - $(COMPILE) $(GLIBC_INCLUDES) $(NETWORK_DEFS) -c $< -o $@ +$(STAGE1OBJS-NETWORK-STANDALONE): %-NETWORK-STANDALONE.o: %.c + $(COMPILE) $(INCLUDES) $(NETWORK_STANDALONE_DEFS) $(USB_DEFS_GEN) -c $< -o $@ -$(INITOBJS): %.o: %.c - $(COMPILE) $(INIT_DEFS) -c $< +$(STAGE1OBJS-FULL): %-FULL.o: %.c + $(COMPILE) $(INCLUDES) -DSPAWN_SHELL $(USB_DEFS_GEN) $(PCMCIA_DEFS) $(STAGE1_DEFS) -c $< -o $@ -.c.o: .depend - $(COMPILE) $(GLIBC_INCLUDES) $(PCMCIA_DEFS) -c $< +.c.o: + $(COMPILE) $(INCLUDES) -c $< -clean: +clean: localclean @for n in $(DIRS); do \ (cd $$n; make clean) \ done - rm -f *.o .depend *.rdz *.img $(BINS) + +localclean: + rm -f *.o .depend *.rdz *.img pci-ids.h pcmcia-ids.h usb-ids.h $(BINS) + + +rescue-gui: rescue-gui.o frontend-common.o params.o utils.o log.o automatic.o $(FRONTEND_LINK) + $(CC) $(LDFLAGS) -o $@ $^ + $(STRIPCMD) $@ + +probe-modules: probe-modules.o probing-FULL.o modules-FULL.o params-FULL.o utils-FULL.o log-FULL.o automatic-FULL.o frontend-common-FULL.o stdio-frontend.o zlibsupport-FULL.o $(STAGE1_OWN_LIBS) $(PCMCIA_LIB) + $(CC) $(LDFLAGS) -o $@ $^ + $(STRIPCMD) $@ + +dist: tar +tar: + rm -rf $(PRODUCT)*.tar* $(PRODUCT)-$(VERSION) + @cd ..; git archive --prefix=$(PRODUCT)-$(VERSION)/ HEAD mdk-stage1 kernel Makefile.config | xz >mdk-stage1/$(PRODUCT)-$(VERSION).tar.xz; + $(info $(PRODUCT)-$(VERSION).tar.xz is ready) .depend: - $(CPP) $(CFLAGS) -DHAVE_CONFIG_H -M $(ALLSRC) > .depend + $(CPP) $(CFLAGS) -M $(ALLSRC) > .depend ifeq (.depend,$(wildcard .depend)) include .depend -endif +endif + + +*-NETWORK.o: %-NETWORK.o: %.o + +*-FULL.o: %-FULL.o: %.o + diff --git a/mdk-stage1/Makefile.common b/mdk-stage1/Makefile.common index ec8441978..f2c70273a 100644 --- a/mdk-stage1/Makefile.common +++ b/mdk-stage1/Makefile.common @@ -1,9 +1,9 @@ # -*- makefile -*- #****************************************************************************** # - # Guillaume Cottenceau (gc@mandrakesoft.com) + # Guillaume Cottenceau (gc) # - # Copyright 2000 MandrakeSoft + # Copyright 2000 Mandriva # # This software may be freely redistributed under the terms of the GNU # public license. @@ -15,28 +15,33 @@ #***************************************************************************** ARCH := $(patsubst i%86,i386,$(shell uname -m)) -ARCH := $(patsubst sparc%,sparc,$(ARCH)) +ARCH := $(ARCH:arm%=arm) - #- default lib is dietlibc (honoured by main Makefile whenever possible) -L = DIETLIBC -# L = GLIBC +# DEBUG = 1 #- default frontend is newt (honoured by main Makefile whenever possible) +ifdef DEBUG +F = STDIO +else F = NEWT -# F = STDIO +endif +ifdef DEBUG +OPTFLAGS = -g -DDEBUG +else +OPTFLAGS = -Os +endif -DIETLIBC_INCLUDES = -I$(top_dir)/dietlibc/include -I. -GLIBC_INCLUDES = -I. -INCLUDES = $($(L)_INCLUDES) +#- flags used by all stuff +CFLAGS = $(OPTFLAGS) -pipe -Wall -fomit-frame-pointer -fno-strict-aliasing -Werror -GLIBC_LDFLAGS_STAGE1 = -static -DIETLIBC_LDFLAGS_STAGE1 = -nostdlib $(top_dir)/dietlibc/start.o -LDFLAGS_STAGE1 = $($(L)_LDFLAGS_STAGE1) +INCLUDES = -I. -GLIBC_LIBC = -DIETLIBC_LIBC = $(top_dir)/dietlibc/dietlibc.a -STAGE1_LIBC = $($(L)_LIBC) +LDFLAGS = +ifdef DEBUG +STRIPCMD = echo not stripping +else STRIPCMD = strip -R .note -R .comment +endif diff --git a/mdk-stage1/NEWS b/mdk-stage1/NEWS new file mode 100644 index 000000000..714ea3129 --- /dev/null +++ b/mdk-stage1/NEWS @@ -0,0 +1,572 @@ +- Replace i586 with i686 in files + +2.62 + +- Sync list_modules with kernel 6.4 + +2.61 + +- Sync with kernel 6.0 +- Increase MEM_LIMIT_* to match current stage2 size +- Fix the detection of available memory +- Fix a build failure with -Werror=address + +2.60 + +- Sync with kernel 5.17 +- Sync with kernel 5.18 +- Sync with kernel 5.19 +- Sync with kernel 6.0 +- Sync with kernel 6.1 + +2.59 + +- use 'nolock' option for NFS + +2.58 + +- fix 'disk' method after kernel-5.15 breakage + +2.57 + +- http server: allow to specify a port different than default "80" (mga#28367) + +2.56 + +- load exfat module to mount exfat (mga#28371) + +2.55 + +- recognize rtw89_pci HID driver + +2.53 + +- recognize amd_sfh HID driver + +2.52 + +- recognize more rtw88_* +- sync with kernel 5.10 + +2.51 + +- configure wpa_supplicant to try both nl80211 and wext interfaces + o some old wireless driver modules may only support wext +- improve help for entering wireless keys/passphrases + o note that ASCII strings can now be used for WEP keys (mga#21042) + +2.50 + +- add support for WPA/WPA2 (mga#9541) + +2.49 + +- sync with kernel 5.9 + +2.48 + +- sync with kernel 5.8 + +2.47 + +- sync with kernel 5.6/5.7 + +2.46 + +- make NVME code really generic and reuse if for most other disks + +2.45 + +- fix NVME code to work for disks with no vendor + +2.44 + +- add support for NVME disks + +2.43 + +- sync with kernel 5.5 + +2.42 + +- sync with kernel 5.4 + +2.41 + +- sync with kernel 5.3 + +2.40 + +- recognize 8821ce (mga#24605) + +2.39 + +- add AMD PCIe MP2 I2C detection + +2.38 + +- sync with kernel 5.1 + +2.37 + +- sync with kernel 5.0 + +2.36 + +- suppress mount error messages when probing for media (mga#24142) +- better gcc8 workarounds + +2.35 + +- fix compiling with gcc8 +- compile with -Wno-error=format-truncation for now + +2.34 + +- mounting: + o let libblk guess the right fs type rather than manually trying a long list + of potential fses + o use regular mount tool rather than manual system calls + o use regular mount tool for NFS too (support NFSv4, ...) + +2.33 + +- advertize "ext4" rather than "ext2" +- check for builtin modules in /sys/fs too (eg: ext4) +- support auto-install with "method:disk,disk:xxx,part:xxxY,dir:zzz" + +2.32 + +- list_modules: don't include vboxvideo (mga#23467) + +2.31 + +- sync with kernel 4.1[89] + +2.30 + +- add missing smartpqi driver (mga#23305) + +2.29 +- add missing Mellanox drivers (mga#23263) + +2.28 +- sync with kernel 4.1[5-7] + +2.27 +- further sync with kernel 4.14 + +2.26 +- sync with kernel 4.14 + +2.25 +- fix build with gcc7 + +2.24 +- recognize 8812au (mga#21043) + +2.23 +- recognize new kernel-4.8 drivers + +2.22 +- recognize new kernel-4.9 drivers + +2.21 +- recognize new kernel-4.7 drivers + +2.20 +- fix description of network interfaces (mga#15638) + +2.19 +- recognize some missing wireless drivers (mga#16768) + +2.18 +- recognize new kernel-4.6 drivers + +2.17 +- recognize new kernel-4.4 drivers + +2.16 +- recognize new kernel-4.3 drivers + +2.15 +- recognize new kernel-4.1 drivers + +2.14 +- network.c: fix -Werror=logical-not-parentheses + +2.13 +- mount again debugfs for ldetect (mga#14435) + (regression in 1.83) + +2.12 +- recognize new kernel-3.19 drivers + +2.11 +- recognize new kernel-3.18 drivers (mga#14799) + +2.10 +- include new 3.18 USB host drivers (mga#14799) + +2.9 +- glibc 2.20 wants _DEFAULT_SOURCE instead of _BSD_SOURCE + +2.8 +- recognize new kernel-3.17 drivers + +2.7 +- recognize hyper-v network card + +2.6 +- recognize new kernel-3.16 drivers + +2.5 +- stop creating /dev entries now that we use udev + +2.4 +- fix building with "make -j24" + +2.3 +- recognize new kernel-3.15 drivers + +2.2 +- drop support for supermount (dead since 2007) +- recognize new kernel-3.14 drivers + +2.1 +- drop support for SPARC +- support dynamic linking only +- use getaddrinfo() with glibc too now that use the dynamic library + +2.0 +- kernel modules and firmware is needed during stage2, so move and symlink + (symlinks are only for if you umount state2 /usr and want a still working initrd) + mga#11600 mga#11601 + +1.83 +- do initrd symlinking in 'init' rather than 'stage1' (stage1 is now run earlier) +- build init and stage1 as a shared library (due to bugs in directory handling + in dietlibc as exposed in libkmod but also because glibc is already include in + dracut) + +1.82 +- detect new kernel-3.12 modules + +1.81 +- sync with kernel-3.11 (might fix mga#11377) + +1.80 +- include latest list_modules.pl + (might fix mga#11377) + +1.79 +- fix compiling with gcc-4.8 + +1.78 +- probe virtual drivers too (mga#9546) + (install from Xen hd not supported yet) + +1.77 +- use kmod for module loading (mga#9242, based on Pok works @mdv) + +1.76 +- revert patch introduced in r7542 + +1.75 +- fix loading modules with "-" in their names (mga#9242) + +1.74.1 +- update list_modules for xen dom0 and virtio support (#9242) + +1.74 +- fix unitialized memory screwing up dialog input (pok, mdv, mga#8729) +- kill bootsplash support (we drop bootsplash in kernel in 2008) +- kill firmware loader now that firmware are loaded by the kernel + +1.73 +- add firmware loader written in C (based on hotplug2) (mga#6323) + +1.72 +- fix URL passed to stage2 when user didn't provide the arch in the + install path (mga#6823) +- retry with FTP instead of HTTP when there's no proxy and user didn't + provided the architecture in the URL + +1.71 +- silent hid_generic loading + +1.70 +- mount /dev as devtmpfs (pok, mdv) +- rely on /sys being created in images + +1.69 +- do not try to mount /proc/bus/usb +- load hid-generic + +1.68 +- mount /sys/kernel/debug (needed for new ldetect) + +1.67 +- make sure nurses get initialized in UTF-8 (mga#4894) +- revert to "linux" terminfo + +1.66 +- do not advice long dead pcmcia.img & network.img images (mga#5466) +- first attempt at supporting XenBlk discs +- hide "KA server" option (mga#5944) +- switch from gethostbyname() to getaddrinfo() (mga#4056) +- switch from gethostbyaddr() to getnameinfo() +- use system libraries for newtw, slang & sysfs (mdv) + +1.65 +- load btrfs module to mount btrfs +- try mounting as btrfs + +1.64 +- default to "screen" instead of "linux" terminfo (mga#4894) + +1.63 +- do not try to load obsolete sqlzma & squashfs_lzma kernel modules +- recognize c67x00, imx21-hcd, fhci, isp1362-hcd, oxu210hp-hcd & renesas-usbhs + USB host drivers (mga#4905) + +1.62 +- fix segfaulting when ISO directory is not valid (mga#4592) + +1.61 +- fix building with newer dietlibc/zlib + +1.60 +- add support for virtio discs + +1.59 +- try to use arch-prefixed location for FTP & HTTP installs (mga#2578) + +1.58 +- add support for kernel compressed as XZ + +1.57 +- fix linking with new kmod + +1.56 +- kill 10 years old snapshot of pppd & pppoe + (now using upstream pppd & pppoe) +- link with libkmod instead of libmodprobe + +1.55: +- pcmcia: kill obsolete test for 2.2 kernel +- sync with kernel-3.2.0-0.rc7.1.mga2 for updated list_modules.pm + +1.54: +- fix retrieving mirrorlist, broken in 1.53 +- fix build with Werror + +1.53: +- display distro name in mirror list too (#191) + +1.52: +- fix build with gcc-4.6.2 + * fixes -Werror=unused-but-set-variable + +1.51: +- sync with kernel-3.1.0-1.mga2 + * add hid devices: + hid-keytouch, hid-uclogic + * add sas/raid driver: + isci + * add sound devices: + snd-lola, snd-firewire-speakers snd-isight, snd-usb-6fire + * add usb/storage: + ums-eneub6250, ums-realtek + * add wireless drivers: + brcmsmac, rtl8187se, rtusb, rtl8192se, rtl8192cu, rtl8192de + +1.50: +- do not attempt to perform ISA probe for PCMCIA controller on x86_64 + as it fails with kvm_amd (#1156) +- add ums-* (USB mass storage) modules in disk/usb category + +1.49: +- use new libldetect API for finding out unknown devices +- handle more PCMCIA controllers +- "i82365" driver was renamed "pd6729" + +1.48: +- arm/mips support +- try to handle built-in modules +- fix build with Werror +- use mirrors.mageia.org/api for mirror list + +1.47: +- 2011.0 build + +1.46: +- create device listed in /proc/partitions with correct major/minor (#57032) + +1.45: +- do not list /dev/fd0 when no floppy is found (#58390) + +1.44: +- rebuild with latest list_modules.pm (might fix #57833) + +1.43: +- bump version (#57466) + +1.42: +- list asix module in network/usb group +- virtio: fix device probing: use PCI subdevices +- fix format string bug from 1.41 + +1.41: +- load needed modules for known virtio devices, fixes #51804 + +1.39: +- set uevent helper which will load firmware and do not set firmware + timeout to 1 second (it will fail if firmware is not there) + +1.38: +- handle hybrid ISOs (ISO images dumped to USB keys) + +1.37: +- enumerate hid bus and load hid quirk modules, fixes #47167 + +1.36: +- load appropriate modules before trying to mount ext4/reiser4 + +1.35: +- allow installing from ext3/ext4/reiser4 + +1.34: +- adapt to new modules.dep format (prefix modules with directory path) +- try to use arch-prefixed location for automatic disk installs + +1.33: +- build fix for glibc 2.8 +- sort modules in the interface +- try to load squashfs_lzma too + +1.32: +- automatically find compressed stage2 with automatic=method:disk + +1.31: +- usbkbd is dead, using usbhid instead + +1.30: +- add back "ide-generic" support (incorrectly removed in 1.17), the + module that we want to avoid is "ide-pci-generic" (previously "generic"), + and this is handled by ldetect-lst preferred modules list +- handle ide-cd being renamed as ide-cd_mod + +1.29: +- allow to pass module options to probe-modules +- build fixes for gcc 4.3 + +1.28: +- fix segfault with empty device description (can happen for USB devices) + +1.27.1: +- fix build + +1.27: +- do not set firmware timeout to 1 second in probe-modules helper for + Mandriva One (#39216) + +1.26: +- load bus/firewire controllers (#31356) +- really ask dhcp domain if not guessed + +1.25: +- do not allow to choose outdated cooker mirror list (#37278) + +1.24: +- load disk/ide before disk/scsi (#38451, to prevent sata deps from + overriding non-libata pata modules, like in stage2) +- fix asking modules when no controller is detected + +1.23: +- probe usb-storage/sbp2 only when probing USB/SCSI buses + (to make automatic boot faster on IDE) +- make dhcp the first choice (instead of static) in the network type menu +- clear tty2 after shell is killed +- log "killed shell" message on tty3 +- add a space in front of top line (like help message) +- space-pad top line with spaces to the right (like help message) + +1.22: +- fix automatic IDE media detection (was broken with multiple CD drives, #36161) +- fix bootsplash in automatic CD-Rom mode (as a result of IDE media detection fix) +- wait only 1 second for firmware upload (not to hang boot with iwl3945, #37279) + +1.21: +- load nls_cp437 and nls_iso8859_1 when loading vfat + (used to be in custom modules.dep) + +1.20: +- probe-modules: + o handle the "--usb" option instead of "usb" + o load module passed as argument (if any), instead of probing bus +- switch to modules from /lib/modules/`uname -r`, modules.dep containing full filename + +1.19: +- rebuild with list_modules to handle atl2 ethernet driver + +1.18: +- add probe-modules helper + +1.17: +- use modules from disk/ide category (#33043) +- do not explicitely try to load ide-generic, ldetect will fallback to + ide-generic when appropriate (#33043) + +1.16: +- if you give nfs directory xxx, try to use xxx/ARCH +- handle cdroms with and without ARCH at the root + +1.15: +- ask loading modules from /modules if needed +- read modules description from /modules/modules.description + +1.14: +- fix segfault in USB detection code (when no module match, #32624) + +1.13: +- use module names instead of filenames +- convert module name to filename before loading it + (using modules.dep to get filename) +- keep module in dependencies list even if it has no dependencies + (to keep track of its filename) +- use '_' in module names when explicitely loading modules (cosmetics) + +1.12: +- adapt to new list_modules + +1.11: +- use ldetect/libmodprobe/libpci instead of custom pci/usb probe +- rename rescue "GUI" as rescue "menu" + +1.10.1: +- link init with dietlibc instead of minilibc on ix86/x86-64 +- add missing includes for wireless +- fix build of pppoe by using dietlibc termios header + +1.10: +- add ide-disk module +- load ide-disk when detecting disks (ide is now modularized...) + +1.9: +- ide is now modularized + +1.8: +- build pcmcia header only on i386/x86_64 (#30668) +- use api.mandriva.com to retrieve mirror list (#29346) + +1.7: +- don't kill our init/klogd when running stage2 + (bug introduced when switching to initramfs) + +1.6: +- write DNS settings in temporary ifcfg file + (fixes resolv.conf post install) + +1.5: +- fix infinite loop in wired interface mode diff --git a/mdk-stage1/adsl.c b/mdk-stage1/adsl.c new file mode 100644 index 000000000..70968f50b --- /dev/null +++ b/mdk-stage1/adsl.c @@ -0,0 +1,183 @@ +/* + * Guillaume Cottenceau (gc) + * + * Copyright 2000 Mandriva + * + * This software may be freely redistributed under the terms of the GNU + * public license. + * + * 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 <unistd.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <string.h> +#include <sys/socket.h> +#include <netinet/in.h> +#include <arpa/inet.h> +#include <sys/ioctl.h> +#include <errno.h> +#include <stdio.h> +#include <resolv.h> +#include <signal.h> + +#include "stage1.h" +#include "log.h" +#include "network.h" +#include "modules.h" +#include "utils.h" +#include "frontend.h" +#include "automatic.h" + +#include "adsl.h" + + +static enum return_type adsl_connect(struct interface_info * intf, char * username, char * password, char * acname) +{ + char pppoe_call[500]; + char * pppd_launch[] = { "/sbin/pppd", "pty", pppoe_call, "noipdefault", "noauth", "default-asyncmap", "defaultroute", + "hide-password", "nodetach", "usepeerdns", "local", "mtu", "1492", "mru", "1492", "noaccomp", + "noccp", "nobsdcomp", "nodeflate", "nopcomp", "novj", "novjccomp", "user", username, + "password", password, "lcp-echo-interval", "20", "lcp-echo-failure", "3", "lock", "persist", NULL }; + int fd; + int retries = 10; + char * tty_adsl = "/dev/tty6"; + enum return_type status = RETURN_ERROR; + pid_t ppp_pid; + + snprintf(pppoe_call, sizeof(pppoe_call), "/sbin/pppoe -p /var/run/pppoe.conf-adsl.pid.pppoe -I %s -T 80 -U -m 1412", intf->device); + + if (!streq(acname, "")) { + strcat(pppoe_call, "-C "); + strcat(pppoe_call, acname); + } + + fd = open(tty_adsl, O_RDWR); + if (fd == -1) { + log_message("cannot open tty -- no pppd"); + return RETURN_ERROR; + } + else if (access(pppd_launch[0], X_OK)) { + log_message("cannot open pppd - %s doesn't exist", pppd_launch[0]); + return RETURN_ERROR; + } + + if (!(ppp_pid = fork())) { + dup2(fd, 0); + dup2(fd, 1); + dup2(fd, 2); + + close(fd); + setsid(); + if (ioctl(0, TIOCSCTTY, NULL)) + log_perror("could not set new controlling tty"); + + printf("\t(exec of pppd)\n"); + execv(pppd_launch[0], pppd_launch); + log_message("execve of %s failed: %s", pppd_launch[0], strerror(errno)); + exit(-1); + } + close(fd); + while (retries > 0 && kill(ppp_pid, 0) == 0) { + FILE * f; + if ((f = fopen("/var/run/pppd.tdb", "rb"))) { + while (1) { + char buf[500]; + char *p; + if (!fgets(buf, sizeof(buf), f)) + break; + p = strstr(buf, "IPLOCAL="); + if (p) { + struct sockaddr_in addr; + if (inet_aton(p + 8, &addr.sin_addr)) + intf->ip = addr.sin_addr; + status = RETURN_OK; + } + } + fclose(f); + if (status == RETURN_OK) { + log_message("PPP: connected!"); + break; + } + } + retries--; + log_message("PPP: <sleep>"); + sleep(2); + } + + if (status != RETURN_OK) { + log_message("PPP: could not connect"); + kill(ppp_pid, SIGTERM); + sleep(1); + kill(ppp_pid, SIGKILL); + sleep(1); + } + return status; +} + + +enum return_type perform_adsl(struct interface_info * intf) +{ + struct in_addr addr; + char * questions[] = { "Username", "Password", "AC Name", NULL }; + char * questions_auto[] = { "adsluser", "adslpass", "adslacname", NULL }; + static char ** answers = NULL; + enum return_type results; + + inet_aton("10.0.0.10", &addr); + memcpy(&intf->ip, &addr, sizeof(addr)); + + inet_aton("255.255.255.0", &addr); + memcpy(&intf->netmask, &addr, sizeof(addr)); + + *((uint32_t *) &intf->broadcast) = (*((uint32_t *) &intf->ip) & + *((uint32_t *) &intf->netmask)) | ~(*((uint32_t *) &intf->netmask)); + + intf->is_ptp = 0; + + if (configure_net_device(intf)) { + stg1_error_message("Could not configure.."); + return RETURN_ERROR; + } + + results = ask_from_entries_auto("Please enter the username and password for your ADSL account.\n" + "Leave blank the AC Name field if you don't know what it means.\n" + "(Warning! only PPPoE protocol is supported)", + questions, &answers, 40, questions_auto, NULL); + if (results != RETURN_OK) + return results; + + intf->boot_proto = BOOTPROTO_ADSL_PPPOE; + + wait_message("Waiting for ADSL connection to show up..."); + my_modprobe("ppp_generic", ANY_DRIVER_TYPE, NULL); + my_modprobe("ppp_async", ANY_DRIVER_TYPE, NULL); + results = adsl_connect(intf, answers[0], answers[1], answers[2]); + remove_wait_message(); + + if (results != RETURN_OK) { + wait_message("Retrying the ADSL connection..."); + results = adsl_connect(intf, answers[0], answers[1], answers[2]); + remove_wait_message(); + } else { + intf->user = strdup(answers[0]); + intf->pass = strdup(answers[1]); + intf->acname = strdup(answers[2]); + } + + if (results != RETURN_OK) { + stg1_error_message("I could not connect to the ADSL network."); + return perform_adsl(intf); + } + + sleep(1); + res_init(); /* reinit the resolver, pppd modified /etc/resolv.conf */ + + return RETURN_OK; +} diff --git a/mdk-stage1/adsl.h b/mdk-stage1/adsl.h new file mode 100644 index 000000000..aa4461108 --- /dev/null +++ b/mdk-stage1/adsl.h @@ -0,0 +1,34 @@ +/* + * Guillaume Cottenceau (gc) + * + * Copyright 2000 Mandriva + * + * View the homepage: http://us.mandriva.com/~gc/html/stage1.html + * + * + * This software may be freely redistributed under the terms of the GNU + * public license. + * + * 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. + * + */ + +/* + * Portions from GRUB -- GRand Unified Bootloader + * Copyright (C) 2000 Free Software Foundation, Inc. + * + * Itself based on etherboot-4.6.4 by Martin Renters. + * + */ + +#ifndef _ADSL_H_ +#define _ADSL_H_ + +#include "stage1.h" +#include "network.h" + +enum return_type perform_adsl(struct interface_info * intf); + +#endif diff --git a/mdk-stage1/automatic.c b/mdk-stage1/automatic.c index 486a829de..5e9ed56a2 100644 --- a/mdk-stage1/automatic.c +++ b/mdk-stage1/automatic.c @@ -1,7 +1,7 @@ /* - * Guillaume Cottenceau (gc@mandrakesoft.com) + * Guillaume Cottenceau (gc) * - * Copyright 2000 MandrakeSoft + * Copyright 2000 Mandriva * * This software may be freely redistributed under the terms of the GNU * public license. @@ -23,6 +23,7 @@ #include <stdlib.h> #include <string.h> #include "tools.h" +#include "utils.h" #include "stage1.h" #include "frontend.h" #include "log.h" @@ -45,14 +46,14 @@ void grab_automatic_params(char * line) int j = i; while (line[i] != ':' && line[i] != '\0') i++; - name = memdup(&line[j], i-j + 1); + name = _memdup(&line[j], i-j + 1); name[i-j] = 0; k = i+1; i++; while (line[i] != ',' && line[i] != '\0') i++; - value = memdup(&line[k], i-k + 1); + value = _memdup(&line[k], i-k + 1); value[i-k] = 0; tmp_params[p].name = name; @@ -64,7 +65,7 @@ void grab_automatic_params(char * line) } tmp_params[p++].name = NULL; - automatic_params = memdup(tmp_params, sizeof(struct param_elem) * p); + automatic_params = _memdup(tmp_params, sizeof(struct param_elem) * p); log_message("AUTOMATIC MODE: got %d params", p-1); } @@ -74,8 +75,22 @@ char * get_auto_value(char * auto_param) { struct param_elem * ptr = automatic_params; + struct param_elem short_aliases[] = + { { "method", "met" }, { "network", "netw" }, { "interface", "int" }, { "gateway", "gat" }, + { "netmask", "netm" }, { "adsluser", "adslu" }, { "adslpass", "adslp" }, { "hostname", "hos" }, + { "domain", "dom" }, { "server", "ser" }, { "directory", "dir" }, { "user", "use" }, + { "pass", "pas" }, { "disk", "dis" }, { "partition", "par" }, { "proxy_host", "proxh" }, + { "proxy_port", "proxp" }, { NULL, NULL } }; + struct param_elem * ptr_alias = short_aliases; + while (ptr_alias->name) { + if (streq(auto_param, ptr_alias->name)) + break; + ptr_alias++; + } + while (ptr->name) { - if (!strcmp(ptr->name, auto_param)) + if (streq(ptr->name, auto_param) + || (ptr_alias->name && streq(ptr_alias->value, ptr->name))) return ptr->value; ptr++; } @@ -86,9 +101,9 @@ char * get_auto_value(char * auto_param) enum return_type ask_from_list_auto(char *msg, char ** elems, char ** choice, char * auto_param, char ** elems_auto) { - if (!IS_AUTOMATIC) + if (!IS_AUTOMATIC) { return ask_from_list(msg, elems, choice); - else { + } else { char ** sav_elems = elems; char * tmp = get_auto_value(auto_param); while (elems && *elems) { @@ -100,16 +115,16 @@ enum return_type ask_from_list_auto(char *msg, char ** elems, char ** choice, ch elems++; elems_auto++; } - unset_param(MODE_AUTOMATIC); /* we are in a fallback mode */ + unset_automatic(); /* we are in a fallback mode */ return ask_from_list(msg, sav_elems, choice); } } enum return_type ask_from_list_comments_auto(char *msg, char ** elems, char ** elems_comments, char ** choice, char * auto_param, char ** elems_auto) { - if (!IS_AUTOMATIC) + if (!IS_AUTOMATIC) { return ask_from_list_comments(msg, elems, elems_comments, choice); - else { + } else { char ** sav_elems = elems; char * tmp = get_auto_value(auto_param); while (elems && *elems) { @@ -121,7 +136,7 @@ enum return_type ask_from_list_comments_auto(char *msg, char ** elems, char ** e elems++; elems_auto++; } - unset_param(MODE_AUTOMATIC); /* we are in a fallback mode */ + unset_automatic(); /* we are in a fallback mode */ return ask_from_list_comments(msg, sav_elems, elems_comments, choice); } } @@ -129,9 +144,9 @@ enum return_type ask_from_list_comments_auto(char *msg, char ** elems, char ** e enum return_type ask_from_entries_auto(char *msg, char ** questions, char *** answers, int entry_size, char ** questions_auto, void (*callback_func)(char ** strings)) { - if (!IS_AUTOMATIC) + if (!IS_AUTOMATIC) { return ask_from_entries(msg, questions, answers, entry_size, callback_func); - else { + } else { char * tmp_answers[50]; int i = 0; while (questions && *questions) { @@ -142,7 +157,7 @@ enum return_type ask_from_entries_auto(char *msg, char ** questions, char *** an questions_auto++; } - *answers = memdup(tmp_answers, sizeof(char *) * i); + *answers = _memdup(tmp_answers, sizeof(char *) * i); return RETURN_OK; } } diff --git a/mdk-stage1/automatic.h b/mdk-stage1/automatic.h index c2ac0a73d..5fb890d61 100644 --- a/mdk-stage1/automatic.h +++ b/mdk-stage1/automatic.h @@ -1,7 +1,7 @@ /* - * Guillaume Cottenceau (gc@mandrakesoft.com) + * Guillaume Cottenceau (gc) * - * Copyright 2000 MandrakeSoft + * Copyright 2000 Mandriva * * This software may be freely redistributed under the terms of the GNU * public license. @@ -24,6 +24,7 @@ #include "stage1.h" void grab_automatic_params(char * line); +char * get_auto_value(char * auto_param); enum return_type ask_from_list_auto(char *msg, char ** elems, char ** choice, char * auto_param, char ** elems_auto); enum return_type ask_from_list_comments_auto(char *msg, char ** elems, char ** elems_comments, char ** choice, char * auto_param, char ** elems_auto); diff --git a/mdk-stage1/bzlib/Makefile b/mdk-stage1/bzlib/Makefile deleted file mode 100644 index 3015ccc2d..000000000 --- a/mdk-stage1/bzlib/Makefile +++ /dev/null @@ -1,47 +0,0 @@ - #****************************************************************************** - # - # Guillaume Cottenceau (gc@mandrakesoft.com) - # - # Copyright 2000 MandrakeSoft - # - # This software may be freely redistributed under the terms of the GNU - # public license. - # - # 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. - # - #***************************************************************************** - -top_dir = .. - -include $(top_dir)/Makefile.common - - -all: libbzlib.a libbzlib-DIET.a - -clean: - rm -f *.o *.a - -FLAGS = -Wall -Werror -Os -fomit-frame-pointer -c - - -OBJS = blocksort.o bzlib.o compress.o crctable.o decompress.o huffman.o randtable.o -OBJS-DIET = $(subst .o,-DIET.o,$(OBJS)) - - -libbzlib.a: $(OBJS) - ar -cru $@ $^ - ranlib $@ - -libbzlib-DIET.a: $(OBJS-DIET) - ar -cru $@ $^ - ranlib $@ - - -$(OBJS): %.o: %.c - gcc $(FLAGS) $(GLIBC_INCLUDES) -c $< -o $@ - -$(OBJS-DIET): %-DIET.o: %.c - gcc $(FLAGS) $(DIETLIBC_INCLUDES) -c $< -o $@ - diff --git a/mdk-stage1/bzlib/blocksort.c b/mdk-stage1/bzlib/blocksort.c deleted file mode 100644 index c1b78c483..000000000 --- a/mdk-stage1/bzlib/blocksort.c +++ /dev/null @@ -1,1138 +0,0 @@ - -/*-------------------------------------------------------------*/ -/*--- Block sorting machinery ---*/ -/*--- blocksort.c ---*/ -/*-------------------------------------------------------------*/ - -/*-- - This file is a part of bzip2 and/or libbzip2, a program and - library for lossless, block-sorting data compression. - - Copyright (C) 1996-2000 Julian R Seward. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - 2. The origin of this software must not be misrepresented; you must - not claim that you wrote the original software. If you use this - software in a product, an acknowledgment in the product - documentation would be appreciated but is not required. - - 3. Altered source versions must be plainly marked as such, and must - not be misrepresented as being the original software. - - 4. The name of the author may not be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS - OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY - DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - Julian Seward, Cambridge, UK. - jseward@acm.org - bzip2/libbzip2 version 1.0 of 21 March 2000 - - This program is based on (at least) the work of: - Mike Burrows - David Wheeler - Peter Fenwick - Alistair Moffat - Radford Neal - Ian H. Witten - Robert Sedgewick - Jon L. Bentley - - For more information on these sources, see the manual. - - To get some idea how the block sorting algorithms in this file - work, read my paper - On the Performance of BWT Sorting Algorithms - in Proceedings of the IEEE Data Compression Conference 2000, - Snowbird, Utah, USA, 27-30 March 2000. The main sort in this - file implements the algorithm called cache in the paper. ---*/ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - - -#include "bzlib_private.h" - -/*---------------------------------------------*/ -/*--- Fallback O(N log(N)^2) sorting ---*/ -/*--- algorithm, for repetitive blocks ---*/ -/*---------------------------------------------*/ - -/*---------------------------------------------*/ -static -__inline__ -void fallbackSimpleSort ( UInt32* fmap, - UInt32* eclass, - Int32 lo, - Int32 hi ) -{ - Int32 i, j, tmp; - UInt32 ec_tmp; - - if (lo == hi) return; - - if (hi - lo > 3) { - for ( i = hi-4; i >= lo; i-- ) { - tmp = fmap[i]; - ec_tmp = eclass[tmp]; - for ( j = i+4; j <= hi && ec_tmp > eclass[fmap[j]]; j += 4 ) - fmap[j-4] = fmap[j]; - fmap[j-4] = tmp; - } - } - - for ( i = hi-1; i >= lo; i-- ) { - tmp = fmap[i]; - ec_tmp = eclass[tmp]; - for ( j = i+1; j <= hi && ec_tmp > eclass[fmap[j]]; j++ ) - fmap[j-1] = fmap[j]; - fmap[j-1] = tmp; - } -} - - -/*---------------------------------------------*/ -#define fswap(zz1, zz2) \ - { Int32 zztmp = zz1; zz1 = zz2; zz2 = zztmp; } - -#define fvswap(zzp1, zzp2, zzn) \ -{ \ - Int32 yyp1 = (zzp1); \ - Int32 yyp2 = (zzp2); \ - Int32 yyn = (zzn); \ - while (yyn > 0) { \ - fswap(fmap[yyp1], fmap[yyp2]); \ - yyp1++; yyp2++; yyn--; \ - } \ -} - - -#define fmin(a,b) ((a) < (b)) ? (a) : (b) - -#define fpush(lz,hz) { stackLo[sp] = lz; \ - stackHi[sp] = hz; \ - sp++; } - -#define fpop(lz,hz) { sp--; \ - lz = stackLo[sp]; \ - hz = stackHi[sp]; } - -#define FALLBACK_QSORT_SMALL_THRESH 10 -#define FALLBACK_QSORT_STACK_SIZE 100 - - -static -void fallbackQSort3 ( UInt32* fmap, - UInt32* eclass, - Int32 loSt, - Int32 hiSt ) -{ - Int32 unLo, unHi, ltLo, gtHi, n, m; - Int32 sp, lo, hi; - UInt32 med, r, r3; - Int32 stackLo[FALLBACK_QSORT_STACK_SIZE]; - Int32 stackHi[FALLBACK_QSORT_STACK_SIZE]; - - r = 0; - - sp = 0; - fpush ( loSt, hiSt ); - - while (sp > 0) { - - AssertH ( sp < FALLBACK_QSORT_STACK_SIZE, 1004 ); - - fpop ( lo, hi ); - if (hi - lo < FALLBACK_QSORT_SMALL_THRESH) { - fallbackSimpleSort ( fmap, eclass, lo, hi ); - continue; - } - - /* Random partitioning. Median of 3 sometimes fails to - avoid bad cases. Median of 9 seems to help but - looks rather expensive. This too seems to work but - is cheaper. Guidance for the magic constants - 7621 and 32768 is taken from Sedgewick's algorithms - book, chapter 35. - */ - r = ((r * 7621) + 1) % 32768; - r3 = r % 3; - if (r3 == 0) med = eclass[fmap[lo]]; else - if (r3 == 1) med = eclass[fmap[(lo+hi)>>1]]; else - med = eclass[fmap[hi]]; - - unLo = ltLo = lo; - unHi = gtHi = hi; - - while (1) { - while (1) { - if (unLo > unHi) break; - n = (Int32)eclass[fmap[unLo]] - (Int32)med; - if (n == 0) { - fswap(fmap[unLo], fmap[ltLo]); - ltLo++; unLo++; - continue; - }; - if (n > 0) break; - unLo++; - } - while (1) { - if (unLo > unHi) break; - n = (Int32)eclass[fmap[unHi]] - (Int32)med; - if (n == 0) { - fswap(fmap[unHi], fmap[gtHi]); - gtHi--; unHi--; - continue; - }; - if (n < 0) break; - unHi--; - } - if (unLo > unHi) break; - fswap(fmap[unLo], fmap[unHi]); unLo++; unHi--; - } - - AssertD ( unHi == unLo-1, "fallbackQSort3(2)" ); - - if (gtHi < ltLo) continue; - - n = fmin(ltLo-lo, unLo-ltLo); fvswap(lo, unLo-n, n); - m = fmin(hi-gtHi, gtHi-unHi); fvswap(unLo, hi-m+1, m); - - n = lo + unLo - ltLo - 1; - m = hi - (gtHi - unHi) + 1; - - if (n - lo > hi - m) { - fpush ( lo, n ); - fpush ( m, hi ); - } else { - fpush ( m, hi ); - fpush ( lo, n ); - } - } -} - -#undef fmin -#undef fpush -#undef fpop -#undef fswap -#undef fvswap -#undef FALLBACK_QSORT_SMALL_THRESH -#undef FALLBACK_QSORT_STACK_SIZE - - -/*---------------------------------------------*/ -/* Pre: - nblock > 0 - eclass exists for [0 .. nblock-1] - ((UChar*)eclass) [0 .. nblock-1] holds block - ptr exists for [0 .. nblock-1] - - Post: - ((UChar*)eclass) [0 .. nblock-1] holds block - All other areas of eclass destroyed - fmap [0 .. nblock-1] holds sorted order - bhtab [ 0 .. 2+(nblock/32) ] destroyed -*/ - -#define SET_BH(zz) bhtab[(zz) >> 5] |= (1 << ((zz) & 31)) -#define CLEAR_BH(zz) bhtab[(zz) >> 5] &= ~(1 << ((zz) & 31)) -#define ISSET_BH(zz) (bhtab[(zz) >> 5] & (1 << ((zz) & 31))) -#define WORD_BH(zz) bhtab[(zz) >> 5] -#define UNALIGNED_BH(zz) ((zz) & 0x01f) - -static -void fallbackSort ( UInt32* fmap, - UInt32* eclass, - UInt32* bhtab, - Int32 nblock, - Int32 verb ) -{ - Int32 ftab[257]; - Int32 ftabCopy[256]; - Int32 H, i, j, k, l, r, cc, cc1; - Int32 nNotDone; - Int32 nBhtab; - UChar* eclass8 = (UChar*)eclass; - - /*-- - Initial 1-char radix sort to generate - initial fmap and initial BH bits. - --*/ - if (verb >= 4) - VPrintf0 ( " bucket sorting ...\n" ); - for (i = 0; i < 257; i++) ftab[i] = 0; - for (i = 0; i < nblock; i++) ftab[eclass8[i]]++; - for (i = 0; i < 256; i++) ftabCopy[i] = ftab[i]; - for (i = 1; i < 257; i++) ftab[i] += ftab[i-1]; - - for (i = 0; i < nblock; i++) { - j = eclass8[i]; - k = ftab[j] - 1; - ftab[j] = k; - fmap[k] = i; - } - - nBhtab = 2 + (nblock / 32); - for (i = 0; i < nBhtab; i++) bhtab[i] = 0; - for (i = 0; i < 256; i++) SET_BH(ftab[i]); - - /*-- - Inductively refine the buckets. Kind-of an - "exponential radix sort" (!), inspired by the - Manber-Myers suffix array construction algorithm. - --*/ - - /*-- set sentinel bits for block-end detection --*/ - for (i = 0; i < 32; i++) { - SET_BH(nblock + 2*i); - CLEAR_BH(nblock + 2*i + 1); - } - - /*-- the log(N) loop --*/ - H = 1; - while (1) { - - if (verb >= 4) - VPrintf1 ( " depth %6d has ", H ); - - j = 0; - for (i = 0; i < nblock; i++) { - if (ISSET_BH(i)) j = i; - k = fmap[i] - H; if (k < 0) k += nblock; - eclass[k] = j; - } - - nNotDone = 0; - r = -1; - while (1) { - - /*-- find the next non-singleton bucket --*/ - k = r + 1; - while (ISSET_BH(k) && UNALIGNED_BH(k)) k++; - if (ISSET_BH(k)) { - while (WORD_BH(k) == 0xffffffff) k += 32; - while (ISSET_BH(k)) k++; - } - l = k - 1; - if (l >= nblock) break; - while (!ISSET_BH(k) && UNALIGNED_BH(k)) k++; - if (!ISSET_BH(k)) { - while (WORD_BH(k) == 0x00000000) k += 32; - while (!ISSET_BH(k)) k++; - } - r = k - 1; - if (r >= nblock) break; - - /*-- now [l, r] bracket current bucket --*/ - if (r > l) { - nNotDone += (r - l + 1); - fallbackQSort3 ( fmap, eclass, l, r ); - - /*-- scan bucket and generate header bits-- */ - cc = -1; - for (i = l; i <= r; i++) { - cc1 = eclass[fmap[i]]; - if (cc != cc1) { SET_BH(i); cc = cc1; }; - } - } - } - - if (verb >= 4) - VPrintf1 ( "%6d unresolved strings\n", nNotDone ); - - H *= 2; - if (H > nblock || nNotDone == 0) break; - } - - /*-- - Reconstruct the original block in - eclass8 [0 .. nblock-1], since the - previous phase destroyed it. - --*/ - if (verb >= 4) - VPrintf0 ( " reconstructing block ...\n" ); - j = 0; - for (i = 0; i < nblock; i++) { - while (ftabCopy[j] == 0) j++; - ftabCopy[j]--; - eclass8[fmap[i]] = (UChar)j; - } - AssertH ( j < 256, 1005 ); -} - -#undef SET_BH -#undef CLEAR_BH -#undef ISSET_BH -#undef WORD_BH -#undef UNALIGNED_BH - - -/*---------------------------------------------*/ -/*--- The main, O(N^2 log(N)) sorting ---*/ -/*--- algorithm. Faster for "normal" ---*/ -/*--- non-repetitive blocks. ---*/ -/*---------------------------------------------*/ - -/*---------------------------------------------*/ -static -__inline__ -Bool mainGtU ( UInt32 i1, - UInt32 i2, - UChar* block, - UInt16* quadrant, - UInt32 nblock, - Int32* budget ) -{ - Int32 k; - UChar c1, c2; - UInt16 s1, s2; - - AssertD ( i1 != i2, "mainGtU" ); - /* 1 */ - c1 = block[i1]; c2 = block[i2]; - if (c1 != c2) return (c1 > c2); - i1++; i2++; - /* 2 */ - c1 = block[i1]; c2 = block[i2]; - if (c1 != c2) return (c1 > c2); - i1++; i2++; - /* 3 */ - c1 = block[i1]; c2 = block[i2]; - if (c1 != c2) return (c1 > c2); - i1++; i2++; - /* 4 */ - c1 = block[i1]; c2 = block[i2]; - if (c1 != c2) return (c1 > c2); - i1++; i2++; - /* 5 */ - c1 = block[i1]; c2 = block[i2]; - if (c1 != c2) return (c1 > c2); - i1++; i2++; - /* 6 */ - c1 = block[i1]; c2 = block[i2]; - if (c1 != c2) return (c1 > c2); - i1++; i2++; - /* 7 */ - c1 = block[i1]; c2 = block[i2]; - if (c1 != c2) return (c1 > c2); - i1++; i2++; - /* 8 */ - c1 = block[i1]; c2 = block[i2]; - if (c1 != c2) return (c1 > c2); - i1++; i2++; - /* 9 */ - c1 = block[i1]; c2 = block[i2]; - if (c1 != c2) return (c1 > c2); - i1++; i2++; - /* 10 */ - c1 = block[i1]; c2 = block[i2]; - if (c1 != c2) return (c1 > c2); - i1++; i2++; - /* 11 */ - c1 = block[i1]; c2 = block[i2]; - if (c1 != c2) return (c1 > c2); - i1++; i2++; - /* 12 */ - c1 = block[i1]; c2 = block[i2]; - if (c1 != c2) return (c1 > c2); - i1++; i2++; - - k = nblock + 8; - - do { - /* 1 */ - c1 = block[i1]; c2 = block[i2]; - if (c1 != c2) return (c1 > c2); - s1 = quadrant[i1]; s2 = quadrant[i2]; - if (s1 != s2) return (s1 > s2); - i1++; i2++; - /* 2 */ - c1 = block[i1]; c2 = block[i2]; - if (c1 != c2) return (c1 > c2); - s1 = quadrant[i1]; s2 = quadrant[i2]; - if (s1 != s2) return (s1 > s2); - i1++; i2++; - /* 3 */ - c1 = block[i1]; c2 = block[i2]; - if (c1 != c2) return (c1 > c2); - s1 = quadrant[i1]; s2 = quadrant[i2]; - if (s1 != s2) return (s1 > s2); - i1++; i2++; - /* 4 */ - c1 = block[i1]; c2 = block[i2]; - if (c1 != c2) return (c1 > c2); - s1 = quadrant[i1]; s2 = quadrant[i2]; - if (s1 != s2) return (s1 > s2); - i1++; i2++; - /* 5 */ - c1 = block[i1]; c2 = block[i2]; - if (c1 != c2) return (c1 > c2); - s1 = quadrant[i1]; s2 = quadrant[i2]; - if (s1 != s2) return (s1 > s2); - i1++; i2++; - /* 6 */ - c1 = block[i1]; c2 = block[i2]; - if (c1 != c2) return (c1 > c2); - s1 = quadrant[i1]; s2 = quadrant[i2]; - if (s1 != s2) return (s1 > s2); - i1++; i2++; - /* 7 */ - c1 = block[i1]; c2 = block[i2]; - if (c1 != c2) return (c1 > c2); - s1 = quadrant[i1]; s2 = quadrant[i2]; - if (s1 != s2) return (s1 > s2); - i1++; i2++; - /* 8 */ - c1 = block[i1]; c2 = block[i2]; - if (c1 != c2) return (c1 > c2); - s1 = quadrant[i1]; s2 = quadrant[i2]; - if (s1 != s2) return (s1 > s2); - i1++; i2++; - - if (i1 >= nblock) i1 -= nblock; - if (i2 >= nblock) i2 -= nblock; - - k -= 8; - (*budget)--; - } - while (k >= 0); - - return False; -} - - -/*---------------------------------------------*/ -/*-- - Knuth's increments seem to work better - than Incerpi-Sedgewick here. Possibly - because the number of elems to sort is - usually small, typically <= 20. ---*/ -static -Int32 incs[14] = { 1, 4, 13, 40, 121, 364, 1093, 3280, - 9841, 29524, 88573, 265720, - 797161, 2391484 }; - -static -void mainSimpleSort ( UInt32* ptr, - UChar* block, - UInt16* quadrant, - Int32 nblock, - Int32 lo, - Int32 hi, - Int32 d, - Int32* budget ) -{ - Int32 i, j, h, bigN, hp; - UInt32 v; - - bigN = hi - lo + 1; - if (bigN < 2) return; - - hp = 0; - while (incs[hp] < bigN) hp++; - hp--; - - for (; hp >= 0; hp--) { - h = incs[hp]; - - i = lo + h; - while (True) { - - /*-- copy 1 --*/ - if (i > hi) break; - v = ptr[i]; - j = i; - while ( mainGtU ( - ptr[j-h]+d, v+d, block, quadrant, nblock, budget - ) ) { - ptr[j] = ptr[j-h]; - j = j - h; - if (j <= (lo + h - 1)) break; - } - ptr[j] = v; - i++; - - /*-- copy 2 --*/ - if (i > hi) break; - v = ptr[i]; - j = i; - while ( mainGtU ( - ptr[j-h]+d, v+d, block, quadrant, nblock, budget - ) ) { - ptr[j] = ptr[j-h]; - j = j - h; - if (j <= (lo + h - 1)) break; - } - ptr[j] = v; - i++; - - /*-- copy 3 --*/ - if (i > hi) break; - v = ptr[i]; - j = i; - while ( mainGtU ( - ptr[j-h]+d, v+d, block, quadrant, nblock, budget - ) ) { - ptr[j] = ptr[j-h]; - j = j - h; - if (j <= (lo + h - 1)) break; - } - ptr[j] = v; - i++; - - if (*budget < 0) return; - } - } -} - - -/*---------------------------------------------*/ -/*-- - The following is an implementation of - an elegant 3-way quicksort for strings, - described in a paper "Fast Algorithms for - Sorting and Searching Strings", by Robert - Sedgewick and Jon L. Bentley. ---*/ - -#define mswap(zz1, zz2) \ - { Int32 zztmp = zz1; zz1 = zz2; zz2 = zztmp; } - -#define mvswap(zzp1, zzp2, zzn) \ -{ \ - Int32 yyp1 = (zzp1); \ - Int32 yyp2 = (zzp2); \ - Int32 yyn = (zzn); \ - while (yyn > 0) { \ - mswap(ptr[yyp1], ptr[yyp2]); \ - yyp1++; yyp2++; yyn--; \ - } \ -} - -static -__inline__ -UChar mmed3 ( UChar a, UChar b, UChar c ) -{ - UChar t; - if (a > b) { t = a; a = b; b = t; }; - if (b > c) { - b = c; - if (a > b) b = a; - } - return b; -} - -#define mmin(a,b) ((a) < (b)) ? (a) : (b) - -#define mpush(lz,hz,dz) { stackLo[sp] = lz; \ - stackHi[sp] = hz; \ - stackD [sp] = dz; \ - sp++; } - -#define mpop(lz,hz,dz) { sp--; \ - lz = stackLo[sp]; \ - hz = stackHi[sp]; \ - dz = stackD [sp]; } - - -#define mnextsize(az) (nextHi[az]-nextLo[az]) - -#define mnextswap(az,bz) \ - { Int32 tz; \ - tz = nextLo[az]; nextLo[az] = nextLo[bz]; nextLo[bz] = tz; \ - tz = nextHi[az]; nextHi[az] = nextHi[bz]; nextHi[bz] = tz; \ - tz = nextD [az]; nextD [az] = nextD [bz]; nextD [bz] = tz; } - - -#define MAIN_QSORT_SMALL_THRESH 20 -#define MAIN_QSORT_DEPTH_THRESH (BZ_N_RADIX + BZ_N_QSORT) -#define MAIN_QSORT_STACK_SIZE 100 - -static -void mainQSort3 ( UInt32* ptr, - UChar* block, - UInt16* quadrant, - Int32 nblock, - Int32 loSt, - Int32 hiSt, - Int32 dSt, - Int32* budget ) -{ - Int32 unLo, unHi, ltLo, gtHi, n, m, med; - Int32 sp, lo, hi, d; - - Int32 stackLo[MAIN_QSORT_STACK_SIZE]; - Int32 stackHi[MAIN_QSORT_STACK_SIZE]; - Int32 stackD [MAIN_QSORT_STACK_SIZE]; - - Int32 nextLo[3]; - Int32 nextHi[3]; - Int32 nextD [3]; - - sp = 0; - mpush ( loSt, hiSt, dSt ); - - while (sp > 0) { - - AssertH ( sp < MAIN_QSORT_STACK_SIZE, 1001 ); - - mpop ( lo, hi, d ); - if (hi - lo < MAIN_QSORT_SMALL_THRESH || - d > MAIN_QSORT_DEPTH_THRESH) { - mainSimpleSort ( ptr, block, quadrant, nblock, lo, hi, d, budget ); - if (*budget < 0) return; - continue; - } - - med = (Int32) - mmed3 ( block[ptr[ lo ]+d], - block[ptr[ hi ]+d], - block[ptr[ (lo+hi)>>1 ]+d] ); - - unLo = ltLo = lo; - unHi = gtHi = hi; - - while (True) { - while (True) { - if (unLo > unHi) break; - n = ((Int32)block[ptr[unLo]+d]) - med; - if (n == 0) { - mswap(ptr[unLo], ptr[ltLo]); - ltLo++; unLo++; continue; - }; - if (n > 0) break; - unLo++; - } - while (True) { - if (unLo > unHi) break; - n = ((Int32)block[ptr[unHi]+d]) - med; - if (n == 0) { - mswap(ptr[unHi], ptr[gtHi]); - gtHi--; unHi--; continue; - }; - if (n < 0) break; - unHi--; - } - if (unLo > unHi) break; - mswap(ptr[unLo], ptr[unHi]); unLo++; unHi--; - } - - AssertD ( unHi == unLo-1, "mainQSort3(2)" ); - - if (gtHi < ltLo) { - mpush(lo, hi, d+1 ); - continue; - } - - n = mmin(ltLo-lo, unLo-ltLo); mvswap(lo, unLo-n, n); - m = mmin(hi-gtHi, gtHi-unHi); mvswap(unLo, hi-m+1, m); - - n = lo + unLo - ltLo - 1; - m = hi - (gtHi - unHi) + 1; - - nextLo[0] = lo; nextHi[0] = n; nextD[0] = d; - nextLo[1] = m; nextHi[1] = hi; nextD[1] = d; - nextLo[2] = n+1; nextHi[2] = m-1; nextD[2] = d+1; - - if (mnextsize(0) < mnextsize(1)) mnextswap(0,1); - if (mnextsize(1) < mnextsize(2)) mnextswap(1,2); - if (mnextsize(0) < mnextsize(1)) mnextswap(0,1); - - AssertD (mnextsize(0) >= mnextsize(1), "mainQSort3(8)" ); - AssertD (mnextsize(1) >= mnextsize(2), "mainQSort3(9)" ); - - mpush (nextLo[0], nextHi[0], nextD[0]); - mpush (nextLo[1], nextHi[1], nextD[1]); - mpush (nextLo[2], nextHi[2], nextD[2]); - } -} - -#undef mswap -#undef mvswap -#undef mpush -#undef mpop -#undef mmin -#undef mnextsize -#undef mnextswap -#undef MAIN_QSORT_SMALL_THRESH -#undef MAIN_QSORT_DEPTH_THRESH -#undef MAIN_QSORT_STACK_SIZE - - -/*---------------------------------------------*/ -/* Pre: - nblock > N_OVERSHOOT - block32 exists for [0 .. nblock-1 +N_OVERSHOOT] - ((UChar*)block32) [0 .. nblock-1] holds block - ptr exists for [0 .. nblock-1] - - Post: - ((UChar*)block32) [0 .. nblock-1] holds block - All other areas of block32 destroyed - ftab [0 .. 65536 ] destroyed - ptr [0 .. nblock-1] holds sorted order - if (*budget < 0), sorting was abandoned -*/ - -#define BIGFREQ(b) (ftab[((b)+1) << 8] - ftab[(b) << 8]) -#define SETMASK (1 << 21) -#define CLEARMASK (~(SETMASK)) - -static -void mainSort ( UInt32* ptr, - UChar* block, - UInt16* quadrant, - UInt32* ftab, - Int32 nblock, - Int32 verb, - Int32* budget ) -{ - Int32 i, j, k, ss, sb; - Int32 runningOrder[256]; - Bool bigDone[256]; - Int32 copyStart[256]; - Int32 copyEnd [256]; - UChar c1; - Int32 numQSorted; - UInt16 s; - if (verb >= 4) VPrintf0 ( " main sort initialise ...\n" ); - - /*-- set up the 2-byte frequency table --*/ - for (i = 65536; i >= 0; i--) ftab[i] = 0; - - j = block[0] << 8; - i = nblock-1; - for (; i >= 3; i -= 4) { - quadrant[i] = 0; - j = (j >> 8) | ( ((UInt16)block[i]) << 8); - ftab[j]++; - quadrant[i-1] = 0; - j = (j >> 8) | ( ((UInt16)block[i-1]) << 8); - ftab[j]++; - quadrant[i-2] = 0; - j = (j >> 8) | ( ((UInt16)block[i-2]) << 8); - ftab[j]++; - quadrant[i-3] = 0; - j = (j >> 8) | ( ((UInt16)block[i-3]) << 8); - ftab[j]++; - } - for (; i >= 0; i--) { - quadrant[i] = 0; - j = (j >> 8) | ( ((UInt16)block[i]) << 8); - ftab[j]++; - } - - /*-- (emphasises close relationship of block & quadrant) --*/ - for (i = 0; i < BZ_N_OVERSHOOT; i++) { - block [nblock+i] = block[i]; - quadrant[nblock+i] = 0; - } - - if (verb >= 4) VPrintf0 ( " bucket sorting ...\n" ); - - /*-- Complete the initial radix sort --*/ - for (i = 1; i <= 65536; i++) ftab[i] += ftab[i-1]; - - s = block[0] << 8; - i = nblock-1; - for (; i >= 3; i -= 4) { - s = (s >> 8) | (block[i] << 8); - j = ftab[s] -1; - ftab[s] = j; - ptr[j] = i; - s = (s >> 8) | (block[i-1] << 8); - j = ftab[s] -1; - ftab[s] = j; - ptr[j] = i-1; - s = (s >> 8) | (block[i-2] << 8); - j = ftab[s] -1; - ftab[s] = j; - ptr[j] = i-2; - s = (s >> 8) | (block[i-3] << 8); - j = ftab[s] -1; - ftab[s] = j; - ptr[j] = i-3; - } - for (; i >= 0; i--) { - s = (s >> 8) | (block[i] << 8); - j = ftab[s] -1; - ftab[s] = j; - ptr[j] = i; - } - - /*-- - Now ftab contains the first loc of every small bucket. - Calculate the running order, from smallest to largest - big bucket. - --*/ - for (i = 0; i <= 255; i++) { - bigDone [i] = False; - runningOrder[i] = i; - } - - { - Int32 vv; - Int32 h = 1; - do h = 3 * h + 1; while (h <= 256); - do { - h = h / 3; - for (i = h; i <= 255; i++) { - vv = runningOrder[i]; - j = i; - while ( BIGFREQ(runningOrder[j-h]) > BIGFREQ(vv) ) { - runningOrder[j] = runningOrder[j-h]; - j = j - h; - if (j <= (h - 1)) goto zero; - } - zero: - runningOrder[j] = vv; - } - } while (h != 1); - } - - /*-- - The main sorting loop. - --*/ - - numQSorted = 0; - - for (i = 0; i <= 255; i++) { - - /*-- - Process big buckets, starting with the least full. - Basically this is a 3-step process in which we call - mainQSort3 to sort the small buckets [ss, j], but - also make a big effort to avoid the calls if we can. - --*/ - ss = runningOrder[i]; - - /*-- - Step 1: - Complete the big bucket [ss] by quicksorting - any unsorted small buckets [ss, j], for j != ss. - Hopefully previous pointer-scanning phases have already - completed many of the small buckets [ss, j], so - we don't have to sort them at all. - --*/ - for (j = 0; j <= 255; j++) { - if (j != ss) { - sb = (ss << 8) + j; - if ( ! (ftab[sb] & SETMASK) ) { - Int32 lo = ftab[sb] & CLEARMASK; - Int32 hi = (ftab[sb+1] & CLEARMASK) - 1; - if (hi > lo) { - if (verb >= 4) - VPrintf4 ( " qsort [0x%x, 0x%x] " - "done %d this %d\n", - ss, j, numQSorted, hi - lo + 1 ); - mainQSort3 ( - ptr, block, quadrant, nblock, - lo, hi, BZ_N_RADIX, budget - ); - numQSorted += (hi - lo + 1); - if (*budget < 0) return; - } - } - ftab[sb] |= SETMASK; - } - } - - AssertH ( !bigDone[ss], 1006 ); - - /*-- - Step 2: - Now scan this big bucket [ss] so as to synthesise the - sorted order for small buckets [t, ss] for all t, - including, magically, the bucket [ss,ss] too. - This will avoid doing Real Work in subsequent Step 1's. - --*/ - { - for (j = 0; j <= 255; j++) { - copyStart[j] = ftab[(j << 8) + ss] & CLEARMASK; - copyEnd [j] = (ftab[(j << 8) + ss + 1] & CLEARMASK) - 1; - } - for (j = ftab[ss << 8] & CLEARMASK; j < copyStart[ss]; j++) { - k = ptr[j]-1; if (k < 0) k += nblock; - c1 = block[k]; - if (!bigDone[c1]) - ptr[ copyStart[c1]++ ] = k; - } - for (j = (ftab[(ss+1) << 8] & CLEARMASK) - 1; j > copyEnd[ss]; j--) { - k = ptr[j]-1; if (k < 0) k += nblock; - c1 = block[k]; - if (!bigDone[c1]) - ptr[ copyEnd[c1]-- ] = k; - } - } - - AssertH ( copyStart[ss]-1 == copyEnd[ss], 1007 ); - - for (j = 0; j <= 255; j++) ftab[(j << 8) + ss] |= SETMASK; - - /*-- - Step 3: - The [ss] big bucket is now done. Record this fact, - and update the quadrant descriptors. Remember to - update quadrants in the overshoot area too, if - necessary. The "if (i < 255)" test merely skips - this updating for the last bucket processed, since - updating for the last bucket is pointless. - - The quadrant array provides a way to incrementally - cache sort orderings, as they appear, so as to - make subsequent comparisons in fullGtU() complete - faster. For repetitive blocks this makes a big - difference (but not big enough to be able to avoid - the fallback sorting mechanism, exponential radix sort). - - The precise meaning is: at all times: - - for 0 <= i < nblock and 0 <= j <= nblock - - if block[i] != block[j], - - then the relative values of quadrant[i] and - quadrant[j] are meaningless. - - else { - if quadrant[i] < quadrant[j] - then the string starting at i lexicographically - precedes the string starting at j - - else if quadrant[i] > quadrant[j] - then the string starting at j lexicographically - precedes the string starting at i - - else - the relative ordering of the strings starting - at i and j has not yet been determined. - } - --*/ - bigDone[ss] = True; - - if (i < 255) { - Int32 bbStart = ftab[ss << 8] & CLEARMASK; - Int32 bbSize = (ftab[(ss+1) << 8] & CLEARMASK) - bbStart; - Int32 shifts = 0; - - while ((bbSize >> shifts) > 65534) shifts++; - - for (j = bbSize-1; j >= 0; j--) { - Int32 a2update = ptr[bbStart + j]; - UInt16 qVal = (UInt16)(j >> shifts); - quadrant[a2update] = qVal; - if (a2update < BZ_N_OVERSHOOT) - quadrant[a2update + nblock] = qVal; - } - AssertH ( ((bbSize-1) >> shifts) <= 65535, 1002 ); - } - - } - - if (verb >= 4) - VPrintf3 ( " %d pointers, %d sorted, %d scanned\n", - nblock, numQSorted, nblock - numQSorted ); -} - -#undef BIGFREQ -#undef SETMASK -#undef CLEARMASK - - -/*---------------------------------------------*/ -/* Pre: - nblock > 0 - arr2 exists for [0 .. nblock-1 +N_OVERSHOOT] - ((UChar*)arr2) [0 .. nblock-1] holds block - arr1 exists for [0 .. nblock-1] - - Post: - ((UChar*)arr2) [0 .. nblock-1] holds block - All other areas of block destroyed - ftab [ 0 .. 65536 ] destroyed - arr1 [0 .. nblock-1] holds sorted order -*/ -void BZ2_blockSort ( EState* s ) -{ - UInt32* ptr = s->ptr; - UChar* block = s->block; - UInt32* ftab = s->ftab; - Int32 nblock = s->nblock; - Int32 verb = s->verbosity; - Int32 wfact = s->workFactor; - UInt16* quadrant; - Int32 budget; - Int32 budgetInit; - Int32 i; - - if (nblock < 10000) { - fallbackSort ( s->arr1, s->arr2, ftab, nblock, verb ); - } else { - /* Calculate the location for quadrant, remembering to get - the alignment right. Assumes that &(block[0]) is at least - 2-byte aligned -- this should be ok since block is really - the first section of arr2. - */ - i = nblock+BZ_N_OVERSHOOT; - if (i & 1) i++; - quadrant = (UInt16*)(&(block[i])); - - /* (wfact-1) / 3 puts the default-factor-30 - transition point at very roughly the same place as - with v0.1 and v0.9.0. - Not that it particularly matters any more, since the - resulting compressed stream is now the same regardless - of whether or not we use the main sort or fallback sort. - */ - if (wfact < 1 ) wfact = 1; - if (wfact > 100) wfact = 100; - budgetInit = nblock * ((wfact-1) / 3); - budget = budgetInit; - - mainSort ( ptr, block, quadrant, ftab, nblock, verb, &budget ); - if (verb >= 3) - VPrintf3 ( " %d work, %d block, ratio %5.2f\n", - budgetInit - budget, - nblock, - (float)(budgetInit - budget) / - (float)(nblock==0 ? 1 : nblock) ); - if (budget < 0) { - if (verb >= 2) - VPrintf0 ( " too repetitive; using fallback" - " sorting algorithm\n" ); - fallbackSort ( s->arr1, s->arr2, ftab, nblock, verb ); - } - } - - s->origPtr = -1; - for (i = 0; i < s->nblock; i++) - if (ptr[i] == 0) - { s->origPtr = i; break; }; - - AssertH( s->origPtr != -1, 1003 ); -} - - -/*-------------------------------------------------------------*/ -/*--- end blocksort.c ---*/ -/*-------------------------------------------------------------*/ diff --git a/mdk-stage1/bzlib/bzlib.c b/mdk-stage1/bzlib/bzlib.c deleted file mode 100644 index ebf6e269b..000000000 --- a/mdk-stage1/bzlib/bzlib.c +++ /dev/null @@ -1,1567 +0,0 @@ - -/*-------------------------------------------------------------*/ -/*--- Library top-level functions. ---*/ -/*--- bzlib.c ---*/ -/*-------------------------------------------------------------*/ - -/*-- - This file is a part of bzip2 and/or libbzip2, a program and - library for lossless, block-sorting data compression. - - Copyright (C) 1996-2000 Julian R Seward. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - 2. The origin of this software must not be misrepresented; you must - not claim that you wrote the original software. If you use this - software in a product, an acknowledgment in the product - documentation would be appreciated but is not required. - - 3. Altered source versions must be plainly marked as such, and must - not be misrepresented as being the original software. - - 4. The name of the author may not be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS - OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY - DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - Julian Seward, Cambridge, UK. - jseward@acm.org - bzip2/libbzip2 version 1.0 of 21 March 2000 - - This program is based on (at least) the work of: - Mike Burrows - David Wheeler - Peter Fenwick - Alistair Moffat - Radford Neal - Ian H. Witten - Robert Sedgewick - Jon L. Bentley - - For more information on these sources, see the manual. ---*/ - -/*-- - CHANGES - ~~~~~~~ - 0.9.0 -- original version. - - 0.9.0a/b -- no changes in this file. - - 0.9.0c - * made zero-length BZ_FLUSH work correctly in bzCompress(). - * fixed bzWrite/bzRead to ignore zero-length requests. - * fixed bzread to correctly handle read requests after EOF. - * wrong parameter order in call to bzDecompressInit in - bzBuffToBuffDecompress. Fixed. ---*/ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - - - -#include "bzlib_private.h" - - -/*---------------------------------------------------*/ -/*--- Compression stuff ---*/ -/*---------------------------------------------------*/ - - -/*---------------------------------------------------*/ -#ifndef BZ_NO_STDIO -void BZ2_bz__AssertH__fail ( int errcode ) -{ - fprintf(stderr, - "\n\nbzip2/libbzip2: internal error number %d.\n" - "This is a bug in bzip2/libbzip2, %s.\n" - "Please report it to me at: jseward@acm.org. If this happened\n" - "when you were using some program which uses libbzip2 as a\n" - "component, you should also report this bug to the author(s)\n" - "of that program. Please make an effort to report this bug;\n" - "timely and accurate bug reports eventually lead to higher\n" - "quality software. Thanks. Julian Seward, 21 March 2000.\n\n", - errcode, - BZ2_bzlibVersion() - ); - exit(3); -} -#endif - - -/*---------------------------------------------------*/ -static -int bz_config_ok ( void ) -{ - if (sizeof(int) != 4) return 0; - if (sizeof(short) != 2) return 0; - if (sizeof(char) != 1) return 0; - return 1; -} - - -/*---------------------------------------------------*/ -static -void* default_bzalloc ( void* opaque, Int32 items, Int32 size ) -{ - void* v = malloc ( items * size ); - return v; -} - -static -void default_bzfree ( void* opaque, void* addr ) -{ - if (addr != NULL) free ( addr ); -} - - -/*---------------------------------------------------*/ -static -void prepare_new_block ( EState* s ) -{ - Int32 i; - s->nblock = 0; - s->numZ = 0; - s->state_out_pos = 0; - BZ_INITIALISE_CRC ( s->blockCRC ); - for (i = 0; i < 256; i++) s->inUse[i] = False; - s->blockNo++; -} - - -/*---------------------------------------------------*/ -static -void init_RL ( EState* s ) -{ - s->state_in_ch = 256; - s->state_in_len = 0; -} - - -static -Bool isempty_RL ( EState* s ) -{ - if (s->state_in_ch < 256 && s->state_in_len > 0) - return False; else - return True; -} - - -/*---------------------------------------------------*/ -int BZ_API(BZ2_bzCompressInit) - ( bz_stream* strm, - int blockSize100k, - int verbosity, - int workFactor ) -{ - Int32 n; - EState* s; - - if (!bz_config_ok()) return BZ_CONFIG_ERROR; - - if (strm == NULL || - blockSize100k < 1 || blockSize100k > 9 || - workFactor < 0 || workFactor > 250) - return BZ_PARAM_ERROR; - - if (workFactor == 0) workFactor = 30; - if (strm->bzalloc == NULL) strm->bzalloc = default_bzalloc; - if (strm->bzfree == NULL) strm->bzfree = default_bzfree; - - s = BZALLOC( sizeof(EState) ); - if (s == NULL) return BZ_MEM_ERROR; - s->strm = strm; - - s->arr1 = NULL; - s->arr2 = NULL; - s->ftab = NULL; - - n = 100000 * blockSize100k; - s->arr1 = BZALLOC( n * sizeof(UInt32) ); - s->arr2 = BZALLOC( (n+BZ_N_OVERSHOOT) * sizeof(UInt32) ); - s->ftab = BZALLOC( 65537 * sizeof(UInt32) ); - - if (s->arr1 == NULL || s->arr2 == NULL || s->ftab == NULL) { - if (s->arr1 != NULL) BZFREE(s->arr1); - if (s->arr2 != NULL) BZFREE(s->arr2); - if (s->ftab != NULL) BZFREE(s->ftab); - if (s != NULL) BZFREE(s); - return BZ_MEM_ERROR; - } - - s->blockNo = 0; - s->state = BZ_S_INPUT; - s->mode = BZ_M_RUNNING; - s->combinedCRC = 0; - s->blockSize100k = blockSize100k; - s->nblockMAX = 100000 * blockSize100k - 19; - s->verbosity = verbosity; - s->workFactor = workFactor; - - s->block = (UChar*)s->arr2; - s->mtfv = (UInt16*)s->arr1; - s->zbits = NULL; - s->ptr = (UInt32*)s->arr1; - - strm->state = s; - strm->total_in_lo32 = 0; - strm->total_in_hi32 = 0; - strm->total_out_lo32 = 0; - strm->total_out_hi32 = 0; - init_RL ( s ); - prepare_new_block ( s ); - return BZ_OK; -} - - -/*---------------------------------------------------*/ -static -void add_pair_to_block ( EState* s ) -{ - Int32 i; - UChar ch = (UChar)(s->state_in_ch); - for (i = 0; i < s->state_in_len; i++) { - BZ_UPDATE_CRC( s->blockCRC, ch ); - } - s->inUse[s->state_in_ch] = True; - switch (s->state_in_len) { - case 1: - s->block[s->nblock] = (UChar)ch; s->nblock++; - break; - case 2: - s->block[s->nblock] = (UChar)ch; s->nblock++; - s->block[s->nblock] = (UChar)ch; s->nblock++; - break; - case 3: - s->block[s->nblock] = (UChar)ch; s->nblock++; - s->block[s->nblock] = (UChar)ch; s->nblock++; - s->block[s->nblock] = (UChar)ch; s->nblock++; - break; - default: - s->inUse[s->state_in_len-4] = True; - s->block[s->nblock] = (UChar)ch; s->nblock++; - s->block[s->nblock] = (UChar)ch; s->nblock++; - s->block[s->nblock] = (UChar)ch; s->nblock++; - s->block[s->nblock] = (UChar)ch; s->nblock++; - s->block[s->nblock] = ((UChar)(s->state_in_len-4)); - s->nblock++; - break; - } -} - - -/*---------------------------------------------------*/ -static -void flush_RL ( EState* s ) -{ - if (s->state_in_ch < 256) add_pair_to_block ( s ); - init_RL ( s ); -} - - -/*---------------------------------------------------*/ -#define ADD_CHAR_TO_BLOCK(zs,zchh0) \ -{ \ - UInt32 zchh = (UInt32)(zchh0); \ - /*-- fast track the common case --*/ \ - if (zchh != zs->state_in_ch && \ - zs->state_in_len == 1) { \ - UChar ch = (UChar)(zs->state_in_ch); \ - BZ_UPDATE_CRC( zs->blockCRC, ch ); \ - zs->inUse[zs->state_in_ch] = True; \ - zs->block[zs->nblock] = (UChar)ch; \ - zs->nblock++; \ - zs->state_in_ch = zchh; \ - } \ - else \ - /*-- general, uncommon cases --*/ \ - if (zchh != zs->state_in_ch || \ - zs->state_in_len == 255) { \ - if (zs->state_in_ch < 256) \ - add_pair_to_block ( zs ); \ - zs->state_in_ch = zchh; \ - zs->state_in_len = 1; \ - } else { \ - zs->state_in_len++; \ - } \ -} - - -/*---------------------------------------------------*/ -static -Bool copy_input_until_stop ( EState* s ) -{ - Bool progress_in = False; - - if (s->mode == BZ_M_RUNNING) { - - /*-- fast track the common case --*/ - while (True) { - /*-- block full? --*/ - if (s->nblock >= s->nblockMAX) break; - /*-- no input? --*/ - if (s->strm->avail_in == 0) break; - progress_in = True; - ADD_CHAR_TO_BLOCK ( s, (UInt32)(*((UChar*)(s->strm->next_in))) ); - s->strm->next_in++; - s->strm->avail_in--; - s->strm->total_in_lo32++; - if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++; - } - - } else { - - /*-- general, uncommon case --*/ - while (True) { - /*-- block full? --*/ - if (s->nblock >= s->nblockMAX) break; - /*-- no input? --*/ - if (s->strm->avail_in == 0) break; - /*-- flush/finish end? --*/ - if (s->avail_in_expect == 0) break; - progress_in = True; - ADD_CHAR_TO_BLOCK ( s, (UInt32)(*((UChar*)(s->strm->next_in))) ); - s->strm->next_in++; - s->strm->avail_in--; - s->strm->total_in_lo32++; - if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++; - s->avail_in_expect--; - } - } - return progress_in; -} - - -/*---------------------------------------------------*/ -static -Bool copy_output_until_stop ( EState* s ) -{ - Bool progress_out = False; - - while (True) { - - /*-- no output space? --*/ - if (s->strm->avail_out == 0) break; - - /*-- block done? --*/ - if (s->state_out_pos >= s->numZ) break; - - progress_out = True; - *(s->strm->next_out) = s->zbits[s->state_out_pos]; - s->state_out_pos++; - s->strm->avail_out--; - s->strm->next_out++; - s->strm->total_out_lo32++; - if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++; - } - - return progress_out; -} - - -/*---------------------------------------------------*/ -static -Bool handle_compress ( bz_stream* strm ) -{ - Bool progress_in = False; - Bool progress_out = False; - EState* s = strm->state; - - while (True) { - - if (s->state == BZ_S_OUTPUT) { - progress_out |= copy_output_until_stop ( s ); - if (s->state_out_pos < s->numZ) break; - if (s->mode == BZ_M_FINISHING && - s->avail_in_expect == 0 && - isempty_RL(s)) break; - prepare_new_block ( s ); - s->state = BZ_S_INPUT; - if (s->mode == BZ_M_FLUSHING && - s->avail_in_expect == 0 && - isempty_RL(s)) break; - } - - if (s->state == BZ_S_INPUT) { - progress_in |= copy_input_until_stop ( s ); - if (s->mode != BZ_M_RUNNING && s->avail_in_expect == 0) { - flush_RL ( s ); - BZ2_compressBlock ( s, (Bool)(s->mode == BZ_M_FINISHING) ); - s->state = BZ_S_OUTPUT; - } - else - if (s->nblock >= s->nblockMAX) { - BZ2_compressBlock ( s, False ); - s->state = BZ_S_OUTPUT; - } - else - if (s->strm->avail_in == 0) { - break; - } - } - - } - - return progress_in || progress_out; -} - - -/*---------------------------------------------------*/ -int BZ_API(BZ2_bzCompress) ( bz_stream *strm, int action ) -{ - Bool progress; - EState* s; - if (strm == NULL) return BZ_PARAM_ERROR; - s = strm->state; - if (s == NULL) return BZ_PARAM_ERROR; - if (s->strm != strm) return BZ_PARAM_ERROR; - - preswitch: - switch (s->mode) { - - case BZ_M_IDLE: - return BZ_SEQUENCE_ERROR; - - case BZ_M_RUNNING: - if (action == BZ_RUN) { - progress = handle_compress ( strm ); - return progress ? BZ_RUN_OK : BZ_PARAM_ERROR; - } - else - if (action == BZ_FLUSH) { - s->avail_in_expect = strm->avail_in; - s->mode = BZ_M_FLUSHING; - goto preswitch; - } - else - if (action == BZ_FINISH) { - s->avail_in_expect = strm->avail_in; - s->mode = BZ_M_FINISHING; - goto preswitch; - } - else - return BZ_PARAM_ERROR; - - case BZ_M_FLUSHING: - if (action != BZ_FLUSH) return BZ_SEQUENCE_ERROR; - if (s->avail_in_expect != s->strm->avail_in) - return BZ_SEQUENCE_ERROR; - progress = handle_compress ( strm ); - if (s->avail_in_expect > 0 || !isempty_RL(s) || - s->state_out_pos < s->numZ) return BZ_FLUSH_OK; - s->mode = BZ_M_RUNNING; - return BZ_RUN_OK; - - case BZ_M_FINISHING: - if (action != BZ_FINISH) return BZ_SEQUENCE_ERROR; - if (s->avail_in_expect != s->strm->avail_in) - return BZ_SEQUENCE_ERROR; - progress = handle_compress ( strm ); - if (!progress) return BZ_SEQUENCE_ERROR; - if (s->avail_in_expect > 0 || !isempty_RL(s) || - s->state_out_pos < s->numZ) return BZ_FINISH_OK; - s->mode = BZ_M_IDLE; - return BZ_STREAM_END; - } - return BZ_OK; /*--not reached--*/ -} - - -/*---------------------------------------------------*/ -int BZ_API(BZ2_bzCompressEnd) ( bz_stream *strm ) -{ - EState* s; - if (strm == NULL) return BZ_PARAM_ERROR; - s = strm->state; - if (s == NULL) return BZ_PARAM_ERROR; - if (s->strm != strm) return BZ_PARAM_ERROR; - - if (s->arr1 != NULL) BZFREE(s->arr1); - if (s->arr2 != NULL) BZFREE(s->arr2); - if (s->ftab != NULL) BZFREE(s->ftab); - BZFREE(strm->state); - - strm->state = NULL; - - return BZ_OK; -} - - -/*---------------------------------------------------*/ -/*--- Decompression stuff ---*/ -/*---------------------------------------------------*/ - -/*---------------------------------------------------*/ -int BZ_API(BZ2_bzDecompressInit) - ( bz_stream* strm, - int verbosity, - int small ) -{ - DState* s; - - if (!bz_config_ok()) return BZ_CONFIG_ERROR; - - if (strm == NULL) return BZ_PARAM_ERROR; - if (small != 0 && small != 1) return BZ_PARAM_ERROR; - if (verbosity < 0 || verbosity > 4) return BZ_PARAM_ERROR; - - if (strm->bzalloc == NULL) strm->bzalloc = default_bzalloc; - if (strm->bzfree == NULL) strm->bzfree = default_bzfree; - - s = BZALLOC( sizeof(DState) ); - if (s == NULL) return BZ_MEM_ERROR; - s->strm = strm; - strm->state = s; - s->state = BZ_X_MAGIC_1; - s->bsLive = 0; - s->bsBuff = 0; - s->calculatedCombinedCRC = 0; - strm->total_in_lo32 = 0; - strm->total_in_hi32 = 0; - strm->total_out_lo32 = 0; - strm->total_out_hi32 = 0; - s->smallDecompress = (Bool)small; - s->ll4 = NULL; - s->ll16 = NULL; - s->tt = NULL; - s->currBlockNo = 0; - s->verbosity = verbosity; - - return BZ_OK; -} - - -/*---------------------------------------------------*/ -static -void unRLE_obuf_to_output_FAST ( DState* s ) -{ - UChar k1; - - if (s->blockRandomised) { - - while (True) { - /* try to finish existing run */ - while (True) { - if (s->strm->avail_out == 0) return; - if (s->state_out_len == 0) break; - *( (UChar*)(s->strm->next_out) ) = s->state_out_ch; - BZ_UPDATE_CRC ( s->calculatedBlockCRC, s->state_out_ch ); - s->state_out_len--; - s->strm->next_out++; - s->strm->avail_out--; - s->strm->total_out_lo32++; - if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++; - } - - /* can a new run be started? */ - if (s->nblock_used == s->save_nblock+1) return; - - - s->state_out_len = 1; - s->state_out_ch = s->k0; - BZ_GET_FAST(k1); BZ_RAND_UPD_MASK; - k1 ^= BZ_RAND_MASK; s->nblock_used++; - if (s->nblock_used == s->save_nblock+1) continue; - if (k1 != s->k0) { s->k0 = k1; continue; }; - - s->state_out_len = 2; - BZ_GET_FAST(k1); BZ_RAND_UPD_MASK; - k1 ^= BZ_RAND_MASK; s->nblock_used++; - if (s->nblock_used == s->save_nblock+1) continue; - if (k1 != s->k0) { s->k0 = k1; continue; }; - - s->state_out_len = 3; - BZ_GET_FAST(k1); BZ_RAND_UPD_MASK; - k1 ^= BZ_RAND_MASK; s->nblock_used++; - if (s->nblock_used == s->save_nblock+1) continue; - if (k1 != s->k0) { s->k0 = k1; continue; }; - - BZ_GET_FAST(k1); BZ_RAND_UPD_MASK; - k1 ^= BZ_RAND_MASK; s->nblock_used++; - s->state_out_len = ((Int32)k1) + 4; - BZ_GET_FAST(s->k0); BZ_RAND_UPD_MASK; - s->k0 ^= BZ_RAND_MASK; s->nblock_used++; - } - - } else { - - /* restore */ - UInt32 c_calculatedBlockCRC = s->calculatedBlockCRC; - UChar c_state_out_ch = s->state_out_ch; - Int32 c_state_out_len = s->state_out_len; - Int32 c_nblock_used = s->nblock_used; - Int32 c_k0 = s->k0; - UInt32* c_tt = s->tt; - UInt32 c_tPos = s->tPos; - char* cs_next_out = s->strm->next_out; - unsigned int cs_avail_out = s->strm->avail_out; - /* end restore */ - - UInt32 avail_out_INIT = cs_avail_out; - Int32 s_save_nblockPP = s->save_nblock+1; - unsigned int total_out_lo32_old; - - while (True) { - - /* try to finish existing run */ - if (c_state_out_len > 0) { - while (True) { - if (cs_avail_out == 0) goto return_notr; - if (c_state_out_len == 1) break; - *( (UChar*)(cs_next_out) ) = c_state_out_ch; - BZ_UPDATE_CRC ( c_calculatedBlockCRC, c_state_out_ch ); - c_state_out_len--; - cs_next_out++; - cs_avail_out--; - } - s_state_out_len_eq_one: - { - if (cs_avail_out == 0) { - c_state_out_len = 1; goto return_notr; - }; - *( (UChar*)(cs_next_out) ) = c_state_out_ch; - BZ_UPDATE_CRC ( c_calculatedBlockCRC, c_state_out_ch ); - cs_next_out++; - cs_avail_out--; - } - } - /* can a new run be started? */ - if (c_nblock_used == s_save_nblockPP) { - c_state_out_len = 0; goto return_notr; - }; - c_state_out_ch = c_k0; - BZ_GET_FAST_C(k1); c_nblock_used++; - if (k1 != c_k0) { - c_k0 = k1; goto s_state_out_len_eq_one; - }; - if (c_nblock_used == s_save_nblockPP) - goto s_state_out_len_eq_one; - - c_state_out_len = 2; - BZ_GET_FAST_C(k1); c_nblock_used++; - if (c_nblock_used == s_save_nblockPP) continue; - if (k1 != c_k0) { c_k0 = k1; continue; }; - - c_state_out_len = 3; - BZ_GET_FAST_C(k1); c_nblock_used++; - if (c_nblock_used == s_save_nblockPP) continue; - if (k1 != c_k0) { c_k0 = k1; continue; }; - - BZ_GET_FAST_C(k1); c_nblock_used++; - c_state_out_len = ((Int32)k1) + 4; - BZ_GET_FAST_C(c_k0); c_nblock_used++; - } - - return_notr: - total_out_lo32_old = s->strm->total_out_lo32; - s->strm->total_out_lo32 += (avail_out_INIT - cs_avail_out); - if (s->strm->total_out_lo32 < total_out_lo32_old) - s->strm->total_out_hi32++; - - /* save */ - s->calculatedBlockCRC = c_calculatedBlockCRC; - s->state_out_ch = c_state_out_ch; - s->state_out_len = c_state_out_len; - s->nblock_used = c_nblock_used; - s->k0 = c_k0; - s->tt = c_tt; - s->tPos = c_tPos; - s->strm->next_out = cs_next_out; - s->strm->avail_out = cs_avail_out; - /* end save */ - } -} - - - -/*---------------------------------------------------*/ -__inline__ Int32 BZ2_indexIntoF ( Int32 indx, Int32 *cftab ) -{ - Int32 nb, na, mid; - nb = 0; - na = 256; - do { - mid = (nb + na) >> 1; - if (indx >= cftab[mid]) nb = mid; else na = mid; - } - while (na - nb != 1); - return nb; -} - - -/*---------------------------------------------------*/ -static -void unRLE_obuf_to_output_SMALL ( DState* s ) -{ - UChar k1; - - if (s->blockRandomised) { - - while (True) { - /* try to finish existing run */ - while (True) { - if (s->strm->avail_out == 0) return; - if (s->state_out_len == 0) break; - *( (UChar*)(s->strm->next_out) ) = s->state_out_ch; - BZ_UPDATE_CRC ( s->calculatedBlockCRC, s->state_out_ch ); - s->state_out_len--; - s->strm->next_out++; - s->strm->avail_out--; - s->strm->total_out_lo32++; - if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++; - } - - /* can a new run be started? */ - if (s->nblock_used == s->save_nblock+1) return; - - - s->state_out_len = 1; - s->state_out_ch = s->k0; - BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK; - k1 ^= BZ_RAND_MASK; s->nblock_used++; - if (s->nblock_used == s->save_nblock+1) continue; - if (k1 != s->k0) { s->k0 = k1; continue; }; - - s->state_out_len = 2; - BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK; - k1 ^= BZ_RAND_MASK; s->nblock_used++; - if (s->nblock_used == s->save_nblock+1) continue; - if (k1 != s->k0) { s->k0 = k1; continue; }; - - s->state_out_len = 3; - BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK; - k1 ^= BZ_RAND_MASK; s->nblock_used++; - if (s->nblock_used == s->save_nblock+1) continue; - if (k1 != s->k0) { s->k0 = k1; continue; }; - - BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK; - k1 ^= BZ_RAND_MASK; s->nblock_used++; - s->state_out_len = ((Int32)k1) + 4; - BZ_GET_SMALL(s->k0); BZ_RAND_UPD_MASK; - s->k0 ^= BZ_RAND_MASK; s->nblock_used++; - } - - } else { - - while (True) { - /* try to finish existing run */ - while (True) { - if (s->strm->avail_out == 0) return; - if (s->state_out_len == 0) break; - *( (UChar*)(s->strm->next_out) ) = s->state_out_ch; - BZ_UPDATE_CRC ( s->calculatedBlockCRC, s->state_out_ch ); - s->state_out_len--; - s->strm->next_out++; - s->strm->avail_out--; - s->strm->total_out_lo32++; - if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++; - } - - /* can a new run be started? */ - if (s->nblock_used == s->save_nblock+1) return; - - s->state_out_len = 1; - s->state_out_ch = s->k0; - BZ_GET_SMALL(k1); s->nblock_used++; - if (s->nblock_used == s->save_nblock+1) continue; - if (k1 != s->k0) { s->k0 = k1; continue; }; - - s->state_out_len = 2; - BZ_GET_SMALL(k1); s->nblock_used++; - if (s->nblock_used == s->save_nblock+1) continue; - if (k1 != s->k0) { s->k0 = k1; continue; }; - - s->state_out_len = 3; - BZ_GET_SMALL(k1); s->nblock_used++; - if (s->nblock_used == s->save_nblock+1) continue; - if (k1 != s->k0) { s->k0 = k1; continue; }; - - BZ_GET_SMALL(k1); s->nblock_used++; - s->state_out_len = ((Int32)k1) + 4; - BZ_GET_SMALL(s->k0); s->nblock_used++; - } - - } -} - - -/*---------------------------------------------------*/ -int BZ_API(BZ2_bzDecompress) ( bz_stream *strm ) -{ - DState* s; - if (strm == NULL) return BZ_PARAM_ERROR; - s = strm->state; - if (s == NULL) return BZ_PARAM_ERROR; - if (s->strm != strm) return BZ_PARAM_ERROR; - - while (True) { - if (s->state == BZ_X_IDLE) return BZ_SEQUENCE_ERROR; - if (s->state == BZ_X_OUTPUT) { - if (s->smallDecompress) - unRLE_obuf_to_output_SMALL ( s ); else - unRLE_obuf_to_output_FAST ( s ); - if (s->nblock_used == s->save_nblock+1 && s->state_out_len == 0) { - BZ_FINALISE_CRC ( s->calculatedBlockCRC ); - if (s->verbosity >= 3) - VPrintf2 ( " {0x%x, 0x%x}", s->storedBlockCRC, - s->calculatedBlockCRC ); - if (s->verbosity >= 2) VPrintf0 ( "]" ); - if (s->calculatedBlockCRC != s->storedBlockCRC) - return BZ_DATA_ERROR; - s->calculatedCombinedCRC - = (s->calculatedCombinedCRC << 1) | - (s->calculatedCombinedCRC >> 31); - s->calculatedCombinedCRC ^= s->calculatedBlockCRC; - s->state = BZ_X_BLKHDR_1; - } else { - return BZ_OK; - } - } - if (s->state >= BZ_X_MAGIC_1) { - Int32 r = BZ2_decompress ( s ); - if (r == BZ_STREAM_END) { - if (s->verbosity >= 3) - VPrintf2 ( "\n combined CRCs: stored = 0x%x, computed = 0x%x", - s->storedCombinedCRC, s->calculatedCombinedCRC ); - if (s->calculatedCombinedCRC != s->storedCombinedCRC) - return BZ_DATA_ERROR; - return r; - } - if (s->state != BZ_X_OUTPUT) return r; - } - } - - AssertH ( 0, 6001 ); - - return 0; /*NOTREACHED*/ -} - - -/*---------------------------------------------------*/ -int BZ_API(BZ2_bzDecompressEnd) ( bz_stream *strm ) -{ - DState* s; - if (strm == NULL) return BZ_PARAM_ERROR; - s = strm->state; - if (s == NULL) return BZ_PARAM_ERROR; - if (s->strm != strm) return BZ_PARAM_ERROR; - - if (s->tt != NULL) BZFREE(s->tt); - if (s->ll16 != NULL) BZFREE(s->ll16); - if (s->ll4 != NULL) BZFREE(s->ll4); - - BZFREE(strm->state); - strm->state = NULL; - - return BZ_OK; -} - - -#ifndef BZ_NO_STDIO -/*---------------------------------------------------*/ -/*--- File I/O stuff ---*/ -/*---------------------------------------------------*/ - -#define BZ_SETERR(eee) \ -{ \ - if (bzerror != NULL) *bzerror = eee; \ - if (bzf != NULL) bzf->lastErr = eee; \ -} - -typedef - struct { - FILE* handle; - Char buf[BZ_MAX_UNUSED]; - Int32 bufN; - Bool writing; - bz_stream strm; - Int32 lastErr; - Bool initialisedOk; - } - bzFile; - - -/*---------------------------------------------*/ -static Bool myfeof ( FILE* f ) -{ - return feof(f) ? True : False; -} - - -/*---------------------------------------------------*/ -BZFILE* BZ_API(BZ2_bzWriteOpen) - ( int* bzerror, - FILE* f, - int blockSize100k, - int verbosity, - int workFactor ) -{ - Int32 ret; - bzFile* bzf = NULL; - - BZ_SETERR(BZ_OK); - - if (f == NULL || - (blockSize100k < 1 || blockSize100k > 9) || - (workFactor < 0 || workFactor > 250) || - (verbosity < 0 || verbosity > 4)) - { BZ_SETERR(BZ_PARAM_ERROR); return NULL; }; - - if (ferror(f)) - { BZ_SETERR(BZ_IO_ERROR); return NULL; }; - - bzf = malloc ( sizeof(bzFile) ); - if (bzf == NULL) - { BZ_SETERR(BZ_MEM_ERROR); return NULL; }; - - BZ_SETERR(BZ_OK); - bzf->initialisedOk = False; - bzf->bufN = 0; - bzf->handle = f; - bzf->writing = True; - bzf->strm.bzalloc = NULL; - bzf->strm.bzfree = NULL; - bzf->strm.opaque = NULL; - - if (workFactor == 0) workFactor = 30; - ret = BZ2_bzCompressInit ( &(bzf->strm), blockSize100k, - verbosity, workFactor ); - if (ret != BZ_OK) - { BZ_SETERR(ret); free(bzf); return NULL; }; - - bzf->strm.avail_in = 0; - bzf->initialisedOk = True; - return bzf; -} - - - -/*---------------------------------------------------*/ -void BZ_API(BZ2_bzWrite) - ( int* bzerror, - BZFILE* b, - void* buf, - int len ) -{ - Int32 n, n2, ret; - bzFile* bzf = (bzFile*)b; - - BZ_SETERR(BZ_OK); - if (bzf == NULL || buf == NULL || len < 0) - { BZ_SETERR(BZ_PARAM_ERROR); return; }; - if (!(bzf->writing)) - { BZ_SETERR(BZ_SEQUENCE_ERROR); return; }; - if (ferror(bzf->handle)) - { BZ_SETERR(BZ_IO_ERROR); return; }; - - if (len == 0) - { BZ_SETERR(BZ_OK); return; }; - - bzf->strm.avail_in = len; - bzf->strm.next_in = buf; - - while (True) { - bzf->strm.avail_out = BZ_MAX_UNUSED; - bzf->strm.next_out = bzf->buf; - ret = BZ2_bzCompress ( &(bzf->strm), BZ_RUN ); - if (ret != BZ_RUN_OK) - { BZ_SETERR(ret); return; }; - - if (bzf->strm.avail_out < BZ_MAX_UNUSED) { - n = BZ_MAX_UNUSED - bzf->strm.avail_out; - n2 = fwrite ( (void*)(bzf->buf), sizeof(UChar), - n, bzf->handle ); - if (n != n2 || ferror(bzf->handle)) - { BZ_SETERR(BZ_IO_ERROR); return; }; - } - - if (bzf->strm.avail_in == 0) - { BZ_SETERR(BZ_OK); return; }; - } -} - - -/*---------------------------------------------------*/ -void BZ_API(BZ2_bzWriteClose) - ( int* bzerror, - BZFILE* b, - int abandon, - unsigned int* nbytes_in, - unsigned int* nbytes_out ) -{ - BZ2_bzWriteClose64 ( bzerror, b, abandon, - nbytes_in, NULL, nbytes_out, NULL ); -} - - -void BZ_API(BZ2_bzWriteClose64) - ( int* bzerror, - BZFILE* b, - int abandon, - unsigned int* nbytes_in_lo32, - unsigned int* nbytes_in_hi32, - unsigned int* nbytes_out_lo32, - unsigned int* nbytes_out_hi32 ) -{ - Int32 n, n2, ret; - bzFile* bzf = (bzFile*)b; - - if (bzf == NULL) - { BZ_SETERR(BZ_OK); return; }; - if (!(bzf->writing)) - { BZ_SETERR(BZ_SEQUENCE_ERROR); return; }; - if (ferror(bzf->handle)) - { BZ_SETERR(BZ_IO_ERROR); return; }; - - if (nbytes_in_lo32 != NULL) *nbytes_in_lo32 = 0; - if (nbytes_in_hi32 != NULL) *nbytes_in_hi32 = 0; - if (nbytes_out_lo32 != NULL) *nbytes_out_lo32 = 0; - if (nbytes_out_hi32 != NULL) *nbytes_out_hi32 = 0; - - if ((!abandon) && bzf->lastErr == BZ_OK) { - while (True) { - bzf->strm.avail_out = BZ_MAX_UNUSED; - bzf->strm.next_out = bzf->buf; - ret = BZ2_bzCompress ( &(bzf->strm), BZ_FINISH ); - if (ret != BZ_FINISH_OK && ret != BZ_STREAM_END) - { BZ_SETERR(ret); return; }; - - if (bzf->strm.avail_out < BZ_MAX_UNUSED) { - n = BZ_MAX_UNUSED - bzf->strm.avail_out; - n2 = fwrite ( (void*)(bzf->buf), sizeof(UChar), - n, bzf->handle ); - if (n != n2 || ferror(bzf->handle)) - { BZ_SETERR(BZ_IO_ERROR); return; }; - } - - if (ret == BZ_STREAM_END) break; - } - } - - if ( !abandon && !ferror ( bzf->handle ) ) { - fflush ( bzf->handle ); - if (ferror(bzf->handle)) - { BZ_SETERR(BZ_IO_ERROR); return; }; - } - - if (nbytes_in_lo32 != NULL) - *nbytes_in_lo32 = bzf->strm.total_in_lo32; - if (nbytes_in_hi32 != NULL) - *nbytes_in_hi32 = bzf->strm.total_in_hi32; - if (nbytes_out_lo32 != NULL) - *nbytes_out_lo32 = bzf->strm.total_out_lo32; - if (nbytes_out_hi32 != NULL) - *nbytes_out_hi32 = bzf->strm.total_out_hi32; - - BZ_SETERR(BZ_OK); - BZ2_bzCompressEnd ( &(bzf->strm) ); - free ( bzf ); -} - - -/*---------------------------------------------------*/ -BZFILE* BZ_API(BZ2_bzReadOpen) - ( int* bzerror, - FILE* f, - int verbosity, - int small, - void* unused, - int nUnused ) -{ - bzFile* bzf = NULL; - int ret; - - BZ_SETERR(BZ_OK); - - if (f == NULL || - (small != 0 && small != 1) || - (verbosity < 0 || verbosity > 4) || - (unused == NULL && nUnused != 0) || - (unused != NULL && (nUnused < 0 || nUnused > BZ_MAX_UNUSED))) - { BZ_SETERR(BZ_PARAM_ERROR); return NULL; }; - - if (ferror(f)) - { BZ_SETERR(BZ_IO_ERROR); return NULL; }; - - bzf = malloc ( sizeof(bzFile) ); - if (bzf == NULL) - { BZ_SETERR(BZ_MEM_ERROR); return NULL; }; - - BZ_SETERR(BZ_OK); - - bzf->initialisedOk = False; - bzf->handle = f; - bzf->bufN = 0; - bzf->writing = False; - bzf->strm.bzalloc = NULL; - bzf->strm.bzfree = NULL; - bzf->strm.opaque = NULL; - - while (nUnused > 0) { - bzf->buf[bzf->bufN] = *((UChar*)(unused)); bzf->bufN++; - unused = ((void*)( 1 + ((UChar*)(unused)) )); - nUnused--; - } - - ret = BZ2_bzDecompressInit ( &(bzf->strm), verbosity, small ); - if (ret != BZ_OK) - { BZ_SETERR(ret); free(bzf); return NULL; }; - - bzf->strm.avail_in = bzf->bufN; - bzf->strm.next_in = bzf->buf; - - bzf->initialisedOk = True; - return bzf; -} - - -/*---------------------------------------------------*/ -void BZ_API(BZ2_bzReadClose) ( int *bzerror, BZFILE *b ) -{ - bzFile* bzf = (bzFile*)b; - - BZ_SETERR(BZ_OK); - if (bzf == NULL) - { BZ_SETERR(BZ_OK); return; }; - - if (bzf->writing) - { BZ_SETERR(BZ_SEQUENCE_ERROR); return; }; - - if (bzf->initialisedOk) - (void)BZ2_bzDecompressEnd ( &(bzf->strm) ); - free ( bzf ); -} - - -/*---------------------------------------------------*/ -int BZ_API(BZ2_bzRead) - ( int* bzerror, - BZFILE* b, - void* buf, - int len ) -{ - Int32 n, ret; - bzFile* bzf = (bzFile*)b; - - BZ_SETERR(BZ_OK); - - if (bzf == NULL || buf == NULL || len < 0) - { BZ_SETERR(BZ_PARAM_ERROR); return 0; }; - - if (bzf->writing) - { BZ_SETERR(BZ_SEQUENCE_ERROR); return 0; }; - - if (len == 0) - { BZ_SETERR(BZ_OK); return 0; }; - - bzf->strm.avail_out = len; - bzf->strm.next_out = buf; - - while (True) { - - if (ferror(bzf->handle)) - { BZ_SETERR(BZ_IO_ERROR); return 0; }; - - if (bzf->strm.avail_in == 0 && !myfeof(bzf->handle)) { - n = fread ( bzf->buf, sizeof(UChar), - BZ_MAX_UNUSED, bzf->handle ); - if (ferror(bzf->handle)) - { BZ_SETERR(BZ_IO_ERROR); return 0; }; - bzf->bufN = n; - bzf->strm.avail_in = bzf->bufN; - bzf->strm.next_in = bzf->buf; - } - - ret = BZ2_bzDecompress ( &(bzf->strm) ); - - if (ret != BZ_OK && ret != BZ_STREAM_END) - { BZ_SETERR(ret); return 0; }; - - if (ret == BZ_OK && myfeof(bzf->handle) && - bzf->strm.avail_in == 0 && bzf->strm.avail_out > 0) - { BZ_SETERR(BZ_UNEXPECTED_EOF); return 0; }; - - if (ret == BZ_STREAM_END) - { BZ_SETERR(BZ_STREAM_END); - return len - bzf->strm.avail_out; }; - if (bzf->strm.avail_out == 0) - { BZ_SETERR(BZ_OK); return len; }; - - } - - return 0; /*not reached*/ -} - - -/*---------------------------------------------------*/ -void BZ_API(BZ2_bzReadGetUnused) - ( int* bzerror, - BZFILE* b, - void** unused, - int* nUnused ) -{ - bzFile* bzf = (bzFile*)b; - if (bzf == NULL) - { BZ_SETERR(BZ_PARAM_ERROR); return; }; - if (bzf->lastErr != BZ_STREAM_END) - { BZ_SETERR(BZ_SEQUENCE_ERROR); return; }; - if (unused == NULL || nUnused == NULL) - { BZ_SETERR(BZ_PARAM_ERROR); return; }; - - BZ_SETERR(BZ_OK); - *nUnused = bzf->strm.avail_in; - *unused = bzf->strm.next_in; -} -#endif - - -/*---------------------------------------------------*/ -/*--- Misc convenience stuff ---*/ -/*---------------------------------------------------*/ - -/*---------------------------------------------------*/ -int BZ_API(BZ2_bzBuffToBuffCompress) - ( char* dest, - unsigned int* destLen, - char* source, - unsigned int sourceLen, - int blockSize100k, - int verbosity, - int workFactor ) -{ - bz_stream strm; - int ret; - - if (dest == NULL || destLen == NULL || - source == NULL || - blockSize100k < 1 || blockSize100k > 9 || - verbosity < 0 || verbosity > 4 || - workFactor < 0 || workFactor > 250) - return BZ_PARAM_ERROR; - - if (workFactor == 0) workFactor = 30; - strm.bzalloc = NULL; - strm.bzfree = NULL; - strm.opaque = NULL; - ret = BZ2_bzCompressInit ( &strm, blockSize100k, - verbosity, workFactor ); - if (ret != BZ_OK) return ret; - - strm.next_in = source; - strm.next_out = dest; - strm.avail_in = sourceLen; - strm.avail_out = *destLen; - - ret = BZ2_bzCompress ( &strm, BZ_FINISH ); - if (ret == BZ_FINISH_OK) goto output_overflow; - if (ret != BZ_STREAM_END) goto errhandler; - - /* normal termination */ - *destLen -= strm.avail_out; - BZ2_bzCompressEnd ( &strm ); - return BZ_OK; - - output_overflow: - BZ2_bzCompressEnd ( &strm ); - return BZ_OUTBUFF_FULL; - - errhandler: - BZ2_bzCompressEnd ( &strm ); - return ret; -} - - -/*---------------------------------------------------*/ -int BZ_API(BZ2_bzBuffToBuffDecompress) - ( char* dest, - unsigned int* destLen, - char* source, - unsigned int sourceLen, - int small, - int verbosity ) -{ - bz_stream strm; - int ret; - - if (dest == NULL || destLen == NULL || - source == NULL || - (small != 0 && small != 1) || - verbosity < 0 || verbosity > 4) - return BZ_PARAM_ERROR; - - strm.bzalloc = NULL; - strm.bzfree = NULL; - strm.opaque = NULL; - ret = BZ2_bzDecompressInit ( &strm, verbosity, small ); - if (ret != BZ_OK) return ret; - - strm.next_in = source; - strm.next_out = dest; - strm.avail_in = sourceLen; - strm.avail_out = *destLen; - - ret = BZ2_bzDecompress ( &strm ); - if (ret == BZ_OK) goto output_overflow_or_eof; - if (ret != BZ_STREAM_END) goto errhandler; - - /* normal termination */ - *destLen -= strm.avail_out; - BZ2_bzDecompressEnd ( &strm ); - return BZ_OK; - - output_overflow_or_eof: - if (strm.avail_out > 0) { - BZ2_bzDecompressEnd ( &strm ); - return BZ_UNEXPECTED_EOF; - } else { - BZ2_bzDecompressEnd ( &strm ); - return BZ_OUTBUFF_FULL; - }; - - errhandler: - BZ2_bzDecompressEnd ( &strm ); - return ret; -} - - -/*---------------------------------------------------*/ -/*-- - Code contributed by Yoshioka Tsuneo - (QWF00133@niftyserve.or.jp/tsuneo-y@is.aist-nara.ac.jp), - to support better zlib compatibility. - This code is not _officially_ part of libbzip2 (yet); - I haven't tested it, documented it, or considered the - threading-safeness of it. - If this code breaks, please contact both Yoshioka and me. ---*/ -/*---------------------------------------------------*/ - -/*---------------------------------------------------*/ -/*-- - return version like "0.9.0c". ---*/ -const char * BZ_API(BZ2_bzlibVersion)(void) -{ - return BZ_VERSION; -} - - -#ifndef BZ_NO_STDIO -/*---------------------------------------------------*/ - -#if defined(_WIN32) || defined(OS2) || defined(MSDOS) -# include <fcntl.h> -# include <io.h> -# define SET_BINARY_MODE(file) setmode(fileno(file),O_BINARY) -#else -# define SET_BINARY_MODE(file) -#endif -static -BZFILE * bzopen_or_bzdopen - ( const char *path, /* no use when bzdopen */ - int fd, /* no use when bzdopen */ - const char *mode, - int open_mode) /* bzopen: 0, bzdopen:1 */ -{ - int bzerr; - char unused[BZ_MAX_UNUSED]; - int blockSize100k = 9; - int writing = 0; - char mode2[10] = ""; - FILE *fp = NULL; - BZFILE *bzfp = NULL; - int verbosity = 0; - int workFactor = 30; - int smallMode = 0; - int nUnused = 0; - - if (mode == NULL) return NULL; - while (*mode) { - switch (*mode) { - case 'r': - writing = 0; break; - case 'w': - writing = 1; break; - case 's': - smallMode = 1; break; - default: - if (isdigit((int)(*mode))) { - blockSize100k = *mode-'0'; - } - } - mode++; - } - strcat(mode2, writing ? "w" : "r" ); - strcat(mode2,"b"); /* binary mode */ - - if (open_mode==0) { - if (path==NULL || strcmp(path,"")==0) { - fp = (writing ? stdout : stdin); - SET_BINARY_MODE(fp); - } else { - fp = fopen(path,mode2); - } - } else { -#ifdef BZ_STRICT_ANSI - fp = NULL; -#else - fp = fdopen(fd,mode2); -#endif - } - if (fp == NULL) return NULL; - - if (writing) { - /* Guard against total chaos and anarchy -- JRS */ - if (blockSize100k < 1) blockSize100k = 1; - if (blockSize100k > 9) blockSize100k = 9; - bzfp = BZ2_bzWriteOpen(&bzerr,fp,blockSize100k, - verbosity,workFactor); - } else { - bzfp = BZ2_bzReadOpen(&bzerr,fp,verbosity,smallMode, - unused,nUnused); - } - if (bzfp == NULL) { - if (fp != stdin && fp != stdout) fclose(fp); - return NULL; - } - return bzfp; -} - - -/*---------------------------------------------------*/ -/*-- - open file for read or write. - ex) bzopen("file","w9") - case path="" or NULL => use stdin or stdout. ---*/ -BZFILE * BZ_API(BZ2_bzopen) - ( const char *path, - const char *mode ) -{ - return bzopen_or_bzdopen(path,-1,mode,/*bzopen*/0); -} - - -/*---------------------------------------------------*/ -BZFILE * BZ_API(BZ2_bzdopen) - ( int fd, - const char *mode ) -{ - return bzopen_or_bzdopen(NULL,fd,mode,/*bzdopen*/1); -} - - -/*---------------------------------------------------*/ -int BZ_API(BZ2_bzread) (BZFILE* b, void* buf, int len ) -{ - int bzerr, nread; - if (((bzFile*)b)->lastErr == BZ_STREAM_END) return 0; - nread = BZ2_bzRead(&bzerr,b,buf,len); - if (bzerr == BZ_OK || bzerr == BZ_STREAM_END) { - return nread; - } else { - return -1; - } -} - - -/*---------------------------------------------------*/ -int BZ_API(BZ2_bzwrite) (BZFILE* b, void* buf, int len ) -{ - int bzerr; - - BZ2_bzWrite(&bzerr,b,buf,len); - if(bzerr == BZ_OK){ - return len; - }else{ - return -1; - } -} - - -/*---------------------------------------------------*/ -int BZ_API(BZ2_bzflush) (BZFILE *b) -{ - /* do nothing now... */ - return 0; -} - - -/*---------------------------------------------------*/ -void BZ_API(BZ2_bzclose) (BZFILE* b) -{ - int bzerr; - FILE *fp = ((bzFile *)b)->handle; - - if (b==NULL) {return;} - if(((bzFile*)b)->writing){ - BZ2_bzWriteClose(&bzerr,b,0,NULL,NULL); - if(bzerr != BZ_OK){ - BZ2_bzWriteClose(NULL,b,1,NULL,NULL); - } - }else{ - BZ2_bzReadClose(&bzerr,b); - } - if(fp!=stdin && fp!=stdout){ - fclose(fp); - } -} - - -/*---------------------------------------------------*/ -/*-- - return last error code ---*/ -static char *bzerrorstrings[] = { - "OK" - ,"SEQUENCE_ERROR" - ,"PARAM_ERROR" - ,"MEM_ERROR" - ,"DATA_ERROR" - ,"DATA_ERROR_MAGIC" - ,"IO_ERROR" - ,"UNEXPECTED_EOF" - ,"OUTBUFF_FULL" - ,"CONFIG_ERROR" - ,"???" /* for future */ - ,"???" /* for future */ - ,"???" /* for future */ - ,"???" /* for future */ - ,"???" /* for future */ - ,"???" /* for future */ -}; - - -const char * BZ_API(BZ2_bzerror) (BZFILE *b, int *errnum) -{ - int err = ((bzFile *)b)->lastErr; - - if(err>0) err = 0; - *errnum = err; - return bzerrorstrings[err*-1]; -} -#endif - - -/*-------------------------------------------------------------*/ -/*--- end bzlib.c ---*/ -/*-------------------------------------------------------------*/ diff --git a/mdk-stage1/bzlib/bzlib_private.h b/mdk-stage1/bzlib/bzlib_private.h deleted file mode 100644 index fb51c7a1d..000000000 --- a/mdk-stage1/bzlib/bzlib_private.h +++ /dev/null @@ -1,530 +0,0 @@ - -/*-------------------------------------------------------------*/ -/*--- Private header file for the library. ---*/ -/*--- bzlib_private.h ---*/ -/*-------------------------------------------------------------*/ - -/*-- - This file is a part of bzip2 and/or libbzip2, a program and - library for lossless, block-sorting data compression. - - Copyright (C) 1996-2000 Julian R Seward. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - 2. The origin of this software must not be misrepresented; you must - not claim that you wrote the original software. If you use this - software in a product, an acknowledgment in the product - documentation would be appreciated but is not required. - - 3. Altered source versions must be plainly marked as such, and must - not be misrepresented as being the original software. - - 4. The name of the author may not be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS - OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY - DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - Julian Seward, Cambridge, UK. - jseward@acm.org - bzip2/libbzip2 version 1.0 of 21 March 2000 - - This program is based on (at least) the work of: - Mike Burrows - David Wheeler - Peter Fenwick - Alistair Moffat - Radford Neal - Ian H. Witten - Robert Sedgewick - Jon L. Bentley - - For more information on these sources, see the manual. ---*/ - - -#ifndef _BZLIB_PRIVATE_H -#define _BZLIB_PRIVATE_H - -#include <stdlib.h> - -#ifndef BZ_NO_STDIO -#include <stdio.h> -#include <ctype.h> -#include <string.h> -#endif - -#include "bzlib.h" - - - -/*-- General stuff. --*/ - -#define BZ_VERSION "1.0.1, 23-June-2000" - -typedef char Char; -typedef unsigned char Bool; -typedef unsigned char UChar; -typedef int Int32; -typedef unsigned int UInt32; -typedef short Int16; -typedef unsigned short UInt16; - -#define True ((Bool)1) -#define False ((Bool)0) - -#ifndef __GNUC__ -#define __inline__ /* */ -#endif - -#ifndef BZ_NO_STDIO -extern void BZ2_bz__AssertH__fail ( int errcode ); -#define AssertH(cond,errcode) \ - { if (!(cond)) BZ2_bz__AssertH__fail ( errcode ); } -#if BZ_DEBUG -#define AssertD(cond,msg) \ - { if (!(cond)) { \ - fprintf ( stderr, \ - "\n\nlibbzip2(debug build): internal error\n\t%s\n", msg );\ - exit(1); \ - }} -#else -#define AssertD(cond,msg) /* */ -#endif -#define VPrintf0(zf) \ - fprintf(stderr,zf) -#define VPrintf1(zf,za1) \ - fprintf(stderr,zf,za1) -#define VPrintf2(zf,za1,za2) \ - fprintf(stderr,zf,za1,za2) -#define VPrintf3(zf,za1,za2,za3) \ - fprintf(stderr,zf,za1,za2,za3) -#define VPrintf4(zf,za1,za2,za3,za4) \ - fprintf(stderr,zf,za1,za2,za3,za4) -#define VPrintf5(zf,za1,za2,za3,za4,za5) \ - fprintf(stderr,zf,za1,za2,za3,za4,za5) -#else -extern void bz_internal_error ( int errcode ); -#define AssertH(cond,errcode) \ - { if (!(cond)) bz_internal_error ( errcode ); } -#define AssertD(cond,msg) /* */ -#define VPrintf0(zf) /* */ -#define VPrintf1(zf,za1) /* */ -#define VPrintf2(zf,za1,za2) /* */ -#define VPrintf3(zf,za1,za2,za3) /* */ -#define VPrintf4(zf,za1,za2,za3,za4) /* */ -#define VPrintf5(zf,za1,za2,za3,za4,za5) /* */ -#endif - - -#define BZALLOC(nnn) (strm->bzalloc)(strm->opaque,(nnn),1) -#define BZFREE(ppp) (strm->bzfree)(strm->opaque,(ppp)) - - -/*-- Constants for the back end. --*/ - -#define BZ_MAX_ALPHA_SIZE 258 -#define BZ_MAX_CODE_LEN 23 - -#define BZ_RUNA 0 -#define BZ_RUNB 1 - -#define BZ_N_GROUPS 6 -#define BZ_G_SIZE 50 -#define BZ_N_ITERS 4 - -#define BZ_MAX_SELECTORS (2 + (900000 / BZ_G_SIZE)) - - - -/*-- Stuff for randomising repetitive blocks. --*/ - -extern Int32 BZ2_rNums[512]; - -#define BZ_RAND_DECLS \ - Int32 rNToGo; \ - Int32 rTPos \ - -#define BZ_RAND_INIT_MASK \ - s->rNToGo = 0; \ - s->rTPos = 0 \ - -#define BZ_RAND_MASK ((s->rNToGo == 1) ? 1 : 0) - -#define BZ_RAND_UPD_MASK \ - if (s->rNToGo == 0) { \ - s->rNToGo = BZ2_rNums[s->rTPos]; \ - s->rTPos++; \ - if (s->rTPos == 512) s->rTPos = 0; \ - } \ - s->rNToGo--; - - - -/*-- Stuff for doing CRCs. --*/ - -extern UInt32 BZ2_crc32Table[256]; - -#define BZ_INITIALISE_CRC(crcVar) \ -{ \ - crcVar = 0xffffffffL; \ -} - -#define BZ_FINALISE_CRC(crcVar) \ -{ \ - crcVar = ~(crcVar); \ -} - -#define BZ_UPDATE_CRC(crcVar,cha) \ -{ \ - crcVar = (crcVar << 8) ^ \ - BZ2_crc32Table[(crcVar >> 24) ^ \ - ((UChar)cha)]; \ -} - - - -/*-- States and modes for compression. --*/ - -#define BZ_M_IDLE 1 -#define BZ_M_RUNNING 2 -#define BZ_M_FLUSHING 3 -#define BZ_M_FINISHING 4 - -#define BZ_S_OUTPUT 1 -#define BZ_S_INPUT 2 - -#define BZ_N_RADIX 2 -#define BZ_N_QSORT 12 -#define BZ_N_SHELL 18 -#define BZ_N_OVERSHOOT (BZ_N_RADIX + BZ_N_QSORT + BZ_N_SHELL + 2) - - - - -/*-- Structure holding all the compression-side stuff. --*/ - -typedef - struct { - /* pointer back to the struct bz_stream */ - bz_stream* strm; - - /* mode this stream is in, and whether inputting */ - /* or outputting data */ - Int32 mode; - Int32 state; - - /* remembers avail_in when flush/finish requested */ - UInt32 avail_in_expect; - - /* for doing the block sorting */ - UInt32* arr1; - UInt32* arr2; - UInt32* ftab; - Int32 origPtr; - - /* aliases for arr1 and arr2 */ - UInt32* ptr; - UChar* block; - UInt16* mtfv; - UChar* zbits; - - /* for deciding when to use the fallback sorting algorithm */ - Int32 workFactor; - - /* run-length-encoding of the input */ - UInt32 state_in_ch; - Int32 state_in_len; - BZ_RAND_DECLS; - - /* input and output limits and current posns */ - Int32 nblock; - Int32 nblockMAX; - Int32 numZ; - Int32 state_out_pos; - - /* map of bytes used in block */ - Int32 nInUse; - Bool inUse[256]; - UChar unseqToSeq[256]; - - /* the buffer for bit stream creation */ - UInt32 bsBuff; - Int32 bsLive; - - /* block and combined CRCs */ - UInt32 blockCRC; - UInt32 combinedCRC; - - /* misc administratium */ - Int32 verbosity; - Int32 blockNo; - Int32 blockSize100k; - - /* stuff for coding the MTF values */ - Int32 nMTF; - Int32 mtfFreq [BZ_MAX_ALPHA_SIZE]; - UChar selector [BZ_MAX_SELECTORS]; - UChar selectorMtf[BZ_MAX_SELECTORS]; - - UChar len [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; - Int32 code [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; - Int32 rfreq [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; - /* second dimension: only 3 needed; 4 makes index calculations faster */ - UInt32 len_pack[BZ_MAX_ALPHA_SIZE][4]; - - } - EState; - - - -/*-- externs for compression. --*/ - -extern void -BZ2_blockSort ( EState* ); - -extern void -BZ2_compressBlock ( EState*, Bool ); - -extern void -BZ2_bsInitWrite ( EState* ); - -extern void -BZ2_hbAssignCodes ( Int32*, UChar*, Int32, Int32, Int32 ); - -extern void -BZ2_hbMakeCodeLengths ( UChar*, Int32*, Int32, Int32 ); - - - -/*-- states for decompression. --*/ - -#define BZ_X_IDLE 1 -#define BZ_X_OUTPUT 2 - -#define BZ_X_MAGIC_1 10 -#define BZ_X_MAGIC_2 11 -#define BZ_X_MAGIC_3 12 -#define BZ_X_MAGIC_4 13 -#define BZ_X_BLKHDR_1 14 -#define BZ_X_BLKHDR_2 15 -#define BZ_X_BLKHDR_3 16 -#define BZ_X_BLKHDR_4 17 -#define BZ_X_BLKHDR_5 18 -#define BZ_X_BLKHDR_6 19 -#define BZ_X_BCRC_1 20 -#define BZ_X_BCRC_2 21 -#define BZ_X_BCRC_3 22 -#define BZ_X_BCRC_4 23 -#define BZ_X_RANDBIT 24 -#define BZ_X_ORIGPTR_1 25 -#define BZ_X_ORIGPTR_2 26 -#define BZ_X_ORIGPTR_3 27 -#define BZ_X_MAPPING_1 28 -#define BZ_X_MAPPING_2 29 -#define BZ_X_SELECTOR_1 30 -#define BZ_X_SELECTOR_2 31 -#define BZ_X_SELECTOR_3 32 -#define BZ_X_CODING_1 33 -#define BZ_X_CODING_2 34 -#define BZ_X_CODING_3 35 -#define BZ_X_MTF_1 36 -#define BZ_X_MTF_2 37 -#define BZ_X_MTF_3 38 -#define BZ_X_MTF_4 39 -#define BZ_X_MTF_5 40 -#define BZ_X_MTF_6 41 -#define BZ_X_ENDHDR_2 42 -#define BZ_X_ENDHDR_3 43 -#define BZ_X_ENDHDR_4 44 -#define BZ_X_ENDHDR_5 45 -#define BZ_X_ENDHDR_6 46 -#define BZ_X_CCRC_1 47 -#define BZ_X_CCRC_2 48 -#define BZ_X_CCRC_3 49 -#define BZ_X_CCRC_4 50 - - - -/*-- Constants for the fast MTF decoder. --*/ - -#define MTFA_SIZE 4096 -#define MTFL_SIZE 16 - - - -/*-- Structure holding all the decompression-side stuff. --*/ - -typedef - struct { - /* pointer back to the struct bz_stream */ - bz_stream* strm; - - /* state indicator for this stream */ - Int32 state; - - /* for doing the final run-length decoding */ - UChar state_out_ch; - Int32 state_out_len; - Bool blockRandomised; - BZ_RAND_DECLS; - - /* the buffer for bit stream reading */ - UInt32 bsBuff; - Int32 bsLive; - - /* misc administratium */ - Int32 blockSize100k; - Bool smallDecompress; - Int32 currBlockNo; - Int32 verbosity; - - /* for undoing the Burrows-Wheeler transform */ - Int32 origPtr; - UInt32 tPos; - Int32 k0; - Int32 unzftab[256]; - Int32 nblock_used; - Int32 cftab[257]; - Int32 cftabCopy[257]; - - /* for undoing the Burrows-Wheeler transform (FAST) */ - UInt32 *tt; - - /* for undoing the Burrows-Wheeler transform (SMALL) */ - UInt16 *ll16; - UChar *ll4; - - /* stored and calculated CRCs */ - UInt32 storedBlockCRC; - UInt32 storedCombinedCRC; - UInt32 calculatedBlockCRC; - UInt32 calculatedCombinedCRC; - - /* map of bytes used in block */ - Int32 nInUse; - Bool inUse[256]; - Bool inUse16[16]; - UChar seqToUnseq[256]; - - /* for decoding the MTF values */ - UChar mtfa [MTFA_SIZE]; - Int32 mtfbase[256 / MTFL_SIZE]; - UChar selector [BZ_MAX_SELECTORS]; - UChar selectorMtf[BZ_MAX_SELECTORS]; - UChar len [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; - - Int32 limit [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; - Int32 base [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; - Int32 perm [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; - Int32 minLens[BZ_N_GROUPS]; - - /* save area for scalars in the main decompress code */ - Int32 save_i; - Int32 save_j; - Int32 save_t; - Int32 save_alphaSize; - Int32 save_nGroups; - Int32 save_nSelectors; - Int32 save_EOB; - Int32 save_groupNo; - Int32 save_groupPos; - Int32 save_nextSym; - Int32 save_nblockMAX; - Int32 save_nblock; - Int32 save_es; - Int32 save_N; - Int32 save_curr; - Int32 save_zt; - Int32 save_zn; - Int32 save_zvec; - Int32 save_zj; - Int32 save_gSel; - Int32 save_gMinlen; - Int32* save_gLimit; - Int32* save_gBase; - Int32* save_gPerm; - - } - DState; - - - -/*-- Macros for decompression. --*/ - -#define BZ_GET_FAST(cccc) \ - s->tPos = s->tt[s->tPos]; \ - cccc = (UChar)(s->tPos & 0xff); \ - s->tPos >>= 8; - -#define BZ_GET_FAST_C(cccc) \ - c_tPos = c_tt[c_tPos]; \ - cccc = (UChar)(c_tPos & 0xff); \ - c_tPos >>= 8; - -#define SET_LL4(i,n) \ - { if (((i) & 0x1) == 0) \ - s->ll4[(i) >> 1] = (s->ll4[(i) >> 1] & 0xf0) | (n); else \ - s->ll4[(i) >> 1] = (s->ll4[(i) >> 1] & 0x0f) | ((n) << 4); \ - } - -#define GET_LL4(i) \ - ((((UInt32)(s->ll4[(i) >> 1])) >> (((i) << 2) & 0x4)) & 0xF) - -#define SET_LL(i,n) \ - { s->ll16[i] = (UInt16)(n & 0x0000ffff); \ - SET_LL4(i, n >> 16); \ - } - -#define GET_LL(i) \ - (((UInt32)s->ll16[i]) | (GET_LL4(i) << 16)) - -#define BZ_GET_SMALL(cccc) \ - cccc = BZ2_indexIntoF ( s->tPos, s->cftab ); \ - s->tPos = GET_LL(s->tPos); - - -/*-- externs for decompression. --*/ - -extern Int32 -BZ2_indexIntoF ( Int32, Int32* ); - -extern Int32 -BZ2_decompress ( DState* ); - -extern void -BZ2_hbCreateDecodeTables ( Int32*, Int32*, Int32*, UChar*, - Int32, Int32, Int32 ); - - -#endif - - -/*-- BZ_NO_STDIO seems to make NULL disappear on some platforms. --*/ - -#ifdef BZ_NO_STDIO -#ifndef NULL -#define NULL 0 -#endif -#endif - - -/*-------------------------------------------------------------*/ -/*--- end bzlib_private.h ---*/ -/*-------------------------------------------------------------*/ diff --git a/mdk-stage1/bzlib/compress.c b/mdk-stage1/bzlib/compress.c deleted file mode 100644 index 58d5abe7c..000000000 --- a/mdk-stage1/bzlib/compress.c +++ /dev/null @@ -1,720 +0,0 @@ - -/*-------------------------------------------------------------*/ -/*--- Compression machinery (not incl block sorting) ---*/ -/*--- compress.c ---*/ -/*-------------------------------------------------------------*/ - -/*-- - This file is a part of bzip2 and/or libbzip2, a program and - library for lossless, block-sorting data compression. - - Copyright (C) 1996-2000 Julian R Seward. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - 2. The origin of this software must not be misrepresented; you must - not claim that you wrote the original software. If you use this - software in a product, an acknowledgment in the product - documentation would be appreciated but is not required. - - 3. Altered source versions must be plainly marked as such, and must - not be misrepresented as being the original software. - - 4. The name of the author may not be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS - OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY - DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - Julian Seward, Cambridge, UK. - jseward@acm.org - bzip2/libbzip2 version 1.0 of 21 March 2000 - - This program is based on (at least) the work of: - Mike Burrows - David Wheeler - Peter Fenwick - Alistair Moffat - Radford Neal - Ian H. Witten - Robert Sedgewick - Jon L. Bentley - - For more information on these sources, see the manual. ---*/ - -/*-- - CHANGES - ~~~~~~~ - 0.9.0 -- original version. - - 0.9.0a/b -- no changes in this file. - - 0.9.0c - * changed setting of nGroups in sendMTFValues() so as to - do a bit better on small files ---*/ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - - - -#include "bzlib_private.h" - - -/*---------------------------------------------------*/ -/*--- Bit stream I/O ---*/ -/*---------------------------------------------------*/ - -/*---------------------------------------------------*/ -void BZ2_bsInitWrite ( EState* s ) -{ - s->bsLive = 0; - s->bsBuff = 0; -} - - -/*---------------------------------------------------*/ -static -void bsFinishWrite ( EState* s ) -{ - while (s->bsLive > 0) { - s->zbits[s->numZ] = (UChar)(s->bsBuff >> 24); - s->numZ++; - s->bsBuff <<= 8; - s->bsLive -= 8; - } -} - - -/*---------------------------------------------------*/ -#define bsNEEDW(nz) \ -{ \ - while (s->bsLive >= 8) { \ - s->zbits[s->numZ] \ - = (UChar)(s->bsBuff >> 24); \ - s->numZ++; \ - s->bsBuff <<= 8; \ - s->bsLive -= 8; \ - } \ -} - - -/*---------------------------------------------------*/ -static -__inline__ -void bsW ( EState* s, Int32 n, UInt32 v ) -{ - bsNEEDW ( n ); - s->bsBuff |= (v << (32 - s->bsLive - n)); - s->bsLive += n; -} - - -/*---------------------------------------------------*/ -static -void bsPutUInt32 ( EState* s, UInt32 u ) -{ - bsW ( s, 8, (u >> 24) & 0xffL ); - bsW ( s, 8, (u >> 16) & 0xffL ); - bsW ( s, 8, (u >> 8) & 0xffL ); - bsW ( s, 8, u & 0xffL ); -} - - -/*---------------------------------------------------*/ -static -void bsPutUChar ( EState* s, UChar c ) -{ - bsW( s, 8, (UInt32)c ); -} - - -/*---------------------------------------------------*/ -/*--- The back end proper ---*/ -/*---------------------------------------------------*/ - -/*---------------------------------------------------*/ -static -void makeMaps_e ( EState* s ) -{ - Int32 i; - s->nInUse = 0; - for (i = 0; i < 256; i++) - if (s->inUse[i]) { - s->unseqToSeq[i] = s->nInUse; - s->nInUse++; - } -} - - -/*---------------------------------------------------*/ -static -void generateMTFValues ( EState* s ) -{ - UChar yy[256]; - Int32 i, j; - Int32 zPend; - Int32 wr; - Int32 EOB; - - /* - After sorting (eg, here), - s->arr1 [ 0 .. s->nblock-1 ] holds sorted order, - and - ((UChar*)s->arr2) [ 0 .. s->nblock-1 ] - holds the original block data. - - The first thing to do is generate the MTF values, - and put them in - ((UInt16*)s->arr1) [ 0 .. s->nblock-1 ]. - Because there are strictly fewer or equal MTF values - than block values, ptr values in this area are overwritten - with MTF values only when they are no longer needed. - - The final compressed bitstream is generated into the - area starting at - (UChar*) (&((UChar*)s->arr2)[s->nblock]) - - These storage aliases are set up in bzCompressInit(), - except for the last one, which is arranged in - compressBlock(). - */ - UInt32* ptr = s->ptr; - UChar* block = s->block; - UInt16* mtfv = s->mtfv; - - makeMaps_e ( s ); - EOB = s->nInUse+1; - - for (i = 0; i <= EOB; i++) s->mtfFreq[i] = 0; - - wr = 0; - zPend = 0; - for (i = 0; i < s->nInUse; i++) yy[i] = (UChar) i; - - for (i = 0; i < s->nblock; i++) { - UChar ll_i; - AssertD ( wr <= i, "generateMTFValues(1)" ); - j = ptr[i]-1; if (j < 0) j += s->nblock; - ll_i = s->unseqToSeq[block[j]]; - AssertD ( ll_i < s->nInUse, "generateMTFValues(2a)" ); - - if (yy[0] == ll_i) { - zPend++; - } else { - - if (zPend > 0) { - zPend--; - while (True) { - if (zPend & 1) { - mtfv[wr] = BZ_RUNB; wr++; - s->mtfFreq[BZ_RUNB]++; - } else { - mtfv[wr] = BZ_RUNA; wr++; - s->mtfFreq[BZ_RUNA]++; - } - if (zPend < 2) break; - zPend = (zPend - 2) / 2; - }; - zPend = 0; - } - { - register UChar rtmp; - register UChar* ryy_j; - register UChar rll_i; - rtmp = yy[1]; - yy[1] = yy[0]; - ryy_j = &(yy[1]); - rll_i = ll_i; - while ( rll_i != rtmp ) { - register UChar rtmp2; - ryy_j++; - rtmp2 = rtmp; - rtmp = *ryy_j; - *ryy_j = rtmp2; - }; - yy[0] = rtmp; - j = ryy_j - &(yy[0]); - mtfv[wr] = j+1; wr++; s->mtfFreq[j+1]++; - } - - } - } - - if (zPend > 0) { - zPend--; - while (True) { - if (zPend & 1) { - mtfv[wr] = BZ_RUNB; wr++; - s->mtfFreq[BZ_RUNB]++; - } else { - mtfv[wr] = BZ_RUNA; wr++; - s->mtfFreq[BZ_RUNA]++; - } - if (zPend < 2) break; - zPend = (zPend - 2) / 2; - }; - zPend = 0; - } - - mtfv[wr] = EOB; wr++; s->mtfFreq[EOB]++; - - s->nMTF = wr; -} - - -/*---------------------------------------------------*/ -#define BZ_LESSER_ICOST 0 -#define BZ_GREATER_ICOST 15 - -static -void sendMTFValues ( EState* s ) -{ - Int32 v, t, i, j, gs, ge, totc, bt, bc, iter; - Int32 nSelectors, alphaSize, minLen, maxLen, selCtr; - Int32 nGroups, nBytes; - - /*-- - UChar len [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; - is a global since the decoder also needs it. - - Int32 code[BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; - Int32 rfreq[BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; - are also globals only used in this proc. - Made global to keep stack frame size small. - --*/ - - - UInt16 cost[BZ_N_GROUPS]; - Int32 fave[BZ_N_GROUPS]; - - UInt16* mtfv = s->mtfv; - - if (s->verbosity >= 3) - VPrintf3( " %d in block, %d after MTF & 1-2 coding, " - "%d+2 syms in use\n", - s->nblock, s->nMTF, s->nInUse ); - - alphaSize = s->nInUse+2; - for (t = 0; t < BZ_N_GROUPS; t++) - for (v = 0; v < alphaSize; v++) - s->len[t][v] = BZ_GREATER_ICOST; - - /*--- Decide how many coding tables to use ---*/ - AssertH ( s->nMTF > 0, 3001 ); - if (s->nMTF < 200) nGroups = 2; else - if (s->nMTF < 600) nGroups = 3; else - if (s->nMTF < 1200) nGroups = 4; else - if (s->nMTF < 2400) nGroups = 5; else - nGroups = 6; - - /*--- Generate an initial set of coding tables ---*/ - { - Int32 nPart, remF, tFreq, aFreq; - - nPart = nGroups; - remF = s->nMTF; - gs = 0; - while (nPart > 0) { - tFreq = remF / nPart; - ge = gs-1; - aFreq = 0; - while (aFreq < tFreq && ge < alphaSize-1) { - ge++; - aFreq += s->mtfFreq[ge]; - } - - if (ge > gs - && nPart != nGroups && nPart != 1 - && ((nGroups-nPart) % 2 == 1)) { - aFreq -= s->mtfFreq[ge]; - ge--; - } - - if (s->verbosity >= 3) - VPrintf5( " initial group %d, [%d .. %d], " - "has %d syms (%4.1f%%)\n", - nPart, gs, ge, aFreq, - (100.0 * (float)aFreq) / (float)(s->nMTF) ); - - for (v = 0; v < alphaSize; v++) - if (v >= gs && v <= ge) - s->len[nPart-1][v] = BZ_LESSER_ICOST; else - s->len[nPart-1][v] = BZ_GREATER_ICOST; - - nPart--; - gs = ge+1; - remF -= aFreq; - } - } - - /*--- - Iterate up to BZ_N_ITERS times to improve the tables. - ---*/ - for (iter = 0; iter < BZ_N_ITERS; iter++) { - - for (t = 0; t < nGroups; t++) fave[t] = 0; - - for (t = 0; t < nGroups; t++) - for (v = 0; v < alphaSize; v++) - s->rfreq[t][v] = 0; - - /*--- - Set up an auxiliary length table which is used to fast-track - the common case (nGroups == 6). - ---*/ - if (nGroups == 6) { - for (v = 0; v < alphaSize; v++) { - s->len_pack[v][0] = (s->len[1][v] << 16) | s->len[0][v]; - s->len_pack[v][1] = (s->len[3][v] << 16) | s->len[2][v]; - s->len_pack[v][2] = (s->len[5][v] << 16) | s->len[4][v]; - } - } - - nSelectors = 0; - totc = 0; - gs = 0; - while (True) { - - /*--- Set group start & end marks. --*/ - if (gs >= s->nMTF) break; - ge = gs + BZ_G_SIZE - 1; - if (ge >= s->nMTF) ge = s->nMTF-1; - - /*-- - Calculate the cost of this group as coded - by each of the coding tables. - --*/ - for (t = 0; t < nGroups; t++) cost[t] = 0; - - if (nGroups == 6 && 50 == ge-gs+1) { - /*--- fast track the common case ---*/ - register UInt32 cost01, cost23, cost45; - register UInt16 icv; - cost01 = cost23 = cost45 = 0; - -# define BZ_ITER(nn) \ - icv = mtfv[gs+(nn)]; \ - cost01 += s->len_pack[icv][0]; \ - cost23 += s->len_pack[icv][1]; \ - cost45 += s->len_pack[icv][2]; \ - - BZ_ITER(0); BZ_ITER(1); BZ_ITER(2); BZ_ITER(3); BZ_ITER(4); - BZ_ITER(5); BZ_ITER(6); BZ_ITER(7); BZ_ITER(8); BZ_ITER(9); - BZ_ITER(10); BZ_ITER(11); BZ_ITER(12); BZ_ITER(13); BZ_ITER(14); - BZ_ITER(15); BZ_ITER(16); BZ_ITER(17); BZ_ITER(18); BZ_ITER(19); - BZ_ITER(20); BZ_ITER(21); BZ_ITER(22); BZ_ITER(23); BZ_ITER(24); - BZ_ITER(25); BZ_ITER(26); BZ_ITER(27); BZ_ITER(28); BZ_ITER(29); - BZ_ITER(30); BZ_ITER(31); BZ_ITER(32); BZ_ITER(33); BZ_ITER(34); - BZ_ITER(35); BZ_ITER(36); BZ_ITER(37); BZ_ITER(38); BZ_ITER(39); - BZ_ITER(40); BZ_ITER(41); BZ_ITER(42); BZ_ITER(43); BZ_ITER(44); - BZ_ITER(45); BZ_ITER(46); BZ_ITER(47); BZ_ITER(48); BZ_ITER(49); - -# undef BZ_ITER - - cost[0] = cost01 & 0xffff; cost[1] = cost01 >> 16; - cost[2] = cost23 & 0xffff; cost[3] = cost23 >> 16; - cost[4] = cost45 & 0xffff; cost[5] = cost45 >> 16; - - } else { - /*--- slow version which correctly handles all situations ---*/ - for (i = gs; i <= ge; i++) { - UInt16 icv = mtfv[i]; - for (t = 0; t < nGroups; t++) cost[t] += s->len[t][icv]; - } - } - - /*-- - Find the coding table which is best for this group, - and record its identity in the selector table. - --*/ - bc = 999999999; bt = -1; - for (t = 0; t < nGroups; t++) - if (cost[t] < bc) { bc = cost[t]; bt = t; }; - totc += bc; - fave[bt]++; - s->selector[nSelectors] = bt; - nSelectors++; - - /*-- - Increment the symbol frequencies for the selected table. - --*/ - if (nGroups == 6 && 50 == ge-gs+1) { - /*--- fast track the common case ---*/ - -# define BZ_ITUR(nn) s->rfreq[bt][ mtfv[gs+(nn)] ]++ - - BZ_ITUR(0); BZ_ITUR(1); BZ_ITUR(2); BZ_ITUR(3); BZ_ITUR(4); - BZ_ITUR(5); BZ_ITUR(6); BZ_ITUR(7); BZ_ITUR(8); BZ_ITUR(9); - BZ_ITUR(10); BZ_ITUR(11); BZ_ITUR(12); BZ_ITUR(13); BZ_ITUR(14); - BZ_ITUR(15); BZ_ITUR(16); BZ_ITUR(17); BZ_ITUR(18); BZ_ITUR(19); - BZ_ITUR(20); BZ_ITUR(21); BZ_ITUR(22); BZ_ITUR(23); BZ_ITUR(24); - BZ_ITUR(25); BZ_ITUR(26); BZ_ITUR(27); BZ_ITUR(28); BZ_ITUR(29); - BZ_ITUR(30); BZ_ITUR(31); BZ_ITUR(32); BZ_ITUR(33); BZ_ITUR(34); - BZ_ITUR(35); BZ_ITUR(36); BZ_ITUR(37); BZ_ITUR(38); BZ_ITUR(39); - BZ_ITUR(40); BZ_ITUR(41); BZ_ITUR(42); BZ_ITUR(43); BZ_ITUR(44); - BZ_ITUR(45); BZ_ITUR(46); BZ_ITUR(47); BZ_ITUR(48); BZ_ITUR(49); - -# undef BZ_ITUR - - } else { - /*--- slow version which correctly handles all situations ---*/ - for (i = gs; i <= ge; i++) - s->rfreq[bt][ mtfv[i] ]++; - } - - gs = ge+1; - } - if (s->verbosity >= 3) { - VPrintf2 ( " pass %d: size is %d, grp uses are ", - iter+1, totc/8 ); - for (t = 0; t < nGroups; t++) - VPrintf1 ( "%d ", fave[t] ); - VPrintf0 ( "\n" ); - } - - /*-- - Recompute the tables based on the accumulated frequencies. - --*/ - for (t = 0; t < nGroups; t++) - BZ2_hbMakeCodeLengths ( &(s->len[t][0]), &(s->rfreq[t][0]), - alphaSize, 20 ); - } - - - AssertH( nGroups < 8, 3002 ); - AssertH( nSelectors < 32768 && - nSelectors <= (2 + (900000 / BZ_G_SIZE)), - 3003 ); - - - /*--- Compute MTF values for the selectors. ---*/ - { - UChar pos[BZ_N_GROUPS], ll_i, tmp2, tmp; - for (i = 0; i < nGroups; i++) pos[i] = i; - for (i = 0; i < nSelectors; i++) { - ll_i = s->selector[i]; - j = 0; - tmp = pos[j]; - while ( ll_i != tmp ) { - j++; - tmp2 = tmp; - tmp = pos[j]; - pos[j] = tmp2; - }; - pos[0] = tmp; - s->selectorMtf[i] = j; - } - }; - - /*--- Assign actual codes for the tables. --*/ - for (t = 0; t < nGroups; t++) { - minLen = 32; - maxLen = 0; - for (i = 0; i < alphaSize; i++) { - if (s->len[t][i] > maxLen) maxLen = s->len[t][i]; - if (s->len[t][i] < minLen) minLen = s->len[t][i]; - } - AssertH ( !(maxLen > 20), 3004 ); - AssertH ( !(minLen < 1), 3005 ); - BZ2_hbAssignCodes ( &(s->code[t][0]), &(s->len[t][0]), - minLen, maxLen, alphaSize ); - } - - /*--- Transmit the mapping table. ---*/ - { - Bool inUse16[16]; - for (i = 0; i < 16; i++) { - inUse16[i] = False; - for (j = 0; j < 16; j++) - if (s->inUse[i * 16 + j]) inUse16[i] = True; - } - - nBytes = s->numZ; - for (i = 0; i < 16; i++) - if (inUse16[i]) bsW(s,1,1); else bsW(s,1,0); - - for (i = 0; i < 16; i++) - if (inUse16[i]) - for (j = 0; j < 16; j++) { - if (s->inUse[i * 16 + j]) bsW(s,1,1); else bsW(s,1,0); - } - - if (s->verbosity >= 3) - VPrintf1( " bytes: mapping %d, ", s->numZ-nBytes ); - } - - /*--- Now the selectors. ---*/ - nBytes = s->numZ; - bsW ( s, 3, nGroups ); - bsW ( s, 15, nSelectors ); - for (i = 0; i < nSelectors; i++) { - for (j = 0; j < s->selectorMtf[i]; j++) bsW(s,1,1); - bsW(s,1,0); - } - if (s->verbosity >= 3) - VPrintf1( "selectors %d, ", s->numZ-nBytes ); - - /*--- Now the coding tables. ---*/ - nBytes = s->numZ; - - for (t = 0; t < nGroups; t++) { - Int32 curr = s->len[t][0]; - bsW ( s, 5, curr ); - for (i = 0; i < alphaSize; i++) { - while (curr < s->len[t][i]) { bsW(s,2,2); curr++; /* 10 */ }; - while (curr > s->len[t][i]) { bsW(s,2,3); curr--; /* 11 */ }; - bsW ( s, 1, 0 ); - } - } - - if (s->verbosity >= 3) - VPrintf1 ( "code lengths %d, ", s->numZ-nBytes ); - - /*--- And finally, the block data proper ---*/ - nBytes = s->numZ; - selCtr = 0; - gs = 0; - while (True) { - if (gs >= s->nMTF) break; - ge = gs + BZ_G_SIZE - 1; - if (ge >= s->nMTF) ge = s->nMTF-1; - AssertH ( s->selector[selCtr] < nGroups, 3006 ); - - if (nGroups == 6 && 50 == ge-gs+1) { - /*--- fast track the common case ---*/ - UInt16 mtfv_i; - UChar* s_len_sel_selCtr - = &(s->len[s->selector[selCtr]][0]); - Int32* s_code_sel_selCtr - = &(s->code[s->selector[selCtr]][0]); - -# define BZ_ITAH(nn) \ - mtfv_i = mtfv[gs+(nn)]; \ - bsW ( s, \ - s_len_sel_selCtr[mtfv_i], \ - s_code_sel_selCtr[mtfv_i] ) - - BZ_ITAH(0); BZ_ITAH(1); BZ_ITAH(2); BZ_ITAH(3); BZ_ITAH(4); - BZ_ITAH(5); BZ_ITAH(6); BZ_ITAH(7); BZ_ITAH(8); BZ_ITAH(9); - BZ_ITAH(10); BZ_ITAH(11); BZ_ITAH(12); BZ_ITAH(13); BZ_ITAH(14); - BZ_ITAH(15); BZ_ITAH(16); BZ_ITAH(17); BZ_ITAH(18); BZ_ITAH(19); - BZ_ITAH(20); BZ_ITAH(21); BZ_ITAH(22); BZ_ITAH(23); BZ_ITAH(24); - BZ_ITAH(25); BZ_ITAH(26); BZ_ITAH(27); BZ_ITAH(28); BZ_ITAH(29); - BZ_ITAH(30); BZ_ITAH(31); BZ_ITAH(32); BZ_ITAH(33); BZ_ITAH(34); - BZ_ITAH(35); BZ_ITAH(36); BZ_ITAH(37); BZ_ITAH(38); BZ_ITAH(39); - BZ_ITAH(40); BZ_ITAH(41); BZ_ITAH(42); BZ_ITAH(43); BZ_ITAH(44); - BZ_ITAH(45); BZ_ITAH(46); BZ_ITAH(47); BZ_ITAH(48); BZ_ITAH(49); - -# undef BZ_ITAH - - } else { - /*--- slow version which correctly handles all situations ---*/ - for (i = gs; i <= ge; i++) { - bsW ( s, - s->len [s->selector[selCtr]] [mtfv[i]], - s->code [s->selector[selCtr]] [mtfv[i]] ); - } - } - - - gs = ge+1; - selCtr++; - } - AssertH( selCtr == nSelectors, 3007 ); - - if (s->verbosity >= 3) - VPrintf1( "codes %d\n", s->numZ-nBytes ); -} - - -/*---------------------------------------------------*/ -void BZ2_compressBlock ( EState* s, Bool is_last_block ) -{ - if (s->nblock > 0) { - - BZ_FINALISE_CRC ( s->blockCRC ); - s->combinedCRC = (s->combinedCRC << 1) | (s->combinedCRC >> 31); - s->combinedCRC ^= s->blockCRC; - if (s->blockNo > 1) s->numZ = 0; - - if (s->verbosity >= 2) - VPrintf4( " block %d: crc = 0x%8x, " - "combined CRC = 0x%8x, size = %d\n", - s->blockNo, s->blockCRC, s->combinedCRC, s->nblock ); - - BZ2_blockSort ( s ); - } - - s->zbits = (UChar*) (&((UChar*)s->arr2)[s->nblock]); - - /*-- If this is the first block, create the stream header. --*/ - if (s->blockNo == 1) { - BZ2_bsInitWrite ( s ); - bsPutUChar ( s, 'B' ); - bsPutUChar ( s, 'Z' ); - bsPutUChar ( s, 'h' ); - bsPutUChar ( s, (UChar)('0' + s->blockSize100k) ); - } - - if (s->nblock > 0) { - - bsPutUChar ( s, 0x31 ); bsPutUChar ( s, 0x41 ); - bsPutUChar ( s, 0x59 ); bsPutUChar ( s, 0x26 ); - bsPutUChar ( s, 0x53 ); bsPutUChar ( s, 0x59 ); - - /*-- Now the block's CRC, so it is in a known place. --*/ - bsPutUInt32 ( s, s->blockCRC ); - - /*-- - Now a single bit indicating (non-)randomisation. - As of version 0.9.5, we use a better sorting algorithm - which makes randomisation unnecessary. So always set - the randomised bit to 'no'. Of course, the decoder - still needs to be able to handle randomised blocks - so as to maintain backwards compatibility with - older versions of bzip2. - --*/ - bsW(s,1,0); - - bsW ( s, 24, s->origPtr ); - generateMTFValues ( s ); - sendMTFValues ( s ); - } - - - /*-- If this is the last block, add the stream trailer. --*/ - if (is_last_block) { - - bsPutUChar ( s, 0x17 ); bsPutUChar ( s, 0x72 ); - bsPutUChar ( s, 0x45 ); bsPutUChar ( s, 0x38 ); - bsPutUChar ( s, 0x50 ); bsPutUChar ( s, 0x90 ); - bsPutUInt32 ( s, s->combinedCRC ); - if (s->verbosity >= 2) - VPrintf1( " final combined CRC = 0x%x\n ", s->combinedCRC ); - bsFinishWrite ( s ); - } -} - - -/*-------------------------------------------------------------*/ -/*--- end compress.c ---*/ -/*-------------------------------------------------------------*/ diff --git a/mdk-stage1/bzlib/crctable.c b/mdk-stage1/bzlib/crctable.c deleted file mode 100644 index c0ea3f769..000000000 --- a/mdk-stage1/bzlib/crctable.c +++ /dev/null @@ -1,148 +0,0 @@ - -/*-------------------------------------------------------------*/ -/*--- Table for doing CRCs ---*/ -/*--- crctable.c ---*/ -/*-------------------------------------------------------------*/ - -/*-- - This file is a part of bzip2 and/or libbzip2, a program and - library for lossless, block-sorting data compression. - - Copyright (C) 1996-2000 Julian R Seward. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - 2. The origin of this software must not be misrepresented; you must - not claim that you wrote the original software. If you use this - software in a product, an acknowledgment in the product - documentation would be appreciated but is not required. - - 3. Altered source versions must be plainly marked as such, and must - not be misrepresented as being the original software. - - 4. The name of the author may not be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS - OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY - DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - Julian Seward, Cambridge, UK. - jseward@acm.org - bzip2/libbzip2 version 1.0 of 21 March 2000 - - This program is based on (at least) the work of: - Mike Burrows - David Wheeler - Peter Fenwick - Alistair Moffat - Radford Neal - Ian H. Witten - Robert Sedgewick - Jon L. Bentley - - For more information on these sources, see the manual. ---*/ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - - -#include "bzlib_private.h" - -/*-- - I think this is an implementation of the AUTODIN-II, - Ethernet & FDDI 32-bit CRC standard. Vaguely derived - from code by Rob Warnock, in Section 51 of the - comp.compression FAQ. ---*/ - -UInt32 BZ2_crc32Table[256] = { - - /*-- Ugly, innit? --*/ - - 0x00000000L, 0x04c11db7L, 0x09823b6eL, 0x0d4326d9L, - 0x130476dcL, 0x17c56b6bL, 0x1a864db2L, 0x1e475005L, - 0x2608edb8L, 0x22c9f00fL, 0x2f8ad6d6L, 0x2b4bcb61L, - 0x350c9b64L, 0x31cd86d3L, 0x3c8ea00aL, 0x384fbdbdL, - 0x4c11db70L, 0x48d0c6c7L, 0x4593e01eL, 0x4152fda9L, - 0x5f15adacL, 0x5bd4b01bL, 0x569796c2L, 0x52568b75L, - 0x6a1936c8L, 0x6ed82b7fL, 0x639b0da6L, 0x675a1011L, - 0x791d4014L, 0x7ddc5da3L, 0x709f7b7aL, 0x745e66cdL, - 0x9823b6e0L, 0x9ce2ab57L, 0x91a18d8eL, 0x95609039L, - 0x8b27c03cL, 0x8fe6dd8bL, 0x82a5fb52L, 0x8664e6e5L, - 0xbe2b5b58L, 0xbaea46efL, 0xb7a96036L, 0xb3687d81L, - 0xad2f2d84L, 0xa9ee3033L, 0xa4ad16eaL, 0xa06c0b5dL, - 0xd4326d90L, 0xd0f37027L, 0xddb056feL, 0xd9714b49L, - 0xc7361b4cL, 0xc3f706fbL, 0xceb42022L, 0xca753d95L, - 0xf23a8028L, 0xf6fb9d9fL, 0xfbb8bb46L, 0xff79a6f1L, - 0xe13ef6f4L, 0xe5ffeb43L, 0xe8bccd9aL, 0xec7dd02dL, - 0x34867077L, 0x30476dc0L, 0x3d044b19L, 0x39c556aeL, - 0x278206abL, 0x23431b1cL, 0x2e003dc5L, 0x2ac12072L, - 0x128e9dcfL, 0x164f8078L, 0x1b0ca6a1L, 0x1fcdbb16L, - 0x018aeb13L, 0x054bf6a4L, 0x0808d07dL, 0x0cc9cdcaL, - 0x7897ab07L, 0x7c56b6b0L, 0x71159069L, 0x75d48ddeL, - 0x6b93dddbL, 0x6f52c06cL, 0x6211e6b5L, 0x66d0fb02L, - 0x5e9f46bfL, 0x5a5e5b08L, 0x571d7dd1L, 0x53dc6066L, - 0x4d9b3063L, 0x495a2dd4L, 0x44190b0dL, 0x40d816baL, - 0xaca5c697L, 0xa864db20L, 0xa527fdf9L, 0xa1e6e04eL, - 0xbfa1b04bL, 0xbb60adfcL, 0xb6238b25L, 0xb2e29692L, - 0x8aad2b2fL, 0x8e6c3698L, 0x832f1041L, 0x87ee0df6L, - 0x99a95df3L, 0x9d684044L, 0x902b669dL, 0x94ea7b2aL, - 0xe0b41de7L, 0xe4750050L, 0xe9362689L, 0xedf73b3eL, - 0xf3b06b3bL, 0xf771768cL, 0xfa325055L, 0xfef34de2L, - 0xc6bcf05fL, 0xc27dede8L, 0xcf3ecb31L, 0xcbffd686L, - 0xd5b88683L, 0xd1799b34L, 0xdc3abdedL, 0xd8fba05aL, - 0x690ce0eeL, 0x6dcdfd59L, 0x608edb80L, 0x644fc637L, - 0x7a089632L, 0x7ec98b85L, 0x738aad5cL, 0x774bb0ebL, - 0x4f040d56L, 0x4bc510e1L, 0x46863638L, 0x42472b8fL, - 0x5c007b8aL, 0x58c1663dL, 0x558240e4L, 0x51435d53L, - 0x251d3b9eL, 0x21dc2629L, 0x2c9f00f0L, 0x285e1d47L, - 0x36194d42L, 0x32d850f5L, 0x3f9b762cL, 0x3b5a6b9bL, - 0x0315d626L, 0x07d4cb91L, 0x0a97ed48L, 0x0e56f0ffL, - 0x1011a0faL, 0x14d0bd4dL, 0x19939b94L, 0x1d528623L, - 0xf12f560eL, 0xf5ee4bb9L, 0xf8ad6d60L, 0xfc6c70d7L, - 0xe22b20d2L, 0xe6ea3d65L, 0xeba91bbcL, 0xef68060bL, - 0xd727bbb6L, 0xd3e6a601L, 0xdea580d8L, 0xda649d6fL, - 0xc423cd6aL, 0xc0e2d0ddL, 0xcda1f604L, 0xc960ebb3L, - 0xbd3e8d7eL, 0xb9ff90c9L, 0xb4bcb610L, 0xb07daba7L, - 0xae3afba2L, 0xaafbe615L, 0xa7b8c0ccL, 0xa379dd7bL, - 0x9b3660c6L, 0x9ff77d71L, 0x92b45ba8L, 0x9675461fL, - 0x8832161aL, 0x8cf30badL, 0x81b02d74L, 0x857130c3L, - 0x5d8a9099L, 0x594b8d2eL, 0x5408abf7L, 0x50c9b640L, - 0x4e8ee645L, 0x4a4ffbf2L, 0x470cdd2bL, 0x43cdc09cL, - 0x7b827d21L, 0x7f436096L, 0x7200464fL, 0x76c15bf8L, - 0x68860bfdL, 0x6c47164aL, 0x61043093L, 0x65c52d24L, - 0x119b4be9L, 0x155a565eL, 0x18197087L, 0x1cd86d30L, - 0x029f3d35L, 0x065e2082L, 0x0b1d065bL, 0x0fdc1becL, - 0x3793a651L, 0x3352bbe6L, 0x3e119d3fL, 0x3ad08088L, - 0x2497d08dL, 0x2056cd3aL, 0x2d15ebe3L, 0x29d4f654L, - 0xc5a92679L, 0xc1683bceL, 0xcc2b1d17L, 0xc8ea00a0L, - 0xd6ad50a5L, 0xd26c4d12L, 0xdf2f6bcbL, 0xdbee767cL, - 0xe3a1cbc1L, 0xe760d676L, 0xea23f0afL, 0xeee2ed18L, - 0xf0a5bd1dL, 0xf464a0aaL, 0xf9278673L, 0xfde69bc4L, - 0x89b8fd09L, 0x8d79e0beL, 0x803ac667L, 0x84fbdbd0L, - 0x9abc8bd5L, 0x9e7d9662L, 0x933eb0bbL, 0x97ffad0cL, - 0xafb010b1L, 0xab710d06L, 0xa6322bdfL, 0xa2f33668L, - 0xbcb4666dL, 0xb8757bdaL, 0xb5365d03L, 0xb1f740b4L -}; - - -/*-------------------------------------------------------------*/ -/*--- end crctable.c ---*/ -/*-------------------------------------------------------------*/ diff --git a/mdk-stage1/bzlib/decompress.c b/mdk-stage1/bzlib/decompress.c deleted file mode 100644 index 65cf75d8f..000000000 --- a/mdk-stage1/bzlib/decompress.c +++ /dev/null @@ -1,664 +0,0 @@ - -/*-------------------------------------------------------------*/ -/*--- Decompression machinery ---*/ -/*--- decompress.c ---*/ -/*-------------------------------------------------------------*/ - -/*-- - This file is a part of bzip2 and/or libbzip2, a program and - library for lossless, block-sorting data compression. - - Copyright (C) 1996-2000 Julian R Seward. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - 2. The origin of this software must not be misrepresented; you must - not claim that you wrote the original software. If you use this - software in a product, an acknowledgment in the product - documentation would be appreciated but is not required. - - 3. Altered source versions must be plainly marked as such, and must - not be misrepresented as being the original software. - - 4. The name of the author may not be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS - OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY - DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - Julian Seward, Cambridge, UK. - jseward@acm.org - bzip2/libbzip2 version 1.0 of 21 March 2000 - - This program is based on (at least) the work of: - Mike Burrows - David Wheeler - Peter Fenwick - Alistair Moffat - Radford Neal - Ian H. Witten - Robert Sedgewick - Jon L. Bentley - - For more information on these sources, see the manual. ---*/ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - - -#include "bzlib_private.h" - - -/*---------------------------------------------------*/ -static -void makeMaps_d ( DState* s ) -{ - Int32 i; - s->nInUse = 0; - for (i = 0; i < 256; i++) - if (s->inUse[i]) { - s->seqToUnseq[s->nInUse] = i; - s->nInUse++; - } -} - - -/*---------------------------------------------------*/ -#define RETURN(rrr) \ - { retVal = rrr; goto save_state_and_return; }; - -#define GET_BITS(lll,vvv,nnn) \ - case lll: s->state = lll; \ - while (True) { \ - if (s->bsLive >= nnn) { \ - UInt32 v; \ - v = (s->bsBuff >> \ - (s->bsLive-nnn)) & ((1 << nnn)-1); \ - s->bsLive -= nnn; \ - vvv = v; \ - break; \ - } \ - if (s->strm->avail_in == 0) RETURN(BZ_OK); \ - s->bsBuff \ - = (s->bsBuff << 8) | \ - ((UInt32) \ - (*((UChar*)(s->strm->next_in)))); \ - s->bsLive += 8; \ - s->strm->next_in++; \ - s->strm->avail_in--; \ - s->strm->total_in_lo32++; \ - if (s->strm->total_in_lo32 == 0) \ - s->strm->total_in_hi32++; \ - } - -#define GET_UCHAR(lll,uuu) \ - GET_BITS(lll,uuu,8) - -#define GET_BIT(lll,uuu) \ - GET_BITS(lll,uuu,1) - -/*---------------------------------------------------*/ -#define GET_MTF_VAL(label1,label2,lval) \ -{ \ - if (groupPos == 0) { \ - groupNo++; \ - if (groupNo >= nSelectors) \ - RETURN(BZ_DATA_ERROR); \ - groupPos = BZ_G_SIZE; \ - gSel = s->selector[groupNo]; \ - gMinlen = s->minLens[gSel]; \ - gLimit = &(s->limit[gSel][0]); \ - gPerm = &(s->perm[gSel][0]); \ - gBase = &(s->base[gSel][0]); \ - } \ - groupPos--; \ - zn = gMinlen; \ - GET_BITS(label1, zvec, zn); \ - while (1) { \ - if (zn > 20 /* the longest code */) \ - RETURN(BZ_DATA_ERROR); \ - if (zvec <= gLimit[zn]) break; \ - zn++; \ - GET_BIT(label2, zj); \ - zvec = (zvec << 1) | zj; \ - }; \ - if (zvec - gBase[zn] < 0 \ - || zvec - gBase[zn] >= BZ_MAX_ALPHA_SIZE) \ - RETURN(BZ_DATA_ERROR); \ - lval = gPerm[zvec - gBase[zn]]; \ -} - - -/*---------------------------------------------------*/ -Int32 BZ2_decompress ( DState* s ) -{ - UChar uc; - Int32 retVal; - Int32 minLen, maxLen; - bz_stream* strm = s->strm; - - /* stuff that needs to be saved/restored */ - Int32 i; - Int32 j; - Int32 t; - Int32 alphaSize; - Int32 nGroups; - Int32 nSelectors; - Int32 EOB; - Int32 groupNo; - Int32 groupPos; - Int32 nextSym; - Int32 nblockMAX; - Int32 nblock; - Int32 es; - Int32 N; - Int32 curr; - Int32 zt; - Int32 zn; - Int32 zvec; - Int32 zj; - Int32 gSel; - Int32 gMinlen; - Int32* gLimit; - Int32* gBase; - Int32* gPerm; - - if (s->state == BZ_X_MAGIC_1) { - /*initialise the save area*/ - s->save_i = 0; - s->save_j = 0; - s->save_t = 0; - s->save_alphaSize = 0; - s->save_nGroups = 0; - s->save_nSelectors = 0; - s->save_EOB = 0; - s->save_groupNo = 0; - s->save_groupPos = 0; - s->save_nextSym = 0; - s->save_nblockMAX = 0; - s->save_nblock = 0; - s->save_es = 0; - s->save_N = 0; - s->save_curr = 0; - s->save_zt = 0; - s->save_zn = 0; - s->save_zvec = 0; - s->save_zj = 0; - s->save_gSel = 0; - s->save_gMinlen = 0; - s->save_gLimit = NULL; - s->save_gBase = NULL; - s->save_gPerm = NULL; - } - - /*restore from the save area*/ - i = s->save_i; - j = s->save_j; - t = s->save_t; - alphaSize = s->save_alphaSize; - nGroups = s->save_nGroups; - nSelectors = s->save_nSelectors; - EOB = s->save_EOB; - groupNo = s->save_groupNo; - groupPos = s->save_groupPos; - nextSym = s->save_nextSym; - nblockMAX = s->save_nblockMAX; - nblock = s->save_nblock; - es = s->save_es; - N = s->save_N; - curr = s->save_curr; - zt = s->save_zt; - zn = s->save_zn; - zvec = s->save_zvec; - zj = s->save_zj; - gSel = s->save_gSel; - gMinlen = s->save_gMinlen; - gLimit = s->save_gLimit; - gBase = s->save_gBase; - gPerm = s->save_gPerm; - - retVal = BZ_OK; - - switch (s->state) { - - GET_UCHAR(BZ_X_MAGIC_1, uc); - if (uc != 'B') RETURN(BZ_DATA_ERROR_MAGIC); - - GET_UCHAR(BZ_X_MAGIC_2, uc); - if (uc != 'Z') RETURN(BZ_DATA_ERROR_MAGIC); - - GET_UCHAR(BZ_X_MAGIC_3, uc) - if (uc != 'h') RETURN(BZ_DATA_ERROR_MAGIC); - - GET_BITS(BZ_X_MAGIC_4, s->blockSize100k, 8) - if (s->blockSize100k < '1' || - s->blockSize100k > '9') RETURN(BZ_DATA_ERROR_MAGIC); - s->blockSize100k -= '0'; - - if (s->smallDecompress) { - s->ll16 = BZALLOC( s->blockSize100k * 100000 * sizeof(UInt16) ); - s->ll4 = BZALLOC( - ((1 + s->blockSize100k * 100000) >> 1) * sizeof(UChar) - ); - if (s->ll16 == NULL || s->ll4 == NULL) RETURN(BZ_MEM_ERROR); - } else { - s->tt = BZALLOC( s->blockSize100k * 100000 * sizeof(Int32) ); - if (s->tt == NULL) RETURN(BZ_MEM_ERROR); - } - - GET_UCHAR(BZ_X_BLKHDR_1, uc); - - if (uc == 0x17) goto endhdr_2; - if (uc != 0x31) RETURN(BZ_DATA_ERROR); - GET_UCHAR(BZ_X_BLKHDR_2, uc); - if (uc != 0x41) RETURN(BZ_DATA_ERROR); - GET_UCHAR(BZ_X_BLKHDR_3, uc); - if (uc != 0x59) RETURN(BZ_DATA_ERROR); - GET_UCHAR(BZ_X_BLKHDR_4, uc); - if (uc != 0x26) RETURN(BZ_DATA_ERROR); - GET_UCHAR(BZ_X_BLKHDR_5, uc); - if (uc != 0x53) RETURN(BZ_DATA_ERROR); - GET_UCHAR(BZ_X_BLKHDR_6, uc); - if (uc != 0x59) RETURN(BZ_DATA_ERROR); - - s->currBlockNo++; - if (s->verbosity >= 2) - VPrintf1 ( "\n [%d: huff+mtf ", s->currBlockNo ); - - s->storedBlockCRC = 0; - GET_UCHAR(BZ_X_BCRC_1, uc); - s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc); - GET_UCHAR(BZ_X_BCRC_2, uc); - s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc); - GET_UCHAR(BZ_X_BCRC_3, uc); - s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc); - GET_UCHAR(BZ_X_BCRC_4, uc); - s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc); - - GET_BITS(BZ_X_RANDBIT, s->blockRandomised, 1); - - s->origPtr = 0; - GET_UCHAR(BZ_X_ORIGPTR_1, uc); - s->origPtr = (s->origPtr << 8) | ((Int32)uc); - GET_UCHAR(BZ_X_ORIGPTR_2, uc); - s->origPtr = (s->origPtr << 8) | ((Int32)uc); - GET_UCHAR(BZ_X_ORIGPTR_3, uc); - s->origPtr = (s->origPtr << 8) | ((Int32)uc); - - if (s->origPtr < 0) - RETURN(BZ_DATA_ERROR); - if (s->origPtr > 10 + 100000*s->blockSize100k) - RETURN(BZ_DATA_ERROR); - - /*--- Receive the mapping table ---*/ - for (i = 0; i < 16; i++) { - GET_BIT(BZ_X_MAPPING_1, uc); - if (uc == 1) - s->inUse16[i] = True; else - s->inUse16[i] = False; - } - - for (i = 0; i < 256; i++) s->inUse[i] = False; - - for (i = 0; i < 16; i++) - if (s->inUse16[i]) - for (j = 0; j < 16; j++) { - GET_BIT(BZ_X_MAPPING_2, uc); - if (uc == 1) s->inUse[i * 16 + j] = True; - } - makeMaps_d ( s ); - if (s->nInUse == 0) RETURN(BZ_DATA_ERROR); - alphaSize = s->nInUse+2; - - /*--- Now the selectors ---*/ - GET_BITS(BZ_X_SELECTOR_1, nGroups, 3); - if (nGroups < 2 || nGroups > 6) RETURN(BZ_DATA_ERROR); - GET_BITS(BZ_X_SELECTOR_2, nSelectors, 15); - if (nSelectors < 1) RETURN(BZ_DATA_ERROR); - for (i = 0; i < nSelectors; i++) { - j = 0; - while (True) { - GET_BIT(BZ_X_SELECTOR_3, uc); - if (uc == 0) break; - j++; - if (j >= nGroups) RETURN(BZ_DATA_ERROR); - } - s->selectorMtf[i] = j; - } - - /*--- Undo the MTF values for the selectors. ---*/ - { - UChar pos[BZ_N_GROUPS], tmp, v; - for (v = 0; v < nGroups; v++) pos[v] = v; - - for (i = 0; i < nSelectors; i++) { - v = s->selectorMtf[i]; - tmp = pos[v]; - while (v > 0) { pos[v] = pos[v-1]; v--; } - pos[0] = tmp; - s->selector[i] = tmp; - } - } - - /*--- Now the coding tables ---*/ - for (t = 0; t < nGroups; t++) { - GET_BITS(BZ_X_CODING_1, curr, 5); - for (i = 0; i < alphaSize; i++) { - while (True) { - if (curr < 1 || curr > 20) RETURN(BZ_DATA_ERROR); - GET_BIT(BZ_X_CODING_2, uc); - if (uc == 0) break; - GET_BIT(BZ_X_CODING_3, uc); - if (uc == 0) curr++; else curr--; - } - s->len[t][i] = curr; - } - } - - /*--- Create the Huffman decoding tables ---*/ - for (t = 0; t < nGroups; t++) { - minLen = 32; - maxLen = 0; - for (i = 0; i < alphaSize; i++) { - if (s->len[t][i] > maxLen) maxLen = s->len[t][i]; - if (s->len[t][i] < minLen) minLen = s->len[t][i]; - } - BZ2_hbCreateDecodeTables ( - &(s->limit[t][0]), - &(s->base[t][0]), - &(s->perm[t][0]), - &(s->len[t][0]), - minLen, maxLen, alphaSize - ); - s->minLens[t] = minLen; - } - - /*--- Now the MTF values ---*/ - - EOB = s->nInUse+1; - nblockMAX = 100000 * s->blockSize100k; - groupNo = -1; - groupPos = 0; - - for (i = 0; i <= 255; i++) s->unzftab[i] = 0; - - /*-- MTF init --*/ - { - Int32 ii, jj, kk; - kk = MTFA_SIZE-1; - for (ii = 256 / MTFL_SIZE - 1; ii >= 0; ii--) { - for (jj = MTFL_SIZE-1; jj >= 0; jj--) { - s->mtfa[kk] = (UChar)(ii * MTFL_SIZE + jj); - kk--; - } - s->mtfbase[ii] = kk + 1; - } - } - /*-- end MTF init --*/ - - nblock = 0; - GET_MTF_VAL(BZ_X_MTF_1, BZ_X_MTF_2, nextSym); - - while (True) { - - if (nextSym == EOB) break; - - if (nextSym == BZ_RUNA || nextSym == BZ_RUNB) { - - es = -1; - N = 1; - do { - if (nextSym == BZ_RUNA) es = es + (0+1) * N; else - if (nextSym == BZ_RUNB) es = es + (1+1) * N; - N = N * 2; - GET_MTF_VAL(BZ_X_MTF_3, BZ_X_MTF_4, nextSym); - } - while (nextSym == BZ_RUNA || nextSym == BZ_RUNB); - - es++; - uc = s->seqToUnseq[ s->mtfa[s->mtfbase[0]] ]; - s->unzftab[uc] += es; - - if (s->smallDecompress) - while (es > 0) { - if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR); - s->ll16[nblock] = (UInt16)uc; - nblock++; - es--; - } - else - while (es > 0) { - if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR); - s->tt[nblock] = (UInt32)uc; - nblock++; - es--; - }; - - continue; - - } else { - - if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR); - - /*-- uc = MTF ( nextSym-1 ) --*/ - { - Int32 ii, jj, kk, pp, lno, off; - UInt32 nn; - nn = (UInt32)(nextSym - 1); - - if (nn < MTFL_SIZE) { - /* avoid general-case expense */ - pp = s->mtfbase[0]; - uc = s->mtfa[pp+nn]; - while (nn > 3) { - Int32 z = pp+nn; - s->mtfa[(z) ] = s->mtfa[(z)-1]; - s->mtfa[(z)-1] = s->mtfa[(z)-2]; - s->mtfa[(z)-2] = s->mtfa[(z)-3]; - s->mtfa[(z)-3] = s->mtfa[(z)-4]; - nn -= 4; - } - while (nn > 0) { - s->mtfa[(pp+nn)] = s->mtfa[(pp+nn)-1]; nn--; - }; - s->mtfa[pp] = uc; - } else { - /* general case */ - lno = nn / MTFL_SIZE; - off = nn % MTFL_SIZE; - pp = s->mtfbase[lno] + off; - uc = s->mtfa[pp]; - while (pp > s->mtfbase[lno]) { - s->mtfa[pp] = s->mtfa[pp-1]; pp--; - }; - s->mtfbase[lno]++; - while (lno > 0) { - s->mtfbase[lno]--; - s->mtfa[s->mtfbase[lno]] - = s->mtfa[s->mtfbase[lno-1] + MTFL_SIZE - 1]; - lno--; - } - s->mtfbase[0]--; - s->mtfa[s->mtfbase[0]] = uc; - if (s->mtfbase[0] == 0) { - kk = MTFA_SIZE-1; - for (ii = 256 / MTFL_SIZE-1; ii >= 0; ii--) { - for (jj = MTFL_SIZE-1; jj >= 0; jj--) { - s->mtfa[kk] = s->mtfa[s->mtfbase[ii] + jj]; - kk--; - } - s->mtfbase[ii] = kk + 1; - } - } - } - } - /*-- end uc = MTF ( nextSym-1 ) --*/ - - s->unzftab[s->seqToUnseq[uc]]++; - if (s->smallDecompress) - s->ll16[nblock] = (UInt16)(s->seqToUnseq[uc]); else - s->tt[nblock] = (UInt32)(s->seqToUnseq[uc]); - nblock++; - - GET_MTF_VAL(BZ_X_MTF_5, BZ_X_MTF_6, nextSym); - continue; - } - } - - /* Now we know what nblock is, we can do a better sanity - check on s->origPtr. - */ - if (s->origPtr < 0 || s->origPtr >= nblock) - RETURN(BZ_DATA_ERROR); - - s->state_out_len = 0; - s->state_out_ch = 0; - BZ_INITIALISE_CRC ( s->calculatedBlockCRC ); - s->state = BZ_X_OUTPUT; - if (s->verbosity >= 2) VPrintf0 ( "rt+rld" ); - - /*-- Set up cftab to facilitate generation of T^(-1) --*/ - s->cftab[0] = 0; - for (i = 1; i <= 256; i++) s->cftab[i] = s->unzftab[i-1]; - for (i = 1; i <= 256; i++) s->cftab[i] += s->cftab[i-1]; - - if (s->smallDecompress) { - - /*-- Make a copy of cftab, used in generation of T --*/ - for (i = 0; i <= 256; i++) s->cftabCopy[i] = s->cftab[i]; - - /*-- compute the T vector --*/ - for (i = 0; i < nblock; i++) { - uc = (UChar)(s->ll16[i]); - SET_LL(i, s->cftabCopy[uc]); - s->cftabCopy[uc]++; - } - - /*-- Compute T^(-1) by pointer reversal on T --*/ - i = s->origPtr; - j = GET_LL(i); - do { - Int32 tmp = GET_LL(j); - SET_LL(j, i); - i = j; - j = tmp; - } - while (i != s->origPtr); - - s->tPos = s->origPtr; - s->nblock_used = 0; - if (s->blockRandomised) { - BZ_RAND_INIT_MASK; - BZ_GET_SMALL(s->k0); s->nblock_used++; - BZ_RAND_UPD_MASK; s->k0 ^= BZ_RAND_MASK; - } else { - BZ_GET_SMALL(s->k0); s->nblock_used++; - } - - } else { - - /*-- compute the T^(-1) vector --*/ - for (i = 0; i < nblock; i++) { - uc = (UChar)(s->tt[i] & 0xff); - s->tt[s->cftab[uc]] |= (i << 8); - s->cftab[uc]++; - } - - s->tPos = s->tt[s->origPtr] >> 8; - s->nblock_used = 0; - if (s->blockRandomised) { - BZ_RAND_INIT_MASK; - BZ_GET_FAST(s->k0); s->nblock_used++; - BZ_RAND_UPD_MASK; s->k0 ^= BZ_RAND_MASK; - } else { - BZ_GET_FAST(s->k0); s->nblock_used++; - } - - } - - RETURN(BZ_OK); - - - - endhdr_2: - - GET_UCHAR(BZ_X_ENDHDR_2, uc); - if (uc != 0x72) RETURN(BZ_DATA_ERROR); - GET_UCHAR(BZ_X_ENDHDR_3, uc); - if (uc != 0x45) RETURN(BZ_DATA_ERROR); - GET_UCHAR(BZ_X_ENDHDR_4, uc); - if (uc != 0x38) RETURN(BZ_DATA_ERROR); - GET_UCHAR(BZ_X_ENDHDR_5, uc); - if (uc != 0x50) RETURN(BZ_DATA_ERROR); - GET_UCHAR(BZ_X_ENDHDR_6, uc); - if (uc != 0x90) RETURN(BZ_DATA_ERROR); - - s->storedCombinedCRC = 0; - GET_UCHAR(BZ_X_CCRC_1, uc); - s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc); - GET_UCHAR(BZ_X_CCRC_2, uc); - s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc); - GET_UCHAR(BZ_X_CCRC_3, uc); - s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc); - GET_UCHAR(BZ_X_CCRC_4, uc); - s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc); - - s->state = BZ_X_IDLE; - RETURN(BZ_STREAM_END); - - default: AssertH ( False, 4001 ); - } - - AssertH ( False, 4002 ); - - save_state_and_return: - - s->save_i = i; - s->save_j = j; - s->save_t = t; - s->save_alphaSize = alphaSize; - s->save_nGroups = nGroups; - s->save_nSelectors = nSelectors; - s->save_EOB = EOB; - s->save_groupNo = groupNo; - s->save_groupPos = groupPos; - s->save_nextSym = nextSym; - s->save_nblockMAX = nblockMAX; - s->save_nblock = nblock; - s->save_es = es; - s->save_N = N; - s->save_curr = curr; - s->save_zt = zt; - s->save_zn = zn; - s->save_zvec = zvec; - s->save_zj = zj; - s->save_gSel = gSel; - s->save_gMinlen = gMinlen; - s->save_gLimit = gLimit; - s->save_gBase = gBase; - s->save_gPerm = gPerm; - - return retVal; -} - - -/*-------------------------------------------------------------*/ -/*--- end decompress.c ---*/ -/*-------------------------------------------------------------*/ diff --git a/mdk-stage1/bzlib/huffman.c b/mdk-stage1/bzlib/huffman.c deleted file mode 100644 index 8994f0bb9..000000000 --- a/mdk-stage1/bzlib/huffman.c +++ /dev/null @@ -1,232 +0,0 @@ - -/*-------------------------------------------------------------*/ -/*--- Huffman coding low-level stuff ---*/ -/*--- huffman.c ---*/ -/*-------------------------------------------------------------*/ - -/*-- - This file is a part of bzip2 and/or libbzip2, a program and - library for lossless, block-sorting data compression. - - Copyright (C) 1996-2000 Julian R Seward. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - 2. The origin of this software must not be misrepresented; you must - not claim that you wrote the original software. If you use this - software in a product, an acknowledgment in the product - documentation would be appreciated but is not required. - - 3. Altered source versions must be plainly marked as such, and must - not be misrepresented as being the original software. - - 4. The name of the author may not be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS - OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY - DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - Julian Seward, Cambridge, UK. - jseward@acm.org - bzip2/libbzip2 version 1.0 of 21 March 2000 - - This program is based on (at least) the work of: - Mike Burrows - David Wheeler - Peter Fenwick - Alistair Moffat - Radford Neal - Ian H. Witten - Robert Sedgewick - Jon L. Bentley - - For more information on these sources, see the manual. ---*/ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - - -#include "bzlib_private.h" - -/*---------------------------------------------------*/ -#define WEIGHTOF(zz0) ((zz0) & 0xffffff00) -#define DEPTHOF(zz1) ((zz1) & 0x000000ff) -#define MYMAX(zz2,zz3) ((zz2) > (zz3) ? (zz2) : (zz3)) - -#define ADDWEIGHTS(zw1,zw2) \ - (WEIGHTOF(zw1)+WEIGHTOF(zw2)) | \ - (1 + MYMAX(DEPTHOF(zw1),DEPTHOF(zw2))) - -#define UPHEAP(z) \ -{ \ - Int32 zz, tmp; \ - zz = z; tmp = heap[zz]; \ - while (weight[tmp] < weight[heap[zz >> 1]]) { \ - heap[zz] = heap[zz >> 1]; \ - zz >>= 1; \ - } \ - heap[zz] = tmp; \ -} - -#define DOWNHEAP(z) \ -{ \ - Int32 zz, yy, tmp; \ - zz = z; tmp = heap[zz]; \ - while (True) { \ - yy = zz << 1; \ - if (yy > nHeap) break; \ - if (yy < nHeap && \ - weight[heap[yy+1]] < weight[heap[yy]]) \ - yy++; \ - if (weight[tmp] < weight[heap[yy]]) break; \ - heap[zz] = heap[yy]; \ - zz = yy; \ - } \ - heap[zz] = tmp; \ -} - - -/*---------------------------------------------------*/ -void BZ2_hbMakeCodeLengths ( UChar *len, - Int32 *freq, - Int32 alphaSize, - Int32 maxLen ) -{ - /*-- - Nodes and heap entries run from 1. Entry 0 - for both the heap and nodes is a sentinel. - --*/ - Int32 nNodes, nHeap, n1, n2, i, j, k; - Bool tooLong; - - Int32 heap [ BZ_MAX_ALPHA_SIZE + 2 ]; - Int32 weight [ BZ_MAX_ALPHA_SIZE * 2 ]; - Int32 parent [ BZ_MAX_ALPHA_SIZE * 2 ]; - - for (i = 0; i < alphaSize; i++) - weight[i+1] = (freq[i] == 0 ? 1 : freq[i]) << 8; - - while (True) { - - nNodes = alphaSize; - nHeap = 0; - - heap[0] = 0; - weight[0] = 0; - parent[0] = -2; - - for (i = 1; i <= alphaSize; i++) { - parent[i] = -1; - nHeap++; - heap[nHeap] = i; - UPHEAP(nHeap); - } - - AssertH( nHeap < (BZ_MAX_ALPHA_SIZE+2), 2001 ); - - while (nHeap > 1) { - n1 = heap[1]; heap[1] = heap[nHeap]; nHeap--; DOWNHEAP(1); - n2 = heap[1]; heap[1] = heap[nHeap]; nHeap--; DOWNHEAP(1); - nNodes++; - parent[n1] = parent[n2] = nNodes; - weight[nNodes] = ADDWEIGHTS(weight[n1], weight[n2]); - parent[nNodes] = -1; - nHeap++; - heap[nHeap] = nNodes; - UPHEAP(nHeap); - } - - AssertH( nNodes < (BZ_MAX_ALPHA_SIZE * 2), 2002 ); - - tooLong = False; - for (i = 1; i <= alphaSize; i++) { - j = 0; - k = i; - while (parent[k] >= 0) { k = parent[k]; j++; } - len[i-1] = j; - if (j > maxLen) tooLong = True; - } - - if (! tooLong) break; - - for (i = 1; i < alphaSize; i++) { - j = weight[i] >> 8; - j = 1 + (j / 2); - weight[i] = j << 8; - } - } -} - - -/*---------------------------------------------------*/ -void BZ2_hbAssignCodes ( Int32 *code, - UChar *length, - Int32 minLen, - Int32 maxLen, - Int32 alphaSize ) -{ - Int32 n, vec, i; - - vec = 0; - for (n = minLen; n <= maxLen; n++) { - for (i = 0; i < alphaSize; i++) - if (length[i] == n) { code[i] = vec; vec++; }; - vec <<= 1; - } -} - - -/*---------------------------------------------------*/ -void BZ2_hbCreateDecodeTables ( Int32 *limit, - Int32 *base, - Int32 *perm, - UChar *length, - Int32 minLen, - Int32 maxLen, - Int32 alphaSize ) -{ - Int32 pp, i, j, vec; - - pp = 0; - for (i = minLen; i <= maxLen; i++) - for (j = 0; j < alphaSize; j++) - if (length[j] == i) { perm[pp] = j; pp++; }; - - for (i = 0; i < BZ_MAX_CODE_LEN; i++) base[i] = 0; - for (i = 0; i < alphaSize; i++) base[length[i]+1]++; - - for (i = 1; i < BZ_MAX_CODE_LEN; i++) base[i] += base[i-1]; - - for (i = 0; i < BZ_MAX_CODE_LEN; i++) limit[i] = 0; - vec = 0; - - for (i = minLen; i <= maxLen; i++) { - vec += (base[i+1] - base[i]); - limit[i] = vec-1; - vec <<= 1; - } - for (i = minLen + 1; i <= maxLen; i++) - base[i] = ((limit[i-1] + 1) << 1) - base[i]; -} - - -/*-------------------------------------------------------------*/ -/*--- end huffman.c ---*/ -/*-------------------------------------------------------------*/ diff --git a/mdk-stage1/bzlib/randtable.c b/mdk-stage1/bzlib/randtable.c deleted file mode 100644 index a1fc82cfb..000000000 --- a/mdk-stage1/bzlib/randtable.c +++ /dev/null @@ -1,128 +0,0 @@ - -/*-------------------------------------------------------------*/ -/*--- Table for randomising repetitive blocks ---*/ -/*--- randtable.c ---*/ -/*-------------------------------------------------------------*/ - -/*-- - This file is a part of bzip2 and/or libbzip2, a program and - library for lossless, block-sorting data compression. - - Copyright (C) 1996-2000 Julian R Seward. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - 2. The origin of this software must not be misrepresented; you must - not claim that you wrote the original software. If you use this - software in a product, an acknowledgment in the product - documentation would be appreciated but is not required. - - 3. Altered source versions must be plainly marked as such, and must - not be misrepresented as being the original software. - - 4. The name of the author may not be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS - OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY - DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - Julian Seward, Cambridge, UK. - jseward@acm.org - bzip2/libbzip2 version 1.0 of 21 March 2000 - - This program is based on (at least) the work of: - Mike Burrows - David Wheeler - Peter Fenwick - Alistair Moffat - Radford Neal - Ian H. Witten - Robert Sedgewick - Jon L. Bentley - - For more information on these sources, see the manual. ---*/ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - - -#include "bzlib_private.h" - - -/*---------------------------------------------*/ -Int32 BZ2_rNums[512] = { - 619, 720, 127, 481, 931, 816, 813, 233, 566, 247, - 985, 724, 205, 454, 863, 491, 741, 242, 949, 214, - 733, 859, 335, 708, 621, 574, 73, 654, 730, 472, - 419, 436, 278, 496, 867, 210, 399, 680, 480, 51, - 878, 465, 811, 169, 869, 675, 611, 697, 867, 561, - 862, 687, 507, 283, 482, 129, 807, 591, 733, 623, - 150, 238, 59, 379, 684, 877, 625, 169, 643, 105, - 170, 607, 520, 932, 727, 476, 693, 425, 174, 647, - 73, 122, 335, 530, 442, 853, 695, 249, 445, 515, - 909, 545, 703, 919, 874, 474, 882, 500, 594, 612, - 641, 801, 220, 162, 819, 984, 589, 513, 495, 799, - 161, 604, 958, 533, 221, 400, 386, 867, 600, 782, - 382, 596, 414, 171, 516, 375, 682, 485, 911, 276, - 98, 553, 163, 354, 666, 933, 424, 341, 533, 870, - 227, 730, 475, 186, 263, 647, 537, 686, 600, 224, - 469, 68, 770, 919, 190, 373, 294, 822, 808, 206, - 184, 943, 795, 384, 383, 461, 404, 758, 839, 887, - 715, 67, 618, 276, 204, 918, 873, 777, 604, 560, - 951, 160, 578, 722, 79, 804, 96, 409, 713, 940, - 652, 934, 970, 447, 318, 353, 859, 672, 112, 785, - 645, 863, 803, 350, 139, 93, 354, 99, 820, 908, - 609, 772, 154, 274, 580, 184, 79, 626, 630, 742, - 653, 282, 762, 623, 680, 81, 927, 626, 789, 125, - 411, 521, 938, 300, 821, 78, 343, 175, 128, 250, - 170, 774, 972, 275, 999, 639, 495, 78, 352, 126, - 857, 956, 358, 619, 580, 124, 737, 594, 701, 612, - 669, 112, 134, 694, 363, 992, 809, 743, 168, 974, - 944, 375, 748, 52, 600, 747, 642, 182, 862, 81, - 344, 805, 988, 739, 511, 655, 814, 334, 249, 515, - 897, 955, 664, 981, 649, 113, 974, 459, 893, 228, - 433, 837, 553, 268, 926, 240, 102, 654, 459, 51, - 686, 754, 806, 760, 493, 403, 415, 394, 687, 700, - 946, 670, 656, 610, 738, 392, 760, 799, 887, 653, - 978, 321, 576, 617, 626, 502, 894, 679, 243, 440, - 680, 879, 194, 572, 640, 724, 926, 56, 204, 700, - 707, 151, 457, 449, 797, 195, 791, 558, 945, 679, - 297, 59, 87, 824, 713, 663, 412, 693, 342, 606, - 134, 108, 571, 364, 631, 212, 174, 643, 304, 329, - 343, 97, 430, 751, 497, 314, 983, 374, 822, 928, - 140, 206, 73, 263, 980, 736, 876, 478, 430, 305, - 170, 514, 364, 692, 829, 82, 855, 953, 676, 246, - 369, 970, 294, 750, 807, 827, 150, 790, 288, 923, - 804, 378, 215, 828, 592, 281, 565, 555, 710, 82, - 896, 831, 547, 261, 524, 462, 293, 465, 502, 56, - 661, 821, 976, 991, 658, 869, 905, 758, 745, 193, - 768, 550, 608, 933, 378, 286, 215, 979, 792, 961, - 61, 688, 793, 644, 986, 403, 106, 366, 905, 644, - 372, 567, 466, 434, 645, 210, 389, 550, 919, 135, - 780, 773, 635, 389, 707, 100, 626, 958, 165, 504, - 920, 176, 193, 713, 857, 265, 203, 50, 668, 108, - 645, 990, 626, 197, 510, 357, 358, 850, 858, 364, - 936, 638 -}; - - -/*-------------------------------------------------------------*/ -/*--- end randtable.c ---*/ -/*-------------------------------------------------------------*/ diff --git a/mdk-stage1/cdrom.c b/mdk-stage1/cdrom.c index f05bc0341..71db1da16 100644 --- a/mdk-stage1/cdrom.c +++ b/mdk-stage1/cdrom.c @@ -1,7 +1,7 @@ /* - * Guillaume Cottenceau (gc@mandrakesoft.com) + * Guillaume Cottenceau (gc) * - * Copyright 2000 MandrakeSoft + * Copyright 2000 Mandriva * * This software may be freely redistributed under the terms of the GNU * public license. @@ -30,6 +30,8 @@ #include "probing.h" #include "log.h" #include "mount.h" +#include "tools.h" +#include "utils.h" #include "cdrom.h" @@ -37,17 +39,15 @@ static int mount_that_cd_device(char * dev_name) { char device_fullname[50]; + int mount_result; - strcpy(device_fullname, "/dev/"); - strcat(device_fullname, dev_name); + snprintf(device_fullname, sizeof(device_fullname), "/dev/%s", dev_name); - return my_mount(device_fullname, IMAGE_LOCATION, "iso9660"); -} + mount_result = my_mount(device_fullname, MEDIA_LOCATION, "iso9660", 0); + create_IMAGE_LOCATION(MEDIA_LOCATION); -static int test_that_cd() -{ - return access(IMAGE_LOCATION LIVE_LOCATION, R_OK); + return mount_result; } @@ -55,9 +55,9 @@ static enum return_type try_with_device(char * dev_name, char * dev_model); static enum return_type do_with_device(char * dev_name, char * dev_model) { - if (test_that_cd()) { + if (!image_has_stage2()) { enum return_type results; - umount(IMAGE_LOCATION); + umount(MEDIA_LOCATION); results = ask_yes_no("That CDROM disc does not seem to be a " DISTRIB_NAME " Installation CDROM.\nRetry with another disc?"); if (results == RETURN_OK) return try_with_device(dev_name, dev_model); @@ -66,13 +66,13 @@ static enum return_type do_with_device(char * dev_name, char * dev_model) log_message("found a " DISTRIB_NAME " CDROM, good news!"); - if (IS_SPECIAL_STAGE2 || ramdisk_possible()) - load_ramdisk(); /* we don't care about return code, we'll do it live if we failed */ + may_load_compressed_image(); - if (IS_RESCUE) - umount(IMAGE_LOCATION); + if (!KEEP_MOUNTED) + /* in rescue mode, we don't need the media anymore */ + umount(MEDIA_LOCATION); - method_name = strdup("cdrom"); + add_to_env("METHOD", "cdrom"); return RETURN_OK; } @@ -83,7 +83,7 @@ static enum return_type try_with_device(char * dev_name, char * dev_model) if (mount_that_cd_device(dev_name) == -1) { enum return_type results; char msg[500]; - unset_param(MODE_AUTOMATIC); /* we are in a fallback mode */ + unset_automatic(); /* we are in a fallback mode */ remove_wait_message(); snprintf(msg, sizeof(msg), "I can't access a " DISTRIB_NAME " Installation disc in your CDROM drive (%s).\nRetry?", dev_model); @@ -97,27 +97,94 @@ static enum return_type try_with_device(char * dev_name, char * dev_model) return do_with_device(dev_name, dev_model); } +int try_automatic(char ** medias, char ** medias_models) +{ + static char * already_tried[50] = { NULL }; + char ** model = medias_models; + char ** ptr = medias; + int i = 0; + while (ptr && *ptr) { + char ** p; + for (p = already_tried; p && *p; p++) + if (streq(*p, *ptr)) + goto try_automatic_already_tried; + *p = strdup(*ptr); + *(p+1) = NULL; + + wait_message("Trying to access " DISTRIB_NAME " CDROM disc (drive %s)", *model); + if (mount_that_cd_device(*ptr) != -1) { + if (image_has_stage2()) { + remove_wait_message(); + return i; + } + else + umount(MEDIA_LOCATION); + } + remove_wait_message(); + + try_automatic_already_tried: + ptr++; + model++; + i++; + } + return -1; +} + enum return_type cdrom_prepare(void) { char ** medias, ** ptr, ** medias_models; char * choice; int i, count = 0; enum return_type results; + static int already_probed_ide_generic = 0; - my_insmod("ide-cd", ANY_DRIVER_TYPE, NULL); - my_insmod("sr_mod", ANY_DRIVER_TYPE, NULL); - - get_medias(CDROM, &medias, &medias_models); + my_modprobe("ide_cd_mod", ANY_DRIVER_TYPE, NULL); - ptr = medias; - while (ptr && *ptr) { - count++; - ptr++; - } + if (IS_AUTOMATIC) { + get_medias(CDROM, &medias, &medias_models, BUS_IDE); + if ((i = try_automatic(medias, medias_models)) != -1) + return do_with_device(medias[i], medias_models[i]); + + get_medias(CDROM, &medias, &medias_models, BUS_PCMCIA); + if ((i = try_automatic(medias, medias_models)) != -1) + return do_with_device(medias[i], medias_models[i]); + + my_modprobe("sr_mod", ANY_DRIVER_TYPE, NULL); + get_medias(CDROM, &medias, &medias_models, BUS_SCSI); + if ((i = try_automatic(medias, medias_models)) != -1) + return do_with_device(medias[i], medias_models[i]); + + get_medias(CDROM, &medias, &medias_models, BUS_USB); + if ((i = try_automatic(medias, medias_models)) != -1) + return do_with_device(medias[i], medias_models[i]); + + /* detect hybrid isos (isos dumped to an USB stick) */ + my_modprobe("sd_mod", ANY_DRIVER_TYPE, NULL); + get_medias(DISK, &medias, &medias_models, BUS_USB); + if ((i = try_automatic(medias, medias_models)) != -1) { + return do_with_device(medias[i], medias_models[i]); + } + + unset_automatic(); + } else + my_modprobe("sr_mod", ANY_DRIVER_TYPE, NULL); + + + get_medias(CDROM, &medias, &medias_models, BUS_ANY); + ptr = medias; + while (ptr && *ptr) { + count++; + ptr++; + } if (count == 0) { - error_message("No CDROM device found."); - i = ask_insmod(SCSI_ADAPTERS); + if (!already_probed_ide_generic) { + already_probed_ide_generic = 1; + my_modprobe("ide_generic", ANY_DRIVER_TYPE, NULL); + return cdrom_prepare(); + } + stg1_error_message("No CDROM device found."); + i = ask_insmod(MEDIA_ADAPTERS); if (i == RETURN_BACK) return RETURN_BACK; return cdrom_prepare(); @@ -127,54 +194,32 @@ enum return_type cdrom_prepare(void) results = try_with_device(*medias, *medias_models); if (results == RETURN_OK) return RETURN_OK; - i = ask_insmod(SCSI_ADAPTERS); + i = ask_insmod(MEDIA_ADAPTERS); if (i == RETURN_BACK) return RETURN_BACK; return cdrom_prepare(); } - if (IS_AUTOMATIC) { + results = ask_from_list_comments("Please choose the CDROM drive to use for the installation.", medias, medias_models, &choice); + if (results == RETURN_OK) { char ** model = medias_models; ptr = medias; - while (ptr && *ptr) { - wait_message("Trying to access " DISTRIB_NAME " CDROM disc (drive %s)", *model); - if (mount_that_cd_device(*ptr) != -1) { - if (!test_that_cd()) { - remove_wait_message(); - return do_with_device(*ptr, *model); - } - else - umount(IMAGE_LOCATION); - } - remove_wait_message(); + while (ptr && *ptr && model && *model) { + if (!strcmp(*ptr, choice)) + break; ptr++; model++; } - unset_param(MODE_AUTOMATIC); - return cdrom_prepare(); - } - else { - results = ask_from_list_comments("Please choose the CDROM drive to use for the installation.", medias, medias_models, &choice); - if (results == RETURN_OK) { - char ** model = medias_models; - ptr = medias; - while (ptr && *ptr && model && *model) { - if (!strcmp(*ptr, choice)) - break; - ptr++; - model++; - } results = try_with_device(choice, *model); - } else - return results; - } + } else + return results; if (results == RETURN_OK) return RETURN_OK; if (results == RETURN_BACK) return cdrom_prepare(); - i = ask_insmod(SCSI_ADAPTERS); + i = ask_insmod(MEDIA_ADAPTERS); if (i == RETURN_BACK) return RETURN_BACK; return cdrom_prepare(); diff --git a/mdk-stage1/cdrom.h b/mdk-stage1/cdrom.h index 639487eed..7d182b257 100644 --- a/mdk-stage1/cdrom.h +++ b/mdk-stage1/cdrom.h @@ -1,7 +1,7 @@ /* - * Guillaume Cottenceau (gc@mandrakesoft.com) + * Guillaume Cottenceau (gc) * - * Copyright 2000 MandrakeSoft + * Copyright 2000 Mandriva * * This software may be freely redistributed under the terms of the GNU * public license. diff --git a/mdk-stage1/config-stage1.h b/mdk-stage1/config-stage1.h index 4bfa3896a..e3409df98 100644 --- a/mdk-stage1/config-stage1.h +++ b/mdk-stage1/config-stage1.h @@ -1,7 +1,7 @@ /* - * Guillaume Cottenceau (gc@mandrakesoft.com) + * Guillaume Cottenceau (gc) * - * Copyright 2000 MandrakeSoft + * Copyright 2000 Mandriva * * This software may be freely redistributed under the terms of the GNU * public license. @@ -15,20 +15,52 @@ #ifndef _CONFIG_STAGE1_H_ #define _CONFIG_STAGE1_H_ +#ifdef _GNU_SOURCE +# undef _GNU_SOURCE +#endif #define _GNU_SOURCE 1 /* If we have more than that amount of memory (in Mbytes), we assume we can load the second stage as a ramdisk */ -#define MEM_LIMIT_RAMDISK 52 +#define MEM_LIMIT_DRAKX 192 +/* If we have more than that amount of memory (in Mbytes), we preload the second stage as a ramdisk */ +#define MEM_LIMIT_DRAKX_PRELOAD 256 + +/* If we have more than that amount of memory (in Mbytes), we assume we can load the rescue as a ramdisk */ +#define MEM_LIMIT_RESCUE 40 +/* If we have more than that amount of memory (in Mbytes), we preload the rescue as a ramdisk */ +#define MEM_LIMIT_RESCUE_PRELOAD 100 + +#define KA_MAX_RETRY 5 -#define DISTRIB_NAME "Linux-Mandrake" +#define LIVE_LOCATION_REL "install/stage2/live/" +#define COMPRESSED_LOCATION_REL "install/stage2/" +#define COMPRESSED_STAGE2_NAME "mdkinst.sqfs" +#define COMPRESSED_RESCUE_NAME "rescue.sqfs" +#define COMPRESSED_NAME(prefix) (IS_RESCUE ? prefix COMPRESSED_RESCUE_NAME : prefix COMPRESSED_STAGE2_NAME) +#define COMPRESSED_FILE_REL(prefix) COMPRESSED_NAME(prefix COMPRESSED_LOCATION_REL) + +/* the remote media is mounted in MEDIA_LOCATION, and + - IMAGE_LOCATION is a symlink image -> image/mdk/mirror/dir + - IMAGE_LOCATION is a symlink image -> loop/i686 and iso file is loopback mounted in LOOP_LOCATION + */ +#define MEDIA_LOCATION_REL "media" +#define MEDIA_LOCATION IMAGE_LOCATION_DIR MEDIA_LOCATION_REL -#define RAMDISK_COMPRESSION_RATIO 1.9 +#define LOOP_LOCATION_REL "loop" +#define LOOP_LOCATION IMAGE_LOCATION_DIR LOOP_LOCATION_REL + +#define IMAGE_LOCATION_REL "image" +#define IMAGE_LOCATION_DIR "/tmp/" +#define IMAGE_LOCATION IMAGE_LOCATION_DIR IMAGE_LOCATION_REL + +#define COMPRESSED_LOCATION IMAGE_LOCATION "/" COMPRESSED_LOCATION_REL + +/* - if we use a compressed image : STAGE2_LOCATION is a the mount point + - if we use the live: STAGE2_LOCATION is a relative symlink to image/install/stage2/live +*/ +#define STAGE2_LOCATION "/tmp/stage2" -#define LIVE_LOCATION "/Mandrake/mdkinst/" -#define RAMDISK_LOCATION "/Mandrake/base/" -#define IMAGE_LOCATION "/tmp/image" -#define STAGE2_LOCATION "/tmp/stage2" /* user-definable (in Makefile): DISABLE_NETWORK, DISABLE_DISK, DISABLE_CDROM, DISABLE_PCMCIA */ @@ -41,5 +73,10 @@ #endif #endif +/* path to mirror list for net install */ +#ifndef DISABLE_NETWORK +#define MIRRORLIST_HOST "mirrors.mageia.org" +#define MIRRORLIST_PATH "/api" +#endif #endif diff --git a/mdk-stage1/dhcp.c b/mdk-stage1/dhcp.c index e2013994a..678031e85 100644 --- a/mdk-stage1/dhcp.c +++ b/mdk-stage1/dhcp.c @@ -1,7 +1,7 @@ /* - * Guillaume Cottenceau (gc@mandrakesoft.com) + * Guillaume Cottenceau (gc) * - * Copyright 2000 MandrakeSoft + * Copyright 2000 Mandriva * * This software may be freely redistributed under the terms of the GNU * public license. @@ -27,6 +27,7 @@ #include <stdlib.h> #include <unistd.h> +#include <stdio.h> #include <string.h> #include <sys/socket.h> #include <sys/ioctl.h> @@ -40,18 +41,19 @@ #include <sys/time.h> #include <time.h> #include <fcntl.h> +#include <sys/poll.h> #include "stage1.h" #include "log.h" +#include "tools.h" +#include "utils.h" #include "network.h" #include "frontend.h" +#include "automatic.h" #include "dhcp.h" -#define NUM_RETRIES 5 - - typedef int bp_int32; typedef short bp_int16; @@ -69,6 +71,8 @@ typedef short bp_int16; #define DHCP_OPTION_OPTIONREQ 55 #define DHCP_OPTION_MAXSIZE 57 +#define DHCP_OPTION_CLIENT_IDENTIFIER 61 + #define BOOTP_CLIENT_PORT 68 #define BOOTP_SERVER_PORT 67 @@ -176,6 +180,13 @@ static int initial_setup_interface(char * device, int s) { return -1; } + /* I need to sleep a bit in order for kernel to finish init of the + network device; this would allow to not send further multiple + dhcp requests when only one is needed. */ + wait_message("Bringing up networking..."); + sleep(2); + remove_wait_message(); + return 0; } @@ -202,9 +213,16 @@ static void parse_reply(struct bootp_request * breq, struct interface_info * int unsigned char * chptr; unsigned char option, length; + if (strlen(breq->bootfile) > 0) { + if (IS_NETAUTO) + add_to_env("KICKSTART", breq->bootfile); + else + log_message("warning: ignoring `bootfile' DHCP server parameter, since `netauto' boot parameter was not given; reboot with `linux netauto' (and anymore useful boot parameters) if you want `bootfile' to be used as a `auto_inst.cfg.pl' stage2 configuration file"); + } + memcpy(&intf->ip, &breq->yiaddr, 4); - chptr = breq->vendor; + chptr = (unsigned char *) breq->vendor; chptr += 4; while (*chptr != 0xFF && (void *) chptr < (void *) breq->vendor + DHCP_VENDOR_LENGTH) { char tmp_str[500]; @@ -216,33 +234,33 @@ static void parse_reply(struct bootp_request * breq, struct interface_info * int switch (option) { case BOOTP_OPTION_DNS: memcpy(&dns_server, chptr, sizeof(dns_server)); - if (length >= sizeof(dns_server)*2) + log_message("got dns %s", inet_ntoa(dns_server)); + if (length >= sizeof(dns_server)*2) { memcpy(&dns_server2, chptr+sizeof(dns_server), sizeof(dns_server2)); + log_message("got dns2 %s", inet_ntoa(dns_server2)); + } break; case BOOTP_OPTION_NETMASK: - memcpy(&intf->netmask, chptr, 4); + memcpy(&intf->netmask, chptr, sizeof(intf->netmask)); + log_message("got netmask %s", inet_ntoa(intf->netmask)); break; case BOOTP_OPTION_DOMAIN: memcpy(tmp_str, chptr, length); tmp_str[length] = '\0'; domain = strdup(tmp_str); + log_message("got domain %s", domain); break; case BOOTP_OPTION_BROADCAST: - memcpy(&intf->broadcast, chptr, 4); + memcpy(&intf->broadcast, chptr, sizeof(intf->broadcast)); + log_message("got broadcast %s", inet_ntoa(intf->broadcast)); break; case BOOTP_OPTION_GATEWAY: - memcpy(&gateway, chptr, 4); - break; - - case BOOTP_OPTION_HOSTNAME: - memcpy(tmp_str, chptr, length); - tmp_str[length] = '\0'; - hostname = strdup(tmp_str); - log_message("DHCP: got hostname %s", hostname); + memcpy(&gateway, chptr, sizeof(gateway)); + log_message("got gateway %s", inet_ntoa(gateway)); break; } @@ -260,7 +278,7 @@ static void init_vendor_codes(struct bootp_request * breq) { static char gen_hwaddr[16]; -static int prepare_request(struct bootp_request * breq, int sock, char * device, time_t startTime) +static int prepare_request(struct bootp_request * breq, int sock, char * device) { struct ifreq req; @@ -274,7 +292,7 @@ static int prepare_request(struct bootp_request * breq, int sock, char * device, return -1; } - breq->hw = 1; /* ethernet */ + breq->hw = req.ifr_hwaddr.sa_family; breq->hwlength = IFHWADDRLEN; memcpy(breq->hwaddr, req.ifr_hwaddr.sa_data, IFHWADDRLEN); memcpy(gen_hwaddr, req.ifr_hwaddr.sa_data, IFHWADDRLEN); @@ -291,7 +309,7 @@ static int get_vendor_code(struct bootp_request * bresp, unsigned char option, v unsigned char * chptr; unsigned int length, theOption; - chptr = bresp->vendor + 4; + chptr = (unsigned char*) bresp->vendor + 4; while (*chptr != 0xFF && *chptr != option) { theOption = *chptr++; if (!theOption) @@ -310,12 +328,11 @@ static int get_vendor_code(struct bootp_request * bresp, unsigned char option, v } -int -currticks (void) +static unsigned long currticks(void) { struct timeval tv; - long csecs; - int ticks_per_csec, ticks_per_usec; + unsigned long csecs; + unsigned long ticks_per_csec, ticks_per_usec; /* Note: 18.2 ticks/sec. */ @@ -329,10 +346,9 @@ currticks (void) #define BACKOFF_LIMIT 7 #define TICKS_PER_SEC 18 -#define MAX_ARP_RETRIES 4 +#define MAX_ARP_RETRIES 7 -void -rfc951_sleep (int exp) +static void rfc951_sleep(int exp) { static long seed = 0; long q; @@ -365,8 +381,7 @@ rfc951_sleep (int exp) static int handle_transaction(int s, struct bootp_request * breq, struct bootp_request * bresp, struct sockaddr_in * server_addr, int dhcp_type) { - struct timeval tv; - fd_set readfs; + struct pollfd polls; int i, j; int retry = 1; int sin; @@ -395,12 +410,10 @@ static int handle_transaction(int s, struct bootp_request * breq, struct bootp_r return -1; } - FD_ZERO(&readfs); - FD_SET(sin, &readfs); - tv.tv_usec = 0; - tv.tv_sec = timeout; + polls.fd = sin; + polls.events = POLLIN; - while (select(sin + 1, &readfs, NULL, NULL, &tv) == 1) { + while (poll(&polls, 1, timeout*1000) == 1) { if ((j = recv(sin, eth_packet, sizeof(eth_packet), 0)) == -1) { log_perror("recv"); @@ -408,7 +421,7 @@ static int handle_transaction(int s, struct bootp_request * breq, struct bootp_r } /* We need to do some basic sanity checking of the header */ - if (j < (sizeof(*ip_hdr) + sizeof(*udp_hdr))) + if (j < (signed)(sizeof(*ip_hdr) + sizeof(*udp_hdr))) continue; ip_hdr = (void *) eth_packet; @@ -464,7 +477,6 @@ static int handle_transaction(int s, struct bootp_request * breq, struct bootp_r timeout = 5; } - error_message("No DHCP reply received."); return -1; } @@ -473,7 +485,7 @@ static void add_vendor_code(struct bootp_request * breq, unsigned char option, u unsigned char * chptr; int theOption, theLength; - chptr = breq->vendor; + chptr = (unsigned char*) breq->vendor; chptr += 4; while (*chptr != 0xFF && *chptr != option) { theOption = *chptr++; @@ -489,6 +501,8 @@ static void add_vendor_code(struct bootp_request * breq, unsigned char option, u } +char * dhcp_hostname = NULL; +char * dhcp_domain = NULL; enum return_type perform_dhcp(struct interface_info * intf) { @@ -499,15 +513,10 @@ enum return_type perform_dhcp(struct interface_info * intf) struct bootp_request breq, bresp; unsigned char messageType; unsigned int lease; - time_t startTime = time(NULL); short aShort; int num_options; char requested_options[50]; - - if (strncmp(intf->device, "eth", 3)) { - error_message("DHCP available only for Ethernet networking."); - return RETURN_ERROR; - } + char * client_id_str, * client_id_hwaddr; s = socket(AF_INET, SOCK_DGRAM, 0); if (s < 0) { @@ -515,12 +524,41 @@ enum return_type perform_dhcp(struct interface_info * intf) return RETURN_ERROR; } + { + enum return_type results; + char * questions[] = { "Host name", "Domain name", NULL }; + char * questions_auto[] = { "hostname", "domain" }; + static char ** answers = NULL; + char * boulet; + + client_id_str = client_id_hwaddr = NULL; + + results = ask_from_entries_auto("If the DHCP server needs to know you by name; please fill in this information. " + "Valid answers are for example: `mybox' for hostname and `mynetwork.com' for " + "domain name, for a machine called `mybox.mynetwork.com' on the Internet.", + questions, &answers, 32, questions_auto, NULL); + if (results == RETURN_OK) + { + dhcp_hostname = answers[0]; + if ((boulet = strchr(dhcp_hostname, '.')) != NULL) + boulet[0] = '\0'; + dhcp_domain = answers[1]; + + if (*dhcp_hostname && *dhcp_domain) { + /* if we have both, then create client id from them */ + client_id_str = malloc(1 + strlen(dhcp_hostname) + 1 + strlen(dhcp_domain) + 1); + client_id_str[0] = '\0'; + sprintf(client_id_str+1, "%s.%s", dhcp_hostname, dhcp_domain); + } + } + } + if (initial_setup_interface(intf->device, s) != 0) { close(s); return RETURN_ERROR; } - if (prepare_request(&breq, s, intf->device, startTime) != 0) { + if (prepare_request(&breq, s, intf->device) != 0) { close(s); return RETURN_ERROR; } @@ -528,7 +566,28 @@ enum return_type perform_dhcp(struct interface_info * intf) messageType = DHCP_TYPE_DISCOVER; add_vendor_code(&breq, DHCP_OPTION_TYPE, 1, &messageType); - memset(&client_addr.sin_addr, 0, sizeof(&client_addr.sin_addr)); + /* add pieces needed to have DDNS/DHCP IP selection based on requested name */ + if (dhcp_hostname && *dhcp_hostname) { /* pick client id form based on absence or presence of domain name */ + if (*dhcp_domain) /* alternate style <hostname>.<domainname> */ + add_vendor_code(&breq, DHCP_OPTION_CLIENT_IDENTIFIER, strlen(client_id_str+1)+1, client_id_str); + else { /* usual style (aka windows / dhcpcd) */ + /* but put MAC in form required for client identifier first */ + client_id_hwaddr = malloc(IFHWADDRLEN+2); + /* (from pump-0.8.22/dhcp.c) + * Microsoft uses a client identifier field of the 802.3 address with a + * pre-byte of a "1". In order to re-use the DHCP address that they set + * for this interface, we have to mimic their identifier. + */ + client_id_hwaddr[0] = 1; /* set flag for ethernet */ + memcpy(client_id_hwaddr+1, gen_hwaddr, IFHWADDRLEN); + add_vendor_code(&breq, DHCP_OPTION_CLIENT_IDENTIFIER, IFHWADDRLEN+1, client_id_hwaddr); + } + /* this is the one that the dhcp server really wants for DDNS updates */ + add_vendor_code(&breq, BOOTP_OPTION_HOSTNAME, strlen(dhcp_hostname), dhcp_hostname); + log_message("DHCP: telling server to use name = %s", dhcp_hostname); + } + + memset(&client_addr.sin_addr, 0, sizeof(client_addr.sin_addr)); client_addr.sin_family = AF_INET; client_addr.sin_port = htons(BOOTP_CLIENT_PORT); /* bootp client */ @@ -548,6 +607,7 @@ enum return_type perform_dhcp(struct interface_info * intf) remove_wait_message(); if (i != 0) { + stg1_error_message("No DHCP reply received."); close(s); return RETURN_ERROR; } @@ -566,6 +626,16 @@ enum return_type perform_dhcp(struct interface_info * intf) add_vendor_code(&breq, DHCP_OPTION_SERVER, 4, &server_addr.sin_addr); add_vendor_code(&breq, DHCP_OPTION_REQADDR, 4, &bresp.yiaddr); + /* if used the first time, then have to use it again */ + if (dhcp_hostname && *dhcp_hostname) { /* add pieces needed to have DDNS/DHCP IP selection based on requested name */ + if (dhcp_domain && *dhcp_domain) /* alternate style */ + add_vendor_code(&breq, DHCP_OPTION_CLIENT_IDENTIFIER, strlen(client_id_str+1)+1, client_id_str); + else /* usual style (aka windows / dhcpcd) */ + add_vendor_code(&breq, DHCP_OPTION_CLIENT_IDENTIFIER, IFHWADDRLEN+1, client_id_hwaddr); + /* this is the one that the dhcp server really wants for DDNS updates */ + add_vendor_code(&breq, BOOTP_OPTION_HOSTNAME, strlen(dhcp_hostname), dhcp_hostname); + } + aShort = ntohs(sizeof(struct bootp_request)); add_vendor_code(&breq, DHCP_OPTION_MAXSIZE, 2, &aShort); diff --git a/mdk-stage1/dhcp.h b/mdk-stage1/dhcp.h index 6fb121ea4..e17094adc 100644 --- a/mdk-stage1/dhcp.h +++ b/mdk-stage1/dhcp.h @@ -1,9 +1,9 @@ /* - * Guillaume Cottenceau (gc@mandrakesoft.com) + * Guillaume Cottenceau (gc) * - * Copyright 2000 MandrakeSoft + * Copyright 2000 Mandriva * - * View the homepage: http://us.mandrakesoft.com/~gc/html/stage1.html + * View the homepage: http://us.mandriva.com/~gc/html/stage1.html * * * This software may be freely redistributed under the terms of the GNU @@ -31,4 +31,7 @@ enum return_type perform_dhcp(struct interface_info * intf); +extern char * dhcp_hostname; +extern char * dhcp_domain; + #endif diff --git a/mdk-stage1/dietlibc/AUTHOR b/mdk-stage1/dietlibc/AUTHOR deleted file mode 100644 index 6d8ab1a05..000000000 --- a/mdk-stage1/dietlibc/AUTHOR +++ /dev/null @@ -1 +0,0 @@ -Felix von Leitner <felix-dietlibc@fefe.de> diff --git a/mdk-stage1/dietlibc/Makefile b/mdk-stage1/dietlibc/Makefile deleted file mode 100644 index 19fac4a82..000000000 --- a/mdk-stage1/dietlibc/Makefile +++ /dev/null @@ -1,79 +0,0 @@ -all: start.o dietlibc.a - -ARCH=$(shell uname -m | sed 's/i[4-9]86/i386/') - -CFLAGS=-pipe -CROSS= - -VPATH=syscalls.c - -SYSCALLOBJ=$(patsubst syscalls.s/%.S,%.o,$(wildcard syscalls.s/*.S)) - -LIBOBJ=$(patsubst lib/%.c,%.o,$(wildcard lib/*.c)) - -include $(ARCH)/Makefile.add - -ifeq ($(CFLAGS),-pipe) -CFLAGS+=-O -fomit-frame-pointer -endif - -#CFLAGS += -g -CFLAGS += -Wall - -.SUFFIXES: -.SUFFIXES: .S .c - -%.o: %.S - $(CROSS)gcc -I. -Iinclude $(CFLAGS) -c $< - -%.o: %.c - $(CROSS)gcc -I. -Iinclude $(CFLAGS) -c $< -# $(CROSS)strip -x -R .comment -R .note $@ - -dietlibc.a: $(SYSCALLOBJ) $(LIBOBJ) __longjmp.o longjmp.o setjmp.o \ -start.o unified.o mmap.o - $(CROSS)ar cru dietlibc.a $^ - -libdietc.so: dietlibc.a - $(CROSS)ld -whole-archive -shared -o $@ $^ - -$(SYSCALLOBJ): syscalls.h - -djb: compile load - -compile: - echo 'exec gcc $(CFLAGS) -I$(HOME)/projects/dietlibc/include -c $${1+"$$@"}' > $@ - chmod 755 $@ - -load: - echo 'main="$$1"; shift; exec gcc -nostdlib -o "$$main" $(HOME)/projects/dietlibc/start.o "$$main".o $${1+"$$@"} $(HOME)/projects/dietlibc/dietlibc.a -lgcc' > $@ - chmod 755 $@ - -clean: - rm -f *.o *.a t t1 compile load exports mapfile libdietc.so - -tar: clean - cd .. && tar cvvf dietlibc.tar.bz2 dietlibc --use=bzip2 - -exports: dietlibc.a - nm -g dietlibc.a | grep -w T | awk '{ print $$3 }' | sort -u > exports - -.PHONY: t t1 -t: - $(CROSS)gcc -g $(CFLAGS) -fno-builtin -nostdlib -Iinclude -o t t.c start.o dietlibc.a -lgcc -Wl,-Map,mapfile - -t1: - $(CROSS)gcc -g -o t1 t.c - -install: - cp start.o $(prefix)/lib/dietstart.o - cp dietlibc.a $(prefix)/lib/libdietc.a - -.PHONY: sparc ppc mips arm alpha i386 - -sparc ppc alpha i386: - $(MAKE) ARCH=$@ CROSS=$@-linux- all t libdietc.so - -mips arm: - $(MAKE) ARCH=$@ CROSS=$@-linux-gnu- all t libdietc.so - diff --git a/mdk-stage1/dietlibc/README b/mdk-stage1/dietlibc/README deleted file mode 100644 index c17aefcc5..000000000 --- a/mdk-stage1/dietlibc/README +++ /dev/null @@ -1,11 +0,0 @@ -diet glibc to statically link programs that don't need all the bloat -from glibc. - -malloc, printf and scanf contributed from Olaf Dreesen. - -Usage: - gcc -I~/dietlibc/include -Os -pipe -c *.c - gcc -nostdlib -o ncp ~/dietlibc/start.o *.o ~/dietlibc/dietlibc.a - -If you use the glibc includes, directory reading (and maybe other -functions) will fail. You have been warned! diff --git a/mdk-stage1/dietlibc/alpha/Makefile.add b/mdk-stage1/dietlibc/alpha/Makefile.add deleted file mode 100644 index da3791eb6..000000000 --- a/mdk-stage1/dietlibc/alpha/Makefile.add +++ /dev/null @@ -1,5 +0,0 @@ - -CFLAGS+=-Os -fno-builtin -Iinclude -fomit-frame-pointer -fstrict-aliasing -override VPATH=alpha:syscalls.s:lib - -LIBOBJ+=divq.o diff --git a/mdk-stage1/dietlibc/alpha/__longjmp.S b/mdk-stage1/dietlibc/alpha/__longjmp.S deleted file mode 100644 index d86d76717..000000000 --- a/mdk-stage1/dietlibc/alpha/__longjmp.S +++ /dev/null @@ -1,38 +0,0 @@ -#ifdef __alpha__ - -#include <setjmp.h> - -.text -.align 2 - -.global __longjmp -__longjmp: - mov $17, $0 /* a1 -> v0 */ - - ldq $9, (JB_S0*8) ($16) /* s0 */ - ldq $10, (JB_S1*8) ($16) /* s1 */ - ldq $11, (JB_S2*8) ($16) /* s2 */ - ldq $12, (JB_S3*8) ($16) /* s3 */ - ldq $13, (JB_S4*8) ($16) /* s4 */ - ldq $14, (JB_S5*8) ($16) /* s5 */ - - ldq $26, (JB_PC*8) ($16) /* ra */ - ldq $fp, (JB_FP*8) ($16) /* fp */ - ldq $1, (JB_SP*8) ($16) /* sp */ - - ldt $f2, (JB_F2*8) ($16) /* f2 */ - ldt $f3, (JB_F3*8) ($16) /* f3 */ - ldt $f4, (JB_F4*8) ($16) /* f4 */ - ldt $f5, (JB_F5*8) ($16) /* f5 */ - ldt $f6, (JB_F6*8) ($16) /* f6 */ - ldt $f7, (JB_F7*8) ($16) /* f7 */ - ldt $f8, (JB_F8*8) ($16) /* f8 */ - ldt $f9, (JB_F9*8) ($16) /* f9 */ - - cmoveq $0, 0x1, $0 - mov $1, $sp - - ret $31, ($26), 1 - - -#endif diff --git a/mdk-stage1/dietlibc/alpha/accept.S b/mdk-stage1/dietlibc/alpha/accept.S deleted file mode 100644 index 43a40ee6f..000000000 --- a/mdk-stage1/dietlibc/alpha/accept.S +++ /dev/null @@ -1,4 +0,0 @@ -#include "syscalls.h" - -.weak __libc_accept -syscall(accept,accept) diff --git a/mdk-stage1/dietlibc/alpha/bind.S b/mdk-stage1/dietlibc/alpha/bind.S deleted file mode 100644 index 86a04cb70..000000000 --- a/mdk-stage1/dietlibc/alpha/bind.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(bind,bind) diff --git a/mdk-stage1/dietlibc/alpha/clone.S b/mdk-stage1/dietlibc/alpha/clone.S deleted file mode 100644 index f01620595..000000000 --- a/mdk-stage1/dietlibc/alpha/clone.S +++ /dev/null @@ -1,42 +0,0 @@ -#include "syscalls.h" -#include <asm/errno.h> - -.text -.align 2 -.weak clone -clone: -.global __clone -.type __clone,@function -clone: - ldiq $0, EINVAL - beq $16, .Lerror - beq $17, .Lerror - - subq $17, 16, $17 - stq $16, 0($17) - stq $19, 8($17) - mov $18, $16 - - lda $0, __NR_pipe($31) - callsys - bne $19, .Lerror - - beq $0, .Lstart_thread - - ret $31, ($26), 0x01 - -.Lerror: - jmp error_unified_syscall - -.Lstart_thread: - clr $fp - - ldq $27, 0($sp) - ldq $16, 8($sp) - - jsr $26, ($27), 0x04 - - ldgp $gp, 0($26) - mov $0, $16 - jsr $26, _exit - diff --git a/mdk-stage1/dietlibc/alpha/connect.S b/mdk-stage1/dietlibc/alpha/connect.S deleted file mode 100644 index da3675760..000000000 --- a/mdk-stage1/dietlibc/alpha/connect.S +++ /dev/null @@ -1,4 +0,0 @@ -#include "syscalls.h" - -.weak __libc_connect -syscall(connect,connect) diff --git a/mdk-stage1/dietlibc/alpha/divq.S b/mdk-stage1/dietlibc/alpha/divq.S deleted file mode 100644 index cf70862c4..000000000 --- a/mdk-stage1/dietlibc/alpha/divq.S +++ /dev/null @@ -1,102 +0,0 @@ -/* taken from glibc 2.2 */ - - .set noreorder - .set noat - - .ent __divqu - .globl __divqu - - .align 3 -__divqu : - lda $30 , - 48 ($30 ) - .frame $30 , 48 , $23 , 0 - .prologue 0 -$udiv: - stq $1 , 0($30 ) - mov $25 , $1 - stq $2 , 8($30 ) - mov $24 , $2 - stq $0 , 16($30 ) - clr $27 - stq $3 , 24($30 ) - ldiq $0 , 1 - stq $4 ,32($30 ) - beq $1 , $divbyzero - - .align 3 - - -1: cmpult $1 , $2 , $at - blt $1 , 2f - addq $1 , $1 , $1 - addq $0 , $0 , $0 - bne $at , 1b - unop -2: -3: addq $27 ,$0 , $4 - srl $0 , 1, $0 - cmpule $1 , $2 , $at - subq $2 , $1 , $3 - cmovne $at ,$4 , $27 - srl $1 , 1, $1 - cmovne $at , $3 , $2 - bne $0 , 3b - -$done: ldq $1 , 0($30 ) - ldq $2 , 8($30 ) - ldq $0 , 16($30 ) - ldq $3 , 24($30 ) - ldq $4 ,32($30 ) - lda $30 , 48 ($30 ) - ret $31 , ($23 ), 1 - -$divbyzero: - mov $16 , $3 - ldiq $16 , -2 - call_pal 170 - mov $3 , $16 - clr $27 - br $done - - .end __divqu - - .ent __divq - .globl __divq - - .align 3 -__divq : - lda $30 , - 48 ($30 ) - .frame $30 , 48 , $23 , 0 - .prologue 0 - or $24 , $25 , $at - - bge $at , $udiv - - - stq $24 , 0($30 ) - negq $24 , $at - stq $25 , 8($30 ) - cmovge $at , $at , $24 - stq $23 , 16($30 ) - negq $25 , $at - stq $3 , 24($30 ) - cmovge $at , $at , $25 - - - bsr $23 , __divqu - - - ldq $24 , 0($30 ) - ldq $25 , 8($30 ) - xor $24 , $25 , $at - negq $27 , $3 - - ldq $23 , 16($30 ) - cmovlt $at , $3 , $27 - ldq $3 , 24($30 ) - - lda $30 , 48 ($30 ) - ret $31 , ($23 ), 1 - - .end __divq - diff --git a/mdk-stage1/dietlibc/alpha/getegid.S b/mdk-stage1/dietlibc/alpha/getegid.S deleted file mode 100644 index 89c35d45e..000000000 --- a/mdk-stage1/dietlibc/alpha/getegid.S +++ /dev/null @@ -1,11 +0,0 @@ -.text -.align 2 -.global getegid -getegid: - lda $sp,-8($sp) - stq $26, 0($sp) - jsr getgid - ldq $26, 0($sp) - lda $sp, 8($sp) - cmovge $0, $20, $0 - ret diff --git a/mdk-stage1/dietlibc/alpha/geteuid.S b/mdk-stage1/dietlibc/alpha/geteuid.S deleted file mode 100644 index 087ca7348..000000000 --- a/mdk-stage1/dietlibc/alpha/geteuid.S +++ /dev/null @@ -1,11 +0,0 @@ -.text -.align 2 -.global geteuid -geteuid: - lda $sp,-8($sp) - stq $26, 0($sp) - jsr getuid - ldq $26, 0($sp) - lda $sp, 8($sp) - cmovge $0, $20, $0 - ret diff --git a/mdk-stage1/dietlibc/alpha/getgid.S b/mdk-stage1/dietlibc/alpha/getgid.S deleted file mode 100644 index 7350082f3..000000000 --- a/mdk-stage1/dietlibc/alpha/getgid.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(getxgid,getgid) diff --git a/mdk-stage1/dietlibc/alpha/getpeername.S b/mdk-stage1/dietlibc/alpha/getpeername.S deleted file mode 100644 index 3b3f48b1a..000000000 --- a/mdk-stage1/dietlibc/alpha/getpeername.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(getpeername,getpeername) diff --git a/mdk-stage1/dietlibc/alpha/getpid.S b/mdk-stage1/dietlibc/alpha/getpid.S deleted file mode 100644 index d8b3523b2..000000000 --- a/mdk-stage1/dietlibc/alpha/getpid.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(getxpid,getpid) diff --git a/mdk-stage1/dietlibc/alpha/getppid.S b/mdk-stage1/dietlibc/alpha/getppid.S deleted file mode 100644 index e181268c3..000000000 --- a/mdk-stage1/dietlibc/alpha/getppid.S +++ /dev/null @@ -1,11 +0,0 @@ -.text -.align 2 -.global getppid -getppid: - lda $sp,-8($sp) - stq $26, 0($sp) - jsr getpid - ldq $26, 0($sp) - lda $sp, 8($sp) - cmovge $0, $20, $0 - ret diff --git a/mdk-stage1/dietlibc/alpha/getsockname.S b/mdk-stage1/dietlibc/alpha/getsockname.S deleted file mode 100644 index 2727d88da..000000000 --- a/mdk-stage1/dietlibc/alpha/getsockname.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(getsockname,getsockname) diff --git a/mdk-stage1/dietlibc/alpha/getsockopt.S b/mdk-stage1/dietlibc/alpha/getsockopt.S deleted file mode 100644 index 44b4a910a..000000000 --- a/mdk-stage1/dietlibc/alpha/getsockopt.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(getsockopt,getsockopt) diff --git a/mdk-stage1/dietlibc/alpha/getuid.S b/mdk-stage1/dietlibc/alpha/getuid.S deleted file mode 100644 index fcb5570c2..000000000 --- a/mdk-stage1/dietlibc/alpha/getuid.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(getxuid,getuid) diff --git a/mdk-stage1/dietlibc/alpha/listen.S b/mdk-stage1/dietlibc/alpha/listen.S deleted file mode 100644 index 1102831d4..000000000 --- a/mdk-stage1/dietlibc/alpha/listen.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(listen,listen) diff --git a/mdk-stage1/dietlibc/alpha/mmap.S b/mdk-stage1/dietlibc/alpha/mmap.S deleted file mode 100644 index 2e57fbb74..000000000 --- a/mdk-stage1/dietlibc/alpha/mmap.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(mmap,mmap) diff --git a/mdk-stage1/dietlibc/alpha/pipe.S b/mdk-stage1/dietlibc/alpha/pipe.S deleted file mode 100644 index 3dfef10bf..000000000 --- a/mdk-stage1/dietlibc/alpha/pipe.S +++ /dev/null @@ -1,17 +0,0 @@ -#include "syscalls.h" - -.text -.align 2 -.global pipe -.type pipe,@function -pipe: - lda $0, __NR_pipe($31) - callsys - bne $19, .Lerror - stl $0, 0($16) - stl $20, 4($16) - clr $0 - ret $31, ($26), 0x01 -.Lerror: - br error_unified_syscall - diff --git a/mdk-stage1/dietlibc/alpha/recv.S b/mdk-stage1/dietlibc/alpha/recv.S deleted file mode 100644 index 71b2e37dc..000000000 --- a/mdk-stage1/dietlibc/alpha/recv.S +++ /dev/null @@ -1,4 +0,0 @@ -#include "syscalls.h" - -.weak __libc_recv -syscall(recv,recv) diff --git a/mdk-stage1/dietlibc/alpha/recvfrom.S b/mdk-stage1/dietlibc/alpha/recvfrom.S deleted file mode 100644 index 64779cbb8..000000000 --- a/mdk-stage1/dietlibc/alpha/recvfrom.S +++ /dev/null @@ -1,4 +0,0 @@ -#include "syscalls.h" - -.weak __libc_recvfrom -syscall(recvfrom,recvfrom) diff --git a/mdk-stage1/dietlibc/alpha/send.S b/mdk-stage1/dietlibc/alpha/send.S deleted file mode 100644 index baed3b173..000000000 --- a/mdk-stage1/dietlibc/alpha/send.S +++ /dev/null @@ -1,4 +0,0 @@ -#include "syscalls.h" - -.weak __libc_send -syscall(send,send) diff --git a/mdk-stage1/dietlibc/alpha/sendto.S b/mdk-stage1/dietlibc/alpha/sendto.S deleted file mode 100644 index 19169b26b..000000000 --- a/mdk-stage1/dietlibc/alpha/sendto.S +++ /dev/null @@ -1,4 +0,0 @@ -#include "syscalls.h" - -.weak __libc_sendto -syscall(sendto,sendto) diff --git a/mdk-stage1/dietlibc/alpha/setjmp.S b/mdk-stage1/dietlibc/alpha/setjmp.S deleted file mode 100644 index 3768056be..000000000 --- a/mdk-stage1/dietlibc/alpha/setjmp.S +++ /dev/null @@ -1,46 +0,0 @@ -#include <setjmp.h> - -.text -.global __sigsetjmp -__sigsetjmp: - ldgp $gp, 0($gp) - - mov $sp, $1 - lda $sp, -16($sp) - - stq $26, 0($sp) /* save ra */ - - stq $9, (JB_S0*8) ($16) /* s0 */ - stq $10, (JB_S1*8) ($16) /* s1 */ - stq $11, (JB_S2*8) ($16) /* s2 */ - stq $12, (JB_S3*8) ($16) /* s3 */ - stq $13, (JB_S4*8) ($16) /* s4 */ - stq $14, (JB_S5*8) ($16) /* s5 */ - - stq $26, (JB_PC*8) ($16) /* ra */ - stq $fp, (JB_FP*8) ($16) /* fp */ - stq $1, (JB_SP*8) ($16) /* sp */ - - stt $f2, (JB_F2*8) ($16) /* f2 */ - stt $f3, (JB_F3*8) ($16) /* f3 */ - stt $f4, (JB_F4*8) ($16) /* f4 */ - stt $f5, (JB_F5*8) ($16) /* f5 */ - stt $f6, (JB_F6*8) ($16) /* f6 */ - stt $f7, (JB_F7*8) ($16) /* f7 */ - stt $f8, (JB_F8*8) ($16) /* f8 */ - stt $f9, (JB_F9*8) ($16) /* f9 */ - - br $26, __sigjmp_save /* call __sigjmp_save */ - - ldq $26, 0($sp) /* restore ra */ - - lda $sp, 16($sp) - ret $31, ($26), 1 /* back to caller */ - -.weak setjmp -setjmp: -.weak __setjmp -__setjmp: - ldgp $gp, 0($gp) - mov 0, $17 - br __sigsetjmp diff --git a/mdk-stage1/dietlibc/alpha/setsockopt.S b/mdk-stage1/dietlibc/alpha/setsockopt.S deleted file mode 100644 index e3fe1d321..000000000 --- a/mdk-stage1/dietlibc/alpha/setsockopt.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(setsockopt,setsockopt) diff --git a/mdk-stage1/dietlibc/alpha/signal.S b/mdk-stage1/dietlibc/alpha/signal.S deleted file mode 100644 index ceca0f02d..000000000 --- a/mdk-stage1/dietlibc/alpha/signal.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(osf_signal,signal) diff --git a/mdk-stage1/dietlibc/alpha/sigprocmask.S b/mdk-stage1/dietlibc/alpha/sigprocmask.S deleted file mode 100644 index 8255a739a..000000000 --- a/mdk-stage1/dietlibc/alpha/sigprocmask.S +++ /dev/null @@ -1,7 +0,0 @@ -#include "syscalls.h" - -.text -.align 2 -.weak sigprocmask -sigprocmask: -syscall(osf_sigprocmask,__sigprocmask) diff --git a/mdk-stage1/dietlibc/alpha/socket.S b/mdk-stage1/dietlibc/alpha/socket.S deleted file mode 100644 index 85401f56e..000000000 --- a/mdk-stage1/dietlibc/alpha/socket.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(socket,socket) diff --git a/mdk-stage1/dietlibc/alpha/socketcall.S b/mdk-stage1/dietlibc/alpha/socketcall.S deleted file mode 100644 index b150bd5d5..000000000 --- a/mdk-stage1/dietlibc/alpha/socketcall.S +++ /dev/null @@ -1,5 +0,0 @@ -#include "syscalls.h" - -/* - * Doesn't exist on alpha ( accept, bind, ... are SYSCALLS !?! ) - */ diff --git a/mdk-stage1/dietlibc/alpha/start.S b/mdk-stage1/dietlibc/alpha/start.S deleted file mode 100644 index 00b8e950d..000000000 --- a/mdk-stage1/dietlibc/alpha/start.S +++ /dev/null @@ -1,35 +0,0 @@ -#include "start.h" - -#ifdef __alpha__ - -.text -.align 2 - .set noreorder - -.global __start -__start: -.global _start -_start: - clr $fp /* clear frame pointer */ - - br $gp,.Lstart /* set global pointer */ -.Lstart: - ldgp $gp, 0($gp) - -/* prepare to call main */ - ldl $16, 0($sp) /* argc */ - - lda $17, 8($sp) /* argv */ - - addq $16, 1, $18 /* argp */ - s8addq $18, $17, $18 /* (8*(argc+1))+argv -> argp */ - - stq $18, environ - - mov $0, $21 /* mov v0(dynload) to a5 */ - - jsr $26, main - mov $0, $16 - jsr $26, exit /* YES, CALL! for threads and atexit ! (+4 byte) */ - -#endif diff --git a/mdk-stage1/dietlibc/alpha/strlen.c b/mdk-stage1/dietlibc/alpha/strlen.c deleted file mode 100644 index ac532254a..000000000 --- a/mdk-stage1/dietlibc/alpha/strlen.c +++ /dev/null @@ -1,32 +0,0 @@ -#include <string.h> - -static const unsigned long long magic = 0x0101010101010101LL; - -size_t strlen(const char *s) -{ - const char *t = s; - unsigned long long word; - - if (!s) return 0; - - /* Byte compare up until 64 bit word boundary */ - for (; ((unsigned long long) t & 7); t++) - if (!*t) return t - s; - - /* Word compare */ - do { - word = *((unsigned long long *) t); t += 8; - word = (word - magic) &~ word; - word &= (magic << 7); - } while (word == 0); - - /* word & 0x8080808080808080 == word */ - word = (word - 1) & (magic << 8); - word += (word << 32); - word += (word << 16); - word += (word << 8); - t += word >> 56; - return ((const char *) t) - 8 - s; -} - - diff --git a/mdk-stage1/dietlibc/alpha/time.S b/mdk-stage1/dietlibc/alpha/time.S deleted file mode 100644 index 56a4f9b38..000000000 --- a/mdk-stage1/dietlibc/alpha/time.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(osf_gettimeofday,time) diff --git a/mdk-stage1/dietlibc/alpha/unified.S b/mdk-stage1/dietlibc/alpha/unified.S deleted file mode 100644 index 02a1c9bcd..000000000 --- a/mdk-stage1/dietlibc/alpha/unified.S +++ /dev/null @@ -1,29 +0,0 @@ -#include <dietfeatures.h> - -.global __unified_syscall -__unified_syscall: - callsys - bne $19, .Lerror - ret $31, ($26), 0x01 - -.Lerror: -.global error_unified_syscall -error_unified_syscall: -#ifdef WANT_THREAD_SAVE - lda $sp, -16($sp) /* alloc 2 qwords on stack */ - stq $26, 0($sp) /* save ra to stack */ - stq $0, 8($sp) /* save v0 to stack */ - - jsr $26, __errno_location /* call __errno_location */ - - ldq $1, 8($sp) /* write old v0 to errno */ - stl $1, 0($0) - - lda $0, -1($31) /* new return value is -1 */ - ldq $26, 0($sp) /* restore return address */ - lda $sp, 16($sp) /* free 2 qwords on stack */ -#else - lda $1, errno - stl $0, 0($1) -#endif - ret $31, ($26), 0x01 /* return */ diff --git a/mdk-stage1/dietlibc/alpha/utime.S b/mdk-stage1/dietlibc/alpha/utime.S deleted file mode 100644 index a9a8aada6..000000000 --- a/mdk-stage1/dietlibc/alpha/utime.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(utimes,utime) diff --git a/mdk-stage1/dietlibc/alpha/waitpid.S b/mdk-stage1/dietlibc/alpha/waitpid.S deleted file mode 100644 index 0ff429e17..000000000 --- a/mdk-stage1/dietlibc/alpha/waitpid.S +++ /dev/null @@ -1,9 +0,0 @@ -#include <syscalls.h> - -.text -.align 2 -.weak __libc_waitpid -.global waitpid -waitpid: - clr $19 - br wait4 diff --git a/mdk-stage1/dietlibc/dietdirent.h b/mdk-stage1/dietlibc/dietdirent.h deleted file mode 100644 index d732cf7dc..000000000 --- a/mdk-stage1/dietlibc/dietdirent.h +++ /dev/null @@ -1,6 +0,0 @@ -struct __dirstream { - int fd; - char buf[1024]; - unsigned int num; - unsigned int cur; -}; /* stream data from opendir() */ diff --git a/mdk-stage1/dietlibc/dietfeatures.h b/mdk-stage1/dietlibc/dietfeatures.h deleted file mode 100644 index 979b40d62..000000000 --- a/mdk-stage1/dietlibc/dietfeatures.h +++ /dev/null @@ -1,16 +0,0 @@ - -/* feel free to comment some of these out to reduce code size */ - -//#define WANT_FLOATING_POINT_IN_PRINTF -//#define WANT_FLOATING_POINT_IN_SCANF -#define WANT_NULL_PRINTF - -#define SLASH_PROC_OK - -// #define WANT_BUFFERED_STDIO - -/* use errno_location instead of errno */ -// #define WANT_THREAD_SAVE - -/* do you want smaller or faster string routines? */ -#define WANT_SMALL_STRING_ROUTINES diff --git a/mdk-stage1/dietlibc/dietstdio.h b/mdk-stage1/dietlibc/dietstdio.h deleted file mode 100644 index 5cacbde23..000000000 --- a/mdk-stage1/dietlibc/dietstdio.h +++ /dev/null @@ -1,64 +0,0 @@ -/* diet stdio -- no buffering ;-} */ - -#include "dietfeatures.h" -#include <sys/types.h> - -#define BUFSIZE 128 - -typedef struct __file { - int fd; - int flags; -#ifdef WANT_BUFFERED_STDIO - int seekofs; - int bm; - char buf[BUFSIZE]; - struct __file *next; -#endif -} FILE; - -extern FILE *__stdio_root; - -#define ERRORINDICATOR 1 -#define EOFINDICATOR 2 -#define BUFINPUT 4 -#define BUFLINEWISE 8 - -/* internal function to flush buffer. - * However, if next is BUFINPUT and the buffer is an input buffer, it - * will not be flushed. Vice versa for output */ -extern int __fflush4(FILE *stream,int next); - -FILE *fopen (const char *path, const char *mode); -FILE *fdopen (int fildes, const char *mode); -FILE *freopen (const char *path, const char *mode, FILE *stream); - -int fgetc(FILE *stream); -char *fgets(char *s, int size, FILE *stream); -int getc(FILE *stream); -int getchar(void); -char *gets(char *s); -int ungetc(int c, FILE *stream); - -int fputc(int c, FILE *stream); -int fputs(const char *s, FILE *stream); -int putc(int c, FILE *stream); -int putchar(int c); -int puts(const char *s); - -int fseek( FILE *stream, long offset, int whence); -long ftell( FILE *stream); -void rewind( FILE *stream); -int fgetpos( FILE *stream, fpos_t *pos); -int fsetpos( FILE *stream, fpos_t *pos); - -size_t fread( void *ptr, size_t size, size_t nmemb, FILE *stream); - -size_t fwrite( const void *ptr, size_t size, size_t nmemb, FILE *stream); - -int fflush(FILE *stream); - -int fclose(FILE *stream); - -extern FILE *stdout, *stderr, *stdin; - -#define EOF (int)(-1) diff --git a/mdk-stage1/dietlibc/dirstream.h b/mdk-stage1/dietlibc/dirstream.h deleted file mode 100644 index dc8fba79c..000000000 --- a/mdk-stage1/dietlibc/dirstream.h +++ /dev/null @@ -1,78 +0,0 @@ -/* Copyright (C) 1991, 1992 Free Software Foundation, Inc. -This file is part of the GNU C Library. - -The GNU C Library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. - -The GNU C Library 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 -Library General Public License for more details. - -You should have received a copy of the GNU Library General Public -License along with the GNU C Library; see the file COPYING.LIB. If -not, write to the, 1992 Free Software Foundation, Inc., 675 Mass Ave, -Cambridge, MA 02139, USA. */ - -/* - * POSIX Standard: 5.1.2 Directory Operations <dirent.h> - */ - -#ifndef _DIRSTREAM_H - -#define _DIRSTREAM_H 1 - -#include <sys/types.h> -#include <dirent.h> -#ifdef _POSIX_THREADS -#include <pthread.h> -#endif - -/* For now, syscall readdir () only supports one entry at a time. It - * will be changed in the future. -#define NUMENT 3 -*/ -#ifndef NUMENT -#define NUMENT 1 -#endif - -#define SINGLE_READDIR 11 -#define MULTI_READDIR 12 -#define NEW_READDIR 13 - -/* Directory stream type. */ -struct __dirstream { - /* file descriptor */ - int dd_fd; - - /* offset of the next dir entry in buffer */ - off_t dd_nextloc; - - /* bytes of valid entries in buffer */ - size_t dd_size; - - /* -> directory buffer */ - struct dirent *dd_buf; - - /* we have to convert */ - struct dirent convbuf; - - /* offset of the next dir entry in directory. */ - off_t dd_nextoff; - - /* total size of buffer */ - size_t dd_max; - - enum {unknown, have_getdents, no_getdents} dd_getdents; - - /* lock */ -#ifdef _POSIX_THREADS - pthread_mutex_t *dd_lock; -#else - void *dd_lock; -#endif -}; /* stream data from opendir() */ - -#endif /* dirent.h */ diff --git a/mdk-stage1/dietlibc/i386/Makefile.add b/mdk-stage1/dietlibc/i386/Makefile.add deleted file mode 100644 index 8d2914e66..000000000 --- a/mdk-stage1/dietlibc/i386/Makefile.add +++ /dev/null @@ -1,3 +0,0 @@ - -CFLAGS+=-march=i386 -mcpu=i386 -Os -fomit-frame-pointer -override VPATH=i386:syscalls.s:lib diff --git a/mdk-stage1/dietlibc/i386/__longjmp.S b/mdk-stage1/dietlibc/i386/__longjmp.S deleted file mode 100644 index 312e01ed1..000000000 --- a/mdk-stage1/dietlibc/i386/__longjmp.S +++ /dev/null @@ -1,20 +0,0 @@ -#define _ASM -#define _SETJMP_H -#include <bits/setjmp.h> - -.text -.global __longjmp -__longjmp: - movl 4(%esp), %ecx /* User's jmp_buf in %ecx. */ - movl 8(%esp), %eax /* Second argument is return value. */ - /* Save the return address now. */ - movl (JB_PC*4)(%ecx), %edx - /* Restore registers. */ - movl (JB_BX*4)(%ecx), %ebx - movl (JB_SI*4)(%ecx), %esi - movl (JB_DI*4)(%ecx), %edi - movl (JB_BP*4)(%ecx), %ebp - movl (JB_SP*4)(%ecx), %esp - /* Jump to saved PC. */ - jmp *%edx -.size __longjmp,.-__longjmp; diff --git a/mdk-stage1/dietlibc/i386/mmap.c b/mdk-stage1/dietlibc/i386/mmap.c deleted file mode 100644 index 26ecb55c0..000000000 --- a/mdk-stage1/dietlibc/i386/mmap.c +++ /dev/null @@ -1,16 +0,0 @@ -#include <linux/types.h> -#include <linux/unistd.h> - -#define __NR__mmap __NR_mmap -_syscall1(int,_mmap,unsigned long *,buffer) - -char *mmap(char *addr, size_t len, int prot, int flags, int fd, unsigned long off) { - unsigned long buffer[6]; - buffer[0] = (unsigned long)addr; - buffer[1] = (unsigned long)len; - buffer[2] = (unsigned long)prot; - buffer[3] = (unsigned long)flags; - buffer[4] = (unsigned long)fd; - buffer[5] = (unsigned long)off; - return (char*) _mmap(buffer); -} diff --git a/mdk-stage1/dietlibc/i386/select.S b/mdk-stage1/dietlibc/i386/select.S deleted file mode 100644 index 6e9fce8e3..000000000 --- a/mdk-stage1/dietlibc/i386/select.S +++ /dev/null @@ -1,6 +0,0 @@ -#include "syscalls.h" - -.text -.weak select -select: -syscall(_newselect,select) diff --git a/mdk-stage1/dietlibc/i386/setjmp.S b/mdk-stage1/dietlibc/i386/setjmp.S deleted file mode 100644 index d7898e58f..000000000 --- a/mdk-stage1/dietlibc/i386/setjmp.S +++ /dev/null @@ -1,64 +0,0 @@ -#define _ASM -#define _SETJMP_H -#include <bits/setjmp.h> - -/* setjmp for i386. - Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. - - The GNU C Library 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with the GNU C Library; see the file COPYING.LIB. If not, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -.section .rodata -.text -.weak setjmp -setjmp: -.globl __setjmp -__setjmp: - popl %eax /* Pop return address. */ - popl %ecx /* Pop jmp_buf. */ - pushl $0 /* Push zero argument. */ - pushl %ecx /* Push jmp_buf. */ - pushl %eax /* Push back return address. */ - -.globl __sigsetjmp -__sigsetjmp: - movl 4(%esp), %eax /* User's jmp_buf in %eax. */ - /* Save registers. */ - movl %ebx, (JB_BX*4)(%eax) - movl %esi, (JB_SI*4)(%eax) - movl %edi, (JB_DI*4)(%eax) - movl %ebp, (JB_BP*4)(%eax) - leal 4(%esp), %ecx /* Save SP as it will be after we return. */ - movl %ecx, (JB_SP*4)(%eax) - movl 0(%esp), %ecx /* Save PC we are returning to now. */ - movl %ecx, (JB_PC*4)(%eax) - - /* Make a tail call to __sigjmp_save; it takes the same args. */ -#ifdef PIC - /* We cannot use the PLT, because it requires that %ebx be set, but - we can't save and restore our caller's value. Instead, we do an - indirect jump through the GOT, using for the temporary register - %ecx, which is call-clobbered. */ - call L(here) -L(here): - popl %ecx - addl $_GLOBAL_OFFSET_TABLE_+[.-L(here)], %ecx - movl C_SYMBOL_NAME(__sigjmp_save@GOT)(%ecx), %ecx - jmp *%ecx -#else - jmp __sigjmp_save -#endif -.size __sigsetjmp,.-__sigsetjmp; diff --git a/mdk-stage1/dietlibc/i386/start.S b/mdk-stage1/dietlibc/i386/start.S deleted file mode 100644 index 8a2ba7e38..000000000 --- a/mdk-stage1/dietlibc/i386/start.S +++ /dev/null @@ -1,28 +0,0 @@ -#include "start.h" - -#ifdef __i386__ -.text -.globl _start -_start: -#if 0 - popl %ecx - movl %esp, %edx - leal 4(%esp,%ecx,4),%eax -#else - movl (%esp),%ecx /* %ecx = argc */ - leal 4(%esp),%edx /* %edx = argv */ - - leal 4(%edx,%ecx,4),%eax /* eax = 4*ecx+4 = envp */ -#endif - pushl %eax - pushl %edx - pushl %ecx - movl %eax,environ - - call main - pushl %eax - call exit -.Lfefe: - .size _start,.Lfefe-_start -#endif - diff --git a/mdk-stage1/dietlibc/i386/strchr.S b/mdk-stage1/dietlibc/i386/strchr.S deleted file mode 100644 index 0a2a5aa52..000000000 --- a/mdk-stage1/dietlibc/i386/strchr.S +++ /dev/null @@ -1,47 +0,0 @@ -#define NEW - -.text -.global strchr -strchr: - mov %esi,%edx - mov 0x4(%esp,1),%esi - mov 0x8(%esp,1),%cl - cld -.L1: - lods (%esi),%eax - cmp %al,%cl - jz .Lafound - test %al,%al - jz .Lnotfound - - cmp %ah,%cl - jz .Lbfound - test %ah,%ah - jz .Lnotfound - - shr $16,%eax - cmp %al,%cl - jz .Lcfound - test %al,%al - jz .Lnotfound - - cmp %ah,%cl - jz .Ldfound - test %ah,%ah - - jnz .L1 -.Lnotfound: - sub %eax,%eax - mov %edx,%esi - ret -.Lafound: - dec %esi -.Lbfound: - dec %esi -.Lcfound: - dec %esi -.Ldfound: - mov %esi,%eax - mov %edx,%esi - dec %eax - ret diff --git a/mdk-stage1/dietlibc/i386/unified.S b/mdk-stage1/dietlibc/i386/unified.S deleted file mode 100644 index 740cb0ecc..000000000 --- a/mdk-stage1/dietlibc/i386/unified.S +++ /dev/null @@ -1,33 +0,0 @@ -#include <dietfeatures.h> - -.text -.global __unified_syscall -__unified_syscall: - and $0xff,%eax - push %edi - push %esi - push %ebx - movl 0x10(%esp),%ebx - movl 0x14(%esp),%ecx - movl 0x18(%esp),%edx - movl 0x1c(%esp),%esi - movl 0x20(%esp),%edi - int $0x80 - cmp $-124,%eax - jbe .Lnoerror -#ifdef WANT_THREAD_SAVE - movl %eax,%ebx - call __errno_location - neg %ebx - movl %ebx,(%eax) -#else - neg %eax - mov %eax,errno -#endif - xor %eax,%eax - dec %eax -.Lnoerror: - pop %ebx - pop %esi - pop %edi - ret diff --git a/mdk-stage1/dietlibc/include/arpa/inet.h b/mdk-stage1/dietlibc/include/arpa/inet.h deleted file mode 100644 index 6aa71a162..000000000 --- a/mdk-stage1/dietlibc/include/arpa/inet.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef _ARPA_INET_H -#define _ARPA_INET_H - -#include <sys/cdefs.h> -#include <sys/types.h> - -int inet_aton(const char *cp, struct in_addr *inp) __THROW; -unsigned long int inet_addr(const char *cp) __THROW; -unsigned long int inet_network(const char *cp) __THROW; -char *inet_ntoa(struct in_addr in) __THROW; -struct in_addr inet_makeaddr(int net, int host) __THROW; -unsigned long int inet_lnaof(struct in_addr in) __THROW; -unsigned long int inet_netof(struct in_addr in) __THROW; - -#endif diff --git a/mdk-stage1/dietlibc/include/assert.h b/mdk-stage1/dietlibc/include/assert.h deleted file mode 100644 index adf956022..000000000 --- a/mdk-stage1/dietlibc/include/assert.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef _ASSERT_H -#define _ASSERT_H - -#include <sys/cdefs.h> - -/* This prints an "Assertion failed" message and aborts. */ -extern void __assert_fail (__const char *__assertion, __const char *__file, - unsigned int __line, __const char *__function) - __THROW __attribute__ ((__noreturn__)); - -#ifdef __PRETTY_FUNCTION__ -#define __ASSERT_FUNCTION __PRETTY_FUNCTION__ -#else -#define __ASSERT_FUNCTION __func__ -#endif - -#undef assert -# define assert(expr) \ - ((void) ((expr) ? 0 : \ - (__assert_fail (#expr, \ - __FILE__, __LINE__, __ASSERT_FUNCTION), 0))) - -#endif diff --git a/mdk-stage1/dietlibc/include/ctype.h b/mdk-stage1/dietlibc/include/ctype.h deleted file mode 100644 index c8f4e5a34..000000000 --- a/mdk-stage1/dietlibc/include/ctype.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef _CTYPE_H -#define _CTYPE_H - -#include <sys/cdefs.h> - -extern int isascii (int c) __THROW; -extern int isblank (int c) __THROW; -extern int isalnum (int c) __THROW; -extern int isalpha (int c) __THROW; -extern int isdigit (int c) __THROW; -extern int isspace (int c) __THROW; - -#endif diff --git a/mdk-stage1/dietlibc/include/dirent.h b/mdk-stage1/dietlibc/include/dirent.h deleted file mode 100644 index d277c0762..000000000 --- a/mdk-stage1/dietlibc/include/dirent.h +++ /dev/null @@ -1,61 +0,0 @@ -#ifndef _DIRENT_H -#define _DIRENT_H 1 - -#include <sys/cdefs.h> -#include <sys/types.h> - -#include <linux/dirent.h> - -#if 0 -struct dirent - { -#ifndef __USE_FILE_OFFSET64 - ino_t d_ino; - off_t d_off; -#else - ino64_t d_ino; - off64_t d_off; -#endif - unsigned short int d_reclen; - unsigned char d_type; - char d_name[256]; /* We must not include limits.h! */ - }; - -#ifdef __USE_LARGEFILE64 -struct dirent64 - { - ino64_t d_ino; - off64_t d_off; - unsigned short int d_reclen; - unsigned char d_type; - char d_name[256]; /* We must not include limits.h! */ - }; -#endif -#endif - -#define d_fileno d_ino /* Backwards compatibility. */ - -#undef _DIRENT_HAVE_D_NAMLEN -#define _DIRENT_HAVE_D_RECLEN -#define _DIRENT_HAVE_D_OFF -#define _DIRENT_HAVE_D_TYPE - -#define opendir(name) __dietopendir(name) -#define closedir(dir) __dietclosedir(dir) -#define readdir(dir) __dietreaddir(dir) -#define readdir64(dir) __dietreaddir64(dir) -#define rewinddir(dir) __dietrewinddir64(dir) -#define seekdir(dir,pos) __dietseekdir(dir,pos) -#define telldir(dir) __diettelldir(dir) - -typedef struct __dirstream DIR; - -DIR *opendir (const char *__name) __THROW; -int closedir (DIR *__dirp) __THROW; -struct dirent *readdir (DIR *__dirp) __THROW; -struct dirent64 *readdir64 (DIR *__dirp) __THROW; -void rewinddir (DIR *__dirp) __THROW; -void seekdir (DIR *__dirp, long int __pos) __THROW; -long int telldir (DIR *__dirp) __THROW; - -#endif diff --git a/mdk-stage1/dietlibc/include/elf.h b/mdk-stage1/dietlibc/include/elf.h deleted file mode 100644 index bf9f1ea89..000000000 --- a/mdk-stage1/dietlibc/include/elf.h +++ /dev/null @@ -1,1989 +0,0 @@ -/* This file defines standard ELF types, structures, and macros. - Copyright (C) 1995-1999, 2000 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. - - The GNU C Library 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with the GNU C Library; see the file COPYING.LIB. If not, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#ifndef _ELF_H -#define _ELF_H 1 - -/* Standard ELF types. */ - -#include <stdint.h> - -/* Type for a 16-bit quantity. */ -typedef uint16_t Elf32_Half; -typedef uint16_t Elf64_Half; - -/* Types for signed and unsigned 32-bit quantities. */ -typedef uint32_t Elf32_Word; -typedef int32_t Elf32_Sword; -typedef uint32_t Elf64_Word; -typedef int32_t Elf64_Sword; - -/* Types for signed and unsigned 64-bit quantities. */ -typedef uint64_t Elf32_Xword; -typedef int64_t Elf32_Sxword; -typedef uint64_t Elf64_Xword; -typedef int64_t Elf64_Sxword; - -/* Type of addresses. */ -typedef uint32_t Elf32_Addr; -typedef uint64_t Elf64_Addr; - -/* Type of file offsets. */ -typedef uint32_t Elf32_Off; -typedef uint64_t Elf64_Off; - -/* Type for section indices, which are 16-bit quantities. */ -typedef uint16_t Elf32_Section; -typedef uint16_t Elf64_Section; - -/* Type for version symbol information. */ -typedef Elf32_Half Elf32_Versym; -typedef Elf64_Half Elf64_Versym; - - -/* The ELF file header. This appears at the start of every ELF file. */ - -#define EI_NIDENT (16) - -typedef struct -{ - unsigned char e_ident[EI_NIDENT]; /* Magic number and other info */ - Elf32_Half e_type; /* Object file type */ - Elf32_Half e_machine; /* Architecture */ - Elf32_Word e_version; /* Object file version */ - Elf32_Addr e_entry; /* Entry point virtual address */ - Elf32_Off e_phoff; /* Program header table file offset */ - Elf32_Off e_shoff; /* Section header table file offset */ - Elf32_Word e_flags; /* Processor-specific flags */ - Elf32_Half e_ehsize; /* ELF header size in bytes */ - Elf32_Half e_phentsize; /* Program header table entry size */ - Elf32_Half e_phnum; /* Program header table entry count */ - Elf32_Half e_shentsize; /* Section header table entry size */ - Elf32_Half e_shnum; /* Section header table entry count */ - Elf32_Half e_shstrndx; /* Section header string table index */ -} Elf32_Ehdr; - -typedef struct -{ - unsigned char e_ident[EI_NIDENT]; /* Magic number and other info */ - Elf64_Half e_type; /* Object file type */ - Elf64_Half e_machine; /* Architecture */ - Elf64_Word e_version; /* Object file version */ - Elf64_Addr e_entry; /* Entry point virtual address */ - Elf64_Off e_phoff; /* Program header table file offset */ - Elf64_Off e_shoff; /* Section header table file offset */ - Elf64_Word e_flags; /* Processor-specific flags */ - Elf64_Half e_ehsize; /* ELF header size in bytes */ - Elf64_Half e_phentsize; /* Program header table entry size */ - Elf64_Half e_phnum; /* Program header table entry count */ - Elf64_Half e_shentsize; /* Section header table entry size */ - Elf64_Half e_shnum; /* Section header table entry count */ - Elf64_Half e_shstrndx; /* Section header string table index */ -} Elf64_Ehdr; - -/* Fields in the e_ident array. The EI_* macros are indices into the - array. The macros under each EI_* macro are the values the byte - may have. */ - -#define EI_MAG0 0 /* File identification byte 0 index */ -#define ELFMAG0 0x7f /* Magic number byte 0 */ - -#define EI_MAG1 1 /* File identification byte 1 index */ -#define ELFMAG1 'E' /* Magic number byte 1 */ - -#define EI_MAG2 2 /* File identification byte 2 index */ -#define ELFMAG2 'L' /* Magic number byte 2 */ - -#define EI_MAG3 3 /* File identification byte 3 index */ -#define ELFMAG3 'F' /* Magic number byte 3 */ - -/* Conglomeration of the identification bytes, for easy testing as a word. */ -#define ELFMAG "\177ELF" -#define SELFMAG 4 - -#define EI_CLASS 4 /* File class byte index */ -#define ELFCLASSNONE 0 /* Invalid class */ -#define ELFCLASS32 1 /* 32-bit objects */ -#define ELFCLASS64 2 /* 64-bit objects */ -#define ELFCLASSNUM 3 - -#define EI_DATA 5 /* Data encoding byte index */ -#define ELFDATANONE 0 /* Invalid data encoding */ -#define ELFDATA2LSB 1 /* 2's complement, little endian */ -#define ELFDATA2MSB 2 /* 2's complement, big endian */ -#define ELFDATANUM 3 - -#define EI_VERSION 6 /* File version byte index */ - /* Value must be EV_CURRENT */ - -#define EI_OSABI 7 /* OS ABI identification */ -#define ELFOSABI_SYSV 0 /* UNIX System V ABI */ -#define ELFOSABI_HPUX 1 /* HP-UX */ -#define ELFOSABI_ARM 97 /* ARM */ -#define ELFOSABI_STANDALONE 255 /* Standalone (embedded) application */ - -#define EI_ABIVERSION 8 /* ABI version */ - -#define EI_PAD 9 /* Byte index of padding bytes */ - -/* Legal values for e_type (object file type). */ - -#define ET_NONE 0 /* No file type */ -#define ET_REL 1 /* Relocatable file */ -#define ET_EXEC 2 /* Executable file */ -#define ET_DYN 3 /* Shared object file */ -#define ET_CORE 4 /* Core file */ -#define ET_NUM 5 /* Number of defined types */ -#define ET_LOOS 0xfe00 /* OS-specific range start */ -#define ET_HIOS 0xfeff /* OS-specific range end */ -#define ET_LOPROC 0xff00 /* Processor-specific range start */ -#define ET_HIPROC 0xffff /* Processor-specific range end */ - -/* Legal values for e_machine (architecture). */ - -#define EM_NONE 0 /* No machine */ -#define EM_M32 1 /* AT&T WE 32100 */ -#define EM_SPARC 2 /* SUN SPARC */ -#define EM_386 3 /* Intel 80386 */ -#define EM_68K 4 /* Motorola m68k family */ -#define EM_88K 5 /* Motorola m88k family */ -#define EM_860 7 /* Intel 80860 */ -#define EM_MIPS 8 /* MIPS R3000 big-endian */ -#define EM_MIPS_RS3_LE 10 /* MIPS R3000 little-endian */ - -#define EM_PARISC 15 /* HPPA */ -#define EM_VPP500 17 /* Fujitsu VPP500 */ -#define EM_SPARC32PLUS 18 /* Sun's "v8plus" */ -#define EM_960 19 /* Intel 80960 */ -#define EM_PPC 20 /* PowerPC */ -#define EM_PPC64 21 /* PowerPC 64-bit */ - -#define EM_V800 36 /* NEC V800 series */ -#define EM_FR20 37 /* Fujitsu FR20 */ -#define EM_RH32 38 /* TRW RH-32 */ -#define EM_RCE 39 /* Motorola RCE */ -#define EM_ARM 40 /* ARM */ -#define EM_FAKE_ALPHA 41 /* Digital Alpha */ -#define EM_SH 42 /* Hitachi SH */ -#define EM_SPARCV9 43 /* SPARC v9 64-bit */ -#define EM_TRICORE 44 /* Siemens Tricore */ -#define EM_ARC 45 /* Argonaut RISC Core */ -#define EM_H8_300 46 /* Hitachi H8/300 */ -#define EM_H8_300H 47 /* Hitachi H8/300H */ -#define EM_H8S 48 /* Hitachi H8S */ -#define EM_H8_500 49 /* Hitachi H8/500 */ -#define EM_IA_64 50 /* Intel Merced */ -#define EM_MIPS_X 51 /* Stanford MIPS-X */ -#define EM_COLDFIRE 52 /* Motorola Coldfire */ -#define EM_68HC12 53 /* Motorola M68HC12 */ -#define EM_MMA 54 /* Fujitsu MMA Multimedia Accelerator*/ -#define EM_PCP 55 /* Siemens PCP */ -#define EM_NCPU 56 /* Sony nCPU embeeded RISC */ -#define EM_NDR1 57 /* Denso NDR1 microprocessor */ -#define EM_STARCORE 58 /* Motorola Start*Core processor */ -#define EM_ME16 59 /* Toyota ME16 processor */ -#define EM_ST100 60 /* STMicroelectronic ST100 processor */ -#define EM_TINYJ 61 /* Advanced Logic Corp. Tinyj emb.fam*/ -#define EM_X8664 62 /* AMD x86-64 */ - -#define EM_FX66 66 /* Siemens FX66 microcontroller */ -#define EM_ST9PLUS 67 /* STMicroelectronics ST9+ 8/16 mc */ -#define EM_ST7 68 /* STmicroelectronics ST7 8 bit mc */ -#define EM_68HC16 69 /* Motorola MC68HC16 microcontroller */ -#define EM_68HC11 70 /* Motorola MC68HC11 microcontroller */ -#define EM_68HC08 71 /* Motorola MC68HC08 microcontroller */ -#define EM_68HC05 72 /* Motorola MC68HC05 microcontroller */ -#define EM_SVX 73 /* Silicon Graphics SVx */ -#define EM_AT19 74 /* STMicroelectronics ST19 8 bit mc */ -#define EM_VAX 75 /* Digital VAX */ -#define EM_NUM 76 - -/* If it is necessary to assign new unofficial EM_* values, please - pick large random numbers (0x8523, 0xa7f2, etc.) to minimize the - chances of collision with official or non-GNU unofficial values. */ - -#define EM_ALPHA 0x9026 -#define EM_S390 0xA390 /* IBM S390 */ - -/* Legal values for e_version (version). */ - -#define EV_NONE 0 /* Invalid ELF version */ -#define EV_CURRENT 1 /* Current version */ -#define EV_NUM 2 - -/* Section header. */ - -typedef struct -{ - Elf32_Word sh_name; /* Section name (string tbl index) */ - Elf32_Word sh_type; /* Section type */ - Elf32_Word sh_flags; /* Section flags */ - Elf32_Addr sh_addr; /* Section virtual addr at execution */ - Elf32_Off sh_offset; /* Section file offset */ - Elf32_Word sh_size; /* Section size in bytes */ - Elf32_Word sh_link; /* Link to another section */ - Elf32_Word sh_info; /* Additional section information */ - Elf32_Word sh_addralign; /* Section alignment */ - Elf32_Word sh_entsize; /* Entry size if section holds table */ -} Elf32_Shdr; - -typedef struct -{ - Elf64_Word sh_name; /* Section name (string tbl index) */ - Elf64_Word sh_type; /* Section type */ - Elf64_Xword sh_flags; /* Section flags */ - Elf64_Addr sh_addr; /* Section virtual addr at execution */ - Elf64_Off sh_offset; /* Section file offset */ - Elf64_Xword sh_size; /* Section size in bytes */ - Elf64_Word sh_link; /* Link to another section */ - Elf64_Word sh_info; /* Additional section information */ - Elf64_Xword sh_addralign; /* Section alignment */ - Elf64_Xword sh_entsize; /* Entry size if section holds table */ -} Elf64_Shdr; - -/* Special section indices. */ - -#define SHN_UNDEF 0 /* Undefined section */ -#define SHN_LORESERVE 0xff00 /* Start of reserved indices */ -#define SHN_LOPROC 0xff00 /* Start of processor-specific */ -#define SHN_HIPROC 0xff1f /* End of processor-specific */ -#define SHN_LOOS 0xff20 /* Start of OS-specific */ -#define SHN_HIOS 0xff3f /* End of OS-specific */ -#define SHN_ABS 0xfff1 /* Associated symbol is absolute */ -#define SHN_COMMON 0xfff2 /* Associated symbol is common */ -#define SHN_XINDEX 0xffff /* Index is in extra table. */ -#define SHN_HIRESERVE 0xffff /* End of reserved indices */ - -/* Legal values for sh_type (section type). */ - -#define SHT_NULL 0 /* Section header table entry unused */ -#define SHT_PROGBITS 1 /* Program data */ -#define SHT_SYMTAB 2 /* Symbol table */ -#define SHT_STRTAB 3 /* String table */ -#define SHT_RELA 4 /* Relocation entries with addends */ -#define SHT_HASH 5 /* Symbol hash table */ -#define SHT_DYNAMIC 6 /* Dynamic linking information */ -#define SHT_NOTE 7 /* Notes */ -#define SHT_NOBITS 8 /* Program space with no data (bss) */ -#define SHT_REL 9 /* Relocation entries, no addends */ -#define SHT_SHLIB 10 /* Reserved */ -#define SHT_DYNSYM 11 /* Dynamic linker symbol table */ -#define SHT_INIT_ARRAY 14 /* Array of constructors */ -#define SHT_FINI_ARRAY 15 /* Array of destructors */ -#define SHT_PREINIT_ARRAY 16 /* Array of pre-constructors */ -#define SHT_GROUP 17 /* Section group */ -#define SHT_SYMTAB_SHNDX 18 /* Extended section indeces */ -#define SHT_NUM 19 /* Number of defined types. */ -#define SHT_LOOS 0x60000000 /* Start OS-specific */ -#define SHT_LOSUNW 0x6ffffffa /* Sun-specific low bound. */ -#define SHT_SUNW_move 0x6ffffffa -#define SHT_SUNW_COMDAT 0x6ffffffb -#define SHT_SUNW_syminfo 0x6ffffffc -#define SHT_GNU_verdef 0x6ffffffd /* Version definition section. */ -#define SHT_GNU_verneed 0x6ffffffe /* Version needs section. */ -#define SHT_GNU_versym 0x6fffffff /* Version symbol table. */ -#define SHT_HISUNW 0x6fffffff /* Sun-specific high bound. */ -#define SHT_HIOS 0x6fffffff /* End OS-specific type */ -#define SHT_LOPROC 0x70000000 /* Start of processor-specific */ -#define SHT_HIPROC 0x7fffffff /* End of processor-specific */ -#define SHT_LOUSER 0x80000000 /* Start of application-specific */ -#define SHT_HIUSER 0x8fffffff /* End of application-specific */ - -/* Legal values for sh_flags (section flags). */ - -#define SHF_WRITE (1 << 0) /* Writable */ -#define SHF_ALLOC (1 << 1) /* Occupies memory during execution */ -#define SHF_EXECINSTR (1 << 2) /* Executable */ -#define SHF_MERGE (1 << 4) /* Might be merged */ -#define SHF_STRINGS (1 << 5) /* Contains nul-terminated strings */ -#define SHF_INFO_LINK (1 << 6) /* `sh_info' contains SHT index */ -#define SHF_LINK_ORDER (1 << 7) /* Preserve order after combining */ -#define SHF_OS_NONCONFORMING (1 << 8) /* Non-standard OS specific handling - required */ -#define SHF_MASKOS 0x0ff00000 /* OS-specific. */ -#define SHF_MASKPROC 0xf0000000 /* Processor-specific */ - -/* Section group handling. */ -#define GRP_COMDAT 0x1 /* Mark group as COMDAT. */ - -/* Symbol table entry. */ - -typedef struct -{ - Elf32_Word st_name; /* Symbol name (string tbl index) */ - Elf32_Addr st_value; /* Symbol value */ - Elf32_Word st_size; /* Symbol size */ - unsigned char st_info; /* Symbol type and binding */ - unsigned char st_other; /* Symbol visibility */ - Elf32_Section st_shndx; /* Section index */ -} Elf32_Sym; - -typedef struct -{ - Elf64_Word st_name; /* Symbol name (string tbl index) */ - unsigned char st_info; /* Symbol type and binding */ - unsigned char st_other; /* Symbol visibility */ - Elf64_Section st_shndx; /* Section index */ - Elf64_Addr st_value; /* Symbol value */ - Elf64_Xword st_size; /* Symbol size */ -} Elf64_Sym; - -/* The syminfo section if available contains additional information about - every dynamic symbol. */ - -typedef struct -{ - Elf32_Half si_boundto; /* Direct bindings, symbol bound to */ - Elf32_Half si_flags; /* Per symbol flags */ -} Elf32_Syminfo; - -typedef struct -{ - Elf64_Half si_boundto; /* Direct bindings, symbol bound to */ - Elf64_Half si_flags; /* Per symbol flags */ -} Elf64_Syminfo; - -/* Possible values for si_boundto. */ -#define SYMINFO_BT_SELF 0xffff /* Symbol bound to self */ -#define SYMINFO_BT_PARENT 0xfffe /* Symbol bound to parent */ -#define SYMINFO_BT_LOWRESERVE 0xff00 /* Beginning of reserved entries */ - -/* Possible bitmasks for si_flags. */ -#define SYMINFO_FLG_DIRECT 0x0001 /* Direct bound symbol */ -#define SYMINFO_FLG_PASSTHRU 0x0002 /* Pass-thru symbol for translator */ -#define SYMINFO_FLG_COPY 0x0004 /* Symbol is a copy-reloc */ -#define SYMINFO_FLG_LAZYLOAD 0x0008 /* Symbol bound to object to be lazy - loaded */ -/* Syminfo version values. */ -#define SYMINFO_NONE 0 -#define SYMINFO_CURRENT 1 -#define SYMINFO_NUM 2 - - -/* Special section index. */ - -#define SHN_UNDEF 0 /* No section, undefined symbol. */ - -/* How to extract and insert information held in the st_info field. */ - -#define ELF32_ST_BIND(val) (((unsigned char) (val)) >> 4) -#define ELF32_ST_TYPE(val) ((val) & 0xf) -#define ELF32_ST_INFO(bind, type) (((bind) << 4) + ((type) & 0xf)) - -/* Both Elf32_Sym and Elf64_Sym use the same one-byte st_info field. */ -#define ELF64_ST_BIND(val) ELF32_ST_BIND (val) -#define ELF64_ST_TYPE(val) ELF32_ST_TYPE (val) -#define ELF64_ST_INFO(bind, type) ELF32_ST_INFO ((bind), (type)) - -/* Legal values for ST_BIND subfield of st_info (symbol binding). */ - -#define STB_LOCAL 0 /* Local symbol */ -#define STB_GLOBAL 1 /* Global symbol */ -#define STB_WEAK 2 /* Weak symbol */ -#define STB_NUM 3 /* Number of defined types. */ -#define STB_LOOS 10 /* Start of OS-specific */ -#define STB_HIOS 12 /* End of OS-specific */ -#define STB_LOPROC 13 /* Start of processor-specific */ -#define STB_HIPROC 15 /* End of processor-specific */ - -/* Legal values for ST_TYPE subfield of st_info (symbol type). */ - -#define STT_NOTYPE 0 /* Symbol type is unspecified */ -#define STT_OBJECT 1 /* Symbol is a data object */ -#define STT_FUNC 2 /* Symbol is a code object */ -#define STT_SECTION 3 /* Symbol associated with a section */ -#define STT_FILE 4 /* Symbol's name is file name */ -#define STT_COMMON 5 /* Symbol is a common data object */ -#define STT_NUM 6 /* Number of defined types. */ -#define STT_LOOS 10 /* Start of OS-specific */ -#define STT_HIOS 12 /* End of OS-specific */ -#define STT_LOPROC 13 /* Start of processor-specific */ -#define STT_HIPROC 15 /* End of processor-specific */ - - -/* Symbol table indices are found in the hash buckets and chain table - of a symbol hash table section. This special index value indicates - the end of a chain, meaning no further symbols are found in that bucket. */ - -#define STN_UNDEF 0 /* End of a chain. */ - - -/* How to extract and insert information held in the st_other field. */ - -#define ELF32_ST_VISIBILITY(o) ((o) & 0x03) - -/* For ELF64 the definitions are the same. */ -#define ELF64_ST_VISIBILITY(o) ELF32_ST_VISIBILITY (o) - -/* Symbol visibility specification encoded in the st_other field. */ -#define STV_DEFAULT 0 /* Default symbol visibility rules */ -#define STV_INTERNAL 1 /* Processor specific hidden class */ -#define STV_HIDDEN 2 /* Sym unavailable in other modules */ -#define STV_PROTECTED 3 /* Not preemptible, not exported */ - - -/* Relocation table entry without addend (in section of type SHT_REL). */ - -typedef struct -{ - Elf32_Addr r_offset; /* Address */ - Elf32_Word r_info; /* Relocation type and symbol index */ -} Elf32_Rel; - -/* I have seen two different definitions of the Elf64_Rel and - Elf64_Rela structures, so we'll leave them out until Novell (or - whoever) gets their act together. */ -/* The following, at least, is used on Sparc v9, MIPS, and Alpha. */ - -typedef struct -{ - Elf64_Addr r_offset; /* Address */ - Elf64_Xword r_info; /* Relocation type and symbol index */ -} Elf64_Rel; - -/* Relocation table entry with addend (in section of type SHT_RELA). */ - -typedef struct -{ - Elf32_Addr r_offset; /* Address */ - Elf32_Word r_info; /* Relocation type and symbol index */ - Elf32_Sword r_addend; /* Addend */ -} Elf32_Rela; - -typedef struct -{ - Elf64_Addr r_offset; /* Address */ - Elf64_Xword r_info; /* Relocation type and symbol index */ - Elf64_Sxword r_addend; /* Addend */ -} Elf64_Rela; - -/* How to extract and insert information held in the r_info field. */ - -#define ELF32_R_SYM(val) ((val) >> 8) -#define ELF32_R_TYPE(val) ((val) & 0xff) -#define ELF32_R_INFO(sym, type) (((sym) << 8) + ((type) & 0xff)) - -#define ELF64_R_SYM(i) ((i) >> 32) -#define ELF64_R_TYPE(i) ((i) & 0xffffffff) -#define ELF64_R_INFO(sym,type) ((((Elf64_Xword) (sym)) << 32) + (type)) - -/* Program segment header. */ - -typedef struct -{ - Elf32_Word p_type; /* Segment type */ - Elf32_Off p_offset; /* Segment file offset */ - Elf32_Addr p_vaddr; /* Segment virtual address */ - Elf32_Addr p_paddr; /* Segment physical address */ - Elf32_Word p_filesz; /* Segment size in file */ - Elf32_Word p_memsz; /* Segment size in memory */ - Elf32_Word p_flags; /* Segment flags */ - Elf32_Word p_align; /* Segment alignment */ -} Elf32_Phdr; - -typedef struct -{ - Elf64_Word p_type; /* Segment type */ - Elf64_Word p_flags; /* Segment flags */ - Elf64_Off p_offset; /* Segment file offset */ - Elf64_Addr p_vaddr; /* Segment virtual address */ - Elf64_Addr p_paddr; /* Segment physical address */ - Elf64_Xword p_filesz; /* Segment size in file */ - Elf64_Xword p_memsz; /* Segment size in memory */ - Elf64_Xword p_align; /* Segment alignment */ -} Elf64_Phdr; - -/* Legal values for p_type (segment type). */ - -#define PT_NULL 0 /* Program header table entry unused */ -#define PT_LOAD 1 /* Loadable program segment */ -#define PT_DYNAMIC 2 /* Dynamic linking information */ -#define PT_INTERP 3 /* Program interpreter */ -#define PT_NOTE 4 /* Auxiliary information */ -#define PT_SHLIB 5 /* Reserved */ -#define PT_PHDR 6 /* Entry for header table itself */ -#define PT_NUM 7 /* Number of defined types */ -#define PT_LOOS 0x60000000 /* Start of OS-specific */ -#define PT_HIOS 0x6fffffff /* End of OS-specific */ -#define PT_LOPROC 0x70000000 /* Start of processor-specific */ -#define PT_HIPROC 0x7fffffff /* End of processor-specific */ - -/* Legal values for p_flags (segment flags). */ - -#define PF_X (1 << 0) /* Segment is executable */ -#define PF_W (1 << 1) /* Segment is writable */ -#define PF_R (1 << 2) /* Segment is readable */ -#define PF_MASKOS 0x0ff00000 /* OS-specific */ -#define PF_MASKPROC 0xf0000000 /* Processor-specific */ - -/* Legal values for note segment descriptor types for core files. */ - -#define NT_PRSTATUS 1 /* Contains copy of prstatus struct */ -#define NT_FPREGSET 2 /* Contains copy of fpregset struct */ -#define NT_PRPSINFO 3 /* Contains copy of prpsinfo struct */ -#define NT_PRXREG 4 /* Contains copy of prxregset struct */ -#define NT_PLATFORM 5 /* String from sysinfo(SI_PLATFORM) */ -#define NT_AUXV 6 /* Contains copy of auxv array */ -#define NT_GWINDOWS 7 /* Contains copy of gwindows struct */ -#define NT_PSTATUS 10 /* Contains copy of pstatus struct */ -#define NT_PSINFO 13 /* Contains copy of psinfo struct */ -#define NT_PRCRED 14 /* Contains copy of prcred struct */ -#define NT_UTSNAME 15 /* Contains copy of utsname struct */ -#define NT_LWPSTATUS 16 /* Contains copy of lwpstatus struct */ -#define NT_LWPSINFO 17 /* Contains copy of lwpinfo struct */ -#define NT_PRFPXREG 20 /* Contains copy of fprxregset struct*/ - -/* Legal values for the note segment descriptor types for object files. */ - -#define NT_VERSION 1 /* Contains a version string. */ - - -/* Dynamic section entry. */ - -typedef struct -{ - Elf32_Sword d_tag; /* Dynamic entry type */ - union - { - Elf32_Word d_val; /* Integer value */ - Elf32_Addr d_ptr; /* Address value */ - } d_un; -} Elf32_Dyn; - -typedef struct -{ - Elf64_Sxword d_tag; /* Dynamic entry type */ - union - { - Elf64_Xword d_val; /* Integer value */ - Elf64_Addr d_ptr; /* Address value */ - } d_un; -} Elf64_Dyn; - -/* Legal values for d_tag (dynamic entry type). */ - -#define DT_NULL 0 /* Marks end of dynamic section */ -#define DT_NEEDED 1 /* Name of needed library */ -#define DT_PLTRELSZ 2 /* Size in bytes of PLT relocs */ -#define DT_PLTGOT 3 /* Processor defined value */ -#define DT_HASH 4 /* Address of symbol hash table */ -#define DT_STRTAB 5 /* Address of string table */ -#define DT_SYMTAB 6 /* Address of symbol table */ -#define DT_RELA 7 /* Address of Rela relocs */ -#define DT_RELASZ 8 /* Total size of Rela relocs */ -#define DT_RELAENT 9 /* Size of one Rela reloc */ -#define DT_STRSZ 10 /* Size of string table */ -#define DT_SYMENT 11 /* Size of one symbol table entry */ -#define DT_INIT 12 /* Address of init function */ -#define DT_FINI 13 /* Address of termination function */ -#define DT_SONAME 14 /* Name of shared object */ -#define DT_RPATH 15 /* Library search path (deprecated) */ -#define DT_SYMBOLIC 16 /* Start symbol search here */ -#define DT_REL 17 /* Address of Rel relocs */ -#define DT_RELSZ 18 /* Total size of Rel relocs */ -#define DT_RELENT 19 /* Size of one Rel reloc */ -#define DT_PLTREL 20 /* Type of reloc in PLT */ -#define DT_DEBUG 21 /* For debugging; unspecified */ -#define DT_TEXTREL 22 /* Reloc might modify .text */ -#define DT_JMPREL 23 /* Address of PLT relocs */ -#define DT_BIND_NOW 24 /* Process relocations of object */ -#define DT_INIT_ARRAY 25 /* Array with addresses of init fct */ -#define DT_FINI_ARRAY 26 /* Array with addresses of fini fct */ -#define DT_INIT_ARRAYSZ 27 /* Size in bytes of DT_INIT_ARRAY */ -#define DT_FINI_ARRAYSZ 28 /* Size in bytes of DT_FINI_ARRAY */ -#define DT_RUNPATH 29 /* Library search path */ -#define DT_FLAGS 30 /* Flags for the object being loaded */ -#define DT_ENCODING 32 /* Start of encoded range */ -#define DT_PREINIT_ARRAY 32 /* Array with addresses of preinit fct*/ -#define DT_PREINIT_ARRAYSZ 33 /* size in bytes of DT_PREINIT_ARRAY */ -#define DT_NUM 34 /* Number used */ -#define DT_LOOS 0x60000000 /* Start of OS-specific */ -#define DT_HIOS 0x6fffffff /* End of OS-specific */ -#define DT_LOPROC 0x70000000 /* Start of processor-specific */ -#define DT_HIPROC 0x7fffffff /* End of processor-specific */ -#define DT_PROCNUM DT_MIPS_NUM /* Most used by any processor */ - -/* DT_* entries which fall between DT_VALRNGHI & DT_VALRNGLO use the - Dyn.d_un.d_val field of the Elf*_Dyn structure. This follows Sun's - approach. */ -#define DT_VALRNGLO 0x6ffffd00 -#define DT_PLTPADSZ 0x6ffffdf9 -#define DT_MOVEENT 0x6ffffdfa -#define DT_MOVESZ 0x6ffffdfb -#define DT_FEATURE_1 0x6ffffdfc /* Feature selection (DTF_*). */ -#define DT_POSFLAG_1 0x6ffffdfd /* Flags for DT_* entries, effecting - the following DT_* entry. */ -#define DT_SYMINSZ 0x6ffffdfe /* Size of syminfo table (in bytes) */ -#define DT_SYMINENT 0x6ffffdff /* Entry size of syminfo */ -#define DT_VALRNGHI 0x6ffffdff - -/* DT_* entries which fall between DT_ADDRRNGHI & DT_ADDRRNGLO use the - Dyn.d_un.d_ptr field of the Elf*_Dyn structure. - - If any adjustment is made to the ELF object after it has been - built these entries will need to be adjusted. */ -#define DT_ADDRRNGLO 0x6ffffe00 -#define DT_SYMINFO 0x6ffffeff /* syminfo table */ -#define DT_ADDRRNGHI 0x6ffffeff - -/* The versioning entry types. The next are defined as part of the - GNU extension. */ -#define DT_VERSYM 0x6ffffff0 - -#define DT_RELACOUNT 0x6ffffff9 -#define DT_RELCOUNT 0x6ffffffa - -/* These were chosen by Sun. */ -#define DT_FLAGS_1 0x6ffffffb /* State flags, see DF_1_* below. */ -#define DT_VERDEF 0x6ffffffc /* Address of version definition - table */ -#define DT_VERDEFNUM 0x6ffffffd /* Number of version definitions */ -#define DT_VERNEED 0x6ffffffe /* Address of table with needed - versions */ -#define DT_VERNEEDNUM 0x6fffffff /* Number of needed versions */ -#define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */ -#define DT_VERSIONTAGNUM 16 - -/* Sun added these machine-independent extensions in the "processor-specific" - range. Be compatible. */ -#define DT_AUXILIARY 0x7ffffffd /* Shared object to load before self */ -#define DT_FILTER 0x7fffffff /* Shared object to get values from */ -#define DT_EXTRATAGIDX(tag) ((Elf32_Word)-((Elf32_Sword) (tag) <<1>>1)-1) -#define DT_EXTRANUM 3 - -/* Values of `d_un.d_val' in the DT_FLAGS entry. */ -#define DF_ORIGIN 0x00000001 /* Object may use DF_ORIGIN */ -#define DF_SYMBOLIC 0x00000002 /* Symbol resolutions starts here */ -#define DF_TEXTREL 0x00000004 /* Object contains text relocations */ -#define DF_BIND_NOW 0x00000008 /* No lazy binding for this object */ - -/* State flags selectable in the `d_un.d_val' element of the DT_FLAGS_1 - entry in the dynamic section. */ -#define DF_1_NOW 0x00000001 /* Set RTLD_NOW for this object. */ -#define DF_1_GLOBAL 0x00000002 /* Set RTLD_GLOBAL for this object. */ -#define DF_1_GROUP 0x00000004 /* Set RTLD_GROUP for this object. */ -#define DF_1_NODELETE 0x00000008 /* Set RTLD_NODELETE for this object.*/ -#define DF_1_LOADFLTR 0x00000010 /* Trigger filtee loading at runtime.*/ -#define DF_1_INITFIRST 0x00000020 /* Set RTLD_INITFIRST for this object*/ -#define DF_1_NOOPEN 0x00000040 /* Set RTLD_NOOPEN for this object. */ -#define DF_1_ORIGIN 0x00000080 /* $ORIGIN must be handled. */ -#define DF_1_DIRECT 0x00000100 /* Direct binding enabled. */ -#define DF_1_TRANS 0x00000200 -#define DF_1_INTERPOSE 0x00000400 /* Object is used to interpose. */ -#define DF_1_NODEFLIB 0x00000800 /* Ignore default lib search path. */ -#define DF_1_NODUMP 0x00001000 -#define DF_1_CONFALT 0x00002000 -#define DF_1_ENDFILTEE 0x00004000 - -/* Flags for the feature selection in DT_FEATURE_1. */ -#define DTF_1_PARINIT 0x00000001 -#define DTF_1_CONFEXP 0x00000002 - -/* Flags in the DT_POSFLAG_1 entry effecting only the next DT_* entry. */ -#define DF_P1_LAZYLOAD 0x00000001 /* Lazyload following object. */ -#define DF_P1_GROUPPERM 0x00000002 /* Symbols from next object are not - generally available. */ - -/* Version definition sections. */ - -typedef struct -{ - Elf32_Half vd_version; /* Version revision */ - Elf32_Half vd_flags; /* Version information */ - Elf32_Half vd_ndx; /* Version Index */ - Elf32_Half vd_cnt; /* Number of associated aux entries */ - Elf32_Word vd_hash; /* Version name hash value */ - Elf32_Word vd_aux; /* Offset in bytes to verdaux array */ - Elf32_Word vd_next; /* Offset in bytes to next verdef - entry */ -} Elf32_Verdef; - -typedef struct -{ - Elf64_Half vd_version; /* Version revision */ - Elf64_Half vd_flags; /* Version information */ - Elf64_Half vd_ndx; /* Version Index */ - Elf64_Half vd_cnt; /* Number of associated aux entries */ - Elf64_Word vd_hash; /* Version name hash value */ - Elf64_Word vd_aux; /* Offset in bytes to verdaux array */ - Elf64_Word vd_next; /* Offset in bytes to next verdef - entry */ -} Elf64_Verdef; - - -/* Legal values for vd_version (version revision). */ -#define VER_DEF_NONE 0 /* No version */ -#define VER_DEF_CURRENT 1 /* Current version */ -#define VER_DEF_NUM 2 /* Given version number */ - -/* Legal values for vd_flags (version information flags). */ -#define VER_FLG_BASE 0x1 /* Version definition of file itself */ -#define VER_FLG_WEAK 0x2 /* Weak version identifier */ - -/* Auxialiary version information. */ - -typedef struct -{ - Elf32_Word vda_name; /* Version or dependency names */ - Elf32_Word vda_next; /* Offset in bytes to next verdaux - entry */ -} Elf32_Verdaux; - -typedef struct -{ - Elf64_Word vda_name; /* Version or dependency names */ - Elf64_Word vda_next; /* Offset in bytes to next verdaux - entry */ -} Elf64_Verdaux; - - -/* Version dependency section. */ - -typedef struct -{ - Elf32_Half vn_version; /* Version of structure */ - Elf32_Half vn_cnt; /* Number of associated aux entries */ - Elf32_Word vn_file; /* Offset of filename for this - dependency */ - Elf32_Word vn_aux; /* Offset in bytes to vernaux array */ - Elf32_Word vn_next; /* Offset in bytes to next verneed - entry */ -} Elf32_Verneed; - -typedef struct -{ - Elf64_Half vn_version; /* Version of structure */ - Elf64_Half vn_cnt; /* Number of associated aux entries */ - Elf64_Word vn_file; /* Offset of filename for this - dependency */ - Elf64_Word vn_aux; /* Offset in bytes to vernaux array */ - Elf64_Word vn_next; /* Offset in bytes to next verneed - entry */ -} Elf64_Verneed; - - -/* Legal values for vn_version (version revision). */ -#define VER_NEED_NONE 0 /* No version */ -#define VER_NEED_CURRENT 1 /* Current version */ -#define VER_NEED_NUM 2 /* Given version number */ - -/* Auxiliary needed version information. */ - -typedef struct -{ - Elf32_Word vna_hash; /* Hash value of dependency name */ - Elf32_Half vna_flags; /* Dependency specific information */ - Elf32_Half vna_other; /* Unused */ - Elf32_Word vna_name; /* Dependency name string offset */ - Elf32_Word vna_next; /* Offset in bytes to next vernaux - entry */ -} Elf32_Vernaux; - -typedef struct -{ - Elf64_Word vna_hash; /* Hash value of dependency name */ - Elf64_Half vna_flags; /* Dependency specific information */ - Elf64_Half vna_other; /* Unused */ - Elf64_Word vna_name; /* Dependency name string offset */ - Elf64_Word vna_next; /* Offset in bytes to next vernaux - entry */ -} Elf64_Vernaux; - - -/* Legal values for vna_flags. */ -#define VER_FLG_WEAK 0x2 /* Weak version identifier */ - - -/* Auxiliary vector. */ - -/* This vector is normally only used by the program interpreter. The - usual definition in an ABI supplement uses the name auxv_t. The - vector is not usually defined in a standard <elf.h> file, but it - can't hurt. We rename it to avoid conflicts. The sizes of these - types are an arrangement between the exec server and the program - interpreter, so we don't fully specify them here. */ - -typedef struct -{ - int a_type; /* Entry type */ - union - { - long int a_val; /* Integer value */ - void *a_ptr; /* Pointer value */ - void (*a_fcn) (void); /* Function pointer value */ - } a_un; -} Elf32_auxv_t; - -typedef struct -{ - long int a_type; /* Entry type */ - union - { - long int a_val; /* Integer value */ - void *a_ptr; /* Pointer value */ - void (*a_fcn) (void); /* Function pointer value */ - } a_un; -} Elf64_auxv_t; - -/* Legal values for a_type (entry type). */ - -#define AT_NULL 0 /* End of vector */ -#define AT_IGNORE 1 /* Entry should be ignored */ -#define AT_EXECFD 2 /* File descriptor of program */ -#define AT_PHDR 3 /* Program headers for program */ -#define AT_PHENT 4 /* Size of program header entry */ -#define AT_PHNUM 5 /* Number of program headers */ -#define AT_PAGESZ 6 /* System page size */ -#define AT_BASE 7 /* Base address of interpreter */ -#define AT_FLAGS 8 /* Flags */ -#define AT_ENTRY 9 /* Entry point of program */ -#define AT_NOTELF 10 /* Program is not ELF */ -#define AT_UID 11 /* Real uid */ -#define AT_EUID 12 /* Effective uid */ -#define AT_GID 13 /* Real gid */ -#define AT_EGID 14 /* Effective gid */ -#define AT_CLKTCK 17 /* Frequency of times() */ - -/* Some more special a_type values describing the hardware. */ -#define AT_PLATFORM 15 /* String identifying platform. */ -#define AT_HWCAP 16 /* Machine dependent hints about - processor capabilities. */ - -/* This entry gives some information about the FPU initialization - performed by the kernel. */ -#define AT_FPUCW 18 /* Used FPU control word. */ - - -/* Note section contents. Each entry in the note section begins with - a header of a fixed form. */ - -typedef struct -{ - Elf32_Word n_namesz; /* Length of the note's name. */ - Elf32_Word n_descsz; /* Length of the note's descriptor. */ - Elf32_Word n_type; /* Type of the note. */ -} Elf32_Nhdr; - -typedef struct -{ - Elf64_Word n_namesz; /* Length of the note's name. */ - Elf64_Word n_descsz; /* Length of the note's descriptor. */ - Elf64_Word n_type; /* Type of the note. */ -} Elf64_Nhdr; - -/* Known names of notes. */ - -/* Solaris entries in the note section have this name. */ -#define ELF_NOTE_SOLARIS "SUNW Solaris" - -/* Note entries for GNU systems have this name. */ -#define ELF_NOTE_GNU "GNU" - - -/* Defined types of notes for Solaris. */ - -/* Value of descriptor (one word) is desired pagesize for the binary. */ -#define ELF_NOTE_PAGESIZE_HINT 1 - - -/* Defined note types for GNU systems. */ - -/* ABI information. The descriptor consists of words: - word 0: OS descriptor - word 1: major version of the ABI - word 2: minor version of the ABI - word 3: subminor version of the ABI -*/ -#define ELF_NOTE_ABI 1 - -/* Known OSes. These value can appear in word 0 of an ELF_NOTE_ABI - note section entry. */ -#define ELF_NOTE_OS_LINUX 0 -#define ELF_NOTE_OS_GNU 1 -#define ELF_NOTE_OS_SOLARIS2 2 - - -/* Move records. */ -typedef struct -{ - Elf32_Xword m_value; /* Symbol value. */ - Elf32_Word m_info; /* Size and index. */ - Elf32_Word m_poffset; /* Symbol offset. */ - Elf32_Half m_repeat; /* Repeat count. */ - Elf32_Half m_stride; /* Stride info. */ -} Elf32_Move; - -typedef struct -{ - Elf64_Xword m_value; /* Symbol value. */ - Elf64_Xword m_info; /* Size and index. */ - Elf64_Xword m_poffset; /* Symbol offset. */ - Elf64_Half m_repeat; /* Repeat count. */ - Elf64_Half m_stride; /* Stride info. */ -} Elf64_Move; - -/* Macro to construct move records. */ -#define ELF32_M_SYM(info) ((info) >> 8) -#define ELF32_M_SIZE(info) ((unsigned char) (info)) -#define ELF32_M_INFO(sym, size) (((sym) << 8) + (unsigned char) (size)) - -#define ELF64_M_SYM(info) ELF32_M_SYM (info) -#define ELF64_M_SIZE(info) ELF32_M_SIZE (info) -#define ELF64_M_INFO(sym, size) ELF32_M_INFO (sym, size) - - -/* Motorola 68k specific definitions. */ - -/* Values for Elf32_Ehdr.e_flags. */ -#define EF_CPU32 0x00810000 - -/* m68k relocs. */ - -#define R_68K_NONE 0 /* No reloc */ -#define R_68K_32 1 /* Direct 32 bit */ -#define R_68K_16 2 /* Direct 16 bit */ -#define R_68K_8 3 /* Direct 8 bit */ -#define R_68K_PC32 4 /* PC relative 32 bit */ -#define R_68K_PC16 5 /* PC relative 16 bit */ -#define R_68K_PC8 6 /* PC relative 8 bit */ -#define R_68K_GOT32 7 /* 32 bit PC relative GOT entry */ -#define R_68K_GOT16 8 /* 16 bit PC relative GOT entry */ -#define R_68K_GOT8 9 /* 8 bit PC relative GOT entry */ -#define R_68K_GOT32O 10 /* 32 bit GOT offset */ -#define R_68K_GOT16O 11 /* 16 bit GOT offset */ -#define R_68K_GOT8O 12 /* 8 bit GOT offset */ -#define R_68K_PLT32 13 /* 32 bit PC relative PLT address */ -#define R_68K_PLT16 14 /* 16 bit PC relative PLT address */ -#define R_68K_PLT8 15 /* 8 bit PC relative PLT address */ -#define R_68K_PLT32O 16 /* 32 bit PLT offset */ -#define R_68K_PLT16O 17 /* 16 bit PLT offset */ -#define R_68K_PLT8O 18 /* 8 bit PLT offset */ -#define R_68K_COPY 19 /* Copy symbol at runtime */ -#define R_68K_GLOB_DAT 20 /* Create GOT entry */ -#define R_68K_JMP_SLOT 21 /* Create PLT entry */ -#define R_68K_RELATIVE 22 /* Adjust by program base */ -/* Keep this the last entry. */ -#define R_68K_NUM 23 - -/* Intel 80386 specific definitions. */ - -/* i386 relocs. */ - -#define R_386_NONE 0 /* No reloc */ -#define R_386_32 1 /* Direct 32 bit */ -#define R_386_PC32 2 /* PC relative 32 bit */ -#define R_386_GOT32 3 /* 32 bit GOT entry */ -#define R_386_PLT32 4 /* 32 bit PLT address */ -#define R_386_COPY 5 /* Copy symbol at runtime */ -#define R_386_GLOB_DAT 6 /* Create GOT entry */ -#define R_386_JMP_SLOT 7 /* Create PLT entry */ -#define R_386_RELATIVE 8 /* Adjust by program base */ -#define R_386_GOTOFF 9 /* 32 bit offset to GOT */ -#define R_386_GOTPC 10 /* 32 bit PC relative offset to GOT */ -/* Keep this the last entry. */ -#define R_386_NUM 11 - -/* SUN SPARC specific definitions. */ - -/* Legal values for ST_TYPE subfield of st_info (symbol type). */ - -#define STT_REGISTER 13 /* Global register reserved to app. */ - -/* Values for Elf64_Ehdr.e_flags. */ - -#define EF_SPARCV9_MM 3 -#define EF_SPARCV9_TSO 0 -#define EF_SPARCV9_PSO 1 -#define EF_SPARCV9_RMO 2 -#define EF_SPARC_LEDATA 0x800000 /* little endian data */ -#define EF_SPARC_EXT_MASK 0xFFFF00 -#define EF_SPARC_32PLUS 0x000100 /* generic V8+ features */ -#define EF_SPARC_SUN_US1 0x000200 /* Sun UltraSPARC1 extensions */ -#define EF_SPARC_HAL_R1 0x000400 /* HAL R1 extensions */ -#define EF_SPARC_SUN_US3 0x000800 /* Sun UltraSPARCIII extensions */ - -/* SPARC relocs. */ - -#define R_SPARC_NONE 0 /* No reloc */ -#define R_SPARC_8 1 /* Direct 8 bit */ -#define R_SPARC_16 2 /* Direct 16 bit */ -#define R_SPARC_32 3 /* Direct 32 bit */ -#define R_SPARC_DISP8 4 /* PC relative 8 bit */ -#define R_SPARC_DISP16 5 /* PC relative 16 bit */ -#define R_SPARC_DISP32 6 /* PC relative 32 bit */ -#define R_SPARC_WDISP30 7 /* PC relative 30 bit shifted */ -#define R_SPARC_WDISP22 8 /* PC relative 22 bit shifted */ -#define R_SPARC_HI22 9 /* High 22 bit */ -#define R_SPARC_22 10 /* Direct 22 bit */ -#define R_SPARC_13 11 /* Direct 13 bit */ -#define R_SPARC_LO10 12 /* Truncated 10 bit */ -#define R_SPARC_GOT10 13 /* Truncated 10 bit GOT entry */ -#define R_SPARC_GOT13 14 /* 13 bit GOT entry */ -#define R_SPARC_GOT22 15 /* 22 bit GOT entry shifted */ -#define R_SPARC_PC10 16 /* PC relative 10 bit truncated */ -#define R_SPARC_PC22 17 /* PC relative 22 bit shifted */ -#define R_SPARC_WPLT30 18 /* 30 bit PC relative PLT address */ -#define R_SPARC_COPY 19 /* Copy symbol at runtime */ -#define R_SPARC_GLOB_DAT 20 /* Create GOT entry */ -#define R_SPARC_JMP_SLOT 21 /* Create PLT entry */ -#define R_SPARC_RELATIVE 22 /* Adjust by program base */ -#define R_SPARC_UA32 23 /* Direct 32 bit unaligned */ - -/* Additional Sparc64 relocs. */ - -#define R_SPARC_PLT32 24 /* Direct 32 bit ref to PLT entry */ -#define R_SPARC_HIPLT22 25 /* High 22 bit PLT entry */ -#define R_SPARC_LOPLT10 26 /* Truncated 10 bit PLT entry */ -#define R_SPARC_PCPLT32 27 /* PC rel 32 bit ref to PLT entry */ -#define R_SPARC_PCPLT22 28 /* PC rel high 22 bit PLT entry */ -#define R_SPARC_PCPLT10 29 /* PC rel trunc 10 bit PLT entry */ -#define R_SPARC_10 30 /* Direct 10 bit */ -#define R_SPARC_11 31 /* Direct 11 bit */ -#define R_SPARC_64 32 /* Direct 64 bit */ -#define R_SPARC_OLO10 33 /* 10bit with secondary 13bit addend */ -#define R_SPARC_HH22 34 /* Top 22 bits of direct 64 bit */ -#define R_SPARC_HM10 35 /* High middle 10 bits of ... */ -#define R_SPARC_LM22 36 /* Low middle 22 bits of ... */ -#define R_SPARC_PC_HH22 37 /* Top 22 bits of pc rel 64 bit */ -#define R_SPARC_PC_HM10 38 /* High middle 10 bit of ... */ -#define R_SPARC_PC_LM22 39 /* Low miggle 22 bits of ... */ -#define R_SPARC_WDISP16 40 /* PC relative 16 bit shifted */ -#define R_SPARC_WDISP19 41 /* PC relative 19 bit shifted */ -#define R_SPARC_7 43 /* Direct 7 bit */ -#define R_SPARC_5 44 /* Direct 5 bit */ -#define R_SPARC_6 45 /* Direct 6 bit */ -#define R_SPARC_DISP64 46 /* PC relative 64 bit */ -#define R_SPARC_PLT64 47 /* Direct 64 bit ref to PLT entry */ -#define R_SPARC_HIX22 48 /* High 22 bit complemented */ -#define R_SPARC_LOX10 49 /* Truncated 11 bit complemented */ -#define R_SPARC_H44 50 /* Direct high 12 of 44 bit */ -#define R_SPARC_M44 51 /* Direct mid 22 of 44 bit */ -#define R_SPARC_L44 52 /* Direct low 10 of 44 bit */ -#define R_SPARC_REGISTER 53 /* Global register usage */ -#define R_SPARC_UA64 54 /* Direct 64 bit unaligned */ -#define R_SPARC_UA16 55 /* Direct 16 bit unaligned */ -/* Keep this the last entry. */ -#define R_SPARC_NUM 56 - -/* For Sparc64, legal values for d_tag of Elf64_Dyn. */ - -#define DT_SPARC_REGISTER 0x70000001 -#define DT_SPARC_NUM 2 - -/* Bits present in AT_HWCAP, primarily for Sparc32. */ - -#define HWCAP_SPARC_FLUSH 1 /* The cpu supports flush insn. */ -#define HWCAP_SPARC_STBAR 2 -#define HWCAP_SPARC_SWAP 4 -#define HWCAP_SPARC_MULDIV 8 -#define HWCAP_SPARC_V9 16 /* The cpu is v9, so v8plus is ok. */ - -/* MIPS R3000 specific definitions. */ - -/* Legal values for e_flags field of Elf32_Ehdr. */ - -#define EF_MIPS_NOREORDER 1 /* A .noreorder directive was used */ -#define EF_MIPS_PIC 2 /* Contains PIC code */ -#define EF_MIPS_CPIC 4 /* Uses PIC calling sequence */ -#define EF_MIPS_XGOT 8 -#define EF_MIPS_64BIT_WHIRL 16 -#define EF_MIPS_ABI2 32 -#define EF_MIPS_ABI_ON32 64 -#define EF_MIPS_ARCH 0xf0000000 /* MIPS architecture level */ - -/* Legal values for MIPS architecture level. */ - -#define EF_MIPS_ARCH_1 0x00000000 /* -mips1 code. */ -#define EF_MIPS_ARCH_2 0x10000000 /* -mips2 code. */ -#define EF_MIPS_ARCH_3 0x20000000 /* -mips3 code. */ -#define EF_MIPS_ARCH_4 0x30000000 /* -mips4 code. */ -#define EF_MIPS_ARCH_5 0x40000000 /* -mips5 code. */ - -/* The following are non-official names and should not be used. */ - -#define E_MIPS_ARCH_1 0x00000000 /* -mips1 code. */ -#define E_MIPS_ARCH_2 0x10000000 /* -mips2 code. */ -#define E_MIPS_ARCH_3 0x20000000 /* -mips3 code. */ -#define E_MIPS_ARCH_4 0x30000000 /* -mips4 code. */ -#define E_MIPS_ARCH_5 0x40000000 /* -mips5 code. */ - -/* Special section indices. */ - -#define SHN_MIPS_ACOMMON 0xff00 /* Allocated common symbols */ -#define SHN_MIPS_TEXT 0xff01 /* Allocated test symbols. */ -#define SHN_MIPS_DATA 0xff02 /* Allocated data symbols. */ -#define SHN_MIPS_SCOMMON 0xff03 /* Small common symbols */ -#define SHN_MIPS_SUNDEFINED 0xff04 /* Small undefined symbols */ - -/* Legal values for sh_type field of Elf32_Shdr. */ - -#define SHT_MIPS_LIBLIST 0x70000000 /* Shared objects used in link */ -#define SHT_MIPS_MSYM 0x70000001 -#define SHT_MIPS_CONFLICT 0x70000002 /* Conflicting symbols */ -#define SHT_MIPS_GPTAB 0x70000003 /* Global data area sizes */ -#define SHT_MIPS_UCODE 0x70000004 /* Reserved for SGI/MIPS compilers */ -#define SHT_MIPS_DEBUG 0x70000005 /* MIPS ECOFF debugging information*/ -#define SHT_MIPS_REGINFO 0x70000006 /* Register usage information */ -#define SHT_MIPS_PACKAGE 0x70000007 -#define SHT_MIPS_PACKSYM 0x70000008 -#define SHT_MIPS_RELD 0x70000009 -#define SHT_MIPS_IFACE 0x7000000b -#define SHT_MIPS_CONTENT 0x7000000c -#define SHT_MIPS_OPTIONS 0x7000000d /* Miscellaneous options. */ -#define SHT_MIPS_SHDR 0x70000010 -#define SHT_MIPS_FDESC 0x70000011 -#define SHT_MIPS_EXTSYM 0x70000012 -#define SHT_MIPS_DENSE 0x70000013 -#define SHT_MIPS_PDESC 0x70000014 -#define SHT_MIPS_LOCSYM 0x70000015 -#define SHT_MIPS_AUXSYM 0x70000016 -#define SHT_MIPS_OPTSYM 0x70000017 -#define SHT_MIPS_LOCSTR 0x70000018 -#define SHT_MIPS_LINE 0x70000019 -#define SHT_MIPS_RFDESC 0x7000001a -#define SHT_MIPS_DELTASYM 0x7000001b -#define SHT_MIPS_DELTAINST 0x7000001c -#define SHT_MIPS_DELTACLASS 0x7000001d -#define SHT_MIPS_DWARF 0x7000001e /* DWARF debugging information. */ -#define SHT_MIPS_DELTADECL 0x7000001f -#define SHT_MIPS_SYMBOL_LIB 0x70000020 -#define SHT_MIPS_EVENTS 0x70000021 /* Event section. */ -#define SHT_MIPS_TRANSLATE 0x70000022 -#define SHT_MIPS_PIXIE 0x70000023 -#define SHT_MIPS_XLATE 0x70000024 -#define SHT_MIPS_XLATE_DEBUG 0x70000025 -#define SHT_MIPS_WHIRL 0x70000026 -#define SHT_MIPS_EH_REGION 0x70000027 -#define SHT_MIPS_XLATE_OLD 0x70000028 -#define SHT_MIPS_PDR_EXCEPTION 0x70000029 - -/* Legal values for sh_flags field of Elf32_Shdr. */ - -#define SHF_MIPS_GPREL 0x10000000 /* Must be part of global data area */ -#define SHF_MIPS_MERGE 0x20000000 -#define SHF_MIPS_ADDR 0x40000000 -#define SHF_MIPS_STRINGS 0x80000000 -#define SHF_MIPS_NOSTRIP 0x08000000 -#define SHF_MIPS_LOCAL 0x04000000 -#define SHF_MIPS_NAMES 0x02000000 -#define SHF_MIPS_NODUPE 0x01000000 - - -/* Symbol tables. */ - -/* MIPS specific values for `st_other'. */ -#define STO_MIPS_DEFAULT 0x0 -#define STO_MIPS_INTERNAL 0x1 -#define STO_MIPS_HIDDEN 0x2 -#define STO_MIPS_PROTECTED 0x3 -#define STO_MIPS_SC_ALIGN_UNUSED 0xff - -/* MIPS specific values for `st_info'. */ -#define STB_MIPS_SPLIT_COMMON 13 - -/* Entries found in sections of type SHT_MIPS_GPTAB. */ - -typedef union -{ - struct - { - Elf32_Word gt_current_g_value; /* -G value used for compilation */ - Elf32_Word gt_unused; /* Not used */ - } gt_header; /* First entry in section */ - struct - { - Elf32_Word gt_g_value; /* If this value were used for -G */ - Elf32_Word gt_bytes; /* This many bytes would be used */ - } gt_entry; /* Subsequent entries in section */ -} Elf32_gptab; - -/* Entry found in sections of type SHT_MIPS_REGINFO. */ - -typedef struct -{ - Elf32_Word ri_gprmask; /* General registers used */ - Elf32_Word ri_cprmask[4]; /* Coprocessor registers used */ - Elf32_Sword ri_gp_value; /* $gp register value */ -} Elf32_RegInfo; - -/* Entries found in sections of type SHT_MIPS_OPTIONS. */ - -typedef struct -{ - unsigned char kind; /* Determines interpretation of the - variable part of descriptor. */ - unsigned char size; /* Size of descriptor, including header. */ - Elf32_Section section; /* Section header index of section affected, - 0 for global options. */ - Elf32_Word info; /* Kind-specific information. */ -} Elf_Options; - -/* Values for `kind' field in Elf_Options. */ - -#define ODK_NULL 0 /* Undefined. */ -#define ODK_REGINFO 1 /* Register usage information. */ -#define ODK_EXCEPTIONS 2 /* Exception processing options. */ -#define ODK_PAD 3 /* Section padding options. */ -#define ODK_HWPATCH 4 /* Hardware workarounds performed */ -#define ODK_FILL 5 /* record the fill value used by the linker. */ -#define ODK_TAGS 6 /* reserve space for desktop tools to write. */ -#define ODK_HWAND 7 /* HW workarounds. 'AND' bits when merging. */ -#define ODK_HWOR 8 /* HW workarounds. 'OR' bits when merging. */ - -/* Values for `info' in Elf_Options for ODK_EXCEPTIONS entries. */ - -#define OEX_FPU_MIN 0x1f /* FPE's which MUST be enabled. */ -#define OEX_FPU_MAX 0x1f00 /* FPE's which MAY be enabled. */ -#define OEX_PAGE0 0x10000 /* page zero must be mapped. */ -#define OEX_SMM 0x20000 /* Force sequential memory mode? */ -#define OEX_FPDBUG 0x40000 /* Force floating point debug mode? */ -#define OEX_PRECISEFP OEX_FPDBUG -#define OEX_DISMISS 0x80000 /* Dismiss invalid address faults? */ - -#define OEX_FPU_INVAL 0x10 -#define OEX_FPU_DIV0 0x08 -#define OEX_FPU_OFLO 0x04 -#define OEX_FPU_UFLO 0x02 -#define OEX_FPU_INEX 0x01 - -/* Masks for `info' in Elf_Options for an ODK_HWPATCH entry. */ - -#define OHW_R4KEOP 0x1 /* R4000 end-of-page patch. */ -#define OHW_R8KPFETCH 0x2 /* may need R8000 prefetch patch. */ -#define OHW_R5KEOP 0x4 /* R5000 end-of-page patch. */ -#define OHW_R5KCVTL 0x8 /* R5000 cvt.[ds].l bug. clean=1. */ - -#define OPAD_PREFIX 0x1 -#define OPAD_POSTFIX 0x2 -#define OPAD_SYMBOL 0x4 - -/* Entry found in `.options' section. */ - -typedef struct -{ - Elf32_Word hwp_flags1; /* Extra flags. */ - Elf32_Word hwp_flags2; /* Extra flags. */ -} Elf_Options_Hw; - -/* Masks for `info' in ElfOptions for ODK_HWAND and ODK_HWOR entries. */ - -#define OHWA0_R4KEOP_CHECKED 0x00000001 -#define OHWA1_R4KEOP_CLEAN 0x00000002 - -/* MIPS relocs. */ - -#define R_MIPS_NONE 0 /* No reloc */ -#define R_MIPS_16 1 /* Direct 16 bit */ -#define R_MIPS_32 2 /* Direct 32 bit */ -#define R_MIPS_REL32 3 /* PC relative 32 bit */ -#define R_MIPS_26 4 /* Direct 26 bit shifted */ -#define R_MIPS_HI16 5 /* High 16 bit */ -#define R_MIPS_LO16 6 /* Low 16 bit */ -#define R_MIPS_GPREL16 7 /* GP relative 16 bit */ -#define R_MIPS_LITERAL 8 /* 16 bit literal entry */ -#define R_MIPS_GOT16 9 /* 16 bit GOT entry */ -#define R_MIPS_PC16 10 /* PC relative 16 bit */ -#define R_MIPS_CALL16 11 /* 16 bit GOT entry for function */ -#define R_MIPS_GPREL32 12 /* GP relative 32 bit */ - -#define R_MIPS_SHIFT5 16 -#define R_MIPS_SHIFT6 17 -#define R_MIPS_64 18 -#define R_MIPS_GOT_DISP 19 -#define R_MIPS_GOT_PAGE 20 -#define R_MIPS_GOT_OFST 21 -#define R_MIPS_GOT_HI16 22 -#define R_MIPS_GOT_LO16 23 -#define R_MIPS_SUB 24 -#define R_MIPS_INSERT_A 25 -#define R_MIPS_INSERT_B 26 -#define R_MIPS_DELETE 27 -#define R_MIPS_HIGHER 28 -#define R_MIPS_HIGHEST 29 -#define R_MIPS_CALL_HI16 30 -#define R_MIPS_CALL_LO16 31 -#define R_MIPS_SCN_DISP 32 -#define R_MIPS_REL16 33 -#define R_MIPS_ADD_IMMEDIATE 34 -#define R_MIPS_PJUMP 35 -#define R_MIPS_RELGOT 36 -#define R_MIPS_JALR 37 -/* Keep this the last entry. */ -#define R_MIPS_NUM 38 - -/* Legal values for p_type field of Elf32_Phdr. */ - -#define PT_MIPS_REGINFO 0x70000000 /* Register usage information */ -#define PT_MIPS_RTPROC 0x70000001 /* Runtime procedure table. */ -#define PT_MIPS_OPTIONS 0x70000002 - -/* Special program header types. */ - -#define PF_MIPS_LOCAL 0x10000000 - -/* Legal values for d_tag field of Elf32_Dyn. */ - -#define DT_MIPS_RLD_VERSION 0x70000001 /* Runtime linker interface version */ -#define DT_MIPS_TIME_STAMP 0x70000002 /* Timestamp */ -#define DT_MIPS_ICHECKSUM 0x70000003 /* Checksum */ -#define DT_MIPS_IVERSION 0x70000004 /* Version string (string tbl index) */ -#define DT_MIPS_FLAGS 0x70000005 /* Flags */ -#define DT_MIPS_BASE_ADDRESS 0x70000006 /* Base address */ -#define DT_MIPS_MSYM 0x70000007 -#define DT_MIPS_CONFLICT 0x70000008 /* Address of CONFLICT section */ -#define DT_MIPS_LIBLIST 0x70000009 /* Address of LIBLIST section */ -#define DT_MIPS_LOCAL_GOTNO 0x7000000a /* Number of local GOT entries */ -#define DT_MIPS_CONFLICTNO 0x7000000b /* Number of CONFLICT entries */ -#define DT_MIPS_LIBLISTNO 0x70000010 /* Number of LIBLIST entries */ -#define DT_MIPS_SYMTABNO 0x70000011 /* Number of DYNSYM entries */ -#define DT_MIPS_UNREFEXTNO 0x70000012 /* First external DYNSYM */ -#define DT_MIPS_GOTSYM 0x70000013 /* First GOT entry in DYNSYM */ -#define DT_MIPS_HIPAGENO 0x70000014 /* Number of GOT page table entries */ -#define DT_MIPS_RLD_MAP 0x70000016 /* Address of run time loader map. */ -#define DT_MIPS_DELTA_CLASS 0x70000017 /* Delta C++ class definition. */ -#define DT_MIPS_DELTA_CLASS_NO 0x70000018 /* Number of entries in - DT_MIPS_DELTA_CLASS. */ -#define DT_MIPS_DELTA_INSTANCE 0x70000019 /* Delta C++ class instances. */ -#define DT_MIPS_DELTA_INSTANCE_NO 0x7000001a /* Number of entries in - DT_MIPS_DELTA_INSTANCE. */ -#define DT_MIPS_DELTA_RELOC 0x7000001b /* Delta relocations. */ -#define DT_MIPS_DELTA_RELOC_NO 0x7000001c /* Number of entries in - DT_MIPS_DELTA_RELOC. */ -#define DT_MIPS_DELTA_SYM 0x7000001d /* Delta symbols that Delta - relocations refer to. */ -#define DT_MIPS_DELTA_SYM_NO 0x7000001e /* Number of entries in - DT_MIPS_DELTA_SYM. */ -#define DT_MIPS_DELTA_CLASSSYM 0x70000020 /* Delta symbols that hold the - class declaration. */ -#define DT_MIPS_DELTA_CLASSSYM_NO 0x70000021 /* Number of entries in - DT_MIPS_DELTA_CLASSSYM. */ -#define DT_MIPS_CXX_FLAGS 0x70000022 /* Flags indicating for C++ flavor. */ -#define DT_MIPS_PIXIE_INIT 0x70000023 -#define DT_MIPS_SYMBOL_LIB 0x70000024 -#define DT_MIPS_LOCALPAGE_GOTIDX 0x70000025 -#define DT_MIPS_LOCAL_GOTIDX 0x70000026 -#define DT_MIPS_HIDDEN_GOTIDX 0x70000027 -#define DT_MIPS_PROTECTED_GOTIDX 0x70000028 -#define DT_MIPS_OPTIONS 0x70000029 /* Address of .options. */ -#define DT_MIPS_INTERFACE 0x7000002a /* Address of .interface. */ -#define DT_MIPS_DYNSTR_ALIGN 0x7000002b -#define DT_MIPS_INTERFACE_SIZE 0x7000002c /* Size of the .interface section. */ -#define DT_MIPS_RLD_TEXT_RESOLVE_ADDR 0x7000002d /* Address of rld_text_rsolve - function stored in GOT. */ -#define DT_MIPS_PERF_SUFFIX 0x7000002e /* Default suffix of dso to be added - by rld on dlopen() calls. */ -#define DT_MIPS_COMPACT_SIZE 0x7000002f /* (O32)Size of compact rel section. */ -#define DT_MIPS_GP_VALUE 0x70000030 /* GP value for aux GOTs. */ -#define DT_MIPS_AUX_DYNAMIC 0x70000031 /* Address of aux .dynamic. */ -#define DT_MIPS_NUM 0x32 - -/* Legal values for DT_MIPS_FLAGS Elf32_Dyn entry. */ - -#define RHF_NONE 0 /* No flags */ -#define RHF_QUICKSTART (1 << 0) /* Use quickstart */ -#define RHF_NOTPOT (1 << 1) /* Hash size not power of 2 */ -#define RHF_NO_LIBRARY_REPLACEMENT (1 << 2) /* Ignore LD_LIBRARY_PATH */ -#define RHF_NO_MOVE (1 << 3) -#define RHF_SGI_ONLY (1 << 4) -#define RHF_GUARANTEE_INIT (1 << 5) -#define RHF_DELTA_C_PLUS_PLUS (1 << 6) -#define RHF_GUARANTEE_START_INIT (1 << 7) -#define RHF_PIXIE (1 << 8) -#define RHF_DEFAULT_DELAY_LOAD (1 << 9) -#define RHF_REQUICKSTART (1 << 10) -#define RHF_REQUICKSTARTED (1 << 11) -#define RHF_CORD (1 << 12) -#define RHF_NO_UNRES_UNDEF (1 << 13) -#define RHF_RLD_ORDER_SAFE (1 << 14) - -/* Entries found in sections of type SHT_MIPS_LIBLIST. */ - -typedef struct -{ - Elf32_Word l_name; /* Name (string table index) */ - Elf32_Word l_time_stamp; /* Timestamp */ - Elf32_Word l_checksum; /* Checksum */ - Elf32_Word l_version; /* Interface version */ - Elf32_Word l_flags; /* Flags */ -} Elf32_Lib; - -typedef struct -{ - Elf64_Word l_name; /* Name (string table index) */ - Elf64_Word l_time_stamp; /* Timestamp */ - Elf64_Word l_checksum; /* Checksum */ - Elf64_Word l_version; /* Interface version */ - Elf64_Word l_flags; /* Flags */ -} Elf64_Lib; - - -/* Legal values for l_flags. */ - -#define LL_NONE 0 -#define LL_EXACT_MATCH (1 << 0) /* Require exact match */ -#define LL_IGNORE_INT_VER (1 << 1) /* Ignore interface version */ -#define LL_REQUIRE_MINOR (1 << 2) -#define LL_EXPORTS (1 << 3) -#define LL_DELAY_LOAD (1 << 4) -#define LL_DELTA (1 << 5) - -/* Entries found in sections of type SHT_MIPS_CONFLICT. */ - -typedef Elf32_Addr Elf32_Conflict; - - -/* HPPA specific definitions. */ - -/* Legal values for e_flags field of Elf32_Ehdr. */ - -#define EF_PARISC_TRAPNIL 0x00010000 /* Trap nil pointer dereference. */ -#define EF_PARISC_EXT 0x00020000 /* Program uses arch. extensions. */ -#define EF_PARISC_LSB 0x00040000 /* Program expects little endian. */ -#define EF_PARISC_WIDE 0x00080000 /* Program expects wide mode. */ -#define EF_PARISC_NO_KABP 0x00100000 /* No kernel assisted branch - prediction. */ -#define EF_PARISC_LAZYSWAP 0x00400000 /* Allow lazy swapping. */ -#define EF_PARISC_ARCH 0x0000ffff /* Architecture version. */ - -/* Defined values for `e_flags & EF_PARISC_ARCH' are: */ - -#define EFA_PARISC_1_0 0x020b /* PA-RISC 1.0 big-endian. */ -#define EFA_PARISC_1_1 0x0210 /* PA-RISC 1.1 big-endian. */ -#define EFA_PARISC_2_0 0x0214 /* PA-RISC 2.0 big-endian. */ - -/* Additional section indeces. */ - -#define SHN_PARISC_ANSI_COMMON 0xff00 /* Section for tenatively declared - symbols in ANSI C. */ -#define SHN_PARISC_HUGE_COMMON 0xff01 /* Common blocks in huge model. */ - -/* Legal values for sh_type field of Elf32_Shdr. */ - -#define SHT_PARISC_EXT 0x70000000 /* Contains product specific ext. */ -#define SHT_PARISC_UNWIND 0x70000001 /* Unwind information. */ -#define SHT_PARISC_DOC 0x70000002 /* Debug info for optimized code. */ - -/* Legal values for sh_flags field of Elf32_Shdr. */ - -#define SHF_PARISC_SHORT 0x20000000 /* Section with short addressing. */ -#define SHF_PARISC_HUGE 0x40000000 /* Section far from gp. */ -#define SHF_PARISC_SBP 0x80000000 /* Static branch prediction code. */ - -/* Legal values for ST_TYPE subfield of st_info (symbol type). */ - -#define STT_PARISC_MILLICODE 13 /* Millicode function entry point. */ - -#define STT_HP_OPAQUE (STT_LOOS + 0x1) -#define STT_HP_STUB (STT_LOOS + 0x2) - -/* HPPA relocs. */ - -#define R_PARISC_NONE 0 /* No reloc. */ -#define R_PARISC_DIR32 1 /* Direct 32-bit reference. */ -#define R_PARISC_DIR21L 2 /* Left 21 bits of eff. address. */ -#define R_PARISC_DIR17R 3 /* Right 17 bits of eff. address. */ -#define R_PARISC_DIR17F 4 /* 17 bits of eff. address. */ -#define R_PARISC_DIR14R 5 /* Right 14 bits of eff. address. */ -#define R_PARISC_PCREL32 9 /* 32-bit rel. address. */ -#define R_PARISC_PCREL21L 10 /* Left 21 bits of rel. address. */ -#define R_PARISC_PCREL17R 11 /* Right 17 bits of rel. address. */ -#define R_PARISC_PCREL17F 12 /* 17 bits of rel. address. */ -#define R_PARISC_PCREL14R 14 /* Right 14 bits of rel. address. */ -#define R_PARISC_GPREL21L 26 /* GP-relative, left 21 bits. */ -#define R_PARISC_GPREL14R 30 /* GP-relative, right 14 bits. */ -#define R_PARISC_LTOFF21L 34 /* LT-relative, left 21 bits. */ -#define R_PARISC_LTOFF14R 38 /* LT-relative, right 14 bits. */ -#define R_PARISC_SECREL32 41 /* 32 bits section rel. address. */ -#define R_PARISC_SEGBASE 48 /* No relocation, set segment base. */ -#define R_PARISC_SEGREL32 49 /* 32 bits segment rel. address. */ -#define R_PARISC_PLTOFF21L 50 /* PLT rel. address, left 21 bits. */ -#define R_PARISC_PLTOFF14R 54 /* PLT rel. address, right 14 bits. */ -#define R_PARISC_LTOFF_FPTR32 57 /* 32 bits LT-rel. function pointer. */ -#define R_PARISC_LTOFF_FPTR21L 58 /* LT-rel. fct ptr, left 21 bits. */ -#define R_PARISC_LTOFF_FPTR14R 62 /* LT-rel. fct ptr, right 14 bits. */ -#define R_PARISC_FPTR64 64 /* 64 bits function address. */ -#define R_PARISC_PLABEL32 65 /* 32 bits function address. */ -#define R_PARISC_PCREL64 72 /* 64 bits PC-rel. address. */ -#define R_PARISC_PCREL22F 74 /* 22 bits PC-rel. address. */ -#define R_PARISC_PCREL14WR 75 /* PC-rel. address, right 14 bits. */ -#define R_PARISC_PCREL14DR 76 /* PC rel. address, right 14 bits. */ -#define R_PARISC_PCREL16F 77 /* 16 bits PC-rel. address. */ -#define R_PARISC_PCREL16WF 78 /* 16 bits PC-rel. address. */ -#define R_PARISC_PCREL16DF 79 /* 16 bits PC-rel. address. */ -#define R_PARISC_DIR64 80 /* 64 bits of eff. address. */ -#define R_PARISC_DIR14WR 83 /* 14 bits of eff. address. */ -#define R_PARISC_DIR14DR 84 /* 14 bits of eff. address. */ -#define R_PARISC_DIR16F 85 /* 16 bits of eff. address. */ -#define R_PARISC_DIR16WF 86 /* 16 bits of eff. address. */ -#define R_PARISC_DIR16DF 87 /* 16 bits of eff. address. */ -#define R_PARISC_GPREL64 88 /* 64 bits of GP-rel. address. */ -#define R_PARISC_GPREL14WR 91 /* GP-rel. address, right 14 bits. */ -#define R_PARISC_GPREL14DR 92 /* GP-rel. address, right 14 bits. */ -#define R_PARISC_GPREL16F 93 /* 16 bits GP-rel. address. */ -#define R_PARISC_GPREL16WF 94 /* 16 bits GP-rel. address. */ -#define R_PARISC_GPREL16DF 95 /* 16 bits GP-rel. address. */ -#define R_PARISC_LTOFF64 96 /* 64 bits LT-rel. address. */ -#define R_PARISC_LTOFF14WR 99 /* LT-rel. address, right 14 bits. */ -#define R_PARISC_LTOFF14DR 100 /* LT-rel. address, right 14 bits. */ -#define R_PARISC_LTOFF16F 101 /* 16 bits LT-rel. address. */ -#define R_PARISC_LTOFF16WF 102 /* 16 bits LT-rel. address. */ -#define R_PARISC_LTOFF16DF 103 /* 16 bits LT-rel. address. */ -#define R_PARISC_SECREL64 104 /* 64 bits section rel. address. */ -#define R_PARISC_SEGREL64 112 /* 64 bits segment rel. address. */ -#define R_PARISC_PLTOFF14WR 115 /* PLT-rel. address, right 14 bits. */ -#define R_PARISC_PLTOFF14DR 116 /* PLT-rel. address, right 14 bits. */ -#define R_PARISC_PLTOFF16F 117 /* 16 bits LT-rel. address. */ -#define R_PARISC_PLTOFF16WF 118 /* 16 bits PLT-rel. address. */ -#define R_PARISC_PLTOFF16DF 119 /* 16 bits PLT-rel. address. */ -#define R_PARISC_LTOFF_FPTR64 120 /* 64 bits LT-rel. function ptr. */ -#define R_PARISC_LTOFF_FPTR14WR 123 /* LT-rel. fct. ptr., right 14 bits. */ -#define R_PARISC_LTOFF_FPTR14DR 124 /* LT-rel. fct. ptr., right 14 bits. */ -#define R_PARISC_LTOFF_FPTR16F 125 /* 16 bits LT-rel. function ptr. */ -#define R_PARISC_LTOFF_FPTR16WF 126 /* 16 bits LT-rel. function ptr. */ -#define R_PARISC_LTOFF_FPTR16DF 127 /* 16 bits LT-rel. function ptr. */ -#define R_PARISC_LORESERVE 128 -#define R_PARISC_COPY 128 /* Copy relocation. */ -#define R_PARISC_IPLT 129 /* Dynamic reloc, imported PLT */ -#define R_PARISC_EPLT 130 /* Dynamic reloc, exported PLT */ -#define R_PARISC_TPREL32 153 /* 32 bits TP-rel. address. */ -#define R_PARISC_TPREL21L 154 /* TP-rel. address, left 21 bits. */ -#define R_PARISC_TPREL14R 158 /* TP-rel. address, right 14 bits. */ -#define R_PARISC_LTOFF_TP21L 162 /* LT-TP-rel. address, left 21 bits. */ -#define R_PARISC_LTOFF_TP14R 166 /* LT-TP-rel. address, right 14 bits.*/ -#define R_PARISC_LTOFF_TP14F 167 /* 14 bits LT-TP-rel. address. */ -#define R_PARISC_TPREL64 216 /* 64 bits TP-rel. address. */ -#define R_PARISC_TPREL14WR 219 /* TP-rel. address, right 14 bits. */ -#define R_PARISC_TPREL14DR 220 /* TP-rel. address, right 14 bits. */ -#define R_PARISC_TPREL16F 221 /* 16 bits TP-rel. address. */ -#define R_PARISC_TPREL16WF 222 /* 16 bits TP-rel. address. */ -#define R_PARISC_TPREL16DF 223 /* 16 bits TP-rel. address. */ -#define R_PARISC_LTOFF_TP64 224 /* 64 bits LT-TP-rel. address. */ -#define R_PARISC_LTOFF_TP14WR 227 /* LT-TP-rel. address, right 14 bits.*/ -#define R_PARISC_LTOFF_TP14DR 228 /* LT-TP-rel. address, right 14 bits.*/ -#define R_PARISC_LTOFF_TP16F 229 /* 16 bits LT-TP-rel. address. */ -#define R_PARISC_LTOFF_TP16WF 230 /* 16 bits LT-TP-rel. address. */ -#define R_PARISC_LTOFF_TP16DF 231 /* 16 bits LT-TP-rel. address. */ -#define R_PARISC_HIRESERVE 255 - -/* Legal values for p_type field of Elf32_Phdr/Elf64_Phdr. */ - -#define PT_HP_TLS (PT_LOOS + 0x0) -#define PT_HP_CORE_NONE (PT_LOOS + 0x1) -#define PT_HP_CORE_VERSION (PT_LOOS + 0x2) -#define PT_HP_CORE_KERNEL (PT_LOOS + 0x3) -#define PT_HP_CORE_COMM (PT_LOOS + 0x4) -#define PT_HP_CORE_PROC (PT_LOOS + 0x5) -#define PT_HP_CORE_LOADABLE (PT_LOOS + 0x6) -#define PT_HP_CORE_STACK (PT_LOOS + 0x7) -#define PT_HP_CORE_SHM (PT_LOOS + 0x8) -#define PT_HP_CORE_MMF (PT_LOOS + 0x9) -#define PT_HP_PARALLEL (PT_LOOS + 0x10) -#define PT_HP_FASTBIND (PT_LOOS + 0x11) -#define PT_HP_OPT_ANNOT (PT_LOOS + 0x12) -#define PT_HP_HSL_ANNOT (PT_LOOS + 0x13) -#define PT_HP_STACK (PT_LOOS + 0x14) - -#define PT_PARISC_ARCHEXT 0x70000000 -#define PT_PARISC_UNWIND 0x70000001 - -/* Legal values for p_flags field of Elf32_Phdr/Elf64_Phdr. */ - -#define PF_PARISC_SBP 0x08000000 - -#define PF_HP_PAGE_SIZE 0x00100000 -#define PF_HP_FAR_SHARED 0x00200000 -#define PF_HP_NEAR_SHARED 0x00400000 -#define PF_HP_CODE 0x01000000 -#define PF_HP_MODIFY 0x02000000 -#define PF_HP_LAZYSWAP 0x04000000 -#define PF_HP_SBP 0x08000000 - - -/* Alpha specific definitions. */ - -/* Legal values for e_flags field of Elf64_Ehdr. */ - -#define EF_ALPHA_32BIT 1 /* All addresses must be < 2GB. */ -#define EF_ALPHA_CANRELAX 2 /* Relocations for relaxing exist. */ - -/* Legal values for sh_type field of Elf64_Shdr. */ - -/* These two are primerily concerned with ECOFF debugging info. */ -#define SHT_ALPHA_DEBUG 0x70000001 -#define SHT_ALPHA_REGINFO 0x70000002 - -/* Legal values for sh_flags field of Elf64_Shdr. */ - -#define SHF_ALPHA_GPREL 0x10000000 - -/* Legal values for st_other field of Elf64_Sym. */ -#define STO_ALPHA_NOPV 0x80 /* No PV required. */ -#define STO_ALPHA_STD_GPLOAD 0x88 /* PV only used for initial ldgp. */ - -/* Alpha relocs. */ - -#define R_ALPHA_NONE 0 /* No reloc */ -#define R_ALPHA_REFLONG 1 /* Direct 32 bit */ -#define R_ALPHA_REFQUAD 2 /* Direct 64 bit */ -#define R_ALPHA_GPREL32 3 /* GP relative 32 bit */ -#define R_ALPHA_LITERAL 4 /* GP relative 16 bit w/optimization */ -#define R_ALPHA_LITUSE 5 /* Optimization hint for LITERAL */ -#define R_ALPHA_GPDISP 6 /* Add displacement to GP */ -#define R_ALPHA_BRADDR 7 /* PC+4 relative 23 bit shifted */ -#define R_ALPHA_HINT 8 /* PC+4 relative 16 bit shifted */ -#define R_ALPHA_SREL16 9 /* PC relative 16 bit */ -#define R_ALPHA_SREL32 10 /* PC relative 32 bit */ -#define R_ALPHA_SREL64 11 /* PC relative 64 bit */ -#define R_ALPHA_OP_PUSH 12 /* OP stack push */ -#define R_ALPHA_OP_STORE 13 /* OP stack pop and store */ -#define R_ALPHA_OP_PSUB 14 /* OP stack subtract */ -#define R_ALPHA_OP_PRSHIFT 15 /* OP stack right shift */ -#define R_ALPHA_GPVALUE 16 -#define R_ALPHA_GPRELHIGH 17 -#define R_ALPHA_GPRELLOW 18 -#define R_ALPHA_IMMED_GP_16 19 -#define R_ALPHA_IMMED_GP_HI32 20 -#define R_ALPHA_IMMED_SCN_HI32 21 -#define R_ALPHA_IMMED_BR_HI32 22 -#define R_ALPHA_IMMED_LO32 23 -#define R_ALPHA_COPY 24 /* Copy symbol at runtime */ -#define R_ALPHA_GLOB_DAT 25 /* Create GOT entry */ -#define R_ALPHA_JMP_SLOT 26 /* Create PLT entry */ -#define R_ALPHA_RELATIVE 27 /* Adjust by program base */ -/* Keep this the last entry. */ -#define R_ALPHA_NUM 28 - - -/* PowerPC specific declarations */ - -/* Values for Elf32/64_Ehdr.e_flags. */ -#define EF_PPC_EMB 0x80000000 /* PowerPC embedded flag */ - -/* Cygnus local bits below */ -#define EF_PPC_RELOCATABLE 0x00010000 /* PowerPC -mrelocatable flag*/ -#define EF_PPC_RELOCATABLE_LIB 0x00008000 /* PowerPC -mrelocatable-lib - flag */ - -/* PowerPC relocations defined by the ABIs */ -#define R_PPC_NONE 0 -#define R_PPC_ADDR32 1 /* 32bit absolute address */ -#define R_PPC_ADDR24 2 /* 26bit address, 2 bits ignored. */ -#define R_PPC_ADDR16 3 /* 16bit absolute address */ -#define R_PPC_ADDR16_LO 4 /* lower 16bit of absolute address */ -#define R_PPC_ADDR16_HI 5 /* high 16bit of absolute address */ -#define R_PPC_ADDR16_HA 6 /* adjusted high 16bit */ -#define R_PPC_ADDR14 7 /* 16bit address, 2 bits ignored */ -#define R_PPC_ADDR14_BRTAKEN 8 -#define R_PPC_ADDR14_BRNTAKEN 9 -#define R_PPC_REL24 10 /* PC relative 26 bit */ -#define R_PPC_REL14 11 /* PC relative 16 bit */ -#define R_PPC_REL14_BRTAKEN 12 -#define R_PPC_REL14_BRNTAKEN 13 -#define R_PPC_GOT16 14 -#define R_PPC_GOT16_LO 15 -#define R_PPC_GOT16_HI 16 -#define R_PPC_GOT16_HA 17 -#define R_PPC_PLTREL24 18 -#define R_PPC_COPY 19 -#define R_PPC_GLOB_DAT 20 -#define R_PPC_JMP_SLOT 21 -#define R_PPC_RELATIVE 22 -#define R_PPC_LOCAL24PC 23 -#define R_PPC_UADDR32 24 -#define R_PPC_UADDR16 25 -#define R_PPC_REL32 26 -#define R_PPC_PLT32 27 -#define R_PPC_PLTREL32 28 -#define R_PPC_PLT16_LO 29 -#define R_PPC_PLT16_HI 30 -#define R_PPC_PLT16_HA 31 -#define R_PPC_SDAREL16 32 -#define R_PPC_SECTOFF 33 -#define R_PPC_SECTOFF_LO 34 -#define R_PPC_SECTOFF_HI 35 -#define R_PPC_SECTOFF_HA 36 -/* Keep this the last entry. */ -#define R_PPC_NUM 37 - -/* The remaining relocs are from the Embedded ELF ABI, and are not - in the SVR4 ELF ABI. */ -#define R_PPC_EMB_NADDR32 101 -#define R_PPC_EMB_NADDR16 102 -#define R_PPC_EMB_NADDR16_LO 103 -#define R_PPC_EMB_NADDR16_HI 104 -#define R_PPC_EMB_NADDR16_HA 105 -#define R_PPC_EMB_SDAI16 106 -#define R_PPC_EMB_SDA2I16 107 -#define R_PPC_EMB_SDA2REL 108 -#define R_PPC_EMB_SDA21 109 /* 16 bit offset in SDA */ -#define R_PPC_EMB_MRKREF 110 -#define R_PPC_EMB_RELSEC16 111 -#define R_PPC_EMB_RELST_LO 112 -#define R_PPC_EMB_RELST_HI 113 -#define R_PPC_EMB_RELST_HA 114 -#define R_PPC_EMB_BIT_FLD 115 -#define R_PPC_EMB_RELSDA 116 /* 16 bit relative offset in SDA */ - -/* Diab tool relocations. */ -#define R_PPC_DIAB_SDA21_LO 180 /* like EMB_SDA21, but lower 16 bit */ -#define R_PPC_DIAB_SDA21_HI 181 /* like EMB_SDA21, but high 16 bit */ -#define R_PPC_DIAB_SDA21_HA 182 /* like EMB_SDA21, adjusted high 16 */ -#define R_PPC_DIAB_RELSDA_LO 183 /* like EMB_RELSDA, but lower 16 bit */ -#define R_PPC_DIAB_RELSDA_HI 184 /* like EMB_RELSDA, but high 16 bit */ -#define R_PPC_DIAB_RELSDA_HA 185 /* like EMB_RELSDA, adjusted high 16 */ - -/* This is a phony reloc to handle any old fashioned TOC16 references - that may still be in object files. */ -#define R_PPC_TOC16 255 - - -/* ARM specific declarations */ - -/* Processor specific flags for the ELF header e_flags field. */ -#define EF_ARM_RELEXEC 0x01 -#define EF_ARM_HASENTRY 0x02 -#define EF_ARM_INTERWORK 0x04 -#define EF_ARM_APCS_26 0x08 -#define EF_ARM_APCS_FLOAT 0x10 -#define EF_ARM_PIC 0x20 -#define EF_ALIGN8 0x40 /* 8-bit structure alignment is in use */ -#define EF_NEW_ABI 0x80 -#define EF_OLD_ABI 0x100 - -/* Additional symbol types for Thumb */ -#define STT_ARM_TFUNC 0xd - -/* ARM-specific values for sh_flags */ -#define SHF_ARM_ENTRYSECT 0x10000000 /* Section contains an entry point */ -#define SHF_ARM_COMDEF 0x80000000 /* Section may be multiply defined - in the input to a link step */ - -/* ARM-specific program header flags */ -#define PF_ARM_SB 0x10000000 /* Segment contains the location - addressed by the static base */ - -/* ARM relocs. */ -#define R_ARM_NONE 0 /* No reloc */ -#define R_ARM_PC24 1 /* PC relative 26 bit branch */ -#define R_ARM_ABS32 2 /* Direct 32 bit */ -#define R_ARM_REL32 3 /* PC relative 32 bit */ -#define R_ARM_PC13 4 -#define R_ARM_ABS16 5 /* Direct 16 bit */ -#define R_ARM_ABS12 6 /* Direct 12 bit */ -#define R_ARM_THM_ABS5 7 -#define R_ARM_ABS8 8 /* Direct 8 bit */ -#define R_ARM_SBREL32 9 -#define R_ARM_THM_PC22 10 -#define R_ARM_THM_PC8 11 -#define R_ARM_AMP_VCALL9 12 -#define R_ARM_SWI24 13 -#define R_ARM_THM_SWI8 14 -#define R_ARM_XPC25 15 -#define R_ARM_THM_XPC22 16 -#define R_ARM_COPY 20 /* Copy symbol at runtime */ -#define R_ARM_GLOB_DAT 21 /* Create GOT entry */ -#define R_ARM_JUMP_SLOT 22 /* Create PLT entry */ -#define R_ARM_RELATIVE 23 /* Adjust by program base */ -#define R_ARM_GOTOFF 24 /* 32 bit offset to GOT */ -#define R_ARM_GOTPC 25 /* 32 bit PC relative offset to GOT */ -#define R_ARM_GOT32 26 /* 32 bit GOT entry */ -#define R_ARM_PLT32 27 /* 32 bit PLT address */ -#define R_ARM_GNU_VTENTRY 100 -#define R_ARM_GNU_VTINHERIT 101 -#define R_ARM_THM_PC11 102 /* thumb unconditional branch */ -#define R_ARM_THM_PC9 103 /* thumb conditional branch */ -#define R_ARM_RXPC25 249 -#define R_ARM_RSBREL32 250 -#define R_ARM_THM_RPC22 251 -#define R_ARM_RREL32 252 -#define R_ARM_RABS22 253 -#define R_ARM_RPC24 254 -#define R_ARM_RBASE 255 -/* Keep this the last entry. */ -#define R_ARM_NUM 256 - -/* IA-64 specific declarations. */ - -/* Processor specific flags for the Ehdr e_flags field. */ -#define EF_IA_64_MASKOS 0x0000000f /* os-specific flags */ -#define EF_IA_64_ABI64 0x00000010 /* 64-bit ABI */ -#define EF_IA_64_ARCH 0xff000000 /* arch. version mask */ - -/* Processor specific values for the Phdr p_type field. */ -#define PT_IA_64_ARCHEXT (PT_LOPROC + 0) /* arch extension bits */ -#define PT_IA_64_UNWIND (PT_LOPROC + 1) /* ia64 unwind bits */ - -/* Processor specific flags for the Phdr p_flags field. */ -#define PF_IA_64_NORECOV 0x80000000 /* spec insns w/o recovery */ - -/* Processor specific values for the Shdr sh_type field. */ -#define SHT_IA_64_EXT (SHT_LOPROC + 0) /* extension bits */ -#define SHT_IA_64_UNWIND (SHT_LOPROC + 1) /* unwind bits */ - -/* Processor specific flags for the Shdr sh_flags field. */ -#define SHF_IA_64_SHORT 0x10000000 /* section near gp */ -#define SHF_IA_64_NORECOV 0x20000000 /* spec insns w/o recovery */ - -/* Processor specific values for the Dyn d_tag field. */ -#define DT_IA_64_PLT_RESERVE (DT_LOPROC + 0) -#define DT_IA_64_NUM 1 - -/* IA-64 relocations. */ -#define R_IA64_NONE 0x00 /* none */ -#define R_IA64_IMM14 0x21 /* symbol + addend, add imm14 */ -#define R_IA64_IMM22 0x22 /* symbol + addend, add imm22 */ -#define R_IA64_IMM64 0x23 /* symbol + addend, mov imm64 */ -#define R_IA64_DIR32MSB 0x24 /* symbol + addend, data4 MSB */ -#define R_IA64_DIR32LSB 0x25 /* symbol + addend, data4 LSB */ -#define R_IA64_DIR64MSB 0x26 /* symbol + addend, data8 MSB */ -#define R_IA64_DIR64LSB 0x27 /* symbol + addend, data8 LSB */ -#define R_IA64_GPREL22 0x2a /* @gprel(sym + add), add imm22 */ -#define R_IA64_GPREL64I 0x2b /* @gprel(sym + add), mov imm64 */ -#define R_IA64_GPREL32MSB 0x2c /* @gprel(sym + add), data4 MSB */ -#define R_IA64_GPREL32LSB 0x2d /* @gprel(sym + add), data4 LSB */ -#define R_IA64_GPREL64MSB 0x2e /* @gprel(sym + add), data8 MSB */ -#define R_IA64_GPREL64LSB 0x2f /* @gprel(sym + add), data8 LSB */ -#define R_IA64_LTOFF22 0x32 /* @ltoff(sym + add), add imm22 */ -#define R_IA64_LTOFF64I 0x33 /* @ltoff(sym + add), mov imm64 */ -#define R_IA64_PLTOFF22 0x3a /* @pltoff(sym + add), add imm22 */ -#define R_IA64_PLTOFF64I 0x3b /* @pltoff(sym + add), mov imm64 */ -#define R_IA64_PLTOFF64MSB 0x3e /* @pltoff(sym + add), data8 MSB */ -#define R_IA64_PLTOFF64LSB 0x3f /* @pltoff(sym + add), data8 LSB */ -#define R_IA64_FPTR64I 0x43 /* @fptr(sym + add), mov imm64 */ -#define R_IA64_FPTR32MSB 0x44 /* @fptr(sym + add), data4 MSB */ -#define R_IA64_FPTR32LSB 0x45 /* @fptr(sym + add), data4 LSB */ -#define R_IA64_FPTR64MSB 0x46 /* @fptr(sym + add), data8 MSB */ -#define R_IA64_FPTR64LSB 0x47 /* @fptr(sym + add), data8 LSB */ -#define R_IA64_PCREL60B 0x48 /* @pcrel(sym + add), brl */ -#define R_IA64_PCREL21B 0x49 /* @pcrel(sym + add), ptb, call */ -#define R_IA64_PCREL21M 0x4a /* @pcrel(sym + add), chk.s */ -#define R_IA64_PCREL21F 0x4b /* @pcrel(sym + add), fchkf */ -#define R_IA64_PCREL32MSB 0x4c /* @pcrel(sym + add), data4 MSB */ -#define R_IA64_PCREL32LSB 0x4d /* @pcrel(sym + add), data4 LSB */ -#define R_IA64_PCREL64MSB 0x4e /* @pcrel(sym + add), data8 MSB */ -#define R_IA64_PCREL64LSB 0x4f /* @pcrel(sym + add), data8 LSB */ -#define R_IA64_LTOFF_FPTR22 0x52 /* @ltoff(@fptr(s+a)), imm22 */ -#define R_IA64_LTOFF_FPTR64I 0x53 /* @ltoff(@fptr(s+a)), imm64 */ -#define R_IA64_LTOFF_FPTR32MSB 0x54 /* @ltoff(@fptr(s+a)), data4 MSB */ -#define R_IA64_LTOFF_FPTR32LSB 0x55 /* @ltoff(@fptr(s+a)), data4 LSB */ -#define R_IA64_LTOFF_FPTR64MSB 0x56 /* @ltoff(@fptr(s+a)), data8 MSB */ -#define R_IA64_LTOFF_FPTR64LSB 0x57 /* @ltoff(@fptr(s+a)), data8 LSB */ -#define R_IA64_SEGREL32MSB 0x5c /* @segrel(sym + add), data4 MSB */ -#define R_IA64_SEGREL32LSB 0x5d /* @segrel(sym + add), data4 LSB */ -#define R_IA64_SEGREL64MSB 0x5e /* @segrel(sym + add), data8 MSB */ -#define R_IA64_SEGREL64LSB 0x5f /* @segrel(sym + add), data8 LSB */ -#define R_IA64_SECREL32MSB 0x64 /* @secrel(sym + add), data4 MSB */ -#define R_IA64_SECREL32LSB 0x65 /* @secrel(sym + add), data4 LSB */ -#define R_IA64_SECREL64MSB 0x66 /* @secrel(sym + add), data8 MSB */ -#define R_IA64_SECREL64LSB 0x67 /* @secrel(sym + add), data8 LSB */ -#define R_IA64_REL32MSB 0x6c /* data 4 + REL */ -#define R_IA64_REL32LSB 0x6d /* data 4 + REL */ -#define R_IA64_REL64MSB 0x6e /* data 8 + REL */ -#define R_IA64_REL64LSB 0x6f /* data 8 + REL */ -#define R_IA64_LTV32MSB 0x74 /* symbol + addend, data4 MSB */ -#define R_IA64_LTV32LSB 0x75 /* symbol + addend, data4 LSB */ -#define R_IA64_LTV64MSB 0x76 /* symbol + addend, data8 MSB */ -#define R_IA64_LTV64LSB 0x77 /* symbol + addend, data8 LSB */ -#define R_IA64_PCREL21BI 0x79 /* @pcrel(sym + add), 21bit inst */ -#define R_IA64_PCREL22 0x7a /* @pcrel(sym + add), 22bit inst */ -#define R_IA64_PCREL64I 0x7b /* @pcrel(sym + add), 64bit inst */ -#define R_IA64_IPLTMSB 0x80 /* dynamic reloc, imported PLT, MSB */ -#define R_IA64_IPLTLSB 0x81 /* dynamic reloc, imported PLT, LSB */ -#define R_IA64_COPY 0x84 /* copy relocation */ -#define R_IA64_SUB 0x85 /* Addend and symbol difference */ -#define R_IA64_LTOFF22X 0x86 /* LTOFF22, relaxable. */ -#define R_IA64_LDXMOV 0x87 /* Use of LTOFF22X. */ -#define R_IA64_TPREL14 0x91 /* @tprel(sym + add), imm14 */ -#define R_IA64_TPREL22 0x92 /* @tprel(sym + add), imm22 */ -#define R_IA64_TPREL64I 0x93 /* @tprel(sym + add), imm64 */ -#define R_IA64_TPREL64MSB 0x96 /* @tprel(sym + add), data8 MSB */ -#define R_IA64_TPREL64LSB 0x97 /* @tprel(sym + add), data8 LSB */ -#define R_IA64_LTOFF_TPREL22 0x9a /* @ltoff(@tprel(s+a)), imm2 */ -#define R_IA64_DTPMOD64MSB 0xa6 /* @dtpmod(sym + add), data8 MSB */ -#define R_IA64_DTPMOD64LSB 0xa7 /* @dtpmod(sym + add), data8 LSB */ -#define R_IA64_LTOFF_DTPMOD22 0xaa /* @ltoff(@dtpmod(sym + add)), imm22 */ -#define R_IA64_DTPREL14 0xb1 /* @dtprel(sym + add), imm14 */ -#define R_IA64_DTPREL22 0xb2 /* @dtprel(sym + add), imm22 */ -#define R_IA64_DTPREL64I 0xb3 /* @dtprel(sym + add), imm64 */ -#define R_IA64_DTPREL32MSB 0xb4 /* @dtprel(sym + add), data4 MSB */ -#define R_IA64_DTPREL32LSB 0xb5 /* @dtprel(sym + add), data4 LSB */ -#define R_IA64_DTPREL64MSB 0xb6 /* @dtprel(sym + add), data8 MSB */ -#define R_IA64_DTPREL64LSB 0xb7 /* @dtprel(sym + add), data8 LSB */ -#define R_IA64_LTOFF_DTPREL22 0xba /* @ltoff(@dtprel(s+a)), imm22 */ - -/* SH specific declarations */ - -/* SH relocs. */ -#define R_SH_NONE 0 -#define R_SH_DIR32 1 -#define R_SH_REL32 2 -#define R_SH_DIR8WPN 3 -#define R_SH_IND12W 4 -#define R_SH_DIR8WPL 5 -#define R_SH_DIR8WPZ 6 -#define R_SH_DIR8BP 7 -#define R_SH_DIR8W 8 -#define R_SH_DIR8L 9 -#define R_SH_SWITCH16 25 -#define R_SH_SWITCH32 26 -#define R_SH_USES 27 -#define R_SH_COUNT 28 -#define R_SH_ALIGN 29 -#define R_SH_CODE 30 -#define R_SH_DATA 31 -#define R_SH_LABEL 32 -#define R_SH_SWITCH8 33 -#define R_SH_GNU_VTINHERIT 34 -#define R_SH_GNU_VTENTRY 35 -#define R_SH_GOT32 160 -#define R_SH_PLT32 161 -#define R_SH_COPY 162 -#define R_SH_GLOB_DAT 163 -#define R_SH_JMP_SLOT 164 -#define R_SH_RELATIVE 165 -#define R_SH_GOTOFF 166 -#define R_SH_GOTPC 167 -/* Keep this the last entry. */ -#define R_SH_NUM 256 - -/* Additional s390 relocs */ - -#define R_390_NONE 0 /* No reloc. */ -#define R_390_8 1 /* Direct 8 bit. */ -#define R_390_12 2 /* Direct 12 bit. */ -#define R_390_16 3 /* Direct 16 bit. */ -#define R_390_32 4 /* Direct 32 bit. */ -#define R_390_PC32 5 /* PC relative 32 bit. */ -#define R_390_GOT12 6 /* 12 bit GOT offset. */ -#define R_390_GOT32 7 /* 32 bit GOT offset. */ -#define R_390_PLT32 8 /* 32 bit PC relative PLT address. */ -#define R_390_COPY 9 /* Copy symbol at runtime. */ -#define R_390_GLOB_DAT 10 /* Create GOT entry. */ -#define R_390_JMP_SLOT 11 /* Create PLT entry. */ -#define R_390_RELATIVE 12 /* Adjust by program base. */ -#define R_390_GOTOFF 13 /* 32 bit offset to GOT. */ -#define R_390_GOTPC 14 /* 32 bit PC relative offset to GOT. */ -#define R_390_GOT16 15 /* 16 bit GOT offset. */ -#define R_390_PC16 16 /* PC relative 16 bit. */ -#define R_390_PC16DBL 17 /* PC relative 16 bit shifted by 1. */ -#define R_390_PLT16DBL 18 /* 32 bit PC rel. PLT shifted by 1. */ -/* Keep this the last entry. */ -#define R_390_NUM 19 - -#endif /* elf.h */ diff --git a/mdk-stage1/dietlibc/include/endian.h b/mdk-stage1/dietlibc/include/endian.h deleted file mode 100644 index 463c24fff..000000000 --- a/mdk-stage1/dietlibc/include/endian.h +++ /dev/null @@ -1,43 +0,0 @@ -#ifndef _ENDIAN_H -#define _ENDIAN_H - -#define __LITTLE_ENDIAN 1234 -#define __BIG_ENDIAN 4321 - -#ifdef __i386__ -#define __BYTE_ORDER __LITTLE_ENDIAN -#define __FLOAT_WORD_ORDER __BYTE_ORDER -#endif - -#ifdef __sparc__ -#define __BYTE_ORDER __BIG_ENDIAN -#define __FLOAT_WORD_ORDER __BYTE_ORDER -#endif - -#ifdef __mips__ -#ifdef __MIPSEB__ -#define __BIG_ENDIAN__ -#endif -#endif - -#ifndef __BYTE_ORDER -#ifdef __BIG_ENDIAN__ -#define __BYTE_ORDER __BIG_ENDIAN -#define __FLOAT_WORD_ORDER __BYTE_ORDER -#else -#define __BYTE_ORDER __LITTLE_ENDIAN -#define __FLOAT_WORD_ORDER __BYTE_ORDER -#endif -#endif - -#define LITTLE_ENDIAN __LITTLE_ENDIAN -#define BIG_ENDIAN __BIG_ENDIAN -#define BYTE_ORDER __BYTE_ORDER - -#if __BYTE_ORDER == __LITTLE_ENDIAN -# define __LONG_LONG_PAIR(HI, LO) LO, HI -#elif __BYTE_ORDER == __BIG_ENDIAN -# define __LONG_LONG_PAIR(HI, LO) HI, LO -#endif - -#endif diff --git a/mdk-stage1/dietlibc/include/errno.h b/mdk-stage1/dietlibc/include/errno.h deleted file mode 100644 index f4ba482b5..000000000 --- a/mdk-stage1/dietlibc/include/errno.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef _ERRNO_H -#define _ERRNO_H - -extern int errno; - -#include <linux/errno.h> - -extern void __set_errno(int error); - -#endif diff --git a/mdk-stage1/dietlibc/include/fcntl.h b/mdk-stage1/dietlibc/include/fcntl.h deleted file mode 100644 index b792502c1..000000000 --- a/mdk-stage1/dietlibc/include/fcntl.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef _FCNTL_H -#define _FCNTL_H - -#include <sys/cdefs.h> - -#include <sys/types.h> -#include <unistd.h> - -#include <asm/fcntl.h> - -extern int fcntl (int __fd, int __cmd, ...) __THROW; -extern int open (const char *__file, int __oflag, ...) __THROW; -extern int open64 (const char *__file, int __oflag, ...) __THROW; -extern int creat (const char *__file, mode_t __mode) __THROW; -extern int creat64 (const char *__file, mode_t __mode) __THROW; -extern int lockf (int __fd, int __cmd, off_t __len) __THROW; -extern int lockf64 (int __fd, int __cmd, off64_t __len) __THROW; - -#define F_ULOCK 0 /* Unlock a previously locked region. */ -#define F_LOCK 1 /* Lock a region for exclusive use. */ -#define F_TLOCK 2 /* Test and lock a region for exclusive use. */ -#define F_TEST 3 /* Test a region for other processes locks. */ - -#endif diff --git a/mdk-stage1/dietlibc/include/features.h b/mdk-stage1/dietlibc/include/features.h deleted file mode 100644 index 02f081006..000000000 --- a/mdk-stage1/dietlibc/include/features.h +++ /dev/null @@ -1 +0,0 @@ -#warning "someone included features.h, apparently someone is including glibc headers!" diff --git a/mdk-stage1/dietlibc/include/ftw.h b/mdk-stage1/dietlibc/include/ftw.h deleted file mode 100644 index c888f0021..000000000 --- a/mdk-stage1/dietlibc/include/ftw.h +++ /dev/null @@ -1,51 +0,0 @@ -#ifndef _FTW_H -#define _FTW_H - -#include <sys/cdefs.h> -#include <sys/stat.h> - -struct FTW - { - int base; - int level; - }; - -int ftw (const char *dir, int (*fn)(const char *file, const struct stat *sb, int flag), int depth) __THROW; -int nftw (const char *dir, int (*fn)(const char *file, const struct stat *sb, int flag, struct FTW *s), int depth, int flags) __THROW; - -enum -{ - FTW_F, /* Regular file. */ -#define FTW_F FTW_F - FTW_D, /* Directory. */ -#define FTW_D FTW_D - FTW_DNR, /* Unreadable directory. */ -#define FTW_DNR FTW_DNR - FTW_NS, /* Unstatable file. */ -#define FTW_NS FTW_NS - FTW_SL, /* Symbolic link. */ -# define FTW_SL FTW_SL -/* These flags are only passed from the `nftw' function. */ - FTW_DP, /* Directory, all subdirs have been visited. */ -# define FTW_DP FTW_DP - FTW_SLN /* Symbolic link naming non-existing file. */ -# define FTW_SLN FTW_SLN -}; - -typedef int (*__ftw_func_t) (__const char *__filename, - __const struct stat *__status, int __flag) __THROW; - -typedef int (*__nftw_func_t) (__const char *__filename, - __const struct stat *__status, int __flag, - struct FTW *__info) __THROW; - -#ifndef __NO_STAT64 -typedef int (*__ftw64_func_t) (__const char *__filename, - __const struct stat64 *__status, int __flag) __THROW; - -typedef int (*__nftw64_func_t) (__const char *__filename, - __const struct stat64 *__status, - int __flag, struct FTW *__info) __THROW; -#endif - -#endif diff --git a/mdk-stage1/dietlibc/include/grp.h b/mdk-stage1/dietlibc/include/grp.h deleted file mode 100644 index 2acd0f208..000000000 --- a/mdk-stage1/dietlibc/include/grp.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef _GRP_H -#define _GRP_H - -#include <sys/cdefs.h> -#include <sys/types.h> - -struct group - { - char *gr_name; /* Group name. */ - char *gr_passwd; /* Password. */ - gid_t gr_gid; /* Group ID. */ - char **gr_mem; /* Member list. */ - }; - -extern struct passwd *getgrgid (uid_t __uid) __THROW; -extern struct passwd *getgrnam (const char *__name) __THROW; - -#endif diff --git a/mdk-stage1/dietlibc/include/limits.h b/mdk-stage1/dietlibc/include/limits.h deleted file mode 100644 index ccc02150d..000000000 --- a/mdk-stage1/dietlibc/include/limits.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef _LIMITS_H -#define _LIMITS_H - -#include <linux/limits.h> - -#ifndef PATH_MAX -#define PATH_MAX 4096 -#endif - -#endif diff --git a/mdk-stage1/dietlibc/include/malloc.h b/mdk-stage1/dietlibc/include/malloc.h deleted file mode 100644 index c8b49f26d..000000000 --- a/mdk-stage1/dietlibc/include/malloc.h +++ /dev/null @@ -1 +0,0 @@ -#include <stdlib.h> diff --git a/mdk-stage1/dietlibc/include/net/if.h b/mdk-stage1/dietlibc/include/net/if.h deleted file mode 100644 index e6e7be441..000000000 --- a/mdk-stage1/dietlibc/include/net/if.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef _NET_IF_H -#define _NET_IF_H - -#include <sys/cdefs.h> - -unsigned int if_nametoindex (const char *ifname) __THROW; -char *if_indextoname (unsigned int ifindex, char *ifname) __THROW; - -#endif diff --git a/mdk-stage1/dietlibc/include/netdb.h b/mdk-stage1/dietlibc/include/netdb.h deleted file mode 100644 index 29f452ee9..000000000 --- a/mdk-stage1/dietlibc/include/netdb.h +++ /dev/null @@ -1,48 +0,0 @@ -#ifndef _NETDB_H -#define _NETDB_H - -#include <sys/cdefs.h> -#include <sys/types.h> - -/* Absolute file name for network data base files. */ -#define _PATH_HEQUIV "/etc/hosts.equiv" -#define _PATH_HOSTS "/etc/hosts" -#define _PATH_NETWORKS "/etc/networks" -#define _PATH_NSSWITCH_CONF "/etc/nsswitch.conf" -#define _PATH_PROTOCOLS "/etc/protocols" -#define _PATH_SERVICES "/etc/services" - -/* Description of data base entry for a single service. */ -struct servent -{ - char *s_name; /* Official service name. */ - char **s_aliases; /* Alias list. */ - int s_port; /* Port number. */ - char *s_proto; /* Protocol to use. */ -}; - -extern void endservent (void) __THROW; -extern struct servent *getservent (void) __THROW; -extern struct servent *getservbyname (__const char *__name, - __const char *__proto) __THROW; -extern struct servent *getservbyport (int __port, __const char *__proto) - __THROW; - -struct hostent -{ - char *h_name; /* Official name of host. */ - char **h_aliases; /* Alias list. */ - int h_addrtype; /* Host address type. */ - socklen_t h_length; /* Length of address. */ - char **h_addr_list; /* List of addresses from name server. */ -#define h_addr h_addr_list[0] /* Address, for backward compatibility. */ -}; - -extern void endhostent (void) __THROW; -extern struct hostent *gethostent (void) __THROW; -extern struct hostent *gethostbyaddr (const void *__addr, socklen_t __len, - int __type) __THROW; -extern struct hostent *gethostbyname (const char *__name) __THROW; -extern struct hostent *gethostbyname2 (const char *__name, int __af) __THROW; - -#endif diff --git a/mdk-stage1/dietlibc/include/netinet/in.h b/mdk-stage1/dietlibc/include/netinet/in.h deleted file mode 100644 index d83498a76..000000000 --- a/mdk-stage1/dietlibc/include/netinet/in.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef _NETINET_IN_H -#define _NETINET_IN_H - -#include <linux/in.h> - -#endif diff --git a/mdk-stage1/dietlibc/include/netinet/in_systm.h b/mdk-stage1/dietlibc/include/netinet/in_systm.h deleted file mode 100644 index e69de29bb..000000000 --- a/mdk-stage1/dietlibc/include/netinet/in_systm.h +++ /dev/null diff --git a/mdk-stage1/dietlibc/include/netinet/ip.h b/mdk-stage1/dietlibc/include/netinet/ip.h deleted file mode 100644 index 35bf9cc42..000000000 --- a/mdk-stage1/dietlibc/include/netinet/ip.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef _NETINET_IP_H -#define _NETINET_IP_H - -#include <linux/ip.h> - -#endif diff --git a/mdk-stage1/dietlibc/include/paths.h b/mdk-stage1/dietlibc/include/paths.h deleted file mode 100644 index aac47e870..000000000 --- a/mdk-stage1/dietlibc/include/paths.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef _PATHS_H -#define _PATHS_H - -#define _PATH_BSHELL "/bin/sh" -#define _PATH_DEFPATH "/bin:/usr/bin:" - -#endif diff --git a/mdk-stage1/dietlibc/include/pwd.h b/mdk-stage1/dietlibc/include/pwd.h deleted file mode 100644 index c7120917c..000000000 --- a/mdk-stage1/dietlibc/include/pwd.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef _PWD_H -#define _PWD_H - -#include <sys/cdefs.h> -#include <sys/types.h> - -struct passwd { - char *pw_name; /* Username. */ - char *pw_passwd; /* Password. */ - uid_t pw_uid; /* User ID. */ - gid_t pw_gid; /* Group ID. */ - char *pw_gecos; /* Real name. */ - char *pw_dir; /* Home directory. */ - char *pw_shell; /* Shell program. */ -}; - -extern struct passwd *getpwuid (uid_t __uid) __THROW; -extern struct passwd *getpwnam (const char *__name) __THROW; - -#endif diff --git a/mdk-stage1/dietlibc/include/setjmp.h b/mdk-stage1/dietlibc/include/setjmp.h deleted file mode 100644 index a49b450ac..000000000 --- a/mdk-stage1/dietlibc/include/setjmp.h +++ /dev/null @@ -1,121 +0,0 @@ -#ifndef _SETJMP_H -#define _SETJMP_H - -#include <sys/cdefs.h> - -#ifdef __i386__ -#ifndef __ASSEMBLER__ -typedef int __jmp_buf[6]; -#endif -# define JB_BX 0 -# define JB_SI 1 -# define JB_DI 2 -# define JB_BP 3 -# define JB_SP 4 -# define JB_PC 5 -# define JB_SIZE 24 -#endif - -#ifdef __alpha__ -#define JB_S0 0 -#define JB_S1 1 -#define JB_S2 2 -#define JB_S3 3 -#define JB_S4 4 -#define JB_S5 5 -#define JB_PC 6 -#define JB_FP 7 -#define JB_SP 8 -#define JB_F2 9 -#define JB_F3 10 -#define JB_F4 11 -#define JB_F5 12 -#define JB_F6 13 -#define JB_F7 14 -#define JB_F8 15 -#define JB_F9 16 -#ifndef __ASSEMBLER__ -typedef long int __jmp_buf[17]; -#endif -#endif - -#ifdef __mips__ -#ifndef __ASSEMBLER__ -typedef struct - { - void * __pc; /* Program counter. */ - void * __sp; /* Stack pointer. */ - int __regs[8]; /* Callee-saved registers s0 through s7. */ - void * __fp; /* The frame pointer. */ - void * __gp; /* The global pointer. */ - int __fpc_csr; /* Floating point status register. */ - double __fpregs[6]; /* Callee-saved floating point registers. */ - } __jmp_buf[1]; -#endif -#endif - -#ifdef __sparc__ -#define JB_SP 0 -#define JB_FP 1 -#define JB_PC 2 -#ifndef __ASSEMBLER__ -typedef int __jmp_buf[3]; -#endif -#endif - -#ifdef __arm__ -#define __JMP_BUF_SP 8 -#ifndef __ASSEMBLER__ -typedef int __jmp_buf[10]; -#endif -#endif - -#ifdef __powerpc__ -# define JB_GPR1 0 /* Also known as the stack pointer */ -# define JB_GPR2 1 -# define JB_LR 2 /* The address we will return to */ -# define JB_GPRS 3 /* GPRs 14 through 31 are saved, 18 in total */ -# define JB_CR 21 /* Condition code registers. */ -# define JB_FPRS 22 /* FPRs 14 through 31 are saved, 18*2 words total */ -# define JB_SIZE (58*4) -#ifndef __ASSEMBLER__ -typedef long int __jmp_buf[58]; -#endif -#endif - -#ifndef __ASSEMBLER__ - -typedef int __sig_atomic_t; - -# define _SIGSET_NWORDS (1024 / (8 * sizeof (unsigned long int))) -typedef struct - { - unsigned long int __val[_SIGSET_NWORDS]; - } __sigset_t; - -/* Calling environment, plus possibly a saved signal mask. */ -typedef struct __jmp_buf_tag /* C++ doesn't like tagless structs. */ - { - /* NOTE: The machine-dependent definitions of `__sigsetjmp' - assume that a `jmp_buf' begins with a `__jmp_buf'. - Do not move this member or add others before it. */ - __jmp_buf __jmpbuf; /* Calling environment. */ - int __mask_was_saved; /* Saved the signal mask? */ - __sigset_t __saved_mask; /* Saved signal mask. */ - } jmp_buf[1]; - -extern int __sigsetjmp (jmp_buf __env, int __savemask) __THROW; - -extern void longjmp (jmp_buf __env, int __val) - __THROW __attribute__ ((__noreturn__)); - -typedef jmp_buf sigjmp_buf; - -extern void siglongjmp (sigjmp_buf __env, int __val) - __THROW __attribute__ ((__noreturn__)); - -#define setjmp(env) __sigsetjmp(env,0) - -#endif - -#endif diff --git a/mdk-stage1/dietlibc/include/signal.h b/mdk-stage1/dietlibc/include/signal.h deleted file mode 100644 index 9214d176d..000000000 --- a/mdk-stage1/dietlibc/include/signal.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef _SIGNAL_H -#define _SIGNAL_H - -#include <sys/cdefs.h> - -#include <linux/types.h> -#include <linux/signal.h> - -int sigemptyset(sigset_t *set) __THROW; -int sigaddset(sigset_t *set, int signum) __THROW; -int sigprocmask(int how, const sigset_t *set, sigset_t *oldset) __THROW; -int raise (int sig) __THROW; -void (*signal(int signum, void (*sighandler)(int)))(int) __THROW; - -#endif diff --git a/mdk-stage1/dietlibc/include/stdint.h b/mdk-stage1/dietlibc/include/stdint.h deleted file mode 100644 index d287e6794..000000000 --- a/mdk-stage1/dietlibc/include/stdint.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef _STDINT_H -#define _STDINT_H - -#include <sys/types.h> - -#endif diff --git a/mdk-stage1/dietlibc/include/stdio.h b/mdk-stage1/dietlibc/include/stdio.h deleted file mode 100644 index 65974668d..000000000 --- a/mdk-stage1/dietlibc/include/stdio.h +++ /dev/null @@ -1,69 +0,0 @@ -#ifndef _STDIO_H -#define _STDIO_H - -#include <sys/types.h> - -typedef struct __stdio_file FILE; - -FILE *fopen (const char *path, const char *mode); -FILE *fdopen (int fildes, const char *mode); -FILE *freopen (const char *path, const char *mode, FILE *stream); - -int printf(const char *format, ...); -int fprintf(FILE *stream, const char *format, ...); -int sprintf(char *str, const char *format, ...); -int snprintf(char *str, size_t size, const char *format, ...); - -int scanf( const char *format, ...); -int fscanf( FILE *stream, const char *format, ...); -int sscanf( const char *str, const char *format, ...); - -#include <stdarg.h> - -int vprintf(const char *format, va_list ap); -int vfprintf(FILE *stream, const char *format, va_list ap); -int vsprintf(char *str, const char *format, va_list ap); -int vsnprintf(char *str, size_t size, const char *format, va_list ap); - -int vscanf( const char *format, va_list ap); -int vsscanf( const char *str, const char *format, va_list ap); -int vfscanf( FILE *stream, const char *format, va_list ap); - -int ferror(FILE *stream); -int feof(FILE *stream); - -int fgetc(FILE *stream); -char *fgets(char *s, int size, FILE *stream); -int getc(FILE *stream); -int getchar(void); -char *gets(char *s); - -int fputc(int c, FILE *stream); -int fputs(const char *s, FILE *stream); -int putc(int c, FILE *stream); -int putchar(int c); -int puts(const char *s); - -int fseek( FILE *stream, long offset, int whence); -long ftell( FILE *stream); -void rewind( FILE *stream); -int fgetpos( FILE *stream, fpos_t *pos); -int fsetpos( FILE *stream, fpos_t *pos); - -size_t fread( void *ptr, size_t size, size_t nmemb, FILE *stream); - -size_t fwrite( const void *ptr, size_t size, size_t nmemb, FILE *stream); - -int fflush(FILE *stream); - -int fclose(FILE *stream); - -extern FILE *stdin, *stdout, *stderr; - -#define EOF (int)(-1) - -void perror (const char *__s); - -#define BUFSIZ 128 - -#endif diff --git a/mdk-stage1/dietlibc/include/stdlib.h b/mdk-stage1/dietlibc/include/stdlib.h deleted file mode 100644 index c5fea2608..000000000 --- a/mdk-stage1/dietlibc/include/stdlib.h +++ /dev/null @@ -1,44 +0,0 @@ -#ifndef _STDLIB_H -#define _STDLIB_H - -#include <sys/cdefs.h> -#include <sys/types.h> - -void *calloc(size_t nmemb, size_t size) __THROW; -void *malloc(size_t size) __THROW; -void free(void *ptr) __THROW; -void *realloc(void *ptr, size_t size) __THROW; - -void *alloca(size_t size); - -char *getenv(const char *name) __pure__; - -int atexit(void (*function)(void)) __THROW; - -double strtod(const char *nptr, char **endptr) __THROW; -long int strtol(const char *nptr, char **endptr, int base); -unsigned long int strtoul(const char *nptr, char **endptr, int base); - -int __ltostr(char *s, int size, unsigned long i, int base, char UpCase); -#ifdef __GNUC__ -long long int strtoll(const char *nptr, char **endptr, int base); -unsigned long long int strtoull(const char *nptr, char **endptr, int base); -int __lltostr(char *s, int size, unsigned long long i, int base, char UpCase); -#endif - -int atoi(const char *nptr); - -void abort(void); -void exit(int); - -extern char **environ; - -#define WIFSTOPPED(status) (((status) & 0xff) == 0x7f) -#define WIFSIGNALED(status) (!WIFSTOPPED(status) && !WIFEXITED(status)) -#define WEXITSTATUS(status) (((status) & 0xff00) >> 8) -#define WTERMSIG(status) ((status) & 0x7f) -#define WSTOPSIG(status) WEXITSTATUS(status) -#define WIFEXITED(status) (WTERMSIG(status) == 0) - - -#endif diff --git a/mdk-stage1/dietlibc/include/string.h b/mdk-stage1/dietlibc/include/string.h deleted file mode 100644 index 133ac3b61..000000000 --- a/mdk-stage1/dietlibc/include/string.h +++ /dev/null @@ -1,42 +0,0 @@ -#ifndef _STRING_H -#define _STRING_H - -#include <sys/cdefs.h> -#include <sys/types.h> - -char *strcpy(char *dest, const char *src) __THROW; -char *strncpy(char *dest, const char *src, size_t n) __THROW; - -void *memccpy(void *dest, const void *src, int c, size_t n) __THROW; -void *memcpy(void *dest, const void *src, size_t n) __THROW; -void *memmove(void *dest, const void *src, size_t n) __THROW; - -int memccmp(const void *s1, const void *s2, int c, size_t n) __THROW __pure__; -int memcmp(const void *s1, const void *s2, size_t n) __THROW __pure__; -int strcmp(const char *s1, const char *s2) __THROW __pure__; -int strncmp(const char *s1, const char *s2, size_t n) __THROW __pure__; -char *strstr (const char *__haystack, const char *__needle) __THROW __pure__; - -size_t strlen(const char *s) __THROW __pure__; - -char *strdup(const char *s) __THROW; - -char *strchr(const char *s, int c) __THROW; -char *strrchr(const char *s, int c) __THROW; - -char *strcat(char *dest, const char *src) __THROW; -char *strncat(char *dest, const char *src, size_t n) __THROW; - -size_t strcspn(const char *s, const char *reject); - -void* memset(void *s, int c, size_t n) __THROW; - -#undef NULL -#define NULL (void*)0 - -#define bzero(s,n) memset(s,0,n) -#define bcmp(s1,s2,n) memcmp(s1,s2,n) - -char *strerror (int __errnum) __THROW; - -#endif diff --git a/mdk-stage1/dietlibc/include/sys/cdefs.h b/mdk-stage1/dietlibc/include/sys/cdefs.h deleted file mode 100644 index 9f256f59f..000000000 --- a/mdk-stage1/dietlibc/include/sys/cdefs.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef _SYS_CDEFS_H -#define _SYS_CDEFS_H - -#ifndef __cplusplus -#define throw () -#define __THROW -#else -#define __THROW throw () -#endif - -#ifndef __GNUC__ -#define __attribute__(xyz) -#endif - -#define __pure__ -#ifdef __GNUC__ -#if (__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 96)) -#undef __pure__ -#define __pure__ __attribute__ ((__pure__)) -#endif - -#endif - -#endif diff --git a/mdk-stage1/dietlibc/include/sys/ioctl.h b/mdk-stage1/dietlibc/include/sys/ioctl.h deleted file mode 100644 index fca1aeeab..000000000 --- a/mdk-stage1/dietlibc/include/sys/ioctl.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef _IOCTL_H -#define _IOCTL_H - -#include <sys/cdefs.h> -#include <linux/ioctl.h> -#include <asm/ioctls.h> - -int ioctl(int d, int request, ...) __THROW; - -#endif diff --git a/mdk-stage1/dietlibc/include/sys/mman.h b/mdk-stage1/dietlibc/include/sys/mman.h deleted file mode 100644 index 03faa37ae..000000000 --- a/mdk-stage1/dietlibc/include/sys/mman.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef _SYS_MMAN_H -#define _SYS_MMAN_H - -#include <sys/cdefs.h> -#include <sys/types.h> -#include <linux/mman.h> - -#define MAP_FAILED ((void *) -1) - -extern void *mmap (void *__addr, size_t __len, int __prot, - int __flags, int __fd, off_t __offset); - -extern int munmap (void *__addr, size_t __len) __THROW; -extern int mprotect (void *__addr, size_t __len, int __prot) __THROW; -extern int msync (void *__addr, size_t __len, int __flags) __THROW; -extern void *mremap (void *__addr, size_t __old_len, size_t __new_len, - int __may_move) __THROW; -extern int mincore (void *__start, size_t __len, unsigned char *__vec); - -#ifdef __quad_t -extern void *mmap64 (void *__addr, size_t __len, int __prot, - int __flags, int __fd, off64_t __offset) __THROW; -#endif - -#endif diff --git a/mdk-stage1/dietlibc/include/sys/mount.h b/mdk-stage1/dietlibc/include/sys/mount.h deleted file mode 100644 index 1c4368a2f..000000000 --- a/mdk-stage1/dietlibc/include/sys/mount.h +++ /dev/null @@ -1,81 +0,0 @@ -#ifndef _SYS_MOUNT_H -#define _SYS_MOUNT_H 1 - -#include <sys/ioctl.h> - -#define BLOCK_SIZE 1024 -#define BLOCK_SIZE_BITS 10 - -/* These are the fs-independent mount-flags: up to 16 flags are - supported */ -enum -{ - MS_RDONLY = 1, /* Mount read-only. */ -#define MS_RDONLY MS_RDONLY - MS_NOSUID = 2, /* Ignore suid and sgid bits. */ -#define MS_NOSUID MS_NOSUID - MS_NODEV = 4, /* Disallow access to device special files. */ -#define MS_NODEV MS_NODEV - MS_NOEXEC = 8, /* Disallow program execution. */ -#define MS_NOEXEC MS_NOEXEC - MS_SYNCHRONOUS = 16, /* Writes are synced at once. */ -#define MS_SYNCHRONOUS MS_SYNCHRONOUS - MS_REMOUNT = 32, /* Alter flags of a mounted FS. */ -#define MS_REMOUNT MS_REMOUNT - MS_MANDLOCK = 64, /* Allow mandatory locks on an FS. */ -#define MS_MANDLOCK MS_MANDLOCK - S_WRITE = 128, /* Write on file/directory/symlink. */ -#define S_WRITE S_WRITE - S_APPEND = 256, /* Append-only file. */ -#define S_APPEND S_APPEND - S_IMMUTABLE = 512, /* Immutable file. */ -#define S_IMMUTABLE S_IMMUTABLE - MS_NOATIME = 1024, /* Do not update access times. */ -#define MS_NOATIME MS_NOATIME - MS_NODIRATIME = 2048, /* Do not update directory access times. */ -#define MS_NODIRATIME MS_NODIRATIME - MS_BIND = 4096, /* Bind directory at different place. */ -#define MS_BIND MS_BIND -}; - -/* Flags that can be altered by MS_REMOUNT */ -#define MS_RMT_MASK (MS_RDONLY | MS_MANDLOCK) - - -/* Magic mount flag number. Has to be or-ed to the flag values. */ - -#define MS_MGC_VAL 0xc0ed0000 /* Magic flag number to indicate "new" flags */ -#define MS_MGC_MSK 0xffff0000 /* Magic flag number mask */ - - -/* The read-only stuff doesn't really belong here, but any other place - is probably as bad and I don't want to create yet another include - file. */ - -#define BLKROSET _IO(0x12, 93) /* Set device read-only (0 = read-write). */ -#define BLKROGET _IO(0x12, 94) /* Get read-only status (0 = read_write). */ -#define BLKRRPART _IO(0x12, 95) /* Re-read partition table. */ -#define BLKGETSIZE _IO(0x12, 96) /* Return device size. */ -#define BLKFLSBUF _IO(0x12, 97) /* Flush buffer cache. */ -#define BLKRASET _IO(0x12, 98) /* Set read ahead for block device. */ -#define BLKRAGET _IO(0x12, 99) /* Get current read ahead setting. */ - - -/* Possible value for FLAGS parameter of `umount2'. */ -enum -{ - MNT_FORCE = 1 /* Force unmounting. */ -#define MNT_FORCE MNT_FORCE -}; - - -/* Mount a filesystem. */ -int mount(const char *specialfile, const char *dir, const char *filesystemtype, unsigned long rwflag, const void *data) __THROW; - -/* Unmount a filesystem. */ -extern int umount (const char *__special_file) __THROW; - -/* Unmount a filesystem. Force unmounting if FLAGS is set to MNT_FORCE. */ -extern int umount2 (const char *__special_file, int __flags) __THROW; - -#endif /* _SYS_MOUNT_H */ diff --git a/mdk-stage1/dietlibc/include/sys/resource.h b/mdk-stage1/dietlibc/include/sys/resource.h deleted file mode 100644 index 953fc0eb2..000000000 --- a/mdk-stage1/dietlibc/include/sys/resource.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef _SYS_RESOURCE_H -#define _SYS_RESOURCE_H - -#include <sys/cdefs.h> -#include <linux/resource.h> - -#endif diff --git a/mdk-stage1/dietlibc/include/sys/select.h b/mdk-stage1/dietlibc/include/sys/select.h deleted file mode 100644 index fa166a530..000000000 --- a/mdk-stage1/dietlibc/include/sys/select.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef _SYS_SELECT_H -#define _SYS_SELECT_H 1 - -int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); - -#endif diff --git a/mdk-stage1/dietlibc/include/sys/socket.h b/mdk-stage1/dietlibc/include/sys/socket.h deleted file mode 100644 index f590c35c4..000000000 --- a/mdk-stage1/dietlibc/include/sys/socket.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef _SYS_SOCKET_H -#define _SYS_SOCKET_H - -#include <sys/types.h> -#include <linux/socket.h> - -int socket(int domain, int type, int protocol); -int listen (int fd, int n); -int accept(int s, struct sockaddr *addr, socklen_t *addrlen); -int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen); -int bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen); -int recv(int s, void *buf, size_t len, int flags); -int recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen); -int recvmsg(int s, struct msghdr *msg, int flags); -int send(int s, const void *msg, size_t len, int flags); -int sendto(int s, const void *msg, size_t len, int flags, const struct sockaddr *to, socklen_t tolen); -int sendmsg(int s, const struct msghdr *msg, int flags); -int getpeername(int s, struct sockaddr *name, socklen_t *namelen); -int getsockname(int s , struct sockaddr * name , socklen_t * namelen ); - -#endif diff --git a/mdk-stage1/dietlibc/include/sys/stat.h b/mdk-stage1/dietlibc/include/sys/stat.h deleted file mode 100644 index 7c3504218..000000000 --- a/mdk-stage1/dietlibc/include/sys/stat.h +++ /dev/null @@ -1,48 +0,0 @@ -#ifndef _SYS_STAT_H -#define _SYS_STAT_H - -#include <sys/cdefs.h> -#include <sys/types.h> - -#include <linux/stat.h> -#include <asm/stat.h> - -#ifdef __alpha__ -#define __NO_STAT64 -#endif - -#define stat(file,buf) __dietstat(file,buf) -#define fstat(file,buf) __dietfstat(file,buf) -#define lstat(file,buf) __dietlstat(file,buf) - -#define stat64(file,buf) __dietstat64(file,buf) -#define fstat64(file,buf) __dietfstat64(file,buf) -#define lstat64(file,buf) __dietlstat64(file,buf) - -#define major(dev) (((dev)>>8) & 0xff) -#define minor(dev) ((dev) & 0xff) -#define makedev(major, minor) ((((unsigned int) (major)) << 8) | ((unsigned int) (minor))) - -extern int __dietstat (const char *__file, struct stat *__buf) __THROW; -extern int __dietfstat (int __fd, struct stat *__buf) __THROW; -extern int __dietlstat (const char *__file, struct stat *__buf) __THROW; - -#ifndef __NO_STAT64 -extern int __dietstat64 (const char *__file, struct stat64 *__buf) __THROW; -extern int __dietfstat64 (int __fd, struct stat64 *__buf) __THROW; -extern int __dietlstat64 (const char *__file, struct stat64 *__buf) __THROW; -#endif - -extern int chmod (const char *__file, mode_t __mode) __THROW; - -extern int fchmod (int __fd, mode_t __mode) __THROW; - -extern mode_t umask (mode_t __mask) __THROW; - -extern int mkdir (const char *__path, mode_t __mode) __THROW; - -extern int mknod (const char *__path, mode_t __mode, dev_t __dev) __THROW; - -extern int mkfifo (const char *__path, mode_t __mode) __THROW; - -#endif diff --git a/mdk-stage1/dietlibc/include/sys/time.h b/mdk-stage1/dietlibc/include/sys/time.h deleted file mode 100644 index 069d50a83..000000000 --- a/mdk-stage1/dietlibc/include/sys/time.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef _SYS_TIME_H -#define _SYS_TIME_H 1 - -#include <sys/cdefs.h> - -#include <sys/types.h> -#include <linux/time.h> - -#if defined __USE_GNU || defined __USE_BSD -typedef struct timezone *__timezone_ptr_t; -#else -typedef void *__timezone_ptr_t; -#endif - -int getitimer(int which, struct itimerval *value) __THROW; -int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue) __THROW; - -int gettimeofday(struct timeval *tv, struct timezone *tz) __THROW; -int settimeofday(const struct timeval *tv , const struct timezone *tz) __THROW; - -extern int adjtime (const struct timeval *__delta, - struct timeval *__olddelta) __THROW; - -#endif diff --git a/mdk-stage1/dietlibc/include/sys/types.h b/mdk-stage1/dietlibc/include/sys/types.h deleted file mode 100644 index 34dbaa9f1..000000000 --- a/mdk-stage1/dietlibc/include/sys/types.h +++ /dev/null @@ -1,33 +0,0 @@ -#ifndef _SYS_TYPES_H -#define _SYS_TYPES_H - -#include <linux/types.h> -#include <linux/posix_types.h> -#include <linux/socket.h> - -#ifdef __GNUC__ -#define __quad_t __quad_t -typedef long long int __quad_t; -typedef unsigned long long int __u_quad_t; -#else -#warning no long long support - no 64 bit file I/O support -typedef long int __quad_t; -typedef unsigned long int __u_quad_t; -#endif - - -#ifdef __quad_t -typedef __quad_t off64_t; -typedef __u_quad_t ino64_t; -typedef __quad_t blkcnt64_t; -#endif - -typedef long int fpos_t; - -#define socklen_t socklen_t -typedef unsigned int socklen_t; - -typedef long int blksize_t; -typedef long int blkcnt_t; - -#endif diff --git a/mdk-stage1/dietlibc/include/sys/utsname.h b/mdk-stage1/dietlibc/include/sys/utsname.h deleted file mode 100644 index 37bf6c811..000000000 --- a/mdk-stage1/dietlibc/include/sys/utsname.h +++ /dev/null @@ -1,35 +0,0 @@ -#ifndef _SYS_UTSNAME_H -#define _SYS_UTSNAME_H 1 - -#include <sys/cdefs.h> - -/* Length of the entries in `struct utsname' is 65. */ -#define _UTSNAME_LENGTH 65 -#define _UTSNAME_NODENAME_LENGTH _UTSNAME_LENGTH - -/* Linux provides as additional information in the `struct utsname' - the name of the current domain. Define _UTSNAME_DOMAIN_LENGTH - to a value != 0 to activate this entry. */ -#define _UTSNAME_DOMAIN_LENGTH _UTSNAME_LENGTH - -struct utsname { - /* Name of the implementation of the operating system. */ - char sysname[_UTSNAME_LENGTH]; - - /* Name of this node on the network. */ - char nodename[_UTSNAME_NODENAME_LENGTH]; - - /* Current release level of this implementation. */ - char release[_UTSNAME_LENGTH]; - /* Current version level of this release. */ - char version[_UTSNAME_LENGTH]; - - /* Name of the hardware type the system is running on. */ - char machine[_UTSNAME_LENGTH]; - - /* Name of the domain of this node on the network. */ - char domainname[_UTSNAME_DOMAIN_LENGTH]; -}; - -extern int uname (struct utsname *__name) __THROW; -#endif diff --git a/mdk-stage1/dietlibc/include/sys/vfs.h b/mdk-stage1/dietlibc/include/sys/vfs.h deleted file mode 100644 index e4740a225..000000000 --- a/mdk-stage1/dietlibc/include/sys/vfs.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef _SYS_VFS_H -#define _SYS_VFS_H - -#include <sys/cdefs.h> -#include <sys/types.h> -#include <linux/vfs.h> - -int statfs(const char *path, struct statfs *buf) __THROW; -int fstatfs(int fd, struct statfs *buf) __THROW; - -#endif diff --git a/mdk-stage1/dietlibc/include/sys/wait.h b/mdk-stage1/dietlibc/include/sys/wait.h deleted file mode 100644 index 91b5da348..000000000 --- a/mdk-stage1/dietlibc/include/sys/wait.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef _SYS_WAIT_H -#define _SYS_WAIT_H - -#include <sys/cdefs.h> -#include <sys/resource.h> - -pid_t wait(int *status) __THROW; -pid_t waitpid(pid_t pid, int *status, int options) __THROW; - -pid_t wait3(int *status, int options, struct rusage *rusage) __THROW; - -pid_t wait4(pid_t pid, int *status, int options, struct rusage *rusage) __THROW; - -#endif diff --git a/mdk-stage1/dietlibc/include/termios.h b/mdk-stage1/dietlibc/include/termios.h deleted file mode 100644 index fc297ea19..000000000 --- a/mdk-stage1/dietlibc/include/termios.h +++ /dev/null @@ -1,178 +0,0 @@ -#ifndef _TERMIOS_H -#define _TERMIOS_H - -typedef unsigned char cc_t; -typedef unsigned int speed_t; -typedef unsigned int tcflag_t; - -#define NCCS 32 -struct termios - { - tcflag_t c_iflag; /* input mode flags */ - tcflag_t c_oflag; /* output mode flags */ - tcflag_t c_cflag; /* control mode flags */ - tcflag_t c_lflag; /* local mode flags */ - cc_t c_line; /* line discipline */ - cc_t c_cc[NCCS]; /* control characters */ - speed_t c_ispeed; /* input speed */ - speed_t c_ospeed; /* output speed */ - }; - -/* c_cc characters */ -#define VINTR 0 -#define VQUIT 1 -#define VERASE 2 -#define VKILL 3 -#define VEOF 4 -#define VTIME 5 -#define VMIN 6 -#define VSWTC 7 -#define VSTART 8 -#define VSTOP 9 -#define VSUSP 10 -#define VEOL 11 -#define VREPRINT 12 -#define VDISCARD 13 -#define VWERASE 14 -#define VLNEXT 15 -#define VEOL2 16 - -/* c_iflag bits */ -#define IGNBRK 0000001 -#define BRKINT 0000002 -#define IGNPAR 0000004 -#define PARMRK 0000010 -#define INPCK 0000020 -#define ISTRIP 0000040 -#define INLCR 0000100 -#define IGNCR 0000200 -#define ICRNL 0000400 -#define IUCLC 0001000 -#define IXON 0002000 -#define IXANY 0004000 -#define IXOFF 0010000 -#define IMAXBEL 0020000 - -/* c_oflag bits */ -#define OPOST 0000001 -#define OLCUC 0000002 -#define ONLCR 0000004 -#define OCRNL 0000010 -#define ONOCR 0000020 -#define ONLRET 0000040 -#define OFILL 0000100 -#define OFDEL 0000200 -#define NLDLY 0000400 -#define NL0 0000000 -#define NL1 0000400 -#define CRDLY 0003000 -#define CR0 0000000 -#define CR1 0001000 -#define CR2 0002000 -#define CR3 0003000 -#define TABDLY 0014000 -#define TAB0 0000000 -#define TAB1 0004000 -#define TAB2 0010000 -#define TAB3 0014000 -#define BSDLY 0020000 -#define BS0 0000000 -#define BS1 0020000 -#define FFDLY 0100000 -#define FF0 0000000 -#define FF1 0100000 - -#define VTDLY 0040000 -#define VT0 0000000 -#define VT1 0040000 - -#define XTABS 0014000 - -/* c_cflag bit meaning */ -#define CBAUD 0010017 -#define B0 0000000 /* hang up */ -#define B50 0000001 -#define B75 0000002 -#define B110 0000003 -#define B134 0000004 -#define B150 0000005 -#define B200 0000006 -#define B300 0000007 -#define B600 0000010 -#define B1200 0000011 -#define B1800 0000012 -#define B2400 0000013 -#define B4800 0000014 -#define B9600 0000015 -#define B19200 0000016 -#define B38400 0000017 -#define EXTA B19200 -#define EXTB B38400 -#define CSIZE 0000060 -#define CS5 0000000 -#define CS6 0000020 -#define CS7 0000040 -#define CS8 0000060 -#define CSTOPB 0000100 -#define CREAD 0000200 -#define PARENB 0000400 -#define PARODD 0001000 -#define HUPCL 0002000 -#define CLOCAL 0004000 -#define CBAUDEX 0010000 -#define B57600 0010001 -#define B115200 0010002 -#define B230400 0010003 -#define B460800 0010004 -#define B500000 0010005 -#define B576000 0010006 -#define B921600 0010007 -#define B1000000 0010010 -#define B1152000 0010011 -#define B1500000 0010012 -#define B2000000 0010013 -#define B2500000 0010014 -#define B3000000 0010015 -#define B3500000 0010016 -#define B4000000 0010017 -#define CIBAUD 002003600000 /* input baud rate (not used) */ -#define CRTSCTS 020000000000 /* flow control */ - -/* c_lflag bits */ -#define ISIG 0000001 -#define ICANON 0000002 -#define XCASE 0000004 -#define ECHO 0000010 -#define ECHOE 0000020 -#define ECHOK 0000040 -#define ECHONL 0000100 -#define NOFLSH 0000200 -#define TOSTOP 0000400 -#define ECHOCTL 0001000 -#define ECHOPRT 0002000 -#define ECHOKE 0004000 -#define FLUSHO 0010000 -#define PENDIN 0040000 -#define IEXTEN 0100000 - -/* tcflow() and TCXONC use these */ -#define TCOOFF 0 -#define TCOON 1 -#define TCIOFF 2 -#define TCION 3 - -/* tcflush() and TCFLSH use these */ -#define TCIFLUSH 0 -#define TCOFLUSH 1 -#define TCIOFLUSH 2 - -/* tcsetattr uses these */ -#define TCSANOW 0 -#define TCSADRAIN 1 -#define TCSAFLUSH 2 - - -#define _IOT_termios /* Hurd ioctl type field. */ \ - _IOT (_IOTS (cflag_t), 4, _IOTS (cc_t), NCCS, _IOTS (speed_t), 2) - -#endif diff --git a/mdk-stage1/dietlibc/include/time.h b/mdk-stage1/dietlibc/include/time.h deleted file mode 100644 index adc3710a4..000000000 --- a/mdk-stage1/dietlibc/include/time.h +++ /dev/null @@ -1,31 +0,0 @@ -#ifndef _TIME_H -#define _TIME_H - -#include <sys/cdefs.h> -#include <sys/time.h> - -struct tm -{ - int tm_sec; /* Seconds. [0-60] (1 leap second) */ - int tm_min; /* Minutes. [0-59] */ - int tm_hour; /* Hours. [0-23] */ - int tm_mday; /* Day. [1-31] */ - int tm_mon; /* Month. [0-11] */ - int tm_year; /* Year - 1900. */ - int tm_wday; /* Day of week. [0-6] */ - int tm_yday; /* Days in year.[0-365] */ - int tm_isdst; /* DST. [-1/0/1]*/ - - long int tm_gmtoff; /* Seconds east of UTC. */ - const char *tm_zone; /* Timezone abbreviation. */ -}; - -# define __isleap(year) \ - ((year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 == 0)) - -int nanosleep(const struct timespec *req, struct timespec *rem) __THROW; -unsigned int sleep(unsigned int secs) __THROW; - -struct tm *localtime(const time_t *timep) __THROW; - -#endif diff --git a/mdk-stage1/dietlibc/include/unistd.h b/mdk-stage1/dietlibc/include/unistd.h deleted file mode 100644 index 5165ba286..000000000 --- a/mdk-stage1/dietlibc/include/unistd.h +++ /dev/null @@ -1,83 +0,0 @@ -#ifndef _UNISTD_H -#define _UNISTD_H - -#include <dirent.h> -#include <sys/cdefs.h> -#include <sys/types.h> - -const enum { - SEEK_SET=0, - SEEK_CUR=1, - SEEK_END=2 -} __seek_types; - -off_t lseek(int fildes, off_t offset, int whence) __THROW; - -int chdir(const char *path) __THROW; -int fchdir(int fd) __THROW; -int mkdir(const char *pathname, mode_t mode) __THROW; -int rmdir(const char *pathname) __THROW; -char *getcwd(char *buf, size_t size) __THROW; - -int open(const char* pathname,int flags, ...) __THROW; -int creat(const char* pathname,mode_t mode) __THROW; -int write(int fd,const void* buf,size_t len) __THROW; -int read(int fd,const void* buf,size_t len) __THROW; -int close(int fd) __THROW; - -int pread(int fd, void *buf, size_t count, off_t offset); -int pwrite(int fd, const void *buf, size_t count, off_t offset); - -int execve (const char *filename, char *const argv [], char *const envp[]) __THROW; -int execl( const char *path, ...); -int execv (const char *__path, char *const __argv[]) __THROW; - -pid_t getpid(void) __attribute__((const)) __THROW; -pid_t getppid(void) __THROW; -int kill(pid_t pid, int sig) __THROW; - -int mknod(const char *pathname, mode_t mode, dev_t dev) __THROW; - -int getdents(unsigned int fd, struct dirent *dirp, unsigned int count) __THROW; -int getdents64(unsigned int fd, struct dirent64 *dirp, unsigned int count) __THROW; - -pid_t fork() __THROW; -pid_t vfork() __THROW; - -int readlink(const char *path, char *buf, size_t bufsiz) __THROW; -int symlink(const char *oldpath, const char *newpath) __THROW; -int link(const char *oldpath, const char *newpath) __THROW; -int unlink (const char *__name) __THROW; - -int chown(const char *path, uid_t owner, gid_t group) __THROW; -int fchown(int fd, uid_t owner, gid_t group) __THROW; -int lchown(const char *path, uid_t owner, gid_t group) __THROW; - -char *ttyname (int desc) __THROW; - -int brk(void *end_data_segment) __THROW; -void *sbrk(ptrdiff_t increment) __THROW; - -int gethostname(char *name, size_t len) __THROW; -int sethostname(const char *name, size_t len) __THROW; - -int setdomainname(const char *name, size_t len) __THROW; - -void sync(void) __THROW; - -/* Values for the second argument to access. - These may be OR'd together. */ -#define R_OK 4 /* Test for read permission. */ -#define W_OK 2 /* Test for write permission. */ -#define X_OK 1 /* Test for execute permission. */ -#define F_OK 0 /* Test for existence. */ - -int access (char *__name, int __type) __THROW; - -int dup2 (int __fd, int __fd2) __THROW; - -pid_t setsid (void) __THROW; - -unsigned int sleep (unsigned int __seconds) __THROW; - -#endif diff --git a/mdk-stage1/dietlibc/include/utime.h b/mdk-stage1/dietlibc/include/utime.h deleted file mode 100644 index 41674f379..000000000 --- a/mdk-stage1/dietlibc/include/utime.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef _UTIME_H -#define _UTIME_H - -#include <sys/cdefs.h> -#include <sys/types.h> -#include <time.h> - -struct utimbuf { - time_t actime; /* access time */ - time_t modtime; /* modification time */ -}; - -int utime(const char *filename, struct utimbuf *buf) __THROW; - - -#endif diff --git a/mdk-stage1/dietlibc/include/utmp.h b/mdk-stage1/dietlibc/include/utmp.h deleted file mode 100644 index 2f598257c..000000000 --- a/mdk-stage1/dietlibc/include/utmp.h +++ /dev/null @@ -1,72 +0,0 @@ -#ifndef _UTMP_H -#define _UTMP_H - -#include <sys/cdefs.h> -#include <sys/types.h> -#include <time.h> - -#define UT_LINESIZE 32 -#define UT_NAMESIZE 32 -#define UT_HOSTSIZE 256 - -#define _PATH_UTMP "/var/run/utmp" -#define _PATH_WTMP "/var/log/wtmp" - -/* The structure describing an entry in the database of - previous logins. */ -struct lastlog - { - time_t ll_time; - char ll_line[UT_LINESIZE]; - char ll_host[UT_HOSTSIZE]; - }; - -/* The structure describing the status of a terminated process. This - type is used in `struct utmp' below. */ -struct exit_status - { - short int e_termination; /* Process termination status. */ - short int e_exit; /* Process exit status. */ - }; - -/* The structure describing an entry in the user accounting database. */ -struct utmp -{ - short int ut_type; /* Type of login. */ - pid_t ut_pid; /* Process ID of login process. */ - char ut_line[UT_LINESIZE]; /* Devicename. */ - char ut_id[4]; /* Inittab ID. */ - char ut_user[UT_NAMESIZE]; /* Username. */ - char ut_host[UT_HOSTSIZE]; /* Hostname for remote login. */ - struct exit_status ut_exit; /* Exit status of a process marked - as DEAD_PROCESS. */ - long int ut_session; /* Session ID, used for windowing. */ - struct timeval ut_tv; /* Time entry was made. */ - int32_t ut_addr_v6[4]; /* Internet address of remote host. */ - char __unused[20]; /* Reserved for future use. */ -}; - -/* Values for the `ut_type' field of a `struct utmp'. */ -#define EMPTY 0 /* No valid user accounting information. */ - -#define RUN_LVL 1 /* The system's runlevel. */ -#define BOOT_TIME 2 /* Time of system boot. */ -#define NEW_TIME 3 /* Time after system clock changed. */ -#define OLD_TIME 4 /* Time when system clock changed. */ - -#define INIT_PROCESS 5 /* Process spawned by the init process. */ -#define LOGIN_PROCESS 6 /* Session leader of a logged in user. */ -#define USER_PROCESS 7 /* Normal process. */ -#define DEAD_PROCESS 8 /* Terminated process. */ - -#define ACCOUNTING 9 - -/* Tell the user that we have a modern system with UT_HOST, UT_PID, - UT_TYPE, UT_ID and UT_TV fields. */ -#define _HAVE_UT_TYPE 1 -#define _HAVE_UT_PID 1 -#define _HAVE_UT_ID 1 -#define _HAVE_UT_TV 1 -#define _HAVE_UT_HOST 1 - -#endif diff --git a/mdk-stage1/dietlibc/lib/__dtostr.c b/mdk-stage1/dietlibc/lib/__dtostr.c deleted file mode 100644 index def091f16..000000000 --- a/mdk-stage1/dietlibc/lib/__dtostr.c +++ /dev/null @@ -1,82 +0,0 @@ -/* convert double to string. Helper for sprintf. */ - -int __dtostr(double d,char *buf,int maxlen,int prec) { - unsigned long long *x=(unsigned long long *)&d; - /* step 1: extract sign, mantissa and exponent */ - signed int s=*x>>63; - signed long e=((*x>>52)&((1<<11)-1))-1023; -/* unsigned long long m=*x & ((1ull<<52)-1); */ - /* step 2: exponent is base 2, compute exponent for base 10 */ - signed long e10=1+(long)(e*0.30102999566398119802); /* log10(2) */ - /* step 3: calculate 10^e10 */ - int i; - double tmp=10.0; - char *oldbuf=buf; - int initial=1; - - if (s) { d=-d; *buf='-'; --maxlen; buf++; } - if ((i=e10)>=0) { - while (i>10) { tmp=tmp*1e10; i-=10; } - while (i>1) { tmp=tmp*10; --i; } - } else { - i=(e10=-e10); - while (i>10) { tmp=tmp*1e-10; i-=10; } - while (i>1) { tmp=tmp/10; --i; } - } - while (d/tmp<1) { - --e10; - tmp/=10.0; - } - /* step 4: see if precision is sufficient to display all digits */ - if (e10>prec) { - /* use scientific notation */ - int len=__dtostr(d/tmp,buf,maxlen,prec); - if (len==0) return 0; - maxlen-=len; buf+=len; - if (--maxlen>=0) { - *buf='e'; - ++buf; - } - for (len=1000; len>0; len/=10) { - if (e10>=len || !initial) { - if (--maxlen>=0) { - *buf=(e10/len)+'0'; - ++buf; - } - initial=0; - e10=e10%len; - } - } - if (maxlen>=0) return buf-oldbuf; - return 0; - } - /* step 5: loop through the digits, inserting the decimal point when - * appropriate */ - for (; prec>0; ) { - double tmp2=d/tmp; - char c; - d-=((int)tmp2*tmp); - c=((int)tmp2); - if ((!initial)||c) { - if (--maxlen>=0) { - initial=0; - *buf=c+'0'; - ++buf; - } else - return 0; - --prec; - } - if (tmp>0.5 && tmp<1.5) { - tmp=1e-1; - initial=0; - if (--maxlen>=0) { - *buf='.'; - ++buf; - } else - return 0; - } else - tmp/=10.0; - } - *buf=0; - return buf-oldbuf; -} diff --git a/mdk-stage1/dietlibc/lib/__lltostr.c b/mdk-stage1/dietlibc/lib/__lltostr.c deleted file mode 100644 index f53dcfb80..000000000 --- a/mdk-stage1/dietlibc/lib/__lltostr.c +++ /dev/null @@ -1,34 +0,0 @@ -#include <string.h> - -static char *num="0123456789abcdefghijklmnopqrstuvwxyz"; - -int __lltostr(char *s, int size, unsigned long long i, int base, char UpCase) -{ - char *tmp; - int j=0; - - s[--size]=0; - - tmp=s+size; - - if ((base==0)||(base>36)) base=10; - - j=0; - if (!i) - { - *(--tmp)='0'; - j=1; - } - - while((tmp>s)&&(i)) - { - tmp--; - *tmp=num[i%base]; - if ((UpCase)&&(*tmp>96)) (*tmp)-=' '; - i=i/base; - j++; - } - memmove(s,tmp,j+1); - - return j; -} diff --git a/mdk-stage1/dietlibc/lib/__ltostr.c b/mdk-stage1/dietlibc/lib/__ltostr.c deleted file mode 100644 index b2ebeb074..000000000 --- a/mdk-stage1/dietlibc/lib/__ltostr.c +++ /dev/null @@ -1,34 +0,0 @@ -#include <string.h> - -static char *num="0123456789abcdefghijklmnopqrstuvwxyz"; - -int __ltostr(char *s, int size, unsigned long i, int base, char UpCase) -{ - char *tmp; - int j=0; - - s[--size]=0; - - tmp=s+size; - - if ((base==0)||(base>36)) base=10; - - j=0; - if (!i) - { - *(--tmp)='0'; - j=1; - } - - while((tmp>s)&&(i)) - { - tmp--; - *tmp=num[i%base]; - if ((UpCase)&&(*tmp>96)) (*tmp)-=' '; - i=i/base; - j++; - } - memmove(s,tmp,j+1); - - return j; -} diff --git a/mdk-stage1/dietlibc/lib/__xmknod.c b/mdk-stage1/dietlibc/lib/__xmknod.c deleted file mode 100644 index 4739a1f5f..000000000 --- a/mdk-stage1/dietlibc/lib/__xmknod.c +++ /dev/null @@ -1,6 +0,0 @@ -#include <sys/stat.h> - -int __xmknod(int ver,char* filename,mode_t mode,dev_t *dev) { - return mknod(filename,mode,*dev); -} - diff --git a/mdk-stage1/dietlibc/lib/_brk.c b/mdk-stage1/dietlibc/lib/_brk.c deleted file mode 100644 index 6d0b29c03..000000000 --- a/mdk-stage1/dietlibc/lib/_brk.c +++ /dev/null @@ -1,14 +0,0 @@ -#include <unistd.h> - -extern int __diet_brk(void *end_data_segment); - -void* __curbrk=0; - -int __brk(void *end_data_segment) { - int res; - if ((res=__diet_brk(end_data_segment))==0) - __curbrk=end_data_segment; - return res; -} - -int brk (void *end_data_segment) __attribute__((weak,alias("__brk"))); diff --git a/mdk-stage1/dietlibc/lib/abort.c b/mdk-stage1/dietlibc/lib/abort.c deleted file mode 100644 index e6374c5ac..000000000 --- a/mdk-stage1/dietlibc/lib/abort.c +++ /dev/null @@ -1,14 +0,0 @@ -#include <linux/types.h> -#include <linux/signal.h> -#include <signal.h> - -extern int exit(int code) __attribute__ ((noreturn)); - -void abort() { - sigset_t t; - if (!sigemptyset(&t) && !sigaddset(&t, SIGABRT)) - sigprocmask(SIG_UNBLOCK, &t, 0); - while (1) - if (raise(SIGABRT)) - exit(127); -} diff --git a/mdk-stage1/dietlibc/lib/accept.c b/mdk-stage1/dietlibc/lib/accept.c deleted file mode 100644 index a7ae824eb..000000000 --- a/mdk-stage1/dietlibc/lib/accept.c +++ /dev/null @@ -1,14 +0,0 @@ -#include <linux/net.h> - -extern int socketcall(int callno,long* args); - -int accept(int a, void * addr, void * addr2) { -#ifdef __i386__ - return socketcall(SYS_ACCEPT, (long*)&a); -#else - unsigned long args[] = { a, (long) addr, (long) addr2 }; - return socketcall(SYS_ACCEPT, args); -#endif -} - -int __libc_accept(int a, void * addr, void * addr2) __attribute__((weak,alias("accept"))); diff --git a/mdk-stage1/dietlibc/lib/alarm.c b/mdk-stage1/dietlibc/lib/alarm.c deleted file mode 100644 index fd35372f2..000000000 --- a/mdk-stage1/dietlibc/lib/alarm.c +++ /dev/null @@ -1,47 +0,0 @@ -/* Copyright (C) 1991, 1992, 1994, 1997 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. - - The GNU C Library 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with the GNU C Library; see the file COPYING.LIB. If not, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#include <unistd.h> -#include <sys/time.h> - -/* Schedule an alarm. In SECONDS seconds, the process will get a SIGALRM. - If SECONDS is zero, any currently scheduled alarm will be cancelled. - The function returns the number of seconds remaining until the last - alarm scheduled would have signaled, or zero if there wasn't one. - There is no return value to indicate an error, but you can set `errno' - to 0 and check its value after calling `alarm', and this might tell you. - The signal may come late due to processor scheduling. */ -unsigned int -alarm (seconds) - unsigned int seconds; -{ - struct itimerval old, new; - unsigned int retval; - - new.it_interval.tv_usec = 0; - new.it_interval.tv_sec = 0; - new.it_value.tv_usec = 0; - new.it_value.tv_sec = (long int) seconds; - if (setitimer (ITIMER_REAL, &new, &old) < 0) - return 0; - - retval = old.it_value.tv_sec; - if (old.it_value.tv_usec) - ++retval; - return retval; -} diff --git a/mdk-stage1/dietlibc/lib/alloc.c b/mdk-stage1/dietlibc/lib/alloc.c deleted file mode 100644 index 27b6838df..000000000 --- a/mdk-stage1/dietlibc/lib/alloc.c +++ /dev/null @@ -1,225 +0,0 @@ -/* - * malloc/free by O.Dreesen - */ - -#include <linux/unistd.h> -#include <asm/mman.h> -#include <linux/errno.h> - -#if 0 -#include <sys/mman.h> -#define _LIBC -#include <errno.h> -#endif - -#include <linux/types.h> - -#if defined(MAP_ANONYMOUS) && !defined(MAP_ANON) -#define MAP_ANON MAP_ANONYMOUS -#endif - -#ifndef MAP_FAILED -#define MAP_FAILED ((void*)-1) -#endif - -#ifndef NULL -#define NULL ((void*)0) -#endif - -extern void * mmap(void *start, size_t length, int prot , int flags, int fd, off_t offset); -extern void *memset(void *s, int c, size_t n); -extern void *memcpy(void *dest, const void *src, size_t n); - -typedef struct t_alloc_head { - struct t_alloc_head *ptr; - unsigned long size; -} alloc_head; - -/* guess what ? the virtual block size */ -#define MEM_BLOCK_SIZE 4096 - -/* minimum allocated bytes */ -#define MEM_ALLOC_MIN 4 - -/* Initial start position in memory */ -#define MEM_ALLOC_START ((char*)0x18000000) - -/* Make every block align */ -#define MEM_ALIGN(s) (((s)+MEM_ALLOC_MIN-1)&(~(MEM_ALLOC_MIN-1))) -#define PAGE_ALIGN(s) (((s)+MEM_BLOCK_SIZE-1)&(~(MEM_BLOCK_SIZE-1))) -#define PAGE_ALIGNP(p) ((char*)PAGE_ALIGN((size_t)(p))) - -#define END_OF_BLOCK(p) ((alloc_head*)(((char*)(p))+((p)->size))) -#define START_BLOCK(p) ((alloc_head*)(((char*)(p))-sizeof(alloc_head))) -#define START_DATA(p) (((char*)(p))+sizeof(alloc_head)) -#define MIN_ALLOC(s) (((((s)+sizeof(alloc_head)-1)/MEM_ALLOC_MIN)+1)*MEM_ALLOC_MIN) - -/* freelist handler */ -static alloc_head base = {&base,0}; -static char *alloc_get_end = MEM_ALLOC_START; - -void free(void *ptr) -{ - alloc_head *prev,*p,*block; - - if (ptr==NULL) return; - - block=START_BLOCK(ptr); - prev=&base; - for (p=prev->ptr ; ; prev=p, p=p->ptr) - { - if ((block>prev)&&(block<p)) break; /* found the gap block belongs */ - if ((prev>p)&&(block<p)) break; /* block pre freelist */ - if ((prev>p)&&(block>prev)) break; /* block after freelist */ - - /* emergency escape: freelist has ONLY one entry the freelist base */ - if (p->ptr==p) break; - } - prev->ptr = block; - - if (END_OF_BLOCK(block)==p) - { /* join right neighbor */ - block->ptr = p->ptr; - block->size += p->size; - } - else - block->ptr = p; - - if (END_OF_BLOCK(prev)==block) - { /* join left neighbor */ - prev->size += block->size; - prev->ptr = block->ptr; - } -} - -static void *alloc_get_mem(unsigned long size) -{ - char *tmp; - alloc_head *ah; - - size=PAGE_ALIGN(size); - - /* map free pages @ alloc_get_end */ - tmp=mmap(alloc_get_end, size, PROT_READ|PROT_WRITE, - MAP_ANONYMOUS|MAP_PRIVATE|MAP_FIXED, -1, 0); - if (tmp==MAP_FAILED) - { - /* OK we can't map free pages @ alloc_get_end so try free position */ - tmp=mmap(0, size, PROT_READ|PROT_WRITE, - MAP_ANONYMOUS|MAP_PRIVATE, -1, 0); - if (tmp==MAP_FAILED) - { - errno = ENOMEM; - return NULL; /* PANIC ! */ - } - alloc_get_end=tmp; - } - - alloc_get_end+=size; - - /* make a header */ - ah=(alloc_head*)tmp; - ah->ptr=ah; - ah->size=size; - - /* link new free maped pages in freelist */ - free(START_DATA(tmp)); - - return &base; -} - -void *malloc(size_t size) -{ - alloc_head *p, *prev; - size_t need; - - /* needed MEM_ALLOC_MIN */ - need=MIN_ALLOC(size); - - prev=&base; - for (p=prev->ptr;;prev=p,p=p->ptr) - { - if (p->size>=need) - { - if (p->size==need) - { /* fit PERFECT */ - prev->ptr=p->ptr; /* relink freelist */ - } - else - { - alloc_head *tmp=(alloc_head*)(((char*)p)+need); - if ((p->size-need)<sizeof(alloc_head)) - { /* work around: if there is not enough space for freelist head. - * this waste some bytes ( < sizeof(alloc_head) ) */ - need=p->size; - prev->ptr=p->ptr; /* relink freelist */ - } - else - { - prev->ptr=tmp; - tmp->ptr=p->ptr; - tmp->size=p->size-need; /* remaining size */ - } - - p->size=need; /* set size */ - } - p->ptr=p; /* self-link */ - - return (void*)START_DATA(p); - } - else if (p==&base) - { - if ((p=alloc_get_mem(need))==NULL) return NULL; - } - } - return NULL; -} - -void *calloc(size_t nmemb,size_t size) -{ - size_t n=nmemb*size; - void *tmp=malloc(n); - if (tmp) memset(tmp,0,n); - return tmp; -} - -void *realloc(void *ptr,size_t size) -{ - alloc_head *tmp=0,*tf=0; - long need=0; - long diff=0; - - if (ptr) - { - if (size) - { - tmp=START_BLOCK(ptr); - need=MIN_ALLOC(size); /* only this size will survive */ - diff=tmp->size-need; - if (diff<0) - { - if ((tf=malloc(size))) - { - memcpy(tf,ptr,tmp->size-sizeof(alloc_head)); - free(ptr); - return tf; - } - return NULL; - } - if (diff>0) - { - tmp->size=need; - tf=END_OF_BLOCK(tmp); - tf->ptr=tf; - tf->size=diff; - free(START_DATA(tf)); - } - return ptr; - } - else - free(ptr); - } - else if (size>0) - return malloc(size); - return NULL; -} diff --git a/mdk-stage1/dietlibc/lib/assert_fail.c b/mdk-stage1/dietlibc/lib/assert_fail.c deleted file mode 100644 index caa70ef5b..000000000 --- a/mdk-stage1/dietlibc/lib/assert_fail.c +++ /dev/null @@ -1,27 +0,0 @@ -#include <stdlib.h> -#include <string.h> -#include <unistd.h> - -extern int __ltostr(char *s, int size, unsigned long i, int base, char UpCase); - -void __assert_fail (const char *assertion, const char *file, unsigned int line, const char *function) -{ - int alen=strlen(assertion); - int flen=strlen(file); - int fulen=strlen(function); - char *buf=(char*)alloca(alen+flen+fulen+50); - if (buf) { - char *tmp; - *buf=0; - if (file) strcat(strcat(buf,file),":"); - tmp=buf+strlen(buf); - __ltostr(tmp,10,line,10,0); - strcat(buf,": "); - if (function) strcat(strcat(buf,function),": "); - strcat(buf,"Assertion `"); - strcat(buf,assertion); - strcat(buf,"' failed.\n"); - write(2,buf,strlen(buf)); - } - abort(); -} diff --git a/mdk-stage1/dietlibc/lib/atexit.c b/mdk-stage1/dietlibc/lib/atexit.c deleted file mode 100644 index 2b644bf49..000000000 --- a/mdk-stage1/dietlibc/lib/atexit.c +++ /dev/null @@ -1,23 +0,0 @@ -typedef void (*function)(void); - -static function __atexitlist[4]; - -int atexit(function t) { - int i; - for (i=0; i<4; i++) - if (__atexitlist[i]==0) { - __atexitlist[i]=t; - return 0; - } - return -1; -} - -extern void _exit(int code) __attribute__((noreturn)); - -void exit(int code) { - if (__atexitlist[0]) __atexitlist[0](); - if (__atexitlist[1]) __atexitlist[1](); - if (__atexitlist[2]) __atexitlist[2](); - if (__atexitlist[3]) __atexitlist[3](); - _exit(code); -} diff --git a/mdk-stage1/dietlibc/lib/atof.c b/mdk-stage1/dietlibc/lib/atof.c deleted file mode 100644 index 4839e5152..000000000 --- a/mdk-stage1/dietlibc/lib/atof.c +++ /dev/null @@ -1,5 +0,0 @@ -#include <stdlib.h> - -double atof(const char *nptr) { - return strtod(nptr,0); -} diff --git a/mdk-stage1/dietlibc/lib/atoi.c b/mdk-stage1/dietlibc/lib/atoi.c deleted file mode 100644 index fe952b8c4..000000000 --- a/mdk-stage1/dietlibc/lib/atoi.c +++ /dev/null @@ -1,8 +0,0 @@ -int atoi(const char* s) { - int v=0; - int sign=1; - if (*s=='-') { sign=-1; ++s; } else if (*s=='+') ++s; - while (*s && (*s>='0') && (*s<='9')) - v=v*10+*s++-'0'; - return v*sign; -} diff --git a/mdk-stage1/dietlibc/lib/atol.c b/mdk-stage1/dietlibc/lib/atol.c deleted file mode 100644 index 558a004b9..000000000 --- a/mdk-stage1/dietlibc/lib/atol.c +++ /dev/null @@ -1,8 +0,0 @@ -long int atol(const char* s) { - long int v=0; - int sign=1; - if (*s=='-') { sign=-1; ++s; } else if (*s=='+') ++s; - while (*s && (*s>='0') && (*s<='9')) - v=v*10+*s++-'0'; - return v*sign; -} diff --git a/mdk-stage1/dietlibc/lib/bind.c b/mdk-stage1/dietlibc/lib/bind.c deleted file mode 100644 index ec1c93e1b..000000000 --- a/mdk-stage1/dietlibc/lib/bind.c +++ /dev/null @@ -1,12 +0,0 @@ -#include <linux/net.h> - -extern int socketcall(int callno,long* args); - -int bind(int a, void * b, int c) { -#ifdef __i386__ - return socketcall(SYS_BIND, (long*)&a); -#else - unsigned long args[] = { a, (long) b, c }; - return socketcall(SYS_BIND, args); -#endif -} diff --git a/mdk-stage1/dietlibc/lib/cfgetospeed.c b/mdk-stage1/dietlibc/lib/cfgetospeed.c deleted file mode 100644 index 4e392a239..000000000 --- a/mdk-stage1/dietlibc/lib/cfgetospeed.c +++ /dev/null @@ -1,6 +0,0 @@ -#include <termios.h> -#include <sys/types.h> - -speed_t cfgetospeed(struct termios *termios_p) { - return termios_p->c_ospeed; -} diff --git a/mdk-stage1/dietlibc/lib/closedir.c b/mdk-stage1/dietlibc/lib/closedir.c deleted file mode 100644 index c8d834f3b..000000000 --- a/mdk-stage1/dietlibc/lib/closedir.c +++ /dev/null @@ -1,28 +0,0 @@ -#include <stdlib.h> -#include <unistd.h> -#include <errno.h> -#undef _POSIX_PTHREADS -#include "dirstream.h" - -#undef closedir -int closedir(DIR * dir) -{ - int fd; - - if (!dir) { - errno = EBADF; - return -1; - } - - /* We need to check dd_fd. */ - if (dir->dd_fd == -1) - { - errno = EBADF; - return -1; - } - fd = dir->dd_fd; - dir->dd_fd = -1; - free(dir->dd_buf); - free(dir); - return close(fd); -} diff --git a/mdk-stage1/dietlibc/lib/connect.c b/mdk-stage1/dietlibc/lib/connect.c deleted file mode 100644 index f7f4f1ed7..000000000 --- a/mdk-stage1/dietlibc/lib/connect.c +++ /dev/null @@ -1,14 +0,0 @@ -#include <linux/net.h> - -extern int socketcall(int callno,long* args); - -int connect(int a, void * b, int c) { -#ifdef __i386__ - return socketcall(SYS_CONNECT, (long*)&a); -#else - unsigned long args[] = { a, (long) b, c }; - return socketcall(SYS_CONNECT, args); -#endif -} - -int __libc_connect(int a, void * b, int c) __attribute__((weak,alias("connect"))); diff --git a/mdk-stage1/dietlibc/lib/creat64.c b/mdk-stage1/dietlibc/lib/creat64.c deleted file mode 100644 index 923c1baaa..000000000 --- a/mdk-stage1/dietlibc/lib/creat64.c +++ /dev/null @@ -1,5 +0,0 @@ -#include <fcntl.h> - -int creat64(const char *file,mode_t mode) { - return open64(file,O_WRONLY|O_CREAT|O_TRUNC,mode); -} diff --git a/mdk-stage1/dietlibc/lib/errlist.c b/mdk-stage1/dietlibc/lib/errlist.c deleted file mode 100644 index d0e712190..000000000 --- a/mdk-stage1/dietlibc/lib/errlist.c +++ /dev/null @@ -1,132 +0,0 @@ - -const char *const sys_errlist[] = { - "Success", /* 0 */ - "Operation not permitted", /* EPERM */ - "No such file or directory", /* ENOENT */ - "No such process", /* ESRCH */ - "Interrupted system call", /* EINTR */ - "I/O error", /* EIO */ - "No such device or address", /* ENXIO */ - "Arg list too long", /* E2BIG */ - "Exec format error", /* ENOEXEC */ - "Bad file number", /* EBADF */ - "No child processes", /* ECHILD */ - "Try again", /* EAGAIN */ - "Out of memory", /* ENOMEM */ - "Permission denied", /* EACCES */ - "Bad address", /* EFAULT */ - "Block device required", /* ENOTBLK */ - "Device or resource busy", /* EBUSY */ - "File exists", /* EEXIST */ - "Cross-device link", /* EXDEV */ - "No such device", /* ENODEV */ - "Not a directory", /* ENOTDIR */ - "Is a directory", /* EISDIR */ - "Invalid argument", /* EINVAL */ - "File table overflow", /* ENFILE */ - "Too many open files", /* EMFILE */ - "Not a typewriter", /* ENOTTY */ - "Text file busy", /* ETXTBSY */ - "File too large", /* EFBIG */ - "No space left on device", /* ENOSPC */ - "Illegal seek", /* ESPIPE */ - "Read-only file system", /* EROFS */ - "Too many links", /* EMLINK */ - "Broken pipe", /* EPIPE */ - "Math argument out of domain of func", /* EDOM */ - "Math result not representable", /* ERANGE */ - "Resource deadlock would occur", /* EDEADLK */ - "File name too long", /* ENAMETOOLONG */ - "No record locks available", /* ENOLCK */ - "Function not implemented", /* ENOSYS */ - "Directory not empty", /* ENOTEMPTY */ - "Too many symbolic links encountered", /* ELOOP */ - "Operation would block", /* EWOULDBLOCK */ - "No message of desired type", /* ENOMSG */ - "Identifier removed", /* EIDRM */ - "Channel number out of range", /* ECHRNG */ - "Level 2 not synchronized", /* EL2NSYNC */ - "Level 3 halted", /* EL3HLT */ - "Level 3 reset", /* EL3RST */ - "Link number out of range", /* ELNRNG */ - "Protocol driver not attached", /* EUNATCH */ - "No CSI structure available", /* ENOCSI */ - "Level 2 halted", /* EL2HLT */ - "Invalid exchange", /* EBADE */ - "Invalid request descriptor", /* EBADR */ - "Exchange full", /* EXFULL */ - "No anode", /* ENOANO */ - "Invalid request code", /* EBADRQC */ - "Invalid slot", /* EBADSLT */ - "File locking deadlock error", /* EDEADLOCK */ - "Bad font file format", /* EBFONT */ - "Device not a stream", /* ENOSTR */ - "No data available", /* ENODATA */ - "Timer expired", /* ETIME */ - "Out of streams resources", /* ENOSR */ - "Machine is not on the network", /* ENONET */ - "Package not installed", /* ENOPKG */ - "Object is remote", /* EREMOTE */ - "Link has been severed", /* ENOLINK */ - "Advertise error", /* EADV */ - "Srmount error", /* ESRMNT */ - "Communication error on send", /* ECOMM */ - "Protocol error", /* EPROTO */ - "Multihop attempted", /* EMULTIHOP */ - "RFS specific error", /* EDOTDOT */ - "Not a data message", /* EBADMSG */ - "Value too large for defined data type", /* EOVERFLOW */ - "Name not unique on network", /* ENOTUNIQ */ - "File descriptor in bad state", /* EBADFD */ - "Remote address changed", /* EREMCHG */ - "Can not access a needed shared library", /* ELIBACC */ - "Accessing a corrupted shared library", /* ELIBBAD */ - ".lib section in a.out corrupted", /* ELIBSCN */ - "Attempting to link in too many shared libraries", /* ELIBMAX */ - "Cannot exec a shared library directly", /* ELIBEXEC */ - "Illegal byte sequence", /* EILSEQ */ - "Interrupted system call should be restarted", /* ERESTART */ - "Streams pipe error", /* ESTRPIPE */ - "Too many users", /* EUSERS */ - "Socket operation on non-socket", /* ENOTSOCK */ - "Destination address required", /* EDESTADDRREQ */ - "Message too long", /* EMSGSIZE */ - "Protocol wrong type for socket", /* EPROTOTYPE */ - "Protocol not available", /* ENOPROTOOPT */ - "Protocol not supported", /* EPROTONOSUPPORT */ - "Socket type not supported", /* ESOCKTNOSUPPORT */ - "Operation not supported on transport endpoint", /* EOPNOTSUPP */ - "Protocol family not supported", /* EPFNOSUPPORT */ - "Address family not supported by protocol", /* EAFNOSUPPORT */ - "Address already in use", /* EADDRINUSE */ - "Cannot assign requested address", /* EADDRNOTAVAIL */ - "Network is down", /* ENETDOWN */ - "Network is unreachable", /* ENETUNREACH */ - "Network dropped connection because of reset", /* ENETRESET */ - "Software caused connection abort", /* ECONNABORTED */ - "Connection reset by peer", /* ECONNRESET */ - "No buffer space available", /* ENOBUFS */ - "Transport endpoint is already connected", /* EISCONN */ - "Transport endpoint is not connected", /* ENOTCONN */ - "Cannot send after transport endpoint shutdown", /* ESHUTDOWN */ - "Too many references: cannot splice", /* ETOOMANYREFS */ - "Connection timed out", /* ETIMEDOUT */ - "Connection refused", /* ECONNREFUSED */ - "Host is down", /* EHOSTDOWN */ - "No route to host", /* EHOSTUNREACH */ - "Operation already in progress", /* EALREADY */ - "Operation now in progress", /* EINPROGRESS */ - "Stale NFS file handle", /* ESTALE */ - "Structure needs cleaning", /* EUCLEAN */ - "Not a XENIX named type file", /* ENOTNAM */ - "No XENIX semaphores available", /* ENAVAIL */ - "Is a named type file", /* EISNAM */ - "Remote I/O error", /* EREMOTEIO */ - "Quota exceeded", /* EDQUOT */ - "No medium found", /* ENOMEDIUM */ - "Wrong medium type", /* EMEDIUMTYPE */ - 0 -}; - - -const int sys_nerr = ((sizeof (sys_errlist))/(sizeof(char *))-1); diff --git a/mdk-stage1/dietlibc/lib/errno_location.c b/mdk-stage1/dietlibc/lib/errno_location.c deleted file mode 100644 index 286f833c9..000000000 --- a/mdk-stage1/dietlibc/lib/errno_location.c +++ /dev/null @@ -1,5 +0,0 @@ -extern int errno; - -int *__errno_location() { return &errno; } - -int *errno_location() __attribute__((weak,alias("__errno_location"))); diff --git a/mdk-stage1/dietlibc/lib/execl.c b/mdk-stage1/dietlibc/lib/execl.c deleted file mode 100644 index ae28fb850..000000000 --- a/mdk-stage1/dietlibc/lib/execl.c +++ /dev/null @@ -1,24 +0,0 @@ -#include <stdarg.h> -#include <unistd.h> -#include <errno.h> -#include <stdlib.h> - -int execl( const char *path, ...) { - va_list ap; - int n,i; - char **argv,*tmp; - va_start(ap, path); - n=1; - while ((tmp=va_arg(ap,char *))) - ++n; - va_end (ap); - if ((argv=(char **)alloca(n*sizeof(char*)))) { - va_start(ap, path); - for (i=0; i<n; ++i) - argv[i]=va_arg(ap,char *); - va_end (ap); - return execve(path,argv,environ); - } - __set_errno(ENOMEM); - return -1; -} diff --git a/mdk-stage1/dietlibc/lib/execvp.c b/mdk-stage1/dietlibc/lib/execvp.c deleted file mode 100644 index 809252990..000000000 --- a/mdk-stage1/dietlibc/lib/execvp.c +++ /dev/null @@ -1,55 +0,0 @@ -#include <limits.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <paths.h> -#include <errno.h> - -extern char **environ; - -static int exec_shell(const char *file, char *const argv[]) { - int i; - - for (i = 0; argv[i]; i++); - - if (1) { - char *shell_argv[i + 1]; - shell_argv[0] = _PATH_BSHELL; - shell_argv[1] = (char *) file; - for (; i > 1; i--) - shell_argv[i] = argv[i - 1]; - return execve(_PATH_BSHELL, shell_argv, environ); - } -} - -int execvp(const char *file, char *const argv[]) { - char *path=getenv("PATH"); - char *cur,*next; - char buf[PATH_MAX]; - if (strchr((char*)file,'/')) { - if (execve(file,argv,environ)==-1) { - if (errno==ENOEXEC) exec_shell(file,argv); - return -1; - } - } - if (!path) path=_PATH_DEFPATH; - for (cur=path; cur; cur=next) { - next=strchr(cur,':'); - if (!next) - next=cur+strlen(cur); - if (next==cur) { - buf[0]='.'; - cur--; - } else - memmove(buf,cur,next-cur); - buf[next-cur]='/'; - memmove(&buf[next-cur+1],file,strlen(file)+1); - if (execve(buf,argv,environ)==-1) { - if (errno==ENOEXEC) return exec_shell(buf,argv); - if ((errno!=EACCES) && (errno!=ENOENT)) return -1; - } - if (*next==0) break; - next++; - } - return -1; -} diff --git a/mdk-stage1/dietlibc/lib/ftw.c b/mdk-stage1/dietlibc/lib/ftw.c deleted file mode 100644 index a3c04af9a..000000000 --- a/mdk-stage1/dietlibc/lib/ftw.c +++ /dev/null @@ -1,52 +0,0 @@ -#include <linux/stat.h> -#include <unistd.h> -#include <limits.h> -#include <ftw.h> -#include <dirent.h> -#include <string.h> -#include <stdlib.h> - -int ftw(const char *dir,int (*fn)(const char *file, const struct stat *sb, int flag), int depth) { - char *cwd; - int cwdlen; - DIR *d; - struct dirent *de; - struct stat sb; - if (chdir(dir)) return -1; - cwd=alloca(PATH_MAX+1); - if (!getcwd(cwd,PATH_MAX)) return -1; - cwd[PATH_MAX]=0; - cwdlen=strlen(cwd); -/* write(1,"ftw in ",7); puts(cwd); */ - if (!(d=opendir("."))) return -1; - while ((de=readdir(d))) { - int res; - int flag; - int nlen; - char *filename; - if (de->d_name[0]=='.' && - (de->d_name[1]==0 || - (de->d_name[1]=='.' && de->d_name[2]==0))) continue; - nlen=strlen(de->d_name); - filename=alloca(nlen+cwdlen+3); - memmove(filename,cwd,cwdlen); - filename[cwdlen]='/'; - memmove(filename+cwdlen+1,de->d_name,nlen+1); - if (!lstat(de->d_name,&sb)) { - if (S_ISLNK(sb.st_mode)) flag=FTW_SL; else - if (S_ISDIR(sb.st_mode)) flag=FTW_D; else - flag=FTW_F; - } else - flag=FTW_NS; - res=fn(filename,&sb,flag); - if (res) return res; - if (flag==FTW_D && depth>0) { - res=ftw(filename,fn,depth-1); - chdir(dir); - if (res) return res; - } -/* puts(de->d_name); */ - } - closedir(d); - return 0; -} diff --git a/mdk-stage1/dietlibc/lib/getdomainname.c b/mdk-stage1/dietlibc/lib/getdomainname.c deleted file mode 100644 index 2554fe4c3..000000000 --- a/mdk-stage1/dietlibc/lib/getdomainname.c +++ /dev/null @@ -1,17 +0,0 @@ -#define _GNU_SOURCE - -#include <sys/types.h> -#include <sys/utsname.h> - -int getdomainname(char *name,size_t len) { - struct utsname u; - int res=uname(&u); - if (res==0) { - int i; - if (len>=_UTSNAME_DOMAIN_LENGTH) - len=_UTSNAME_DOMAIN_LENGTH; - for (i=0; i<len; i++) - name[i]=u.domainname[i]; - } - return res; -} diff --git a/mdk-stage1/dietlibc/lib/getenv.c b/mdk-stage1/dietlibc/lib/getenv.c deleted file mode 100644 index fc37e9927..000000000 --- a/mdk-stage1/dietlibc/lib/getenv.c +++ /dev/null @@ -1,17 +0,0 @@ -#include <string.h> - -extern char **environ; - -extern char *getenv(const char *s) -{ - int i; - unsigned int len; - - if (!environ || !s) return 0; - len = strlen(s); - for (i = 0;environ[i];++i) - if ((memcmp(environ[i],s,len)==0) && (environ[i][len] == '=')) - return environ[i] + len + 1; - return 0; -} - diff --git a/mdk-stage1/dietlibc/lib/gethostname.c b/mdk-stage1/dietlibc/lib/gethostname.c deleted file mode 100644 index ccc0fbc8e..000000000 --- a/mdk-stage1/dietlibc/lib/gethostname.c +++ /dev/null @@ -1,18 +0,0 @@ -#define _GNU_SOURCE - -#include <sys/types.h> -#include <sys/utsname.h> - -int gethostname(char *name,size_t len) { - struct utsname u; - int res=uname(&u); - if (res==0) { - int i; - if (len>=_UTSNAME_NODENAME_LENGTH) - len=_UTSNAME_NODENAME_LENGTH; - for (i=0; i<len; i++) - name[i]=u.nodename[i]; - } - return res; -} - diff --git a/mdk-stage1/dietlibc/lib/getpeername.c b/mdk-stage1/dietlibc/lib/getpeername.c deleted file mode 100644 index 8adcddf55..000000000 --- a/mdk-stage1/dietlibc/lib/getpeername.c +++ /dev/null @@ -1,13 +0,0 @@ -#include <linux/net.h> - -extern int socketcall(int callno,long* args); - -int getpeername(int a, void * b, int c) { -#ifdef __i386__ - return socketcall(SYS_GETPEERNAME, (long*)&a); -#else - unsigned long args[] = { a, (long) b, c }; - return socketcall(SYS_GETPEERNAME, args); -#endif -} - diff --git a/mdk-stage1/dietlibc/lib/getservent.c b/mdk-stage1/dietlibc/lib/getservent.c deleted file mode 100644 index ee6a77c21..000000000 --- a/mdk-stage1/dietlibc/lib/getservent.c +++ /dev/null @@ -1,141 +0,0 @@ -#include <unistd.h> -#include <fcntl.h> -#include <netdb.h> -#include <sys/mman.h> -#include <errno.h> -#include <netinet/in.h> -#include <string.h> - -static int servicesfd=-1; -static char* servicesmap; -static unsigned int serviceslen; - -static char* aliases[10]; - -static char *cur; - -static inline int isalpha(char c) { - return (c>='a' && c<='z') || (c>='A' && c<='Z'); -} - -static inline int isdigit(char c) { - return (c>='0' && c<='9'); -} - -static inline int isalnum(char c) { - return isalpha(c) || isdigit(c); -} - -static inline int isblank(char c) { - return (c==' ' || c=='\t'); -} - -/* nameserver 42/tcp name # IEN 116 */ -struct servent *getservent(void) { - static struct servent se; - char *last; - int aliasidx; - if (servicesfd<0) { - servicesfd=open("/etc/services",O_RDONLY); - if (servicesfd<0) return 0; - serviceslen=lseek(servicesfd,0,SEEK_END); - servicesmap=mmap(0,serviceslen,PROT_READ|PROT_WRITE,MAP_PRIVATE,servicesfd,0); - if ((long)servicesmap==(-1)) goto error; - cur=servicesmap; - } - last=servicesmap+serviceslen; -again: - se.s_name=0; - se.s_aliases=aliases; aliases[0]=0; - se.s_port=0; - se.s_proto=0; - if (cur>=last) return 0; - if (*cur=='#' || *cur=='\n') goto parseerror; - /* first, the primary name */ - if (!isalpha(*cur)) goto parseerror; - se.s_name=cur; - se.s_aliases=aliases; - while (cur<last && isalnum(*cur)) cur++; - if (cur>=last) return 0; - if (*cur=='\n') goto parseerror; - *cur=0; cur++; - /* second, the port */ - while (cur<last && isblank(*cur)) cur++; - while (cur<last && isdigit(*cur)) { - se.s_port=se.s_port*10+*cur-'0'; - cur++; - } - se.s_port=htons(se.s_port); - if (cur>=last) return 0; - /* third, "/tcp" or "/udp" */ - if (*cur!='/') goto parseerror; - cur++; - se.s_proto=cur; - while (cur<last && isalpha(*cur)) cur++; - if (cur>=last) return 0; - if (*cur=='\n') { *cur++=0; return &se; } - *cur=0; cur++; - /* now the aliases */ - for (aliasidx=0;aliasidx<10;aliasidx++) { - while (cur<last && isblank(*cur)) cur++; - aliases[aliasidx]=cur; - while (cur<last && isalpha(*cur)) cur++; - if (cur>=last || !isblank(*cur)) break; - if (*cur=='\n') { *cur++=0; break; } - *cur++=0; - } - aliases[aliasidx]=0; - return &se; -parseerror: - while (cur<last && *cur!='\n') cur++; - cur++; - goto again; -error: - if (servicesmap!=(char*)-1) munmap(servicesmap,serviceslen); - if (servicesfd!=-1) close(servicesfd); - servicesmap=(char*)-1; - servicesfd=-1; - errno=ENOMEM; - return 0; -} - -struct servent *getservbyname(const char *name, const char *proto) { - struct servent *s; - for (s=getservent(); s; s=getservent()) { - char **tmp; -#if 0 - write(1,"found ",6); - write(1,s->s_name,strlen(s->s_name)); - write(1,"/",1); - write(1,s->s_proto,strlen(s->s_proto)); - write(1,"\n",1); -#endif - if (!strcmp(name,s->s_name) && !strcmp(proto,s->s_proto)) - return s; - tmp=s->s_aliases; - while (*tmp) - if (!strcmp(name,*tmp++)) return s; - } - return 0; -} - -struct servent *getservbyport(int port, const char *proto) { - struct servent *s; - for (s=getservent(); s; s=getservent()) { - if (port==s->s_port && !strcmp(proto,s->s_proto)) - return s; - } - return 0; -} - -void setservent(int stayopen) { - cur=servicesmap; -} - -void endservent(void) { - if (servicesmap!=(char*)-1) munmap(servicesmap,serviceslen); - if (servicesfd!=-1) close(servicesfd); - servicesmap=(char*)-1; - servicesfd=-1; -} - diff --git a/mdk-stage1/dietlibc/lib/getsockname.c b/mdk-stage1/dietlibc/lib/getsockname.c deleted file mode 100644 index 61a3ea24a..000000000 --- a/mdk-stage1/dietlibc/lib/getsockname.c +++ /dev/null @@ -1,13 +0,0 @@ -#include <linux/net.h> - -extern int socketcall(int callno,long* args); - -int getsockname(int a, void * b, int c) { -#ifdef __i386__ - return socketcall(SYS_GETSOCKNAME, (long*)&a); -#else - unsigned long args[] = { a, (long) b, c }; - return socketcall(SYS_GETSOCKNAME, args); -#endif -} - diff --git a/mdk-stage1/dietlibc/lib/getsockopt.c b/mdk-stage1/dietlibc/lib/getsockopt.c deleted file mode 100644 index 8c0a57557..000000000 --- a/mdk-stage1/dietlibc/lib/getsockopt.c +++ /dev/null @@ -1,13 +0,0 @@ -#include <linux/net.h> - -extern int socketcall(int callno,long* args); - -int getsockopt(int a, int b, int c, void *d, int e) { -#ifdef __i386__ - return socketcall(SYS_GETSOCKOPT, (long*)&a); -#else - unsigned long args[] = { a, b, c, (long)d, e }; - return socketcall(SYS_GETSOCKOPT, args); -#endif -} - diff --git a/mdk-stage1/dietlibc/lib/htons.c b/mdk-stage1/dietlibc/lib/htons.c deleted file mode 100644 index 92a43f937..000000000 --- a/mdk-stage1/dietlibc/lib/htons.c +++ /dev/null @@ -1,12 +0,0 @@ -#include <asm/byteorder.h> - -#undef htons -#ifdef __i386__ -unsigned short int htons(unsigned short int netshort) { - return ___arch__swab16(netshort); -} -#else -unsigned short int htons(unsigned short int netshort) { - return netshort; -} -#endif diff --git a/mdk-stage1/dietlibc/lib/if_indextoname.c b/mdk-stage1/dietlibc/lib/if_indextoname.c deleted file mode 100644 index e683755f6..000000000 --- a/mdk-stage1/dietlibc/lib/if_indextoname.c +++ /dev/null @@ -1,29 +0,0 @@ -#include <linux/if.h> -#include <linux/net.h> -#include <sys/ioctl.h> -#include <unistd.h> -#include <sys/socket.h> - -#ifndef SOCK_DGRAM -#define SOCK_DGRAM 2 -#endif - -char* if_indextoname(unsigned int interface,char* blub) { - struct ifreq ifr; - int fd; - - fd=socket(AF_INET6,SOCK_DGRAM,0); - if (fd<0) fd=socket(AF_INET,SOCK_DGRAM,0); - ifr.ifr_ifindex=interface; - if (ioctl(fd,SIOCGIFNAME,&ifr)==0) { - int i; - close(fd); - for (i=0; i<IFNAMSIZ-1; i++) - if (!(blub[i]=ifr.ifr_name[i])) - return blub; - blub[i]=0; - return blub; - } - close(fd); - return 0; -} diff --git a/mdk-stage1/dietlibc/lib/if_nametoindex.c b/mdk-stage1/dietlibc/lib/if_nametoindex.c deleted file mode 100644 index 5923963b1..000000000 --- a/mdk-stage1/dietlibc/lib/if_nametoindex.c +++ /dev/null @@ -1,27 +0,0 @@ -#include <linux/if.h> -#include <linux/net.h> -#include <sys/ioctl.h> -#include <unistd.h> -#include <sys/socket.h> - -#ifndef SOCK_DGRAM -#define SOCK_DGRAM 2 -#endif - -int if_nametoindex(char* blub) { - struct ifreq ifr; - int fd; - char *tmp; - int len=sizeof(ifr.ifr_name); - fd=socket(AF_INET6,SOCK_DGRAM,0); - if (fd<0) fd=socket(AF_INET,SOCK_DGRAM,0); - for (tmp=ifr.ifr_name; len>0; --len) { - if ((*tmp++=*blub++)==0) break; - } - if (ioctl(fd,SIOCGIFINDEX,&ifr)==0) { - close(fd); - return ifr.ifr_ifindex; - } - close(fd); - return 0; -} diff --git a/mdk-stage1/dietlibc/lib/isalnum.c b/mdk-stage1/dietlibc/lib/isalnum.c deleted file mode 100644 index 19e5151d5..000000000 --- a/mdk-stage1/dietlibc/lib/isalnum.c +++ /dev/null @@ -1,6 +0,0 @@ -#include <ctype.h> - -int isalnum(int c) { - return isalpha(c) || isdigit(c); -} - diff --git a/mdk-stage1/dietlibc/lib/isalpha.c b/mdk-stage1/dietlibc/lib/isalpha.c deleted file mode 100644 index db04c3fae..000000000 --- a/mdk-stage1/dietlibc/lib/isalpha.c +++ /dev/null @@ -1,6 +0,0 @@ -#include <ctype.h> - -inline int isalpha(int c) { - return (c>='a' && c<='z') || (c>='A' && c<='Z'); -} - diff --git a/mdk-stage1/dietlibc/lib/isascii.c b/mdk-stage1/dietlibc/lib/isascii.c deleted file mode 100644 index e627efb41..000000000 --- a/mdk-stage1/dietlibc/lib/isascii.c +++ /dev/null @@ -1,6 +0,0 @@ -#include <ctype.h> - -inline int isascii(int c) { - return (c & 0x80) == 0; -} - diff --git a/mdk-stage1/dietlibc/lib/isatty.c b/mdk-stage1/dietlibc/lib/isatty.c deleted file mode 100644 index b31609720..000000000 --- a/mdk-stage1/dietlibc/lib/isatty.c +++ /dev/null @@ -1,20 +0,0 @@ -#define ioctl libc_ioctl -#include <termios.h> -#undef ioctl -#include <sys/ioctl.h> - -extern int errno; - -int isatty(int fd) -{ - int save; - int is_tty; - struct termios term; - - save = errno; - is_tty = ioctl(fd, TCGETS, &term) == 0; - errno = save; - - return is_tty; -} - diff --git a/mdk-stage1/dietlibc/lib/isblank.c b/mdk-stage1/dietlibc/lib/isblank.c deleted file mode 100644 index 034e543b1..000000000 --- a/mdk-stage1/dietlibc/lib/isblank.c +++ /dev/null @@ -1,6 +0,0 @@ -#include <ctype.h> - -int isblank(int ch) -{ - return ((ch==' ')||(ch=='\t')); -} diff --git a/mdk-stage1/dietlibc/lib/isdigit.c b/mdk-stage1/dietlibc/lib/isdigit.c deleted file mode 100644 index 734eb5197..000000000 --- a/mdk-stage1/dietlibc/lib/isdigit.c +++ /dev/null @@ -1,6 +0,0 @@ -#include <ctype.h> - -inline int isdigit(int c) { - return (c>='0' && c<='9'); -} - diff --git a/mdk-stage1/dietlibc/lib/isspace.c b/mdk-stage1/dietlibc/lib/isspace.c deleted file mode 100644 index ab39e81bc..000000000 --- a/mdk-stage1/dietlibc/lib/isspace.c +++ /dev/null @@ -1,6 +0,0 @@ -#include <ctype.h> - -int isspace(int ch) -{ - return ((ch==' ')||(ch=='\f')||(ch=='\t')||(ch=='\v')||(ch=='\r')||(ch=='\n')); -} diff --git a/mdk-stage1/dietlibc/lib/listen.c b/mdk-stage1/dietlibc/lib/listen.c deleted file mode 100644 index 56a51be06..000000000 --- a/mdk-stage1/dietlibc/lib/listen.c +++ /dev/null @@ -1,13 +0,0 @@ -#include <linux/net.h> - -extern int socketcall(int callno,long* args); - -int listen(int a, int b) { -#ifdef __i386__ - return socketcall(SYS_LISTEN, (long*)&a); -#else - unsigned long args[] = { a, b, 0 }; - return socketcall(SYS_LISTEN, args); -#endif -} - diff --git a/mdk-stage1/dietlibc/lib/lockf.c b/mdk-stage1/dietlibc/lib/lockf.c deleted file mode 100644 index 2b1d004ef..000000000 --- a/mdk-stage1/dietlibc/lib/lockf.c +++ /dev/null @@ -1,37 +0,0 @@ -#include <sys/types.h> -#include <fcntl.h> -#include <unistd.h> -#include <errno.h> - -int lockf(int fd, int cmd, off_t len) { - struct flock fl; - fl.l_whence=SEEK_CUR; - fl.l_start=0; - fl.l_len=len; - fl.l_pid=0; - switch (cmd) { - case F_TEST: - if (fcntl(fd,F_GETLK,&fl)<0) - return -1; - if (fl.l_type == F_UNLCK || fl.l_pid == getpid ()) - return 0; - errno=EACCES; - return -1; - case F_ULOCK: - fl.l_type=F_UNLCK; - cmd=F_SETLK; - break; - case F_LOCK: - fl.l_type = F_WRLCK; - cmd = F_SETLKW; - break; - case F_TLOCK: - fl.l_type = F_WRLCK; - cmd = F_SETLK; - break; - default: - errno=EINVAL; - return -1; - } - return fcntl(fd,cmd,&fl); -} diff --git a/mdk-stage1/dietlibc/lib/longjmp.c b/mdk-stage1/dietlibc/lib/longjmp.c deleted file mode 100644 index d0a5719c1..000000000 --- a/mdk-stage1/dietlibc/lib/longjmp.c +++ /dev/null @@ -1,51 +0,0 @@ -/* Copyright (C) 1991, 92, 94, 95, 97, 98 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. - - The GNU C Library 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with the GNU C Library; see the file COPYING.LIB. If not, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -/* #include <stddef.h> */ -#include <setjmp.h> -#include <signal.h> - -extern int __sigprocmask(int how,void* set,void* oldset); -extern void __longjmp(void* env, int val); - -/* -extern void _longjmp_unwind (jmp_buf env, int val); -*/ -/* Set the signal mask to the one specified in ENV, and jump - to the position specified in ENV, causing the setjmp - call there to return VAL, or 1 if VAL is 0. */ -void __siglongjmp (sigjmp_buf env, int val) -{ - /* Perform any cleanups needed by the frames being unwound. */ - /* - _longjmp_unwind (env, val); - */ - - if (env[0].__mask_was_saved) - /* Restore the saved signal mask. */ - (void) __sigprocmask (SIG_SETMASK, &env[0].__saved_mask, - (sigset_t *) NULL); - - /* Call the machine-dependent function to restore machine state. */ - __longjmp (env[0].__jmpbuf, val ?: 1); -} - -void siglongjmp (sigjmp_buf env, int val) __attribute__((weak,alias("__siglongjmp"))); -void longjmp (sigjmp_buf env, int val) __attribute__((weak,alias("__siglongjmp"))); -void _longjmp (sigjmp_buf env, int val) __attribute__((weak,alias("__siglongjmp"))); -void __libc_longjmp (sigjmp_buf env, int val) __attribute__((weak,alias("__siglongjmp"))); diff --git a/mdk-stage1/dietlibc/lib/memccmp.c b/mdk-stage1/dietlibc/lib/memccmp.c deleted file mode 100644 index 3a8c14f60..000000000 --- a/mdk-stage1/dietlibc/lib/memccmp.c +++ /dev/null @@ -1,17 +0,0 @@ -#define _POSIX_SOURCE -#define _XOPEN_SOURCE -#include <sys/types.h> - -int memccmp(const void *dst, const void *src, int c, size_t count) -{ - register const char *a = dst; - register const char *b = src; - while (count--) - { - register int res=(*a - *b); - if (res) return res; - if (*a==c) return 0; - ++a; ++b; - } - return 0; -} diff --git a/mdk-stage1/dietlibc/lib/memccpy.c b/mdk-stage1/dietlibc/lib/memccpy.c deleted file mode 100644 index 6d6ac98ab..000000000 --- a/mdk-stage1/dietlibc/lib/memccpy.c +++ /dev/null @@ -1,19 +0,0 @@ -#define _POSIX_SOURCE -#define _XOPEN_SOURCE -#include <sys/types.h> - -void *memccpy(void *dst, const void *src, int c, size_t count) -{ - char *a = dst; - const char *b = src; - while (count--) - { - *a++ = *b; - if (*b==c) - { - return (void *)a; - } - b++; - } - return 0; -} diff --git a/mdk-stage1/dietlibc/lib/memchr.c b/mdk-stage1/dietlibc/lib/memchr.c deleted file mode 100644 index 93d81328a..000000000 --- a/mdk-stage1/dietlibc/lib/memchr.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <sys/types.h> - -char *memchr(const char *s, int c, size_t n) { - int i; - for (i=n; i; --i) - if (*s++==c) - return (char*)s; - return 0; -} diff --git a/mdk-stage1/dietlibc/lib/memcmp.c b/mdk-stage1/dietlibc/lib/memcmp.c deleted file mode 100644 index 8bce6c975..000000000 --- a/mdk-stage1/dietlibc/lib/memcmp.c +++ /dev/null @@ -1,14 +0,0 @@ -#include <sys/types.h> - -int memcmp(const void *dst, const void *src, size_t count) { - register int r; - register const char *d=dst; - register const char *s=src; - while (count--) { - if ((r=(*d - *s))) - return r; - ++d; - ++s; - } - return 0; -} diff --git a/mdk-stage1/dietlibc/lib/memcpy.c b/mdk-stage1/dietlibc/lib/memcpy.c deleted file mode 100644 index 0c688b509..000000000 --- a/mdk-stage1/dietlibc/lib/memcpy.c +++ /dev/null @@ -1,12 +0,0 @@ -#include <sys/types.h> - -void* memcpy(void* dst, const void* src, size_t count) { - register char *d=dst; - register const char *s=src; - ++count; /* this actually produces better code than using count-- */ - while (--count) { - *d = *s; - ++d; ++s; - } - return dst; -} diff --git a/mdk-stage1/dietlibc/lib/memmove.c b/mdk-stage1/dietlibc/lib/memmove.c deleted file mode 100644 index 7adb2be91..000000000 --- a/mdk-stage1/dietlibc/lib/memmove.c +++ /dev/null @@ -1,23 +0,0 @@ -#define _POSIX_SOURCE -#define _XOPEN_SOURCE -#include <sys/types.h> - -void *memmove(void *dst, const void *src, size_t count) -{ - char *a = dst; - const char *b = src; - if (src!=dst) - { - if (src>dst) - { - while (count--) *a++ = *b++; - } - else - { - a+=count-1; - b+=count-1; - while (count--) *a-- = *b--; - } - } - return dst; -} diff --git a/mdk-stage1/dietlibc/lib/memset.c b/mdk-stage1/dietlibc/lib/memset.c deleted file mode 100644 index 5f9ae49ee..000000000 --- a/mdk-stage1/dietlibc/lib/memset.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <sys/types.h> - -void * memset(void * dst, int s, size_t count) { - register char * a = dst; - count++; /* this actually creates smaller code than using count-- */ - while (--count) - *a++ = s; - return dst; -} diff --git a/mdk-stage1/dietlibc/lib/mkfifo.c b/mdk-stage1/dietlibc/lib/mkfifo.c deleted file mode 100644 index 97659490c..000000000 --- a/mdk-stage1/dietlibc/lib/mkfifo.c +++ /dev/null @@ -1,6 +0,0 @@ -#include <linux/stat.h> -#include <unistd.h> - -int mkfifo(char *fn,int mode) { - return mknod(fn,S_IFIFO|mode,0); -} diff --git a/mdk-stage1/dietlibc/lib/nop.c b/mdk-stage1/dietlibc/lib/nop.c deleted file mode 100644 index 623278dee..000000000 --- a/mdk-stage1/dietlibc/lib/nop.c +++ /dev/null @@ -1,7 +0,0 @@ - -int __fflush_stdin() __attribute__((weak,alias("__nop"))); -int __fflush_stdout() __attribute__((weak,alias("__nop"))); -int __fflush_stderr() __attribute__((weak,alias("__nop"))); - -/* used for weak aliases */ -int __nop() { return 0; } diff --git a/mdk-stage1/dietlibc/lib/open64.c b/mdk-stage1/dietlibc/lib/open64.c deleted file mode 100644 index cab7e992e..000000000 --- a/mdk-stage1/dietlibc/lib/open64.c +++ /dev/null @@ -1,11 +0,0 @@ -#include <linux/types.h> -#include <linux/fcntl.h> -#include <unistd.h> - -#ifdef O_LARGEFILE -int open64(const char* file,int oflag,int mode) { - return open(file,oflag|O_LARGEFILE,mode); -} - -int __libc_open64(const char* file,int oflag,int mode) __attribute__((weak,alias("open64"))); -#endif diff --git a/mdk-stage1/dietlibc/lib/opendir.c b/mdk-stage1/dietlibc/lib/opendir.c deleted file mode 100644 index 05c0b9bc8..000000000 --- a/mdk-stage1/dietlibc/lib/opendir.c +++ /dev/null @@ -1,63 +0,0 @@ -#include <sys/stat.h> -#include <stdlib.h> -#include <string.h> -#include <fcntl.h> -#include <unistd.h> -#undef _POSIX_PTHREADS -#include <errno.h> - -#include "dirstream.h" - -#ifndef O_DIRECTORY -#define O_DIRECTORY 0200000 /* must be a directory */ -#endif - -/* - * opendir just makes an open() call - it return NULL if it fails - * (open sets errno), otherwise it returns a DIR * pointer. - */ -#undef opendir -DIR * -opendir(const char * name) -{ - int fd; - struct stat statbuf; - struct dirent *buf; - DIR *ptr; - - /* - if (stat(name,&statbuf)) return NULL; - if (!S_ISDIR(statbuf.st_mode)) { - errno = ENOTDIR; - return NULL; - } - */ - if ((fd = open(name,O_RDONLY|O_DIRECTORY)) < 0) - return NULL; - /* According to POSIX, directory streams should be closed when - * exec. From "Anna Pluzhnikov" <besp@midway.uchicago.edu>. - */ - if (fcntl(fd, F_SETFD, FD_CLOEXEC) < 0) - return NULL; - if (!(ptr=malloc(sizeof(*ptr)))) { - close(fd); - errno = ENOMEM; - return NULL; - } - - ptr->dd_max = statbuf.st_blksize; - if (ptr->dd_max < 512) - ptr->dd_max = 512; - - if (!(buf=malloc(ptr->dd_max))) { - close(fd); - free(ptr); - errno = ENOMEM; - return NULL; - } - ptr->dd_fd = fd; - ptr->dd_nextoff = ptr->dd_nextloc = ptr->dd_size = 0; - ptr->dd_buf = buf; - ptr->dd_getdents = unknown; - return ptr; -} diff --git a/mdk-stage1/dietlibc/lib/perror.c b/mdk-stage1/dietlibc/lib/perror.c deleted file mode 100644 index 5476d76a1..000000000 --- a/mdk-stage1/dietlibc/lib/perror.c +++ /dev/null @@ -1,16 +0,0 @@ -#include <unistd.h> -#include <string.h> - -extern char *sys_errlist[]; -extern int sys_nerr; -extern int errno; - -void perror(const char *s) { - register char *message="[unknown error]"; - write(2,s,strlen(s)); - write(2,": ",2); - if (errno>=0 && errno<sys_nerr) - message=sys_errlist[errno]; - write(2,message,strlen(message)); - write(2,"\n",1); -} diff --git a/mdk-stage1/dietlibc/lib/pread.c b/mdk-stage1/dietlibc/lib/pread.c deleted file mode 100644 index b922aa93e..000000000 --- a/mdk-stage1/dietlibc/lib/pread.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <endian.h> -#include <sys/types.h> - -extern size_t __pread(int fd, void *buf, size_t count, off_t a,off_t b); - -size_t __libc_pread(int fd, void *buf, size_t count, off_t offset) { - return __pread(fd,buf,count,offset,0); -} - -int pread(int fd, void *buf, size_t count, off_t offset) __attribute__((weak,alias("__libc_pread"))); diff --git a/mdk-stage1/dietlibc/lib/pread64.c b/mdk-stage1/dietlibc/lib/pread64.c deleted file mode 100644 index e6ba4d103..000000000 --- a/mdk-stage1/dietlibc/lib/pread64.c +++ /dev/null @@ -1,13 +0,0 @@ -#include <endian.h> -#include <sys/types.h> -#include <sys/stat.h> - -#ifndef __NO_STAT64 -extern size_t __pread(int fd, void *buf, size_t count, off_t a,off_t b); - -size_t __libc_pread64(int fd, void *buf, size_t count, off64_t offset) { - return __pread(fd,buf,count,__LONG_LONG_PAIR (offset&0xffffffff,offset>>32)); -} - -int pread64(int fd, void *buf, size_t count, off_t offset) __attribute__((weak,alias("__libc_pread64"))); -#endif diff --git a/mdk-stage1/dietlibc/lib/putenv.c b/mdk-stage1/dietlibc/lib/putenv.c deleted file mode 100644 index 274b16b0e..000000000 --- a/mdk-stage1/dietlibc/lib/putenv.c +++ /dev/null @@ -1,37 +0,0 @@ -#include <stdlib.h> -#include <string.h> - -int putenv(const char *string) { - int len; - int envc; - char *tmp; - const char **ep; - char **newenv; - static char **origenv=0; - if (!origenv) origenv=environ; - if (!(tmp=strchr(string,'='))) - len=strlen(string); - else - len=tmp-string+1; - for (envc=0, ep=(const char**)environ; *ep; ++ep) { - if (!memcmp(string,*ep,len)) { /* found */ - if (!tmp) { - for (; ep[1]; ++ep) ep[0]=ep[1]; - ep[0]=0; - return 0; - } - *ep=string; - return 0; - } - ++envc; - } - if (tmp) { - newenv=(char**)malloc((envc+2)*sizeof(char*)); - if (!newenv) return -1; - newenv[0]=(char*)string; - memcpy(newenv+1,environ,(envc+1)*sizeof(char*)); - if (environ!=origenv) free(environ); - environ=newenv; - } - return 0; -} diff --git a/mdk-stage1/dietlibc/lib/puts.c b/mdk-stage1/dietlibc/lib/puts.c deleted file mode 100644 index 01f6e50c4..000000000 --- a/mdk-stage1/dietlibc/lib/puts.c +++ /dev/null @@ -1,6 +0,0 @@ -#include <unistd.h> -#include <string.h> - -int puts(const char *s) { - return write(1,s,strlen(s)) && write(1,"\n",1); -} diff --git a/mdk-stage1/dietlibc/lib/raise.c b/mdk-stage1/dietlibc/lib/raise.c deleted file mode 100644 index 606546034..000000000 --- a/mdk-stage1/dietlibc/lib/raise.c +++ /dev/null @@ -1,8 +0,0 @@ -#include <linux/types.h> -#include <unistd.h> -#include <signal.h> -#include "syscalls.h" - -int raise(int sig) { - return kill(getpid(),sig); -} diff --git a/mdk-stage1/dietlibc/lib/readdir.c b/mdk-stage1/dietlibc/lib/readdir.c deleted file mode 100644 index 5accd32a1..000000000 --- a/mdk-stage1/dietlibc/lib/readdir.c +++ /dev/null @@ -1,83 +0,0 @@ -#if 0 - -Sorry, currently broken - -#include <dirent.h> -#include <errno.h> -#include <unistd.h> -#include <stdlib.h> -#include <string.h> - -#include "dirstream.h" - -#ifdef __ELF__ -#pragma weak readdir = __libc_readdir -#endif - -struct dirent * -__libc_readdir(DIR * dir) -{ - int result; - struct dirent *de; - - if (!dir) { - errno = EBADF; - return NULL; - } - - /* Are we running an old kernel? */ - if (dir->dd_getdents == no_getdents) - { - abort(); - } - - if (dir->dd_size <= dir->dd_nextloc) - { - /* read dir->dd_max bytes of directory entries. */ - result=getdents(dir->dd_fd,dir->dd_buf,dir->dd_max); - - /* We assume we have getdents (). */ - dir->dd_getdents = have_getdents; - if (result <= 0) - { - result = -result; - if (result > 0) - { - /* Are we right? */ - if (result == ENOSYS) - { - dir->dd_getdents = no_getdents; - abort(); - } - errno = result; - } - - return NULL; - } - - dir->dd_size = result; - dir->dd_nextloc = 0; - } - - de = (struct dirent *) (((char *)dir->dd_buf) + dir->dd_nextloc); - - /* Am I right? H.J. */ - dir->dd_nextloc += de->d_reclen; - - /* We have to save the next offset here. */ - dir->dd_nextoff = de->d_off; - - /* convert */ - dir->convbuf.d_ino=de->d_ino; - dir->convbuf.d_off=de->d_off; - dir->convbuf.d_reclen=de->d_reclen; - dir->convbuf.d_type=0; - if (strlen((char*)&de->d_type)>10) - de->d_name[10]=0; - strcpy(dir->convbuf.d_name,(char*)&de->d_type); - errno=0; - - return &dir->convbuf; -} - -#endif diff --git a/mdk-stage1/dietlibc/lib/recv.c b/mdk-stage1/dietlibc/lib/recv.c deleted file mode 100644 index cc778712c..000000000 --- a/mdk-stage1/dietlibc/lib/recv.c +++ /dev/null @@ -1,13 +0,0 @@ -#include <linux/net.h> - -extern int socketcall(int callno,long* args); - -int recv(int a, const void * b, size_t c, int flags) { -#ifdef __i386__ - return socketcall(SYS_RECV,(long*)&a); -#else - unsigned long args[] = { a, (long) b, c, flags }; - return socketcall(SYS_RECV, args); -#endif -} - diff --git a/mdk-stage1/dietlibc/lib/recvfrom.c b/mdk-stage1/dietlibc/lib/recvfrom.c deleted file mode 100644 index a07afe7ad..000000000 --- a/mdk-stage1/dietlibc/lib/recvfrom.c +++ /dev/null @@ -1,12 +0,0 @@ -#include <linux/net.h> - -extern int socketcall(int callno,long* args); - -int recvfrom(int a, const void * b, size_t c, int flags, void *to, void *tolen) { -#ifdef __i386__ - return socketcall(SYS_RECVFROM, (long*)&a); -#else - unsigned long args[] = { a, (long) b, c, flags, (long) to, (long) tolen }; - return socketcall(SYS_RECVFROM, args); -#endif -} diff --git a/mdk-stage1/dietlibc/lib/rewind.c b/mdk-stage1/dietlibc/lib/rewind.c deleted file mode 100644 index 48434a316..000000000 --- a/mdk-stage1/dietlibc/lib/rewind.c +++ /dev/null @@ -1,6 +0,0 @@ -#include <dietstdio.h> -#include <unistd.h> - -void rewind( FILE *stream) { - fseek(stream, 0L, SEEK_SET); -} diff --git a/mdk-stage1/dietlibc/lib/rewinddir.c b/mdk-stage1/dietlibc/lib/rewinddir.c deleted file mode 100644 index 138936527..000000000 --- a/mdk-stage1/dietlibc/lib/rewinddir.c +++ /dev/null @@ -1,17 +0,0 @@ -#include <unistd.h> -#include <errno.h> - -#include "dirstream.h" - -/* - * rewinddir() just does an lseek(fd,0,0) - see close for comments - */ -void rewinddir(DIR * dir) -{ - if (!dir) { - errno = EBADF; - return; - } - lseek(dir->dd_fd,0,SEEK_SET); - dir->dd_nextoff = dir->dd_nextloc = dir->dd_size = 0; -} diff --git a/mdk-stage1/dietlibc/lib/sbrk.c b/mdk-stage1/dietlibc/lib/sbrk.c deleted file mode 100644 index 945ad5a16..000000000 --- a/mdk-stage1/dietlibc/lib/sbrk.c +++ /dev/null @@ -1,20 +0,0 @@ -#include <unistd.h> - -extern int __brk(void *end_data_segment); - -extern void* __curbrk; - -void* __sbrk(ptrdiff_t increment) { - void* oldbrk; - if (__curbrk==0) - if (__brk(0) < 0) - return (void*)-1; - if (increment==0) - return __curbrk; - oldbrk=__curbrk; - if (__brk(oldbrk+increment)<0) - return (void*)-1; - return oldbrk; -} - -void* sbrk (ptrdiff_t increment) __attribute__((weak,alias("__sbrk"))); diff --git a/mdk-stage1/dietlibc/lib/seekdir.c b/mdk-stage1/dietlibc/lib/seekdir.c deleted file mode 100644 index f83052250..000000000 --- a/mdk-stage1/dietlibc/lib/seekdir.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <unistd.h> -#include <errno.h> - -#include "dirstream.h" - -#undef seekdir -void seekdir(DIR * dir, off_t offset) -{ - if (!dir) { - errno = EBADF; - return; - } - dir->dd_nextoff = lseek(dir->dd_fd, offset, SEEK_SET); - dir->dd_size = dir->dd_nextloc = 0; -} diff --git a/mdk-stage1/dietlibc/lib/send.c b/mdk-stage1/dietlibc/lib/send.c deleted file mode 100644 index be43b4e63..000000000 --- a/mdk-stage1/dietlibc/lib/send.c +++ /dev/null @@ -1,13 +0,0 @@ -#include <linux/net.h> - -extern int socketcall(int callno,long* args); - -int send(int a, const void * b, size_t c, int flags) { -#ifdef __i386__ - return socketcall(SYS_SEND, (long*)&a); -#else - unsigned long args[] = { a, (long) b, c, flags }; - return socketcall(SYS_SEND, args); -#endif -} - diff --git a/mdk-stage1/dietlibc/lib/sendto.c b/mdk-stage1/dietlibc/lib/sendto.c deleted file mode 100644 index e6c2560f3..000000000 --- a/mdk-stage1/dietlibc/lib/sendto.c +++ /dev/null @@ -1,13 +0,0 @@ -#include <linux/net.h> - -extern int socketcall(int callno,long* args); - -int sendto(int a, const void * b, size_t c, int flags, void *to, int tolen) { -#ifdef __i386__ - return socketcall(SYS_SENDTO, (long*)&a); -#else - unsigned long args[] = { a, (long) b, c, flags, (long) to, tolen }; - return socketcall(SYS_SENDTO, args); -#endif -} - diff --git a/mdk-stage1/dietlibc/lib/set_errno.c b/mdk-stage1/dietlibc/lib/set_errno.c deleted file mode 100644 index 6553bc496..000000000 --- a/mdk-stage1/dietlibc/lib/set_errno.c +++ /dev/null @@ -1,9 +0,0 @@ -extern int errno; - -void __set_errno(int error) __attribute__ ((weak)); - -void __set_errno(int error) -{ - errno=error; -} - diff --git a/mdk-stage1/dietlibc/lib/setsockopt.c b/mdk-stage1/dietlibc/lib/setsockopt.c deleted file mode 100644 index 781e9c31c..000000000 --- a/mdk-stage1/dietlibc/lib/setsockopt.c +++ /dev/null @@ -1,13 +0,0 @@ -#include <linux/net.h> - -extern int socketcall(int callno,long* args); - -int setsockopt(int a, int b, int c, void *d, void *e) { -#ifdef __i386__ - return socketcall(SYS_SETSOCKOPT, (long*)&a); -#else - unsigned long args[] = { a, b, c, (long)d, (long) e }; - return socketcall(SYS_SETSOCKOPT, args); -#endif -} - diff --git a/mdk-stage1/dietlibc/lib/sigaddset.c b/mdk-stage1/dietlibc/lib/sigaddset.c deleted file mode 100644 index 0c9d95c28..000000000 --- a/mdk-stage1/dietlibc/lib/sigaddset.c +++ /dev/null @@ -1,21 +0,0 @@ -#define __USE_EXTERN_INLINES 1 -#include <signal.h> - -# define __sigmask(sig) \ - (((unsigned long int) 1) << (((sig) - 1) % (8 * sizeof (unsigned long int)))) - -# define __sigword(sig) (((sig) - 1) / (8 * sizeof (unsigned long int))) - -# define _SIGSET_NWORDS (1024 / (8 * sizeof (unsigned long int))) -typedef struct - { - unsigned long int __val[_SIGSET_NWORDS]; - } __sigset_t; - -int __sigaddset(__sigset_t *set, int signo) { - unsigned long int __mask = __sigmask (signo); - unsigned long int __word = __sigword (signo); - return ((set->__val[__word] |= __mask), 0); -} - -int sigaddset (sigset_t *env, int signo) __attribute__((weak,alias("__sigaddset"))); diff --git a/mdk-stage1/dietlibc/lib/sigemptyset.c b/mdk-stage1/dietlibc/lib/sigemptyset.c deleted file mode 100644 index f4532f96e..000000000 --- a/mdk-stage1/dietlibc/lib/sigemptyset.c +++ /dev/null @@ -1,14 +0,0 @@ -#define __USE_EXTERN_INLINES 1 -#include <signal.h> -#include <errno.h> -#include <string.h> - -int sigemptyset(sigset_t *set) { - if (set==NULL) { - __set_errno(EINVAL); - return -1; - } - memset(set,0,sizeof(*set)); - return 0; -} - diff --git a/mdk-stage1/dietlibc/lib/sigjmp.c b/mdk-stage1/dietlibc/lib/sigjmp.c deleted file mode 100644 index d7db58fd2..000000000 --- a/mdk-stage1/dietlibc/lib/sigjmp.c +++ /dev/null @@ -1,36 +0,0 @@ -/* Copyright (C) 1992, 1994, 1997 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. - - The GNU C Library 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with the GNU C Library; see the file COPYING.LIB. If not, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#include <stddef.h> -#include <setjmp.h> -#include <signal.h> -#include <string.h> - -/* This function is called by the `sigsetjmp' macro - before doing a `__setjmp' on ENV[0].__jmpbuf. - Always return zero. */ - -int -__sigjmp_save (sigjmp_buf env, int savemask) -{ - env[0].__mask_was_saved = (savemask && - sigprocmask (SIG_BLOCK, (sigset_t *) NULL, - (sigset_t*)&env[0].__saved_mask) == 0); - - return 0; -} diff --git a/mdk-stage1/dietlibc/lib/sleep.c b/mdk-stage1/dietlibc/lib/sleep.c deleted file mode 100644 index ec5b99533..000000000 --- a/mdk-stage1/dietlibc/lib/sleep.c +++ /dev/null @@ -1,11 +0,0 @@ -#include <linux/time.h> -#include <time.h> - -unsigned int sleep(unsigned int secs) { - struct timespec t; - t.tv_sec=secs; - t.tv_nsec=0; - nanosleep(&t,&t); - return secs-t.tv_sec; -} - diff --git a/mdk-stage1/dietlibc/lib/snprintf.c b/mdk-stage1/dietlibc/lib/snprintf.c deleted file mode 100644 index 096c06115..000000000 --- a/mdk-stage1/dietlibc/lib/snprintf.c +++ /dev/null @@ -1,14 +0,0 @@ -#include <stdarg.h> -#include <sys/types.h> - -int vsnprintf (char *str,size_t size,const char *format, va_list arg_ptr); - -int snprintf(char *str,size_t size,const char *format,...) -{ - int n; - va_list arg_ptr; - va_start(arg_ptr, format); - n=vsnprintf(str,size,format,arg_ptr); - va_end (arg_ptr); - return n; -} diff --git a/mdk-stage1/dietlibc/lib/socket.c b/mdk-stage1/dietlibc/lib/socket.c deleted file mode 100644 index 1684a6a2b..000000000 --- a/mdk-stage1/dietlibc/lib/socket.c +++ /dev/null @@ -1,12 +0,0 @@ -#include <linux/net.h> - -extern int socketcall(int callno,long* args); - -int socket(int a, int b, int c) { -#ifdef __i386__ - return socketcall(SYS_SOCKET, (long*)&a); -#else - unsigned long args[] = { a, b, c }; - return socketcall(SYS_SOCKET, args); -#endif -} diff --git a/mdk-stage1/dietlibc/lib/sprintf.c b/mdk-stage1/dietlibc/lib/sprintf.c deleted file mode 100644 index f1b554ce2..000000000 --- a/mdk-stage1/dietlibc/lib/sprintf.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <stdarg.h> -#include <linux/types.h> -#include <stdlib.h> - -int vsnprintf (char *str,size_t size,const char *format, va_list arg_ptr); - -int sprintf(char *dest,const char *format,...) -{ - int n; - va_list arg_ptr; - va_start(arg_ptr, format); - n=vsnprintf(dest,1000000,format,arg_ptr); - va_end (arg_ptr); - return n; -} diff --git a/mdk-stage1/dietlibc/lib/sscanf.c b/mdk-stage1/dietlibc/lib/sscanf.c deleted file mode 100644 index 341e74bba..000000000 --- a/mdk-stage1/dietlibc/lib/sscanf.c +++ /dev/null @@ -1,13 +0,0 @@ -#include <stdarg.h> - -int vsscanf(const char *str, const char *format, va_list arg_ptr); - -int sscanf(const char *str, const char *format, ...) -{ - int n; - va_list arg_ptr; - va_start(arg_ptr, format); - n=vsscanf(str,format,arg_ptr); - va_end (arg_ptr); - return n; -} diff --git a/mdk-stage1/dietlibc/lib/strcat.c b/mdk-stage1/dietlibc/lib/strcat.c deleted file mode 100644 index 8a755afea..000000000 --- a/mdk-stage1/dietlibc/lib/strcat.c +++ /dev/null @@ -1,18 +0,0 @@ -#include "dietfeatures.h" -#include <string.h> - -char* strcat(register char* s,register const char* t) -{ - char *dest=s; - s+=strlen(s); - for (;;) { - if (!(*s = *t)) break; ++s; ++t; -#ifndef WANT_SMALL_STRING_ROUTINES - if (!(*s = *t)) break; ++s; ++t; - if (!(*s = *t)) break; ++s; ++t; - if (!(*s = *t)) break; ++s; ++t; -#endif - } - return dest; -} - diff --git a/mdk-stage1/dietlibc/lib/strchr.c b/mdk-stage1/dietlibc/lib/strchr.c deleted file mode 100644 index b908853f8..000000000 --- a/mdk-stage1/dietlibc/lib/strchr.c +++ /dev/null @@ -1,16 +0,0 @@ -#include "dietfeatures.h" - -char *strchr(register const char *t, int c) { - register char ch; - - ch = c; - for (;;) { - if (*t == ch) break; if (!*t) return 0; ++t; -#ifndef WANT_SMALL_STRING_ROUTINES - if (*t == ch) break; if (!*t) return 0; ++t; - if (*t == ch) break; if (!*t) return 0; ++t; - if (*t == ch) break; if (!*t) return 0; ++t; -#endif - } - return (char*)t; -} diff --git a/mdk-stage1/dietlibc/lib/strcmp.c b/mdk-stage1/dietlibc/lib/strcmp.c deleted file mode 100644 index 0db324e66..000000000 --- a/mdk-stage1/dietlibc/lib/strcmp.c +++ /dev/null @@ -1,16 +0,0 @@ -#include "dietfeatures.h" - -int strcmp(register const char *s,register const char *t) { - register char x; - - for (;;) { - x = *s; if (x != *t) break; if (!x) break; ++s; ++t; -#ifndef WANT_SMALL_STRING_ROUTINES - x = *s; if (x != *t) break; if (!x) break; ++s; ++t; - x = *s; if (x != *t) break; if (!x) break; ++s; ++t; - x = *s; if (x != *t) break; if (!x) break; ++s; ++t; -#endif - } - return ((int)(unsigned int)(unsigned char) x) - - ((int)(unsigned int)(unsigned char) *t); -} diff --git a/mdk-stage1/dietlibc/lib/strcpy.c b/mdk-stage1/dietlibc/lib/strcpy.c deleted file mode 100644 index 49693c30d..000000000 --- a/mdk-stage1/dietlibc/lib/strcpy.c +++ /dev/null @@ -1,15 +0,0 @@ -#include "dietfeatures.h" - -char* strcpy(register char* s,register const char* t) -{ - char *dest=s; - for (;;) { - if (!(*s = *t)) return dest; ++s; ++t; -#ifndef WANT_SMALL_STRING_ROUTINES - if (!(*s = *t)) return dest; ++s; ++t; - if (!(*s = *t)) return dest; ++s; ++t; - if (!(*s = *t)) return dest; ++s; ++t; -#endif - } -} - diff --git a/mdk-stage1/dietlibc/lib/strcspn.c b/mdk-stage1/dietlibc/lib/strcspn.c deleted file mode 100644 index 37053c72c..000000000 --- a/mdk-stage1/dietlibc/lib/strcspn.c +++ /dev/null @@ -1,17 +0,0 @@ -#include <sys/types.h> -#include <string.h> - -size_t strcspn(const char *s, const char *reject) -{ - size_t l=0; - int a=1,i,al=strlen(reject); - - while((a)&&(*s)) - { - for(i=0;(a)&&(i<al);i++) - if (*s==reject[i]) a=0; - if (a) l++; - s++; - } - return l; -} diff --git a/mdk-stage1/dietlibc/lib/strdup.c b/mdk-stage1/dietlibc/lib/strdup.c deleted file mode 100644 index 6a2ea5f95..000000000 --- a/mdk-stage1/dietlibc/lib/strdup.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <string.h> -#include <stdlib.h> - -char *strdup(const char *s) { - char *tmp=(char *)malloc(strlen(s)+1); - if (!tmp) return 0; - strcpy(tmp,s); - return tmp; -} diff --git a/mdk-stage1/dietlibc/lib/strerror.c b/mdk-stage1/dietlibc/lib/strerror.c deleted file mode 100644 index f15b86aae..000000000 --- a/mdk-stage1/dietlibc/lib/strerror.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <string.h> - -extern char *sys_errlist[]; -extern int sys_nerr; - -char *strerror(int errnum) { - if (errnum>=0 && errnum<sys_nerr) - return sys_errlist[errnum]; - return "[unknown error]"; -} diff --git a/mdk-stage1/dietlibc/lib/strlcat.c b/mdk-stage1/dietlibc/lib/strlcat.c deleted file mode 100644 index fd35ec8af..000000000 --- a/mdk-stage1/dietlibc/lib/strlcat.c +++ /dev/null @@ -1,72 +0,0 @@ -/* $OpenBSD: strlcat.c,v 1.2 1999/06/17 16:28:58 millert Exp $ */ - -/* - * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL - * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#if defined(LIBC_SCCS) && !defined(lint) -static char *rcsid = "$OpenBSD: strlcat.c,v 1.2 1999/06/17 16:28:58 millert Exp $"; -#endif /* LIBC_SCCS and not lint */ - -#include <sys/types.h> -#include <string.h> - -/* - * Appends src to string dst of size siz (unlike strncat, siz is the - * full size of dst, not space left). At most siz-1 characters - * will be copied. Always NUL terminates (unless siz == 0). - * Returns strlen(initial dst) + strlen(src); if retval >= siz, - * truncation occurred. - */ -size_t strlcat(dst, src, siz) - char *dst; - const char *src; - size_t siz; -{ - register char *d = dst; - register const char *s = src; - register size_t n = siz; - size_t dlen; - - /* Find the end of dst and adjust bytes left but don't go past end */ - while (*d != '\0' && n-- != 0) - d++; - dlen = d - dst; - n = siz - dlen; - - if (n == 0) - return(dlen + strlen(s)); - while (*s != '\0') { - if (n != 1) { - *d++ = *s; - n--; - } - s++; - } - *d = '\0'; - - return(dlen + (s - src)); /* count does not include NUL */ -} diff --git a/mdk-stage1/dietlibc/lib/strlcpy.c b/mdk-stage1/dietlibc/lib/strlcpy.c deleted file mode 100644 index b935b9527..000000000 --- a/mdk-stage1/dietlibc/lib/strlcpy.c +++ /dev/null @@ -1,68 +0,0 @@ -/* $OpenBSD: strlcpy.c,v 1.3 1999/04/24 01:17:37 millert Exp $ */ - -/* - * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL - * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#if defined(LIBC_SCCS) && !defined(lint) -static char *rcsid = "$OpenBSD: strlcpy.c,v 1.3 1999/04/24 01:17:37 millert Exp $"; -#endif /* LIBC_SCCS and not lint */ - -#include <sys/types.h> -#include <string.h> - -/* - * Copy src to string dst of size siz. At most siz-1 characters - * will be copied. Always NUL terminates (unless siz == 0). - * Returns strlen(src); if retval >= siz, truncation occurred. - */ -size_t strlcpy(dst, src, siz) - char *dst; - const char *src; - size_t siz; -{ - register char *d = dst; - register const char *s = src; - register size_t n = siz; - - /* Copy as many bytes as will fit */ - if (n != 0 && --n != 0) { - do { - if ((*d++ = *s++) == 0) - break; - } while (--n != 0); - } - - /* Not enough room in dst, add NUL and traverse rest of src */ - if (n == 0) { - if (siz != 0) - *d = '\0'; /* NUL-terminate dst */ - while (*s++) - ; - } - - return(s - src - 1); /* count does not include NUL */ -} diff --git a/mdk-stage1/dietlibc/lib/strlen.c b/mdk-stage1/dietlibc/lib/strlen.c deleted file mode 100644 index 56c085dac..000000000 --- a/mdk-stage1/dietlibc/lib/strlen.c +++ /dev/null @@ -1,47 +0,0 @@ -#include <endian.h> -#include "dietfeatures.h" -#include <string.h> - -#ifdef WANT_SMALL_STRING_ROUTINES -size_t strlen(const char *s) { - register int i; - if (!s) return 0; - for (i=0; *s; ++s) ++i; - return i; -} -#else -static const unsigned long magic = 0x01010101; - -size_t strlen(const char *s) -{ - const char *t = s; - unsigned long word; - - if (!s) return 0; - - /* Byte compare up until word boundary */ - for (; ((unsigned long) t & 3); t++) - if (!*t) return t - s; - - /* Word compare */ - do { - word = *((unsigned long *) t); t += 4; - word = (word - magic) &~ word; - word &= (magic << 7); - } while (word == 0); - -#if BYTE_ORDER == LITTLE_ENDIAN - /* word & 0x80808080 == word */ - word = (word - 1) & (magic << 10); - word += (word << 8) + (word << 16); - t += word >> 26; -#else - if ((word & 0x80800000) == 0) { - word <<= 16; - t += 2; - } - if ((word & 0x80000000) == 0) t += 1; -#endif - return ((const char *) t) - 4 - s; -} -#endif diff --git a/mdk-stage1/dietlibc/lib/strncat.c b/mdk-stage1/dietlibc/lib/strncat.c deleted file mode 100644 index 1d3b94ca5..000000000 --- a/mdk-stage1/dietlibc/lib/strncat.c +++ /dev/null @@ -1,19 +0,0 @@ -#include "dietfeatures.h" -#include <string.h> - -char *strncat(char *s, const char *t, size_t n) { - char *dest=s; - register char *max=s+n-1; - s+=strlen(s); - for (;;) { - if (!(*s = *t)) break; if (++s==max) break; ++t; -#ifndef WANT_SMALL_STRING_ROUTINES - if (!(*s = *t)) break; if (++s==max) break; ++t; - if (!(*s = *t)) break; if (++s==max) break; ++t; - if (!(*s = *t)) break; if (++s==max) break; ++t; -#endif - } - *s=0; - return dest; -} - diff --git a/mdk-stage1/dietlibc/lib/strncmp.c b/mdk-stage1/dietlibc/lib/strncmp.c deleted file mode 100644 index 7c08c0fa7..000000000 --- a/mdk-stage1/dietlibc/lib/strncmp.c +++ /dev/null @@ -1,6 +0,0 @@ -#include <sys/types.h> -#include <string.h> - -int strncmp(const char *s1, const char *s2, size_t n) { - return memccmp(s1,s2,0,n); -} diff --git a/mdk-stage1/dietlibc/lib/strncpy.c b/mdk-stage1/dietlibc/lib/strncpy.c deleted file mode 100644 index 531387b7f..000000000 --- a/mdk-stage1/dietlibc/lib/strncpy.c +++ /dev/null @@ -1,10 +0,0 @@ -#define _POSIX_SOURCE -#define _XOPEN_SOURCE -#include <sys/types.h> -#include <string.h> - -char *strncpy(char *dest, const char *src, size_t n) -{ - memccpy(dest,src,0,n); - return dest; -} diff --git a/mdk-stage1/dietlibc/lib/strpbrk.c b/mdk-stage1/dietlibc/lib/strpbrk.c deleted file mode 100644 index e18fd2a2d..000000000 --- a/mdk-stage1/dietlibc/lib/strpbrk.c +++ /dev/null @@ -1,11 +0,0 @@ -#include <sys/types.h> -#include <string.h> - -char *strpbrk(const char *s, const char *accept) { - register int i,l=strlen(accept); - for (; *s; s++) - for (i=0; i<l; i++) - if (*s == accept[i]) - return (char*)s; - return 0; -} diff --git a/mdk-stage1/dietlibc/lib/strrchr.c b/mdk-stage1/dietlibc/lib/strrchr.c deleted file mode 100644 index 3c91e9bc8..000000000 --- a/mdk-stage1/dietlibc/lib/strrchr.c +++ /dev/null @@ -1,18 +0,0 @@ -#include <string.h> -#include "dietfeatures.h" - -char *strrchr(const char *t, int c) { - register char ch; - register const char *l=0; - - ch = c; - for (;;) { - if (*t == ch) l=t; if (!*t) return (char*)l; ++t; -#ifndef WANT_SMALL_STRING_ROUTINES - if (*t == ch) l=t; if (!*t) return (char*)l; ++t; - if (*t == ch) l=t; if (!*t) return (char*)l; ++t; - if (*t == ch) l=t; if (!*t) return (char*)l; ++t; -#endif - } - return (char*)l; -} diff --git a/mdk-stage1/dietlibc/lib/strspn.c b/mdk-stage1/dietlibc/lib/strspn.c deleted file mode 100644 index 2b3a4c116..000000000 --- a/mdk-stage1/dietlibc/lib/strspn.c +++ /dev/null @@ -1,17 +0,0 @@ -#include <sys/types.h> -#include <string.h> - -size_t strspn(const char *s, const char *accept) -{ - size_t l=0; - int a=1,i,al=strlen(accept); - - while((a)&&(*s)) - { - for(a=i=0;(!a)&&(i<al);i++) - if (*s==accept[i]) a=1; - if (a) l++; - s++; - } - return l; -} diff --git a/mdk-stage1/dietlibc/lib/strstr.c b/mdk-stage1/dietlibc/lib/strstr.c deleted file mode 100644 index 641d9d7ac..000000000 --- a/mdk-stage1/dietlibc/lib/strstr.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <sys/types.h> -#include <string.h> - -char *strstr(const char *haystack, const char *needle) { - int nl=strlen(needle); - int hl=strlen(haystack); - int i; - if (nl>hl) return 0; - for (i=hl-nl+1; i; --i) { - if (!memcmp(haystack,needle,nl)) - return (char*)haystack; - ++haystack; - } - return 0; -} diff --git a/mdk-stage1/dietlibc/lib/strtod.c b/mdk-stage1/dietlibc/lib/strtod.c deleted file mode 100644 index 767be679f..000000000 --- a/mdk-stage1/dietlibc/lib/strtod.c +++ /dev/null @@ -1,52 +0,0 @@ -#include <string.h> - -extern char isspace(char c); - -#ifdef __GNUC__ -static inline char isdigit(char c) { return (c>='0' && c<='9'); } -#endif - -double strtod(const char *nptr, char **endptr) { - double d=0; - register const char *c=nptr; - char neg=0; - while (*c && isspace(*c)) ++c; - switch (*c) { - case '-': neg=1; - case '+': c++; break; - default: break; - } - while (isdigit(*c)) { - d=d*10+(*c-'0'); - ++c; - } - if (*c=='.') { - double factor=.1; - while (isdigit(*++c)) { - d=d+(factor*(*c-'0')); - factor/=10; - } - } - if ((*c|32)=='e') { - int exp=0; - char neg=0; - if (c[1]<'0') { - switch (*c) { - case '-': neg=1; - case '+': c++; break; - default: - d=0; - c=nptr; - goto done; - } - } - while (isdigit(*++c)) - exp=exp*10+(*c-'0'); - while (exp) { /* XXX: this introduces rounding errors */ - d*=10; --exp; - } - } -done: - if (endptr) *endptr=(char*)c; - return d; -} diff --git a/mdk-stage1/dietlibc/lib/strtok.c b/mdk-stage1/dietlibc/lib/strtok.c deleted file mode 100644 index 525665e59..000000000 --- a/mdk-stage1/dietlibc/lib/strtok.c +++ /dev/null @@ -1,6 +0,0 @@ -char *strtok_r(char *s, const char *delim, char **ptrptr); -static char *strtok_pos; -char *strtok(char *s, const char *delim) -{ - return strtok_r(s,delim,&strtok_pos); -} diff --git a/mdk-stage1/dietlibc/lib/strtok_r.c b/mdk-stage1/dietlibc/lib/strtok_r.c deleted file mode 100644 index 93f9401de..000000000 --- a/mdk-stage1/dietlibc/lib/strtok_r.c +++ /dev/null @@ -1,21 +0,0 @@ -#include <string.h> - -char *strtok_r(char *s, const char *delim, char **ptrptr) -{ - int i; - char *tmp=0; - - if (s) (*ptrptr)=s; - - if (**ptrptr) - { - while(!(i=strcspn(*ptrptr,delim))) (*ptrptr)++; - if (**ptrptr) - { - tmp=(*ptrptr); - (*ptrptr)+=i; - if (**ptrptr) *(*ptrptr)++=0; - } - } - return tmp; -} diff --git a/mdk-stage1/dietlibc/lib/strtol.c b/mdk-stage1/dietlibc/lib/strtol.c deleted file mode 100644 index ead89f408..000000000 --- a/mdk-stage1/dietlibc/lib/strtol.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <ctype.h> - -extern unsigned long int strtoul(const char *nptr, char **endptr, int base); - -long int strtol(const char *nptr, char **endptr, int base) -{ - int neg=0; - unsigned long int v; - - while(isspace(*nptr)) nptr++; - - if (*nptr == '-' && isdigit(nptr[1])) { neg=-1; nptr++; } - v=strtoul(nptr,endptr,base); - return (neg?-v:v); -} diff --git a/mdk-stage1/dietlibc/lib/strtoll.c b/mdk-stage1/dietlibc/lib/strtoll.c deleted file mode 100644 index 7b8e28a1d..000000000 --- a/mdk-stage1/dietlibc/lib/strtoll.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <ctype.h> - -extern unsigned long int strtoull(const char *nptr, char **endptr, int base); - -long int strtoll(const char *nptr, char **endptr, int base) -{ - int neg=0; - unsigned long long int v; - - while(isspace(*nptr)) nptr++; - - if (*nptr == '-' && isdigit(nptr[1])) { neg=-1; nptr++; } - v=strtoull(nptr,endptr,base); - return (neg?-v:v); -} diff --git a/mdk-stage1/dietlibc/lib/strtoul.c b/mdk-stage1/dietlibc/lib/strtoul.c deleted file mode 100644 index bee849685..000000000 --- a/mdk-stage1/dietlibc/lib/strtoul.c +++ /dev/null @@ -1,39 +0,0 @@ -#include <ctype.h> - -static char *num="0123456789abcdefghijklmnopqrstuvwxyz"; - -unsigned long int strtoul(const char *nptr, char **endptr, int base) -{ - long int v=0; - int a=1,i; - - while(isspace(*nptr)) nptr++; - - if (*nptr == '+') { nptr++; } - if (!base) - { - if (*nptr=='0') - { - base=8; - if ((*(nptr+1)=='x')||(*(nptr+1)=='X')) base=16; - } - else - base=10; - } - while((a)&&(*nptr)) - { - a=0; - for (i=0;(!a)&&(i<base);i++) - { - if ((*nptr == num[i]) || (*nptr == (num[i]-' '))) - { - a=1; - v=(v*base)+(&num[i]-num); - } - } - if ((!a)&&(base==16)&&((*nptr=='x')||(*nptr=='X'))) a=1; - if (a) nptr++; - } - if (endptr) *endptr=(char *)nptr; - return v; -} diff --git a/mdk-stage1/dietlibc/lib/strtoull.c b/mdk-stage1/dietlibc/lib/strtoull.c deleted file mode 100644 index 64f095f60..000000000 --- a/mdk-stage1/dietlibc/lib/strtoull.c +++ /dev/null @@ -1,39 +0,0 @@ -#include <ctype.h> - -static char *num="0123456789abcdefghijklmnopqrstuvwxyz"; - -unsigned long long int strtoull(const char *nptr, char **endptr, int base) -{ - long long int v=0; - int a=1,i; - - while(isspace(*nptr)) nptr++; - - if (*nptr == '+') { nptr++; } - if (!base) - { - if (*nptr=='0') - { - base=8; - if ((*(nptr+1)=='x')||(*(nptr+1)=='X')) base=16; - } - else - base=10; - } - while((a)&&(*nptr)) - { - a=0; - for (i=0;(!a)&&(i<base);i++) - { - if ((*nptr == num[i]) || (*nptr == (num[i]-' '))) - { - a=1; - v=(v*base)+(&num[i]-num); - } - } - if ((!a)&&(base==16)&&((*nptr=='x')||(*nptr=='X'))) a=1; - if (a) nptr++; - } - if (endptr) *endptr=(char *)nptr; - return v; -} diff --git a/mdk-stage1/dietlibc/lib/sys_siglist.c b/mdk-stage1/dietlibc/lib/sys_siglist.c deleted file mode 100644 index 80d7b3fb0..000000000 --- a/mdk-stage1/dietlibc/lib/sys_siglist.c +++ /dev/null @@ -1,37 +0,0 @@ -const char *const sys_siglist[] = - { - "Signal 0", - "Hangup", - "Interrupt", - "Quit", - "Illegal instruction", - "Trace/breakpoint trap", - "IOT trap", - "EMT trap", - "Floating point exception", - "Killed", - "Bus error", - "Segmentation fault", - "Bad system call", - "Broken pipe", - "Alarm clock", - "Terminated", - "Urgent I/O condition", - "Stopped (signal)", - "Stopped", - "Continued", - "Child exited", - "Stopped (tty input)", - "Stopped (tty output)", - "I/O possible", - "CPU time limit exceeded", - "File size limit exceeded", - "Virtual timer expired", - "Profiling timer expired", - "Window changed", - "Resource lost", - "User defined signal 1", - "User defined signal 2", - 0 - }; - diff --git a/mdk-stage1/dietlibc/lib/tcgetattr.c b/mdk-stage1/dietlibc/lib/tcgetattr.c deleted file mode 100644 index f35d39442..000000000 --- a/mdk-stage1/dietlibc/lib/tcgetattr.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <termios.h> -#include <sys/ioctl.h> - -int tcgetattr(int fildes, struct termios *termios_p) -{ - return ioctl(fildes, TCGETS, termios_p); -} diff --git a/mdk-stage1/dietlibc/lib/tcsetattr.c b/mdk-stage1/dietlibc/lib/tcsetattr.c deleted file mode 100644 index 642588d47..000000000 --- a/mdk-stage1/dietlibc/lib/tcsetattr.c +++ /dev/null @@ -1,23 +0,0 @@ -#define tcsetattr libc_tcsetattr -#include <termios.h> -#include <sys/ioctl.h> -#undef tcsetattr - -#include <asm/errno.h> - -extern int errno; - -int tcsetattr(int fildes, int optional_actions, struct termios *termios_p) -{ - switch (optional_actions) { - case TCSANOW: - return ioctl(fildes, TCSETS, termios_p); - case TCSADRAIN: - return ioctl(fildes, TCSETSW, termios_p); - case TCSAFLUSH: - return ioctl(fildes, TCSETSF, termios_p); - default: - errno = EINVAL; - return -1; - } -} diff --git a/mdk-stage1/dietlibc/lib/telldir.c b/mdk-stage1/dietlibc/lib/telldir.c deleted file mode 100644 index eca175381..000000000 --- a/mdk-stage1/dietlibc/lib/telldir.c +++ /dev/null @@ -1,38 +0,0 @@ -#include <unistd.h> -#include <errno.h> - -#include "dirstream.h" - -#undef telldir -off_t -telldir(DIR * dir) -{ - off_t offset; - - if (!dir) { - errno = EBADF; - return -1; - } - - switch (dir->dd_getdents) - { - case no_getdents: - /* We are running the old kernel. This is the starting offset - of the next readdir(). */ - offset = lseek(dir->dd_fd, 0, SEEK_CUR); - break; - - case unknown: - /* readdir () is not called yet. but seekdir () may be called. */ - case have_getdents: - /* The next entry. */ - offset = dir->dd_nextoff; - break; - - default: - errno = EBADF; - offset = -1; - } - - return offset; -} diff --git a/mdk-stage1/dietlibc/lib/ttyname.c b/mdk-stage1/dietlibc/lib/ttyname.c deleted file mode 100644 index 81a0cbc66..000000000 --- a/mdk-stage1/dietlibc/lib/ttyname.c +++ /dev/null @@ -1,60 +0,0 @@ -#include "dietfeatures.h" -#include <unistd.h> -#include <sys/stat.h> -#include <string.h> - -#ifdef __linux__ - -extern int __ltostr(char *s, int size, unsigned long i, int base, char UpCase); - -char *ttyname(int fd) { -#ifdef SLASH_PROC_OK - char ibuf[20]; - static char obuf[20]; - strcpy(ibuf,"/proc/self/fd/"); - ibuf[__ltostr(ibuf+14,6,fd,10,0)+14]=0; - if (readlink(ibuf,obuf,sizeof(obuf)-1)<0) return 0; - return obuf; -#else - static char buf[20]="/dev/tty"; - struct stat s; - char *c=buf+8; - int n; - if (fstat(fd,&s)) return 0; - if (S_ISCHR(s.st_mode)) { - n=minor(s.st_rdev); - switch (major(s.st_rdev)) { - case 4: - buf[5]='t'; buf[7]='y'; - if (n>63) { - n-=64; - *c='S'; - ++c; - } -num: - c[__ltostr(c,6,n,10,0)]=0; - break; - case 2: - buf[5]='p'; buf[7]='y'; - buf[8]='p'-(n>>4); - buf[9]=n%4+'0'; - if (buf[9]>'9') *c+='a'-'0'; - buf[10]=0; - case 136: - case 137: - case 138: - case 139: - buf[5]='p'; buf[7]='s'; - n+=(major(s.st_rdev)-136)<<8; - *c='/'; ++c; - goto num; - default: - return 0; - } - return buf; - } - return 0; -#endif -} - -#endif diff --git a/mdk-stage1/dietlibc/lib/vfork.c b/mdk-stage1/dietlibc/lib/vfork.c deleted file mode 100644 index 795cddb05..000000000 --- a/mdk-stage1/dietlibc/lib/vfork.c +++ /dev/null @@ -1,6 +0,0 @@ -#include <linux/types.h> -#include <unistd.h> - -pid_t vfork(void) { - return fork(); -} diff --git a/mdk-stage1/dietlibc/lib/vfprintf.c b/mdk-stage1/dietlibc/lib/vfprintf.c deleted file mode 100644 index 03dfe87a9..000000000 --- a/mdk-stage1/dietlibc/lib/vfprintf.c +++ /dev/null @@ -1,11 +0,0 @@ -#include <stdarg.h> -#include <stdio.h> -#include <stdlib.h> - -int vfprintf(FILE *fstream, const char *format, va_list ap) -{ - char tmp[1000000]; - size_t n = vsnprintf(tmp, sizeof(tmp), format, ap); - fwrite(tmp, n, 1, fstream); - return n; -} diff --git a/mdk-stage1/dietlibc/lib/vprintf.c b/mdk-stage1/dietlibc/lib/vprintf.c deleted file mode 100644 index 46ecc47a4..000000000 --- a/mdk-stage1/dietlibc/lib/vprintf.c +++ /dev/null @@ -1,14 +0,0 @@ -#include <stdarg.h> -#include <linux/types.h> -#include <unistd.h> -#include <stdlib.h> - -int vsnprintf (char *str,size_t size,const char *format, va_list arg_ptr); - -int vprintf(const char *format, va_list ap) -{ - char tmp[1000000]; - size_t n = vsnprintf(tmp, sizeof(tmp), format, ap); - write(1, tmp, n); - return n; -} diff --git a/mdk-stage1/dietlibc/lib/vsnprintf.c b/mdk-stage1/dietlibc/lib/vsnprintf.c deleted file mode 100644 index 5bbc51620..000000000 --- a/mdk-stage1/dietlibc/lib/vsnprintf.c +++ /dev/null @@ -1,239 +0,0 @@ -#include "dietfeatures.h" -#include <stdarg.h> -#include <sys/types.h> -#include <stdlib.h> -#include <string.h> - -extern int __ltostr(char *s, int size, unsigned long i, int base, char UpCase); -extern int __dtostr(double d,char *buf,int maxlen,int prec); - -#include <unistd.h> -void print_int(int fd, int i) -{ - char buf[10]; - char * chptr = buf + 9; - int j = 0; - - if (i < 0) - { - write(1, "-", 1); - i = -1 * i; - } - - while (i) - { - *chptr-- = '0' + (i % 10); - j++; - i = i / 10; - } - - write(fd, chptr + 1, j); -} - -int vsnprintf (char *str, size_t size, const char *format, va_list arg_ptr) -{ - size_t apos,i; - char ch,buf[1024]; - char *pb; - char flag_in_sign; - char flag_hash,flag_zero,flag_left,flag_space,flag_sign,flag_dot,flag_long; - long number,width,preci,buf_len,pad; - char padwith; - - size--; - - apos=0; - while (apos<size) - { - ch=*format++; - switch (ch) - { - case '%': - flag_hash=0; - flag_zero=0; - flag_left=0; - flag_space=0; - flag_sign=0; - flag_dot=0; - flag_in_sign=0; - flag_long=0; - - width=0; - padwith=' '; - -inn_vsnprintf: - if (apos>=size) continue; /* ARGL !!! */ - - ch=*format++; - switch (ch) - { -/* Format end ?!? */ - case 0: - return -1; - break; - -/* Format flag chars */ - case '#': - flag_hash=1; - goto inn_vsnprintf; - - case 'l': - flag_long=1; - goto inn_vsnprintf; - - case '0': - padwith='0'; - goto inn_vsnprintf; - - case '-': - flag_left=1; - goto inn_vsnprintf; - - case ' ': - flag_space=1; - goto inn_vsnprintf; - - case '+': - flag_sign=1; - goto inn_vsnprintf; - - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - if(flag_dot) return -1; - width=strtol(--format,&pb,10); - format=pb; - goto inn_vsnprintf; - - case '.': - flag_dot=1; - preci=strtol(format,&pb,10); - format=pb; - goto inn_vsnprintf; - -/* Format conversion chars */ - case 'c': - ch=(char)va_arg(arg_ptr,int); - case '%': - if (str) str[apos]=ch; ++apos; - break; - - case 's': - pb=va_arg(arg_ptr,char *); -#ifdef WANT_NULL_PRINTF - if (!pb) pb="(null)"; -#endif - buf_len=strlen(pb); - -print_out: - if (str) { - if (width && (!flag_left)) - { - for (pad=width-buf_len; pad>0; --pad) str[apos++]=padwith; - } - for(i=0;(pb[i])&&(apos<size);i++) { str[apos++]=pb[i]; } /* strncpy */ - if (width && (flag_left)) - { - for (pad=width-buf_len; pad>0; --pad) str[apos++]=padwith; - } - } else { - if (width) - apos+=width; - else { - int a=strlen(pb); - if (a>size) apos+=size; else apos+=a; - } - } - - break; - - /* Numbers */ - case 'b': - i=2; - goto num_vsnprintf; - case 'p': - flag_hash=1; - width=sizeof(void *)<<1; - padwith='0'; - ch='x'; - case 'X': - case 'x': - i=16; - if (flag_hash) - { - if (str) { - str[apos++]='0'; - str[apos++]=ch; - } else - apos+=2; - } - goto num_vsnprintf; - case 'd': - case 'i': - flag_in_sign=1; - case 'u': - i=10; - goto num_vsnprintf; - case 'o': - i=8; - if (flag_hash) { if (str) str[apos]='0'; ++apos; } - -num_vsnprintf: - if (apos>=size) continue; /* ARGL !!! */ - - if (flag_long) - number=va_arg(arg_ptr,long); - else - number=va_arg(arg_ptr,int); - - if (flag_in_sign && (number<0)) - { - number*=-1; - flag_in_sign=2; - } - - buf_len=__ltostr(buf+1,sizeof(buf)-1,(unsigned long) number,i,0); - pb=buf+1; - - if (flag_in_sign==2) - { - *(--pb)='-'; - buf_len++; - } - else if ((flag_in_sign)&&(flag_sign || flag_space)) - { - *(--pb)=(flag_sign)?'+':' '; - buf_len++; - } - goto print_out; - -#ifdef WANT_FLOATING_POINT_IN_PRINTF - case 'g': - { - double d=va_arg(arg_ptr,double); - buf_len=__dtostr(d,buf,sizeof(buf),6); - pb=buf; - goto print_out; - } -#endif - default: - break; - } - break; - case 0: - if (str) str[apos]=0; - return apos; - default: - if (str) str[apos]=ch; apos++; - break; - } - } - if (str) str[apos]=0; - return apos; -} diff --git a/mdk-stage1/dietlibc/lib/vsprintf.c b/mdk-stage1/dietlibc/lib/vsprintf.c deleted file mode 100644 index af4eea852..000000000 --- a/mdk-stage1/dietlibc/lib/vsprintf.c +++ /dev/null @@ -1,11 +0,0 @@ -#include <stdarg.h> -#include <linux/types.h> -#include <unistd.h> -#include <stdlib.h> - -int vsnprintf (char *str,size_t size,const char *format, va_list arg_ptr); - -int vsprintf(char *str, const char *format, va_list ap) -{ - return vsnprintf(str, 1000000, format, ap); -} diff --git a/mdk-stage1/dietlibc/lib/vsscanf.c b/mdk-stage1/dietlibc/lib/vsscanf.c deleted file mode 100644 index a646ad92d..000000000 --- a/mdk-stage1/dietlibc/lib/vsscanf.c +++ /dev/null @@ -1,243 +0,0 @@ -#include "dietfeatures.h" -#include <stdarg.h> -#include <sys/types.h> -#include <ctype.h> -#include <stdlib.h> - -const char *skip_ws(const char *str) -{ - while ((*str)&&(isspace(*str))) str++; - return str; -} - -extern double strtod(const char *s,char **f); - -int vsscanf(const char *str, const char *format, va_list arg_ptr) -{ - int n=0,div; - char ch; - - char flag_discard, flag_malloc, flag_half, flag_long, flag_longlong; - char flag_width; - - unsigned long width; - -#ifdef WANT_FLOATING_POINT_IN_SCANF - /* arg_ptr tmps */ - double d,*pd; - float *pf; -#endif - - long l=0,*pl; - short *ph; - int *pi; - char *s; - - while ((*str)&&(*format)) - { - const char *prevfmt=format; - format=skip_ws(format); - ch=*format++; - if (!ch) continue; - - switch (ch) - { - case '%': - div=0; - flag_discard=0; - flag_malloc=0; - flag_half=0; - flag_long=0; - flag_longlong=0; - - flag_width=0; - width=-1; - -inn_vsscanf: - ch=*format++; - - switch (ch) - { - case 0: - return 0; - - case '%': - if (*(str++)!=ch) return n; - break; - - /* flags */ - case '*': - flag_discard=1; - goto inn_vsscanf; - - case 'a': - flag_malloc=1; - goto inn_vsscanf; - - case 'h': - flag_half=1; - goto inn_vsscanf; - - case 'l': - if (flag_long) flag_longlong=1; - flag_long=1; - goto inn_vsscanf; - - /* longlong ? NOT YET ! */ - case 'q': - case 'L': - flag_longlong=1; - goto inn_vsscanf; - - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - width=strtol(format-1,&s,10); - format=s; - flag_width=1; - goto inn_vsscanf; - - /* conversion */ - - case 'n': - while (width && *str) - { - *(s++)=*(str++); - --width; - l++; - } - if (!flag_discard) - { - pl=(long *)va_arg(arg_ptr,long*); - *pl=l; - ++n; - } - break; - - case 'p': - case 'X': - case 'x': - div+=6; - case 'd': - div+=2; - case 'o': - div+=8; - case 'u': - case 'i': - if (*(str=skip_ws(str))) - { - l=strtol(str,&s,div); - if (str!=s) - { - if (!flag_discard) - { - if (flag_long) - { - pl=(long *)va_arg(arg_ptr,long*); - *pl=l; - } - else if (flag_half) - { - ph=(short *)va_arg(arg_ptr,short*); - *ph=l; - } - else - { - pi=(int *)va_arg(arg_ptr,int*); - *pi=l; - } - ++n; - } - str=s; - } - else - return n; - } - break; - -#ifdef WANT_FLOATING_POINT_IN_SCANF - case 'e': - case 'E': - case 'f': - case 'g': - if (*(str=skip_ws(str))) - { - d=strtod(str,&s); - if (str!=s) - { - if (!flag_discard) - { - if (flag_long) - { - pd=(double *)va_arg(arg_ptr,double*); - *pd=d; - } - else - { - pf=(float *)va_arg(arg_ptr,float*); - *pf=d; - } - ++n; - } - str=s; - } - else - return n; - } - break; -#endif - - case 'c': - if (!flag_discard) - { - s=(char *)va_arg(arg_ptr,char*); - ++n; - } - if (!flag_width) width=1; - while (width && *str) - { - if (!flag_discard) *(s++)=*(str); - ++str; - --width; - } - break; - - case 's': - if (!flag_discard) - { - s=(char *)va_arg(arg_ptr,char*); - ++n; - } - if (*(str=skip_ws(str))) - { - while (width && *str && (!isspace(*str))) - { - if (!flag_discard) *(s++)=*(str); - ++str; - --width; - } - *s = '\0'; - } - break; - } - break; - - default: - if (prevfmt<format) { - while (prevfmt<format) { - if (*str!=*prevfmt) return n; - ++str; ++prevfmt; - } - } else - if (*(str++)!=ch) return n; - break; - } - } - return n; -} diff --git a/mdk-stage1/dietlibc/lib/wait.c b/mdk-stage1/dietlibc/lib/wait.c deleted file mode 100644 index 8459af18c..000000000 --- a/mdk-stage1/dietlibc/lib/wait.c +++ /dev/null @@ -1,6 +0,0 @@ -#include <sys/types.h> -#include <sys/wait.h> - -pid_t wait(int *status) { - return waitpid(-1,status,0); -} diff --git a/mdk-stage1/dietlibc/lib/wait3.c b/mdk-stage1/dietlibc/lib/wait3.c deleted file mode 100644 index 19e90740c..000000000 --- a/mdk-stage1/dietlibc/lib/wait3.c +++ /dev/null @@ -1,5 +0,0 @@ -#include <sys/wait.h> - -int wait3(int* status,int opts,struct rusage* rusage) { - return wait4(-1,status,opts,rusage); -} diff --git a/mdk-stage1/dietlibc/ppc/Makefile.add b/mdk-stage1/dietlibc/ppc/Makefile.add deleted file mode 100644 index b71031e05..000000000 --- a/mdk-stage1/dietlibc/ppc/Makefile.add +++ /dev/null @@ -1,3 +0,0 @@ - -CFLAGS+=-mpowerpc-gpopt -mpowerpc-gfxopt -Os -override VPATH=ppc:syscalls.s:lib diff --git a/mdk-stage1/dietlibc/ppc/__longjmp.S b/mdk-stage1/dietlibc/ppc/__longjmp.S deleted file mode 100644 index deada115e..000000000 --- a/mdk-stage1/dietlibc/ppc/__longjmp.S +++ /dev/null @@ -1,61 +0,0 @@ -#define _ASM -#define _SETJMP_H -#include <bits/setjmp.h> - - -#ifdef PIC -#define JUMPTARGET(name) name##@plt -#else -#define JUMPTARGET(name) name -#endif - -.global __longjmp -.type __longjmp,@function -.align 2 -__longjmp: - lwz 1,(JB_GPR1*4)(3) - lwz 2,(JB_GPR2*4)(3) - lwz 0,(JB_LR*4)(3) - lwz 14,((JB_GPRS+0)*4)(3) - lfd 14,((JB_FPRS+0*2)*4)(3) - lwz 15,((JB_GPRS+1)*4)(3) - lfd 15,((JB_FPRS+1*2)*4)(3) - lwz 16,((JB_GPRS+2)*4)(3) - lfd 16,((JB_FPRS+2*2)*4)(3) - lwz 17,((JB_GPRS+3)*4)(3) - lfd 17,((JB_FPRS+3*2)*4)(3) - lwz 18,((JB_GPRS+4)*4)(3) - lfd 18,((JB_FPRS+4*2)*4)(3) - lwz 19,((JB_GPRS+5)*4)(3) - lfd 19,((JB_FPRS+5*2)*4)(3) - lwz 20,((JB_GPRS+6)*4)(3) - lfd 20,((JB_FPRS+6*2)*4)(3) - mtlr 0 - lwz 21,((JB_GPRS+7)*4)(3) - lfd 21,((JB_FPRS+7*2)*4)(3) - lwz 22,((JB_GPRS+8)*4)(3) - lfd 22,((JB_FPRS+8*2)*4)(3) - lwz 0,(JB_CR*4)(3) - lwz 23,((JB_GPRS+9)*4)(3) - lfd 23,((JB_FPRS+9*2)*4)(3) - lwz 24,((JB_GPRS+10)*4)(3) - lfd 24,((JB_FPRS+10*2)*4)(3) - lwz 25,((JB_GPRS+11)*4)(3) - lfd 25,((JB_FPRS+11*2)*4)(3) - mtcrf 0xFF,0 - lwz 26,((JB_GPRS+12)*4)(3) - lfd 26,((JB_FPRS+12*2)*4)(3) - lwz 27,((JB_GPRS+13)*4)(3) - lfd 27,((JB_FPRS+13*2)*4)(3) - lwz 28,((JB_GPRS+14)*4)(3) - lfd 28,((JB_FPRS+14*2)*4)(3) - lwz 29,((JB_GPRS+15)*4)(3) - lfd 29,((JB_FPRS+15*2)*4)(3) - lwz 30,((JB_GPRS+16)*4)(3) - lfd 30,((JB_FPRS+16*2)*4)(3) - lwz 31,((JB_GPRS+17)*4)(3) - lfd 31,((JB_FPRS+17*2)*4)(3) - mr 3,4 - blr -.size __longjmp,.-__longjmp - diff --git a/mdk-stage1/dietlibc/ppc/mmap.c b/mdk-stage1/dietlibc/ppc/mmap.c deleted file mode 100644 index 25d2926b2..000000000 --- a/mdk-stage1/dietlibc/ppc/mmap.c +++ /dev/null @@ -1,37 +0,0 @@ -#include <linux/types.h> -#include <linux/unistd.h> - -int mmap(void*start,size_t length,int prot,int flags,int fd,off_t offset) { - unsigned long __sc_ret, __sc_err; - { - register unsigned long __sc_0 __asm__ ("r0"); - register unsigned long __sc_3 __asm__ ("r3"); - register unsigned long __sc_4 __asm__ ("r4"); - register unsigned long __sc_5 __asm__ ("r5"); - register unsigned long __sc_6 __asm__ ("r6"); - register unsigned long __sc_7 __asm__ ("r7"); - register unsigned long __sc_8 __asm__ ("r8"); - - __sc_3 = (unsigned long) (start); - __sc_4 = (unsigned long) (length); - __sc_5 = (unsigned long) (prot); - __sc_6 = (unsigned long) (flags); - __sc_7 = (unsigned long) (fd); - __sc_8 = (unsigned long) (offset); - __sc_0 = __NR_mmap; - __asm__ __volatile__ - ("sc \n\t" - "mfcr %1 " - : "=&r" (__sc_3), "=&r" (__sc_0) - : "0" (__sc_3), "1" (__sc_0), - "r" (__sc_4), - "r" (__sc_5), - "r" (__sc_6), - "r" (__sc_7), - "r" (__sc_8) - : __syscall_clobbers); - __sc_ret = __sc_3; - __sc_err = __sc_0; - } - __syscall_return (int); -} diff --git a/mdk-stage1/dietlibc/ppc/setjmp.S b/mdk-stage1/dietlibc/ppc/setjmp.S deleted file mode 100644 index 50fa2bdd4..000000000 --- a/mdk-stage1/dietlibc/ppc/setjmp.S +++ /dev/null @@ -1,56 +0,0 @@ -#include <setjmp.h> - -#ifdef PIC -#define JUMPTARGET(name) name##@plt -#else -#define JUMPTARGET(name) name -#endif - -.global __sigsetjmp -.type __sigsetjmp,@function -.align 2 -__sigsetjmp: - stw 1,(JB_GPR1*4)(3) - mflr 0 - stw 2,(JB_GPR2*4)(3) - stw 14,((JB_GPRS+0)*4)(3) - stfd 14,((JB_FPRS+0*2)*4)(3) - stw 0,(JB_LR*4)(3) - stw 15,((JB_GPRS+1)*4)(3) - stfd 15,((JB_FPRS+1*2)*4)(3) - mfcr 0 - stw 16,((JB_GPRS+2)*4)(3) - stfd 16,((JB_FPRS+2*2)*4)(3) - stw 0,(JB_CR*4)(3) - stw 17,((JB_GPRS+3)*4)(3) - stfd 17,((JB_FPRS+3*2)*4)(3) - stw 18,((JB_GPRS+4)*4)(3) - stfd 18,((JB_FPRS+4*2)*4)(3) - stw 19,((JB_GPRS+5)*4)(3) - stfd 19,((JB_FPRS+5*2)*4)(3) - stw 20,((JB_GPRS+6)*4)(3) - stfd 20,((JB_FPRS+6*2)*4)(3) - stw 21,((JB_GPRS+7)*4)(3) - stfd 21,((JB_FPRS+7*2)*4)(3) - stw 22,((JB_GPRS+8)*4)(3) - stfd 22,((JB_FPRS+8*2)*4)(3) - stw 23,((JB_GPRS+9)*4)(3) - stfd 23,((JB_FPRS+9*2)*4)(3) - stw 24,((JB_GPRS+10)*4)(3) - stfd 24,((JB_FPRS+10*2)*4)(3) - stw 25,((JB_GPRS+11)*4)(3) - stfd 25,((JB_FPRS+11*2)*4)(3) - stw 26,((JB_GPRS+12)*4)(3) - stfd 26,((JB_FPRS+12*2)*4)(3) - stw 27,((JB_GPRS+13)*4)(3) - stfd 27,((JB_FPRS+13*2)*4)(3) - stw 28,((JB_GPRS+14)*4)(3) - stfd 28,((JB_FPRS+14*2)*4)(3) - stw 29,((JB_GPRS+15)*4)(3) - stfd 29,((JB_FPRS+15*2)*4)(3) - stw 30,((JB_GPRS+16)*4)(3) - stfd 30,((JB_FPRS+16*2)*4)(3) - stw 31,((JB_GPRS+17)*4)(3) - stfd 31,((JB_FPRS+17*2)*4)(3) - b JUMPTARGET (__sigjmp_save) -.size __sigsetjmp,.-__sigsetjmp diff --git a/mdk-stage1/dietlibc/ppc/start.S b/mdk-stage1/dietlibc/ppc/start.S deleted file mode 100644 index c7afeecd2..000000000 --- a/mdk-stage1/dietlibc/ppc/start.S +++ /dev/null @@ -1,44 +0,0 @@ -#include "start.h" - -#ifdef __powerpc__ - -.text -.global _start -.type _start,@function -_start: - /* Save the stack pointer, in case we're statically linked under Linux. */ - mr 9,1 - /* Set up an initial stack frame, and clear the LR. */ - clrrwi 1,1,4 - li 0,0 - stwu 1,-16(1) - mtlr 0 - stw 0,0(1) - - /* r9 enthält den initialen Stackpointer. - argc = (r9) - argv = (r9+4) - envp = argv+(argc+1)*4 */ - - lwzu 3,0(9) /* argc */ - addi 4,9,4 /* argv */ - add 5,0,3 /* argc... */ - addi 5,5,1 /* argc+1...*/ - slwi 5,5,2 /* (argc+1)*4 */ - add 5,5,4 /* argv+(argc+1)*4 */ - - lis 6,environ@ha - stw 5,environ@l(6) - - bl main - b exit -.size _start,.-_start - - -/* Define a symbol for the first piece of initialized data. */ - .section ".data" -__data_start: - - -#endif - diff --git a/mdk-stage1/dietlibc/ppc/unified.S b/mdk-stage1/dietlibc/ppc/unified.S deleted file mode 100644 index d2b419f0b..000000000 --- a/mdk-stage1/dietlibc/ppc/unified.S +++ /dev/null @@ -1,21 +0,0 @@ -#include <dietfeatures.h> - -.text -.global __unified_syscall -__unified_syscall: - sc - mfcr 0 - andis. 9,0,4096 - mr 0,3 - beq .L1 -#ifdef WANT_THREAD_SAVE - bl __set_errno -#else - lis 9,errno@ha - stw 3,errno@l(9) -#endif - li 0,-1 -.L1: - mr 3,0 - blr - diff --git a/mdk-stage1/dietlibc/sparc/Makefile.add b/mdk-stage1/dietlibc/sparc/Makefile.add deleted file mode 100644 index a12a0446a..000000000 --- a/mdk-stage1/dietlibc/sparc/Makefile.add +++ /dev/null @@ -1,3 +0,0 @@ - -CFLAGS+=-mcpu=supersparc -Os -override VPATH=sparc:syscalls.s:lib diff --git a/mdk-stage1/dietlibc/sparc/__longjmp.S b/mdk-stage1/dietlibc/sparc/__longjmp.S deleted file mode 100644 index 81dd24af2..000000000 --- a/mdk-stage1/dietlibc/sparc/__longjmp.S +++ /dev/null @@ -1,66 +0,0 @@ -#define _ASM -#define _SETJMP_H -#include <bits/setjmp.h> - - -#define ENV(base,reg) [%base + (reg * 4)] -#define ST_FLUSH_WINDOWS 3 -#define RW_FP [%fp + 0x48] - -.text -.global __longjmp -__longjmp: - /* Store our arguments in global registers so we can still - use them while unwinding frames and their register windows. */ - - ld ENV(o0,JB_FP), %g3 /* Cache target FP in register %g3. */ - mov %o0, %g1 /* ENV in %g1 */ - orcc %o1, %g0, %g2 /* VAL in %g2 */ - be,a 0f /* Branch if zero; else skip delay slot. */ - mov 1, %g2 /* Delay slot only hit if zero: VAL = 1. */ -0: - xor %fp, %g3, %o0 - add %fp, 512, %o1 - andncc %o0, 4095, %o0 - bne .Lthread - cmp %o1, %g3 - bl .Lthread - - /* Now we will loop, unwinding the register windows up the stack - until the restored %fp value matches the target value in %g3. */ - -.Lloop: - cmp %fp, %g3 /* Have we reached the target frame? */ - bl,a .Lloop /* Loop while current fp is below target. */ - restore /* Unwind register window in delay slot. */ - be,a .Lfound /* Better have hit it exactly. */ - ld ENV(g1,JB_SP), %o0 /* Delay slot: extract target SP. */ - -.Lthread: - /* - * Do a "flush register windows trap". The trap handler in the - * kernel writes all the register windows to their stack slots, and - * marks them all as invalid (needing to be sucked up from the - * stack when used). This ensures that all information needed to - * unwind to these callers is in memory, not in the register - * windows. - */ - ta ST_FLUSH_WINDOWS - ld ENV(g1,JB_PC), %o7 /* Set return PC. */ - ld ENV(g1,JB_SP), %fp /* Set saved SP on restore below. */ - sub %fp, 64, %sp /* Allocate a register frame. */ - st %g3, RW_FP /* Set saved FP on restore below. */ - retl - restore %g2, 0, %o0 /* Restore values from above register frame. */ - -.Lfound: - /* We have unwound register windows so %fp matches the target. */ - mov %o0, %sp /* OK, install new SP. */ - -.Lsp_ok: - ld ENV(g1,JB_PC), %o0 /* Extract target return PC. */ - jmp %o0 + 8 /* Return there. */ - mov %g2, %o0 /* Delay slot: set return value. */ - -.size __longjmp, . - __longjmp - diff --git a/mdk-stage1/dietlibc/sparc/fork.S b/mdk-stage1/dietlibc/sparc/fork.S deleted file mode 100644 index 150839971..000000000 --- a/mdk-stage1/dietlibc/sparc/fork.S +++ /dev/null @@ -1,19 +0,0 @@ -#include "syscalls.h" - -.text -.global fork -fork: - mov 2, %g1 - ta 0x10 - bcc,a 1f - nop - - sethi %hi(errno), %o3 - or %o3, %lo(errno), %o3 - st %i0, [%o3] - - retl - mov -1, %o0 -1: dec %o1 - retl - and %o0, %o1, %o0 diff --git a/mdk-stage1/dietlibc/sparc/mmap.c b/mdk-stage1/dietlibc/sparc/mmap.c deleted file mode 100644 index 25ebdc24e..000000000 --- a/mdk-stage1/dietlibc/sparc/mmap.c +++ /dev/null @@ -1,43 +0,0 @@ -#include <linux/types.h> -#include <linux/unistd.h> - -#define __SYSCALL_STRING \ - "ta 0x10;" \ - "bcs 2f;" \ - " nop;" \ - "1:" \ - ".subsection 2;" \ - "2:" \ - "save %%sp, -192, %%sp;" \ - "call __errno_location;" \ - " nop;" \ - "st %%i0,[%%o0];" \ - "ba 1b;" \ - " restore %%g0, -1, %%o0;" \ - ".previous;" - -#define __SYSCALL_CLOBBERS "g2", "g3", "g4", "g5", "g7", \ - "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", \ - "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15", \ - "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23", \ - "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31", \ - "cc", "memory" - -#define inline_syscall6(name,arg1,arg2,arg3,arg4,arg5,arg6) \ -({ \ - register long __o0 __asm__ ("o0") = (long)(arg1); \ - register long __o1 __asm__ ("o1") = (long)(arg2); \ - register long __o2 __asm__ ("o2") = (long)(arg3); \ - register long __o3 __asm__ ("o3") = (long)(arg4); \ - register long __o4 __asm__ ("o4") = (long)(arg5); \ - register long __o5 __asm__ ("o5") = (long)(arg6); \ - register long __g1 __asm__ ("g1") = __NR_##name; \ - __asm__ (__SYSCALL_STRING : "=r" (__g1), "=r" (__o0) : \ - "0" (__g1), "1" (__o0), "r" (__o1), "r" (__o2), \ - "r" (__o3), "r" (__o4), "r" (__o5) : \ - __SYSCALL_CLOBBERS); \ - __o0; \ -}) -int mmap(void*start,size_t length,int prot,int flags,int fd,off_t offset) { - return inline_syscall6(mmap,start,length,prot,flags,fd,offset); -} diff --git a/mdk-stage1/dietlibc/sparc/pipe.S b/mdk-stage1/dietlibc/sparc/pipe.S deleted file mode 100644 index b8ad1d251..000000000 --- a/mdk-stage1/dietlibc/sparc/pipe.S +++ /dev/null @@ -1,20 +0,0 @@ -#include "syscalls.h" - -.text -.global pipe -pipe: - mov __NR_pipe, %g1 - ta 0x10 - bcc,a .Lnoerror - nop - save %sp, -96, %sp - call __errno_location - nop - st %i0, [ %o0 ] - ret - restore %g0, -1, %o0 -.Lnoerror: - st %o0, [ %o2 ] - st %o1, [ %o2 + 4 ] - retl - mov %g0, %o0 diff --git a/mdk-stage1/dietlibc/sparc/setjmp.S b/mdk-stage1/dietlibc/sparc/setjmp.S deleted file mode 100644 index be77af3c4..000000000 --- a/mdk-stage1/dietlibc/sparc/setjmp.S +++ /dev/null @@ -1,35 +0,0 @@ -#define _ASM -#define _SETJMP_H -#include <bits/setjmp.h> - -#define ST_FLUSH_WINDOWS 0x03 - -.section .rodata -.text -.globl __setjmp -__setjmp: - b 1f - set 0, %o1 -.size __setjmp,.-__setjmp - -.globl setjmp -setjmp: - set 1, %o1 -.size setjmp,.-setjmp - -.globl __sigsetjmp -__sigsetjmp: -1: - /* Save our PC, SP and FP. Save the signal mask if requested with - a tail-call for simplicity; it always returns zero. */ - ta ST_FLUSH_WINDOWS - - st %o7, [%o0 + (JB_PC * 4)] - st %sp, [%o0 + (JB_SP * 4)] - st %fp, [%o0 + (JB_FP * 4)] - - mov %o7, %g1 - call __sigjmp_save - mov %g1, %o7 -.size __sigsetjmp,.-__sigsetjmp - diff --git a/mdk-stage1/dietlibc/sparc/start.S b/mdk-stage1/dietlibc/sparc/start.S deleted file mode 100644 index e948aaddc..000000000 --- a/mdk-stage1/dietlibc/sparc/start.S +++ /dev/null @@ -1,46 +0,0 @@ -#include "start.h" - -#ifdef __sparc__ - .section ".text" - .align 4 - .global _start - .type _start,@function -_start: - - /* Terminate the stack frame, and reserve space for functions to - drop their arguments. */ - mov %g0, %fp - sub %sp, 6*4, %sp - - /* Extract the arguments and environment as encoded on the stack. The - argument info starts after one register window (16 words) past the SP. */ - ld [%sp+22*4], %o0 - add %sp, 23*4, %o1 - add %o1, %o0, %o2 - add %o2, %o0, %o2 - add %o2, %o0, %o2 - add %o2, %o0, %o2 - add %o2, 4, %o2 - - sethi %hi(environ), %o3 - or %o3, %lo(environ), %o3 - st %o2, [%o3] - - /* When starting a binary via the dynamic linker, %g1 contains the - address of the shared library termination function, which will be - registered with atexit(). If we are statically linked, this will - be NULL. */ - - /* Let libc do the rest of the initialization, and call main. */ - call main - mov %g1, %o5 - - b exit - mov %o0, %i0 - - /* Die very horribly if exit returns. */ - unimp - - .size _start, .-_start -#endif - diff --git a/mdk-stage1/dietlibc/sparc/udiv.S b/mdk-stage1/dietlibc/sparc/udiv.S deleted file mode 100644 index 87479e7bd..000000000 --- a/mdk-stage1/dietlibc/sparc/udiv.S +++ /dev/null @@ -1,363 +0,0 @@ -#ifdef __sparc__ - /* This file is generated from divrem.m4; DO NOT EDIT! */ -/* - * Division and remainder, from Appendix E of the Sparc Version 8 - * Architecture Manual, with fixes from Gordon Irlam. - */ - -/* - * Input: dividend and divisor in %o0 and %o1 respectively. - * - * m4 parameters: - * .udiv name of function to generate - * div div=div => %o0 / %o1; div=rem => %o0 % %o1 - * false false=true => signed; false=false => unsigned - * - * Algorithm parameters: - * N how many bits per iteration we try to get (4) - * WORDSIZE total number of bits (32) - * - * Derived constants: - * TOPBITS number of bits in the top decade of a number - * - * Important variables: - * Q the partial quotient under development (initially 0) - * R the remainder so far, initially the dividend - * ITER number of main division loop iterations required; - * equal to ceil(log2(quotient) / N). Note that this - * is the log base (2^N) of the quotient. - * V the current comparand, initially divisor*2^(ITER*N-1) - * - * Cost: - * Current estimate for non-large dividend is - * ceil(log2(quotient) / N) * (10 + 7N/2) + C - * A large dividend is one greater than 2^(31-TOPBITS) and takes a - * different path, as the upper bits of the quotient must be developed - * one bit at a time. - */ - - - -#define C_LABEL(name) name: - -#define C_SYMBOL_NAME(name) name - -#define ENTRY(name) \ - .global C_SYMBOL_NAME(name); \ - .align 4;\ - C_LABEL(name);\ - .type name,@function; - -#define LOC(name) . ## L ## name - -#define END(name) \ - .size name, . - name - -#define ST_DIV0 0x02 - -ENTRY(.udiv) - - ! Ready to divide. Compute size of quotient; scale comparand. - orcc %o1, %g0, %o5 - bne 1f - mov %o0, %o3 - - ! Divide by zero trap. If it returns, return 0 (about as - ! wrong as possible, but that is what SunOS does...). - ta ST_DIV0 - retl - clr %o0 - -1: - cmp %o3, %o5 ! if %o1 exceeds %o0, done - blu LOC(got_result) ! (and algorithm fails otherwise) - clr %o2 - sethi %hi(1 << (32 - 4 - 1)), %g1 - cmp %o3, %g1 - blu LOC(not_really_big) - clr %o4 - - ! Here the dividend is >= 2**(31-N) or so. We must be careful here, - ! as our usual N-at-a-shot divide step will cause overflow and havoc. - ! The number of bits in the result here is N*ITER+SC, where SC <= N. - ! Compute ITER in an unorthodox manner: know we need to shift V into - ! the top decade: so do not even bother to compare to R. - 1: - cmp %o5, %g1 - bgeu 3f - mov 1, %g2 - sll %o5, 4, %o5 - b 1b - add %o4, 1, %o4 - - ! Now compute %g2. - 2: addcc %o5, %o5, %o5 - bcc LOC(not_too_big) - add %g2, 1, %g2 - - ! We get here if the %o1 overflowed while shifting. - ! This means that %o3 has the high-order bit set. - ! Restore %o5 and subtract from %o3. - sll %g1, 4, %g1 ! high order bit - srl %o5, 1, %o5 ! rest of %o5 - add %o5, %g1, %o5 - b LOC(do_single_div) - sub %g2, 1, %g2 - - LOC(not_too_big): - 3: cmp %o5, %o3 - blu 2b - nop - be LOC(do_single_div) - nop - /* NB: these are commented out in the V8-Sparc manual as well */ - /* (I do not understand this) */ - ! %o5 > %o3: went too far: back up 1 step - ! srl %o5, 1, %o5 - ! dec %g2 - ! do single-bit divide steps - ! - ! We have to be careful here. We know that %o3 >= %o5, so we can do the - ! first divide step without thinking. BUT, the others are conditional, - ! and are only done if %o3 >= 0. Because both %o3 and %o5 may have the high- - ! order bit set in the first step, just falling into the regular - ! division loop will mess up the first time around. - ! So we unroll slightly... - LOC(do_single_div): - subcc %g2, 1, %g2 - bl LOC(end_regular_divide) - nop - sub %o3, %o5, %o3 - mov 1, %o2 - b LOC(end_single_divloop) - nop - LOC(single_divloop): - sll %o2, 1, %o2 - bl 1f - srl %o5, 1, %o5 - ! %o3 >= 0 - sub %o3, %o5, %o3 - b 2f - add %o2, 1, %o2 - 1: ! %o3 < 0 - add %o3, %o5, %o3 - sub %o2, 1, %o2 - 2: - LOC(end_single_divloop): - subcc %g2, 1, %g2 - bge LOC(single_divloop) - tst %o3 - b,a LOC(end_regular_divide) - -LOC(not_really_big): -1: - sll %o5, 4, %o5 - cmp %o5, %o3 - bleu 1b - addcc %o4, 1, %o4 - be LOC(got_result) - sub %o4, 1, %o4 - - tst %o3 ! set up for initial iteration -LOC(divloop): - sll %o2, 4, %o2 - ! depth 1, accumulated bits 0 - bl LOC(1.16) - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - ! depth 2, accumulated bits 1 - bl LOC(2.17) - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - ! depth 3, accumulated bits 3 - bl LOC(3.19) - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - ! depth 4, accumulated bits 7 - bl LOC(4.23) - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - b 9f - add %o2, (7*2+1), %o2 - -LOC(4.23): - ! remainder is negative - addcc %o3,%o5,%o3 - b 9f - add %o2, (7*2-1), %o2 - - -LOC(3.19): - ! remainder is negative - addcc %o3,%o5,%o3 - ! depth 4, accumulated bits 5 - bl LOC(4.21) - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - b 9f - add %o2, (5*2+1), %o2 - -LOC(4.21): - ! remainder is negative - addcc %o3,%o5,%o3 - b 9f - add %o2, (5*2-1), %o2 - - - -LOC(2.17): - ! remainder is negative - addcc %o3,%o5,%o3 - ! depth 3, accumulated bits 1 - bl LOC(3.17) - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - ! depth 4, accumulated bits 3 - bl LOC(4.19) - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - b 9f - add %o2, (3*2+1), %o2 - -LOC(4.19): - ! remainder is negative - addcc %o3,%o5,%o3 - b 9f - add %o2, (3*2-1), %o2 - - -LOC(3.17): - ! remainder is negative - addcc %o3,%o5,%o3 - ! depth 4, accumulated bits 1 - bl LOC(4.17) - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - b 9f - add %o2, (1*2+1), %o2 - -LOC(4.17): - ! remainder is negative - addcc %o3,%o5,%o3 - b 9f - add %o2, (1*2-1), %o2 - - - - -LOC(1.16): - ! remainder is negative - addcc %o3,%o5,%o3 - ! depth 2, accumulated bits -1 - bl LOC(2.15) - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - ! depth 3, accumulated bits -1 - bl LOC(3.15) - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - ! depth 4, accumulated bits -1 - bl LOC(4.15) - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - b 9f - add %o2, (-1*2+1), %o2 - -LOC(4.15): - ! remainder is negative - addcc %o3,%o5,%o3 - b 9f - add %o2, (-1*2-1), %o2 - - -LOC(3.15): - ! remainder is negative - addcc %o3,%o5,%o3 - ! depth 4, accumulated bits -3 - bl LOC(4.13) - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - b 9f - add %o2, (-3*2+1), %o2 - -LOC(4.13): - ! remainder is negative - addcc %o3,%o5,%o3 - b 9f - add %o2, (-3*2-1), %o2 - - - -LOC(2.15): - ! remainder is negative - addcc %o3,%o5,%o3 - ! depth 3, accumulated bits -3 - bl LOC(3.13) - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - ! depth 4, accumulated bits -5 - bl LOC(4.11) - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - b 9f - add %o2, (-5*2+1), %o2 - -LOC(4.11): - ! remainder is negative - addcc %o3,%o5,%o3 - b 9f - add %o2, (-5*2-1), %o2 - - -LOC(3.13): - ! remainder is negative - addcc %o3,%o5,%o3 - ! depth 4, accumulated bits -7 - bl LOC(4.9) - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - b 9f - add %o2, (-7*2+1), %o2 - -LOC(4.9): - ! remainder is negative - addcc %o3,%o5,%o3 - b 9f - add %o2, (-7*2-1), %o2 - - - - - 9: -LOC(end_regular_divide): - subcc %o4, 1, %o4 - bge LOC(divloop) - tst %o3 - bl,a LOC(got_result) - ! non-restoring fixup here (one instruction only!) - sub %o2, 1, %o2 - - -LOC(got_result): - - retl - mov %o2, %o0 - -END(.udiv) - -#endif diff --git a/mdk-stage1/dietlibc/sparc/umul.S b/mdk-stage1/dietlibc/sparc/umul.S deleted file mode 100644 index 15038ab2a..000000000 --- a/mdk-stage1/dietlibc/sparc/umul.S +++ /dev/null @@ -1,170 +0,0 @@ -#ifdef __sparc__ -/* - * Unsigned multiply. Returns %o0 * %o1 in %o1%o0 (i.e., %o1 holds the - * upper 32 bits of the 64-bit product). - * - * This code optimizes short (less than 13-bit) multiplies. Short - * multiplies require 25 instruction cycles, and long ones require - * 45 instruction cycles. - * - * On return, overflow has occurred (%o1 is not zero) if and only if - * the Z condition code is clear, allowing, e.g., the following: - * - * call .umul - * nop - * bnz overflow (or tnz) - */ - -#define C_LABEL(name) name: - -#define C_SYMBOL_NAME(name) name - -#define ENTRY(name) \ - .global C_SYMBOL_NAME(name); \ - .align 4;\ - C_LABEL(name);\ - .type name,@function; - -#define LOC(name) . ## L ## name - -#define END(name) \ - .size name, . - name - -ENTRY(.umul) - or %o0, %o1, %o4 - mov %o0, %y ! multiplier -> Y - andncc %o4, 0xfff, %g0 ! test bits 12..31 of *both* args - be LOC(mul_shortway) ! if zero, can do it the short way - andcc %g0, %g0, %o4 ! zero the partial product; clear N & V - - /* - * Long multiply. 32 steps, followed by a final shift step. - */ - mulscc %o4, %o1, %o4 ! 1 - mulscc %o4, %o1, %o4 ! 2 - mulscc %o4, %o1, %o4 ! 3 - mulscc %o4, %o1, %o4 ! 4 - mulscc %o4, %o1, %o4 ! 5 - mulscc %o4, %o1, %o4 ! 6 - mulscc %o4, %o1, %o4 ! 7 - mulscc %o4, %o1, %o4 ! 8 - mulscc %o4, %o1, %o4 ! 9 - mulscc %o4, %o1, %o4 ! 10 - mulscc %o4, %o1, %o4 ! 11 - mulscc %o4, %o1, %o4 ! 12 - mulscc %o4, %o1, %o4 ! 13 - mulscc %o4, %o1, %o4 ! 14 - mulscc %o4, %o1, %o4 ! 15 - mulscc %o4, %o1, %o4 ! 16 - mulscc %o4, %o1, %o4 ! 17 - mulscc %o4, %o1, %o4 ! 18 - mulscc %o4, %o1, %o4 ! 19 - mulscc %o4, %o1, %o4 ! 20 - mulscc %o4, %o1, %o4 ! 21 - mulscc %o4, %o1, %o4 ! 22 - mulscc %o4, %o1, %o4 ! 23 - mulscc %o4, %o1, %o4 ! 24 - mulscc %o4, %o1, %o4 ! 25 - mulscc %o4, %o1, %o4 ! 26 - mulscc %o4, %o1, %o4 ! 27 - mulscc %o4, %o1, %o4 ! 28 - mulscc %o4, %o1, %o4 ! 29 - mulscc %o4, %o1, %o4 ! 30 - mulscc %o4, %o1, %o4 ! 31 - mulscc %o4, %o1, %o4 ! 32 - mulscc %o4, %g0, %o4 ! final shift - - /* - * Normally, with the shift-and-add approach, if both numbers are - * positive you get the correct result. With 32-bit two's-complement - * numbers, -x is represented as - * - * x 32 - * ( 2 - ------ ) mod 2 * 2 - * 32 - * 2 - * - * (the `mod 2' subtracts 1 from 1.bbbb). To avoid lots of 2^32s, - * we can treat this as if the radix point were just to the left - * of the sign bit (multiply by 2^32), and get - * - * -x = (2 - x) mod 2 - * - * Then, ignoring the `mod 2's for convenience: - * - * x * y = xy - * -x * y = 2y - xy - * x * -y = 2x - xy - * -x * -y = 4 - 2x - 2y + xy - * - * For signed multiplies, we subtract (x << 32) from the partial - * product to fix this problem for negative multipliers (see mul.s). - * Because of the way the shift into the partial product is calculated - * (N xor V), this term is automatically removed for the multiplicand, - * so we don't have to adjust. - * - * But for unsigned multiplies, the high order bit wasn't a sign bit, - * and the correction is wrong. So for unsigned multiplies where the - * high order bit is one, we end up with xy - (y << 32). To fix it - * we add y << 32. - */ -#if 0 - tst %o1 - bl,a 1f ! if %o1 < 0 (high order bit = 1), - add %o4, %o0, %o4 ! %o4 += %o0 (add y to upper half) -1: rd %y, %o0 ! get lower half of product - retl - addcc %o4, %g0, %o1 ! put upper half in place and set Z for %o1==0 -#else - /* Faster code from tege@sics.se. */ - sra %o1, 31, %o2 ! make mask from sign bit - and %o0, %o2, %o2 ! %o2 = 0 or %o0, depending on sign of %o1 - rd %y, %o0 ! get lower half of product - retl - addcc %o4, %o2, %o1 ! add compensation and put upper half in place -#endif - -LOC(mul_shortway): - /* - * Short multiply. 12 steps, followed by a final shift step. - * The resulting bits are off by 12 and (32-12) = 20 bit positions, - * but there is no problem with %o0 being negative (unlike above), - * and overflow is impossible (the answer is at most 24 bits long). - */ - mulscc %o4, %o1, %o4 ! 1 - mulscc %o4, %o1, %o4 ! 2 - mulscc %o4, %o1, %o4 ! 3 - mulscc %o4, %o1, %o4 ! 4 - mulscc %o4, %o1, %o4 ! 5 - mulscc %o4, %o1, %o4 ! 6 - mulscc %o4, %o1, %o4 ! 7 - mulscc %o4, %o1, %o4 ! 8 - mulscc %o4, %o1, %o4 ! 9 - mulscc %o4, %o1, %o4 ! 10 - mulscc %o4, %o1, %o4 ! 11 - mulscc %o4, %o1, %o4 ! 12 - mulscc %o4, %g0, %o4 ! final shift - - /* - * %o4 has 20 of the bits that should be in the result; %y has - * the bottom 12 (as %y's top 12). That is: - * - * %o4 %y - * +----------------+----------------+ - * | -12- | -20- | -12- | -20- | - * +------(---------+------)---------+ - * -----result----- - * - * The 12 bits of %o4 left of the `result' area are all zero; - * in fact, all top 20 bits of %o4 are zero. - */ - - rd %y, %o5 - sll %o4, 12, %o0 ! shift middle bits left 12 - srl %o5, 20, %o5 ! shift low bits right 20 - or %o5, %o0, %o0 - retl - addcc %g0, %g0, %o1 ! %o1 = zero, and set Z - -END(.umul) -#endif diff --git a/mdk-stage1/dietlibc/sparc/unified.S b/mdk-stage1/dietlibc/sparc/unified.S deleted file mode 100644 index 53b1612a9..000000000 --- a/mdk-stage1/dietlibc/sparc/unified.S +++ /dev/null @@ -1,28 +0,0 @@ -#include <dietfeatures.h> - -.text -.global __unified_syscall -__unified_syscall: - ta 0x10 - - bcc 1f - save %sp, -104, %sp - - neg %i0, %i0 -1: - add %i0, 0xff, %l2 - cmp %l2, 0xfe - bgu 2f - neg %i0, %l3 -#ifdef WANT_THREAD_SAVE - call __errno_location - nop -#else - sethi %hi(errno), %o0 - or %o0, %lo(errno), %o0 -#endif - st %l3, [ %o0 ] - mov -1, %o0 -2: - ret - restore diff --git a/mdk-stage1/dietlibc/sparc/urem.S b/mdk-stage1/dietlibc/sparc/urem.S deleted file mode 100644 index 943cb7873..000000000 --- a/mdk-stage1/dietlibc/sparc/urem.S +++ /dev/null @@ -1,362 +0,0 @@ -#ifdef __sparc__ - /* This file is generated from divrem.m4; DO NOT EDIT! */ -/* - * Division and remainder, from Appendix E of the Sparc Version 8 - * Architecture Manual, with fixes from Gordon Irlam. - */ - -/* - * Input: dividend and divisor in %o0 and %o1 respectively. - * - * m4 parameters: - * .urem name of function to generate - * rem rem=div => %o0 / %o1; rem=rem => %o0 % %o1 - * false false=true => signed; false=false => unsigned - * - * Algorithm parameters: - * N how many bits per iteration we try to get (4) - * WORDSIZE total number of bits (32) - * - * Derived constants: - * TOPBITS number of bits in the top decade of a number - * - * Important variables: - * Q the partial quotient under development (initially 0) - * R the remainder so far, initially the dividend - * ITER number of main division loop iterations required; - * equal to ceil(log2(quotient) / N). Note that this - * is the log base (2^N) of the quotient. - * V the current comparand, initially divisor*2^(ITER*N-1) - * - * Cost: - * Current estimate for non-large dividend is - * ceil(log2(quotient) / N) * (10 + 7N/2) + C - * A large dividend is one greater than 2^(31-TOPBITS) and takes a - * different path, as the upper bits of the quotient must be developed - * one bit at a time. - */ - - - -#define C_LABEL(name) name: - -#define C_SYMBOL_NAME(name) name - -#define ENTRY(name) \ - .global C_SYMBOL_NAME(name); \ - .align 4;\ - C_LABEL(name);\ - .type name,@function; - -#define LOC(name) . ## L ## name - -#define END(name) \ - .size name, . - name - -#define ST_DIV0 0x02 - -ENTRY(.urem) - - ! Ready to divide. Compute size of quotient; scale comparand. - orcc %o1, %g0, %o5 - bne 1f - mov %o0, %o3 - - ! Divide by zero trap. If it returns, return 0 (about as - ! wrong as possible, but that is what SunOS does...). - ta ST_DIV0 - retl - clr %o0 - -1: - cmp %o3, %o5 ! if %o1 exceeds %o0, done - blu LOC(got_result) ! (and algorithm fails otherwise) - clr %o2 - sethi %hi(1 << (32 - 4 - 1)), %g1 - cmp %o3, %g1 - blu LOC(not_really_big) - clr %o4 - - ! Here the dividend is >= 2**(31-N) or so. We must be careful here, - ! as our usual N-at-a-shot divide step will cause overflow and havoc. - ! The number of bits in the result here is N*ITER+SC, where SC <= N. - ! Compute ITER in an unorthodox manner: know we need to shift V into - ! the top decade: so do not even bother to compare to R. - 1: - cmp %o5, %g1 - bgeu 3f - mov 1, %g2 - sll %o5, 4, %o5 - b 1b - add %o4, 1, %o4 - - ! Now compute %g2. - 2: addcc %o5, %o5, %o5 - bcc LOC(not_too_big) - add %g2, 1, %g2 - - ! We get here if the %o1 overflowed while shifting. - ! This means that %o3 has the high-order bit set. - ! Restore %o5 and subtract from %o3. - sll %g1, 4, %g1 ! high order bit - srl %o5, 1, %o5 ! rest of %o5 - add %o5, %g1, %o5 - b LOC(do_single_div) - sub %g2, 1, %g2 - - LOC(not_too_big): - 3: cmp %o5, %o3 - blu 2b - nop - be LOC(do_single_div) - nop - /* NB: these are commented out in the V8-Sparc manual as well */ - /* (I do not understand this) */ - ! %o5 > %o3: went too far: back up 1 step - ! srl %o5, 1, %o5 - ! dec %g2 - ! do single-bit divide steps - ! - ! We have to be careful here. We know that %o3 >= %o5, so we can do the - ! first divide step without thinking. BUT, the others are conditional, - ! and are only done if %o3 >= 0. Because both %o3 and %o5 may have the high- - ! order bit set in the first step, just falling into the regular - ! division loop will mess up the first time around. - ! So we unroll slightly... - LOC(do_single_div): - subcc %g2, 1, %g2 - bl LOC(end_regular_divide) - nop - sub %o3, %o5, %o3 - mov 1, %o2 - b LOC(end_single_divloop) - nop - LOC(single_divloop): - sll %o2, 1, %o2 - bl 1f - srl %o5, 1, %o5 - ! %o3 >= 0 - sub %o3, %o5, %o3 - b 2f - add %o2, 1, %o2 - 1: ! %o3 < 0 - add %o3, %o5, %o3 - sub %o2, 1, %o2 - 2: - LOC(end_single_divloop): - subcc %g2, 1, %g2 - bge LOC(single_divloop) - tst %o3 - b,a LOC(end_regular_divide) - -LOC(not_really_big): -1: - sll %o5, 4, %o5 - cmp %o5, %o3 - bleu 1b - addcc %o4, 1, %o4 - be LOC(got_result) - sub %o4, 1, %o4 - - tst %o3 ! set up for initial iteration -LOC(divloop): - sll %o2, 4, %o2 - ! depth 1, accumulated bits 0 - bl LOC(1.16) - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - ! depth 2, accumulated bits 1 - bl LOC(2.17) - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - ! depth 3, accumulated bits 3 - bl LOC(3.19) - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - ! depth 4, accumulated bits 7 - bl LOC(4.23) - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - b 9f - add %o2, (7*2+1), %o2 - -LOC(4.23): - ! remainder is negative - addcc %o3,%o5,%o3 - b 9f - add %o2, (7*2-1), %o2 - - -LOC(3.19): - ! remainder is negative - addcc %o3,%o5,%o3 - ! depth 4, accumulated bits 5 - bl LOC(4.21) - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - b 9f - add %o2, (5*2+1), %o2 - -LOC(4.21): - ! remainder is negative - addcc %o3,%o5,%o3 - b 9f - add %o2, (5*2-1), %o2 - - - -LOC(2.17): - ! remainder is negative - addcc %o3,%o5,%o3 - ! depth 3, accumulated bits 1 - bl LOC(3.17) - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - ! depth 4, accumulated bits 3 - bl LOC(4.19) - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - b 9f - add %o2, (3*2+1), %o2 - -LOC(4.19): - ! remainder is negative - addcc %o3,%o5,%o3 - b 9f - add %o2, (3*2-1), %o2 - - -LOC(3.17): - ! remainder is negative - addcc %o3,%o5,%o3 - ! depth 4, accumulated bits 1 - bl LOC(4.17) - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - b 9f - add %o2, (1*2+1), %o2 - -LOC(4.17): - ! remainder is negative - addcc %o3,%o5,%o3 - b 9f - add %o2, (1*2-1), %o2 - - - - -LOC(1.16): - ! remainder is negative - addcc %o3,%o5,%o3 - ! depth 2, accumulated bits -1 - bl LOC(2.15) - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - ! depth 3, accumulated bits -1 - bl LOC(3.15) - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - ! depth 4, accumulated bits -1 - bl LOC(4.15) - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - b 9f - add %o2, (-1*2+1), %o2 - -LOC(4.15): - ! remainder is negative - addcc %o3,%o5,%o3 - b 9f - add %o2, (-1*2-1), %o2 - - -LOC(3.15): - ! remainder is negative - addcc %o3,%o5,%o3 - ! depth 4, accumulated bits -3 - bl LOC(4.13) - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - b 9f - add %o2, (-3*2+1), %o2 - -LOC(4.13): - ! remainder is negative - addcc %o3,%o5,%o3 - b 9f - add %o2, (-3*2-1), %o2 - - - -LOC(2.15): - ! remainder is negative - addcc %o3,%o5,%o3 - ! depth 3, accumulated bits -3 - bl LOC(3.13) - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - ! depth 4, accumulated bits -5 - bl LOC(4.11) - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - b 9f - add %o2, (-5*2+1), %o2 - -LOC(4.11): - ! remainder is negative - addcc %o3,%o5,%o3 - b 9f - add %o2, (-5*2-1), %o2 - - -LOC(3.13): - ! remainder is negative - addcc %o3,%o5,%o3 - ! depth 4, accumulated bits -7 - bl LOC(4.9) - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - b 9f - add %o2, (-7*2+1), %o2 - -LOC(4.9): - ! remainder is negative - addcc %o3,%o5,%o3 - b 9f - add %o2, (-7*2-1), %o2 - - - - - 9: -LOC(end_regular_divide): - subcc %o4, 1, %o4 - bge LOC(divloop) - tst %o3 - bl,a LOC(got_result) - ! non-restoring fixup here (one instruction only!) - add %o3, %o1, %o3 - - -LOC(got_result): - - retl - mov %o3, %o0 - -END(.urem) -#endif diff --git a/mdk-stage1/dietlibc/start.h b/mdk-stage1/dietlibc/start.h deleted file mode 100644 index 5983b0462..000000000 --- a/mdk-stage1/dietlibc/start.h +++ /dev/null @@ -1,10 +0,0 @@ -.section ".bss" - .align 8 - - .weak errno -errno: - .long 0 - - .weak environ -environ: - .long 0 diff --git a/mdk-stage1/dietlibc/syscalls.h b/mdk-stage1/dietlibc/syscalls.h deleted file mode 100644 index 5e9782ee9..000000000 --- a/mdk-stage1/dietlibc/syscalls.h +++ /dev/null @@ -1,82 +0,0 @@ -#ifdef __ASSEMBLER__ - -#include <asm/unistd.h> - -#else - -#include <linux/unistd.h> - -#endif - -#ifdef __i386__ - -#define syscall(name,sym) \ -.text; \ -.global sym; \ -sym: \ - movb $__NR_##name,%al; \ - jmp __unified_syscall - -#endif - -#ifdef __sparc__ - -#define syscall(name,sym) \ -.text; \ -.global sym; \ -sym: \ - b __unified_syscall; \ - mov __NR_##name, %g1 - -#endif - -#ifdef __powerpc__ - -#define syscall(name,sym) \ -.text; \ -.global sym; \ -sym: \ - li 0,__NR_##name; \ - b __unified_syscall - -#endif - - -#ifdef __mips__ - -#define syscall(name,sym) \ -.text; \ -.global sym; \ -.ent sym; \ -sym: \ - li $2,__NR_##name; \ - la $25,__unified_syscall; \ - jr $25; \ -.end sym - -#endif - -#ifdef __arm__ - -#define syscall(name,sym) \ -.text; \ -.global sym; \ -sym: \ - swi __NR_##name; \ - b __unified_syscall - -#endif - - -#ifdef __alpha__ - -#define syscall(name,sym) \ -.text ; \ -.align 2 ; \ -.global sym ; \ -.type sym,@function ; \ -sym: ; \ - lda $0, __NR_##name($31) ; \ - br __unified_syscall - -#endif diff --git a/mdk-stage1/dietlibc/syscalls.s/__pread.S b/mdk-stage1/dietlibc/syscalls.s/__pread.S deleted file mode 100644 index 4603a1009..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/__pread.S +++ /dev/null @@ -1,4 +0,0 @@ -#include "syscalls.h" - -.weak __libc_pread -syscall(pread,__pread) diff --git a/mdk-stage1/dietlibc/syscalls.s/_llseek.S b/mdk-stage1/dietlibc/syscalls.s/_llseek.S deleted file mode 100644 index 3e240d822..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/_llseek.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(_llseek,_llseek) diff --git a/mdk-stage1/dietlibc/syscalls.s/access.S b/mdk-stage1/dietlibc/syscalls.s/access.S deleted file mode 100644 index d1edafd8c..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/access.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(access,access) diff --git a/mdk-stage1/dietlibc/syscalls.s/brk.S b/mdk-stage1/dietlibc/syscalls.s/brk.S deleted file mode 100644 index 6e21810bd..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/brk.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(brk,__diet_brk) diff --git a/mdk-stage1/dietlibc/syscalls.s/chdir.S b/mdk-stage1/dietlibc/syscalls.s/chdir.S deleted file mode 100644 index 204f3dd6c..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/chdir.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(chdir,chdir) diff --git a/mdk-stage1/dietlibc/syscalls.s/chmod.S b/mdk-stage1/dietlibc/syscalls.s/chmod.S deleted file mode 100644 index c1b85f5a4..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/chmod.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(chmod,chmod) diff --git a/mdk-stage1/dietlibc/syscalls.s/chown.S b/mdk-stage1/dietlibc/syscalls.s/chown.S deleted file mode 100644 index daac3bf13..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/chown.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(chown,chown) diff --git a/mdk-stage1/dietlibc/syscalls.s/chroot.S b/mdk-stage1/dietlibc/syscalls.s/chroot.S deleted file mode 100644 index 65de1e473..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/chroot.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(chroot,chroot) diff --git a/mdk-stage1/dietlibc/syscalls.s/close.S b/mdk-stage1/dietlibc/syscalls.s/close.S deleted file mode 100644 index 0f72ca1ae..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/close.S +++ /dev/null @@ -1,5 +0,0 @@ -#include "syscalls.h" - -.weak __libc_close -__libc_close: -syscall(close,close) diff --git a/mdk-stage1/dietlibc/syscalls.s/dup.S b/mdk-stage1/dietlibc/syscalls.s/dup.S deleted file mode 100644 index b2977fd43..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/dup.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(dup,dup) diff --git a/mdk-stage1/dietlibc/syscalls.s/dup2.S b/mdk-stage1/dietlibc/syscalls.s/dup2.S deleted file mode 100644 index 774bfbfe7..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/dup2.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(dup2,dup2) diff --git a/mdk-stage1/dietlibc/syscalls.s/execve.S b/mdk-stage1/dietlibc/syscalls.s/execve.S deleted file mode 100644 index ff952ae7d..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/execve.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(execve,execve) diff --git a/mdk-stage1/dietlibc/syscalls.s/exit.S b/mdk-stage1/dietlibc/syscalls.s/exit.S deleted file mode 100644 index 89d3145e9..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/exit.S +++ /dev/null @@ -1,6 +0,0 @@ -#include "syscalls.h" - -.text -.weak exit -exit: -syscall(exit,_exit) diff --git a/mdk-stage1/dietlibc/syscalls.s/fchdir.S b/mdk-stage1/dietlibc/syscalls.s/fchdir.S deleted file mode 100644 index 0aeaf610b..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/fchdir.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(fchdir,fchdir) diff --git a/mdk-stage1/dietlibc/syscalls.s/fchmod.S b/mdk-stage1/dietlibc/syscalls.s/fchmod.S deleted file mode 100644 index 30bc2e210..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/fchmod.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(fchmod,fchmod) diff --git a/mdk-stage1/dietlibc/syscalls.s/fchown.S b/mdk-stage1/dietlibc/syscalls.s/fchown.S deleted file mode 100644 index bc2a296ea..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/fchown.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(fchown,fchown) diff --git a/mdk-stage1/dietlibc/syscalls.s/fcntl.S b/mdk-stage1/dietlibc/syscalls.s/fcntl.S deleted file mode 100644 index 8516bc232..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/fcntl.S +++ /dev/null @@ -1,5 +0,0 @@ -#include "syscalls.h" - -.weak __libc_fcntl -__libc_fcntl: -syscall(fcntl,fcntl) diff --git a/mdk-stage1/dietlibc/syscalls.s/flock.S b/mdk-stage1/dietlibc/syscalls.s/flock.S deleted file mode 100644 index 7b4daeff7..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/flock.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(flock,flock) diff --git a/mdk-stage1/dietlibc/syscalls.s/fork.S b/mdk-stage1/dietlibc/syscalls.s/fork.S deleted file mode 100644 index 66732d27e..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/fork.S +++ /dev/null @@ -1,5 +0,0 @@ -#include "syscalls.h" - -.weak __libc_fork -__libc_fork: -syscall(fork,fork) diff --git a/mdk-stage1/dietlibc/syscalls.s/fstatfs.S b/mdk-stage1/dietlibc/syscalls.s/fstatfs.S deleted file mode 100644 index a23c8770c..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/fstatfs.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(fstatfs,fstatfs) diff --git a/mdk-stage1/dietlibc/syscalls.s/fsync.S b/mdk-stage1/dietlibc/syscalls.s/fsync.S deleted file mode 100644 index 624cbaf97..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/fsync.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(fsync,fsync) diff --git a/mdk-stage1/dietlibc/syscalls.s/ftruncate.S b/mdk-stage1/dietlibc/syscalls.s/ftruncate.S deleted file mode 100644 index dde57a615..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/ftruncate.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(ftruncate,ftruncate) diff --git a/mdk-stage1/dietlibc/syscalls.s/getcwd.S b/mdk-stage1/dietlibc/syscalls.s/getcwd.S deleted file mode 100644 index 8ff0a026e..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/getcwd.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(getcwd,getcwd) diff --git a/mdk-stage1/dietlibc/syscalls.s/getdents.S b/mdk-stage1/dietlibc/syscalls.s/getdents.S deleted file mode 100644 index f476e939d..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/getdents.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(getdents,getdents) diff --git a/mdk-stage1/dietlibc/syscalls.s/getdents64.S b/mdk-stage1/dietlibc/syscalls.s/getdents64.S deleted file mode 100644 index 16859addf..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/getdents64.S +++ /dev/null @@ -1,5 +0,0 @@ -#include "syscalls.h" - -#ifdef __NR_getdents64 -syscall(getdents64,getdents64) -#endif diff --git a/mdk-stage1/dietlibc/syscalls.s/getegid.S b/mdk-stage1/dietlibc/syscalls.s/getegid.S deleted file mode 100644 index 64843ee35..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/getegid.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(getegid,getegid) diff --git a/mdk-stage1/dietlibc/syscalls.s/geteuid.S b/mdk-stage1/dietlibc/syscalls.s/geteuid.S deleted file mode 100644 index 55dc00981..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/geteuid.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(geteuid,geteuid) diff --git a/mdk-stage1/dietlibc/syscalls.s/getgid.S b/mdk-stage1/dietlibc/syscalls.s/getgid.S deleted file mode 100644 index 39f092685..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/getgid.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(getgid,getgid) diff --git a/mdk-stage1/dietlibc/syscalls.s/getgroups.S b/mdk-stage1/dietlibc/syscalls.s/getgroups.S deleted file mode 100644 index b4c57689c..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/getgroups.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(getgroups,getgroups) diff --git a/mdk-stage1/dietlibc/syscalls.s/getpgid.S b/mdk-stage1/dietlibc/syscalls.s/getpgid.S deleted file mode 100644 index e568f060f..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/getpgid.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(getpgid,getpgid) diff --git a/mdk-stage1/dietlibc/syscalls.s/getpid.S b/mdk-stage1/dietlibc/syscalls.s/getpid.S deleted file mode 100644 index 093884785..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/getpid.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(getpid,getpid) diff --git a/mdk-stage1/dietlibc/syscalls.s/getppid.S b/mdk-stage1/dietlibc/syscalls.s/getppid.S deleted file mode 100644 index b05e64ae3..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/getppid.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(getppid,getppid) diff --git a/mdk-stage1/dietlibc/syscalls.s/getresgid.S b/mdk-stage1/dietlibc/syscalls.s/getresgid.S deleted file mode 100644 index a1d873c15..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/getresgid.S +++ /dev/null @@ -1,7 +0,0 @@ -#include "syscalls.h" - -#ifdef __NR_getresgid - -syscall(getresgid,getresgid) - -#endif diff --git a/mdk-stage1/dietlibc/syscalls.s/getresuid.S b/mdk-stage1/dietlibc/syscalls.s/getresuid.S deleted file mode 100644 index 62f6d764f..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/getresuid.S +++ /dev/null @@ -1,7 +0,0 @@ -#include "syscalls.h" - -#ifdef __getresuid - -syscall(getresuid) - -#endif diff --git a/mdk-stage1/dietlibc/syscalls.s/getrlimit.S b/mdk-stage1/dietlibc/syscalls.s/getrlimit.S deleted file mode 100644 index 1c63c0196..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/getrlimit.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(getrlimit,getrlimit) diff --git a/mdk-stage1/dietlibc/syscalls.s/getrusage.S b/mdk-stage1/dietlibc/syscalls.s/getrusage.S deleted file mode 100644 index 2972c4938..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/getrusage.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(getrusage,getrusage) diff --git a/mdk-stage1/dietlibc/syscalls.s/getsid.S b/mdk-stage1/dietlibc/syscalls.s/getsid.S deleted file mode 100644 index cf5cce9d5..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/getsid.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(getsid,getsid) diff --git a/mdk-stage1/dietlibc/syscalls.s/gettimeofday.S b/mdk-stage1/dietlibc/syscalls.s/gettimeofday.S deleted file mode 100644 index f364b787a..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/gettimeofday.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(gettimeofday,gettimeofday) diff --git a/mdk-stage1/dietlibc/syscalls.s/getuid.S b/mdk-stage1/dietlibc/syscalls.s/getuid.S deleted file mode 100644 index c53c25a7a..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/getuid.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(getuid,getuid) diff --git a/mdk-stage1/dietlibc/syscalls.s/ioctl.S b/mdk-stage1/dietlibc/syscalls.s/ioctl.S deleted file mode 100644 index 463d319dc..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/ioctl.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(ioctl,ioctl) diff --git a/mdk-stage1/dietlibc/syscalls.s/kill.S b/mdk-stage1/dietlibc/syscalls.s/kill.S deleted file mode 100644 index eb466dd33..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/kill.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(kill,kill) diff --git a/mdk-stage1/dietlibc/syscalls.s/lchown.S b/mdk-stage1/dietlibc/syscalls.s/lchown.S deleted file mode 100644 index 19dfefaef..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/lchown.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(lchown,lchown) diff --git a/mdk-stage1/dietlibc/syscalls.s/link.S b/mdk-stage1/dietlibc/syscalls.s/link.S deleted file mode 100644 index 8015d11c8..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/link.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(link,link) diff --git a/mdk-stage1/dietlibc/syscalls.s/lseek.S b/mdk-stage1/dietlibc/syscalls.s/lseek.S deleted file mode 100644 index 454827483..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/lseek.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(lseek,lseek) diff --git a/mdk-stage1/dietlibc/syscalls.s/mkdir.S b/mdk-stage1/dietlibc/syscalls.s/mkdir.S deleted file mode 100644 index d6214ee46..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/mkdir.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(mkdir,mkdir) diff --git a/mdk-stage1/dietlibc/syscalls.s/mknod.S b/mdk-stage1/dietlibc/syscalls.s/mknod.S deleted file mode 100644 index c1b2af12d..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/mknod.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(mknod,mknod) diff --git a/mdk-stage1/dietlibc/syscalls.s/mount.S b/mdk-stage1/dietlibc/syscalls.s/mount.S deleted file mode 100644 index 2fd845561..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/mount.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(mount,mount) diff --git a/mdk-stage1/dietlibc/syscalls.s/mprotect.S b/mdk-stage1/dietlibc/syscalls.s/mprotect.S deleted file mode 100644 index 73e9a8e17..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/mprotect.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(mprotect,mprotect) diff --git a/mdk-stage1/dietlibc/syscalls.s/mremap.S b/mdk-stage1/dietlibc/syscalls.s/mremap.S deleted file mode 100644 index 259ccec99..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/mremap.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(mremap,mremap) diff --git a/mdk-stage1/dietlibc/syscalls.s/munmap.S b/mdk-stage1/dietlibc/syscalls.s/munmap.S deleted file mode 100644 index b43a7b22d..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/munmap.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(munmap,munmap) diff --git a/mdk-stage1/dietlibc/syscalls.s/nanosleep.S b/mdk-stage1/dietlibc/syscalls.s/nanosleep.S deleted file mode 100644 index 7dce9956d..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/nanosleep.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(nanosleep,nanosleep) diff --git a/mdk-stage1/dietlibc/syscalls.s/open.S b/mdk-stage1/dietlibc/syscalls.s/open.S deleted file mode 100644 index 11cfecd4a..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/open.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(open,open) diff --git a/mdk-stage1/dietlibc/syscalls.s/pipe.S b/mdk-stage1/dietlibc/syscalls.s/pipe.S deleted file mode 100644 index 03994d055..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/pipe.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(pipe,pipe) diff --git a/mdk-stage1/dietlibc/syscalls.s/poll.S b/mdk-stage1/dietlibc/syscalls.s/poll.S deleted file mode 100644 index 359f55ddd..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/poll.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(poll,poll) diff --git a/mdk-stage1/dietlibc/syscalls.s/pwrite.S b/mdk-stage1/dietlibc/syscalls.s/pwrite.S deleted file mode 100644 index f52ead7b2..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/pwrite.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(pwrite,__pwrite) diff --git a/mdk-stage1/dietlibc/syscalls.s/read.S b/mdk-stage1/dietlibc/syscalls.s/read.S deleted file mode 100644 index 98ad98c17..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/read.S +++ /dev/null @@ -1,5 +0,0 @@ -#include "syscalls.h" - -.weak __libc_read -__libc_read: -syscall(read,read) diff --git a/mdk-stage1/dietlibc/syscalls.s/readlink.S b/mdk-stage1/dietlibc/syscalls.s/readlink.S deleted file mode 100644 index 850e77c4e..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/readlink.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(readlink,readlink) diff --git a/mdk-stage1/dietlibc/syscalls.s/rename.S b/mdk-stage1/dietlibc/syscalls.s/rename.S deleted file mode 100644 index f92f1dc5d..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/rename.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(rename,rename) diff --git a/mdk-stage1/dietlibc/syscalls.s/rmdir.S b/mdk-stage1/dietlibc/syscalls.s/rmdir.S deleted file mode 100644 index 341216e8c..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/rmdir.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(rmdir,rmdir) diff --git a/mdk-stage1/dietlibc/syscalls.s/select.S b/mdk-stage1/dietlibc/syscalls.s/select.S deleted file mode 100644 index 3353848ff..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/select.S +++ /dev/null @@ -1,4 +0,0 @@ -#include "syscalls.h" - -.text -syscall(select,select) diff --git a/mdk-stage1/dietlibc/syscalls.s/sendfile.S b/mdk-stage1/dietlibc/syscalls.s/sendfile.S deleted file mode 100644 index d56219dc6..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/sendfile.S +++ /dev/null @@ -1,5 +0,0 @@ -#include "syscalls.h" - -.weak __libc_sendfile -__libc_sendfile: -syscall(sendfile,sendfile) diff --git a/mdk-stage1/dietlibc/syscalls.s/setdomainname.S b/mdk-stage1/dietlibc/syscalls.s/setdomainname.S deleted file mode 100644 index eaade25da..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/setdomainname.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(setdomainname,setdomainname) diff --git a/mdk-stage1/dietlibc/syscalls.s/setgid.S b/mdk-stage1/dietlibc/syscalls.s/setgid.S deleted file mode 100644 index 69b18a9c9..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/setgid.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(setgid,setgid) diff --git a/mdk-stage1/dietlibc/syscalls.s/setgroups.S b/mdk-stage1/dietlibc/syscalls.s/setgroups.S deleted file mode 100644 index ce8e800a6..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/setgroups.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(setgroups,setgroups) diff --git a/mdk-stage1/dietlibc/syscalls.s/sethostname.S b/mdk-stage1/dietlibc/syscalls.s/sethostname.S deleted file mode 100644 index 7616d4848..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/sethostname.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(sethostname,sethostname) diff --git a/mdk-stage1/dietlibc/syscalls.s/setitimer.S b/mdk-stage1/dietlibc/syscalls.s/setitimer.S deleted file mode 100644 index bcb0623ba..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/setitimer.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(setitimer,setitimer) diff --git a/mdk-stage1/dietlibc/syscalls.s/setpgid.S b/mdk-stage1/dietlibc/syscalls.s/setpgid.S deleted file mode 100644 index e93db31dc..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/setpgid.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(setpgid,setpgid) diff --git a/mdk-stage1/dietlibc/syscalls.s/setregid.S b/mdk-stage1/dietlibc/syscalls.s/setregid.S deleted file mode 100644 index 3a7abbc28..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/setregid.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(setregid,setregid) diff --git a/mdk-stage1/dietlibc/syscalls.s/setresgid.S b/mdk-stage1/dietlibc/syscalls.s/setresgid.S deleted file mode 100644 index 64cbac94e..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/setresgid.S +++ /dev/null @@ -1,7 +0,0 @@ -#include "syscalls.h" - -#ifdef __setresgid - -syscall(setresgid) - -#endif diff --git a/mdk-stage1/dietlibc/syscalls.s/setresuid.S b/mdk-stage1/dietlibc/syscalls.s/setresuid.S deleted file mode 100644 index 20b6abee9..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/setresuid.S +++ /dev/null @@ -1,7 +0,0 @@ -#include "syscalls.h" - -#ifdef __setresuid - -syscall(setresuid) - -#endif diff --git a/mdk-stage1/dietlibc/syscalls.s/setreuid.S b/mdk-stage1/dietlibc/syscalls.s/setreuid.S deleted file mode 100644 index 33ca8deed..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/setreuid.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(setreuid,setreuid) diff --git a/mdk-stage1/dietlibc/syscalls.s/setrlimit.S b/mdk-stage1/dietlibc/syscalls.s/setrlimit.S deleted file mode 100644 index 605105658..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/setrlimit.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(setrlimit,setrlimit) diff --git a/mdk-stage1/dietlibc/syscalls.s/setsid.S b/mdk-stage1/dietlibc/syscalls.s/setsid.S deleted file mode 100644 index d1ef1c58e..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/setsid.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(setsid,setsid) diff --git a/mdk-stage1/dietlibc/syscalls.s/setuid.S b/mdk-stage1/dietlibc/syscalls.s/setuid.S deleted file mode 100644 index d20571cbf..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/setuid.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(setuid,setuid) diff --git a/mdk-stage1/dietlibc/syscalls.s/sigaction.S b/mdk-stage1/dietlibc/syscalls.s/sigaction.S deleted file mode 100644 index 32382870c..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/sigaction.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(sigaction,sigaction) diff --git a/mdk-stage1/dietlibc/syscalls.s/signal.S b/mdk-stage1/dietlibc/syscalls.s/signal.S deleted file mode 100644 index 86c4d5db0..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/signal.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(signal,signal) diff --git a/mdk-stage1/dietlibc/syscalls.s/sigpending.S b/mdk-stage1/dietlibc/syscalls.s/sigpending.S deleted file mode 100644 index 08715bef5..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/sigpending.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(sigpending,sigpending) diff --git a/mdk-stage1/dietlibc/syscalls.s/sigprocmask.S b/mdk-stage1/dietlibc/syscalls.s/sigprocmask.S deleted file mode 100644 index 8d6563b8f..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/sigprocmask.S +++ /dev/null @@ -1,6 +0,0 @@ -#include "syscalls.h" - -.text -.weak sigprocmask -sigprocmask: -syscall(sigprocmask,__sigprocmask) diff --git a/mdk-stage1/dietlibc/syscalls.s/sigsuspend.S b/mdk-stage1/dietlibc/syscalls.s/sigsuspend.S deleted file mode 100644 index c832c2b5d..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/sigsuspend.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(sigsuspend,sigsuspend) diff --git a/mdk-stage1/dietlibc/syscalls.s/socketcall.S b/mdk-stage1/dietlibc/syscalls.s/socketcall.S deleted file mode 100644 index 5837c049a..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/socketcall.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(socketcall,socketcall) diff --git a/mdk-stage1/dietlibc/syscalls.s/statfs.S b/mdk-stage1/dietlibc/syscalls.s/statfs.S deleted file mode 100644 index 7560f569d..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/statfs.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(statfs,statfs) diff --git a/mdk-stage1/dietlibc/syscalls.s/swapoff.S b/mdk-stage1/dietlibc/syscalls.s/swapoff.S deleted file mode 100644 index f75ec94e0..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/swapoff.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(swapoff,swapoff) diff --git a/mdk-stage1/dietlibc/syscalls.s/swapon.S b/mdk-stage1/dietlibc/syscalls.s/swapon.S deleted file mode 100644 index d10594168..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/swapon.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(swapon,swapon) diff --git a/mdk-stage1/dietlibc/syscalls.s/symlink.S b/mdk-stage1/dietlibc/syscalls.s/symlink.S deleted file mode 100644 index 07a6a7fdc..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/symlink.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(symlink,symlink) diff --git a/mdk-stage1/dietlibc/syscalls.s/sync.S b/mdk-stage1/dietlibc/syscalls.s/sync.S deleted file mode 100644 index 1ee021693..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/sync.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(sync,sync) diff --git a/mdk-stage1/dietlibc/syscalls.s/syslog.S b/mdk-stage1/dietlibc/syscalls.s/syslog.S deleted file mode 100644 index 55df87d53..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/syslog.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(syslog,syslog) diff --git a/mdk-stage1/dietlibc/syscalls.s/time.S b/mdk-stage1/dietlibc/syscalls.s/time.S deleted file mode 100644 index 26c79091c..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/time.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(time,time) diff --git a/mdk-stage1/dietlibc/syscalls.s/truncate.S b/mdk-stage1/dietlibc/syscalls.s/truncate.S deleted file mode 100644 index 7052bdcee..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/truncate.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(truncate,truncate) diff --git a/mdk-stage1/dietlibc/syscalls.s/umask.S b/mdk-stage1/dietlibc/syscalls.s/umask.S deleted file mode 100644 index 9f8ffeda6..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/umask.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(umask,umask) diff --git a/mdk-stage1/dietlibc/syscalls.s/umount.S b/mdk-stage1/dietlibc/syscalls.s/umount.S deleted file mode 100644 index 4a423d964..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/umount.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(umount,umount) diff --git a/mdk-stage1/dietlibc/syscalls.s/uname.S b/mdk-stage1/dietlibc/syscalls.s/uname.S deleted file mode 100644 index a460d2aa6..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/uname.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(uname,uname) diff --git a/mdk-stage1/dietlibc/syscalls.s/unlink.S b/mdk-stage1/dietlibc/syscalls.s/unlink.S deleted file mode 100644 index bd6713061..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/unlink.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(unlink,unlink) diff --git a/mdk-stage1/dietlibc/syscalls.s/utime.S b/mdk-stage1/dietlibc/syscalls.s/utime.S deleted file mode 100644 index 08cd22158..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/utime.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(utime,utime) diff --git a/mdk-stage1/dietlibc/syscalls.s/vhangup.S b/mdk-stage1/dietlibc/syscalls.s/vhangup.S deleted file mode 100644 index 6e2d1d343..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/vhangup.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(vhangup,vhangup) diff --git a/mdk-stage1/dietlibc/syscalls.s/wait4.S b/mdk-stage1/dietlibc/syscalls.s/wait4.S deleted file mode 100644 index ca6773569..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/wait4.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(wait4,wait4) diff --git a/mdk-stage1/dietlibc/syscalls.s/waitpid.S b/mdk-stage1/dietlibc/syscalls.s/waitpid.S deleted file mode 100644 index 569d8f68d..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/waitpid.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(waitpid,waitpid) diff --git a/mdk-stage1/dietlibc/syscalls.s/write.S b/mdk-stage1/dietlibc/syscalls.s/write.S deleted file mode 100644 index 409575be0..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/write.S +++ /dev/null @@ -1,5 +0,0 @@ -#include "syscalls.h" - -.weak __libc_write -__libc_write: -syscall(write,write) diff --git a/mdk-stage1/directory.c b/mdk-stage1/directory.c new file mode 100644 index 000000000..0538b55b6 --- /dev/null +++ b/mdk-stage1/directory.c @@ -0,0 +1,169 @@ +/* + * Guillaume Cottenceau (gc) + * Olivier Blin (oblin) + * + * Copyright 2000 Mandriva + * + * This software may be freely redistributed under the terms of the GNU + * public license. + * + * 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. + * + */ + +/* + * Portions from Erik Troan (ewt@redhat.com) + * + * Copyright 1996 Red Hat Software + * + */ + +#include <unistd.h> +#include <sys/mount.h> +#include <sys/stat.h> +#include <string.h> +#include <libgen.h> +#include "stage1.h" +#include "frontend.h" +#include "log.h" +#include "tools.h" +#include "utils.h" +#include "lomount.h" + +char * extract_list_directory(char * direct) +{ + char ** full = list_directory(direct); + char tmp[20000] = ""; + int i; + for (i=0; i<50 ; i++) { + if (!full || !*full) + break; + strcat(tmp, *full); + strcat(tmp, "\n"); + full++; + } + return strdup(tmp); +} + +static void choose_iso_in_directory(char *directory, char *location_full) +{ + char **file; + char *stage2_isos[100] = { "Use directory as a mirror tree", "-----" }; + int stage2_iso_number = 2; + + log_message("\"%s\" exists and is a directory, looking for iso files", directory); + + for (file = list_directory(directory); *file; file++) { + char isofile[500]; + char * loopdev = NULL; + + if (strstr(*file, ".iso") != *file + strlen(*file) - 4) + /* file doesn't end in .iso, skipping */ + continue; + + strcpy(isofile, directory); + strcat(isofile, "/"); + strcat(isofile, *file); + + if (lomount(isofile, LOOP_LOCATION, &loopdev, 0)) { + log_message("unable to mount iso file \"%s\", skipping", isofile); + continue; + } + symlink(LOOP_LOCATION_REL "/" ARCH, IMAGE_LOCATION); + + if (image_has_stage2()) { + log_message("stage2 installer found in ISO image \"%s\"", isofile); + stage2_isos[stage2_iso_number++] = strdup(*file); + } else { + log_message("ISO image \"%s\" doesn't contain stage2 installer", isofile); + } + + unlink(IMAGE_LOCATION); + umount(LOOP_LOCATION); + del_loop(loopdev); + } + + stage2_isos[stage2_iso_number] = NULL; + + if (stage2_iso_number > 2) { + enum return_type results; + do { + results = ask_from_list("Please choose the ISO image to be used to install the " + DISTRIB_NAME " Distribution.", + stage2_isos, file); + if (results == RETURN_BACK) { + return; + } else if (results == RETURN_OK) { + if (!strcmp(*file, stage2_isos[0])) { + /* use directory as a mirror tree */ + continue; + } else if (!strcmp(*file, stage2_isos[1])) { + /* the separator has been selected */ + results = RETURN_ERROR; + continue; + } else { + /* use selected ISO image */ + strcat(location_full, "/"); + strcat(location_full, *file); + log_message("installer will use ISO image \"%s\"", location_full); + } + } + } while (results == RETURN_ERROR); + } else { + log_message("no ISO image found in \"%s\" directory", location_full); + } +} + + +enum return_type try_with_directory(char *directory, char *method_live, char *method_iso) { + char location_full[500]; + char * loopdev = NULL; + struct stat statbuf; + enum return_type ret = RETURN_OK; + + unlink(IMAGE_LOCATION); + strcpy(location_full, directory); + + if (!stat(directory, &statbuf) && S_ISDIR(statbuf.st_mode)) { + choose_iso_in_directory(directory, location_full); + } + + loopdev = NULL; + if (!stat(location_full, &statbuf) && !S_ISDIR(statbuf.st_mode)) { + log_message("%s exists and is not a directory, assuming this is an ISO image", location_full); + if (lomount(location_full, LOOP_LOCATION, &loopdev, 0)) { + stg1_error_message("Could not mount file %s as an ISO image of the " DISTRIB_NAME " Distribution.", location_full); + return RETURN_ERROR; + } + symlink(LOOP_LOCATION_REL "/" ARCH, IMAGE_LOCATION); + add_to_env("ISOPATH", location_full); + add_to_env("METHOD", method_iso); + } else { + create_IMAGE_LOCATION(location_full); + add_to_env("METHOD", method_live); + } + + if (access(IMAGE_LOCATION "/" COMPRESSED_LOCATION_REL, R_OK)) { + stg1_error_message("I can't find the " DISTRIB_NAME " Distribution in the specified directory. " + "(I need the subdirectory " COMPRESSED_LOCATION_REL ")\n" + "Here's a short extract of the files in the directory:\n" + "%s", extract_list_directory(IMAGE_LOCATION)); + ret = RETURN_BACK; + } else if (may_load_compressed_image() != RETURN_OK) { + stg1_error_message("Could not load program into memory."); + ret = RETURN_ERROR; + } + + if (ret == RETURN_OK) + log_message("found the " DISTRIB_NAME " Installation, good news!"); + + if (!KEEP_MOUNTED || ret != RETURN_OK) { + /* in rescue mode, we don't need the media anymore */ + umount(LOOP_LOCATION); + del_loop(loopdev); + } + + return ret; +} diff --git a/mdk-stage1/directory.h b/mdk-stage1/directory.h new file mode 100644 index 000000000..2fdc81edb --- /dev/null +++ b/mdk-stage1/directory.h @@ -0,0 +1,29 @@ +/* + * Guillaume Cottenceau (gc) + * Olivier Blin (oblin) + * + * Copyright 2000 Mandriva + * + * This software may be freely redistributed under the terms of the GNU + * public license. + * + * 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. + * + */ + +/* + * Portions from Erik Troan (ewt@redhat.com) + * + * Copyright 1996 Red Hat Software + * + */ + +#ifndef _DIRECTORY_H_ +#define _DIRECTORY_H_ + +char * extract_list_directory(char * direct); +enum return_type try_with_directory(char *location_full, char *method_live, char *method_iso); + +#endif diff --git a/mdk-stage1/disk.c b/mdk-stage1/disk.c index 0a15f0e67..51a033639 100644 --- a/mdk-stage1/disk.c +++ b/mdk-stage1/disk.c @@ -1,7 +1,7 @@ /* - * Guillaume Cottenceau (gc@mandrakesoft.com) + * Guillaume Cottenceau (gc) * - * Copyright 2000 MandrakeSoft + * Copyright 2000 Mandriva * * This software may be freely redistributed under the terms of the GNU * public license. @@ -19,192 +19,200 @@ * */ +#define _GNU_SOURCE /* We want the non segfaulting my_dirname() -- See dirname(3) */ +#include <string.h> #include <stdlib.h> #include <unistd.h> #include <stdio.h> -#include <string.h> #include <sys/mount.h> #include <sys/stat.h> #include <fcntl.h> +#include <libgen.h> #include "stage1.h" #include "frontend.h" #include "modules.h" #include "probing.h" #include "log.h" +#include "tools.h" +#include "utils.h" #include "mount.h" -#include "lomount.h" #include "automatic.h" +#include "directory.h" +#include "partition.h" #include "disk.h" -static char * disk_extract_list_directory(char * direct) +static enum return_type try_automatic_with_partition(char *dev) { + enum return_type results; + int mounted; + char *dir= get_auto_value("directory"); + char location_full[500]; + strcpy(location_full, MEDIA_LOCATION); + if (dir) { + strcat(location_full, "/"); + strcat(location_full, dir); + } + wait_message("Trying to access " DISTRIB_NAME " disk (partition %s)", dev); + mounted = !try_mount(dev, MEDIA_LOCATION); + remove_wait_message(); + if (mounted) { + create_IMAGE_LOCATION(MEDIA_LOCATION); + if (image_has_stage2()) { + results = try_with_directory(MEDIA_LOCATION, "disk", "disk-iso"); + } else { + results = try_with_directory(location_full, "disk", "disk-iso"); + } + if (results == RETURN_OK) { + if (!KEEP_MOUNTED) + umount(MEDIA_LOCATION); + return RETURN_OK; + } + } + if (mounted) + umount(MEDIA_LOCATION); + return RETURN_ERROR; +} + +static enum return_type try_automatic_with_disk(char *disk, char *model) { + char * parts[50]; + char * parts_comments[50]; + enum return_type results; + char **dev; + char *part = get_auto_value("partition"); + wait_message("Trying to access " DISTRIB_NAME " disk (drive %s)", model); + if (list_partitions(disk, parts, parts_comments)) { + stg1_error_message("Could not read partitions information."); + return RETURN_ERROR; + } + remove_wait_message(); + dev = parts; + while (dev && *dev) { + if (part && strcmp(part, *dev) != 0) + goto next; + results = try_automatic_with_partition(*dev); + if (results == RETURN_OK) { + return RETURN_OK; + } + next: + dev++; + } + return RETURN_ERROR; +} + +static enum return_type try_automatic(char ** medias, char ** medias_models) { - char ** full = list_directory(direct); - char tmp[2000] = ""; - int i; - for (i=0; i<5 ; i++) { - if (!full || !*full) - break; - strcat(tmp, *full); - strcat(tmp, "\n"); - full++; + char ** model = medias_models; + char ** ptr = medias; + char *disk = get_auto_value("disk"); + while (ptr && *ptr) { + enum return_type results; + if (disk && strcmp(disk, *ptr) != 0) + goto next; + results = try_automatic_with_disk(*ptr, *model); + if (results == RETURN_OK) + return RETURN_OK; + next: + ptr++; + model++; } - return strdup(tmp); + return RETURN_ERROR; } static enum return_type try_with_device(char *dev_name) { - char * questions_location[] = { "Directory or ISO image", NULL }; + char * questions_location[] = { "Directory or ISO images directory or ISO image", NULL }; char * questions_location_auto[] = { "directory", NULL }; static char ** answers_location = NULL; - char device_fullname[50]; char location_full[500]; - char * disk_own_mount = "/tmp/hdimage"; - - int major, minor, blocks; - char name[100]; - - char buf[512]; - FILE * f; char * parts[50]; char * parts_comments[50]; - struct stat statbuf; - int i = 0; enum return_type results; char * choice; - - if (!(f = fopen("/proc/partitions", "rb")) || !fgets(buf, sizeof(buf), f) || !fgets(buf, sizeof(buf), f)) { - log_perror(dev_name); - error_message("Could not read partitions information."); - return RETURN_ERROR; - } - - while (fgets(buf, sizeof(buf), f)) { - sscanf(buf, " %d %d %d %s", &major, &minor, &blocks, name); - if ((strstr(name, dev_name) == name) && (blocks > 1) && (name[strlen(dev_name)] != '\0')) { - parts[i] = strdup(name); - parts_comments[i] = (char *) malloc(sizeof(char) * 25); - snprintf(parts_comments[i], 24, "size: %d Mbytes", blocks >> 10); - i++; - } - } - parts[i] = NULL; - fclose(f); - - if (parts[0] == NULL) { - error_message("No partitions found."); + + if (list_partitions(dev_name, parts, parts_comments)) { + stg1_error_message("Could not read partitions information."); return RETURN_ERROR; - } - - results = ask_from_list_comments_auto("Please choose the partition where is copied the " DISTRIB_NAME " Distribution.", - parts, parts_comments, &choice, "partition", parts); - if (results != RETURN_OK) - return results; - - strcpy(device_fullname, "/dev/"); - strcat(device_fullname, choice); - - if (my_mount(device_fullname, disk_own_mount, "ext2") == -1 && - my_mount(device_fullname, disk_own_mount, "vfat") == -1 && - my_mount(device_fullname, disk_own_mount, "reiserfs") == -1) { - error_message("I can't find a valid filesystem."); + } + + /* uglyness to allow auto starting with devfs */ + if (!IS_AUTOMATIC || streq((choice = get_auto_value("partition")), "")) { + if (parts[0] == NULL) { + stg1_error_message("No partition found."); + return RETURN_ERROR; + } + + results = ask_from_list_comments_auto("Please select the partition containing the copy of the " + DISTRIB_NAME " Distribution install source.", + parts, parts_comments, &choice, "partition", parts); + if (results != RETURN_OK) + return results; + } + + /* in testing mode, assume the partition is already mounted on MEDIA_LOCATION */ + if (!IS_TESTING && try_mount(choice, MEDIA_LOCATION)) { + stg1_error_message("I can't find a valid filesystem (tried: ext4, vfat, ntfs, reiserfs). " + "Make sure the partition has been cleanly unmounted."); return try_with_device(dev_name); } - if (ask_from_entries_auto("Please enter the directory (or ISO image file) containing the " DISTRIB_NAME " Distribution.", + ask_dir: + if (ask_from_entries_auto("Please enter the directory (or ISO image file) containing the " + DISTRIB_NAME " Distribution install source.", questions_location, &answers_location, 24, questions_location_auto, NULL) != RETURN_OK) { - umount(disk_own_mount); + umount(MEDIA_LOCATION); return try_with_device(dev_name); } - strcpy(location_full, disk_own_mount); + strcpy(location_full, MEDIA_LOCATION); strcat(location_full, "/"); strcat(location_full, answers_location[0]); if (access(location_full, R_OK)) { - error_message("Directory or ISO image file could not be found on partition.\n" - "Here's a short extract of the files in the root of the partition:\n" - "%s", disk_extract_list_directory(disk_own_mount)); - umount(disk_own_mount); - return try_with_device(dev_name); + char * path = strdup(answers_location[0]); + stg1_error_message("Directory or ISO image file could not be found on partition.\n" + "Here's a short extract of the files in the directory %s:\n" + "%s", my_dirname(path), extract_list_directory(my_dirname(location_full))); + free(path); + goto ask_dir; } - unlink(IMAGE_LOCATION); - - if (!stat(location_full, &statbuf) && !S_ISDIR(statbuf.st_mode)) { - log_message("%s exists and is not a directory, assuming this is an ISO image", location_full); - if (lomount(location_full, IMAGE_LOCATION)) { - error_message("Could not mount file %s as an ISO image of the " DISTRIB_NAME " Distribution.", answers_location[0]); - umount(disk_own_mount); - return try_with_device(dev_name); - } - } else - symlink(location_full, IMAGE_LOCATION); - - if (IS_SPECIAL_STAGE2 || ramdisk_possible()) { - /* RAMDISK install */ - if (access(IMAGE_LOCATION RAMDISK_LOCATION, R_OK)) { - error_message("I can't find the " DISTRIB_NAME " Distribution in the specified directory. " - "(I need the subdirectory " RAMDISK_LOCATION ")\n" - "Here's a short extract of the files in the directory:\n" - "%s", disk_extract_list_directory(IMAGE_LOCATION)); - umount(disk_own_mount); - return try_with_device(dev_name); - } - if (load_ramdisk() != RETURN_OK) { - error_message("Could not load program into memory."); - umount(disk_own_mount); - return try_with_device(dev_name); - } - } else { - /* LIVE install */ - char p; - if (access(IMAGE_LOCATION LIVE_LOCATION, R_OK)) { - error_message("I can't find the " DISTRIB_NAME " Distribution in the specified directory. " - "(I need the subdirectory " LIVE_LOCATION ")\n" - "Here's a short extract of the files in the directory:\n" - "%s", disk_extract_list_directory(IMAGE_LOCATION)); - umount(disk_own_mount); - return try_with_device(dev_name); - } - if (readlink(IMAGE_LOCATION LIVE_LOCATION "/usr/bin/runinstall2", &p, 1) != 1) { - error_message("The " DISTRIB_NAME " Distribution seems to be copied on a Windows partition. " - "You need more memory to perform an installation from a Windows partition. " - "Another solution if to copy the " DISTRIB_NAME " Distribution on a Linux partition."); - umount(disk_own_mount); - return try_with_device(dev_name); - } - log_message("found the " DISTRIB_NAME " Installation, good news!"); + results = try_with_directory(location_full, "disk", "disk-iso"); + if (results != RETURN_OK) { + goto ask_dir; } - if (IS_RESCUE) - umount(IMAGE_LOCATION); + if (!KEEP_MOUNTED) + umount(MEDIA_LOCATION); - method_name = strdup("disk"); return RETURN_OK; } enum return_type disk_prepare(void) { - char ** medias, ** ptr, ** medias_models; + char ** medias, ** medias_models; char * choice; - int i, count = 0; + int i; enum return_type results; + static int already_probed_ide_generic = 0; - my_insmod("sd_mod", ANY_DRIVER_TYPE, NULL); - - get_medias(DISK, &medias, &medias_models); + int count = get_disks(&medias, &medias_models); - ptr = medias; - while (ptr && *ptr) { - count++; - ptr++; - } + if (IS_AUTOMATIC) { + results = try_automatic(medias, medias_models); + if (results != RETURN_ERROR) + return results; + unset_automatic(); + } if (count == 0) { - error_message("No DISK drive found."); - i = ask_insmod(SCSI_ADAPTERS); + if (!already_probed_ide_generic) { + already_probed_ide_generic = 1; + my_modprobe("ide_generic", ANY_DRIVER_TYPE, NULL); + return disk_prepare(); + } + stg1_error_message("No DISK drive found."); + i = ask_insmod(MEDIA_ADAPTERS); if (i == RETURN_BACK) return RETURN_BACK; return disk_prepare(); @@ -212,24 +220,25 @@ enum return_type disk_prepare(void) if (count == 1) { results = try_with_device(*medias); - if (results == RETURN_OK) - return RETURN_OK; - i = ask_insmod(SCSI_ADAPTERS); + if (results != RETURN_ERROR) + return results; + i = ask_insmod(MEDIA_ADAPTERS); if (i == RETURN_BACK) return RETURN_BACK; return disk_prepare(); } - results = ask_from_list_comments_auto("Please choose the DISK drive on which you copied the " DISTRIB_NAME " Distribution.", + results = ask_from_list_comments_auto("Please select the disk containing the copy of the " + DISTRIB_NAME " Distribution install source.", medias, medias_models, &choice, "disk", medias); if (results != RETURN_OK) return results; results = try_with_device(choice); - if (results == RETURN_OK) - return RETURN_OK; - i = ask_insmod(SCSI_ADAPTERS); + if (results != RETURN_ERROR) + return results; + i = ask_insmod(MEDIA_ADAPTERS); if (i == RETURN_BACK) return RETURN_BACK; return disk_prepare(); diff --git a/mdk-stage1/disk.h b/mdk-stage1/disk.h index 54213cf68..8a6d1021f 100644 --- a/mdk-stage1/disk.h +++ b/mdk-stage1/disk.h @@ -1,7 +1,7 @@ /* - * Guillaume Cottenceau (gc@mandrakesoft.com) + * Guillaume Cottenceau (gc) * - * Copyright 2000 MandrakeSoft + * Copyright 2000 Mandriva * * This software may be freely redistributed under the terms of the GNU * public license. diff --git a/mdk-stage1/dns.c b/mdk-stage1/dns.c index ca750536a..f711758aa 100644 --- a/mdk-stage1/dns.c +++ b/mdk-stage1/dns.c @@ -1,7 +1,7 @@ /* - * Guillaume Cottenceau (gc@mandrakesoft.com) + * Guillaume Cottenceau (gc) * - * Copyright 2000 MandrakeSoft + * Copyright 2000 Mandriva * * This software may be freely redistributed under the terms of the GNU * public license. @@ -19,136 +19,72 @@ * */ -#include <alloca.h> -#include <sys/socket.h> -#include <netinet/in.h> -#include <resolv.h> -#include <arpa/nameser.h> -#include <arpa/inet.h> #include <stdlib.h> + +#include <unistd.h> #include <string.h> +#include <stdio.h> +#include <netdb.h> +#include <sys/socket.h> +#include <resolv.h> +#include "network.h" #include "log.h" #include "dns.h" -/* This is dumb, but glibc doesn't like to do hostname lookups w/o libc.so */ +int mygethostbyname(char * name, struct in_addr * addr) +{ + struct addrinfo hints, *res, *p; + int status; + char ipstr[INET6_ADDRSTRLEN]; -union dns_response { - HEADER hdr; - u_char buf[PACKETSZ]; -} ; + memset(&hints, 0, sizeof hints); + hints.ai_family = AF_INET; //AF_UNSPEC for both IPv4 & IPv6 + hints.ai_socktype = SOCK_STREAM; -static int do_query(char * query, int queryType, char ** domainName, struct in_addr * ipNum) -{ - int len, ancount, type; - u_char * data, * end; - char name[MAXDNAME]; - union dns_response response; - -#ifdef __sparc__ - /* from jj: */ - /* We have to wait till ethernet negotiation is done */ - _res.retry = 3; -#else - _res.retry = 2; -#endif - - - len = res_search(query, C_IN, queryType, (void *) &response, sizeof(response)); - if (len <= 0) + /* prevent from timeouts */ + if (_res.nscount == 0) return -1; - if (ntohs(response.hdr.rcode) != NOERROR) - return -1; + if ((status = getaddrinfo(name, NULL, &hints, &res)) != 0) { + log_message("getaddrinfo: %s\n", gai_strerror(status)); + return -1; + } - ancount = ntohs(response.hdr.ancount); - if (ancount < 1) - return -1; - - data = response.buf + sizeof(HEADER); - end = response.buf + len; - - /* skip the question */ - data += dn_skipname(data, end) + QFIXEDSZ; - - /* parse the answer(s) */ - while (--ancount >= 0 && data < end) { - - /* skip the domain name portion of the RR record */ - data += dn_skipname(data, end); - - /* get RR information */ - GETSHORT(type, data); - data += INT16SZ; /* skipp class */ - data += INT32SZ; /* skipp TTL */ - GETSHORT(len, data); - - if (type == T_PTR) { - /* we got a pointer */ - len = dn_expand(response.buf, end, data, name, sizeof(name)); - if (len <= 0) return -1; - if (queryType == T_PTR && domainName) { - /* we wanted a pointer */ - *domainName = malloc(strlen(name) + 1); - strcpy(*domainName, name); - return 0; - } - } else if (type == T_A) { - /* we got an address */ - if (queryType == T_A && ipNum) { - /* we wanted an address */ - memcpy(ipNum, data, sizeof(*ipNum)); - return 0; - } - } - - /* move ahead to next RR */ - data += len; - } - - return -1; -} + for (p = res;p != NULL; p = p->ai_next) { + void *tmp_addr; + + struct sockaddr_in *ipv = (struct sockaddr_in *)p->ai_addr; + tmp_addr = &(ipv->sin_addr); -char * mygethostbyaddr(char * ipnum) { - int rc; - char * result; - char * strbuf; - char * chptr; - char * splits[4]; - int i; - - _res.retry = 1; - - strbuf = alloca(strlen(ipnum) + 1); - strcpy(strbuf, ipnum); - - ipnum = alloca(strlen(strbuf) + 20); - - for (i = 0; i < 4; i++) { - chptr = strbuf; - while (*chptr && *chptr != '.') - chptr++; - *chptr = '\0'; - - if (chptr - strbuf > 3) return NULL; - splits[i] = strbuf; - strbuf = chptr + 1; + /* convert the IP to a string: */ + inet_ntop(p->ai_family, addr, ipstr, sizeof ipstr); + + memcpy(addr, tmp_addr, sizeof(*addr)); + log_message("is-at: %s\n", inet_ntoa(*addr)); } - - sprintf(ipnum, "%s.%s.%s.%s.in-addr.arpa", splits[3], splits[2], splits[1], splits[0]); - - rc = do_query(ipnum, T_PTR, &result, NULL); - - if (rc) - return NULL; - else - return result; + + freeaddrinfo(res); // free the linked list + return 0; } -int mygethostbyname(char * name, struct in_addr * addr) { - int rc = do_query(name, T_A, NULL, addr); - if (!rc) - log_message("%s is-at %s", name, inet_ntoa(*addr)); - return rc; +char * mygethostbyaddr(char * ipnum) +{ + struct sockaddr_in sa; + char hbuf[NI_MAXHOST]; + + /* prevent from timeouts */ + if (_res.nscount == 0) + return NULL; + + memset(&sa, 0, sizeof sa); + sa.sin_family = AF_INET; + + if (inet_pton(AF_INET, ipnum, &sa.sin_addr) != 1) + return NULL; + + if (getnameinfo((struct sockaddr*)&sa, sizeof(sa), hbuf, sizeof(hbuf), NULL, 0, 0 |NI_NAMEREQD) == 0) //NI_NUMERICHOST NI_NAMEREQD + return strdup(hbuf); + else return NULL; } diff --git a/mdk-stage1/dns.h b/mdk-stage1/dns.h index 97af9c08a..107ad1bce 100644 --- a/mdk-stage1/dns.h +++ b/mdk-stage1/dns.h @@ -1,7 +1,7 @@ /* - * Guillaume Cottenceau (gc@mandrakesoft.com) + * Guillaume Cottenceau (gc) * - * Copyright 2000 MandrakeSoft + * Copyright 2000 Mandriva * * This software may be freely redistributed under the terms of the GNU * public license. diff --git a/mdk-stage1/doc/HACKING b/mdk-stage1/doc/HACKING new file mode 100644 index 000000000..d196c8010 --- /dev/null +++ b/mdk-stage1/doc/HACKING @@ -0,0 +1,31 @@ +If you have to boot pretty often, you'll appreciate to speed the things up +a little. + +Here's what we use: the GRUB feature to boot from the network using the +DHCP protocol and the TFTP protocol. + +Here's the "menu.lst" to do that: + +-=-=-- + +timeout 0 + +title linux +dhcp +tftpserver 192.168.1.17 +kernel (nd)/tftpboot/gc/vmlinuz ramdisk=32000 vga=788 +initrd (nd)/tftpboot/gc/network.rdz + +-=-=-- + + +The option "tftpserver" is used to override the tftpserver address given +as an answer by the DHCP server. That way, you'll not need to bother your +system administrator to modify his dhcp server configuration. + +The directory /tftpboot seems to be the only one defaultly accepted by the +server, and its subdirs. + + +Of course, your GRUB needs to be compiled with the specific code for your +network card; use ./configure --help in the GRUB build dir for more infos. diff --git a/mdk-stage1/doc/README b/mdk-stage1/doc/README new file mode 100644 index 000000000..28b81b39e --- /dev/null +++ b/mdk-stage1/doc/README @@ -0,0 +1,185 @@ +------------------------------------------------------- +* Stage1 of the Mandriva Linux installation program * +------------------------------------------------------- + + +[ Author ] + + Guillaume Cottenceau (gc at mandriva.com) + + +[ Copyright ] + + Copyright 2000, 2001, 2002 Mandriva + + Partially inspired by Redhat stuff (install from 5.x and 7.x) copyright + Red Hat Software, and Debian stuff (boot-floppies) copyright by their + respective holders. + + +[ Licence ] + + 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 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + *** WARNING! *** + + This General Public License does not permit incorporating any part + of this program as a library into proprietary programs. + + +[ Online ] + + http://people.mandriva.com/~gc/html/stage1.html + + +[ Purpose ] + + This code will take the control of the computer after that Linux + kernel booted properly, and will try to run the main installer + (also known as "stage 2") from a series of different media + including harddrive, cdrom, and network. + + Use the source, Luke. + + + + + -=-=-- Okay, now, more details --=-=- + + + [ Installing Mandriva Linux ] + +Per default, just insert your Mandriva Linux Installation CD into your +CDROM tray, be sure your system BIOS is configured to boot on your CDROM, +and that's all. + +If you have multiple CDROM drives and the installer can't autodetect in +which CDROM drive is the disc, it may ask you to choose the correct drive, +between your CDROM drives. + +Also, if you want to install from an SCSI CDROM, the installer should +detect your SCSI adapter; if it fails you may have to select the right +driver and/or supply additional parameters. + + + [ Position of the problem ] + +The need for alternate installation methods come with more specific +hardware configuration and/or need for frequent updates of the Installer +software. + +All of these methods will require to use a special boot disk. The method +is to download it and then to copy it "physically" to a floppy with the +command: + +# dd if=<boot-disk> of=/dev/fd0 + +Our boot disks are called "cdrom.img", "network.img", etc. + + + [ Installation from CDROM ] + +The first situation you may encounter is an old BIOS which does not permit +you to boot from your CDROM drive. + +In that case, you'll need to use the "cdrom.img" image file. The steps are +the same as with CDROM boot, and everything should be automatic. + + + [ Installation from DISK ] + +If you like trying occasionnally our development version, the Cooker, one +of the easiest way is to grab a local copy of the Distribution on one of +your local hard drives, and to install from that location. + +At present time, you can install from IDE or SCSI drives, from Linux +(ext4), Windows (vfat) or Reiserfs partition. + +In that case, you'll need to use the "hd.img" image file. The dialogs will +ask you to choose the DISK drive to use to install from, then the +partition on which you copied the Distribution, then the location +(directory) in which you copied the Distribution. + + + [ Installation from NETWORK ] + +For convenience, you can also install from a NFS volume, from a FTP +server, or from a HTTP server. NFS installs are maybe the fastest +and most convenient possible, so if you need to do frequent and/or +multiple installs, you may like this option. + +In that case, you'll need to use the "network.img" image file. If you have +PCI network card(s), you'll probably have to only setup your network +options. If not, you'll have to choose the appropriate driver(s) and/or +optional parameters. Supported network configurations include static IP +allocation and DHCP automatic configuration. + + + [ Installation from PCMCIA ] + +If you want to perform an installation on your laptop that is not based on +local IDE CDROM or DISK, nor on built-in network card, but on PCMCIA +extension (probably a network adapter or CDROM drive), you'll need the +"pcmcia.img" image file. + +PCMCIA services should automatically start and be transparent to you. +Then, you'll follow the instructions according to your preferred +installation method. + + + [ Monitoring a stage1 session ] + +Linux supports virtual consoles. You can switch between them by issueing +Ctrl+Alt+Fx key, in which 'x' is the number of the console. Here's console +occupancy during stage1. + +(#1) The user-interface of the stage1 is on the first console. In case of +newt interaction, it's provided with a neat blue and black color scheme, +and nice widgets. In case of stdio interaction (cdrom and disk installs), +it's more basic but still usable :-). + +(#2) A shell is provided on second console in some cases (you need to +compile it with -DSPAWN_SHELL and you need to provide a valid shell in the +initrd) and of course it's not in, in image files of Mandriva Linux +releases because it's too much diskspace. + +(#3) The log is printed out on the third console. This is the location +where you can find most valuable information, prefixed by a '*'. See +"log.h" for calls that print things out to the log. + +(#4) The kernel messages are printed on the fourth console. There is a +process forked very early in the init (the program before the stage1) +which monitors /proc/kmsg for new kernel messages. Also, syslog stuff (the +logs commited by the programs) should appear on the /dev/log Unix socket, +this is also printed on this console. + +(#5) Former place for the stderr of insmod calls. It's not used anymore. + +(#6) Place where a trivial interactive communication with the stage1 is +set up if the parameter -DSPAWN_INTERACTIVE is compiled in. Basically, you +can set switches such as "expert" and "rescue" on the fly with this +feature. It's implemented with a fork and a Unix pipe. + + + [ Rescueing a system ] + +Since Mandriva Linux 7.1, we provide a rescue system through each of the +previously described methods. You don't need a special "rescue.img" file. +Just hit "F1" at boot time, type in "rescue", and follow the first steps +of the installation according to the method you chose (choose +disks/partitions for disk method, network parameters for network method, +etc). Then, you'll end up with a workable system, very useful to rescue a +damaged system, or do other basic actions. diff --git a/mdk-stage1/doc/TECH-INFOS b/mdk-stage1/doc/TECH-INFOS new file mode 100644 index 000000000..81d559a7f --- /dev/null +++ b/mdk-stage1/doc/TECH-INFOS @@ -0,0 +1,106 @@ + +| (*) Automatic install +\---------------------- + +This feature is used to replace redhat kickstart. It uses the kernel +parameter "automatic" with keywords separated with commas and colons, on +the following genres: + + automatic=method:nfs,network:static,ip:192.168.1.24,server:192.168.1.7,directory:/stable/i686 + + automatic=method:ftp,network:dhcp,server:ftp.ciril.fr,directory:/pub/linux/mandriva-devel/cooker + + automatic=method:ftp,network:dhcp,server:companyserver,directory:/mdkinst,user:XXX,pass:XXX + + automatic=method:ftp,interface:eth1,network:dhcp,... + + automatic=method:ftp,network:adsl,adsluser:XXX,adslpass:XXX,... + + automatic=method:cdrom + + automatic=method:disk,disk:hdb,partition:hdb7,directory:/cooker + + +The keywords correspond to each "virtual" question answered automatically, +either from a list or from a free field. + + +Keywords are: + + +`method' <- (nfs,ftp,http,cdrom,disk) + +if nfs/ftp/http: + + `network' <- (static,dhcp,adsl) + + if multiple interfaces detected: + + `interface' <- (list-of-detected-interfaces) + if "auto": + use the first interface with a link beat + if "wired": + use the first wired interface with a link beat + or the first wired interface if none has a link beat + + fi + + if static: + + `ip', `dns', `gateway', `netmask' (free fields) + + elsif adsl: + + `adsluser', `adslpass' (free field) + + fi + + if resolving fails: + + `hostname', `domain' (free fields) + + fi + + `server', `directory' (free fields) + + if ftp: + + `user', `pass' (free fields) + + fi + +fi + +if disk: + + `disk' <- (list-of-detected-disks) + + `partition' <- (list-of-detected-partitions) + + `directory' (free fields) + +fi + + + +You may use shorter versions of keywords (it helps reducing size of +commandline), please find each keyword short-alias counterpart in file +../automatic.c under the identifier named "short_aliases". + +This gives for example for: + + automatic=method:nfs,network:static,ip:192.168.1.24,server:192.168.1.7,directory:/stable/i686 +==> + automatic=met:nfs,net:static,ip:192.168.1.24,ser:192.168.1.7,dir:/stable/i686 + + + +You may specify a stage2 auto-install file, different from the +default `auto_inst.cfg.pl' in install/, by filling the +`bootfile' parameter of your DHCP server response. + +Note that if the name ends with `-IP' or `-IP.pl', IP will be +replaced by the IP address given to the host, normalized to +hexadecimal (that is, `192.168.100.57' would give 'C0A86439'). + + diff --git a/mdk-stage1/doc/UPDATEMODULES b/mdk-stage1/doc/UPDATEMODULES new file mode 100644 index 000000000..cfae4dc54 --- /dev/null +++ b/mdk-stage1/doc/UPDATEMODULES @@ -0,0 +1,96 @@ +This is the documentation for the "Update Modules" (Update Drivers) +feature. + +This feature aims to propose new modules or replacement modules for the +install and afterwards. This is useful when there is a firmware update for a +given driver, an additional driver needed for something, etc. + + +You must use a floppy disk with e2fs filesystem (NOT vfat/windows +formatted). Use "mke2fs /dev/fd0" on your own box to format a floppy with +e2fs filesystem. + +This disk may contain a number of kernel modules; some of them +may replace existing modules, some of them may be added. + +Create a directory per kernel version, named from the version, for example +2.6.27-desktop586-0.rc8.2mnb. In this directory put the modules and a special +file, named "to_load". This file will contain a series of module names, with +optional module options; the program will try to load all these modules one +after another, using file on the floppy if present, else using file within +standard module repository. It can contain comments, these are strictly defined +by the presence of a hash (#) character on column 0 of any line. + +This disk may also contain some update or new modules for installed kernels. +Those modules must be placed in directory <kernel-version>. They must be +gzipped if the installed kernel modules are gzipped. + +You may need to specify the "category" so that new modules are used correctly. +For example, a scsi module should be put in category disk/scsi so that it is +put in scsi_hostadapter and initrd. + + +Here's a typical scenario: + + +1. Boot the floppy (or cdrom) with the option "updatemodules" + + (you may do that by pressing F1 then entering "linux updatemodules") + + +2. At the very beginning of the User Interface, you are asked to insert + the Update Modules disk. Insert the Update Modules disk and press + Enter. + +--=----=----=----=----=----=----=----=----=-- +Our example disk contains: + +[root@obiwan mnt]# ll floppy/* +2.6.27-desktop586-0.rc8.2mnb/: +total 541 +drwxrwxr-x 3 a a 1024 2009-03-09 12:09 kernel/ +-rw-rw-r-- 1 a a 547480 2009-03-09 12:04 msdos.ko +-rw-rw-r-- 1 a a 54748 2009-03-09 12:04 ppa.ko +-rw-rw-r-- 1 a a 79 2009-03-09 12:08 to_load +[root@obiwan mnt]# cat floppy/*/to_load +# Update Drivers description file +3c59x +# fat is a dep for msdos +fat +# updated msdos (handling of 9+4 filenames) +msdos +ppa +# ISA network card needing options +ne io=0x300 irq=7 +# New module [list_modules: disk/scsi] +a320raid +[root@obiwan mnt]# (cd floppy/2.6.27-desktop586-0.rc8.2mnb ; find -type f) +./msdos.ko +./ppa.ko +./to_load +./kernel/fs/msdos/msdos.ko.gz +./kernel/drivers/scsi/ppa.ko.gz +./kernel/drivers/usb/host/uhci-hcd.ko.gz +./kernel/drivers/usb/input/wacom.ko.gz +[root@obiwan mnt]# +--=----=----=----=----=----=----=----=----=-- + + +3. The program reads the special file "to_load" and processes the files. + + a- 3c59x loaded from the marfile on the boot floppy + b- fat loaded from the marfile on the boot floppy + c- msdos loaded from the update modules floppy + d- ppa loaded from the update modules floppy + e- ne loaded from the marfile on the boot floppy + + + +!!! Beware !!!, the dependencies are not handled automatically in +the case of load from the update modules floppy, that's why on +our example we need to load "fat" from the standard modules +before "msdos" from the update floppy. + + +4. When system is installed, update floppy is asked again so that update +modules for the installed kernels can be copied. Then depmod is called. diff --git a/mdk-stage1/doc/documented..frontend.h b/mdk-stage1/doc/documented..frontend.h new file mode 100644 index 000000000..96e4dc8d8 --- /dev/null +++ b/mdk-stage1/doc/documented..frontend.h @@ -0,0 +1,69 @@ +/* + * Guillaume Cottenceau (gc) + * + * Copyright 2000 Mandriva + * + * This software may be freely redistributed under the terms of the GNU + * public license. + * + * 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. + * + */ + +/* + * Using high-level UI. + * + * These functions are frontend-independant: your program won't know each + * `frontend' (e.g. each way to grab user input) will be used. + * + * Then you may link your binary against any `frontend' that implement all + * these functions (and possibly necessary libraries). + */ + + +#ifndef _FRONTEND_H_ +#define _FRONTEND_H_ + +/* this must be called before anything else */ +void init_frontend(void); + +/* this must be called before exit of program */ +void finish_frontend(void); + + +void info_message(char *msg, ...) __attribute__ ((format (printf, 1, 2))); /* (blocks program) */ + +void error_message(char *msg, ...) __attribute__ ((format (printf, 1, 2))); /* (blocks program) */ + +/* (doesn't block program) + * (this is not necessarily stackable, e.g. only one wait_message at a time) */ +void wait_message(char *msg, ...) __attribute__ ((format (printf, 1, 2))); + +/* call this to finish the wait on wait_message */ +void remove_wait_message(void); + +/* monitor progression of something (downloading a file, etc) + * if size of progression is unknown, use `0' */ +void init_progression(char *msg, int size); +void update_progression(int current_size); +void end_progression(void); + +enum frontend_return { RETURN_OK, RETURN_BACK, RETURN_ERROR }; + +/* Yes == RETURN_OK No == RETURN_ERROR Back == RETURN_BACK */ +enum frontend_return ask_yes_no(char *msg); + +/* [elems] NULL terminated array of char* + * [choice] address of a (unitialized) char* */ +enum frontend_return ask_from_list(char *msg, char ** elems, char ** choice); + +enum frontend_return ask_from_list_comments(char *msg, char ** elems, char ** elems_comments, char ** choice); + +/* [questions] NULL terminated array of char* + * [answers] address of a (unitialized) char**, will contain a non-NULL terminated array of char* + * [callback_func] function called at most when the answers change; it can examine the array of char* and assign some new char* */ +enum frontend_return ask_from_entries(char *msg, char ** questions, char *** answers, int entry_size, void (*callback_func)(char ** strings)); + +#endif diff --git a/mdk-stage1/frontend-common.c b/mdk-stage1/frontend-common.c new file mode 100644 index 000000000..cdc972740 --- /dev/null +++ b/mdk-stage1/frontend-common.c @@ -0,0 +1,64 @@ +/* + * Guillaume Cottenceau (gc) + * + * Copyright 2000 Mandriva + * + * This software may be freely redistributed under the terms of the GNU + * public license. + * + * 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 <stdarg.h> +#include <string.h> + +#include <probing.h> + +#include "frontend.h" + + +void info_message(char *msg, ...) +{ + va_list args; + va_start(args, msg); + vinfo_message(msg, args); + va_end(args); +} + +void wait_message(char *msg, ...) +{ + va_list args; + va_start(args, msg); + vwait_message(msg, args); + va_end(args); +} + +void error_message(char *msg, ...) +{ + va_list args; + va_start(args, msg); + verror_message(msg, args); + va_end(args); +} + +enum return_type ask_from_list_comments(char *msg, char ** elems, char ** elems_comments, char ** choice) +{ + int answer = 0; + enum return_type results; + + results = ask_from_list_index(msg, elems, elems_comments, &answer); + + if (results == RETURN_OK) + *choice = strdup(elems[answer]); + + return results; +} + +enum return_type ask_from_list(char *msg, char ** elems, char ** choice) +{ + return ask_from_list_comments(msg, elems, NULL, choice); +} diff --git a/mdk-stage1/frontend.h b/mdk-stage1/frontend.h index 2869590e7..367d46735 100644 --- a/mdk-stage1/frontend.h +++ b/mdk-stage1/frontend.h @@ -1,7 +1,7 @@ /* - * Guillaume Cottenceau (gc@mandrakesoft.com) + * Guillaume Cottenceau (gc) * - * Copyright 2000 MandrakeSoft + * Copyright 2000 Mandriva * * This software may be freely redistributed under the terms of the GNU * public license. @@ -13,29 +13,56 @@ */ /* - * Each different frontend must implement all functions defined here + * For doc please read doc/documented..frontend.h */ - #ifndef _FRONTEND_H_ #define _FRONTEND_H_ -#include "stage1.h" +#include <stdarg.h> + +/* 'unused' atttribute, gcc specific and just to turn down some warnings. */ +#if defined __GNUC__ +#define UNUSED __attribute__((unused)) +#else +#define UNUSED +#endif -void init_frontend(void); +enum return_type { RETURN_OK, RETURN_BACK, RETURN_ERROR }; + +void init_frontend(char * welcome_msg); void finish_frontend(void); -void error_message(char *msg, ...); /* blocking */ -void info_message(char *msg, ...); /* blocking */ -void wait_message(char *msg, ...); /* non-blocking */ + +void error_message(char *msg, ...) __attribute__ ((format (printf, 1, 2))); /* blocking */ +void info_message(char *msg, ...) __attribute__ ((format (printf, 1, 2))); /* blocking */ +void wait_message(char *msg, ...) __attribute__ ((format (printf, 1, 2))); /* non-blocking */ void remove_wait_message(void); +void init_progression_raw(char *msg, int size); +void update_progression_raw(int current_size); +void end_progression_raw(void); + +#ifdef ENABLE_BOOTSPLASH void init_progression(char *msg, int size); void update_progression(int current_size); void end_progression(void); +#else +#define init_progression init_progression_raw +#define update_progression update_progression_raw +#define end_progression end_progression_raw +#endif enum return_type ask_yes_no(char *msg); +enum return_type ask_from_list_index(char *msg, char ** elems, char ** elems_comments, int *answer); enum return_type ask_from_list(char *msg, char ** elems, char ** choice); enum return_type ask_from_list_comments(char *msg, char ** elems, char ** elems_comments, char ** choice); enum return_type ask_from_entries(char *msg, char ** questions, char *** answers, int entry_size, void (*callback_func)(char ** strings)); +void suspend_to_console(void); +void resume_from_suspend(void); + +void verror_message(char *msg, va_list ap); +void vinfo_message(char *msg, va_list ap); +void vwait_message(char *msg, va_list ap); + #endif diff --git a/mdk-stage1/init-data/emptyboot.img.bz2 b/mdk-stage1/init-data/emptyboot.img.bz2 Binary files differdeleted file mode 100644 index 6ae939c1b..000000000 --- a/mdk-stage1/init-data/emptyboot.img.bz2 +++ /dev/null diff --git a/mdk-stage1/init-data/msgboot-graphicallogo-2880.img.bz2 b/mdk-stage1/init-data/msgboot-graphicallogo-2880.img.bz2 Binary files differdeleted file mode 100644 index 9d5d276fb..000000000 --- a/mdk-stage1/init-data/msgboot-graphicallogo-2880.img.bz2 +++ /dev/null diff --git a/mdk-stage1/init-data/msgboot-graphicallogo.img.bz2 b/mdk-stage1/init-data/msgboot-graphicallogo.img.bz2 Binary files differdeleted file mode 100644 index c650dce8b..000000000 --- a/mdk-stage1/init-data/msgboot-graphicallogo.img.bz2 +++ /dev/null diff --git a/mdk-stage1/init-data/msgboot.img.bz2 b/mdk-stage1/init-data/msgboot.img.bz2 Binary files differdeleted file mode 100644 index c5f3a7ed7..000000000 --- a/mdk-stage1/init-data/msgboot.img.bz2 +++ /dev/null diff --git a/mdk-stage1/init-libc-headers.h b/mdk-stage1/init-libc-headers.h deleted file mode 100644 index f5f6aa2e6..000000000 --- a/mdk-stage1/init-libc-headers.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Guillaume Cottenceau (gc@mandrakesoft.com) - * - * Copyright 2000 MandrakeSoft - * - * This software may be freely redistributed under the terms of the GNU - * public license. - * - * 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. - * - */ - -/* - * Portions from Erik Troan (ewt@redhat.com) - * - * Copyright 1996 Red Hat Software - * - */ - -#include <stdlib.h> -#include <unistd.h> -#include <stdio.h> -#include <string.h> -#include <sys/types.h> -#include <sys/socket.h> -#include <sys/stat.h> -#include <fcntl.h> -#include <sys/mount.h> -#include <linux/un.h> -#include <errno.h> -#include <signal.h> -#include <sys/resource.h> -#include <sys/wait.h> -#include <linux/unistd.h> -#include <sys/select.h> - -#ifndef SOCK_STREAM -#define SOCK_STREAM 1 -#endif - -_syscall3(int, syslog, int, type, char *, bufp, int, len); -_syscall3(int, reboot, int, magic, int, magic2, int, flag); diff --git a/mdk-stage1/init.c b/mdk-stage1/init.c index b5f5631f8..7c48f64ec 100644 --- a/mdk-stage1/init.c +++ b/mdk-stage1/init.c @@ -1,7 +1,7 @@ /* - * Guillaume Cottenceau (gc@mandrakesoft.com) + * Guillaume Cottenceau (gc) * - * Copyright 2000 MandrakeSoft + * Copyright 2000 Mandriva * * This software may be freely redistributed under the terms of the GNU * public license. @@ -19,21 +19,54 @@ * */ -#ifndef INIT_HEADERS -#include "init-libc-headers.h" -#else -#include INIT_HEADERS -#endif +#include <stdlib.h> +#include <unistd.h> +#include <stdio.h> +#include <dirent.h> +#include <string.h> +#include <sys/types.h> +#include <sys/socket.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <sys/mount.h> +#include <linux/un.h> +#include <errno.h> +#include <signal.h> +#include <sys/resource.h> +#include <sys/wait.h> +#include <linux/unistd.h> +#include <sys/select.h> +#include <sys/ioctl.h> +#include <linux/reboot.h> + +#include <sys/syscall.h> +#define syslog(...) syscall(__NR_syslog, __VA_ARGS__) + +static unsigned int reboot_magic = LINUX_REBOOT_CMD_RESTART; + +static inline long reboot(unsigned int command) +{ + return (long) syscall(__NR_reboot, LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, command, 0); +} #include "config-stage1.h" +#include <linux/cdrom.h> + + +#define BINARY_STAGE2 "/usr/bin/runinstall2" char * env[] = { "PATH=/usr/bin:/bin:/sbin:/usr/sbin:/mnt/sbin:/mnt/usr/sbin:/mnt/bin:/mnt/usr/bin", - "LD_LIBRARY_PATH=/lib:/usr/lib:/mnt/lib:/mnt/usr/lib:/usr/X11R6/lib:/mnt/usr/X11R6/lib", + "LD_LIBRARY_PATH=/lib:/usr/lib:/mnt/lib:/mnt/usr/lib" +#if defined(__x86_64__) + ":/lib64:/usr/lib64:/mnt/lib64:/mnt/usr/lib64" +#endif + , "HOME=/", "TERM=linux", "TERMINFO=/etc/terminfo", + "LC_CTYPE=UTF-8", NULL }; @@ -48,14 +81,14 @@ char * env[] = { * */ -int testing; +int testing = 0; int klog_pid; void fatal_error(char *msg) { printf("FATAL ERROR IN INIT: %s\n\nI can't recover from this, please reboot manually and send bugreport.\n", msg); - while (1); + select(0, NULL, NULL, NULL, NULL); } void print_error(char *msg) @@ -73,20 +106,20 @@ void print_int_init(int fd, int i) char buf[10]; char * chptr = buf + 9; int j = 0; - + if (i < 0) { write(1, "-", 1); i = -1 * i; } - + while (i) { *chptr-- = '0' + (i % 10); j++; i = i / 10; } - + write(fd, chptr + 1, j); } @@ -95,7 +128,6 @@ void print_str_init(int fd, char * string) write(fd, string, strlen(string)); } - /* fork to: * (1) watch /proc/kmsg and copy the stuff to /dev/tty4 * (2) listens to /dev/log and copy also this stuff (log from programs) @@ -105,7 +137,7 @@ void doklog() fd_set readset, unixs; int in, out, i; int log; - int s; + socklen_t s; int sock = -1; struct sockaddr_un sockaddr; char buf[1024]; @@ -118,7 +150,7 @@ void doklog() return; } - if ((log = open("/tmp/syslog", O_WRONLY | O_CREAT, 0644)) < 0) { + if ((log = open("/tmp/syslog", O_WRONLY | O_CREAT | O_APPEND, 0644)) < 0) { print_error("error opening /tmp/syslog"); sleep(5); return; @@ -133,7 +165,7 @@ void doklog() close(1); close(2); } - + out = open("/dev/tty4", O_WRONLY, 0); if (out < 0) print_warning("couldn't open tty for syslog -- still using /tmp/syslog\n"); @@ -153,8 +185,7 @@ void doklog() // print_str_init(log, "] bind error: "); // print_int_init(log, errno); // print_str_init(log, "\n"); -// sleep(5); -// } +// sleep(// } // // print_str_init(log, "] bound socket\n"); // chmod("/dev/log", 0666); @@ -176,7 +207,7 @@ void doklog() if (sock >= 0) FD_SET(sock, &readset); FD_SET(in, &readset); - + i = select(20, &readset, NULL, NULL, NULL); if (i <= 0) continue; @@ -191,25 +222,6 @@ void doklog() } } - /* examine some fd's in the hope to find some syslog outputs from programs */ - for (readfd = 0; readfd < 20; ++readfd) { - if (FD_ISSET(readfd, &readset) && FD_ISSET(readfd, &unixs)) { - i = read(readfd, buf, sizeof(buf)); - if (i > 0) { - /* grep out the output of RPM telling that it installed/removed some packages */ - if (!strstr(buf, "mdk installed") && !strstr(buf, "mdk removed")) { - if (out >= 0) - write(out, buf, i); - write(log, buf, i); - } - } else if (i == 0) { - /* socket closed */ - close(readfd); - FD_CLR(readfd, &unixs); - } - } - } - /* the socket has moved, new stuff to do */ if (sock >= 0 && FD_ISSET(sock, &readset)) { s = sizeof(sockaddr); @@ -231,20 +243,28 @@ void doklog() #define LOOP_CLR_FD 0x4C01 -void del_loop(char *device) +void del_loops(void) { - int fd; - if ((fd = open(device, O_RDONLY, 0)) < 0) { - printf("del_loop open failed\n"); - return; - } - - if (ioctl(fd, LOOP_CLR_FD, 0) < 0) { - printf("del_loop ioctl failed"); - return; - } - - close(fd); + char loopdev[] = "/dev/loop0"; + char chloopdev[] = "/dev/chloop0"; + int i; + for (i=0; i<8; i++) { + int fd; + loopdev[9] = '0' + i; + fd = open(loopdev, O_RDONLY, 0); + if (fd > 0) { + if (!ioctl(fd, LOOP_CLR_FD, 0)) + printf("\t%s\n", loopdev); + close(fd); + } + chloopdev[11] = '0' + i; + fd = open(chloopdev, O_RDONLY, 0); + if (fd > 0) { + if (!ioctl(fd, LOOP_CLR_FD, 0)) + printf("\t%s\n", chloopdev); + close(fd); + } + } } struct filesystem @@ -255,6 +275,18 @@ struct filesystem int mounted; }; +char* strcat(register char* s,register const char* t) +{ + char *dest=s; + s+=strlen(s); + for (;;) { + if (!(*s = *t)) + break; + ++s; ++t; + } + return dest; +} + /* attempt to unmount all filesystems in /proc/mounts */ void unmount_filesystems(void) { @@ -264,9 +296,9 @@ void unmount_filesystems(void) struct filesystem fs[500]; int numfs = 0; int i, nb; - + printf("unmounting filesystems...\n"); - + fd = open("/proc/mounts", O_RDONLY, 0); if (fd < 1) { print_error("failed to open /proc/mounts"); @@ -293,7 +325,12 @@ void unmount_filesystems(void) *p++ = '\0'; while (*p != '\n') p++; p++; - if (strcmp(fs[numfs].name, "/") != 0) numfs++; /* skip if root, no need to take initrd root in account */ + if (strcmp(fs[numfs].name, "/") + && !strstr(fs[numfs].dev, "ram") + && strcmp(fs[numfs].name, "/dev") + && strcmp(fs[numfs].name, "/sys") + && strncmp(fs[numfs].name, "/proc", 5)) + numfs++; } /* Pixel's ultra-optimized sorting algorithm: @@ -303,31 +340,123 @@ void unmount_filesystems(void) nb = 0; for (i = 0; i < numfs; i++) { /*printf("trying with %s\n", fs[i].name);*/ + del_loops(); if (fs[i].mounted && umount(fs[i].name) == 0) { - if (strncmp(fs[i].dev + sizeof("/dev/") - 1, "loop", - sizeof("loop") - 1) == 0) - del_loop(fs[i].dev); - printf("\t%s\n", fs[i].name); fs[i].mounted = 0; nb++; } } } while (nb); - + for (i = nb = 0; i < numfs; i++) if (fs[i].mounted) { - printf("\t%s umount failed\n", fs[i].name); - if (strcmp(fs[i].fs, "ext2") == 0) nb++; /* don't count not-ext2 umount failed */ + printf("\tumount failed: %s\n", fs[i].name); + if (strcmp(fs[i].fs, "ext3") == 0) nb++; /* don't count not-ext3 umount failed */ } - + + if (nb) { printf("failed to umount some filesystems\n"); - while (1); + select(0, NULL, NULL, NULL, NULL); } } -int exit_value_rescue = 66; +int in_reboot(void) +{ + int fd; + if ((fd = open("/var/run/rebootctl", O_RDONLY, 0)) > 0) { + char buf[100]; + int i = read(fd, buf, sizeof(buf)); + close(fd); + if (strstr(buf, "halt")) + reboot_magic = LINUX_REBOOT_CMD_POWER_OFF; + return i > 0; + } + return 0; +} + +int recursive_remove(char *file); +int recursive_remove(char *file) +{ + struct stat sb; + + if (lstat(file, &sb) != 0) { + printf("failed to stat %s: %d\n", file, errno); + return -1; + } + + /* only descend into subdirectories if device is same as dir */ + if (S_ISDIR(sb.st_mode)) { + char * strBuf = alloca(strlen(file) + 1024); + DIR * dir; + struct dirent * d; + + if (!(dir = opendir(file))) { + printf("error opening %s: %d\n", file, errno); + return -1; + } + while ((d = readdir(dir))) { + if (!strcmp(d->d_name, ".") || !strcmp(d->d_name, "..")) + continue; + + strcpy(strBuf, file); + strcat(strBuf, "/"); + strcat(strBuf, d->d_name); + + if (recursive_remove(strBuf) != 0) { + closedir(dir); + return -1; + } + } + closedir(dir); + + if (rmdir(file)) { + printf("failed to rmdir %s: %d\n", file, errno); + return -1; + } + } else { + if (unlink(file) != 0) { + printf("failed to remove %s: %d\n", file, errno); + return -1; + } + } + return 0; +} + + +int create_initial_fs_symlinks(char* symlinks) +{ + FILE *f; + char buf[5000]; + + if (!(f = fopen(symlinks, "rb"))) { + printf("Error opening symlink definitions file '%s'\n", symlinks); + return -1; + } + while (fgets(buf, sizeof(buf), f)) { + char oldpath[500], newpath[500]; + struct stat sb; + + buf[strlen(buf)-1] = '\0'; // trim \n + if (sscanf(buf, "%s %s", oldpath, newpath) != 2) { + snprintf(oldpath, sizeof(oldpath), "%s%s", STAGE2_LOCATION, buf); + snprintf(newpath, sizeof(newpath), "%s", buf); + } + if (lstat(newpath, &sb) == 0) + recursive_remove(newpath); + printf("Creating symlink %s -> %s\n", oldpath, newpath); + if (symlink(oldpath, newpath)) { + printf("Error creating symlink\n"); + return -1; + } + } + fclose(f); + return 0; +} + + +int exit_value_restart = 0x35; int main(int argc, char **argv) { @@ -335,10 +464,12 @@ int main(int argc, char **argv) int wait_status; int fd; int abnormal_termination = 0; - int end_stage2 = 0; - /* getpid() != 1 should work, by linuxrc tends to get a larger pid */ - testing = (getpid() > 50); + if (argc > 1 && argv[1][0] >= '0' && argv[1][0] <= '9') { + printf("This is no normal init, sorry.\n" + "Call `reboot' or `halt' directly.\n"); + return 0; + } if (!testing) { /* turn off screen blanking */ @@ -346,46 +477,39 @@ int main(int argc, char **argv) printf("\033[8]"); } else - printf("*** TESTING MODE ***\n"); + printf("*** TESTING MODE *** (pid is %d)\n", getpid()); - printf("\n\t\t\t\033[1;40mWelcome to Linux-\033[1;36mMandrake\033[0;39m\n\n"); - - if (!testing) { - if (mount("/proc", "/proc", "proc", 0, NULL)) - fatal_error("Unable to mount proc filesystem"); - } - + // needed for ldetect: + if (!testing) + if (mount("none", "/sys/kernel/debug", "debugfs", MS_NOSUID, "mode=0755")) + fatal_error("Unable to mount debugfs filesystem"); + /* ignore Control-C and keyboard stop signals */ signal(SIGINT, SIG_IGN); signal(SIGTSTP, SIG_IGN); - if (!testing) { - fd = open("/dev/tty1", O_RDWR, 0); - if (fd < 0) - /* try with devfs */ - fd = open("/dev/vc/1", O_RDWR, 0); - + fd = open("/dev/console", O_RDWR, 0); if (fd < 0) - fatal_error("failed to open /dev/tty1 and /dev/vc/1"); - + fatal_error("failed to open /dev/console"); + dup2(fd, 0); dup2(fd, 1); dup2(fd, 2); close(fd); } - + /* I set me up as session leader (probably not necessary?) */ setsid(); - if (ioctl(0, TIOCSCTTY, NULL)) - print_error("could not set new controlling tty"); +// if (ioctl(0, TIOCSCTTY, NULL)) +// print_error("could not set new controlling tty"); if (!testing) { - char * my_hostname = "localhost.localdomain"; - sethostname(my_hostname, strlen(my_hostname)); + char my_hostname[] = "localhost"; + sethostname(my_hostname, sizeof(my_hostname)); /* the default domainname (as of 2.0.35) is "(none)", which confuses glibc */ setdomainname("", 0); @@ -394,50 +518,78 @@ int main(int argc, char **argv) if (!testing) doklog(); - /* Go into normal init mode - keep going, and then do a orderly shutdown - when: - - 1) install exits - 2) we receive a SIGHUP - */ - - printf("Traktopel says: drink an egg white each morning builds a man! (c) Warly\n"); - printf("Running install...\n"); - - if (!(installpid = fork())) { - /* child */ - char * child_argv[2]; - child_argv[0] = "/sbin/stage1"; - child_argv[1] = NULL; + if (create_initial_fs_symlinks(STAGE2_LOCATION "/usr/share/symlinks") != 0) + fatal_error("Fatal error finishing initialization (could not create symlinks)."); + + /* kernel modules and firmware is needed by stage2, so move them to the root */ + if (rename("/usr/lib/modules", "/modules")) + fatal_error("Cannot rename modules folder"); + if (rename("/usr/lib/firmware", "/firmware")) + fatal_error("Cannot rename firmware folder"); + + /* Add some symlinks so stage1 is still valid on it's own - not strictly needed */ + if (symlink("/modules", "/usr/lib/modules")) + fatal_error("Cannot symlink modules folder"); + + if (symlink("/firmware", "/usr/lib/firmware")) + fatal_error("Cannot symlink firmware folder"); + + if (mount(STAGE2_LOCATION "/usr", "/usr", "none", MS_BIND|MS_RDONLY, NULL)) + fatal_error("Unable to bind mount /usr filesystem from rescue or installer stage2"); + + + if (access("/run/drakx/run-init", R_OK) == 0) { + /* This is typically used in rescue mode */ + char * child_argv[2] = { "/sbin/init", NULL }; + + kill(klog_pid, 9); + printf("proceeding, please wait...\n"); execve(child_argv[0], child_argv, env); - printf("error in exec of stage1 :-(\n"); - return 0; + fatal_error("failed to exec /sbin/init"); } - while (!end_stage2) { - childpid = wait4(-1, &wait_status, 0, NULL); - if (childpid == installpid) - end_stage2 = 1; - } + /* This is installer mode */ + do { + printf("proceeding, please wait...\n"); + + if (!(installpid = fork())) { + /* child */ + char * child_argv[2] = { BINARY_STAGE2, NULL }; + execve(child_argv[0], child_argv, env); + printf("error in exec of %s :-( [%d]\n", child_argv[0], errno); + return 0; + } - if (!WIFEXITED(wait_status) || (WEXITSTATUS(wait_status) != 0 && WEXITSTATUS(wait_status) != exit_value_rescue)) { - printf("install exited abnormally :-( "); + do { + childpid = wait4(-1, &wait_status, 0, NULL); + } while (childpid != installpid); + } while (WIFEXITED(wait_status) && WEXITSTATUS(wait_status) == exit_value_restart); + + /* allow Ctrl Alt Del to reboot */ + reboot(LINUX_REBOOT_CMD_CAD_ON); + + if (in_reboot()) { + // any exitcode is valid if we're in_reboot + } else if (!WIFEXITED(wait_status) || WEXITSTATUS(wait_status) != 0) { + printf("exited abnormally :-( "); if (WIFSIGNALED(wait_status)) printf("-- received signal %d", WTERMSIG(wait_status)); printf("\n"); - abnormal_termination = 1; - } else if (WIFEXITED(wait_status) && WEXITSTATUS(wait_status) == exit_value_rescue) { - kill(klog_pid, 9); - printf("exiting init -- giving hand to rescue\n"); - return 0; - } else - printf("install succeeded\n"); + abnormal_termination = 1; + } + + if (!abnormal_termination) { + int i; + for (i=0; i<50; i++) + printf("\n"); /* cleanup startkde messages */ + } if (testing) return 0; sync(); sync(); + sleep(2); printf("sending termination signals..."); kill(-1, 15); @@ -451,14 +603,22 @@ int main(int argc, char **argv) unmount_filesystems(); + sync(); sync(); + if (!abnormal_termination) { - printf("rebooting system\n"); - sleep(2); - reboot(0xfee1dead, 672274793, 0x01234567); + if (reboot_magic == LINUX_REBOOT_CMD_RESTART) { +#ifdef DEBUG + printf("automatic reboot in 10 seconds\n"); + sleep(10); +#endif + reboot(reboot_magic); + } else { + printf("you may safely poweroff your computer now\n"); + } } else { - printf("you may safely reboot your system\n"); - while (1); + printf("you may safely reboot or halt your system\n"); } + select(0, NULL, NULL, NULL, NULL); return 0; } diff --git a/mdk-stage1/insmod-busybox/.cvsignore b/mdk-stage1/insmod-busybox/.cvsignore deleted file mode 100644 index c4f870044..000000000 --- a/mdk-stage1/insmod-busybox/.cvsignore +++ /dev/null @@ -1 +0,0 @@ -insmod diff --git a/mdk-stage1/insmod-busybox/Config.h b/mdk-stage1/insmod-busybox/Config.h deleted file mode 100644 index 8388416b7..000000000 --- a/mdk-stage1/insmod-busybox/Config.h +++ /dev/null @@ -1,132 +0,0 @@ -/* vi: set sw=4 ts=4: */ -// This file defines the feature set to be compiled into busybox. -// When you turn things off here, they won't be compiled in at all. -// -//// This file is parsed by sed. You MUST use single line comments. -// i.e. //#define BB_BLAH -// -// -// BusyBox Applications -#define BB_INSMOD -// End of Applications List -// -// -// -// --------------------------------------------------------- -// This is where feature definitions go. Generally speaking, -// turning this stuff off makes things a bit smaller (and less -// pretty/useful). -// -// -// -// Turn this on to use Erik's very cool devps, and devmtab kernel drivers, -// thereby eliminating the need for the /proc filesystem and thereby saving -// lots and lots memory for more important things. You can not use this and -// USE_PROCFS at the same time... NOTE: If you enable this feature, you -// _must_ have patched the kernel to include the devps patch that is included -// in the busybox/kernel-patches directory. You will also need to create some -// device special files in /dev on your embedded system: -// mknod /dev/mtab c 10 22 -// mknod /dev/ps c 10 21 -// I emailed Linus and this patch will not be going into the stock kernel. -//#define BB_FEATURE_USE_DEVPS_PATCH -// -// enable features that use the /proc filesystem (apps that -// break without this will tell you on compile)... -// You can't use this and BB_FEATURE_USE_DEVPS_PATCH -// at the same time... -#define BB_FEATURE_USE_PROCFS - -// -// Enable tab completion in the shell (not yet -// working very well -- so don't turn this on) -//#define BB_FEATURE_SH_TAB_COMPLETION -// -//Turn on extra fbset options -//#define BB_FEATURE_FBSET_FANCY -// -//Turn on fbset readmode support -//#define BB_FEATURE_FBSET_READMODE -// -// You must enable one or both of these features -// Support installing modules from pre 2.1 kernels -//#define BB_FEATURE_INSMOD_OLD_KERNEL -// Support installing modules from kernel versions after 2.1.18 -#define BB_FEATURE_INSMOD_NEW_KERNEL -// -// Support module version checking -//#define BB_FEATURE_INSMOD_VERSION_CHECKING -// -// Support for Minix filesystem, version 2 -//#define BB_FEATURE_MINIX2 -// -// -// Enable busybox --install [-s] -// to create links (or symlinks) for all the commands that are -// compiled into the binary. (needs /proc filesystem) -// #define BB_FEATURE_INSTALLER -// -// Clean up all memory before exiting -- usually not needed -// as the OS can clean up... Don't enable this unless you -// have a really good reason for cleaning things up manually. -//#define BB_FEATURE_CLEAN_UP -// -// End of Features List -// -// -// -// -// -// -//--------------------------------------------------- -// Nothing beyond this point should ever be touched by -// mere mortals so leave this stuff alone. -// -#ifdef BB_FEATURE_MOUNT_MTAB_SUPPORT -#define BB_MTAB -#endif -// -#if defined BB_FEATURE_SH_COMMAND_EDITING && defined BB_SH -#define BB_CMDEDIT -#endif -// -#ifdef BB_KILLALL -#ifndef BB_KILL -#define BB_KILL -#endif -#endif -// -#ifdef BB_FEATURE_LINUXRC -#ifndef BB_INIT -#define BB_INIT -#endif -#define BB_LINUXRC -#endif -// -#ifdef BB_GZIP -#ifndef BB_GUNZIP -#define BB_GUNZIP -#endif -#endif -// -#if defined BB_MOUNT && defined BB_FEATURE_NFSMOUNT -#define BB_NFSMOUNT -#endif -// -#if defined BB_FEATURE_SH_COMMAND_EDITING -#ifndef BB_FEATURE_USE_TERMIOS -#define BB_FEATURE_USE_TERMIOS -#endif -#endif -// -#if defined BB_FEATURE_AUTOWIDTH -#ifndef BB_FEATURE_USE_TERMIOS -#define BB_FEATURE_USE_TERMIOS -#endif -#endif -// -#if defined BB_INSMOD -#ifndef BB_FEATURE_INSMOD_OLD_KERNEL -#define BB_FEATURE_INSMOD_NEW_KERNEL -#endif -#endif diff --git a/mdk-stage1/insmod-busybox/Makefile b/mdk-stage1/insmod-busybox/Makefile deleted file mode 100644 index ca05279e9..000000000 --- a/mdk-stage1/insmod-busybox/Makefile +++ /dev/null @@ -1,54 +0,0 @@ - #****************************************************************************** - # - # insmod from busybox (i386 only) - # - # $Id$ - # - # Copyright (C) 1999,2000 by Lineo, inc. - # - #***************************************************************************** - -top_dir = .. - -include $(top_dir)/Makefile.common - - -all: insmod libinsmod.a libinsmod-DIET.a - -clean: - rm -f *.o insmod libinsmod.a libinsmod-DIET.a - - -FLAGS = -c -Wall -Os -fomit-frame-pointer -D_GNU_SOURCE -DBB_VER='"0.47"' -DBB_BT='"2000.12.06-14:02+0000"' - - -insmod: insmod-frontend.o insmod.o utility-standalone.o - gcc -o $@ $^ - $(STRIPCMD) $@ - -libinsmod.a: insmod.o utility.o - ar cru $@ $^ - ranlib $@ - -libinsmod-DIET.a: insmod-DIET.o utility-DIET.o - ar cru $@ $^ - ranlib $@ - -insmod-frontend.o: insmod-frontend.c busybox.h - gcc $(FLAGS) $(GLIBC_INCLUDES) insmod-frontend.c - -utility.o: utility.c busybox.h - gcc $(FLAGS) $(GLIBC_INCLUDES) utility.c - -utility-DIET.o: utility.c busybox.h - gcc $(FLAGS) $(DIETLIBC_INCLUDES) -o $@ utility.c - -utility-standalone.o: utility.c busybox.h - gcc $(FLAGS) $(GLIBC_INCLUDES) -o $@ -D_STANDALONE_ utility.c - -insmod.o: insmod.c busybox.h - gcc $(FLAGS) $(GLIBC_INCLUDES) insmod.c - -insmod-DIET.o: insmod.c busybox.h - gcc $(FLAGS) $(DIETLIBC_INCLUDES) -o $@ insmod.c - diff --git a/mdk-stage1/insmod-busybox/README b/mdk-stage1/insmod-busybox/README deleted file mode 100644 index 06695074a..000000000 --- a/mdk-stage1/insmod-busybox/README +++ /dev/null @@ -1,8 +0,0 @@ -This insmod code comes from busybox-0.47 - -ftp://ftp.lineo.com/pub/busybox - -It is cool but works only for ix86 architecture. - - -gc diff --git a/mdk-stage1/insmod-busybox/busybox.h b/mdk-stage1/insmod-busybox/busybox.h deleted file mode 100644 index 6e7bae39b..000000000 --- a/mdk-stage1/insmod-busybox/busybox.h +++ /dev/null @@ -1,467 +0,0 @@ -/* vi: set sw=4 ts=4: */ -/* - * Busybox main internal header file - * - * - * 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 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, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Based in part on code from sash, Copyright (c) 1999 by David I. Bell - * Permission has been granted to redistribute this code under the GPL. - * - */ -#ifndef _BB_INTERNAL_H_ -#define _BB_INTERNAL_H_ 1 - -#include "Config.h" - -#ifdef DMALLOC -#include "dmalloc.h" -#endif - -#include <stdlib.h> -#include <stdarg.h> -#include <string.h> -#include <unistd.h> -#include <errno.h> -#include <sys/stat.h> -#include <sys/param.h> -/* for the _syscall() macros */ -#include <sys/syscall.h> -#include <linux/unistd.h> - - -/* Some useful definitions */ -#define FALSE ((int) 1) -#define TRUE ((int) 0) - -/* for mtab.c */ -#define MTAB_GETMOUNTPT '1' -#define MTAB_GETDEVICE '2' - -#define BUF_SIZE 8192 -#define EXPAND_ALLOC 1024 - - -#define isBlank(ch) (((ch) == ' ') || ((ch) == '\t')) -#define isDecimal(ch) (((ch) >= '0') && ((ch) <= '9')) -#define isOctal(ch) (((ch) >= '0') && ((ch) <= '7')) -#define isWildCard(ch) (((ch) == '*') || ((ch) == '?') || ((ch) == '[')) - -/* Macros for min/max. */ -#ifndef MIN -#define MIN(a,b) (((a)<(b))?(a):(b)) -#endif - -#ifndef MAX -#define MAX(a,b) (((a)>(b))?(a):(b)) -#endif - - -/* I don't like nested includes, but the string and io functions are used - * too often - */ -#include <stdio.h> -#if !defined(NO_STRING_H) || defined(STDC_HEADERS) -# include <string.h> -# if !defined(STDC_HEADERS) && !defined(NO_MEMORY_H) && !defined(__GNUC__) -# include <memory.h> -# endif -# define memzero(s, n) memset ((void *)(s), 0, (n)) -#else -# include <strings.h> -# define strchr index -# define strrchr rindex -# define memcpy(d, s, n) bcopy((s), (d), (n)) -# define memcmp(s1, s2, n) bcmp((s1), (s2), (n)) -# define memzero(s, n) bzero((s), (n)) -#endif - - -enum Location { - _BB_DIR_ROOT = 0, - _BB_DIR_BIN, - _BB_DIR_SBIN, - _BB_DIR_USR_BIN, - _BB_DIR_USR_SBIN -}; - -struct BB_applet { - const char* name; - int (*main)(int argc, char** argv); - enum Location location; - const char* usage; -}; -/* From busybox.c */ -extern const struct BB_applet applets[]; - -extern int ar_main(int argc, char **argv); -extern int basename_main(int argc, char **argv); -extern int bogomips_main(int argc, char **argv); -extern int busybox_main(int argc, char** argv); -extern int cat_main(int argc, char** argv); -extern int chmod_chown_chgrp_main(int argc, char** argv); -extern int chroot_main(int argc, char** argv); -extern int chvt_main(int argc, char** argv); -extern int clear_main(int argc, char** argv); -extern int cp_mv_main(int argc, char** argv); -extern int cut_main(int argc, char** argv); -extern int date_main(int argc, char** argv); -extern int dc_main(int argc, char** argv); -extern int dd_main(int argc, char** argv); -extern int dirname_main(int argc, char** argv); -extern int deallocvt_main(int argc, char** argv); -extern int df_main(int argc, char** argv); -extern int dmesg_main(int argc, char** argv); -extern int dos2unix_main(int argc, char** argv); -extern int du_main(int argc, char** argv); -extern int dumpkmap_main(int argc, char** argv); -extern int dutmp_main(int argc, char** argv); -extern int echo_main(int argc, char** argv); -extern int expr_main(int argc, char** argv); -extern int false_main(int argc, char** argv); -extern int fbset_main(int argc, char** argv); -extern int fdisk_main(int argc, char** argv); -extern int fdflush_main(int argc, char **argv); -extern int fsck_minix_main(int argc, char **argv); -extern int find_main(int argc, char** argv); -extern int free_main(int argc, char** argv); -extern int freeramdisk_main(int argc, char** argv); -extern int getopt_main(int argc, char** argv); -extern int grep_main(int argc, char** argv); -extern int gunzip_main (int argc, char** argv); -extern int gzip_main(int argc, char** argv); -extern int halt_main(int argc, char** argv); -extern int head_main(int argc, char** argv); -extern int hostid_main(int argc, char** argv); -extern int hostname_main(int argc, char** argv); -extern int id_main(int argc, char** argv); -extern int init_main(int argc, char** argv); -extern int insmod_main(int argc, char** argv); -extern int kill_main(int argc, char** argv); -extern int length_main(int argc, char** argv); -extern int ln_main(int argc, char** argv); -extern int loadacm_main(int argc, char** argv); -extern int loadfont_main(int argc, char** argv); -extern int loadkmap_main(int argc, char** argv); -extern int losetup_main(int argc, char** argv); -extern int logger_main(int argc, char **argv); -extern int logname_main(int argc, char **argv); -extern int ls_main(int argc, char** argv); -extern int lsmod_main(int argc, char** argv); -extern int makedevs_main(int argc, char** argv); -extern int md5sum_main(int argc, char** argv); -extern int mkdir_main(int argc, char** argv); -extern int mkfifo_main(int argc, char **argv); -extern int mkfs_minix_main(int argc, char **argv); -extern int mknod_main(int argc, char** argv); -extern int mkswap_main(int argc, char** argv); -extern int mktemp_main(int argc, char **argv); -extern int nc_main(int argc, char** argv); -extern int more_main(int argc, char** argv); -extern int mount_main(int argc, char** argv); -extern int mt_main(int argc, char** argv); -extern int nslookup_main(int argc, char **argv); -extern int ping_main(int argc, char **argv); -extern int poweroff_main(int argc, char **argv); -extern int printf_main(int argc, char** argv); -extern int ps_main(int argc, char** argv); -extern int pwd_main(int argc, char** argv); -extern int rdate_main(int argc, char** argv); -extern int reboot_main(int argc, char** argv); -extern int renice_main(int argc, char** argv); -extern int reset_main(int argc, char** argv); -extern int rm_main(int argc, char** argv); -extern int rmdir_main(int argc, char **argv); -extern int rmmod_main(int argc, char** argv); -extern int sed_main(int argc, char** argv); -extern int sfdisk_main(int argc, char** argv); -extern int setkeycodes_main(int argc, char** argv); -extern int shell_main(int argc, char** argv); -extern int sleep_main(int argc, char** argv); -extern int sort_main(int argc, char** argv); -extern int swap_on_off_main(int argc, char** argv); -extern int sync_main(int argc, char** argv); -extern int syslogd_main(int argc, char **argv); -extern int tail_main(int argc, char** argv); -extern int tar_main(int argc, char** argv); -extern int tee_main(int argc, char** argv); -extern int test_main(int argc, char** argv); -extern int telnet_main(int argc, char** argv); -extern int touch_main(int argc, char** argv); -extern int tr_main(int argc, char** argv); -extern int true_main(int argc, char** argv); -extern int tput_main(int argc, char** argv); -extern int tryopen_main(int argc, char** argv); -extern int tty_main(int argc, char** argv); -extern int umount_main(int argc, char** argv); -extern int uname_main(int argc, char** argv); -extern int uniq_main(int argc, char** argv); -extern int unix2dos_main(int argc, char** argv); -extern int unrpm_main(int argc, char** argv); -extern int update_main(int argc, char** argv); -extern int uptime_main(int argc, char** argv); -extern int usleep_main(int argc, char** argv); -extern int uuencode_main(int argc, char** argv); -extern int uudecode_main(int argc, char** argv); -extern int wc_main(int argc, char** argv); -extern int wget_main(int argc, char** argv); -extern int which_main(int argc, char** argv); -extern int whoami_main(int argc, char** argv); -extern int xargs_main(int argc, char** argv); -extern int yes_main(int argc, char** argv); - -extern const char ar_usage[]; -extern const char basename_usage[]; -extern const char cat_usage[]; -extern const char chgrp_usage[]; -extern const char chmod_usage[]; -extern const char chown_usage[]; -extern const char chroot_usage[]; -extern const char chvt_usage[]; -extern const char clear_usage[]; -extern const char cp_usage[]; -extern const char cut_usage[]; -extern const char date_usage[]; -extern const char dc_usage[]; -extern const char dd_usage[]; -extern const char deallocvt_usage[]; -extern const char df_usage[]; -extern const char dirname_usage[]; -extern const char dmesg_usage[]; -extern const char dos2unix_usage[]; -extern const char du_usage[]; -extern const char dumpkmap_usage[]; -extern const char dutmp_usage[]; -extern const char echo_usage[]; -extern const char expr_usage[]; -extern const char false_usage[]; -extern const char fdflush_usage[]; -extern const char find_usage[]; -extern const char free_usage[]; -extern const char freeramdisk_usage[]; -extern const char fsck_minix_usage[]; -extern const char grep_usage[]; -extern const char gunzip_usage[]; -extern const char gzip_usage[]; -extern const char halt_usage[]; -extern const char head_usage[]; -extern const char hostid_usage[]; -extern const char hostname_usage[]; -extern const char id_usage[]; -extern const char insmod_usage[]; -extern const char kill_usage[]; -extern const char killall_usage[]; -extern const char length_usage[]; -extern const char ln_usage[]; -extern const char loadacm_usage[]; -extern const char loadfont_usage[]; -extern const char loadkmap_usage[]; -extern const char logger_usage[]; -extern const char logname_usage[]; -extern const char ls_usage[]; -extern const char lsmod_usage[]; -extern const char makedevs_usage[]; -extern const char md5sum_usage[]; -extern const char mkdir_usage[]; -extern const char mkfifo_usage[]; -extern const char mkfs_minix_usage[]; -extern const char mknod_usage[]; -extern const char mkswap_usage[]; -extern const char mktemp_usage[]; -extern const char more_usage[]; -extern const char mount_usage[]; -extern const char mt_usage[]; -extern const char mv_usage[]; -extern const char nc_usage[]; -extern const char nslookup_usage[]; -extern const char ping_usage[]; -extern const char poweroff_usage[]; -extern const char printf_usage[]; -extern const char ps_usage[]; -extern const char pwd_usage[]; -extern const char rdate_usage[]; -extern const char reboot_usage[]; -extern const char renice_usage[]; -extern const char reset_usage[]; -extern const char rm_usage[]; -extern const char rmdir_usage[]; -extern const char rmmod_usage[]; -extern const char sed_usage[]; -extern const char setkeycodes_usage[]; -extern const char shell_usage[]; -extern const char sleep_usage[]; -extern const char sort_usage[]; -extern const char swapoff_usage[]; -extern const char swapon_usage[]; -extern const char sync_usage[]; -extern const char syslogd_usage[]; -extern const char tail_usage[]; -extern const char tar_usage[]; -extern const char tee_usage[]; -extern const char telnet_usage[]; -extern const char test_usage[]; -extern const char touch_usage[]; -extern const char tr_usage[]; -extern const char true_usage[]; -extern const char tty_usage[]; -extern const char umount_usage[]; -extern const char uname_usage[]; -extern const char uniq_usage[]; -extern const char unix2dos_usage[]; -extern const char unrpm_usage[]; -extern const char update_usage[]; -extern const char uptime_usage[]; -extern const char usleep_usage[]; -extern const char uudecode_usage[]; -extern const char uuencode_usage[]; -extern const char wc_usage[]; -extern const char wget_usage[]; -extern const char which_usage[]; -extern const char whoami_usage[]; -extern const char xargs_usage[]; -extern const char yes_usage[]; - -extern const char *applet_name; - -extern void usage(const char *usage) __attribute__ ((noreturn)); -extern void errorMsg(const char *s, ...) __attribute__ ((format (printf, 1, 2))); -extern void logperror(char *s); -extern void fatalError(const char *s, ...) __attribute__ ((noreturn, format (printf, 1, 2))); - -const char *modeString(int mode); -const char *timeString(time_t timeVal); -int isDirectory(const char *name, const int followLinks, struct stat *statBuf); -int isDevice(const char *name); - -typedef struct ino_dev_hash_bucket_struct { - struct ino_dev_hash_bucket_struct *next; - ino_t ino; - dev_t dev; - char name[1]; -} ino_dev_hashtable_bucket_t; -int is_in_ino_dev_hashtable(const struct stat *statbuf, char **name); -void add_to_ino_dev_hashtable(const struct stat *statbuf, const char *name); -void reset_ino_dev_hashtable(void); - -int copyFile(const char *srcName, const char *destName, - int setModes, int followLinks, int forceFlag); -int copySubFile(int srcFd, int dstFd, size_t remaining); -char *buildName(const char *dirName, const char *fileName); -int makeString(int argc, const char **argv, char *buf, int bufLen); -char *getChunk(int size); -char *chunkstrdup(const char *str); -void freeChunks(void); -int fullWrite(int fd, const char *buf, int len); -int fullRead(int fd, char *buf, int len); -int recursiveAction(const char *fileName, int recurse, int followLinks, int depthFirst, - int (*fileAction) (const char *fileName, struct stat* statbuf, void* userData), - int (*dirAction) (const char *fileName, struct stat* statbuf, void* userData), - void* userData); - -extern int createPath (const char *name, int mode); -extern int parse_mode( const char* s, mode_t* theMode); - -extern int get_kernel_revision(void); - -extern int get_console_fd(char* tty_name); -extern struct mntent *findMountPoint(const char *name, const char *table); -extern void write_mtab(char* blockDevice, char* directory, - char* filesystemType, long flags, char* string_flags); -extern void erase_mtab(const char * name); -extern void mtab_read(void); -extern char *mtab_first(void **iter); -extern char *mtab_next(void **iter); -extern char *mtab_getinfo(const char *match, const char which); -extern int check_wildcard_match(const char* text, const char* pattern); -extern long getNum (const char *cp); -extern pid_t* findPidByName( char* pidName); -extern int find_real_root_device_name(char* name); -extern char *get_line_from_file(FILE *file); -extern void print_file(FILE *file); -extern int print_file_by_name(char *filename); -extern char process_escape_sequence(char **ptr); -extern char *get_last_path_component(char *path); -// extern void xregcomp(regex_t *preg, const char *regex, int cflags); - -#ifndef DMALLOC -extern void *xmalloc (size_t size); -extern void *xrealloc(void *old, size_t size); -extern void *xcalloc(size_t nmemb, size_t size); -extern char *xstrdup (const char *s); -#endif -extern char *xstrndup (const char *s, int n); - - -/* These parse entries in /etc/passwd and /etc/group. This is desirable - * for BusyBox since we want to avoid using the glibc NSS stuff, which - * increases target size and is often not needed embedded systems. */ -extern long my_getpwnam(char *name); -extern long my_getgrnam(char *name); -extern void my_getpwuid(char *name, long uid); -extern void my_getgrgid(char *group, long gid); -extern long my_getpwnamegid(char *name); - -extern int device_open(char *device, int mode); - -#if defined BB_FEATURE_MOUNT_LOOP -extern int del_loop(const char *device); -extern int set_loop(const char *device, const char *file, int offset, int *loopro); -extern char *find_unused_loop_device (void); -#endif - - -#if (__GLIBC__ < 2) && (defined BB_SYSLOGD || defined BB_INIT) -extern int vdprintf(int d, const char *format, va_list ap); -#endif - -#if defined BB_NFSMOUNT -int nfsmount(const char *spec, const char *node, int *flags, - char **extra_opts, char **mount_opts, int running_bg); -#endif - -#ifndef RB_POWER_OFF -/* Stop system and switch power off if possible. */ -#define RB_POWER_OFF 0x4321fedc -#endif - -/* Include our own copy of struct sysinfo to avoid binary compatability - * problems with Linux 2.4, which changed things. Grumble, grumble. */ -struct sysinfo { - long uptime; /* Seconds since boot */ - unsigned long loads[3]; /* 1, 5, and 15 minute load averages */ - unsigned long totalram; /* Total usable main memory size */ - unsigned long freeram; /* Available memory size */ - unsigned long sharedram; /* Amount of shared memory */ - unsigned long bufferram; /* Memory used by buffers */ - unsigned long totalswap; /* Total swap space size */ - unsigned long freeswap; /* swap space still available */ - unsigned short procs; /* Number of current processes */ - unsigned long totalhigh; /* Total high memory size */ - unsigned long freehigh; /* Available high memory size */ - unsigned int mem_unit; /* Memory unit size in bytes */ - char _f[20-2*sizeof(long)-sizeof(int)]; /* Padding: libc5 uses this.. */ -}; -extern int sysinfo (struct sysinfo* info); - -/* Bit map related macros -- libc5 doens't provide these... sigh. */ -#ifndef setbit -#define NBBY CHAR_BIT -#define setbit(a,i) ((a)[(i)/NBBY] |= 1<<((i)%NBBY)) -#define clrbit(a,i) ((a)[(i)/NBBY] &= ~(1<<((i)%NBBY))) -#define isset(a,i) ((a)[(i)/NBBY] & (1<<((i)%NBBY))) -#define isclr(a,i) (((a)[(i)/NBBY] & (1<<((i)%NBBY))) == 0) -#endif - -#endif /* _BB_INTERNAL_H_ */ diff --git a/mdk-stage1/insmod-busybox/insmod.c b/mdk-stage1/insmod-busybox/insmod.c deleted file mode 100644 index d1027004c..000000000 --- a/mdk-stage1/insmod-busybox/insmod.c +++ /dev/null @@ -1,2951 +0,0 @@ -/* vi: set sw=4 ts=4: */ -/* - * Mini insmod implementation for busybox - * - * Copyright (C) 1999,2000 by Lineo, inc. - * Written by Erik Andersen <andersen@lineo.com> - * and Ron Alder <alder@lineo.com> - * - * Modified by Bryan Rittmeyer <bryan@ixiacom.com> to support SH4 - * and (theoretically) SH3. Note that there is still no true - * multiple architecture support. You just get SH3|SH4|i386, despite - * the mention of ARM and m68k--which may or may not work (but - * almost certainly do not, due to at least MATCH_MACHINE). I have - * only tested SH4 in little endian mode. - * - * Based almost entirely on the Linux modutils-2.3.11 implementation. - * Copyright 1996, 1997 Linux International. - * New implementation contributed by Richard Henderson <rth@tamu.edu> - * Based on original work by Bjorn Ekwall <bj0rn@blox.se> - * Restructured (and partly rewritten) by: - * Björn Ekwall <bj0rn@blox.se> February 1999 - * - * 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 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, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - */ - -#include "../insmod.h" -#include "busybox.h" -#include <stdlib.h> -#include <stdio.h> -#include <stddef.h> -#include <errno.h> -#include <unistd.h> -#include <dirent.h> -#include <ctype.h> -#include <assert.h> -#include <sys/utsname.h> - -//---------------------------------------------------------------------------- -//--------modutils module.h, lines 45-242 -//---------------------------------------------------------------------------- - -/* Definitions for the Linux module syscall interface. - Copyright 1996, 1997 Linux International. - - Contributed by Richard Henderson <rth@tamu.edu> - - This file is part of the Linux modutils. - - 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 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, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - - -#ifndef MODUTILS_MODULE_H -#define MODUTILS_MODULE_H 1 - -#ident "$Id$" - -/* This file contains the structures used by the 2.0 and 2.1 kernels. - We do not use the kernel headers directly because we do not wish - to be dependant on a particular kernel version to compile insmod. */ - - -/*======================================================================*/ -/* The structures used by Linux 2.0. */ - -/* The symbol format used by get_kernel_syms(2). */ -struct old_kernel_sym -{ - unsigned long value; - char name[60]; -}; - -struct old_module_ref -{ - unsigned long module; /* kernel addresses */ - unsigned long next; -}; - -struct old_module_symbol -{ - unsigned long addr; - unsigned long name; -}; - -struct old_symbol_table -{ - int size; /* total, including string table!!! */ - int n_symbols; - int n_refs; - struct old_module_symbol symbol[0]; /* actual size defined by n_symbols */ - struct old_module_ref ref[0]; /* actual size defined by n_refs */ -}; - -struct old_mod_routines -{ - unsigned long init; - unsigned long cleanup; -}; - -struct old_module -{ - unsigned long next; - unsigned long ref; /* the list of modules that refer to me */ - unsigned long symtab; - unsigned long name; - int size; /* size of module in pages */ - unsigned long addr; /* address of module */ - int state; - unsigned long cleanup; /* cleanup routine */ -}; - -/* Sent to init_module(2) or'ed into the code size parameter. */ -#define OLD_MOD_AUTOCLEAN 0x40000000 /* big enough, but no sign problems... */ - -int get_kernel_syms(struct old_kernel_sym *); -int old_sys_init_module(const char *name, char *code, unsigned codesize, - struct old_mod_routines *, struct old_symbol_table *); - -/*======================================================================*/ -/* For sizeof() which are related to the module platform and not to the - environment isnmod is running in, use sizeof_xx instead of sizeof(xx). */ - -#define tgt_sizeof_char sizeof(char) -#define tgt_sizeof_short sizeof(short) -#define tgt_sizeof_int sizeof(int) -#define tgt_sizeof_long sizeof(long) -#define tgt_sizeof_char_p sizeof(char *) -#define tgt_sizeof_void_p sizeof(void *) -#define tgt_long long - -#if defined(__sparc__) && !defined(__sparc_v9__) && defined(ARCH_sparc64) -#undef tgt_sizeof_long -#undef tgt_sizeof_char_p -#undef tgt_sizeof_void_p -#undef tgt_long -#define tgt_sizeof_long 8 -#define tgt_sizeof_char_p 8 -#define tgt_sizeof_void_p 8 -#define tgt_long long long -#endif - -/*======================================================================*/ -/* The structures used in Linux 2.1. */ - -/* Note: new_module_symbol does not use tgt_long intentionally */ -struct new_module_symbol -{ - unsigned long value; - unsigned long name; -}; - -struct new_module_persist; - -struct new_module_ref -{ - unsigned tgt_long dep; /* kernel addresses */ - unsigned tgt_long ref; - unsigned tgt_long next_ref; -}; - -struct new_module -{ - unsigned tgt_long size_of_struct; /* == sizeof(module) */ - unsigned tgt_long next; - unsigned tgt_long name; - unsigned tgt_long size; - - tgt_long usecount; - unsigned tgt_long flags; /* AUTOCLEAN et al */ - - unsigned nsyms; - unsigned ndeps; - - unsigned tgt_long syms; - unsigned tgt_long deps; - unsigned tgt_long refs; - unsigned tgt_long init; - unsigned tgt_long cleanup; - unsigned tgt_long ex_table_start; - unsigned tgt_long ex_table_end; -#ifdef __alpha__ - unsigned tgt_long gp; -#endif - /* Everything after here is extension. */ - unsigned tgt_long persist_start; - unsigned tgt_long persist_end; - unsigned tgt_long can_unload; - unsigned tgt_long runsize; -}; - -struct new_module_info -{ - unsigned long addr; - unsigned long size; - unsigned long flags; - long usecount; -}; - -/* Bits of module.flags. */ -#define NEW_MOD_RUNNING 1 -#define NEW_MOD_DELETED 2 -#define NEW_MOD_AUTOCLEAN 4 -#define NEW_MOD_VISITED 8 -#define NEW_MOD_USED_ONCE 16 - -int new_sys_init_module(const char *name, const struct new_module *); -int query_module(const char *name, int which, void *buf, size_t bufsize, - size_t *ret); - -/* Values for query_module's which. */ - -#define QM_MODULES 1 -#define QM_DEPS 2 -#define QM_REFS 3 -#define QM_SYMBOLS 4 -#define QM_INFO 5 - -/*======================================================================*/ -/* The system calls unchanged between 2.0 and 2.1. */ - -unsigned long create_module(const char *, size_t); -int delete_module(const char *); - - -#endif /* module.h */ - -//---------------------------------------------------------------------------- -//--------end of modutils module.h -//---------------------------------------------------------------------------- - - - -//---------------------------------------------------------------------------- -//--------modutils obj.h, lines 253-462 -//---------------------------------------------------------------------------- - -/* Elf object file loading and relocation routines. - Copyright 1996, 1997 Linux International. - - Contributed by Richard Henderson <rth@tamu.edu> - - This file is part of the Linux modutils. - - 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 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, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - - -#ifndef MODUTILS_OBJ_H -#define MODUTILS_OBJ_H 1 - -#ident "$Id$" - -/* The relocatable object is manipulated using elfin types. */ - -#include <stdio.h> -#include <elf.h> - - -/* Machine-specific elf macros for i386 et al. */ - -/* the SH changes have only been tested on the SH4 in =little endian= mode */ -/* I'm not sure about big endian, so let's warn: */ - -#if (defined(__SH4__) || defined(__SH3__)) && defined(__BIG_ENDIAN__) -#error insmod.c may require changes for use on big endian SH4/SH3 -#endif - -/* it may or may not work on the SH1/SH2... So let's error on those - also */ -#if (defined(__sh__) && (!(defined(__SH3__) || defined(__SH4__)))) -#error insmod.c may require changes for non-SH3/SH4 use -#endif - -#define ELFCLASSM ELFCLASS32 -#define ELFDATAM ELFDATA2LSB - - - -#if defined(__sh__) - -#define MATCH_MACHINE(x) (x == EM_SH) -#define SHT_RELM SHT_RELA -#define Elf32_RelM Elf32_Rela - -#else - -/* presumably we can use these for anything but the SH */ -/* this is the previous behavior, but it does result in - insmod.c being broken on anything except i386 */ - -#define MATCH_MACHINE(x) (x == EM_386) -#define SHT_RELM SHT_REL -#define Elf32_RelM Elf32_Rel - -#endif - -#ifndef ElfW -# if ELFCLASSM == ELFCLASS32 -# define ElfW(x) Elf32_ ## x -# define ELFW(x) ELF32_ ## x -# else -# define ElfW(x) Elf64_ ## x -# define ELFW(x) ELF64_ ## x -# endif -#endif - -/* For some reason this is missing from libc5. */ -#ifndef ELF32_ST_INFO -# define ELF32_ST_INFO(bind, type) (((bind) << 4) + ((type) & 0xf)) -#endif - -#ifndef ELF64_ST_INFO -# define ELF64_ST_INFO(bind, type) (((bind) << 4) + ((type) & 0xf)) -#endif - -struct obj_string_patch; -struct obj_symbol_patch; - -struct obj_section -{ - ElfW(Shdr) header; - const char *name; - char *contents; - struct obj_section *load_next; - int idx; -}; - -struct obj_symbol -{ - struct obj_symbol *next; /* hash table link */ - const char *name; - unsigned long value; - unsigned long size; - int secidx; /* the defining section index/module */ - int info; - int ksymidx; /* for export to the kernel symtab */ - int referenced; /* actually used in the link */ -}; - -/* Hardcode the hash table size. We shouldn't be needing so many - symbols that we begin to degrade performance, and we get a big win - by giving the compiler a constant divisor. */ - -#define HASH_BUCKETS 521 - -struct obj_file -{ - ElfW(Ehdr) header; - ElfW(Addr) baseaddr; - struct obj_section **sections; - struct obj_section *load_order; - struct obj_section **load_order_search_start; - struct obj_string_patch *string_patches; - struct obj_symbol_patch *symbol_patches; - int (*symbol_cmp)(const char *, const char *); - unsigned long (*symbol_hash)(const char *); - unsigned long local_symtab_size; - struct obj_symbol **local_symtab; - struct obj_symbol *symtab[HASH_BUCKETS]; -}; - -enum obj_reloc -{ - obj_reloc_ok, - obj_reloc_overflow, - obj_reloc_dangerous, - obj_reloc_unhandled -}; - -struct obj_string_patch -{ - struct obj_string_patch *next; - int reloc_secidx; - ElfW(Addr) reloc_offset; - ElfW(Addr) string_offset; -}; - -struct obj_symbol_patch -{ - struct obj_symbol_patch *next; - int reloc_secidx; - ElfW(Addr) reloc_offset; - struct obj_symbol *sym; -}; - - -/* Generic object manipulation routines. */ - -unsigned long obj_elf_hash(const char *); - -unsigned long obj_elf_hash_n(const char *, unsigned long len); - -struct obj_symbol *obj_add_symbol (struct obj_file *f, const char *name, - unsigned long symidx, int info, int secidx, - ElfW(Addr) value, unsigned long size); - -struct obj_symbol *obj_find_symbol (struct obj_file *f, - const char *name); - -ElfW(Addr) obj_symbol_final_value(struct obj_file *f, - struct obj_symbol *sym); - -void obj_set_symbol_compare(struct obj_file *f, - int (*cmp)(const char *, const char *), - unsigned long (*hash)(const char *)); - -struct obj_section *obj_find_section (struct obj_file *f, - const char *name); - -void obj_insert_section_load_order (struct obj_file *f, - struct obj_section *sec); - -struct obj_section *obj_create_alloced_section (struct obj_file *f, - const char *name, - unsigned long align, - unsigned long size); - -struct obj_section *obj_create_alloced_section_first (struct obj_file *f, - const char *name, - unsigned long align, - unsigned long size); - -void *obj_extend_section (struct obj_section *sec, unsigned long more); - -int obj_string_patch(struct obj_file *f, int secidx, ElfW(Addr) offset, - const char *string); - -int obj_symbol_patch(struct obj_file *f, int secidx, ElfW(Addr) offset, - struct obj_symbol *sym); - -int obj_check_undefineds(struct obj_file *f); - -void obj_allocate_commons(struct obj_file *f); - -unsigned long obj_load_size (struct obj_file *f); - -int obj_relocate (struct obj_file *f, ElfW(Addr) base); - -struct obj_file *obj_load(FILE *f); - -int obj_create_image (struct obj_file *f, char *image); - -/* Architecture specific manipulation routines. */ - -struct obj_file *arch_new_file (void); - -struct obj_section *arch_new_section (void); - -struct obj_symbol *arch_new_symbol (void); - -enum obj_reloc arch_apply_relocation (struct obj_file *f, - struct obj_section *targsec, - struct obj_section *symsec, - struct obj_symbol *sym, - ElfW(RelM) *rel, ElfW(Addr) value); - -int arch_create_got (struct obj_file *f); - -struct new_module; -int arch_init_module (struct obj_file *f, struct new_module *); - -#endif /* obj.h */ -//---------------------------------------------------------------------------- -//--------end of modutils obj.h -//---------------------------------------------------------------------------- - - - - - -#define _PATH_MODULES "/lib/modules" -#define STRVERSIONLEN 32 - -#if !defined(BB_FEATURE_INSMOD_NEW_KERNEL) && !defined(BB_FEATURE_INSMOD_OLD_KERNEL) -#error "Must have ether BB_FEATURE_INSMOD_NEW_KERNEL or BB_FEATURE_INSMOD_OLD_KERNEL defined" -#endif - -/*======================================================================*/ - -int flag_force_load = 0; -int flag_autoclean = 0; -int flag_export = 1; - - -/*======================================================================*/ - -/* previously, these were named i386_* but since we could be - compiling for the sh, I've renamed them to the more general - arch_* These structures are the same between the x86 and SH, - and we can't support anything else right now anyway. In the - future maybe they should be #if defined'd */ - -struct arch_got_entry { - int offset; - unsigned offset_done:1; - unsigned reloc_done:1; -}; - -struct arch_file { - struct obj_file root; - struct obj_section *got; -}; - -struct arch_symbol { - struct obj_symbol root; - struct arch_got_entry gotent; -}; - - -struct external_module { - const char *name; - ElfW(Addr) addr; - int used; - size_t nsyms; - struct new_module_symbol *syms; -}; - -struct new_module_symbol *ksyms; -size_t nksyms; - -struct external_module *ext_modules; -int n_ext_modules; -int n_ext_modules_used; - - - -/* Some firendly syscalls to cheer everyone's day... */ -#define __NR_new_sys_init_module __NR_init_module -_syscall2(int, new_sys_init_module, const char *, name, - const struct new_module *, info) -#define __NR_old_sys_init_module __NR_init_module -_syscall5(int, old_sys_init_module, const char *, name, char *, code, - unsigned, codesize, struct old_mod_routines *, routines, - struct old_symbol_table *, symtab) -#ifndef BB_RMMOD -_syscall1(int, delete_module, const char *, name) -#else -extern int delete_module(const char *); -#endif - -/* This is kind of troublesome. See, we don't actually support - the m68k or the arm the same way we support i386 and (now) - sh. In doing my SH patch, I just assumed that whatever works - for i386 also works for m68k and arm since currently insmod.c - does nothing special for them. If this isn't true, the below - line is rather misleading IMHO, and someone should either - change it or add more proper architecture-dependent support - for these boys. - - -- Bryan Rittmeyer <bryan@ixiacom.com> */ - -#if defined(__i386__) || defined(__m68k__) || defined(__arm__) -/* Jump through hoops to fixup error return codes */ -#define __NR__create_module __NR_create_module -static inline _syscall2(long, _create_module, const char *, name, size_t, - size) -unsigned long create_module(const char *name, size_t size) -{ - long ret = _create_module(name, size); - - if (ret == -1 && errno > 125) { - ret = -errno; - errno = 0; - } - return ret; -} -#else -_syscall2(unsigned long, create_module, const char *, name, size_t, size) -#endif -static char m_filename[BUFSIZ + 1] = "\0"; -static char m_fullName[BUFSIZ + 1] = "\0"; - -/*======================================================================*/ - - -/*======================================================================*/ - -struct obj_file *arch_new_file(void) -{ - struct arch_file *f; - f = xmalloc(sizeof(*f)); - f->got = NULL; - return &f->root; -} - -struct obj_section *arch_new_section(void) -{ - return xmalloc(sizeof(struct obj_section)); -} - -struct obj_symbol *arch_new_symbol(void) -{ - struct arch_symbol *sym; - sym = xmalloc(sizeof(*sym)); - memset(&sym->gotent, 0, sizeof(sym->gotent)); - return &sym->root; -} - -enum obj_reloc -arch_apply_relocation(struct obj_file *f, - struct obj_section *targsec, - struct obj_section *symsec, - struct obj_symbol *sym, -#if defined(__sh__) - Elf32_Rela * rel, Elf32_Addr v) -#else - Elf32_Rel * rel, Elf32_Addr v) -#endif -{ - struct arch_file *ifile = (struct arch_file *) f; - struct arch_symbol *isym = (struct arch_symbol *) sym; - - Elf32_Addr *loc = (Elf32_Addr *) (targsec->contents + rel->r_offset); - Elf32_Addr dot = targsec->header.sh_addr + rel->r_offset; - Elf32_Addr got = ifile->got ? ifile->got->header.sh_addr : 0; - - enum obj_reloc ret = obj_reloc_ok; - - switch (ELF32_R_TYPE(rel->r_info)) { - -/* even though these constants seem to be the same for - the i386 and the sh, we "#if define" them for clarity - and in case that ever changes */ -#if defined(__sh__) - case R_SH_NONE: -#else - case R_386_NONE: -#endif - break; - -#if defined(__sh__) - case R_SH_DIR32: -#else - case R_386_32: -#endif - *loc += v; - break; - -#if defined(__sh__) - case R_SH_REL32: -#else - case R_386_PLT32: - case R_386_PC32: -#endif - *loc += v - dot; - break; - -#if defined(__sh__) - case R_SH_PLT32: - *loc = v - dot; - break; -#endif - - -#if defined(__sh__) - case R_SH_GLOB_DAT: - case R_SH_JMP_SLOT: - *loc = v; - break; -#else - case R_386_GLOB_DAT: - case R_386_JMP_SLOT: - *loc = v; - break; -#endif - -#if defined(__sh__) - case R_SH_RELATIVE: - *loc += f->baseaddr + rel->r_addend; - break; -#else - case R_386_RELATIVE: - *loc += f->baseaddr; - break; -#endif - -#if defined(__sh__) - case R_SH_GOTPC: - assert(got != 0); - *loc += got - dot + rel->r_addend;; - break; -#else - case R_386_GOTPC: - assert(got != 0); - *loc += got - dot; - break; -#endif - -#if defined(__sh__) - case R_SH_GOT32: - assert(isym != NULL); - if (!isym->gotent.reloc_done) { - isym->gotent.reloc_done = 1; - *(Elf32_Addr *) (ifile->got->contents + isym->gotent.offset) = - v; - } - *loc += isym->gotent.offset + rel->r_addend; - break; -#else - case R_386_GOT32: - assert(isym != NULL); - if (!isym->gotent.reloc_done) { - isym->gotent.reloc_done = 1; - *(Elf32_Addr *) (ifile->got->contents + isym->gotent.offset) = - v; - } - *loc += isym->gotent.offset; - break; -#endif - -#if defined(__sh__) - case R_SH_GOTOFF: -#else - case R_386_GOTOFF: -#endif - assert(got != 0); - *loc += v - got; - break; - - default: - ret = obj_reloc_unhandled; - break; - } - - return ret; -} - -int arch_create_got(struct obj_file *f) -{ - struct arch_file *ifile = (struct arch_file *) f; - int i, n, offset = 0, gotneeded = 0; - - n = ifile->root.header.e_shnum; - for (i = 0; i < n; ++i) { - struct obj_section *relsec, *symsec, *strsec; -#if defined(__sh__) - Elf32_Rela *rel, *relend; -#else - Elf32_Rel *rel, *relend; -#endif - Elf32_Sym *symtab; - const char *strtab; - - relsec = ifile->root.sections[i]; - if (relsec->header.sh_type != SHT_REL) - continue; - - symsec = ifile->root.sections[relsec->header.sh_link]; - strsec = ifile->root.sections[symsec->header.sh_link]; - - -#if defined(__sh__) - rel = (Elf32_Rela *) relsec->contents; - relend = rel + (relsec->header.sh_size / sizeof(Elf32_Rela)); -#else - rel = (Elf32_Rel *) relsec->contents; - relend = rel + (relsec->header.sh_size / sizeof(Elf32_Rel)); -#endif - symtab = (Elf32_Sym *) symsec->contents; - strtab = (const char *) strsec->contents; - - for (; rel < relend; ++rel) { - Elf32_Sym *extsym; - struct arch_symbol *intsym; - const char *name; - - switch (ELF32_R_TYPE(rel->r_info)) { -#if defined(__sh__) - case R_SH_GOTPC: - case R_SH_GOTOFF: -#else - case R_386_GOTPC: - case R_386_GOTOFF: -#endif - gotneeded = 1; - default: - continue; - -#if defined(__sh__) - case R_SH_GOT32: -#else - case R_386_GOT32: -#endif - break; - } - - extsym = &symtab[ELF32_R_SYM(rel->r_info)]; - if (extsym->st_name) - name = strtab + extsym->st_name; - else - name = f->sections[extsym->st_shndx]->name; - intsym = - (struct arch_symbol *) obj_find_symbol(&ifile->root, name); - - if (!intsym->gotent.offset_done) { - intsym->gotent.offset_done = 1; - intsym->gotent.offset = offset; - offset += 4; - } - } - } - - if (offset > 0 || gotneeded) - ifile->got = - obj_create_alloced_section(&ifile->root, ".got", 4, offset); - - return 1; -} - -int arch_init_module(struct obj_file *f, struct new_module *mod) -{ - return 1; -} - - -/*======================================================================*/ - -/* Standard ELF hash function. */ -inline unsigned long obj_elf_hash_n(const char *name, unsigned long n) -{ - unsigned long h = 0; - unsigned long g; - unsigned char ch; - - while (n > 0) { - ch = *name++; - h = (h << 4) + ch; - if ((g = (h & 0xf0000000)) != 0) { - h ^= g >> 24; - h &= ~g; - } - n--; - } - return h; -} - -unsigned long obj_elf_hash(const char *name) -{ - return obj_elf_hash_n(name, strlen(name)); -} - -#ifdef BB_FEATURE_INSMOD_VERSION_CHECKING -/* Get the kernel version in the canonical integer form. */ - -static int get_kernel_version(char str[STRVERSIONLEN]) -{ - struct utsname uts_info; - char *p, *q; - int a, b, c; - - if (uname(&uts_info) < 0) - return -1; - strncpy(str, uts_info.release, STRVERSIONLEN); - p = uts_info.release; - - a = strtoul(p, &p, 10); - if (*p != '.') - return -1; - b = strtoul(p + 1, &p, 10); - if (*p != '.') - return -1; - c = strtoul(p + 1, &q, 10); - if (p + 1 == q) - return -1; - - return a << 16 | b << 8 | c; -} - -/* String comparison for non-co-versioned kernel and module. */ - -static int ncv_strcmp(const char *a, const char *b) -{ - size_t alen = strlen(a), blen = strlen(b); - - if (blen == alen + 10 && b[alen] == '_' && b[alen + 1] == 'R') - return strncmp(a, b, alen); - else if (alen == blen + 10 && a[blen] == '_' && a[blen + 1] == 'R') - return strncmp(a, b, blen); - else - return strcmp(a, b); -} - -/* String hashing for non-co-versioned kernel and module. Here - we are simply forced to drop the crc from the hash. */ - -static unsigned long ncv_symbol_hash(const char *str) -{ - size_t len = strlen(str); - if (len > 10 && str[len - 10] == '_' && str[len - 9] == 'R') - len -= 10; - return obj_elf_hash_n(str, len); -} - -void -obj_set_symbol_compare(struct obj_file *f, - int (*cmp) (const char *, const char *), - unsigned long (*hash) (const char *)) -{ - if (cmp) - f->symbol_cmp = cmp; - if (hash) { - struct obj_symbol *tmptab[HASH_BUCKETS], *sym, *next; - int i; - - f->symbol_hash = hash; - - memcpy(tmptab, f->symtab, sizeof(tmptab)); - memset(f->symtab, 0, sizeof(f->symtab)); - - for (i = 0; i < HASH_BUCKETS; ++i) - for (sym = tmptab[i]; sym; sym = next) { - unsigned long h = hash(sym->name) % HASH_BUCKETS; - next = sym->next; - sym->next = f->symtab[h]; - f->symtab[h] = sym; - } - } -} - -#endif /* BB_FEATURE_INSMOD_VERSION_CHECKING */ - - -struct obj_symbol *obj_add_symbol(struct obj_file *f, const char *name, - unsigned long symidx, int info, - int secidx, ElfW(Addr) value, - unsigned long size) -{ - struct obj_symbol *sym; - unsigned long hash = f->symbol_hash(name) % HASH_BUCKETS; - int n_type = ELFW(ST_TYPE) (info); - int n_binding = ELFW(ST_BIND) (info); - - for (sym = f->symtab[hash]; sym; sym = sym->next) - if (f->symbol_cmp(sym->name, name) == 0) { - int o_secidx = sym->secidx; - int o_info = sym->info; - int o_type = ELFW(ST_TYPE) (o_info); - int o_binding = ELFW(ST_BIND) (o_info); - - /* A redefinition! Is it legal? */ - - if (secidx == SHN_UNDEF) - return sym; - else if (o_secidx == SHN_UNDEF) - goto found; - else if (n_binding == STB_GLOBAL && o_binding == STB_LOCAL) { - /* Cope with local and global symbols of the same name - in the same object file, as might have been created - by ld -r. The only reason locals are now seen at this - level at all is so that we can do semi-sensible things - with parameters. */ - - struct obj_symbol *nsym, **p; - - nsym = arch_new_symbol(); - nsym->next = sym->next; - nsym->ksymidx = -1; - - /* Excise the old (local) symbol from the hash chain. */ - for (p = &f->symtab[hash]; *p != sym; p = &(*p)->next) - continue; - *p = sym = nsym; - goto found; - } else if (n_binding == STB_LOCAL) { - /* Another symbol of the same name has already been defined. - Just add this to the local table. */ - sym = arch_new_symbol(); - sym->next = NULL; - sym->ksymidx = -1; - f->local_symtab[symidx] = sym; - goto found; - } else if (n_binding == STB_WEAK) - return sym; - else if (o_binding == STB_WEAK) - goto found; - /* Don't unify COMMON symbols with object types the programmer - doesn't expect. */ - else if (secidx == SHN_COMMON - && (o_type == STT_NOTYPE || o_type == STT_OBJECT)) - return sym; - else if (o_secidx == SHN_COMMON - && (n_type == STT_NOTYPE || n_type == STT_OBJECT)) - goto found; - else { - /* Don't report an error if the symbol is coming from - the kernel or some external module. */ - if (secidx <= SHN_HIRESERVE) - errorMsg("%s multiply defined", name); - return sym; - } - } - - /* Completely new symbol. */ - sym = arch_new_symbol(); - sym->next = f->symtab[hash]; - f->symtab[hash] = sym; - sym->ksymidx = -1; - - if (ELFW(ST_BIND) (info) == STB_LOCAL) - f->local_symtab[symidx] = sym; - - found: - sym->name = name; - sym->value = value; - sym->size = size; - sym->secidx = secidx; - sym->info = info; - - return sym; -} - -struct obj_symbol *obj_find_symbol(struct obj_file *f, const char *name) -{ - struct obj_symbol *sym; - unsigned long hash = f->symbol_hash(name) % HASH_BUCKETS; - - for (sym = f->symtab[hash]; sym; sym = sym->next) - if (f->symbol_cmp(sym->name, name) == 0) - return sym; - - return NULL; -} - -ElfW(Addr) - obj_symbol_final_value(struct obj_file * f, struct obj_symbol * sym) -{ - if (sym) { - if (sym->secidx >= SHN_LORESERVE) - return sym->value; - - return sym->value + f->sections[sym->secidx]->header.sh_addr; - } else { - /* As a special case, a NULL sym has value zero. */ - return 0; - } -} - -struct obj_section *obj_find_section(struct obj_file *f, const char *name) -{ - int i, n = f->header.e_shnum; - - for (i = 0; i < n; ++i) - if (strcmp(f->sections[i]->name, name) == 0) - return f->sections[i]; - - return NULL; -} - -static int obj_load_order_prio(struct obj_section *a) -{ - unsigned long af, ac; - - af = a->header.sh_flags; - - ac = 0; - if (a->name[0] != '.' || strlen(a->name) != 10 || - strcmp(a->name + 5, ".init")) - ac |= 32; - if (af & SHF_ALLOC) - ac |= 16; - if (!(af & SHF_WRITE)) - ac |= 8; - if (af & SHF_EXECINSTR) - ac |= 4; - if (a->header.sh_type != SHT_NOBITS) - ac |= 2; - - return ac; -} - -void -obj_insert_section_load_order(struct obj_file *f, struct obj_section *sec) -{ - struct obj_section **p; - int prio = obj_load_order_prio(sec); - for (p = f->load_order_search_start; *p; p = &(*p)->load_next) - if (obj_load_order_prio(*p) < prio) - break; - sec->load_next = *p; - *p = sec; -} - -struct obj_section *obj_create_alloced_section(struct obj_file *f, - const char *name, - unsigned long align, - unsigned long size) -{ - int newidx = f->header.e_shnum++; - struct obj_section *sec; - - f->sections = xrealloc(f->sections, (newidx + 1) * sizeof(sec)); - f->sections[newidx] = sec = arch_new_section(); - - memset(sec, 0, sizeof(*sec)); - sec->header.sh_type = SHT_PROGBITS; - sec->header.sh_flags = SHF_WRITE | SHF_ALLOC; - sec->header.sh_size = size; - sec->header.sh_addralign = align; - sec->name = name; - sec->idx = newidx; - if (size) - sec->contents = xmalloc(size); - - obj_insert_section_load_order(f, sec); - - return sec; -} - -struct obj_section *obj_create_alloced_section_first(struct obj_file *f, - const char *name, - unsigned long align, - unsigned long size) -{ - int newidx = f->header.e_shnum++; - struct obj_section *sec; - - f->sections = xrealloc(f->sections, (newidx + 1) * sizeof(sec)); - f->sections[newidx] = sec = arch_new_section(); - - memset(sec, 0, sizeof(*sec)); - sec->header.sh_type = SHT_PROGBITS; - sec->header.sh_flags = SHF_WRITE | SHF_ALLOC; - sec->header.sh_size = size; - sec->header.sh_addralign = align; - sec->name = name; - sec->idx = newidx; - if (size) - sec->contents = xmalloc(size); - - sec->load_next = f->load_order; - f->load_order = sec; - if (f->load_order_search_start == &f->load_order) - f->load_order_search_start = &sec->load_next; - - return sec; -} - -void *obj_extend_section(struct obj_section *sec, unsigned long more) -{ - unsigned long oldsize = sec->header.sh_size; - sec->contents = xrealloc(sec->contents, sec->header.sh_size += more); - return sec->contents + oldsize; -} - - - -/* Conditionally add the symbols from the given symbol set to the - new module. */ - -static int -add_symbols_from( - struct obj_file *f, - int idx, struct new_module_symbol *syms, size_t nsyms) -{ - struct new_module_symbol *s; - size_t i; - int used = 0; - - for (i = 0, s = syms; i < nsyms; ++i, ++s) { - - /* Only add symbols that are already marked external. If we - override locals we may cause problems for argument initialization. - We will also create a false dependency on the module. */ - struct obj_symbol *sym; - - sym = obj_find_symbol(f, (char *) s->name); - if (sym && !ELFW(ST_BIND) (sym->info) == STB_LOCAL) { - sym = obj_add_symbol(f, (char *) s->name, -1, - ELFW(ST_INFO) (STB_GLOBAL, STT_NOTYPE), - idx, s->value, 0); - /* Did our symbol just get installed? If so, mark the - module as "used". */ - if (sym->secidx == idx) - used = 1; - } - } - - return used; -} - -static void add_kernel_symbols(struct obj_file *f) -{ - struct external_module *m; - int i, nused = 0; - - /* Add module symbols first. */ - - for (i = 0, m = ext_modules; i < n_ext_modules; ++i, ++m) - if (m->nsyms - && add_symbols_from(f, SHN_HIRESERVE + 2 + i, m->syms, - m->nsyms)) m->used = 1, ++nused; - - n_ext_modules_used = nused; - - /* And finally the symbols from the kernel proper. */ - - if (nksyms) - add_symbols_from(f, SHN_HIRESERVE + 1, ksyms, nksyms); -} - -static char *get_modinfo_value(struct obj_file *f, const char *key) -{ - struct obj_section *sec; - char *p, *v, *n, *ep; - size_t klen = strlen(key); - - sec = obj_find_section(f, ".modinfo"); - if (sec == NULL) - return NULL; - p = sec->contents; - ep = p + sec->header.sh_size; - while (p < ep) { - v = strchr(p, '='); - n = strchr(p, '\0'); - if (v) { - if (p + klen == v && strncmp(p, key, klen) == 0) - return v + 1; - } else { - if (p + klen == n && strcmp(p, key) == 0) - return n; - } - p = n + 1; - } - - return NULL; -} - - -/*======================================================================*/ -/* Functions relating to module loading in pre 2.1 kernels. */ - -static int -old_process_module_arguments(struct obj_file *f, int argc, char **argv) -{ - while (argc > 0) { - char *p, *q; - struct obj_symbol *sym; - int *loc; - - p = *argv; - if ((q = strchr(p, '=')) == NULL) { - argc--; - continue; - } - *q++ = '\0'; - - sym = obj_find_symbol(f, p); - - /* Also check that the parameter was not resolved from the kernel. */ - if (sym == NULL || sym->secidx > SHN_HIRESERVE) { - errorMsg("symbol for parameter %s not found", p); - return 0; - } - - loc = (int *) (f->sections[sym->secidx]->contents + sym->value); - - /* Do C quoting if we begin with a ". */ - if (*q == '"') { - char *r, *str; - - str = alloca(strlen(q)); - for (r = str, q++; *q != '"'; ++q, ++r) { - if (*q == '\0') { - errorMsg("improperly terminated string argument for %s", p); - return 0; - } else if (*q == '\\') - switch (*++q) { - case 'a': - *r = '\a'; - break; - case 'b': - *r = '\b'; - break; - case 'e': - *r = '\033'; - break; - case 'f': - *r = '\f'; - break; - case 'n': - *r = '\n'; - break; - case 'r': - *r = '\r'; - break; - case 't': - *r = '\t'; - break; - - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - { - int c = *q - '0'; - if (q[1] >= '0' && q[1] <= '7') { - c = (c * 8) + *++q - '0'; - if (q[1] >= '0' && q[1] <= '7') - c = (c * 8) + *++q - '0'; - } - *r = c; - } - break; - - default: - *r = *q; - break; - } else - *r = *q; - } - *r = '\0'; - obj_string_patch(f, sym->secidx, sym->value, str); - } else if (*q >= '0' && *q <= '9') { - do - *loc++ = strtoul(q, &q, 0); - while (*q++ == ','); - } else { - char *contents = f->sections[sym->secidx]->contents; - char *loc = contents + sym->value; - char *r; /* To search for commas */ - - /* Break the string with comas */ - while ((r = strchr(q, ',')) != (char *) NULL) { - *r++ = '\0'; - obj_string_patch(f, sym->secidx, loc - contents, q); - loc += sizeof(char *); - q = r; - } - - /* last part */ - obj_string_patch(f, sym->secidx, loc - contents, q); - } - - argc--, argv++; - } - - return 1; -} - -#ifdef BB_FEATURE_INSMOD_VERSION_CHECKING -static int old_is_module_checksummed(struct obj_file *f) -{ - return obj_find_symbol(f, "Using_Versions") != NULL; -} -/* Get the module's kernel version in the canonical integer form. */ - -static int -old_get_module_version(struct obj_file *f, char str[STRVERSIONLEN]) -{ - struct obj_symbol *sym; - char *p, *q; - int a, b, c; - - sym = obj_find_symbol(f, "kernel_version"); - if (sym == NULL) - return -1; - - p = f->sections[sym->secidx]->contents + sym->value; - strncpy(str, p, STRVERSIONLEN); - - a = strtoul(p, &p, 10); - if (*p != '.') - return -1; - b = strtoul(p + 1, &p, 10); - if (*p != '.') - return -1; - c = strtoul(p + 1, &q, 10); - if (p + 1 == q) - return -1; - - return a << 16 | b << 8 | c; -} - -#endif /* BB_FEATURE_INSMOD_VERSION_CHECKING */ - -#ifdef BB_FEATURE_INSMOD_OLD_KERNEL - -/* Fetch all the symbols and divvy them up as appropriate for the modules. */ - -static int old_get_kernel_symbols(const char *m_name) -{ - struct old_kernel_sym *ks, *k; - struct new_module_symbol *s; - struct external_module *mod; - int nks, nms, nmod, i; - - nks = get_kernel_syms(NULL); - if (nks < 0) { - errorMsg("get_kernel_syms: %s: %s", m_name, strerror(errno)); - return 0; - } - - ks = k = xmalloc(nks * sizeof(*ks)); - - if (get_kernel_syms(ks) != nks) { - logperror("inconsistency with get_kernel_syms -- is someone else " - "playing with modules?"); - free(ks); - return 0; - } - - /* Collect the module information. */ - - mod = NULL; - nmod = -1; - - while (k->name[0] == '#' && k->name[1]) { - struct old_kernel_sym *k2; - struct new_module_symbol *s; - - /* Find out how many symbols this module has. */ - for (k2 = k + 1; k2->name[0] != '#'; ++k2) - continue; - nms = k2 - k - 1; - - mod = xrealloc(mod, (++nmod + 1) * sizeof(*mod)); - mod[nmod].name = k->name + 1; - mod[nmod].addr = k->value; - mod[nmod].used = 0; - mod[nmod].nsyms = nms; - mod[nmod].syms = s = (nms ? xmalloc(nms * sizeof(*s)) : NULL); - - for (i = 0, ++k; i < nms; ++i, ++s, ++k) { - s->name = (unsigned long) k->name; - s->value = k->value; - } - - k = k2; - } - - ext_modules = mod; - n_ext_modules = nmod + 1; - - /* Now collect the symbols for the kernel proper. */ - - if (k->name[0] == '#') - ++k; - - nksyms = nms = nks - (k - ks); - ksyms = s = (nms ? xmalloc(nms * sizeof(*s)) : NULL); - - for (i = 0; i < nms; ++i, ++s, ++k) { - s->name = (unsigned long) k->name; - s->value = k->value; - } - - return 1; -} - -/* Return the kernel symbol checksum version, or zero if not used. */ - -static int old_is_kernel_checksummed(void) -{ - /* Using_Versions is the first symbol. */ - if (nksyms > 0 - && strcmp((char *) ksyms[0].name, - "Using_Versions") == 0) return ksyms[0].value; - else - return 0; -} - - -static int old_create_mod_use_count(struct obj_file *f) -{ - struct obj_section *sec; - - sec = obj_create_alloced_section_first(f, ".moduse", sizeof(long), - sizeof(long)); - - obj_add_symbol(f, "mod_use_count_", -1, - ELFW(ST_INFO) (STB_LOCAL, STT_OBJECT), sec->idx, 0, - sizeof(long)); - - return 1; -} - -static int -old_init_module(const char *m_name, struct obj_file *f, - unsigned long m_size) -{ - char *image; - struct old_mod_routines routines; - struct old_symbol_table *symtab; - int ret; - - /* Create the symbol table */ - { - int nsyms = 0, strsize = 0, total; - - /* Size things first... */ - if (flag_export) { - int i; - for (i = 0; i < HASH_BUCKETS; ++i) { - struct obj_symbol *sym; - for (sym = f->symtab[i]; sym; sym = sym->next) - if (ELFW(ST_BIND) (sym->info) != STB_LOCAL - && sym->secidx <= SHN_HIRESERVE) - { - sym->ksymidx = nsyms++; - strsize += strlen(sym->name) + 1; - } - } - } - - total = (sizeof(struct old_symbol_table) - + nsyms * sizeof(struct old_module_symbol) - + n_ext_modules_used * sizeof(struct old_module_ref) - + strsize); - symtab = xmalloc(total); - symtab->size = total; - symtab->n_symbols = nsyms; - symtab->n_refs = n_ext_modules_used; - - if (flag_export && nsyms) { - struct old_module_symbol *ksym; - char *str; - int i; - - ksym = symtab->symbol; - str = ((char *) ksym + nsyms * sizeof(struct old_module_symbol) - + n_ext_modules_used * sizeof(struct old_module_ref)); - - for (i = 0; i < HASH_BUCKETS; ++i) { - struct obj_symbol *sym; - for (sym = f->symtab[i]; sym; sym = sym->next) - if (sym->ksymidx >= 0) { - ksym->addr = obj_symbol_final_value(f, sym); - ksym->name = - (unsigned long) str - (unsigned long) symtab; - - str = stpcpy(str, sym->name) + 1; - ksym++; - } - } - } - - if (n_ext_modules_used) { - struct old_module_ref *ref; - int i; - - ref = (struct old_module_ref *) - ((char *) symtab->symbol + nsyms * sizeof(struct old_module_symbol)); - - for (i = 0; i < n_ext_modules; ++i) - if (ext_modules[i].used) - ref++->module = ext_modules[i].addr; - } - } - - /* Fill in routines. */ - - routines.init = - obj_symbol_final_value(f, obj_find_symbol(f, "init_module")); - routines.cleanup = - obj_symbol_final_value(f, obj_find_symbol(f, "cleanup_module")); - - /* Whew! All of the initialization is complete. Collect the final - module image and give it to the kernel. */ - - image = xmalloc(m_size); - obj_create_image(f, image); - - /* image holds the complete relocated module, accounting correctly for - mod_use_count. However the old module kernel support assume that - it is receiving something which does not contain mod_use_count. */ - ret = old_sys_init_module(m_name, image + sizeof(long), - m_size | (flag_autoclean ? OLD_MOD_AUTOCLEAN - : 0), &routines, symtab); - if (ret) - errorMsg("init_module: %s: %s", m_name, strerror(errno)); - - free(image); - free(symtab); - - return ret == 0; -} - -#else - -#define old_create_mod_use_count(x) TRUE -#define old_init_module(x, y, z) TRUE - -#endif /* BB_FEATURE_INSMOD_OLD_KERNEL */ - - - -/*======================================================================*/ -/* Functions relating to module loading after 2.1.18. */ - -static int -new_process_module_arguments(struct obj_file *f, int argc, char **argv) -{ - while (argc > 0) { - char *p, *q, *key; - struct obj_symbol *sym; - char *contents, *loc; - int min, max, n; - - p = *argv; - if ((q = strchr(p, '=')) == NULL) { - argc--; - continue; - } - - key = alloca(q - p + 6); - memcpy(key, "parm_", 5); - memcpy(key + 5, p, q - p); - key[q - p + 5] = 0; - - p = get_modinfo_value(f, key); - key += 5; - if (p == NULL) { - errorMsg("invalid parameter %s", key); - return 0; - } - - sym = obj_find_symbol(f, key); - - /* Also check that the parameter was not resolved from the kernel. */ - if (sym == NULL || sym->secidx > SHN_HIRESERVE) { - errorMsg("symbol for parameter %s not found", key); - return 0; - } - - if (isdigit(*p)) { - min = strtoul(p, &p, 10); - if (*p == '-') - max = strtoul(p + 1, &p, 10); - else - max = min; - } else - min = max = 1; - - contents = f->sections[sym->secidx]->contents; - loc = contents + sym->value; - n = (*++q != '\0'); - - while (1) { - if ((*p == 's') || (*p == 'c')) { - char *str; - - /* Do C quoting if we begin with a ", else slurp the lot. */ - if (*q == '"') { - char *r; - - str = alloca(strlen(q)); - for (r = str, q++; *q != '"'; ++q, ++r) { - if (*q == '\0') { - errorMsg("improperly terminated string argument for %s", - key); - return 0; - } else if (*q == '\\') - switch (*++q) { - case 'a': - *r = '\a'; - break; - case 'b': - *r = '\b'; - break; - case 'e': - *r = '\033'; - break; - case 'f': - *r = '\f'; - break; - case 'n': - *r = '\n'; - break; - case 'r': - *r = '\r'; - break; - case 't': - *r = '\t'; - break; - - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - { - int c = *q - '0'; - if (q[1] >= '0' && q[1] <= '7') { - c = (c * 8) + *++q - '0'; - if (q[1] >= '0' && q[1] <= '7') - c = (c * 8) + *++q - '0'; - } - *r = c; - } - break; - - default: - *r = *q; - break; - } else - *r = *q; - } - *r = '\0'; - ++q; - } else { - char *r; - - /* In this case, the string is not quoted. We will break - it using the coma (like for ints). If the user wants to - include comas in a string, he just has to quote it */ - - /* Search the next coma */ - r = strchr(q, ','); - - /* Found ? */ - if (r != (char *) NULL) { - /* Recopy the current field */ - str = alloca(r - q + 1); - memcpy(str, q, r - q); - - /* I don't know if it is usefull, as the previous case - doesn't null terminate the string ??? */ - str[r - q] = '\0'; - - /* Keep next fields */ - q = r; - } else { - /* last string */ - str = q; - q = ""; - } - } - - if (*p == 's') { - /* Normal string */ - obj_string_patch(f, sym->secidx, loc - contents, str); - loc += tgt_sizeof_char_p; - } else { - /* Array of chars (in fact, matrix !) */ - unsigned long charssize; /* size of each member */ - - /* Get the size of each member */ - /* Probably we should do that outside the loop ? */ - if (!isdigit(*(p + 1))) { - errorMsg("parameter type 'c' for %s must be followed by" - " the maximum size", key); - return 0; - } - charssize = strtoul(p + 1, (char **) NULL, 10); - - /* Check length */ - if (strlen(str) >= charssize) { - errorMsg("string too long for %s (max %ld)", key, - charssize - 1); - return 0; - } - - /* Copy to location */ - strcpy((char *) loc, str); - loc += charssize; - } - } else { - long v = strtoul(q, &q, 0); - switch (*p) { - case 'b': - *loc++ = v; - break; - case 'h': - *(short *) loc = v; - loc += tgt_sizeof_short; - break; - case 'i': - *(int *) loc = v; - loc += tgt_sizeof_int; - break; - case 'l': - *(long *) loc = v; - loc += tgt_sizeof_long; - break; - - default: - errorMsg("unknown parameter type '%c' for %s", *p, key); - return 0; - } - } - - retry_end_of_value: - switch (*q) { - case '\0': - goto end_of_arg; - - case ' ': - case '\t': - case '\n': - case '\r': - ++q; - goto retry_end_of_value; - - case ',': - if (++n > max) { - errorMsg("too many values for %s (max %d)", key, max); - return 0; - } - ++q; - break; - - default: - errorMsg("invalid argument syntax for %s", key); - return 0; - } - } - - end_of_arg: - if (n < min) { - errorMsg("too few values for %s (min %d)", key, min); - return 0; - } - - argc--, argv++; - } - - return 1; -} - -#ifdef BB_FEATURE_INSMOD_VERSION_CHECKING -static int new_is_module_checksummed(struct obj_file *f) -{ - const char *p = get_modinfo_value(f, "using_checksums"); - if (p) - return atoi(p); - else - return 0; -} - -/* Get the module's kernel version in the canonical integer form. */ - -static int -new_get_module_version(struct obj_file *f, char str[STRVERSIONLEN]) -{ - char *p, *q; - int a, b, c; - - p = get_modinfo_value(f, "kernel_version"); - if (p == NULL) - return -1; - strncpy(str, p, STRVERSIONLEN); - - a = strtoul(p, &p, 10); - if (*p != '.') - return -1; - b = strtoul(p + 1, &p, 10); - if (*p != '.') - return -1; - c = strtoul(p + 1, &q, 10); - if (p + 1 == q) - return -1; - - return a << 16 | b << 8 | c; -} - -#endif /* BB_FEATURE_INSMOD_VERSION_CHECKING */ - - -#ifdef BB_FEATURE_INSMOD_NEW_KERNEL - -/* Fetch the loaded modules, and all currently exported symbols. */ - -static int new_get_kernel_symbols(void) -{ - char *module_names, *mn; - struct external_module *modules, *m; - struct new_module_symbol *syms, *s; - size_t ret, bufsize, nmod, nsyms, i, j; - - /* Collect the loaded modules. */ - - module_names = xmalloc(bufsize = 256); - retry_modules_load: - if (query_module(NULL, QM_MODULES, module_names, bufsize, &ret)) { - if (errno == ENOSPC) { - module_names = xrealloc(module_names, bufsize = ret); - goto retry_modules_load; - } - errorMsg("QM_MODULES: %s", strerror(errno)); - return 0; - } - - n_ext_modules = nmod = ret; - ext_modules = modules = xmalloc(nmod * sizeof(*modules)); - memset(modules, 0, nmod * sizeof(*modules)); - - /* Collect the modules' symbols. */ - - for (i = 0, mn = module_names, m = modules; - i < nmod; ++i, ++m, mn += strlen(mn) + 1) { - struct new_module_info info; - - if (query_module(mn, QM_INFO, &info, sizeof(info), &ret)) { - if (errno == ENOENT) { - /* The module was removed out from underneath us. */ - continue; - } - errorMsg("query_module: QM_INFO: %s: %s", mn, strerror(errno)); - return 0; - } - - syms = xmalloc(bufsize = 1024); - retry_mod_sym_load: - if (query_module(mn, QM_SYMBOLS, syms, bufsize, &ret)) { - switch (errno) { - case ENOSPC: - syms = xrealloc(syms, bufsize = ret); - goto retry_mod_sym_load; - case ENOENT: - /* The module was removed out from underneath us. */ - continue; - default: - errorMsg("query_module: QM_SYMBOLS: %s: %s", mn, strerror(errno)); - return 0; - } - } - nsyms = ret; - - m->name = mn; - m->addr = info.addr; - m->nsyms = nsyms; - m->syms = syms; - - for (j = 0, s = syms; j < nsyms; ++j, ++s) { - s->name += (unsigned long) syms; - } - } - - /* Collect the kernel's symbols. */ - - syms = xmalloc(bufsize = 16 * 1024); - retry_kern_sym_load: - if (query_module(NULL, QM_SYMBOLS, syms, bufsize, &ret)) { - if (errno == ENOSPC) { - syms = xrealloc(syms, bufsize = ret); - goto retry_kern_sym_load; - } - errorMsg("kernel: QM_SYMBOLS: %s", strerror(errno)); - return 0; - } - nksyms = nsyms = ret; - ksyms = syms; - - for (j = 0, s = syms; j < nsyms; ++j, ++s) { - s->name += (unsigned long) syms; - } - return 1; -} - - -/* Return the kernel symbol checksum version, or zero if not used. */ - -static int new_is_kernel_checksummed(void) -{ - struct new_module_symbol *s; - size_t i; - - /* Using_Versions is not the first symbol, but it should be in there. */ - - for (i = 0, s = ksyms; i < nksyms; ++i, ++s) - if (strcmp((char *) s->name, "Using_Versions") == 0) - return s->value; - - return 0; -} - - -static int new_create_this_module(struct obj_file *f, const char *m_name) -{ - struct obj_section *sec; - - sec = obj_create_alloced_section_first(f, ".this", tgt_sizeof_long, - sizeof(struct new_module)); - memset(sec->contents, 0, sizeof(struct new_module)); - - obj_add_symbol(f, "__this_module", -1, - ELFW(ST_INFO) (STB_LOCAL, STT_OBJECT), sec->idx, 0, - sizeof(struct new_module)); - - obj_string_patch(f, sec->idx, offsetof(struct new_module, name), - m_name); - - return 1; -} - - -static int new_create_module_ksymtab(struct obj_file *f) -{ - struct obj_section *sec; - int i; - - /* We must always add the module references. */ - - if (n_ext_modules_used) { - struct new_module_ref *dep; - struct obj_symbol *tm; - - sec = obj_create_alloced_section(f, ".kmodtab", tgt_sizeof_void_p, - (sizeof(struct new_module_ref) - * n_ext_modules_used)); - if (!sec) - return 0; - - tm = obj_find_symbol(f, "__this_module"); - dep = (struct new_module_ref *) sec->contents; - for (i = 0; i < n_ext_modules; ++i) - if (ext_modules[i].used) { - dep->dep = ext_modules[i].addr; - obj_symbol_patch(f, sec->idx, - (char *) &dep->ref - sec->contents, tm); - dep->next_ref = 0; - ++dep; - } - } - - if (flag_export && !obj_find_section(f, "__ksymtab")) { - size_t nsyms; - int *loaded; - - sec = - obj_create_alloced_section(f, "__ksymtab", tgt_sizeof_void_p, - 0); - - /* We don't want to export symbols residing in sections that - aren't loaded. There are a number of these created so that - we make sure certain module options don't appear twice. */ - - loaded = alloca(sizeof(int) * (i = f->header.e_shnum)); - while (--i >= 0) - loaded[i] = (f->sections[i]->header.sh_flags & SHF_ALLOC) != 0; - - for (nsyms = i = 0; i < HASH_BUCKETS; ++i) { - struct obj_symbol *sym; - for (sym = f->symtab[i]; sym; sym = sym->next) - if (ELFW(ST_BIND) (sym->info) != STB_LOCAL - && sym->secidx <= SHN_HIRESERVE - && (sym->secidx >= SHN_LORESERVE - || loaded[sym->secidx])) { - ElfW(Addr) ofs = nsyms * 2 * tgt_sizeof_void_p; - - obj_symbol_patch(f, sec->idx, ofs, sym); - obj_string_patch(f, sec->idx, ofs + tgt_sizeof_void_p, - sym->name); - - nsyms++; - } - } - - obj_extend_section(sec, nsyms * 2 * tgt_sizeof_char_p); - } - - return 1; -} - - -static int -new_init_module(const char *m_name, struct obj_file *f, - unsigned long m_size) -{ - struct new_module *module; - struct obj_section *sec; - void *image; - int ret; - tgt_long m_addr; - - sec = obj_find_section(f, ".this"); - module = (struct new_module *) sec->contents; - m_addr = sec->header.sh_addr; - - module->size_of_struct = sizeof(*module); - module->size = m_size; - module->flags = flag_autoclean ? NEW_MOD_AUTOCLEAN : 0; - - sec = obj_find_section(f, "__ksymtab"); - if (sec && sec->header.sh_size) { - module->syms = sec->header.sh_addr; - module->nsyms = sec->header.sh_size / (2 * tgt_sizeof_char_p); - } - - if (n_ext_modules_used) { - sec = obj_find_section(f, ".kmodtab"); - module->deps = sec->header.sh_addr; - module->ndeps = n_ext_modules_used; - } - - module->init = - obj_symbol_final_value(f, obj_find_symbol(f, "init_module")); - module->cleanup = - obj_symbol_final_value(f, obj_find_symbol(f, "cleanup_module")); - - sec = obj_find_section(f, "__ex_table"); - if (sec) { - module->ex_table_start = sec->header.sh_addr; - module->ex_table_end = sec->header.sh_addr + sec->header.sh_size; - } - - sec = obj_find_section(f, ".text.init"); - if (sec) { - module->runsize = sec->header.sh_addr - m_addr; - } - sec = obj_find_section(f, ".data.init"); - if (sec) { - if (!module->runsize || - module->runsize > sec->header.sh_addr - m_addr) - module->runsize = sec->header.sh_addr - m_addr; - } - - if (!arch_init_module(f, module)) - return 0; - - /* Whew! All of the initialization is complete. Collect the final - module image and give it to the kernel. */ - - image = xmalloc(m_size); - obj_create_image(f, image); - - ret = new_sys_init_module(m_name, (struct new_module *) image); - if (ret) - errorMsg("init_module: %s: %s", m_name, strerror(errno)); - - free(image); - - return ret == 0; -} - -#else - -#define new_init_module(x, y, z) TRUE -#define new_create_this_module(x, y) 0 -#define new_create_module_ksymtab(x) - -#endif /* BB_FEATURE_INSMOD_OLD_KERNEL */ - - -/*======================================================================*/ - -int -obj_string_patch(struct obj_file *f, int secidx, ElfW(Addr) offset, - const char *string) -{ - struct obj_string_patch *p; - struct obj_section *strsec; - size_t len = strlen(string) + 1; - char *loc; - - p = xmalloc(sizeof(*p)); - p->next = f->string_patches; - p->reloc_secidx = secidx; - p->reloc_offset = offset; - f->string_patches = p; - - strsec = obj_find_section(f, ".kstrtab"); - if (strsec == NULL) { - strsec = obj_create_alloced_section(f, ".kstrtab", 1, len); - p->string_offset = 0; - loc = strsec->contents; - } else { - p->string_offset = strsec->header.sh_size; - loc = obj_extend_section(strsec, len); - } - memcpy(loc, string, len); - - return 1; -} - -int -obj_symbol_patch(struct obj_file *f, int secidx, ElfW(Addr) offset, - struct obj_symbol *sym) -{ - struct obj_symbol_patch *p; - - p = xmalloc(sizeof(*p)); - p->next = f->symbol_patches; - p->reloc_secidx = secidx; - p->reloc_offset = offset; - p->sym = sym; - f->symbol_patches = p; - - return 1; -} - -int obj_check_undefineds(struct obj_file *f) -{ - unsigned long i; - int ret = 1; - - for (i = 0; i < HASH_BUCKETS; ++i) { - struct obj_symbol *sym; - for (sym = f->symtab[i]; sym; sym = sym->next) - if (sym->secidx == SHN_UNDEF) { - if (ELFW(ST_BIND) (sym->info) == STB_WEAK) { - sym->secidx = SHN_ABS; - sym->value = 0; - } else { - errorMsg("unresolved symbol %s", sym->name); - ret = 0; - } - } - } - - return ret; -} - -void obj_allocate_commons(struct obj_file *f) -{ - struct common_entry { - struct common_entry *next; - struct obj_symbol *sym; - } *common_head = NULL; - - unsigned long i; - - for (i = 0; i < HASH_BUCKETS; ++i) { - struct obj_symbol *sym; - for (sym = f->symtab[i]; sym; sym = sym->next) - if (sym->secidx == SHN_COMMON) { - /* Collect all COMMON symbols and sort them by size so as to - minimize space wasted by alignment requirements. */ - { - struct common_entry **p, *n; - for (p = &common_head; *p; p = &(*p)->next) - if (sym->size <= (*p)->sym->size) - break; - - n = alloca(sizeof(*n)); - n->next = *p; - n->sym = sym; - *p = n; - } - } - } - - for (i = 1; i < f->local_symtab_size; ++i) { - struct obj_symbol *sym = f->local_symtab[i]; - if (sym && sym->secidx == SHN_COMMON) { - struct common_entry **p, *n; - for (p = &common_head; *p; p = &(*p)->next) - if (sym == (*p)->sym) - break; - else if (sym->size < (*p)->sym->size) { - n = alloca(sizeof(*n)); - n->next = *p; - n->sym = sym; - *p = n; - break; - } - } - } - - if (common_head) { - /* Find the bss section. */ - for (i = 0; i < f->header.e_shnum; ++i) - if (f->sections[i]->header.sh_type == SHT_NOBITS) - break; - - /* If for some reason there hadn't been one, create one. */ - if (i == f->header.e_shnum) { - struct obj_section *sec; - - f->sections = xrealloc(f->sections, (i + 1) * sizeof(sec)); - f->sections[i] = sec = arch_new_section(); - f->header.e_shnum = i + 1; - - memset(sec, 0, sizeof(*sec)); - sec->header.sh_type = SHT_PROGBITS; - sec->header.sh_flags = SHF_WRITE | SHF_ALLOC; - sec->name = ".bss"; - sec->idx = i; - } - - /* Allocate the COMMONS. */ - { - ElfW(Addr) bss_size = f->sections[i]->header.sh_size; - ElfW(Addr) max_align = f->sections[i]->header.sh_addralign; - struct common_entry *c; - - for (c = common_head; c; c = c->next) { - ElfW(Addr) align = c->sym->value; - - if (align > max_align) - max_align = align; - if (bss_size & (align - 1)) - bss_size = (bss_size | (align - 1)) + 1; - - c->sym->secidx = i; - c->sym->value = bss_size; - - bss_size += c->sym->size; - } - - f->sections[i]->header.sh_size = bss_size; - f->sections[i]->header.sh_addralign = max_align; - } - } - - /* For the sake of patch relocation and parameter initialization, - allocate zeroed data for NOBITS sections now. Note that after - this we cannot assume NOBITS are really empty. */ - for (i = 0; i < f->header.e_shnum; ++i) { - struct obj_section *s = f->sections[i]; - if (s->header.sh_type == SHT_NOBITS) { - s->contents = memset(xmalloc(s->header.sh_size), - 0, s->header.sh_size); - s->header.sh_type = SHT_PROGBITS; - } - } -} - -unsigned long obj_load_size(struct obj_file *f) -{ - unsigned long dot = 0; - struct obj_section *sec; - - /* Finalize the positions of the sections relative to one another. */ - - for (sec = f->load_order; sec; sec = sec->load_next) { - ElfW(Addr) align; - - align = sec->header.sh_addralign; - if (align && (dot & (align - 1))) - dot = (dot | (align - 1)) + 1; - - sec->header.sh_addr = dot; - dot += sec->header.sh_size; - } - - return dot; -} - -int obj_relocate(struct obj_file *f, ElfW(Addr) base) -{ - int i, n = f->header.e_shnum; - int ret = 1; - - /* Finalize the addresses of the sections. */ - - f->baseaddr = base; - for (i = 0; i < n; ++i) - f->sections[i]->header.sh_addr += base; - - /* And iterate over all of the relocations. */ - - for (i = 0; i < n; ++i) { - struct obj_section *relsec, *symsec, *targsec, *strsec; - ElfW(RelM) * rel, *relend; - ElfW(Sym) * symtab; - const char *strtab; - - relsec = f->sections[i]; - if (relsec->header.sh_type != SHT_RELM) - continue; - - symsec = f->sections[relsec->header.sh_link]; - targsec = f->sections[relsec->header.sh_info]; - strsec = f->sections[symsec->header.sh_link]; - - rel = (ElfW(RelM) *) relsec->contents; - relend = rel + (relsec->header.sh_size / sizeof(ElfW(RelM))); - symtab = (ElfW(Sym) *) symsec->contents; - strtab = (const char *) strsec->contents; - - for (; rel < relend; ++rel) { - ElfW(Addr) value = 0; - struct obj_symbol *intsym = NULL; - unsigned long symndx; - ElfW(Sym) * extsym = 0; - const char *errmsg; - - /* Attempt to find a value to use for this relocation. */ - - symndx = ELFW(R_SYM) (rel->r_info); - if (symndx) { - /* Note we've already checked for undefined symbols. */ - - extsym = &symtab[symndx]; - if (ELFW(ST_BIND) (extsym->st_info) == STB_LOCAL) { - /* Local symbols we look up in the local table to be sure - we get the one that is really intended. */ - intsym = f->local_symtab[symndx]; - } else { - /* Others we look up in the hash table. */ - const char *name; - if (extsym->st_name) - name = strtab + extsym->st_name; - else - name = f->sections[extsym->st_shndx]->name; - intsym = obj_find_symbol(f, name); - } - - value = obj_symbol_final_value(f, intsym); - intsym->referenced = 1; - } -#if SHT_RELM == SHT_RELA -#if defined(__alpha__) && defined(AXP_BROKEN_GAS) - /* Work around a nasty GAS bug, that is fixed as of 2.7.0.9. */ - if (!extsym || !extsym->st_name || - ELFW(ST_BIND) (extsym->st_info) != STB_LOCAL) -#endif - value += rel->r_addend; -#endif - - /* Do it! */ - switch (arch_apply_relocation - (f, targsec, symsec, intsym, rel, value)) { - case obj_reloc_ok: - break; - - case obj_reloc_overflow: - errmsg = "Relocation overflow"; - goto bad_reloc; - case obj_reloc_dangerous: - errmsg = "Dangerous relocation"; - goto bad_reloc; - case obj_reloc_unhandled: - errmsg = "Unhandled relocation"; - bad_reloc: - if (extsym) { - errorMsg("%s of type %ld for %s", errmsg, - (long) ELFW(R_TYPE) (rel->r_info), - strtab + extsym->st_name); - } else { - errorMsg("%s of type %ld", errmsg, - (long) ELFW(R_TYPE) (rel->r_info)); - } - ret = 0; - break; - } - } - } - - /* Finally, take care of the patches. */ - - if (f->string_patches) { - struct obj_string_patch *p; - struct obj_section *strsec; - ElfW(Addr) strsec_base; - strsec = obj_find_section(f, ".kstrtab"); - strsec_base = strsec->header.sh_addr; - - for (p = f->string_patches; p; p = p->next) { - struct obj_section *targsec = f->sections[p->reloc_secidx]; - *(ElfW(Addr) *) (targsec->contents + p->reloc_offset) - = strsec_base + p->string_offset; - } - } - - if (f->symbol_patches) { - struct obj_symbol_patch *p; - - for (p = f->symbol_patches; p; p = p->next) { - struct obj_section *targsec = f->sections[p->reloc_secidx]; - *(ElfW(Addr) *) (targsec->contents + p->reloc_offset) - = obj_symbol_final_value(f, p->sym); - } - } - - return ret; -} - -int obj_create_image(struct obj_file *f, char *image) -{ - struct obj_section *sec; - ElfW(Addr) base = f->baseaddr; - - for (sec = f->load_order; sec; sec = sec->load_next) { - char *secimg; - - if (sec->header.sh_size == 0) - continue; - - secimg = image + (sec->header.sh_addr - base); - - /* Note that we allocated data for NOBITS sections earlier. */ - memcpy(secimg, sec->contents, sec->header.sh_size); - } - - return 1; -} - -/*======================================================================*/ - -struct obj_file *obj_load(FILE * fp) -{ - struct obj_file *f; - ElfW(Shdr) * section_headers; - int shnum, i; - char *shstrtab; - - /* Read the file header. */ - - f = arch_new_file(); - memset(f, 0, sizeof(*f)); - f->symbol_cmp = strcmp; - f->symbol_hash = obj_elf_hash; - f->load_order_search_start = &f->load_order; - - fseek(fp, 0, SEEK_SET); - if (fread(&f->header, sizeof(f->header), 1, fp) != 1) { - errorMsg("error reading ELF header: %s", strerror(errno)); - return NULL; - } - - if (f->header.e_ident[EI_MAG0] != ELFMAG0 - || f->header.e_ident[EI_MAG1] != ELFMAG1 - || f->header.e_ident[EI_MAG2] != ELFMAG2 - || f->header.e_ident[EI_MAG3] != ELFMAG3) { - errorMsg("not an ELF file"); - return NULL; - } - if (f->header.e_ident[EI_CLASS] != ELFCLASSM - || f->header.e_ident[EI_DATA] != ELFDATAM - || f->header.e_ident[EI_VERSION] != EV_CURRENT - || !MATCH_MACHINE(f->header.e_machine)) { - errorMsg("ELF file not for this architecture"); - return NULL; - } - if (f->header.e_type != ET_REL) { - errorMsg("ELF file not a relocatable object"); - return NULL; - } - - /* Read the section headers. */ - - if (f->header.e_shentsize != sizeof(ElfW(Shdr))) { - errorMsg("section header size mismatch: %lu != %lu", - (unsigned long) f->header.e_shentsize, - (unsigned long) sizeof(ElfW(Shdr))); - return NULL; - } - - shnum = f->header.e_shnum; - f->sections = xmalloc(sizeof(struct obj_section *) * shnum); - memset(f->sections, 0, sizeof(struct obj_section *) * shnum); - - section_headers = alloca(sizeof(ElfW(Shdr)) * shnum); - fseek(fp, f->header.e_shoff, SEEK_SET); - if (fread(section_headers, sizeof(ElfW(Shdr)), shnum, fp) != shnum) { - errorMsg("error reading ELF section headers: %s", strerror(errno)); - return NULL; - } - - /* Read the section data. */ - - for (i = 0; i < shnum; ++i) { - struct obj_section *sec; - - f->sections[i] = sec = arch_new_section(); - memset(sec, 0, sizeof(*sec)); - - sec->header = section_headers[i]; - sec->idx = i; - - switch (sec->header.sh_type) { - case SHT_NULL: - case SHT_NOTE: - case SHT_NOBITS: - /* ignore */ - break; - - case SHT_PROGBITS: - case SHT_SYMTAB: - case SHT_STRTAB: - case SHT_RELM: - if (sec->header.sh_size > 0) { - sec->contents = xmalloc(sec->header.sh_size); - fseek(fp, sec->header.sh_offset, SEEK_SET); - if (fread(sec->contents, sec->header.sh_size, 1, fp) != 1) { - errorMsg("error reading ELF section data: %s", strerror(errno)); - return NULL; - } - } else { - sec->contents = NULL; - } - break; - -#if SHT_RELM == SHT_REL - case SHT_RELA: - errorMsg("RELA relocations not supported on this architecture"); - return NULL; -#else - case SHT_REL: - errorMsg("REL relocations not supported on this architecture"); - return NULL; -#endif - - default: - if (sec->header.sh_type >= SHT_LOPROC) { - /* Assume processor specific section types are debug - info and can safely be ignored. If this is ever not - the case (Hello MIPS?), don't put ifdefs here but - create an arch_load_proc_section(). */ - break; - } - - errorMsg("can't handle sections of type %ld", - (long) sec->header.sh_type); - return NULL; - } - } - - /* Do what sort of interpretation as needed by each section. */ - - shstrtab = f->sections[f->header.e_shstrndx]->contents; - - for (i = 0; i < shnum; ++i) { - struct obj_section *sec = f->sections[i]; - sec->name = shstrtab + sec->header.sh_name; - } - - for (i = 0; i < shnum; ++i) { - struct obj_section *sec = f->sections[i]; - - if (sec->header.sh_flags & SHF_ALLOC) - obj_insert_section_load_order(f, sec); - - switch (sec->header.sh_type) { - case SHT_SYMTAB: - { - unsigned long nsym, j; - char *strtab; - ElfW(Sym) * sym; - - if (sec->header.sh_entsize != sizeof(ElfW(Sym))) { - errorMsg("symbol size mismatch: %lu != %lu", - (unsigned long) sec->header.sh_entsize, - (unsigned long) sizeof(ElfW(Sym))); - return NULL; - } - - nsym = sec->header.sh_size / sizeof(ElfW(Sym)); - strtab = f->sections[sec->header.sh_link]->contents; - sym = (ElfW(Sym) *) sec->contents; - - /* Allocate space for a table of local symbols. */ - j = f->local_symtab_size = sec->header.sh_info; - f->local_symtab = xmalloc(j *= - sizeof(struct obj_symbol *)); - memset(f->local_symtab, 0, j); - - /* Insert all symbols into the hash table. */ - for (j = 1, ++sym; j < nsym; ++j, ++sym) { - const char *name; - if (sym->st_name) - name = strtab + sym->st_name; - else - name = f->sections[sym->st_shndx]->name; - - obj_add_symbol(f, name, j, sym->st_info, sym->st_shndx, - sym->st_value, sym->st_size); - } - } - break; - - case SHT_RELM: - if (sec->header.sh_entsize != sizeof(ElfW(RelM))) { - errorMsg("relocation entry size mismatch: %lu != %lu", - (unsigned long) sec->header.sh_entsize, - (unsigned long) sizeof(ElfW(RelM))); - return NULL; - } - break; - } - } - - return f; -} - -static void hide_special_symbols(struct obj_file *f) -{ - static const char *const specials[] = { - "cleanup_module", - "init_module", - "kernel_version", - NULL - }; - - struct obj_symbol *sym; - const char *const *p; - - for (p = specials; *p; ++p) - if ((sym = obj_find_symbol(f, *p)) != NULL) - sym->info = - ELFW(ST_INFO) (STB_LOCAL, ELFW(ST_TYPE) (sym->info)); -} - - -void my_usage(void) -{ - printf("Usage."); - exit(0); -} - -extern int insmod_main( int argc, char **argv) -{ - int k_crcs; - int k_new_syscalls; - int len; - char *tmp; - unsigned long m_size; - ElfW(Addr) m_addr; - FILE *fp; - struct obj_file *f; - char m_name[BUFSIZ + 1] = "\0"; - int exit_status = FALSE; - int m_has_modinfo; -#ifdef BB_FEATURE_INSMOD_VERSION_CHECKING - int k_version; - char k_strversion[STRVERSIONLEN]; - char m_strversion[STRVERSIONLEN]; - int m_version; - int m_crcs; -#endif - - - if (argc <= 1) - my_usage(); - - argv++; argc--; - - /* Grab the module name */ - if ((tmp = strrchr(*argv, '/')) != NULL) { - tmp++; - } else { - tmp = *argv; - } - len = strlen(tmp); - - if (len > 2 && tmp[len - 2] == '.' && tmp[len - 1] == 'o') - len -= 2; - memcpy(m_name, tmp, len); - strcpy(m_fullName, m_name); - strcat(m_fullName, ".o"); - - /* Get a filedesc for the module */ - if ((fp = fopen(*argv, "r")) == NULL) { - errorMsg("Module %s not found", *argv); - return -1; - } else - memcpy(m_filename, *argv, strlen(*argv)); - - - if ((f = obj_load(fp)) == NULL) { - logperror("Could not load the module"); - goto out; - } - - if (get_modinfo_value(f, "kernel_version") == NULL) - m_has_modinfo = 0; - else - m_has_modinfo = 1; - -#ifdef BB_FEATURE_INSMOD_VERSION_CHECKING - /* Version correspondence? */ - - k_version = get_kernel_version(k_strversion); - if (m_has_modinfo) { - m_version = new_get_module_version(f, m_strversion); - } else { - m_version = old_get_module_version(f, m_strversion); - if (m_version == -1) { - errorMsg("couldn't find the kernel version the module was " - "compiled for"); - goto out; - } - } - - if (strncmp(k_strversion, m_strversion, STRVERSIONLEN) != 0) { - if (flag_force_load) { - errorMsg("Warning: kernel-module version mismatch\n" - "\t%s was compiled for kernel version %s\n" - "\twhile this kernel is version %s", - m_filename, m_strversion, k_strversion); - } else { - errorMsg("kernel-module version mismatch\n" - "\t%s was compiled for kernel version %s\n" - "\twhile this kernel is version %s.", - m_filename, m_strversion, k_strversion); - goto out; - } - } - k_crcs = 0; -#endif /* BB_FEATURE_INSMOD_VERSION_CHECKING */ - - k_new_syscalls = !query_module(NULL, 0, NULL, 0, NULL); - - if (k_new_syscalls) { -#ifdef BB_FEATURE_INSMOD_NEW_KERNEL - if (!new_get_kernel_symbols()) - goto out; - k_crcs = new_is_kernel_checksummed(); -#else - errorMsg("Not configured to support new kernels"); - goto out; -#endif - } else { -#ifdef BB_FEATURE_INSMOD_OLD_KERNEL - if (!old_get_kernel_symbols(m_name)) - goto out; - k_crcs = old_is_kernel_checksummed(); -#else - errorMsg("Not configured to support old kernels"); - goto out; -#endif - } - -#ifdef BB_FEATURE_INSMOD_VERSION_CHECKING - if (m_has_modinfo) - m_crcs = new_is_module_checksummed(f); - else - m_crcs = old_is_module_checksummed(f); - - if (m_crcs != k_crcs) - obj_set_symbol_compare(f, ncv_strcmp, ncv_symbol_hash); -#endif /* BB_FEATURE_INSMOD_VERSION_CHECKING */ - - /* Let the module know about the kernel symbols. */ - add_kernel_symbols(f); - - /* Allocate common symbols, symbol tables, and string tables. */ - - if (k_new_syscalls - ? !new_create_this_module(f, m_name) - : !old_create_mod_use_count(f)) - { - goto out; - } - - if (!obj_check_undefineds(f)) { - goto out; - } - obj_allocate_commons(f); - - if (m_has_modinfo - ? !new_process_module_arguments(f, argc-1, argv+1) - : !old_process_module_arguments(f, argc-1, argv+1)) - { - goto out; - } - - arch_create_got(f); - hide_special_symbols(f); - - if (k_new_syscalls) - new_create_module_ksymtab(f); - - /* Find current size of the module */ - m_size = obj_load_size(f); - - - errno = 0; - m_addr = create_module(m_name, m_size); - switch (errno) { - case 0: - break; - case EEXIST: - errorMsg("A module named %s already exists", m_name); - /* Considered as a success in stage1 */ - fclose(fp); - return(TRUE); - case ENOMEM: - errorMsg("Can't allocate kernel memory for module; needed %lu bytes", - m_size); - goto out; - default: - errorMsg("create_module: %s: %s", m_name, strerror(errno)); - goto out; - } - - if (!obj_relocate(f, m_addr)) { - delete_module(m_name); - goto out; - } - - if (k_new_syscalls - ? !new_init_module(m_name, f, m_size) - : !old_init_module(m_name, f, m_size)) - { - delete_module(m_name); - goto out; - } - - exit_status = TRUE; - -out: - fclose(fp); - return(exit_status); -} - - -int insmod_call(char * full_filename, char * params) -{ - int argc = 2; - char *argv[50]; - char * ptr = params; - argv[0] = "stage1"; - argv[1] = full_filename; - - while (ptr != NULL) { - argv[argc] = ptr; - argc++; - ptr = strchr(ptr, ' '); - if (ptr) { - ptr[0] = '\0'; - ptr++; - } - } - - return insmod_main(argc, argv); -} diff --git a/mdk-stage1/insmod-busybox/loop.h b/mdk-stage1/insmod-busybox/loop.h deleted file mode 100644 index cba8c6b2b..000000000 --- a/mdk-stage1/insmod-busybox/loop.h +++ /dev/null @@ -1,5 +0,0 @@ -#include <linux/posix_types.h> -#undef dev_t -#define dev_t __kernel_dev_t -#include <linux/loop.h> -#undef dev_t diff --git a/mdk-stage1/insmod-busybox/messages.c b/mdk-stage1/insmod-busybox/messages.c deleted file mode 100644 index 81fd9c75c..000000000 --- a/mdk-stage1/insmod-busybox/messages.c +++ /dev/null @@ -1,90 +0,0 @@ -/* vi: set sw=4 ts=4: */ -/* - * Copyright (C) 2000 by BitterSweet Enterprises, LLC. - * Written by Karl M. Hegbloom <karlheg@debian.org> - * - * 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 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, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - */ - -/* - * Let's put all of these messages in one place, and link this in as - * a separate object module, so that there are not going to be - * multiple non-unique but very similar strings in the binary. - * Perhaps this will make it simpler to internationalize also, and - * may make the binary slightly smaller. - */ - -// To use this header file, include something like this: -// -//#define BB_DECLARE_EXTERN -//#define bb_need_memory_exhausted -//#include "messages.c" -// -//Then just use the string memory_exhausted when it is needed. -// - -#include "busybox.h" -#ifndef _BB_MESSAGES_C -#define _BB_MESSAGES_C - -#ifdef BB_DECLARE_EXTERN -# define BB_DEF_MESSAGE(symbol, string_const) extern const char *symbol; -#else -# define BB_DEF_MESSAGE(symbol, string_const) const char *symbol = string_const; -#endif - - -#if defined bb_need_full_version || ! defined BB_DECLARE_EXTERN - BB_DEF_MESSAGE(full_version, - "BusyBox v" BB_VER " (" BB_BT ") multi-call binary -- GPL2") -#endif -#if defined bb_need_name_too_long || ! defined BB_DECLARE_EXTERN - BB_DEF_MESSAGE(name_too_long, "file name too long\n") -#endif -#if defined bb_need_omitting_directory || ! defined BB_DECLARE_EXTERN - BB_DEF_MESSAGE(omitting_directory, "%s: omitting directory\n") -#endif -#if defined bb_need_not_a_directory || ! defined BB_DECLARE_EXTERN - BB_DEF_MESSAGE(not_a_directory, "%s: not a directory\n") -#endif -#if defined bb_need_memory_exhausted || ! defined BB_DECLARE_EXTERN - BB_DEF_MESSAGE(memory_exhausted, "memory exhausted\n") -#endif -#if defined bb_need_invalid_date || ! defined BB_DECLARE_EXTERN - BB_DEF_MESSAGE(invalid_date, "invalid date `%s'\n") -#endif -#if defined bb_need_invalid_option || ! defined BB_DECLARE_EXTERN - BB_DEF_MESSAGE(invalid_option, "invalid option -- %c\n") -#endif -#if defined bb_need_io_error || ! defined BB_DECLARE_EXTERN - BB_DEF_MESSAGE(io_error, "%s: input/output error -- %s\n") -#endif -#if defined bb_need_help || ! defined BB_DECLARE_EXTERN - BB_DEF_MESSAGE(dash_dash_help, "--help") -#endif -#if defined bb_need_write_error || ! defined BB_DECLARE_EXTERN - BB_DEF_MESSAGE(write_error, "Write Error\n") -#endif -#if defined bb_need_too_few_args || ! defined BB_DECLARE_EXTERN - BB_DEF_MESSAGE(too_few_args, "too few arguments\n") -#endif -#if defined bb_need_name_longer_then_foo || ! defined BB_DECLARE_EXTERN - BB_DEF_MESSAGE(name_longer_then_foo, "Names longer then %d chars not supported.\n") -#endif - - -#endif /* _BB_MESSAGES_C */ - diff --git a/mdk-stage1/insmod-busybox/utility.c b/mdk-stage1/insmod-busybox/utility.c deleted file mode 100644 index b9a115c72..000000000 --- a/mdk-stage1/insmod-busybox/utility.c +++ /dev/null @@ -1,1756 +0,0 @@ -/* vi: set sw=4 ts=4: */ -/* - * Utility routines. - * - * Copyright (C) tons of folks. Tracking down who wrote what - * isn't something I'm going to worry about... If you wrote something - * here, please feel free to acknowledge your work. - * - * 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 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, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Based in part on code from sash, Copyright (c) 1999 by David I. Bell - * Permission has been granted to redistribute this code under the GPL. - * - */ - -#include "busybox.h" -#if defined (BB_CHMOD_CHOWN_CHGRP) \ - || defined (BB_CP_MV) \ - || defined (BB_FIND) \ - || defined (BB_INSMOD) \ - || defined (BB_LS) \ - || defined (BB_RM) \ - || defined (BB_TAR) -/* same conditions as recursiveAction */ -#define bb_need_name_too_long -#endif -#define bb_need_memory_exhausted -#define bb_need_full_version -#define BB_DECLARE_EXTERN -#include "messages.c" - -#include <stdio.h> -#include <string.h> -#include <errno.h> -#include <fcntl.h> -#include <dirent.h> -#include <time.h> -#include <utime.h> -#include <unistd.h> -#include <ctype.h> -#include <sys/ioctl.h> -#include <sys/utsname.h> /* for uname(2) */ - -/* Busybox mount uses either /proc/filesystems or /dev/mtab to get the - * list of available filesystems used for the -t auto option */ -#if defined BB_FEATURE_USE_PROCFS && defined BB_FEATURE_USE_DEVPS_PATCH -//#error Sorry, but busybox can't use both /proc and /dev/ps at the same time -- Pick one and try again. -#error "Sorry, but busybox can't use both /proc and /dev/ps at the same time -- Pick one and try again." -#endif - - -#if defined BB_MOUNT || defined BB_UMOUNT || defined BB_DF -# if defined BB_MTAB -const char mtab_file[] = "/etc/mtab"; -# else -# if defined BB_FEATURE_USE_PROCFS -const char mtab_file[] = "/proc/mounts"; -# else -# if defined BB_FEATURE_USE_DEVPS_PATCH -const char mtab_file[] = "/dev/mtab"; -# else -# error With (BB_MOUNT||BB_UMOUNT||BB_DF) defined, you must define either BB_MTAB or ( BB_FEATURE_USE_PROCFS | BB_FEATURE_USE_DEVPS_PATCH) -# endif -# endif -# endif -#endif - -#ifdef _STANDALONE_ -void errorMsg(const char *s, ...) -{ - va_list p; - - fflush(stdout); - printf("busybox: "); - va_start(p, s); - vprintf(s, p); - va_end(p); - printf("\n"); - fflush(stdout); -} - -extern void logperror(char *s) -{ - perror(s); -} - -void fatalError(const char *s, ...) -{ - va_list p; - - fflush(stdout); - fprintf(stdout, "busybox: "); - va_start(p, s); - vfprintf(stdout, s, p); - va_end(p); - fprintf(stdout, "\n"); - fflush(stdout); - exit(FALSE); -} -#else /* _STANDALONE_ */ -#include "../log.h" -extern void errorMsg(const char *s, ...) -{ - va_list p; - - va_start(p, s); - vlog_message(s, p); - va_end(p); -} - -extern void logperror(char *s) -{ - log_perror(s); -} - -extern void fatalError(const char *s, ...) -{ - va_list p; - - va_start(p, s); - vlog_message(s, p); - va_end(p); - while (1); -} -#endif /* _STANDALONE_ */ - - -#if defined BB_INIT -/* Returns kernel version encoded as major*65536 + minor*256 + patch, - * so, for example, to check if the kernel is greater than 2.2.11: - * if (get_kernel_revision() <= 2*65536+2*256+11) { <stuff> } - */ -extern int get_kernel_revision(void) -{ - struct utsname name; - int major = 0, minor = 0, patch = 0; - - if (uname(&name) == -1) { - perror("cannot get system information"); - return (0); - } - sscanf(name.version, "%d.%d.%d", &major, &minor, &patch); - return major * 65536 + minor * 256 + patch; -} -#endif /* BB_INIT */ - - - -#if defined BB_FREE || defined BB_INIT || defined BB_UNAME || defined BB_UPTIME -_syscall1(int, sysinfo, struct sysinfo *, info); -#endif /* BB_INIT */ - -#if defined BB_MOUNT || defined BB_UMOUNT - -#ifndef __NR_umount2 -#define __NR_umount2 52 -#endif - -/* Include our own version of <sys/mount.h>, since libc5 doesn't - * know about umount2 */ -extern _syscall1(int, umount, const char *, special_file); -extern _syscall2(int, umount2, const char *, special_file, int, flags); -extern _syscall5(int, mount, const char *, special_file, const char *, dir, - const char *, fstype, unsigned long int, rwflag, const void *, data); -#endif - -#if defined BB_INSMOD || defined BB_LSMOD -#ifndef __NR_query_module -#define __NR_query_module 167 -#endif -_syscall5(int, query_module, const char *, name, int, which, - void *, buf, size_t, bufsize, size_t*, ret); -#endif - - -#if defined (BB_CP_MV) || defined (BB_DU) - -#define HASH_SIZE 311 /* Should be prime */ -#define hash_inode(i) ((i) % HASH_SIZE) - -static ino_dev_hashtable_bucket_t *ino_dev_hashtable[HASH_SIZE]; - -/* - * Return 1 if statbuf->st_ino && statbuf->st_dev are recorded in - * `ino_dev_hashtable', else return 0 - * - * If NAME is a non-NULL pointer to a character pointer, and there is - * a match, then set *NAME to the value of the name slot in that - * bucket. - */ -int is_in_ino_dev_hashtable(const struct stat *statbuf, char **name) -{ - ino_dev_hashtable_bucket_t *bucket; - - bucket = ino_dev_hashtable[hash_inode(statbuf->st_ino)]; - while (bucket != NULL) { - if ((bucket->ino == statbuf->st_ino) && - (bucket->dev == statbuf->st_dev)) - { - if (name) *name = bucket->name; - return 1; - } - bucket = bucket->next; - } - return 0; -} - -/* Add statbuf to statbuf hash table */ -void add_to_ino_dev_hashtable(const struct stat *statbuf, const char *name) -{ - int i; - size_t s; - ino_dev_hashtable_bucket_t *bucket; - - i = hash_inode(statbuf->st_ino); - s = name ? strlen(name) : 0; - bucket = xmalloc(sizeof(ino_dev_hashtable_bucket_t) + s); - bucket->ino = statbuf->st_ino; - bucket->dev = statbuf->st_dev; - if (name) - strcpy(bucket->name, name); - else - bucket->name[0] = '\0'; - bucket->next = ino_dev_hashtable[i]; - ino_dev_hashtable[i] = bucket; -} - -/* Clear statbuf hash table */ -void reset_ino_dev_hashtable(void) -{ - int i; - ino_dev_hashtable_bucket_t *bucket; - - for (i = 0; i < HASH_SIZE; i++) { - while (ino_dev_hashtable[i] != NULL) { - bucket = ino_dev_hashtable[i]->next; - free(ino_dev_hashtable[i]); - ino_dev_hashtable[i] = bucket; - } - } -} - -#endif /* BB_CP_MV || BB_DU */ - -#if defined (BB_CP_MV) || defined (BB_DU) || defined (BB_LN) || defined (BB_AR) -/* - * Return TRUE if a fileName is a directory. - * Nonexistant files return FALSE. - */ -int isDirectory(const char *fileName, const int followLinks, struct stat *statBuf) -{ - int status; - int didMalloc = 0; - - if (statBuf == NULL) { - statBuf = (struct stat *)xmalloc(sizeof(struct stat)); - ++didMalloc; - } - - if (followLinks == TRUE) - status = stat(fileName, statBuf); - else - status = lstat(fileName, statBuf); - - if (status < 0 || !(S_ISDIR(statBuf->st_mode))) { - status = FALSE; - } - else status = TRUE; - - if (didMalloc) { - free(statBuf); - statBuf = NULL; - } - return status; -} -#endif - -#if defined (BB_AR) || defined BB_CP_MV -/* - * Copy readSize bytes between two file descriptors - */ -int copySubFile(int srcFd, int dstFd, size_t remaining) -{ - size_t size; - char buffer[BUFSIZ]; - - while (remaining > 0) { - if (remaining > BUFSIZ) - size = BUFSIZ; - else - size = remaining; - if (fullWrite(dstFd, buffer, fullRead(srcFd, buffer, size)) < size) - return(FALSE); - remaining -= size; - } - return (TRUE); -} -#endif - - -#if defined (BB_CP_MV) -/* - * Copy one file to another, while possibly preserving its modes, times, and - * modes. Returns TRUE if successful, or FALSE on a failure with an error - * message output. (Failure is not indicated if attributes cannot be set.) - * -Erik Andersen - */ -int -copyFile(const char *srcName, const char *destName, - int setModes, int followLinks, int forceFlag) -{ - int rfd; - int wfd; - int status; - struct stat srcStatBuf; - struct stat dstStatBuf; - struct utimbuf times; - - if (followLinks == TRUE) - status = stat(srcName, &srcStatBuf); - else - status = lstat(srcName, &srcStatBuf); - - if (status < 0) { - perror(srcName); - return FALSE; - } - - if (followLinks == TRUE) - status = stat(destName, &dstStatBuf); - else - status = lstat(destName, &dstStatBuf); - - if (status < 0 || forceFlag==TRUE) { - unlink(destName); - dstStatBuf.st_ino = -1; - dstStatBuf.st_dev = -1; - } - - if ((srcStatBuf.st_dev == dstStatBuf.st_dev) && - (srcStatBuf.st_ino == dstStatBuf.st_ino)) { - errorMsg("Copying file \"%s\" to itself\n", srcName); - return FALSE; - } - - if (S_ISDIR(srcStatBuf.st_mode)) { - //fprintf(stderr, "copying directory %s to %s\n", srcName, destName); - /* Make sure the directory is writable */ - status = mkdir(destName, 0777777 ^ umask(0)); - if (status < 0 && errno != EEXIST) { - perror(destName); - return FALSE; - } - } else if (S_ISLNK(srcStatBuf.st_mode)) { - char link_val[BUFSIZ + 1]; - int link_size; - - //fprintf(stderr, "copying link %s to %s\n", srcName, destName); - /* Warning: This could possibly truncate silently, to BUFSIZ chars */ - link_size = readlink(srcName, &link_val[0], BUFSIZ); - if (link_size < 0) { - perror(srcName); - return FALSE; - } - link_val[link_size] = '\0'; - status = symlink(link_val, destName); - if (status < 0) { - perror(destName); - return FALSE; - } -#if (__GLIBC__ >= 2) && (__GLIBC_MINOR__ >= 1) - if (setModes == TRUE) { - /* Try to set owner, but fail silently like GNU cp */ - lchown(destName, srcStatBuf.st_uid, srcStatBuf.st_gid); - } -#endif - return TRUE; - } else if (S_ISFIFO(srcStatBuf.st_mode)) { - //fprintf(stderr, "copying fifo %s to %s\n", srcName, destName); - if (mkfifo(destName, 0644) < 0) { - perror(destName); - return FALSE; - } - } else if (S_ISBLK(srcStatBuf.st_mode) || S_ISCHR(srcStatBuf.st_mode) - || S_ISSOCK(srcStatBuf.st_mode)) { - //fprintf(stderr, "copying soc, blk, or chr %s to %s\n", srcName, destName); - if (mknod(destName, srcStatBuf.st_mode, srcStatBuf.st_rdev) < 0) { - perror(destName); - return FALSE; - } - } else if (S_ISREG(srcStatBuf.st_mode)) { - //fprintf(stderr, "copying regular file %s to %s\n", srcName, destName); - rfd = open(srcName, O_RDONLY); - if (rfd < 0) { - perror(srcName); - return FALSE; - } - - wfd = open(destName, O_WRONLY | O_CREAT | O_TRUNC, - srcStatBuf.st_mode); - if (wfd < 0) { - perror(destName); - close(rfd); - return FALSE; - } - - if (copySubFile(rfd, wfd, srcStatBuf.st_size)==FALSE) - goto error_exit; - - close(rfd); - if (close(wfd) < 0) { - return FALSE; - } - } - - if (setModes == TRUE) { - /* This is fine, since symlinks never get here */ - if (chown(destName, srcStatBuf.st_uid, srcStatBuf.st_gid) < 0) { - perror(destName); - exit FALSE; - } - if (chmod(destName, srcStatBuf.st_mode) < 0) { - perror(destName); - exit FALSE; - } - times.actime = srcStatBuf.st_atime; - times.modtime = srcStatBuf.st_mtime; - if (utime(destName, ×) < 0) { - perror(destName); - exit FALSE; - } - } - - return TRUE; - - error_exit: - perror(destName); - close(rfd); - close(wfd); - - return FALSE; -} -#endif /* BB_CP_MV */ - - - -#if defined BB_TAR || defined BB_LS ||defined BB_AR - -#define TYPEINDEX(mode) (((mode) >> 12) & 0x0f) -#define TYPECHAR(mode) ("0pcCd?bB-?l?s???" [TYPEINDEX(mode)]) - -/* The special bits. If set, display SMODE0/1 instead of MODE0/1 */ -static const mode_t SBIT[] = { - 0, 0, S_ISUID, - 0, 0, S_ISGID, - 0, 0, S_ISVTX -}; - -/* The 9 mode bits to test */ -static const mode_t MBIT[] = { - S_IRUSR, S_IWUSR, S_IXUSR, - S_IRGRP, S_IWGRP, S_IXGRP, - S_IROTH, S_IWOTH, S_IXOTH -}; - -#define MODE1 "rwxrwxrwx" -#define MODE0 "---------" -#define SMODE1 "..s..s..t" -#define SMODE0 "..S..S..T" - -/* - * Return the standard ls-like mode string from a file mode. - * This is static and so is overwritten on each call. - */ -const char *modeString(int mode) -{ - static char buf[12]; - - int i; - - buf[0] = TYPECHAR(mode); - for (i = 0; i < 9; i++) { - if (mode & SBIT[i]) - buf[i + 1] = (mode & MBIT[i]) ? SMODE1[i] : SMODE0[i]; - else - buf[i + 1] = (mode & MBIT[i]) ? MODE1[i] : MODE0[i]; - } - return buf; -} -#endif /* BB_TAR || BB_LS */ - - -#if defined BB_TAR || defined BB_AR -/* - * Return the standard ls-like time string from a time_t - * This is static and so is overwritten on each call. - */ -const char *timeString(time_t timeVal) -{ - time_t now; - char *str; - static char buf[26]; - - time(&now); - - str = ctime(&timeVal); - - strcpy(buf, &str[4]); - buf[12] = '\0'; - - if ((timeVal > now) || (timeVal < now - 365 * 24 * 60 * 60L)) { - strcpy(&buf[7], &str[20]); - buf[11] = '\0'; - } - - return buf; -} -#endif /* BB_TAR || BB_AR */ - -#if defined BB_TAR || defined BB_CP_MV || defined BB_AR -/* - * Write all of the supplied buffer out to a file. - * This does multiple writes as necessary. - * Returns the amount written, or -1 on an error. - */ -int fullWrite(int fd, const char *buf, int len) -{ - int cc; - int total; - - total = 0; - - while (len > 0) { - cc = write(fd, buf, len); - - if (cc < 0) - return -1; - - buf += cc; - total += cc; - len -= cc; - } - - return total; -} -#endif /* BB_TAR || BB_CP_MV || BB_AR */ - - -#if defined BB_TAR || defined BB_TAIL || defined BB_AR || defined BB_SH || defined BB_CP_MV -/* - * Read all of the supplied buffer from a file. - * This does multiple reads as necessary. - * Returns the amount read, or -1 on an error. - * A short read is returned on an end of file. - */ -int fullRead(int fd, char *buf, int len) -{ - int cc; - int total; - - total = 0; - - while (len > 0) { - cc = read(fd, buf, len); - - if (cc < 0) - return -1; - - if (cc == 0) - break; - - buf += cc; - total += cc; - len -= cc; - } - - return total; -} -#endif /* BB_TAR || BB_TAIL || BB_AR || BB_SH */ - - -#if defined (BB_CHMOD_CHOWN_CHGRP) \ - || defined (BB_CP_MV) \ - || defined (BB_FIND) \ - || defined (BB_INSMOD) \ - || defined (BB_LS) \ - || defined (BB_RM) \ - || defined (BB_TAR) - -/* - * Walk down all the directories under the specified - * location, and do something (something specified - * by the fileAction and dirAction function pointers). - * - * Unfortunatly, while nftw(3) could replace this and reduce - * code size a bit, nftw() wasn't supported before GNU libc 2.1, - * and so isn't sufficiently portable to take over since glibc2.1 - * is so stinking huge. - */ -int recursiveAction(const char *fileName, - int recurse, int followLinks, int depthFirst, - int (*fileAction) (const char *fileName, - struct stat * statbuf, - void* userData), - int (*dirAction) (const char *fileName, - struct stat * statbuf, - void* userData), - void* userData) -{ - int status; - struct stat statbuf; - struct dirent *next; - - if (followLinks == TRUE) - status = stat(fileName, &statbuf); - else - status = lstat(fileName, &statbuf); - - if (status < 0) { -#ifdef BB_DEBUG_PRINT_SCAFFOLD - fprintf(stderr, - "status=%d followLinks=%d TRUE=%d\n", - status, followLinks, TRUE); -#endif - perror(fileName); - return FALSE; - } - - if ((followLinks == FALSE) && (S_ISLNK(statbuf.st_mode))) { - if (fileAction == NULL) - return TRUE; - else - return fileAction(fileName, &statbuf, userData); - } - - if (recurse == FALSE) { - if (S_ISDIR(statbuf.st_mode)) { - if (dirAction != NULL) - return (dirAction(fileName, &statbuf, userData)); - else - return TRUE; - } - } - - if (S_ISDIR(statbuf.st_mode)) { - DIR *dir; - - dir = opendir(fileName); - if (!dir) { - perror(fileName); - return FALSE; - } - if (dirAction != NULL && depthFirst == FALSE) { - status = dirAction(fileName, &statbuf, userData); - if (status == FALSE) { - perror(fileName); - return FALSE; - } - } - while ((next = readdir(dir)) != NULL) { - char nextFile[BUFSIZ + 1]; - - if ((strcmp(next->d_name, "..") == 0) - || (strcmp(next->d_name, ".") == 0)) { - continue; - } - if (strlen(fileName) + strlen(next->d_name) + 1 > BUFSIZ) { - errorMsg("name_too_long"); - return FALSE; - } - memset(nextFile, 0, sizeof(nextFile)); - sprintf(nextFile, "%s/%s", fileName, next->d_name); - status = - recursiveAction(nextFile, TRUE, followLinks, depthFirst, - fileAction, dirAction, userData); - if (status == FALSE) { - closedir(dir); - return FALSE; - } - } - status = closedir(dir); - if (status < 0) { - perror(fileName); - return FALSE; - } - if (dirAction != NULL && depthFirst == TRUE) { - status = dirAction(fileName, &statbuf, userData); - if (status == FALSE) { - perror(fileName); - return FALSE; - } - } - } else { - if (fileAction == NULL) - return TRUE; - else - return fileAction(fileName, &statbuf, userData); - } - return TRUE; -} - -#endif /* BB_CHMOD_CHOWN_CHGRP || BB_CP_MV || BB_FIND || BB_LS || BB_INSMOD */ - - - -#if defined (BB_TAR) || defined (BB_MKDIR) || defined (BB_AR) -/* - * Attempt to create the directories along the specified path, except for - * the final component. The mode is given for the final directory only, - * while all previous ones get default protections. Errors are not reported - * here, as failures to restore files can be reported later. - */ -extern int createPath(const char *name, int mode) -{ - char *cp; - char *cpOld; - char buf[BUFSIZ + 1]; - int retVal = 0; - - strcpy(buf, name); - for (cp = buf; *cp == '/'; cp++); - cp = strchr(cp, '/'); - while (cp) { - cpOld = cp; - cp = strchr(cp + 1, '/'); - *cpOld = '\0'; - retVal = mkdir(buf, cp ? 0777 : mode); - if (retVal != 0 && errno != EEXIST) { - perror(buf); - return FALSE; - } - *cpOld = '/'; - } - return TRUE; -} -#endif /* BB_TAR || BB_MKDIR */ - - - -#if defined (BB_CHMOD_CHOWN_CHGRP) || defined (BB_MKDIR) \ - || defined (BB_MKFIFO) || defined (BB_MKNOD) || defined (BB_AR) -/* [ugoa]{+|-|=}[rwxst] */ - - - -extern int parse_mode(const char *s, mode_t * theMode) -{ - mode_t andMode = - - S_ISVTX | S_ISUID | S_ISGID | S_IRWXU | S_IRWXG | S_IRWXO; - mode_t orMode = 0; - mode_t mode = 0; - mode_t groups = 0; - char type; - char c; - - if (s==NULL) - return (FALSE); - - do { - for (;;) { - switch (c = *s++) { - case '\0': - return -1; - case 'u': - groups |= S_ISUID | S_IRWXU; - continue; - case 'g': - groups |= S_ISGID | S_IRWXG; - continue; - case 'o': - groups |= S_IRWXO; - continue; - case 'a': - groups |= S_ISUID | S_ISGID | S_IRWXU | S_IRWXG | S_IRWXO; - continue; - case '+': - case '=': - case '-': - type = c; - if (groups == 0) /* The default is "all" */ - groups |= - S_ISUID | S_ISGID | S_IRWXU | S_IRWXG | S_IRWXO; - break; - default: - if (isdigit(c) && c >= '0' && c <= '7' && - mode == 0 && groups == 0) { - *theMode = strtol(--s, NULL, 8); - return (TRUE); - } else - return (FALSE); - } - break; - } - - while ((c = *s++) != '\0') { - switch (c) { - case ',': - break; - case 'r': - mode |= S_IRUSR | S_IRGRP | S_IROTH; - continue; - case 'w': - mode |= S_IWUSR | S_IWGRP | S_IWOTH; - continue; - case 'x': - mode |= S_IXUSR | S_IXGRP | S_IXOTH; - continue; - case 's': - mode |= S_IXGRP | S_ISUID | S_ISGID; - continue; - case 't': - mode |= 0; - continue; - default: - *theMode &= andMode; - *theMode |= orMode; - return (TRUE); - } - break; - } - switch (type) { - case '=': - andMode &= ~(groups); - /* fall through */ - case '+': - orMode |= mode & groups; - break; - case '-': - andMode &= ~(mode & groups); - orMode &= andMode; - break; - } - } while (c == ','); - *theMode &= andMode; - *theMode |= orMode; - return (TRUE); -} - - -#endif -/* BB_CHMOD_CHOWN_CHGRP || BB_MKDIR || BB_MKFIFO || BB_MKNOD */ - - - - - -#if defined BB_CHMOD_CHOWN_CHGRP || defined BB_PS || defined BB_LS \ - || defined BB_TAR || defined BB_ID || defined BB_LOGGER \ - || defined BB_LOGNAME || defined BB_WHOAMI - -/* This parses entries in /etc/passwd and /etc/group. This is desirable - * for BusyBox, since we want to avoid using the glibc NSS stuff, which - * increases target size and is often not needed or wanted for embedded - * systems. - * - * /etc/passwd entries look like this: - * root:x:0:0:root:/root:/bin/bash - * and /etc/group entries look like this: - * root:x:0: - * - * This uses buf as storage to hold things. - * - */ -unsigned long my_getid(const char *filename, char *name, long id, long *gid) -{ - FILE *file; - char *rname, *start, *end, buf[128]; - long rid; - long rgid = 0; - - file = fopen(filename, "r"); - if (file == NULL) { - /* Do not complain. It is ok for /etc/passwd and - * friends to be missing... */ - return (-1); - } - - while (fgets(buf, 128, file) != NULL) { - if (buf[0] == '#') - continue; - - /* username/group name */ - start = buf; - end = strchr(start, ':'); - if (end == NULL) - continue; - *end = '\0'; - rname = start; - - /* password */ - start = end + 1; - end = strchr(start, ':'); - if (end == NULL) - continue; - - /* uid in passwd, gid in group */ - start = end + 1; - rid = (unsigned long) strtol(start, &end, 10); - if (end == start) - continue; - - /* gid in passwd */ - start = end + 1; - rgid = (unsigned long) strtol(start, &end, 10); - - if (name) { - if (0 == strcmp(rname, name)) { - if (gid) *gid = rgid; - fclose(file); - return (rid); - } - } - if (id != -1 && id == rid) { - strncpy(name, rname, 8); - if (gid) *gid = rgid; - fclose(file); - return (TRUE); - } - } - fclose(file); - return (-1); -} - -/* returns a uid given a username */ -long my_getpwnam(char *name) -{ - return my_getid("/etc/passwd", name, -1, NULL); -} - -/* returns a gid given a group name */ -long my_getgrnam(char *name) -{ - return my_getid("/etc/group", name, -1, NULL); -} - -/* gets a username given a uid */ -void my_getpwuid(char *name, long uid) -{ - my_getid("/etc/passwd", name, uid, NULL); -} - -/* gets a groupname given a gid */ -void my_getgrgid(char *group, long gid) -{ - my_getid("/etc/group", group, gid, NULL); -} - -/* gets a gid given a user name */ -long my_getpwnamegid(char *name) -{ - long gid; - my_getid("/etc/passwd", name, -1, &gid); - return gid; -} - -#endif - /* BB_CHMOD_CHOWN_CHGRP || BB_PS || BB_LS || BB_TAR \ - || BB_ID || BB_LOGGER || BB_LOGNAME || BB_WHOAMI */ - - -#if (defined BB_CHVT) || (defined BB_DEALLOCVT) || (defined BB_SETKEYCODES) - -/* From <linux/kd.h> */ -#define KDGKBTYPE 0x4B33 /* get keyboard type */ -#define KB_84 0x01 -#define KB_101 0x02 /* this is what we always answer */ - -int is_a_console(int fd) -{ - char arg; - - arg = 0; - return (ioctl(fd, KDGKBTYPE, &arg) == 0 - && ((arg == KB_101) || (arg == KB_84))); -} - -static int open_a_console(char *fnam) -{ - int fd; - - /* try read-only */ - fd = open(fnam, O_RDWR); - - /* if failed, try read-only */ - if (fd < 0 && errno == EACCES) - fd = open(fnam, O_RDONLY); - - /* if failed, try write-only */ - if (fd < 0 && errno == EACCES) - fd = open(fnam, O_WRONLY); - - /* if failed, fail */ - if (fd < 0) - return -1; - - /* if not a console, fail */ - if (!is_a_console(fd)) { - close(fd); - return -1; - } - - /* success */ - return fd; -} - -/* - * Get an fd for use with kbd/console ioctls. - * We try several things because opening /dev/console will fail - * if someone else used X (which does a chown on /dev/console). - * - * if tty_name is non-NULL, try this one instead. - */ - -int get_console_fd(char *tty_name) -{ - int fd; - - if (tty_name) { - if (-1 == (fd = open_a_console(tty_name))) - return -1; - else - return fd; - } - - fd = open_a_console("/dev/tty"); - if (fd >= 0) - return fd; - - fd = open_a_console("/dev/tty0"); - if (fd >= 0) - return fd; - - fd = open_a_console("/dev/console"); - if (fd >= 0) - return fd; - - for (fd = 0; fd < 3; fd++) - if (is_a_console(fd)) - return fd; - - errorMsg("Couldnt get a file descriptor referring to the console\n"); - return -1; /* total failure */ -} - - -#endif /* BB_CHVT || BB_DEALLOCVT || BB_SETKEYCODES */ - - -#if defined BB_FIND || defined BB_INSMOD -/* - * Routine to see if a text string is matched by a wildcard pattern. - * Returns TRUE if the text is matched, or FALSE if it is not matched - * or if the pattern is invalid. - * * matches zero or more characters - * ? matches a single character - * [abc] matches 'a', 'b' or 'c' - * \c quotes character c - * Adapted from code written by Ingo Wilken, and - * then taken from sash, Copyright (c) 1999 by David I. Bell - * Permission is granted to use, distribute, or modify this source, - * provided that this copyright notice remains intact. - * Permission to distribute this code under the GPL has been granted. - */ -extern int check_wildcard_match(const char *text, const char *pattern) -{ - const char *retryPat; - const char *retryText; - int ch; - int found; - int len; - - retryPat = NULL; - retryText = NULL; - - while (*text || *pattern) { - ch = *pattern++; - - switch (ch) { - case '*': - retryPat = pattern; - retryText = text; - break; - - case '[': - found = FALSE; - - while ((ch = *pattern++) != ']') { - if (ch == '\\') - ch = *pattern++; - - if (ch == '\0') - return FALSE; - - if (*text == ch) - found = TRUE; - } - len=strlen(text); - if (found == FALSE && len!=0) { - return FALSE; - } - if (found == TRUE) { - if (strlen(pattern)==0 && len==1) { - return TRUE; - } - if (len!=0) { - text++; - continue; - } - } - - /* fall into next case */ - - case '?': - if (*text++ == '\0') - return FALSE; - - break; - - case '\\': - ch = *pattern++; - - if (ch == '\0') - return FALSE; - - /* fall into next case */ - - default: - if (*text == ch) { - if (*text) - text++; - break; - } - - if (*text) { - pattern = retryPat; - text = ++retryText; - break; - } - - return FALSE; - } - - if (pattern == NULL) - return FALSE; - } - - return TRUE; -} -#endif /* BB_FIND || BB_INSMOD */ - - - - -#if defined BB_DF || defined BB_MTAB -/* - * Given a block device, find the mount table entry if that block device - * is mounted. - * - * Given any other file (or directory), find the mount table entry for its - * filesystem. - */ -extern struct mntent *findMountPoint(const char *name, const char *table) -{ - struct stat s; - dev_t mountDevice; - FILE *mountTable; - struct mntent *mountEntry; - - if (stat(name, &s) != 0) - return 0; - - if ((s.st_mode & S_IFMT) == S_IFBLK) - mountDevice = s.st_rdev; - else - mountDevice = s.st_dev; - - - if ((mountTable = setmntent(table, "r")) == 0) - return 0; - - while ((mountEntry = getmntent(mountTable)) != 0) { - if (strcmp(name, mountEntry->mnt_dir) == 0 - || strcmp(name, mountEntry->mnt_fsname) == 0) /* String match. */ - break; - if (stat(mountEntry->mnt_fsname, &s) == 0 && s.st_rdev == mountDevice) /* Match the device. */ - break; - if (stat(mountEntry->mnt_dir, &s) == 0 && s.st_dev == mountDevice) /* Match the directory's mount point. */ - break; - } - endmntent(mountTable); - return mountEntry; -} -#endif /* BB_DF || BB_MTAB */ - - - -#if defined BB_DD || defined BB_TAIL -/* - * Read a number with a possible multiplier. - * Returns -1 if the number format is illegal. - */ -extern long getNum(const char *cp) -{ - long value; - - if (!isDecimal(*cp)) - return -1; - - value = 0; - - while (isDecimal(*cp)) - value = value * 10 + *cp++ - '0'; - - switch (*cp++) { - case 'M': - case 'm': /* `tail' uses it traditionally */ - value *= 1048576; - break; - - case 'k': - value *= 1024; - break; - - case 'b': - value *= 512; - break; - - case 'w': - value *= 2; - break; - - case '\0': - return value; - - default: - return -1; - } - - if (*cp) - return -1; - - return value; -} -#endif /* BB_DD || BB_TAIL */ - - -#if defined BB_INIT || defined BB_SYSLOGD -/* try to open up the specified device */ -extern int device_open(char *device, int mode) -{ - int m, f, fd = -1; - - m = mode | O_NONBLOCK; - - /* Retry up to 5 times */ - for (f = 0; f < 5; f++) - if ((fd = open(device, m, 0600)) >= 0) - break; - if (fd < 0) - return fd; - /* Reset original flags. */ - if (m != mode) - fcntl(fd, F_SETFL, mode); - return fd; -} -#endif /* BB_INIT BB_SYSLOGD */ - - -#if defined BB_KILLALL || ( defined BB_FEATURE_LINUXRC && ( defined BB_HALT || defined BB_REBOOT || defined BB_POWEROFF )) -#ifdef BB_FEATURE_USE_DEVPS_PATCH -#include <linux/devps.h> /* For Erik's nifty devps device driver */ -#endif - -#if defined BB_FEATURE_USE_DEVPS_PATCH -/* findPidByName() - * - * This finds the pid of the specified process, - * by using the /dev/ps device driver. - * - * Returns a list of all matching PIDs - */ -extern pid_t* findPidByName( char* pidName) -{ - int fd, i, j; - char device[] = "/dev/ps"; - pid_t num_pids; - pid_t* pid_array = NULL; - pid_t* pidList=NULL; - - /* open device */ - fd = open(device, O_RDONLY); - if (fd < 0) - fatalError( "open failed for `%s': %s\n", device, strerror (errno)); - - /* Find out how many processes there are */ - if (ioctl (fd, DEVPS_GET_NUM_PIDS, &num_pids)<0) - fatalError( "\nDEVPS_GET_PID_LIST: %s\n", strerror (errno)); - - /* Allocate some memory -- grab a few extras just in case - * some new processes start up while we wait. The kernel will - * just ignore any extras if we give it too many, and will trunc. - * the list if we give it too few. */ - pid_array = (pid_t*) xcalloc( num_pids+10, sizeof(pid_t)); - pid_array[0] = num_pids+10; - - /* Now grab the pid list */ - if (ioctl (fd, DEVPS_GET_PID_LIST, pid_array)<0) - fatalError( "\nDEVPS_GET_PID_LIST: %s\n", strerror (errno)); - - /* Now search for a match */ - for (i=1, j=0; i<pid_array[0] ; i++) { - char* p; - struct pid_info info; - - info.pid = pid_array[i]; - if (ioctl (fd, DEVPS_GET_PID_INFO, &info)<0) - fatalError( "\nDEVPS_GET_PID_INFO: %s\n", strerror (errno)); - - /* Make sure we only match on the process name */ - p=info.command_line+1; - while ((*p != 0) && !isspace(*(p)) && (*(p-1) != '\\')) { - (p)++; - } - if (isspace(*(p))) - *p='\0'; - - if ((strstr(info.command_line, pidName) != NULL) - && (strlen(pidName) == strlen(info.command_line))) { - pidList=xrealloc( pidList, sizeof(pid_t) * (j+2)); - pidList[j++]=info.pid; - } - } - if (pidList) - pidList[j]=0; - - /* Free memory */ - free( pid_array); - - /* close device */ - if (close (fd) != 0) - fatalError( "close failed for `%s': %s\n",device, strerror (errno)); - - return pidList; -} -#else /* BB_FEATURE_USE_DEVPS_PATCH */ -#if ! defined BB_FEATURE_USE_PROCFS -#error Sorry, I depend on the /proc filesystem right now. -#endif - -/* findPidByName() - * - * This finds the pid of the specified process. - * Currently, it's implemented by rummaging through - * the proc filesystem. - * - * Returns a list of all matching PIDs - */ -extern pid_t* findPidByName( char* pidName) -{ - DIR *dir; - struct dirent *next; - pid_t* pidList=NULL; - int i=0; - - dir = opendir("/proc"); - if (!dir) - fatalError( "Cannot open /proc: %s\n", strerror (errno)); - - while ((next = readdir(dir)) != NULL) { - FILE *status; - char filename[256]; - char buffer[256]; - - /* If it isn't a number, we don't want it */ - if (!isdigit(*next->d_name)) - continue; - - sprintf(filename, "/proc/%s/cmdline", next->d_name); - status = fopen(filename, "r"); - if (!status) { - continue; - } - fgets(buffer, 256, status); - fclose(status); - - if (strstr(get_last_path_component(buffer), pidName) != NULL) { - pidList=xrealloc( pidList, sizeof(pid_t) * (i+2)); - pidList[i++]=strtol(next->d_name, NULL, 0); - } - } - - if (pidList) - pidList[i]=0; - return pidList; -} -#endif /* BB_FEATURE_USE_DEVPS_PATCH */ -#endif /* BB_KILLALL || ( BB_FEATURE_LINUXRC && ( BB_HALT || BB_REBOOT || BB_POWEROFF )) */ - -#ifndef DMALLOC -/* this should really be farmed out to libbusybox.a */ -extern void *xmalloc(size_t size) -{ - void *ptr = malloc(size); - - if (!ptr) - fatalError("memory_exhausted"); - return ptr; -} - -extern void *xrealloc(void *old, size_t size) -{ - void *ptr = realloc(old, size); - if (!ptr) - fatalError("memory_exhausted"); - return ptr; -} - -extern void *xcalloc(size_t nmemb, size_t size) -{ - void *ptr = calloc(nmemb, size); - if (!ptr) - fatalError("memory_exhausted"); - return ptr; -} -#endif - -#if defined BB_FEATURE_NFSMOUNT || defined BB_SH || defined BB_LS -# ifndef DMALLOC -extern char * xstrdup (const char *s) { - char *t; - - if (s == NULL) - return NULL; - - t = strdup (s); - - if (t == NULL) - fatalError("memory_exhausted"); - - return t; -} -# endif -#endif - -#if defined BB_FEATURE_NFSMOUNT -extern char * xstrndup (const char *s, int n) { - char *t; - - if (s == NULL) - fatalError("xstrndup bug"); - - t = xmalloc(n+1); - strncpy(t,s,n); - t[n] = 0; - - return t; -} -#endif - - -#if (__GLIBC__ < 2) && (defined BB_SYSLOGD || defined BB_INIT) -extern int vdprintf(int d, const char *format, va_list ap) -{ - char buf[BUF_SIZE]; - int len; - - len = vsprintf(buf, format, ap); - return write(d, buf, len); -} -#endif /* BB_SYSLOGD */ - - -#if defined BB_FEATURE_MOUNT_LOOP -#include <fcntl.h> -#include "loop.h" /* Pull in loop device support */ - -extern int del_loop(const char *device) -{ - int fd; - - if ((fd = open(device, O_RDONLY)) < 0) { - perror(device); - return (FALSE); - } - if (ioctl(fd, LOOP_CLR_FD, 0) < 0) { - perror("ioctl: LOOP_CLR_FD"); - return (FALSE); - } - close(fd); - return (TRUE); -} - -extern int set_loop(const char *device, const char *file, int offset, - int *loopro) -{ - struct loop_info loopinfo; - int fd, ffd, mode; - - mode = *loopro ? O_RDONLY : O_RDWR; - if ((ffd = open(file, mode)) < 0 && !*loopro - && (errno != EROFS || (ffd = open(file, mode = O_RDONLY)) < 0)) { - perror(file); - return 1; - } - if ((fd = open(device, mode)) < 0) { - close(ffd); - perror(device); - return 1; - } - *loopro = (mode == O_RDONLY); - - memset(&loopinfo, 0, sizeof(loopinfo)); - strncpy(loopinfo.lo_name, file, LO_NAME_SIZE); - loopinfo.lo_name[LO_NAME_SIZE - 1] = 0; - - loopinfo.lo_offset = offset; - - loopinfo.lo_encrypt_key_size = 0; - if (ioctl(fd, LOOP_SET_FD, ffd) < 0) { - perror("ioctl: LOOP_SET_FD"); - close(fd); - close(ffd); - return 1; - } - if (ioctl(fd, LOOP_SET_STATUS, &loopinfo) < 0) { - (void) ioctl(fd, LOOP_CLR_FD, 0); - perror("ioctl: LOOP_SET_STATUS"); - close(fd); - close(ffd); - return 1; - } - close(fd); - close(ffd); - return 0; -} - -extern char *find_unused_loop_device(void) -{ - char dev[20]; - int i, fd; - struct stat statbuf; - struct loop_info loopinfo; - - for (i = 0; i <= 7; i++) { - sprintf(dev, "/dev/loop%d", i); - if (stat(dev, &statbuf) == 0 && S_ISBLK(statbuf.st_mode)) { - if ((fd = open(dev, O_RDONLY)) >= 0) { - if (ioctl(fd, LOOP_GET_STATUS, &loopinfo) == -1) { - if (errno == ENXIO) { /* probably free */ - close(fd); - return strdup(dev); - } - } - close(fd); - } - } - } - return NULL; -} -#endif /* BB_FEATURE_MOUNT_LOOP */ - -#if defined BB_MOUNT || defined BB_DF || ( defined BB_UMOUNT && ! defined BB_MTAB) -extern int find_real_root_device_name(char* name) -{ - DIR *dir; - struct dirent *entry; - struct stat statBuf, rootStat; - char fileName[BUFSIZ]; - - if (stat("/", &rootStat) != 0) { - errorMsg("could not stat '/'\n"); - return( FALSE); - } - - dir = opendir("/dev"); - if (!dir) { - errorMsg("could not open '/dev'\n"); - return( FALSE); - } - - while((entry = readdir(dir)) != NULL) { - - /* Must skip ".." since that is "/", and so we - * would get a false positive on ".." */ - if (strcmp(entry->d_name, "..") == 0) - continue; - - snprintf( fileName, strlen(name)+1, "/dev/%s", entry->d_name); - - if (stat(fileName, &statBuf) != 0) - continue; - /* Some char devices have the same dev_t as block - * devices, so make sure this is a block device */ - if (! S_ISBLK(statBuf.st_mode)) - continue; - if (statBuf.st_rdev == rootStat.st_rdev) { - strcpy(name, fileName); - return ( TRUE); - } - } - - return( FALSE); -} -#endif - - -/* get_line_from_file() - This function reads an entire line from a text file - * up to a newline. It returns a malloc'ed char * which must be stored and - * free'ed by the caller. */ -extern char *get_line_from_file(FILE *file) -{ - static const int GROWBY = 80; /* how large we will grow strings by */ - - int ch; - int idx = 0; - char *linebuf = NULL; - int linebufsz = 0; - - while (1) { - ch = fgetc(file); - if (ch == EOF) - break; - /* grow the line buffer as necessary */ - while (idx > linebufsz-2) - linebuf = xrealloc(linebuf, linebufsz += GROWBY); - linebuf[idx++] = (char)ch; - if ((char)ch == '\n') - break; - } - - if (idx == 0) - return NULL; - - linebuf[idx] = 0; - return linebuf; -} - -#if defined BB_CAT -extern void print_file(FILE *file) -{ - int c; - - while ((c = getc(file)) != EOF) - putc(c, stdout); - fclose(file); - fflush(stdout); -} - -extern int print_file_by_name(char *filename) -{ - FILE *file; - file = fopen(filename, "r"); - if (file == NULL) { - return FALSE; - } - print_file(file); - return TRUE; -} -#endif /* BB_CAT || BB_LSMOD */ - -#if defined BB_ECHO || defined BB_TR -char process_escape_sequence(char **ptr) -{ - char c; - - switch (c = *(*ptr)++) { - case 'a': - c = '\a'; - break; - case 'b': - c = '\b'; - break; - case 'f': - c = '\f'; - break; - case 'n': - c = '\n'; - break; - case 't': - c = '\t'; - break; - case 'v': - c = '\v'; - break; - case '\\': - c = '\\'; - break; - case '0': case '1': case '2': case '3': - case '4': case '5': case '6': case '7': - c -= '0'; - if ('0' <= **ptr && **ptr <= '7') { - c = c * 8 + (*(*ptr)++ - '0'); - if ('0' <= **ptr && **ptr <= '7') - c = c * 8 + (*(*ptr)++ - '0'); - } - break; - default: - (*ptr)--; - c = '\\'; - break; - } - return c; -} -#endif - -#if defined BB_BASENAME || defined BB_LN || defined BB_SH -char *get_last_path_component(char *path) -{ - char *s=path+strlen(path)-1; - - /* strip trailing slashes */ - while (s && *s == '/') { - *s-- = '\0'; - } - - /* find last component */ - s = strrchr(path, '/'); - if (s==NULL) return path; - else return s+1; -} -#endif - -#if defined BB_GREP || defined BB_SED -void xregcomp(regex_t *preg, const char *regex, int cflags) -{ - int ret; - if ((ret = regcomp(preg, regex, cflags)) != 0) { - int errmsgsz = regerror(ret, preg, NULL, 0); - char *errmsg = xmalloc(errmsgsz); - regerror(ret, preg, errmsg, errmsgsz); - fatalError("bb_regcomp: %s\n", errmsg); - } -} -#endif - -/* END CODE */ -/* -Local Variables: -c-file-style: "linux" -c-basic-offset: 4 -tab-width: 4 -End: -*/ diff --git a/mdk-stage1/insmod-modutils/Makefile b/mdk-stage1/insmod-modutils/Makefile deleted file mode 100644 index 74ebdeafb..000000000 --- a/mdk-stage1/insmod-modutils/Makefile +++ /dev/null @@ -1,61 +0,0 @@ - #****************************************************************************** - # - # insmod from modutils (generic) - # - # $Id$ - # - # Copyright 1996, 1997 Linux International. - # - #***************************************************************************** - -top_dir = .. - -include $(top_dir)/Makefile.common - - -FLAGS = -c -Wall -Os -fomit-frame-pointer -I./include -D_GNU_SOURCE -DELF_MACHINE_H='"elf_$(ARCH).h"' -DARCH_$(ARCH) - - -DIRS = util obj - -all: dirs insmod libinsmod.a #libinsmod-DIET.a - -dirs: - @for n in . $(DIRS); do \ - [ "$$n" = "." ] || make -C $$n ;\ - done - -clean: - @for n in $(DIRS); do \ - (cd $$n; make clean) \ - done - rm -rf t *.o insmod libinsmod.a libinsmod-DIET.a - - -insmod: insmod-frontend.o insmod.o ./util/libutil-STANDALONE.a ./obj/libobj.a - gcc -o $@ $^ - $(STRIPCMD) $@ - -t/.create_stuff: util/libutil.a obj/libobj.a - rm -rf t - mkdir t - cd t && for e in $^; do ar -x ../$$e; done - touch t/.create_stuff - -libinsmod.a: insmod.o t/.create_stuff - ar cru $@ insmod.o t/* - ranlib $@ - -libinsmod-DIET.a: insmod-DIET.o ./util/libutil-DIET.a ./obj/libobj-DIET.a - ar cru $@ $^ - ranlib $@ - -insmod-frontend.o: insmod-frontend.c insmod.c - gcc $(FLAGS) $(GLIBC_INCLUDES) insmod-frontend.c - -insmod.o: insmod.c - gcc $(FLAGS) $(GLIBC_INCLUDES) insmod.c - -insmod-DIET.o: insmod.c - gcc $(FLAGS) $(DIETLIBC_INCLUDES) -o $@ insmod.c - diff --git a/mdk-stage1/insmod-modutils/include/config.h b/mdk-stage1/insmod-modutils/include/config.h deleted file mode 100644 index 11da6a523..000000000 --- a/mdk-stage1/insmod-modutils/include/config.h +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Configuration file management - * - * Copyright 1994, 1995, 1996, 1997: - * Jacques Gelinas <jack@solucorp.qc.ca> - * Björn Ekwall <bj0rn@blox.se> February, March 1999 - * - * This file is part of the Linux modutils. - * - * 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 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, write to the Free Software Foundation, - * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#ifndef _CONFIG_H -#define _CONFIG_H - -#include <stdio.h> -#include <sys/utsname.h> - -#define ETC_MODULES_CONF "/etc/modules.conf" - -#define EXEC_PRE_INSTALL 0 -#define EXEC_POST_INSTALL 1 -#define EXEC_PRE_REMOVE 2 -#define EXEC_POST_REMOVE 3 -#define EXEC_INSTALL 4 -#define EXEC_REMOVE 5 - -struct PATH_TYPE { - char *type; - char *path; -}; - -struct EXEC_TYPE { - int when; - char *module; - char *cmd; -}; - -typedef struct { - char *name; - GLOB_LIST *opts; - int autoclean; -} OPT_LIST; - -/* config.c */ -extern int flag_autoclean; -extern struct utsname uts_info; -extern char *aliaslist[]; -extern struct PATH_TYPE *modpath; -extern int nmodpath; -extern struct EXEC_TYPE *execs; -extern int nexecs; -extern char *insmod_opt; -extern char *config_file; -extern char *optlist[]; -extern char *prune[]; -extern OPT_LIST *opt_list; -extern OPT_LIST *abovelist; -extern OPT_LIST *belowlist; -extern OPT_LIST *prunelist; -extern OPT_LIST *probe_list; -extern OPT_LIST *probeall_list; -extern OPT_LIST *aliases; -extern time_t config_mtime; -extern int root_check_off; /* Check modules are owned by root? */ - -/* Information about generated files */ -struct gen_files { - char *base; /* xxx in /lib/modules/`uname -r`/modules.xxx */ - char *name; /* name actually used */ - time_t mtime; -}; - -extern struct gen_files gen_file[]; -extern const int gen_file_count; -/* The enum order must match the gen_file initialization order in config.c */ -enum gen_file_enum { - GEN_GENERIC_STRINGFILE, - GEN_PCIMAPFILE, - GEN_ISAPNPMAPFILE, - GEN_USBMAPFILE, - GEN_PARPORTMAPFILE, - GEN_DEPFILE, -}; - -extern char *persistdir; - -char *fgets_strip(char *buf, int sizebuf, FILE * fin, int *lineno); -int config_read(int all, char *force_ver, char *base_dir, char *conf_file); -GLOB_LIST *config_lstmod(const char *match, const char *type, int first_only); -char *search_module_path(const char *base); - -#endif /* _CONFIG_H */ diff --git a/mdk-stage1/insmod-modutils/include/elf_alpha.h b/mdk-stage1/insmod-modutils/include/elf_alpha.h deleted file mode 100644 index f1ec66f1c..000000000 --- a/mdk-stage1/insmod-modutils/include/elf_alpha.h +++ /dev/null @@ -1,10 +0,0 @@ -/* Machine-specific elf macros for the Alpha. */ -#ident "$Id$" - -#define ELFCLASSM ELFCLASS64 -#define ELFDATAM ELFDATA2LSB - -#define MATCH_MACHINE(x) (x == EM_ALPHA) - -#define SHT_RELM SHT_RELA -#define Elf64_RelM Elf64_Rela diff --git a/mdk-stage1/insmod-modutils/include/elf_arm.h b/mdk-stage1/insmod-modutils/include/elf_arm.h deleted file mode 100644 index f6b531e88..000000000 --- a/mdk-stage1/insmod-modutils/include/elf_arm.h +++ /dev/null @@ -1,10 +0,0 @@ -/* Machine-specific elf macros for ARM. */ -#ident "$Id$" - -#define ELFCLASSM ELFCLASS32 -#define ELFDATAM ELFDATA2LSB - -#define MATCH_MACHINE(x) (x == EM_ARM) - -#define SHT_RELM SHT_REL -#define Elf32_RelM Elf32_Rel diff --git a/mdk-stage1/insmod-modutils/include/elf_hppa.h b/mdk-stage1/insmod-modutils/include/elf_hppa.h deleted file mode 100644 index 9a1bd34ce..000000000 --- a/mdk-stage1/insmod-modutils/include/elf_hppa.h +++ /dev/null @@ -1,9 +0,0 @@ -/* Machine-specific elf macros for HP-PA. */ - -#define ELFCLASSM ELFCLASS32 -#define ELFDATAM ELFDATA2MSB - -#define MATCH_MACHINE(x) (x == EM_PARISC) - -#define SHT_RELM SHT_RELA -#define Elf32_RelM Elf32_Rela diff --git a/mdk-stage1/insmod-modutils/include/elf_hppa64.h b/mdk-stage1/insmod-modutils/include/elf_hppa64.h deleted file mode 100644 index 05b201aef..000000000 --- a/mdk-stage1/insmod-modutils/include/elf_hppa64.h +++ /dev/null @@ -1,9 +0,0 @@ -/* Machine-specific elf macros for HP-PA64. */ - -#define ELFCLASSM ELFCLASS64 -#define ELFDATAM ELFDATA2MSB - -#define MATCH_MACHINE(x) (x == EM_PARISC) - -#define SHT_RELM SHT_RELA -#define Elf64_RelM Elf64_Rela diff --git a/mdk-stage1/insmod-modutils/include/elf_i386.h b/mdk-stage1/insmod-modutils/include/elf_i386.h deleted file mode 100644 index c6c2d326e..000000000 --- a/mdk-stage1/insmod-modutils/include/elf_i386.h +++ /dev/null @@ -1,10 +0,0 @@ -/* Machine-specific elf macros for i386 et al. */ -#ident "$Id$" - -#define ELFCLASSM ELFCLASS32 -#define ELFDATAM ELFDATA2LSB - -#define MATCH_MACHINE(x) (x == EM_386) - -#define SHT_RELM SHT_REL -#define Elf32_RelM Elf32_Rel diff --git a/mdk-stage1/insmod-modutils/include/elf_ia64.h b/mdk-stage1/insmod-modutils/include/elf_ia64.h deleted file mode 100644 index b4d902956..000000000 --- a/mdk-stage1/insmod-modutils/include/elf_ia64.h +++ /dev/null @@ -1,9 +0,0 @@ -/* Machine-specific elf macros for ia64. */ - -#define ELFCLASSM ELFCLASS64 -#define ELFDATAM ELFDATA2LSB - -#define MATCH_MACHINE(x) (x == EM_IA_64) - -#define SHT_RELM SHT_RELA -#define Elf64_RelM Elf64_Rela diff --git a/mdk-stage1/insmod-modutils/include/elf_m68k.h b/mdk-stage1/insmod-modutils/include/elf_m68k.h deleted file mode 100644 index 817fc8f2c..000000000 --- a/mdk-stage1/insmod-modutils/include/elf_m68k.h +++ /dev/null @@ -1,10 +0,0 @@ -/* Machine-specific elf macros for m68k. */ -#ident "$Id$" - -#define ELFCLASSM ELFCLASS32 -#define ELFDATAM ELFDATA2MSB - -#define MATCH_MACHINE(x) (x == EM_68K) - -#define SHT_RELM SHT_RELA -#define Elf32_RelM Elf32_Rela diff --git a/mdk-stage1/insmod-modutils/include/elf_mips.h b/mdk-stage1/insmod-modutils/include/elf_mips.h deleted file mode 100644 index 8a0430216..000000000 --- a/mdk-stage1/insmod-modutils/include/elf_mips.h +++ /dev/null @@ -1,24 +0,0 @@ -/* Machine-specific elf macros for MIPS. */ -#ident "$Id$" - -#define ELFCLASSM ELFCLASS32 -#ifdef __MIPSEB__ -#define ELFDATAM ELFDATA2MSB -#endif -#ifdef __MIPSEL__ -#define ELFDATAM ELFDATA2LSB -#endif - -/* Account for ELF spec changes. */ -#ifndef EM_MIPS_RS3_LE -#ifdef EM_MIPS_RS4_BE -#define EM_MIPS_RS3_LE EM_MIPS_RS4_BE -#else -#define EM_MIPS_RS3_LE 10 -#endif -#endif /* !EM_MIPS_RS3_LE */ - -#define MATCH_MACHINE(x) (x == EM_MIPS || x == EM_MIPS_RS3_LE) - -#define SHT_RELM SHT_REL -#define Elf32_RelM Elf32_Rel diff --git a/mdk-stage1/insmod-modutils/include/elf_ppc.h b/mdk-stage1/insmod-modutils/include/elf_ppc.h deleted file mode 100644 index 71596de8c..000000000 --- a/mdk-stage1/insmod-modutils/include/elf_ppc.h +++ /dev/null @@ -1,10 +0,0 @@ -/* Machine-specific elf macros for the PowerPC. */ -#ident "$Id$" - -#define ELFCLASSM ELFCLASS32 -#define ELFDATAM ELFDATA2MSB - -#define MATCH_MACHINE(x) (x == EM_PPC) - -#define SHT_RELM SHT_RELA -#define Elf32_RelM Elf32_Rela diff --git a/mdk-stage1/insmod-modutils/include/elf_s390.h b/mdk-stage1/insmod-modutils/include/elf_s390.h deleted file mode 100644 index 547d66b83..000000000 --- a/mdk-stage1/insmod-modutils/include/elf_s390.h +++ /dev/null @@ -1,10 +0,0 @@ -/* Machine-specific elf macros for i386 et al. */ -#ident "$Id$" - -#define ELFCLASSM ELFCLASS32 -#define ELFDATAM ELFDATA2MSB - -#define MATCH_MACHINE(x) (x == EM_S390) - -#define SHT_RELM SHT_RELA -#define Elf32_RelM Elf32_Rela diff --git a/mdk-stage1/insmod-modutils/include/elf_sparc.h b/mdk-stage1/insmod-modutils/include/elf_sparc.h deleted file mode 100644 index 9b5c348d9..000000000 --- a/mdk-stage1/insmod-modutils/include/elf_sparc.h +++ /dev/null @@ -1,10 +0,0 @@ -/* Machine-specific elf macros for the Sparc. */ -#ident "$Id$" - -#define ELFCLASSM ELFCLASS32 -#define ELFDATAM ELFDATA2MSB - -#define MATCH_MACHINE(x) (x == EM_SPARC) - -#define SHT_RELM SHT_RELA -#define Elf32_RelM Elf32_Rela diff --git a/mdk-stage1/insmod-modutils/include/elf_sparc64.h b/mdk-stage1/insmod-modutils/include/elf_sparc64.h deleted file mode 100644 index 158edd7e1..000000000 --- a/mdk-stage1/insmod-modutils/include/elf_sparc64.h +++ /dev/null @@ -1,27 +0,0 @@ -/* Machine-specific elf macros for the Sparc. */ -#ident "$Id$" - -#define ELFCLASSM ELFCLASS64 -#define ELFDATAM ELFDATA2MSB - -#ifndef EM_SPARCV9 -#define EM_SPARCV9 43 -#endif -#ifndef EM_SPARC64 -#define EM_SPARC64 11 -#endif -#define MATCH_MACHINE(x) ((x) == EM_SPARCV9 || (x) == EM_SPARC64) - -#define SHT_RELM SHT_RELA -#define Elf64_RelM Elf64_Rela - -#ifndef ELF64_R_SYM -#define ELF64_R_SYM(x) ((x) >> 32) -#define ELF64_R_TYPE(x) ((unsigned)(x)) -#endif - -#ifndef ELF64_ST_BIND -#define ELF64_ST_BIND(x) ((x) >> 4) -#define ELF64_ST_TYPE(x) ((x) & 0xf) -#endif - diff --git a/mdk-stage1/insmod-modutils/include/kallsyms.h b/mdk-stage1/insmod-modutils/include/kallsyms.h deleted file mode 100644 index 9748873cf..000000000 --- a/mdk-stage1/insmod-modutils/include/kallsyms.h +++ /dev/null @@ -1,131 +0,0 @@ -/* kallsyms headers - Copyright 2000 Keith Owens <kaos@ocs.com.au> - - This file is part of the Linux modutils. It is exported to kernel - space so debuggers can access the kallsyms data. - - The kallsyms data contains all the non-stack symbols from a kernel - or a module. The kernel symbols are held between __start___kallsyms - and __stop___kallsyms. The symbols for a module are accessed via - the struct module chain which is based at module_list. - - 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 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, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#ident "$Id$" - -#ifndef MODUTILS_KALLSYMS_H -#define MODUTILS_KALLSYMS_H 1 - -/* Have to (re)define these ElfW entries here because external kallsyms - * code does not have access to modutils/include/obj.h. This code is - * included from user spaces tools (modutils) and kernel, they need - * different includes. - */ - -#ifndef ELFCLASS32 -#ifdef __KERNEL__ -#include <linux/elf.h> -#else /* __KERNEL__ */ -#include <elf.h> -#endif /* __KERNEL__ */ -#endif /* ELFCLASS32 */ - -#ifndef ELFCLASSM -#define ELFCLASSM ELF_CLASS -#endif - -#ifndef ElfW -# if ELFCLASSM == ELFCLASS32 -# define ElfW(x) Elf32_ ## x -# define ELFW(x) ELF32_ ## x -# else -# define ElfW(x) Elf64_ ## x -# define ELFW(x) ELF64_ ## x -# endif -#endif - -/* Format of data in the kallsyms section. - * Most of the fields are small numbers but the total size and all - * offsets can be large so use the 32/64 bit types for these fields. - * - * Do not use sizeof() on these structures, modutils may be using extra - * fields. Instead use the size fields in the header to access the - * other bits of data. - */ - -struct kallsyms_header { - int size; /* Size of this header */ - ElfW(Word) total_size; /* Total size of kallsyms data */ - int sections; /* Number of section entries */ - ElfW(Off) section_off; /* Offset to first section entry */ - int section_size; /* Size of one section entry */ - int symbols; /* Number of symbol entries */ - ElfW(Off) symbol_off; /* Offset to first symbol entry */ - int symbol_size; /* Size of one symbol entry */ - ElfW(Off) string_off; /* Offset to first string */ - ElfW(Addr) start; /* Start address of first section */ - ElfW(Addr) end; /* End address of last section */ -}; - -struct kallsyms_section { - ElfW(Addr) start; /* Start address of section */ - ElfW(Word) size; /* Size of this section */ - ElfW(Off) name_off; /* Offset to section name */ - ElfW(Word) flags; /* Flags from section */ -}; - -struct kallsyms_symbol { - ElfW(Off) section_off; /* Offset to section that owns this symbol */ - ElfW(Addr) symbol_addr; /* Address of symbol */ - ElfW(Off) name_off; /* Offset to symbol name */ -}; - -#define KALLSYMS_SEC_NAME "__kallsyms" -#define KALLSYMS_IDX 2 /* obj_kallsyms creates kallsyms as section 2 */ - -#define kallsyms_next_sec(h,s) \ - ((s) = (struct kallsyms_section *)((char *)(s) + (h)->section_size)) -#define kallsyms_next_sym(h,s) \ - ((s) = (struct kallsyms_symbol *)((char *)(s) + (h)->symbol_size)) - -int kallsyms_symbol_to_address( - const char *name, /* Name to lookup */ - unsigned long *token, /* Which module to start with */ - const char **mod_name, /* Set to module name or "kernel" */ - unsigned long *mod_start, /* Set to start address of module */ - unsigned long *mod_end, /* Set to end address of module */ - const char **sec_name, /* Set to section name */ - unsigned long *sec_start, /* Set to start address of section */ - unsigned long *sec_end, /* Set to end address of section */ - const char **sym_name, /* Set to full symbol name */ - unsigned long *sym_start, /* Set to start address of symbol */ - unsigned long *sym_end /* Set to end address of symbol */ - ); - -int kallsyms_address_to_symbol( - unsigned long address, /* Address to lookup */ - const char **mod_name, /* Set to module name */ - unsigned long *mod_start, /* Set to start address of module */ - unsigned long *mod_end, /* Set to end address of module */ - const char **sec_name, /* Set to section name */ - unsigned long *sec_start, /* Set to start address of section */ - unsigned long *sec_end, /* Set to end address of section */ - const char **sym_name, /* Set to full symbol name */ - unsigned long *sym_start, /* Set to start address of symbol */ - unsigned long *sym_end /* Set to end address of symbol */ - ); - -#endif /* kallsyms.h */ diff --git a/mdk-stage1/insmod-modutils/include/kerneld.h b/mdk-stage1/insmod-modutils/include/kerneld.h deleted file mode 100644 index 3bc2c9d42..000000000 --- a/mdk-stage1/insmod-modutils/include/kerneld.h +++ /dev/null @@ -1,46 +0,0 @@ -/* Definitions for the Linux kerneld SYSV IPC interface. - This file was part of the Linux kernel, and so is covered by the GPL. */ - -#ifndef MODUTILS_KERNELD_H -#define MODUTILS_KERNELD_H - -#ident "$Id$" - -#define KERNELD_SYSTEM 1 -#define KERNELD_REQUEST_MODULE 2 /* "insmod" */ -#define KERNELD_RELEASE_MODULE 3 /* "rmmod" */ -#define KERNELD_DELAYED_RELEASE_MODULE 4 /* "rmmod" */ -#define KERNELD_CANCEL_RELEASE_MODULE 5 /* "rmmod" */ -#define KERNELD_REQUEST_ROUTE 6 /* net/ipv4/route.c */ -#define KERNELD_BLANKER 7 /* drivers/char/console.c */ -#define KERNELD_PNP 8 /* drivers/pnp/kerneld.c */ -#define KERNELD_ARP 256 /* net/ipv4/arp.c */ - -#ifdef NEW_KERNELD_PROTOCOL -# define OLDIPC_KERNELD 00040000 /* old kerneld message channel */ -# define IPC_KERNELD 00140000 /* new kerneld message channel */ -# define KDHDR (sizeof(long) + sizeof(short) + sizeof(short)) -# define NULL_KDHDR 0, 2, 0 -#else /* NEW_KERNELD_PROTOCOL */ -# define IPC_KERNELD 00040000 -# define KDHDR (sizeof(long)) -# define NULL_KDHDR 0 -#endif /* NEW_KERNELD_PROTOCOL */ - -#define KERNELD_MAXCMD 0x7ffeffff -#define KERNELD_MINSEQ 0x7fff0000 /* "commands" legal up to 0x7ffeffff */ -#define KERNELD_WAIT 0x80000000 -#define KERNELD_NOWAIT 0 - -struct kerneld_msg - { - long mtype; - long id; -#ifdef NEW_KERNELD_PROTOCOL - short version; - short pid; -#endif /* NEW_KERNELD_PROTOCOL */ - char text[1]; - }; - -#endif /* kerneld.h */ diff --git a/mdk-stage1/insmod-modutils/include/modstat.h b/mdk-stage1/insmod-modutils/include/modstat.h deleted file mode 100644 index b8a58eeae..000000000 --- a/mdk-stage1/insmod-modutils/include/modstat.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * For kernel module status and information - * - * Add module_name_list and l_module_name_list. - * Keith Owens <kaos@ocs.com.au> November 1999. - * Björn Ekwall <bj0rn@blox.se> February 1999. - * - * This file is part of the Linux modutils. - * - * 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 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, write to the Free Software Foundation, - * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ -#ifndef _KERNEL_H -#define _KERNEL_H - -#define K_SYMBOLS 1 /* Want info about symbols */ -#define K_INFO 2 /* Want extended module info */ -#define K_REFS 4 /* Want info about references */ - -struct module_stat { - char *name; - unsigned long addr; - unsigned long modstruct; /* COMPAT_2_0! *//* depends on architecture? */ - unsigned long size; - unsigned long flags; - long usecount; - size_t nsyms; - struct module_symbol *syms; - size_t nrefs; - struct module_stat **refs; - unsigned long status; -}; - -extern struct module_stat *module_stat; -extern size_t n_module_stat; -extern char *module_name_list; -extern size_t l_module_name_list; -extern struct module_symbol *ksyms; -extern size_t nksyms; -extern int k_new_syscalls; - -int get_kernel_info(int type); - -#endif /* _KERNEL_H */ diff --git a/mdk-stage1/insmod-modutils/include/module.h b/mdk-stage1/insmod-modutils/include/module.h deleted file mode 100644 index db49ab2b2..000000000 --- a/mdk-stage1/insmod-modutils/include/module.h +++ /dev/null @@ -1,210 +0,0 @@ -/* Definitions for the Linux module syscall interface. - Copyright 1996, 1997 Linux International. - - Contributed by Richard Henderson <rth@tamu.edu> - - This file is part of the Linux modutils. - - 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 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, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - - -#ifndef MODUTILS_MODULE_H -#define MODUTILS_MODULE_H 1 - -#ident "$Id$" - -/* This file contains the structures used by the 2.0 and 2.1 kernels. - We do not use the kernel headers directly because we do not wish - to be dependant on a particular kernel version to compile insmod. */ - - -/*======================================================================*/ -/* The structures used by Linux 2.0. */ - -/* The symbol format used by get_kernel_syms(2). */ -struct old_kernel_sym -{ - unsigned long value; - char name[60]; -}; - -struct old_module_ref -{ - unsigned long module; /* kernel addresses */ - unsigned long next; -}; - -struct old_module_symbol -{ - unsigned long addr; - unsigned long name; -}; - -struct old_symbol_table -{ - int size; /* total, including string table!!! */ - int n_symbols; - int n_refs; - struct old_module_symbol symbol[0]; /* actual size defined by n_symbols */ - struct old_module_ref ref[0]; /* actual size defined by n_refs */ -}; - -struct old_mod_routines -{ - unsigned long init; - unsigned long cleanup; -}; - -struct old_module -{ - unsigned long next; - unsigned long ref; /* the list of modules that refer to me */ - unsigned long symtab; - unsigned long name; - int size; /* size of module in pages */ - unsigned long addr; /* address of module */ - int state; - unsigned long cleanup; /* cleanup routine */ -}; - -/* Sent to init_module(2) or'ed into the code size parameter. */ -#define OLD_MOD_AUTOCLEAN 0x40000000 /* big enough, but no sign problems... */ - -int get_kernel_syms(struct old_kernel_sym *); -int old_sys_init_module(const char *name, char *code, unsigned codesize, - struct old_mod_routines *, struct old_symbol_table *); - -/*======================================================================*/ -/* For sizeof() which are related to the module platform and not to the - environment isnmod is running in, use sizeof_xx instead of sizeof(xx). */ - -#define tgt_sizeof_char sizeof(char) -#define tgt_sizeof_short sizeof(short) -#define tgt_sizeof_int sizeof(int) -#define tgt_sizeof_long sizeof(long) -#define tgt_sizeof_char_p sizeof(char *) -#define tgt_sizeof_void_p sizeof(void *) -#define tgt_long long -#define tgt_long_fmt "l" - -/* This assumes that long long on a 32 bit system is equivalent to long on the - * equivalent 64 bit system. Also that void and char pointers are 8 bytes on - * all 64 bit systems. Add per system tweaks if it ever becomes necessary. - */ -#if defined(COMMON_3264) && defined(ONLY_64) -#undef tgt_long -#undef tgt_long_fmt -#undef tgt_sizeof_long -#undef tgt_sizeof_char_p -#undef tgt_sizeof_void_p -#define tgt_long long long -#define tgt_long_fmt "ll" -#define tgt_sizeof_long 8 -#define tgt_sizeof_char_p 8 -#define tgt_sizeof_void_p 8 -#endif - -/*======================================================================*/ -/* The structures used in Linux 2.1 onwards. */ - -/* Note: module_symbol does not use tgt_long intentionally */ -struct module_symbol -{ - unsigned long value; - unsigned long name; -}; - -struct module_ref -{ - unsigned tgt_long dep; /* kernel addresses */ - unsigned tgt_long ref; - unsigned tgt_long next_ref; -}; - -struct module -{ - unsigned tgt_long size_of_struct; /* == sizeof(module) */ - unsigned tgt_long next; - unsigned tgt_long name; - unsigned tgt_long size; - - tgt_long usecount; - unsigned tgt_long flags; /* AUTOCLEAN et al */ - - unsigned nsyms; - unsigned ndeps; - - unsigned tgt_long syms; - unsigned tgt_long deps; - unsigned tgt_long refs; - unsigned tgt_long init; - unsigned tgt_long cleanup; - unsigned tgt_long ex_table_start; - unsigned tgt_long ex_table_end; -#ifdef __alpha__ - unsigned tgt_long gp; -#endif - /* Everything after here is extension. */ - unsigned tgt_long read_start; /* Read data from existing module */ - unsigned tgt_long read_end; - unsigned tgt_long can_unload; - unsigned tgt_long runsize; - unsigned tgt_long kallsyms_start; - unsigned tgt_long kallsyms_end; - unsigned tgt_long archdata_start; - unsigned tgt_long archdata_end; - unsigned tgt_long kernel_data; -}; - -struct module_info -{ - unsigned long addr; - unsigned long size; - unsigned long flags; - long usecount; -}; - -/* Bits of module.flags. */ -#define NEW_MOD_RUNNING 1 -#define NEW_MOD_DELETED 2 -#define NEW_MOD_AUTOCLEAN 4 -#define NEW_MOD_VISITED 8 -#define NEW_MOD_USED_ONCE 16 -#define NEW_MOD_INITIALIZING 64 - -int sys_init_module(const char *name, const struct module *); -int query_module(const char *name, int which, void *buf, size_t bufsize, - size_t *ret); - -/* Values for query_module's which. */ - -#define QM_MODULES 1 -#define QM_DEPS 2 -#define QM_REFS 3 -#define QM_SYMBOLS 4 -#define QM_INFO 5 - -/*======================================================================*/ -/* The system calls unchanged between 2.0 and 2.1. */ - -unsigned long create_module(const char *, size_t); -int delete_module(const char *); - -/* In safe mode the last parameter is forced to be a module name and meta - * expansion is not allowed on that name. - */ -extern unsigned int safemode; - -#endif /* module.h */ diff --git a/mdk-stage1/insmod-modutils/include/obj.h b/mdk-stage1/insmod-modutils/include/obj.h deleted file mode 100644 index b140c65c3..000000000 --- a/mdk-stage1/insmod-modutils/include/obj.h +++ /dev/null @@ -1,275 +0,0 @@ -/* Elf object file loading and relocation routines. - Copyright 1996, 1997 Linux International. - - Contributed by Richard Henderson <rth@tamu.edu> - obj_free() added by Björn Ekwall <bj0rn@blox.se> March 1999 - - This file is part of the Linux modutils. - - 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 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, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - - -#ifndef MODUTILS_OBJ_H -#define MODUTILS_OBJ_H 1 - -#ident "$Id$" - -/* The relocatable object is manipulated using elfin types. */ - -#include <stdio.h> -#include <elf.h> -#include ELF_MACHINE_H - -#ifndef ElfW -# if ELFCLASSM == ELFCLASS32 -# define ElfW(x) Elf32_ ## x -# define ELFW(x) ELF32_ ## x -# else -# define ElfW(x) Elf64_ ## x -# define ELFW(x) ELF64_ ## x -# endif -#endif - -#if defined(COMMON_3264) && defined(ONLY_32) -# define ObjW(x) obj32_ ## x -#else -# if defined(COMMON_3264) && defined(ONLY_64) -# define ObjW(x) obj64_ ## x -# else -# define ObjW(x) obj_ ## x -# endif -#endif - -/* For some reason this is missing from lib5. */ -#ifndef ELF32_ST_INFO -# define ELF32_ST_INFO(bind, type) (((bind) << 4) + ((type) & 0xf)) -#endif - -#ifndef ELF64_ST_INFO -# define ELF64_ST_INFO(bind, type) (((bind) << 4) + ((type) & 0xf)) -#endif - -struct obj_string_patch_struct; -struct obj_symbol_patch_struct; - -struct obj_section -{ - ElfW(Shdr) header; - const char *name; - char *contents; - struct obj_section *load_next; - int idx; -}; - -struct obj_symbol -{ - struct obj_symbol *next; /* hash table link */ - const char *name; - unsigned long value; - unsigned long size; - int secidx; /* the defining section index/module */ - int info; - int ksymidx; /* for export to the kernel symtab */ - int r_type; /* relocation type */ -}; - -/* Hardcode the hash table size. We shouldn't be needing so many - symbols that we begin to degrade performance, and we get a big win - by giving the compiler a constant divisor. */ - -#define HASH_BUCKETS 521 - -struct obj_file -{ - ElfW(Ehdr) header; - ElfW(Addr) baseaddr; - struct obj_section **sections; - struct obj_section *load_order; - struct obj_section **load_order_search_start; - struct obj_string_patch_struct *string_patches; - struct obj_symbol_patch_struct *symbol_patches; - int (*symbol_cmp)(const char *, const char *); - unsigned long (*symbol_hash)(const char *); - unsigned long local_symtab_size; - struct obj_symbol **local_symtab; - struct obj_symbol *symtab[HASH_BUCKETS]; - const char *filename; - char *persist; -}; - -enum obj_reloc -{ - obj_reloc_ok, - obj_reloc_overflow, - obj_reloc_dangerous, - obj_reloc_unhandled, - obj_reloc_constant_gp -}; - -struct obj_string_patch_struct -{ - struct obj_string_patch_struct *next; - int reloc_secidx; - ElfW(Addr) reloc_offset; - ElfW(Addr) string_offset; -}; - -struct obj_symbol_patch_struct -{ - struct obj_symbol_patch_struct *next; - int reloc_secidx; - ElfW(Addr) reloc_offset; - struct obj_symbol *sym; -}; - - -/* Generic object manipulation routines. */ - -#define obj_elf_hash ObjW(elf_hash) -#define obj_elf_hash_n ObjW(elf_hash_n) -#define obj_add_symbol ObjW(add_symbol) -#define obj_find_symbol ObjW(find_symbol) -#define obj_symbol_final_value ObjW(symbol_final_value) -#define obj_set_symbol_compare ObjW(set_symbol_compare) -#define obj_find_section ObjW(find_section) -#define obj_insert_section_load_order ObjW(insert_section_load_order) -#define obj_create_alloced_section ObjW(create_alloced_section) -#define obj_create_alloced_section_first \ - ObjW(create_alloced_section_first) -#define obj_extend_section ObjW(extend_section) -#define obj_string_patch ObjW(string_patch) -#define obj_symbol_patch ObjW(symbol_patch) -#define obj_check_undefineds ObjW(check_undefineds) -#define obj_clear_undefineds ObjW(clear_undefineds) -#define obj_allocate_commons ObjW(allocate_commons) -#define obj_load_size ObjW(load_size) -#define obj_relocate ObjW(relocate) -#define obj_load ObjW(load) -#define obj_free ObjW(free) -#define obj_create_image ObjW(create_image) -#define obj_addr_to_native_ptr ObjW(addr_to_native_ptr) -#define obj_native_ptr_to_addr ObjW(native_ptr_to_addr) -#define arch_new_file ObjW(arch_new_file) -#define arch_new_section ObjW(arch_new_section) -#define arch_new_symbol ObjW(arch_new_symbol) -#define arch_apply_relocation ObjW(arch_apply_relocation) -#define arch_create_got ObjW(arch_create_got) -#define arch_init_module ObjW(arch_init_module) -#define arch_load_proc_section ObjW(arch_load_proc_section) -#define arch_finalize_section_address ObjW(arch_finalize_section_address) -#define arch_archdata ObjW(arch_archdata) - -unsigned long obj_elf_hash (const char *); - -unsigned long obj_elf_hash_n (const char *, unsigned long len); - -struct obj_symbol *obj_add_symbol (struct obj_file *f, const char *name, - unsigned long symidx, int info, int secidx, - ElfW(Addr) value, unsigned long size); - -struct obj_symbol *obj_find_symbol (struct obj_file *f, - const char *name); - -ElfW(Addr) obj_symbol_final_value (struct obj_file *f, - struct obj_symbol *sym); - -void obj_set_symbol_compare (struct obj_file *f, - int (*cmp)(const char *, const char *), - unsigned long (*hash)(const char *)); - -struct obj_section *obj_find_section (struct obj_file *f, - const char *name); - -void obj_insert_section_load_order (struct obj_file *f, - struct obj_section *sec); - -struct obj_section *obj_create_alloced_section (struct obj_file *f, - const char *name, - unsigned long align, - unsigned long size); - -struct obj_section *obj_create_alloced_section_first (struct obj_file *f, - const char *name, - unsigned long align, - unsigned long size); - -void *obj_extend_section (struct obj_section *sec, unsigned long more); - -int obj_string_patch (struct obj_file *f, int secidx, ElfW(Addr) offset, - const char *string); - -int obj_symbol_patch (struct obj_file *f, int secidx, ElfW(Addr) offset, - struct obj_symbol *sym); - -int obj_check_undefineds (struct obj_file *f, int quiet); - -void obj_clear_undefineds (struct obj_file *f); - -void obj_allocate_commons (struct obj_file *f); - -unsigned long obj_load_size (struct obj_file *f); - -int obj_relocate (struct obj_file *f, ElfW(Addr) base); - -struct obj_file *obj_load (int f, Elf32_Half e_type, const char *filename); - -void obj_free (struct obj_file *f); - -int obj_create_image (struct obj_file *f, char *image); - -int obj_kallsyms (struct obj_file *fin, struct obj_file **fout); - -/* Architecture specific manipulation routines. */ - -struct obj_file *arch_new_file (void); - -struct obj_section *arch_new_section (void); - -struct obj_symbol *arch_new_symbol (void); - -enum obj_reloc arch_apply_relocation (struct obj_file *f, - struct obj_section *targsec, - struct obj_section *symsec, - struct obj_symbol *sym, - ElfW(RelM) *rel, ElfW(Addr) value); - -int arch_create_got (struct obj_file *f); - -struct module; -int arch_init_module (struct obj_file *f, struct module *); - -int arch_load_proc_section (struct obj_section *sec, int fp); - -int arch_finalize_section_address (struct obj_file *f, ElfW(Addr) base); - -int arch_archdata (struct obj_file *fin, struct obj_section *sec); - -#define ARCHDATA_SEC_NAME "__archdata" - -/* Pointers in objects can be 32 or 64 bit */ -union obj_ptr_4 { - Elf32_Word addr; - void *ptr; -}; -union obj_ptr_8 { - Elf64_Xword addr; - void *ptr; -}; - -void *obj_addr_to_native_ptr(ElfW(Addr)); - -ElfW(Addr) obj_native_ptr_to_addr(void *); - -#endif /* obj.h */ diff --git a/mdk-stage1/insmod-modutils/include/util.h b/mdk-stage1/insmod-modutils/include/util.h deleted file mode 100644 index b2e4a67c3..000000000 --- a/mdk-stage1/insmod-modutils/include/util.h +++ /dev/null @@ -1,101 +0,0 @@ -/* Miscelaneous utility functions. - Copyright 1996, 1997 Linux International. - - Contributed by Richard Henderson <rth@tamu.edu> - - This file is part of the Linux modutils. - - 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 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, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - - -#ifndef MODUTILS_UTIL_H -#define MODUTILS_UTIL_H 1 - -#ident "$Id$" - -#include <stdio.h> -#include <sys/stat.h> - -#define SHELL_META "&();|<>$`\"'\\!{}[]~=+:?*" /* Sum of bj0rn and Debian */ - -void *xmalloc(size_t); -void *xrealloc(void *, size_t); -char *xstrdup(const char *); -char *xstrcat(char *, const char *, size_t); -int xsystem(const char *, char *const[]); -int arch64(void); - -typedef int (*xftw_func_t)(const char *, const struct stat *); -extern int xftw(const char *directory, xftw_func_t); - -/* Error logging */ -extern int log; -extern int errors; -extern const char *error_file; - -extern int flag_verbose; -extern void verbose(const char *ctl,...); - -void error(const char *fmt, ...) -#ifdef __GNUC__ - __attribute__((format(printf, 1, 2))) -#endif - ; - -void lprintf(const char *fmt, ...) -#ifdef __GNUC__ - __attribute__((format(printf, 1, 2))) -#endif - ; - -void setsyslog(const char *program); - -/* - * Generic globlist <bj0rn@blox.se> - */ -typedef struct { - int pathc; /* Count of paths matched so far */ - char **pathv; /* List of matched pathnames. */ -} GLOB_LIST; -int meta_expand(char *pt, GLOB_LIST *g, char *base_dir, char *version, int type); -#define ME_BUILTIN_COMMAND 1 -#define ME_SHELL_COMMAND 2 -#define ME_GLOB 4 -#define ME_ALL (ME_GLOB|ME_SHELL_COMMAND|ME_BUILTIN_COMMAND) - -extern void snap_shot(const char *module_name, int number); -extern void snap_shot_log(const char *fmt,...); - -#ifdef CONFIG_USE_ZLIB -int gzf_open(const char *name, int mode); -int gzf_read(int fd, void *buf, size_t count); -off_t gzf_lseek(int fd, off_t offset, int whence); -void gzf_close(int fd); - -#else /* ! CONFIG_USE_ZLIB */ - -#include <unistd.h> - -#define gzf_open open -#define gzf_read read -#define gzf_lseek lseek -#define gzf_close close - -#endif /* CONFIG_USE_ZLIB */ - -#define SYMPREFIX "__insmod_"; -extern const char symprefix[10]; /* Must be sizeof(SYMPREFIX), including nul */ - -#endif /* util.h */ diff --git a/mdk-stage1/insmod-modutils/include/version.h b/mdk-stage1/insmod-modutils/include/version.h deleted file mode 100644 index 51ca0eb29..000000000 --- a/mdk-stage1/insmod-modutils/include/version.h +++ /dev/null @@ -1 +0,0 @@ -#define MODUTILS_VERSION "2.4.2" diff --git a/mdk-stage1/insmod-modutils/insmod.c b/mdk-stage1/insmod-modutils/insmod.c deleted file mode 100644 index 359b28837..000000000 --- a/mdk-stage1/insmod-modutils/insmod.c +++ /dev/null @@ -1,1964 +0,0 @@ -/* Insert a module into a running kernel. - Copyright 1996, 1997 Linux International. - - New implementation contributed by Richard Henderson <rth@tamu.edu> - Based on original work by Bjorn Ekwall <bj0rn@blox.se> - Restructured (and partly rewritten) by: - Björn Ekwall <bj0rn@blox.se> February 1999 - - This file is part of the Linux modutils. - - 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 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, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - - /* - Fixes: - - Adjust module size for mod_use_count in old_init_module: - B. James Phillippe <bryan@terran.org> - - Merged modprobe + many fixes: Björn Ekwall <bj0rn@blox.se> February 1999 - SMP "friendliness" (and -P): Bill Zumach <zumach+@transarc.com> - - Ksymoops support: Keith Owens <kaos@ocs.com.au> August 1999. - - Add -r flag: Keith Owens <kaos@ocs.com.au> October 1999. - - More flexible recognition of the way the utility was called. - Suggested by Stepan Kasal, implemented in a different way by Keith - Owens <kaos@ocs.com.au> December 1999. - - Rationalize common code for 32/64 bit architectures. - Keith Owens <kaos@ocs.com.au> December 1999. - Add arch64(). - Keith Owens <kaos@ocs.com.au> December 1999. - kallsyms support - Keith Owens <kaos@ocs.com.au> April 2000. - archdata support - Keith Owens <kaos@ocs.com.au> August 2000. - Add insmod -O, move print map before sys_init_module. - Keith Owens <kaos@ocs.com.au> October 2000. - Add insmod -S. - Keith Owens <kaos@ocs.com.au> November 2000. - Add persistent data support. - Keith Owens <kaos@ocs.com.au> November 2000. - */ - -#ident "$Id$" - -#include "../insmod.h" -#include <sys/types.h> -#include <stdlib.h> -#include <unistd.h> -#include <string.h> -//#include <alloca.h> provided by stdlib -#include <limits.h> -#include <ctype.h> -#include <errno.h> -#include <stddef.h> -#include <getopt.h> -#include <sys/stat.h> -#include <sys/file.h> - -#include "module.h" -#include "obj.h" -#include "kallsyms.h" -#include "util.h" -#include "version.h" - -#include "modstat.h" -#include "config.h" - -#define STRVERSIONLEN 32 - -/*======================================================================*/ - -static int flag_force_load = 0; -static int flag_silent_probe = 0; -static int flag_export = 1; -static int flag_load_map = 0; -static int flag_ksymoops = 1; - -static int n_ext_modules_used; -static int m_has_modinfo; - -extern int insmod_main(int argc, char **argv); -extern int insmod_main_32(int argc, char **argv); -extern int insmod_main_64(int argc, char **argv); -extern int modprobe_main(int argc, char **argv); -extern int rmmod_main(int argc, char **argv); -extern int ksyms_main(int argc, char **argv); -extern int lsmod_main(int argc, char **argv); -extern int kallsyms_main(int argc, char **argv); - -/*======================================================================*/ - -/* Get the kernel version in the canonical integer form. */ - -static int get_kernel_version(char str[STRVERSIONLEN]) -{ - char *p, *q; - int a, b, c; - - strncpy(str, uts_info.release, STRVERSIONLEN); - p = uts_info.release; - - a = strtoul(p, &p, 10); - if (*p != '.') - return -1; - b = strtoul(p + 1, &p, 10); - if (*p != '.') - return -1; - c = strtoul(p + 1, &q, 10); - if (p + 1 == q) - return -1; - - return a << 16 | b << 8 | c; -} - -/* String comparison for non-co-versioned kernel and module. - * prefix should be the same as used by genksyms for this kernel. - */ -static char *ncv_prefix = NULL; /* Overridden by --prefix option */ -static int ncv_plen = 0; - -/* Only set prefix once. If set by the user, use it. If not set by the - * user, look for a well known kernel symbol and derive the prefix from - * there. Otherwise set the prefix depending on whether uts_info - * includes SMP or not for backwards compatibility. - */ -static void set_ncv_prefix(char *prefix) -{ - static char derived_prefix[256]; - static const char *well_known_symbol[] = { "get_module_symbol_R", - "inter_module_get_R", - }; - struct module_symbol *s; - int i, j, l, m, pl; - const char *name; - char *p; - - if (ncv_prefix) - return; - - if (prefix) - ncv_prefix = prefix; - else { - /* Extract the prefix (if any) from well known symbols */ - for (i = 0, s = ksyms; i < nksyms; ++i, ++s) { - name = (char *) s->name; - l = strlen(name); - for (j = 0; j < sizeof(well_known_symbol)/sizeof(well_known_symbol[0]); ++j) { - m = strlen(well_known_symbol[j]); - if (m + 8 > l || - strncmp(name, well_known_symbol[j], m)) - continue; - pl = l - m - 8; - if (pl > sizeof(derived_prefix)-1) - continue; /* Prefix is wrong length */ - /* Must end with 8 hex digits */ - (void) strtoul(name+l-8, &p, 16); - if (*p == 0) { - strncpy(derived_prefix, name+m, pl); - *(derived_prefix+pl) = '\0'; - ncv_prefix = derived_prefix; - break; - } - } - } - } - if (!ncv_prefix) { - p = strchr(uts_info.version, ' '); - if (p && *(++p) && !strncmp(p, "SMP ", 4)) - ncv_prefix = "smp_"; - else - ncv_prefix = ""; - } - ncv_plen = strlen(ncv_prefix); - if (flag_verbose) - lprintf("Symbol version prefix '%s'", ncv_prefix); -} - -static int ncv_strcmp(const char *a, const char *b) -{ - size_t alen = strlen(a), blen = strlen(b); - - if (blen == alen + 10 + ncv_plen && - b[alen] == '_' && - b[alen + 1] == 'R' && - !(ncv_plen && strncmp(b + alen + 2, ncv_prefix, ncv_plen))) { - return strncmp(a, b, alen); - } else if (alen == blen + 10 + ncv_plen && - a[blen] == '_' && a[blen + 1] == 'R' && - !(ncv_plen && strncmp(a + blen + 2, ncv_prefix, ncv_plen))) { - return strncmp(a, b, blen); - } else - return strcmp(a, b); -} - -/* - * String hashing for non-co-versioned kernel and module. - * Here we are simply forced to drop the crc from the hash. - */ -static unsigned long ncv_symbol_hash(const char *str) -{ - size_t len = strlen(str); - - if (len > 10 + ncv_plen && - str[len - 10 - ncv_plen] == '_' && - str[len - 9 - ncv_plen] == 'R' && - !( - ncv_plen && - strncmp(str + len - (8 + ncv_plen), ncv_prefix, ncv_plen) - )) - len -= 10 + ncv_plen; - return obj_elf_hash_n(str, len); -} - -/* - * Conditionally add the symbols from the given symbol set - * to the new module. - */ -static int add_symbols_from(struct obj_file *f, int idx, - struct module_symbol *syms, size_t nsyms) -{ - struct module_symbol *s; - size_t i; - int used = 0; - - for (i = 0, s = syms; i < nsyms; ++i, ++s) { - /* - * Only add symbols that are already marked external. - * If we override locals we may cause problems for - * argument initialization. - * We will also create a false dependency on the module. - */ - struct obj_symbol *sym; - - sym = obj_find_symbol(f, (char *) s->name); - if (sym && !ELFW(ST_BIND) (sym->info) == STB_LOCAL) { - sym = obj_add_symbol(f, (char *) s->name, -1, - ELFW(ST_INFO) (STB_GLOBAL, STT_NOTYPE), - idx, s->value, 0); - /* - * Did our symbol just get installed? - * If so, mark the module as "used". - */ - if (sym->secidx == idx) - used = 1; - } - } - - return used; -} - -static void add_kernel_symbols(struct obj_file *f) -{ - struct module_stat *m; - size_t i, nused = 0; - - /* Add module symbols first. */ - for (i = 0, m = module_stat; i < n_module_stat; ++i, ++m) - if (m->nsyms && - add_symbols_from(f, SHN_HIRESERVE + 2 + i, m->syms, m->nsyms)) - m->status = 1 /* used */, ++nused; - n_ext_modules_used = nused; - - /* And finally the symbols from the kernel proper. */ - if (nksyms) - add_symbols_from(f, SHN_HIRESERVE + 1, ksyms, nksyms); -} - -static void hide_special_symbols(struct obj_file *f) -{ - struct obj_symbol *sym; - const char *const *p; - static const char *const specials[] = - { - "cleanup_module", - "init_module", - "kernel_version", - NULL - }; - - for (p = specials; *p; ++p) - if ((sym = obj_find_symbol(f, *p)) != NULL) - sym->info = ELFW(ST_INFO) (STB_LOCAL, ELFW(ST_TYPE) (sym->info)); -} - -static void print_load_map(struct obj_file *f) -{ - struct obj_symbol *sym; - struct obj_symbol **all, **p; - struct obj_section *sec; - int load_map_cmp(const void *a, const void *b) { - struct obj_symbol **as = (struct obj_symbol **) a; - struct obj_symbol **bs = (struct obj_symbol **) b; - unsigned long aa = obj_symbol_final_value(f, *as); - unsigned long ba = obj_symbol_final_value(f, *bs); - return aa < ba ? -1 : aa > ba ? 1 : 0; - } - int i, nsyms, *loaded; - - /* Report on the section layout. */ - - lprintf("Sections: Size %-*s Align", - (int) (2 * sizeof(void *)), "Address"); - - for (sec = f->load_order; sec; sec = sec->load_next) { - int a; - unsigned long tmp; - - for (a = -1, tmp = sec->header.sh_addralign; tmp; ++a) - tmp >>= 1; - if (a == -1) - a = 0; - - lprintf("%-16s%08lx %0*lx 2**%d", - sec->name, - (long)sec->header.sh_size, - (int) (2 * sizeof(void *)), - (long)sec->header.sh_addr, - a); - } - - /* Quick reference which section indicies are loaded. */ - - loaded = alloca(sizeof(int) * (i = f->header.e_shnum)); - while (--i >= 0) - loaded[i] = (f->sections[i]->header.sh_flags & SHF_ALLOC) != 0; - - /* Collect the symbols we'll be listing. */ - - for (nsyms = i = 0; i < HASH_BUCKETS; ++i) - for (sym = f->symtab[i]; sym; sym = sym->next) - if (sym->secidx <= SHN_HIRESERVE - && (sym->secidx >= SHN_LORESERVE || loaded[sym->secidx])) - ++nsyms; - - all = alloca(nsyms * sizeof(struct obj_symbol *)); - - for (i = 0, p = all; i < HASH_BUCKETS; ++i) - for (sym = f->symtab[i]; sym; sym = sym->next) - if (sym->secidx <= SHN_HIRESERVE - && (sym->secidx >= SHN_LORESERVE || loaded[sym->secidx])) - *p++ = sym; - - /* Sort them by final value. */ - qsort(all, nsyms, sizeof(struct obj_file *), load_map_cmp); - - /* And list them. */ - lprintf("\nSymbols:"); - for (p = all; p < all + nsyms; ++p) { - char type = '?'; - unsigned long value; - - sym = *p; - if (sym->secidx == SHN_ABS) { - type = 'A'; - value = sym->value; - } else if (sym->secidx == SHN_UNDEF) { - type = 'U'; - value = 0; - } else { - struct obj_section *sec = f->sections[sym->secidx]; - - if (sec->header.sh_type == SHT_NOBITS) - type = 'B'; - else if (sec->header.sh_flags & SHF_ALLOC) { - if (sec->header.sh_flags & SHF_EXECINSTR) - type = 'T'; - else if (sec->header.sh_flags & SHF_WRITE) - type = 'D'; - else - type = 'R'; - } - value = sym->value + sec->header.sh_addr; - } - - if (ELFW(ST_BIND) (sym->info) == STB_LOCAL) - type = tolower(type); - - lprintf("%0*lx %c %s", (int) (2 * sizeof(void *)), value, - type, sym->name); - } -} - -/************************************************************************/ -/* begin compat */ - -static char * get_modinfo_value(struct obj_file *f, const char *key) -{ - struct obj_section *sec; - char *p, *v, *n, *ep; - size_t klen = strlen(key); - - sec = obj_find_section(f, ".modinfo"); - if (sec == NULL) - return NULL; - - p = sec->contents; - ep = p + sec->header.sh_size; - while (p < ep) { - v = strchr(p, '='); - n = strchr(p, '\0'); - if (v) { - if (v - p == klen && strncmp(p, key, klen) == 0) - return v + 1; - } else { - if (n - p == klen && strcmp(p, key) == 0) - return n; - } - p = n + 1; - } - - return NULL; -} - -static int create_this_module(struct obj_file *f, const char *m_name) -{ - struct obj_section *sec; - - sec = obj_create_alloced_section_first(f, ".this", tgt_sizeof_long, - sizeof(struct module)); - memset(sec->contents, 0, sizeof(struct module)); - - obj_add_symbol(f, "__this_module", -1, ELFW(ST_INFO) (STB_LOCAL, STT_OBJECT), - sec->idx, 0, sizeof(struct module)); - - obj_string_patch(f, sec->idx, offsetof(struct module, name), m_name); - - return 1; -} - -#ifdef COMPAT_2_0 -static int old_create_mod_use_count(struct obj_file *f) -{ - struct obj_section *sec; - struct obj_symbol *got; - - sec = obj_create_alloced_section_first(f, ".moduse", - sizeof(long), sizeof(long)); - - obj_add_symbol(f, "mod_use_count_", - -1, ELFW(ST_INFO)(STB_LOCAL, STT_OBJECT), - sec->idx, 0, sizeof(long)); - - /* - * patb: if there is a _GLOBAL_OFFSET_TABLE_, - * add .got section for PIC type modules; - * we have to do this here, because obj_* calls are not made until - * after obj_check_undefined - * is there a better place for this exception? - */ - got = obj_find_symbol(f, "_GLOBAL_OFFSET_TABLE_"); - if (got) -{ - sec = obj_create_alloced_section(f, ".got", - sizeof(long), sizeof(long)); - got->secidx = sec->idx; /* mark the symbol as defined */ - } - return 1; -} -#endif - -/* add an entry to the __ksymtab section, creating it if necessary */ -static void add_ksymtab(struct obj_file *f, struct obj_symbol *sym) -{ - struct obj_section *sec; - ElfW(Addr) ofs; - - /* ensure __ksymtab is allocated, EXPORT_NOSYMBOLS creates a non-alloc section. - * If __ksymtab is defined but not marked alloc, x out the first character - * (no obj_delete routine) and create a new __ksymtab with the correct - * characteristics. - */ - sec = obj_find_section(f, "__ksymtab"); - if (sec && !(sec->header.sh_flags & SHF_ALLOC)) { - *((char *)(sec->name)) = 'x'; /* override const */ - sec = NULL; - } - if (!sec) - sec = obj_create_alloced_section(f, "__ksymtab", tgt_sizeof_void_p, 0); - if (!sec) - return; - sec->header.sh_flags |= SHF_ALLOC; - - ofs = sec->header.sh_size; - obj_symbol_patch(f, sec->idx, ofs, sym); - obj_string_patch(f, sec->idx, ofs + tgt_sizeof_void_p, sym->name); - obj_extend_section(sec, 2 * tgt_sizeof_char_p); -} - -static int create_module_ksymtab(struct obj_file *f) -{ - struct obj_section *sec; - int i; - - /* We must always add the module references. */ - - if (n_ext_modules_used) { - struct module_ref *dep; - struct obj_symbol *tm; - - sec = obj_create_alloced_section(f, ".kmodtab", tgt_sizeof_void_p, - (sizeof(struct module_ref) - * n_ext_modules_used)); - if (!sec) - return 0; - - tm = obj_find_symbol(f, "__this_module"); - dep = (struct module_ref *) sec->contents; - for (i = 0; i < n_module_stat; ++i) - if (module_stat[i].status /* used */) { - dep->dep = module_stat[i].addr; - obj_symbol_patch(f, sec->idx, (char *) &dep->ref - sec->contents, tm); - dep->next_ref = 0; - ++dep; - } - } - if (flag_export && !obj_find_section(f, "__ksymtab")) { - int *loaded; - - /* We don't want to export symbols residing in sections that - aren't loaded. There are a number of these created so that - we make sure certain module options don't appear twice. */ - - loaded = alloca(sizeof(int) * (i = f->header.e_shnum)); - while (--i >= 0) - loaded[i] = (f->sections[i]->header.sh_flags & SHF_ALLOC) != 0; - - for (i = 0; i < HASH_BUCKETS; ++i) { - struct obj_symbol *sym; - for (sym = f->symtab[i]; sym; sym = sym->next) { - if (ELFW(ST_BIND) (sym->info) != STB_LOCAL - && sym->secidx <= SHN_HIRESERVE - && (sym->secidx >= SHN_LORESERVE - || loaded[sym->secidx])) { - add_ksymtab(f, sym); - } - } - } - } - return 1; -} - -/* Get the module's kernel version in the canonical integer form. */ -static int get_module_version(struct obj_file *f, char str[STRVERSIONLEN]) -{ - int a, b, c; - char *p, *q; - - if ((p = get_modinfo_value(f, "kernel_version")) == NULL) { - struct obj_symbol *sym; - - m_has_modinfo = 0; - if ((sym = obj_find_symbol(f, "kernel_version")) == NULL) - sym = obj_find_symbol(f, "__module_kernel_version"); - if (sym == NULL) - return -1; - p = f->sections[sym->secidx]->contents + sym->value; - } else - m_has_modinfo = 1; - - strncpy(str, p, STRVERSIONLEN); - - a = strtoul(p, &p, 10); - if (*p != '.') - return -1; - b = strtoul(p + 1, &p, 10); - if (*p != '.') - return -1; - c = strtoul(p + 1, &q, 10); - if (p + 1 == q) - return -1; - - return a << 16 | b << 8 | c; -} - -/* Return the kernel symbol checksum version, or zero if not used. */ -static int is_kernel_checksummed(void) -{ - struct module_symbol *s; - size_t i; - - /* - * Using_Versions might not be the first symbol, - * but it should be in there. - */ - for (i = 0, s = ksyms; i < nksyms; ++i, ++s) - if (strcmp((char *) s->name, "Using_Versions") == 0) - return s->value; - - return 0; -} - -static int is_module_checksummed(struct obj_file *f) -{ - if (m_has_modinfo) { - const char *p = get_modinfo_value(f, "using_checksums"); - if (p) - return atoi(p); - else - return 0; - } else - return obj_find_symbol(f, "Using_Versions") != NULL; -} - -/* add module source, timestamp, kernel version and a symbol for the - * start of some sections. this info is used by ksymoops to do better - * debugging. - */ -static void add_ksymoops_symbols(struct obj_file *f, const char *filename, - const char *m_name) -{ - struct obj_section *sec; - struct obj_symbol *sym; - char *name, *absolute_filename; - char str[STRVERSIONLEN], real[PATH_MAX]; - int i, l, lm_name, lfilename, use_ksymtab, version; - struct stat statbuf; - - static const char *section_names[] = { - ".text", - ".rodata", - ".data", - ".bss" - }; - - if (realpath(filename, real)) { - absolute_filename = xstrdup(real); - } - else { - int save_errno = errno; - error("cannot get realpath for %s", filename); - errno = save_errno; - absolute_filename = xstrdup(filename); - } - - lm_name = strlen(m_name); - lfilename = strlen(absolute_filename); - - /* add to ksymtab if it already exists or there is no ksymtab and other symbols - * are not to be exported. otherwise leave ksymtab alone for now, the - * "export all symbols" compatibility code will export these symbols later. - */ - - use_ksymtab = obj_find_section(f, "__ksymtab") || !flag_export; - - if ((sec = obj_find_section(f, ".this"))) { - /* tag the module header with the object name, last modified - * timestamp and module version. worst case for module version - * is 0xffffff, decimal 16777215. putting all three fields in - * one symbol is less readable but saves kernel space. - */ - l = sizeof(symprefix)+ /* "__insmod_" */ - lm_name+ /* module name */ - 2+ /* "_O" */ - lfilename+ /* object filename */ - 2+ /* "_M" */ - 2*sizeof(statbuf.st_mtime)+ /* mtime in hex */ - 2+ /* "_V" */ - 8+ /* version in dec */ - 1; /* nul */ - name = xmalloc(l); - if (stat(absolute_filename, &statbuf) != 0) - statbuf.st_mtime = 0; - version = get_module_version(f, str); /* -1 if not found */ - snprintf(name, l, "%s%s_O%s_M%0*lX_V%d", - symprefix, m_name, absolute_filename, - 2*sizeof(statbuf.st_mtime), statbuf.st_mtime, - version); - sym = obj_add_symbol(f, name, -1, - ELFW(ST_INFO) (STB_GLOBAL, STT_NOTYPE), - sec->idx, sec->header.sh_addr, 0); - if (use_ksymtab) - add_ksymtab(f, sym); - } - free(absolute_filename); - - /* record where the persistent data is going, same address as previous symbol */ - - if (f->persist) { - l = sizeof(symprefix)+ /* "__insmod_" */ - lm_name+ /* module name */ - 2+ /* "_P" */ - strlen(f->persist)+ /* data store */ - 1; /* nul */ - name = xmalloc(l); - snprintf(name, l, "%s%s_P%s", - symprefix, m_name, f->persist); - sym = obj_add_symbol(f, name, -1, ELFW(ST_INFO) (STB_GLOBAL, STT_NOTYPE), - sec->idx, sec->header.sh_addr, 0); - if (use_ksymtab) - add_ksymtab(f, sym); - } - - /* tag the desired sections if size is non-zero */ - - for (i = 0; i < sizeof(section_names)/sizeof(section_names[0]); ++i) { - if ((sec = obj_find_section(f, section_names[i])) && - sec->header.sh_size) { - l = sizeof(symprefix)+ /* "__insmod_" */ - lm_name+ /* module name */ - 2+ /* "_S" */ - strlen(sec->name)+ /* section name */ - 2+ /* "_L" */ - 8+ /* length in dec */ - 1; /* nul */ - name = xmalloc(l); - snprintf(name, l, "%s%s_S%s_L%ld", - symprefix, m_name, sec->name, - (long)sec->header.sh_size); - sym = obj_add_symbol(f, name, -1, ELFW(ST_INFO) (STB_GLOBAL, STT_NOTYPE), - sec->idx, sec->header.sh_addr, 0); - if (use_ksymtab) - add_ksymtab(f, sym); - } - } -} - -static int process_module_arguments(struct obj_file *f, int argc, char **argv, int required) -{ - for (; argc > 0; ++argv, --argc) { - struct obj_symbol *sym; - int c; - int min, max; - int n; - char *contents; - char *input; - char *fmt; - char *key; - char *loc; - - if ((input = strchr(*argv, '=')) == NULL) - continue; - - n = input - *argv; - input += 1; /* skip '=' */ - - key = alloca(n + 6); - - if (m_has_modinfo) { - memcpy(key, "parm_", 5); - memcpy(key + 5, *argv, n); - key[n + 5] = '\0'; - if ((fmt = get_modinfo_value(f, key)) == NULL) { - if (required) { - error("invalid parameter %s", key); - return 0; - } - else { - if (flag_verbose) - lprintf("ignoring %s", *argv); - continue; /* silently ignore optional parameters */ - } - } - key += 5; - - if (isdigit(*fmt)) { - min = strtoul(fmt, &fmt, 10); - if (*fmt == '-') - max = strtoul(fmt + 1, &fmt, 10); - else - max = min; - } else - min = max = 1; - } else { /* not m_has_modinfo */ - memcpy(key, *argv, n); - key[n] = '\0'; - - if (isdigit(*input)) - fmt = "i"; - else - fmt = "s"; - min = max = 0; - } - - sym = obj_find_symbol(f, key); - - /* - * Also check that the parameter was not - * resolved from the kernel. - */ - if (sym == NULL || sym->secidx > SHN_HIRESERVE) { - error("symbol for parameter %s not found", key); - return 0; - } - - contents = f->sections[sym->secidx]->contents; - loc = contents + sym->value; - n = 1; - - while (*input) { - char *str; - - switch (*fmt) { - case 's': - case 'c': - /* - * Do C quoting if we begin with a ", - * else slurp the lot. - */ - if (*input == '"') { - char *r; - - str = alloca(strlen(input)); - for (r = str, input++; *input != '"'; ++input, ++r) { - if (*input == '\0') { - error("improperly terminated string argument for %s", key); - return 0; - } - /* else */ - if (*input != '\\') { - *r = *input; - continue; - } - /* else handle \ */ - switch (*++input) { - case 'a': *r = '\a'; break; - case 'b': *r = '\b'; break; - case 'e': *r = '\033'; break; - case 'f': *r = '\f'; break; - case 'n': *r = '\n'; break; - case 'r': *r = '\r'; break; - case 't': *r = '\t'; break; - - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - c = *input - '0'; - if ('0' <= input[1] && input[1] <= '7') { - c = (c * 8) + *++input - '0'; - if ('0' <= input[1] && input[1] <= '7') - c = (c * 8) + *++input - '0'; - } - *r = c; - break; - - default: *r = *input; break; - } - } - *r = '\0'; - ++input; - } else { - /* - * The string is not quoted. - * We will break it using the comma - * (like for ints). - * If the user wants to include commas - * in a string, he just has to quote it - */ - char *r; - - /* Search the next comma */ - if ((r = strchr(input, ',')) != NULL) { - /* - * Found a comma - * Recopy the current field - */ - str = alloca(r - input + 1); - memcpy(str, input, r - input); - str[r - input] = '\0'; - /* Keep next fields */ - input = r; - } else { - /* last string */ - str = input; - input = ""; - } - } - - if (*fmt == 's') { - /* Normal string */ - obj_string_patch(f, sym->secidx, loc - contents, str); - loc += tgt_sizeof_char_p; - } else { - /* Array of chars (in fact, matrix !) */ - long charssize; /* size of each member */ - - /* Get the size of each member */ - /* Probably we should do that outside the loop ? */ - if (!isdigit(*(fmt + 1))) { - error("parameter type 'c' for %s must be followed by" - " the maximum size", key); - return 0; - } - charssize = strtoul(fmt + 1, (char **) NULL, 10); - - /* Check length */ - if (strlen(str) >= charssize-1) { - error("string too long for %s (max %ld)", - key, charssize - 1); - return 0; - } - /* Copy to location */ - strcpy((char *) loc, str); /* safe, see check above */ - loc += charssize; - } - /* - * End of 's' and 'c' - */ - break; - - case 'b': - *loc++ = strtoul(input, &input, 0); - break; - - case 'h': - *(short *) loc = strtoul(input, &input, 0); - loc += tgt_sizeof_short; - break; - - case 'i': - *(int *) loc = strtoul(input, &input, 0); - loc += tgt_sizeof_int; - break; - - case 'l': - *(long *) loc = strtoul(input, &input, 0); - loc += tgt_sizeof_long; - break; - - default: - error("unknown parameter type '%c' for %s", - *fmt, key); - return 0; - } - /* - * end of switch (*fmt) - */ - - while (*input && isspace(*input)) - ++input; - if (*input == '\0') - break; /* while (*input) */ - /* else */ - - if (*input == ',') { - if (max && (++n > max)) { - error("too many values for %s (max %d)", key, max); - return 0; - } - ++input; - /* continue with while (*input) */ - } else { - error("invalid argument syntax for %s: '%c'", - key, *input); - return 0; - } - } /* end of while (*input) */ - - if (min && (n < min)) { - error("too few values for %s (min %d)", key, min); - return 0; - } - } /* end of for (;argc > 0;) */ - - return 1; -} - - -/* Add a kallsyms section if the kernel supports all symbols. */ -static int add_kallsyms(struct obj_file *f, - struct obj_section **module_kallsyms, int force_kallsyms) -{ - struct module_symbol *s; - struct obj_file *f_kallsyms; - struct obj_section *sec_kallsyms; - size_t i; - int l; - const char *p, *pt_R; - unsigned long start = 0, stop = 0; - - for (i = 0, s = ksyms; i < nksyms; ++i, ++s) { - p = (char *)s->name; - pt_R = strstr(p, "_R"); - if (pt_R) - l = pt_R - p; - else - l = strlen(p); - if (strncmp(p, "__start_" KALLSYMS_SEC_NAME, l) == 0) - start = s->value; - else if (strncmp(p, "__stop_" KALLSYMS_SEC_NAME, l) == 0) - stop = s->value; - } - - if (start >= stop && !force_kallsyms) - return(0); - - /* The kernel contains all symbols, do the same for this module. */ - - /* Add an empty kallsyms section to the module if necessary */ - for (i = 0; i < f->header.e_shnum; ++i) { - if (strcmp(f->sections[i]->name, KALLSYMS_SEC_NAME) == 0) { - *module_kallsyms = f->sections[i]; - break; - } - } - if (!*module_kallsyms) - *module_kallsyms = obj_create_alloced_section(f, KALLSYMS_SEC_NAME, 0, 0); - - /* Size and populate kallsyms */ - if (obj_kallsyms(f, &f_kallsyms)) - return(1); - sec_kallsyms = f_kallsyms->sections[KALLSYMS_IDX]; - (*module_kallsyms)->header.sh_addralign = sec_kallsyms->header.sh_addralign; - (*module_kallsyms)->header.sh_size = sec_kallsyms->header.sh_size; - free((*module_kallsyms)->contents); - (*module_kallsyms)->contents = sec_kallsyms->contents; - sec_kallsyms->contents = NULL; - obj_free(f_kallsyms); - - return 0; -} - - -/* Add an arch data section if the arch wants it. */ -static int add_archdata(struct obj_file *f, - struct obj_section **sec) -{ - size_t i; - - *sec = NULL; - /* Add an empty archdata section to the module if necessary */ - for (i = 0; i < f->header.e_shnum; ++i) { - if (strcmp(f->sections[i]->name, ARCHDATA_SEC_NAME) == 0) { - *sec = f->sections[i]; - break; - } - } - if (!*sec) - *sec = obj_create_alloced_section(f, ARCHDATA_SEC_NAME, 16, 0); - - /* Size and populate archdata */ - if (arch_archdata(f, *sec)) - return(1); - return 0; -} - - -static int init_module(const char *m_name, struct obj_file *f, - unsigned long m_size, const char *blob_name, - unsigned int noload, unsigned int flag_load_map) -{ - struct module *module; - struct obj_section *sec; - void *image; - int ret = 0; - tgt_long m_addr; - - sec = obj_find_section(f, ".this"); - module = (struct module *) sec->contents; - m_addr = sec->header.sh_addr; - - module->size_of_struct = sizeof(*module); - module->size = m_size; - module->flags = flag_autoclean ? NEW_MOD_AUTOCLEAN : 0; - - sec = obj_find_section(f, "__ksymtab"); - if (sec && sec->header.sh_size) { - module->syms = sec->header.sh_addr; - module->nsyms = sec->header.sh_size / (2 * tgt_sizeof_char_p); - } - if (n_ext_modules_used) { - sec = obj_find_section(f, ".kmodtab"); - module->deps = sec->header.sh_addr; - module->ndeps = n_ext_modules_used; - } - module->init = obj_symbol_final_value(f, obj_find_symbol(f, "init_module")); - module->cleanup = obj_symbol_final_value(f, - obj_find_symbol(f, "cleanup_module")); - - sec = obj_find_section(f, "__ex_table"); - if (sec) { - module->ex_table_start = sec->header.sh_addr; - module->ex_table_end = sec->header.sh_addr + sec->header.sh_size; - } - sec = obj_find_section(f, ".text.init"); - if (sec) { - module->runsize = sec->header.sh_addr - m_addr; - } - sec = obj_find_section(f, ".data.init"); - if (sec) { - if (!module->runsize || - module->runsize > sec->header.sh_addr - m_addr) - module->runsize = sec->header.sh_addr - m_addr; - } - sec = obj_find_section(f, ARCHDATA_SEC_NAME); - if (sec && sec->header.sh_size) { - module->archdata_start = sec->header.sh_addr; - module->archdata_end = module->archdata_start + sec->header.sh_size; - } - sec = obj_find_section(f, KALLSYMS_SEC_NAME); - if (sec && sec->header.sh_size) { - module->kallsyms_start = sec->header.sh_addr; - module->kallsyms_end = module->kallsyms_start + sec->header.sh_size; - } - if (!arch_init_module(f, module)) - return 0; - - /* - * Whew! All of the initialization is complete. - * Collect the final module image and give it to the kernel. - */ - image = xmalloc(m_size); - obj_create_image(f, image); - - if (flag_load_map) - print_load_map(f); - - if (blob_name) { - int fd, l; - fd = open(blob_name, O_WRONLY|O_CREAT|O_TRUNC, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH); - if (fd < 0) { - error("open %s failed %m", blob_name); - ret = -1; - } - else { - if ((l = write(fd, image, m_size)) != m_size) { - error("write %s failed %m", blob_name); - ret = -1; - } - close(fd); - } - } - - if (ret == 0 && !noload) { - fflush(stdout); /* Flush any debugging output */ - ret = sys_init_module(m_name, (struct module *) image); - if (ret) { - error("init_module: %m"); - lprintf("Hint: insmod errors can be caused by incorrect module parameters, " - "including invalid IO or IRQ parameters"); - } - } - - free(image); - - return ret == 0; -} - -#ifdef COMPAT_2_0 -static int old_init_module(const char *m_name, struct obj_file *f, - unsigned long m_size) -{ - char *image; - struct old_mod_routines routines; - struct old_symbol_table *symtab; - int ret; - int nsyms = 0, strsize = 0, total; - - /* Create the symbol table */ - /* Size things first... */ - if (flag_export) { - int i; - for (i = 0; i < HASH_BUCKETS; ++i) { - struct obj_symbol *sym; - - for (sym = f->symtab[i]; sym; sym = sym->next) - if (ELFW(ST_BIND) (sym->info) != STB_LOCAL && - sym->secidx <= SHN_HIRESERVE) { - sym->ksymidx = nsyms++; - strsize += strlen(sym->name) + 1; - } - } - } - total = (sizeof(struct old_symbol_table) + - nsyms * sizeof(struct old_module_symbol) + - n_ext_modules_used * sizeof(struct old_module_ref) + - strsize); - symtab = xmalloc(total); - symtab->size = total; - symtab->n_symbols = nsyms; - symtab->n_refs = n_ext_modules_used; - - if (flag_export && nsyms) { - struct old_module_symbol *ksym; - char *str; - int i; - - ksym = symtab->symbol; - str = ((char *) ksym + - nsyms * sizeof(struct old_module_symbol) + - n_ext_modules_used * sizeof(struct old_module_ref)); - - for (i = 0; i < HASH_BUCKETS; ++i) { - struct obj_symbol *sym; - for (sym = f->symtab[i]; sym; sym = sym->next) - if (sym->ksymidx >= 0) { - ksym->addr = obj_symbol_final_value(f, sym); - ksym->name = (unsigned long) str - (unsigned long) symtab; - - str = stpcpy(str, sym->name) + 1; - ksym++; - } - } - } - - if (n_ext_modules_used) { - struct old_module_ref *ref; - int i; - - ref = (struct old_module_ref *) - ((char *) symtab->symbol + nsyms * sizeof(struct old_module_symbol)); - - for (i = 0; i < n_module_stat; ++i) { - if (module_stat[i].status /* used */) { - ref++->module = module_stat[i].modstruct; - } - } - } - - /* Fill in routines. */ - - routines.init = obj_symbol_final_value(f, obj_find_symbol(f, "init_module")); - routines.cleanup = obj_symbol_final_value(f, - obj_find_symbol(f, "cleanup_module")); - - /* - * Whew! All of the initialization is complete. - * Collect the final module image and give it to the kernel. - */ - image = xmalloc(m_size); - obj_create_image(f, image); - - /* - * image holds the complete relocated module, - * accounting correctly for mod_use_count. - * However the old module kernel support assume that it - * is receiving something which does not contain mod_use_count. - */ - ret = old_sys_init_module(m_name, image + sizeof(long), - (m_size - sizeof(long)) | - (flag_autoclean ? OLD_MOD_AUTOCLEAN : 0), - &routines, - symtab); - if (ret) - error("init_module: %m"); - - free(image); - free(symtab); - - return ret == 0; -} -#endif -/* end compat */ -/************************************************************************/ - -/* Check that a module parameter has a reasonable definition */ -static int check_module_parameter(struct obj_file *f, char *key, char *value, int *persist_flag) -{ - struct obj_symbol *sym; - int min, max; - char *p = value; - - sym = obj_find_symbol(f, key); - if (sym == NULL) { - /* FIXME: For 2.2 kernel compatibility, only issue warnings for - * most error conditions. Make these all errors in 2.5. - */ - lprintf("Warning: %s symbol for parameter %s not found", error_file, key); - return(1); - } - - if (isdigit(*p)) { - min = strtoul(p, &p, 10); - if (*p == '-') - max = strtoul(p + 1, &p, 10); - else - max = min; - } else - min = max = 1; - - if (max < min) { - lprintf("Warning: %s parameter %s has max < min!", error_file, key); - return(1); - } - - switch (*p) { - case 'c': - if (!isdigit(p[1])) { - lprintf("%s parameter %s has no size after 'c'!", error_file, key); - return(1); - } - while (isdigit(p[1])) - ++p; /* swallow c array size */ - break; - case 'b': /* drop through */ - case 'h': /* drop through */ - case 'i': /* drop through */ - case 'l': /* drop through */ - case 's': - break; - case '\0': - lprintf("%s parameter %s has no format character!", error_file, key); - return(1); - default: - lprintf("%s parameter %s has unknown format character '%c'", error_file, key, *p); - return(1); - } - switch (*++p) { - case 'p': - if (*(p-1) == 's') { - error("parameter %s is invalid persistent string", key); - return(1); - } - *persist_flag = 1; - break; - case '\0': - break; - default: - lprintf("%s parameter %s has unknown format modifier '%c'", error_file, key, *p); - return(1); - } - return(0); -} - -/* Check that all module parameters have reasonable definitions */ -static void check_module_parameters(struct obj_file *f, int *persist_flag) -{ - struct obj_section *sec; - char *ptr, *value, *n, *endptr; - int namelen, err = 0; - - sec = obj_find_section(f, ".modinfo"); - if (sec == NULL) { - /* module does not support typed parameters */ - return; - } - - ptr = sec->contents; - endptr = ptr + sec->header.sh_size; - while (ptr < endptr && !err) { - value = strchr(ptr, '='); - n = strchr(ptr, '\0'); - if (value) { - namelen = value - ptr; - if (namelen >= 5 && strncmp(ptr, "parm_", 5) == 0 - && !(namelen > 10 && strncmp(ptr, "parm_desc_", 10) == 0)) { - char *pname = xmalloc(namelen + 1); - strncpy(pname, ptr + 5, namelen - 5); - pname[namelen - 5] = '\0'; - err = check_module_parameter(f, pname, value+1, persist_flag); - free(pname); - } - } else { - if (n - ptr >= 5 && strncmp(ptr, "parm_", 5) == 0) { - error("parameter %s found with no value", ptr); - err = 1; - } - } - ptr = n + 1; - } - - if (err) - *persist_flag = 0; - return; -} - - -/* For common 3264 code, only compile the usage message once, in the 64 bit version */ -#if defined(COMMON_3264) && defined(ONLY_32) -extern void insmod_usage(void); /* Use the copy in the 64 bit version */ -#else /* Common 64 bit version or any non common code - compile usage routine */ -void insmod_usage(void) -{ - fputs("Usage:\n" - "insmod [-fhkLmnpqrsSvVxXyY] [-e persist_name] [-o module_name] [-O blob_name] [-P prefix] module [ symbol=value ... ]\n" - "\n" - " module Name of a loadable kernel module ('.o' can be omitted)\n" - " -f, --force Force loading under wrong kernel version\n" - " -h, --help Print this message\n" - " -k, --autoclean Make module autoclean-able\n" - " -L, --lock Prevent simultaneous loads of the same module\n" - " -m, --map Generate load map (so crashes can be traced)\n" - " -n, --noload Don't load, just show\n" - " -p, --probe Probe mode; check if the module matches the kernel\n" - " -q, --quiet Don't print unresolved symbols\n" - " -r, --root Allow root to load modules not owned by root\n" - " -s, --syslog Report errors via syslog\n" - " -S, --kallsyms Force kallsyms on module\n" - " -v, --verbose Verbose output\n" - " -V, --version Show version\n" - " -x, --noexport Do not export externs\n" - " -X, --export Do export externs (default)\n" - " -y, --noksymoops Do not add ksymoops symbols\n" - " -Y, --ksymoops Do add ksymoops symbols (default)\n" - " -e persist_name\n" - " --persist=persist_name Filename to hold any persistent data from the module\n" - " -o NAME, --name=NAME Set internal module name to NAME\n" - " -O NAME, --blob=NAME Save the object as a binary blob in NAME\n" - " -P PREFIX\n" - " --prefix=PREFIX Prefix for kernel or module symbols\n" - ,stderr); - exit(1); -} -#endif /* defined(COMMON_3264) && defined(ONLY_32) */ - -#if defined(COMMON_3264) && defined(ONLY_32) -#define INSMOD_MAIN insmod_main_32 /* 32 bit version */ -#elif defined(COMMON_3264) && defined(ONLY_64) -#define INSMOD_MAIN insmod_main_64 /* 64 bit version */ -#else -#define INSMOD_MAIN insmod_main /* Not common code */ -#endif - -int INSMOD_MAIN(int argc, char **argv) -{ - int k_version; - int k_crcs; - char k_strversion[STRVERSIONLEN]; - struct option long_opts[] = { - {"force", 0, 0, 'f'}, - {"help", 0, 0, 'h'}, - {"autoclean", 0, 0, 'k'}, - {"lock", 0, 0, 'L'}, - {"map", 0, 0, 'm'}, - {"noload", 0, 0, 'n'}, - {"probe", 0, 0, 'p'}, - {"poll", 0, 0, 'p'}, /* poll is deprecated, remove in 2.5 */ - {"quiet", 0, 0, 'q'}, - {"root", 0, 0, 'r'}, - {"syslog", 0, 0, 's'}, - {"kallsyms", 0, 0, 'S'}, - {"verbose", 0, 0, 'v'}, - {"version", 0, 0, 'V'}, - {"noexport", 0, 0, 'x'}, - {"export", 0, 0, 'X'}, - {"noksymoops", 0, 0, 'y'}, - {"ksymoops", 0, 0, 'Y'}, - - {"persist", 1, 0, 'e'}, - {"name", 1, 0, 'o'}, - {"blob", 1, 0, 'O'}, - {"prefix", 1, 0, 'P'}, - {0, 0, 0, 0} - }; - char *m_name = NULL; - char *blob_name = NULL; /* Save object as binary blob */ - int m_version; - ElfW(Addr) m_addr; - unsigned long m_size; - int m_crcs; - char m_strversion[STRVERSIONLEN]; - char *filename; - char *persist_name = NULL; /* filename to hold any persistent data */ - int fp; - struct obj_file *f; - struct obj_section *kallsyms = NULL, *archdata = NULL; - int o; - int noload = 0; - int dolock = 1; /*Note: was: 0; */ - int quiet = 0; - int exit_status = 1; - int force_kallsyms = 0; - int persist_parms = 0; /* does module have persistent parms? */ - int i; - - error_file = "insmod"; - - /* To handle repeated calls from combined modprobe */ - errors = optind = 0; - - /* Process the command line. */ - while ((o = getopt_long(argc, argv, "fhkLmnpqrsSvVxXyYe:o:O:P:R:", - &long_opts[0], NULL)) != EOF) - switch (o) { - case 'f': /* force loading */ - flag_force_load = 1; - break; - case 'h': /* Print the usage message. */ - insmod_usage(); - break; - case 'k': /* module loaded by kerneld, auto-cleanable */ - flag_autoclean = 1; - break; - case 'L': /* protect against recursion. */ - dolock = 1; - break; - case 'm': /* generate load map */ - flag_load_map = 1; - break; - case 'n': /* don't load, just check */ - noload = 1; - break; - case 'p': /* silent probe mode */ - flag_silent_probe = 1; - break; - case 'q': /* Don't print unresolved symbols */ - quiet = 1; - break; - case 'r': /* allow root to load non-root modules */ - root_check_off = !root_check_off; - break; - case 's': /* start syslog */ - setsyslog("insmod"); - break; - case 'S': /* Force kallsyms */ - force_kallsyms = 1; - break; - case 'v': /* verbose output */ - flag_verbose = 1; - break; - case 'V': - fputs("insmod version " MODUTILS_VERSION "\n", stderr); - break; - case 'x': /* do not export externs */ - flag_export = 0; - break; - case 'X': /* do export externs */ - flag_export = 1; - break; - case 'y': /* do not define ksymoops symbols */ - flag_ksymoops = 0; - break; - case 'Y': /* do define ksymoops symbols */ - flag_ksymoops = 1; - break; - - case 'e': /* persistent data filename */ - free(persist_name); - persist_name = xstrdup(optarg); - break; - case 'o': /* name the output module */ - m_name = optarg; - break; - case 'O': /* save the output module object */ - blob_name = optarg; - break; - case 'P': /* use prefix on crc */ - set_ncv_prefix(optarg); - break; - - default: - insmod_usage(); - break; - } - - if (optind >= argc) { - insmod_usage(); - } - filename = argv[optind++]; - - if (config_read(0, NULL, "", NULL) < 0) { - error("Failed handle configuration"); - } - - if (persist_name && !*persist_name && - (!persistdir || !*persistdir)) { - free(persist_name); - persist_name = NULL; - if (flag_verbose) - lprintf("insmod: -e \"\" ignored, no persistdir"); - } - - if (m_name == NULL) { - size_t len; - char *p; - - if ((p = strrchr(filename, '/')) != NULL) - p++; - else - p = filename; - len = strlen(p); - if (len > 2 && p[len - 2] == '.' && p[len - 1] == 'o') - len -= 2; - else if (len > 4 && p[len - 4] == '.' && p[len - 3] == 'm' - && p[len - 2] == 'o' && p[len - 1] == 'd') - len -= 4; -#ifdef CONFIG_USE_ZLIB - else if (len > 5 && !strcmp(p + len - 5, ".o.gz")) - len -= 5; -#endif - - m_name = xmalloc(len + 1); - memcpy(m_name, p, len); - m_name[len] = '\0'; - } - - /* Locate the file to be loaded. */ - if (!strchr(filename, '/') && !strchr(filename, '.')) { - char *tmp = search_module_path(filename); - if (tmp == NULL) { - error("%s: no module by that name found", filename); - return 1; - } - filename = tmp; - lprintf("Using %s", filename); - } else if (flag_verbose) - lprintf("Using %s", filename); - - /* And open it. */ - if ((fp = gzf_open(filename, O_RDONLY)) == -1) { - error("%s: %m", filename); - return 1; - } - /* Try to prevent multiple simultaneous loads. */ - if (dolock) - flock(fp, LOCK_EX); - - if (!get_kernel_info(K_SYMBOLS)) - goto out; - - /* - * Set the genksyms prefix if this is a versioned kernel - * and it's not already set. - */ - set_ncv_prefix(NULL); - - for (i = 0; i < n_module_stat; ++i) { - if (strcmp(module_stat[i].name, m_name) == 0) { - error("a module named %s already exists", m_name); - goto out; - } - } - - error_file = filename; - if ((f = obj_load(fp, ET_REL, filename)) == NULL) - goto out; - - /* Version correspondence? */ - k_version = get_kernel_version(k_strversion); - m_version = get_module_version(f, m_strversion); - if (m_version == -1) { - error("couldn't find the kernel version the module was compiled for"); - goto out; - } - - k_crcs = is_kernel_checksummed(); - m_crcs = is_module_checksummed(f); - if ((m_crcs == 0 || k_crcs == 0) && - strncmp(k_strversion, m_strversion, STRVERSIONLEN) != 0) { - if (flag_force_load) { - lprintf("Warning: kernel-module version mismatch\n" - "\t%s was compiled for kernel version %s\n" - "\twhile this kernel is version %s", - filename, m_strversion, k_strversion); - } else { - if (!quiet) - error("kernel-module version mismatch\n" - "\t%s was compiled for kernel version %s\n" - "\twhile this kernel is version %s.", - filename, m_strversion, k_strversion); - goto out; - } - } - if (m_crcs != k_crcs) - obj_set_symbol_compare(f, ncv_strcmp, ncv_symbol_hash); - - /* Let the module know about the kernel symbols. */ - add_kernel_symbols(f); - - /* Allocate common symbols, symbol tables, and string tables. - * - * The calls marked DEPMOD indicate the bits of code that depmod - * uses to do a pseudo relocation, ignoring undefined symbols. - * Any changes made to the relocation sequence here should be - * checked against depmod. - */ -#ifdef COMPAT_2_0 - if (k_new_syscalls - ? !create_this_module(f, m_name) - : !old_create_mod_use_count(f)) - goto out; -#else - if (!create_this_module(f, m_name)) - goto out; -#endif - - if (!obj_check_undefineds(f, quiet)) /* DEPMOD, obj_clear_undefineds */ - goto out; - obj_allocate_commons(f); /* DEPMOD */ - - check_module_parameters(f, &persist_parms); - - if (optind < argc) { - if (!process_module_arguments(f, argc - optind, argv + optind, 1)) - goto out; - } - arch_create_got(f); /* DEPMOD */ - hide_special_symbols(f); - - if (persist_parms && persist_name && *persist_name) { - f->persist = persist_name; - persist_name = NULL; - } - - if (persist_parms && - persist_name && !*persist_name) { - /* -e "". This is ugly. Take the filename, compare it against - * each of the module paths until we find a match on the start - * of the filename, assume the rest is the relative path. Have - * to do it this way because modprobe uses absolute filenames - * for module names in modules.dep and the format of modules.dep - * does not allow for any backwards compatible changes, so there - * is nowhere to store the relative filename. The only way this - * should fail to calculate a relative path is "insmod ./xxx", for - * that case the user has to specify -e filename. - */ - int j, l = strlen(filename); - char *relative = NULL; - char *p; - for (i = 0; i < nmodpath; ++i) { - p = modpath[i].path; - j = strlen(p); - while (j && p[j] == '/') - --j; - if (j < l && strncmp(filename, p, j) == 0 && filename[j] == '/') { - while (filename[j] == '/') - ++j; - relative = xstrdup(filename+j); - break; - } - } - if (relative) { - i = strlen(relative); - if (i > 3 && strcmp(relative+i-3, ".gz") == 0) - relative[i -= 3] = '\0'; - if (i > 2 && strcmp(relative+i-2, ".o") == 0) - relative[i -= 2] = '\0'; - else if (i > 4 && strcmp(relative+i-4, ".mod") == 0) - relative[i -= 4] = '\0'; - f->persist = xmalloc(strlen(persistdir) + 1 + i + 1); - strcpy(f->persist, persistdir); /* safe, xmalloc */ - strcat(f->persist, "/"); /* safe, xmalloc */ - strcat(f->persist, relative); /* safe, xmalloc */ - free(relative); - } - else - error("Cannot calculate persistent filename"); - } - - if (f->persist && *(f->persist) != '/') { - error("Persistent filenames must be absolute, ignoring '%s'", - f->persist); - free(f->persist); - f->persist = NULL; - } - - if (f->persist && !flag_ksymoops) { - error("has persistent data but ksymoops symbols are not available"); - free(f->persist); - f->persist = NULL; - } - - if (f->persist && !k_new_syscalls) { - error("has persistent data but the kernel is too old to support it"); - free(f->persist); - f->persist = NULL; - } - - if (persist_parms && flag_verbose) { - if (f->persist) - lprintf("Persist filename '%s'", f->persist); - else - lprintf("No persistent filename available"); - } - - if (f->persist) { - FILE *fp = fopen(f->persist, "r"); - if (!fp) { - if (flag_verbose) - lprintf("Cannot open persist file '%s' %m", f->persist); - } - else { - int pargc = 0; - char *pargv[1000]; /* hard coded but big enough */ - char line[3000]; /* hard coded but big enough */ - char *p; - while (fgets(line, sizeof(line), fp)) { - p = strchr(line, '\n'); - if (!p) { - error("Persistent data line is too long\n%s", line); - break; - } - *p = '\0'; - p = line; - while (isspace(*p)) - ++p; - if (!*p || *p == '#') - continue; - if (pargc == sizeof(pargv)/sizeof(pargv[0])) { - error("More than %d persistent parameters", pargc); - break; - } - pargv[pargc++] = xstrdup(p); - } - fclose(fp); - if (!process_module_arguments(f, pargc, pargv, 0)) - goto out; - while (pargc--) - free(pargv[pargc]); - } - } - - if (flag_ksymoops) - add_ksymoops_symbols(f, filename, m_name); - - if (k_new_syscalls) - create_module_ksymtab(f); - - /* archdata based on relocatable addresses */ - if (add_archdata(f, &archdata)) - goto out; - - /* kallsyms based on relocatable addresses */ - if (add_kallsyms(f, &kallsyms, force_kallsyms)) - goto out; - /**** No symbols or sections to be changed after kallsyms above ***/ - - if (errors) - goto out; - - /* If we were just checking, we made it. */ - if (flag_silent_probe) { - exit_status = 0; - goto out; - } - /* Module has now finished growing; find its size and install it. */ - m_size = obj_load_size(f); /* DEPMOD */ - - if (noload) { - /* Don't bother actually touching the kernel. */ - m_addr = 0x12340000; - } else { - errno = 0; - m_addr = create_module(m_name, m_size); - switch (errno) { - case 0: - break; - case EEXIST: - if (dolock) { - /* - * Assume that we were just invoked - * simultaneous with another insmod - * and return success. - */ - exit_status = 0; - goto out; - } - error("a module named %s already exists", m_name); - goto out; - case ENOMEM: - error("can't allocate kernel memory for module; needed %lu bytes", - m_size); - goto out; - default: - error("create_module: %m"); - goto out; - } - } - - /* module is already built, complete with ksymoops symbols for the - * persistent filename. If the kernel does not support persistent data - * then give an error but continue. It is too difficult to clean up at - * this stage and this error will only occur on backported modules. - * rmmod will also get an error so warn the user now. - */ - if (f->persist && !noload) { - struct { - struct module m; - int data; - } test_read; - memset(&test_read, 0, sizeof(test_read)); - test_read.m.size_of_struct = -sizeof(test_read.m); /* -ve size => read, not write */ - test_read.m.read_start = m_addr + sizeof(struct module); - test_read.m.read_end = test_read.m.read_start + sizeof(test_read.data); - if (sys_init_module(m_name, (struct module *) &test_read)) { - int old_errors = errors; - error("has persistent data but the kernel is too old to support it." - " Expect errors during rmmod as well"); - errors = old_errors; - } - } - - if (!obj_relocate(f, m_addr)) { /* DEPMOD */ - if (!noload) - delete_module(m_name); - goto out; - } - - /* Do archdata again, this time we have the final addresses */ - if (add_archdata(f, &archdata)) - goto out; - - /* Do kallsyms again, this time we have the final addresses */ - if (add_kallsyms(f, &kallsyms, force_kallsyms)) - goto out; - -#ifdef COMPAT_2_0 - if (k_new_syscalls) - init_module(m_name, f, m_size, blob_name, noload, flag_load_map); - else if (!noload) - old_init_module(m_name, f, m_size); -#else - init_module(m_name, f, m_size, blob_name, noload, flag_load_map); -#endif - if (errors) { - if (!noload) - delete_module(m_name); - goto out; - } - exit_status = 0; - - out: - if (dolock) - flock(fp, LOCK_UN); - close(fp); - if (!noload) - snap_shot(NULL, 0); - - return exit_status; -} - -/* For common 3264 code, add an overall insmod_main, in the 64 bit version. */ -#if defined(COMMON_3264) && defined(ONLY_64) -int insmod_main(int argc, char **argv) -{ - if (arch64()) - return insmod_main_64(argc, argv); - else - return insmod_main_32(argc, argv); -} -#endif /* defined(COMMON_3264) && defined(ONLY_64) */ - - - -int insmod_call(char * full_filename, char * params) -{ - int argc = 2; - char *argv[50]; - char * ptr = params; - argv[0] = "stage1"; - argv[1] = full_filename; - - while (ptr != NULL) { - argv[argc] = ptr; - argc++; - ptr = strchr(ptr, ' '); - if (ptr) { - ptr[0] = '\0'; - ptr++; - } - } - - return insmod_main(argc, argv); -} diff --git a/mdk-stage1/insmod-modutils/obj/Makefile b/mdk-stage1/insmod-modutils/obj/Makefile deleted file mode 100644 index 9bcf8bac8..000000000 --- a/mdk-stage1/insmod-modutils/obj/Makefile +++ /dev/null @@ -1,31 +0,0 @@ - #****************************************************************************** - # - # insmod from modutils (generic) - # - # $Id$ - # - # Copyright 1996, 1997 Linux International. - # - #***************************************************************************** - -top_dir = ../.. - -include $(top_dir)/Makefile.common - - -all: libobj.a - -clean: - rm -f *.o *.a - - -FLAGS = -c -Wall -Os -fomit-frame-pointer -I./../include -D_GNU_SOURCE -DELF_MACHINE_H='"elf_$(ARCH).h"' -DARCH_$(ARCH) -DCONFIG_ROOT_CHECK_OFF=0 - -OBJS = obj_kallsyms.o obj_common.o obj_load.o obj_reloc.o obj_$(ARCH).o - -libobj.a: $(OBJS) - ar cru $@ $^ - ranlib $@ - -.c.o: - gcc $(FLAGS) $(GLIBC_INCLUDES) -c $< diff --git a/mdk-stage1/insmod-modutils/obj/obj_alpha.c b/mdk-stage1/insmod-modutils/obj/obj_alpha.c deleted file mode 100644 index 4006b3442..000000000 --- a/mdk-stage1/insmod-modutils/obj/obj_alpha.c +++ /dev/null @@ -1,305 +0,0 @@ -/* Alpha specific support for Elf loading and relocation. - Copyright 1996, 1997 Linux International. - - Contributed by Richard Henderson <rth@tamu.edu> - - This file is part of the Linux modutils. - - 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 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, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ident "$Id$" - -#include <string.h> -#include <assert.h> - -#include <module.h> -#include <obj.h> -#include <util.h> - -/*======================================================================*/ - -struct alpha_got_entry -{ - struct alpha_got_entry *next; - ElfW(Addr) addend; - int offset; - int reloc_done; -}; - -struct alpha_file -{ - struct obj_file root; - struct obj_section *got; -}; - -struct alpha_symbol -{ - struct obj_symbol root; - struct alpha_got_entry *got_entries; -}; - - -/*======================================================================*/ - -struct obj_file * -arch_new_file (void) -{ - struct alpha_file *f; - f = xmalloc(sizeof(*f)); - f->got = NULL; - return &f->root; -} - -struct obj_section * -arch_new_section (void) -{ - return xmalloc(sizeof(struct obj_section)); -} - -struct obj_symbol * -arch_new_symbol (void) -{ - struct alpha_symbol *sym; - sym = xmalloc(sizeof(*sym)); - sym->got_entries = NULL; - return &sym->root; -} - -int -arch_load_proc_section(struct obj_section *sec, int fp) -{ - /* Assume it's just a debugging section that we can safely - ignore ... */ - sec->contents = NULL; - - return 0; -} - -enum obj_reloc -arch_apply_relocation (struct obj_file *f, - struct obj_section *targsec, - struct obj_section *symsec, - struct obj_symbol *sym, - Elf64_Rela *rel, - Elf64_Addr v) -{ - struct alpha_file *af = (struct alpha_file *)f; - struct alpha_symbol *asym = (struct alpha_symbol *)sym; - - unsigned long *lloc = (unsigned long *)(targsec->contents + rel->r_offset); - unsigned int *iloc = (unsigned int *)lloc; - Elf64_Addr dot = targsec->header.sh_addr + rel->r_offset; - Elf64_Addr gp = af->got->header.sh_addr + 0x8000; - - enum obj_reloc ret = obj_reloc_ok; - - switch (ELF64_R_TYPE(rel->r_info)) - { - case R_ALPHA_NONE: - case R_ALPHA_LITUSE: - break; - - case R_ALPHA_REFQUAD: - *lloc += v; - break; - - case R_ALPHA_GPREL32: - v -= gp; - if ((Elf64_Sxword)v > 0x7fffffff - || (Elf64_Sxword)v < -(Elf64_Sxword)0x80000000) - ret = obj_reloc_overflow; - *iloc = v; - break; - - case R_ALPHA_LITERAL: - { - struct alpha_got_entry *gotent; - - assert(asym != NULL); - gotent = asym->got_entries; - while (gotent->addend != rel->r_addend) - gotent = gotent->next; - - if (!gotent->reloc_done) - { - *(unsigned long *)(af->got->contents + gotent->offset) = v; - gotent->reloc_done = 1; - } - - *iloc = (*iloc & ~0xffff) | ((gotent->offset - 0x8000) & 0xffff); - } - break; - - case R_ALPHA_GPDISP: - { - unsigned int *p_ldah, *p_lda; - unsigned int i_ldah, i_lda, hi, lo; - - p_ldah = iloc; - p_lda = (unsigned int *)((char *)iloc + rel->r_addend); - i_ldah = *p_ldah; - i_lda = *p_lda; - - /* Make sure the instructions are righteous. */ - if ((i_ldah >> 26) != 9 || (i_lda >> 26) != 8) - ret = obj_reloc_dangerous; - - /* Extract the existing addend. */ - v = (i_ldah & 0xffff) << 16 | (i_lda & 0xffff); - v = (v ^ 0x80008000) - 0x80008000; - - v += gp - dot; - - if ((Elf64_Sxword)v >= 0x7fff8000 - || (Elf64_Sxword)v < -(Elf64_Sxword)0x80000000) - ret = obj_reloc_overflow; - - /* Modify the instructions and finish up. */ - lo = v & 0xffff; - hi = ((v >> 16) + ((v >> 15) & 1)) & 0xffff; - - *p_ldah = (i_ldah & 0xffff0000) | hi; - *p_lda = (i_lda & 0xffff0000) | lo; - } - break; - - case R_ALPHA_BRADDR: - v -= dot + 4; - if (v % 4) - ret = obj_reloc_dangerous; - else if ((Elf64_Sxword)v > 0x3fffff - || (Elf64_Sxword)v < -(Elf64_Sxword)0x400000) - ret = obj_reloc_overflow; - v /= 4; - - *iloc = (*iloc & ~0x1fffff) | (v & 0x1fffff); - break; - - case R_ALPHA_HINT: - v -= dot + 4; - if (v % 4) - ret = obj_reloc_dangerous; - v /= 4; - - *iloc = (*iloc & ~0x3fff) | (v & 0x3fff); - break; - - default: - ret = obj_reloc_unhandled; - break; - } - - return ret; -} - -int -arch_create_got (struct obj_file *f) -{ - struct alpha_file *af = (struct alpha_file *)f; - int i, n, offset = 0; - - n = af->root.header.e_shnum; - for (i = 0; i < n; ++i) - { - struct obj_section *relsec, *symsec, *strsec; - Elf64_Rela *rel, *relend; - Elf64_Sym *symtab; - const char *strtab; - - relsec = af->root.sections[i]; - if (relsec->header.sh_type != SHT_RELA) - continue; - - symsec = af->root.sections[relsec->header.sh_link]; - strsec = af->root.sections[symsec->header.sh_link]; - - rel = (Elf64_Rela *)relsec->contents; - relend = rel + (relsec->header.sh_size / sizeof(Elf64_Rela)); - symtab = (Elf64_Sym *)symsec->contents; - strtab = (const char *)strsec->contents; - - for (; rel < relend; ++rel) - { - struct alpha_got_entry *ent; - Elf64_Sym *extsym; - struct alpha_symbol *intsym; - const char *name; - - if (ELF64_R_TYPE(rel->r_info) != R_ALPHA_LITERAL) - continue; - - extsym = &symtab[ELF64_R_SYM(rel->r_info)]; - if (extsym->st_name) - name = strtab + extsym->st_name; - else - name = f->sections[extsym->st_shndx]->name; - intsym = (struct alpha_symbol *)obj_find_symbol(&af->root, name); - - for (ent = intsym->got_entries; ent ; ent = ent->next) - if (ent->addend == rel->r_addend) - goto found; - - ent = xmalloc(sizeof(*ent)); - ent->addend = rel->r_addend; - ent->offset = offset; - ent->reloc_done = 0; - ent->next = intsym->got_entries; - intsym->got_entries = ent; - offset += 8; - - found:; - } - } - - if (offset > 0x10000) - { - error(".got section overflow: %#x > 0x10000", offset); - return 0; - } - - /* We always want a .got section so that we always have a GP for - use with GPDISP and GPREL32 relocs. Besides, if the section - is empty we don't use up space anyway. */ - af->got = obj_create_alloced_section(&af->root, ".got", 8, offset); - - return 1; -} - -int -arch_init_module (struct obj_file *f, struct module *mod) -{ - struct alpha_file *af = (struct alpha_file *)f; - - mod->gp = af->got->header.sh_addr + 0x8000; - - return 1; -} - -int -arch_finalize_section_address(struct obj_file *f, Elf64_Addr base) -{ - int i, n = f->header.e_shnum; - - f->baseaddr = base; - for (i = 0; i < n; ++i) - f->sections[i]->header.sh_addr += base; - return 1; -} - -int -arch_archdata (struct obj_file *fin, struct obj_section *sec) -{ - return 0; -} diff --git a/mdk-stage1/insmod-modutils/obj/obj_arm.c b/mdk-stage1/insmod-modutils/obj/obj_arm.c deleted file mode 100644 index 7a843f947..000000000 --- a/mdk-stage1/insmod-modutils/obj/obj_arm.c +++ /dev/null @@ -1,318 +0,0 @@ -/* ARM specific support for Elf loading and relocation. - Copyright 1996, 1997, 1998 Linux International. - - Contributed by Phil Blundell <philb@gnu.org> - and wms <woody@corelcomputer.com> - based on the i386 code by Richard Henderson <rth@tamu.edu> - - This file is part of the Linux modutils. - - 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 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, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ident "$Id$" - -#include <string.h> -#include <assert.h> - -#include <module.h> -#include <obj.h> -#include <util.h> - - -/*======================================================================*/ - -struct arm_plt_entry -{ - int offset; - int allocated:1; - int inited:1; // has been set up -}; - -struct arm_got_entry -{ - int offset; - int allocated : 1; - unsigned reloc_done : 1; -}; - -struct arm_file -{ - struct obj_file root; - struct obj_section *plt; - struct obj_section *got; -}; - -struct arm_symbol -{ - struct obj_symbol root; - struct arm_plt_entry pltent; - struct arm_got_entry gotent; -}; - - -/*======================================================================*/ - -struct obj_file * -arch_new_file (void) -{ - struct arm_file *f; - f = xmalloc(sizeof(*f)); - f->got = NULL; - return &f->root; -} - -struct obj_section * -arch_new_section (void) -{ - return xmalloc(sizeof(struct obj_section)); -} - -struct obj_symbol * -arch_new_symbol (void) -{ - struct arm_symbol *sym; - sym = xmalloc(sizeof(*sym)); - memset(&sym->gotent, 0, sizeof(sym->gotent)); - memset(&sym->pltent, 0, sizeof(sym->pltent)); - return &sym->root; -} - -int -arch_load_proc_section(struct obj_section *sec, int fp) -{ - /* Assume it's just a debugging section that we can safely - ignore ... */ - sec->contents = NULL; - - return 0; -} - -enum obj_reloc -arch_apply_relocation (struct obj_file *f, - struct obj_section *targsec, - struct obj_section *symsec, - struct obj_symbol *sym, - Elf32_Rel *rel, - Elf32_Addr v) -{ - struct arm_file *afile = (struct arm_file *)f; - struct arm_symbol *asym = (struct arm_symbol *)sym; - - Elf32_Addr *loc = (Elf32_Addr *)(targsec->contents + rel->r_offset); - Elf32_Addr dot = targsec->header.sh_addr + rel->r_offset; - Elf32_Addr got = afile->got ? afile->got->header.sh_addr : 0; - Elf32_Addr plt = afile->plt ? afile->plt->header.sh_addr : 0; - - struct arm_plt_entry *pe; - unsigned long *ip; - - enum obj_reloc ret = obj_reloc_ok; - - switch (ELF32_R_TYPE(rel->r_info)) - { - case R_ARM_NONE: - break; - - case R_ARM_ABS32: - *loc += v; - break; - - case R_ARM_GOT32: - /* needs an entry in the .got: set it, once */ - if (! asym->gotent.reloc_done) - { - asym->gotent.reloc_done = 1; - *(Elf32_Addr *)(afile->got->contents + asym->gotent.offset) = v; - } - /* make the reloc with_respect_to_.got */ - *loc += asym->gotent.offset; - break; - - /* relative reloc, always to _GLOBAL_OFFSET_TABLE_ (which is .got) - similar to branch, but is full 32 bits relative */ - case R_ARM_GOTPC: - assert(got); - *loc += got - dot; - break; - - case R_ARM_PC24: - case R_ARM_PLT32: - /* find the plt entry and initialize it if necessary */ - assert(asym != NULL); - pe = (struct arm_plt_entry*) &asym->pltent; - if (! pe->inited) - { - ip = (unsigned long *) (afile->plt->contents + pe->offset); - ip[0] = 0xe51ff004; /* ldr pc,[pc,#-4] */ - ip[1] = v; /* sym@ */ - pe->inited = 1; - } - - /* relative distance to target */ - v -= dot; - /* if the target is too far away.... */ - if ((int)v < -0x02000000 || (int)v >= 0x02000000) - { - /* go via the plt */ - v = plt + pe->offset - dot; - } - if (v & 3) - ret = obj_reloc_dangerous; - - /* Convert to words. */ - v >>= 2; - - /* merge the offset into the instruction. */ - *loc = (*loc & ~0x00ffffff) | ((v + *loc) & 0x00ffffff); - break; - - /* address relative to the got */ - case R_ARM_GOTOFF: - assert(got); - *loc += v - got; - break; - - default: - printf("Warning: unhandled reloc %d\n",ELF32_R_TYPE(rel->r_info)); - ret = obj_reloc_unhandled; - break; - } - - return ret; -} - -int -arch_create_got (struct obj_file *f) -{ - struct arm_file *afile = (struct arm_file *) f; - int i; - struct obj_section *sec, *syms, *strs; - ElfW(Rel) *rel, *relend; - ElfW(Sym) *symtab, *extsym; - const char *strtab, *name; - struct arm_symbol *intsym; - struct arm_plt_entry *pe; - struct arm_got_entry *ge; - int got_offset = 0, plt_offset = 0; - - for (i = 0; i < f->header.e_shnum; ++i) - { - sec = f->sections[i]; - if (sec->header.sh_type != SHT_RELM) - continue; - syms = f->sections[sec->header.sh_link]; - strs = f->sections[syms->header.sh_link]; - - rel = (ElfW(RelM) *) sec->contents; - relend = rel + (sec->header.sh_size / sizeof(ElfW(RelM))); - symtab = (ElfW(Sym) *) syms->contents; - strtab = (const char *) strs->contents; - - for (; rel < relend; ++rel) - { - extsym = &symtab[ELF32_R_SYM(rel->r_info)]; - - switch(ELF32_R_TYPE(rel->r_info)) { - case R_ARM_PC24: - case R_ARM_PLT32: - if (extsym->st_name) - name = strtab + extsym->st_name; - else - name = f->sections[extsym->st_shndx]->name; - intsym = (struct arm_symbol *) obj_find_symbol(f, name); - - pe = &intsym->pltent; - - if (! pe->allocated) - { - pe->allocated = 1; - pe->offset = plt_offset; - plt_offset += 8; - pe->inited = 0; - } - break; - - /* these two don_t need got entries, but they need - the .got to exist */ - case R_ARM_GOTOFF: - case R_ARM_GOTPC: - if (got_offset==0) got_offset = 4; - break; - - case R_ARM_GOT32: - if (extsym->st_name) - name = strtab + extsym->st_name; - else - name = f->sections[extsym->st_shndx]->name; - intsym = (struct arm_symbol *) obj_find_symbol(f, name); - - ge = (struct arm_got_entry *) &intsym->gotent; - if (! ge->allocated) - { - ge->allocated = 1; - ge->offset = got_offset; - got_offset += sizeof(void*); - } - break; - - default: - continue; - } - } - } - - /* if there was a _GLOBAL_OFFSET_TABLE_, then the .got section - exists already; find it and use it */ - if (got_offset) - { - struct obj_section* sec = obj_find_section(f, ".got"); - if (sec) - obj_extend_section(sec, got_offset); - else - { - sec = obj_create_alloced_section(f, ".got", 8, got_offset); - assert(sec); - } - afile->got = sec; - } - - if (plt_offset) - afile->plt = obj_create_alloced_section(f, ".plt", 8, plt_offset); - - return 1; -} - -int -arch_init_module (struct obj_file *f, struct module *mod) -{ - return 1; -} - -int -arch_finalize_section_address(struct obj_file *f, Elf32_Addr base) -{ - int i, n = f->header.e_shnum; - - f->baseaddr = base; - for (i = 0; i < n; ++i) - f->sections[i]->header.sh_addr += base; - return 1; -} - -int -arch_archdata (struct obj_file *fin, struct obj_section *sec) -{ - return 0; -} diff --git a/mdk-stage1/insmod-modutils/obj/obj_common.c b/mdk-stage1/insmod-modutils/obj/obj_common.c deleted file mode 100644 index 2a6606c94..000000000 --- a/mdk-stage1/insmod-modutils/obj/obj_common.c +++ /dev/null @@ -1,399 +0,0 @@ -/* Elf file, section, and symbol manipulation routines. - Copyright 1996, 1997 Linux International. - - Contributed by Richard Henderson <rth@tamu.edu> - - This file is part of the Linux modutils. - - 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 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, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ident "$Id$" - -#include <stdlib.h> -#include <string.h> -#include <assert.h> - -#include <obj.h> -#include <util.h> -#include <module.h> - -/*======================================================================*/ - -/* Standard ELF hash function. */ -inline unsigned long -obj_elf_hash_n(const char *name, unsigned long n) -{ - unsigned long h = 0; - unsigned long g; - unsigned char ch; - - while (n > 0) - { - ch = *name++; - h = (h << 4) + ch; - if ((g = (h & 0xf0000000)) != 0) - { - h ^= g >> 24; - h &= ~g; - } - n--; - } - return h; -} - -unsigned long -obj_elf_hash (const char *name) -{ - return obj_elf_hash_n(name, strlen(name)); -} - -void -obj_set_symbol_compare (struct obj_file *f, - int (*cmp)(const char *, const char *), - unsigned long (*hash)(const char *)) -{ - if (cmp) - f->symbol_cmp = cmp; - if (hash) - { - struct obj_symbol *tmptab[HASH_BUCKETS], *sym, *next; - int i; - - f->symbol_hash = hash; - - memcpy(tmptab, f->symtab, sizeof(tmptab)); - memset(f->symtab, 0, sizeof(f->symtab)); - - for (i = 0; i < HASH_BUCKETS; ++i) - for (sym = tmptab[i]; sym ; sym = next) - { - unsigned long h = hash(sym->name) % HASH_BUCKETS; - next = sym->next; - sym->next = f->symtab[h]; - f->symtab[h] = sym; - } - } -} - -struct obj_symbol * -obj_add_symbol (struct obj_file *f, const char *name, unsigned long symidx, - int info, int secidx, ElfW(Addr) value, unsigned long size) -{ - struct obj_symbol *sym; - unsigned long hash = f->symbol_hash(name) % HASH_BUCKETS; - int n_type = ELFW(ST_TYPE)(info); - int n_binding = ELFW(ST_BIND)(info); - - for (sym = f->symtab[hash]; sym; sym = sym->next) - if (f->symbol_cmp(sym->name, name) == 0) - { - int o_secidx = sym->secidx; - int o_info = sym->info; - int o_type = ELFW(ST_TYPE)(o_info); - int o_binding = ELFW(ST_BIND)(o_info); - - /* A redefinition! Is it legal? */ - - if (secidx == SHN_UNDEF) - return sym; - else if (o_secidx == SHN_UNDEF) - goto found; - else if (n_binding == STB_GLOBAL && o_binding == STB_LOCAL) - { - /* Cope with local and global symbols of the same name - in the same object file, as might have been created - by ld -r. The only reason locals are now seen at this - level at all is so that we can do semi-sensible things - with parameters. */ - - struct obj_symbol *nsym, **p; - - nsym = arch_new_symbol(); - nsym->next = sym->next; - nsym->ksymidx = -1; - - /* Excise the old (local) symbol from the hash chain. */ - for (p = &f->symtab[hash]; *p != sym; p = &(*p)->next) - continue; - *p = sym = nsym; - goto found; - } - else if (n_binding == STB_LOCAL) - { - /* Another symbol of the same name has already been defined. - Just add this to the local table. */ - sym = arch_new_symbol(); - sym->next = NULL; - sym->ksymidx = -1; - f->local_symtab[symidx] = sym; - goto found; - } - else if (n_binding == STB_WEAK) - return sym; - else if (o_binding == STB_WEAK) - goto found; - /* Don't unify COMMON symbols with object types the programmer - doesn't expect. */ - else if (secidx == SHN_COMMON - && (o_type == STT_NOTYPE || o_type == STT_OBJECT)) - return sym; - else if (o_secidx == SHN_COMMON - && (n_type == STT_NOTYPE || n_type == STT_OBJECT)) - goto found; - else - { - /* Don't report an error if the symbol is coming from - the kernel or some external module. */ - if (secidx <= SHN_HIRESERVE) - error("%s multiply defined", name); - return sym; - } - } - - /* Completely new symbol. */ - sym = arch_new_symbol(); - sym->next = f->symtab[hash]; - f->symtab[hash] = sym; - sym->ksymidx = -1; - - if (ELFW(ST_BIND)(info) == STB_LOCAL && symidx != -1) { - if (symidx >= f->local_symtab_size) - error("local symbol %s with index %ld exceeds local_symtab_size %ld", - name, (long) symidx, (long) f->local_symtab_size); - else - f->local_symtab[symidx] = sym; - } - -found: - sym->name = name; - sym->value = value; - sym->size = size; - sym->secidx = secidx; - sym->info = info; - sym->r_type = 0; /* should be R_arch_NONE for all arch */ - - return sym; -} - -struct obj_symbol * -obj_find_symbol (struct obj_file *f, const char *name) -{ - struct obj_symbol *sym; - unsigned long hash = f->symbol_hash(name) % HASH_BUCKETS; - - for (sym = f->symtab[hash]; sym; sym = sym->next) - if (f->symbol_cmp(sym->name, name) == 0) - return sym; - - return NULL; -} - -ElfW(Addr) -obj_symbol_final_value (struct obj_file *f, struct obj_symbol *sym) -{ - if (sym) - { - if (sym->secidx >= SHN_LORESERVE) - return sym->value; - - return sym->value + f->sections[sym->secidx]->header.sh_addr; - } - else - { - /* As a special case, a NULL sym has value zero. */ - return 0; - } -} - -struct obj_section * -obj_find_section (struct obj_file *f, const char *name) -{ - int i, n = f->header.e_shnum; - - for (i = 0; i < n; ++i) - if (strcmp(f->sections[i]->name, name) == 0) - return f->sections[i]; - - return NULL; -} - -static int -obj_load_order_prio(struct obj_section *a) -{ - unsigned long af, ac; - - af = a->header.sh_flags; - - ac = 0; - if (a->name[0] != '.' || strlen(a->name) != 10 || - strcmp(a->name + 5, ".init")) ac |= 32; - if (af & SHF_ALLOC) ac |= 16; - if (!(af & SHF_WRITE)) ac |= 8; - if (af & SHF_EXECINSTR) ac |= 4; - if (a->header.sh_type != SHT_NOBITS) ac |= 2; -#if defined(ARCH_ia64) - if (af & SHF_IA_64_SHORT) ac -= 1; -#endif - - return ac; -} - -void -obj_insert_section_load_order (struct obj_file *f, struct obj_section *sec) -{ - struct obj_section **p; - int prio = obj_load_order_prio(sec); - for (p = f->load_order_search_start; *p ; p = &(*p)->load_next) - if (obj_load_order_prio(*p) < prio) - break; - sec->load_next = *p; - *p = sec; -} - -struct obj_section * -obj_create_alloced_section (struct obj_file *f, const char *name, - unsigned long align, unsigned long size) -{ - int newidx = f->header.e_shnum++; - struct obj_section *sec; - - f->sections = xrealloc(f->sections, (newidx+1) * sizeof(sec)); - f->sections[newidx] = sec = arch_new_section(); - - memset(sec, 0, sizeof(*sec)); - sec->header.sh_type = SHT_PROGBITS; - sec->header.sh_flags = SHF_WRITE|SHF_ALLOC; - sec->header.sh_size = size; - sec->header.sh_addralign = align; - sec->name = name; - sec->idx = newidx; - if (size) - sec->contents = xmalloc(size); - - obj_insert_section_load_order(f, sec); - - return sec; -} - -struct obj_section * -obj_create_alloced_section_first (struct obj_file *f, const char *name, - unsigned long align, unsigned long size) -{ - int newidx = f->header.e_shnum++; - struct obj_section *sec; - - f->sections = xrealloc(f->sections, (newidx+1) * sizeof(sec)); - f->sections[newidx] = sec = arch_new_section(); - - memset(sec, 0, sizeof(*sec)); - sec->header.sh_type = SHT_PROGBITS; - sec->header.sh_flags = SHF_WRITE|SHF_ALLOC; - sec->header.sh_size = size; - sec->header.sh_addralign = align; - sec->name = name; - sec->idx = newidx; - if (size) - sec->contents = xmalloc(size); - - sec->load_next = f->load_order; - f->load_order = sec; - if (f->load_order_search_start == &f->load_order) - f->load_order_search_start = &sec->load_next; - - return sec; -} - -void * -obj_extend_section (struct obj_section *sec, unsigned long more) -{ - unsigned long oldsize = sec->header.sh_size; - sec->contents = xrealloc(sec->contents, sec->header.sh_size += more); - return sec->contents + oldsize; -} - -/* Convert an object pointer (address) to a native pointer and vice versa. - * It gets interesting when the object has 64 bit pointers but modutils - * is running 32 bit. This is nasty code but it stops the compiler giving - * spurious warning messages. "I know what I am doing" ... - */ - -void * -obj_addr_to_native_ptr (ElfW(Addr) addr) -{ - unsigned int convert = (sizeof(void *) << 8) + sizeof(addr); /* to, from */ - union obj_ptr_4 p4; - union obj_ptr_8 p8; - switch (convert) { - case 0x0404: - p4.addr = addr; - return(p4.ptr); - break; - case 0x0408: - p4.addr = addr; - if (p4.addr != addr) { - error("obj_addr_to_native_ptr truncation %" tgt_long_fmt "x", - (tgt_long) addr); - exit(1); - } - return(p4.ptr); - break; - case 0x0804: - p8.addr = addr; - return(p8.ptr); - break; - case 0x0808: - p8.addr = addr; - return(p8.ptr); - break; - default: - error("obj_addr_to_native_ptr unknown conversion 0x%04x", convert); - exit(1); - } -} - -ElfW(Addr) -obj_native_ptr_to_addr (void *ptr) -{ - unsigned int convert = (sizeof(ElfW(Addr)) << 8) + sizeof(ptr); /* to, from */ - union obj_ptr_4 p4; - union obj_ptr_8 p8; - switch (convert) { - case 0x0404: - p4.ptr = ptr; - return(p4.addr); - break; - case 0x0408: - p8.ptr = ptr; - p4.addr = p8.addr; - if (p4.addr != p8.addr) { - error("obj_native_ptr_to_addr truncation %" tgt_long_fmt "x", - (tgt_long) p8.addr); - exit(1); - } - return(p4.addr); - break; - case 0x0804: - p4.ptr = ptr; - return(p4.addr); /* compiler expands to 8 */ - break; - case 0x0808: - p8.ptr = ptr; - return(p8.addr); - break; - default: - error("obj_native_ptr_to_addr unknown conversion 0x%04x", convert); - exit(1); - } -} diff --git a/mdk-stage1/insmod-modutils/obj/obj_hppa.c b/mdk-stage1/insmod-modutils/obj/obj_hppa.c deleted file mode 100644 index 4207e692e..000000000 --- a/mdk-stage1/insmod-modutils/obj/obj_hppa.c +++ /dev/null @@ -1,668 +0,0 @@ -/* - * PA-RISC specific support for Elf loading and relocation. - * Copyright 2000 David Huggins-Daines <dhd@linuxcare.com>, Linuxcare Inc. - * Copyright 2000 Richard Hirst <rhirst@linuxcare.com>, Linuxcare Inc. - * - * Based on the IA-64 support, which is: - * Copyright 2000 Mike Stephens <mike.stephens@intel.com> - * - * This file is part of the Linux modutils. - * - * 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 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, write to the Free Software Foundation, - * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#include <stdlib.h> -#include <string.h> -#include <assert.h> - -#include <module.h> -#include <obj.h> -#include <util.h> -#include <modstat.h> /* For ksyms */ - - -typedef struct _hppa_stub_t -{ - struct _hppa_stub_t *next; - int offset; - int reloc_done; -} hppa_stub_t; - -typedef struct _hppa_symbol_t -{ - struct obj_symbol root; - hppa_stub_t *stub; -} hppa_symbol_t; - -typedef struct _hppa_file_t -{ - struct obj_file root; - struct obj_section *stub; - Elf32_Addr dp; -} hppa_file_t; - -/* The ABI defines various more esoteric types, but these are the only - ones we actually need. */ -enum hppa_fsel -{ - e_fsel, - e_lsel, - e_rsel, - e_lrsel, - e_rrsel -}; - -/* This could be a call to obj_create_alloced_section() followed - * by an overwrite of sec->header.sh_flags. - */ - -struct obj_section * -obj_hppa_create_alloced_section (struct obj_file *f, const char *name, - unsigned long align, unsigned long size, - unsigned long sh_flags) -{ - int newidx = f->header.e_shnum++; - struct obj_section *sec; - - f->sections = xrealloc(f->sections, (newidx+1) * sizeof(sec)); - f->sections[newidx] = sec = arch_new_section(); - - memset(sec, 0, sizeof(*sec)); - sec->header.sh_type = SHT_PROGBITS; - sec->header.sh_flags = sh_flags; - sec->header.sh_size = size; - sec->header.sh_addralign = align; - sec->name = name; - sec->idx = newidx; - if (size) - sec->contents = xmalloc(size); - - obj_insert_section_load_order(f, sec); - - return sec; -} - -struct obj_file * -arch_new_file (void) -{ - hppa_file_t *f; - f = xmalloc(sizeof(*f)); - f->stub = NULL; - return &f->root; -} - -struct obj_section * -arch_new_section (void) -{ - return xmalloc(sizeof(struct obj_section)); -} - -struct obj_symbol * -arch_new_symbol (void) -{ - hppa_symbol_t *sym; - sym = xmalloc(sizeof(*sym)); - sym->stub = NULL; - return &sym->root; -} - -/* This is called for architecture specific sections we might need to - do special things to. */ -int -arch_load_proc_section(struct obj_section *sec, int fp) -{ - /* Assume it's just a debugging section that we can safely - ignore ... */ - sec->contents = NULL; - - return 0; -} - -/* ================================================================= - - These functions are from libhppa.h in the GNU BFD library. - (c) 1990, 91, 92, 93, 94, 95, 96, 98, 99, 2000 - Free Software Foundation, Inc. - - ================================================================= */ - -/* The *sign_extend functions are used to assemble various bitfields - taken from an instruction and return the resulting immediate - value. */ - -static inline int -sign_extend (x, len) - int x, len; -{ - int signbit = (1 << (len - 1)); - int mask = (signbit << 1) - 1; - return ((x & mask) ^ signbit) - signbit; -} - -static inline int -low_sign_extend (x, len) - int x, len; -{ - return (x >> 1) - ((x & 1) << (len - 1)); -} - - -/* The re_assemble_* functions prepare an immediate value for - insertion into an opcode. pa-risc uses all sorts of weird bitfields - in the instruction to hold the value. */ - -static inline int -sign_unext (x, len) - int x, len; -{ - int len_ones; - - len_ones = (1 << len) - 1; - - return x & len_ones; -} - -static inline int -low_sign_unext (x, len) - int x, len; -{ - int temp; - int sign; - - sign = (x >> (len-1)) & 1; - - temp = sign_unext (x, len-1); - - return (temp << 1) | sign; -} - -static inline int -re_assemble_3 (as3) - int as3; -{ - return (( (as3 & 4) << (13-2)) - | ((as3 & 3) << (13+1))); -} - -static inline int -re_assemble_12 (as12) - int as12; -{ - return (( (as12 & 0x800) >> 11) - | ((as12 & 0x400) >> (10 - 2)) - | ((as12 & 0x3ff) << (1 + 2))); -} - -static inline int -re_assemble_14 (as14) - int as14; -{ - return (( (as14 & 0x1fff) << 1) - | ((as14 & 0x2000) >> 13)); -} - -static inline int -re_assemble_16 (as16) - int as16; -{ - int s, t; - - /* Unusual 16-bit encoding, for wide mode only. */ - t = (as16 << 1) & 0xffff; - s = (as16 & 0x8000); - return (t ^ s ^ (s >> 1)) | (s >> 15); -} - -static inline int -re_assemble_17 (as17) - int as17; -{ - return (( (as17 & 0x10000) >> 16) - | ((as17 & 0x0f800) << (16 - 11)) - | ((as17 & 0x00400) >> (10 - 2)) - | ((as17 & 0x003ff) << (1 + 2))); -} - -static inline int -re_assemble_21 (as21) - int as21; -{ - return (( (as21 & 0x100000) >> 20) - | ((as21 & 0x0ffe00) >> 8) - | ((as21 & 0x000180) << 7) - | ((as21 & 0x00007c) << 14) - | ((as21 & 0x000003) << 12)); -} - -static inline int -re_assemble_22 (as22) - int as22; -{ - return (( (as22 & 0x200000) >> 21) - | ((as22 & 0x1f0000) << (21 - 16)) - | ((as22 & 0x00f800) << (16 - 11)) - | ((as22 & 0x000400) >> (10 - 2)) - | ((as22 & 0x0003ff) << (1 + 2))); -} - - -/* Handle field selectors for PA instructions. - The L and R (and LS, RS etc.) selectors are used in pairs to form a - full 32 bit address. eg. - - LDIL L'start,%r1 ; put left part into r1 - LDW R'start(%r1),%r2 ; add r1 and right part to form address - - This function returns sign extended values in all cases. -*/ - -static inline unsigned int -hppa_field_adjust (value, addend, r_field) - unsigned int value; - int addend; - enum hppa_fsel r_field; -{ - unsigned int sym_val; - - sym_val = value - addend; - switch (r_field) - { - case e_fsel: - /* F: No change. */ - break; - - case e_lsel: - /* L: Select top 21 bits. */ - value = value >> 11; - break; - - case e_rsel: - /* R: Select bottom 11 bits. */ - value = value & 0x7ff; - break; - - case e_lrsel: - /* LR: L with rounding of the addend to nearest 8k. */ - value = sym_val + ((addend + 0x1000) & -0x2000); - value = value >> 11; - break; - - case e_rrsel: - /* RR: R with rounding of the addend to nearest 8k. - We need to return a value such that 2048 * LR'x + RR'x == x - ie. RR'x = s+a - (s + (((a + 0x1000) & -0x2000) & -0x800)) - . = s+a - ((s & -0x800) + ((a + 0x1000) & -0x2000)) - . = (s & 0x7ff) + a - ((a + 0x1000) & -0x2000) */ - value = (sym_val & 0x7ff) + (((addend & 0x1fff) ^ 0x1000) - 0x1000); - break; - - default: - abort(); - } - return value; -} - -/* Insert VALUE into INSN using R_FORMAT to determine exactly what - bits to change. */ - -static inline int -hppa_rebuild_insn (insn, value, r_format) - int insn; - int value; - int r_format; -{ - switch (r_format) - { - case 11: - return (insn & ~ 0x7ff) | low_sign_unext (value, 11); - - case 12: - return (insn & ~ 0x1ffd) | re_assemble_12 (value); - - - case 10: - return (insn & ~ 0x3ff1) | re_assemble_14 (value & -8); - - case -11: - return (insn & ~ 0x3ff9) | re_assemble_14 (value & -4); - - case 14: - return (insn & ~ 0x3fff) | re_assemble_14 (value); - - - case -10: - return (insn & ~ 0xfff1) | re_assemble_16 (value & -8); - - case -16: - return (insn & ~ 0xfff9) | re_assemble_16 (value & -4); - - case 16: - return (insn & ~ 0xffff) | re_assemble_16 (value); - - - case 17: - return (insn & ~ 0x1f1ffd) | re_assemble_17 (value); - - case 21: - return (insn & ~ 0x1fffff) | re_assemble_21 (value); - - case 22: - return (insn & ~ 0x3ff1ffd) | re_assemble_22 (value); - - case 32: - return value; - - default: - abort (); - } - return insn; -} - -/* ==================================================================== - - End of functions from GNU BFD. - - ==================================================================== */ - -/* This is where we get the opportunity to create any extra dynamic - sections we might need. In our case we do not need a GOT because - our code is not PIC, but we do need to create a stub section. - - This is significantly less complex than what we do for shared - libraries because, obviously, modules are not shared. Also we have - no issues related to symbol visibility, lazy linking, etc. - The kernels dp is fixed (at symbol data_start), and we can fix up any - DPREL refs in the module to use that same dp value. - All PCREL17F refs result in a stub with the following format: - - ldil L'func_addr,%r1 - be,n R'func_addr(%sr4,%r1) - - Note, all PCREL17F get a stub, regardless of whether they are - local or external. With local ones, and external ones to other - modules, there is a good chance we could manage without the stub. - I'll leave that for a future optimisation. - */ - -#define LDIL_R1 0x20200000 /* ldil L'XXX,%r1 */ -#define BE_N_SR4_R1 0xe0202002 /* be,n R'XXX(%sr4,%r1) */ - -#define STUB_SIZE 8 - -int -arch_create_got(struct obj_file *f) -{ - hppa_file_t *hfile = (hppa_file_t *)f; - int i, n; - int stub_offset = 0; - - /* Create stub section. - * XXX set flags, see obj_ia64.c - */ - hfile->stub = obj_create_alloced_section(f, ".stub", STUB_SIZE, 0); - - /* Actually this is a lot like check_relocs() in a BFD backend. We - walk all sections and all their relocations and look for ones - that need special treatment. */ - n = hfile->root.header.e_shnum; - for (i = 0; i < n; ++i) - { - struct obj_section *relsec, *symsec, *strsec; - Elf32_Rela *rel, *relend; - Elf32_Sym *symtab; - char const *strtab; - - relsec = hfile->root.sections[i]; - if (relsec->header.sh_type != SHT_RELA) - continue; - - symsec = hfile->root.sections[relsec->header.sh_link]; - strsec = hfile->root.sections[symsec->header.sh_link]; - - rel = (Elf32_Rela *)relsec->contents; - relend = rel + (relsec->header.sh_size / sizeof(Elf32_Rela)); - symtab = (Elf32_Sym *)symsec->contents; - strtab = (char const *)strsec->contents; - - for (; rel < relend; rel++) - { - int need_stub = 0; - - switch (ELF32_R_TYPE(rel->r_info)) - { - default: - continue; - - case R_PARISC_PCREL17F: - need_stub = 1; - break; - } - - if (need_stub) - { - Elf32_Sym *extsym; - hppa_symbol_t *hsym; - char const *name; - int local; - unsigned long symndx; - - symndx = ELF32_R_SYM(rel->r_info); - extsym = symtab + symndx; - if (ELF32_ST_BIND(extsym->st_info) == STB_LOCAL) - hsym = (hppa_symbol_t *) f->local_symtab[symndx]; - else - { - if (extsym->st_name) - name = strtab + extsym->st_name; - else - name = f->sections[extsym->st_shndx]->name; - hsym = (hppa_symbol_t *)obj_find_symbol(f, name); - } - local = hsym->root.secidx <= SHN_HIRESERVE; - - if (need_stub) - { - hppa_stub_t *stub; - - if (hsym->stub == NULL) - { - stub = (hppa_stub_t *) xmalloc(sizeof(hppa_stub_t)); - stub->offset = stub_offset; - stub->reloc_done = 0; - hsym->stub = stub; - stub_offset += STUB_SIZE; - need_stub = 0; - } - } - } - } - } - if (stub_offset) - { - hfile->stub->contents = xmalloc(stub_offset); - hfile->stub->header.sh_size = stub_offset; - } - return 1; -} - - -enum obj_reloc -arch_apply_relocation(struct obj_file *f, - struct obj_section *targsec, - struct obj_section *symsec, - struct obj_symbol *sym, - Elf32_Rela *rel, - Elf32_Addr v) -{ - hppa_file_t *hfile = (hppa_file_t *) f; - hppa_symbol_t *hsym = (hppa_symbol_t *) sym; - - Elf32_Addr *loc = (Elf32_Addr *)(targsec->contents + rel->r_offset); - Elf32_Addr dot = (targsec->header.sh_addr + rel->r_offset) & ~0x03; - Elf32_Addr dp = hfile->dp; - Elf32_Word r_info = ELF32_R_TYPE(rel->r_info); - - enum obj_reloc ret = obj_reloc_ok; - enum hppa_fsel fsel = e_fsel; /* Avoid compiler warning */ - unsigned int r_format; - - /* Fix up the value, and determine whether we can handle this - relocation. */ - switch (r_info) - { - case R_PARISC_PLABEL32: - case R_PARISC_DIR32: - case R_PARISC_DIR21L: - case R_PARISC_DIR14R: - /* Easy. */ - break; - - case R_PARISC_DPREL21L: - case R_PARISC_DPREL14R: - v -= dp; - break; - - case R_PARISC_PCREL17F: - /* Find an import stub. */ - assert(hsym->stub != NULL); - assert(hfile->stub != NULL); - /* XXX Optimise. We may not need a stub for short branches */ - if (!hsym->stub->reloc_done) { - /* Need to create the .stub entry */ - Elf32_Addr *pstub, stubv; - - pstub = (Elf32_Addr *)(hfile->stub->contents + hsym->stub->offset); - pstub[0] = LDIL_R1; - pstub[1] = BE_N_SR4_R1; - stubv = hppa_field_adjust(v, rel->r_addend, e_lrsel); - pstub[0] = hppa_rebuild_insn(pstub[0], stubv, 21); - stubv = hppa_field_adjust(v, rel->r_addend, e_rrsel); - stubv >>= 2; /* Branch; divide by 4 */ - pstub[1] = hppa_rebuild_insn(pstub[1], stubv, 17); - hsym->stub->reloc_done = 1; - } - v = hsym->stub->offset + hfile->stub->header.sh_addr; - break; - - default: - return obj_reloc_unhandled; - } - - /* Find the field selector. */ - switch (r_info) - { - case R_PARISC_DIR32: - case R_PARISC_PLABEL32: - case R_PARISC_PCREL17F: - fsel = e_fsel; - break; - - case R_PARISC_DPREL21L: - case R_PARISC_DIR21L: - fsel = e_lrsel; - break; - - case R_PARISC_DPREL14R: - case R_PARISC_DIR14R: - fsel = e_rrsel; - break; - } - - v = hppa_field_adjust(v, rel->r_addend, fsel); - - switch (r_info) - { - case R_PARISC_PCREL17F: - case R_PARISC_PCREL17R: - case R_PARISC_PCREL22F: - v = v - dot - 8; - case R_PARISC_DIR17F: - case R_PARISC_DIR17R: - /* This is a branch. Divide the offset by four. */ - v >>= 2; - break; - default: - break; - } - - /* Find the format. */ - switch (r_info) - { - case R_PARISC_DIR32: - case R_PARISC_PLABEL32: - r_format = 32; - break; - - case R_PARISC_DPREL21L: - case R_PARISC_DIR21L: - r_format = 21; - break; - - case R_PARISC_PCREL17F: - r_format = 17; - break; - - case R_PARISC_DPREL14R: - case R_PARISC_DIR14R: - r_format = 14; - break; - - default: - abort(); - } - - *loc = hppa_rebuild_insn(*loc, v, r_format); - - return ret; -} - -int -arch_init_module (struct obj_file *f, struct module *mod) -{ - return 1; -} - -int -arch_finalize_section_address(struct obj_file *f, Elf32_Addr base) -{ - int i, n = f->header.e_shnum; - - f->baseaddr = base; - for (i = 0; i < n; ++i) - f->sections[i]->header.sh_addr += base; - return 1; -} - -int -arch_archdata (struct obj_file *f, struct obj_section *sec) -{ - struct module_symbol *s; - int i; - hppa_file_t *hfile = (hppa_file_t *)f; - - /* Initialise dp to the kernels dp (symbol data_start) - */ - for (i = 0, s = ksyms; i < nksyms; i++, s++) - if (!strcmp((char *)s->name, "data_start")) - break; - if (i >= nksyms) { - error("Cannot initialise dp, 'data_start' not found\n"); - return 1; - } - hfile->dp = s->value; - - return 0; -} - diff --git a/mdk-stage1/insmod-modutils/obj/obj_hppa64.c b/mdk-stage1/insmod-modutils/obj/obj_hppa64.c deleted file mode 100644 index fe32911ff..000000000 --- a/mdk-stage1/insmod-modutils/obj/obj_hppa64.c +++ /dev/null @@ -1,686 +0,0 @@ -/* - * hppa parisc64 specific support for Elf loading and relocation. - * Copyright 2000 Richard Hirst <rhirst@linuxcare.com>, Linuxcare Inc. - * - * Based on ia64 specific support which was - * Copyright 2000 Mike Stephens <mike.stephens@intel.com> - * - * This file is part of the Linux modutils. - * - * 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 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, write to the Free Software Foundation, - * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#ident "$Id$" - -#include <string.h> -#include <assert.h> -#include <stdlib.h> - -#include <module.h> -#include <obj.h> -#include <util.h> - -#ifndef FALSE -#define FALSE 0 -#endif -#ifndef TRUE -#define TRUE ~FALSE -#endif - -/*======================================================================*/ - -typedef struct _hppa64_opd_t -{ - int offset; - int reloc_done; -} hppa64_opd_t; - -typedef struct _hppa64_stub_t -{ - struct _hppa64_stub_t *next; - Elf64_Addr addend; - int offset; - int reloc_done; -} hppa64_stub_t; - -typedef struct _hppa64_got_t -{ - struct _hppa64_got_t *next; - Elf64_Addr addend; - int offset; - int reloc_done; -} hppa64_got_t; - -typedef struct _hppa64_symbol_t -{ - struct obj_symbol root; - hppa64_got_t *gotent; - hppa64_opd_t *opdent; - hppa64_stub_t *stubent; -} hppa64_symbol_t; - -typedef struct _hppa64_file_t -{ - struct obj_file root; - struct obj_section *got; - struct obj_section *opd; - struct obj_section *stub; - Elf64_Addr gp; - Elf64_Addr text; - Elf64_Addr data; - Elf64_Addr bss; -} hppa64_file_t; - -/* - * XXX This stub assumes it can reach the .got entry with a +/- 8K offset - * from dp. Perhaps we should use a .plt for these entries to give a - * greater chance of that being true. - * - * 53 7b 00 00 ldd 0(dp),dp - * R_PARISC_LTOFF14R <.got entry offset from dp> - * 53 61 00 20 ldd 10(dp),r1 - * e8 20 d0 00 bve (r1) - * 53 7b 00 30 ldd 18(dp),dp - * - * We need a different stub for millicode calls, which doesn't screw - * dp: - * - * 53 61 00 00 ldd 0(dp),r1 - * R_PARISC_LTOFF14R <.got entry offset from dp> - * 50 21 00 20 ldd 10(r1),r1 - * e8 20 d0 00 bve (r1) - * 08 00 02 40 nop - * - */ - -/* NOTE: to keep the code cleaner we make all stubs the same size. - */ - -#define SIZEOF_STUB 16 - -unsigned char hppa64_stub_extern[] = -{ - 0x53, 0x7b, 0x00, 0x00, - 0x53, 0x61, 0x00, 0x20, - 0xe8, 0x20, 0xd0, 0x00, - 0x53, 0x7b, 0x00, 0x30, -}; - -unsigned char hppa64_stub_millicode[] = -{ - 0x53, 0x61, 0x00, 0x00, - 0x50, 0x21, 0x00, 0x20, - 0xe8, 0x20, 0xd0, 0x00, - 0x08, 0x00, 0x02, 0x40, -}; - -/*======================================================================*/ - -enum obj_reloc -patch_14r(Elf64_Xword v64, Elf64_Word *p) -{ - Elf64_Word i = *p; - Elf64_Word v = (Elf64_Word)v64; - - if (v & 0x80000000) - v |= ~0x7ff; - else - v &= 0x7ff; - i &= ~ 0x3fff; - i |= (v & 0x1fff) << 1 | - (v & 0x2000) >> 13; - *p = i; - - return obj_reloc_ok; -} - -enum obj_reloc -patch_21l(Elf64_Xword v64, Elf64_Word *p) -{ - Elf64_Word i = *p; - Elf64_Word v = (Elf64_Word)v64; - - v &= 0xfffff800; - if (v & 0x80000000) - v += 0x800; - i &= ~ 0x1fffff; - i |= (v & 0x80000000) >> 31 | - (v & 0x7ff00000) >> 19 | - (v & 0x000c0000) >> 4 | - (v & 0x0003e000) << 3 | - (v & 0x00001800) << 1; - *p = i; - - return obj_reloc_ok; -} - - -/* All 14 bits this time... This is used to patch the .got offset in - * a stub for PCREL22F. - */ - -enum obj_reloc -patch_14r2(Elf64_Xword v64, Elf64_Word *p) -{ - Elf64_Word i = *p; - Elf64_Word v = (Elf64_Word)v64; - - if ((Elf64_Sxword)v64 > 0x1fffL || - (Elf64_Sxword)v64 < -0x2000L) - return obj_reloc_overflow; - i &= ~ 0x3fff; - i |= (v & 0x2000) >> 13 | - (v & 0x1fff) << 1; - *p = i; - - return obj_reloc_ok; -} - - -enum obj_reloc -patch_22f(Elf64_Xword v64, Elf64_Word *p) -{ - Elf64_Word i = *p; - Elf64_Word v = (Elf64_Word)v64; - - if ((Elf64_Sxword)v64 > 0x800000-1 || - (Elf64_Sxword)v64 < -0x800000) - return obj_reloc_overflow; - - i &= ~ 0x03ff1ffd; - i |= (v & 0x00800000) >> 23 | - (v & 0x007c0000) << 3 | - (v & 0x0003e000) << 3 | - (v & 0x00001000) >> 10 | - (v & 0x00000ffc) << 1; - *p = i; - - return obj_reloc_ok; -} - - -struct obj_section * -obj_hppa64_create_alloced_section (struct obj_file *f, const char *name, - unsigned long align, unsigned long size, unsigned long sh_flags) -{ - int newidx = f->header.e_shnum++; - struct obj_section *sec; - - f->sections = xrealloc(f->sections, (newidx+1) * sizeof(sec)); - f->sections[newidx] = sec = arch_new_section(); - - memset(sec, 0, sizeof(*sec)); - sec->header.sh_type = SHT_PROGBITS; - sec->header.sh_flags = sh_flags; - sec->header.sh_size = size; - sec->header.sh_addralign = align; - sec->name = name; - sec->idx = newidx; - if (size) - sec->contents = xmalloc(size); - - obj_insert_section_load_order(f, sec); - - return sec; -} - -/*======================================================================*/ - -struct obj_file * -arch_new_file (void) -{ - hppa64_file_t *f; - f = xmalloc(sizeof(*f)); - f->got = NULL; - f->opd = NULL; - f->stub = NULL; - return &f->root; -} - -struct obj_section * -arch_new_section (void) -{ - return xmalloc(sizeof(struct obj_section)); -} - -struct obj_symbol * -arch_new_symbol (void) -{ - hppa64_symbol_t *sym; - sym = xmalloc(sizeof(*sym)); - sym->gotent = NULL; - sym->opdent = NULL; - sym->stubent = NULL; - return &sym->root; -} - -/* This may not be needed, but does no harm (copied from ia64). - */ - -int -arch_load_proc_section(struct obj_section *sec, int fp) -{ - switch (sec->header.sh_type) - { - case SHT_PARISC_EXT : - sec->contents = NULL; - break; - - case SHT_PARISC_UNWIND : - if (sec->header.sh_size > 0) - { - sec->contents = xmalloc(sec->header.sh_size); - gzf_lseek(fp, sec->header.sh_offset, SEEK_SET); - if (gzf_read(fp, sec->contents, sec->header.sh_size) != sec->header.sh_size) - { - error("error reading ELF section data: %m"); - return -1; - } - } - else - sec->contents = NULL; - break; - default: - error("Unknown section header type: %08x", sec->header.sh_type); - return -1; - } - return 0; -} - -int -arch_create_got(struct obj_file *f) -{ - hppa64_file_t *hfile = (hppa64_file_t *)f; - int i; - int n; - int got_offset = 0; - int opd_offset = 64; - int stub_offset = 0; - - n = hfile->root.header.e_shnum; - for (i = 0; i < n; ++i) - { - struct obj_section *relsec, *symsec, *strsec; - Elf64_Rela *rel, *relend; - Elf64_Sym *symtab; - const char *strtab; - - relsec = hfile->root.sections[i]; - if (relsec->header.sh_type != SHT_RELA) - continue; - - symsec = hfile->root.sections[relsec->header.sh_link]; - strsec = hfile->root.sections[symsec->header.sh_link]; - - rel = (Elf64_Rela *)relsec->contents; - relend = rel + (relsec->header.sh_size / sizeof(Elf64_Rela)); - symtab = (Elf64_Sym *)symsec->contents; - strtab = (const char *)strsec->contents; - - for (; rel < relend; ++rel) - { - int need_got = FALSE; - int need_opd = FALSE; - int need_stub = FALSE; - - switch (ELF64_R_TYPE(rel->r_info)) - { - default: - { - unsigned r_info = ELF64_R_TYPE(rel->r_info); - printf("r_info 0x%x not handled\n", r_info); - } - continue; - case R_PARISC_LTOFF14R: - case R_PARISC_LTOFF21L: - /* These are simple indirect references to symbols through the - * DLT. We need to create a DLT entry for any symbols which - * appears in a DLTIND relocation. - */ - need_got = TRUE; - break; - case R_PARISC_PCREL22F: - /* These are function calls. Depending on their precise - * target we may need to make a stub for them. The stub - * uses the dlt, so we need to create dlt entries for - * these symbols too. - */ - need_got = TRUE; - need_stub = TRUE; - break; - case R_PARISC_DIR64: - break; - case R_PARISC_FPTR64: - /* This is a simple OPD entry (only created for local symbols, - * see below). - */ - need_opd = TRUE; - break; - } - - if (need_got || need_opd || need_stub) - { - Elf64_Sym *extsym; - hppa64_symbol_t *isym; - const char *name; - int local; - unsigned long symndx; - - symndx = ELF64_R_SYM(rel->r_info); - extsym = &symtab[symndx]; - if (ELF64_ST_BIND(extsym->st_info) == STB_LOCAL) - { - isym = (hppa64_symbol_t *) f->local_symtab[symndx]; - } - else - { - if (extsym->st_name) - name = strtab + extsym->st_name; - else - name = f->sections[extsym->st_shndx]->name; - isym = (hppa64_symbol_t *)obj_find_symbol(f, name); - } - local = isym->root.secidx <= SHN_HIRESERVE; - - if (need_stub) - { - hppa64_stub_t *stub; - - for (stub = isym->stubent; stub != NULL; stub = stub->next) - if (stub->addend == rel->r_addend) - break; - if (stub == NULL) - { - stub = (hppa64_stub_t *) xmalloc(sizeof(hppa64_stub_t)); - stub->next = isym->stubent; - stub->addend = rel->r_addend; - stub->offset = stub_offset; - stub->reloc_done = FALSE; - isym->stubent = stub; - { - stub_offset += SIZEOF_STUB; - } - need_stub = FALSE; - } - } - if (need_got) - { - hppa64_got_t *got; - - for (got = isym->gotent; got != NULL; got = got->next) - if (got->addend == rel->r_addend) - break; - if (got == NULL) - { - got = (hppa64_got_t *) xmalloc(sizeof(hppa64_got_t)); - got->next = isym->gotent; - got->addend = rel->r_addend; - got->offset = got_offset; - got->reloc_done = FALSE; - isym->gotent = got; - got_offset += 8; - need_got = FALSE; - } - } - if (need_opd && local) - { - hppa64_opd_t *opd; - - if (isym->opdent == NULL) - { - opd = (hppa64_opd_t *) xmalloc(sizeof(hppa64_opd_t)); - opd->offset = opd_offset; - opd->reloc_done = FALSE; - isym->opdent = opd; - opd_offset += 32; - need_opd = FALSE; - } - } - } - } - } - - hfile->got = obj_hppa64_create_alloced_section(f, ".got", 8, got_offset, - (SHF_ALLOC | SHF_WRITE | SHF_PARISC_SHORT)); - assert(hfile->got != NULL); - - hfile->opd = obj_hppa64_create_alloced_section(f, ".opd", 16, opd_offset, - (SHF_ALLOC | SHF_WRITE | SHF_PARISC_SHORT)); - assert(hfile->opd != NULL); - - if (stub_offset > 0) - { - hfile->stub = obj_hppa64_create_alloced_section(f, ".stub", 16, - stub_offset, (SHF_ALLOC | SHF_EXECINSTR | SHF_PARISC_SHORT)); - assert(hfile->stub != NULL); - } - - return 1; -} - - -/* This is a small simple version which seems to work fine. ia64 has - * a much more complex algorithm. We point dp at the end of the .got, - * which is the start of the .opd. - */ - -int -arch_finalize_section_address(struct obj_file *f, Elf64_Addr base) -{ - hppa64_file_t *hfile = (hppa64_file_t *)f; - int n = f->header.e_shnum; - int i; - - f->baseaddr = base; - for (i = 0; i < n; ++i) - f->sections[i]->header.sh_addr += base; - - /* Pick a sensible value for gp */ - hfile->gp = hfile->got->header.sh_addr + hfile->got->header.sh_size; - - return 1; -} - - -enum obj_reloc -arch_apply_relocation(struct obj_file *f, - struct obj_section *targsec, - struct obj_section *symsec, - struct obj_symbol *sym, - Elf64_Rela *rel, - Elf64_Addr v) -{ - hppa64_file_t *hfile = (hppa64_file_t *) f; - hppa64_symbol_t *isym = (hppa64_symbol_t *) sym; - - Elf64_Word *loc = (Elf64_Word *)(targsec->contents + rel->r_offset); - Elf64_Addr dot = (targsec->header.sh_addr + rel->r_offset) & ~0x03; - - Elf64_Addr got = hfile->got->header.sh_addr; - Elf64_Addr gp = hfile->gp; - - Elf64_Xword r_info = ELF64_R_TYPE(rel->r_info); - - enum obj_reloc ret = obj_reloc_ok; - - switch (r_info) - { - default: - ret = obj_reloc_unhandled; - break; - case R_PARISC_LTOFF14R: - case R_PARISC_LTOFF21L: - { - hppa64_got_t *ge; - - assert(isym != NULL); - for (ge = isym->gotent; ge != NULL && ge->addend != rel->r_addend; ) - ge = ge->next; - assert(ge != NULL); - if (!ge->reloc_done) - { - ge->reloc_done = TRUE; - *(Elf64_Addr *)(hfile->got->contents + ge->offset) = v; - } - v = got + ge->offset - gp; - if (r_info == R_PARISC_LTOFF14R) - ret = patch_14r(v, loc); - else - ret = patch_21l(v, loc); - } - break; - case R_PARISC_PCREL22F: - { - hppa64_got_t *ge; - - assert(isym != NULL); - for (ge = isym->gotent; ge != NULL && ge->addend != rel->r_addend; ) - ge = ge->next; - assert(ge != NULL); - if (!ge->reloc_done) - { - ge->reloc_done = TRUE; - *(Elf64_Addr *)(hfile->got->contents + ge->offset) = v; - } - if ((isym->root.secidx > SHN_HIRESERVE) || - ((Elf64_Sxword) (v - dot - 8) > 0x800000-1) || - ((Elf64_Sxword) (v - dot - 8) < -0x800000)) - { - hppa64_stub_t *se; - - for (se = isym->stubent; se != NULL && se->addend != rel->r_addend; ) - se = se->next; - assert(se != NULL); - if (!se->reloc_done) - { - /* This requires that we can get from dp to the entry in +/- 8K, - * or +/- 1000 entries. patch_14r2() will check that. - * Only need these dlt entries for calls to external/far - * functions, so should probably put them in a seperate section - * before dlt and point dp at the section. Change to that - * scheme if we hit problems with big modules. - */ - unsigned char *stub; - - if (!strncmp(isym->root.name, "$$", 2)) - stub = hppa64_stub_millicode; - else - stub = hppa64_stub_extern; - se->reloc_done = TRUE; - memcpy((Elf64_Addr *)(hfile->stub->contents + se->offset), - stub, SIZEOF_STUB); - v = (Elf64_Addr)(hfile->got->header.sh_addr + ge->offset) - gp; - ret = patch_14r2(v, (Elf64_Word *)(hfile->stub->contents + se->offset)); - } - v = hfile->stub->header.sh_addr + se->offset; - } - v = v - dot - 8; - if (ret == obj_reloc_ok) - ret = patch_22f(v, loc); - } - break; - case R_PARISC_DIR64: - { - loc[0] = v >> 32; - loc[1] = v; - } - break; - case R_PARISC_FPTR64: - { - assert(isym != NULL); - if (isym->root.secidx <= SHN_HIRESERVE) /* local */ - { - assert(isym->opdent != NULL); - if (!isym->opdent->reloc_done) - { - isym->opdent->reloc_done = TRUE; - *(Elf64_Addr *)(hfile->opd->contents + isym->opdent->offset + 16) = v; - *(Elf64_Addr *)(hfile->opd->contents + isym->opdent->offset + 24) = gp; - } - v = hfile->opd->header.sh_addr + isym->opdent->offset; - } - loc[0] = v >> 32; - loc[1] = v; - } - break; - } - return ret; -} - -int -arch_init_module (struct obj_file *f, struct module *mod) -{ - hppa64_file_t *hfile = (hppa64_file_t *)f; - Elf64_Addr *opd = (Elf64_Addr *)(hfile->opd->contents); - - opd[0] = 0; - opd[1] = 0; - if ((opd[2] = mod->init) != 0) - { - opd[3] = hfile->gp; - mod->init = hfile->opd->header.sh_addr; - } - - opd[4] = 0; - opd[5] = 0; - if ((opd[6] = mod->cleanup) != 0) - { - opd[7] = hfile->gp; - mod->cleanup = hfile->opd->header.sh_addr + 32; - } - - return 1; -} - -/* XXX Is this relevant to parisc? */ - -int -arch_archdata (struct obj_file *f, struct obj_section *archdata_sec) -{ - hppa64_file_t *hfile = (hppa64_file_t *)f; - struct archdata { - unsigned tgt_long unw_table; - unsigned tgt_long segment_base; - unsigned tgt_long unw_start; - unsigned tgt_long unw_end; - unsigned tgt_long gp; - } *ad; - int i; - struct obj_section *sec; - - free(archdata_sec->contents); - archdata_sec->contents = xmalloc(sizeof(struct archdata)); - memset(archdata_sec->contents, 0, sizeof(struct archdata)); - archdata_sec->header.sh_size = sizeof(struct archdata); - - ad = (struct archdata *)(archdata_sec->contents); - ad->gp = hfile->gp; - ad->unw_start = 0; - ad->unw_end = 0; - ad->unw_table = 0; - ad->segment_base = f->sections[1]->header.sh_addr; - for (i = 0; i < f->header.e_shnum; ++i) - { - sec = f->sections[i]; - if (sec->header.sh_type == SHT_PARISC_UNWIND) - { - ad->unw_start = sec->header.sh_addr; - ad->unw_end = sec->header.sh_addr + sec->header.sh_size; - break; - } - } - - return 0; -} diff --git a/mdk-stage1/insmod-modutils/obj/obj_i386.c b/mdk-stage1/insmod-modutils/obj/obj_i386.c deleted file mode 100644 index 28df3448c..000000000 --- a/mdk-stage1/insmod-modutils/obj/obj_i386.c +++ /dev/null @@ -1,245 +0,0 @@ -/* i386 specific support for Elf loading and relocation. - Copyright 1996, 1997 Linux International. - - Contributed by Richard Henderson <rth@tamu.edu> - - This file is part of the Linux modutils. - - 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 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, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ident "$Id$" - -#include <string.h> -#include <assert.h> - -#include <module.h> -#include <obj.h> -#include <util.h> - - -/*======================================================================*/ - -struct i386_got_entry -{ - int offset; - unsigned offset_done : 1; - unsigned reloc_done : 1; -}; - -struct i386_file -{ - struct obj_file root; - struct obj_section *got; -}; - -struct i386_symbol -{ - struct obj_symbol root; - struct i386_got_entry gotent; -}; - - -/*======================================================================*/ - -struct obj_file * -arch_new_file (void) -{ - struct i386_file *f; - f = xmalloc(sizeof(*f)); - f->got = NULL; - return &f->root; -} - -struct obj_section * -arch_new_section (void) -{ - return xmalloc(sizeof(struct obj_section)); -} - -struct obj_symbol * -arch_new_symbol (void) -{ - struct i386_symbol *sym; - sym = xmalloc(sizeof(*sym)); - memset(&sym->gotent, 0, sizeof(sym->gotent)); - return &sym->root; -} - -int -arch_load_proc_section(struct obj_section *sec, int fp) -{ - /* Assume it's just a debugging section that we can safely - ignore ... */ - sec->contents = NULL; - - return 0; -} - -enum obj_reloc -arch_apply_relocation (struct obj_file *f, - struct obj_section *targsec, - struct obj_section *symsec, - struct obj_symbol *sym, - Elf32_Rel *rel, - Elf32_Addr v) -{ - struct i386_file *ifile = (struct i386_file *)f; - struct i386_symbol *isym = (struct i386_symbol *)sym; - - Elf32_Addr *loc = (Elf32_Addr *)(targsec->contents + rel->r_offset); - Elf32_Addr dot = targsec->header.sh_addr + rel->r_offset; - Elf32_Addr got = ifile->got ? ifile->got->header.sh_addr : 0; - - enum obj_reloc ret = obj_reloc_ok; - - switch (ELF32_R_TYPE(rel->r_info)) - { - case R_386_NONE: - break; - - case R_386_32: - *loc += v; - break; - - case R_386_PLT32: - case R_386_PC32: - *loc += v - dot; - break; - - case R_386_GLOB_DAT: - case R_386_JMP_SLOT: - *loc = v; - break; - - case R_386_RELATIVE: - *loc += f->baseaddr; - break; - - case R_386_GOTPC: - assert(got != 0); - *loc += got - dot; - break; - - case R_386_GOT32: - assert(isym != NULL); - if (!isym->gotent.reloc_done) - { - isym->gotent.reloc_done = 1; - *(Elf32_Addr *)(ifile->got->contents + isym->gotent.offset) = v; - } - *loc += isym->gotent.offset; - break; - - case R_386_GOTOFF: - assert(got != 0); - *loc += v - got; - break; - - default: - ret = obj_reloc_unhandled; - break; - } - - return ret; -} - -int -arch_create_got (struct obj_file *f) -{ - struct i386_file *ifile = (struct i386_file *)f; - int i, n, offset = 0, gotneeded = 0; - - n = ifile->root.header.e_shnum; - for (i = 0; i < n; ++i) - { - struct obj_section *relsec, *symsec, *strsec; - Elf32_Rel *rel, *relend; - Elf32_Sym *symtab; - const char *strtab; - - relsec = ifile->root.sections[i]; - if (relsec->header.sh_type != SHT_REL) - continue; - - symsec = ifile->root.sections[relsec->header.sh_link]; - strsec = ifile->root.sections[symsec->header.sh_link]; - - rel = (Elf32_Rel *)relsec->contents; - relend = rel + (relsec->header.sh_size / sizeof(Elf32_Rel)); - symtab = (Elf32_Sym *)symsec->contents; - strtab = (const char *)strsec->contents; - - for (; rel < relend; ++rel) - { - Elf32_Sym *extsym; - struct i386_symbol *intsym; - const char *name; - - switch (ELF32_R_TYPE(rel->r_info)) - { - case R_386_GOTPC: - case R_386_GOTOFF: - gotneeded = 1; - default: - continue; - - case R_386_GOT32: - break; - } - - extsym = &symtab[ELF32_R_SYM(rel->r_info)]; - if (extsym->st_name) - name = strtab + extsym->st_name; - else - name = f->sections[extsym->st_shndx]->name; - intsym = (struct i386_symbol *)obj_find_symbol(&ifile->root, name); - - if (!intsym->gotent.offset_done) - { - intsym->gotent.offset_done = 1; - intsym->gotent.offset = offset; - offset += 4; - } - } - } - - if (offset > 0 || gotneeded) - ifile->got = obj_create_alloced_section(&ifile->root, ".got", 4, offset); - - return 1; -} - -int -arch_init_module (struct obj_file *f, struct module *mod) -{ - return 1; -} - -int -arch_finalize_section_address(struct obj_file *f, Elf32_Addr base) -{ - int i, n = f->header.e_shnum; - - f->baseaddr = base; - for (i = 0; i < n; ++i) - f->sections[i]->header.sh_addr += base; - return 1; -} - -int -arch_archdata (struct obj_file *fin, struct obj_section *sec) -{ - return 0; -} diff --git a/mdk-stage1/insmod-modutils/obj/obj_ia64.c b/mdk-stage1/insmod-modutils/obj/obj_ia64.c deleted file mode 100644 index 4f92c5d27..000000000 --- a/mdk-stage1/insmod-modutils/obj/obj_ia64.c +++ /dev/null @@ -1,1065 +0,0 @@ -/* - * ia64 specific support for Elf loading and relocation. - * Copyright 2000 Mike Stephens <mike.stephens@intel.com> - * - * This file is part of the Linux modutils. - * - * 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 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, write to the Free Software Foundation, - * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#ident "$Id$" - -#include <string.h> -#include <assert.h> -#include <stdlib.h> - -#include <module.h> -#include <obj.h> -#include <util.h> - -#ifndef FALSE -#define FALSE 0 -#endif -#ifndef TRUE -#define TRUE ~FALSE -#endif - -/*======================================================================*/ - -typedef struct _ia64_opd_t -{ - int offset; - int reloc_done; -} ia64_opd_t; - -typedef struct _ia64_plt_t -{ - struct _ia64_plt_t *next; - Elf64_Addr addend; - int text_offset; - int data_offset; - int reloc_done; -} ia64_plt_t; - -typedef struct _ia64_got_t -{ - struct _ia64_got_t *next; - Elf64_Addr addend; - int offset; - int reloc_done; -} ia64_got_t; - -typedef struct _ia64_symbol_t -{ - struct obj_symbol root; - ia64_got_t *gotent; - ia64_opd_t *opdent; - ia64_plt_t *pltent; -} ia64_symbol_t; - -typedef struct _ia64_file_t -{ - struct obj_file root; - struct obj_section *got; - struct obj_section *opd; - struct obj_section *pltt; - struct obj_section *pltd; - Elf64_Addr gp; - Elf64_Addr text; - Elf64_Addr data; - Elf64_Addr bss; -} ia64_file_t; - -/* - * aa=gp rel address of the function descriptor in the .IA_64.pltoff section - */ -unsigned char ia64_plt_local[] = -{ - 0x0b, 0x78, 0x00, 0x02, 0x00, 0x24, /* [MMI] addl r15=aa,gp;; */ - 0x00, 0x41, 0x3c, 0x30, 0x28, 0xc0, /* ld8 r16=[r15],8 */ - 0x01, 0x08, 0x00, 0x84, /* mov r14=gp;; */ - 0x11, 0x08, 0x00, 0x1e, 0x18, 0x10, /* [MIB] ld8 gp=[r15] */ - 0x60, 0x80, 0x04, 0x80, 0x03, 0x00, /* mov b6=r16 */ - 0x60, 0x00, 0x80, 0x00 /* br.few b6;; */ -}; - -unsigned char ia64_plt_extern[] = -{ - 0x0b, 0x80, 0x00, 0x02, 0x00, 0x24, /* [MMI] addl r16=aa,gp;; */ - 0xf0, 0x00, 0x40, 0x30, 0x20, 0x00, /* ld8 r15=[r16] */ - 0x00, 0x00, 0x04, 0x00, /* nop.i 0x0;; */ - 0x0b, 0x80, 0x20, 0x1e, 0x18, 0x14, /* [MMI] ld8 r16=[r15],8;; */ - 0x10, 0x00, 0x3c, 0x30, 0x20, 0xc0, /* ld8 gp=[r15] */ - 0x00, 0x09, 0x00, 0x07, /* mov b6=r16;; */ - 0x11, 0x00, 0x00, 0x00, 0x01, 0x00, /* [MIB] nop.m 0x0 */ - 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, /* nop.i 0x0 */ - 0x60, 0x00, 0x80, 0x00 /* br.few b6;; */ -}; - -/*======================================================================*/ - -/* - * return the instruction at slot in bundle - */ -Elf64_Xword -obj_ia64_ins_extract_from_bundle(Elf64_Addr *bundle, Elf64_Xword slot) -{ - switch (slot) - { - case 0 : - return (*bundle >> 5) & 0x1ffffffffff; - - case 1 : - return (((*bundle >> 46) & 0x3ffff) | - (*(bundle + 1) << 18)) & 0x1ffffffffff; - - case 2 : - return (*(bundle + 1) >> 23) & 0x1ffffffffff; - - default: - } - return (-1); -} - -/* - * insert a instruction at slot in bundle - */ -void -obj_ia64_ins_insert_in_bundle(Elf64_Addr *bundle, Elf64_Xword slot, Elf64_Xword ins) -{ - Elf64_Xword i; - Elf64_Xword in = ins & 0x1ffffffffff; - - switch (slot) - { - case 0 : - i = *bundle & 0xffffc0000000001f; - *bundle = i | (in << 5); - break; - - case 1 : - i = *bundle & 0x00003fffffffffff; - *bundle = i | (in << 46); - - ++bundle; - i = *bundle & 0xffffffffff800000; - *bundle = i | (in >> 18); - break; - - case 2 : - ++bundle; - i = *bundle & 0x00000000007fffff; - *bundle = i | (in << 23); - break; - } -} - -/* - * add a immediate 14 value to the instruction at slot in bundle - */ -enum obj_reloc -obj_ia64_ins_imm14(Elf64_Xword v, Elf64_Addr *bundle, Elf64_Xword slot) -{ - Elf64_Xword ins; - - ins = obj_ia64_ins_extract_from_bundle(bundle, slot); - ins &= 0xffffffee07f01fff; - ins |= ((v & 0x2000) << 23) | ((v & 0x1f80) << 20) | ((v & 0x007f) << 13); - obj_ia64_ins_insert_in_bundle(bundle, slot, ins); - if (((Elf64_Sxword) v > 8191) || ((Elf64_Sxword) v < -8192)) - return obj_reloc_overflow; - return obj_reloc_ok; -} - -/* - * add a immediate 22 value to the instruction at slot in bundle - */ -enum obj_reloc -obj_ia64_ins_imm22(Elf64_Xword v, Elf64_Addr *bundle, Elf64_Xword slot) -{ - Elf64_Xword ins; - - ins = obj_ia64_ins_extract_from_bundle(bundle, slot); - ins &= 0xffffffe000301fff; - ins |= ((v & 0x200000) << 15) | ((v & 0x1f0000) << 6) | - ((v & 0x00ff80) << 20) | ((v & 0x00007f) << 13); - obj_ia64_ins_insert_in_bundle(bundle, slot, ins); - if (((Elf64_Sxword) v > 2097151) || ((Elf64_Sxword) v < -2097152)) - return obj_reloc_overflow; - return obj_reloc_ok; -} - -/* - * add a immediate 21 value (form 1) to the instruction at slot in bundle - */ -enum obj_reloc -obj_ia64_ins_pcrel21b(Elf64_Xword v, Elf64_Addr *bundle, Elf64_Xword slot) -{ - Elf64_Xword ins; - - ins = obj_ia64_ins_extract_from_bundle(bundle, slot); - ins &= 0xffffffee00001fff; - ins |= ((v & 0x1000000) << 12) | ((v & 0x0fffff0) << 9); - obj_ia64_ins_insert_in_bundle(bundle, slot, ins); - return obj_reloc_ok; -} - -/* - * add a immediate 21 value (form 2) to the instruction at slot in bundle - */ -enum obj_reloc -obj_ia64_ins_pcrel21m(Elf64_Xword v, Elf64_Addr *bundle, Elf64_Xword slot) -{ - Elf64_Xword ins; - - ins = obj_ia64_ins_extract_from_bundle(bundle, slot); - ins &= 0xffffffee000fe03f; - ins |= ((v & 0x1000000) << 12) | ((v & 0x0fff800) << 9) | - ((v & 0x00007f0) << 2); - obj_ia64_ins_insert_in_bundle(bundle, slot, ins); - return obj_reloc_ok; -} - -/* - * add a immediate 21 value (form 3) to the instruction at slot in bundle - */ -enum obj_reloc -obj_ia64_ins_pcrel21f(Elf64_Xword v, Elf64_Addr *bundle, Elf64_Xword slot) -{ - Elf64_Xword ins; - - ins = obj_ia64_ins_extract_from_bundle(bundle, slot); - ins &= 0xffffffeffc00003f; - ins |= ((v & 0x1000000) << 12) | ((v & 0x0fffff0) << 2); - obj_ia64_ins_insert_in_bundle(bundle, slot, ins); - return obj_reloc_ok; -} - -/* - * add a immediate 64 value to the instruction at slot in bundle - */ -enum obj_reloc -obj_ia64_ins_imm64(Elf64_Xword v, Elf64_Addr *bundle, Elf64_Xword slot) -{ - Elf64_Xword ins; - - assert(slot == 1); - ins = obj_ia64_ins_extract_from_bundle(bundle, slot); - ins &= 0xffffffee000101ff; - ins |= ((v & 0x8000000000000000) >> 28) | ((v & 0x0000000000200000)) | - ((v & 0x00000000001f0000) << 6) | ((v & 0x000000000000ff80) << 20) | - ((v & 0x000000000000007f) << 13); - obj_ia64_ins_insert_in_bundle(bundle, slot, ins); - obj_ia64_ins_insert_in_bundle(bundle, ++slot, ((v & 0x7fffffffffc00000) >> 22)); - return obj_reloc_ok; -} - -/* - * create a plt entry - */ -enum obj_reloc -obj_ia64_generate_plt(Elf64_Addr v, - Elf64_Addr gp, - ia64_file_t *ifile, - ia64_symbol_t *isym, - ia64_plt_t *pltent) -{ - *(Elf64_Addr *)(ifile->pltd->contents + pltent->data_offset) = v; - if (isym->root.secidx <= SHN_HIRESERVE) - { - /* local entry */ - *(Elf64_Addr *)(ifile->pltd->contents + pltent->data_offset + 8) = gp; - memcpy((Elf64_Addr *)(ifile->pltt->contents + pltent->text_offset), - ia64_plt_local, sizeof(ia64_plt_local)); - } - else - { - /* external entry */ - memcpy((Elf64_Addr *)(ifile->pltt->contents + pltent->text_offset), - ia64_plt_extern, sizeof(ia64_plt_extern)); - } - return obj_ia64_ins_imm22( - (ifile->pltd->header.sh_addr + pltent->data_offset - gp), - (Elf64_Addr *)(ifile->pltt->contents + pltent->text_offset), 0); -} - -struct obj_section * -obj_ia64_create_alloced_section (struct obj_file *f, const char *name, - unsigned long align, unsigned long size, unsigned long sh_flags) -{ - int newidx = f->header.e_shnum++; - struct obj_section *sec; - - f->sections = xrealloc(f->sections, (newidx+1) * sizeof(sec)); - f->sections[newidx] = sec = arch_new_section(); - - memset(sec, 0, sizeof(*sec)); - sec->header.sh_type = SHT_PROGBITS; - sec->header.sh_flags = sh_flags; - sec->header.sh_size = size; - sec->header.sh_addralign = align; - sec->name = name; - sec->idx = newidx; - if (size) - sec->contents = xmalloc(size); - - obj_insert_section_load_order(f, sec); - - return sec; -} - -/*======================================================================*/ - -struct obj_file * -arch_new_file (void) -{ - ia64_file_t *f; - f = xmalloc(sizeof(*f)); - f->got = NULL; - f->opd = NULL; - f->pltt = NULL; - f->pltd = NULL; - return &f->root; -} - -struct obj_section * -arch_new_section (void) -{ - return xmalloc(sizeof(struct obj_section)); -} - -struct obj_symbol * -arch_new_symbol (void) -{ - ia64_symbol_t *sym; - sym = xmalloc(sizeof(*sym)); - sym->gotent = NULL; - sym->opdent = NULL; - sym->pltent = NULL; - return &sym->root; -} - -int -arch_load_proc_section(struct obj_section *sec, int fp) -{ - switch (sec->header.sh_type) - { - case SHT_IA_64_EXT : - sec->contents = NULL; - break; - - case SHT_IA_64_UNWIND : - if (sec->header.sh_size > 0) - { - sec->contents = xmalloc(sec->header.sh_size); - gzf_lseek(fp, sec->header.sh_offset, SEEK_SET); - if (gzf_read(fp, sec->contents, sec->header.sh_size) != sec->header.sh_size) - { - error("error reading ELF section data: %m"); - return -1; - } - } - else - sec->contents = NULL; - break; - - default: - error("Unknown section header type: %08x", sec->header.sh_type); - return -1; - } - return 0; -} - -int -arch_create_got(struct obj_file *f) -{ - ia64_file_t *ifile = (ia64_file_t *)f; - int i; - int n; - int got_offset = 0; - int opd_offset = 32; - int plt_text_offset = 0; - int plt_data_offset = 0; - - n = ifile->root.header.e_shnum; - for (i = 0; i < n; ++i) - { - struct obj_section *relsec, *symsec, *strsec; - Elf64_Rela *rel, *relend; - Elf64_Sym *symtab; - const char *strtab; - - relsec = ifile->root.sections[i]; - if (relsec->header.sh_type != SHT_RELA) - continue; - - symsec = ifile->root.sections[relsec->header.sh_link]; - strsec = ifile->root.sections[symsec->header.sh_link]; - - rel = (Elf64_Rela *)relsec->contents; - relend = rel + (relsec->header.sh_size / sizeof(Elf64_Rela)); - symtab = (Elf64_Sym *)symsec->contents; - strtab = (const char *)strsec->contents; - - for (; rel < relend; ++rel) - { - int need_got = FALSE; - int need_opd = FALSE; - int need_plt = FALSE; - - switch (ELF64_R_TYPE(rel->r_info)) - { - default: - continue; - - case R_IA64_FPTR64I : /* @fptr(sym + add), mov imm64 */ - case R_IA64_FPTR32LSB : /* @fptr(sym + add), data4 LSB */ - case R_IA64_FPTR64LSB : /* @fptr(sym + add), data8 LSB */ - need_opd = TRUE; - break; - - case R_IA64_LTOFF22 : /* @ltoff(sym + add), add imm22 */ - case R_IA64_LTOFF22X : - case R_IA64_LTOFF64I : /* @ltoff(sym + add), mov imm64 */ - need_got = TRUE; - break; - - case R_IA64_LTOFF_FPTR22 : /* @ltoff(@fptr(s+a)), imm22 */ - case R_IA64_LTOFF_FPTR64I : /* @ltoff(@fptr(s+a)), imm64 */ - case R_IA64_LTOFF_FPTR32LSB : - case R_IA64_LTOFF_FPTR64LSB : - need_got = TRUE; - need_opd = TRUE; - break; - - case R_IA64_PLTOFF22 : /* @pltoff(sym + add), add imm22 */ - case R_IA64_PLTOFF64I : /* @pltoff(sym + add), mov imm64 */ - case R_IA64_PLTOFF64LSB : /* @pltoff(sym + add), data8 LSB */ - - case R_IA64_PCREL21B : /* @pcrel(sym + add), ptb, call */ - case R_IA64_PCREL21M : /* @pcrel(sym + add), chk.s */ - case R_IA64_PCREL21F : /* @pcrel(sym + add), fchkf */ - need_plt = TRUE; - break; - } - - if (need_got || need_opd || need_plt) - { - Elf64_Sym *extsym; - ia64_symbol_t *isym; - const char *name; - int local; - unsigned long symndx; - - symndx = ELF64_R_SYM(rel->r_info); - extsym = &symtab[symndx]; - if (ELF64_ST_BIND(extsym->st_info) == STB_LOCAL) - { - isym = (ia64_symbol_t *) f->local_symtab[symndx]; - } - else - { - if (extsym->st_name) - name = strtab + extsym->st_name; - else - name = f->sections[extsym->st_shndx]->name; - isym = (ia64_symbol_t *)obj_find_symbol(f, name); - } - local = isym->root.secidx <= SHN_HIRESERVE; - - if (need_plt) - { - ia64_plt_t *plt; - - for (plt = isym->pltent; plt != NULL; plt = plt->next) - if (plt->addend == rel->r_addend) - break; - if (plt == NULL) - { - plt = (ia64_plt_t *) xmalloc(sizeof(ia64_plt_t)); - plt->next = isym->pltent; - plt->addend = rel->r_addend; - plt->text_offset = plt_text_offset; - plt->data_offset = plt_data_offset; - plt->reloc_done = FALSE; - isym->pltent = plt; - if (local) - { - plt_text_offset += sizeof(ia64_plt_local); - plt_data_offset += 16; - } - else - { - plt_text_offset += sizeof(ia64_plt_extern); - plt_data_offset += 8; - } - need_plt = FALSE; - } - } - if (need_got) - { - ia64_got_t *got; - - for (got = isym->gotent; got != NULL; got = got->next) - if (got->addend == rel->r_addend) - break; - if (got == NULL) - { - got = (ia64_got_t *) xmalloc(sizeof(ia64_got_t)); - got->next = isym->gotent; - got->addend = rel->r_addend; - got->offset = got_offset; - got->reloc_done = FALSE; - isym->gotent = got; - got_offset += 8; - need_got = FALSE; - } - } - if (need_opd && local) - { - ia64_opd_t *opd; - - if (isym->opdent == NULL) - { - opd = (ia64_opd_t *) xmalloc(sizeof(ia64_opd_t)); - opd->offset = opd_offset; - opd->reloc_done = FALSE; - isym->opdent = opd; - opd_offset += 16; - need_opd = FALSE; - } - } - } - } - } - - ifile->got = obj_ia64_create_alloced_section(f, ".got", 8, got_offset, - (SHF_ALLOC | SHF_WRITE | SHF_IA_64_SHORT)); - assert(ifile->got != NULL); - - ifile->opd = obj_ia64_create_alloced_section(f, ".opd", 16, opd_offset, - (SHF_ALLOC | SHF_WRITE | SHF_IA_64_SHORT)); - assert(ifile->opd != NULL); - - if (plt_text_offset > 0) - { - ifile->pltt = obj_ia64_create_alloced_section(f, ".plt", 16, - plt_text_offset, (SHF_ALLOC | SHF_EXECINSTR | SHF_IA_64_SHORT)); - ifile->pltd = obj_ia64_create_alloced_section(f, ".IA_64.pltoff", - 16, plt_data_offset, (SHF_ALLOC | SHF_WRITE | SHF_IA_64_SHORT)); - assert(ifile->pltt != NULL); - assert(ifile->pltd != NULL); - } - - return 1; -} - -int -arch_finalize_section_address(struct obj_file *f, Elf64_Addr base) -{ - ia64_file_t *ifile = (ia64_file_t *)f; - Elf64_Addr min_addr = (Elf64_Addr) -1; - Elf64_Addr max_addr = 0; - Elf64_Addr min_short_addr = (Elf64_Addr) -1; - Elf64_Addr max_short_addr = 0; - Elf64_Addr gp; - Elf64_Addr text = (Elf64_Addr) -1; - Elf64_Addr data = (Elf64_Addr) -1; - Elf64_Addr bss = (Elf64_Addr) -1; - int n = f->header.e_shnum; - int i; - - /* - * Finalize the addresses of the sections, find the min and max - * address of all sections marked short, and collect min and max - * address of any type, for use in selecting a nice gp. - * - * The algorithm used for selecting set the GP value was taken from - * the ld/bfd code contributed by David Mosberger-Tang <davidm@hpl.hp.com> - */ - f->baseaddr = base; - for (i = 0; i < n; ++i) - { - Elf64_Shdr *header = &f->sections[i]->header; - Elf64_Addr lo; - Elf64_Addr hi; - - header->sh_addr += base; - if (header->sh_flags & SHF_ALLOC) - { - lo = header->sh_addr; - hi = header->sh_addr + header->sh_size; - if (hi < lo) - hi = (Elf64_Addr) -1; - - if (min_addr > lo) - min_addr = lo; - if (max_addr < hi) - max_addr = hi; - if (header->sh_flags & SHF_IA_64_SHORT) - { - if (min_short_addr > lo) - min_short_addr = lo; - if (max_short_addr < hi) - max_short_addr = hi; - } - if ((header->sh_type & SHT_NOBITS) && (lo < bss)) - bss = lo; - else if ((header->sh_flags & SHF_EXECINSTR) && (lo < text)) - text = lo; - else if (lo < data) - data = lo; - } - } - /* Pick a sensible value for gp */ - - /* Start with just the address of the .got */ - gp = ifile->got->header.sh_addr; - - /* - * If it is possible to address the entire image, but we - * don't with the choice above, adjust. - */ - if ((max_addr - min_addr < 0x400000) && (max_addr - gp <= 0x200000) && - (gp - min_addr > 0x200000)) - { - gp = min_addr + 0x200000; - } - else if (max_short_addr != 0) - { - /* If we don't cover all the short data, adjust */ - if (max_short_addr - gp >= 0x200000) - gp = min_short_addr + 0x200000; - - /* If we're addressing stuff past the end, adjust back */ - if (gp > max_addr) - gp = max_addr - 0x200000 + 8; - } - - /* - * Validate whether all SHF_IA_64_SHORT sections are within - * range of the chosen GP. - */ - if (max_short_addr != 0) - { - if (max_short_addr - min_short_addr >= 0x400000) - { - error("short data segment overflowed (0x%lx >= 0x400000)", - (unsigned long)(max_short_addr - min_short_addr)); - return 0; - } - else if (((gp > min_short_addr) && (gp - min_short_addr > 0x200000)) || - ((gp < max_short_addr) && (max_short_addr - gp >= 0x200000))) - { - error("GP does not cover short data segment"); - return 0; - } - } - ifile->gp = gp; - ifile->text = text; - ifile->data = data; - ifile->bss = bss; - return 1; -} - -/* Targets can be unaligned, use memcpy instead of assignment */ -#define COPY_64LSB(loc, v) \ - do { \ - Elf64_Xword reloc = (v); \ - memcpy((void *)(loc), &reloc, 8); \ - } while(0) -#define COPY_32LSB(loc, v) \ - do { \ - Elf32_Xword reloc = (v); \ - memcpy((void *)(loc), &reloc, 4); \ - if ((v) != reloc) \ - ret = obj_reloc_overflow; \ - } while(0) - -enum obj_reloc -arch_apply_relocation(struct obj_file *f, - struct obj_section *targsec, - struct obj_section *symsec, - struct obj_symbol *sym, - Elf64_Rela *rel, - Elf64_Addr v) -{ - ia64_file_t *ifile = (ia64_file_t *) f; - ia64_symbol_t *isym = (ia64_symbol_t *) sym; - - Elf64_Addr loc = (Elf64_Addr)(targsec->contents + rel->r_offset); - Elf64_Addr dot = (targsec->header.sh_addr + rel->r_offset) & ~0x03; - - Elf64_Addr got = ifile->got->header.sh_addr; - Elf64_Addr gp = ifile->gp; - - Elf64_Addr *bundle = (Elf64_Addr *)(loc & ~0x03); - Elf64_Xword slot = loc & 0x03; - - Elf64_Xword r_info = ELF64_R_TYPE(rel->r_info); - - enum obj_reloc ret = obj_reloc_ok; - - /* We cannot load modules compiled with -mconstant-gp */ -#ifndef EF_IA_64_CONS_GP -#define EF_IA_64_CONS_GP 0x00000040 -#endif -#ifndef EF_IA_64_NOFUNCDESC_CONS_GP -#define EF_IA_64_NOFUNCDESC_CONS_GP 0x00000080 -#endif - if (f->header.e_flags & (EF_IA_64_CONS_GP | EF_IA_64_NOFUNCDESC_CONS_GP)) - return obj_reloc_constant_gp; - - switch (r_info) - { - case R_IA64_NONE : /* none */ - case R_IA64_LDXMOV : /* Use of LTOFF22X. */ - break; - - case R_IA64_IMM14 : /* symbol + addend, add imm14 */ - ret = obj_ia64_ins_imm14(v, bundle, slot); - break; - - case R_IA64_IMM22 : /* symbol + addend, add imm22 */ - ret = obj_ia64_ins_imm22(v, bundle, slot); - break; - - case R_IA64_IMM64 : /* symbol + addend, movl imm64 */ - ret = obj_ia64_ins_imm64(v, bundle, slot); - break; - - case R_IA64_DIR32LSB : /* symbol + addend, data4 LSB */ - COPY_32LSB(loc, v); - break; - - case R_IA64_DIR64LSB : /* symbol + addend, data8 LSB */ - COPY_64LSB(loc, v); - break; - - case R_IA64_GPREL22 : /* @gprel(sym + add), add imm22 */ - v -= gp; - ret = obj_ia64_ins_imm22(v, bundle, slot); - break; - - case R_IA64_GPREL64I : /* @gprel(sym + add), mov imm64 */ - v -= gp; - ret = obj_ia64_ins_imm64(v, bundle, slot); - break; - - case R_IA64_GPREL32LSB : /* @gprel(sym + add), data4 LSB */ - COPY_32LSB(loc, v-gp); - break; - - case R_IA64_GPREL64LSB : /* @gprel(sym + add), data8 LSB */ - COPY_64LSB(loc, v-gp); - break; - - case R_IA64_LTOFF22 : /* @ltoff(sym + add), add imm22 */ - case R_IA64_LTOFF22X : /* LTOFF22, relaxable. */ - case R_IA64_LTOFF64I : /* @ltoff(sym + add), mov imm64 */ - { - ia64_got_t *ge; - - assert(isym != NULL); - for (ge = isym->gotent; ge != NULL && ge->addend != rel->r_addend; ) - ge = ge->next; - assert(ge != NULL); - if (!ge->reloc_done) - { - ge->reloc_done = TRUE; - *(Elf64_Addr *)(ifile->got->contents + ge->offset) = v; - } - v = got + ge->offset - gp; - if (r_info == R_IA64_LTOFF64I) - ret = obj_ia64_ins_imm64(v, bundle, slot); - else - ret = obj_ia64_ins_imm22(v, bundle, slot); - } - break; - - case R_IA64_PLTOFF22 : /* @pltoff(sym + add), add imm22 */ - case R_IA64_PLTOFF64I : /* @pltoff(sym + add), mov imm64 */ - case R_IA64_PLTOFF64LSB : /* @pltoff(sym + add), data8 LSB */ - { - ia64_plt_t *pe; - - assert(isym != NULL); - for (pe = isym->pltent; pe != NULL && pe->addend != rel->r_addend; ) - pe = pe->next; - assert(pe != NULL); - if (!pe->reloc_done) - { - pe->reloc_done = TRUE; - ret = obj_ia64_generate_plt(v, gp, ifile, isym, pe); - } - v = ifile->pltt->header.sh_addr + pe->text_offset - gp; - switch (r_info) - { - case R_IA64_PLTOFF22 : - ret = obj_ia64_ins_imm22(v, bundle, slot); - break; - - case R_IA64_PLTOFF64I : - ret = obj_ia64_ins_imm64(v, bundle, slot); - break; - - case R_IA64_PLTOFF64LSB : - COPY_64LSB(loc, v); - break; - } - } - break; - - case R_IA64_FPTR64I : /* @fptr(sym + add), mov imm64 */ - case R_IA64_FPTR32LSB : /* @fptr(sym + add), data4 LSB */ - case R_IA64_FPTR64LSB : /* @fptr(sym + add), data8 LSB */ - assert(isym != NULL); - if (isym->root.secidx <= SHN_HIRESERVE) - { - assert(isym->opdent != NULL); - if (!isym->opdent->reloc_done) - { - isym->opdent->reloc_done = TRUE; - *(Elf64_Addr *)(ifile->opd->contents + isym->opdent->offset) = v; - *(Elf64_Addr *)(ifile->opd->contents + isym->opdent->offset + 8) = gp; - } - v = ifile->opd->header.sh_addr + isym->opdent->offset; - } - switch (r_info) - { - case R_IA64_FPTR64I : - ret = obj_ia64_ins_imm64(v, bundle, slot); - break; - - case R_IA64_FPTR32LSB : - COPY_32LSB(loc, v); - break; - - case R_IA64_FPTR64LSB : /* @fptr(sym + add), data8 LSB */ - /* Target can be unaligned */ - COPY_64LSB(loc, v); - break; - } - break; - - case R_IA64_PCREL21B : /* @pcrel(sym + add), ptb, call */ - case R_IA64_PCREL21M : /* @pcrel(sym + add), chk.s */ - case R_IA64_PCREL21F : /* @pcrel(sym + add), fchkf */ - assert(isym != NULL); - if ((isym->root.secidx > SHN_HIRESERVE) || - ((Elf64_Sxword) (v - dot) > 16777215) || - ((Elf64_Sxword) (v - dot) < -16777216)) - { - ia64_plt_t *pe; - - for (pe = isym->pltent; pe != NULL && pe->addend != rel->r_addend; ) - pe = pe->next; - assert(pe != NULL); - if (!pe->reloc_done) - { - pe->reloc_done = TRUE; - ret = obj_ia64_generate_plt(v, gp, ifile, isym, pe); - } - v = ifile->pltt->header.sh_addr + pe->text_offset; - } - v -= dot; - switch (r_info) - { - case R_IA64_PCREL21B : - ret = obj_ia64_ins_pcrel21b(v, bundle, slot); - break; - - case R_IA64_PCREL21M : - ret = obj_ia64_ins_pcrel21m(v, bundle, slot); - break; - - case R_IA64_PCREL21F : - ret = obj_ia64_ins_pcrel21f(v, bundle, slot); - break; - } - break; - - case R_IA64_PCREL32LSB : /* @pcrel(sym + add), data4 LSB */ - COPY_32LSB(loc, v-dot); - break; - - case R_IA64_PCREL64LSB : /* @pcrel(sym + add), data8 LSB */ - COPY_64LSB(loc, v-dot); - break; - - case R_IA64_LTOFF_FPTR22 : /* @ltoff(@fptr(s+a)), imm22 */ - case R_IA64_LTOFF_FPTR64I : /* @ltoff(@fptr(s+a)), imm64 */ - case R_IA64_LTOFF_FPTR32LSB : /* @ltoff(@fptr(s+a)), data4 */ - case R_IA64_LTOFF_FPTR64LSB : /* @ltoff(@fptr(s+a)), data8 */ - { - ia64_got_t *ge; - - assert(isym != NULL); - if (isym->root.secidx <= SHN_HIRESERVE) - { - assert(isym->opdent != NULL); - if (!isym->opdent->reloc_done) - { - isym->opdent->reloc_done = TRUE; - *(Elf64_Addr *)(ifile->opd->contents + isym->opdent->offset) = v; - *(Elf64_Addr *)(ifile->opd->contents + isym->opdent->offset + 8) = gp; - } - v = ifile->opd->header.sh_addr + isym->opdent->offset; - } - for (ge = isym->gotent; ge != NULL && ge->addend != rel->r_addend; ) - ge = ge->next; - assert(ge != NULL); - if (!ge->reloc_done) - { - ge->reloc_done = TRUE; - *(Elf64_Addr *)(ifile->got->contents + ge->offset) = v; - } - v = got + ge->offset - gp; - switch (r_info) - { - case R_IA64_LTOFF_FPTR22 : - ret = obj_ia64_ins_imm22(v, bundle, slot); - break; - - case R_IA64_LTOFF_FPTR64I : - ret = obj_ia64_ins_imm64(v, bundle, slot); - break; - - case R_IA64_LTOFF_FPTR32LSB : - COPY_32LSB(loc, v); - break; - - case R_IA64_LTOFF_FPTR64LSB : - COPY_64LSB(loc, v); - break; - } - } - break; - - case R_IA64_SEGREL32LSB : /* @segrel(sym + add), data4 LSB */ - case R_IA64_SEGREL64LSB : /* @segrel(sym + add), data8 LSB */ - if (targsec->header.sh_type & SHT_NOBITS) - v = ifile->bss - v; - else if (targsec->header.sh_flags & SHF_EXECINSTR) - v = ifile->text - v; - else - v = ifile->data - v; - if (r_info == R_IA64_SEGREL32LSB) - COPY_32LSB(loc, v); - else - COPY_64LSB(loc, v); - break; - - case R_IA64_SECREL32LSB : /* @secrel(sym + add), data4 LSB */ - COPY_32LSB(loc, targsec->header.sh_addr - v); - break; - - case R_IA64_SECREL64LSB : /* @secrel(sym + add), data8 LSB */ - COPY_64LSB(loc, targsec->header.sh_addr - v); - break; - - /* - * We don't handle the big-endian relocates - * - * R_IA64_DIR32MSB symbol + addend, data4 MSB - * R_IA64_DIR64MSB symbol + addend, data8 MSB - * R_IA64_GPREL32MSB @gprel(sym + add), data4 MSB - * R_IA64_GPREL64MSB @gprel(sym + add), data8 MSB - * R_IA64_PLTOFF64MSB @pltoff(sym + add), data8 MSB - * R_IA64_FPTR32MSB @fptr(sym + add), data4 MSB - * R_IA64_FPTR64MSB @fptr(sym + add), data8 MSB - * R_IA64_PCREL32MSB @pcrel(sym + add), data4 MSB - * R_IA64_PCREL64MSB @pcrel(sym + add), data8 MSB - * R_IA64_SEGREL32MSB @segrel(sym + add), data4 MSB - * R_IA64_SEGREL64MSB @segrel(sym + add), data8 MSB - * R_IA64_SECREL32MSB @secrel(sym + add), data4 MSB - * R_IA64_SECREL64MSB @secrel(sym + add), data8 MSB - * R_IA64_REL32MSB data 4 + REL - * R_IA64_REL64MSB data 8 + REL - * R_IA64_LTV32MSB symbol + addend, data4 MSB - * R_IA64_LTV64MSB symbol + addend, data8 MSB - * R_IA64_IPLTMSB dynamic reloc, imported PLT, MSB - */ - default: - case R_IA64_REL32LSB : /* data 4 + REL */ - case R_IA64_REL64LSB : /* data 8 + REL */ - case R_IA64_LTV32LSB : /* symbol + addend, data4 LSB */ - case R_IA64_LTV64LSB : /* symbol + addend, data8 LSB */ - case R_IA64_IPLTLSB : /* dynamic reloc, imported PLT, LSB */ - ret = obj_reloc_unhandled; - break; - } - return ret; -} - -int -arch_init_module (struct obj_file *f, struct module *mod) -{ - ia64_file_t *ifile = (ia64_file_t *)f; - Elf64_Addr *opd = (Elf64_Addr *)(ifile->opd->contents); - - if ((opd[0] = mod->init) != 0) - { - opd[1] = ifile->gp; - mod->init = ifile->opd->header.sh_addr; - } - - if ((opd[2] = mod->cleanup) != 0) - { - opd[3] = ifile->gp; - mod->cleanup = ifile->opd->header.sh_addr + 16; - } - - return 1; -} - -int -arch_archdata (struct obj_file *f, struct obj_section *archdata_sec) -{ - ia64_file_t *ifile = (ia64_file_t *)f; - struct archdata { - unsigned tgt_long unw_table; - unsigned tgt_long segment_base; - unsigned tgt_long unw_start; - unsigned tgt_long unw_end; - unsigned tgt_long gp; - } *ad; - int i; - struct obj_section *sec; - - free(archdata_sec->contents); - archdata_sec->contents = xmalloc(sizeof(struct archdata)); - memset(archdata_sec->contents, 0, sizeof(struct archdata)); - archdata_sec->header.sh_size = sizeof(struct archdata); - - ad = (struct archdata *)(archdata_sec->contents); - ad->gp = ifile->gp; - ad->unw_start = 0; - ad->unw_end = 0; - ad->unw_table = 0; - ad->segment_base = f->sections[1]->header.sh_addr; - for (i = 0; i < f->header.e_shnum; ++i) - { - sec = f->sections[i]; - if (sec->header.sh_type == SHT_IA_64_UNWIND) - { - ad->unw_start = sec->header.sh_addr; - ad->unw_end = sec->header.sh_addr + sec->header.sh_size; - break; - } - } - - return 0; -} diff --git a/mdk-stage1/insmod-modutils/obj/obj_kallsyms.c b/mdk-stage1/insmod-modutils/obj/obj_kallsyms.c deleted file mode 100644 index 8385fb892..000000000 --- a/mdk-stage1/insmod-modutils/obj/obj_kallsyms.c +++ /dev/null @@ -1,292 +0,0 @@ -/* Build a section containing all non-stack symbols. - Copyright 2000 Keith Owens <kaos@ocs.com.au> - - This file is part of the Linux modutils. - - 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 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, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ident "$Id$" - -#include <stdlib.h> -#include <string.h> -#include <malloc.h> - -#include "obj.h" -#include "kallsyms.h" -#include "util.h" - -/*======================================================================*/ - -#define EXPAND_BY 4096 /* Arbitrary */ - -/* Append a string to the big list of strings */ - -static void -append_string (const char *s, char **strings, - ElfW(Word) *strings_size, ElfW(Word) *strings_left) -{ - int l = strlen(s) + 1; - while (l > *strings_left) { - *strings = xrealloc(*strings, *strings_size += EXPAND_BY); - *strings_left += EXPAND_BY; - } - memcpy((char *)*strings+*strings_size-*strings_left, s, l); - *strings_left -= l; -} - - -/* Append a symbol to the big list of symbols */ - -static void -append_symbol (const struct kallsyms_symbol *s, - struct kallsyms_symbol **symbols, - ElfW(Word) *symbols_size, ElfW(Word) *symbols_left) -{ - int l = sizeof(*s); - while (l > *symbols_left) { - *symbols = xrealloc(*symbols, *symbols_size += EXPAND_BY); - *symbols_left += EXPAND_BY; - } - memcpy((char *)*symbols+*symbols_size-*symbols_left, s, l); - *symbols_left -= l; -} - -/* qsort compare routine to sort symbols */ - -static const char *sym_strings; - -static int -symbol_compare (const void *a, const void *b) -{ - struct kallsyms_symbol *c = (struct kallsyms_symbol *) a; - struct kallsyms_symbol *d = (struct kallsyms_symbol *) b; - - if (c->symbol_addr > d->symbol_addr) - return(1); - if (c->symbol_addr < d->symbol_addr) - return(-1); - return(strcmp(sym_strings+c->name_off, sym_strings+d->name_off)); -} - - -/* Extract all symbols from the input obj_file, ignore ones that are - * no use for debugging, build an output obj_file containing only the - * kallsyms section. - * - * The kallsyms section is a bit unusual. It deliberately has no - * relocatable data, all "pointers" are represented as byte offsets - * into the the section. This means it can be stored anywhere without - * relocation problems. In particular it can be stored within a kernel - * image, it can be stored separately from the kernel image, it can be - * appended to a module just before loading, it can be stored in a - * separate area etc. - * - * Format of the kallsyms section. - * - * Header: - * Size of header. - * Total size of kallsyms data, including strings. - * Number of loaded sections. - * Offset to first section entry from start of header. - * Size of each section entry, excluding the name string. - * Number of symbols. - * Offset to first symbol entry from start of header. - * Size of each symbol entry, excluding the name string. - * - * Section entry - one per loaded section. - * Start of section[1]. - * Size of section. - * Offset to name of section, from start of strings. - * Section flags. - * - * Symbol entry - one per symbol in the input file[2]. - * Offset of section that owns this symbol, from start of section data. - * Address of symbol within the real section[1]. - * Offset to name of symbol, from start of strings. - * - * Notes: [1] This is an exception to the "represent pointers as - * offsets" rule, it is a value, not an offset. The start - * address of a section or a symbol is extracted from the - * obj_file data which may contain absolute or relocatable - * addresses. If the addresses are relocatable then the - * caller must adjust the section and/or symbol entries in - * kallsyms after relocation. - * [2] Only symbols that fall within loaded sections are stored. - */ - -int -obj_kallsyms (struct obj_file *fin, struct obj_file **fout_result) -{ - struct obj_file *fout; - int i, loaded = 0, *fin_to_allsym_map; - struct obj_section *isec, *osec; - struct kallsyms_header *a_hdr; - struct kallsyms_section *a_sec; - ElfW(Off) sec_off; - struct kallsyms_symbol *symbols = NULL, a_sym; - ElfW(Word) symbols_size = 0, symbols_left = 0; - char *strings = NULL, *p; - ElfW(Word) strings_size = 0, strings_left = 0; - ElfW(Off) file_offset; - static char strtab[] = "\000" KALLSYMS_SEC_NAME; - - /* Create the kallsyms section. */ - fout = arch_new_file(); - memset(fout, 0, sizeof(*fout)); - fout->symbol_cmp = strcmp; - fout->symbol_hash = obj_elf_hash; - fout->load_order_search_start = &fout->load_order; - - /* Copy file characteristics from input file and modify to suit */ - memcpy(&fout->header, &fin->header, sizeof(fout->header)); - fout->header.e_type = ET_REL; /* Output is relocatable */ - fout->header.e_entry = 0; /* No entry point */ - fout->header.e_phoff = 0; /* No program header */ - file_offset = sizeof(fout->header); /* Step over Elf header */ - fout->header.e_shoff = file_offset; /* Section headers next */ - fout->header.e_phentsize = 0; /* No program header */ - fout->header.e_phnum = 0; /* No program header */ - fout->header.e_shnum = KALLSYMS_IDX+1; /* Initial, strtab, kallsyms */ - fout->header.e_shstrndx = KALLSYMS_IDX-1; /* strtab */ - file_offset += fout->header.e_shentsize * fout->header.e_shnum; - - /* Populate the section data for kallsyms itself */ - fout->sections = xmalloc(sizeof(*(fout->sections))*fout->header.e_shnum); - memset(fout->sections, 0, sizeof(*(fout->sections))*fout->header.e_shnum); - - fout->sections[0] = osec = arch_new_section(); - memset(osec, 0, sizeof(*osec)); - osec->header.sh_type = SHT_NULL; - osec->header.sh_link = SHN_UNDEF; - - fout->sections[KALLSYMS_IDX-1] = osec = arch_new_section(); - memset(osec, 0, sizeof(*osec)); - osec->name = ".strtab"; - osec->header.sh_type = SHT_STRTAB; - osec->header.sh_link = SHN_UNDEF; - osec->header.sh_offset = file_offset; - osec->header.sh_size = sizeof(strtab); - osec->contents = xmalloc(sizeof(strtab)); - memcpy(osec->contents, strtab, sizeof(strtab)); - file_offset += osec->header.sh_size; - - fout->sections[KALLSYMS_IDX] = osec = arch_new_section(); - memset(osec, 0, sizeof(*osec)); - osec->name = KALLSYMS_SEC_NAME; - osec->header.sh_name = 1; /* Offset in strtab */ - osec->header.sh_type = SHT_PROGBITS; /* Load it */ - osec->header.sh_flags = SHF_ALLOC; /* Read only data */ - osec->header.sh_link = SHN_UNDEF; - osec->header.sh_addralign = sizeof(ElfW(Word)); - file_offset = (file_offset + osec->header.sh_addralign - 1) - & -(osec->header.sh_addralign); - osec->header.sh_offset = file_offset; - - /* How many loaded sections are there? */ - for (i = 0; i < fin->header.e_shnum; ++i) { - if (fin->sections[i]->header.sh_flags & SHF_ALLOC) - ++loaded; - } - - /* Initial contents, header + one entry per input section. No strings. */ - osec->header.sh_size = sizeof(*a_hdr) + loaded*sizeof(*a_sec); - a_hdr = (struct kallsyms_header *) osec->contents = - xmalloc(osec->header.sh_size); - memset(osec->contents, 0, osec->header.sh_size); - a_hdr->size = sizeof(*a_hdr); - a_hdr->sections = loaded; - a_hdr->section_off = a_hdr->size; - a_hdr->section_size = sizeof(*a_sec); - a_hdr->symbol_off = osec->header.sh_size; - a_hdr->symbol_size = sizeof(a_sym); - a_hdr->start = (ElfW(Addr))(~0); - - /* Map input section numbers to kallsyms section offsets. */ - sec_off = 0; /* Offset to first kallsyms section entry */ - fin_to_allsym_map = xmalloc(sizeof(*fin_to_allsym_map)*fin->header.e_shnum); - for (i = 0; i < fin->header.e_shnum; ++i) { - isec = fin->sections[i]; - if (isec->header.sh_flags & SHF_ALLOC) { - fin_to_allsym_map[isec->idx] = sec_off; - sec_off += a_hdr->section_size; - } - else - fin_to_allsym_map[isec->idx] = -1; /* Ignore this section */ - } - - /* Copy the loaded section data. */ - a_sec = (struct kallsyms_section *) ((char *) a_hdr + a_hdr->section_off); - for (i = 0; i < fin->header.e_shnum; ++i) { - isec = fin->sections[i]; - if (!(isec->header.sh_flags & SHF_ALLOC)) - continue; - a_sec->start = isec->header.sh_addr; - a_sec->size = isec->header.sh_size; - a_sec->flags = isec->header.sh_flags; - a_sec->name_off = strings_size - strings_left; - append_string(isec->name, &strings, &strings_size, &strings_left); - if (a_sec->start < a_hdr->start) - a_hdr->start = a_sec->start; - if (a_sec->start+a_sec->size > a_hdr->end) - a_hdr->end = a_sec->start+a_sec->size; - ++a_sec; - } - - /* Build the kallsyms symbol table from the symbol hashes. */ - for (i = 0; i < HASH_BUCKETS; ++i) { - struct obj_symbol *sym = fin->symtab[i]; - for (sym = fin->symtab[i]; sym ; sym = sym->next) { - if (!sym || sym->secidx >= fin->header.e_shnum) - continue; - if ((a_sym.section_off = fin_to_allsym_map[sym->secidx]) == -1) - continue; - if (strcmp(sym->name, "gcc2_compiled.") == 0 || - strncmp(sym->name, "__insmod_", 9) == 0) - continue; - a_sym.symbol_addr = sym->value; - if (fin->header.e_type == ET_REL) - a_sym.symbol_addr += fin->sections[sym->secidx]->header.sh_addr; - a_sym.name_off = strings_size - strings_left; - append_symbol(&a_sym, &symbols, &symbols_size, &symbols_left); - append_string(sym->name, &strings, &strings_size, &strings_left); - ++a_hdr->symbols; - } - } - free(fin_to_allsym_map); - - /* Sort the symbols into ascending order by address and name */ - sym_strings = strings; /* For symbol_compare */ - qsort((char *) symbols, (unsigned) a_hdr->symbols, - sizeof(* symbols), symbol_compare); - sym_strings = NULL; - - /* Put the lot together */ - osec->header.sh_size = a_hdr->total_size = - a_hdr->symbol_off + - a_hdr->symbols*a_hdr->symbol_size + - strings_size - strings_left; - a_hdr = (struct kallsyms_header *) osec->contents = - xrealloc(a_hdr, a_hdr->total_size); - p = (char *)a_hdr + a_hdr->symbol_off; - memcpy(p, symbols, a_hdr->symbols*a_hdr->symbol_size); - free(symbols); - p += a_hdr->symbols*a_hdr->symbol_size; - a_hdr->string_off = p - (char *)a_hdr; - memcpy(p, strings, strings_size - strings_left); - free(strings); - - *fout_result = fout; - return 0; -} diff --git a/mdk-stage1/insmod-modutils/obj/obj_load.c b/mdk-stage1/insmod-modutils/obj/obj_load.c deleted file mode 100644 index 4db20a998..000000000 --- a/mdk-stage1/insmod-modutils/obj/obj_load.c +++ /dev/null @@ -1,354 +0,0 @@ -/* Elf file reader. - Copyright 1996, 1997 Linux International. - - Contributed by Richard Henderson <rth@tamu.edu> - obj_free() added by Björn Ekwall <bj0rn@blox.se> March 1999 - Support for kallsyms Keith Owens <kaos@ocs.com.au> April 2000 - - This file is part of the Linux modutils. - - 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 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, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ident "$Id$" - -#include <alloca.h> -#include <string.h> -#include <stdlib.h> -#include <unistd.h> - -#include "obj.h" -#include "util.h" - -/*======================================================================*/ - -struct obj_file * -obj_load (int fp, Elf32_Half e_type, const char *filename) -{ - struct obj_file *f; - ElfW(Shdr) *section_headers; - int shnum, i; - char *shstrtab; - - /* Read the file header. */ - - f = arch_new_file(); - memset(f, 0, sizeof(*f)); - f->symbol_cmp = strcmp; - f->symbol_hash = obj_elf_hash; - f->load_order_search_start = &f->load_order; - - gzf_lseek(fp, 0, SEEK_SET); - if (gzf_read(fp, &f->header, sizeof(f->header)) != sizeof(f->header)) - { - error("error reading ELF header %s: %m", filename); - return NULL; - } - - if (f->header.e_ident[EI_MAG0] != ELFMAG0 - || f->header.e_ident[EI_MAG1] != ELFMAG1 - || f->header.e_ident[EI_MAG2] != ELFMAG2 - || f->header.e_ident[EI_MAG3] != ELFMAG3) - { - error("%s is not an ELF file", filename); - return NULL; - } - if (f->header.e_ident[EI_CLASS] != ELFCLASSM - || f->header.e_ident[EI_DATA] != ELFDATAM - || f->header.e_ident[EI_VERSION] != EV_CURRENT - || !MATCH_MACHINE(f->header.e_machine)) - { - error("ELF file %s not for this architecture", filename); - return NULL; - } - if (f->header.e_type != e_type && e_type != ET_NONE) - { - switch (e_type) { - case ET_REL: - error("ELF file %s not a relocatable object", filename); - break; - case ET_EXEC: - error("ELF file %s not an executable object", filename); - break; - default: - error("ELF file %s has wrong type, expecting %d got %d", - filename, e_type, f->header.e_type); - break; - } - return NULL; - } - - /* Read the section headers. */ - - if (f->header.e_shentsize != sizeof(ElfW(Shdr))) - { - error("section header size mismatch %s: %lu != %lu", - filename, - (unsigned long)f->header.e_shentsize, - (unsigned long)sizeof(ElfW(Shdr))); - return NULL; - } - - shnum = f->header.e_shnum; - f->sections = xmalloc(sizeof(struct obj_section *) * shnum); - memset(f->sections, 0, sizeof(struct obj_section *) * shnum); - - section_headers = alloca(sizeof(ElfW(Shdr)) * shnum); - gzf_lseek(fp, f->header.e_shoff, SEEK_SET); - if (gzf_read(fp, section_headers, sizeof(ElfW(Shdr))*shnum) != sizeof(ElfW(Shdr))*shnum) - { - error("error reading ELF section headers %s: %m", filename); - return NULL; - } - - /* Read the section data. */ - - for (i = 0; i < shnum; ++i) - { - struct obj_section *sec; - - f->sections[i] = sec = arch_new_section(); - memset(sec, 0, sizeof(*sec)); - - sec->header = section_headers[i]; - sec->idx = i; - - switch (sec->header.sh_type) - { - case SHT_NULL: - case SHT_NOTE: - case SHT_NOBITS: - /* ignore */ - break; - - case SHT_PROGBITS: - case SHT_SYMTAB: - case SHT_STRTAB: - case SHT_RELM: - if (sec->header.sh_size > 0) - { - sec->contents = xmalloc(sec->header.sh_size); - gzf_lseek(fp, sec->header.sh_offset, SEEK_SET); - if (gzf_read(fp, sec->contents, sec->header.sh_size) != sec->header.sh_size) - { - error("error reading ELF section data %s: %m", filename); - return NULL; - } - } - else - sec->contents = NULL; - break; - -#if SHT_RELM == SHT_REL - case SHT_RELA: - if (sec->header.sh_size) { - error("RELA relocations not supported on this architecture %s", filename); - return NULL; - } - break; -#else - case SHT_REL: - if (sec->header.sh_size) { - error("REL relocations not supported on this architecture %s", filename); - return NULL; - } - break; -#endif - - default: - if (sec->header.sh_type >= SHT_LOPROC) - { - if (arch_load_proc_section(sec, fp) < 0) - return NULL; - break; - } - - error("can't handle sections of type %ld %s", - (long)sec->header.sh_type, filename); - return NULL; - } - } - - /* Do what sort of interpretation as needed by each section. */ - - shstrtab = f->sections[f->header.e_shstrndx]->contents; - - for (i = 0; i < shnum; ++i) - { - struct obj_section *sec = f->sections[i]; - sec->name = shstrtab + sec->header.sh_name; - } - - for (i = 0; i < shnum; ++i) - { - struct obj_section *sec = f->sections[i]; - - /* .modinfo and .modstring should be contents only but gcc has no - * attribute for that. The kernel may have marked these sections as - * ALLOC, ignore the allocate bit. - */ - if (strcmp(sec->name, ".modinfo") == 0 || - strcmp(sec->name, ".modstring") == 0) - sec->header.sh_flags &= ~SHF_ALLOC; - - if (sec->header.sh_flags & SHF_ALLOC) - obj_insert_section_load_order(f, sec); - - switch (sec->header.sh_type) - { - case SHT_SYMTAB: - { - unsigned long nsym, j; - char *strtab; - ElfW(Sym) *sym; - - if (sec->header.sh_entsize != sizeof(ElfW(Sym))) - { - error("symbol size mismatch %s: %lu != %lu", - filename, - (unsigned long)sec->header.sh_entsize, - (unsigned long)sizeof(ElfW(Sym))); - return NULL; - } - - nsym = sec->header.sh_size / sizeof(ElfW(Sym)); - strtab = f->sections[sec->header.sh_link]->contents; - sym = (ElfW(Sym) *) sec->contents; - - /* Allocate space for a table of local symbols. */ - j = f->local_symtab_size = sec->header.sh_info; - f->local_symtab = xmalloc(j *= sizeof(struct obj_symbol *)); - memset(f->local_symtab, 0, j); - - /* Insert all symbols into the hash table. */ - for (j = 1, ++sym; j < nsym; ++j, ++sym) - { - const char *name; - if (sym->st_name) - name = strtab+sym->st_name; - else - name = f->sections[sym->st_shndx]->name; - - obj_add_symbol(f, name, j, sym->st_info, sym->st_shndx, - sym->st_value, sym->st_size); - - } - } - break; - } - } - - /* second pass to add relocation data to symbols */ - for (i = 0; i < shnum; ++i) - { - struct obj_section *sec = f->sections[i]; - switch (sec->header.sh_type) - { - case SHT_RELM: - { - unsigned long nrel, j; - ElfW(RelM) *rel; - struct obj_section *symtab; - char *strtab; - if (sec->header.sh_entsize != sizeof(ElfW(RelM))) - { - error("relocation entry size mismatch %s: %lu != %lu", - filename, - (unsigned long)sec->header.sh_entsize, - (unsigned long)sizeof(ElfW(RelM))); - return NULL; - } - - nrel = sec->header.sh_size / sizeof(ElfW(RelM)); - rel = (ElfW(RelM) *) sec->contents; - symtab = f->sections[sec->header.sh_link]; - strtab = f->sections[symtab->header.sh_link]->contents; - - /* Save the relocate type in each symbol entry. */ - for (j = 0; j < nrel; ++j, ++rel) - { - ElfW(Sym) *extsym; - struct obj_symbol *intsym; - unsigned long symndx; - symndx = ELFW(R_SYM)(rel->r_info); - if (symndx) - { - extsym = ((ElfW(Sym) *) symtab->contents) + symndx; - if (ELFW(ST_BIND)(extsym->st_info) == STB_LOCAL) - { - /* Local symbols we look up in the local table to be sure - we get the one that is really intended. */ - intsym = f->local_symtab[symndx]; - } - else - { - /* Others we look up in the hash table. */ - const char *name; - if (extsym->st_name) - name = strtab + extsym->st_name; - else - name = f->sections[extsym->st_shndx]->name; - intsym = obj_find_symbol(f, name); - } - intsym->r_type = ELFW(R_TYPE)(rel->r_info); - } - } - } - break; - } - } - - f->filename = xstrdup(filename); - - return f; -} - -void obj_free(struct obj_file *f) -{ - struct obj_section *sec; - struct obj_symbol *sym; - struct obj_symbol *next; - int i; - int n; - - if (f->sections) { - n = f->header.e_shnum; - for (i = 0; i < n; ++i) { - if ((sec = f->sections[i]) != NULL) { - if (sec->contents) - free(sec->contents); - free(sec); - } - } - free(f->sections); - } - - for (i = 0; i < HASH_BUCKETS; ++i) { - for (sym = f->symtab[i]; sym; sym = next) { - next = sym->next; - free(sym); - } - } - - if (f->local_symtab) - free(f->local_symtab); - - if (f->filename) - free((char *)(f->filename)); - - if (f->persist) - free((char *)(f->persist)); - - free(f); -} diff --git a/mdk-stage1/insmod-modutils/obj/obj_m68k.c b/mdk-stage1/insmod-modutils/obj/obj_m68k.c deleted file mode 100644 index cb485aed7..000000000 --- a/mdk-stage1/insmod-modutils/obj/obj_m68k.c +++ /dev/null @@ -1,147 +0,0 @@ -/* m68k specific support for Elf loading and relocation. - Copyright 1996, 1997 Linux International. - - Contributed by Richard Henderson <rth@tamu.edu> - - This file is part of the Linux modutils. - - 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 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, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ident "$Id$" - -#include <stddef.h> -#include <module.h> -#include <obj.h> -#include <util.h> - - -/*======================================================================*/ - -struct obj_file * -arch_new_file (void) -{ - return xmalloc(sizeof(struct obj_file)); -} - -struct obj_section * -arch_new_section (void) -{ - return xmalloc(sizeof(struct obj_section)); -} - -struct obj_symbol * -arch_new_symbol (void) -{ - return xmalloc(sizeof(struct obj_symbol)); -} - -int -arch_load_proc_section(struct obj_section *sec, int fp) -{ - /* Assume it's just a debugging section that we can safely - ignore ... */ - sec->contents = NULL; - - return 0; -} - -enum obj_reloc -arch_apply_relocation (struct obj_file *ef, - struct obj_section *targsec, - struct obj_section *symsec, - struct obj_symbol *sym, - Elf32_Rela *rel, - Elf32_Addr v) -{ - char *loc = targsec->contents + rel->r_offset; - Elf32_Addr dot = targsec->header.sh_addr + rel->r_offset; - - enum obj_reloc ret = obj_reloc_ok; - - switch (ELF32_R_TYPE(rel->r_info)) - { - case R_68K_NONE: - break; - - case R_68K_8: - if (v > 0xff) - ret = obj_reloc_overflow; - *(char *)loc = v; - break; - case R_68K_16: - if (v > 0xffff) - ret = obj_reloc_overflow; - *(short *)loc = v; - break; - case R_68K_32: - *(int *)loc = v; - break; - - case R_68K_PC8: - v -= dot; - if ((Elf32_Sword)v > 0x7f || (Elf32_Sword)v < -(Elf32_Sword)0x80) - ret = obj_reloc_overflow; - *(char *)loc = v; - break; - case R_68K_PC16: - v -= dot; - if ((Elf32_Sword)v > 0x7fff || (Elf32_Sword)v < -(Elf32_Sword)0x8000) - ret = obj_reloc_overflow; - *(short *)loc = v; - break; - case R_68K_PC32: - *(int *)loc = v - dot; - break; - - case R_68K_RELATIVE: - *(int *)loc += ef->baseaddr; - break; - - default: - ret = obj_reloc_unhandled; - break; - } - - return ret; -} - -int -arch_create_got (struct obj_file *ef) -{ - return 1; -} - -int -arch_init_module (struct obj_file *f, struct module *mod) -{ - return 1; -} - -int -arch_finalize_section_address(struct obj_file *f, Elf32_Addr base) -{ - int i, n = f->header.e_shnum; - - f->baseaddr = base; - for (i = 0; i < n; ++i) - f->sections[i]->header.sh_addr += base; - return 1; -} - -int -arch_archdata (struct obj_file *fin, struct obj_section *sec) -{ - return 0; -} diff --git a/mdk-stage1/insmod-modutils/obj/obj_mips.c b/mdk-stage1/insmod-modutils/obj/obj_mips.c deleted file mode 100644 index c2315b659..000000000 --- a/mdk-stage1/insmod-modutils/obj/obj_mips.c +++ /dev/null @@ -1,238 +0,0 @@ -/* MIPS specific support for Elf loading and relocation. - Copyright 1997, 1998 Linux International. - Contributed by Ralf Baechle <ralf@gnu.ai.mit.edu> - - This file is part of the Linux modutils. - - 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 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, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ident "$Id$" - -#include <string.h> -#include <stdlib.h> -#include <assert.h> - -#include <module.h> -#include <obj.h> -#include <util.h> - - -/*======================================================================*/ - -struct mips_hi16 -{ - struct mips_hi16 *next; - Elf32_Addr *addr; - Elf32_Addr value; -}; - -struct mips_file -{ - struct obj_file root; - struct mips_hi16 *mips_hi16_list; -}; - -/*======================================================================*/ - -struct obj_file * -arch_new_file (void) -{ - struct mips_file *mf; - - mf = xmalloc(sizeof(*mf)); - mf->mips_hi16_list = NULL; - - return (struct obj_file *) mf; -} - -struct obj_section * -arch_new_section (void) -{ - return xmalloc(sizeof(struct obj_section)); -} - -struct obj_symbol * -arch_new_symbol (void) -{ - return xmalloc(sizeof(struct obj_symbol)); -} - -int -arch_load_proc_section(struct obj_section *sec, int fp) -{ - switch (sec->header.sh_type) - { - case SHT_MIPS_DEBUG: - case SHT_MIPS_REGINFO: - /* Actually these two sections are as useless as something can be ... */ - sec->contents = NULL; - break; - - case SHT_MIPS_LIBLIST: - case SHT_MIPS_CONFLICT: - case SHT_MIPS_GPTAB: - case SHT_MIPS_UCODE: - case SHT_MIPS_OPTIONS: - case SHT_MIPS_DWARF: - case SHT_MIPS_EVENTS: - /* These shouldn't ever be in a module file. */ - error("Unhandled section header type: %08x", sec->header.sh_type); - - default: - /* We don't even know the type. This time it might as well be a - supernova. */ - error("Unknown section header type: %08x", sec->header.sh_type); - return -1; - } - - return 0; -} - -enum obj_reloc -arch_apply_relocation (struct obj_file *f, - struct obj_section *targsec, - struct obj_section *symsec, - struct obj_symbol *sym, - Elf32_Rel *rel, - Elf32_Addr v) -{ - struct mips_file *mf = (struct mips_file *)f; - Elf32_Addr *loc = (Elf32_Addr *)(targsec->contents + rel->r_offset); - Elf32_Addr dot = targsec->header.sh_addr + rel->r_offset; - enum obj_reloc ret = obj_reloc_ok; - - /* _gp_disp is a magic symbol for PIC which is not supported for - the kernel and loadable modules. */ - if (strcmp(sym->name, "_gp_disp") == 0) - ret = obj_reloc_unhandled; - - switch (ELF32_R_TYPE(rel->r_info)) - { - case R_MIPS_NONE: - break; - - case R_MIPS_32: - *loc += v; - break; - - case R_MIPS_26: - if (v % 4) - ret = obj_reloc_dangerous; - if ((v & 0xf0000000) != ((dot + 4) & 0xf0000000)) - ret = obj_reloc_overflow; - *loc = (*loc & ~0x03ffffff) | ((*loc + (v >> 2)) & 0x03ffffff); - break; - - case R_MIPS_HI16: - { - struct mips_hi16 *n; - - /* We cannot relocate this one now because we don't know the value - of the carry we need to add. Save the information, and let LO16 - do the actual relocation. */ - n = (struct mips_hi16 *) xmalloc (sizeof *n); - n->addr = loc; - n->value = v; - n->next = mf->mips_hi16_list; - mf->mips_hi16_list = n; - break; - } - - case R_MIPS_LO16: - { - unsigned long insnlo = *loc; - Elf32_Addr val, vallo; - - /* Sign extend the addend we extract from the lo insn. */ - vallo = ((insnlo & 0xffff) ^ 0x8000) - 0x8000; - - if (mf->mips_hi16_list != NULL) - { - struct mips_hi16 *l; - - l = mf->mips_hi16_list; - while (l != NULL) - { - struct mips_hi16 *next; - unsigned long insn; - - /* The value for the HI16 had best be the same. */ - assert(v == l->value); - - /* Do the HI16 relocation. Note that we actually don't - need to know anything about the LO16 itself, except where - to find the low 16 bits of the addend needed by the LO16. */ - insn = *l->addr; - val = ((insn & 0xffff) << 16) + vallo; - val += v; - - /* Account for the sign extension that will happen in the - low bits. */ - val = ((val >> 16) + ((val & 0x8000) != 0)) & 0xffff; - - insn = (insn &~ 0xffff) | val; - *l->addr = insn; - - next = l->next; - free(l); - l = next; - } - - mf->mips_hi16_list = NULL; - } - - /* Ok, we're done with the HI16 relocs. Now deal with the LO16. */ - val = v + vallo; - insnlo = (insnlo & ~0xffff) | (val & 0xffff); - *loc = insnlo; - break; - } - - default: - ret = obj_reloc_unhandled; - break; - } - - return ret; -} - -int -arch_create_got (struct obj_file *f) -{ - return 1; -} - -int -arch_init_module (struct obj_file *f, struct module *mod) -{ - return 1; -} - -int -arch_finalize_section_address(struct obj_file *f, Elf32_Addr base) -{ - int i, n = f->header.e_shnum; - - f->baseaddr = base; - for (i = 0; i < n; ++i) - f->sections[i]->header.sh_addr += base; - return 1; -} - -int -arch_archdata (struct obj_file *fin, struct obj_section *sec) -{ - return 0; -} diff --git a/mdk-stage1/insmod-modutils/obj/obj_ppc.c b/mdk-stage1/insmod-modutils/obj/obj_ppc.c deleted file mode 100644 index 89bb8e46b..000000000 --- a/mdk-stage1/insmod-modutils/obj/obj_ppc.c +++ /dev/null @@ -1,255 +0,0 @@ -/* PowerPC specific support for Elf loading and relocation. - Copyright 1996, 1997 Linux International. - - Adapted by Paul Mackerras <paulus@cs.anu.edu.au> from the - obj-sparc.c and obj-alpha.c files. - - This file is part of the Linux modutils. - - 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 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, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ident "$Id$" - -#include <stddef.h> -#include <module.h> -#include <obj.h> -#include <util.h> -#include <assert.h> - - -/*======================================================================*/ - -/* - * Unfortunately, the bl (branch-and-link) instruction used for - * procedure calls on the PowerPC can only reach +/- 32MB from the - * current instruction. If the module is loaded far enough away from - * the main kernel text (or other modules) that this limit is - * exceeded, we have to redirect procedure calls via a procedure - * linkage table (PLT). Each entry in the PLT contains instructions - * to put the address of the procedure in a register and jump to it. - */ - -typedef unsigned int instruction; /* a powerpc instruction (4 bytes) */ - -struct ppc_plt_entry -{ - struct ppc_plt_entry *next; - ElfW(Addr) addend; - int offset; - int inited; -}; - -struct ppc_file -{ - struct obj_file file; - struct obj_section *plt; -}; - -struct ppc_symbol -{ - struct obj_symbol sym; - struct ppc_plt_entry *plt_entries; -}; - -struct obj_file * -arch_new_file (void) -{ - struct ppc_file *f; - - f = xmalloc(sizeof(struct ppc_file)); - f->plt = NULL; - return &f->file; -} - -struct obj_section * -arch_new_section (void) -{ - return xmalloc(sizeof(struct obj_section)); -} - -struct obj_symbol * -arch_new_symbol (void) -{ - struct ppc_symbol *p; - - p = xmalloc(sizeof(struct ppc_symbol)); - p->plt_entries = NULL; - return &p->sym; -} - -int -arch_load_proc_section(struct obj_section *sec, int fp) -{ - /* Assume it's just a debugging section that we can safely - ignore ... */ - sec->contents = NULL; - - return 0; -} - -enum obj_reloc -arch_apply_relocation (struct obj_file *ef, - struct obj_section *targsec, - struct obj_section *symsec, - struct obj_symbol *sym, - Elf32_Rela *rel, - Elf32_Addr v) -{ - Elf32_Addr *loc = (Elf32_Addr *)(targsec->contents + rel->r_offset); - Elf32_Addr dot = targsec->header.sh_addr + rel->r_offset; - struct ppc_file *pf = (struct ppc_file *) ef; - struct ppc_symbol *psym = (struct ppc_symbol *) sym; - struct ppc_plt_entry *pe; - instruction *ip; - - enum obj_reloc ret = obj_reloc_ok; - - switch (ELF32_R_TYPE(rel->r_info)) - { - case R_PPC_ADDR16_HA: - *(unsigned short *)loc = (v + 0x8000) >> 16; - break; - - case R_PPC_ADDR16_HI: - *(unsigned short *)loc = v >> 16; - break; - - case R_PPC_ADDR16_LO: - *(unsigned short *)loc = v; - break; - - case R_PPC_REL24: - /* find the plt entry and initialize it if necessary */ - assert(psym != NULL); - for (pe = psym->plt_entries; pe != NULL && pe->addend != rel->r_addend; ) - pe = pe->next; - assert(pe != NULL); - if (!pe->inited) - { - ip = (instruction *) (pf->plt->contents + pe->offset); - ip[0] = 0x3d600000 + ((v + 0x8000) >> 16); /* lis r11,sym@ha */ - ip[1] = 0x396b0000 + (v & 0xffff); /* addi r11,r11,sym@l */ - ip[2] = 0x7d6903a6; /* mtctr r11 */ - ip[3] = 0x4e800420; /* bctr */ - pe->inited = 1; - } - - v -= dot; - if ((int)v < -0x02000000 || (int)v >= 0x02000000) - { - /* go via the plt */ - v = pf->plt->header.sh_addr + pe->offset - dot; - } - if (v & 3) - ret = obj_reloc_dangerous; - *loc = (*loc & ~0x03fffffc) | (v & 0x03fffffc); - break; - - case R_PPC_REL32: - *loc = v - dot; - break; - - case R_PPC_ADDR32: - *loc = v; - break; - - default: - ret = obj_reloc_unhandled; - break; - } - - return ret; -} - -int -arch_create_got (struct obj_file *f) -{ - struct ppc_file *pf = (struct ppc_file *) f; - int i, offset; - struct obj_section *sec, *syms, *strs; - ElfW(Rela) *rel, *relend; - ElfW(Sym) *symtab, *extsym; - const char *strtab, *name; - struct ppc_symbol *intsym; - struct ppc_plt_entry *pe; - - offset = 0; - for (i = 0; i < f->header.e_shnum; ++i) - { - sec = f->sections[i]; - if (sec->header.sh_type != SHT_RELM) - continue; - syms = f->sections[sec->header.sh_link]; - strs = f->sections[syms->header.sh_link]; - - rel = (ElfW(RelM) *) sec->contents; - relend = rel + (sec->header.sh_size / sizeof(ElfW(RelM))); - symtab = (ElfW(Sym) *) syms->contents; - strtab = (const char *) strs->contents; - - for (; rel < relend; ++rel) - { - if (ELF32_R_TYPE(rel->r_info) != R_PPC_REL24) - continue; - extsym = &symtab[ELF32_R_SYM(rel->r_info)]; - if (extsym->st_name) - name = strtab + extsym->st_name; - else - name = f->sections[extsym->st_shndx]->name; - intsym = (struct ppc_symbol *) obj_find_symbol(f, name); - - for (pe = intsym->plt_entries; pe != NULL; pe = pe->next) - if (pe->addend == rel->r_addend) - break; - if (pe == NULL) - { - pe = xmalloc(sizeof(struct ppc_plt_entry)); - pe->next = intsym->plt_entries; - pe->addend = rel->r_addend; - pe->offset = offset; - pe->inited = 0; - intsym->plt_entries = pe; - offset += 16; - } - } - } - - pf->plt = obj_create_alloced_section(f, ".plt", 16, offset); - - return 1; -} - -int -arch_init_module (struct obj_file *f, struct module *mod) -{ - return 1; -} - -int -arch_finalize_section_address(struct obj_file *f, Elf32_Addr base) -{ - int i, n = f->header.e_shnum; - - f->baseaddr = base; - for (i = 0; i < n; ++i) - f->sections[i]->header.sh_addr += base; - return 1; -} - -int -arch_archdata (struct obj_file *fin, struct obj_section *sec) -{ - return 0; -} diff --git a/mdk-stage1/insmod-modutils/obj/obj_reloc.c b/mdk-stage1/insmod-modutils/obj/obj_reloc.c deleted file mode 100644 index f5f2de90d..000000000 --- a/mdk-stage1/insmod-modutils/obj/obj_reloc.c +++ /dev/null @@ -1,435 +0,0 @@ -/* Elf relocation routines. - Copyright 1996, 1997 Linux International. - - Contributed by Richard Henderson <rth@tamu.edu> - - This file is part of the Linux modutils. - - 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 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, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ident "$Id$" - -#include <string.h> -#include <assert.h> -#include <alloca.h> - -#include <obj.h> -#include <util.h> - -/*======================================================================*/ - -int -obj_string_patch(struct obj_file *f, int secidx, ElfW(Addr) offset, - const char *string) -{ - struct obj_string_patch_struct *p; - struct obj_section *strsec; - size_t len = strlen(string)+1; - char *loc; - - p = xmalloc(sizeof(*p)); - p->next = f->string_patches; - p->reloc_secidx = secidx; - p->reloc_offset = offset; - f->string_patches = p; - - strsec = obj_find_section(f, ".kstrtab"); - if (strsec == NULL) - { - strsec = obj_create_alloced_section(f, ".kstrtab", 1, len); - p->string_offset = 0; - loc = strsec->contents; - } - else - { - p->string_offset = strsec->header.sh_size; - loc = obj_extend_section(strsec, len); - } - memcpy(loc, string, len); - - return 1; -} - -int -obj_symbol_patch(struct obj_file *f, int secidx, ElfW(Addr) offset, - struct obj_symbol *sym) -{ - struct obj_symbol_patch_struct *p; - - p = xmalloc(sizeof(*p)); - p->next = f->symbol_patches; - p->reloc_secidx = secidx; - p->reloc_offset = offset; - p->sym = sym; - f->symbol_patches = p; - - return 1; -} - -int -obj_check_undefineds(struct obj_file *f, int quiet) -{ - unsigned long i; - int ret = 1; - - for (i = 0; i < HASH_BUCKETS; ++i) - { - struct obj_symbol *sym; - for (sym = f->symtab[i]; sym ; sym = sym->next) - if (sym->secidx == SHN_UNDEF) - { - if (ELFW(ST_BIND)(sym->info) == STB_WEAK) - { - sym->secidx = SHN_ABS; - sym->value = 0; - } - else if (sym->r_type) /* assumes R_arch_NONE is 0 on all arch */ - { - if (!quiet) - error("unresolved symbol %s", sym->name); - ret = 0; - } - } - } - - return ret; -} - -void -obj_clear_undefineds(struct obj_file *f) -{ - unsigned long i; - struct obj_symbol *sym; - for (i = 0; i < HASH_BUCKETS; ++i) - { - for (sym = f->symtab[i]; sym ; sym = sym->next) - if (sym->secidx == SHN_UNDEF) - { - sym->secidx = SHN_ABS; - sym->value = 0; - } - } -} - -void -obj_allocate_commons(struct obj_file *f) -{ - struct common_entry - { - struct common_entry *next; - struct obj_symbol *sym; - } *common_head = NULL; - - unsigned long i; - - for (i = 0; i < HASH_BUCKETS; ++i) - { - struct obj_symbol *sym; - for (sym = f->symtab[i]; sym ; sym = sym->next) - if (sym->secidx == SHN_COMMON) - { - /* Collect all COMMON symbols and sort them by size so as to - minimize space wasted by alignment requirements. */ - { - struct common_entry **p, *n; - for (p = &common_head; *p ; p = &(*p)->next) - if (sym->size <= (*p)->sym->size) - break; - - n = alloca(sizeof(*n)); - n->next = *p; - n->sym = sym; - *p = n; - } - } - } - - for (i = 1; i < f->local_symtab_size; ++i) - { - struct obj_symbol *sym = f->local_symtab[i]; - if (sym && sym->secidx == SHN_COMMON) - { - struct common_entry **p, *n; - for (p = &common_head; *p ; p = &(*p)->next) - if (sym == (*p)->sym) - break; - else if (sym->size < (*p)->sym->size) - { - n = alloca(sizeof(*n)); - n->next = *p; - n->sym = sym; - *p = n; - break; - } - } - } - - if (common_head) - { - /* Find the bss section. */ - for (i = 0; i < f->header.e_shnum; ++i) - if (f->sections[i]->header.sh_type == SHT_NOBITS) - break; - - /* If for some reason there hadn't been one, create one. */ - if (i == f->header.e_shnum) - { - struct obj_section *sec; - - f->sections = xrealloc(f->sections, (i+1) * sizeof(sec)); - f->sections[i] = sec = arch_new_section(); - f->header.e_shnum = i+1; - - memset(sec, 0, sizeof(*sec)); - sec->header.sh_type = SHT_PROGBITS; - sec->header.sh_flags = SHF_WRITE|SHF_ALLOC; - sec->name = ".bss"; - sec->idx = i; - } - - /* Allocate the COMMONS. */ - { - ElfW(Addr) bss_size = f->sections[i]->header.sh_size; - ElfW(Addr) max_align = f->sections[i]->header.sh_addralign; - struct common_entry *c; - - for (c = common_head; c ; c = c->next) - { - ElfW(Addr) align = c->sym->value; - - if (align > max_align) - max_align = align; - if (bss_size & (align - 1)) - bss_size = (bss_size | (align - 1)) + 1; - - c->sym->secidx = i; - c->sym->value = bss_size; - - bss_size += c->sym->size; - } - - f->sections[i]->header.sh_size = bss_size; - f->sections[i]->header.sh_addralign = max_align; - } - } - - /* For the sake of patch relocation and parameter initialization, - allocate zeroed data for NOBITS sections now. Note that after - this we cannot assume NOBITS are really empty. */ - for (i = 0; i < f->header.e_shnum; ++i) - { - struct obj_section *s = f->sections[i]; - if (s->header.sh_type == SHT_NOBITS) - { - if (s->header.sh_size) - s->contents = memset(xmalloc(s->header.sh_size), - 0, s->header.sh_size); - else - s->contents = NULL; - s->header.sh_type = SHT_PROGBITS; - } - } -} - -unsigned long -obj_load_size (struct obj_file *f) -{ - unsigned long dot = 0; - struct obj_section *sec; - - /* Finalize the positions of the sections relative to one another. */ - - for (sec = f->load_order; sec ; sec = sec->load_next) - { - ElfW(Addr) align; - - align = sec->header.sh_addralign; - if (align && (dot & (align - 1))) - dot = (dot | (align - 1)) + 1; - - sec->header.sh_addr = dot; - dot += sec->header.sh_size; - } - - return dot; -} - -int -obj_relocate (struct obj_file *f, ElfW(Addr) base) -{ - int i, n = f->header.e_shnum; - int ret = 1; - - /* Finalize the addresses of the sections. */ - - arch_finalize_section_address(f, base); - - /* And iterate over all of the relocations. */ - - for (i = 0; i < n; ++i) - { - struct obj_section *relsec, *symsec, *targsec, *strsec; - ElfW(RelM) *rel, *relend; - ElfW(Sym) *symtab; - const char *strtab; - - relsec = f->sections[i]; - if (relsec->header.sh_type != SHT_RELM) - continue; - - symsec = f->sections[relsec->header.sh_link]; - targsec = f->sections[relsec->header.sh_info]; - strsec = f->sections[symsec->header.sh_link]; - - rel = (ElfW(RelM) *)relsec->contents; - relend = rel + (relsec->header.sh_size / sizeof(ElfW(RelM))); - symtab = (ElfW(Sym) *)symsec->contents; - strtab = (const char *)strsec->contents; - - for (; rel < relend; ++rel) - { - ElfW(Addr) value = 0; - struct obj_symbol *intsym = NULL; - unsigned long symndx; - ElfW(Sym) *extsym = 0; - const char *errmsg; - - /* Attempt to find a value to use for this relocation. */ - - symndx = ELFW(R_SYM)(rel->r_info); - if (symndx) - { - /* Note we've already checked for undefined symbols. */ - - extsym = &symtab[symndx]; - if (ELFW(ST_BIND)(extsym->st_info) == STB_LOCAL) - { - /* Local symbols we look up in the local table to be sure - we get the one that is really intended. */ - intsym = f->local_symtab[symndx]; - } - else - { - /* Others we look up in the hash table. */ - const char *name; - if (extsym->st_name) - name = strtab + extsym->st_name; - else - name = f->sections[extsym->st_shndx]->name; - intsym = obj_find_symbol(f, name); - } - - value = obj_symbol_final_value(f, intsym); - } - -#if SHT_RELM == SHT_RELA -#if defined(__alpha__) && defined(AXP_BROKEN_GAS) - /* Work around a nasty GAS bug, that is fixed as of 2.7.0.9. */ - if (!extsym || !extsym->st_name || - ELFW(ST_BIND)(extsym->st_info) != STB_LOCAL) -#endif - value += rel->r_addend; -#endif - - /* Do it! */ - switch (arch_apply_relocation(f,targsec,symsec,intsym,rel,value)) - { - case obj_reloc_ok: - break; - - case obj_reloc_overflow: - errmsg = "Relocation overflow"; - goto bad_reloc; - case obj_reloc_dangerous: - errmsg = "Dangerous relocation"; - goto bad_reloc; - case obj_reloc_unhandled: - errmsg = "Unhandled relocation"; - goto bad_reloc; - case obj_reloc_constant_gp: - errmsg = "Modules compiled with -mconstant-gp cannot be loaded"; - goto bad_reloc; - bad_reloc: - if (extsym) - { - error("%s of type %ld for %s", errmsg, - (long)ELFW(R_TYPE)(rel->r_info), - strtab + extsym->st_name); - } - else - { - error("%s of type %ld", errmsg, - (long)ELFW(R_TYPE)(rel->r_info)); - } - ret = 0; - break; - } - } - } - - /* Finally, take care of the patches. */ - - if (f->string_patches) - { - struct obj_string_patch_struct *p; - struct obj_section *strsec; - ElfW(Addr) strsec_base; - strsec = obj_find_section(f, ".kstrtab"); - strsec_base = strsec->header.sh_addr; - - for (p = f->string_patches; p ; p = p->next) - { - struct obj_section *targsec = f->sections[p->reloc_secidx]; - *(ElfW(Addr) *)(targsec->contents + p->reloc_offset) - = strsec_base + p->string_offset; - } - } - - if (f->symbol_patches) - { - struct obj_symbol_patch_struct *p; - - for (p = f->symbol_patches; p; p = p->next) - { - struct obj_section *targsec = f->sections[p->reloc_secidx]; - *(ElfW(Addr) *)(targsec->contents + p->reloc_offset) - = obj_symbol_final_value(f, p->sym); - } - } - - return ret; -} - -int -obj_create_image (struct obj_file *f, char *image) -{ - struct obj_section *sec; - ElfW(Addr) base = f->baseaddr; - - for (sec = f->load_order; sec ; sec = sec->load_next) - { - char *secimg; - - if (sec->contents == 0) - continue; - - secimg = image + (sec->header.sh_addr - base); - - /* Note that we allocated data for NOBITS sections earlier. */ - memcpy(secimg, sec->contents, sec->header.sh_size); - } - - return 1; -} diff --git a/mdk-stage1/insmod-modutils/obj/obj_s390.c b/mdk-stage1/insmod-modutils/obj/obj_s390.c deleted file mode 100644 index 3da72e771..000000000 --- a/mdk-stage1/insmod-modutils/obj/obj_s390.c +++ /dev/null @@ -1,245 +0,0 @@ -/* S/390 specific support for Elf loading and relocation. - Copyright 1996, 1997 Linux International. - - Contributed by Richard Henderson <rth@tamu.edu> - - This file is part of the Linux modutils. - - 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 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, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ident "$Id$" - -#include <string.h> -#include <assert.h> - -#include <module.h> -#include <obj.h> -#include <util.h> - - -/*======================================================================*/ - -struct s390_got_entry -{ - int offset; - unsigned offset_done : 1; - unsigned reloc_done : 1; -}; - -struct s390_file -{ - struct obj_file root; - struct obj_section *got; -}; - -struct s390_symbol -{ - struct obj_symbol root; - struct s390_got_entry gotent; -}; - - -/*======================================================================*/ - -struct obj_file * -arch_new_file (void) -{ - struct s390_file *f; - f = xmalloc(sizeof(*f)); - f->got = NULL; - return &f->root; -} - -struct obj_section * -arch_new_section (void) -{ - return xmalloc(sizeof(struct obj_section)); -} - -struct obj_symbol * -arch_new_symbol (void) -{ - struct s390_symbol *sym; - sym = xmalloc(sizeof(*sym)); - memset(&sym->gotent, 0, sizeof(sym->gotent)); - return &sym->root; -} - -int -arch_load_proc_section(struct obj_section *sec, int fp) -{ - /* Assume it's just a debugging section that we can safely - ignore ... */ - sec->contents = NULL; - - return 0; -} - -enum obj_reloc -arch_apply_relocation (struct obj_file *f, - struct obj_section *targsec, - struct obj_section *symsec, - struct obj_symbol *sym, - Elf32_Rela *rel, - Elf32_Addr v) -{ - struct s390_file *ifile = (struct s390_file *)f; - struct s390_symbol *isym = (struct s390_symbol *)sym; - - Elf32_Addr *loc = (Elf32_Addr *)(targsec->contents + rel->r_offset); - Elf32_Addr dot = targsec->header.sh_addr + rel->r_offset; - Elf32_Addr got = ifile->got ? ifile->got->header.sh_addr : 0; - - enum obj_reloc ret = obj_reloc_ok; - - switch (ELF32_R_TYPE(rel->r_info)) - { - case R_390_NONE: - break; - - case R_390_32: - *loc += v; - break; - - case R_390_PLT32: - case R_390_PC32: - *loc += v - dot; - break; - - case R_390_GLOB_DAT: - case R_390_JMP_SLOT: - *loc = v; - break; - - case R_390_RELATIVE: - *loc += f->baseaddr; - break; - - case R_390_GOTPC: - assert(got != 0); - *loc += got - dot; - break; - - case R_390_GOT32: - assert(isym != NULL); - if (!isym->gotent.reloc_done) - { - isym->gotent.reloc_done = 1; - *(Elf32_Addr *)(ifile->got->contents + isym->gotent.offset) = v; - } - *loc += isym->gotent.offset; - break; - - case R_390_GOTOFF: - assert(got != 0); - *loc += v - got; - break; - - default: - ret = obj_reloc_unhandled; - break; - } - - return ret; -} - -int -arch_create_got (struct obj_file *f) -{ - struct s390_file *ifile = (struct s390_file *)f; - int i, n, offset = 0, gotneeded = 0; - - n = ifile->root.header.e_shnum; - for (i = 0; i < n; ++i) - { - struct obj_section *relsec, *symsec, *strsec; - Elf32_Rel *rel, *relend; - Elf32_Sym *symtab; - const char *strtab; - - relsec = ifile->root.sections[i]; - if (relsec->header.sh_type != SHT_REL) - continue; - - symsec = ifile->root.sections[relsec->header.sh_link]; - strsec = ifile->root.sections[symsec->header.sh_link]; - - rel = (Elf32_Rel *)relsec->contents; - relend = rel + (relsec->header.sh_size / sizeof(Elf32_Rel)); - symtab = (Elf32_Sym *)symsec->contents; - strtab = (const char *)strsec->contents; - - for (; rel < relend; ++rel) - { - Elf32_Sym *extsym; - struct s390_symbol *intsym; - const char *name; - - switch (ELF32_R_TYPE(rel->r_info)) - { - case R_390_GOTPC: - case R_390_GOTOFF: - gotneeded = 1; - default: - continue; - - case R_390_GOT32: - break; - } - - extsym = &symtab[ELF32_R_SYM(rel->r_info)]; - if (extsym->st_name) - name = strtab + extsym->st_name; - else - name = f->sections[extsym->st_shndx]->name; - intsym = (struct s390_symbol *)obj_find_symbol(&ifile->root, name); - - if (!intsym->gotent.offset_done) - { - intsym->gotent.offset_done = 1; - intsym->gotent.offset = offset; - offset += 4; - } - } - } - - if (offset > 0 || gotneeded) - ifile->got = obj_create_alloced_section(&ifile->root, ".got", 4, offset); - - return 1; -} - -int -arch_init_module (struct obj_file *f, struct module *m) -{ - return 1; -} - -int -arch_finalize_section_address(struct obj_file *f, Elf32_Addr base) -{ - int i, n = f->header.e_shnum; - - f->baseaddr = base; - for (i = 0; i < n; ++i) - f->sections[i]->header.sh_addr += base; - return 1; -} - -int -arch_archdata (struct obj_file *fin, struct obj_section *sec) -{ - return 0; -} diff --git a/mdk-stage1/insmod-modutils/obj/obj_sparc.c b/mdk-stage1/insmod-modutils/obj/obj_sparc.c deleted file mode 100644 index 1a03c9090..000000000 --- a/mdk-stage1/insmod-modutils/obj/obj_sparc.c +++ /dev/null @@ -1,226 +0,0 @@ -/* Sparc specific support for Elf loading and relocation. - Copyright 1996, 1997 Linux International. - - Contributed by Richard Henderson <rth@tamu.edu> - - This file is part of the Linux modutils. - - 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 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, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ident "$Id$" - -#include <stddef.h> -#include <module.h> -#include <obj.h> -#include <util.h> - - -/*======================================================================*/ - -struct obj_file * -arch_new_file (void) -{ - return xmalloc(sizeof(struct obj_file)); -} - -struct obj_section * -arch_new_section (void) -{ - return xmalloc(sizeof(struct obj_section)); -} - -struct obj_symbol * -arch_new_symbol (void) -{ - return xmalloc(sizeof(struct obj_symbol)); -} - -int -arch_load_proc_section(struct obj_section *sec, int fp) -{ - /* Assume it's just a debugging section that we can safely - ignore ... */ - sec->contents = NULL; - - return 0; -} - -enum obj_reloc -arch_apply_relocation (struct obj_file *ef, - struct obj_section *targsec, - struct obj_section *symsec, - struct obj_symbol *sym, - Elf32_Rela *rel, - Elf32_Addr v) -{ - Elf32_Addr *loc = (Elf32_Addr *)(targsec->contents + rel->r_offset); - Elf32_Addr dot = targsec->header.sh_addr + rel->r_offset; - - enum obj_reloc ret = obj_reloc_ok; - - switch (ELF32_R_TYPE(rel->r_info)) - { - case R_SPARC_NONE: - break; - case R_SPARC_8: - if (v > 0xff) - ret = obj_reloc_overflow; - *loc = (*loc & ~0xff) | (v & 0xff); - break; - case R_SPARC_16: - if (v > 0xffff) - ret = obj_reloc_overflow; - *loc = (*loc & ~0xffff) | (v & 0xffff); - break; - case R_SPARC_32: - *loc = v; - break; - case R_SPARC_DISP8: - v -= dot; - if (v > 0xff) - ret = obj_reloc_overflow; - *loc = (*loc & ~0xff) | (v & 0xff); - break; - case R_SPARC_DISP16: - v -= dot; - if (v > 0xffff) - ret = obj_reloc_overflow; - *loc = (*loc & ~0xffff) | (v & 0xffff); - break; - case R_SPARC_DISP32: - v -= dot; - *loc = v; - break; - case R_SPARC_WDISP30: - v -= dot; - if (v % 4) - ret = obj_reloc_dangerous; - *loc = (*loc & ~0x3fffffff) | (v >> 2); - break; - case R_SPARC_WDISP22: - v -= dot; - if (v % 4) - ret = obj_reloc_dangerous; - *loc = (*loc & ~0x3fffff) | ((v >> 2) & 0x3fffff); - break; - case R_SPARC_HI22: - *loc = (*loc & ~0x3fffff) | (v >> 10); - break; - case R_SPARC_22: - if (v > 0x3fffff) - ret = obj_reloc_overflow; - *loc = (*loc & ~0x3fffff) | (v & 0x3fffff); - break; - case R_SPARC_13: - if (v > 0x1fff) - ret = obj_reloc_overflow; - *loc = (*loc & ~0x1fff) | (v & 0x1fff); - break; - case R_SPARC_LO10: - *loc = (*loc & ~0x3ff) | (v & 0x3ff); - break; - - case R_SPARC_PC10: - v -= dot; - *loc = (*loc & ~0x3ff) | (v & 0x3ff); - break; - case R_SPARC_PC22: - v -= dot; - *loc = (*loc & ~0x3fffff) | (v >> 10); - break; - - case R_SPARC_UA32: - *(((char *)loc) + 0) = (char)(v >> 24); - *(((char *)loc) + 1) = (char)(v >> 16); - *(((char *)loc) + 2) = (char)(v >> 8); - *(((char *)loc) + 3) = (char)v; - break; - -#ifdef R_SPARC_10 - case R_SPARC_10: - if (v > 0x3ff) - ret = obj_reloc_overflow; - *loc = (*loc & ~0x3ff) | (v & 0x3ff); - break; - case R_SPARC_11: - if (v > 0x7ff) - ret = obj_reloc_overflow; - *loc = (*loc & ~0x7ff) | (v & 0x7ff); - break; - case R_SPARC_WDISP16: - v -= dot; - if (v % 4) - ret = obj_reloc_dangerous; - *loc = (*loc & ~0x303fff) | ((v << 4) & 0x300000) | ((v >> 2) & 0x3fff); - break; - case R_SPARC_WDISP19: - v -= dot; - if (v % 4) - ret = obj_reloc_dangerous; - *loc = (*loc & ~0x7ffff) | ((v >> 2) & 0x7ffff); - break; - case R_SPARC_7: - if (v > 0x7f) - ret = obj_reloc_overflow; - *loc = (*loc & ~0x7f) | (v & 0x7f); - break; - case R_SPARC_5: - if (v > 0x1f) - ret = obj_reloc_overflow; - *loc = (*loc & ~0x1f) | (v & 0x1f); - break; - case R_SPARC_6: - if (v > 0x3f) - ret = obj_reloc_overflow; - *loc = (*loc & ~0x3f) | (v & 0x3f); - break; -#endif /* R_SPARC_10 */ - - default: - ret = obj_reloc_unhandled; - break; - } - - return ret; -} - -int -arch_create_got (struct obj_file *ef) -{ - return 1; -} - -int -arch_init_module (struct obj_file *f, struct module *mod) -{ - return 1; -} - -int -arch_finalize_section_address(struct obj_file *f, Elf32_Addr base) -{ - int i, n = f->header.e_shnum; - - f->baseaddr = base; - for (i = 0; i < n; ++i) - f->sections[i]->header.sh_addr += base; - return 1; -} - -int -arch_archdata (struct obj_file *fin, struct obj_section *sec) -{ - return 0; -} diff --git a/mdk-stage1/insmod-modutils/obj/obj_sparc64.c b/mdk-stage1/insmod-modutils/obj/obj_sparc64.c deleted file mode 100644 index 84e8d18a0..000000000 --- a/mdk-stage1/insmod-modutils/obj/obj_sparc64.c +++ /dev/null @@ -1,352 +0,0 @@ -/* Sparc64 specific support for Elf loading and relocation. - Copyright 1997 Linux International. - - Contributed by Jakub Jelinek <jj@sunsite.mff.cuni.cz> - - This file is part of the Linux modutils. - - 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 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, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ident "$Id$" - -#include <stddef.h> -#include <module.h> -#include <obj.h> -#include <util.h> - - -/*======================================================================*/ - -struct obj_file * -arch_new_file (void) -{ - return xmalloc(sizeof(struct obj_file)); -} - -struct obj_section * -arch_new_section (void) -{ - return xmalloc(sizeof(struct obj_section)); -} - -struct obj_symbol * -arch_new_symbol (void) -{ - return xmalloc(sizeof(struct obj_symbol)); -} - -#ifdef BROKEN_SPARC64_RELOCS - -#undef R_SPARC_PLT32 -#undef R_SPARC_HIPLT22 -#undef R_SPARC_LOPLT10 -#undef R_SPARC_PCPLT32 -#undef R_SPARC_PCPLT22 -#undef R_SPARC_PCPLT10 -#undef R_SPARC_10 -#undef R_SPARC_11 -#undef R_SPARC_64 -#undef R_SPARC_OLO10 -#undef R_SPARC_HH22 -#undef R_SPARC_HM10 -#undef R_SPARC_LM22 -#undef R_SPARC_PC_HH22 -#undef R_SPARC_PC_HM10 -#undef R_SPARC_PC_LM22 -#undef R_SPARC_WDISP16 -#undef R_SPARC_WDISP19 -#undef R_SPARC_GLOB_JMP -#undef R_SPARC_7 -#undef R_SPARC_5 -#undef R_SPARC_6 - -#define R_SPARC_10 24 -#define R_SPARC_11 25 -#define R_SPARC_64 26 -#define R_SPARC_OLO10 27 -#define R_SPARC_HH22 28 -#define R_SPARC_HM10 29 -#define R_SPARC_LM22 30 -#define R_SPARC_PC_HH22 31 -#define R_SPARC_PC_HM10 32 -#define R_SPARC_PC_LM22 33 -#define R_SPARC_WDISP16 34 -#define R_SPARC_WDISP19 35 -#define R_SPARC_GLOB_JMP 36 -#define R_SPARC_7 37 -#define R_SPARC_5 38 -#define R_SPARC_6 39 - -#else - -#ifndef R_SPARC_64 - -#define R_SPARC_64 32 -#define R_SPARC_OLO10 33 -#define R_SPARC_HH22 34 -#define R_SPARC_HM10 35 -#define R_SPARC_LM22 36 -#define R_SPARC_PC_HH22 37 -#define R_SPARC_PC_HM10 38 -#define R_SPARC_PC_LM22 39 - -#endif - -#endif - -int -arch_load_proc_section(struct obj_section *sec, int fp) -{ - /* Assume it's just a debugging section that we can safely - ignore ... */ - sec->contents = NULL; - - return 0; -} - -#define ELF64_R_TYPE_ID(info) ((info) & 0xff) -#define ELF64_R_TYPE_DATA(info) ((info) >> 8) - -enum obj_reloc -arch_apply_relocation (struct obj_file *ef, - struct obj_section *targsec, - struct obj_section *symsec, - struct obj_symbol *sym, - Elf64_Rela *rel, - Elf64_Addr v) -{ - unsigned int *loc = (unsigned int *)(targsec->contents + rel->r_offset); - unsigned int dot = targsec->header.sh_addr + rel->r_offset; - - enum obj_reloc ret = obj_reloc_ok; - - switch (ELF64_R_TYPE_ID(rel->r_info)) - { - case R_SPARC_NONE: - break; - - case R_SPARC_64: - case R_SPARC_UA64: - if (! ((long) loc & 3)) { - /* Common in .eh_frame */ - ((unsigned int *) loc) [0] = v >> 32; - ((unsigned int *) loc) [1] = v; - break; - } - ((unsigned char *) loc) [0] = v >> 56; - ((unsigned char *) loc) [1] = v >> 48; - ((unsigned char *) loc) [2] = v >> 40; - ((unsigned char *) loc) [3] = v >> 32; - ((unsigned char *) loc) [4] = v >> 24; - ((unsigned char *) loc) [5] = v >> 16; - ((unsigned char *) loc) [6] = v >> 8; - ((unsigned char *) loc) [7] = v; - break; - case R_SPARC_32: - case R_SPARC_UA32: - if (! ((long) loc & 3)) { - *loc = v; - break; - } - ((unsigned char *) loc) [0] = v >> 24; - ((unsigned char *) loc) [1] = v >> 16; - ((unsigned char *) loc) [2] = v >> 8; - ((unsigned char *) loc) [3] = v; - break; - case R_SPARC_16: - if (v > 0xffff) - ret = obj_reloc_overflow; - *loc = (*loc & ~0xffff) | (v & 0xffff); - break; - case R_SPARC_8: - if (v > 0xff) - ret = obj_reloc_overflow; - *loc = (*loc & ~0xff) | (v & 0xff); - break; - - case R_SPARC_DISP32: - v -= dot; - *loc = v; - break; - case R_SPARC_DISP16: - v -= dot; - if (v > 0xffff) - ret = obj_reloc_overflow; - *loc = (*loc & ~0xffff) | (v & 0xffff); - break; - case R_SPARC_DISP8: - v -= dot; - if (v > 0xff) - ret = obj_reloc_overflow; - *loc = (*loc & ~0xff) | (v & 0xff); - break; - case R_SPARC_WDISP30: - v -= dot; - if (v % 4) - ret = obj_reloc_dangerous; - *loc = (*loc & ~0x3fffffff) | ((v >> 2) & 0x3fffffff); - break; - - /* MEDLOW code model relocs */ - case R_SPARC_LO10: - *loc = (*loc & ~0x3ff) | (v & 0x3ff); - break; - case R_SPARC_HI22: - *loc = (*loc & ~0x3fffff) | (v >> 10); - break; - case R_SPARC_OLO10: - *loc = (*loc & ~0x1fff) | (((v & 0x3ff) + ELF64_R_TYPE_DATA (rel->r_info)) & 0x1fff); - break; - - /* MEDMID code model relocs */ - case R_SPARC_H44: - *loc = (*loc & ~0x3fffff) | (v >> 22); - break; - case R_SPARC_M44: - *loc = (*loc & ~0x3ff) | ((v >> 12) & 0x3ff); - break; - case R_SPARC_L44: - *loc = (*loc & ~0xfff) | (v & 0xfff); - break; - - /* MEDANY code model relocs */ - case R_SPARC_HH22: - *loc = (*loc & ~0x3fffff) | (v >> 42); - break; - case R_SPARC_HM10: - *loc = (*loc & ~0x3ff) | ((v >> 32) & 0x3ff); - break; - case R_SPARC_LM22: - *loc = (*loc & ~0x3fffff) | ((v >> 10) & 0x3fffff); - break; - - case R_SPARC_WDISP22: - v -= dot; - if (v % 4) - ret = obj_reloc_dangerous; - *loc = (*loc & ~0x3fffff) | ((v >> 2) & 0x3fffff); - break; - case R_SPARC_22: - if (v > 0x3fffff) - ret = obj_reloc_overflow; - *loc = (*loc & ~0x3fffff) | (v & 0x3fffff); - break; - case R_SPARC_13: - if (v > 0x1fff) - ret = obj_reloc_overflow; - *loc = (*loc & ~0x1fff) | (v & 0x1fff); - break; - - case R_SPARC_PC10: - v -= dot; - *loc = (*loc & ~0x3ff) | (v & 0x3ff); - break; - case R_SPARC_PC22: - v -= dot; - *loc = (*loc & ~0x3fffff) | ((v >> 10) & 0x3fffff); - break; - -#ifdef R_SPARC_10 - case R_SPARC_10: - if (v > 0x3ff) - ret = obj_reloc_overflow; - *loc = (*loc & ~0x3ff) | (v & 0x3ff); - break; - case R_SPARC_11: - if (v > 0x7ff) - ret = obj_reloc_overflow; - *loc = (*loc & ~0x7ff) | (v & 0x7ff); - break; - -#ifdef R_SPARC_64 - case R_SPARC_PC_HH22: - v -= dot; - *loc = (*loc & ~0x3fffff) | (v >> 42); - break; - case R_SPARC_PC_HM10: - v -= dot; - *loc = (*loc & ~0x3ff) | ((v >> 32) & 0x3ff); - break; - case R_SPARC_PC_LM22: - v -= dot; - *loc = (*loc & ~0x3fffff) | ((v >> 10) & 0x3fffff); - break; -#endif - - case R_SPARC_WDISP16: - v -= dot; - if (v % 4) - ret = obj_reloc_dangerous; - *loc = (*loc & ~0x303fff) | ((v << 4) & 0x300000) | ((v >> 2) & 0x3fff); - break; - case R_SPARC_WDISP19: - v -= dot; - if (v % 4) - ret = obj_reloc_dangerous; - *loc = (*loc & ~0x7ffff) | ((v >> 2) & 0x7ffff); - break; - case R_SPARC_7: - if (v > 0x7f) - ret = obj_reloc_overflow; - *loc = (*loc & ~0x7f) | (v & 0x7f); - break; - case R_SPARC_5: - if (v > 0x1f) - ret = obj_reloc_overflow; - *loc = (*loc & ~0x1f) | (v & 0x1f); - break; - case R_SPARC_6: - if (v > 0x3f) - ret = obj_reloc_overflow; - *loc = (*loc & ~0x3f) | (v & 0x3f); - break; -#endif /* R_SPARC_10 */ - - default: - ret = obj_reloc_unhandled; - break; - } - - return ret; -} - -int -arch_create_got (struct obj_file *ef) -{ - return 1; -} - -int -arch_init_module (struct obj_file *f, struct module *mod) -{ - return 1; -} - -int -arch_finalize_section_address(struct obj_file *f, Elf64_Addr base) -{ - int i, n = f->header.e_shnum; - - f->baseaddr = base; - for (i = 0; i < n; ++i) - f->sections[i]->header.sh_addr += base; - return 1; -} - -int -arch_archdata (struct obj_file *fin, struct obj_section *sec) -{ - return 0; -} diff --git a/mdk-stage1/insmod-modutils/util/Makefile b/mdk-stage1/insmod-modutils/util/Makefile deleted file mode 100644 index 844f8c0dc..000000000 --- a/mdk-stage1/insmod-modutils/util/Makefile +++ /dev/null @@ -1,39 +0,0 @@ - #****************************************************************************** - # - # insmod from modutils (generic) - # - # $Id$ - # - # Copyright 1996, 1997 Linux International. - # - #***************************************************************************** - -top_dir = ../.. - -include $(top_dir)/Makefile.common - - -all: libutil.a libutil-STANDALONE.a #libutil-DIET.a - -clean: - rm -f *.o *.a - - -FLAGS = -c -Wall -Os -fomit-frame-pointer -I./../include -D_GNU_SOURCE -DELF_MACHINE_H='"elf_$(ARCH).h"' -DARCH_$(ARCH) -DHAVE_WORDEXP=1 -DHAVE_GLOB=1 -DCONFIG_ROOT_CHECK_OFF=0 - -OBJS = xmalloc.o xrealloc.o xstrcat.o xstrdup.o xsystem.o xftw.o \ - modstat.o meta_expand.o config.o snap_shot.o arch64.o gzfiles.o sys_nim.o sys_oim.o - -libutil.a: $(OBJS) logger.o - ar cru $@ $^ - ranlib $@ - -libutil-STANDALONE.a: $(OBJS) logger-standalone.o - ar cru $@ $^ - ranlib $@ - -logger-standalone.o: logger.c - gcc $(FLAGS) $(GLIBC_INCLUDES) -o $@ -D_STANDALONE_ logger.c - -.c.o: - gcc $(FLAGS) $(GLIBC_INCLUDES) -c $< diff --git a/mdk-stage1/insmod-modutils/util/alias.h b/mdk-stage1/insmod-modutils/util/alias.h deleted file mode 100644 index c925a04f3..000000000 --- a/mdk-stage1/insmod-modutils/util/alias.h +++ /dev/null @@ -1,244 +0,0 @@ -/* - * This file is split out from config.c for easier editing - */ - -/* - * tbpath and tbtype are used to build the complete set of paths for finding - * modules, but only when we search for individual directories, they are not - * used for [boot] and [toplevel] searches. - */ -static char *tbpath[] = -{ - "/lib/modules", - NULL /* marks the end of the list! */ -}; - -char *tbtype[] = -{ - "kernel", /* as of 2.3.14 this must be first */ - "fs", - "net", - "scsi", - "block", - "cdrom", - "ipv4", - "ipv6", - "sound", - "fc4", - "video", - "misc", - "pcmcia", - "atm", - "usb", - "ide", - "ieee1394", - "mtd", - NULL /* marks the end of the list! */ -}; - -/* - * This is the list of pre-defined aliases. - * Each entry can be overridden by an entry in /etc/modules.conf - */ -char *aliaslist[] = -{ - "binfmt-204 binfmt_aout", - "binfmt-263 binfmt_aout", - "binfmt-264 binfmt_aout", - "binfmt-267 binfmt_aout", - "binfmt-387 binfmt_aout", - "binfmt-332 iBCS", - "binfmt--310 binfmt_java", - - "block-major-1 rd", - "block-major-2 floppy", - "block-major-3 ide-probe-mod", - "block-major-7 loop", - "block-major-8 sd_mod", - "block-major-9 md", /* For modular RAID */ - "block-major-11 sr_mod", - "block-major-13 xd", - "block-major-15 cdu31a", - "block-major-16 gscd", - "block-major-17 optcd", - "block-major-18 sjcd", - "block-major-20 mcdx", - "block-major-22 ide-probe-mod", - "block-major-23 mcd", - "block-major-24 sonycd535", - "block-major-25 sbpcd", - "block-major-26 sbpcd", - "block-major-27 sbpcd", - "block-major-29 aztcd", - "block-major-32 cm206", - "block-major-33 ide-probe-mod", - "block-major-34 ide-probe-mod", - "block-major-37 ide-tape", - "block-major-44 ftl", /* from David Woodhouse <dwmw2@infradead.org> */ - "block-major-56 ide-probe-mod", - "block-major-57 ide-probe-mod", - "block-major-88 ide-probe-mod", - "block-major-89 ide-probe-mod", - "block-major-90 ide-probe-mod", - "block-major-91 ide-probe-mod", - "block-major-93 nftl", /* from David Woodhouse <dwmw2@infradead.org> */ - - "char-major-4 serial", - "char-major-5 serial", - "char-major-6 lp", - "char-major-9 st", - "char-major-10 off", /* was: mouse, was: misc */ - "char-major-10-0 busmouse", /* /dev/logibm Logitech bus mouse */ - "char-major-10-1 off", /* /dev/psaux PS/2-style mouse port */ - "char-major-10-2 msbusmouse", /* /dev/inportbm Microsoft Inport bus mouse */ - "char-major-10-3 atixlmouse", /* /dev/atibm ATI XL bus mouse */ - /* /dev/jbm J-mouse */ - /* /dev/amigamouse Amiga mouse (68k/Amiga) */ - /* /dev/atarimouse Atari mouse */ - /* /dev/sunmouse Sun mouse */ - /* /dev/beep Fancy beep device */ - /* /dev/modreq Kernel module load request */ - "char-major-10-130 wdt", /* /dev/watchdog Watchdog timer port */ - "char-major-10-131 wdt", /* /dev/temperature Machine internal temperature */ - /* /dev/hwtrap Hardware fault trap */ - /* /dev/exttrp External device trap */ - "char-major-10-135 off", /* rtc cannot be compiled as a module */ - "char-major-10-139 openprom", /* /dev/openprom Linux/Sparc interface */ - "char-major-10-144 nvram", /* from Tigran Aivazian <tigran@sco.COM> */ - "char-major-10-157 applicom", /* from David Woodhouse <dwmw2@infradead.org> */ - "char-major-10-175 agpgart", /* /dev/agpgart GART AGP mapping access */ - "char-major-10-184 microcode", /* Tigran Aivazian <tigran@veritas.com> */ - - "char-major-14 soundcore", - "char-major-19 cyclades", - "char-major-20 cyclades", - "char-major-21 sg", - "char-major-22 pcxx", /* ?? */ - "char-major-23 pcxx", /* ?? */ - "char-major-27 ftape", - "char-major-34 scc", - "char-major-35 tclmidi", - "char-major-36 netlink", - "char-major-37 ide-tape", - "char-major-48 riscom8", - "char-major-49 riscom8", - "char-major-57 esp", - "char-major-58 esp", - "char-major-63 kdebug", - "char-major-90 mtdchar", /* from David Woodhouse <dwmw2@infradead.org> */ - "char-major-99 ppdev", - "char-major-107 3dfx", /* from Tigran Aivazian <tigran@sco.COM> */ - "char-major-161 ircomm-tty", - - "dos msdos", - "dummy0 dummy", - "dummy1 dummy", - "eth0 off", - "iso9660 isofs", - "md-personality-1 linear", - "md-personality-2 raid0", - "md-personality-3 raid1", - "md-personality-4 raid5", - - "net-pf-1 unix", /* PF_UNIX 1 Unix domain sockets */ - "net-pf-2 ipv4", /* PF_INET 2 Internet IP Protocol */ - "net-pf-3 off", /* PF_AX25 3 Amateur Radio AX.25 */ - "net-pf-4 ipx", /* PF_IPX 4 Novell IPX */ - "net-pf-5 appletalk", /* PF_APPLETALK 5 Appletalk DDP */ - "net-pf-6 off", /* PF_NETROM 6 Amateur radio NetROM */ - /* PF_BRIDGE 7 Multiprotocol bridge */ - /* PF_AAL5 8 Reserved for Werner's ATM */ - /* PF_X25 9 Reserved for X.25 project */ - /* PF_INET6 10 IP version 6 */ - - /* next two from <dairiki@matthews.dairiki.org> Thanks! */ - "net-pf-17 af_packet", - "net-pf-19 off", /* acorn econet */ - - "netalias-2 ip_alias", - "plip0 plip", - "plip1 plip", - "cipcb0 cipcb", - "cipcb1 cipcb", - "cipcb2 cipcb", - "cipcb3 cipcb", - "ppp0 ppp", - "ppp1 ppp", - "scsi_hostadapter off", /* if not in config file */ - "slip0 slip", - "slip1 slip", - "tty-ldisc-1 slip", - "tty-ldisc-3 ppp", - "ppp-compress-21 bsd_comp", - "ppp-compress-24 ppp_deflate", - "ppp-compress-26 ppp_deflate", - -#ifndef __sparc__ - "parport_lowlevel parport_pc", -#else - "parport_lowlevel parport_ax", -#endif - - "tty-ldisc-11 irtty", - - "usbdevfs usbcore", - - NULL /* marks the end of the list! */ -}; - -/* - * This is the list of pre-defined options. - * Each entry can be overridden by an entry in /etc/modules.conf - */ -char *optlist[] = -{ - "dummy0 -o dummy0", - "dummy1 -o dummy1", - "sb io=0x220 irq=7 dma=1 dma16=5 mpu_io=0x330", - NULL /* marks the end of the list! */ -}; - -/* - * This is the list of pre-defined "above"s, - * used for pull-in of additional modules - * Each entry can be overridden by an entry in /etc/modules.conf - */ -char *above[] = -{ - NULL /* marks the end of the list! */ -}; - -/* - * This is the list of pre-defined "below"s, - * used for push-in of additional modules - * Each entry can be overridden by an entry in /etc/modules.conf - */ -char *below[] = -{ - NULL /* marks the end of the list! */ -}; - -/* - * This is the list of pre-defined "prune"s, - * used to exclude paths from scan of /lib/modules. - * /etc/modules.conf can add entries but not remove them. - */ -char *prune[] = -{ - ".rhkmvtag", - "modules.dep", - "modules.generic_string", - "modules.pcimap", - "modules.isapnpmap", - "modules.usbmap", - "modules.parportmap", - "System.map", - ".config", - "build", /* symlink to source tree */ - "vmlinux", - "vmlinuz", - "bzImage", - "zImage", - ".rhkmvtag", /* wish RedHat had told me before they did this */ - NULL /* marks the end of the list! */ -}; diff --git a/mdk-stage1/insmod-modutils/util/arch64.c b/mdk-stage1/insmod-modutils/util/arch64.c deleted file mode 100644 index 4d5ace223..000000000 --- a/mdk-stage1/insmod-modutils/util/arch64.c +++ /dev/null @@ -1,35 +0,0 @@ -/* Misc utility functions. - Copyright 1996, 1997 Linux International. - Written by Keith Owens <kaos@ocs.com.au> - - This file is part of the Linux modutils. - - 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 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, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ident "$Id$" - -#include <stdlib.h> -#include <string.h> -#include <sys/utsname.h> -#include "util.h" - -/*======================================================================*/ - -/* Indicate if the current machine uses 64 bit architecture */ -int arch64(void) -{ - struct utsname u; - return(!uname(&u) && strstr(u.machine, "64")); -} diff --git a/mdk-stage1/insmod-modutils/util/config.c b/mdk-stage1/insmod-modutils/util/config.c deleted file mode 100644 index a860920f6..000000000 --- a/mdk-stage1/insmod-modutils/util/config.c +++ /dev/null @@ -1,1591 +0,0 @@ -/* - * Handle the configuration, including /etc/modules.conf - * - * Copyright 1994, 1995, 1996, 1997: - * Jacques Gelinas <jack@solucorp.qc.ca> - * Björn Ekwall <bj0rn@blox.se> February 1999 - * Keith Owens <kaos@ocs.com.au> October 1999 - * - * "kernelversion" idea from the Debian release via: - * Wichert Akkerman <wakkerma@cs.leidenuniv.nl> - * - * Björn, inspired by Richard Henderson <rth@twiddle.net>, cleaned up - * the wildcard handling and started using ftw in March 1999 - * Cleanup of hardcoded arrays: Björn Ekwall <bj0rn@blox.se> March 1999 - * Many additional keywords: Björn Ekwall <bj0rn@blox.se> (C) March 1999 - * Standardize on /etc/modules.conf Keith Owens <kaos@ocs.com.au> October 1999 - * - * Alpha typecast:Michal Jaegermann <michal@ellpspace.math.ualberta.ca> - * - * This file is part of the Linux modutils. - * - * 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 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, write to the Free Software Foundation, - * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -/* - * Specification: /etc/modules.conf / format - * Modules may be located at different places in the filesystem. - * - * The file /etc/modules.conf contains different definitions to - * control the manipulation of modules. - * - * Standard Unix style comments and continuation line are supported. - * Comments begin with a # and continue until the end of the line. - * A line continues on the next one if the last non-white character - * is a \. - */ -/* #Specification: /etc/modules.conf / format / official name */ - -#include <stdio.h> -#include <stdarg.h> -#include <assert.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <ctype.h> -#include <sys/stat.h> -#include <signal.h> -#include <limits.h> -#include <sys/param.h> -#include <errno.h> - -#include "util.h" -#include "config.h" -#include "alias.h" - -int flag_autoclean; /* set/used by modprobe and insmod */ - -struct utsname uts_info; - -struct PATH_TYPE *modpath; -int nmodpath = 0; -static int maxpath = 0; - -struct EXEC_TYPE *execs; -int nexecs = 0; -static int maxexecs = 0; - -OPT_LIST *opt_list; -static int n_opt_list; - -OPT_LIST *abovelist; -static int n_abovelist; - -OPT_LIST *belowlist; -static int n_belowlist; - -OPT_LIST *prunelist; -static int n_prunelist; - -OPT_LIST *probe_list; -static int n_probe_list; - -OPT_LIST *probeall_list; -static int n_probeall_list; - -OPT_LIST *aliases; -static int n_aliases; - -char *persistdir = "/var/lib/modules/persist"; - -const char symprefix[] = SYMPREFIX; - -char *insmod_opt = NULL; -char *config_file = NULL; /* Which file was actually used */ -time_t config_mtime; -int root_check_off = CONFIG_ROOT_CHECK_OFF; /* Default is modules must be owned by root */ -static char *config_version; /* Hack for config_add */ -int quick = 0; /* Option -A */ - -/* The initialization order must match the gen_file_enum order in config.h */ -struct gen_files gen_file[] = { - {"generic_string", NULL, 0}, - {"pcimap", NULL, 0}, - {"isapnpmap", NULL, 0}, - {"usbmap", NULL, 0}, - {"parportmap", NULL, 0}, - {"dep", NULL, 0}, -}; - -const int gen_file_count = sizeof(gen_file)/sizeof(gen_file[0]); - -int flag_verbose; - -unsigned long safemode; - -void verbose(const char *ctl,...) -{ - if (flag_verbose) { - va_list list; - va_start(list, ctl); - vprintf(ctl, list); - va_end(list); - fflush(stdout); - } -} - - -/* - * Check to see if the existing modules.xxx files need updating, - * based on the timestamps of the modules and the config file. - */ -static int check_update (const char *file, const struct stat *sb) -{ - int len = strlen(file); - int i; - - if (!S_ISREG(sb->st_mode)) - return 0; - for (i = 0; i < gen_file_count; ++i) { - if (sb->st_mtime > gen_file[i].mtime) - break; - } - if (i == gen_file_count) - return 0; /* All generated files are up to date */ - - if (len > 2 && !strcmp(file + len - 2, ".o")) - return 1; - else if (len > 4 && !strcmp(file + len - 4, ".mod")) - return 1; -#ifdef CONFIG_USE_ZLIB - else if (len > 5 && !strcmp(file + len - 5, ".o.gz")) - return 1; -#endif - return 0; -} - -static int need_update (const char *force_ver, const char *base_dir) -{ - struct stat tmp; - char dep[PATH_MAX]; - int i; - uname (&uts_info); - if (!force_ver) - force_ver = uts_info.release; - - if (strlen (force_ver) > 50) - /* That's just silly. */ - return 1; - - for (i = 0; i < gen_file_count; ++i) { - if (stat(gen_file[i].name, &tmp)) - return 1; /* No dependency file yet, so we need to build it. */ - gen_file[i].mtime = tmp.st_mtime; - } - - if (stat ("/etc/modules.conf", &tmp) && - stat ("/etc/conf.modules", &tmp)) - return 1; - - for (i = 0; i < gen_file_count; ++i) { - if (tmp.st_mtime > gen_file[i].mtime) - return 1; /* Config file is newer. */ - } - - snprintf (dep, sizeof(dep), "%s/lib/modules/%s", base_dir, force_ver); - return xftw (dep, check_update); -} - - -/* - * Strip white char at the end of a string. - * Return the address of the last non white char + 1 (point on the '\0'). - */ -static char *strip_end(char *str) -{ - int len = strlen(str); - - for (str += len - 1; len > 0 && (isspace(*str)); --len, --str) - *str = '\0'; - return str + 1; -} - -/* - * Read a line of a configuration file and process continuation lines. - * Return buf, or NULL if EOF. - * Blank at the end of line are always stripped. - * Everything on a line following comchar is a comment. - * - * Continuation character is \ - * Comment character is # - */ -char *fgets_strip(char *buf, int sizebuf, FILE * fin, int *lineno) -{ - int nocomment = 1; /* No comments found ? */ - int contline = 0; - char *start = buf; - char *ret = NULL; - char comchar = '#'; - char contchar = '\\'; - - *buf = '\0'; - - while (fgets(buf, sizebuf, fin) != NULL) { - char *end = strip_end(buf); - char *pt = strchr(buf, comchar); - - if (pt != NULL) { - nocomment = 0; - *pt = '\0'; - end = strip_end(buf); - } - - if (lineno != NULL) - (*lineno)++; - ret = start; - if (contline) { - char *pt = buf; - - while (isspace(*pt)) - pt++; - if (pt > buf + 1) { - strcpy(buf + 1, pt); /* safe, backward copy */ - buf[0] = ' '; - end -= (int) (pt - buf) - 1; - } else if (pt == buf + 1) { - buf[0] = ' '; - } - } - if (end > buf && *(end - 1) == contchar) { - if (end == buf + 1 || *(end - 2) != contchar) { - /* Continuation */ - contline = 1; - end--; - *end = '\0'; - buf = end; - } else { - *(end - 1) = '\0'; - break; - } - } else { - break; - } - } - - return ret; -} - -static char *next_word(char *pt) -{ - char *match; - char *pt2; - - /* find end of word */ - for (pt2 = pt; *pt2 && !(isspace(*pt2)); ++pt2) { - if ((match = strchr("\"'`", *pt2)) != NULL) { - for (++pt2; *pt2 && *pt2 != *match; ++pt2) { - if (*pt2 == '\\' && *(pt2 + 1) == *match) - ++pt2; - } - } - } - - /* skip leading whitespace before next word */ - if (*pt2) { - *pt2++ = '\0'; /* terminate last word */ - while (*pt2 && isspace(*pt2)) - ++pt2; - } - return pt2; -} - -static GLOB_LIST *addlist(GLOB_LIST *orig, GLOB_LIST *add) -{ - if (!orig) - return add; - /* else */ - orig->pathv = (char **)xrealloc(orig->pathv, - (orig->pathc + add->pathc + 1) * - sizeof(char *)); - memcpy(orig->pathv + orig->pathc, add->pathv, - add->pathc * sizeof(char *)); - orig->pathc += add->pathc; - orig->pathv[orig->pathc] = NULL; - /* - free(add->pathv); - free(add); - */ - return orig; -} - -static void decode_list(int *n, OPT_LIST **list, char *arg, int adding, - char *version, int opts) -{ - GLOB_LIST *pg; - GLOB_LIST *prevlist = NULL; - int i, autoclean = 1; - int where = *n; - char *arg2 = next_word(arg); - - if (opts && !strcmp (arg, "-k")) { - if (!*arg2) - error("Missing module argument after -k\n"); - arg = arg2; - arg2 = next_word(arg); - autoclean = 0; - } - - for (i = 0; i < *n; ++i) { - if (strcmp((*list)[i].name, arg) == 0) { - if (adding) - prevlist = (*list)[i].opts; - else - free((*list)[i].opts); - (*list)[i].opts = NULL; - where = i; - break; - } - } - if (where == *n) { - (*list) = (OPT_LIST *)xrealloc((*list), - (*n + 2) * sizeof(OPT_LIST)); - (*list)[*n].name = xstrdup(arg); - (*list)[*n].autoclean = autoclean; - *n += 1; - memset(&(*list)[*n], 0, sizeof(OPT_LIST)); - } else if (!autoclean) - (*list)[where].autoclean = 0; - pg = (GLOB_LIST *)xmalloc(sizeof(GLOB_LIST)); - meta_expand(arg2, pg, NULL, version, ME_ALL); - (*list)[where].opts = addlist(prevlist, pg); -} - -static void decode_exec(char *arg, int type) -{ - char *arg2; - - execs[nexecs].when = type; - arg2 = next_word(arg); - execs[nexecs].module = xstrdup(arg); - execs[nexecs].cmd = xstrdup(arg2); - if (++nexecs >= maxexecs) { - maxexecs += 10; - execs = (struct EXEC_TYPE *)xrealloc(execs, - maxexecs * sizeof(struct EXEC_TYPE)); - } -} - -static int build_list(char **in, OPT_LIST **out, char *version, int opts) -{ - GLOB_LIST *pg; - int i; - - for (i = 0; in[i]; ++i) { - char *p = xstrdup(in[i]); - char *pt = next_word(p); - char *pn = p; - - *out = (OPT_LIST *)xrealloc(*out, (i + 2) * sizeof(OPT_LIST)); - (*out)[i].autoclean = 1; - if (opts && !strcmp (p, "-k")) { - pn = pt; - pt = next_word(pn); - (*out)[i].autoclean = 0; - } - pg = (GLOB_LIST *)xmalloc(sizeof(GLOB_LIST)); - meta_expand(pt, pg, NULL, version, ME_ALL); - (*out)[i].name = xstrdup(pn); - (*out)[i].opts = pg; - free(p); - } - memset(&(*out)[i], 0, sizeof(OPT_LIST)); - - return i; -} - -/* Environment variables can override defaults, testing only */ -static void gen_file_env(struct gen_files *gf) -{ - if (!safemode) { - char *e = xmalloc(strlen(gf->base)+5), *p1 = gf->base, *p2 = e; - while ((*p2++ = toupper(*p1++))) ; - strcpy(p2-1, "PATH"); /* safe, xmalloc */ - if ((p2 = getenv(e)) != NULL) { - free(gf->name); - gf->name = xstrdup(p2); - } - free(e); - } -} - -/* Read a config option for a generated filename */ -static int gen_file_conf(struct gen_files *gf, int assgn, const char *parm, const char *arg) -{ - - int l = strlen(gf->base); - if (assgn && - strncmp(parm, gf->base, l) == 0 && - strcmp(parm+l, "file") == 0 && - !gf->name) { - gf->name = xstrdup(arg); - return(0); - } - return(1); -} - -/* Check we have a name for a generated file */ -static int gen_file_check(struct gen_files *gf, GLOB_LIST *g, - char *base_dir, char *version) -{ - char tmp[PATH_MAX]; - int ret = 0; - if (!gf->name) { - /* - * Specification: config file / no xxxfile parameter - * The default value for generated filename xxx is: - * - * xxxfile=/lib/modules/`uname -r`/modules.xxx - * - * If the config file exists but lacks an xxxfile - * specification, the default value is used since - * the system can't work without one. - */ - snprintf(tmp, sizeof(tmp), "%s/lib/modules/%s/modules.%s", - base_dir, version, gf->base); - gf->name = xstrdup(tmp); - } else { /* xxxfile defined in modules.conf */ - /* - * If we have a xxxfile definition in the configuration file - * we must resolve any shell meta-chars in its value. - */ - if (meta_expand(gf->name, g, base_dir, version, ME_ALL)) - ret = -1; - else if (!g->pathv || g->pathv[0] == NULL) - ret = -1; - else { - free(gf->name); - gf->name = xstrdup(g->pathv[0]); - } - } - return(ret); -} - -/* - * Read the configuration file. - * If parameter "all" == 0 then ignore everything except path info - * Return -1 if any error. - * Error messages generated. - */ -static int do_read(int all, char *force_ver, char *base_dir, char *conf_file, int depth) -{ - #define MAX_LEVEL 20 - FILE *fin; - GLOB_LIST g; - int i; - int assgn; - int drop_default_paths = 1; - int lineno = 0; - int ret = 0; - int state[MAX_LEVEL + 1]; /* nested "if" */ - int level = 0; - char buf[3000]; - char tmpline[100]; - char **pathp; - char *envpath; - char *version; - char *type; - char **glb; - char old_name[] = "/etc/conf.modules"; - int conf_file_specified = 0; - - /* - * The configuration file is optional. - * No error is printed if it is missing. - * If it is missing the following content is assumed. - * - * path[boot]=/lib/modules/boot - * - * path[toplevel]=/lib/modules/`uname -r` - * - * path[toplevel]=/lib/modules/`kernelversion` - * (where kernelversion gives the major kernel version: "2.0", "2.2"...) - * - * path[toplevel]=/lib/modules/default - * - * path[kernel]=/lib/modules/kernel - * path[fs]=/lib/modules/fs - * path[net]=/lib/modules/net - * path[scsi]=/lib/modules/scsi - * path[block]=/lib/modules/block - * path[cdrom]=/lib/modules/cdrom - * path[ipv4]=/lib/modules/ipv4 - * path[ipv6]=/lib/modules/ipv6 - * path[sound]=/lib/modules/sound - * path[fc4]=/lib/modules/fc4 - * path[video]=/lib/modules/video - * path[misc]=/lib/modules/misc - * path[pcmcia]=/lib/modules/pcmcia - * path[atm]=/lib/modules/atm - * path[usb]=/lib/modules/usb - * path[ide]=/lib/modules/ide - * path[ieee1394]=/lib/modules/ieee1394 - * path[mtd]=/lib/modules/mtd - * - * The idea is that modprobe will look first if the - * modules are compiled for the current release of the kernel. - * If not found, it will look for modules that fit for the - * general kernelversion (2.0, 2.2 and so on). - * If still not found, it will look into the default release. - * And if still not found, it will look in the other directories. - * - * The strategy should be like this: - * When you install a new linux kernel, the modules should go - * into a directory related to the release (version) of the kernel. - * Then you can do a symlink "default" to this directory. - * - * Each time you compile a new kernel, the make modules_install - * will create a new directory, but it won't change thee default. - * - * When you get a module unrelated to the kernel distribution - * you can place it in one of the last three directory types. - * - * This is the default strategy. Of course you can overide - * this in /etc/modules.conf. - * - * 2.3.15 added a new file tree walk algorithm which made it possible to - * point at a top level directory and get the same behaviour as earlier - * versions of modutils. 2.3.16 takes this one stage further, it - * removes all the individual directory names from most of the scans, - * only pointing at the top level directory. The only exception is the - * last ditch scan, scanning all of /lib/modules would be a bad idea(TM) - * so the last ditch scan still runs individual directory names under - * /lib/modules. - * - * Additional syntax: - * - * [add] above module module1 ... - * Specify additional modules to pull in on top of a module - * - * [add] below module module1 ... - * Specify additional modules needed to be able to load a module - * - * [add] prune filename ... - * - * [add] probe name module1 ... - * When "name" is requested, modprobe tries to install each - * module in the list until it succeeds. - * - * [add] probeall name module1 ... - * When "name" is requested, modprobe tries to install all - * modules in the list. - * If any module is installed, the command has succeeded. - * - * [add] options module option_list - * - * For all of the above, the optional "add" prefix is used to - * add to a list instead of replacing the contents. - * - * include FILE_TO_INCLUDE - * This does what you expect. No limitation on include levels. - * - * persistdir=persist_directory - * Name the directory to save persistent data from modules. - * - * In the following WORD is a sequence if non-white characters. - * If ' " or ` is found in the string, all characters up to the - * matching ' " or ` will also be included, even whitespace. - * Every WORD will then be expanded w.r.t. meta-characters. - * If the expanded result gives more than one word, then only - * the first word of the result will be used. - * - * - * define CODE WORD - * Do a putenv("CODE=WORD") - * - * EXPRESSION below can be: - * WORD compare_op WORD - * where compare_op is one of == != < <= >= > - * The string values of the WORDs are compared - * or - * -n WORD compare_op WORD - * where compare_op is one of == != < <= >= > - * The numeric values of the WORDs are compared - * or - * WORD - * if the expansion of WORD fails, or if the - * expansion is "0" (zero), "false" or "" (empty) - * then the expansion has the value FALSE. - * Otherwise the expansion has the value TRUE - * or - * -f FILENAME - * Test if the file FILENAME exists - * or - * -k - * Test if "autoclean" (i.e. called from the kernel) - * or - * ! EXPRESSION - * A negated expression is also an expression - * - * if EXPRESSION - * any config line - * ... - * elseif EXPRESSION - * any config line - * ... - * else - * any config line - * ... - * endif - * - * The else and elseif keywords are optional. - * "if"-statements nest up to 20 levels. - */ - - state[0] = 1; - - if (force_ver) - version = force_ver; - else - version = uts_info.release; - - config_version = xstrdup(version); - - /* Only read the default entries on the first file */ - if (depth == 0) { - maxpath = 100; - modpath = (struct PATH_TYPE *)xmalloc(maxpath * sizeof(struct PATH_TYPE)); - nmodpath = 0; - - maxexecs = 10; - execs = (struct EXEC_TYPE *)xmalloc(maxexecs * sizeof(struct EXEC_TYPE)); - nexecs = 0; - - /* - * Build predef options - */ - if (all && optlist[0]) - n_opt_list = build_list(optlist, &opt_list, version, 1); - - /* - * Build predef above - */ - if (all && above[0]) - n_abovelist = build_list(above, &abovelist, version, 0); - - /* - * Build predef below - */ - if (all && below[0]) - n_belowlist = build_list(below, &belowlist, version, 0); - - /* - * Build predef prune list - */ - if (prune[0]) - n_prunelist = build_list(prune, &prunelist, version, 0); - - /* - * Build predef aliases - */ - if (all && aliaslist[0]) - n_aliases = build_list(aliaslist, &aliases, version, 0); - - /* Order and priority is now: (MODPATH + modules.conf) || (predefs + modules.conf) */ - if ((envpath = getenv("MODPATH")) != NULL && !safemode) { - size_t len; - char *p; - char *path; - - /* Make a copy so's we can mung it with strtok. */ - len = strlen(envpath) + 1; - p = alloca(len); - memcpy(p, envpath, len); - path = alloca(PATH_MAX); - - for (p = strtok(p, ":"); p != NULL; p = strtok(NULL, ":")) { - len = snprintf(path, PATH_MAX, p, version); - modpath[nmodpath].path = xstrdup(path); - if ((type = strrchr(path, '/')) != NULL) - type += 1; - else - type = "misc"; - modpath[nmodpath].type = xstrdup(type); - if (++nmodpath >= maxpath) { - maxpath += 100; - modpath = (struct PATH_TYPE *)xrealloc(modpath, - maxpath * sizeof(struct PATH_TYPE)); - } - - } - } else { - /* - * Build the default "path[type]" configuration - */ - int n; - char *k; - - /* The first entry in the path list */ - modpath[nmodpath].type = xstrdup("boot"); - snprintf(tmpline, sizeof(tmpline), "%s/lib/modules/boot", base_dir); - modpath[nmodpath].path = xstrdup(tmpline); - ++nmodpath; - - /* The second entry in the path list, `uname -r` */ - modpath[nmodpath].type = xstrdup("toplevel"); - snprintf(tmpline, sizeof(tmpline), "%s/lib/modules/%s", base_dir, version); - modpath[nmodpath].path = xstrdup(tmpline); - ++nmodpath; - - /* The third entry in the path list, `kernelversion` */ - modpath[nmodpath].type = xstrdup("toplevel"); - for (n = 0, k = version; *k; ++k) { - if (*k == '.' && ++n == 2) - break; - } - snprintf(tmpline, sizeof(tmpline), "%s/lib/modules/%.*s", base_dir, - (/* typecast for Alpha */ int)(k - version), version); - modpath[nmodpath].path = xstrdup(tmpline); - ++nmodpath; - - /* The rest of the entries in the path list */ - for (pathp = tbpath; *pathp; ++pathp) { - char **type; - - for (type = tbtype; *type; ++type) { - char path[PATH_MAX]; - - snprintf(path, sizeof(path), "%s%s/%s", base_dir, *pathp, *type); - if (meta_expand(path, &g, NULL, version, ME_ALL)) - return -1; - - for (glb = g.pathv; glb && *glb; ++glb) { - modpath[nmodpath].type = xstrdup(*type); - modpath[nmodpath].path = *glb; - if (++nmodpath >= maxpath) { - maxpath += 100; - modpath = (struct PATH_TYPE *)xrealloc(modpath, - maxpath * sizeof(struct PATH_TYPE)); - } - } - } - } - } - - /* Environment overrides for testing only, undocumented */ - for (i = 0; i < gen_file_count; ++i) - gen_file_env(gen_file+i); - - } /* End of depth == 0 */ - - if (conf_file || - ((conf_file = getenv("MODULECONFIG")) != NULL && *conf_file && !safemode)) { - if (!(fin = fopen(conf_file, "r"))) { - error("Can't open %s", conf_file); - return -1; - } - conf_file_specified = 1; - } else { - if (!(fin = fopen((conf_file = ETC_MODULES_CONF), "r"))) { - /* Fall back to non-standard name */ - if ((fin = fopen((conf_file = old_name), "r"))) { - fprintf(stderr, - "Warning: modutils is reading from %s because\n" - " %s does not exist. The use of %s is\n" - " deprecated, please rename %s to %s\n" - " as soon as possible. Command\n" - " mv %s %s\n", - old_name, ETC_MODULES_CONF, - old_name, old_name, ETC_MODULES_CONF, - old_name, ETC_MODULES_CONF); - } - /* So what... use the default configuration */ - } - } - - if (fin) { - struct stat statbuf1, statbuf2; - if (fstat(fileno(fin), &statbuf1) == 0) - config_mtime = statbuf1.st_mtime; - config_file = xstrdup(conf_file); /* Save name actually used */ - if (!conf_file_specified && - stat(ETC_MODULES_CONF, &statbuf1) == 0 && - stat(old_name, &statbuf2) == 0) { - /* Both /etc files exist */ - if (statbuf1.st_dev == statbuf2.st_dev && - statbuf1.st_ino == statbuf2.st_ino) { - if (lstat(ETC_MODULES_CONF, &statbuf1) == 0 && - S_ISLNK(statbuf1.st_mode)) - fprintf(stderr, - "Warning: You do not need a link from %s to\n" - " %s. The use of %s is deprecated,\n" - " please remove %s and rename %s\n" - " to %s as soon as possible. Commands.\n" - " rm %s\n" - " mv %s %s\n", - ETC_MODULES_CONF, old_name, - old_name, ETC_MODULES_CONF, old_name, ETC_MODULES_CONF, - ETC_MODULES_CONF, - old_name, ETC_MODULES_CONF); - else { -#ifndef NO_WARN_ON_OLD_LINK - fprintf(stderr, - "Warning: You do not need a link from %s to\n" - " %s. The use of %s is deprecated,\n" - " please remove %s as soon as possible. Command\n" - " rm %s\n", - old_name, ETC_MODULES_CONF, - old_name, old_name, - old_name); -#endif - } - } - else - fprintf(stderr, - "Warning: modutils is reading from %s and\n" - " ignoring %s. The use of %s is deprecated,\n" - " please remove %s as soon as possible. Command\n" - " rm %s\n", - ETC_MODULES_CONF, old_name, - old_name, old_name, - old_name); - } - } - - /* - * Finally, decode the file - */ - while (fin && fgets_strip(buf, sizeof(buf) - 1, fin, &lineno) != NULL) { - char *arg2; - char *parm = buf; - char *arg; - int one_err = 0; - int adding; - - while (isspace(*parm)) - parm++; - - if (strncmp(parm, "add", 3) == 0) { - adding = 1; - parm += 3; - while (isspace(*parm)) - parm++; - } else - adding = 0; - - arg = parm; - - if (*parm == '\0') - continue; - - one_err = 1; - - while (*arg > ' ' && *arg != '=') - arg++; - - if (*arg == '=') - assgn = 1; - else - assgn = 0; - *arg++ = '\0'; - while (isspace(*arg)) - arg++; - - /* - * endif - */ - if (!assgn && strcmp(parm, "endif") == 0) { - if (level > 0) - --level; - else { - error("unmatched endif in line %d", lineno); - return -1; - } - continue; - } - - /* - * else - */ - if (!assgn && strcmp(parm, "else") == 0) { - if (level <= 0) { - error("else without if in line %d", lineno); - return -1; - } - state[level] = !state[level]; - continue; - } - - /* - * elseif - */ - if (!assgn && strcmp(parm, "elseif") == 0) { - if (level <= 0) { - error("elseif without if in line %d", lineno); - return -1; - } - if (state[level] != 0) { - /* - * We have already found a TRUE - * if statement in this "chain". - * That's what "2" means. - */ - state[level] = 2; - continue; - } - /* else: No TRUE if has been found, cheat */ - /* - * The "if" handling increments level, - * but this is the _same_ level as before. - * So, compensate for it. - */ - --level; - parm = "if"; - /* Fallthru to "if" */ - } - - /* - * if - */ - if (strcmp(parm, "if") == 0) { - char *cmp; - int not = 0; - int numeric = 0; - - if (level >= MAX_LEVEL) { - error("Too many nested if's in line %d\n", lineno); - return -1; - } - state[++level] = 0; /* default false */ - - if (*arg == '!') { - not = 1; - arg = next_word(arg); - } - - if (strncmp(arg, "-k", 2) == 0) { - state[level] = flag_autoclean; - continue; - } - - if (strncmp(arg, "-f", 2) == 0) { - char *file = next_word(arg); - meta_expand(file, &g, NULL, version, ME_ALL); - if (access(g.pathc ? g.pathv[0] : file, R_OK) == 0) - state[level] = !not; - else - state[level] = not; - continue; - } - - if (strncmp(arg, "-n", 2) == 0) { - numeric = 1; - arg = next_word(arg); - } - - - cmp = next_word(arg); - if (*cmp) { - GLOB_LIST g2; - long n1 = 0; - long n2 = 0; - char *w1 = ""; - char *w2 = ""; - - arg2 = next_word(cmp); - - meta_expand(arg, &g, NULL, version, ME_ALL); - if (g.pathc && g.pathv[0]) - w1 = g.pathv[0]; - - meta_expand(arg2, &g2, NULL, version, ME_ALL); - if (g2.pathc && g2.pathv[0]) - w2 = g2.pathv[0]; - - if (numeric) { - n1 = strtol(w1, NULL, 0); - n2 = strtol(w2, NULL, 0); - } - - if (strcmp(cmp, "==") == 0 || - strcmp(cmp, "=") == 0) { - if (numeric) - state[level] = (n1 == n2); - else - state[level] = strcmp(w1, w2) == 0; - } else if (strcmp(cmp, "!=") == 0) { - if (numeric) - state[level] = (n1 != n2); - else - state[level] = strcmp(w1, w2) != 0; - } else if (strcmp(cmp, ">=") == 0) { - if (numeric) - state[level] = (n1 >= n2); - else - state[level] = strcmp(w1, w2) >= 0; - } else if (strcmp(cmp, "<=") == 0) { - if (numeric) - state[level] = (n1 <= n2); - else - state[level] = strcmp(w1, w2) <= 0; - } else if (strcmp(cmp, ">") == 0) { - if (numeric) - state[level] = (n1 > n2); - else - state[level] = strcmp(w1, w2) > 0; - } else if (strcmp(cmp, "<") == 0) { - if (numeric) - state[level] = (n1 < n2); - else - state[level] = strcmp(w1, w2) < 0; - } - } else { /* Check defined value, if any */ - /* undef or defined as - * "" or "0" or "false" => false - * defined => true - */ - if (!meta_expand(arg, &g, NULL, version, ME_ALL) && - g.pathc > 0 && - strcmp(g.pathv[0], "0") != 0 && - strcmp(g.pathv[0], "false") != 0 && - strlen(g.pathv[0]) != 0) - state[level] = 1; /* true */ - } - if (not) - state[level] = !state[level]; - - continue; - } - - /* - * Should we bother? - */ - if (state[level] != 1) - continue; - - /* - * define - */ - if (!assgn && strcmp(parm, "define") == 0) { - char env[PATH_MAX]; - - arg2 = next_word(arg); - meta_expand(arg2, &g, NULL, version, ME_ALL); - snprintf(env, sizeof(env), "%s=%s", arg, (g.pathc ? g.pathv[0] : "")); - putenv(env); - one_err = 0; - } - - /* - * include - */ - if (!assgn && strcmp(parm, "include") == 0) { - meta_expand(arg, &g, NULL, version, ME_ALL); - - if (!do_read(all, version, base_dir, g.pathc ? g.pathv[0] : arg, depth+1)) - one_err = 0; - else - error("include %s failed\n", arg); - } - - /* - * above - */ - else if (all && !assgn && strcmp(parm, "above") == 0) { - decode_list(&n_abovelist, &abovelist, arg, adding, version, 0); - one_err = 0; - } - - /* - * below - */ - else if (all && !assgn && strcmp(parm, "below") == 0) { - decode_list(&n_belowlist, &belowlist, arg, adding, version, 0); - one_err = 0; - } - - /* - * prune - */ - else if (all && !assgn && strcmp(parm, "prune") == 0) { - decode_list(&n_prunelist, &prunelist, arg, adding, version, 0); - one_err = 0; - } - - /* - * probe - */ - else if (all && !assgn && strcmp(parm, "probe") == 0) { - decode_list(&n_probe_list, &probe_list, arg, adding, version, 0); - one_err = 0; - } - - /* - * probeall - */ - else if (all && !assgn && strcmp(parm, "probeall") == 0) { - decode_list(&n_probeall_list, &probeall_list, arg, adding, version, 0); - one_err = 0; - } - - /* - * options - */ - else if (all && !assgn && strcmp(parm, "options") == 0) { - decode_list(&n_opt_list, &opt_list, arg, adding, version, 1); - one_err = 0; - } - - /* - * alias - */ - else if (all && !assgn && strcmp(parm, "alias") == 0) { - /* - * Replace any previous (default) definitions - * for the same module - */ - decode_list(&n_aliases, &aliases, arg, 0, version, 0); - one_err = 0; - } - - /* - * Specification: /etc/modules.conf - * The format of the commands in /etc/modules.conf are: - * - * pre-install module command - * install module command - * post-install module command - * pre-remove module command - * remove module command - * post-remove module command - * - * The different words are separated by tabs or spaces. - */ - /* - * pre-install - */ - else if (all && !assgn && (strcmp(parm, "pre-install") == 0)) { - decode_exec(arg, EXEC_PRE_INSTALL); - one_err = 0; - } - - /* - * install - */ - else if (all && !assgn && (strcmp(parm, "install") == 0)) { - decode_exec(arg, EXEC_INSTALL); - one_err = 0; - } - - /* - * post-install - */ - else if (all && !assgn && (strcmp(parm, "post-install") == 0)) { - decode_exec(arg, EXEC_POST_INSTALL); - one_err = 0; - } - - /* - * pre-remove - */ - else if (all && !assgn && (strcmp(parm, "pre-remove") == 0)) { - decode_exec(arg, EXEC_PRE_REMOVE); - one_err = 0; - } - - /* - * remove - */ - else if (all && !assgn && (strcmp(parm, "remove") == 0)) { - decode_exec(arg, EXEC_REMOVE); - one_err = 0; - } - - /* - * post-remove - */ - else if (all && !assgn && (strcmp(parm, "post-remove") == 0)) { - decode_exec(arg, EXEC_POST_REMOVE); - one_err = 0; - } - - /* - * insmod_opt= - */ - else if (assgn && (strcmp(parm, "insmod_opt") == 0)) { - insmod_opt = xstrdup(arg); - one_err = 0; - } - - /* - * keep - */ - else if (!assgn && (strcmp(parm, "keep") == 0)) { - drop_default_paths = 0; - one_err = 0; - } - - /* - * path...= - */ - else if (assgn && strncmp(parm, "path", 4) == 0) { - /* - * Specification: config file / path parameter - * The path parameter specifies a directory to - * search for modules. - * This parameter may be repeated multiple times. - * - * Note that the actual path may be defined using - * wildcards and other shell meta-chars, such as "*?`". - * For example: - * path[misc]=/lib/modules/1.1.5?/misc - * - * Optionally the path keyword carries a tag. - * This tells us a little more about the purpose of - * this directory and allows some automated operations. - * A path is marked with a tag by adding the tag, - * enclosed in square brackets, to the path keyword: - * # - * path[boot]=/lib/modules/boot - * # - * This case identifies the path a of directory - * holding modules loadable a boot time. - */ - - if (drop_default_paths) { - int n; - - /* - * Specification: config file / path / default - * - * Whenever there is a path[] specification - * in the config file, all the default - * path are reset. - * - * If one instead wants to _add_ to the default - * set of paths, one has to have the option - * keep - * before the first path[]-specification line - * in the configuration file. - */ - drop_default_paths = 0; - for (n = 0; n < nmodpath; n++) { - free(modpath[n].path); - free(modpath[n].type); - } - nmodpath = 0; - } - - /* - * Get (the optional) tag - * If the tag is missing, the word "misc" - * is assumed. - */ - type = "misc"; - - if (parm[4] == '[') { - char *pt_type = parm + 5; - - while (*pt_type != '\0' && *pt_type != ']') - pt_type++; - - if (*pt_type == ']' && pt_type[1] == '\0') { - *pt_type = '\0'; - type = parm + 5; - } /* else CHECKME */ - } - - /* - * Handle the actual path description - */ - if (meta_expand(arg, &g, base_dir, version, ME_ALL)) - return -1; - for (glb = g.pathv; glb && *glb; ++glb) { - modpath[nmodpath].type = xstrdup(type); - modpath[nmodpath].path = *glb; - if (++nmodpath >= maxpath) { - maxpath += 100; - modpath = (struct PATH_TYPE *)xrealloc(modpath, - maxpath * sizeof(struct PATH_TYPE)); - } - } - one_err = 0; - } - - /* - * persistdir - */ - else if (assgn && strcmp(parm, "persistdir") == 0) { - meta_expand(arg, &g, NULL, version, ME_ALL); - persistdir = xstrdup(g.pathc ? g.pathv[0] : arg); - one_err = 0; - } - - /* Names for generated files in config file */ - for (i = 0; one_err && i < gen_file_count; ++i) - one_err = gen_file_conf(gen_file+i, assgn, parm, arg); - - /* - * any errors so far? - */ - if (all == 0) - one_err = 0; - else if (one_err) { - error("Invalid line %d in %s\n\t%s", - lineno, conf_file, buf); - ret = -1; - } - } - if (fin) - fclose(fin); - - if (level) { - error("missing endif at %s EOF", conf_file); - ret = -1; - } - - if (ret) - return ret; - /* else */ - - /* Check we have names for generated files */ - for (i = 0; !ret && i < gen_file_count; ++i) - ret = gen_file_check(gen_file+i, &g, base_dir, version); - - return ret; -} - -int config_read(int all, char *force_ver, char *base_dir, char *conf_file) -{ - int r; - if (modpath != NULL) - return 0; /* already initialized */ - - if (uname(&uts_info) < 0) { - error("Failed to find kernel name information"); - return -1; - } - - r = do_read(all, force_ver, base_dir, conf_file, 0); - - if (quick && !r && !need_update (force_ver, base_dir)) - exit (0); - - return r; -} - -/****************************************************************************/ -/* - * FIXME: Far too much global state. KAO. - */ -static int found; -static int favail; -static int one_only; -static int meta_expand_type; -char **list; -static const char *filter_by_file; -static char *filter_by_dir; - -/* - * Add a file name if it exist - */ -static int config_add(const char *file, const struct stat *sb) -{ - int i; - int npaths = 0; - char **paths = NULL; - - if (meta_expand_type) { - GLOB_LIST g; - char **p; - char full[PATH_MAX]; - - snprintf(full, sizeof(full), "%s/%s", file, filter_by_file); - - if (filter_by_dir && !strstr(full, filter_by_dir)) - return 0; - - if (meta_expand(full, &g, NULL, config_version, meta_expand_type)) - return 1; - for (p = g.pathv; p && *p; ++p) { - paths = (char **)xrealloc(paths, - (npaths + 1) * sizeof(char *)); - paths[npaths++] = *p; - } - } else { /* normal path match or match with "*" */ - if (!S_ISREG(sb->st_mode)) - return 0; - - if (strcmp(filter_by_file, "*")) { - char *p; - - if ((p = strrchr(file, '/')) == NULL) - p = (char *)file; - else - p += 1; - - if (strcmp(p, filter_by_file)) - return 0; - } - if (filter_by_dir && !strstr(file, filter_by_dir)) - return 0; - paths = (char **)xmalloc(sizeof(char **)); - *paths = xstrdup(file); - npaths = 1; - } - - for (i = 0; i < npaths; ++i) { - struct stat sbuf; - - if (S_ISDIR(sb->st_mode)) { - if (stat(paths[i], &sbuf) == 0) - sb = &sbuf; - } - if (S_ISREG(sb->st_mode) && sb->st_mode & S_IRUSR) { - int j; - char **this; - - if (!root_check_off) { - if (sb->st_uid != 0) { - error("%s is not owned by root", paths[i]); - continue; - } - } - - /* avoid duplicates */ - for (j = 0, this = list; j < found; ++j, ++this) { - if (strcmp(*this, paths[i]) == 0) { - free(paths[i]); - goto next; - } - } - - list[found] = paths[i]; - if (++found >= favail) - list = (char **)xrealloc(list, - (favail += 100) * sizeof(char *)); - - if (one_only) { - for (j = i + 1; j < npaths; ++j) - free(paths[j]); - free(paths); - return 1; /* finish xftw */ - } - } - next: - } - - if (npaths > 0) - free(paths); - - return 0; -} - -/* - * Find modules matching the name "match" in directory of type "type" - * (type == NULL matches all) - * - * Return a pointer to the list of modules found (or NULL if error). - * Update the counter (sent as parameter). - */ -GLOB_LIST *config_lstmod(const char *match, const char *type, int first_only) -{ - /* - * Note: - * There are _no_ wildcards remaining in the path descriptions! - */ - struct stat sb; - int i; - int ret = 0; - char *path = NULL; - char this[PATH_MAX]; - - if (!match) - match = "*"; - one_only = first_only; - found = 0; - filter_by_file = match; - filter_by_dir = NULL; - if (type) { - char tmpdir[PATH_MAX]; - snprintf(tmpdir, sizeof(tmpdir), "/%s/", type); - filter_by_dir = xstrdup(tmpdir); - } - /* In safe mode, the module name is always handled as is, without meta - * expansion. It might have come from an end user via kmod and must - * not be trusted. Even in unsafe mode, only apply globbing to the - * module name, not command expansion. We trust config file input so - * applying command expansion is safe, we do not trust command line input. - * This assumes that the only time the user can specify -C config file - * is when they run under their own authority. In particular all - * mechanisms that call modprobe as root on behalf of the user must - * run in safe mode, without letting the user supply a config filename. - */ - meta_expand_type = 0; - if (strpbrk(match, SHELL_META) && strcmp(match, "*") && !safemode) - meta_expand_type = ME_GLOB|ME_BUILTIN_COMMAND; - - list = (char **)xmalloc((favail = 100) * sizeof(char *)); - - for (i = 0; i < nmodpath; i++) { - path = modpath[i].path; - /* Special case: insmod: handle single, non-wildcard match */ - if (first_only && strpbrk(match, SHELL_META) == NULL) { - /* Fix for "2.1.121 syntax */ - snprintf(this, sizeof(this), "%s/%s/%s", path, - modpath[i].type, match); - if (stat(this, &sb) == 0 && - config_add(this, &sb)) - break; - /* End fix for "2.1.121 syntax */ - - snprintf(this, sizeof(this), "%s/%s", path, match); - if (stat(this, &sb) == 0 && - config_add(this, &sb)) - break; - } - - /* Start looking */ - if ((ret = xftw(path, config_add))) { - break; - } - } - if (ret >= 0) { - GLOB_LIST *g = (GLOB_LIST *)xmalloc(sizeof(GLOB_LIST)); - g->pathc = found; - g->pathv = list; - free(filter_by_dir); - return g; - } - free(list); - free(filter_by_dir); - return NULL; -} - -/* Given a bare module name, poke through the module path to find the file. */ -char *search_module_path(const char *base) -{ - GLOB_LIST *g; - - if (config_read(0, NULL, "", NULL) < 0) - return NULL; - /* else */ - g = config_lstmod(base, NULL, 1); - if (g == NULL || g->pathc == 0) { - char base_o[PATH_MAX]; - - snprintf(base_o, sizeof(base_o), "%s.o", base); - g = config_lstmod(base_o, NULL, 1); -#ifdef CONFIG_USE_ZLIB - if (g == NULL || g->pathc == 0) { - snprintf(base_o, sizeof(base_o), "%s.o.gz", base); - g = config_lstmod(base_o, NULL, 1); - } -#endif - } - if (g == NULL || g->pathc == 0) - return NULL; - /* else */ - return g->pathv[0]; -} diff --git a/mdk-stage1/insmod-modutils/util/gzfiles.c b/mdk-stage1/insmod-modutils/util/gzfiles.c deleted file mode 100644 index 8d02253bb..000000000 --- a/mdk-stage1/insmod-modutils/util/gzfiles.c +++ /dev/null @@ -1,74 +0,0 @@ -/* - * This simple library intends to make it transparent to read gzipped and/or - * standard files. This is simple enough to fit modutils' needs, but may be - * easily adapted to anyone's needs. It's completely free, do what you want - * with it . - Willy Tarreau <willy@meta-x.org> - 2000/05/05 - - */ - -#ifdef CONFIG_USE_ZLIB - -#include <stdio.h> -#include <zlib.h> -#include <sys/types.h> -#include <fcntl.h> -#include <unistd.h> - -/* redefinition of gz_stream which isn't exported by zlib */ -typedef struct gz_stream { - z_stream stream; - int z_err; /* error code for last stream operation */ - int z_eof; /* set if end of input file */ - FILE *file; /* .gz file */ - Byte *inbuf; /* input buffer */ - Byte *outbuf; /* output buffer */ - uLong crc; /* crc32 of uncompressed data */ - char *msg; /* error message */ - char *path; /* path name for debugging only */ - int transparent; /* 1 if input file is not a .gz file */ - char mode; /* 'w' or 'r' */ - long startpos; /* start of compressed data in file (header skipped) */ -} gz_stream; - -/* maximum number of simultaneous open files, also greater file descriptor number */ -#define MAXFD 64 - -/* this static list is assumed to be filled with NULLs at runtime */ -static gzFile gzf_fds[MAXFD]; - -/* returns the filedesc of the opened file. */ -int gzf_open(const char *name, int mode) { - int fd; - gzFile g; - - if ((g=gzopen(name, "rb")) != NULL) { - fd=fileno(((gz_stream*)g)->file); - gzf_fds[fd]=g; - } - else if ((fd=open(name, mode)) != -1) { - gzf_fds[fd]=NULL; /* NULL means not GZ mode */ - } - return fd; -} - -off_t gzf_lseek(int fd, off_t offset, int whence) { - if (fd<0 || fd>=MAXFD || gzf_fds[fd]==NULL) - return lseek(fd, offset, whence); - else - return gzseek(gzf_fds[fd], offset, whence); -} - -int gzf_read(int fd, void *buf, size_t count) { - if (fd<0 || fd>=MAXFD || gzf_fds[fd]==NULL) - return read(fd, buf, count); - else - return gzread(gzf_fds[fd], buf, count); -} - -void gzf_close(int fd) { - if (fd<0 || fd>=MAXFD || gzf_fds[fd]==NULL) - close(fd); - else - gzclose(gzf_fds[fd]); -} -#endif - diff --git a/mdk-stage1/insmod-modutils/util/logger.c b/mdk-stage1/insmod-modutils/util/logger.c deleted file mode 100644 index 3b790df5a..000000000 --- a/mdk-stage1/insmod-modutils/util/logger.c +++ /dev/null @@ -1,163 +0,0 @@ -/* Error logging facilities. - Copyright 1996, 1997 Linux International. - - Contributed by Richard Henderson <rth@tamu.edu> - - This file is part of the Linux modutils. - - 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 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, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#ident "$Id$" - -#include <stdio.h> -#include <stdarg.h> -#include <stdlib.h> -#include <errno.h> -#include <syslog.h> - -#include "util.h" - -/*======================================================================*/ - -int errors; -const char *error_file; -int log; - -#define STOREMSG -#ifdef STOREMSG -struct cbuf { - struct cbuf *next; - int type; - char *msg; -} *head, *tail; - -static void savemsg(int type, char *msg) -{ - struct cbuf *me = (struct cbuf *)xmalloc(sizeof(struct cbuf)); - char *s = xstrdup(msg); - - me->next = NULL; - me->type = type; - me->msg = s; - - if (tail) - tail->next = me; - else - head = me; - tail = me; -} - -#endif /* STOREMSG */ - -static void dumpmsg(void) -{ - for (;head; head = head->next) - syslog(head->type, "%s", head->msg); -} - -void setsyslog(const char *program) -{ - openlog(program, LOG_CONS, LOG_DAEMON); -#ifdef STOREMSG - atexit(dumpmsg); -#endif - log = 1; -} - - - -#ifdef _STANDALONE_ -static int silent; - -const char *program_name; - -void error(const char *fmt,...) -{ - va_list args; - - if (silent) - ; - else if (log) { - char buf[1024]; - int n; - - if (error_file) - n = snprintf(buf, sizeof(buf), "%s: ", error_file); - else - n = 0; - va_start(args, fmt); - vsnprintf(buf + n, sizeof(buf) - n, fmt, args); - va_end(args); -#ifdef STOREMSG - savemsg(LOG_ERR, buf); -#else - syslog(LOG_ERR, "%s", buf); -#endif - } else { - if (error_file) - fprintf(stderr, "%s: ", error_file); - va_start(args, fmt); - vfprintf(stderr, fmt, args); - va_end(args); - putc('\n', stderr); - } - - errors++; -} - -void lprintf(const char *fmt,...) -{ - va_list args; - - if (silent); - else if (log) { - char buf[1024]; - va_start(args, fmt); - vsnprintf(buf, sizeof(buf), fmt, args); - va_end(args); -#ifdef STOREMSG - savemsg(LOG_INFO, buf); -#else - syslog(LOG_INFO, "%s", buf); -#endif - } else { - va_start(args, fmt); - vfprintf(stdout, fmt, args); - va_end(args); - putchar('\n'); - } -} - -#else /* _STANDALONE_ */ -#include "../../log.h" -void error(const char *s, ...) -{ - va_list p; - - va_start(p, s); - vlog_message(s, p); - va_end(p); -} - -void lprintf(const char *s, ...) -{ - va_list p; - - va_start(p, s); - vlog_message(s, p); - va_end(p); -} -#endif diff --git a/mdk-stage1/insmod-modutils/util/meta_expand.c b/mdk-stage1/insmod-modutils/util/meta_expand.c deleted file mode 100644 index 41fb4024c..000000000 --- a/mdk-stage1/insmod-modutils/util/meta_expand.c +++ /dev/null @@ -1,339 +0,0 @@ -/* - * Handle expansion of meta charaters - * - * Copyright 1999 Björn Ekwall <bj0rn@blox.se> - * - * "kernelversion" idea from the Debian release via: - * Wichert Akkerman <wakkerma@cs.leidenuniv.nl> - * - * Use wordexp(): idea from Tim Waugh <tim@cyberelk.demon.co.uk> - * - * Alpha typecast: Michal Jaegermann <michal@ellpspace.math.ualberta.ca> - * - * This file is part of the Linux modutils. - * - * 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 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, write to the Free Software Foundation, - * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#ifdef HAVE_WORDEXP -#undef HAVE_WORDEXP -#define HAVE_WORDEXP 0 -#endif - -#include <stdio.h> -#include <stdlib.h> -#include <limits.h> -#include <string.h> -#include <ctype.h> -#if HAVE_WORDEXP -#include <wordexp.h> -#elif HAVE_GLOB -#include <glob.h> -#endif -#include "util.h" - -/* - * Split into words delimited by whitespace, - * handle remaining quotes though... - * If strip_quotes != 0 then strip one level of quotes from the line. - */ -static void split_line(GLOB_LIST *g, char *line, int strip_quotes) -{ - int len; - char *d; - char *e; - char *p; - char tmpline[PATH_MAX]; - - for (p = line; *p; p = e) { - /* Skip leading whitespace */ - while (*p && isspace(*p)) - ++p; - - /* find end of word */ - d = tmpline; - for (e = p; *e && !(isspace(*e)); ++e) { - char match; - - /* Quote handling */ - switch (*e) { - case '\\': - if (!strip_quotes) - *d++ = *e; - break; - - case '"': - case '\'': - match = *e; - if (!strip_quotes) - *d++ = *e; - for (++e; *e && *e != match; ++e) { - *d++ = *e; - if (*e == '\\' && *(e + 1) == match) - *d++ = *++e; - } - if (!strip_quotes) - *d++ = *e; - break; - - default: - *d++ = *e; - break; - } - } - - if ((len = (int)(d - tmpline)) > 0) { - char *str = xmalloc(len + 1); - strncpy(str, tmpline, len); - str[len] = '\0'; - g->pathv = (char **)xrealloc(g->pathv, - (g->pathc + 2) * sizeof(char *)); - g->pathv[g->pathc++] = str; - } - } - - if (g->pathc) - g->pathv[g->pathc] = NULL; -} - -static int glob_it(char *pt, GLOB_LIST *g) -{ -#if HAVE_WORDEXP - wordexp_t w; - - memset(&w, 0, sizeof(w)); - if (wordexp(pt, &w, WRDE_UNDEF)) { - /* - error("wordexp %s failed", pt); - */ - return -1; - } - /* else */ - g->pathc = w.we_wordc; - g->pathv = w.we_wordv; - - return 0; -#elif HAVE_GLOB /* but not wordexp */ - glob_t w; - - memset(&w, 0, sizeof(w)); - if (glob(pt, GLOB_NOSORT, NULL, &w)) { - /* - error("glob %s failed", pt); - */ - return -1; - } - /* else */ - if (w.gl_pathc && strpbrk(w.gl_pathv[0], SHELL_META)) { - globfree(&w); - return -1; - } - g->pathc = w.gl_pathc; - g->pathv = w.gl_pathv; - - return 0; -#else /* Neither wordexp nor glob */ - return -1; -#endif -} - -/* - * Expand the string (including meta-character) to a list of matches - * - * Return 0 if OK else -1 - */ -int meta_expand(char *pt, GLOB_LIST *g, char *base_dir, char *version, int type) -{ - FILE *fin; - int len = 0; - char *line = NULL; - char *p, *p1; - char tmpline[PATH_MAX + 1]; - char wrk[sizeof(tmpline)]; - char tmpcmd[2*sizeof(tmpline)+20]; /* room for /bin/echo "text" */ - - g->pathc = 0; - g->pathv = NULL; - - /* - * Take care of version dependent expansions - * Needed for forced version handling - */ - if ((p = strchr(pt, '`')) != NULL && (type & ME_BUILTIN_COMMAND)) { - do { - char *s; - - for (s = p + 1; isspace(*s); ++s) - ; - - if (strncmp(s, "uname -r", 8) == 0) { - while (*s && (*s != '`')) - ++s; - if (*s == '`') { - *p = '\0'; - snprintf(wrk, sizeof(wrk), "%s%s%s", - pt, - version, - s + 1); - *p = '`'; - } - strcpy(tmpline, wrk); /* safe, same size */ - pt = tmpline; - } else if (strncmp(s, "kernelversion", 13) == 0) { - while (*s && (*s != '`')) - ++s; - if (*s == '`') { - int n; - char *k; - - *p = '\0'; - for (n = 0, k = version; *k; ++k) { - if (*k == '.' && ++n == 2) - break; - } - snprintf(wrk, sizeof(wrk), "%s%.*s%s", - pt, - /* typecast for Alpha */ - (int)(k - version), - version, - s + 1); - *p = '`'; - strcpy(tmpline, wrk); /* safe, same size */ - pt = tmpline; - } - } else - break; - } while ((p = strchr(pt, '`')) != NULL); - } - - /* - * Any remaining meta-chars? - */ - if (strpbrk(pt, SHELL_META) == NULL) { - /* - * No meta-chars. - * Split into words, delimited by whitespace. - */ - snprintf(wrk, sizeof(wrk), "%s%s", (base_dir ? base_dir : ""), pt); - strcpy(tmpline, wrk); /* safe, same size */ - if ((p = strtok(tmpline, " \t\n")) != NULL) { - while (p) { - g->pathv = (char **)xrealloc(g->pathv, - (g->pathc + 2) * sizeof(char *)); - g->pathv[g->pathc++] = xstrdup(p); - p = strtok(NULL, " \t\n"); - } - } - if (g->pathc) - g->pathv[g->pathc] = NULL; - return 0; - } - /* else */ - /* - * Handle remaining meta-chars - */ - - /* - * Just plain quotes? - */ - if (strpbrk(pt, "&();|<>$`!{}[]~=+:?*") == NULL && - (p = strpbrk(pt, "\"'\\"))) { - split_line(g, pt, 1); - return 0; - } - - if (strpbrk(pt, "&();|<>$`\"'\\!{}~+:[]~?*") == NULL) { - /* Only "=" remaining, should be module options */ - split_line(g, pt, 0); - return 0; - } - - /* - * If there are meta-characters and - * if they are only shell glob meta-characters: do globbing - */ -#if HAVE_WORDEXP - if (strpbrk(pt, "&();|<>`\"'\\!{}~=+:") == NULL && - strpbrk(pt, "$[]~?*")) -#else - if (strpbrk(pt, "&();|<>$`\"'\\!{}~=+:") == NULL && - strpbrk(pt, "[]~?*")) -#endif - if ((type & ME_GLOB) && glob_it(pt, g) == 0) - return 0; - - if (strpbrk(pt, "&();|<>$`\"'\\!{}~+:[]~?*") == NULL) { - /* Only "=" remaining, should be module options */ - split_line(g, pt, 0); - return 0; - } - - /* - * Last resort: Use "echo". - * DANGER: Applying shell expansion to user supplied input is a - * major security risk. Modutils code should only do meta - * expansion via shell commands for trusted data. Basically - * this means only for data in the config file. Even that - * assumes that the user cannot run modprobe as root with - * their own config file. Programs (including the kernel) - * that invoke modprobe as root with user supplied input must - * pass exactly one user supplied parameter and must set - * safe mode. - */ - if (!(type & ME_SHELL_COMMAND)) - return 0; - snprintf(wrk, sizeof(wrk), "%s%s", (base_dir ? base_dir : ""), pt); - strcpy(tmpline, wrk); /* safe, same size */ - snprintf(tmpcmd, sizeof(tmpcmd), "/bin/echo \""); - for (p = tmpline, p1 = tmpcmd + strlen(tmpcmd); *p; ++p, ++p1) { - if (*p == '"' || *p == '\\') - *p1++ = '\\'; - *p1 = *p; - } - *p1++ = '"'; - *p1++ = '\0'; - if (p1 - tmpcmd > sizeof(tmpcmd)) { - error("tmpcmd overflow, should never happen"); - exit(1); - } - if ((fin = popen(tmpcmd, "r")) == NULL) { - error("Can't execute: %s", tmpcmd); - return -1; - } - /* else */ - - /* - * Collect the result - */ - while (fgets(tmpcmd, PATH_MAX, fin) != NULL) { - int l = strlen(tmpcmd); - - line = (char *)xrealloc(line, len + l + 1); - line[len] = '\0'; - strcat(line + len, tmpcmd); /* safe, realloc */ - len += l; - } - pclose(fin); - - if (line) { - /* shell used to strip one set of quotes. Paranoia code in - * 2.3.20 stops that strip so we do it ourselves. - */ - split_line(g, line, 1); - free(line); - } - - return 0; -} diff --git a/mdk-stage1/insmod-modutils/util/modstat.c b/mdk-stage1/insmod-modutils/util/modstat.c deleted file mode 100644 index ad82306c0..000000000 --- a/mdk-stage1/insmod-modutils/util/modstat.c +++ /dev/null @@ -1,419 +0,0 @@ -/* - * Get kernel symbol table(s) and other relevant module info. - * - * Add module_name_list and l_module_name_list. - * Keith Owens <kaos@ocs.com.au> November 1999. - * Björn Ekwall <bj0rn@blox.se> in February 1999 (C) - * Initial work contributed by Richard Henderson <rth@tamu.edu> - * - * This file is part of the Linux modutils. - * - * 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 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, write to the Free Software Foundation, - * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#include <unistd.h> -#include <stdlib.h> -#include <string.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <fcntl.h> -#include <errno.h> -#include "util.h" -#include "module.h" -#include "obj.h" -#include "modstat.h" - -struct module_stat *module_stat; -size_t n_module_stat; -char *module_name_list; -size_t l_module_name_list; -struct module_symbol *ksyms; -size_t nksyms; -int k_new_syscalls; - -static void *old_kernsym; - -/************************************************************************/ -static void drop(void) -{ - /* - * Clean the slate for multiple runs - */ - if (module_stat) { - struct module_stat *m; - int i; - - for (i = 0, m = module_stat; i < n_module_stat; ++i, ++m) { - if (m->syms) - free(m->syms); - if (m->refs) - free(m->refs); - } - free(module_stat); - module_stat = NULL; - n_module_stat = 0; - } - if (module_name_list) { - free(module_name_list); - module_name_list = NULL; - l_module_name_list = 0; - } - if (ksyms) { - free(ksyms); - ksyms = NULL; - nksyms = 0; - } - if (old_kernsym) { - free(old_kernsym); - old_kernsym = NULL; - } -} - -static int new_get_kernel_info(int type) -{ - struct module_stat *modules; - struct module_stat *m; - struct module_symbol *syms; - struct module_symbol *s; - size_t ret; - size_t bufsize; - size_t nmod; - size_t nsyms; - size_t i; - size_t j; - char *module_names; - char *mn; - - drop(); - - /* - * Collect the loaded modules - */ - module_names = xmalloc(bufsize = 256); - while (query_module(NULL, QM_MODULES, module_names, bufsize, &ret)) { - if (errno != ENOSPC) { - error("QM_MODULES: %m\n"); - return 0; - } - module_names = xrealloc(module_names, bufsize = ret); - } - module_name_list = module_names; - l_module_name_list = bufsize; - n_module_stat = nmod = ret; - module_stat = modules = xmalloc(nmod * sizeof(struct module_stat)); - memset(modules, 0, nmod * sizeof(struct module_stat)); - - /* Collect the info from the modules */ - for (i = 0, mn = module_names, m = modules; - i < nmod; - ++i, ++m, mn += strlen(mn) + 1) { - struct module_info info; - - m->name = mn; - if (query_module(mn, QM_INFO, &info, sizeof(info), &ret)) { - if (errno == ENOENT) { - /* The module was removed out from underneath us. */ - m->flags = NEW_MOD_DELETED; - continue; - } - /* else oops */ - error("module %s: QM_INFO: %m", mn); - return 0; - } - - m->addr = info.addr; - - if (type & K_INFO) { - m->size = info.size; - m->flags = info.flags; - m->usecount = info.usecount; - m->modstruct = info.addr; - } - - if (type & K_REFS) { - int mm; - char *mrefs; - char *mr; - - mrefs = xmalloc(bufsize = 64); - while (query_module(mn, QM_REFS, mrefs, bufsize, &ret)) { - if (errno != ENOSPC) { - error("QM_REFS: %m"); - return 1; - } - mrefs = xrealloc(mrefs, bufsize = ret); - } - for (j = 0, mr = mrefs; - j < ret; - ++j, mr += strlen(mr) + 1) { - for (mm = 0; mm < i; ++mm) { - if (strcmp(mr, module_stat[mm].name) == 0) { - m->nrefs += 1; - m->refs = xrealloc(m->refs, m->nrefs * sizeof(struct module_stat **)); - m->refs[m->nrefs - 1] = module_stat + mm; - break; - } - } - } - free(mrefs); - } - - if (type & K_SYMBOLS) { /* Want info about symbols */ - syms = xmalloc(bufsize = 1024); - while (query_module(mn, QM_SYMBOLS, syms, bufsize, &ret)) { - if (errno == ENOSPC) { - syms = xrealloc(syms, bufsize = ret); - continue; - } - if (errno == ENOENT) { - /* - * The module was removed out - * from underneath us. - */ - m->flags = NEW_MOD_DELETED; - free(syms); - goto next; - } else { - error("module %s: QM_SYMBOLS: %m", mn); - return 0; - } - } - nsyms = ret; - - m->nsyms = nsyms; - m->syms = syms; - - /* Convert string offsets to string pointers */ - for (j = 0, s = syms; j < nsyms; ++j, ++s) - s->name += (unsigned long) syms; - } - next: - } - - if (type & K_SYMBOLS) { /* Want info about symbols */ - /* Collect the kernel's symbols. */ - syms = xmalloc(bufsize = 16 * 1024); - while (query_module(NULL, QM_SYMBOLS, syms, bufsize, &ret)) { - if (errno != ENOSPC) { - error("kernel: QM_SYMBOLS: %m"); - return 0; - } - syms = xrealloc(syms, bufsize = ret); - } - nksyms = nsyms = ret; - ksyms = syms; - - /* Convert string offsets to string pointers */ - for (j = 0, s = syms; j < nsyms; ++j, ++s) - s->name += (unsigned long) syms; - } - - return 1; -} - -#ifdef COMPAT_2_0 -/************************************************************************/ - -#define mscan(offs,siz,ptr) \ - if (lseek(kmem_fd, (off_t)(offs), SEEK_SET) == -1 || \ - read(kmem_fd, (ptr), (siz)) != (siz)) { \ - if (kmem_fd != -1) \ - close(kmem_fd); \ - error("kmem: %m"); \ - return 0; \ - } - -#define OLD_MOD_RUNNING 1 -#define OLD_MOD_DELETED 2 -#define OLD_MOD_VISITED 0x20000000 - -/* Fetch all the symbols and divvy them up as appropriate for the modules. */ -static int old_get_kernel_info(int type) -{ - struct old_kernel_sym *kernsym; - struct old_kernel_sym *k; - struct module_stat *module; - struct module_stat *mod; - struct module_symbol *s = NULL; - int kmem_fd = -1; - int nkernsym; - int nmod; - int nm; - int nms; - int i; - - drop(); - module_name_list = xmalloc(1); - *module_name_list = '\0'; - - if ((nkernsym = get_kernel_syms(NULL)) < 0) { - error("get_kernel_syms: %m"); - return 0; - } - kernsym = k = xmalloc(nkernsym * sizeof(struct old_kernel_sym)); - old_kernsym = kernsym; - if (get_kernel_syms(kernsym) != nkernsym) { - error("inconsistency with get_kernel_syms -- is someone else " - "playing with modules?"); - free(kernsym); - return 0; - } - - /* Number of modules */ - for (k = kernsym, nmod = 0, i = 0; i < nkernsym; ++i, ++k) { - if (k->name[0] == '#') { - if (k->name[1]) { - ++nmod; - i = strlen(k->name+1) + 1; - module_name_list = - xrealloc(module_name_list, - l_module_name_list + i); - strcpy(module_name_list+l_module_name_list, /* safe, xrealloc */ - k->name+1); - l_module_name_list += i; /* NUL separated strings */ - } - else - break; - } - } - module_stat = mod = module = xmalloc(nmod * sizeof(struct module_stat)); - memset(module, 0, nmod * sizeof(struct module_stat)); - n_module_stat = nmod; - - /* - * Will we need kernel internal info? - */ - if ((type & K_INFO) || (type & K_REFS)) { - if ((kmem_fd = open("/dev/kmem", O_RDONLY)) < 0) { - perror("ksyms: open /dev/kmem"); - return 0; - } - } - - /* - * Collect the module information. - */ - for (k = kernsym, nm = 0, i = 0; i < nkernsym; ++i, ++k) { - if (k->name[0] == '#') { - struct old_kernel_sym *p; - struct old_module info; - - if (k->name[1] == '\0') - break; /* kernel resident symbols follow */ - /* else normal module */ - - module = mod++; - ++nm; - module->name = k->name + 1; - module->modstruct = k->value; - - if ((type & K_INFO) || (type & K_REFS)) { - long tmp; - /* - * k->value is the address of the - * struct old_module - * in the kernel (for use via /dev/kmem) - */ - mscan(k->value, sizeof(info), &info); - module->addr = info.addr; - module->size = info.size * getpagesize(); - - mscan(info.addr, sizeof(long), &tmp); - module->flags = info.state & - (OLD_MOD_RUNNING | OLD_MOD_DELETED); - module->flags |= NEW_MOD_USED_ONCE; /* Cheat */ - if (tmp & OLD_MOD_AUTOCLEAN) - module->flags |= NEW_MOD_AUTOCLEAN; - if (tmp & OLD_MOD_VISITED) - module->flags |= NEW_MOD_VISITED; - - module->usecount = tmp & ~(OLD_MOD_AUTOCLEAN | OLD_MOD_VISITED); - } - - if ((type & K_REFS) && info.ref) { - struct old_module_ref mr; - int j; - unsigned long ref = info.ref; - - do { - mscan(ref, sizeof(struct old_module_ref), &mr); - for (j = 0; j < nm -1; ++j) { - if (mr.module == module_stat[j].modstruct) { - module->nrefs += 1; - module->refs = xrealloc(module->refs, module->nrefs * sizeof(struct module_stat **)); - module->refs[module->nrefs - 1] = module_stat + j; - break; - } - } - } while ((ref = mr.next) != 0); - } - - if (!(type & K_SYMBOLS)) - continue; - /* - * Find out how many symbols this module has. - */ - for (nms = 0, p = k+1; p->name[0] != '#'; ++p) - ++nms; - s = xmalloc(nms * sizeof(struct module_symbol)); - module->syms = s; - module->nsyms = nms; - } else if (type & K_SYMBOLS) { /* Want info about symbols */ - s->name = (unsigned long) k->name; - s->value = k->value; - ++s; - } - } - if ((type & K_INFO) || (type & K_REFS)) { - if (kmem_fd != -1) - close(kmem_fd); - } - - /* - * Kernel resident symbols follows - */ - if (type & K_SYMBOLS) { /* Want info about symbols */ - if (k->name[0] == '#') - ++k; - nksyms = nkernsym - (k - kernsym); - if (nksyms) { - ksyms = s = xmalloc(nksyms * sizeof(struct module_symbol)); - for (i = 0; i < nksyms; ++i, ++k) { - if (k->name[0] != '#') { - s->name = (unsigned long) k->name; - s->value = k->value; - ++s; - } - } - nksyms = s - ksyms; - } else - ksyms = NULL; - } - - return 1; -} -#endif /* COMPAT_2_0 */ - -int get_kernel_info(int type) -{ - k_new_syscalls = !query_module(NULL, 0, NULL, 0, NULL); - -#ifdef COMPAT_2_0 - if (!k_new_syscalls) - return old_get_kernel_info(type); -#endif /* COMPAT_2_0 */ - - return new_get_kernel_info(type); -} diff --git a/mdk-stage1/insmod-modutils/util/snap_shot.c b/mdk-stage1/insmod-modutils/util/snap_shot.c deleted file mode 100644 index ae0cc7c79..000000000 --- a/mdk-stage1/insmod-modutils/util/snap_shot.c +++ /dev/null @@ -1,154 +0,0 @@ -/* Take a snap shot of ksyms and modules for Oops debugging - Copyright 1999 Linux International. - - Contributed by Keith Owens <kaos@ocs.com.au> - - This file is part of the Linux modutils. - - 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 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, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#ident "$Id$" - -#include <errno.h> -#include <stdio.h> -#include <stdarg.h> -#include <time.h> -#include <unistd.h> -#include <string.h> - -#include "module.h" -#include "obj.h" -#include "modstat.h" -#include "util.h" - -static char snap_dir[] = "/var/log/ksymoops"; - -/* If snap_dir exists, take a snap shot of ksyms and modules to snap_dir. - * Prefix the files with the equivalent of - * date +%Y%m%d%T%M%S | sed -e 's/://g' - */ -void snap_shot(const char *module_names, int n_module_names) -{ - char file[] = "ccyymmddhhmmss.modules", buffer[4096]; - static char *infile[] = { "/proc/ksyms", "/proc/modules" }; - static char *suffix[] = { "ksyms", "modules" }; - struct tm *local; - time_t t; - int i, l; - FILE *in, *out; - - if (module_names) { - /* Only snap shot if the list of modules has changed. - * Otherwise auto cleanup takes a snap shot every time - * and ends up with a large snap shot directory. - */ - char *new_module_names; - size_t n_new_module_names; - get_kernel_info(0); - new_module_names = module_name_list; - n_new_module_names = n_module_stat; - if (n_module_names && n_new_module_names == n_module_names) { - while (n_module_names) { - if (strcmp(module_names, new_module_names)) - break; /* difference detected */ - i = strlen(module_names) + 1; - module_names += i; - new_module_names += i; - --n_module_names; - } - } - if (!n_module_names) - return; /* no difference, no need for snap shot */ - } - - if (chdir(snap_dir)) - return; - t = time(NULL); - local = localtime(&t); - for (i = 0; i < sizeof(infile)/sizeof(infile[0]); ++i) { - snprintf(file, sizeof(file), "%04d%02d%02d%02d%02d%02d.%s", - local->tm_year+1900, - local->tm_mon + 1, - local->tm_mday, - local->tm_hour, - local->tm_min, - local->tm_sec, - suffix[i]); - out = fopen(file, "w"); - if (!out) { - error("cannot create %s/%s %m", snap_dir, file); - return; - } - in = fopen(infile[i], "r"); - if (!in) { - error("cannot open %s %m", infile[i]); - return; - } - while ((l = fread(buffer, 1, sizeof(buffer), in)) > 0) { - if (fwrite(buffer, l, 1, out) != 1) { - error("unable to write to %s %m", file); - fclose(in); - fclose(out); - return; - } - } - if (ferror(in)) - error("unable to read from %s %m", infile[i]); - fclose(in); - fclose(out); - } -} - -/* If snap_dir exists, log a message to snap_dir. The log file is called the - * equivalent of date +%Y%m%d | sed -e 's/://g'. Each line is prefixed with - * timestamp down to seconds and followed by a newline. - */ -void snap_shot_log(const char *fmt,...) -{ - char date[] = "ccyymmdd", file[] = "ccyymmdd.log", stamp[] = "ccyymmdd hhmmss"; - struct tm *local; - time_t t; - FILE *log; - va_list args; - int save_errno = errno; - - if (chdir(snap_dir)) - return; - t = time(NULL); - local = localtime(&t); - snprintf(date, sizeof(date), "%04d%02d%02d", - local->tm_year+1900, - local->tm_mon + 1, - local->tm_mday); - snprintf(file, sizeof(file), "%s.log", date); - log = fopen(file, "a"); - if (!log) { - error("cannot create %s/%s %m", snap_dir, file); - return; - } - snprintf(stamp, sizeof(stamp), "%s %02d%02d%02d", - date, - local->tm_hour, - local->tm_min, - local->tm_sec); - fprintf(log, "%s ", stamp); - va_start(args, fmt); - errno = save_errno; /* fmt may use %m */ - vfprintf(log, fmt, args); - va_end(args); - fprintf(log, "\n"); - fclose(log); -} diff --git a/mdk-stage1/insmod-modutils/util/sys_cm.c b/mdk-stage1/insmod-modutils/util/sys_cm.c deleted file mode 100644 index 851fb709e..000000000 --- a/mdk-stage1/insmod-modutils/util/sys_cm.c +++ /dev/null @@ -1,88 +0,0 @@ -/* Functions for the Linux module syscall interface. - Copyright 1996, 1997 Linux International. - Contributed by Richard Henderson <rth@tamu.edu> - - This file is part of the Linux modutils. - - 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 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, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ident "$Id$" - -#include <stdlib.h> -#include <errno.h> - -#include "module.h" - -/* Kernel headers before 2.1.mumble need this on the Alpha to get - _syscall* defined. */ -#define __LIBRARY__ - -#include <asm/unistd.h> - - -/*======================================================================*/ - -#if defined(__i386__) || defined(__m68k__) || defined(__arm__) - -#define __NR__create_module __NR_create_module -static inline _syscall2(long, _create_module, const char *, name, size_t, size) - -unsigned long create_module(const char *name, size_t size) -{ - /* Why all this fuss? - - In linux 2.1, the address returned by create module point in - kernel space which is now mapped at the top of user space (at - 0xc0000000 on i386). This looks like a negative number for a - long. The normal syscall macro of linux 2.0 (and all libc compile - with linux 2.0 or below) consider that the return value is a - negative number and consider it is an error number (A kernel - convention, return value are positive or negative, indicating the - error number). - - By checking the value of errno, we know if we have been fooled by - the syscall2 macro and we fix it. */ - - long ret = _create_module(name, size); - if (ret == -1 && errno > 125) - { - ret = -errno; - errno = 0; - } - return ret; -} - -#elif defined(__alpha__) - -/* Alpha doesn't have the same problem, exactly, but a bug in older - kernels fails to clear the error flag. Clear it here explicitly. */ - -#define __NR__create_module __NR_create_module -static inline _syscall4(unsigned long, _create_module, const char *, name, - size_t, size, size_t, dummy, size_t, err); - -unsigned long create_module(const char *name, size_t size) -{ - return _create_module(name, size, 0, 0); -} - -#else - -/* Sparc, MIPS, (and Alpha, but that's another problem) don't mistake - return values for errors due to the nature of the system call. */ - -_syscall2(unsigned long, create_module, const char *, name, size_t, size) - -#endif diff --git a/mdk-stage1/insmod-modutils/util/sys_dm.c b/mdk-stage1/insmod-modutils/util/sys_dm.c deleted file mode 100644 index a166a30f4..000000000 --- a/mdk-stage1/insmod-modutils/util/sys_dm.c +++ /dev/null @@ -1,37 +0,0 @@ -/* Functions for the Linux module syscall interface. - Copyright 1996, 1997 Linux International. - Contributed by Richard Henderson <rth@tamu.edu> - - This file is part of the Linux modutils. - - 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 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, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ident "$Id$" - -#include <stdlib.h> -#include <errno.h> - -#include "module.h" - -/* Kernel headers before 2.1.mumble need this on the Alpha to get - _syscall* defined. */ -#define __LIBRARY__ - -#include <asm/unistd.h> - - -/*======================================================================*/ - -_syscall1(int, delete_module, const char *, name) diff --git a/mdk-stage1/insmod-modutils/util/sys_gks.c b/mdk-stage1/insmod-modutils/util/sys_gks.c deleted file mode 100644 index f71772c71..000000000 --- a/mdk-stage1/insmod-modutils/util/sys_gks.c +++ /dev/null @@ -1,37 +0,0 @@ -/* Functions for the Linux module syscall interface. - Copyright 1996, 1997 Linux International. - Contributed by Richard Henderson <rth@tamu.edu> - - This file is part of the Linux modutils. - - 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 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, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ident "$Id$" - -#include <stdlib.h> -#include <errno.h> - -#include "module.h" - -/* Kernel headers before 2.1.mumble need this on the Alpha to get - _syscall* defined. */ -#define __LIBRARY__ - -#include <asm/unistd.h> - - -/*======================================================================*/ - -_syscall1(int, get_kernel_syms, struct old_kernel_sym *, ksyms) diff --git a/mdk-stage1/insmod-modutils/util/sys_nim.c b/mdk-stage1/insmod-modutils/util/sys_nim.c deleted file mode 100644 index bbe42135c..000000000 --- a/mdk-stage1/insmod-modutils/util/sys_nim.c +++ /dev/null @@ -1,53 +0,0 @@ -/* Functions for the Linux module syscall interface. - Copyright 1996, 1997 Linux International. - Contributed by Richard Henderson <rth@tamu.edu> - - This file is part of the Linux modutils. - - 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 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, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ident "$Id$" - -#include <stdlib.h> -#include <errno.h> - -#include "module.h" - -/* Kernel headers before 2.1.mumble need this on the Alpha to get - _syscall* defined. */ -#define __LIBRARY__ - -#include <asm/unistd.h> - - -/*======================================================================*/ - -#ifndef CONFIG_USE_SYSCALL - -extern int init_module(const char *name, const struct module *info); - -int -sys_init_module(const char *name, const struct module *info) -{ - return init_module(name, info); -} - -#else - -#define __NR_sys_init_module __NR_init_module -_syscall2(int, sys_init_module, const char *, name, - const struct module *, info) - -#endif diff --git a/mdk-stage1/insmod-modutils/util/sys_oim.c b/mdk-stage1/insmod-modutils/util/sys_oim.c deleted file mode 100644 index 73ac6be52..000000000 --- a/mdk-stage1/insmod-modutils/util/sys_oim.c +++ /dev/null @@ -1,40 +0,0 @@ -/* Functions for the Linux module syscall interface. - Copyright 1996, 1997 Linux International. - Contributed by Richard Henderson <rth@tamu.edu> - - This file is part of the Linux modutils. - - 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 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, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ident "$Id$" - -#include <stdlib.h> -#include <errno.h> - -#include "module.h" - -/* Kernel headers before 2.1.mumble need this on the Alpha to get - _syscall* defined. */ -#define __LIBRARY__ - -#include <asm/unistd.h> - - -/*======================================================================*/ - -#define __NR_old_sys_init_module __NR_init_module -_syscall5(int, old_sys_init_module, const char *, name, char *, code, - unsigned, codesize, struct old_mod_routines *, routines, - struct old_symbol_table *, symtab) diff --git a/mdk-stage1/insmod-modutils/util/sys_qm.c b/mdk-stage1/insmod-modutils/util/sys_qm.c deleted file mode 100644 index 119a219a2..000000000 --- a/mdk-stage1/insmod-modutils/util/sys_qm.c +++ /dev/null @@ -1,56 +0,0 @@ -/* Functions for the Linux module syscall interface. - Copyright 1996, 1997 Linux International. - Contributed by Richard Henderson <rth@tamu.edu> - - This file is part of the Linux modutils. - - 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 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, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ident "$Id$" - -#include <stdlib.h> -#include <errno.h> - -#include "module.h" - -/* Kernel headers before 2.1.mumble need this on the Alpha to get - _syscall* defined. */ -#define __LIBRARY__ - -#include <asm/unistd.h> - - -/*======================================================================*/ - -/* I am fucking tired of the "this doesn't build on 2.0.x" questions. - But if you ask, we still officially require 2.1.x to build. */ -#if !defined(__NR_query_module) -# if defined(__i386__) -# define __NR_query_module 167 -# elif defined(__alpha__) -# define __NR_query_module 347 -# elif defined(__sparc__) -# define __NR_query_module 184 -# elif defined(__mc68000__) -# define __NR_query_module 167 -# elif defined(__arm__) -# define __NR_query_module (__NR_SYSCALL_BASE + 167) -# elif defined(__mips__) -# define __NR_query_module 4187 -# endif -#endif - -_syscall5(int, query_module, const char *, name, int, which, - void *, buf, size_t, bufsize, size_t *, ret); diff --git a/mdk-stage1/insmod-modutils/util/xftw.c b/mdk-stage1/insmod-modutils/util/xftw.c deleted file mode 100644 index fe764a63c..000000000 --- a/mdk-stage1/insmod-modutils/util/xftw.c +++ /dev/null @@ -1,422 +0,0 @@ -/* - * modutils specific implementation of ftw(). - * - * Copyright 2000: - * Keith Owens <kaos@ocs.com.au> August 2000 - * - * This file is part of the Linux modutils. - * - * 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 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, write to the Free Software Foundation, - * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -/* - modutils requires special processing during the file tree walk - of /lib/modules/<version> and any paths that the user specifies. - The standard ftw() does a blind walk of all paths and can end - up following the build symlink down the kernel source tree. - Although nftw() has the option to get more control such as not - automatically following symbolic links, even that is not enough - for modutils. The requirements are: - - Paths must be directories or symlinks to directories. - - Each directory is read and sorted into alphabetical order - before processing. - - A directory is type 1 iff it was specified on a path statement - (either explicit or default) and the directory contains a - subdirectory with one of the known names and the directory name - does not end with "/kernel". Otherwise it is type 2. - - In a type 1 directory, walk the kernel subdirectory if it exists, - then the old known names in their historical order then any - remaining directory entries in alphabetical order and finally any - non-directory entries in alphabetical order. - - Entries in a type 1 directory are filtered against the "prune" - list. A type 1 directory can contain additional files which - are not modules nor symlinks to modules. The prune list skips - known additional files, if a distribution wants to store - additional text files in the top level directory they should be - added to the prune list. - - A type 2 directory must contain only modules or symlinks to - modules. They are processed in alphabetical order, without - pruning. Symlinks to directories are an error in type 2 - directories. - - The user function is not called for type 1 directories, nor for - pruned entries. It is called for type 2 directories and their - contents. It is also called for any files left in a type 1 - directory after pruning and processing type 2 subdirectories. - The user function never sees symlinks, they are resolved before - calling the function. - - Why have different directory types? The original file tree - walk was not well defined. Some users specified each directory - individually, others just pointed at the top level directory. - Either version worked until the "build" symlink was added. Now - users who specify the top level directory end up running the - entire kernel source tree looking for modules, not nice. We - cannot just ignore symlinks because pcmcia uses symlinks to - modules for backwards compatibility. - - Type 1 is when a user specifies the top level directory which needs - special processing, type 2 is individual subdirectories. But the - only way to tell the difference is by looking at the contents. The - "/kernel" directory introduced in 2.3.12 either contains nothing - (old make modules_install) or contains all the kernel modules using - the same tree structure as the source. Because "/kernel" can - contain old names but is really a type 2 directory, it is detected - as a special case. - */ - -#include <dirent.h> -#include <errno.h> -#include <limits.h> -#include <malloc.h> -#include <stdlib.h> -#include <string.h> -#include <sys/stat.h> - -#include "util.h" -#include "config.h" - -extern char *tbpath[]; - -extern OPT_LIST *prune_list; -extern int n_prune_list; - -extern char *tbtype[]; - -struct xftw_dirent { - struct stat statbuf; - char *name; - char *fullname; -}; - -#define XFTW_MAXDEPTH 64 /* Maximum directory depth handled */ - -typedef struct { - struct xftw_dirent *contents; - int size; - int used; -} xftw_tree_t; - -static xftw_tree_t tree[XFTW_MAXDEPTH]; - -/* Free all data for one tree level */ -static void xftw_free_tree(int depth) -{ - int i; - xftw_tree_t *t = tree+depth; - for (i = 0; i < t->size; ++i) { - free(t->contents[i].name); - free(t->contents[i].fullname); - } - free(t->contents); - t->contents = NULL; - t->size = 0; - t->used = 0; -} - -/* Increment dirents used at this depth, resizing if necessary */ -static void xftw_add_dirent(int depth) -{ - xftw_tree_t *t = tree+depth; - int i, size = t->size; - if (++t->used < size) - return; - size += 10; /* arbitrary increment */ - t->contents = xrealloc(t->contents, size*sizeof(*(t->contents))); - for (i = t->size; i < size; ++i) { - memset(&(t->contents[i].statbuf), 0, sizeof(t->contents[i].statbuf)); - t->contents[i].name = NULL; - t->contents[i].fullname = NULL; - } - t->size = size; -} - -/* Concatenate directory name and entry name into one string. - * Note: caller must free result or leak. - */ -static char *xftw_dir_name(const char *directory, const char *entry) -{ - int i = strlen(directory); - char *name; - if (entry) - i += strlen(entry); - i += 2; - name = xmalloc(i); - strcpy(name, directory); /* safe, xmalloc */ - if (*directory && entry) - strcat(name, "/"); /* safe, xmalloc */ - if (entry) - strcat(name, entry); /* safe, xmalloc */ - return(name); -} - -/* Call the user function for a directory entry */ -static int xftw_do_name(const char *directory, const char *entry, struct stat *sb, xftw_func_t funcptr) -{ - int ret = 0; - char *name = xftw_dir_name(directory, entry); - - if (S_ISLNK(sb->st_mode)) { - char real[PATH_MAX], *newname; - verbose("resolving %s symlink to ", name); - if (!(newname = realpath(name, real))) { - if (errno == ENOENT) { - verbose("%s: does not exist, dangling symlink ignored\n", real); - goto cleanup; - } - perror("... failed"); - goto cleanup; - } - verbose("%s ", newname); - if (lstat(newname, sb)) { - error("lstat on %s failed ", newname); - perror(""); - goto cleanup; - } - free(name); - name = xstrdup(newname); - } - - if (!S_ISREG(sb->st_mode) && - !S_ISDIR(sb->st_mode)) { - error("%s is not plain file nor directory\n", name); - goto cleanup; - } - - verbose("user function %s\n", name); - ret = (*funcptr)(name, sb); -cleanup: - free(name); - return(ret); -} - -/* Sort directory entries into alphabetical order */ -static int xftw_sortdir(const void *a, const void *b) -{ - return(strcmp(((struct xftw_dirent *)a)->name, ((struct xftw_dirent *)b)->name)); -} - -/* Read a directory and sort it, ignoring "." and ".." */ -static int xftw_readdir(const char *directory, int depth) -{ - DIR *d; - struct dirent *ent; - verbose("xftw_readdir %s\n", directory); - if (!(d = opendir(directory))) { - perror(directory); - return(1); - } - while ((ent = readdir(d))) { - char *name; - struct xftw_dirent *f; - if (strcmp(ent->d_name, ".") == 0 || - strcmp(ent->d_name, "..") == 0) - continue; - name = xftw_dir_name(directory, ent->d_name); - xftw_add_dirent(depth); - f = tree[depth].contents+tree[depth].used-1; - f->name = xstrdup(ent->d_name); - f->fullname = name; /* do not free name, it is in use */ - if (lstat(name, &(f->statbuf))) { - perror(name); - return(1); - } - } - closedir(d); - qsort(tree[depth].contents, tree[depth].used, sizeof(*(tree[0].contents)), &xftw_sortdir); - return(0); -} - -/* Process a type 2 directory */ -int xftw_type2(const char *directory, const char *entry, int depth, xftw_func_t funcptr) -{ - int ret, i; - xftw_tree_t *t = tree+depth; - struct stat statbuf; - char *dirname = xftw_dir_name(directory, entry); - - verbose("type 2 %s\n", dirname); - if (depth > XFTW_MAXDEPTH) { - error("xftw_type2 exceeded maxdepth\n"); - ret = 1; - goto cleanup; - } - if ((ret = xftw_readdir(dirname, depth))) - goto cleanup; - - t = tree+depth; - /* user function sees type 2 directories */ - if ((ret = lstat(dirname, &statbuf)) || - (ret = xftw_do_name("", dirname, &statbuf, funcptr))) - goto cleanup; - - /* user sees all contents of type 2 directory, no pruning */ - for (i = 0; i < t->used; ++i) { - struct xftw_dirent *c = t->contents+i; - if (S_ISLNK(c->statbuf.st_mode)) { - if (!stat(c->name, &(c->statbuf))) { - if (S_ISDIR(c->statbuf.st_mode)) { - error("symlink to directory is not allowed, %s ignored\n", c->name); - *(c->name) = '\0'; /* ignore it */ - } - } - } - if (!*(c->name)) - continue; - if (S_ISDIR(c->statbuf.st_mode)) { - /* recursion is the curse of the programming classes */ - ret = xftw_type2(dirname, c->name, depth+1, funcptr); - if (ret) - goto cleanup; - } - else if ((ret = xftw_do_name(dirname, c->name, &(c->statbuf), funcptr))) - goto cleanup; - *(c->name) = '\0'; /* processed */ - } - - ret = 0; -cleanup: - free(dirname); - return(ret); -} - -/* Only external visible function. Decide on the type of directory and - * process accordingly. - */ -int xftw(const char *directory, xftw_func_t funcptr) -{ - struct stat statbuf; - int ret, i, j, type; - xftw_tree_t *t; - struct xftw_dirent *c; - - verbose("xftw starting at %s ", directory); - if (lstat(directory, &statbuf)) { - verbose("lstat on %s failed\n", directory); - return(0); - } - if (S_ISLNK(statbuf.st_mode)) { - char real[PATH_MAX]; - verbose("resolving symlink to "); - if (!(directory = realpath(directory, real))) { - if (errno == ENOENT) { - verbose("%s: does not exist, dangling symlink ignored\n", real); - return(0); - } - perror("... failed"); - return(-1); - } - verbose("%s ", directory); - if (lstat(directory, &statbuf)) { - error("lstat on %s failed ", directory); - perror(""); - return(-1); - } - } - if (!S_ISDIR(statbuf.st_mode)) { - error("%s is not a directory\n", directory); - return(-1); - } - verbose("\n"); - - /* All returns after this point must be via cleanup */ - - if ((ret = xftw_readdir(directory, 0))) - goto cleanup; - - t = tree; /* depth 0 */ - type = 2; - for (i = 0 ; type == 2 && i < t->used; ++i) { - c = t->contents+i; - for (j = 0; tbtype[j]; ++j) { - if (strcmp(c->name, tbtype[j]) == 0 && - S_ISDIR(c->statbuf.st_mode)) { - const char *p = directory + strlen(directory) - 1; - if (*p == '/') - --p; - if (p - directory >= 6 && strncmp(p-6, "/kernel", 7) == 0) - continue; /* "/kernel" path is a special case, type 2 */ - type = 1; /* known subdirectory */ - break; - } - } - } - - if (type == 1) { - OPT_LIST *p; - /* prune entries in type 1 directories only */ - for (i = 0 ; i < t->used; ++i) { - for (p = prunelist; p->name; ++p) { - c = t->contents+i; - if (strcmp(p->name, c->name) == 0) { - verbose("pruned %s\n", c->name); - *(c->name) = '\0'; /* ignore */ - } - } - } - /* run known subdirectories first in historical order, "kernel" is now top of list */ - for (i = 0 ; i < t->used; ++i) { - c = t->contents+i; - for (j = 0; tbtype[j]; ++j) { - if (*(c->name) && - strcmp(c->name, tbtype[j]) == 0 && - S_ISDIR(c->statbuf.st_mode)) { - if ((ret = xftw_type2(directory, c->name, 1, funcptr))) - goto cleanup; - *(c->name) = '\0'; /* processed */ - } - } - } - /* any other directories left, in alphabetical order */ - for (i = 0 ; i < t->used; ++i) { - c = t->contents+i; - if (*(c->name) && - S_ISDIR(c->statbuf.st_mode)) { - if ((ret = xftw_type2(directory, c->name, 1, funcptr))) - goto cleanup; - *(c->name) = '\0'; /* processed */ - } - } - /* anything else is passed to the user function */ - for (i = 0 ; i < t->used; ++i) { - c = t->contents+i; - if (*(c->name)) { - verbose("%s found in type 1 directory %s\n", c->name, directory); - if ((ret = xftw_do_name(directory, c->name, &(c->statbuf), funcptr))) - goto cleanup; - *(c->name) = '\0'; /* processed */ - } - } - } - else { - /* type 2 */ - xftw_free_tree(0); - if ((ret = xftw_type2(directory, NULL, 0, funcptr))) - goto cleanup; - } - - /* amazing, it all worked */ - ret = 0; -cleanup: - for (i = 0; i < XFTW_MAXDEPTH; ++i) - xftw_free_tree(i); - return(ret); -} diff --git a/mdk-stage1/insmod-modutils/util/xmalloc.c b/mdk-stage1/insmod-modutils/util/xmalloc.c deleted file mode 100644 index 9113d47fe..000000000 --- a/mdk-stage1/insmod-modutils/util/xmalloc.c +++ /dev/null @@ -1,39 +0,0 @@ -/* Misc utility functions. - Copyright 1996, 1997 Linux International. - Contributed by Richard Henderson <rth@tamu.edu> - - This file is part of the Linux modutils. - - 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 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, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ident "$Id$" - -#include <stdlib.h> -#include "util.h" - - -/*======================================================================*/ - -void * -xmalloc(size_t size) -{ - void *ptr = malloc(size); - if (!ptr) - { - error("Out of memory"); - exit(1); - } - return ptr; -} diff --git a/mdk-stage1/insmod-modutils/util/xrealloc.c b/mdk-stage1/insmod-modutils/util/xrealloc.c deleted file mode 100644 index d287486f7..000000000 --- a/mdk-stage1/insmod-modutils/util/xrealloc.c +++ /dev/null @@ -1,39 +0,0 @@ -/* Misc utility functions. - Copyright 1996, 1997 Linux International. - Contributed by Richard Henderson <rth@tamu.edu> - - This file is part of the Linux modutils. - - 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 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, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ident "$Id$" - -#include <stdlib.h> -#include "util.h" - - -/*======================================================================*/ - -void * -xrealloc(void *old, size_t size) -{ - void *ptr = realloc(old, size); - if (!ptr) - { - error("Out of memory"); - exit(1); - } - return ptr; -} diff --git a/mdk-stage1/insmod-modutils/util/xstrcat.c b/mdk-stage1/insmod-modutils/util/xstrcat.c deleted file mode 100644 index abb075c83..000000000 --- a/mdk-stage1/insmod-modutils/util/xstrcat.c +++ /dev/null @@ -1,40 +0,0 @@ -/* Misc utility functions. - Copyright 2000 Keith Owens <kaos@ocs.com.au> - - This file is part of the Linux modutils. - - 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 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, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ident "$Id" - -#include <stdlib.h> -#include <string.h> -#include "util.h" - - -/*======================================================================*/ - -char * -xstrcat(char *dest, const char *src, size_t size) -{ - int ldest = strlen(dest); - int lsrc = strlen(src); - if ((size - ldest - 1) < lsrc) { - error("xstrcat: destination overflow"); - exit(1); - } - memcpy(dest+ldest, src, lsrc+1); - return(dest); -} diff --git a/mdk-stage1/insmod-modutils/util/xstrdup.c b/mdk-stage1/insmod-modutils/util/xstrdup.c deleted file mode 100644 index 11b289eb0..000000000 --- a/mdk-stage1/insmod-modutils/util/xstrdup.c +++ /dev/null @@ -1,41 +0,0 @@ -/* Misc utility functions. - Copyright 1996, 1997 Linux International. - Contributed by Richard Henderson <rth@tamu.edu> - - This file is part of the Linux modutils. - - 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 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, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ident "$Id$" - -#include <stdlib.h> -#include <stdio.h> -#include <string.h> -#include "util.h" - - -/*======================================================================*/ - -char * -xstrdup(const char *s) -{ - char *n = strdup(s); - if (!n) - { - error("Out of memory"); - exit(1); - } - return n; -} diff --git a/mdk-stage1/insmod-modutils/util/xsystem.c b/mdk-stage1/insmod-modutils/util/xsystem.c deleted file mode 100644 index edb995268..000000000 --- a/mdk-stage1/insmod-modutils/util/xsystem.c +++ /dev/null @@ -1,51 +0,0 @@ -/* Misc utility functions. - Copyright 2000 Keith Owens <kaos@ocs.com.au> - - This file is part of the Linux modutils. - - 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 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, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ident "$Id" - -#include <sys/types.h> -#include <sys/wait.h> -#include <errno.h> -#include <unistd.h> - - -/*======================================================================*/ - -/* Clone of the system() function From Steven's Advanced Programming in a Unix - * Environment. Modified to use *argv[] and execvp to avoid shell expansion - * problems, modutils runs as root so system() is unsafe. - */ - -int -xsystem(const char *file, char *const argv[]) -{ - pid_t pid; - int status; - if ((pid = fork()) < 0) - return(-1); - if (pid == 0) { - execvp(file, argv); - _exit(127); - } - while (waitpid(pid, &status, 0) < 0) { - if (errno != EINTR) - return(-1); - } - return(status); -} diff --git a/mdk-stage1/ka.c b/mdk-stage1/ka.c new file mode 100644 index 000000000..7b9d98fbe --- /dev/null +++ b/mdk-stage1/ka.c @@ -0,0 +1,198 @@ +/* + * Copyright 2005 Mandriva + * + * This software may be freely redistributed under the terms of the GNU + * public license. + * + * 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 "ka.h" +#include <sys/mount.h> +#include "mount.h" +#include <sys/wait.h> +#include <dirent.h> +#include <errno.h> +#include <sys/socket.h> +#include <netinet/in.h> +#include <arpa/inet.h> +#include <unistd.h> + +#include "config-stage1.h" +#include "frontend.h" +#include "log.h" +#include "tools.h" + +struct in_addr next_server = { 0 }; + +#if 0 +static void save_stuff_for_rescue(void) +{ + copy_file("/etc/resolv.conf", STAGE2_LOCATION "/etc/resolv.conf", NULL); +} +#endif + +static void my_pause(void) { + unsigned char t; + fflush(stdout); + read(0, &t, 1); +} + +static enum return_type ka_wait_for_stage2(int count) +{ + char * ramdisk = "/dev/ram3"; /* warning, verify that this file exists in the initrd*/ + char * ka_launch[] = { "/ka/ka-d-client", "-w","-s","getstage2","-e","(cd " STAGE2_LOCATION "; tar -x -f - )", NULL }; /* The command line for ka_launch */ + char * mkfs_launch[] = { "/sbin/mke2fs", "-m", "0", ramdisk, NULL}; /* The mkfs command for formating the ramdisk */ + + log_message("KA: Preparing to receive stage 2...."); + wait_message("Preparing to receive stage 2"); + + int pida, wait_status; + + if (!(pida = fork())) { /* Forking current process for running mkfs */ + //close(1); + close(2); + execv(mkfs_launch[0], mkfs_launch); /* Formating the ramdisk */ + printf("KA: Can't execute %s\n<press Enter>\n", mkfs_launch[0]); + my_pause(); + return KAERR_CANTFORK; + } + while (wait4(-1, &wait_status, 0, NULL) != pida) {}; /* Waiting the end of mkfs */ + remove_wait_message(); + + wait_message("Mounting /dev/ram3 at %s", STAGE2_LOCATION); + if (my_mount(ramdisk, STAGE2_LOCATION, "ext2", 1)) {/* Trying to mount the ramdisk */ + return RETURN_ERROR; + } + remove_wait_message(); + + log_message("KA: Waiting for stage 2...."); + wait_message("Waiting for rescue from KA server (Try %d/%d)", count, KA_MAX_RETRY); + pid_t pid; /* Process ID of the child process */ + pid_t wpid; /* Process ID from wait() */ + int status; /* Exit status from wait() */ + + pid = fork(); + if ( pid == -1 ) { + fprintf(stderr, "%s: Failed to fork()\n", strerror(errno)); + exit(13); + } else if ( pid == 0 ) { + // close(2); + execv(ka_launch[0], ka_launch); + } else { + // wpid = wait(&status); /* Child's exit status */ + wpid = wait4(-1, &status, 0, NULL); + if ( wpid == -1 ) { + fprintf(stderr,"%s: wait()\n", strerror(errno)); + return RETURN_ERROR; + } else if ( wpid != pid ) + abort(); + else { + if ( WIFEXITED(status) ) { + printf("Exited: $? = %d\n", WEXITSTATUS(status)); + } else if ( WIFSIGNALED(status) ) { + printf("Signal: %d%s\n", WTERMSIG(status), WCOREDUMP(status) ? " with core file." : ""); + } + } + } + + remove_wait_message(); + return RETURN_OK; + // if (!(pid = fork())) { /* Froking current process for running ka-deploy (client side) */ + // close(1); /* Closing stdout */ + // close(2); /* Closing stderr */ + // execve(ka_launch[0], ka_launch,grab_env()); /* Running ka-deploy (client side) */ + // printf("KA: Can't execute %s\n<press Enter>\n", ka_launch[0]); + // log_message("KA: Can't execute %s\n<press Enter>\n", ka_launch[0]); + // my_pause(); + // return KAERR_CANTFORK; + //} + + //while (wait4(-1, &wait_status, 0, NULL) != pid) {}; /* Waiting the end of duplication */ + // log_message("kalaunch ret %d\n", WIFEXITED(wait_status)); + // remove_wait_message(); + //sleep(100000); + // return RETURN_OK; +} + +enum return_type perform_ka(void) { + enum return_type results; + int server_failure = 1; /* Number of time we've failed to find a ka server */ + FILE *f = fopen ("/ka/tftpserver","w"); + + if (f != NULL) { + /* Writing the NEXT_SERVER value of the DHCP Request in the /ka/tftpserver file */ + fprintf(f,"%s\n",inet_ntoa(next_server)); + fclose(f); + } + + log_message("KA: Trying to retrieve stage2 from server"); + log_message("KA: ka_wait_for_stage2"); + do { + /* We are trying to get a valid stage 2 (rescue) */ + results=ka_wait_for_stage2(server_failure); + if (results != RETURN_OK) { + return results; + } else { + /* Trying to open STAGE2_LOCATION/ka directory */ + char dir[255] = STAGE2_LOCATION; + strcat(dir,"/ka"); + DIR *dp = opendir(dir); + + /* Does the STAGE2_LOCATION/ka directory exists ? = Does the rescue with ka well downloaded ?*/ + if (!dp) { + log_message("KA: Server not found !"); + /* Be sure that the STAGE2_LOCATION isn't mounted after receiving a wrong rescue */ + if (umount (STAGE2_LOCATION)) { + log_perror("KA: Unable to umount STAGE2"); + } + int cpt; + + if (server_failure++ == KA_MAX_RETRY){ + /* if the KA server can't be reach KA_MAX_RETRY times */ + char * reboot_launch[] = { "/sbin/reboot", NULL}; + for (cpt=5; cpt>0; cpt--) { + wait_message("!!! Can't reach a valid KA server !!! (Rebooting in %d sec)",cpt); + sleep (1); + } + /* Rebooting the computer to avoid infinite loop on ka mode */ + execv(reboot_launch[0], reboot_launch); + } + + for (cpt=5; cpt>0; cpt--) { + wait_message("KA server not found ! (Try %d/%d in %d sec)",server_failure,KA_MAX_RETRY,cpt); + log_message("Ka not found %d/%d", server_failure,KA_MAX_RETRY); + sleep (1); + } + remove_wait_message(); + /* We should try another time*/ + results=RETURN_BACK; + continue; + } + + if (dp) { + log_message("KA: Stage 2 downloaded successfully"); + closedir(dp); /* Closing the /ka directory */ + server_failure=1; /* Resetting server_failure */ + results = RETURN_OK; + } + } + + log_message("KA: Preparing chroot"); + return RETURN_OK; + + // if (IS_RESCUE) { /* if we are in rescue mode */ + // save_stuff_for_rescue(); /* Saving resolve.conf */ + // if (umount (STAGE2_LOCATION)) { /* Unmounting STAGE2 elseif kernel can't mount it ! */ + // log_perror("KA: Unable to umount STAGE2"); + // return RETURN_ERROR; + // } + // } + } while (results == RETURN_BACK); + + // method_name = strdup("ka"); + return RETURN_OK; +} diff --git a/mdk-stage1/insmod.h b/mdk-stage1/ka.h index d91f239cf..44d6244f9 100644 --- a/mdk-stage1/insmod.h +++ b/mdk-stage1/ka.h @@ -1,7 +1,5 @@ /* - * Guillaume Cottenceau (gc@mandrakesoft.com) - * - * Copyright 2000 MandrakeSoft + * Copyright 2005 Mandriva * * This software may be freely redistributed under the terms of the GNU * public license. @@ -12,9 +10,11 @@ * */ -#ifndef _INSMOD_INTERFACE_H_ -#define _INSMOD_INTERFACE_H_ +#ifndef _KA_H_ +#define _KA_H_ + +#define KAERR_CANTFORK -20 -int insmod_call(char * full_filename, char * params); +enum return_type perform_ka(void); #endif diff --git a/mdk-stage1/linux-2.2/nfs.h b/mdk-stage1/linux-2.2/nfs.h deleted file mode 100644 index 7936d5a71..000000000 --- a/mdk-stage1/linux-2.2/nfs.h +++ /dev/null @@ -1,226 +0,0 @@ -/* - * NFS protocol definitions - */ -#ifndef _LINUX_NFS_H -#define _LINUX_NFS_H - -#include <linux/sunrpc/msg_prot.h> - -#define NFS_PORT 2049 -#define NFS_MAXDATA 8192 -#define NFS_MAXPATHLEN 1024 -#define NFS_MAXNAMLEN 255 -#define NFS_MAXGROUPS 16 -#define NFS_FHSIZE 32 -#define NFS_COOKIESIZE 4 -#define NFS_FIFO_DEV (-1) -#define NFSMODE_FMT 0170000 -#define NFSMODE_DIR 0040000 -#define NFSMODE_CHR 0020000 -#define NFSMODE_BLK 0060000 -#define NFSMODE_REG 0100000 -#define NFSMODE_LNK 0120000 -#define NFSMODE_SOCK 0140000 -#define NFSMODE_FIFO 0010000 - - -enum nfs_stat { - NFS_OK = 0, - NFSERR_PERM = 1, - NFSERR_NOENT = 2, - NFSERR_IO = 5, - NFSERR_NXIO = 6, - NFSERR_EAGAIN = 11, - NFSERR_ACCES = 13, - NFSERR_EXIST = 17, - NFSERR_XDEV = 18, - NFSERR_NODEV = 19, - NFSERR_NOTDIR = 20, - NFSERR_ISDIR = 21, - NFSERR_INVAL = 22, /* that Sun forgot */ - NFSERR_FBIG = 27, - NFSERR_NOSPC = 28, - NFSERR_ROFS = 30, - NFSERR_OPNOTSUPP = 45, - NFSERR_NAMETOOLONG = 63, - NFSERR_NOTEMPTY = 66, - NFSERR_DQUOT = 69, - NFSERR_STALE = 70, - NFSERR_WFLUSH = 99 -}; - -enum nfs_ftype { - NFNON = 0, - NFREG = 1, - NFDIR = 2, - NFBLK = 3, - NFCHR = 4, - NFLNK = 5, - NFSOCK = 6, - NFBAD = 7, - NFFIFO = 8 -}; - -struct nfs_fh { - char data[NFS_FHSIZE]; -}; - -#define NFS_PROGRAM 100003 -#define NFS_VERSION 2 -#define NFSPROC_NULL 0 -#define NFSPROC_GETATTR 1 -#define NFSPROC_SETATTR 2 -#define NFSPROC_ROOT 3 -#define NFSPROC_LOOKUP 4 -#define NFSPROC_READLINK 5 -#define NFSPROC_READ 6 -#define NFSPROC_WRITECACHE 7 -#define NFSPROC_WRITE 8 -#define NFSPROC_CREATE 9 -#define NFSPROC_REMOVE 10 -#define NFSPROC_RENAME 11 -#define NFSPROC_LINK 12 -#define NFSPROC_SYMLINK 13 -#define NFSPROC_MKDIR 14 -#define NFSPROC_RMDIR 15 -#define NFSPROC_READDIR 16 -#define NFSPROC_STATFS 17 - -/* Mount support for NFSroot */ -#ifdef __KERNEL__ -#define NFS_MNT_PROGRAM 100005 -#define NFS_MNT_VERSION 1 -#define NFS_MNT_PORT 627 -#define NFS_MNTPROC_MNT 1 -#define NFS_MNTPROC_UMNT 3 -#endif - -#if defined(__KERNEL__) || defined(NFS_NEED_KERNEL_TYPES) - -extern struct rpc_program nfs_program; -extern struct rpc_stat nfs_rpcstat; - -struct nfs_time { - __u32 seconds; - __u32 useconds; -}; - -struct nfs_fattr { - enum nfs_ftype type; - __u32 mode; - __u32 nlink; - __u32 uid; - __u32 gid; - __u32 size; - __u32 blocksize; - __u32 rdev; - __u32 blocks; - __u32 fsid; - __u32 fileid; - struct nfs_time atime; - struct nfs_time mtime; - struct nfs_time ctime; -}; - -struct nfs_sattr { - __u32 mode; - __u32 uid; - __u32 gid; - __u32 size; - struct nfs_time atime; - struct nfs_time mtime; -}; - -struct nfs_fsinfo { - __u32 tsize; - __u32 bsize; - __u32 blocks; - __u32 bfree; - __u32 bavail; -}; - -struct nfs_writeargs { - struct nfs_fh * fh; - __u32 offset; - __u32 count; - const void * buffer; -}; - -#ifdef NFS_NEED_XDR_TYPES - -struct nfs_sattrargs { - struct nfs_fh * fh; - struct nfs_sattr * sattr; -}; - -struct nfs_diropargs { - struct nfs_fh * fh; - const char * name; -}; - -struct nfs_readargs { - struct nfs_fh * fh; - __u32 offset; - __u32 count; - void * buffer; -}; - -struct nfs_createargs { - struct nfs_fh * fh; - const char * name; - struct nfs_sattr * sattr; -}; - -struct nfs_renameargs { - struct nfs_fh * fromfh; - const char * fromname; - struct nfs_fh * tofh; - const char * toname; -}; - -struct nfs_linkargs { - struct nfs_fh * fromfh; - struct nfs_fh * tofh; - const char * toname; -}; - -struct nfs_symlinkargs { - struct nfs_fh * fromfh; - const char * fromname; - const char * topath; - struct nfs_sattr * sattr; -}; - -struct nfs_readdirargs { - struct nfs_fh * fh; - __u32 cookie; - void * buffer; - unsigned int bufsiz; -}; - -struct nfs_diropok { - struct nfs_fh * fh; - struct nfs_fattr * fattr; -}; - -struct nfs_readres { - struct nfs_fattr * fattr; - unsigned int count; -}; - -struct nfs_readlinkres { - char ** string; - unsigned int * lenp; - unsigned int maxlen; - void * buffer; -}; - -struct nfs_readdirres { - void * buffer; - unsigned int bufsiz; -}; - -#endif /* NFS_NEED_XDR_TYPES */ -#endif /* __KERNEL__ */ - -#endif diff --git a/mdk-stage1/linux-2.2/nfs_mount.h b/mdk-stage1/linux-2.2/nfs_mount.h deleted file mode 100644 index 60493b150..000000000 --- a/mdk-stage1/linux-2.2/nfs_mount.h +++ /dev/null @@ -1,53 +0,0 @@ -#ifndef _LINUX_NFS_MOUNT_H -#define _LINUX_NFS_MOUNT_H - -/* - * linux/include/linux/nfs_mount.h - * - * Copyright (C) 1992 Rick Sladkey - * - * structure passed from user-space to kernel-space during an nfs mount - */ - -/* - * WARNING! Do not delete or change the order of these fields. If - * a new field is required then add it to the end. The version field - * tracks which fields are present. This will ensure some measure of - * mount-to-kernel version compatibility. Some of these aren't used yet - * but here they are anyway. - */ -#define NFS_MOUNT_VERSION 3 - -struct nfs_mount_data { - int version; /* 1 */ - int fd; /* 1 */ - struct nfs_fh root; /* 1 */ - int flags; /* 1 */ - int rsize; /* 1 */ - int wsize; /* 1 */ - int timeo; /* 1 */ - int retrans; /* 1 */ - int acregmin; /* 1 */ - int acregmax; /* 1 */ - int acdirmin; /* 1 */ - int acdirmax; /* 1 */ - struct sockaddr_in addr; /* 1 */ - char hostname[256]; /* 1 */ - int namlen; /* 2 */ - unsigned int bsize; /* 3 */ -}; - -/* bits in the flags field */ - -#define NFS_MOUNT_SOFT 0x0001 /* 1 */ -#define NFS_MOUNT_INTR 0x0002 /* 1 */ -#define NFS_MOUNT_SECURE 0x0004 /* 1 */ -#define NFS_MOUNT_POSIX 0x0008 /* 1 */ -#define NFS_MOUNT_NOCTO 0x0010 /* 1 */ -#define NFS_MOUNT_NOAC 0x0020 /* 1 */ -#define NFS_MOUNT_TCP 0x0040 /* 2 */ -#define NFS_MOUNT_VER3 0x0080 /* 3 */ -#define NFS_MOUNT_KERBEROS 0x0100 /* 3 */ -#define NFS_MOUNT_NONLM 0x0200 /* 3 */ - -#endif diff --git a/mdk-stage1/log.c b/mdk-stage1/log.c index 5379c96dd..cb3f741dc 100644 --- a/mdk-stage1/log.c +++ b/mdk-stage1/log.c @@ -1,7 +1,7 @@ /* - * Guillaume Cottenceau (gc@mandrakesoft.com) + * Guillaume Cottenceau (gc) * - * Copyright 2000 MandrakeSoft + * Copyright 2000 Mandriva * * This software may be freely redistributed under the terms of the GNU * public license. @@ -31,27 +31,35 @@ #include "log.h" +static FILE * logtty = NULL; static FILE * logfile = NULL; void vlog_message(const char * s, va_list args) { - fprintf(logfile, "* "); - vfprintf(logfile, s, args); - fprintf(logfile, "\n"); - fflush(logfile); + va_list args_copy; + va_copy(args_copy, args); + + if (logfile) { + fprintf(logfile, "* "); + vfprintf(logfile, s, args); + fprintf(logfile, "\n"); + fflush(logfile); + } + if (logtty) { + fprintf(logtty, "* "); + vfprintf(logtty, s, args_copy); + fprintf(logtty, "\n"); + fflush(logtty); + } + + va_end(args_copy); } void log_message(const char * s, ...) { va_list args; - - if (!logfile) { - fprintf(stderr, "Log is not open!\n"); - return; - } - va_start(args, s); vlog_message(s, args); va_end(args); @@ -59,7 +67,7 @@ void log_message(const char * s, ...) return; } -void log_perror(char *msg) +void log_perror(const char *msg) { log_message("%s: %s", msg, strerror(errno)); } @@ -68,9 +76,8 @@ void log_perror(char *msg) void open_log(void) { if (!IS_TESTING) { - logfile = fopen("/dev/tty3", "w"); - if (!logfile) - logfile = fopen("/tmp/install.log", "a"); + logtty = fopen("/dev/tty3", "w"); + logfile = fopen("/tmp/stage1.log", "w"); } else logfile = fopen("debug.log", "w"); @@ -81,5 +88,7 @@ void close_log(void) if (logfile) { log_message("stage1: disconnecting life support systems"); fclose(logfile); + if (logtty) + fclose(logtty); } } diff --git a/mdk-stage1/log.h b/mdk-stage1/log.h index fcc641ad9..d726a6b21 100644 --- a/mdk-stage1/log.h +++ b/mdk-stage1/log.h @@ -1,7 +1,7 @@ /* - * Guillaume Cottenceau (gc@mandrakesoft.com) + * Guillaume Cottenceau (gc) * - * Copyright 2000 MandrakeSoft + * Copyright 2000 Mandriva * * This software may be freely redistributed under the terms of the GNU * public license. @@ -25,9 +25,9 @@ #include <stdarg.h> -void log_message(const char * s, ...); +void log_message(const char * s, ...) __attribute__ ((format (printf, 1, 2))); void vlog_message(const char * s, va_list args); -void log_perror(char *msg); +void log_perror(const char *msg); void open_log(void); void close_log(void); diff --git a/mdk-stage1/lomount.c b/mdk-stage1/lomount.c index 281de4a93..caca48ea1 100644 --- a/mdk-stage1/lomount.c +++ b/mdk-stage1/lomount.c @@ -1,7 +1,7 @@ /* - * Guillaume Cottenceau (gc@mandrakesoft.com) + * Guillaume Cottenceau (gc) * - * Copyright 2000 MandrakeSoft + * Copyright 2000 Mandriva * * This software may be freely redistributed under the terms of the GNU * public license. @@ -110,62 +110,84 @@ set_loop (const char *device, const char *file) return 0; } -int -del_loop (const char *device) + +char* find_free_loop() +{ + struct loop_info loopinfo; + int i; + for (i=0; i<256; i++) { + int fd; + char ldev[100]; + sprintf(ldev, "/dev/loop%d", i); + ensure_dev_exists(ldev); + fd = open(ldev, O_RDONLY); + if (!ioctl(fd, LOOP_GET_STATUS, &loopinfo)) { + close(fd); + continue; + } + if (errno == ENXIO) { + log_message("%s is available", ldev); + close(fd); + return strdup(ldev); + } else { + log_perror("LOOP_GET_STATUS(unexpected error)"); + close(fd); + continue; + } + } + return NULL; +} + +void +del_loop(char * loopdev) { int fd; - if ((fd = open (device, O_RDONLY)) < 0) - return 1; + if (!loopdev) + return; + + if ((fd = open (loopdev, O_RDONLY)) < 0) + return; if (ioctl (fd, LOOP_CLR_FD, 0) < 0) - return 1; + return; close (fd); - return 0; } - -char * loopdev = "/dev/loop3"; /* Ugly. But do I care? */ - int -lomount(char *loopfile, char *where) +lomount(char *loopfile, char *where, char **dev, int compressed) { long int flag; + char * loopdev; flag = MS_MGC_VAL; flag |= MS_RDONLY; - my_insmod("loop", ANY_DRIVER_TYPE, NULL); + my_modprobe("loop", ANY_DRIVER_TYPE, "max_loop=256"); + if (compressed) { + my_modprobe("squashfs", ANY_DRIVER_TYPE, NULL); + } + + if (!(loopdev = find_free_loop())) { + log_message("could not find a free loop"); + return 1; + } + if (dev) + *dev = loopdev; if (set_loop(loopdev, loopfile)) { log_message("set_loop failed on %s (%s)", loopdev, strerror(errno)); return 1; } - if (my_mount(loopdev, where, "iso9660")) { + if (my_mount(loopdev, where, compressed ? "squashfs" : "iso9660", 0)) { del_loop(loopdev); return 1; } - log_message("lomount succeded for %s on %s", loopfile, where); - return 0; -} - - -int -loumount() -{ - if (umount(loopdev)) { - log_perror("loumount"); - return 1; - } - - if (del_loop(loopdev)) { - log_perror("del_loop"); - return 1; - } + log_message("lomount succeeded for %s on %s", loopfile, where); return 0; } diff --git a/mdk-stage1/lomount.h b/mdk-stage1/lomount.h index f298fe341..7f3af2460 100644 --- a/mdk-stage1/lomount.h +++ b/mdk-stage1/lomount.h @@ -1,7 +1,7 @@ /* - * Guillaume Cottenceau (gc@mandrakesoft.com) + * Guillaume Cottenceau (gc) * - * Copyright 2000 MandrakeSoft + * Copyright 2000 Mandriva * * This software may be freely redistributed under the terms of the GNU * public license. @@ -15,7 +15,7 @@ #ifndef LOMOUNT_H #define LOMOUNT_H -int lomount(char *loopfile, char *where); -int loumount(); +int lomount(char *loopfile, char *where, char **loopdev, int compressed); +void del_loop(char *loopdev); #endif diff --git a/mdk-stage1/mar/.cvsignore b/mdk-stage1/mar/.cvsignore deleted file mode 100644 index bfde37886..000000000 --- a/mdk-stage1/mar/.cvsignore +++ /dev/null @@ -1 +0,0 @@ -mar diff --git a/mdk-stage1/mar/Makefile b/mdk-stage1/mar/Makefile deleted file mode 100644 index dc5316a1a..000000000 --- a/mdk-stage1/mar/Makefile +++ /dev/null @@ -1,55 +0,0 @@ - #****************************************************************************** - # - # mar - The Mandrake Archiver - # - # $Id$ - # - # Guillaume Cottenceau (gc@mandrakesoft.com) - # - # Copyright 2000 MandrakeSoft - # - # This software may be freely redistributed under the terms of the GNU - # public license. - # - # 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. - # - #***************************************************************************** - -top_dir = .. - -include $(top_dir)/Makefile.common - - -all: libmar.a libmar-DIET.a mar - -clean: - rm -f *.o libmar.a libmar-DIET.a mar - -FLAGS = -Wall -Werror -Os -fomit-frame-pointer -c - - -mar: mar-frontend.o mar-extract-only-standalone.o - gcc -o mar mar-frontend.o mar-extract-only-standalone.o -lbz2 - $(STRIPCMD) $@ - -libmar.a: mar-extract-only.o - ar -cru $@ $^ - ranlib $@ - -libmar-DIET.a: mar-extract-only-DIET.o - ar -cru $@ $^ - ranlib $@ - -mar-extract-only.o: mar-extract-only.c mar-extract-only.h mar.h - gcc $(FLAGS) $(GLIBC_INCLUDES) mar-extract-only.c - -mar-extract-only-DIET.o: mar-extract-only.c mar-extract-only.h mar.h - gcc $(FLAGS) $(DIETLIBC_INCLUDES) -o $@ mar-extract-only.c - -mar-frontend.o: mar-frontend.c mar.h mar-extract-only.h - gcc $(FLAGS) $(GLIBC_INCLUDES) mar-frontend.c - -mar-extract-only-standalone.o: mar-extract-only.c mar-extract-only.h mar.h - gcc $(FLAGS) $(GLIBC_INCLUDES) -o $@ -D_STANDALONE_ mar-extract-only.c diff --git a/mdk-stage1/mar/mar-extract-only.c b/mdk-stage1/mar/mar-extract-only.c deleted file mode 100644 index 2d3898cfc..000000000 --- a/mdk-stage1/mar/mar-extract-only.c +++ /dev/null @@ -1,206 +0,0 @@ -/* - * Guillaume Cottenceau (gc@mandrakesoft.com) - * - * Copyright 2000 MandrakeSoft - * - * This software may be freely redistributed under the terms of the GNU - * public license. - * - * 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. - * - */ - -/* - * mar - The Mandrake Archiver - * - * An archiver that supports compression (through zlib). - * - */ - -/* - * This code should suffice for stage1 on-the-fly uncompression of kernel modules. - * (and it DOES perform tests and return values, blaaaah..) - */ - -#include "mar-extract-only.h" -#include "mar.h" - -#ifdef _STANDALONE_ -void -zerr(BZFILE * f) /* decrease code size */ -{ - fprintf(stderr, BZ2_bzerror(f, &z_errnum)); -} -void -log_perror(char *msg) -{ - perror(msg); -} -void -log_message(char *msg) -{ - fprintf(stderr, msg); -} -#else /* _STANDALONE_ */ -#include "../log.h" -void -zerr(BZFILE * f) /* decrease code size */ -{ - log_message(BZ2_bzerror(f, &z_errnum)); -} -#endif /* _STANDALONE_ */ - - -static int -mar_open_file(char *filename, struct mar_stream *s) -{ - int end_filetable = 0; - struct mar_element * previous_element = NULL; - - /* mar_zfile */ - s->mar_zfile = BZ2_bzopen(filename, "rb"); - if (!s->mar_zfile) - { - log_perror(filename); - return -1; - } - - while (end_filetable == 0) - { - char buf[512]; - int ptr = 0; - /* read filename */ - do - { - if (BZ2_bzread(s->mar_zfile, &(buf[ptr]), sizeof(char)) != sizeof(char)) - { - zerr(s->mar_zfile); - return -1; - } - ptr++; - } while ((buf[ptr-1] != 0) && (ptr < 512)); - /* ptr == 1 when we arrive on the "char 0" of the end of the filetable */ - if (ptr > 1) - { - struct mar_element * e = (struct mar_element *) malloc(sizeof(struct mar_element)); - e->filename = strdup(buf); - /* read file_length */ - if (BZ2_bzread(s->mar_zfile, &(e->file_length), sizeof(int)) != sizeof(int)) - { - zerr(s->mar_zfile); - return -1; - } - /* read data_offset */ - if (BZ2_bzread(s->mar_zfile, &(e->data_offset), sizeof(int)) != sizeof(int)) - { - zerr(s->mar_zfile); - return -1; - } - /* write down chaining */ - if (previous_element) - previous_element->next_element = e; - else - s->first_element = e; - previous_element = e; - } - else - end_filetable = 1; - - } - /* chaining for last element */ - previous_element->next_element = NULL; - - return 0; -} - - -char ** -mar_list_contents(char * mar_filename) -{ - struct mar_stream s; - struct mar_element * elem; - char * tmp_contents[500]; - char ** answ; - int i = 0; - - if (mar_open_file(mar_filename, &s)) - return NULL; - - elem = s.first_element; - while (elem) - { - tmp_contents[i++] = strdup(elem->filename); - elem = elem->next_element; - } - tmp_contents[i++] = NULL; - answ = (char **) malloc(sizeof(char *) * i); - memcpy(answ, tmp_contents, sizeof(char *) * i); - return answ; -} - - -int -mar_extract_file(char *mar_filename, char *filename_to_extract, char *dest_dir) -{ - struct mar_stream s; - struct mar_element * elem; - - if (mar_open_file(mar_filename, &s)) - return -1; - - elem = s.first_element; - while (elem) - { - if (strcmp(elem->filename, filename_to_extract) == 0) - { - char garb_buf[4096]; - char *buf; - char *dest_file; - int fd, i; - dest_file = (char *) alloca(strlen(dest_dir) + strlen(filename_to_extract) + 1); - strcpy(dest_file, dest_dir); - strcat(dest_file, filename_to_extract); - fd = creat(dest_file, 00660); - if (fd == -1) - { - log_perror(dest_file); - return -1; - } - buf = (char *) alloca(elem->file_length); - if (!buf) - { - log_perror(dest_file); - return -1; - } - i = elem->data_offset; - while (i > 0) { - int to_read = i > sizeof(garb_buf) ? sizeof(garb_buf) : i; - if (BZ2_bzread(s.mar_zfile, garb_buf, to_read) != to_read) { - log_message("MAR: unexpected EOF in stream"); - return -1; - } - i -= to_read; - } - if (BZ2_bzread(s.mar_zfile, buf, elem->file_length) != elem->file_length) - { - zerr(s.mar_zfile); - return -1; - } - if (write(fd, buf, elem->file_length) != elem->file_length) - { - log_perror(dest_file); - return -1; - } - close(fd); /* do not check return value for code size */ - BZ2_bzclose(s.mar_zfile); - return 0; - } - elem = elem->next_element; - } - BZ2_bzclose(s.mar_zfile); - return 1; /* 1 for file_not_found_in_archive */ -} - - diff --git a/mdk-stage1/mar/mar-extract-only.h b/mdk-stage1/mar/mar-extract-only.h deleted file mode 100644 index 6fa34efe4..000000000 --- a/mdk-stage1/mar/mar-extract-only.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Guillaume Cottenceau (gc@mandrakesoft.com) - * - * Copyright 2000 MandrakeSoft - * - * This software may be freely redistributed under the terms of the GNU - * public license. - * - * 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. - * - */ - -/* - * mar - The Mandrake Archiver - * - * An archiver that supports compression (through zlib). - * - */ - -/* - * Header for stage1 on-the-fly needs. - */ - -#ifndef MAR_EXTRACT_ONLY_H -#define MAR_EXTRACT_ONLY_H - -int mar_extract_file(char *mar_filename, char *filename_to_extract, char *dest_dir); -char ** mar_list_contents(char *mar_filename); - -#endif diff --git a/mdk-stage1/mar/mar-frontend.c b/mdk-stage1/mar/mar-frontend.c deleted file mode 100644 index 2e87626db..000000000 --- a/mdk-stage1/mar/mar-frontend.c +++ /dev/null @@ -1,199 +0,0 @@ -/* - * Guillaume Cottenceau (gc@mandrakesoft.com) - * - * Copyright 2000 MandrakeSoft - * - * This software may be freely redistributed under the terms of the GNU - * public license. - * - * 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. - * - */ - -/* - * mar - The Mandrake Archiver - * - * An archiver that supports compression (through zlib). - * - */ - -/* - * This code includes the extracting and creating features. - * - */ - -#include "mar.h" -#include "mar-extract-only.h" - - -int -file_size(char *filename) -{ - struct stat buf; - if (stat(filename, &buf) != 0) - { - perror(filename); - return -1; - } - return buf.st_size; -} - - -/* Yes I don't use the datastructure I directly write the final fileformat in memory then write down it. - * Yes it's bad. - */ -/* ``files'' is a NULL-terminated array of char* */ - -char * fnf_tag = "FILE_NOT_FOUND&"; - -int -mar_create_file(char *dest_file, char **files) -{ - int filenum = 0; - int current_offset_filetable = 0; - int current_delta_rawdata = 0; - int filetable_size; - char * temp_marfile_buffer; - int total_length = 0; - - filetable_size = sizeof(char); /* ``char 0'' */ - while (files[filenum]) - { - int fsiz = file_size(files[filenum]); - if (fsiz == -1) - files[filenum] = fnf_tag; - else { - filetable_size += 2*sizeof(int) /* file_length, data_offset */ + strlen(files[filenum]) + 1; - total_length += fsiz; - } - filenum++; - } - - total_length += filetable_size; - - temp_marfile_buffer = (char *) malloc(total_length); /* create the whole file in-memory (not with alloca! it can be bigger than typical limit for stack of programs (ulimit -s) */ - DEBUG_MAR(printf("D: mar::create_marfile total-length %d\n", total_length);); - - filenum = 0; - while (files[filenum]) - { - if (strcmp(files[filenum], fnf_tag)) { - FILE * f = fopen(files[filenum], "r"); - int fsize; - if (!f) - { - perror(files[filenum]); - return -1; - } - - /* filename */ - strcpy(&(temp_marfile_buffer[current_offset_filetable]), files[filenum]); - current_offset_filetable += strlen(files[filenum]) + 1; - - /* file_length */ - fsize = file_size(files[filenum]); - if (fsize == -1) return -1; - memcpy(&temp_marfile_buffer[current_offset_filetable], &fsize, sizeof(int)); - current_offset_filetable += sizeof(int); - - /* data_offset */ - memcpy(&temp_marfile_buffer[current_offset_filetable], ¤t_delta_rawdata, sizeof(int)); - current_offset_filetable += sizeof(int); - - /* data_raw_data */ - if (fread(&temp_marfile_buffer[current_delta_rawdata + filetable_size], 1, fsize, f) != fsize) - { - perror(files[filenum]); - return -1; - } - fclose(f); - - current_delta_rawdata += fsize; - } - - filenum++; - } - - /* write down ``char 0'' to terminate file table */ - memset(&temp_marfile_buffer[current_offset_filetable], 0, sizeof(char)); - - /* ok, buffer is ready, let's write it on-disk */ - { - BZFILE * f = BZ2_bzopen(dest_file, "w9"); - if (!f) - { - perror(dest_file); - return -1; - } - if (BZ2_bzwrite(f, temp_marfile_buffer, total_length) != total_length) - { - fprintf(stderr, BZ2_bzerror(f, &z_errnum)); - return -1; - } - BZ2_bzclose(f); - } - - printf("mar: created archive %s (%d files, length %d)\n", dest_file, filenum, total_length); - return 0; -} - - -void -print_usage(char *progname) -{ - printf("Usage: %s [-lxc] [files..]\n", progname); - exit(0); -} - -int -main(int argc, char **argv) -{ - if (argc <= 2) - print_usage(argv[0]); - - if (argc >= 3) - { - if (strcmp(argv[1], "-l") == 0) - { - char ** contents = mar_list_contents(argv[2]); - if (contents) - while (contents && *contents) { - printf("\t%s\n", *contents); - contents++; - } - exit(0); - } - if ((strcmp(argv[1], "-x") == 0) && argc == 4) - { - int res = mar_extract_file(argv[2], argv[3], "./"); - if (res == 1) - fprintf(stderr, "W: file-not-found-in-archive %s\n", argv[3]); - if (res == -1) - exit(-1); - exit(0); - } - if ((strcmp(argv[1], "-c") == 0) && argc >= 4) - { - char **files = (char **) alloca(((argc-3)+1) * sizeof(char *)); - int i = 3; - while (i < argc) - { - files[i-3] = argv[i]; - i++; - } - files[argc-3] = NULL; - { - int results; - results = mar_create_file(argv[2], files); - if (results != 0) - fprintf(stderr, "E: create-marfile-failed\n"); - exit(results); - } - - } - } - - return 0; -} diff --git a/mdk-stage1/mar/mar.h b/mdk-stage1/mar/mar.h deleted file mode 100644 index 672d7ded8..000000000 --- a/mdk-stage1/mar/mar.h +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Guillaume Cottenceau (gc@mandrakesoft.com) - * - * Copyright 2000 MandrakeSoft - * - * This software may be freely redistributed under the terms of the GNU - * public license. - * - * 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. - * - */ - -/* - * mar - The Mandrake Archiver - * - * An archiver that supports compression (through bzlib). - * - * Designed to be small so these bad designs are inside: - * . archive and compression are mixed together - * . create the mar file in-memory - * . does not free memory - * - */ - -#ifndef MAR_H -#define MAR_H - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <fcntl.h> -#include <errno.h> -#include <unistd.h> - -#include <bzlib.h> - -/* - * Format of a mar file: - * - * ASCIIZ filename \ | - * int file_length | repeated | bzipped - * int pointer_in_archive / | - * char 0 | - * raw_files_data / - * - */ - -struct mar_element -{ - char * filename; /* filename (ASCIIZ) of the element */ - int file_length; /* length (in bytes) of the raw data of the element */ - int data_offset; /* seek start of the raw data in the underlying mar stream */ - struct mar_element * next_element; /* pointer to the next element in the mar stream; NULL if last */ -}; - -struct mar_stream -{ - struct mar_element * first_element; /* pointer to the first element inside the mar stream */ - BZFILE * mar_zfile; /* associated zfile (opened) */ -}; - -int z_errnum; - -#define DEBUG_MAR(x) - -#endif diff --git a/mdk-stage1/minilibc.c b/mdk-stage1/minilibc.c deleted file mode 100644 index 77b65accc..000000000 --- a/mdk-stage1/minilibc.c +++ /dev/null @@ -1,251 +0,0 @@ -/* - * Guillaume Cottenceau (gc@mandrakesoft.com) - * - * Copyright 2000 MandrakeSoft - * - * This software may be freely redistributed under the terms of the GNU - * public license. - * - * 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. - * - */ - -/* - * Portions from Erik Troan (ewt@redhat.com) - * - * Copyright 1996 Red Hat Software - * - */ - - -#define MINILIBC_INTERNAL - -#include "minilibc.h" - -int atexit (void (*__func) (void)) -{ - return 0; -} - -void exit() -{ - _do_exit(0); - for (;;); /* Shut up gcc */ -} - - -char ** _environ = NULL; -int errno = 0; - -void _init (int __status) -{ -} - -void __libc_init_first (int __status) -{ -} - -int __libc_start_main (int (*main) (int, char **, char **), int argc, - char **argv, void (*init) (void), void (*fini) (void), - void (*rtld_fini) (void), void *stack_end) -{ - exit ((*main) (argc, argv, NULL)); - /* never get here */ - return 0; -} - -void _fini (int __status) -{ -} - -inline int socket(int a, int b, int c) -{ - unsigned long args[] = { a, b, c }; - - return socketcall(SYS_SOCKET, args); -} - -inline int bind(int a, void * b, int c) -{ - unsigned long args[] = { a, (long) b, c }; - - return socketcall(SYS_BIND, args); -} - -inline int listen(int a, int b) -{ - unsigned long args[] = { a, b, 0 }; - - return socketcall(SYS_LISTEN, args); -} - -inline int accept(int a, void * addr, void * addr2) -{ - unsigned long args[] = { a, (long) addr, (long) addr2 }; - - return socketcall(SYS_ACCEPT, args); -} - - -void sleep(int secs) -{ - struct timeval tv; - - tv.tv_sec = secs; - tv.tv_usec = 0; - - select(0, NULL, NULL, NULL, &tv); -} - - -int strlen(const char * string) -{ - int i = 0; - - while (*string++) i++; - - return i; -} - -char * strncpy(char * dst, const char * src, int len) -{ - char * chptr = dst; - int i = 0; - - while (*src && i < len) *dst++ = *src++, i++; - if (i < len) *dst = '\0'; - - return chptr; -} - -char * strcpy(char * dst, const char * src) -{ - char * chptr = dst; - - while (*src) *dst++ = *src++; - *dst = '\0'; - - return chptr; -} - -void * memcpy(void * dst, const void * src, size_t count) -{ - char * a = dst; - const char * b = src; - - while (count--) - *a++ = *b++; - - return dst; -} - - -int strcmp(const char * a, const char * b) -{ - int i, j; - - i = strlen(a); j = strlen(b); - if (i < j) - return -1; - else if (j < i) - return 1; - - while (*a && (*a == *b)) a++, b++; - - if (!*a) return 0; - - if (*a < *b) - return -1; - else - return 1; -} - -int strncmp(const char * a, const char * b, int len) -{ - char buf1[1000], buf2[1000]; - - strncpy(buf1, a, len); - strncpy(buf2, b, len); - buf1[len] = '\0'; - buf2[len] = '\0'; - - return strcmp(buf1, buf2); -} - -char * strchr(char * str, int ch) -{ - char * chptr; - - chptr = str; - while (*chptr) - { - if (*chptr == ch) return chptr; - chptr++; - } - - return NULL; -} - - -char * strstr(char *haystack, char *needle) -{ - char * tmp = haystack; - while ((tmp = strchr(tmp, needle[0])) != NULL) { - int i = 1; - while (i < strlen(tmp) && i < strlen(needle) && tmp[i] == needle[i]) - i++; - if (needle[i] == '\0') - return tmp; - tmp++; - } - return NULL; -} - - -/* Minimum printf which handles only characters, %d's and %s's */ -void printf(char * fmt, ...) -{ - char buf[2048]; - char * start = buf; - char * chptr = buf; - va_list args; - char * strarg; - int numarg; - - strncpy(buf, fmt, sizeof(buf)); - va_start(args, fmt); - - while (start) - { - while (*chptr != '%' && *chptr) chptr++; - - if (*chptr == '%') - { - *chptr++ = '\0'; - print_str_init(1, start); - - switch (*chptr++) - { - case 's': - strarg = va_arg(args, char *); - print_str_init(1, strarg); - break; - - case 'd': - numarg = va_arg(args, int); - print_int_init(1, numarg); - break; - } - - start = chptr; - } - else - { - print_str_init(1, start); - start = NULL; - } - } -} - diff --git a/mdk-stage1/minilibc.h b/mdk-stage1/minilibc.h deleted file mode 100644 index e717d4255..000000000 --- a/mdk-stage1/minilibc.h +++ /dev/null @@ -1,144 +0,0 @@ -/* - * Guillaume Cottenceau (gc@mandrakesoft.com) - * - * Copyright 2000 MandrakeSoft - * - * This software may be freely redistributed under the terms of the GNU - * public license. - * - * 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. - * - */ - -/* - * Portions from Erik Troan (ewt@redhat.com) - * - * Copyright 1996 Red Hat Software - * - */ - - -#include <stdarg.h> - -#define _LOOSE_KERNEL_NAMES 1 - -#define NULL ((void *) 0) - -#define WIFSTOPPED(status) (((status) & 0xff) == 0x7f) -#define WIFSIGNALED(status) (!WIFSTOPPED(status) && !WIFEXITED(status)) -#define WEXITSTATUS(status) (((status) & 0xff00) >> 8) -#define WTERMSIG(status) ((status) & 0x7f) -#define WSTOPSIG(status) WEXITSTATUS(status) -#define WIFEXITED(status) (WTERMSIG(status) == 0) - -#define MS_MGC_VAL 0xc0ed0000 - -#define isspace(a) (a == ' ' || a == '\t') - -extern char ** _environ; - -extern int errno; - -/* Aieee, gcc 2.95+ creates a stub for posix_types.h on i386 which brings - glibc headers in and thus makes __FD_SET etc. not defined with 2.3+ kernels. */ -#define _FEATURES_H 1 -#include <linux/socket.h> -#include <linux/types.h> -#include <linux/time.h> -#include <linux/if.h> -#include <linux/un.h> -#include <linux/loop.h> -#include <linux/net.h> -#include <asm/posix_types.h> -#include <asm/termios.h> -#include <asm/ioctls.h> -#include <asm/unistd.h> -#include <asm/fcntl.h> -#include <asm/signal.h> - - -#ifndef MINILIBC_INTERNAL -static inline _syscall5(int,mount,const char *,spec,const char *,dir,const char *,type,unsigned long,rwflag,const void *,data); -static inline _syscall5(int,_newselect,int,n,fd_set *,rd,fd_set *,wr,fd_set *,ex,struct timeval *,timeval); -static inline _syscall4(int,wait4,pid_t,pid,int *,status,int,opts,void *,rusage) -static inline _syscall3(int,write,int,fd,const char *,buf,unsigned long,count) -static inline _syscall3(int,reboot,int,magic,int,magic_too,int,flag) -static inline _syscall3(int,execve,const char *,fn,void *,argv,void *,envp) -static inline _syscall3(int,read,int,fd,const char *,buf,unsigned long,count) -static inline _syscall3(int,open,const char *,fn,int,flags,mode_t,mode) -static inline _syscall3(int,ioctl,int,fd,int,request,void *,argp) -static inline _syscall2(int,dup2,int,one,int,two) -static inline _syscall2(int,kill,pid_t,pid,int,sig) -static inline _syscall2(int,symlink,const char *,a,const char *,b) -static inline _syscall2(int,chmod,const char * ,path,mode_t,mode) -static inline _syscall2(int,sethostname,const char *,name,int,len) -static inline _syscall2(int,setdomainname,const char *,name,int,len) -static inline _syscall2(int,setpgid,int,name,int,len) -static inline _syscall2(int,signal,int,num,void *,len) -static inline _syscall1(int,umount,const char *,dir) -static inline _syscall1(int,unlink,const char *,fn) -static inline _syscall1(int,close,int,fd) -static inline _syscall1(int,swapoff,const char *,fn) -static inline _syscall0(int,getpid) -static inline _syscall0(int,sync) -#ifdef __sparc__ -/* Nonstandard fork calling convention :( */ -static inline int fork(void) { - int __res; - __asm__ __volatile__ ( - "mov %0, %%g1\n\t" - "t 0x10\n\t" - "bcc 1f\n\t" - "dec %%o1\n\t" - "sethi %%hi(%2), %%g1\n\t" - "st %%o0, [%%g1 + %%lo(%2)]\n\t" - "b 2f\n\t" - "mov -1, %0\n\t" - "1:\n\t" - "and %%o0, %%o1, %0\n\t" - "2:\n\t" - : "=r" (__res) - : "0" (__NR_fork), "i" (&errno) - : "g1", "o0", "cc"); - return __res; -} -#else -static inline _syscall0(int,fork) -#endif -static inline _syscall0(pid_t,setsid) -static inline _syscall3(int,syslog,int, type, char *, buf, int, len); -#else -static inline _syscall5(int,_newselect,int,n,fd_set *,rd,fd_set *,wr,fd_set *,ex,struct timeval *,timeval); -static inline _syscall3(int,write,int,fd,const char *,buf,unsigned long,count) -static inline _syscall2(int,socketcall,int,code,unsigned long *, args) -#define __NR__do_exit __NR_exit -extern inline _syscall1(int,_do_exit,int,exitcode) -#endif - -#define select _newselect - -extern int errno; - -inline int socket(int a, int b, int c); -inline int bind(int a, void * b, int c); -inline int listen(int a, int b); -inline int accept(int a, void * addr, void * addr2); - -void sleep(int secs); - -int strlen(const char * string); -char * strcpy(char * dst, const char * src); -void * memcpy(void * dst, const void * src, size_t count); -int strcmp(const char * a, const char * b); -int strncmp(const char * a, const char * b, int len); -char * strchr(char * str, int ch); -char * strstr(char *haystack, char *needle); -char * strncpy(char * dst, const char * src, int len); - -void print_str_init(int fd, char * string); -void print_int_init(int fd, int i); -/* Minimum printf which handles only characters, %d's and %s's */ -void printf(char * fmt, ...); - diff --git a/mdk-stage1/modules.c b/mdk-stage1/modules.c index 2788315f8..76177302e 100644 --- a/mdk-stage1/modules.c +++ b/mdk-stage1/modules.c @@ -1,7 +1,7 @@ /* - * Guillaume Cottenceau (gc@mandrakesoft.com) + * Guillaume Cottenceau (gc) * - * Copyright 2000 MandrakeSoft + * Copyright 2000 Mandriva * * This software may be freely redistributed under the terms of the GNU * public license. @@ -18,103 +18,130 @@ * (3) insmod them */ +#include "stage1.h" + #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> +#include <sys/mount.h> #include <fcntl.h> +#include <libgen.h> #include <unistd.h> #include <string.h> #include <stdio.h> -#include "insmod.h" -#include "stage1.h" +#include <errno.h> +#include <time.h> +#include <sys/utsname.h> +#include <libkmod.h> #include "log.h" -#include "mar/mar-extract-only.h" +#include "utils.h" #include "frontend.h" +#include "mount.h" +#include "zlibsupport.h" #include "modules.h" -static struct module_deps_elem * modules_deps = NULL; +static char modules_directory[100]; +static struct module_descr_elem * modules_descr = NULL; -static char * archive_name = "/modules/modules.mar"; -static int disable_modules = 0; +extern long init_module(void *, unsigned long, const char *); - -/* unarchive and insmod given module - * WARNING: module must not contain the trailing ".o" - */ -static int insmod_archived_file(const char * mod_name, char * options) +static const char *moderror(int err) { - char module_name[50]; - char final_name[50] = "/tmp/"; - int i, rc; - - strncpy(module_name, mod_name, sizeof(module_name)); - strcat(module_name, ".o"); - i = mar_extract_file(archive_name, module_name, "/tmp/"); - if (i == 1) { - log_message("file-not-found-in-archive %s", module_name); - return -1; + switch (err) { + case ENOEXEC: + return "Invalid module format"; + case ENOENT: + return "Unknown symbol in module"; + case ESRCH: + return "Module has wrong symbol version"; + case EINVAL: + return "Invalid parameters"; + default: + return strerror(err); } - if (i != 0) - return -1; +} - strcat(final_name, mod_name); - strcat(final_name, ".o"); +int insmod_local_file(char * path, char * options) +{ + void *file; + unsigned long len; + int rc; + + if (IS_TESTING) + return 0; - rc = insmod_call(final_name, options); + file = grab_file(path, &len); + + if (!file) { + log_perror(asprintf_("\terror reading %s", path)); + return -1; + } + + rc = init_module(file, len, options ? options : ""); if (rc) - log_message("\tfailed"); - unlink(final_name); /* sucking no space left on device */ + log_message("\terror: %s", moderror(errno)); return rc; } - - -static int load_modules_dependencies(void) +static char *kernel_module_extension(void) { - char * deps_file = "/modules/modules.dep"; - char * buf, * ptr, * start, * end; - struct stat s; - int fd, line, i; + return ".ko.xz"; +} - log_message("loading modules dependencies"); - if (IS_TESTING) - return 0; +static char *filename2modname(char * filename) { + char *modname, *p; - fd = open(deps_file, O_RDONLY); - if (fd == -1) { - log_perror(deps_file); - return -1; + modname = strdup(basename(filename)); + if (strstr(modname, kernel_module_extension())) { + modname[strlen(modname)-strlen(kernel_module_extension())] = '\0'; /* remove trailing .ko.gz */ } - - fstat(fd, &s); - buf = alloca(s.st_size + 1); - if (read(fd, buf, s.st_size) != s.st_size) { - log_perror(deps_file); - return -1; + + p = modname; + while (p && *p) { + if (*p == '-') + *p = '_'; + p++; } - buf[s.st_size] = '\0'; - close(fd); - ptr = buf; - line = 0; - while (ptr) { - line++; - ptr = strchr(ptr + 1, '\n'); + return modname; +} + +static void find_modules_directory(void) +{ + struct utsname kernel_uname; + char * prefix = "/lib/modules"; + char * release; + if (uname(&kernel_uname)) { + fatal_error("uname failed"); } + release = kernel_uname.release; + sprintf(modules_directory , "%s/%s", prefix, release); +} + +static int load_modules_descriptions(void) +{ + char * descr_file = asprintf_("%s/%s", modules_directory, "modules.description"); + char * buf, * ptr, * start, * end; + struct stat s; + int line; + + log_message("loading modules descriptions"); - modules_deps = malloc(sizeof(*modules_deps) * (line+1)); + buf = cat_file(descr_file, &s); + if (!buf) + return -1; + line = line_counts(buf); + modules_descr = malloc(sizeof(*modules_descr) * (line+1)); start = buf; line = 0; while (start < (buf+s.st_size) && *start) { - char * tmp_deps[50]; - end = strchr(start, '\n'); *end = '\0'; - ptr = strchr(start, ':'); + ptr = strchr(start, '\t'); if (!ptr) { start = end + 1; continue; @@ -122,54 +149,32 @@ static int load_modules_dependencies(void) *ptr = '\0'; ptr++; - while (*ptr && (*ptr == ' ')) ptr++; - if (!*ptr) { - start = end + 1; - continue; - } - - /* sort of a good line */ - modules_deps[line].name = strdup(start); - - start = ptr; - i = 0; - while (start && *start) { - ptr = strchr(start, ' '); - if (ptr) *ptr = '\0'; - tmp_deps[i++] = strdup(start); - if (ptr) - start = ptr + 1; - else - start = NULL; - while (start && *start && *start == ' ') - start++; - } - tmp_deps[i++] = NULL; - - modules_deps[line].deps = memdup(tmp_deps, sizeof(char *) * i); + modules_descr[line].modname = filename2modname(start); + modules_descr[line].description = strndup(ptr, 50); line++; start = end + 1; } - modules_deps[line].name = NULL; + modules_descr[line].modname = NULL; + + free(buf); return 0; } - void init_modules_insmoding(void) { - if (load_modules_dependencies()) { - log_message("warning, error initing modules stuff, modules loading disabled"); - disable_modules = 1; + find_modules_directory(); + if (load_modules_descriptions()) { + log_message("warning, error initing modules stuff"); } } static void add_modules_conf(char * str) { - static char data[500] = ""; - char * target = "/etc/modules.conf"; + static char data[5000] = ""; + char * target = "/tmp/modules.conf"; int fd; if (strlen(data) + strlen(str) >= sizeof(data)) @@ -185,98 +190,166 @@ static void add_modules_conf(char * str) return; } - if (write(fd, data, strlen(data) + 1) != strlen(data) + 1) + if (write(fd, data, strlen(data) + 1) != (ssize_t) (strlen(data) + 1)) log_perror(str); close(fd); } -static int module_already_present(const char * name) +int module_already_present(const char * name) { FILE * f; + struct stat sb; + char *path; int answ = 0; - f = fopen("/proc/modules", "rb"); - while (1) { - char buf[500]; - if (!fgets(buf, sizeof(buf), f)) break; - if (!strncmp(name, buf, strlen(name))) + + if ((f = fopen("/proc/modules", "rb"))) { + while (1) { + char buf[500]; + if (!fgets(buf, sizeof(buf), f)) break; + if (!strncmp(name, buf, strlen(name)) && buf[strlen(name)] == ' ') + answ = 1; + } + fclose(f); + } + + /* built-in module case. try to find them through sysfs */ + if (!answ) { + asprintf(&path, "/sys/module/%s", name); + if (!stat(path, &sb)) answ = 1; + free(path); + } + if (!answ) { + asprintf(&path, "/sys/fs/%s", name); + if (!stat(path, &sb)) + answ = 1; + free(path); } - fclose(f); return answ; } -static int insmod_with_deps(const char * mod_name, char * options) -{ - struct module_deps_elem * dep; - - dep = modules_deps; - while (dep && dep->name && strcmp(dep->name, mod_name)) dep++; - - if (dep && dep->name && dep->deps) { - char ** one_dep; - one_dep = dep->deps; - while (*one_dep) { - /* here, we can fail but we don't care, if the error is - * important, the desired module will fail also */ - insmod_with_deps(*one_dep, NULL); - one_dep++; +#ifndef ENABLE_NETWORK_STANDALONE +static enum insmod_return insmod_with_deps(const char * alias, char * options) { + struct kmod_ctx *ctx; + struct kmod_list *l, *list = NULL; + int err = 0, flags = 0; + + if (!*modules_directory) + find_modules_directory(); + + ctx = kmod_new(modules_directory, NULL); + if (!ctx) { + fputs("Error: kmod_new() failed!\n", stderr); + goto exit; + } + kmod_load_resources(ctx); + + err = kmod_module_new_from_lookup(ctx, alias, &list); + if (err < 0) + goto exit; + + // No module found... + if (list == NULL) + goto exit; + + // filter through blacklist + struct kmod_list *filtered = NULL; + err = kmod_module_apply_filter(ctx, KMOD_FILTER_BLACKLIST, list, &filtered); + kmod_module_unref_list(list); + if (err < 0) + goto exit; + list = filtered; + + kmod_list_foreach(l, list) { + struct kmod_module *mod = kmod_module_get_module(l); + err = kmod_module_probe_insert_module(mod, flags, + options, NULL, NULL, NULL); + + if (err >= 0) + /* ignore flag return values such as a mod being blacklisted */ + err = 0; + else { + switch (err) { + case -EEXIST: + fprintf(stderr, "could not insert '%s': Module already in kernel\n", + kmod_module_get_name(mod)); + break; + case -ENOENT: + fprintf(stderr, "could not insert '%s': Unknown symbol in module, " + "or unknown parameter (see dmesg)\n", + kmod_module_get_name(mod)); + break; + default: + fprintf(stderr, "could not insert '%s': %s\n", + kmod_module_get_name(mod), + strerror(-err)); + break; + } } + + kmod_module_unref(mod); + if (err < 0) + break; } - if (module_already_present(mod_name)) - return 0; + kmod_module_unref_list(list); + +exit: + kmod_unref(ctx); - log_message("needs %s", mod_name); - return insmod_archived_file(mod_name, options); + switch (err){ + case 0: + return INSMOD_OK; + case -ENOENT: + return INSMOD_FAILED_FILE_NOT_FOUND; + default: + return INSMOD_FAILED; + } } +#endif -int my_insmod(const char * mod_name, enum driver_type type, char * options) +#ifndef DISABLE_NETWORK +enum insmod_return my_modprobe(const char * mod_name, enum driver_type type, char * options) +#else +enum insmod_return my_modprobe(const char * mod_name, enum driver_type type __attribute__ ((unused)), char * options) +#endif { - char alias[500]; int i; -#ifndef DISABLE_MEDIAS - static int number_scsi = 0; -#endif #ifndef DISABLE_NETWORK char ** net_devices = NULL; /* fucking compiler */ #endif - log_message("have to insmod %s", mod_name); + if (module_already_present(mod_name)) + return INSMOD_OK; - if (disable_modules) { - log_message("\tdisabled"); - return 0; - } + log_message("have to insmod %s", mod_name); #ifndef DISABLE_NETWORK if (type == NETWORK_DEVICES) net_devices = get_net_devices(); #endif - if (IS_TESTING) - return 0; - +#ifdef ENABLE_NETWORK_STANDALONE + { + char *cmd = options ? asprintf_("/sbin/modprobe %s %s", mod_name, options) : + asprintf_("/sbin/modprobe %s", mod_name); + log_message("running %s", cmd); + i = system(cmd); + } +#else i = insmod_with_deps(mod_name, options); +#endif if (i == 0) { log_message("\tsucceeded %s", mod_name); -#ifndef DISABLE_MEDIAS - if (type == SCSI_ADAPTERS) { - if (number_scsi > 0) - sprintf(alias, "alias scsi_hostadapter%d %s", number_scsi, mod_name); - else - sprintf(alias, "alias scsi_hostadapter %s", mod_name); - number_scsi++; - add_modules_conf(alias); - } -#endif #ifndef DISABLE_NETWORK if (type == NETWORK_DEVICES) { char ** new_net_devices = get_net_devices(); while (new_net_devices && *new_net_devices) { + char alias[500]; char ** ptr = net_devices; while (ptr && *ptr) { if (!strcmp(*new_net_devices, *ptr)) @@ -286,7 +359,6 @@ int my_insmod(const char * mod_name, enum driver_type type, char * options) sprintf(alias, "alias %s %s", *new_net_devices, mod_name); add_modules_conf(alias); log_message("NET: %s", alias); - net_discovered_interface(*new_net_devices); already_present: new_net_devices++; @@ -294,7 +366,7 @@ int my_insmod(const char * mod_name, enum driver_type type, char * options) } #endif } else - log_message("warning, insmod failed (%s %s)", mod_name, options); + log_message("warning, insmod failed (%s %s) (%d)", mod_name, options, i); return i; @@ -313,10 +385,10 @@ static enum return_type insmod_with_options(char * mod, enum driver_type type) strcat(options, mod); strcat(options, " "); - strcat(options, answers[0]); // because my_insmod will eventually modify the string + strcat(options, answers[0]); // because my_modprobe will eventually modify the string - if (my_insmod(mod, type, answers[0])) { - error_message("Insmod failed."); + if (my_modprobe(mod, type, answers[0]) != INSMOD_OK) { + stg1_error_message("Insmod failed."); return RETURN_ERROR; } @@ -325,32 +397,65 @@ static enum return_type insmod_with_options(char * mod, enum driver_type type) return RETURN_OK; } +static int strsortfunc(const void *a, const void *b) +{ + return strcmp(* (char * const *) a, * (char * const *) b); +} + enum return_type ask_insmod(enum driver_type type) { - char * mytype; - char msg[200]; enum return_type results; char * choice; + char ** dlist = list_directory(modules_directory); + char ** modules = alloca(sizeof(char *) * (string_array_length(dlist) + 1)); + char ** descrs = alloca(sizeof(char *) * (string_array_length(dlist) + 1)); + char ** p_dlist = dlist; + char ** p_modules = modules; + char ** p_descrs = descrs; - unset_param(MODE_AUTOMATIC); /* we are in a fallback mode */ + qsort(dlist, string_array_length(dlist), sizeof(char *), strsortfunc); - if (type == SCSI_ADAPTERS) - mytype = "SCSI"; - else if (type == NETWORK_DEVICES) - mytype = "NET"; - else - return RETURN_ERROR; + unset_automatic(); /* we are in a fallback mode */ - if (disable_modules) + while (p_dlist && *p_dlist) { + struct module_descr_elem * descr; + if (!strstr(*p_dlist, kernel_module_extension())) { + p_dlist++; + continue; + } + *p_modules = *p_dlist; + *p_descrs = NULL; + (*p_modules)[strlen(*p_modules)-strlen(kernel_module_extension())] = '\0'; /* remove trailing .ko.gz */ + + descr = modules_descr; + while (descr && descr->modname && strcmp(descr->modname, *p_modules)) descr++; + if (descr) + *p_descrs = descr->description; + + p_dlist++; + p_modules++; + p_descrs++; + } + *p_modules = NULL; + *p_descrs = NULL; + + if (modules && *modules) { + char * mytype; + char msg[200]; + if (type == MEDIA_ADAPTERS) + mytype = "MEDIA"; + else if (type == NETWORK_DEVICES) + mytype = "NET"; + else + return RETURN_ERROR; + + snprintf(msg, sizeof(msg), "Which driver should I try to gain %s access?", mytype); + results = ask_from_list_comments(msg, modules, descrs, &choice); + if (results == RETURN_OK) + return insmod_with_options(choice, type); + else + return results; + } else { return RETURN_BACK; - - snprintf(msg, sizeof(msg), "Which driver should I try to gain %s access?", mytype); - - results = ask_from_list(msg, mar_list_contents(archive_name), &choice); - - if (results == RETURN_OK) { - choice[strlen(choice)-2] = '\0'; /* remove trailing .o */ - return insmod_with_options(choice, type); - } else - return results; + } } diff --git a/mdk-stage1/modules.h b/mdk-stage1/modules.h index b1c921b01..1a6d8753f 100644 --- a/mdk-stage1/modules.h +++ b/mdk-stage1/modules.h @@ -1,7 +1,7 @@ /* - * Guillaume Cottenceau (gc@mandrakesoft.com) + * Guillaume Cottenceau (gc) * - * Copyright 2000 MandrakeSoft + * Copyright 2000 Mandriva * * This software may be freely redistributed under the terms of the GNU * public license. @@ -18,15 +18,20 @@ #include "stage1.h" #include "probing.h" +enum insmod_return { INSMOD_OK, INSMOD_FAILED, INSMOD_FAILED_FILE_NOT_FOUND }; + void init_modules_insmoding(void); -int my_insmod(const char * mod_name, enum driver_type type, char * options); +void init_firmware_loader(void); +int insmod_local_file(char * path, char * options); +enum insmod_return my_modprobe(const char * mod_name, enum driver_type type, char * options); enum return_type ask_insmod(enum driver_type); +int module_already_present(const char * name); -struct module_deps_elem { - char * name; - char ** deps; +struct module_descr_elem { + char * modname; + char * description; }; - +extern int disable_modules; #endif diff --git a/mdk-stage1/mount.c b/mdk-stage1/mount.c index 171bf30b5..14b2b2fc2 100644 --- a/mdk-stage1/mount.c +++ b/mdk-stage1/mount.c @@ -1,7 +1,7 @@ /* - * Guillaume Cottenceau (gc@mandrakesoft.com) + * Guillaume Cottenceau (gc) * - * Copyright 2000 MandrakeSoft + * Copyright 2000 Mandriva * * This software may be freely redistributed under the terms of the GNU * public license. @@ -19,6 +19,9 @@ * */ +// for asprintf: +#define _GNU_SOURCE +#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> @@ -26,87 +29,40 @@ #include <sys/stat.h> #include <sys/types.h> #include "log.h" +#include "utils.h" #include "modules.h" #include "mount.h" -#ifndef DISABLE_MEDIAS /* WARNING: this won't work if the argument is not /dev/ based */ -static int ensure_dev_exists(char *dev) +int ensure_dev_exists(const char * dev) { - int major, minor; - int type = S_IFBLK; /* my default type is block. don't forget to change for chars */ - char * name; struct stat buf; - name = &dev[5]; /* we really need that dev be passed as /dev/something.. */ - if (!stat(dev, &buf)) return 0; /* if the file already exists, we assume it's correct */ - if (name[0] == 's' && name[1] == 'd') { - /* SCSI disks */ - major = 8; - minor = (name[2] - 'a') << 4; - if (name[3] && name[4]) - minor += 10 + (name[4] - '0'); - else if (name[3]) - minor += (name[3] - '0'); - } else if (name[0] == 'h' && name[1] == 'd') { - /* IDE disks/cd's */ - if (name[2] == 'a') - major = 3, minor = 0; - else if (name[2] == 'b') - major = 3, minor = 64; - else if (name[2] == 'c') - major = 22, minor = 0; - else if (name[2] == 'd') - major = 22, minor = 64; - else if (name[2] == 'e') - major = 33, minor = 0; - else if (name[2] == 'f') - major = 33, minor = 64; - else if (name[2] == 'g') - major = 34, minor = 0; - else if (name[2] == 'h') - major = 34, minor = 64; - else - return -1; - - if (name[3] && name[4]) - minor += 10 + (name[4] - '0'); - else if (name[3]) - minor += (name[3] - '0'); - } else if (name[0] == 's' && name[1] == 'c' && name[2] == 'd') { - /* SCSI cd's */ - major = 11; - minor = name[3] - '0'; - } else { - log_message("I don't know how to create device %s, please post bugreport to me!", dev); - return -1; - } + // give udev some time to create nodes if module was just insmoded: + system("udevadm settle"); - if (mknod(dev, type | 0600, makedev(major, minor))) { - log_perror(dev); + if (!stat(dev, &buf)) { + log_message("I don't know how to create device %s, please post bugreport to me!", dev); return -1; } return 0; } -#endif /* DISABLE_MEDIAS */ /* mounts, creating the device if needed+possible */ -int my_mount(char *dev, char *location, char *fs) +int my_mount(char *dev, char *location, char *fs, int force_rw) { - unsigned long flags; char * opts = NULL; struct stat buf; int rc; -#ifndef DISABLE_MEDIAS if (strcmp(fs, "nfs")) { rc = ensure_dev_exists(dev); if (rc != 0) { @@ -114,7 +70,6 @@ int my_mount(char *dev, char *location, char *fs) return -1; } } -#endif log_message("mounting %s on %s as type %s", dev, location, fs); @@ -135,41 +90,20 @@ int my_mount(char *dev, char *location, char *fs) } } - flags = MS_MGC_VAL; - #ifndef DISABLE_MEDIAS - if (!strcmp(fs, "vfat")) { - my_insmod("vfat", ANY_DRIVER_TYPE, NULL); + if (!strcmp(fs, "nfs")) + opts = "nolock"; + if (!strcmp(fs, "vfat")) opts = "check=relaxed"; - } - - if (!strcmp(fs, "reiserfs")) { - my_insmod("reiserfs", ANY_DRIVER_TYPE, NULL); - } - - if (!strcmp(fs, "iso9660")) { - my_insmod("isofs", ANY_DRIVER_TYPE, NULL); - flags |= MS_RDONLY; - } #endif - -#ifndef DISABLE_NETWORK - if (!strcmp(fs, "nfs")) { - int flags = 0; - - my_insmod("nfs", ANY_DRIVER_TYPE, NULL); - flags |= MS_RDONLY; - - log_message("preparing nfsmount for %s", dev); - - rc = nfsmount_prepare(dev, &flags, &opts); - if (rc != 0) - return rc; + char *cmd; + rc = asprintf(&cmd, "mount %s %s -t %s -o %s%s > /dev/null 2>&1", dev, location, fs, (force_rw ? "" : "ro,"), (opts ? opts : "")); + if (rc == -1) { + log_perror("asprint allocation failure"); + rmdir(location); + return rc; } -#endif - - rc = mount(dev, location, fs, flags, opts); - + rc = system(cmd); if (rc != 0) { log_perror("mount failed"); rmdir(location); diff --git a/mdk-stage1/mount.h b/mdk-stage1/mount.h index b679e5c30..dc8d674c3 100644 --- a/mdk-stage1/mount.h +++ b/mdk-stage1/mount.h @@ -1,7 +1,7 @@ /* - * Guillaume Cottenceau (gc@mandrakesoft.com) + * Guillaume Cottenceau (gc) * - * Copyright 2000 MandrakeSoft + * Copyright 2000 Mandriva * * This software may be freely redistributed under the terms of the GNU * public license. @@ -22,10 +22,7 @@ #ifndef _MOUNT_H_ #define _MOUNT_H_ -#ifndef DISABLE_NETWORK -#include "nfsmount.h" -#endif - -int my_mount(char *dev, char *location, char *fs); +int my_mount(char *dev, char *location, char *fs, int force_rw); +int ensure_dev_exists(const char * dev); #endif diff --git a/mdk-stage1/mount_rpcgen.h b/mdk-stage1/mount_rpcgen.h deleted file mode 100644 index d70ccaf9d..000000000 --- a/mdk-stage1/mount_rpcgen.h +++ /dev/null @@ -1,208 +0,0 @@ -/* - * Please do not edit this file. - * It was generated using rpcgen. - */ - -#ifndef _MOUNT_H_RPCGEN -#define _MOUNT_H_RPCGEN - -#include <rpc/rpc.h> - -#define MNTPATHLEN 1024 -#define MNTNAMLEN 255 -#define FHSIZE 32 - -typedef char fhandle[FHSIZE]; -#ifdef __cplusplus -extern "C" bool_t xdr_fhandle(XDR *, fhandle); -#elif __STDC__ -extern bool_t xdr_fhandle(XDR *, fhandle); -#else /* Old Style C */ -bool_t xdr_fhandle(); -#endif /* Old Style C */ - - -struct fhstatus { - u_int fhs_status; - union { - fhandle fhs_fhandle; - } fhstatus_u; -}; -typedef struct fhstatus fhstatus; -#ifdef __cplusplus -extern "C" bool_t xdr_fhstatus(XDR *, fhstatus*); -#elif __STDC__ -extern bool_t xdr_fhstatus(XDR *, fhstatus*); -#else /* Old Style C */ -bool_t xdr_fhstatus(); -#endif /* Old Style C */ - - -typedef char *dirpath; -#ifdef __cplusplus -extern "C" bool_t xdr_dirpath(XDR *, dirpath*); -#elif __STDC__ -extern bool_t xdr_dirpath(XDR *, dirpath*); -#else /* Old Style C */ -bool_t xdr_dirpath(); -#endif /* Old Style C */ - - -typedef char *name; -#ifdef __cplusplus -extern "C" bool_t xdr_name(XDR *, name*); -#elif __STDC__ -extern bool_t xdr_name(XDR *, name*); -#else /* Old Style C */ -bool_t xdr_name(); -#endif /* Old Style C */ - - -typedef struct mountbody *mountlist; -#ifdef __cplusplus -extern "C" bool_t xdr_mountlist(XDR *, mountlist*); -#elif __STDC__ -extern bool_t xdr_mountlist(XDR *, mountlist*); -#else /* Old Style C */ -bool_t xdr_mountlist(); -#endif /* Old Style C */ - - -struct mountbody { - name ml_hostname; - dirpath ml_directory; - mountlist ml_next; -}; -typedef struct mountbody mountbody; -#ifdef __cplusplus -extern "C" bool_t xdr_mountbody(XDR *, mountbody*); -#elif __STDC__ -extern bool_t xdr_mountbody(XDR *, mountbody*); -#else /* Old Style C */ -bool_t xdr_mountbody(); -#endif /* Old Style C */ - - -typedef struct groupnode *groups; -#ifdef __cplusplus -extern "C" bool_t xdr_groups(XDR *, groups*); -#elif __STDC__ -extern bool_t xdr_groups(XDR *, groups*); -#else /* Old Style C */ -bool_t xdr_groups(); -#endif /* Old Style C */ - - -struct groupnode { - name gr_name; - groups gr_next; -}; -typedef struct groupnode groupnode; -#ifdef __cplusplus -extern "C" bool_t xdr_groupnode(XDR *, groupnode*); -#elif __STDC__ -extern bool_t xdr_groupnode(XDR *, groupnode*); -#else /* Old Style C */ -bool_t xdr_groupnode(); -#endif /* Old Style C */ - - -typedef struct exportnode *exports; -#ifdef __cplusplus -extern "C" bool_t xdr_exports(XDR *, exports*); -#elif __STDC__ -extern bool_t xdr_exports(XDR *, exports*); -#else /* Old Style C */ -bool_t xdr_exports(); -#endif /* Old Style C */ - - -struct exportnode { - dirpath ex_dir; - groups ex_groups; - exports ex_next; -}; -typedef struct exportnode exportnode; -#ifdef __cplusplus -extern "C" bool_t xdr_exportnode(XDR *, exportnode*); -#elif __STDC__ -extern bool_t xdr_exportnode(XDR *, exportnode*); -#else /* Old Style C */ -bool_t xdr_exportnode(); -#endif /* Old Style C */ - - -#define MOUNTPROG ((u_long)100005) -#define MOUNTVERS ((u_long)1) - -#ifdef __cplusplus -#define MOUNTPROC_NULL ((u_long)0) -extern "C" void * mountproc_null_1(void *, CLIENT *); -extern "C" void * mountproc_null_1_svc(void *, struct svc_req *); -#define MOUNTPROC_MNT ((u_long)1) -extern "C" fhstatus * mountproc_mnt_1(dirpath *, CLIENT *); -extern "C" fhstatus * mountproc_mnt_1_svc(dirpath *, struct svc_req *); -#define MOUNTPROC_DUMP ((u_long)2) -extern "C" mountlist * mountproc_dump_1(void *, CLIENT *); -extern "C" mountlist * mountproc_dump_1_svc(void *, struct svc_req *); -#define MOUNTPROC_UMNT ((u_long)3) -extern "C" void * mountproc_umnt_1(dirpath *, CLIENT *); -extern "C" void * mountproc_umnt_1_svc(dirpath *, struct svc_req *); -#define MOUNTPROC_UMNTALL ((u_long)4) -extern "C" void * mountproc_umntall_1(void *, CLIENT *); -extern "C" void * mountproc_umntall_1_svc(void *, struct svc_req *); -#define MOUNTPROC_EXPORT ((u_long)5) -extern "C" exports * mountproc_export_1(void *, CLIENT *); -extern "C" exports * mountproc_export_1_svc(void *, struct svc_req *); -#define MOUNTPROC_EXPORTALL ((u_long)6) -extern "C" exports * mountproc_exportall_1(void *, CLIENT *); -extern "C" exports * mountproc_exportall_1_svc(void *, struct svc_req *); - -#elif __STDC__ -#define MOUNTPROC_NULL ((u_long)0) -extern void * mountproc_null_1(void *, CLIENT *); -extern void * mountproc_null_1_svc(void *, struct svc_req *); -#define MOUNTPROC_MNT ((u_long)1) -extern fhstatus * mountproc_mnt_1(dirpath *, CLIENT *); -extern fhstatus * mountproc_mnt_1_svc(dirpath *, struct svc_req *); -#define MOUNTPROC_DUMP ((u_long)2) -extern mountlist * mountproc_dump_1(void *, CLIENT *); -extern mountlist * mountproc_dump_1_svc(void *, struct svc_req *); -#define MOUNTPROC_UMNT ((u_long)3) -extern void * mountproc_umnt_1(dirpath *, CLIENT *); -extern void * mountproc_umnt_1_svc(dirpath *, struct svc_req *); -#define MOUNTPROC_UMNTALL ((u_long)4) -extern void * mountproc_umntall_1(void *, CLIENT *); -extern void * mountproc_umntall_1_svc(void *, struct svc_req *); -#define MOUNTPROC_EXPORT ((u_long)5) -extern exports * mountproc_export_1(void *, CLIENT *); -extern exports * mountproc_export_1_svc(void *, struct svc_req *); -#define MOUNTPROC_EXPORTALL ((u_long)6) -extern exports * mountproc_exportall_1(void *, CLIENT *); -extern exports * mountproc_exportall_1_svc(void *, struct svc_req *); - -#else /* Old Style C */ -#define MOUNTPROC_NULL ((u_long)0) -extern void * mountproc_null_1(); -extern void * mountproc_null_1_svc(); -#define MOUNTPROC_MNT ((u_long)1) -extern fhstatus * mountproc_mnt_1(); -extern fhstatus * mountproc_mnt_1_svc(); -#define MOUNTPROC_DUMP ((u_long)2) -extern mountlist * mountproc_dump_1(); -extern mountlist * mountproc_dump_1_svc(); -#define MOUNTPROC_UMNT ((u_long)3) -extern void * mountproc_umnt_1(); -extern void * mountproc_umnt_1_svc(); -#define MOUNTPROC_UMNTALL ((u_long)4) -extern void * mountproc_umntall_1(); -extern void * mountproc_umntall_1_svc(); -#define MOUNTPROC_EXPORT ((u_long)5) -extern exports * mountproc_export_1(); -extern exports * mountproc_export_1_svc(); -#define MOUNTPROC_EXPORTALL ((u_long)6) -extern exports * mountproc_exportall_1(); -extern exports * mountproc_exportall_1_svc(); -#endif /* Old Style C */ - -#endif /* !_MOUNT_H_RPCGEN */ diff --git a/mdk-stage1/network.c b/mdk-stage1/network.c index 9a07fa34a..ab512399a 100644 --- a/mdk-stage1/network.c +++ b/mdk-stage1/network.c @@ -1,7 +1,7 @@ /* - * Guillaume Cottenceau (gc@mandrakesoft.com) + * Guillaume Cottenceau (gc) * - * Copyright 2000 MandrakeSoft + * Copyright 2000 Mandriva * * This software may be freely redistributed under the terms of the GNU * public license. @@ -19,35 +19,47 @@ * */ +#include "stage1.h" + #include <stdlib.h> -#include <unistd.h> #include <string.h> +#include <unistd.h> #include <sys/socket.h> #include <net/if.h> #include <arpa/inet.h> #include <net/route.h> -#include <resolv.h> #include <sys/ioctl.h> #include <sys/mount.h> #include <stdio.h> +#include <fcntl.h> +#include <netdb.h> +#include <resolv.h> +#include <sys/utsname.h> -#include "stage1.h" #include "frontend.h" #include "modules.h" #include "probing.h" #include "log.h" -#include "dns.h" +#include "tools.h" +#include "utils.h" #include "mount.h" #include "automatic.h" #include "dhcp.h" +#include "adsl.h" #include "url.h" +#include "dns.h" #include "network.h" +#include "directory.h" +#include "wireless.h" +#ifndef DISABLE_KA +#include "ka.h" +#endif static void error_message_net(void) /* reduce code size */ { - error_message("Could not configure network."); + stg1_error_message("Could not configure network."); } @@ -166,7 +178,16 @@ int configure_net_device(struct interface_info * intf) close(s); intf->is_up = 1; - + + if (intf->boot_proto != BOOTPROTO_DHCP && !streq(intf->device, "lo")) { + /* I need to sleep a bit in order for kernel to finish + init of the network device; if not, first sendto() for + gethostbyaddr will get an EINVAL. */ + wait_message("Bringing up networking..."); + sleep(2); + remove_wait_message(); + } + return 0; } @@ -226,7 +247,8 @@ static int add_default_route(void) } -static int write_resolvconf(void) { +static int write_resolvconf(void) +{ char * filename = "/etc/resolv.conf"; FILE * f; @@ -254,16 +276,12 @@ static int write_resolvconf(void) { } -static int save_netinfo(struct interface_info * intf) { +static int save_netinfo(struct interface_info * intf) +{ char * file_network = "/tmp/network"; char file_intf[500]; FILE * f; - if (dns_server.s_addr == 0) { - log_message("resolvconf needs a dns server"); - return -1; - } - f = fopen(file_network, "w"); if (!f) { log_perror(file_network); @@ -273,11 +291,8 @@ static int save_netinfo(struct interface_info * intf) { fprintf(f, "NETWORKING=yes\n"); fprintf(f, "FORWARD_IPV4=false\n"); - if (hostname) + if (hostname && !(intf->boot_proto == BOOTPROTO_DHCP)) fprintf(f, "HOSTNAME=%s\n", hostname); - if (domain) - fprintf(f, "DOMAINNAME=%s\n", domain); - if (gateway.s_addr != 0) fprintf(f, "GATEWAY=%s\n", inet_ntoa(gateway)); @@ -295,14 +310,27 @@ static int save_netinfo(struct interface_info * intf) { fprintf(f, "DEVICE=%s\n", intf->device); - if (intf->boot_proto == BOOTPROTO_DHCP) + if (intf->boot_proto == BOOTPROTO_DHCP) { fprintf(f, "BOOTPROTO=dhcp\n"); - else { + if (dhcp_hostname && !streq(dhcp_hostname, "")) + fprintf(f, "DHCP_HOSTNAME=%s\n", dhcp_hostname); + } else if (intf->boot_proto == BOOTPROTO_STATIC) { fprintf(f, "BOOTPROTO=static\n"); fprintf(f, "IPADDR=%s\n", inet_ntoa(intf->ip)); fprintf(f, "NETMASK=%s\n", inet_ntoa(intf->netmask)); fprintf(f, "NETWORK=%s\n", inet_ntoa(intf->network)); fprintf(f, "BROADCAST=%s\n", inet_ntoa(intf->broadcast)); + if (domain) + fprintf(f, "DOMAIN=%s\n", domain); + if (dns_server.s_addr != 0) + fprintf(f, "DNS1=%s\n", inet_ntoa(dns_server)); + if (dns_server2.s_addr != 0) + fprintf(f, "DNS2=%s\n", inet_ntoa(dns_server2)); + } else if (intf->boot_proto == BOOTPROTO_ADSL_PPPOE) { + fprintf(f, "BOOTPROTO=adsl_pppoe\n"); + fprintf(f, "USER=%s\n", intf->user); + fprintf(f, "PASS=%s\n", intf->pass); + fprintf(f, "ACNAME=%s\n", intf->acname); } fclose(f); @@ -316,9 +344,11 @@ char * guess_netmask(char * ip_addr) struct in_addr addr; unsigned long int tmp; - if (!inet_aton(ip_addr, &addr)) + if (streq(ip_addr, "") || !inet_aton(ip_addr, &addr)) return ""; + log_message("guessing netmask"); + tmp = ntohl(addr.s_addr); if (((tmp & 0xFF000000) >> 24) <= 127) @@ -330,12 +360,27 @@ char * guess_netmask(char * ip_addr) } +char * guess_domain_from_hostname(char *hostname) +{ + char *domain = strchr(strdup(hostname), '.'); + if (!domain || domain[1] == '\0') { + log_message("unable to guess domain from hostname: %s", hostname); + return NULL; + } + return domain + 1; /* skip '.' */ +} + + static void static_ip_callback(char ** strings) { struct in_addr addr; - if (!inet_aton(strings[0], &addr)) + static int done = 0; + if (done) + return; + if (streq(strings[0], "") || !inet_aton(strings[0], &addr)) return; + done = 1; if (!strcmp(strings[1], "")) { char * ptr; @@ -356,11 +401,11 @@ static void static_ip_callback(char ** strings) static enum return_type setup_network_interface(struct interface_info * intf) { enum return_type results; - char * bootprotos[] = { "Static", "DHCP", NULL }; - char * bootprotos_auto[] = { "static", "dhcp" }; + char * bootprotos[] = { "DHCP", "Static", "ADSL", NULL }; + char * bootprotos_auto[] = { "dhcp", "static", "adsl" }; char * choice; - results = ask_from_list_auto("Please choose the desired IP attribution.", bootprotos, &choice, "network", bootprotos_auto); + results = ask_from_list_auto("Please select your network connection type.", bootprotos, &choice, "network", bootprotos_auto); if (results != RETURN_OK) return results; @@ -370,13 +415,13 @@ static enum return_type setup_network_interface(struct interface_info * intf) static char ** answers = NULL; struct in_addr addr; - results = ask_from_entries_auto("Please enter the network information. (leave netmask void for Internet standard)", + results = ask_from_entries_auto("Please enter the network information. (leave netmask blank for Internet standard)", questions, &answers, 16, questions_auto, static_ip_callback); if (results != RETURN_OK) return setup_network_interface(intf); - if (!inet_aton(answers[0], &addr)) { - error_message("Invalid IP address."); + if (streq(answers[0], "") || !inet_aton(answers[0], &addr)) { + stg1_error_message("Invalid IP address."); return setup_network_interface(intf); } memcpy(&intf->ip, &addr, sizeof(addr)); @@ -386,17 +431,23 @@ static enum return_type setup_network_interface(struct interface_info * intf) dns_server.s_addr = 0; /* keep an understandable state */ } + if (streq(answers[0], answers[1])) { + log_message("IP and DNS are the same, guess you don't want a DNS, disabling it"); + dns_server.s_addr = 0; /* keep an understandable state */ + } + if (!inet_aton(answers[2], &gateway)) { log_message("invalid gateway"); gateway.s_addr = 0; /* keep an understandable state */ } - if (!inet_aton(answers[3], &addr)) { - log_message("invalid netmask -- back to the guess"); - inet_aton(guess_netmask(answers[0]), &addr); - } - else + if ((streq(answers[3], "") && inet_aton(guess_netmask(answers[0]), &addr)) + || inet_aton(answers[3], &addr)) memcpy(&intf->netmask, &addr, sizeof(addr)); + else { + stg1_error_message("Invalid netmask."); + return setup_network_interface(intf); + } *((uint32_t *) &intf->broadcast) = (*((uint32_t *) &intf->ip) & *((uint32_t *) &intf->netmask)) | ~(*((uint32_t *) &intf->netmask)); @@ -411,7 +462,11 @@ static enum return_type setup_network_interface(struct interface_info * intf) intf->is_ptp = 0; } intf->boot_proto = BOOTPROTO_STATIC; - } else { + + if (configure_net_device(intf)) + return RETURN_ERROR; + + } else if (streq(choice, "DHCP")) { results = perform_dhcp(intf); if (results == RETURN_BACK) @@ -419,48 +474,61 @@ static enum return_type setup_network_interface(struct interface_info * intf) if (results == RETURN_ERROR) return results; intf->boot_proto = BOOTPROTO_DHCP; - } - - if (configure_net_device(intf)) + + if (configure_net_device(intf)) + return RETURN_ERROR; + + } else if (streq(choice, "ADSL")) { + results = perform_adsl(intf); + + if (results == RETURN_BACK) + return setup_network_interface(intf); + if (results == RETURN_ERROR) + return results; + } else return RETURN_ERROR; + return add_default_route(); } static enum return_type configure_network(struct interface_info * intf) { - char ips[50]; - char * name; + char * dnshostname; if (hostname && domain) return RETURN_OK; - wait_message("Trying to resolve hostname..."); - strcpy(ips, inet_ntoa(intf->ip)); - name = mygethostbyaddr(ips); - remove_wait_message(); - - if (name) { - hostname = strdup(name); - domain = strchr(strdup(name), '.') + 1; - log_message("got hostname and domain from dns entry, %s and %s", hostname, domain); - return RETURN_OK; - } + dnshostname = mygethostbyaddr(inet_ntoa(intf->ip)); - log_message("reverse name lookup on self failed"); + if (dnshostname) { + if (intf->boot_proto == BOOTPROTO_STATIC) + hostname = strdup(dnshostname); + domain = guess_domain_from_hostname(dnshostname); + if (domain) { + log_message("got hostname and domain from dns entry, %s and %s", dnshostname, domain); + return RETURN_OK; + } + } else + log_message("reverse name lookup on self failed"); if (domain) return RETURN_OK; + dnshostname = NULL; if (dns_server.s_addr != 0) { wait_message("Trying to resolve dns..."); - strcpy(ips, inet_ntoa(dns_server)); - name = mygethostbyaddr(ips); + dnshostname = mygethostbyaddr(inet_ntoa(dns_server)); remove_wait_message(); - } - - if (name) { - domain = strchr(strdup(name), '.') + 1; + if (dnshostname) { + log_message("got DNS fullname, %s", dnshostname); + domain = guess_domain_from_hostname(dnshostname); + } else + log_message("reverse name lookup on DNS failed"); + } else + log_message("no DNS, unable to guess domain"); + + if (domain) { log_message("got domain from DNS fullname, %s", domain); } else { enum return_type results; @@ -468,15 +536,21 @@ static enum return_type configure_network(struct interface_info * intf) char * questions_auto[] = { "hostname", "domain" }; static char ** answers = NULL; char * boulet; - - log_message("reverse name lookup on DNS failed"); - - results = ask_from_entries_auto("I could not guess hostname and domain name; please fill in this information. " - "Valid answers are for example: `mybox' for hostname and `mynetwork.com' for " - "domain name, for a machine called `mybox.mynetwork.com' on the Internet.", - questions, &answers, 32, questions_auto, NULL); - if (results != RETURN_OK) + + if (dhcp_hostname || dhcp_domain) { + answers = (char **) calloc(1, sizeof(questions)); + answers[0] = strdup(dhcp_hostname); + answers[1] = strdup(dhcp_domain); + } + + if (!dhcp_hostname || !dhcp_domain) { + results = ask_from_entries_auto("I could not guess hostname and domain name; please fill in this information. " + "Valid answers are for example: `mybox' for hostname and `mynetwork.com' for " + "domain name, for a machine called `mybox.mynetwork.com' on the Internet.", + questions, &answers, 32, questions_auto, NULL); + if (results != RETURN_OK) return results; + } hostname = answers[0]; if ((boulet = strchr(hostname, '.')) != NULL) @@ -484,6 +558,9 @@ static enum return_type configure_network(struct interface_info * intf) domain = answers[1]; } + log_message("using hostname %s", hostname); + log_message("using domain %s", domain); + return RETURN_OK; } @@ -491,17 +568,34 @@ static enum return_type configure_network(struct interface_info * intf) static enum return_type bringup_networking(struct interface_info * intf) { static struct interface_info loopback; - enum return_type results = RETURN_ERROR; - - my_insmod("af_packet", ANY_DRIVER_TYPE, NULL); + enum return_type results; + int fd; - while (results != RETURN_OK) { + /* try to find if module already loaded or built-in to avoid failing */ + /* badly */ + fd = open("/proc/net/packet", O_RDONLY); + if (fd < 0) + my_modprobe("af_packet", ANY_DRIVER_TYPE, NULL); + else + close(fd); + + do { + results = configure_wireless(intf->device); + } while (results == RETURN_ERROR); + + if (results == RETURN_BACK) + return RETURN_BACK; + + do { results = setup_network_interface(intf); if (results != RETURN_OK) return results; write_resolvconf(); results = configure_network(intf); - } + } while (results == RETURN_ERROR); + + if (results == RETURN_BACK) + return bringup_networking(intf); write_resolvconf(); /* maybe we have now domain to write also */ @@ -523,6 +617,63 @@ static enum return_type bringup_networking(struct interface_info * intf) } +static char * auto_select_up_intf(int detection_mode) +{ +#define SIOCETHTOOL 0x8946 +#define ETHTOOL_GLINK 0x0000000a /* Get link status (ethtool_value) */ + + struct ethtool_value { + uint32_t cmd; + uint32_t data; + }; + + char ** interfaces, ** ptr; + interfaces = get_net_devices(); + + int s; + s = socket(AF_INET, SOCK_DGRAM, 0); + if (s < 0) { + return NULL; + } + + ptr = interfaces; + while (ptr && *ptr) { + if (detection_mode != AUTO_DETECTION_WIRED || !wireless_is_aware(s, *interfaces)) { + struct ifreq ifr; + struct ethtool_value edata; + strncpy(ifr.ifr_name, *ptr, IFNAMSIZ); + edata.cmd = ETHTOOL_GLINK; + ifr.ifr_data = (caddr_t)&edata; + if (ioctl(s, SIOCETHTOOL, &ifr) == 0 && edata.data) { + close(s); + log_message("NETWORK: choosing interface %s (link beat detected)", *ptr); + return *ptr; + } + } + ptr++; + } + + log_message("NETWORK: no interface has a link beat"); + + if (detection_mode == AUTO_DETECTION_WIRED) { + ptr = interfaces; + while (ptr && *ptr) { + if (!wireless_is_aware(s, *interfaces)) { + close(s); + log_message("NETWORK: choosing interface %s (wired interface)", *ptr); + return *ptr; + } + ptr++; + } + log_message("NETWORK: no interface is wired"); + } + + close(s); + + return NULL; +} + + static char * interface_select(void) { char ** interfaces, ** ptr; @@ -540,7 +691,7 @@ static char * interface_select(void) } if (count == 0) { - error_message("No NET device found."); + stg1_error_message("No NET device found."); i = ask_insmod(NETWORK_DEVICES); if (i == RETURN_BACK) return NULL; @@ -550,6 +701,20 @@ static char * interface_select(void) if (count == 1) return *interfaces; + /* this can't be done in ask_from_list_comments_auto because "auto" and "wired" are not in the interfaces list */ + if (IS_AUTOMATIC) { + enum auto_detection_type auto_detect = AUTO_DETECTION_NONE; + if (streq(get_auto_value("interface"), "auto")) + auto_detect = AUTO_DETECTION_ALL; + else if (streq(get_auto_value("interface"), "wired")) + auto_detect = AUTO_DETECTION_WIRED; + if (auto_detect != AUTO_DETECTION_NONE) { + choice = auto_select_up_intf(auto_detect); + if (choice) + return choice; + } + } + i = 0; while (interfaces[i]) { descriptions[i] = get_net_intf_description(interfaces[i]); @@ -565,12 +730,171 @@ static char * interface_select(void) return choice; } +static enum return_type get_http_proxy(char **http_proxy_host, char **http_proxy_port) +{ + char *questions[] = { "HTTP proxy host", "HTTP proxy port", NULL }; + char *questions_auto[] = { "proxy_host", "proxy_port", NULL }; + static char ** answers = NULL; + enum return_type results; + + results = ask_from_entries_auto("Please enter HTTP proxy host and port if you need it, else leave them blank or cancel.", + questions, &answers, 40, questions_auto, NULL); + if (results == RETURN_OK) { + *http_proxy_host = answers[0]; + *http_proxy_port = answers[1]; + } else { + *http_proxy_host = NULL; + *http_proxy_port = NULL; + } + + return results; +} + + +static int url_split(const char *url, const char *protocol, char **host, char **path) +{ + char *protocol_sep, *host_sep; + + protocol_sep = strstr(url, "://"); + if (!protocol_sep) { + log_message("NETWORK: no protocol in \"%s\"", url); + return -1; + } + + if (strncmp(protocol, url, protocol_sep - url)) + return -1; + + url = protocol_sep + 3; + host_sep = strchr(url, '/'); + if (!host_sep || host_sep == url) { + log_message("NETWORK: no hostname in \"%s\"", url); + return -1; + } + + *host = strndup(url, host_sep - url); + *path = strdup(host_sep); + + return 0; +} + +#define MIRRORLIST_MAX_ITEMS 500 +typedef char *mirrorlist_t[2][MIRRORLIST_MAX_ITEMS+1]; + +static enum return_type get_mirrorlist(mirrorlist_t mirrorlist, int start, char *version, const char *protocol, char *http_proxy_host, char *http_proxy_port) { + int fd, size, line_pos = 0; + char path[1024]; + char line[1024]; + char type[100] = DISTRIB_TYPE; + int mirror_idx = start; + + int use_http_proxy = http_proxy_host && http_proxy_port && !streq(http_proxy_host, "") && !streq(http_proxy_port, ""); + lowercase(type); + snprintf(path, sizeof(path), "%s/%s.%s.%s.list", MIRRORLIST_PATH, type, version, ARCH); + + fd = http_download_file(MIRRORLIST_HOST, path, &size, use_http_proxy ? "http" : NULL, http_proxy_host, http_proxy_port); + if (fd < 0) { + log_message("HTTP: unable to get mirrors list from %s (%s)", MIRRORLIST_HOST, path); + return RETURN_ERROR; + } + + while (read(fd, line + line_pos, 1) > 0) { + if (line[line_pos] == '\n') { + char *url; + line[line_pos] = '\0'; + line_pos = 0; + + /* skip medium if it does not look like a distrib path */ + if (!strstr(line, ",type=distrib,")) + continue; + + url = strstr(line, ",url="); + if (!url) + continue; + url += 5; + + if (url_split(url, protocol, &mirrorlist[0][mirror_idx], &mirrorlist[1][mirror_idx]) < 0) + continue; + + mirror_idx++; + } else { + line_pos++; + } + + if (mirror_idx >= MIRRORLIST_MAX_ITEMS) + break; + } + close(fd); + + mirrorlist[0][mirror_idx] = NULL; + mirrorlist[1][mirror_idx] = NULL; + + return RETURN_OK; +} + +static int choose_mirror_from_host_list(mirrorlist_t mirrorlist, char **selected_host, char **filepath) +{ + enum return_type results; + int mirror_idx = 0; + + do { + results = ask_from_list_index("Please select a mirror from the list below.", + mirrorlist[0], NULL, &mirror_idx); + + if (results == RETURN_BACK) { + return RETURN_ERROR; + } else if (results == RETURN_OK) { + if (mirror_idx == 0) { + /* enter the mirror manually */ + return RETURN_OK; + } + *selected_host = strdup(mirrorlist[0][mirror_idx]); + *filepath = strdup(mirrorlist[1][mirror_idx]); + return RETURN_OK; + } + } while (results == RETURN_ERROR); + + return RETURN_ERROR; +} + + +static int choose_mirror_from_list(char *http_proxy_host, char *http_proxy_port, const char *protocol, char **selected_host, char **filepath) +{ + enum return_type results; + char *versions[] = { "Specify the mirror manually", DISTRIB_NAME " " DISTRIB_VERSION, NULL }; + char *version = DISTRIB_NAME " " DISTRIB_VERSION; + + do { + results = ask_from_list("Please select a medium from the list below.", versions, &version); + + if (results == RETURN_BACK) { + return RETURN_BACK; + } else if (results == RETURN_OK) { + if (!strcmp(version, versions[0])) { + /* enter the mirror manually */ + return RETURN_OK; + } else { + /* a medium has been selected */ + mirrorlist_t mirrorlist; + mirrorlist[0][0] = "Specify the mirror manually"; + mirrorlist[1][0] = NULL; + + results = get_mirrorlist(mirrorlist, 1, DISTRIB_VERSION, protocol, http_proxy_host, http_proxy_port); + if (results == RETURN_ERROR) + return RETURN_ERROR; + + results = choose_mirror_from_host_list(mirrorlist, selected_host, filepath); + } + } + } while (results == RETURN_ERROR); + + return results; +} /* -=-=-- */ -static enum return_type intf_select_and_up(void) +enum return_type intf_select_and_up() { static struct interface_info intf[20]; static int num_interfaces = 0; @@ -597,7 +921,7 @@ static enum return_type intf_select_and_up(void) if (results == RETURN_OK) save_netinfo(sel_intf); - + return results; } @@ -609,7 +933,7 @@ enum return_type nfs_prepare(void) char * questions_auto[] = { "server", "directory", NULL }; static char ** answers = NULL; char * nfsmount_location; - enum return_type results = intf_select_and_up(); + enum return_type results = intf_select_and_up(NULL, NULL); if (results != RETURN_OK) return results; @@ -618,41 +942,31 @@ enum return_type nfs_prepare(void) results = ask_from_entries_auto("Please enter the name or IP address of your NFS server, " "and the directory containing the " DISTRIB_NAME " Distribution.", questions, &answers, 40, questions_auto, NULL); - if (results != RETURN_OK) + if (results != RETURN_OK || streq(answers[0], "")) { + unset_automatic(); /* we are in a fallback mode */ return nfs_prepare(); + } nfsmount_location = malloc(strlen(answers[0]) + strlen(answers[1]) + 2); strcpy(nfsmount_location, answers[0]); strcat(nfsmount_location, ":"); strcat(nfsmount_location, answers[1]); - if (my_mount(nfsmount_location, IMAGE_LOCATION, "nfs") == -1) { - error_message("I can't mount the directory from the NFS server."); + if (my_mount(nfsmount_location, MEDIA_LOCATION, "nfs", 0) == -1) { + stg1_error_message("I can't mount the directory from the NFS server."); results = RETURN_BACK; continue; } + free(nfsmount_location); nfsmount_location = NULL; - if (access(IMAGE_LOCATION LIVE_LOCATION, R_OK)) { - error_message("That NFS volume does not seem to contain the " DISTRIB_NAME " Distribution."); - umount(IMAGE_LOCATION); - results = RETURN_BACK; - } + results = try_with_directory(MEDIA_LOCATION, "nfs", "nfs-iso"); + if (results != RETURN_OK) + umount(MEDIA_LOCATION); + if (results == RETURN_ERROR) + return RETURN_ERROR; } while (results == RETURN_BACK); - log_message("found the " DISTRIB_NAME " Installation, good news!"); - - if (IS_SPECIAL_STAGE2) { - if (load_ramdisk() != RETURN_OK) { - error_message("Could not load program into memory."); - return nfs_prepare(); - } - } - - if (IS_RESCUE) - umount(IMAGE_LOCATION); - - method_name = strdup("nfs"); return RETURN_OK; } @@ -663,10 +977,13 @@ enum return_type ftp_prepare(void) char * questions_auto[] = { "server", "directory", "user", "pass", NULL }; static char ** answers = NULL; enum return_type results; + struct utsname kernel_uname; + char *http_proxy_host, *http_proxy_port; + int use_http_proxy; if (!ramdisk_possible()) { - error_message("FTP install needs more than %d Mbytes of memory (detected %d Mbytes).", - MEM_LIMIT_RAMDISK, total_memory()); + stg1_error_message("FTP install needs more than %d Mbytes of memory (detected %d Mbytes). You may want to try an NFS install.", + MEM_LIMIT_DRAKX, total_memory()); return RETURN_ERROR; } @@ -675,65 +992,138 @@ enum return_type ftp_prepare(void) if (results != RETURN_OK) return results; + get_http_proxy(&http_proxy_host, &http_proxy_port); + use_http_proxy = http_proxy_host && http_proxy_port && !streq(http_proxy_host, "") && !streq(http_proxy_port, ""); + + uname(&kernel_uname); + do { char location_full[500]; - int ftp_serv_response; + int ftp_serv_response = -1; int fd, size; + int need_arch = 0; + char ftp_hostname[500]; + + if (!IS_AUTOMATIC) { + if (answers == NULL) + answers = (char **) calloc(1, sizeof(questions)); + + results = choose_mirror_from_list(http_proxy_host, http_proxy_port, "ftp", &answers[0], &answers[1]); + + if (results == RETURN_BACK) + return ftp_prepare(); + + if (use_http_proxy) { + results = ask_yes_no("Do you want to use this HTTP proxy for FTP connections too ?"); + + if (results == RETURN_BACK) + return ftp_prepare(); + + use_http_proxy = results == RETURN_OK; + } + } results = ask_from_entries_auto("Please enter the name or IP address of the FTP server, " "the directory containing the " DISTRIB_NAME " Distribution, " - "and the login/pass if necessary (leave login blank for anonymous).", + "and the login/pass if necessary (leave login blank for anonymous). ", questions, &answers, 40, questions_auto, NULL); - if (results != RETURN_OK) + if (results != RETURN_OK || streq(answers[0], "")) { + unset_automatic(); /* we are in a fallback mode */ return ftp_prepare(); - - log_message("FTP: trying to connect to %s", answers[0]); - - ftp_serv_response = ftp_open_connection(answers[0], answers[2], answers[3], ""); - if (ftp_serv_response < 0) { - log_message("FTP: error connect %d", ftp_serv_response); - if (ftp_serv_response == FTPERR_BAD_HOSTNAME) - error_message("Error: bad hostname."); - else if (ftp_serv_response == FTPERR_FAILED_CONNECT) - error_message("Error: failed to connect to remote host."); - else - error_message("Error: couldn't connect."); - results = RETURN_BACK; - continue; } - strcpy(location_full, answers[1]); - strcat(location_full, get_ramdisk_realname()); + strcpy(location_full, answers[1][0] == '/' ? "" : "/"); + strcat(location_full, answers[1]); + + if (use_http_proxy) { + log_message("FTP: don't connect to %s directly, will use proxy", answers[0]); + } else { + log_message("FTP: trying to connect to %s", answers[0]); + ftp_serv_response = ftp_open_connection(answers[0], answers[2], answers[3], ""); + if (ftp_serv_response < 0) { + log_message("FTP: error connect %d", ftp_serv_response); + if (ftp_serv_response == FTPERR_BAD_HOSTNAME) + stg1_error_message("Error: bad hostname."); + else if (ftp_serv_response == FTPERR_FAILED_CONNECT) + stg1_error_message("Error: failed to connect to remote host."); + else + stg1_error_message("Error: couldn't connect."); + results = RETURN_BACK; + continue; + } + } + + strcat(location_full, COMPRESSED_FILE_REL("/")); log_message("FTP: trying to retrieve %s", location_full); - fd = ftp_start_download(ftp_serv_response, location_full, &size); + if (use_http_proxy) { + if (strcmp(answers[2], "")) { + strcpy(ftp_hostname, answers[2]); /* user name */ + strcat(ftp_hostname, ":"); + strcat(ftp_hostname, answers[3]); /* password */ + strcat(ftp_hostname, "@"); + } else { + strcpy(ftp_hostname, ""); + } + strcat(ftp_hostname, answers[0]); + fd = http_download_file(ftp_hostname, location_full, &size, "ftp", http_proxy_host, http_proxy_port); + } else { + fd = ftp_start_download(ftp_serv_response, location_full, &size); + } + + /* Try arched directory */ if (fd < 0) { - log_message("FTP: error get %d", fd); - if (fd == FTPERR_PASSIVE_ERROR) - error_message("Error: error with passive connection."); - else if (fd == FTPERR_FILE_NOT_FOUND) - error_message("Error: file not found (%s).", location_full); - else if (fd == FTPERR_BAD_SERVER_RESPONSE) - error_message("Error: bad server response (server too busy?)."); - else - error_message("Error: couldn't retrieve Installation program."); + log_message("%s failed.", location_full); + char *with_arch = asprintf_("%s%s/%s/%s", answers[1][0] == '/' ? "" : "/", answers[1], ARCH, COMPRESSED_FILE_REL("/")); + log_message("trying %s...", with_arch); + if (use_http_proxy) + fd = http_download_file(answers[0], with_arch, &size, use_http_proxy ? "http" : NULL, http_proxy_host, http_proxy_port); + else + fd = ftp_start_download(ftp_serv_response, with_arch, &size); + if (0 < fd) { + strcpy(location_full, with_arch); + need_arch = 1; + } + } + + if (fd < 0) { + char *msg = str_ftp_error(fd); + log_message("FTP: error get %d for remote file %s", fd, location_full); + stg1_error_message("Error: %s.", msg ? msg : "couldn't retrieve Installation program"); results = RETURN_BACK; continue; } log_message("FTP: size of download %d bytes", size); - results = load_ramdisk_fd(fd, size); - if (results == RETURN_OK) - ftp_end_data_command(fd); - - method_name = strdup("ftp"); - add_to_env("HOST", answers[0]); - add_to_env("PREFIX", answers[1]); - if (strcmp(answers[2], "")) { - add_to_env("LOGIN", answers[2]); - add_to_env("PASSWORD", answers[3]); + results = load_compressed_fd(fd, size); + if (results == RETURN_OK) { + if (!use_http_proxy) + ftp_end_data_command(ftp_serv_response); + } else { + unset_automatic(); /* we are in a fallback mode */ + return results; + } + + if (use_http_proxy) { + add_to_env("METHOD", "http"); + snprintf(location_full, sizeof(location_full), "ftp://%s%s", ftp_hostname, answers[1]); + if (need_arch) + strcat(location_full, "/" ARCH); + add_to_env("URLPREFIX", location_full); + add_to_env("PROXY", http_proxy_host); + add_to_env("PROXYPORT", http_proxy_port); + } else { + add_to_env("METHOD", "ftp"); + add_to_env("HOST", answers[0]); + if (need_arch) + strcat(answers[1], "/" ARCH); + add_to_env("PREFIX", answers[1]); + if (!streq(answers[2], "")) { + add_to_env("LOGIN", answers[2]); + add_to_env("PASSWORD", answers[3]); + } } } while (results == RETURN_BACK); @@ -747,10 +1137,11 @@ enum return_type http_prepare(void) char * questions_auto[] = { "server", "directory", NULL }; static char ** answers = NULL; enum return_type results; + char *http_proxy_host, *http_proxy_port; if (!ramdisk_possible()) { - error_message("HTTP install needs more than %d Mbytes of memory (detected %d Mbytes).", - MEM_LIMIT_RAMDISK, total_memory()); + stg1_error_message("HTTP install needs more than %d Mbytes of memory (detected %d Mbytes). You may want to try an NFS install.", + MEM_LIMIT_DRAKX, total_memory()); return RETURN_ERROR; } @@ -759,42 +1150,102 @@ enum return_type http_prepare(void) if (results != RETURN_OK) return results; + get_http_proxy(&http_proxy_host, &http_proxy_port); + do { char location_full[500]; - int fd, size; + int fd, size, need_arch = 0; + int use_http_proxy; + + if (!IS_AUTOMATIC) { + if (answers == NULL) + answers = (char **) calloc(1, sizeof(questions)); + + results = choose_mirror_from_list(http_proxy_host, http_proxy_port, "http", &answers[0], &answers[1]); + + if (results == RETURN_BACK) + return http_prepare(); + } results = ask_from_entries_auto("Please enter the name or IP address of the HTTP server, " "and the directory containing the " DISTRIB_NAME " Distribution.", questions, &answers, 40, questions_auto, NULL); - if (results != RETURN_OK) + if (results != RETURN_OK || streq(answers[0], "")) { + unset_automatic(); /* we are in a fallback mode */ return http_prepare(); + } - strcpy(location_full, answers[1]); - strcat(location_full, get_ramdisk_realname()); + strcpy(location_full, answers[1][0] == '/' ? "" : "/"); + strcat(location_full, answers[1]); + strcat(location_full, COMPRESSED_FILE_REL("/")); - log_message("HTTP: trying to retrieve %s", location_full); + log_message("HTTP: trying to retrieve %s from %s", location_full, answers[0]); - fd = http_download_file(answers[0], location_full, &size); + use_http_proxy = http_proxy_host && http_proxy_port && !streq(http_proxy_host, "") && !streq(http_proxy_port, ""); + + fd = http_download_file(answers[0], location_full, &size, use_http_proxy ? "http" : NULL, http_proxy_host, http_proxy_port); + + /* Try arched directory */ + if (fd < 0) { + log_message("%s failed.", location_full); + char *with_arch = asprintf_("%s%s/%s/%s", answers[1][0] == '/' ? "" : "/", answers[1], ARCH, COMPRESSED_FILE_REL("/")); + log_message("trying %s...", with_arch); + fd = http_download_file(answers[0], with_arch, &size, use_http_proxy ? "http" : NULL, http_proxy_host, http_proxy_port); + if (0 < fd) { + strcpy(location_full, with_arch); + need_arch = 1; + } + } + if (fd < 0) { log_message("HTTP: error %d", fd); if (fd == FTPERR_FAILED_CONNECT) - error_message("Error: couldn't connect to server."); + stg1_error_message("Error: couldn't connect to server."); else - error_message("Error: couldn't get file (%s).", location_full); + stg1_error_message("Error: couldn't get file (%s).", location_full); results = RETURN_BACK; continue; } log_message("HTTP: size of download %d bytes", size); - results = load_ramdisk_fd(fd, size); + if (load_compressed_fd(fd, size) != RETURN_OK) { + unset_automatic(); /* we are in a fallback mode */ + return RETURN_ERROR; + } - method_name = strdup("http"); - sprintf(location_full, "http://%s/%s", answers[0], answers[1]); + add_to_env("METHOD", "http"); + sprintf(location_full, "http://%s%s%s", answers[0], answers[1][0] == '/' ? "" : "/", answers[1]); + if (need_arch) + strcat(location_full, "/" ARCH); add_to_env("URLPREFIX", location_full); + if (!streq(http_proxy_host, "")) + add_to_env("PROXY", http_proxy_host); + if (!streq(http_proxy_port, "")) + add_to_env("PROXYPORT", http_proxy_port); } while (results == RETURN_BACK); return RETURN_OK; } + +#ifndef DISABLE_KA +enum return_type ka_prepare(void) +{ + enum return_type results; + + if (!ramdisk_possible()) { + stg1_error_message("KA install needs more than %d Mbytes of memory (detected %d Mbytes).", + MEM_LIMIT_DRAKX, total_memory()); + return RETURN_ERROR; + } + + results = intf_select_and_up(); + + if (results != RETURN_OK) + return results; + + return perform_ka(); +} +#endif diff --git a/mdk-stage1/network.h b/mdk-stage1/network.h index b832ea906..914bc2ca5 100644 --- a/mdk-stage1/network.h +++ b/mdk-stage1/network.h @@ -1,7 +1,7 @@ /* - * Guillaume Cottenceau (gc@mandrakesoft.com) + * Guillaume Cottenceau (gc) * - * Copyright 2000 MandrakeSoft + * Copyright 2000 Mandriva * * This software may be freely redistributed under the terms of the GNU * public license. @@ -26,26 +26,33 @@ #include <netinet/ip.h> #include <arpa/inet.h> +enum return_type intf_select_and_up(); enum return_type nfs_prepare(void); enum return_type ftp_prepare(void); enum return_type http_prepare(void); +#ifndef DISABLE_KA +enum return_type ka_prepare(void); +#endif -enum boot_proto_type { BOOTPROTO_STATIC, BOOTPROTO_DHCP }; +enum boot_proto_type { BOOTPROTO_STATIC, BOOTPROTO_DHCP, BOOTPROTO_ADSL_PPPOE }; +enum auto_detection_type { AUTO_DETECTION_NONE, AUTO_DETECTION_ALL, AUTO_DETECTION_WIRED }; /* all of these in_addr things are in network byte order! */ struct interface_info { - char device[10]; - int is_ptp, is_up; - struct in_addr ip, netmask, broadcast, network; - enum boot_proto_type boot_proto; + char device[10]; + int is_ptp, is_up; + struct in_addr ip, netmask, broadcast, network; + enum boot_proto_type boot_proto; + char *user, *pass, *acname; /* for ADSL connection */ }; /* these are to be used only by dhcp.c */ char * guess_netmask(char * ip_addr); + int configure_net_device(struct interface_info * intf); extern char * hostname; diff --git a/mdk-stage1/newt-frontend.c b/mdk-stage1/newt-frontend.c index 416d05ae6..c0489b58d 100644 --- a/mdk-stage1/newt-frontend.c +++ b/mdk-stage1/newt-frontend.c @@ -1,7 +1,7 @@ /* - * Guillaume Cottenceau (gc@mandrakesoft.com) + * Guillaume Cottenceau (gc) * - * Copyright 2000 MandrakeSoft + * Copyright 2000 Mandriva * * This software may be freely redistributed under the terms of the GNU * public license. @@ -24,6 +24,7 @@ * Each different frontend must implement all functions defined in frontend.h */ +#define _GNU_SOURCE #include <stdlib.h> #include <unistd.h> @@ -31,21 +32,29 @@ #include <stdio.h> #include <stdarg.h> #include <sys/time.h> -#include "stage1.h" -#include "log.h" -#include "newt.h" +#include <newt.h> -#include "frontend.h" +#include <probing.h> +#include "frontend.h" -void init_frontend(void) +void init_frontend(char * welcome_msg) { + int i; + for (i=0; i<38; i++) printf("\n"); newtInit(); newtCls(); - - newtDrawRootText(0, 0, "Welcome to " DISTRIB_NAME " (" VERSION ") " __DATE__ " " __TIME__); - - newtPushHelpLine(" <Alt-F1> for here, <Alt-F3> to see the logs, <Alt-F4> for kernel msg"); + + if (welcome_msg[0]) { + char *msg; + int cols, rows; + newtGetScreenSize(&cols, &rows); + asprintf(&msg, " %-*s", cols - 1, welcome_msg); + newtDrawRootText(0, 0, msg); + free(msg); + newtPushHelpLine(" <Alt-F1> for here, <Alt-F3> to see the logs, <Alt-F4> for kernel msg"); + } + newtRefresh(); } @@ -55,58 +64,48 @@ void finish_frontend(void) } -void error_message(char *msg, ...) +void verror_message(char *msg, va_list ap) { - va_list args; - va_start(args, msg); - va_end(args); - newtWinMessagev("Error", "Ok", msg, args); - unset_param(MODE_AUTOMATIC); + newtWinMessagev("Error", "Ok", msg, ap); } -void info_message(char *msg, ...) +void vinfo_message(char *msg, va_list ap) { - va_list args; - va_start(args, msg); - va_end(args); - if (!IS_AUTOMATIC) - newtWinMessagev("Notice", "Ok", msg, args); - else - vlog_message(msg, args); + newtWinMessagev("Notice", "Ok", msg, ap); } -void wait_message(char *msg, ...) +void vwait_message(char *msg, va_list ap) { - int width = 8; - int height = 3; + int width, height; char * title = "Please wait..."; newtComponent c, f; + newtGrid grid; char * buf = NULL; + char * flowed; int size = 0; int i = 0; - va_list args; - - va_start(args, msg); do { size += 1000; if (buf) free(buf); buf = malloc(size); - i = vsnprintf(buf, size, msg, args); - width += i; - } while (i == size); - - va_end(args); + i = vsnprintf(buf, size, msg, ap); + } while (i >= size || i == -1); + + flowed = newtReflowText(buf, 60, 5, 5, &width, &height); - newtCenteredWindow(width, height, title); + c = newtTextbox(-1, -1, width, height, NEWT_TEXTBOX_WRAP); + newtTextboxSetText(c, flowed); - c = newtTextbox(1, 1, width - 2, height - 2, NEWT_TEXTBOX_WRAP); - newtTextboxSetText(c, buf); - f = newtForm(NULL, NULL, 0); + grid = newtCreateGrid(1, 1); + newtGridSetField(grid, 0, 0, NEWT_GRID_COMPONENT, c, 0, 0, 0, 0, 0, 0); + newtGridWrappedWindow(grid, title); + free(flowed); free(buf); + f = newtForm(NULL, NULL, 0); newtFormAddComponent(f, c); newtDrawForm(f); @@ -125,7 +124,7 @@ static int size_progress; static int actually_drawn; static char * msg_progress; -void init_progression(char *msg, int size) +void init_progression_raw(char *msg, int size) { size_progress = size; if (size) { @@ -144,7 +143,7 @@ void init_progression(char *msg, int size) } } -void update_progression(int current_size) +void update_progression_raw(int current_size) { if (size_progress) { if (current_size <= size_progress) @@ -167,7 +166,7 @@ void update_progression(int current_size) } } -void end_progression(void) +void end_progression_raw(void) { if (size_progress) { newtPopWindow(); @@ -178,52 +177,39 @@ void end_progression(void) } -enum return_type ask_from_list_comments(char *msg, char ** elems, char ** elems_comments, char ** choice) +enum return_type ask_from_list_index(char *msg, char ** elems, char ** elems_comments, int * answer) { - char * items[50]; - int answer = 0, rc; - char ** sav_elems = elems; - int i; + char * items[50000]; + int rc; - i = 0; - while (elems && *elems) { - items[i] = malloc(sizeof(char) * (strlen(*elems) + strlen(*elems_comments) + 4)); - strcpy(items[i], *elems); - strcat(items[i], " ("); - strcat(items[i], *elems_comments); - strcat(items[i], ")"); - i++; - elems++; - elems_comments++; + if (elems_comments) { + int i; + + i = 0; + while (elems && *elems) { + int j = (*elems_comments) ? strlen(*elems_comments) : 0; + items[i] = malloc(sizeof(char) * (strlen(*elems) + j + 4)); + strcpy(items[i], *elems); + if (*elems_comments) { + strcat(items[i], " ("); + strcat(items[i], *elems_comments); + strcat(items[i], ")"); + } + elems_comments++; + i++; + elems++; + } + items[i] = NULL; } - items[i] = NULL; - rc = newtWinMenu("Please choose...", msg, 52, 5, 5, 7, items, &answer, "Ok", "Cancel", NULL); + rc = newtWinMenu("Please choose...", msg, 52, 5, 5, 7, elems_comments ? items : elems, answer, "Ok", "Cancel", NULL); if (rc == 2) return RETURN_BACK; - *choice = strdup(sav_elems[answer]); - return RETURN_OK; } - -enum return_type ask_from_list(char *msg, char ** elems, char ** choice) -{ - int answer = 0, rc; - - rc = newtWinMenu("Please choose...", msg, 52, 5, 5, 7, elems, &answer, "Ok", "Cancel", NULL); - - if (rc == 2) - return RETURN_BACK; - - *choice = strdup(elems[answer]); - - return RETURN_OK; -} - - enum return_type ask_yes_no(char *msg) { int rc; @@ -240,7 +226,7 @@ enum return_type ask_yes_no(char *msg) static void (*callback_real_function)(char ** strings) = NULL; -static void default_callback(newtComponent co, void * data) +static void default_callback(newtComponent co __attribute__ ((unused)), void * data) { newtComponent * entries = data; char * strings[50], ** ptr; @@ -313,7 +299,7 @@ static int mynewtWinEntries(char * title, char * text, int suggestedWidth, int f for (i = 0; i < numItems; i++) { newtComponent entr = newtEntry(-1, -1, items[i].value ? *items[i].value : NULL, dataWidth, - items[i].value, items[i].flags); + (const char**)items[i].value, items[i].flags); newtGridSetField(subgrid, 0, i, NEWT_GRID_COMPONENT, newtLabel(-1, -1, items[i].text), @@ -367,7 +353,7 @@ enum return_type ask_from_entries(char *msg, char ** questions, char *** answers while (questions && *questions) { entries[i].text = *questions; - entries[i].flags = NEWT_FLAG_SCROLL; + entries[i].flags = NEWT_FLAG_SCROLL | (!strcmp(*questions, "Password") ? NEWT_FLAG_PASSWORD : 0); i++; questions++; } @@ -375,7 +361,7 @@ enum return_type ask_from_entries(char *msg, char ** questions, char *** answers entries[i].value = NULL; if (*answers == NULL) - *answers = (char **) malloc(sizeof(char *) * i); + *answers = (char **) calloc(1, sizeof(char *) * i); else already_answers = *answers; @@ -388,7 +374,7 @@ enum return_type ask_from_entries(char *msg, char ** questions, char *** answers *(entries[j].value) = NULL; } - rc = mynewtWinEntries("Please fill entries...", msg, 52, 5, 5, entry_size, callback_func, entries, "Ok", "Cancel", NULL); + rc = mynewtWinEntries("Please fill in entries...", msg, 52, 5, 5, entry_size, callback_func, entries, "Ok", "Cancel", NULL); if (rc == 3) return RETURN_BACK; @@ -397,3 +383,7 @@ enum return_type ask_from_entries(char *msg, char ** questions, char *** answers return RETURN_OK; } + + +void suspend_to_console(void) { newtSuspend(); } +void resume_from_suspend(void) { newtResume(); } diff --git a/mdk-stage1/nfsmount.c b/mdk-stage1/nfsmount.c deleted file mode 100644 index 77fbb530e..000000000 --- a/mdk-stage1/nfsmount.c +++ /dev/null @@ -1,297 +0,0 @@ -/* - * Guillaume Cottenceau (gc@mandrakesoft.com) - * - * Copyright 2000 MandrakeSoft - * - * This software may be freely redistributed under the terms of the GNU - * public license. - * - * 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. - * - */ - -/* this is based on work from redhat, made it lighter (gc) - */ - - -/* MODIFIED for Red Hat Linux installer - * msw@redhat.com - * o always mounts without lockd - * o uses our own host resolution - */ - -/* - * nfsmount.c -- Linux NFS mount - * Copyright (C) 1993 Rick Sladkey <jrs@world.std.com> - * - * 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. - * - * Wed Feb 8 12:51:48 1995, biro@yggdrasil.com (Ross Biro): allow all port - * numbers to be specified on the command line. - * - * Fri, 8 Mar 1996 18:01:39, Swen Thuemmler <swen@uni-paderborn.de>: - * Omit the call to connect() for Linux version 1.3.11 or later. - * - * Wed Oct 1 23:55:28 1997: Dick Streefland <dick_streefland@tasking.com> - * Implemented the "bg", "fg" and "retry" mount options for NFS. - */ - -/* - * nfsmount.c,v 1.1.1.1 1993/11/18 08:40:51 jrs Exp - */ - -#include <unistd.h> -#include <stdio.h> -#include <string.h> -#include <errno.h> -#include <netdb.h> -#include <sys/mount.h> -#include <rpc/rpc.h> -#include <rpc/pmap_prot.h> -#include <rpc/pmap_clnt.h> -#include <sys/socket.h> -#include <sys/time.h> -#include <sys/utsname.h> -#include <sys/stat.h> -#include <arpa/inet.h> -#include "linux-2.2/nfs.h" -#include "linux-2.2/nfs_mount.h" //#include "mount_constants.h" - - -#include "dns.h" -#include "log.h" - -#include "nfsmount.h" - - -bool_t -xdr_fhandle(XDR *xdrs, fhandle objp) -{ - if (!xdr_opaque(xdrs, objp, FHSIZE)) { - return (FALSE); - } - return (TRUE); -} - -bool_t -xdr_fhstatus(XDR *xdrs, fhstatus *objp) -{ - - if (!xdr_u_int(xdrs, &objp->fhs_status)) { - return (FALSE); - } - switch (objp->fhs_status) { - case 0: - if (!xdr_fhandle(xdrs, objp->fhstatus_u.fhs_fhandle)) { - return (FALSE); - } - break; - default: - break; - } - return (TRUE); -} - -bool_t -xdr_dirpath(XDR *xdrs, dirpath *objp) -{ - - if (!xdr_string(xdrs, objp, MNTPATHLEN)) { - return (FALSE); - } - return (TRUE); -} - - -static int nfs_mount_version = 3; /* kernel >= 2.1.32 */ /* *********** TODO for kernel 2.4, nfs-mount version 4 */ - - -int nfsmount_prepare(const char *spec, int *flags, char **mount_opts) -{ - char hostdir[1024]; - CLIENT *mclient; - char *hostname, *dirname; - fhandle root_fhandle; - struct timeval total_timeout; - enum clnt_stat clnt_stat; - static struct nfs_mount_data data; - struct sockaddr_in server_addr; - struct sockaddr_in mount_server_addr; - int msock, fsock; - struct timeval retry_timeout; - struct fhstatus status; - char *s; - int port; - - msock = fsock = -1; - mclient = NULL; - - strncpy(hostdir, spec, sizeof(hostdir)); - if ((s = (strchr(hostdir, ':')))) { - hostname = hostdir; - dirname = s + 1; - *s = '\0'; - } else { - log_message("nfsmount: format not host:dir"); - goto fail; - } - - server_addr.sin_family = AF_INET; - - /* first, try as IP address */ - if (!inet_aton(hostname, &server_addr.sin_addr)) { - /* failure, try as machine name */ - if (mygethostbyname(hostname, &server_addr.sin_addr)) { - log_message("nfsmount: can't get address for %s", hostname); - goto fail; - } else - server_addr.sin_family = AF_INET; - } - - memcpy (&mount_server_addr, &server_addr, sizeof (mount_server_addr)); - - - - /* Set default options. - * rsize/wsize (and bsize, for ver >= 3) are left 0 in order to - * let the kernel decide. - * timeo is filled in after we know whether it'll be TCP or UDP. */ - memset(&data, 0, sizeof(data)); - data.retrans = 3; - data.acregmin = 3; - data.acregmax = 60; - data.acdirmin = 30; - data.acdirmax = 60; -#if NFS_MOUNT_VERSION >= 2 - data.namlen = NAME_MAX; -#endif - -#if NFS_MOUNT_VERSION >= 3 - if (nfs_mount_version >= 3) - data.flags |= NFS_MOUNT_NONLM; /* HACK HACK msw */ -#endif - - /* Adjust options if none specified */ - if (!data.timeo) - data.timeo = 7; /* udp */ - - - data.version = nfs_mount_version; - *mount_opts = (char *) &data; - - if (*flags & MS_REMOUNT) - return 0; - - - retry_timeout.tv_sec = 3; - retry_timeout.tv_usec = 0; - total_timeout.tv_sec = 20; - total_timeout.tv_usec = 0; - - - /* contact the mount daemon via TCP */ - mount_server_addr.sin_port = htons(0); - msock = RPC_ANYSOCK; - mclient = clnttcp_create(&mount_server_addr, MOUNTPROG, MOUNTVERS, &msock, 0, 0); - - /* if this fails, contact the mount daemon via UDP */ - if (!mclient) { - mount_server_addr.sin_port = htons(0); - msock = RPC_ANYSOCK; - mclient = clntudp_create(&mount_server_addr, MOUNTPROG, MOUNTVERS, retry_timeout, &msock); - } - if (mclient) { - /* try to mount hostname:dirname */ - mclient->cl_auth = authunix_create_default(); - clnt_stat = clnt_call(mclient, MOUNTPROC_MNT, - (xdrproc_t) xdr_dirpath, (caddr_t) &dirname, - (xdrproc_t) xdr_fhstatus, (caddr_t) &status, - total_timeout); - if (clnt_stat != RPC_SUCCESS) { - if (errno != ECONNREFUSED) { - log_message(clnt_sperror(mclient, "mount")); - goto fail; /* don't retry */ - } - log_message(clnt_sperror(mclient, "mount")); - auth_destroy(mclient->cl_auth); - clnt_destroy(mclient); - mclient = 0; - close(msock); - } - } else - goto fail; - - if (status.fhs_status != 0) { - if (status.fhs_status == 2) - log_message("NFS server says: No such file or directory"); - else if (status.fhs_status == 13) - log_message("NFS server says: Permission denied"); - else - log_message("nfsmount prepare failed, reason given by server: %d", status.fhs_status); - goto fail; - } - - memcpy((char *) &root_fhandle, (char *) status.fhstatus_u.fhs_fhandle, sizeof (root_fhandle)); - - /* create nfs socket for kernel */ - - fsock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); - if (fsock < 0) { - log_perror("nfs socket"); - goto fail; - } - if (bindresvport(fsock, 0) < 0) { - log_perror("nfs bindresvport"); - goto fail; - } - server_addr.sin_port = PMAPPORT; - port = pmap_getport(&server_addr, NFS_PROGRAM, NFS_VERSION, IPPROTO_UDP); - if (port == 0) - port = NFS_PORT; -#ifdef NFS_MOUNT_DEBUG - else - log_message("used portmapper to find NFS port\n"); - log_message("using port %d for nfs deamon\n", port); -#endif - server_addr.sin_port = htons(port); - - /* prepare data structure for kernel */ - - data.fd = fsock; - memcpy((char *) &data.root, (char *) &root_fhandle, sizeof (root_fhandle)); - memcpy((char *) &data.addr, (char *) &server_addr, sizeof(data.addr)); - strncpy(data.hostname, hostname, sizeof(data.hostname)); - - /* clean up */ - - auth_destroy(mclient->cl_auth); - clnt_destroy(mclient); - close(msock); - return 0; - - /* abort */ - - fail: - if (msock != -1) { - if (mclient) { - auth_destroy(mclient->cl_auth); - clnt_destroy(mclient); - } - close(msock); - } - if (fsock != -1) - close(fsock); - - return -1; -} - diff --git a/mdk-stage1/nfsmount.h b/mdk-stage1/nfsmount.h deleted file mode 100644 index 12ffa69a6..000000000 --- a/mdk-stage1/nfsmount.h +++ /dev/null @@ -1,328 +0,0 @@ -/* - * Please do not edit this file. - * It was generated using rpcgen. - */ - -#ifndef _NFSMOUNT_H_RPCGEN -#define _NFSMOUNT_H_RPCGEN - -#include <rpc/rpc.h> - -int nfsmount_prepare(const char *spec, int *flags, char **mount_opts); - - -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user or with the express written consent of - * Sun Microsystems, Inc. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ -/* - * Copyright (c) 1985, 1990 by Sun Microsystems, Inc. - */ - -/* from @(#)mount.x 1.3 91/03/11 TIRPC 1.0 */ -#ifndef _rpcsvc_mount_h -#define _rpcsvc_mount_h -#define MNTPATHLEN 1024 -#define MNTNAMLEN 255 -#define FHSIZE 32 - -typedef char fhandle[FHSIZE]; -#ifdef __cplusplus -extern "C" bool_t xdr_fhandle(XDR *, fhandle); -#elif __STDC__ -extern bool_t xdr_fhandle(XDR *, fhandle); -#else /* Old Style C */ -bool_t xdr_fhandle(); -#endif /* Old Style C */ - - -struct fhstatus { - u_int fhs_status; - union { - fhandle fhs_fhandle; - } fhstatus_u; -}; -typedef struct fhstatus fhstatus; -#ifdef __cplusplus -extern "C" bool_t xdr_fhstatus(XDR *, fhstatus*); -#elif __STDC__ -extern bool_t xdr_fhstatus(XDR *, fhstatus*); -#else /* Old Style C */ -bool_t xdr_fhstatus(); -#endif /* Old Style C */ - - -typedef char *dirpath; -#ifdef __cplusplus -extern "C" bool_t xdr_dirpath(XDR *, dirpath*); -#elif __STDC__ -extern bool_t xdr_dirpath(XDR *, dirpath*); -#else /* Old Style C */ -bool_t xdr_dirpath(); -#endif /* Old Style C */ - - -typedef char *name; -#ifdef __cplusplus -extern "C" bool_t xdr_name(XDR *, name*); -#elif __STDC__ -extern bool_t xdr_name(XDR *, name*); -#else /* Old Style C */ -bool_t xdr_name(); -#endif /* Old Style C */ - - -typedef struct mountbody *mountlist; -#ifdef __cplusplus -extern "C" bool_t xdr_mountlist(XDR *, mountlist*); -#elif __STDC__ -extern bool_t xdr_mountlist(XDR *, mountlist*); -#else /* Old Style C */ -bool_t xdr_mountlist(); -#endif /* Old Style C */ - - -struct mountbody { - name ml_hostname; - dirpath ml_directory; - mountlist ml_next; -}; -typedef struct mountbody mountbody; -#ifdef __cplusplus -extern "C" bool_t xdr_mountbody(XDR *, mountbody*); -#elif __STDC__ -extern bool_t xdr_mountbody(XDR *, mountbody*); -#else /* Old Style C */ -bool_t xdr_mountbody(); -#endif /* Old Style C */ - - -typedef struct groupnode *groups; -#ifdef __cplusplus -extern "C" bool_t xdr_groups(XDR *, groups*); -#elif __STDC__ -extern bool_t xdr_groups(XDR *, groups*); -#else /* Old Style C */ -bool_t xdr_groups(); -#endif /* Old Style C */ - - -struct groupnode { - name gr_name; - groups gr_next; -}; -typedef struct groupnode groupnode; -#ifdef __cplusplus -extern "C" bool_t xdr_groupnode(XDR *, groupnode*); -#elif __STDC__ -extern bool_t xdr_groupnode(XDR *, groupnode*); -#else /* Old Style C */ -bool_t xdr_groupnode(); -#endif /* Old Style C */ - - -typedef struct exportnode *exports; -#ifdef __cplusplus -extern "C" bool_t xdr_exports(XDR *, exports*); -#elif __STDC__ -extern bool_t xdr_exports(XDR *, exports*); -#else /* Old Style C */ -bool_t xdr_exports(); -#endif /* Old Style C */ - - -struct exportnode { - dirpath ex_dir; - groups ex_groups; - exports ex_next; -}; -typedef struct exportnode exportnode; -#ifdef __cplusplus -extern "C" bool_t xdr_exportnode(XDR *, exportnode*); -#elif __STDC__ -extern bool_t xdr_exportnode(XDR *, exportnode*); -#else /* Old Style C */ -bool_t xdr_exportnode(); -#endif /* Old Style C */ - - -struct ppathcnf { - int pc_link_max; - short pc_max_canon; - short pc_max_input; - short pc_name_max; - short pc_path_max; - short pc_pipe_buf; - u_char pc_vdisable; - char pc_xxx; - short pc_mask[2]; -}; -typedef struct ppathcnf ppathcnf; -#ifdef __cplusplus -extern "C" bool_t xdr_ppathcnf(XDR *, ppathcnf*); -#elif __STDC__ -extern bool_t xdr_ppathcnf(XDR *, ppathcnf*); -#else /* Old Style C */ -bool_t xdr_ppathcnf(); -#endif /* Old Style C */ - -#endif /*!_rpcsvc_mount_h*/ - -#define MOUNTPROG ((u_long)100005) -#define MOUNTVERS ((u_long)1) - -#ifdef __cplusplus -#define MOUNTPROC_NULL ((u_long)0) -extern "C" void * mountproc_null_1(void *, CLIENT *); -extern "C" void * mountproc_null_1_svc(void *, struct svc_req *); -#define MOUNTPROC_MNT ((u_long)1) -extern "C" fhstatus * mountproc_mnt_1(dirpath *, CLIENT *); -extern "C" fhstatus * mountproc_mnt_1_svc(dirpath *, struct svc_req *); -#define MOUNTPROC_DUMP ((u_long)2) -extern "C" mountlist * mountproc_dump_1(void *, CLIENT *); -extern "C" mountlist * mountproc_dump_1_svc(void *, struct svc_req *); -#define MOUNTPROC_UMNT ((u_long)3) -extern "C" void * mountproc_umnt_1(dirpath *, CLIENT *); -extern "C" void * mountproc_umnt_1_svc(dirpath *, struct svc_req *); -#define MOUNTPROC_UMNTALL ((u_long)4) -extern "C" void * mountproc_umntall_1(void *, CLIENT *); -extern "C" void * mountproc_umntall_1_svc(void *, struct svc_req *); -#define MOUNTPROC_EXPORT ((u_long)5) -extern "C" exports * mountproc_export_1(void *, CLIENT *); -extern "C" exports * mountproc_export_1_svc(void *, struct svc_req *); -#define MOUNTPROC_EXPORTALL ((u_long)6) -extern "C" exports * mountproc_exportall_1(void *, CLIENT *); -extern "C" exports * mountproc_exportall_1_svc(void *, struct svc_req *); - -#elif __STDC__ -#define MOUNTPROC_NULL ((u_long)0) -extern void * mountproc_null_1(void *, CLIENT *); -extern void * mountproc_null_1_svc(void *, struct svc_req *); -#define MOUNTPROC_MNT ((u_long)1) -extern fhstatus * mountproc_mnt_1(dirpath *, CLIENT *); -extern fhstatus * mountproc_mnt_1_svc(dirpath *, struct svc_req *); -#define MOUNTPROC_DUMP ((u_long)2) -extern mountlist * mountproc_dump_1(void *, CLIENT *); -extern mountlist * mountproc_dump_1_svc(void *, struct svc_req *); -#define MOUNTPROC_UMNT ((u_long)3) -extern void * mountproc_umnt_1(dirpath *, CLIENT *); -extern void * mountproc_umnt_1_svc(dirpath *, struct svc_req *); -#define MOUNTPROC_UMNTALL ((u_long)4) -extern void * mountproc_umntall_1(void *, CLIENT *); -extern void * mountproc_umntall_1_svc(void *, struct svc_req *); -#define MOUNTPROC_EXPORT ((u_long)5) -extern exports * mountproc_export_1(void *, CLIENT *); -extern exports * mountproc_export_1_svc(void *, struct svc_req *); -#define MOUNTPROC_EXPORTALL ((u_long)6) -extern exports * mountproc_exportall_1(void *, CLIENT *); -extern exports * mountproc_exportall_1_svc(void *, struct svc_req *); - -#else /* Old Style C */ -#define MOUNTPROC_NULL ((u_long)0) -extern void * mountproc_null_1(); -extern void * mountproc_null_1_svc(); -#define MOUNTPROC_MNT ((u_long)1) -extern fhstatus * mountproc_mnt_1(); -extern fhstatus * mountproc_mnt_1_svc(); -#define MOUNTPROC_DUMP ((u_long)2) -extern mountlist * mountproc_dump_1(); -extern mountlist * mountproc_dump_1_svc(); -#define MOUNTPROC_UMNT ((u_long)3) -extern void * mountproc_umnt_1(); -extern void * mountproc_umnt_1_svc(); -#define MOUNTPROC_UMNTALL ((u_long)4) -extern void * mountproc_umntall_1(); -extern void * mountproc_umntall_1_svc(); -#define MOUNTPROC_EXPORT ((u_long)5) -extern exports * mountproc_export_1(); -extern exports * mountproc_export_1_svc(); -#define MOUNTPROC_EXPORTALL ((u_long)6) -extern exports * mountproc_exportall_1(); -extern exports * mountproc_exportall_1_svc(); -#endif /* Old Style C */ -#define MOUNTVERS_POSIX ((u_long)2) - -#ifdef __cplusplus -extern "C" void * mountproc_null_2(void *, CLIENT *); -extern "C" void * mountproc_null_2_svc(void *, struct svc_req *); -extern "C" fhstatus * mountproc_mnt_2(dirpath *, CLIENT *); -extern "C" fhstatus * mountproc_mnt_2_svc(dirpath *, struct svc_req *); -extern "C" mountlist * mountproc_dump_2(void *, CLIENT *); -extern "C" mountlist * mountproc_dump_2_svc(void *, struct svc_req *); -extern "C" void * mountproc_umnt_2(dirpath *, CLIENT *); -extern "C" void * mountproc_umnt_2_svc(dirpath *, struct svc_req *); -extern "C" void * mountproc_umntall_2(void *, CLIENT *); -extern "C" void * mountproc_umntall_2_svc(void *, struct svc_req *); -extern "C" exports * mountproc_export_2(void *, CLIENT *); -extern "C" exports * mountproc_export_2_svc(void *, struct svc_req *); -extern "C" exports * mountproc_exportall_2(void *, CLIENT *); -extern "C" exports * mountproc_exportall_2_svc(void *, struct svc_req *); -#define MOUNTPROC_PATHCONF ((u_long)7) -extern "C" ppathcnf * mountproc_pathconf_2(dirpath *, CLIENT *); -extern "C" ppathcnf * mountproc_pathconf_2_svc(dirpath *, struct svc_req *); - -#elif __STDC__ -extern void * mountproc_null_2(void *, CLIENT *); -extern void * mountproc_null_2_svc(void *, struct svc_req *); -extern fhstatus * mountproc_mnt_2(dirpath *, CLIENT *); -extern fhstatus * mountproc_mnt_2_svc(dirpath *, struct svc_req *); -extern mountlist * mountproc_dump_2(void *, CLIENT *); -extern mountlist * mountproc_dump_2_svc(void *, struct svc_req *); -extern void * mountproc_umnt_2(dirpath *, CLIENT *); -extern void * mountproc_umnt_2_svc(dirpath *, struct svc_req *); -extern void * mountproc_umntall_2(void *, CLIENT *); -extern void * mountproc_umntall_2_svc(void *, struct svc_req *); -extern exports * mountproc_export_2(void *, CLIENT *); -extern exports * mountproc_export_2_svc(void *, struct svc_req *); -extern exports * mountproc_exportall_2(void *, CLIENT *); -extern exports * mountproc_exportall_2_svc(void *, struct svc_req *); -#define MOUNTPROC_PATHCONF ((u_long)7) -extern ppathcnf * mountproc_pathconf_2(dirpath *, CLIENT *); -extern ppathcnf * mountproc_pathconf_2_svc(dirpath *, struct svc_req *); - -#else /* Old Style C */ -extern void * mountproc_null_2(); -extern void * mountproc_null_2_svc(); -extern fhstatus * mountproc_mnt_2(); -extern fhstatus * mountproc_mnt_2_svc(); -extern mountlist * mountproc_dump_2(); -extern mountlist * mountproc_dump_2_svc(); -extern void * mountproc_umnt_2(); -extern void * mountproc_umnt_2_svc(); -extern void * mountproc_umntall_2(); -extern void * mountproc_umntall_2_svc(); -extern exports * mountproc_export_2(); -extern exports * mountproc_export_2_svc(); -extern exports * mountproc_exportall_2(); -extern exports * mountproc_exportall_2_svc(); -#define MOUNTPROC_PATHCONF ((u_long)7) -extern ppathcnf * mountproc_pathconf_2(); -extern ppathcnf * mountproc_pathconf_2_svc(); -#endif /* Old Style C */ - -#endif /* !_NFSMOUNT_H_RPCGEN */ diff --git a/mdk-stage1/params.c b/mdk-stage1/params.c new file mode 100644 index 000000000..9398759ab --- /dev/null +++ b/mdk-stage1/params.c @@ -0,0 +1,175 @@ +/* + * Guillaume Cottenceau (gc) + * + * Copyright 2000 Mandriva + * + * This software may be freely redistributed under the terms of the GNU + * public license. + * + * 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 <string.h> +#include <unistd.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include "params.h" +#include "utils.h" +#include "automatic.h" +#include "log.h" + +static struct param_elem params[50]; +static int param_number = 0; + +void process_cmdline(void) +{ + char buf[512]; + int size, i; + int fd = -1; + + if (IS_TESTING) { + log_message("TESTING: opening cmdline... "); + + if ((fd = open("cmdline", O_RDONLY)) == -1) + log_message("TESTING: could not open cmdline"); + } + + if (fd == -1) { + log_message("opening /proc/cmdline... "); + + if ((fd = open("/proc/cmdline", O_RDONLY)) == -1) + fatal_error("could not open /proc/cmdline"); + } + + size = read(fd, buf, sizeof(buf)); + buf[size-1] = '\0'; // -1 to eat the \n + close(fd); + + log_message("\t%s", buf); + + i = 0; + while (buf[i] != '\0') { + char *name, *value = NULL; + int j = i; + while (buf[i] != ' ' && buf[i] != '=' && buf[i] != '\0') + i++; + if (i == j) { + i++; + continue; + } + name = _memdup(&buf[j], i-j + 1); + name[i-j] = '\0'; + + if (buf[i] == '=') { + int k = i+1; + i++; + while (buf[i] != ' ' && buf[i] != '\0') + i++; + value = _memdup(&buf[k], i-k + 1); + value[i-k] = '\0'; + } + + params[param_number].name = name; + params[param_number].value = value; + param_number++; + if (!strcmp(name, "changedisk")) set_param(MODE_CHANGEDISK); + if (!strcmp(name, "updatemodules") || + !strcmp(name, "thirdparty")) set_param(MODE_THIRDPARTY); + if (!strcmp(name, "rescue") || + !strcmp(name, "kamethod")) set_param(MODE_RESCUE); + if (!strcmp(name, "rescue")) set_param(MODE_RESCUE); + if (!strcmp(name, "keepmounted")) set_param(MODE_KEEP_MOUNTED); + if (!strcmp(name, "noauto")) set_param(MODE_NOAUTO); + if (!strcmp(name, "netauto")) set_param(MODE_NETAUTO); + if (!strcmp(name, "debugstage1")) set_param(MODE_DEBUGSTAGE1); + if (!strcmp(name, "automatic")) { + set_param(MODE_AUTOMATIC); + grab_automatic_params(value); + } + if (buf[i] == '\0') + break; + i++; + } + + if (IS_AUTOMATIC && strcmp(get_auto_value("thirdparty"), "")) { + set_param(MODE_THIRDPARTY); + } + + log_message("\tgot %d args", param_number); +} + + +int stage1_mode = 0; + +int get_param(int i) +{ +#ifdef SPAWN_INTERACTIVE + static int fd = 0; + char buf[5000]; + char * ptr; + int nb; + + if (fd <= 0) { + fd = open(interactive_fifo, O_RDONLY); + if (fd == -1) + return (stage1_mode & i); + fcntl(fd, F_SETFL, O_NONBLOCK); + } + + if (fd > 0) { + if ((nb = read(fd, buf, sizeof(buf))) > 0) { + buf[nb] = '\0'; + ptr = buf; + while ((ptr = strstr(ptr, "+ "))) { + if (!strncmp(ptr+2, "rescue", 6)) set_param(MODE_RESCUE); + ptr++; + } + ptr = buf; + while ((ptr = strstr(ptr, "- "))) { + if (!strncmp(ptr+2, "rescue", 6)) unset_param(MODE_RESCUE); + ptr++; + } + } + } +#endif + + return (stage1_mode & i); +} + +char * get_param_valued(char *param_name) +{ + int i; + for (i = 0; i < param_number ; i++) + if (!strcmp(params[i].name, param_name)) + return params[i].value; + + return NULL; +} + +void set_param_valued(char *param_name, char *param_value) +{ + params[param_number].name = param_name; + params[param_number].value = param_value; + param_number++; +} + +void set_param(int i) +{ + stage1_mode |= i; +} + +void unset_param(int i) +{ + stage1_mode &= ~i; +} + +void unset_automatic(void) +{ + log_message("unsetting automatic"); + unset_param(MODE_AUTOMATIC); +} diff --git a/mdk-stage1/params.h b/mdk-stage1/params.h new file mode 100644 index 000000000..06b64bd52 --- /dev/null +++ b/mdk-stage1/params.h @@ -0,0 +1,31 @@ +/* + * Guillaume Cottenceau (gc) + * + * Copyright 2000 Mandriva + * + * This software may be freely redistributed under the terms of the GNU + * public license. + * + * 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. + * + */ + +#ifndef _PARAMS_H_ +#define _PARAMS_H_ + +void process_cmdline(void); +int get_param(int i); +char * get_param_valued(char *param_name); +void set_param(int i); +void unset_param(int i); +void unset_automatic(void); + +struct param_elem +{ + char * name; + char * value; +}; + +#endif diff --git a/mdk-stage1/partition.c b/mdk-stage1/partition.c new file mode 100644 index 000000000..cb59f0514 --- /dev/null +++ b/mdk-stage1/partition.c @@ -0,0 +1,170 @@ +/* + * Guillaume Cottenceau (gc) + * + * Copyright 2000 Mandriva + * + * This software may be freely redistributed under the terms of the GNU + * public license. + * + * 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. + * + */ + +/* + * Portions from Erik Troan (ewt@redhat.com) + * + * Copyright 1996 Red Hat Software + * + */ + +#include <stdlib.h> +#include <unistd.h> +#include <stdio.h> +#include <string.h> +#include <sys/mount.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <string.h> +#include <libgen.h> +#include "stage1.h" +#include "frontend.h" +#include "modules.h" +#include "probing.h" +#include "log.h" +#include "mount.h" +#include "automatic.h" + +#include "disk.h" +#include "partition.h" + +struct partition_detection_anchor { + off_t offset; + const char * anchor; +}; + +static int seek_and_compare(int fd, struct partition_detection_anchor anch) +{ + char buf[500]; + size_t count; + if (lseek(fd, anch.offset, SEEK_SET) == (off_t)-1) { + log_perror("seek failed"); + return -1; + } + count = read(fd, buf, strlen(anch.anchor)); + if (count != strlen(anch.anchor)) { + log_perror("read failed"); + return -1; + } + buf[count] = '\0'; + if (strcmp(anch.anchor, buf)) + return 1; + return 0; +} + +static const char * detect_partition_type(char * dev) +{ + struct partition_detection_info { + const char * name; + struct partition_detection_anchor anchor0; + struct partition_detection_anchor anchor1; + struct partition_detection_anchor anchor2; + }; + struct partition_detection_info partitions_signatures[] = { + { "Linux Swap", { 4086, "SWAP-SPACE" }, { 0, NULL }, { 0, NULL } }, + { "Linux Swap", { 4086, "SWAPSPACE2" }, { 0, NULL }, { 0, NULL } }, + { "Ext4", { 0x438, "\x53\xEF" }, { 0, NULL }, { 0, NULL } }, + { "ReiserFS", { 0x10034, "ReIsErFs" }, { 0, NULL }, { 0, NULL } }, + { "ReiserFS", { 0x10034, "ReIsEr2Fs" }, { 0, NULL }, { 0, NULL } }, + { "XFS", { 0, "XFSB" }, { 0x200, "XAGF" }, { 0x400, "XAGI" } }, + { "JFS", { 0x8000, "JFS1" }, { 0, NULL }, { 0, NULL } }, + { "NTFS", { 0x1FE, "\x55\xAA" }, { 0x3, "NTFS" }, { 0, NULL } }, + { "FAT32", { 0x1FE, "\x55\xAA" }, { 0x52, "FAT32" }, { 0, NULL } }, + { "FAT", { 0x1FE, "\x55\xAA" }, { 0x36, "FAT" }, { 0, NULL } }, + { "Linux LVM", { 0, "HM\1\0" }, { 0, NULL }, { 0, NULL } } + }; + int partitions_signatures_nb = sizeof(partitions_signatures) / sizeof(struct partition_detection_info); + int i; + int fd; + const char *part_type = NULL; + + char device_fullname[50]; + strcpy(device_fullname, "/dev/"); + strcat(device_fullname, dev); + + if (ensure_dev_exists(device_fullname)) + return NULL; + log_message("guessing type of %s", device_fullname); + + if ((fd = open(device_fullname, O_RDONLY, 0)) < 0) { + log_perror("open"); + return NULL; + } + + for (i=0; i<partitions_signatures_nb; i++) { + int results = seek_and_compare(fd, partitions_signatures[i].anchor0); + if (results == -1) + goto detect_partition_type_end; + if (results == 1) + continue; + if (!partitions_signatures[i].anchor1.anchor) + goto detect_partition_found_it; + + results = seek_and_compare(fd, partitions_signatures[i].anchor1); + if (results == -1) + goto detect_partition_type_end; + if (results == 1) + continue; + if (!partitions_signatures[i].anchor2.anchor) + goto detect_partition_found_it; + + results = seek_and_compare(fd, partitions_signatures[i].anchor2); + if (results == -1) + goto detect_partition_type_end; + if (results == 1) + continue; + + detect_partition_found_it: + part_type = partitions_signatures[i].name; + break; + } + + detect_partition_type_end: + close(fd); + return part_type; +} + +int list_partitions(char * dev_name, char ** parts, char ** comments) +{ + int major, minor, blocks; + char name[100]; + FILE * f; + int i = 0; + char buf[512]; + + if (!(f = fopen("/proc/partitions", "rb")) || !fgets(buf, sizeof(buf), f) || !fgets(buf, sizeof(buf), f)) { + log_perror(dev_name); + return 1; + } + + while (fgets(buf, sizeof(buf), f)) { + memset(name, 0, sizeof(name)); + sscanf(buf, " %d %d %d %s", &major, &minor, &blocks, name); + if ((strstr(name, dev_name) == name) && (blocks > 1) && (name[strlen(dev_name)] != '\0')) { + const char * partition_type = detect_partition_type(name); + parts[i] = strdup(name); + comments[i] = (char *) malloc(sizeof(char) * 100); + sprintf(comments[i], "size: %d Mbytes", blocks >> 10); + if (partition_type) { + strcat(comments[i], ", type: "); + strcat(comments[i], partition_type); + } + i++; + } + } + parts[i] = NULL; + fclose(f); + + return 0; +} diff --git a/mdk-stage1/insmod-busybox/insmod-frontend.c b/mdk-stage1/partition.h index 3e5d6b3d7..47639a3d0 100644 --- a/mdk-stage1/insmod-busybox/insmod-frontend.c +++ b/mdk-stage1/partition.h @@ -1,7 +1,7 @@ /* - * Guillaume Cottenceau (gc@mandrakesoft.com) + * Olivier Blin (oblin) * - * Copyright 2000 MandrakeSoft + * Copyright 2005 Mandriva * * This software may be freely redistributed under the terms of the GNU * public license. @@ -12,13 +12,17 @@ * */ -#include <stdio.h> +/* + * Portions from Erik Troan (ewt@redhat.com) + * + * Copyright 1996 Red Hat Software + * + */ + +#ifndef _PARTITION_H_ +#define _PARTITION_H_ +int list_partitions(char * dev_name, char ** parts, char ** comments); -int insmod_main( int argc, char **argv); +#endif -int main( int argc, char **argv) -{ - printf("Using insmod provided by busybox.\n"); - return insmod_main(argc, argv); -} diff --git a/mdk-stage1/pci-resource/.cvsignore b/mdk-stage1/pci-resource/.cvsignore deleted file mode 100644 index 4c7b0844b..000000000 --- a/mdk-stage1/pci-resource/.cvsignore +++ /dev/null @@ -1 +0,0 @@ -pci-ids.h diff --git a/mdk-stage1/pci-resource/Makefile b/mdk-stage1/pci-resource/Makefile deleted file mode 100644 index 8627ab03c..000000000 --- a/mdk-stage1/pci-resource/Makefile +++ /dev/null @@ -1,25 +0,0 @@ - #****************************************************************************** - # - # $Id$ - # - # Guillaume Cottenceau (gc@mandrakesoft.com) - # - # Copyright 2000 MandrakeSoft - # - # This software may be freely redistributed under the terms of the GNU - # public license. - # - # 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. - # - #***************************************************************************** - - -all: pci-ids.h - -pci-ids.h: /usr/share/ldetect-lst/pcitable update-pci-ids.pl - perl update-pci-ids.pl > $@ || rm -f $@ - -clean: - rm -f pci-ids.h diff --git a/mdk-stage1/pci-resource/update-pci-ids.pl b/mdk-stage1/pci-resource/update-pci-ids.pl deleted file mode 100755 index dee8bcf06..000000000 --- a/mdk-stage1/pci-resource/update-pci-ids.pl +++ /dev/null @@ -1,64 +0,0 @@ -#!/usr/bin/perl - -use lib "../../perl-install"; - -use common qw(:common); -require '/usr/bin/merge2pcitable.pl'; - -my $drivers = read_pcitable("/usr/share/ldetect-lst/pcitable"); - - -print ' -#define PCI_REVISION_ID 0x08 /* Revision ID */ - -struct pci_module_map { - unsigned short vendor; /* PCI vendor id */ - unsigned short device; /* PCI device id */ - const char *name; /* PCI human readable name */ - const char *module; /* module to load */ -}; - -'; - -my %t = (scsi => 'scsi', eth => 'net'); - -if (-x "../mar/mar" && -f "../../modules/network_modules.mar" && -f "../../modules/hd_modules.mar") { - $modulez{'eth'} = [ `../mar/mar -l ../../modules/network_modules.mar` ]; - $modulez{'scsi'} = [ `../mar/mar -l ../../modules/hd_modules.mar` ]; - $check_marfiles = 1; -} - - -foreach $type (keys %t) { - print "#ifndef DISABLE_NETWORK\n" if ($type eq 'eth'); - print "#ifndef DISABLE_MEDIAS\n" if ($type eq 'scsi'); - - print " -struct pci_module_map ${type}_pci_ids[] = { -"; - my %l; - foreach (glob("../../kernel/lib/modules/*/$t{$type}/*.o"), glob("../../kernel/lib/modules/*/kernel/drivers/$t{$type}/{*/,}*.o")) { - m|([^/]*)\.o$|; - $l{$1} = 1; - } - my %absent; - while (my ($k, $v) = each %$drivers) { - $l{$v->[0]} or next; - $k =~ /^(....)(....)/; - printf qq|\t{0x%s , 0x%s , ( "%s" ), ( "%s" )} ,\n|, - $1, $2, $v->[1], $v->[0]; - if (defined($check_marfiles)) { - ($absent{$v->[0]} = 1) if (!grep(/^\t$v->[0]\.o\s/, @{$modulez{$type}})); - } - } - - if (%absent) { print STDERR "\tmissing for $type: "; foreach (keys %absent) { print STDERR "$_ " } print STDERR "\n"; }; - -print " -}; -int ${type}_num_ids=sizeof(${type}_pci_ids)/sizeof(struct pci_module_map); -"; - - print "#endif\n"; - -} diff --git a/mdk-stage1/pcmcia/Makefile b/mdk-stage1/pcmcia/Makefile index e2e670146..6b8bf0cb8 100644 --- a/mdk-stage1/pcmcia/Makefile +++ b/mdk-stage1/pcmcia/Makefile @@ -1,8 +1,8 @@ #****************************************************************************** # - # Guillaume Cottenceau (gc@mandrakesoft.com) + # Guillaume Cottenceau (gc) # - # Copyright 2000 MandrakeSoft + # Copyright 2001 Mandriva # # This software may be freely redistributed under the terms of the GNU # public license. @@ -13,22 +13,40 @@ # #***************************************************************************** +# startup.c is based on pcmcia-socket-startup from pcmciautils-013 + top_dir = .. include $(top_dir)/Makefile.common +TARGET = libpcmcia.a +YFLAGS := -d -all: libpcmcia.a +all: $(TARGET) pcmcia_probe.o clean: - rm -f *.o libpcmcia.a + rm -f *.o $(TARGET) lex_config.c yacc_config.c yacc_config.h + +FLAGS = -D__linux__ -Wall -Werror -Wno-deprecated-declarations -Os -fomit-frame-pointer -pipe -c -I.. -D_DEFAULT_SOURCE +# (blino) make sure yynewerror and yyerrlab are uselessly used +FLAGS += -Dlint +LFLAGS += --nounput + + +OBJS = probe.o startup.o yacc_config.o lex_config.o + -FLAGS = -Wall -Werror -Os -fomit-frame-pointer -pipe -c -I.. +%.c %.h : %.y + $(YACC) $(YFLAGS) $< + mv y.tab.c $*.c + mv y.tab.h $*.h -libpcmcia.a: pcmcia_probe.o cardmgr.o lex_config.o yacc_config.o +$(TARGET): $(OBJS) yacc_config.h ar -cru $@ $^ ranlib $@ -.c.o: - gcc $(FLAGS) $(GLIBC_INCLUDES) $< +$(OBJS): %.o: %.c + gcc $(FLAGS) $(INCLUDES) -c $< -o $@ +pcmcia_probe.o: probe.c + gcc -fPIC $(FLAGS) $(INCLUDES) -c $< -o $@ diff --git a/mdk-stage1/pcmcia/bulkmem.h b/mdk-stage1/pcmcia/bulkmem.h index 1b0bcbd1e..7748d4432 100644 --- a/mdk-stage1/pcmcia/bulkmem.h +++ b/mdk-stage1/pcmcia/bulkmem.h @@ -1,7 +1,7 @@ /* * Definitions for bulk memory services * - * bulkmem.h 1.12 2000/06/12 21:55:41 + * bulkmem.h 1.13 2001/08/24 12:16:12 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in @@ -18,8 +18,8 @@ * are Copyright (C) 1999 David A. Hinds. All Rights Reserved. * * Alternatively, the contents of this file may be used under the - * terms of the GNU Public License version 2 (the "GPL"), in which - * case the provisions of the GPL are applicable instead of the + * terms of the GNU General Public License version 2 (the "GPL"), in + * which case the provisions of the GPL are applicable instead of the * above. If you wish to allow the use of your version of this file * only under the terms of the GPL and not to allow others to use * your version of this file under the MPL, indicate your decision by diff --git a/mdk-stage1/pcmcia/cardmgr.c b/mdk-stage1/pcmcia/cardmgr.c deleted file mode 100644 index 1899d04b8..000000000 --- a/mdk-stage1/pcmcia/cardmgr.c +++ /dev/null @@ -1,805 +0,0 @@ -/* - * Guillaume Cottenceau (gc@mandrakesoft.com) - * - * Copyright 2000 MandrakeSoft - * - * This software may be freely redistributed under the terms of the GNU - * public license. - * - * 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. - * - */ - -/* Code comes from /anonymous@projects.sourceforge.net:/pub/pcmcia-cs/pcmcia-cs-3.1.23.tar.bz2 - * - * Licence of this code follows: - - PCMCIA Card Manager daemon - - cardmgr.c 1.150 2000/12/14 17:12:59 - - The contents of this file are subject to the Mozilla Public - License Version 1.1 (the "License"); you may not use this file - except in compliance with the License. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - Software distributed under the License is distributed on an "AS - IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or - implied. See the License for the specific language governing - rights and limitations under the License. - - The initial developer of the original code is David A. Hinds - <dahinds@users.sourceforge.net>. Portions created by David A. Hinds - are Copyright (C) 1999 David A. Hinds. All Rights Reserved. - - Alternatively, the contents of this file may be used under the - terms of the GNU Public License version 2 (the "GPL"), in which - case the provisions of the GPL are applicable instead of the - above. If you wish to allow the use of your version of this file - only under the terms of the GPL and not to allow others to use - your version of this file under the MPL, indicate your decision - by deleting the provisions above and replace them with the notice - and other provisions required by the GPL. If you do not delete - the provisions above, a recipient may use your version of this - file under either the MPL or the GPL. - - */ - - -#include <sys/types.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <fcntl.h> -#include <errno.h> -#include <signal.h> -#include <sys/time.h> -#include <sys/ioctl.h> -#include <sys/wait.h> -#include <sys/stat.h> -#include <sys/utsname.h> -#include <sys/file.h> - -#include <pcmcia/version.h> -#include <pcmcia/config.h> -#include <pcmcia/cs_types.h> -#include <pcmcia/cs.h> -#include <pcmcia/cistpl.h> -#include <pcmcia/ds.h> - -#include "../log.h" -#include "modules.h" - -#include "cardmgr.h" -#include "pcmcia.h" - -/*====================================================================*/ - -typedef struct socket_info_t { - int fd; - int state; - card_info_t *card; - bind_info_t *bind[MAX_BINDINGS]; - mtd_ident_t *mtd[2*CISTPL_MAX_DEVICES]; -} socket_info_t; - -#define SOCKET_PRESENT 0x01 -#define SOCKET_READY 0x02 -#define SOCKET_BOUND 0x04 - -/* Linked list of resource adjustments */ -struct adjust_list_t *root_adjust = NULL; - -/* Linked list of device definitions */ -struct device_info_t *root_device = NULL; - -/* Special pointer to "anonymous" card definition */ -struct card_info_t *blank_card = NULL; - -/* Linked list of card definitions */ -struct card_info_t *root_card = NULL; - -/* Linked list of function definitions */ -struct card_info_t *root_func = NULL; - -/* Linked list of MTD definitions */ -struct mtd_ident_t *root_mtd = NULL; - -/* Default MTD */ -struct mtd_ident_t *default_mtd = NULL; - -static int sockets; -static struct socket_info_t socket[MAX_SOCKS]; - -static char *configpath = "/etc/pcmcia"; - -/* Default path for socket info table */ -static char *stabfile; - -/*====================================================================*/ - -static int major = 0; - -static int lookup_dev(char *name) -{ - FILE *f; - int n; - char s[32], t[32]; - - f = fopen("/proc/devices", "r"); - if (f == NULL) - return -errno; - while (fgets(s, 32, f) != NULL) { - if (sscanf(s, "%d %s", &n, t) == 2) - if (strcmp(name, t) == 0) - break; - } - fclose(f); - if (strcmp(name, t) == 0) - return n; - else - return -ENODEV; -} - -static int open_dev(dev_t dev, int mode) -{ - char *fn; - int fd; - if ((fn = tmpnam(NULL)) == NULL) - return -1; - if (mknod(fn, mode, dev) != 0) - return -1; - fd = open(fn, (mode&S_IWRITE) ? O_RDWR : O_RDONLY); - if (fd < 0) - fd = open(fn, O_NONBLOCK|((mode&S_IWRITE) ? O_RDWR : O_RDONLY)); - unlink(fn); - return fd; -} - -static int open_sock(int sock, int mode) -{ - dev_t dev = (major<<8) + sock; - return open_dev(dev, mode); -} - -/*====================================================================== - - xlate_scsi_name() is a sort-of-hack used to deduce the minor - device numbers of SCSI devices, from the information available to - the low-level driver. - -======================================================================*/ - - -#include <linux/major.h> -#include <scsi/scsi.h> - -static int xlate_scsi_name(bind_info_t *bind) -{ - int i, fd, mode, minor; - u_long arg[2], id1, id2; - - id1 = strtol(bind->name+3, NULL, 16); - if ((bind->major == SCSI_DISK0_MAJOR) || - (bind->major == SCSI_CDROM_MAJOR)) - mode = S_IREAD|S_IFBLK; - else - mode = S_IREAD|S_IFCHR; - - for (i = 0; i < 16; i++) { - minor = (bind->major == SCSI_DISK0_MAJOR) ? (i<<4) : i; - fd = open_dev((bind->major<<8)+minor, mode); - if (fd < 0) - continue; - if (ioctl(fd, SCSI_IOCTL_GET_IDLUN, arg) == 0) { - id2 = (arg[0]&0x0f) + ((arg[0]>>4)&0xf0) + - ((arg[0]>>8)&0xf00) + ((arg[0]>>12)&0xf000); - if (id1 == id2) { - close(fd); - switch (bind->major) { - case SCSI_DISK0_MAJOR: - case SCSI_GENERIC_MAJOR: - sprintf(bind->name+2, "%c", 'a'+i); break; - case SCSI_CDROM_MAJOR: - sprintf(bind->name, "scd%d", i); break; - case SCSI_TAPE_MAJOR: - sprintf(bind->name+2, "%d", i); break; - } - bind->minor = minor; - return 0; - } - } - close(fd); - } - return -1; -} - - -/*====================================================================*/ - -static void write_stab(void) -{ - int i, j, k; - FILE *f; - socket_info_t *s; - bind_info_t *bind; - - f = fopen(stabfile, "w"); - if (f == NULL) { - log_message("CM: fopen(stabfile) failed: %m"); - return; - } - if (flock(fileno(f), LOCK_EX) != 0) { - log_message("CM: flock(stabfile) failed: %m"); - return; - } - for (i = 0; i < sockets; i++) { - s = &socket[i]; - if (!(s->state & SOCKET_PRESENT)) - fprintf(f, "Socket %d: empty\n", i); - else if (!s->card) - fprintf(f, "Socket %d: unsupported card\n", i); - else { - fprintf(f, "Socket %d: %s\n", i, s->card->name); - for (j = 0; j < s->card->bindings; j++) - for (k = 0, bind = s->bind[j]; - bind != NULL; - k++, bind = bind->next) { - char *class = s->card->device[j]->class; - fprintf(f, "%d\t%s\t%s\t%d\t%s", - i, (class ? class : "none"), - bind->dev_info, k, bind->name); - if (bind->major) - fprintf(f, "\t%d\t%d\n", - bind->major, bind->minor); - else - fputc('\n', f); - } - } - } - fflush(f); - fclose(f); -} - -/*====================================================================*/ - -static int get_tuple(int ns, cisdata_t code, ds_ioctl_arg_t *arg) -{ - socket_info_t *s = &socket[ns]; - - arg->tuple.DesiredTuple = code; - arg->tuple.Attributes = 0; - if (ioctl(s->fd, DS_GET_FIRST_TUPLE, arg) != 0) - return -1; - arg->tuple.TupleOffset = 0; - if (ioctl(s->fd, DS_GET_TUPLE_DATA, arg) != 0) { - log_message("CM: error reading CIS data on socket %d: %m", ns); - return -1; - } - if (ioctl(s->fd, DS_PARSE_TUPLE, arg) != 0) { - log_message("CM: error parsing CIS on socket %d: %m", ns); - return -1; - } - return 0; -} - -/*====================================================================*/ - -typedef struct { - u_short vendor, device; -} pci_id_t; - - -static card_info_t *lookup_card(int ns) -{ - socket_info_t *s = &socket[ns]; - card_info_t *card = NULL; - ds_ioctl_arg_t arg; - cistpl_vers_1_t *vers = NULL; - cistpl_manfid_t manfid = { 0, 0 }; - pci_id_t pci_id = { 0, 0 }; - cistpl_funcid_t funcid = { 0xff, 0xff }; - cs_status_t status; - config_info_t config; - int i, ret, match; - int has_cis = 0; - - /* Do we have a CIS structure? */ - ret = ioctl(s->fd, DS_VALIDATE_CIS, &arg); - has_cis = ((ret == 0) && (arg.cisinfo.Chains > 0)); - - /* Try to read VERS_1, MANFID tuples */ - if (has_cis) { - /* rule of thumb: cards with no FUNCID, but with common memory - device geometry information, are probably memory cards */ - if (get_tuple(ns, CISTPL_FUNCID, &arg) == 0) - memcpy(&funcid, &arg.tuple_parse.parse.funcid, - sizeof(funcid)); - else if (get_tuple(ns, CISTPL_DEVICE_GEO, &arg) == 0) - funcid.func = CISTPL_FUNCID_MEMORY; - if (get_tuple(ns, CISTPL_MANFID, &arg) == 0) - memcpy(&manfid, &arg.tuple_parse.parse.manfid, - sizeof(manfid)); - if (get_tuple(ns, CISTPL_VERS_1, &arg) == 0) - vers = &arg.tuple_parse.parse.version_1; - - match = 0; - for (card = root_card; card; card = card->next) { - switch (card->ident_type) { - - case VERS_1_IDENT: - if (vers == NULL) - break; - for (i = 0; i < card->id.vers.ns; i++) { - if (strcmp(card->id.vers.pi[i], "*") == 0) - continue; - if (i >= vers->ns) - break; - if (strcmp(card->id.vers.pi[i], - vers->str+vers->ofs[i]) != 0) - break; - } - if (i < card->id.vers.ns) - break; - match = 1; - break; - - case MANFID_IDENT: - if ((manfid.manf == card->id.manfid.manf) && - (manfid.card == card->id.manfid.card)) - match = 1; - break; - - case TUPLE_IDENT: - arg.tuple.DesiredTuple = card->id.tuple.code; - arg.tuple.Attributes = 0; - ret = ioctl(s->fd, DS_GET_FIRST_TUPLE, &arg); - if (ret != 0) break; - arg.tuple.TupleOffset = card->id.tuple.ofs; - ret = ioctl(s->fd, DS_GET_TUPLE_DATA, &arg); - if (ret != 0) break; - if (strncmp((char *)arg.tuple_parse.data, - card->id.tuple.info, - strlen(card->id.tuple.info)) != 0) - break; - match = 1; - break; - - default: - /* Skip */ - break; - } - if (match) break; - } - } - - /* Check PCI vendor/device info */ - status.Function = config.Function = config.ConfigBase = 0; - if ((ioctl(s->fd, DS_GET_CONFIGURATION_INFO, &config) == 0) && - (config.IntType == INT_CARDBUS)) { - pci_id.vendor = config.ConfigBase & 0xffff; - pci_id.device = config.ConfigBase >> 16; - if (!card) { - for (card = root_card; card; card = card->next) - if ((card->ident_type == PCI_IDENT) && - (pci_id.vendor == card->id.manfid.manf) && - (pci_id.device == card->id.manfid.card)) - break; - } - } - - /* Try for a FUNCID match */ - if (!card && (funcid.func != 0xff)) { - for (card = root_func; card; card = card->next) - if (card->id.func.funcid == funcid.func) - break; - } - - if (card) { - log_message("CM: socket %d: %s", ns, card->name); - return card; - } - - status.Function = 0; - if (!blank_card || (status.CardState & CS_EVENT_CB_DETECT) || - manfid.manf || manfid.card || pci_id.vendor || vers) { - log_message("CM: unsupported card in socket %d", ns); - return NULL; - } else { - card = blank_card; - log_message("CM: socket %d: %s", ns, card->name); - return card; - } -} - - -static void cardmgr_fail(void) -{ - log_message("CM: cardmgr: failed"); -} - -/*====================================================================*/ - -static int load_config(void) -{ - if (chdir(configpath)) { - log_message("CM: chdir to %s failed: %m", configpath); - return -1; - } - - if (parse_configfile("config")) - return -1; - - if (!root_device) - log_message("CM: no device drivers defined"); - - if (!root_card && !root_func) - log_message("CM: no cards defined"); - - return 0; -} - - -/*====================================================================*/ - -static void install_module(char *mod, char *opts) -{ - my_insmod(mod, ANY_DRIVER_TYPE, opts); -} - -/*====================================================================*/ - -static mtd_ident_t *lookup_mtd(region_info_t *region) -{ - mtd_ident_t *mtd; - int match = 0; - - for (mtd = root_mtd; mtd; mtd = mtd->next) { - switch (mtd->mtd_type) { - case JEDEC_MTD: - if ((mtd->jedec_mfr == region->JedecMfr) && - (mtd->jedec_info == region->JedecInfo)) { - match = 1; - break; - } - case DTYPE_MTD: - break; - default: - break; - } - if (match) break; - } - if (mtd) - return mtd; - else - return default_mtd; -} - -/*====================================================================*/ - -static void bind_mtd(int sn) -{ - socket_info_t *s = &socket[sn]; - region_info_t region; - bind_info_t bind; - mtd_info_t mtd_info; - mtd_ident_t *mtd; - int i, attr, ret, nr; - - nr = 0; - for (attr = 0; attr < 2; attr++) { - region.Attributes = attr; - ret = ioctl(s->fd, DS_GET_FIRST_REGION, ®ion); - while (ret == 0) { - mtd = lookup_mtd(®ion); - if (mtd) { - /* Have we seen this MTD before? */ - for (i = 0; i < nr; i++) - if (s->mtd[i] == mtd) break; - if (i == nr) { - install_module(mtd->module, mtd->opts); - s->mtd[nr] = mtd; - mtd->refs++; - nr++; - } - log_message("CM: %s memory region at 0x%lx: %s", - attr ? "Attribute" : "Common", (long unsigned int) region.CardOffset, - mtd->name); - /* Bind MTD to this region */ - strcpy(mtd_info.dev_info, s->mtd[i]->module); - mtd_info.Attributes = region.Attributes; - mtd_info.CardOffset = region.CardOffset; - if (ioctl(s->fd, DS_BIND_MTD, &mtd_info) != 0) { - log_message( "bind MTD '%s' to region at 0x%lx failed: %m", - (char *)mtd_info.dev_info, (long unsigned int) region.CardOffset); - } - } - ret = ioctl(s->fd, DS_GET_NEXT_REGION, ®ion); - } - } - s->mtd[nr] = NULL; - - /* Now bind each unique MTD as a normal client of this socket */ - for (i = 0; i < nr; i++) { - strcpy(bind.dev_info, s->mtd[i]->module); - bind.function = 0; - if (ioctl(s->fd, DS_BIND_REQUEST, &bind) != 0) - log_message("CM: bind MTD '%s' to socket %d failed: %m", - (char *)bind.dev_info, sn); - } -} - -/*====================================================================*/ - -static void update_cis(socket_info_t *s) -{ - cisdump_t cis; - FILE *f = fopen(s->card->cis_file, "r"); - if (f == NULL) - log_message("CM: could not open '%s': %m", s->card->cis_file); - else { - cis.Length = fread(cis.Data, 1, CISTPL_MAX_CIS_SIZE, f); - fclose(f); - if (ioctl(s->fd, DS_REPLACE_CIS, &cis) != 0) - log_message("CM: could not replace CIS: %m"); - } -} - -/*====================================================================*/ - -static void do_insert(int sn) -{ - socket_info_t *s = &socket[sn]; - card_info_t *card; - device_info_t **dev; - bind_info_t *bind, **tail; - int i, j, ret; - - /* Already identified? */ - if (s->card && (s->card != blank_card)) - return; - - log_message("CM: initializing socket %d", sn); - card = lookup_card(sn); - /* Make sure we've learned something new before continuing */ - if (card == s->card) - return; - s->card = card; - card->refs++; - if (card->cis_file) - update_cis(s); - - dev = card->device; - - /* Set up MTD's */ - for (i = 0; i < card->bindings; i++) - if (dev[i]->needs_mtd) - break; - - if (i < card->bindings) - bind_mtd(sn); - - /* Install kernel modules */ - for (i = 0; i < card->bindings; i++) { - dev[i]->refs++; - for (j = 0; j < dev[i]->modules; j++) - install_module(dev[i]->module[j], dev[i]->opts[j]); - } - - /* Bind drivers by their dev_info identifiers */ - for (i = 0; i < card->bindings; i++) { - bind = calloc(1, sizeof(bind_info_t)); - strcpy((char *)bind->dev_info, (char *)dev[i]->dev_info); - if (strcmp(bind->dev_info, "cb_enabler") == 0) - bind->function = BIND_FN_ALL; - else - bind->function = card->dev_fn[i]; - if (ioctl(s->fd, DS_BIND_REQUEST, bind) != 0) { - if (errno == EBUSY) { - log_message("CM: '%s' already bound to socket %d", - (char *)bind->dev_info, sn); - } else { - log_message("CM: bind '%s' to socket %d failed: %m", - (char *)bind->dev_info, sn); - write_stab(); - return; - } - } - - for (ret = j = 0; j < 10; j++) { - ret = ioctl(s->fd, DS_GET_DEVICE_INFO, bind); - if ((ret == 0) || (errno != EAGAIN)) - break; - usleep(100000); - } - if (ret != 0) { - log_message("CM: get dev info on socket %d failed: %m", - sn); - ioctl(s->fd, DS_UNBIND_REQUEST, bind); - write_stab(); - return; - } - tail = &s->bind[i]; - while (ret == 0) { - bind_info_t *old; - if ((strlen(bind->name) > 3) && (bind->name[2] == '#')) - xlate_scsi_name(bind); - old = *tail = bind; tail = (bind_info_t **)&bind->next; - bind = (bind_info_t *)malloc(sizeof(bind_info_t)); - memcpy(bind, old, sizeof(bind_info_t)); - ret = ioctl(s->fd, DS_GET_NEXT_DEVICE, bind); - } - *tail = NULL; free(bind); - write_stab(); - } -} - -/*====================================================================*/ - -static void wait_for_pending(void) -{ - cs_status_t status; - int i; - status.Function = 0; - for (;;) { - usleep(100000); - for (i = 0; i < sockets; i++) - if ((ioctl(socket[i].fd, DS_GET_STATUS, &status) == 0) && (status.CardState & CS_EVENT_CARD_INSERTION)) - break; - if (i == sockets) - break; - } -} - -/*====================================================================*/ - -static void adjust_resources(void) -{ - adjust_list_t *al; - int ret; - char tmp[64]; - int fd = socket[0].fd; - - for (al = root_adjust; al; al = al->next) { - ret = ioctl(fd, DS_ADJUST_RESOURCE_INFO, &al->adj); - if (ret != 0) { - switch (al->adj.Resource) { - case RES_MEMORY_RANGE: - sprintf(tmp, "memory %#lx-%#lx", - al->adj.resource.memory.Base, - al->adj.resource.memory.Base + - al->adj.resource.memory.Size - 1); - break; - case RES_IO_RANGE: - sprintf(tmp, "IO ports %#x-%#x", - al->adj.resource.io.BasePort, - al->adj.resource.io.BasePort + - al->adj.resource.io.NumPorts - 1); - break; - case RES_IRQ: - sprintf(tmp, "irq %u", al->adj.resource.irq.IRQ); - break; - } - log_message("CM: could not adjust resource: %s: %m", tmp); - } - } -} - -/*====================================================================*/ - -static int init_sockets(void) -{ - int fd, i; - servinfo_t serv; - - major = lookup_dev("pcmcia"); - if (major < 0) { - if (major == -ENODEV) - log_message("CM: no pcmcia driver in /proc/devices"); - else - log_message("CM: could not open /proc/devices: %m"); - return -1; - } - - for (fd = -1, i = 0; i < MAX_SOCKS; i++) { - fd = open_sock(i, S_IFCHR|S_IREAD|S_IWRITE); - if (fd < 0) - break; - socket[i].fd = fd; - socket[i].state = 0; - } - - if ((fd < 0) && (errno != ENODEV) && (errno != ENOENT)) - log_message("CM: open_sock(socket %d) failed: %m", i); - sockets = i; - if (sockets == 0) { - log_message("CM: no sockets found!"); - return -1; - } else - log_message("CM: found %d sockets", sockets); - - if (ioctl(socket[0].fd, DS_GET_CARD_SERVICES_INFO, &serv) == 0) { - if (serv.Revision != CS_RELEASE_CODE) - log_message("CM: warning, Card Services release does not match kernel"); - } else { - log_message("CM: could not get CS revision info!"); - return -1; - } - adjust_resources(); - return 0; -} - -/*====================================================================*/ - -int cardmgr_call(void) -{ - int i, max_fd, ret, event; - struct timeval tv; - fd_set fds; - - stabfile = "/var/run/stab"; - - log_message("CM: cardmgr/hacked starting, version is " CS_RELEASE); - - if (load_config()) { - cardmgr_fail(); - return -1; - } - - if (init_sockets()) { - cardmgr_fail(); - return -1; - } - - /* If we've gotten this far, then clean up pid and stab at exit */ - write_stab(); - - for (i = max_fd = 0; i < sockets; i++) - max_fd = (socket[i].fd > max_fd) ? socket[i].fd : max_fd; - - /* First select() call: poll, don't wait */ - tv.tv_sec = tv.tv_usec = 0; - - /* Wait for sockets in setup-pending state to settle */ - wait_for_pending(); - - - FD_ZERO(&fds); - for (i = 0; i < sockets; i++) - FD_SET(socket[i].fd, &fds); - - if (select(max_fd+1, &fds, NULL, NULL, &tv) < 0) { - log_perror("CM: select fails"); - return -1; - } - - for (i = 0; i < sockets; i++) { - if (!FD_ISSET(socket[i].fd, &fds)) - continue; - ret = read(socket[i].fd, &event, 4); - if ((ret == -1) && (errno != EAGAIN)) - log_message("CM: read(%d): %m\n", i); - if (ret != 4) - continue; - - switch (event) { - case CS_EVENT_CARD_INSERTION: - case CS_EVENT_INSERTION_REQUEST: - socket[i].state |= SOCKET_PRESENT; - case CS_EVENT_CARD_RESET: - socket[i].state |= SOCKET_READY; - do_insert(i); - break; - case CS_EVENT_RESET_PHYSICAL: - socket[i].state &= ~SOCKET_READY; - break; - } - - } - - return 0; - -} diff --git a/mdk-stage1/pcmcia/cardmgr.h b/mdk-stage1/pcmcia/cardmgr.h deleted file mode 100644 index fe04044e5..000000000 --- a/mdk-stage1/pcmcia/cardmgr.h +++ /dev/null @@ -1,107 +0,0 @@ -/* - * cardmgr.h 1.35 2000/06/12 21:33:03 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License - * at http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" - * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - * the License for the specific language governing rights and - * limitations under the License. - * - * The initial developer of the original code is David A. Hinds - * <dahinds@users.sourceforge.net>. Portions created by David A. Hinds - * are Copyright (C) 1999 David A. Hinds. All Rights Reserved. - * - * Alternatively, the contents of this file may be used under the - * terms of the GNU Public License version 2 (the "GPL"), in which - * case the provisions of the GPL are applicable instead of the - * above. If you wish to allow the use of your version of this file - * only under the terms of the GPL and not to allow others to use - * your version of this file under the MPL, indicate your decision by - * deleting the provisions above and replace them with the notice and - * other provisions required by the GPL. If you do not delete the - * provisions above, a recipient may use your version of this file - * under either the MPL or the GPL. - */ - -#define MAX_SOCKS 8 -#define MAX_BINDINGS 4 -#define MAX_MODULES 4 - -typedef struct adjust_list_t { - adjust_t adj; - struct adjust_list_t *next; -} adjust_list_t; - -typedef struct func_ident_t { - u_char funcid; -} func_ident_t; - -typedef struct manfid_ident_t { - u_short manf; - u_short card; -} manfid_ident_t; - -typedef struct vers_ident_t { - int ns; - char *pi[4]; -} vers_ident_t; - -typedef struct tuple_ident_t { - cisdata_t code; - long ofs; - char *info; -} tuple_ident_t; - -typedef struct device_info_t { - dev_info_t dev_info; - int needs_mtd; - int modules; - char *module[MAX_MODULES]; - char *opts[MAX_MODULES]; - char *class; - int refs; - struct device_info_t *next; -} device_info_t; - -typedef struct card_info_t { - char *name; - enum { - VERS_1_IDENT=1, MANFID_IDENT, TUPLE_IDENT, FUNC_IDENT, - BLANK_IDENT, PCI_IDENT - } ident_type; - union { - vers_ident_t vers; - manfid_ident_t manfid; - tuple_ident_t tuple; - func_ident_t func; - } id; - int bindings; - device_info_t *device[MAX_BINDINGS]; - int dev_fn[MAX_BINDINGS]; - char *cis_file; - int refs; - struct card_info_t *next; -} card_info_t; - -typedef struct mtd_ident_t { - char *name; - enum { - JEDEC_MTD=1, DTYPE_MTD, DEFAULT_MTD - } mtd_type; - int dtype, jedec_mfr, jedec_info; - char *module, *opts; - int refs; - struct mtd_ident_t *next; -} mtd_ident_t; - -extern adjust_list_t *root_adjust; -extern device_info_t *root_device; -extern card_info_t *blank_card; -extern card_info_t *root_card, *root_func; -extern mtd_ident_t *root_mtd, *default_mtd; - -int parse_configfile(char *fn); diff --git a/mdk-stage1/pcmcia/cirrus.h b/mdk-stage1/pcmcia/cirrus.h index b7aad5894..78f73b26d 100644 --- a/mdk-stage1/pcmcia/cirrus.h +++ b/mdk-stage1/pcmcia/cirrus.h @@ -1,5 +1,5 @@ /* - * cirrus.h 1.9 2000/06/12 21:29:37 + * cirrus.h 1.10 2001/08/24 12:15:33 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in @@ -16,8 +16,8 @@ * are Copyright (C) 1999 David A. Hinds. All Rights Reserved. * * Alternatively, the contents of this file may be used under the - * terms of the GNU Public License version 2 (the "GPL"), in which - * case the provisions of the GPL are applicable instead of the + * terms of the GNU General Public License version 2 (the "GPL"), in + * which case the provisions of the GPL are applicable instead of the * above. If you wish to allow the use of your version of this file * only under the terms of the GPL and not to allow others to use * your version of this file under the MPL, indicate your decision by @@ -48,11 +48,6 @@ #define PD67_EXT_INDEX 0x2e /* Extension index */ #define PD67_EXT_DATA 0x2f /* Extension data */ -#define pd67_ext_get(s, r) \ - (i365_set(s, PD67_EXT_INDEX, r), i365_get(s, PD67_EXT_DATA)) -#define pd67_ext_set(s, r, v) \ - (i365_set(s, PD67_EXT_INDEX, r), i365_set(s, PD67_EXT_DATA, v)) - /* PD6722 extension registers -- indexed in PD67_EXT_INDEX */ #define PD67_DATA_MASK0 0x01 /* Data mask 0 */ #define PD67_DATA_MASK1 0x02 /* Data mask 1 */ @@ -125,10 +120,6 @@ #define PD67_EC1_INV_MGMT_IRQ 0x10 #define PD67_EC1_PULLUP_CTL 0x20 -/* Fields in PD67_EXTERN_DATA */ -#define PD67_EXD_VS1(s) (0x01 << ((s)<<1)) -#define PD67_EXD_VS2(s) (0x02 << ((s)<<1)) - /* Fields in PD67_MISC_CTL_3 */ #define PD67_MC3_IRQ_MASK 0x03 #define PD67_MC3_IRQ_PCPCI 0x00 @@ -163,20 +154,4 @@ /* Socket Number Register */ #define PD6832_SOCKET_NUMBER 0x004c /* 8 bit */ -/* Data structure for tracking vendor-specific state */ -typedef struct cirrus_state_t { - u_char misc1; /* PD67_MISC_CTL_1 */ - u_char misc2; /* PD67_MISC_CTL_2 */ - u_char ectl1; /* PD67_EXT_CTL_1 */ - u_char timer[6]; /* PD67_TIME_* */ -} cirrus_state_t; - -#define CIRRUS_PCIC_ID \ - IS_PD6729, IS_PD6730, IS_PD6832 - -#define CIRRUS_PCIC_INFO \ - { "Cirrus PD6729", IS_CIRRUS|IS_PCI, ID(CIRRUS, 6729) }, \ - { "Cirrus PD6730", IS_CIRRUS|IS_PCI, PCI_VENDOR_ID_CIRRUS, -1 }, \ - { "Cirrus PD6832", IS_CIRRUS|IS_CARDBUS, ID(CIRRUS, 6832) } - #endif /* _LINUX_CIRRUS_H */ diff --git a/mdk-stage1/pcmcia/cistpl.h b/mdk-stage1/pcmcia/cistpl.h index a4b16a6e4..1d4cac20e 100644 --- a/mdk-stage1/pcmcia/cistpl.h +++ b/mdk-stage1/pcmcia/cistpl.h @@ -1,5 +1,5 @@ /* - * cistpl.h 1.34 2000/06/19 23:18:12 + * cistpl.h 1.35 2001/08/24 12:16:12 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in @@ -16,8 +16,8 @@ * are Copyright (C) 1999 David A. Hinds. All Rights Reserved. * * Alternatively, the contents of this file may be used under the - * terms of the GNU Public License version 2 (the "GPL"), in which - * case the provisions of the GPL are applicable instead of the + * terms of the GNU General Public License version 2 (the "GPL"), in + * which case the provisions of the GPL are applicable instead of the * above. If you wish to allow the use of your version of this file * only under the terms of the GPL and not to allow others to use * your version of this file under the MPL, indicate your decision by diff --git a/mdk-stage1/pcmcia/config.h b/mdk-stage1/pcmcia/config.h deleted file mode 100644 index 4ad8fe81a..000000000 --- a/mdk-stage1/pcmcia/config.h +++ /dev/null @@ -1,59 +0,0 @@ -/* - Automatically generated by 'make config' -- don't edit! -*/ -#ifndef _PCMCIA_CONFIG_H -#define _PCMCIA_CONFIG_H - -#define AUTOCONF_INCLUDED -#define __IN_PCMCIA_PACKAGE__ - -#define LINUX "/home/gc/rpm/BUILD/linux" -#define PREFIX "/home/gc/rpm/tmp/kernel-2.4.0-build" -#define CC "/usr/bin/kgcc" -#define LD "ld" -#define KFLAGS "" -#define UFLAGS "" -#define PCDEBUG "" -#define USE_PM 1 -#define UNSAFE_TOOLS 1 -#define CONFIG_CARDBUS 1 -#undef CONFIG_PNP_BIOS -#define MODDIR "/lib/modules/2.4.0-6mdk" - -/* Options from /home/gc/rpm/BUILD/linux/.config */ -#define CONFIG_MODULES 1 -#undef CONFIG_PCMCIA -#undef CONFIG_SMP -#define CONFIG_PCI 1 -#define CONFIG_PCI_QUIRKS 1 -#define CONFIG_PM 1 -#define CONFIG_SCSI 1 -#define CONFIG_IEEE1394 1 -#define CONFIG_INET 1 -#define CONFIG_NET_PCMCIA_RADIO 1 -#define CONFIG_TR 1 -#undef CONFIG_NET_FASTROUTE -#undef CONFIG_NET_DIVERT -#define CONFIG_MODVERSIONS 1 -#define CONFIG_X86_L1_CACHE_BYTES 32 -#define CONFIG_X86_L1_CACHE_SHIFT 5 -#define CONFIG_PROC_FS 1 -#define ARCH "i386" -#define HOST_ARCH "i386" -#define AFLAGS "" -#define CONFIG_ISA 1 -#define CONFIG_UID16 1 - -#define UTS_RELEASE "2.4.0-6mdk" -#define UTS_VERSION "#1 Wed Jan 24 16:10:16 CET 2001" -#define LINUX_VERSION_CODE 132096 -#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c)) - -#define HAS_PROC_BUS 1 -#define SYSV_INIT 1 -#define RC_DIR "/etc/rc.d" -#undef HAS_FORMS -#define MANDIR "/usr/share/man" -#define XMANDIR "/usr/X11R6/man" - -#endif /* _PCMCIA_CONFIG_H */ diff --git a/mdk-stage1/pcmcia/cs.h b/mdk-stage1/pcmcia/cs.h index be6f92d65..9abeac216 100644 --- a/mdk-stage1/pcmcia/cs.h +++ b/mdk-stage1/pcmcia/cs.h @@ -1,5 +1,5 @@ /* - * cs.h 1.71 2000/08/29 00:54:20 + * cs.h 1.73 2001/08/24 12:16:12 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in @@ -16,8 +16,8 @@ * are Copyright (C) 1999 David A. Hinds. All Rights Reserved. * * Alternatively, the contents of this file may be used under the - * terms of the GNU Public License version 2 (the "GPL"), in which - * case the provisions of the GPL are applicable instead of the + * terms of the GNU General Public License version 2 (the "GPL"), in + * which case the provisions of the GPL are applicable instead of the * above. If you wish to allow the use of your version of this file * only under the terms of the GPL and not to allow others to use * your version of this file under the MPL, indicate your decision by @@ -49,8 +49,8 @@ typedef struct adjust_t { u_int Attributes; union { struct memory { - u_long Base; - u_long Size; + unsigned long Base; + unsigned long Size; } memory; struct io { ioaddr_t BasePort; @@ -181,6 +181,7 @@ typedef struct config_req_t { #define INT_MEMORY 0x01 #define INT_MEMORY_AND_IO 0x02 #define INT_CARDBUS 0x04 +#define INT_ZOOMED_VIDEO 0x08 /* For RequestIO and ReleaseIO */ typedef struct io_req_t { @@ -266,7 +267,7 @@ typedef struct modwin_t { /* For RequestWindow */ typedef struct win_req_t { u_int Attributes; - u_long Base; + unsigned long Base; u_int Size; u_int AccessSpeed; } win_req_t; @@ -397,14 +398,6 @@ typedef struct mtd_bind_t { #ifdef __KERNEL__ /* - * Calls to set up low-level "Socket Services" drivers - */ - -typedef int (*ss_entry_t)(u_int sock, u_int cmd, void *arg); -extern int register_ss_entry(int nsock, ss_entry_t entry); -extern void unregister_ss_entry(ss_entry_t entry); - -/* * The main Card Services entry point */ @@ -435,30 +428,6 @@ extern int CardServices(int func, void *a1, void *a2, void *a3); extern int CardServices(int func, ...); #endif -#ifdef __BEOS__ -#define SS_MODULE_NAME(s) ("busses/pcmcia/" s "/v1") -#define MTD_MODULE_NAME(s) ("busses/pcmcia/" s "/v1") -#define CS_CLIENT_MODULE_NAME "bus_managers/pcmcia_cs/client/v1" -typedef struct cs_client_module_info { - bus_manager_info binfo; - int (*_CardServices)(int, ...); - int (*_MTDHelperEntry)(int, ...); - void (*_add_timer)(struct timer_list *); - void (*_del_timer)(struct timer_list *); -} cs_client_module_info; -#define CS_SOCKET_MODULE_NAME "bus_managers/pcmcia_cs/socket/v1" -typedef struct cs_socket_module_info { - bus_manager_info binfo; - int (*_register_ss_entry)(int, ss_entry_t); - void (*_unregister_ss_entry)(ss_entry_t); - void (*_add_timer)(struct timer_list *); - void (*_del_timer)(struct timer_list *); - int (*register_resource)(int, u_long, u_long); - int (*release_resource)(int, u_long, u_long); - int (*check_resource)(int, u_long, u_long); -} cs_socket_module_info; -#endif - #endif /* __KERNEL__ */ #endif /* _LINUX_CS_H */ diff --git a/mdk-stage1/pcmcia/cs_types.h b/mdk-stage1/pcmcia/cs_types.h index 40cf84b51..4598d7f48 100644 --- a/mdk-stage1/pcmcia/cs_types.h +++ b/mdk-stage1/pcmcia/cs_types.h @@ -1,5 +1,5 @@ /* - * cs_types.h 1.18 2000/06/12 21:55:40 + * cs_types.h 1.19 2001/08/24 12:16:12 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in @@ -16,8 +16,8 @@ * are Copyright (C) 1999 David A. Hinds. All Rights Reserved. * * Alternatively, the contents of this file may be used under the - * terms of the GNU Public License version 2 (the "GPL"), in which - * case the provisions of the GPL are applicable instead of the + * terms of the GNU General Public License version 2 (the "GPL"), in + * which case the provisions of the GPL are applicable instead of the * above. If you wish to allow the use of your version of this file * only under the terms of the GPL and not to allow others to use * your version of this file under the MPL, indicate your decision by @@ -38,8 +38,13 @@ #endif #endif -typedef u_short socket_t; +#ifdef __arm__ +typedef u_int ioaddr_t; +#else typedef u_short ioaddr_t; +#endif + +typedef u_short socket_t; typedef u_int event_t; typedef u_char cisdata_t; typedef u_short page_t; diff --git a/mdk-stage1/pcmcia/driver_ops.h b/mdk-stage1/pcmcia/driver_ops.h index 00cde3336..2f0a066d3 100644 --- a/mdk-stage1/pcmcia/driver_ops.h +++ b/mdk-stage1/pcmcia/driver_ops.h @@ -1,5 +1,5 @@ /* - * driver_ops.h 1.15 2000/06/12 21:55:40 + * driver_ops.h 1.16 2001/08/24 12:16:13 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in @@ -16,8 +16,8 @@ * are Copyright (C) 1999 David A. Hinds. All Rights Reserved. * * Alternatively, the contents of this file may be used under the - * terms of the GNU Public License version 2 (the "GPL"), in which - * case the provisions of the GPL are applicable instead of the + * terms of the GNU General Public License version 2 (the "GPL"), in + * which case the provisions of the GPL are applicable instead of the * above. If you wish to allow the use of your version of this file * only under the terms of the GPL and not to allow others to use * your version of this file under the MPL, indicate your decision by @@ -68,15 +68,6 @@ typedef struct driver_operations { int register_driver(struct driver_operations *ops); void unregister_driver(struct driver_operations *ops); -#ifdef __BEOS__ -#define CB_ENABLER_MODULE_NAME "bus_managers/cb_enabler/v1" -typedef struct cb_enabler_module_info { - bus_manager_info binfo; - int (*register_driver)(struct driver_operations *ops); - void (*unregister_driver)(struct driver_operations *ops); -} cb_enabler_module_info; -#endif /* __BEOS__ */ - #endif /* __KERNEL__ */ #endif /* _LINUX_DRIVER_OPS_H */ diff --git a/mdk-stage1/pcmcia/ds.h b/mdk-stage1/pcmcia/ds.h index 975ba596a..29db7b415 100644 --- a/mdk-stage1/pcmcia/ds.h +++ b/mdk-stage1/pcmcia/ds.h @@ -1,5 +1,5 @@ /* - * ds.h 1.56 2000/06/12 21:55:40 + * ds.h 1.57 2001/08/24 12:16:13 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in @@ -16,8 +16,8 @@ * are Copyright (C) 1999 David A. Hinds. All Rights Reserved. * * Alternatively, the contents of this file may be used under the - * terms of the GNU Public License version 2 (the "GPL"), in which - * case the provisions of the GPL are applicable instead of the + * terms of the GNU General Public License version 2 (the "GPL"), in + * which case the provisions of the GPL are applicable instead of the * above. If you wish to allow the use of your version of this file * only under the terms of the GPL and not to allow others to use * your version of this file under the MPL, indicate your decision by @@ -30,8 +30,8 @@ #ifndef _LINUX_DS_H #define _LINUX_DS_H -#include <pcmcia/driver_ops.h> -#include <pcmcia/bulkmem.h> +#include <pcmcia_/driver_ops.h> +#include <pcmcia_/bulkmem.h> typedef struct tuple_parse_t { tuple_t tuple; @@ -143,21 +143,6 @@ int unregister_pccard_driver(dev_info_t *dev_info); #define register_pcmcia_driver register_pccard_driver #define unregister_pcmcia_driver unregister_pccard_driver -#ifdef __BEOS__ -#define DS_MODULE_NAME "bus_managers/pcmcia_ds/v1" -typedef struct ds_module_info { - bus_manager_info binfo; - int (*_register_pccard_driver)(dev_info_t *, - dev_link_t *(*)(void), - void (*)(dev_link_t *)); - int (*_unregister_pccard_driver)(dev_info_t *); - struct driver_info_t **root_driver; - int *sockets; - struct socket_info_t **socket_table; - sem_id *list_sem; -} ds_module_info; -#endif /* __BEOS__ */ - #endif /* __KERNEL__ */ #endif /* _LINUX_DS_H */ diff --git a/mdk-stage1/pcmcia/i82365.h b/mdk-stage1/pcmcia/i82365.h index 15e8e2540..38ff167fb 100644 --- a/mdk-stage1/pcmcia/i82365.h +++ b/mdk-stage1/pcmcia/i82365.h @@ -1,5 +1,5 @@ /* - * i82365.h 1.20 2000/07/20 23:00:27 + * i82365.h 1.21 2001/08/24 12:15:33 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in @@ -16,8 +16,8 @@ * are Copyright (C) 1999 David A. Hinds. All Rights Reserved. * * Alternatively, the contents of this file may be used under the - * terms of the GNU Public License version 2 (the "GPL"), in which - * case the provisions of the GPL are applicable instead of the + * terms of the GNU General Public License version 2 (the "GPL"), in + * which case the provisions of the GPL are applicable instead of the * above. If you wish to allow the use of your version of this file * only under the terms of the GPL and not to allow others to use * your version of this file under the MPL, indicate your decision by @@ -97,7 +97,6 @@ #define I365_CSC_GPI 0x10 /* Flags for I365_ADDRWIN */ -#define I365_ADDR_MEMCS16 0x20 #define I365_ENA_IO(map) (0x40 << (map)) #define I365_ENA_MEM(map) (0x01 << (map)) @@ -131,24 +130,6 @@ #define I365_MEM_WRPROT 0x8000 /* In offset high byte */ #define I365_MEM_REG 0x4000 -#define I365_REG(slot, reg) (((slot) << 6) | (reg)) - -/* Default ISA interrupt mask */ -#define I365_ISA_IRQ_MASK 0xdeb8 /* irq's 3-5,7,9-12,14,15 */ - -/* Device ID's for PCI-to-PCMCIA bridges */ - -#ifndef PCI_VENDOR_ID_INTEL -#define PCI_VENDOR_ID_INTEL 0x8086 -#endif -#ifndef PCI_DEVICE_ID_INTEL_82092AA_0 -#define PCI_DEVICE_ID_INTEL_82092AA_0 0x1221 -#endif -#ifndef PCI_VENDOR_ID_OMEGA -#define PCI_VENDOR_ID_OMEGA 0x119b -#endif -#ifndef PCI_DEVICE_ID_OMEGA_82C092G -#define PCI_DEVICE_ID_OMEGA_82C092G 0x1221 -#endif +#define I365_REG(slot, reg) (((slot) << 6) + reg) #endif /* _LINUX_I82365_H */ diff --git a/mdk-stage1/pcmcia/lex_config.c b/mdk-stage1/pcmcia/lex_config.c deleted file mode 100644 index b374c8bf4..000000000 --- a/mdk-stage1/pcmcia/lex_config.c +++ /dev/null @@ -1,2008 +0,0 @@ -/* A lexical scanner generated by flex */ - -/* Scanner skeleton version: - * $Header$ - */ - -#define FLEX_SCANNER -#define YY_FLEX_MAJOR_VERSION 2 -#define YY_FLEX_MINOR_VERSION 5 - -#include <stdio.h> - - -/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */ -#ifdef c_plusplus -#ifndef __cplusplus -#define __cplusplus -#endif -#endif - - -#ifdef __cplusplus - -#include <stdlib.h> -#include <unistd.h> - -/* Use prototypes in function declarations. */ -#define YY_USE_PROTOS - -/* The "const" storage-class-modifier is valid. */ -#define YY_USE_CONST - -#else /* ! __cplusplus */ - -#if __STDC__ - -#define YY_USE_PROTOS -#define YY_USE_CONST - -#endif /* __STDC__ */ -#endif /* ! __cplusplus */ - -#ifdef __TURBOC__ - #pragma warn -rch - #pragma warn -use -#include <io.h> -#include <stdlib.h> -#define YY_USE_CONST -#define YY_USE_PROTOS -#endif - -#ifdef YY_USE_CONST -#define yyconst const -#else -#define yyconst -#endif - - -#ifdef YY_USE_PROTOS -#define YY_PROTO(proto) proto -#else -#define YY_PROTO(proto) () -#endif - -/* Returned upon end-of-file. */ -#define YY_NULL 0 - -/* Promotes a possibly negative, possibly signed char to an unsigned - * integer for use as an array index. If the signed char is negative, - * we want to instead treat it as an 8-bit unsigned char, hence the - * double cast. - */ -#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) - -/* Enter a start condition. This macro really ought to take a parameter, - * but we do it the disgusting crufty way forced on us by the ()-less - * definition of BEGIN. - */ -#define BEGIN yy_start = 1 + 2 * - -/* Translate the current start state into a value that can be later handed - * to BEGIN to return to the state. The YYSTATE alias is for lex - * compatibility. - */ -#define YY_START ((yy_start - 1) / 2) -#define YYSTATE YY_START - -/* Action number for EOF rule of a given start state. */ -#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) - -/* Special action meaning "start processing a new file". */ -#define YY_NEW_FILE yyrestart( yyin ) - -#define YY_END_OF_BUFFER_CHAR 0 - -/* Size of default input buffer. */ -#define YY_BUF_SIZE 16384 - -typedef struct yy_buffer_state *YY_BUFFER_STATE; - -extern int yyleng; -extern FILE *yyin, *yyout; - -#define EOB_ACT_CONTINUE_SCAN 0 -#define EOB_ACT_END_OF_FILE 1 -#define EOB_ACT_LAST_MATCH 2 - -/* The funky do-while in the following #define is used to turn the definition - * int a single C statement (which needs a semi-colon terminator). This - * avoids problems with code like: - * - * if ( condition_holds ) - * yyless( 5 ); - * else - * do_something_else(); - * - * Prior to using the do-while the compiler would get upset at the - * "else" because it interpreted the "if" statement as being all - * done when it reached the ';' after the yyless() call. - */ - -/* Return all but the first 'n' matched characters back to the input stream. */ - -#define yyless(n) \ - do \ - { \ - /* Undo effects of setting up yytext. */ \ - *yy_cp = yy_hold_char; \ - YY_RESTORE_YY_MORE_OFFSET \ - yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \ - YY_DO_BEFORE_ACTION; /* set up yytext again */ \ - } \ - while ( 0 ) - - -/* The following is because we cannot portably get our hands on size_t - * (without autoconf's help, which isn't available because we want - * flex-generated scanners to compile on their own). - */ -typedef unsigned int yy_size_t; - - -struct yy_buffer_state - { - FILE *yy_input_file; - - char *yy_ch_buf; /* input buffer */ - char *yy_buf_pos; /* current position in input buffer */ - - /* Size of input buffer in bytes, not including room for EOB - * characters. - */ - yy_size_t yy_buf_size; - - /* Number of characters read into yy_ch_buf, not including EOB - * characters. - */ - int yy_n_chars; - - /* Whether we "own" the buffer - i.e., we know we created it, - * and can realloc() it to grow it, and should free() it to - * delete it. - */ - int yy_is_our_buffer; - - /* Whether this is an "interactive" input source; if so, and - * if we're using stdio for input, then we want to use getc() - * instead of fread(), to make sure we stop fetching input after - * each newline. - */ - int yy_is_interactive; - - /* Whether we're considered to be at the beginning of a line. - * If so, '^' rules will be active on the next match, otherwise - * not. - */ - int yy_at_bol; - - /* Whether to try to fill the input buffer when we reach the - * end of it. - */ - int yy_fill_buffer; - - int yy_buffer_status; -#define YY_BUFFER_NEW 0 -#define YY_BUFFER_NORMAL 1 - /* When an EOF's been seen but there's still some text to process - * then we mark the buffer as YY_EOF_PENDING, to indicate that we - * shouldn't try reading from the input source any more. We might - * still have a bunch of tokens to match, though, because of - * possible backing-up. - * - * When we actually see the EOF, we change the status to "new" - * (via yyrestart()), so that the user can continue scanning by - * just pointing yyin at a new input file. - */ -#define YY_BUFFER_EOF_PENDING 2 - }; - -static YY_BUFFER_STATE yy_current_buffer = 0; - -/* We provide macros for accessing buffer states in case in the - * future we want to put the buffer states in a more general - * "scanner state". - */ -#define YY_CURRENT_BUFFER yy_current_buffer - - -/* yy_hold_char holds the character lost when yytext is formed. */ -static char yy_hold_char; - -static int yy_n_chars; /* number of characters read into yy_ch_buf */ - - -int yyleng; - -/* Points to current character in buffer. */ -static char *yy_c_buf_p = (char *) 0; -static int yy_init = 1; /* whether we need to initialize */ -static int yy_start = 0; /* start state number */ - -/* Flag which is used to allow yywrap()'s to do buffer switches - * instead of setting up a fresh yyin. A bit of a hack ... - */ -static int yy_did_buffer_switch_on_eof; - -void yyrestart YY_PROTO(( FILE *input_file )); - -void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer )); -void yy_load_buffer_state YY_PROTO(( void )); -YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size )); -void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b )); -void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file )); -void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b )); -#define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer ) - -YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size )); -YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str )); -YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len )); - -static void *yy_flex_alloc YY_PROTO(( yy_size_t )); -static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t )); -static void yy_flex_free YY_PROTO(( void * )); - -#define yy_new_buffer yy_create_buffer - -#define yy_set_interactive(is_interactive) \ - { \ - if ( ! yy_current_buffer ) \ - yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ - yy_current_buffer->yy_is_interactive = is_interactive; \ - } - -#define yy_set_bol(at_bol) \ - { \ - if ( ! yy_current_buffer ) \ - yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ - yy_current_buffer->yy_at_bol = at_bol; \ - } - -#define YY_AT_BOL() (yy_current_buffer->yy_at_bol) - -typedef unsigned char YY_CHAR; -FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; -typedef int yy_state_type; -extern char *yytext; -#define yytext_ptr yytext - -static yy_state_type yy_get_previous_state YY_PROTO(( void )); -static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state )); -static int yy_get_next_buffer YY_PROTO(( void )); -static void yy_fatal_error YY_PROTO(( yyconst char msg[] )); - -/* Done after the current pattern has been matched and before the - * corresponding action - sets up yytext. - */ -#define YY_DO_BEFORE_ACTION \ - yytext_ptr = yy_bp; \ - yyleng = (int) (yy_cp - yy_bp); \ - yy_hold_char = *yy_cp; \ - *yy_cp = '\0'; \ - yy_c_buf_p = yy_cp; - -#define YY_NUM_RULES 45 -#define YY_END_OF_BUFFER 46 -static yyconst short int yy_accept[247] = - { 0, - 5, 5, 2, 2, 46, 44, 5, 4, 5, 44, - 6, 41, 41, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 3, - 2, 45, 5, 5, 6, 0, 43, 0, 6, 41, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, - 0, 0, 3, 2, 0, 43, 0, 42, 0, 0, - 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 18, 0, 0, 0, 0, 23, 0, 0, 0, - - 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 8, 10, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, - 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 11, 0, 0, 14, 0, 0, 0, 0, - 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 31, 0, 0, 0, 0, 0, 13, 0, - 0, 0, 0, 20, 21, 22, 0, 0, 0, 28, - 0, 0, 0, 1, 0, 0, 0, 0, 12, 15, - 0, 0, 17, 0, 0, 0, 0, 29, 0, 0, - - 32, 0, 0, 0, 0, 16, 0, 0, 0, 0, - 0, 0, 0, 39, 7, 0, 0, 24, 0, 0, - 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, - 33, 0, 0, 0, 34, 0, 0, 0, 40, 0, - 0, 35, 37, 0, 38, 0 - } ; - -static yyconst int yy_ec[256] = - { 0, - 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 4, 1, 5, 6, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 7, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 1, 6, 1, - 1, 1, 1, 1, 9, 9, 9, 9, 9, 9, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 10, 1, 1, 11, 1, 12, 13, 14, 15, - - 16, 17, 18, 1, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1 - } ; - -static yyconst int yy_meta[36] = - { 0, - 1, 2, 3, 2, 1, 1, 4, 4, 4, 1, - 1, 4, 4, 4, 4, 4, 4, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1 - } ; - -static yyconst short int yy_base[253] = - { 0, - 0, 0, 34, 37, 293, 294, 40, 294, 41, 41, - 0, 41, 45, 31, 273, 42, 40, 257, 38, 34, - 274, 47, 273, 262, 53, 271, 57, 35, 60, 0, - 79, 294, 82, 83, 0, 83, 294, 87, 0, 87, - 0, 263, 260, 260, 255, 253, 269, 74, 245, 265, - 244, 253, 262, 248, 259, 249, 249, 256, 255, 80, - 239, 240, 248, 238, 80, 236, 236, 232, 294, 236, - 233, 245, 0, 97, 95, 97, 108, 0, 230, 234, - 242, 241, 294, 226, 242, 234, 226, 229, 234, 235, - 226, 294, 231, 229, 220, 213, 294, 228, 209, 212, - - 228, 294, 209, 219, 221, 217, 216, 206, 211, 203, - 215, 219, 194, 294, 294, 199, 196, 212, 209, 193, - 208, 192, 190, 206, 200, 190, 195, 187, 190, 294, - 192, 294, 188, 184, 200, 198, 195, 192, 188, 181, - 191, 181, 294, 181, 186, 294, 186, 189, 180, 183, - 294, 182, 161, 179, 183, 165, 170, 167, 158, 177, - 166, 171, 294, 161, 174, 172, 158, 152, 294, 165, - 165, 154, 162, 294, 166, 294, 153, 154, 158, 294, - 157, 157, 160, 294, 146, 157, 140, 136, 294, 294, - 147, 141, 294, 150, 133, 151, 139, 294, 148, 133, - - 294, 143, 142, 127, 126, 294, 142, 138, 140, 140, - 124, 124, 136, 294, 294, 126, 118, 294, 130, 118, - 113, 114, 115, 294, 125, 127, 108, 116, 99, 87, - 294, 90, 87, 86, 294, 96, 78, 74, 294, 75, - 64, 294, 294, 46, 294, 294, 118, 122, 126, 130, - 134, 64 - } ; - -static yyconst short int yy_def[253] = - { 0, - 246, 1, 247, 247, 246, 246, 246, 246, 246, 248, - 249, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 246, 246, 246, 246, 246, 246, 246, 246, 246, 250, - 246, 246, 246, 246, 249, 248, 246, 251, 249, 246, - 252, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 246, 246, 250, 246, 248, 248, 251, 252, 246, 246, - 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, - - 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, - - 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 246, 246, 246, 246, 246, 0, 246, 246, 246, 246, - 246, 246 - } ; - -static yyconst short int yy_nxt[330] = - { 0, - 6, 7, 8, 9, 10, 11, 12, 13, 6, 6, - 6, 14, 15, 16, 17, 18, 19, 6, 20, 21, - 6, 6, 22, 23, 24, 25, 6, 26, 27, 28, - 6, 29, 6, 6, 6, 31, 32, 31, 31, 32, - 31, 33, 33, 33, 34, 37, 35, 40, 40, 42, - 38, 40, 40, 45, 43, 48, 51, 53, 56, 69, - 46, 54, 57, 47, 62, 70, 63, 78, 52, 49, - 66, 58, 67, 245, 41, 71, 59, 64, 72, 244, - 74, 68, 74, 33, 33, 33, 34, 37, 35, 36, - 85, 76, 38, 40, 40, 98, 77, 104, 74, 37, - - 74, 37, 243, 242, 38, 86, 38, 241, 105, 99, - 36, 240, 76, 239, 238, 237, 236, 77, 30, 30, - 30, 30, 36, 36, 36, 36, 39, 39, 235, 39, - 73, 234, 233, 73, 75, 75, 75, 75, 232, 231, - 230, 229, 228, 227, 226, 225, 224, 223, 222, 221, - 220, 219, 218, 217, 216, 215, 214, 213, 212, 211, - 210, 209, 208, 207, 206, 205, 204, 203, 202, 201, - 200, 199, 198, 197, 196, 195, 194, 193, 192, 191, - 190, 189, 188, 187, 186, 185, 184, 183, 182, 181, - 180, 179, 178, 177, 176, 175, 174, 173, 172, 171, - - 170, 169, 168, 167, 166, 165, 164, 163, 162, 161, - 160, 159, 158, 157, 156, 155, 154, 153, 152, 151, - 150, 149, 148, 147, 146, 145, 144, 143, 142, 141, - 140, 139, 138, 137, 136, 135, 134, 133, 132, 131, - 130, 129, 128, 127, 126, 125, 124, 123, 122, 121, - 120, 119, 118, 117, 116, 115, 114, 113, 112, 111, - 110, 109, 108, 107, 106, 103, 102, 101, 100, 97, - 96, 95, 94, 93, 92, 91, 90, 89, 88, 87, - 84, 83, 82, 81, 80, 79, 65, 61, 60, 55, - 50, 44, 246, 5, 246, 246, 246, 246, 246, 246, - - 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 246, 246, 246, 246, 246, 246, 246, 246, 246 - } ; - -static yyconst short int yy_chk[330] = - { 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 3, 3, 3, 4, 4, - 4, 7, 9, 7, 9, 10, 9, 12, 12, 14, - 10, 13, 13, 16, 14, 17, 19, 20, 22, 28, - 16, 20, 22, 16, 25, 28, 25, 252, 19, 17, - 27, 22, 27, 244, 12, 29, 22, 25, 29, 241, - 31, 27, 31, 33, 34, 33, 34, 36, 34, 38, - 48, 38, 36, 40, 40, 60, 38, 65, 74, 75, - - 74, 76, 240, 238, 75, 48, 76, 237, 65, 60, - 77, 236, 77, 234, 233, 232, 230, 77, 247, 247, - 247, 247, 248, 248, 248, 248, 249, 249, 229, 249, - 250, 228, 227, 250, 251, 251, 251, 251, 226, 225, - 223, 222, 221, 220, 219, 217, 216, 213, 212, 211, - 210, 209, 208, 207, 205, 204, 203, 202, 200, 199, - 197, 196, 195, 194, 192, 191, 188, 187, 186, 185, - 183, 182, 181, 179, 178, 177, 175, 173, 172, 171, - 170, 168, 167, 166, 165, 164, 162, 161, 160, 159, - 158, 157, 156, 155, 154, 153, 152, 150, 149, 148, - - 147, 145, 144, 142, 141, 140, 139, 138, 137, 136, - 135, 134, 133, 131, 129, 128, 127, 126, 125, 124, - 123, 122, 121, 120, 119, 118, 117, 116, 113, 112, - 111, 110, 109, 108, 107, 106, 105, 104, 103, 101, - 100, 99, 98, 96, 95, 94, 93, 91, 90, 89, - 88, 87, 86, 85, 84, 82, 81, 80, 79, 72, - 71, 70, 68, 67, 66, 64, 63, 62, 61, 59, - 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, - 47, 46, 45, 44, 43, 42, 26, 24, 23, 21, - 18, 15, 5, 246, 246, 246, 246, 246, 246, 246, - - 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 246, 246, 246, 246, 246, 246, 246, 246, 246 - } ; - -static yy_state_type yy_last_accepting_state; -static char *yy_last_accepting_cpos; - -/* The intent behind this definition is that it'll catch - * any uses of REJECT which flex missed. - */ -#define REJECT reject_used_but_not_detected -#define yymore() yymore_used_but_not_detected -#define YY_MORE_ADJ 0 -#define YY_RESTORE_YY_MORE_OFFSET -char *yytext; -#line 1 "lex_config.l" -#define INITIAL 0 -/* Special state for handling include files */ -#define src 1 - -#line 5 "lex_config.l" -/* - * lex_config.l 1.39 2000/06/12 21:33:02 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License - * at http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" - * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - * the License for the specific language governing rights and - * limitations under the License. - * - * The initial developer of the original code is David A. Hinds - * <dahinds@users.sourceforge.net>. Portions created by David A. Hinds - * are Copyright (C) 1999 David A. Hinds. All Rights Reserved. - * - * Alternatively, the contents of this file may be used under the - * terms of the GNU Public License version 2 (the "GPL"), in which - * case the provisions of the GPL are applicable instead of the - * above. If you wish to allow the use of your version of this file - * only under the terms of the GPL and not to allow others to use - * your version of this file under the MPL, indicate your decision by - * deleting the provisions above and replace them with the notice and - * other provisions required by the GPL. If you do not delete the - * provisions above, a recipient may use your version of this file - * under either the MPL or the GPL. - */ - -#undef src -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <string.h> -#include <syslog.h> -#include <glob.h> -#define src 1 - -#include <pcmcia/cs_types.h> -#include <pcmcia/cs.h> - -#include "yacc_config.h" - -/* For assembling nice error messages */ -char *current_file; -int current_lineno; - -static int lex_number(char *s); -static int lex_string(char *s); -static void do_source(char *fn); -static int do_eof(void); - - -/* Macros after this point can all be overridden by user definitions in - * section 1. - */ - -#ifndef YY_SKIP_YYWRAP -#ifdef __cplusplus -extern "C" int yywrap YY_PROTO(( void )); -#else -extern int yywrap YY_PROTO(( void )); -#endif -#endif - -#ifndef YY_NO_UNPUT -#endif - -#ifndef yytext_ptr -static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int )); -#endif - -#ifdef YY_NEED_STRLEN -static int yy_flex_strlen YY_PROTO(( yyconst char * )); -#endif - -#ifndef YY_NO_INPUT -#ifdef __cplusplus -static int yyinput YY_PROTO(( void )); -#else -static int input YY_PROTO(( void )); -#endif -#endif - -#if YY_STACK_USED -static int yy_start_stack_ptr = 0; -static int yy_start_stack_depth = 0; -static int *yy_start_stack = 0; -#ifndef YY_NO_PUSH_STATE -static void yy_push_state YY_PROTO(( int new_state )); -#endif -#ifndef YY_NO_POP_STATE -static void yy_pop_state YY_PROTO(( void )); -#endif -#ifndef YY_NO_TOP_STATE -static int yy_top_state YY_PROTO(( void )); -#endif - -#else -#define YY_NO_PUSH_STATE 1 -#define YY_NO_POP_STATE 1 -#define YY_NO_TOP_STATE 1 -#endif - -#ifdef YY_MALLOC_DECL -YY_MALLOC_DECL -#else -#if __STDC__ -#ifndef __cplusplus -#include <stdlib.h> -#endif -#else -/* Just try to get by without declaring the routines. This will fail - * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int) - * or sizeof(void*) != sizeof(int). - */ -#endif -#endif - -/* Amount of stuff to slurp up with each read. */ -#ifndef YY_READ_BUF_SIZE -#define YY_READ_BUF_SIZE 8192 -#endif - -/* Copy whatever the last rule matched to the standard output. */ - -#ifndef ECHO -/* This used to be an fputs(), but since the string might contain NUL's, - * we now use fwrite(). - */ -#define ECHO (void) fwrite( yytext, yyleng, 1, yyout ) -#endif - -/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, - * is returned in "result". - */ -#ifndef YY_INPUT -#define YY_INPUT(buf,result,max_size) \ - if ( yy_current_buffer->yy_is_interactive ) \ - { \ - int c = '*', n; \ - for ( n = 0; n < max_size && \ - (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ - buf[n] = (char) c; \ - if ( c == '\n' ) \ - buf[n++] = (char) c; \ - if ( c == EOF && ferror( yyin ) ) \ - YY_FATAL_ERROR( "input in flex scanner failed" ); \ - result = n; \ - } \ - else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \ - && ferror( yyin ) ) \ - YY_FATAL_ERROR( "input in flex scanner failed" ); -#endif - -/* No semi-colon after return; correct usage is to write "yyterminate();" - - * we don't want an extra ';' after the "return" because that will cause - * some compilers to complain about unreachable statements. - */ -#ifndef yyterminate -#define yyterminate() return YY_NULL -#endif - -/* Number of entries by which start-condition stack grows. */ -#ifndef YY_START_STACK_INCR -#define YY_START_STACK_INCR 25 -#endif - -/* Report a fatal error. */ -#ifndef YY_FATAL_ERROR -#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) -#endif - -/* Default declaration of generated scanner - a define so the user can - * easily add parameters. - */ -#ifndef YY_DECL -#define YY_DECL int yylex YY_PROTO(( void )) -#endif - -/* Code executed at the beginning of each rule, after yytext and yyleng - * have been set up. - */ -#ifndef YY_USER_ACTION -#define YY_USER_ACTION -#endif - -/* Code executed at the end of each rule. */ -#ifndef YY_BREAK -#define YY_BREAK break; -#endif - -#define YY_RULE_SETUP \ - YY_USER_ACTION - -YY_DECL - { - register yy_state_type yy_current_state; - register char *yy_cp, *yy_bp; - register int yy_act; - -#line 63 "lex_config.l" - - - - if ( yy_init ) - { - yy_init = 0; - -#ifdef YY_USER_INIT - YY_USER_INIT; -#endif - - if ( ! yy_start ) - yy_start = 1; /* first start state */ - - if ( ! yyin ) - yyin = stdin; - - if ( ! yyout ) - yyout = stdout; - - if ( ! yy_current_buffer ) - yy_current_buffer = - yy_create_buffer( yyin, YY_BUF_SIZE ); - - yy_load_buffer_state(); - } - - while ( 1 ) /* loops until end-of-file is reached */ - { - yy_cp = yy_c_buf_p; - - /* Support of yytext. */ - *yy_cp = yy_hold_char; - - /* yy_bp points to the position in yy_ch_buf of the start of - * the current run. - */ - yy_bp = yy_cp; - - yy_current_state = yy_start; -yy_match: - do - { - register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; - if ( yy_accept[yy_current_state] ) - { - yy_last_accepting_state = yy_current_state; - yy_last_accepting_cpos = yy_cp; - } - while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) - { - yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 247 ) - yy_c = yy_meta[(unsigned int) yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - ++yy_cp; - } - while ( yy_base[yy_current_state] != 294 ); - -yy_find_action: - yy_act = yy_accept[yy_current_state]; - if ( yy_act == 0 ) - { /* have to back up */ - yy_cp = yy_last_accepting_cpos; - yy_current_state = yy_last_accepting_state; - yy_act = yy_accept[yy_current_state]; - } - - YY_DO_BEFORE_ACTION; - - -do_action: /* This label is used only to access EOF actions. */ - - - switch ( yy_act ) - { /* beginning of action switch */ - case 0: /* must back up */ - /* undo the effects of YY_DO_BEFORE_ACTION */ - *yy_cp = yy_hold_char; - yy_cp = yy_last_accepting_cpos; - yy_current_state = yy_last_accepting_state; - goto yy_find_action; - -case 1: -YY_RULE_SETUP -#line 65 "lex_config.l" -BEGIN(src); - YY_BREAK -case 2: -YY_RULE_SETUP -#line 66 "lex_config.l" -/* skip */ ; - YY_BREAK -case 3: -YY_RULE_SETUP -#line 67 "lex_config.l" -do_source(yytext); BEGIN(INITIAL); - YY_BREAK -case YY_STATE_EOF(INITIAL): -case YY_STATE_EOF(src): -#line 68 "lex_config.l" -if (do_eof()) yyterminate(); - YY_BREAK -case 4: -YY_RULE_SETUP -#line 70 "lex_config.l" -current_lineno++; - YY_BREAK -case 5: -YY_RULE_SETUP -#line 71 "lex_config.l" -/* skip */ ; - YY_BREAK -case 6: -YY_RULE_SETUP -#line 72 "lex_config.l" -/* skip */ ; - YY_BREAK -case 7: -YY_RULE_SETUP -#line 74 "lex_config.l" -return ANONYMOUS; - YY_BREAK -case 8: -YY_RULE_SETUP -#line 75 "lex_config.l" -return BIND; - YY_BREAK -case 9: -YY_RULE_SETUP -#line 76 "lex_config.l" -return CIS; - YY_BREAK -case 10: -YY_RULE_SETUP -#line 77 "lex_config.l" -return CARD; - YY_BREAK -case 11: -YY_RULE_SETUP -#line 78 "lex_config.l" -return CLASS; - YY_BREAK -case 12: -YY_RULE_SETUP -#line 79 "lex_config.l" -return DEFAULT; - YY_BREAK -case 13: -YY_RULE_SETUP -#line 80 "lex_config.l" -return DEVICE; - YY_BREAK -case 14: -YY_RULE_SETUP -#line 81 "lex_config.l" -return DTYPE; - YY_BREAK -case 15: -YY_RULE_SETUP -#line 82 "lex_config.l" -return EXCLUDE; - YY_BREAK -case 16: -YY_RULE_SETUP -#line 83 "lex_config.l" -return FUNCTION; - YY_BREAK -case 17: -YY_RULE_SETUP -#line 84 "lex_config.l" -return INCLUDE; - YY_BREAK -case 18: -YY_RULE_SETUP -#line 85 "lex_config.l" -return IRQ_NO; - YY_BREAK -case 19: -YY_RULE_SETUP -#line 86 "lex_config.l" -return JEDEC; - YY_BREAK -case 20: -YY_RULE_SETUP -#line 87 "lex_config.l" -return MANFID; - YY_BREAK -case 21: -YY_RULE_SETUP -#line 88 "lex_config.l" -return MEMORY; - YY_BREAK -case 22: -YY_RULE_SETUP -#line 89 "lex_config.l" -return MODULE; - YY_BREAK -case 23: -YY_RULE_SETUP -#line 90 "lex_config.l" -return MTD; - YY_BREAK -case 24: -YY_RULE_SETUP -#line 91 "lex_config.l" -return NEEDS_MTD; - YY_BREAK -case 25: -YY_RULE_SETUP -#line 92 "lex_config.l" -return OPTS; - YY_BREAK -case 26: -YY_RULE_SETUP -#line 93 "lex_config.l" -return PCI; - YY_BREAK -case 27: -YY_RULE_SETUP -#line 94 "lex_config.l" -return PORT; - YY_BREAK -case 28: -YY_RULE_SETUP -#line 95 "lex_config.l" -return REGION; - YY_BREAK -case 29: -YY_RULE_SETUP -#line 96 "lex_config.l" -return RESERVE; - YY_BREAK -case 30: -YY_RULE_SETUP -#line 97 "lex_config.l" -return TO; - YY_BREAK -case 31: -YY_RULE_SETUP -#line 98 "lex_config.l" -return TUPLE; - YY_BREAK -case 32: -YY_RULE_SETUP -#line 99 "lex_config.l" -return VERSION; - YY_BREAK -case 33: -YY_RULE_SETUP -#line 101 "lex_config.l" -return lex_number("1"); - YY_BREAK -case 34: -YY_RULE_SETUP -#line 102 "lex_config.l" -return lex_number("2"); - YY_BREAK -case 35: -YY_RULE_SETUP -#line 103 "lex_config.l" -return lex_number("3"); - YY_BREAK -case 36: -YY_RULE_SETUP -#line 104 "lex_config.l" -return lex_number("4"); - YY_BREAK -case 37: -YY_RULE_SETUP -#line 105 "lex_config.l" -return lex_number("5"); - YY_BREAK -case 38: -YY_RULE_SETUP -#line 106 "lex_config.l" -return lex_number("6"); - YY_BREAK -case 39: -YY_RULE_SETUP -#line 107 "lex_config.l" -return lex_number("7"); - YY_BREAK -case 40: -YY_RULE_SETUP -#line 108 "lex_config.l" -return lex_number("8"); - YY_BREAK -case 41: -YY_RULE_SETUP -#line 110 "lex_config.l" -return lex_number(yytext); - YY_BREAK -case 42: -YY_RULE_SETUP -#line 112 "lex_config.l" -return lex_number(yytext); - YY_BREAK -case 43: -YY_RULE_SETUP -#line 114 "lex_config.l" -return lex_string(yytext); - YY_BREAK -case 44: -YY_RULE_SETUP -#line 116 "lex_config.l" -return yytext[0]; - YY_BREAK -case 45: -YY_RULE_SETUP -#line 118 "lex_config.l" -ECHO; - YY_BREAK - - case YY_END_OF_BUFFER: - { - /* Amount of text matched not including the EOB char. */ - int yy_amount_of_matched_text = (int) (yy_cp - yytext_ptr) - 1; - - /* Undo the effects of YY_DO_BEFORE_ACTION. */ - *yy_cp = yy_hold_char; - YY_RESTORE_YY_MORE_OFFSET - - if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW ) - { - /* We're scanning a new file or input source. It's - * possible that this happened because the user - * just pointed yyin at a new source and called - * yylex(). If so, then we have to assure - * consistency between yy_current_buffer and our - * globals. Here is the right place to do so, because - * this is the first action (other than possibly a - * back-up) that will match for the new input source. - */ - yy_n_chars = yy_current_buffer->yy_n_chars; - yy_current_buffer->yy_input_file = yyin; - yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL; - } - - /* Note that here we test for yy_c_buf_p "<=" to the position - * of the first EOB in the buffer, since yy_c_buf_p will - * already have been incremented past the NUL character - * (since all states make transitions on EOB to the - * end-of-buffer state). Contrast this with the test - * in input(). - */ - if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] ) - { /* This was really a NUL. */ - yy_state_type yy_next_state; - - yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text; - - yy_current_state = yy_get_previous_state(); - - /* Okay, we're now positioned to make the NUL - * transition. We couldn't have - * yy_get_previous_state() go ahead and do it - * for us because it doesn't know how to deal - * with the possibility of jamming (and we don't - * want to build jamming into it because then it - * will run more slowly). - */ - - yy_next_state = yy_try_NUL_trans( yy_current_state ); - - yy_bp = yytext_ptr + YY_MORE_ADJ; - - if ( yy_next_state ) - { - /* Consume the NUL. */ - yy_cp = ++yy_c_buf_p; - yy_current_state = yy_next_state; - goto yy_match; - } - - else - { - yy_cp = yy_c_buf_p; - goto yy_find_action; - } - } - - else switch ( yy_get_next_buffer() ) - { - case EOB_ACT_END_OF_FILE: - { - yy_did_buffer_switch_on_eof = 0; - - if ( yywrap() ) - { - /* Note: because we've taken care in - * yy_get_next_buffer() to have set up - * yytext, we can now set up - * yy_c_buf_p so that if some total - * hoser (like flex itself) wants to - * call the scanner after we return the - * YY_NULL, it'll still work - another - * YY_NULL will get returned. - */ - yy_c_buf_p = yytext_ptr + YY_MORE_ADJ; - - yy_act = YY_STATE_EOF(YY_START); - goto do_action; - } - - else - { - if ( ! yy_did_buffer_switch_on_eof ) - YY_NEW_FILE; - } - break; - } - - case EOB_ACT_CONTINUE_SCAN: - yy_c_buf_p = - yytext_ptr + yy_amount_of_matched_text; - - yy_current_state = yy_get_previous_state(); - - yy_cp = yy_c_buf_p; - yy_bp = yytext_ptr + YY_MORE_ADJ; - goto yy_match; - - case EOB_ACT_LAST_MATCH: - yy_c_buf_p = - &yy_current_buffer->yy_ch_buf[yy_n_chars]; - - yy_current_state = yy_get_previous_state(); - - yy_cp = yy_c_buf_p; - yy_bp = yytext_ptr + YY_MORE_ADJ; - goto yy_find_action; - } - break; - } - - default: - YY_FATAL_ERROR( - "fatal flex scanner internal error--no action found" ); - } /* end of action switch */ - } /* end of scanning one token */ - } /* end of yylex */ - - -/* yy_get_next_buffer - try to read in a new buffer - * - * Returns a code representing an action: - * EOB_ACT_LAST_MATCH - - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position - * EOB_ACT_END_OF_FILE - end of file - */ - -static int yy_get_next_buffer() - { - register char *dest = yy_current_buffer->yy_ch_buf; - register char *source = yytext_ptr; - register int number_to_move, i; - int ret_val; - - if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] ) - YY_FATAL_ERROR( - "fatal flex scanner internal error--end of buffer missed" ); - - if ( yy_current_buffer->yy_fill_buffer == 0 ) - { /* Don't try to fill the buffer, so this is an EOF. */ - if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 ) - { - /* We matched a single character, the EOB, so - * treat this as a final EOF. - */ - return EOB_ACT_END_OF_FILE; - } - - else - { - /* We matched some text prior to the EOB, first - * process it. - */ - return EOB_ACT_LAST_MATCH; - } - } - - /* Try to read more data. */ - - /* First move last chars to start of buffer. */ - number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1; - - for ( i = 0; i < number_to_move; ++i ) - *(dest++) = *(source++); - - if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING ) - /* don't do the read, it's not guaranteed to return an EOF, - * just force an EOF - */ - yy_current_buffer->yy_n_chars = yy_n_chars = 0; - - else - { - int num_to_read = - yy_current_buffer->yy_buf_size - number_to_move - 1; - - while ( num_to_read <= 0 ) - { /* Not enough room in the buffer - grow it. */ -#ifdef YY_USES_REJECT - YY_FATAL_ERROR( -"input buffer overflow, can't enlarge buffer because scanner uses REJECT" ); -#else - - /* just a shorter name for the current buffer */ - YY_BUFFER_STATE b = yy_current_buffer; - - int yy_c_buf_p_offset = - (int) (yy_c_buf_p - b->yy_ch_buf); - - if ( b->yy_is_our_buffer ) - { - int new_size = b->yy_buf_size * 2; - - if ( new_size <= 0 ) - b->yy_buf_size += b->yy_buf_size / 8; - else - b->yy_buf_size *= 2; - - b->yy_ch_buf = (char *) - /* Include room in for 2 EOB chars. */ - yy_flex_realloc( (void *) b->yy_ch_buf, - b->yy_buf_size + 2 ); - } - else - /* Can't grow it, we don't own it. */ - b->yy_ch_buf = 0; - - if ( ! b->yy_ch_buf ) - YY_FATAL_ERROR( - "fatal error - scanner input buffer overflow" ); - - yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset]; - - num_to_read = yy_current_buffer->yy_buf_size - - number_to_move - 1; -#endif - } - - if ( num_to_read > YY_READ_BUF_SIZE ) - num_to_read = YY_READ_BUF_SIZE; - - /* Read in more data. */ - YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]), - yy_n_chars, num_to_read ); - - yy_current_buffer->yy_n_chars = yy_n_chars; - } - - if ( yy_n_chars == 0 ) - { - if ( number_to_move == YY_MORE_ADJ ) - { - ret_val = EOB_ACT_END_OF_FILE; - yyrestart( yyin ); - } - - else - { - ret_val = EOB_ACT_LAST_MATCH; - yy_current_buffer->yy_buffer_status = - YY_BUFFER_EOF_PENDING; - } - } - - else - ret_val = EOB_ACT_CONTINUE_SCAN; - - yy_n_chars += number_to_move; - yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR; - yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; - - yytext_ptr = &yy_current_buffer->yy_ch_buf[0]; - - return ret_val; - } - - -/* yy_get_previous_state - get the state just before the EOB char was reached */ - -static yy_state_type yy_get_previous_state() - { - register yy_state_type yy_current_state; - register char *yy_cp; - - yy_current_state = yy_start; - - for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp ) - { - register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); - if ( yy_accept[yy_current_state] ) - { - yy_last_accepting_state = yy_current_state; - yy_last_accepting_cpos = yy_cp; - } - while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) - { - yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 247 ) - yy_c = yy_meta[(unsigned int) yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - } - - return yy_current_state; - } - - -/* yy_try_NUL_trans - try to make a transition on the NUL character - * - * synopsis - * next_state = yy_try_NUL_trans( current_state ); - */ - -#ifdef YY_USE_PROTOS -static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state ) -#else -static yy_state_type yy_try_NUL_trans( yy_current_state ) -yy_state_type yy_current_state; -#endif - { - register int yy_is_jam; - register char *yy_cp = yy_c_buf_p; - - register YY_CHAR yy_c = 1; - if ( yy_accept[yy_current_state] ) - { - yy_last_accepting_state = yy_current_state; - yy_last_accepting_cpos = yy_cp; - } - while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) - { - yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 247 ) - yy_c = yy_meta[(unsigned int) yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - yy_is_jam = (yy_current_state == 246); - - return yy_is_jam ? 0 : yy_current_state; - } - - - - -#ifdef __cplusplus -static int yyinput() -#else -static int input() -#endif - { - int c; - - *yy_c_buf_p = yy_hold_char; - - if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR ) - { - /* yy_c_buf_p now points to the character we want to return. - * If this occurs *before* the EOB characters, then it's a - * valid NUL; if not, then we've hit the end of the buffer. - */ - if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] ) - /* This was really a NUL. */ - *yy_c_buf_p = '\0'; - - else - { /* need more input */ - int offset = yy_c_buf_p - yytext_ptr; - ++yy_c_buf_p; - - switch ( yy_get_next_buffer() ) - { - case EOB_ACT_LAST_MATCH: - /* This happens because yy_g_n_b() - * sees that we've accumulated a - * token and flags that we need to - * try matching the token before - * proceeding. But for input(), - * there's no matching to consider. - * So convert the EOB_ACT_LAST_MATCH - * to EOB_ACT_END_OF_FILE. - */ - - /* Reset buffer status. */ - yyrestart( yyin ); - - /* fall through */ - - case EOB_ACT_END_OF_FILE: - { - if ( yywrap() ) - return EOF; - - if ( ! yy_did_buffer_switch_on_eof ) - YY_NEW_FILE; -#ifdef __cplusplus - return yyinput(); -#else - return input(); -#endif - } - - case EOB_ACT_CONTINUE_SCAN: - yy_c_buf_p = yytext_ptr + offset; - break; - } - } - } - - c = *(unsigned char *) yy_c_buf_p; /* cast for 8-bit char's */ - *yy_c_buf_p = '\0'; /* preserve yytext */ - yy_hold_char = *++yy_c_buf_p; - - - return c; - } - - -#ifdef YY_USE_PROTOS -void yyrestart( FILE *input_file ) -#else -void yyrestart( input_file ) -FILE *input_file; -#endif - { - if ( ! yy_current_buffer ) - yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); - - yy_init_buffer( yy_current_buffer, input_file ); - yy_load_buffer_state(); - } - - -#ifdef YY_USE_PROTOS -void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) -#else -void yy_switch_to_buffer( new_buffer ) -YY_BUFFER_STATE new_buffer; -#endif - { - if ( yy_current_buffer == new_buffer ) - return; - - if ( yy_current_buffer ) - { - /* Flush out information for old buffer. */ - *yy_c_buf_p = yy_hold_char; - yy_current_buffer->yy_buf_pos = yy_c_buf_p; - yy_current_buffer->yy_n_chars = yy_n_chars; - } - - yy_current_buffer = new_buffer; - yy_load_buffer_state(); - - /* We don't actually know whether we did this switch during - * EOF (yywrap()) processing, but the only time this flag - * is looked at is after yywrap() is called, so it's safe - * to go ahead and always set it. - */ - yy_did_buffer_switch_on_eof = 1; - } - - -#ifdef YY_USE_PROTOS -void yy_load_buffer_state( void ) -#else -void yy_load_buffer_state() -#endif - { - yy_n_chars = yy_current_buffer->yy_n_chars; - yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos; - yyin = yy_current_buffer->yy_input_file; - yy_hold_char = *yy_c_buf_p; - } - - -#ifdef YY_USE_PROTOS -YY_BUFFER_STATE yy_create_buffer( FILE *file, int size ) -#else -YY_BUFFER_STATE yy_create_buffer( file, size ) -FILE *file; -int size; -#endif - { - YY_BUFFER_STATE b; - - b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); - if ( ! b ) - YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); - - b->yy_buf_size = size; - - /* yy_ch_buf has to be 2 characters longer than the size given because - * we need to put in 2 end-of-buffer characters. - */ - b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 ); - if ( ! b->yy_ch_buf ) - YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); - - b->yy_is_our_buffer = 1; - - yy_init_buffer( b, file ); - - return b; - } - - -#ifdef YY_USE_PROTOS -void yy_delete_buffer( YY_BUFFER_STATE b ) -#else -void yy_delete_buffer( b ) -YY_BUFFER_STATE b; -#endif - { - if ( ! b ) - return; - - if ( b == yy_current_buffer ) - yy_current_buffer = (YY_BUFFER_STATE) 0; - - if ( b->yy_is_our_buffer ) - yy_flex_free( (void *) b->yy_ch_buf ); - - yy_flex_free( (void *) b ); - } - - -#ifndef YY_ALWAYS_INTERACTIVE -#ifndef YY_NEVER_INTERACTIVE -extern int isatty YY_PROTO(( int )); -#endif -#endif - -#ifdef YY_USE_PROTOS -void yy_init_buffer( YY_BUFFER_STATE b, FILE *file ) -#else -void yy_init_buffer( b, file ) -YY_BUFFER_STATE b; -FILE *file; -#endif - - - { - yy_flush_buffer( b ); - - b->yy_input_file = file; - b->yy_fill_buffer = 1; - -#if YY_ALWAYS_INTERACTIVE - b->yy_is_interactive = 1; -#else -#if YY_NEVER_INTERACTIVE - b->yy_is_interactive = 0; -#else - b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; -#endif -#endif - } - - -#ifdef YY_USE_PROTOS -void yy_flush_buffer( YY_BUFFER_STATE b ) -#else -void yy_flush_buffer( b ) -YY_BUFFER_STATE b; -#endif - - { - if ( ! b ) - return; - - b->yy_n_chars = 0; - - /* We always need two end-of-buffer characters. The first causes - * a transition to the end-of-buffer state. The second causes - * a jam in that state. - */ - b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; - b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; - - b->yy_buf_pos = &b->yy_ch_buf[0]; - - b->yy_at_bol = 1; - b->yy_buffer_status = YY_BUFFER_NEW; - - if ( b == yy_current_buffer ) - yy_load_buffer_state(); - } - - -#ifndef YY_NO_SCAN_BUFFER -#ifdef YY_USE_PROTOS -YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size ) -#else -YY_BUFFER_STATE yy_scan_buffer( base, size ) -char *base; -yy_size_t size; -#endif - { - YY_BUFFER_STATE b; - - if ( size < 2 || - base[size-2] != YY_END_OF_BUFFER_CHAR || - base[size-1] != YY_END_OF_BUFFER_CHAR ) - /* They forgot to leave room for the EOB's. */ - return 0; - - b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); - if ( ! b ) - YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); - - b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ - b->yy_buf_pos = b->yy_ch_buf = base; - b->yy_is_our_buffer = 0; - b->yy_input_file = 0; - b->yy_n_chars = b->yy_buf_size; - b->yy_is_interactive = 0; - b->yy_at_bol = 1; - b->yy_fill_buffer = 0; - b->yy_buffer_status = YY_BUFFER_NEW; - - yy_switch_to_buffer( b ); - - return b; - } -#endif - - -#ifndef YY_NO_SCAN_STRING -#ifdef YY_USE_PROTOS -YY_BUFFER_STATE yy_scan_string( yyconst char *yy_str ) -#else -YY_BUFFER_STATE yy_scan_string( yy_str ) -yyconst char *yy_str; -#endif - { - int len; - for ( len = 0; yy_str[len]; ++len ) - ; - - return yy_scan_bytes( yy_str, len ); - } -#endif - - -#ifndef YY_NO_SCAN_BYTES -#ifdef YY_USE_PROTOS -YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len ) -#else -YY_BUFFER_STATE yy_scan_bytes( bytes, len ) -yyconst char *bytes; -int len; -#endif - { - YY_BUFFER_STATE b; - char *buf; - yy_size_t n; - int i; - - /* Get memory for full buffer, including space for trailing EOB's. */ - n = len + 2; - buf = (char *) yy_flex_alloc( n ); - if ( ! buf ) - YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); - - for ( i = 0; i < len; ++i ) - buf[i] = bytes[i]; - - buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR; - - b = yy_scan_buffer( buf, n ); - if ( ! b ) - YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); - - /* It's okay to grow etc. this buffer, and we should throw it - * away when we're done. - */ - b->yy_is_our_buffer = 1; - - return b; - } -#endif - - -#ifndef YY_NO_PUSH_STATE -#ifdef YY_USE_PROTOS -static void yy_push_state( int new_state ) -#else -static void yy_push_state( new_state ) -int new_state; -#endif - { - if ( yy_start_stack_ptr >= yy_start_stack_depth ) - { - yy_size_t new_size; - - yy_start_stack_depth += YY_START_STACK_INCR; - new_size = yy_start_stack_depth * sizeof( int ); - - if ( ! yy_start_stack ) - yy_start_stack = (int *) yy_flex_alloc( new_size ); - - else - yy_start_stack = (int *) yy_flex_realloc( - (void *) yy_start_stack, new_size ); - - if ( ! yy_start_stack ) - YY_FATAL_ERROR( - "out of memory expanding start-condition stack" ); - } - - yy_start_stack[yy_start_stack_ptr++] = YY_START; - - BEGIN(new_state); - } -#endif - - -#ifndef YY_NO_POP_STATE -static void yy_pop_state() - { - if ( --yy_start_stack_ptr < 0 ) - YY_FATAL_ERROR( "start-condition stack underflow" ); - - BEGIN(yy_start_stack[yy_start_stack_ptr]); - } -#endif - - -#ifndef YY_NO_TOP_STATE -static int yy_top_state() - { - return yy_start_stack[yy_start_stack_ptr - 1]; - } -#endif - -#ifndef YY_EXIT_FAILURE -#define YY_EXIT_FAILURE 2 -#endif - -#ifdef YY_USE_PROTOS -static void yy_fatal_error( yyconst char msg[] ) -#else -static void yy_fatal_error( msg ) -char msg[]; -#endif - { - (void) fprintf( stderr, "%s\n", msg ); - exit( YY_EXIT_FAILURE ); - } - - - -/* Redefine yyless() so it works in section 3 code. */ - -#undef yyless -#define yyless(n) \ - do \ - { \ - /* Undo effects of setting up yytext. */ \ - yytext[yyleng] = yy_hold_char; \ - yy_c_buf_p = yytext + n; \ - yy_hold_char = *yy_c_buf_p; \ - *yy_c_buf_p = '\0'; \ - yyleng = n; \ - } \ - while ( 0 ) - - -/* Internal utility routines. */ - -#ifndef yytext_ptr -#ifdef YY_USE_PROTOS -static void yy_flex_strncpy( char *s1, yyconst char *s2, int n ) -#else -static void yy_flex_strncpy( s1, s2, n ) -char *s1; -yyconst char *s2; -int n; -#endif - { - register int i; - for ( i = 0; i < n; ++i ) - s1[i] = s2[i]; - } -#endif - -#ifdef YY_NEED_STRLEN -#ifdef YY_USE_PROTOS -static int yy_flex_strlen( yyconst char *s ) -#else -static int yy_flex_strlen( s ) -yyconst char *s; -#endif - { - register int n; - for ( n = 0; s[n]; ++n ) - ; - - return n; - } -#endif - - -#ifdef YY_USE_PROTOS -static void *yy_flex_alloc( yy_size_t size ) -#else -static void *yy_flex_alloc( size ) -yy_size_t size; -#endif - { - return (void *) malloc( size ); - } - -#ifdef YY_USE_PROTOS -static void *yy_flex_realloc( void *ptr, yy_size_t size ) -#else -static void *yy_flex_realloc( ptr, size ) -void *ptr; -yy_size_t size; -#endif - { - /* The cast to (char *) in the following accommodates both - * implementations that use char* generic pointers, and those - * that use void* generic pointers. It works with the latter - * because both ANSI C and C++ allow castless assignment from - * any pointer type to void*, and deal with argument conversions - * as though doing an assignment. - */ - return (void *) realloc( (char *) ptr, size ); - } - -#ifdef YY_USE_PROTOS -static void yy_flex_free( void *ptr ) -#else -static void yy_flex_free( ptr ) -void *ptr; -#endif - { - free( ptr ); - } - -#if YY_MAIN -int main() - { - yylex(); - return 0; - } -#endif -#line 118 "lex_config.l" - - -#ifndef yywrap -int yywrap() { return 1; } -#endif - -/*====================================================================== - - Stuff to parse basic data types - -======================================================================*/ - -static int lex_number(char *s) -{ - yylval.num = strtoul(s, NULL, 0); - return NUMBER; -} - -static int lex_string(char *s) -{ - int n = strlen(s); - yylval.str = malloc(n-1); - strncpy(yylval.str, s+1, n-2); - yylval.str[n-2] = '\0'; - return STRING; -} - -/*====================================================================== - - Code to support nesting of configuration files - -======================================================================*/ - -#define MAX_SOURCE_DEPTH 4 -struct source_stack { - YY_BUFFER_STATE buffer; - char *filename; - int lineno, fileno; - FILE *file; - glob_t glob; -} source_stack[MAX_SOURCE_DEPTH]; -static int source_stack_ptr = 0; -static int parse_env = 0; - -static int get_glob(void) -{ - struct source_stack *s = &source_stack[source_stack_ptr]; - while (s->fileno < s->glob.gl_pathc) { - char *fn = s->glob.gl_pathv[s->fileno]; - s->file = fopen(fn, "r"); - if (s->file == NULL) { - if (strpbrk(fn, "?*[") == NULL) - syslog(LOG_INFO, "could not open '%s': %m", fn); - s->fileno++; - } else { - current_lineno = 1; - current_file = strdup(fn); - yy_switch_to_buffer(yy_create_buffer(s->file, YY_BUF_SIZE)); - source_stack_ptr++; - s->fileno++; - return 0; - } - } - return -1; -} - -static void do_source(char *fn) -{ - struct source_stack *s = &source_stack[source_stack_ptr]; - - if (source_stack_ptr >= MAX_SOURCE_DEPTH) { - syslog(LOG_INFO, "source depth limit exceeded"); - return; - } - glob(fn, GLOB_NOCHECK, NULL, &s->glob); - s->fileno = 0; - s->buffer = YY_CURRENT_BUFFER; - s->lineno = current_lineno; - s->filename = current_file; - get_glob(); -} - -static int do_eof(void) -{ - struct source_stack *s = &source_stack[--source_stack_ptr]; - if (source_stack_ptr < 0) { - if (parse_env == 0) { - char *t = getenv("PCMCIA_OPTS"); - if (t == NULL) return -1; - parse_env = 1; - source_stack_ptr = 0; - current_file = "PCMCIA_OPTS"; - current_lineno = 1; - yy_scan_string(t); - return 0; - } else - return -1; - } - fclose(s->file); - free(current_file); - yy_delete_buffer(YY_CURRENT_BUFFER); - if (get_glob() != 0) { - yy_switch_to_buffer(s->buffer); - current_lineno = s->lineno; - current_file = s->filename; - } - return 0; -} - -/*====================================================================== - - The main entry point... returns -1 if the file can't be accessed. - -======================================================================*/ -int yyparse(void); - -int parse_configfile(char *fn) -{ - FILE *f; - - f = fopen(fn, "r"); - if (!f) { - syslog(LOG_INFO, "could not open '%s': %m", fn); - return -1; - } - current_lineno = 1; - current_file = fn; - source_stack_ptr = 0; - yyrestart(f); - yyparse(); - fclose(f); - return 0; -} - diff --git a/mdk-stage1/pcmcia/lex_config.l b/mdk-stage1/pcmcia/lex_config.l new file mode 100644 index 000000000..54500c446 --- /dev/null +++ b/mdk-stage1/pcmcia/lex_config.l @@ -0,0 +1,224 @@ +/* Special state for handling include files */ +%x src + +%{ +/* + * Startup tool for non statically mapped PCMCIA sockets + * + * (C) 2005 Dominik Brodowski <linux@brodo.de> + * + * The initial developer of the original code is David A. Hinds + * <dahinds@users.sourceforge.net>. Portions created by David A. Hinds + * are Copyright (C) 1999 David A. Hinds. All Rights Reserved. + * + * License: GPL v2 + */ + +#undef src + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <string.h> +#include <syslog.h> + +#ifdef HAS_WORDEXP +#include <wordexp.h> +#else +#include <glob.h> +#endif + +#define src 1 + +#include "yacc_config.h" + +#define YY_NO_INPUT 1 /* mdk-stage1 */ +#define YY_NO_UNPUT 1 /* mdk-stage1 */ +extern int yyparse(void); /* mdk-stage1 */ + +/* For assembling nice error messages */ +char *current_file; +int current_lineno; + +static int lex_number(char *s); +static int lex_string(char *s); +static void do_source(char *fn); +static int do_eof(void); + +%} + +int [0-9]+ +hex 0x[0-9a-fA-F]+ +str \"([^"]|\\.)*\" + +%% + +source[ \t]+ BEGIN(src); return SOURCE; +<src>[^\n]+ do_source(yytext); BEGIN(INITIAL); +<<EOF>> if (do_eof()) yyterminate(); + +\n current_lineno++; +[ \t]* /* skip */ ; +[ ]*[#;].* /* skip */ ; + +exclude return EXCLUDE; +include return INCLUDE; +irq return IRQ_NO; +port return PORT; +memory return MEMORY; +module /* skip */ ; + +{int} return lex_number(yytext); + +{hex} return lex_number(yytext); + +{str} return lex_string(yytext); + +. return yytext[0]; + +%% + +#ifndef yywrap +int yywrap() { return 1; } +#endif + +/*====================================================================== + + Stuff to parse basic data types + +======================================================================*/ + +static int lex_number(char *s) +{ + yylval.num = strtoul(s, NULL, 0); + return NUMBER; +} + +static int lex_string(char *s) +{ + int n = strlen(s); + yylval.str = malloc(n-1); + strncpy(yylval.str, s+1, n-2); + yylval.str[n-2] = '\0'; + return STRING; +} + +/*====================================================================== + + Code to support nesting of configuration files + +======================================================================*/ + +#define MAX_SOURCE_DEPTH 4 +struct source_stack { + YY_BUFFER_STATE buffer; + char *filename; + int lineno, fileno; + FILE *file; +#ifdef HAS_WORDEXP + wordexp_t word; +#else + glob_t glob; +#endif +} source_stack[MAX_SOURCE_DEPTH]; +static int source_stack_ptr = 0; +static int parse_env = 0; + +static int get_glob(void) +{ + struct source_stack *s = &source_stack[source_stack_ptr]; +#ifdef HAS_WORDEXP + while (s->fileno < s->word.we_wordc) { + char *fn = s->word.we_wordv[s->fileno]; +#else + while (s->fileno < s->glob.gl_pathc) { + char *fn = s->glob.gl_pathv[s->fileno]; +#endif + s->file = fopen(fn, "r"); + if (s->file == NULL) { + if (strpbrk(fn, "?*[") == NULL) + syslog(LOG_ERR, "could not open '%s': %m", fn); + s->fileno++; + } else { + current_lineno = 1; + current_file = strdup(fn); + yy_switch_to_buffer(yy_create_buffer(s->file, YY_BUF_SIZE)); + source_stack_ptr++; + s->fileno++; + return 0; + } + } + return -1; +} + +static void do_source(char *fn) +{ + struct source_stack *s = &source_stack[source_stack_ptr]; + + if (source_stack_ptr >= MAX_SOURCE_DEPTH) { + syslog(LOG_ERR, "source depth limit exceeded"); + return; + } +#ifdef HAS_WORDEXP + wordexp(fn, &s->word, 0); +#else + glob(fn, GLOB_NOCHECK, NULL, &s->glob); +#endif + s->fileno = 0; + s->buffer = YY_CURRENT_BUFFER; + s->lineno = current_lineno; + s->filename = current_file; + get_glob(); +} + +static int do_eof(void) +{ + struct source_stack *s = &source_stack[--source_stack_ptr]; + if (source_stack_ptr < 0) { + if (parse_env == 0) { + char *t = getenv("PCMCIA_OPTS"); + if (t == NULL) return -1; + parse_env = 1; + source_stack_ptr = 0; + current_file = "PCMCIA_OPTS"; + current_lineno = 1; + yy_scan_string(t); + return 0; + } else + return -1; + } + fclose(s->file); + free(current_file); + yy_delete_buffer(YY_CURRENT_BUFFER); + if (get_glob() != 0) { + yy_switch_to_buffer(s->buffer); + current_lineno = s->lineno; + current_file = s->filename; + } + return 0; +} + +/*====================================================================== + + The main entry point... returns -1 if the file can't be accessed. + +======================================================================*/ + +int parse_configfile(char *fn) +{ + FILE *f; + + f = fopen(fn, "r"); + if (!f) { + syslog(LOG_ERR, "could not open '%s': %m", fn); + return -1; + } + current_lineno = 1; + current_file = fn; + source_stack_ptr = 0; + yyrestart(f); + yyparse(); + fclose(f); + return 0; +} + diff --git a/mdk-stage1/pcmcia/merge_from_pcitable b/mdk-stage1/pcmcia/merge_from_pcitable new file mode 100755 index 000000000..bb127640c --- /dev/null +++ b/mdk-stage1/pcmcia/merge_from_pcitable @@ -0,0 +1,37 @@ +#!/usr/bin/perl + +# This program will show on stdout yenta_socket stuff from pcitable +# which is not in probe.c + +use MDK::Common; +use lib qw(/usr/lib/libDrakX); +use run_program; +use c; + +my %probes; +foreach (cat_('probe.c')) { + if (/^pci_id_t pci_id\[\] = {/ ... /^};/) { + /^\s*{\s*0x([\da-f]+),\s*0x([\da-f]+),\s*"([^"]*)",\s*"([^"]*)"\s*}/ + and $probes{"$1$2"} = { vendor => $1, device => $2, driver => $3, name => $4 }; + } +} + +require '/usr/bin/merge2pcitable.pl'; + +my %pcitable; +my @yenta_socket_ids = grep { $_ } map { + /.*pci:v0000(....).*d0000(....).*/; + my $key = lc("$1$2"); + $pcitable{$key} = { vendor => $1, device => $2 }; + $key; + } grep { /^alias/ } run_program::get_stdout('/sbin/modinfo', 'yenta_socket'); + + +if (my @missing_in_probe_c = difference2(\@yenta_socket_ids, [ keys %probes ])) { + print "Missing in `probe.c':\n", + map { + my $p = $pcitable{$_}; + my $name = c::get_pci_description(hex($p->{vendor}), hex($p->{device})); + qq( { 0x$p->{vendor}, 0x$p->{device}, "yenta_socket", "$name" },\n); + } sort @missing_in_probe_c; +} diff --git a/mdk-stage1/pcmcia/pcmcia.h b/mdk-stage1/pcmcia/pcmcia.h index 1967b3497..ae7db247b 100644 --- a/mdk-stage1/pcmcia/pcmcia.h +++ b/mdk-stage1/pcmcia/pcmcia.h @@ -1,7 +1,7 @@ /* - * Guillaume Cottenceau (gc@mandrakesoft.com) + * Guillaume Cottenceau (gc) * - * Copyright 2000 MandrakeSoft + * Copyright 2000 Mandriva * * This software may be freely redistributed under the terms of the GNU * public license. @@ -16,6 +16,6 @@ #define _PCMCIA_CARDMGR_INTERFACE_H_ char * pcmcia_probe(void); -int cardmgr_call(void); +void pcmcia_socket_startup(int socket_no); #endif diff --git a/mdk-stage1/pcmcia/pcmcia_probe.c b/mdk-stage1/pcmcia/pcmcia_probe.c deleted file mode 100644 index 57651d75f..000000000 --- a/mdk-stage1/pcmcia/pcmcia_probe.c +++ /dev/null @@ -1,396 +0,0 @@ -/* - * Guillaume Cottenceau (gc@mandrakesoft.com) - * - * Copyright 2000 MandrakeSoft - * - * This software may be freely redistributed under the terms of the GNU - * public license. - * - * 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. - * - */ - -/* Code comes from /anonymous@projects.sourceforge.net:/pub/pcmcia-cs/pcmcia-cs-3.1.23.tar.bz2 - * - * Licence of this code follows: - - PCMCIA controller probe - - probe.c 1.52 2000/06/12 21:33:02 - - The contents of this file are subject to the Mozilla Public - License Version 1.1 (the "License"); you may not use this file - except in compliance with the License. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - Software distributed under the License is distributed on an "AS - IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or - implied. See the License for the specific language governing - rights and limitations under the License. - - The initial developer of the original code is David A. Hinds - <dahinds@users.sourceforge.net>. Portions created by David A. Hinds - are Copyright (C) 1999 David A. Hinds. All Rights Reserved. - - Alternatively, the contents of this file may be used under the - terms of the GNU Public License version 2 (the "GPL"), in which - case the provisions of the GPL are applicable instead of the - above. If you wish to allow the use of your version of this file - only under the terms of the GPL and not to allow others to use - your version of this file under the MPL, indicate your decision - by deleting the provisions above and replace them with the notice - and other provisions required by the GPL. If you do not delete - the provisions above, a recipient may use your version of this - file under either the MPL or the GPL. - -======================================================================*/ - -#include <sys/types.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <string.h> -#include <errno.h> -#include <fcntl.h> - -#include <pcmcia/config.h> - -#include "../log.h" -#include "pcmcia.h" - -/*====================================================================*/ - -typedef struct { - u_short vendor, device; - char *tag; - char *name; -} pci_id_t; - -pci_id_t pci_id[] = { - { 0x1013, 0x1100, "Cirrus Logic CL 6729", "Cirrus PD6729" }, - { 0x1013, 0x1110, "Cirrus Logic PD 6832", "Cirrus PD6832" }, - { 0x10b3, 0xb106, "SMC 34C90", "SMC 34C90" }, - { 0x1180, 0x0465, "Ricoh RL5C465", "Ricoh RL5C465" }, - { 0x1180, 0x0466, "Ricoh RL5C466", "Ricoh RL5C466" }, - { 0x1180, 0x0475, "Ricoh RL5C475", "Ricoh RL5C475" }, - { 0x1180, 0x0476, "Ricoh RL5C476", "Ricoh RL5C476" }, - { 0x1180, 0x0478, "Ricoh RL5C478", "Ricoh RL5C478" }, - { 0x104c, 0xac12, "Texas Instruments PCI1130", "TI 1130" }, - { 0x104c, 0xac13, "Texas Instruments PCI1031", "TI 1031" }, - { 0x104c, 0xac15, "Texas Instruments PCI1131", "TI 1131" }, - { 0x104c, 0xac16, "Texas Instruments PCI1250", "TI 1250A" }, - { 0x104c, 0xac17, "Texas Instruments PCI1220", "TI 1220" }, - { 0x104c, 0xac19, "Texas Instruments PCI1221", "TI 1221" }, - { 0x104c, 0xac1a, "Texas Instruments PCI1210", "TI 1210" }, - { 0x104c, 0xac1d, "Texas Instruments PCI1251A", "TI 1251A" }, - { 0x104c, 0xac1f, "Texas Instruments PCI1251B", "TI 1251B" }, - { 0x104c, 0xac1b, "Texas Instruments PCI1450", "TI 1450" }, - { 0x104c, 0xac1c, "Texas Instruments PCI1225", "TI 1225" }, - { 0x104c, 0xac1e, "Texas Instruments PCI1211", "TI 1211" }, - { 0x104c, 0xac50, "Texas Instruments PCI1410", "TI 1410" }, - { 0x104c, 0xac51, "Texas Instruments PCI1420", "TI 1420" }, - { 0x1217, 0x6729, "O2 Micro 6729", "O2Micro OZ6729" }, - { 0x1217, 0x673a, "O2 Micro 6730", "O2Micro OZ6730" }, - { 0x1217, 0x6832, "O2 Micro 6832/6833", "O2Micro OZ6832/OZ6833" }, - { 0x1217, 0x6836, "O2 Micro 6836/6860", "O2Micro OZ6836/OZ6860" }, - { 0x1217, 0x6872, "O2 Micro 6812", "O2Micro OZ6812" }, - { 0x1179, 0x0603, "Toshiba ToPIC95-A", "Toshiba ToPIC95-A" }, - { 0x1179, 0x060a, "Toshiba ToPIC95-B", "Toshiba ToPIC95-B" }, - { 0x1179, 0x060f, "Toshiba ToPIC97", "Toshiba ToPIC97" }, - { 0x1179, 0x0617, "Toshiba ToPIC100", "Toshiba ToPIC100" }, - { 0x119b, 0x1221, "Omega Micro 82C092G", "Omega Micro 82C092G" }, - { 0x8086, 0x1221, "Intel 82092AA", "Intel 82092AA" } -}; -#define PCI_COUNT (sizeof(pci_id)/sizeof(pci_id_t)) - -static int pci_probe(void) -{ - char s[256], *name = NULL; - u_int device, vendor, i; - FILE *f; - - log_message("PCMCIA: probing PCI bus.."); - - f = fopen("/proc/bus/pci/devices", "r"); - - if (!f) { - log_message("where are you going without /proc/bus/pci/devices ??"); - return -1; - } - - while (fgets(s, 256, f) != NULL) { - u_int n = strtoul(s+5, NULL, 16); - vendor = (n >> 16); device = (n & 0xffff); - for (i = 0; i < PCI_COUNT; i++) - if ((vendor == pci_id[i].vendor) && - (device == pci_id[i].device)) break; - if (i < PCI_COUNT) { - name = pci_id[i].name; - break; - } - } - - fclose(f); - - if (name) { - log_message("\t%s found, 2 sockets.", name); - return 0; - } else { - log_message("\tnot found."); - return -ENODEV; - } -} - -/*====================================================================*/ - -#include <sys/io.h> -typedef u_short ioaddr_t; - -#include "i82365.h" -#include "cirrus.h" -#include "vg468.h" - -static ioaddr_t i365_base = 0x03e0; - -static u_char i365_get(u_short sock, u_short reg) -{ - u_char val = I365_REG(sock, reg); - outb(val, i365_base); val = inb(i365_base+1); - return val; -} - -static void i365_set(u_short sock, u_short reg, u_char data) -{ - u_char val = I365_REG(sock, reg); - outb(val, i365_base); outb(data, i365_base+1); -} - -static void i365_bset(u_short sock, u_short reg, u_char mask) -{ - u_char d = i365_get(sock, reg); - d |= mask; - i365_set(sock, reg, d); -} - -static void i365_bclr(u_short sock, u_short reg, u_char mask) -{ - u_char d = i365_get(sock, reg); - d &= ~mask; - i365_set(sock, reg, d); -} - -static int i365_probe(void) -{ - int val, sock, done; - char *name = "i82365sl"; - - log_message("PCMCIA: probing for Intel PCIC (ISA).."); - - sock = done = 0; - ioperm(i365_base, 4, 1); - ioperm(0x80, 1, 1); - for (; sock < 2; sock++) { - val = i365_get(sock, I365_IDENT); - switch (val) { - case 0x82: - name = "i82365sl A step"; - break; - case 0x83: - name = "i82365sl B step"; - break; - case 0x84: - name = "VLSI 82C146"; - break; - case 0x88: case 0x89: case 0x8a: - name = "IBM Clone"; - break; - case 0x8b: case 0x8c: - break; - default: - done = 1; - } - if (done) break; - } - - if (sock == 0) { - log_message("\tnot found."); - return -ENODEV; - } - - if ((sock == 2) && (strcmp(name, "VLSI 82C146") == 0)) - name = "i82365sl DF"; - - /* Check for Vadem chips */ - outb(0x0e, i365_base); - outb(0x37, i365_base); - i365_bset(0, VG468_MISC, VG468_MISC_VADEMREV); - val = i365_get(0, I365_IDENT); - if (val & I365_IDENT_VADEM) { - if ((val & 7) < 4) - name = "Vadem VG-468"; - else - name = "Vadem VG-469"; - i365_bclr(0, VG468_MISC, VG468_MISC_VADEMREV); - } - - /* Check for Cirrus CL-PD67xx chips */ - i365_set(0, PD67_CHIP_INFO, 0); - val = i365_get(0, PD67_CHIP_INFO); - if ((val & PD67_INFO_CHIP_ID) == PD67_INFO_CHIP_ID) { - val = i365_get(0, PD67_CHIP_INFO); - if ((val & PD67_INFO_CHIP_ID) == 0) { - if (val & PD67_INFO_SLOTS) - name = "Cirrus CL-PD672x"; - else { - name = "Cirrus CL-PD6710"; - sock = 1; - } - i365_set(0, PD67_EXT_INDEX, 0xe5); - if (i365_get(0, PD67_EXT_INDEX) != 0xe5) - name = "VIA VT83C469"; - } - } - - log_message("\t%s found, %d sockets.", name, sock); - return 0; - -} /* i365_probe */ - - -/*====================================================================*/ - -#include "tcic.h" - -static u_char tcic_getb(ioaddr_t base, u_char reg) -{ - u_char val = inb(base+reg); - return val; -} - -static void tcic_setb(ioaddr_t base, u_char reg, u_char data) -{ - outb(data, base+reg); -} - -static u_short tcic_getw(ioaddr_t base, u_char reg) -{ - u_short val = inw(base+reg); - return val; -} - -static void tcic_setw(ioaddr_t base, u_char reg, u_short data) -{ - outw(data, base+reg); -} - -static u_short tcic_aux_getw(ioaddr_t base, u_short reg) -{ - u_char mode = (tcic_getb(base, TCIC_MODE) & TCIC_MODE_PGMMASK) | reg; - tcic_setb(base, TCIC_MODE, mode); - return tcic_getw(base, TCIC_AUX); -} - -static void tcic_aux_setw(ioaddr_t base, u_short reg, u_short data) -{ - u_char mode = (tcic_getb(base, TCIC_MODE) & TCIC_MODE_PGMMASK) | reg; - tcic_setb(base, TCIC_MODE, mode); - tcic_setw(base, TCIC_AUX, data); -} - -static int get_tcic_id(ioaddr_t base) -{ - u_short id; - tcic_aux_setw(base, TCIC_AUX_TEST, TCIC_TEST_DIAG); - id = tcic_aux_getw(base, TCIC_AUX_ILOCK); - id = (id & TCIC_ILOCKTEST_ID_MASK) >> TCIC_ILOCKTEST_ID_SH; - tcic_aux_setw(base, TCIC_AUX_TEST, 0); - return id; -} - -static int tcic_probe_at(ioaddr_t base) -{ - int i; - u_short old; - - /* Anything there?? */ - for (i = 0; i < 0x10; i += 2) - if (tcic_getw(base, i) == 0xffff) - return -1; - - log_message("\tat %#3.3x: ", base); - - /* Try to reset the chip */ - tcic_setw(base, TCIC_SCTRL, TCIC_SCTRL_RESET); - tcic_setw(base, TCIC_SCTRL, 0); - - /* Can we set the addr register? */ - old = tcic_getw(base, TCIC_ADDR); - tcic_setw(base, TCIC_ADDR, 0); - if (tcic_getw(base, TCIC_ADDR) != 0) { - tcic_setw(base, TCIC_ADDR, old); - return -2; - } - - tcic_setw(base, TCIC_ADDR, 0xc3a5); - if (tcic_getw(base, TCIC_ADDR) != 0xc3a5) - return -3; - - return 2; -} - -static int tcic_probe(void) -{ - int sock, id; - - log_message("PCMCIA: probing for Databook TCIC-2 (ISA).."); - - ioperm(TCIC_BASE, 16, 1); - ioperm(0x80, 1, 1); - sock = tcic_probe_at(TCIC_BASE); - - if (sock <= 0) { - log_message("\tnot found."); - return -ENODEV; - } - - id = get_tcic_id(TCIC_BASE); - switch (id) { - case TCIC_ID_DB86082: - log_message("DB86082"); break; - case TCIC_ID_DB86082A: - log_message("DB86082A"); break; - case TCIC_ID_DB86084: - log_message("DB86084"); break; - case TCIC_ID_DB86084A: - log_message("DB86084A"); break; - case TCIC_ID_DB86072: - log_message("DB86072"); break; - case TCIC_ID_DB86184: - log_message("DB86184"); break; - case TCIC_ID_DB86082B: - log_message("DB86082B"); break; - default: - log_message("Unknown TCIC-2 ID 0x%02x", id); - } - log_message("\tfound at %#6x, %d sockets.\n", TCIC_BASE, sock); - - return 0; - -} /* tcic_probe */ - - -/*====================================================================*/ - -char * pcmcia_probe(void) -{ - if (!pci_probe()) - return "i82365"; - else if (!i365_probe()) - return "i82365"; - else if (!tcic_probe()) - return "tcic"; - else - return NULL; -} diff --git a/mdk-stage1/pcmcia/probe.c b/mdk-stage1/pcmcia/probe.c new file mode 100644 index 000000000..240fe3a17 --- /dev/null +++ b/mdk-stage1/pcmcia/probe.c @@ -0,0 +1,426 @@ +/* + * Guillaume Cottenceau (gc) + * + * Copyright 2000-2001 Mandriva + * + * This software may be freely redistributed under the terms of the GNU + * public license. + * + * 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. + * + * + * Code comes from /anonymous@projects.sourceforge.net:/pub/pcmcia-cs/pcmcia-cs-3.1.29.tar.bz2 + * + * FIXME: resync with latest pcmcia-cs-3.2.8 or with pcmciautils-0.18 (which uses sysfs) + * + */ + +/*====================================================================== + + PCMCIA controller probe + + probe.c 1.55 2001/08/24 12:19:20 + + The contents of this file are subject to the Mozilla Public + License Version 1.1 (the "License"); you may not use this file + except in compliance with the License. You may obtain a copy of + the License at http://www.mozilla.org/MPL/ + + Software distributed under the License is distributed on an "AS + IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + implied. See the License for the specific language governing + rights and limitations under the License. + + The initial developer of the original code is David A. Hinds + <dahinds@users.sourceforge.net>. Portions created by David A. Hinds + are Copyright (C) 1999 David A. Hinds. All Rights Reserved. + + Alternatively, the contents of this file may be used under the + terms of the GNU General Public License version 2 (the "GPL"), in + which case the provisions of the GPL are applicable instead of the + above. If you wish to allow the use of your version of this file + only under the terms of the GPL and not to allow others to use + your version of this file under the MPL, indicate your decision + by deleting the provisions above and replace them with the notice + and other provisions required by the GPL. If you do not delete + the provisions above, a recipient may use your version of this + file under either the MPL or the GPL. + +======================================================================*/ + +#include <sys/types.h> +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <string.h> +#include <errno.h> +#include <fcntl.h> + +#include "log.h" +#include "pcmcia.h" + +/*====================================================================*/ + +typedef struct { + u_short vendor, device; + char *modname; + char *name; +} pci_id_t; + +pci_id_t pci_id[] = { + { 0x1013, 0x1100, "pd6729", "Cirrus Logic CL 6729" }, + { 0x1013, 0x1110, "yenta_socket", "Cirrus Logic PD 6832" }, + { 0x104c, 0x8011, "yenta_socket", "" }, + { 0x104c, 0x8031, "yenta_socket", "Texas Instruments|PCIxx21/x515 Cardbus Controller" }, + { 0x104c, 0x8036, "yenta_socket", "Texas Instruments|PCI6515 Cardbus Controller" }, + { 0x104c, 0x8039, "yenta_socket", "Texas Instruments|PCIxx12 Cardbus Controller " }, + { 0x104c, 0xac12, "yenta_socket", "Texas Instruments PCI1130" }, + { 0x104c, 0xac13, "yenta_socket", "Texas Instruments PCI1031" }, + { 0x104c, 0xac15, "yenta_socket", "Texas Instruments PCI1131" }, + { 0x104c, 0xac16, "yenta_socket", "Texas Instruments PCI1250" }, + { 0x104c, 0xac17, "yenta_socket", "Texas Instruments PCI1220" }, + { 0x104c, 0xac19, "yenta_socket", "Texas Instruments PCI1221" }, + { 0x104c, 0xac1a, "yenta_socket", "Texas Instruments PCI1210" }, + { 0x104c, 0xac1b, "yenta_socket", "Texas Instruments PCI1450" }, + { 0x104c, 0xac1c, "yenta_socket", "Texas Instruments PCI1225" }, + { 0x104c, 0xac1d, "yenta_socket", "Texas Instruments PCI1251A" }, + { 0x104c, 0xac1e, "yenta_socket", "Texas Instruments PCI1211" }, + { 0x104c, 0xac1f, "yenta_socket", "Texas Instruments PCI1251B" }, + { 0x104c, 0xac40, "yenta_socket", "Texas Instruments PCI4450" }, + { 0x104c, 0xac41, "yenta_socket", "Texas Instruments PCI4410" }, + { 0x104c, 0xac42, "yenta_socket", "Texas Instruments PCI4451" }, + { 0x104c, 0xac44, "yenta_socket", "Texas Instruments PCI4510" }, + { 0x104c, 0xac46, "yenta_socket", "Texas Instruments PCI4520" }, + { 0x104c, 0xac47, "yenta_socket", "Texas Instruments PCI7510" }, + { 0x104c, 0xac48, "yenta_socket", "Texas Instruments PCI7610" }, + { 0x104c, 0xac49, "yenta_socket", "Texas Instruments PCI7410" }, + { 0x104c, 0xac50, "yenta_socket", "Texas Instruments PCI1410" }, + { 0x104c, 0xac51, "yenta_socket", "Texas Instruments PCI1420" }, + { 0x104c, 0xac52, "yenta_socket", "Texas Instruments PCI1451" }, + { 0x104c, 0xac54, "yenta_socket", "Texas Instruments PCI1620" }, + { 0x104c, 0xac55, "yenta_socket", "Texas Instruments PCI1520" }, + { 0x104c, 0xac56, "yenta_socket", "Texas Instruments PCI1510" }, + { 0x104c, 0xac8d, "yenta_socket", "Texas Instruments|PCI7620" }, + { 0x104c, 0xac8e, "yenta_socket", "Texas Instruments|PCI7420 CardBus Controller" }, + { 0x104c, 0xac8e, "yenta_socket", "Texas Instruments PCI7420" }, + { 0x10b3, 0xb106, "yenta_socket", "SMC 34C90" }, + { 0x1179, 0x0603, "pd6729", "Toshiba ToPIC95-A" }, + { 0x1179, 0x060a, "yenta_socket", "Toshiba ToPIC95-B" }, + { 0x1179, 0x060f, "yenta_socket", "Toshiba ToPIC97" }, + { 0x1179, 0x0617, "yenta_socket", "Toshiba ToPIC100" }, + { 0x1180, 0x0465, "yenta_socket", "Ricoh RL5C465" }, + { 0x1180, 0x0466, "yenta_socket", "Ricoh RL5C466" }, + { 0x1180, 0x0475, "yenta_socket", "Ricoh RL5C475" }, + { 0x1180, 0x0476, "yenta_socket", "Ricoh RL5C476" }, + { 0x1180, 0x0477, "yenta_socket", "Ricoh RL5C477" }, + { 0x1180, 0x0478, "yenta_socket", "Ricoh RL5C478" }, + { 0x119b, 0x1221, "pd6729", "Omega Micro 82C092G" }, + { 0x1524, 0x1211, "yenta_socket", "ENE 1211" }, + { 0x1524, 0x1225, "yenta_socket", "ENE 1225" }, + { 0x1524, 0x1410, "yenta_socket", "ENE 1410" }, + { 0x1524, 0x1411, "yenta_socket", "ENE Technology CB1411" }, + { 0x1524, 0x1412, "yenta_socket", "ENE Technology Inc|CB-712/4 Cardbus Controller " }, + { 0x1524, 0x1420, "yenta_socket", "ENE 1420" }, + { 0x1524, 0x1421, "yenta_socket", "ENE Technology Inc|CB-720/2/4 Cardbus Controller" }, + { 0x1524, 0x1422, "yenta_socket", "ENE Technology Inc|CB-722/4 Cardbus Controller" }, + { 0x8086, 0x1221, "i82092", "Intel 82092AA_0" }, + { 0x8086, 0x1222, "i82092", "Intel 82092AA_1" }, +}; +#define PCI_COUNT (sizeof(pci_id)/sizeof(pci_id_t)) + +char * driver = NULL; + +static int pci_probe(void) +{ + char s[256], *name = NULL; + u_int device, vendor, i; + FILE *f; + + log_message("PCMCIA: probing PCI bus.."); + + if ((f = fopen("/proc/bus/pci/devices", "r")) != NULL) { + while (fgets(s, 256, f) != NULL) { + u_int n = strtoul(s+5, NULL, 16); + vendor = (n >> 16); device = (n & 0xffff); + if (vendor == 0x1217) { + driver = "yenta_socket"; + name = "O2 Micro|PCMCIA Controller"; + break; + } + for (i = 0; i < PCI_COUNT; i++) + if ((vendor == pci_id[i].vendor) && + (device == pci_id[i].device)) break; + if (i < PCI_COUNT) { + name = pci_id[i].name; + driver = pci_id[i].modname; + } + } + } + fclose(f); + + if (name) { + log_message("\t%s found, 2 sockets (driver %s).", name, driver); + return 0; + } else { + log_message("\tnot found."); + return -ENODEV; + } +} + +/*====================================================================*/ + +#include <sys/io.h> +typedef u_short ioaddr_t; + +#include "i82365.h" +#include "cirrus.h" +#include "vg468.h" + +static ioaddr_t i365_base = 0x03e0; + +static u_char i365_get(u_short sock, u_short reg) +{ + u_char val = I365_REG(sock, reg); + outb(val, i365_base); val = inb(i365_base+1); + return val; +} + +static void i365_set(u_short sock, u_short reg, u_char data) +{ + u_char val = I365_REG(sock, reg); + outb(val, i365_base); outb(data, i365_base+1); +} + +static void i365_bset(u_short sock, u_short reg, u_char mask) +{ + u_char d = i365_get(sock, reg); + d |= mask; + i365_set(sock, reg, d); +} + +static void i365_bclr(u_short sock, u_short reg, u_char mask) +{ + u_char d = i365_get(sock, reg); + d &= ~mask; + i365_set(sock, reg, d); +} + +int i365_probe(void) +{ + int val, sock, done; + char *name = "i82365sl"; + + log_message("PCMCIA: probing for Intel PCIC (ISA).."); + + sock = done = 0; + if (ioperm(i365_base, 4, 1)) { + log_perror("PCMCIA: ioperm"); + return -1; + } + ioperm(0x80, 1, 1); + for (; sock < 2; sock++) { + val = i365_get(sock, I365_IDENT); + switch (val) { + case 0x82: + name = "i82365sl A step"; + break; + case 0x83: + name = "i82365sl B step"; + break; + case 0x84: + name = "VLSI 82C146"; + break; + case 0x88: case 0x89: case 0x8a: + name = "IBM Clone"; + break; + case 0x8b: case 0x8c: + break; + default: + done = 1; + } + if (done) break; + } + + if (sock == 0) { + log_message("\tnot found."); + return -ENODEV; + } + + if ((sock == 2) && (strcmp(name, "VLSI 82C146") == 0)) + name = "i82365sl DF"; + + /* Check for Vadem chips */ + outb(0x0e, i365_base); + outb(0x37, i365_base); + i365_bset(0, VG468_MISC, VG468_MISC_VADEMREV); + val = i365_get(0, I365_IDENT); + if (val & I365_IDENT_VADEM) { + if ((val & 7) < 4) + name = "Vadem VG-468"; + else + name = "Vadem VG-469"; + i365_bclr(0, VG468_MISC, VG468_MISC_VADEMREV); + } + + /* Check for Cirrus CL-PD67xx chips */ + i365_set(0, PD67_CHIP_INFO, 0); + val = i365_get(0, PD67_CHIP_INFO); + if ((val & PD67_INFO_CHIP_ID) == PD67_INFO_CHIP_ID) { + val = i365_get(0, PD67_CHIP_INFO); + if ((val & PD67_INFO_CHIP_ID) == 0) { + if (val & PD67_INFO_SLOTS) + name = "Cirrus CL-PD672x"; + else { + name = "Cirrus CL-PD6710"; + sock = 1; + } + i365_set(0, PD67_EXT_INDEX, 0xe5); + if (i365_get(0, PD67_EXT_INDEX) != 0xe5) + name = "VIA VT83C469"; + } + } + + printf("\t%s found, %d sockets.\n", name, sock); + return 0; + +} /* i365_probe */ + +/*====================================================================*/ + +#include "tcic.h" + +static u_char tcic_getb(ioaddr_t base, u_char reg) +{ + u_char val = inb(base+reg); + return val; +} + +static void tcic_setb(ioaddr_t base, u_char reg, u_char data) +{ + outb(data, base+reg); +} + +static u_short tcic_getw(ioaddr_t base, u_char reg) +{ + u_short val = inw(base+reg); + return val; +} + +static void tcic_setw(ioaddr_t base, u_char reg, u_short data) +{ + outw(data, base+reg); +} + +static u_short tcic_aux_getw(ioaddr_t base, u_short reg) +{ + u_char mode = (tcic_getb(base, TCIC_MODE) & TCIC_MODE_PGMMASK) | reg; + tcic_setb(base, TCIC_MODE, mode); + return tcic_getw(base, TCIC_AUX); +} + +static void tcic_aux_setw(ioaddr_t base, u_short reg, u_short data) +{ + u_char mode = (tcic_getb(base, TCIC_MODE) & TCIC_MODE_PGMMASK) | reg; + tcic_setb(base, TCIC_MODE, mode); + tcic_setw(base, TCIC_AUX, data); +} + +static int get_tcic_id(ioaddr_t base) +{ + u_short id; + tcic_aux_setw(base, TCIC_AUX_TEST, TCIC_TEST_DIAG); + id = tcic_aux_getw(base, TCIC_AUX_ILOCK); + id = (id & TCIC_ILOCKTEST_ID_MASK) >> TCIC_ILOCKTEST_ID_SH; + tcic_aux_setw(base, TCIC_AUX_TEST, 0); + return id; +} + +int tcic_probe_at(ioaddr_t base) +{ + int i; + u_short old; + + /* Anything there?? */ + for (i = 0; i < 0x10; i += 2) + if (tcic_getw(base, i) == 0xffff) + return -1; + + log_message("\tat %#3.3x: ", base); fflush(stdout); + + /* Try to reset the chip */ + tcic_setw(base, TCIC_SCTRL, TCIC_SCTRL_RESET); + tcic_setw(base, TCIC_SCTRL, 0); + + /* Can we set the addr register? */ + old = tcic_getw(base, TCIC_ADDR); + tcic_setw(base, TCIC_ADDR, 0); + if (tcic_getw(base, TCIC_ADDR) != 0) { + tcic_setw(base, TCIC_ADDR, old); + return -2; + } + + tcic_setw(base, TCIC_ADDR, 0xc3a5); + if (tcic_getw(base, TCIC_ADDR) != 0xc3a5) + return -3; + + return 2; +} + +int tcic_probe(void) +{ + int sock, id; + + log_message("PCMCIA: probing for Databook TCIC-2 (ISA).."); fflush(stdout); + + if (ioperm(TCIC_BASE, 16, 1)) { + log_perror("PCMCIA: ioperm"); + return -1; + } + ioperm(0x80, 1, 1); + sock = tcic_probe_at(TCIC_BASE); + + if (sock <= 0) { + log_message("\tnot found."); + return -ENODEV; + } + + id = get_tcic_id(TCIC_BASE); + switch (id) { + case TCIC_ID_DB86082: + log_message("DB86082"); break; + case TCIC_ID_DB86082A: + log_message("DB86082A"); break; + case TCIC_ID_DB86084: + log_message("DB86084"); break; + case TCIC_ID_DB86084A: + log_message("DB86084A"); break; + case TCIC_ID_DB86072: + log_message("DB86072"); break; + case TCIC_ID_DB86184: + log_message("DB86184"); break; + case TCIC_ID_DB86082B: + log_message("DB86082B"); break; + default: + log_message("Unknown TCIC-2 ID 0x%02x", id); + } + log_message(" found at %#6x, %d sockets.", TCIC_BASE, sock); + return 0; + +} /* tcic_probe */ + + +char * pcmcia_probe(void) +{ + if (!pci_probe()) + return driver; +#if !defined(__x86_64__) + else if (!i365_probe()) + return "pd6729"; + else if (!tcic_probe()) + return "tcic"; +#endif + else + return NULL; +} diff --git a/mdk-stage1/pcmcia/startup.c b/mdk-stage1/pcmcia/startup.c new file mode 100644 index 000000000..e9004484a --- /dev/null +++ b/mdk-stage1/pcmcia/startup.c @@ -0,0 +1,271 @@ +/* + * Startup tool for non statically mapped PCMCIA sockets + * + * (C) 2005 Dominik Brodowski <linux@brodo.de> + * + * The initial developer of the original code is David A. Hinds + * <dahinds@users.sourceforge.net>. Portions created by David A. Hinds + * are Copyright (C) 1999 David A. Hinds. All Rights Reserved. + * + * License: GPL v2 + */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <errno.h> +#include <syslog.h> +#include <unistd.h> + +#include <sysfs/libsysfs.h> + +#include "startup.h" + +/* uncomment for debug output */ +#ifdef DEBUG +#define dprintf printf +#else +#define dprintf(...) do { } while(0); +#endif + +/* Linked list of resource adjustments */ +struct adjust_list_t *root_adjust = NULL; + +/* path for config file, device scripts */ +static char *configpath = "/etc/pcmcia"; + +enum { + RESOURCE_MEM, + RESOURCE_IO, + MAX_RESOURCE_FILES +}; + + +static const char *resource_files[MAX_RESOURCE_FILES] = { + [RESOURCE_MEM] = "available_resources_mem", + [RESOURCE_IO] = "available_resources_io", +}; + +#define PATH_TO_SOCKET "/sys/class/pcmcia_socket/" + + +static int add_available_resource(unsigned int socket_no, unsigned int type, + unsigned int action, + unsigned long start, unsigned long end) +{ + char file[SYSFS_PATH_MAX]; + char content[SYSFS_PATH_MAX]; + struct sysfs_attribute *attr; + int ret; + size_t len; + + if (type >= MAX_RESOURCE_FILES) + return -EINVAL; + + if (end <= start) + return -EINVAL; + + dprintf("%d %d %d 0x%lx 0x%lx\n", socket_no, type, action, start, end); + + snprintf(file, SYSFS_PATH_MAX, PATH_TO_SOCKET "pcmcia_socket%u/%s", + socket_no, resource_files[type]); + + switch(action) { + case ADD_MANAGED_RESOURCE: + len = snprintf(content, SYSFS_PATH_MAX, + "0x%08lx - 0x%08lx", start, end); + break; + + case REMOVE_MANAGED_RESOURCE: + len = snprintf(content, SYSFS_PATH_MAX, + "- 0x%08lx - 0x%08lx", start, end); + break; + + default: + return -EINVAL; + } + + dprintf("content is %s\n", content); + + dprintf("file is %s\n", file); + + attr = sysfs_open_attribute(file); + if (!attr) + return -ENODEV; + + dprintf("open, len %d\n", len); + + ret = sysfs_write_attribute(attr, content, len); + + dprintf("ret is %d\n", ret); + + sysfs_close_attribute(attr); + + return (ret); +} + +static int setup_done(unsigned int socket_no) +{ + int ret; + char file[SYSFS_PATH_MAX]; + struct sysfs_attribute *attr; + + snprintf(file, SYSFS_PATH_MAX, PATH_TO_SOCKET + "pcmcia_socket%u/available_resources_setup_done", + socket_no); + + attr = sysfs_open_attribute(file); + if (!attr) + return -ENODEV; + + ret = sysfs_write_attribute(attr, "42", 2); + + sysfs_close_attribute(attr); + + return (ret); +} + + +static int disallow_irq(unsigned int socket_no, unsigned int irq) +{ + char file[SYSFS_PATH_MAX]; + char content[SYSFS_PATH_MAX]; + struct sysfs_attribute *attr; + unsigned int mask = 0xfff; + unsigned int new_mask; + int ret; + size_t len; + + if (irq >= 32) + return -EINVAL; + + len = snprintf(file, SYSFS_PATH_MAX, PATH_TO_SOCKET + "pcmcia_socket%u/card_irq_mask", + socket_no); + dprintf("file is %s\n", file); + + attr = sysfs_open_attribute(file); + if (!attr) + return -ENODEV; + + dprintf("open, len %d\n", len); + + ret = sysfs_read_attribute(attr); + if (ret) { + ret = -EINVAL; + goto out; + } + + if (!attr->value || (attr->len < 6)) { + ret = -EIO; + goto out; + } + + ret = sscanf(attr->value, "0x%x\n", &mask); + + new_mask = 1 << irq; + + mask &= ~new_mask; + + len = snprintf(content, SYSFS_PATH_MAX, "0x%04x", mask); + + dprintf("content is %s\n", content); + + ret = sysfs_write_attribute(attr, content, len); + + out: + sysfs_close_attribute(attr); + + return (ret); +} + + +static void load_config(void) +{ + if (chdir(configpath) != 0) { + syslog(LOG_ERR, "chdir to %s failed: %m", configpath); + exit(EXIT_FAILURE); + } + parse_configfile("config.opts"); + return; +} + + +static void adjust_resources(unsigned int socket_no) +{ + adjust_list_t *al; + + for (al = root_adjust; al; al = al->next) { + switch (al->adj.Resource) { + case RES_MEMORY_RANGE: + add_available_resource(socket_no, RESOURCE_MEM, + al->adj.Action, + al->adj.resource.memory.Base, + al->adj.resource.memory.Base + + al->adj.resource.memory.Size - 1); + break; + case RES_IO_RANGE: + add_available_resource(socket_no, RESOURCE_IO, + al->adj.Action, + al->adj.resource.io.BasePort, + al->adj.resource.io.BasePort + + al->adj.resource.io.NumPorts - 1); + break; + case RES_IRQ: + if(al->adj.Action == REMOVE_MANAGED_RESOURCE) + disallow_irq(socket_no, al->adj.resource.irq.IRQ); + break; + } + } +} + +/* mdk-stage1 +int main(int argc, char *argv[]) +{ + char *socket_no; + unsigned long socket, i; + unsigned int all_sockets = 0; + + + if ((socket_no = getenv("SOCKET_NO"))) { + socket = strtoul(socket_no, NULL, 0); + } else if (argc == 2) { + socket = strtoul(argv[1], NULL, 0); + } else if (argc == 1) { + socket = 0; + all_sockets = 1; + } else { + return -EINVAL; + } + + load_config(); + + for (i = 0; i < MAX_SOCKS; i++) { + if ((socket != i) && (!all_sockets)) + continue; + + adjust_resources(i); + setup_done(i); + } + + return 0; +} +*/ + +void pcmcia_socket_startup(int socket_no) { + unsigned long i; + unsigned int all_sockets = 0; + + if (socket_no == -1) + all_sockets = 1; + + load_config(); + + for (i = 0; i < MAX_SOCKS; i++) { + if ((socket_no != i) && (!all_sockets)) + continue; + + adjust_resources(i); + setup_done(i); + } +} diff --git a/mdk-stage1/pcmcia/startup.h b/mdk-stage1/pcmcia/startup.h new file mode 100644 index 000000000..ba6af2c15 --- /dev/null +++ b/mdk-stage1/pcmcia/startup.h @@ -0,0 +1,54 @@ +/* + * Startup tool for non statically mapped PCMCIA sockets + * + * The initial developer of the original code is David A. Hinds + * <dahinds@users.sourceforge.net>. Portions created by David A. Hinds + * are Copyright (C) 1999 David A. Hinds. All Rights Reserved. + * + * License: GPL v2 + * + */ + +#define MAX_SOCKS 8 +#define MAX_BINDINGS 4 +#define MAX_MODULES 4 + +/* for AdjustResourceInfo */ +typedef struct adjust_t { + unsigned int Action; + unsigned int Resource; + unsigned int Attributes; + union { + struct memory { + unsigned long Base; + unsigned long Size; + } memory; + struct io { + unsigned long BasePort; + unsigned long NumPorts; + unsigned int IOAddrLines; + } io; + struct irq { + unsigned int IRQ; + } irq; + } resource; +} adjust_t; + + +typedef struct adjust_list_t { + adjust_t adj; + struct adjust_list_t *next; +} adjust_list_t; + + +extern adjust_list_t *root_adjust; + +int parse_configfile(char *fn); + + +#define RES_MEMORY_RANGE 1 +#define RES_IO_RANGE 2 +#define RES_IRQ 3 +#define RES_RESERVED 0x10 +#define REMOVE_MANAGED_RESOURCE 1 +#define ADD_MANAGED_RESOURCE 2 diff --git a/mdk-stage1/pcmcia/tcic.h b/mdk-stage1/pcmcia/tcic.h index 92347cef6..cad193885 100644 --- a/mdk-stage1/pcmcia/tcic.h +++ b/mdk-stage1/pcmcia/tcic.h @@ -1,5 +1,5 @@ /* - * tcic.h 1.14 2000/06/12 21:29:37 + * tcic.h 1.15 2001/08/24 12:15:34 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in @@ -16,8 +16,8 @@ * are Copyright (C) 1999 David A. Hinds. All Rights Reserved. * * Alternatively, the contents of this file may be used under the - * terms of the GNU Public License version 2 (the "GPL"), in which - * case the provisions of the GPL are applicable instead of the + * terms of the GNU General Public License version 2 (the "GPL"), in + * which case the provisions of the GPL are applicable instead of the * above. If you wish to allow the use of your version of this file * only under the terms of the GPL and not to allow others to use * your version of this file under the MPL, indicate your decision by diff --git a/mdk-stage1/pcmcia/version.h b/mdk-stage1/pcmcia/version.h index 7a567ea2c..3be8f28bc 100644 --- a/mdk-stage1/pcmcia/version.h +++ b/mdk-stage1/pcmcia/version.h @@ -1,4 +1,4 @@ -/* version.h 1.95 2000/11/07 22:55:28 (David Hinds) */ +/* version.h 1.101 2001/08/09 12:29:14 (David Hinds) */ -#define CS_RELEASE "3.1.23" -#define CS_RELEASE_CODE 0x3117 +#define CS_RELEASE "3.1.29" +#define CS_RELEASE_CODE 0x311d diff --git a/mdk-stage1/pcmcia/vg468.h b/mdk-stage1/pcmcia/vg468.h index bb5faae87..23890cd07 100644 --- a/mdk-stage1/pcmcia/vg468.h +++ b/mdk-stage1/pcmcia/vg468.h @@ -1,5 +1,5 @@ /* - * vg468.h 1.13 2000/06/12 21:29:37 + * vg468.h 1.14 2001/08/24 12:15:34 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in @@ -16,8 +16,8 @@ * are Copyright (C) 1999 David A. Hinds. All Rights Reserved. * * Alternatively, the contents of this file may be used under the - * terms of the GNU Public License version 2 (the "GPL"), in which - * case the provisions of the GPL are applicable instead of the + * terms of the GNU General Public License version 2 (the "GPL"), in + * which case the provisions of the GPL are applicable instead of the * above. If you wish to allow the use of your version of this file * only under the terms of the GPL and not to allow others to use * your version of this file under the MPL, indicate your decision by @@ -103,10 +103,4 @@ /* Flags for VG469_EXT_MODE_B */ #define VG469_MODE_B_3V 0x01 /* 3.3v for socket B */ -/* Data structure for tracking vendor-specific state */ -typedef struct vg46x_state_t { - u_char ctl; /* VG468_CTL */ - u_char ema; /* VG468_EXT_MODE_A */ -} vg46x_state_t; - #endif /* _LINUX_VG468_H */ diff --git a/mdk-stage1/pcmcia/yacc_config.c b/mdk-stage1/pcmcia/yacc_config.c deleted file mode 100644 index e68e17cb3..000000000 --- a/mdk-stage1/pcmcia/yacc_config.c +++ /dev/null @@ -1,1017 +0,0 @@ -#define YYBYACC 1 -#define YYMAJOR 1 -#define YYMINOR 9 -#define yyclearin (yychar=(-1)) -#define yyerrok (yyerrflag=0) -#define YYRECOVERING (yyerrflag!=0) -#define YYPREFIX "yy" -#line 2 "yacc_config.y" -/* - * yacc_config.y 1.51 2000/06/12 21:33:02 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License - * at http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" - * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - * the License for the specific language governing rights and - * limitations under the License. - * - * The initial developer of the original code is David A. Hinds - * <dahinds@users.sourceforge.net>. Portions created by David A. Hinds - * are Copyright (C) 1999 David A. Hinds. All Rights Reserved. - * - * Alternatively, the contents of this file may be used under the - * terms of the GNU Public License version 2 (the "GPL"), in which - * case the provisions of the GPL are applicable instead of the - * above. If you wish to allow the use of your version of this file - * only under the terms of the GPL and not to allow others to use - * your version of this file under the MPL, indicate your decision by - * deleting the provisions above and replace them with the notice and - * other provisions required by the GPL. If you do not delete the - * provisions above, a recipient may use your version of this file - * under either the MPL or the GPL. - */ - -#include <stdlib.h> -#include <stdarg.h> -#include <stdio.h> -#include <string.h> -#include <syslog.h> -#include <sys/types.h> - -#include <pcmcia/cs_types.h> -#include <pcmcia/cs.h> -#include <pcmcia/cistpl.h> -#include <pcmcia/ds.h> - -#include "cardmgr.h" - -/* If bison: generate nicer error messages */ -#define YYERROR_VERBOSE 1 - -/* from lex_config, for nice error messages */ -extern char *current_file; -extern int current_lineno; - -void yyerror(char *msg, ...); - -static int add_binding(card_info_t *card, char *name, int fn); -static int add_module(device_info_t *card, char *name); - -#line 65 "yacc_config.y" -typedef union { - char *str; - u_long num; - struct device_info_t *device; - struct card_info_t *card; - struct mtd_ident_t *mtd; - struct adjust_list_t *adjust; -} YYSTYPE; -#line 77 "y.tab.c" -#define DEVICE 257 -#define CARD 258 -#define ANONYMOUS 259 -#define TUPLE 260 -#define MANFID 261 -#define VERSION 262 -#define FUNCTION 263 -#define PCI 264 -#define BIND 265 -#define CIS 266 -#define TO 267 -#define NEEDS_MTD 268 -#define MODULE 269 -#define OPTS 270 -#define CLASS 271 -#define REGION 272 -#define JEDEC 273 -#define DTYPE 274 -#define DEFAULT 275 -#define MTD 276 -#define INCLUDE 277 -#define EXCLUDE 278 -#define RESERVE 279 -#define IRQ_NO 280 -#define PORT 281 -#define MEMORY 282 -#define STRING 283 -#define NUMBER 284 -#define YYERRCODE 256 -short yylhs[] = { -1, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, - 1, 1, 2, 2, 2, 3, 3, 3, 3, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 8, 9, - 10, 11, 12, 12, 13, 15, 14, 14, 14, 14, - 4, 21, 5, 5, 5, 6, 16, 16, 16, 16, - 18, 17, 19, 20, 20, 22, -}; -short yylen[] = { 2, - 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 3, 2, 4, 4, 2, 1, 1, 1, 2, - 1, 1, 1, 1, 1, 1, 1, 1, 2, 7, - 5, 5, 3, 3, 3, 3, 3, 5, 3, 5, - 2, 4, 3, 3, 3, 3, 2, 1, 1, 1, - 3, 4, 2, 3, 3, 4, -}; -short yydefred[] = { 1, - 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 17, 0, 19, 0, 21, 22, 23, 24, - 0, 26, 0, 28, 0, 49, 48, 50, 0, 6, - 7, 16, 20, 0, 47, 0, 0, 0, 0, 9, - 10, 11, 0, 41, 0, 0, 0, 0, 29, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 53, 0, 0, 0, 0, 13, 0, 0, 12, 43, - 46, 44, 45, 0, 0, 33, 35, 0, 0, 36, - 34, 0, 0, 51, 54, 55, 42, 56, 0, 0, - 0, 0, 0, 0, 0, 52, 14, 15, 0, 31, - 32, 38, 40, 0, 30, -}; -short yydgoto[] = { 1, - 11, 40, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, -}; -short yysindex[] = { 0, - -250, 0, -279, -278, -274, -265, -259, -242, -242, -242, - -10, -248, 0, -44, 0, -249, 0, 0, 0, 0, - -9, 0, -3, 0, -243, 0, 0, 0, -233, 0, - 0, 0, 0, -228, 0, -227, -240, -238, -237, 0, - 0, 0, -242, 0, -235, -232, -231, -230, 0, -234, - -229, -226, -225, -224, -222, -221, -220, -219, -218, -217, - 0, -215, -213, -212, -211, 0, 9, 11, 0, 0, - 0, 0, 0, 14, 21, 0, 0, 30, -192, 0, - 0, -191, -207, 0, 0, 0, 0, 0, -206, -205, - -204, -203, -202, -201, -200, 0, 0, 0, 41, 0, - 0, 0, 0, -197, 0, -}; -short yyrindex[] = { 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 107, 149, 0, 90, 0, 124, 0, 0, 0, 0, - 49, 0, 73, 0, 0, 0, 0, 0, 141, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, - 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -}; -short yygindex[] = { 0, - 0, -7, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -}; -#define YYTABLESIZE 428 -short yytable[] = { 48, - 37, 41, 42, 32, 33, 2, 3, 4, 34, 49, - 50, 51, 52, 53, 54, 55, 56, 35, 5, 44, - 45, 6, 46, 36, 39, 7, 8, 9, 10, 59, - 60, 61, 62, 43, 57, 69, 63, 37, 38, 39, - 58, 64, 65, 66, 37, 67, 68, 70, 25, 74, - 71, 72, 73, 89, 75, 90, 76, 91, 77, 78, - 79, 80, 81, 82, 92, 83, 84, 85, 39, 86, - 87, 88, 27, 93, 94, 95, 96, 97, 98, 99, - 100, 101, 102, 103, 104, 105, 0, 0, 0, 18, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 4, 0, 0, 0, 0, 0, 0, 0, 3, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 0, 0, 37, - 0, 0, 37, 0, 0, 0, 37, 37, 37, 37, - 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, - 39, 0, 0, 39, 0, 0, 39, 0, 0, 0, - 39, 39, 39, 39, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 0, 0, 25, 0, 0, - 25, 0, 0, 0, 25, 25, 25, 25, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, - 0, 27, 0, 0, 27, 18, 18, 18, 27, 27, - 27, 27, 0, 0, 0, 0, 0, 18, 18, 0, - 18, 18, 2, 2, 2, 18, 18, 18, 18, 0, - 0, 0, 0, 0, 0, 2, 0, 0, 2, 5, - 5, 5, 2, 2, 2, 2, 0, 0, 0, 0, - 0, 0, 5, 0, 0, 5, 4, 4, 4, 5, - 5, 5, 5, 0, 3, 3, 3, 0, 0, 4, - 0, 0, 4, 0, 0, 0, 4, 4, 4, 4, - 3, 0, 0, 0, 3, 3, 3, 3, -}; -short yycheck[] = { 44, - 0, 9, 10, 283, 283, 256, 257, 258, 283, 259, - 260, 261, 262, 263, 264, 265, 266, 283, 269, 268, - 269, 272, 271, 283, 0, 276, 277, 278, 279, 273, - 274, 275, 276, 44, 44, 43, 270, 280, 281, 282, - 44, 270, 270, 284, 44, 284, 284, 283, 0, 284, - 283, 283, 283, 45, 284, 45, 283, 44, 284, 284, - 283, 283, 283, 283, 44, 284, 284, 283, 44, 283, - 283, 283, 0, 44, 267, 267, 284, 284, 284, 284, - 284, 284, 284, 284, 44, 283, -1, -1, -1, 0, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 0, -1, -1, -1, -1, -1, -1, -1, 0, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 270, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 256, 257, 258, 259, - 260, 261, 262, 263, 264, 265, 266, -1, -1, 269, - -1, -1, 272, -1, -1, -1, 276, 277, 278, 279, - 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, - 266, -1, -1, 269, -1, -1, 272, -1, -1, -1, - 276, 277, 278, 279, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, -1, -1, 269, -1, -1, - 272, -1, -1, -1, 276, 277, 278, 279, 256, 257, - 258, 259, 260, 261, 262, 263, 264, 265, 266, -1, - -1, 269, -1, -1, 272, 256, 257, 258, 276, 277, - 278, 279, -1, -1, -1, -1, -1, 268, 269, -1, - 271, 272, 256, 257, 258, 276, 277, 278, 279, -1, - -1, -1, -1, -1, -1, 269, -1, -1, 272, 256, - 257, 258, 276, 277, 278, 279, -1, -1, -1, -1, - -1, -1, 269, -1, -1, 272, 256, 257, 258, 276, - 277, 278, 279, -1, 256, 257, 258, -1, -1, 269, - -1, -1, 272, -1, -1, -1, 276, 277, 278, 279, - 272, -1, -1, -1, 276, 277, 278, 279, -}; -#define YYFINAL 1 -#ifndef YYDEBUG -#define YYDEBUG 0 -#endif -#define YYMAXTOKEN 284 -#if YYDEBUG -char *yyname[] = { -"end-of-file",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,"','","'-'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"DEVICE","CARD", -"ANONYMOUS","TUPLE","MANFID","VERSION","FUNCTION","PCI","BIND","CIS","TO", -"NEEDS_MTD","MODULE","OPTS","CLASS","REGION","JEDEC","DTYPE","DEFAULT","MTD", -"INCLUDE","EXCLUDE","RESERVE","IRQ_NO","PORT","MEMORY","STRING","NUMBER", -}; -char *yyrule[] = { -"$accept : list", -"list :", -"list : list adjust", -"list : list device", -"list : list mtd", -"list : list card", -"list : list opts", -"list : list mtd_opts", -"list : list error", -"adjust : INCLUDE resource", -"adjust : EXCLUDE resource", -"adjust : RESERVE resource", -"adjust : adjust ',' resource", -"resource : IRQ_NO NUMBER", -"resource : PORT NUMBER '-' NUMBER", -"resource : MEMORY NUMBER '-' NUMBER", -"device : DEVICE STRING", -"device : needs_mtd", -"device : module", -"device : class", -"card : CARD STRING", -"card : anonymous", -"card : tuple", -"card : manfid", -"card : pci", -"card : version", -"card : function", -"card : bind", -"card : cis", -"anonymous : card ANONYMOUS", -"tuple : card TUPLE NUMBER ',' NUMBER ',' STRING", -"manfid : card MANFID NUMBER ',' NUMBER", -"pci : card PCI NUMBER ',' NUMBER", -"version : card VERSION STRING", -"version : version ',' STRING", -"function : card FUNCTION NUMBER", -"cis : card CIS STRING", -"bind : card BIND STRING", -"bind : card BIND STRING TO NUMBER", -"bind : bind ',' STRING", -"bind : bind ',' STRING TO NUMBER", -"needs_mtd : device NEEDS_MTD", -"opts : MODULE STRING OPTS STRING", -"module : device MODULE STRING", -"module : module OPTS STRING", -"module : module ',' STRING", -"class : device CLASS STRING", -"region : REGION STRING", -"region : dtype", -"region : jedec", -"region : default", -"dtype : region DTYPE NUMBER", -"jedec : region JEDEC NUMBER NUMBER", -"default : region DEFAULT", -"mtd : region MTD STRING", -"mtd : mtd OPTS STRING", -"mtd_opts : MTD STRING OPTS STRING", -}; -#endif -#ifdef YYSTACKSIZE -#undef YYMAXDEPTH -#define YYMAXDEPTH YYSTACKSIZE -#else -#ifdef YYMAXDEPTH -#define YYSTACKSIZE YYMAXDEPTH -#else -#define YYSTACKSIZE 500 -#define YYMAXDEPTH 500 -#endif -#endif -int yydebug; -int yynerrs; -int yyerrflag; -int yychar; -short *yyssp; -YYSTYPE *yyvsp; -YYSTYPE yyval; -YYSTYPE yylval; -short yyss[YYSTACKSIZE]; -YYSTYPE yyvs[YYSTACKSIZE]; -#define yystacksize YYSTACKSIZE -#line 468 "yacc_config.y" -void yyerror(char *msg, ...) -{ - va_list ap; - char str[256]; - - va_start(ap, msg); - sprintf(str, "config error, file '%s' line %d: ", - current_file, current_lineno); - vsprintf(str+strlen(str), msg, ap); -#if YYDEBUG - fprintf(stderr, "%s\n", str); -#else - syslog(LOG_ERR, "%s", str); -#endif - va_end(ap); -} - -static int add_binding(card_info_t *card, char *name, int fn) -{ - device_info_t *dev = root_device; - if (card->bindings == MAX_BINDINGS) { - yyerror("too many bindings\n"); - return -1; - } - for (; dev; dev = dev->next) - if (strcmp((char *)dev->dev_info, name) == 0) break; - if (dev == NULL) { - yyerror("unknown device: %s", name); - return -1; - } - card->device[card->bindings] = dev; - card->dev_fn[card->bindings] = fn; - card->bindings++; - free(name); - return 0; -} - -static int add_module(device_info_t *dev, char *name) -{ - if (dev->modules == MAX_MODULES) { - yyerror("too many modules"); - return -1; - } - dev->module[dev->modules] = name; - dev->opts[dev->modules] = NULL; - dev->modules++; - return 0; -} - -int yylex(void); - -#if YYDEBUG -adjust_list_t *root_adjust = NULL; -device_info_t *root_device = NULL; -card_info_t *root_card = NULL, *blank_card = NULL, *root_func = NULL; -mtd_ident_t *root_mtd = NULL, *default_mtd = NULL; - - -void main(int argc, char *argv[]) -{ - yydebug = 1; - if (argc > 1) - parse_configfile(argv[1]); -} -#endif -#line 426 "y.tab.c" -#define YYABORT goto yyabort -#define YYREJECT goto yyabort -#define YYACCEPT goto yyaccept -#define YYERROR goto yyerrlab -int -yyparse(void) -{ - register int yym, yyn, yystate; -#if YYDEBUG - register char *yys; - extern char *getenv(); - - if (yys = getenv("YYDEBUG")) - { - yyn = *yys; - if (yyn >= '0' && yyn <= '9') - yydebug = yyn - '0'; - } -#endif - - yynerrs = 0; - yyerrflag = 0; - yychar = (-1); - - yyssp = yyss; - yyvsp = yyvs; - *yyssp = yystate = 0; - -yyloop: - if ((yyn = yydefred[yystate])) goto yyreduce; - if (yychar < 0) - { - if ((yychar = yylex()) < 0) yychar = 0; -#if YYDEBUG - if (yydebug) - { - yys = 0; - if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; - if (!yys) yys = "illegal-symbol"; - printf("%sdebug: state %d, reading %d (%s)\n", - YYPREFIX, yystate, yychar, yys); - } -#endif - } - if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 && - yyn <= YYTABLESIZE && yycheck[yyn] == yychar) - { -#if YYDEBUG - if (yydebug) - printf("%sdebug: state %d, shifting to state %d\n", - YYPREFIX, yystate, yytable[yyn]); -#endif - if (yyssp >= yyss + yystacksize - 1) - { - goto yyoverflow; - } - *++yyssp = yystate = yytable[yyn]; - *++yyvsp = yylval; - yychar = (-1); - if (yyerrflag > 0) --yyerrflag; - goto yyloop; - } - if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 && - yyn <= YYTABLESIZE && yycheck[yyn] == yychar) - { - yyn = yytable[yyn]; - goto yyreduce; - } - if (yyerrflag) goto yyinrecovery; - yyerror("syntax error"); -#ifdef lint - goto yyerrlab; -#endif -yyerrlab: - ++yynerrs; -yyinrecovery: - if (yyerrflag < 3) - { - yyerrflag = 3; - for (;;) - { - if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 && - yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE) - { -#if YYDEBUG - if (yydebug) - printf("%sdebug: state %d, error recovery shifting\ - to state %d\n", YYPREFIX, *yyssp, yytable[yyn]); -#endif - if (yyssp >= yyss + yystacksize - 1) - { - goto yyoverflow; - } - *++yyssp = yystate = yytable[yyn]; - *++yyvsp = yylval; - goto yyloop; - } - else - { -#if YYDEBUG - if (yydebug) - printf("%sdebug: error recovery discarding state %d\n", - YYPREFIX, *yyssp); -#endif - if (yyssp <= yyss) goto yyabort; - --yyssp; - --yyvsp; - } - } - } - else - { - if (yychar == 0) goto yyabort; -#if YYDEBUG - if (yydebug) - { - yys = 0; - if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; - if (!yys) yys = "illegal-symbol"; - printf("%sdebug: state %d, error recovery discards token %d (%s)\n", - YYPREFIX, yystate, yychar, yys); - } -#endif - yychar = (-1); - goto yyloop; - } -yyreduce: -#if YYDEBUG - if (yydebug) - printf("%sdebug: state %d, reducing by rule %d (%s)\n", - YYPREFIX, yystate, yyn, yyrule[yyn]); -#endif - yym = yylen[yyn]; - yyval = yyvsp[1-yym]; - switch (yyn) - { -case 2: -#line 84 "yacc_config.y" -{ - adjust_list_t **tail = &root_adjust; - while (*tail != NULL) tail = &(*tail)->next; - *tail = yyvsp[0].adjust; - } -break; -case 3: -#line 90 "yacc_config.y" -{ - yyvsp[0].device->next = root_device; - root_device = yyvsp[0].device; - } -break; -case 4: -#line 95 "yacc_config.y" -{ - if (yyvsp[0].mtd->mtd_type == 0) { - yyerror("no ID method for this card"); - YYERROR; - } - if (yyvsp[0].mtd->module == NULL) { - yyerror("no MTD module specified"); - YYERROR; - } - yyvsp[0].mtd->next = root_mtd; - root_mtd = yyvsp[0].mtd; - } -break; -case 5: -#line 108 "yacc_config.y" -{ - if (yyvsp[0].card->ident_type == 0) { - yyerror("no ID method for this card"); - YYERROR; - } - if (yyvsp[0].card->bindings == 0) { - yyerror("no function bindings"); - YYERROR; - } - if (yyvsp[0].card->ident_type == FUNC_IDENT) { - yyvsp[0].card->next = root_func; - root_func = yyvsp[0].card; - } else { - yyvsp[0].card->next = root_card; - root_card = yyvsp[0].card; - } - } -break; -case 9: -#line 131 "yacc_config.y" -{ - yyvsp[0].adjust->adj.Action = ADD_MANAGED_RESOURCE; - yyval.adjust = yyvsp[0].adjust; - } -break; -case 10: -#line 136 "yacc_config.y" -{ - yyvsp[0].adjust->adj.Action = REMOVE_MANAGED_RESOURCE; - yyval.adjust = yyvsp[0].adjust; - } -break; -case 11: -#line 141 "yacc_config.y" -{ - yyvsp[0].adjust->adj.Action = ADD_MANAGED_RESOURCE; - yyvsp[0].adjust->adj.Attributes |= RES_RESERVED; - yyval.adjust = yyvsp[0].adjust; - } -break; -case 12: -#line 147 "yacc_config.y" -{ - yyvsp[0].adjust->adj.Action = yyvsp[-2].adjust->adj.Action; - yyvsp[0].adjust->adj.Attributes = yyvsp[-2].adjust->adj.Attributes; - yyvsp[0].adjust->next = yyvsp[-2].adjust; - yyval.adjust = yyvsp[0].adjust; - } -break; -case 13: -#line 156 "yacc_config.y" -{ - yyval.adjust = calloc(sizeof(adjust_list_t), 1); - yyval.adjust->adj.Resource = RES_IRQ; - yyval.adjust->adj.resource.irq.IRQ = yyvsp[0].num; - } -break; -case 14: -#line 162 "yacc_config.y" -{ - if ((yyvsp[0].num < yyvsp[-2].num) || (yyvsp[0].num > 0xffff)) { - yyerror("invalid port range"); - YYERROR; - } - yyval.adjust = calloc(sizeof(adjust_list_t), 1); - yyval.adjust->adj.Resource = RES_IO_RANGE; - yyval.adjust->adj.resource.io.BasePort = yyvsp[-2].num; - yyval.adjust->adj.resource.io.NumPorts = yyvsp[0].num - yyvsp[-2].num + 1; - } -break; -case 15: -#line 173 "yacc_config.y" -{ - if (yyvsp[0].num < yyvsp[-2].num) { - yyerror("invalid address range"); - YYERROR; - } - yyval.adjust = calloc(sizeof(adjust_list_t), 1); - yyval.adjust->adj.Resource = RES_MEMORY_RANGE; - yyval.adjust->adj.resource.memory.Base = yyvsp[-2].num; - yyval.adjust->adj.resource.memory.Size = yyvsp[0].num - yyvsp[-2].num + 1; - } -break; -case 16: -#line 186 "yacc_config.y" -{ - yyval.device = calloc(sizeof(device_info_t), 1); - yyval.device->refs = 1; - strcpy(yyval.device->dev_info, yyvsp[0].str); - free(yyvsp[0].str); - } -break; -case 20: -#line 198 "yacc_config.y" -{ - yyval.card = calloc(sizeof(card_info_t), 1); - yyval.card->refs = 1; - yyval.card->name = yyvsp[0].str; - } -break; -case 29: -#line 214 "yacc_config.y" -{ - if (yyvsp[-1].card->ident_type != 0) { - yyerror("ID method already defined"); - YYERROR; - } - if (blank_card) { - yyerror("Anonymous card already defined"); - YYERROR; - } - yyvsp[-1].card->ident_type = BLANK_IDENT; - blank_card = yyvsp[-1].card; - } -break; -case 30: -#line 229 "yacc_config.y" -{ - if (yyvsp[-6].card->ident_type != 0) { - yyerror("ID method already defined"); - YYERROR; - } - yyvsp[-6].card->ident_type = TUPLE_IDENT; - yyvsp[-6].card->id.tuple.code = yyvsp[-4].num; - yyvsp[-6].card->id.tuple.ofs = yyvsp[-2].num; - yyvsp[-6].card->id.tuple.info = yyvsp[0].str; - } -break; -case 31: -#line 242 "yacc_config.y" -{ - if (yyvsp[-4].card->ident_type != 0) { - yyerror("ID method already defined"); - YYERROR; - } - yyvsp[-4].card->ident_type = MANFID_IDENT; - yyvsp[-4].card->id.manfid.manf = yyvsp[-2].num; - yyvsp[-4].card->id.manfid.card = yyvsp[0].num; - } -break; -case 32: -#line 253 "yacc_config.y" -{ - if (yyvsp[-4].card->ident_type != 0) { - yyerror("ID method already defined"); - YYERROR; - } - yyvsp[-4].card->ident_type = PCI_IDENT; - yyvsp[-4].card->id.manfid.manf = yyvsp[-2].num; - yyvsp[-4].card->id.manfid.card = yyvsp[0].num; - } -break; -case 33: -#line 264 "yacc_config.y" -{ - if (yyvsp[-2].card->ident_type != 0) { - yyerror("ID method already defined\n"); - YYERROR; - } - yyvsp[-2].card->ident_type = VERS_1_IDENT; - yyvsp[-2].card->id.vers.ns = 1; - yyvsp[-2].card->id.vers.pi[0] = yyvsp[0].str; - } -break; -case 34: -#line 274 "yacc_config.y" -{ - if (yyvsp[-2].card->id.vers.ns == 4) { - yyerror("too many version strings"); - YYERROR; - } - yyvsp[-2].card->id.vers.pi[yyvsp[-2].card->id.vers.ns] = yyvsp[0].str; - yyvsp[-2].card->id.vers.ns++; - } -break; -case 35: -#line 285 "yacc_config.y" -{ - if (yyvsp[-2].card->ident_type != 0) { - yyerror("ID method already defined\n"); - YYERROR; - } - yyvsp[-2].card->ident_type = FUNC_IDENT; - yyvsp[-2].card->id.func.funcid = yyvsp[0].num; - } -break; -case 36: -#line 296 "yacc_config.y" -{ yyvsp[-2].card->cis_file = strdup(yyvsp[0].str); } -break; -case 37: -#line 300 "yacc_config.y" -{ - if (add_binding(yyvsp[-2].card, yyvsp[0].str, 0) != 0) - YYERROR; - } -break; -case 38: -#line 305 "yacc_config.y" -{ - if (add_binding(yyvsp[-4].card, yyvsp[-2].str, yyvsp[0].num) != 0) - YYERROR; - } -break; -case 39: -#line 310 "yacc_config.y" -{ - if (add_binding(yyvsp[-2].card, yyvsp[0].str, 0) != 0) - YYERROR; - } -break; -case 40: -#line 315 "yacc_config.y" -{ - if (add_binding(yyvsp[-4].card, yyvsp[-2].str, yyvsp[0].num) != 0) - YYERROR; - } -break; -case 41: -#line 322 "yacc_config.y" -{ - yyvsp[-1].device->needs_mtd = 1; - } -break; -case 42: -#line 328 "yacc_config.y" -{ - device_info_t *d; - int i, found = 0; - for (d = root_device; d; d = d->next) { - for (i = 0; i < d->modules; i++) - if (strcmp(yyvsp[-2].str, d->module[i]) == 0) break; - if (i < d->modules) { - if (d->opts[i]) - free(d->opts[i]); - d->opts[i] = strdup(yyvsp[0].str); - found = 1; - } - } - free(yyvsp[-2].str); free(yyvsp[0].str); - if (!found) { - yyerror("module name not found!"); - YYERROR; - } - } -break; -case 43: -#line 350 "yacc_config.y" -{ - if (add_module(yyvsp[-2].device, yyvsp[0].str) != 0) - YYERROR; - } -break; -case 44: -#line 355 "yacc_config.y" -{ - if (yyvsp[-2].device->opts[yyvsp[-2].device->modules-1] == NULL) { - yyvsp[-2].device->opts[yyvsp[-2].device->modules-1] = yyvsp[0].str; - } else { - yyerror("too many options"); - YYERROR; - } - } -break; -case 45: -#line 364 "yacc_config.y" -{ - if (add_module(yyvsp[-2].device, yyvsp[0].str) != 0) - YYERROR; - } -break; -case 46: -#line 371 "yacc_config.y" -{ - if (yyvsp[-2].device->class != NULL) { - yyerror("extra class string"); - YYERROR; - } - yyvsp[-2].device->class = yyvsp[0].str; - } -break; -case 47: -#line 381 "yacc_config.y" -{ - yyval.mtd = calloc(sizeof(mtd_ident_t), 1); - yyval.mtd->refs = 1; - yyval.mtd->name = yyvsp[0].str; - } -break; -case 51: -#line 392 "yacc_config.y" -{ - if (yyvsp[-2].mtd->mtd_type != 0) { - yyerror("ID method already defined"); - YYERROR; - } - yyvsp[-2].mtd->mtd_type = DTYPE_MTD; - yyvsp[-2].mtd->dtype = yyvsp[0].num; - } -break; -case 52: -#line 403 "yacc_config.y" -{ - if (yyvsp[-3].mtd->mtd_type != 0) { - yyerror("ID method already defined"); - YYERROR; - } - yyvsp[-3].mtd->mtd_type = JEDEC_MTD; - yyvsp[-3].mtd->jedec_mfr = yyvsp[-1].num; - yyvsp[-3].mtd->jedec_info = yyvsp[0].num; - } -break; -case 53: -#line 415 "yacc_config.y" -{ - if (yyvsp[-1].mtd->mtd_type != 0) { - yyerror("ID method already defined"); - YYERROR; - } - if (default_mtd) { - yyerror("Default MTD already defined"); - YYERROR; - } - yyvsp[-1].mtd->mtd_type = DEFAULT_MTD; - default_mtd = yyvsp[-1].mtd; - } -break; -case 54: -#line 430 "yacc_config.y" -{ - if (yyvsp[-2].mtd->module != NULL) { - yyerror("extra MTD entry"); - YYERROR; - } - yyvsp[-2].mtd->module = yyvsp[0].str; - } -break; -case 55: -#line 438 "yacc_config.y" -{ - if (yyvsp[-2].mtd->opts == NULL) { - yyvsp[-2].mtd->opts = yyvsp[0].str; - } else { - yyerror("too many options"); - YYERROR; - } - } -break; -case 56: -#line 449 "yacc_config.y" -{ - mtd_ident_t *m; - int found = 0; - for (m = root_mtd; m; m = m->next) - if (strcmp(yyvsp[-2].str, m->module) == 0) break; - if (m) { - if (m->opts) free(m->opts); - m->opts = strdup(yyvsp[0].str); - found = 1; - } - free(yyvsp[-2].str); free(yyvsp[0].str); - if (!found) { - yyerror("MTD name not found!"); - YYERROR; - } - } -break; -#line 966 "y.tab.c" - } - yyssp -= yym; - yystate = *yyssp; - yyvsp -= yym; - yym = yylhs[yyn]; - if (yystate == 0 && yym == 0) - { -#if YYDEBUG - if (yydebug) - printf("%sdebug: after reduction, shifting from state 0 to\ - state %d\n", YYPREFIX, YYFINAL); -#endif - yystate = YYFINAL; - *++yyssp = YYFINAL; - *++yyvsp = yyval; - if (yychar < 0) - { - if ((yychar = yylex()) < 0) yychar = 0; -#if YYDEBUG - if (yydebug) - { - yys = 0; - if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; - if (!yys) yys = "illegal-symbol"; - printf("%sdebug: state %d, reading %d (%s)\n", - YYPREFIX, YYFINAL, yychar, yys); - } -#endif - } - if (yychar == 0) goto yyaccept; - goto yyloop; - } - if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 && - yyn <= YYTABLESIZE && yycheck[yyn] == yystate) - yystate = yytable[yyn]; - else - yystate = yydgoto[yym]; -#if YYDEBUG - if (yydebug) - printf("%sdebug: after reduction, shifting from state %d \ -to state %d\n", YYPREFIX, *yyssp, yystate); -#endif - if (yyssp >= yyss + yystacksize - 1) - { - goto yyoverflow; - } - *++yyssp = yystate; - *++yyvsp = yyval; - goto yyloop; -yyoverflow: - yyerror("yacc stack overflow"); -yyabort: - return (1); -yyaccept: - return (0); -} diff --git a/mdk-stage1/pcmcia/yacc_config.h b/mdk-stage1/pcmcia/yacc_config.h deleted file mode 100644 index b4902c8e6..000000000 --- a/mdk-stage1/pcmcia/yacc_config.h +++ /dev/null @@ -1,37 +0,0 @@ -#define DEVICE 257 -#define CARD 258 -#define ANONYMOUS 259 -#define TUPLE 260 -#define MANFID 261 -#define VERSION 262 -#define FUNCTION 263 -#define PCI 264 -#define BIND 265 -#define CIS 266 -#define TO 267 -#define NEEDS_MTD 268 -#define MODULE 269 -#define OPTS 270 -#define CLASS 271 -#define REGION 272 -#define JEDEC 273 -#define DTYPE 274 -#define DEFAULT 275 -#define MTD 276 -#define INCLUDE 277 -#define EXCLUDE 278 -#define RESERVE 279 -#define IRQ_NO 280 -#define PORT 281 -#define MEMORY 282 -#define STRING 283 -#define NUMBER 284 -typedef union { - char *str; - u_long num; - struct device_info_t *device; - struct card_info_t *card; - struct mtd_ident_t *mtd; - struct adjust_list_t *adjust; -} YYSTYPE; -extern YYSTYPE yylval; diff --git a/mdk-stage1/pcmcia/yacc_config.y b/mdk-stage1/pcmcia/yacc_config.y new file mode 100644 index 000000000..c33f397d6 --- /dev/null +++ b/mdk-stage1/pcmcia/yacc_config.y @@ -0,0 +1,133 @@ +%{ +/* + * Startup tool for non statically mapped PCMCIA sockets - config file parsing + * + * (C) 2005 Dominik Brodowski <linux@brodo.de> + * + * The initial developer of the original code is David A. Hinds + * <dahinds@users.sourceforge.net>. Portions created by David A. Hinds + * are Copyright (C) 1999 David A. Hinds. All Rights Reserved. + * + * License: GPL v2 + */ + +#include <stdlib.h> +#include <stdarg.h> +#include <stdio.h> +#include <string.h> +#include <syslog.h> +#include <sys/types.h> + +#include "startup.h" + +/* If bison: generate nicer error messages */ +#define YYERROR_VERBOSE 1 + +/* from lex_config, for nice error messages */ +extern char *current_file; +extern int current_lineno; + +extern int yylex(void); /* mdk-stage1 */ + +void yyerror(const char *msg, ...); + +%} + +%token DEVICE CARD ANONYMOUS TUPLE MANFID VERSION FUNCTION PCI +%token BIND CIS TO NEEDS_MTD MODULE OPTS CLASS +%token REGION JEDEC DTYPE DEFAULT MTD +%token INCLUDE EXCLUDE RESERVE IRQ_NO PORT MEMORY +%token STRING NUMBER SOURCE + +%union { + char *str; + u_long num; + struct adjust_list_t *adjust; +} + +%type <str> STRING +%type <num> NUMBER +%type <adjust> adjust resource +%% +list: /* nothing */ + | list adjust + { + adjust_list_t **tail = &root_adjust; + while (*tail != NULL) tail = &(*tail)->next; + *tail = $2; + } + ; + +adjust: INCLUDE resource + { + $2->adj.Action = ADD_MANAGED_RESOURCE; + $$ = $2; + } + | EXCLUDE resource + { + $2->adj.Action = REMOVE_MANAGED_RESOURCE; + $$ = $2; + } + | RESERVE resource + { + $2->adj.Action = ADD_MANAGED_RESOURCE; + $2->adj.Attributes |= RES_RESERVED; + $$ = $2; + } + | adjust ',' resource + { + $3->adj.Action = $1->adj.Action; + $3->adj.Attributes = $1->adj.Attributes; + $3->next = $1; + $$ = $3; + } + ; + +resource: IRQ_NO NUMBER + { + $$ = calloc(sizeof(adjust_list_t), 1); + $$->adj.Resource = RES_IRQ; + $$->adj.resource.irq.IRQ = $2; + } + | PORT NUMBER '-' NUMBER + { + if (($4 < $2) || ($4 > 0xffff)) { + yyerror("invalid port range 0x%x-0x%x", $2, $4); + YYERROR; + } + $$ = calloc(sizeof(adjust_list_t), 1); + $$->adj.Resource = RES_IO_RANGE; + $$->adj.resource.io.BasePort = $2; + $$->adj.resource.io.NumPorts = $4 - $2 + 1; + } + | MEMORY NUMBER '-' NUMBER + { + if ($4 < $2) { + yyerror("invalid address range 0x%x-0x%x", $2, $4); + YYERROR; + } + $$ = calloc(sizeof(adjust_list_t), 1); + $$->adj.Resource = RES_MEMORY_RANGE; + $$->adj.resource.memory.Base = $2; + $$->adj.resource.memory.Size = $4 - $2 + 1; + } + ; + +%% +void yyerror(const char *msg, ...) +{ + va_list ap; + char str[256]; + + va_start(ap, msg); + sprintf(str, "error in file '%s' line %d: ", + current_file, current_lineno); + vsprintf(str+strlen(str), msg, ap); +#if YYDEBUG + fprintf(stderr, "%s\n", str); +#else + syslog(LOG_ERR, "%s", str); +#endif + va_end(ap); +} + diff --git a/mdk-stage1/probe-modules.c b/mdk-stage1/probe-modules.c new file mode 100644 index 000000000..86b383b5e --- /dev/null +++ b/mdk-stage1/probe-modules.c @@ -0,0 +1,69 @@ +/* + * Olivier Blin (blino) + * + * Copyright 2007-2004 Mandriva + * + * + * This software may be freely redistributed under the terms of the GNU + * public license. + * + * 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 "log.h" +#include "modules.h" +#include "probing.h" +#include "frontend.h" +#include <stdlib.h> +#include <sys/stat.h> +#include <string.h> +#include "utils.h" + +void stg1_error_message(char *msg, ...) +{ + va_list args; + va_start(args, msg); + verror_message(msg, args); + va_end(args); +} +void fatal_error(char *msg) +{ + log_message("FATAL ERROR IN MODULES LOADER: %s\n\nI can't recover from this.\nYou may reboot your system.\n", msg); + exit(EXIT_FAILURE); +} + +int main(int argc, char **argv, char **env) +{ + enum media_bus bus = BUS_ANY; + char *module = NULL; + char options[500] = ""; + + if (argc > 1) { + if (streq(argv[1], "--usb")) { + bus = BUS_USB; + } else if (!ptr_begins_static_str(argv[1], "--")) { + int i; + module = argv[1]; + for (i = 2; i < argc; i++) { + strcat(options, argv[i]); + strcat(options, " "); + } + } + } + + open_log(); + init_modules_insmoding(); + + if (module) { + my_modprobe(module, ANY_DRIVER_TYPE, options); + } else { + find_media(bus); + } + + close_log(); + + return 0; +} diff --git a/mdk-stage1/probing.c b/mdk-stage1/probing.c index 46bc79acc..f956bb348 100644 --- a/mdk-stage1/probing.c +++ b/mdk-stage1/probing.c @@ -1,7 +1,7 @@ /* - * Guillaume Cottenceau (gc@mandrakesoft.com) + * Guillaume Cottenceau (gc) * - * Copyright 2000 MandrakeSoft + * Copyright 2000 Mandriva * * This software may be freely redistributed under the terms of the GNU * public license. @@ -22,7 +22,7 @@ /* * This contains stuff related to probing: - * (1) any (actually SCSI and NET only) devices (autoprobe for PCI) + * (1) any (actually only SCSI, NET, CPQ, USB Controllers) devices (autoprobe for PCI and USB) * (2) IDE media * (3) SCSI media * (4) ETH devices @@ -35,382 +35,687 @@ #include <string.h> #include <sys/types.h> #include <sys/stat.h> +#include <dirent.h> #include <fcntl.h> +#include <fnmatch.h> #include <sys/socket.h> #include <net/if.h> +#include <linux/sockios.h> +#include <linux/ethtool.h> #include <sys/ioctl.h> +#include <sys/mount.h> +#include <pci/pci.h> +#include <libldetect.h> +#include <errno.h> +#include <glob.h> #include "stage1.h" #include "log.h" +#include "utils.h" #include "frontend.h" #include "modules.h" -#include "pci-resource/pci-ids.h" +#include "pci-ids.h" +#ifdef ENABLE_USB +#include "usb-ids.h" +#endif +#ifdef ENABLE_PCMCIA +#include "sysfs/libsysfs.h" +#include "pcmcia-ids.h" +#endif #include "probing.h" -enum bus_type { IDE, SCSI }; - struct media_info { char * name; char * model; enum media_type type; - enum bus_type bus; }; -static void warning_insmod_failed(void) +static void warning_insmod_failed(enum insmod_return r) { - error_message("Warning, installation of driver failed."); + if (IS_AUTOMATIC && r == INSMOD_FAILED_FILE_NOT_FOUND) + return; + if (r != INSMOD_OK) { + if (r == INSMOD_FAILED_FILE_NOT_FOUND) + stg1_error_message("This floppy doesn't contain the driver."); + else + stg1_error_message("Warning, installation of driver failed. (please include msg from <Alt-F3> for bugreports)"); + } } #ifndef DISABLE_NETWORK -struct net_description_elem +const char * safe_descr(const char * text) { + return text ? text : "unknown"; +} + +char * get_net_intf_description(char * intf_name) { - char * intf_name; - char * intf_description; -}; -static struct net_description_elem net_descriptions[50]; -static int net_descr_number = 0; -static char * intf_descr_for_discover = NULL; -static char * net_intf_too_early_name[50]; /* for modules providing more than one net intf */ -static int net_intf_too_early_number = 0; -static int net_intf_too_early_ptr = 0; - -void prepare_intf_descr(const char * intf_descr) + struct ifreq ifr; + struct ethtool_drvinfo drvinfo; + int s = socket(AF_INET, SOCK_DGRAM, 0); + char *res; + + memset(&ifr, 0, sizeof(ifr)); + strncpy(ifr.ifr_name, intf_name, IFNAMSIZ); + + drvinfo.cmd = ETHTOOL_GDRVINFO; + ifr.ifr_data = (caddr_t) &drvinfo; + + if (ioctl(s, SIOCETHTOOL, &ifr) != -1) { + res = drvinfo.driver; + } else { + perror("SIOCETHTOOL"); + res = "unknown"; + } + close(s); + return strdup(res); +} +#endif + +static int device_match_modules_list(struct pciusb_entry *e, char **modules, unsigned int modules_len) { + int i; + if (!e->module) + return 0; + for (i = 0; i < modules_len; i++) + if (!strcmp(modules[i], e->module)) + return 1; + return 0; +} + +struct pcitable_entry *detected_devices = NULL; +int detected_devices_len = 0; + +static void detected_devices_destroy(void) { - intf_descr_for_discover = strdup(intf_descr); + if (detected_devices) + free(detected_devices); } -void net_discovered_interface(char * intf_name) +static struct pcitable_entry *detected_device_new(void) { - if (!intf_descr_for_discover) { - net_intf_too_early_name[net_intf_too_early_number++] = strdup(intf_name); - return; - } - if (!intf_name) { - if (net_intf_too_early_ptr >= net_intf_too_early_number) { - log_message("NET: was expecting another network interface (broken net module?)"); - return; - } - net_descriptions[net_descr_number].intf_name = net_intf_too_early_name[net_intf_too_early_ptr++]; + static int detected_devices_maxlen = 0; + if (detected_devices_len >= detected_devices_maxlen) { + detected_devices_maxlen += 32; + if (detected_devices == NULL) + detected_devices = malloc(detected_devices_maxlen * sizeof(*detected_devices)); + else + detected_devices = realloc(detected_devices, detected_devices_maxlen * sizeof(*detected_devices)); + if (detected_devices == NULL) + log_perror("detected_device_new: could not (re)allocate table. Let it crash, sorry"); } - else - net_descriptions[net_descr_number].intf_name = strdup(intf_name); - net_descriptions[net_descr_number].intf_description = strdup(intf_descr_for_discover); - intf_descr_for_discover = NULL; - net_descr_number++; + return &detected_devices[detected_devices_len++]; } -char * get_net_intf_description(char * intf_name) +/* FIXME: factorize with probe_that_type() */ + +static void add_detected_device(unsigned short vendor, unsigned short device, unsigned int subvendor, unsigned int subdevice, const char *name, const char *module) { - int i; - for (i = 0; i < net_descr_number ; i++) - if (!strcmp(net_descriptions[i].intf_name, intf_name)) - return net_descriptions[i].intf_description; - return strdup("unknown"); + struct pcitable_entry *dev = detected_device_new(); + dev->vendor = vendor; + dev->device = device; + dev->subvendor = subvendor; + dev->subdevice = subdevice; + strncpy(dev->module, module, sizeof(dev->module) - 1); + dev->module[sizeof(dev->module) - 1] = '\0'; + strncpy(dev->description, safe_descr(name), sizeof(dev->description) - 1); + dev->description[sizeof(dev->description) - 1] = '\0'; + log_message("detected device (%04x, %04x, %04x, %04x, %s, %s)", vendor, device, subvendor, subdevice, name, module); } -#endif -static void probe_that_type(enum driver_type type) +static int add_detected_device_if_match(struct pciusb_entry *e, char **modules, unsigned int modules_len) { - if (IS_EXPERT) - ask_insmod(type); - else { - /* ---- PCI probe */ - FILE * f; - int len = 0; - char buf[200]; - struct pci_module_map * pcidb = NULL; - - f = fopen("/proc/bus/pci/devices", "rb"); - - if (!f) { - log_message("PCI: could not open proc file"); - return; - } + int ret = device_match_modules_list(e, modules, modules_len); + if (ret) + add_detected_device(e->vendor, e->device, e->subvendor, e->subdevice, + e->text, e->module); + return ret; +} - switch (type) { - case SCSI_ADAPTERS: +void probing_detect_devices() +{ + static int already_detected_devices = 0; + struct pciusb_entries entries; + int i; + + if (already_detected_devices) + return; + + entries = pci_probe(); + for (i = 0; i < entries.nb; i++) { + struct pciusb_entry *e = &entries.entries[i]; +#ifndef DISABLE_PCIADAPTERS #ifndef DISABLE_MEDIAS - pcidb = scsi_pci_ids; - len = scsi_num_ids; + if (add_detected_device_if_match(e, medias_ide_pci_modules, medias_ide_pci_modules_len)) + continue; + if (add_detected_device_if_match(e, medias_other_pci_modules, medias_other_pci_modules_len)) + continue; #endif - break; - case NETWORK_DEVICES: + #ifndef DISABLE_NETWORK - pcidb = eth_pci_ids; - len = eth_num_ids; + if (add_detected_device_if_match(e, network_pci_modules, network_pci_modules_len)) + continue; #endif - break; - default: - return; + +#ifdef ENABLE_USB + if (add_detected_device_if_match(e, usb_controller_modules, usb_controller_modules_len)) + continue; +#endif +#endif + /* device can't be found in built-in pcitables, but keep it */ + add_detected_device(e->vendor, e->device, e->subvendor, e->subdevice, e->text, e->module); + } + pciusb_free(&entries); + + already_detected_devices = 1; +} + +void probing_destroy(void) +{ + detected_devices_destroy(); +} + +#ifndef DISABLE_MEDIAS +static const char * get_alternate_module(const char * name) +{ + struct alternate_mapping { + const char * a; + const char * b; + }; + static struct alternate_mapping mappings[] = { + { "ahci", "ata_piix" }, + }; + int mappings_nb = sizeof(mappings) / sizeof(struct alternate_mapping); + int i; + + for (i=0; i<mappings_nb; i++) { + const char * alternate = NULL; + if (streq(name, mappings[i].a)) + alternate = mappings[i].b; + else if (streq(name, mappings[i].b)) + alternate = mappings[i].a; + if (alternate) { + log_message("found alternate module %s for driver %s", alternate, name); + return alternate; } + } + return NULL; +} +#endif - while (1) { - int i, garb, vendor, device; - - if (!fgets(buf, sizeof(buf), f)) break; - - sscanf(buf, "%x %x", &garb, &vendor); - device = vendor & 0xFFFF; /* because scanf from dietlibc does not support %4f */ - vendor = (vendor >> 16) & 0xFFFF; - - for (i = 0; i < len; i++) { - if (pcidb[i].vendor == vendor && pcidb[i].device == device) { - log_message("PCI: found suggestion for %s (%s)", pcidb[i].name, pcidb[i].module); +void discovered_device(enum driver_type type, const char * description, const char * driver) +{ + description = safe_descr(description); + + enum insmod_return failed = INSMOD_FAILED; #ifndef DISABLE_MEDIAS - if (type == SCSI_ADAPTERS) { - /* insmod takes time, let's use the wait message */ - wait_message("Installing %s", pcidb[i].name); - garb = my_insmod(pcidb[i].module, SCSI_ADAPTERS, NULL); - remove_wait_message(); - if (garb) - warning_insmod_failed(); - } + if (type == MEDIA_ADAPTERS) { + const char * alternate = NULL; + wait_message("Loading driver for media adapter:\n \n%s", description); + failed = my_modprobe(driver, MEDIA_ADAPTERS, NULL); + alternate = get_alternate_module(driver); + if (!IS_NOAUTO && alternate) { + failed = failed || my_modprobe(alternate, MEDIA_ADAPTERS, NULL); + } + remove_wait_message(); + warning_insmod_failed(failed); + } #endif #ifndef DISABLE_NETWORK - if (type == NETWORK_DEVICES) { - /* insmod is quick, let's use the info message */ - info_message("Found %s", pcidb[i].name); - prepare_intf_descr(pcidb[i].name); - if (my_insmod(pcidb[i].module, NETWORK_DEVICES, NULL)) - warning_insmod_failed(); - if (intf_descr_for_discover) /* for modules providing more than one net intf */ - net_discovered_interface(NULL); - } + if (type == NETWORK_DEVICES) { + log_message("NET: Loading driver for network device %s", description); + wait_message("Loading driver for network device:\n \n%s", description); + failed = my_modprobe(driver, NETWORK_DEVICES, NULL); + warning_insmod_failed(failed); + remove_wait_message(); + } #endif - } - } - } +#ifdef ENABLE_USB + if (type == USB_CONTROLLERS) + /* we can't allow additional modules floppy since we need usbhid for keystrokes of usb keyboards */ + failed = my_modprobe(driver, USB_CONTROLLERS, NULL); +#endif +} - fclose(f); +void probe_pci_modules(enum driver_type type, char **pci_modules, unsigned int pci_modules_len) { + struct pciusb_entries entries; + int i; + + entries = pci_probe(); + for (i = 0; i < entries.nb; i++) { + struct pciusb_entry *e = &entries.entries[i]; + if (device_match_modules_list(e, pci_modules, pci_modules_len)) { + log_message("PCI: device %04x %04x %04x %04x is \"%s\", driver is %s", + e->vendor, e->device, e->subvendor, e->subdevice, safe_descr(e->text), e->module); + discovered_device(type, e->text, e->module); + } } + pciusb_free(&entries); } +/** Loads modules for known virtio devices + * + * virtio modules are not being loaded using the PCI probing mechanism + * because pcitable.gz does not have IDs for these devices. + * + * The possible correct solution for it is to fix the script which + * generates pcitable.gz to handle the virtio_device_id structure. + */ +void probe_virtio_modules(void) +{ + struct pciusb_entries entries; + int i; + char *name; + char *options; + int loaded_pci = 0; + + entries = pci_probe(); + for (i = 0; i < entries.nb; i++) { + struct pciusb_entry *e = &entries.entries[i]; + if (e->vendor == VIRTIO_PCI_VENDOR) { + if (!loaded_pci) { + log_message("loading virtio-pci"); + my_modprobe("virtio_pci", ANY_DRIVER_TYPE, NULL); + loaded_pci = 1; + } -#ifndef DISABLE_MEDIAS -static struct media_info * medias = NULL; + name = NULL; + options = NULL; + + switch (e->subdevice) { + case VIRTIO_ID_NET: + name = "virtio_net"; + options = "csum=0"; + break; + case VIRTIO_ID_BLOCK: + name = "virtio_blk"; + break; + case VIRTIO_ID_BALLOON: + name = "virtio_balloon"; + break; + default: + log_message("warning: unknown virtio device %04x", e->device); + } + if (name) { + log_message("virtio: loading %s", name); + my_modprobe(name, ANY_DRIVER_TYPE, options); + } + } + } + pciusb_free(&entries); +} -static void find_media(void) +#ifdef ENABLE_USB +void probe_that_type(enum driver_type type, enum media_bus bus) +#else +void probe_that_type(enum driver_type type, enum media_bus bus __attribute__ ((unused))) +#endif { - char b[50]; - char buf[500]; - struct media_info tmp[50]; - int count; - int fd; + static int already_probed_usb_controllers = 0; + static int already_loaded_usb_scsi = 0; + static int already_probed_virtio_devices = 0; - if (!medias) - probe_that_type(SCSI_ADAPTERS); - else - free(medias); /* that does not free the strings, by the way */ + /* ---- PCI probe ---------------------------------------------- */ + if (bus != BUS_USB) { + switch (type) { +#ifndef DISABLE_PCIADAPTERS +#ifndef DISABLE_MEDIAS + static int already_probed_media_adapters = 0; + case MEDIA_ADAPTERS: + if (already_probed_media_adapters) + break; + already_probed_media_adapters = 1; + probe_pci_modules(type, medias_ide_pci_modules, medias_ide_pci_modules_len); + probe_pci_modules(type, medias_other_pci_modules, medias_other_pci_modules_len); + break; +#endif +#ifndef DISABLE_NETWORK + case NETWORK_DEVICES: + probe_pci_modules(type, network_pci_modules, network_pci_modules_len); + break; +#endif +#endif +#ifdef ENABLE_USB + case USB_CONTROLLERS: + if (already_probed_usb_controllers || IS_NOAUTO) + break; + already_probed_usb_controllers = 1; + probe_pci_modules(type, usb_controller_modules, usb_controller_modules_len); + break; +#endif + case VIRTIO_DEVICES: + if (already_probed_virtio_devices) + break; + probe_virtio_modules(); + already_probed_virtio_devices = 1; + break; + default: + break; + } + } - /* ----------------------------------------------- */ - log_message("looking for ide media"); - count = 0; - strcpy(b, "/proc/ide/hd"); - for (b[12] = 'a'; b[12] <= 'h'; b[12]++) { +#ifdef ENABLE_USB + /* ---- USB probe ---------------------------------------------- */ + if ((bus == BUS_USB || bus == BUS_ANY) && !(IS_NOAUTO)) { + static int already_mounted_usbdev = 0; + struct pciusb_entries entries; int i; - - /* first, test if file exists (will tell if attached medium exists) */ - b[13] = '\0'; - if (access(b, R_OK)) - continue; - tmp[count].name = strdup("hda"); - tmp[count].name[2] = b[12]; + if (!already_probed_usb_controllers) + probe_that_type(USB_CONTROLLERS, BUS_ANY); - /* media type */ - strcpy(b + 13, "/media"); - fd = open(b, O_RDONLY); - if (fd == -1) { - log_message("failed to open %s for reading", b); - continue; + if (!already_mounted_usbdev) { + already_mounted_usbdev = 1; + wait_message("Detecting USB devices."); + sleep(4); /* sucking background work */ + my_modprobe("usbhid", ANY_DRIVER_TYPE, NULL); + remove_wait_message(); } - i = read(fd, buf, sizeof(buf)); - if (i == -1) { - log_message("failed to read %s", b); - continue; + if (type != NETWORK_DEVICES) + goto end_usb_probe; + + entries = usb_probe(); + for (i = 0; i < entries.nb; i++) { + struct pciusb_entry *e = &entries.entries[i]; + if (device_match_modules_list(e, usb_modules, usb_modules_len)) { + log_message("USB: device %04x %04x is \"%s\" (%s)", e->vendor, e->device, safe_descr(e->text), e->module); + discovered_device(type, e->text, e->module); + } } - buf[i] = '\0'; - close(fd); + pciusb_free(&entries); + end_usb_probe:; + } +#endif - if (!strncmp(buf, "disk", strlen("disk"))) - tmp[count].type = DISK; - else if (!strncmp(buf, "cdrom", strlen("cdrom"))) - tmp[count].type = CDROM; - else if (!strncmp(buf, "tape", strlen("tape"))) - tmp[count].type = TAPE; - else if (!strncmp(buf, "floppy", strlen("floppy"))) - tmp[count].type = FLOPPY; - else - tmp[count].type = UNKNOWN_MEDIA; +#ifdef ENABLE_PCMCIA + /* ---- PCMCIA probe ---------------------------------------------- */ + if ((bus == BUS_PCMCIA || bus == BUS_ANY) && !(IS_NOAUTO)) { + struct pcmcia_alias * pcmciadb = NULL; + unsigned int len = 0; + char *base = "/sys/bus/pcmcia/devices"; + DIR *dir; + struct dirent *dent; - /* media model */ - strcpy(b + 13, "/model"); - fd = open(b, O_RDONLY); - if (fd == -1) { - log_message("failed to open %s for reading", b); - continue; - } + dir = opendir(base); + if (dir == NULL) + goto end_pcmcia_probe; - i = read(fd, buf, sizeof(buf)); - if (i <= 0) { - log_message("failed to read %s", b); - tmp[count].model = strdup("(none)"); - } - else { - buf[i-1] = '\0'; /* eat the \n */ - tmp[count].model = strdup(buf); + switch (type) { +#ifndef DISABLE_MEDIAS + case MEDIA_ADAPTERS: + pcmciadb = medias_pcmcia_ids; + len = medias_pcmcia_num_ids; + break; +#endif +#ifndef DISABLE_NETWORK + case NETWORK_DEVICES: + pcmciadb = network_pcmcia_ids; + len = network_pcmcia_num_ids; + break; +#endif + default: + goto end_pcmcia_probe; + } + + for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) { + struct sysfs_attribute *modalias_attr; + char keyfile[300]; + int i, id; + + if (dent->d_name[0] == '.') + continue; + + log_message("PCMCIA: device found %s", dent->d_name); + + snprintf(keyfile, sizeof(keyfile)-1, "%s/%s/modalias", base, dent->d_name); + modalias_attr = sysfs_open_attribute(keyfile); + if (!modalias_attr) + continue; + if (sysfs_read_attribute(modalias_attr) != 0 || !modalias_attr->value) { + sysfs_close_attribute(modalias_attr); + continue; + } + + log_message("PCMCIA: device found %s", modalias_attr->value); + + for (i = 0; i < len; i++) { + if (!fnmatch(pcmciadb[i].modalias, modalias_attr->value, 0)) { + char product[256]; + + log_message("PCMCIA: device found %s (%s)", pcmciadb[i].modalias, pcmciadb[i].module); + strcpy(product, ""); + for (id = 1; id <= 4; id++) { + struct sysfs_attribute *product_attr; + snprintf(keyfile, sizeof(keyfile)-1, "%s/%s/prod_id%d", base, dent->d_name, id); + product_attr = sysfs_open_attribute(keyfile); + if (!product_attr) + continue; + if (sysfs_read_attribute(product_attr) || !product_attr->value) { + sysfs_close_attribute(product_attr); + continue; + } + snprintf(product + strlen(product), sizeof(product)-strlen(product)-1, "%s%s", product[0] ? " " : "", product_attr->value); + if (product[strlen(product)-1] == '\n') + product[strlen(product)-1] = '\0'; + sysfs_close_attribute(product_attr); + } + + if (!product[0]) + strcpy(product, "PCMCIA device"); + + log_message("PCMCIA: device found %s (%s)", product, pcmciadb[i].module); + discovered_device(type, product, pcmciadb[i].module); + } + } + + sysfs_close_attribute(modalias_attr); } - close(fd); + end_pcmcia_probe:; + if (dir) + closedir(dir); + } +#endif - log_message("IDE/%d: %s is a %s", tmp[count].type, tmp[count].name, tmp[count].model); - tmp[count].bus = IDE; - count++; - } + /* be sure to load usb-storage after media adapters, so that they are in + same order than reboot, so that naming is the same */ + if (type == MEDIA_ADAPTERS && (bus == BUS_USB || bus == BUS_SCSI || bus == BUS_ANY) && + already_probed_usb_controllers && !already_loaded_usb_scsi) { + already_loaded_usb_scsi = 1; + /* we can't allow additional modules floppy since we need usbkbd for keystrokes of usb keyboards */ + my_modprobe("usb_storage", MEDIA_ADAPTERS, NULL); + if (module_already_present("ieee1394")) + my_modprobe("sbp2", MEDIA_ADAPTERS, NULL); + wait_message("Detecting USB mass-storage devices."); +#ifndef DEBUG + sleep(10); /* sucking background work */ +#endif + remove_wait_message(); + } +} - /* ----------------------------------------------- */ - log_message("looking for scsi media"); +static struct media_info * medias = NULL; + +// Read a short string from a file and strips it, intended for sysfs attributes +static ssize_t read_attribute(char *path, char *buf) { + ssize_t l = 0; + int fd = open(path, O_RDONLY); + buf[0] = '\0'; + if (fd == -1) { + log_message("Failed to open %s for reading", path); + } else { + ssize_t n = read(fd, buf, 32); + if (n == -1) { + log_message("Couldn't read file (%s)", path); + } else { + // Strip whitespaces and newline + for (int i = n-1; i >= 0; i--) { + if (buf[i] == '\n' || buf[i] == ' ') + continue; + l = i+1; + break; + } + buf[l] = '\0'; + } + close(fd); + } + log_message("Content of %s was %s", path, buf); + return l; +} +void find_media(enum media_bus bus) +{ + char buf[5000]; + struct media_info tmp[50]; + int count = 0; + + if (medias) + free(medias); /* that does not free the strings, by the way */ - fd = open("/proc/scsi/scsi", O_RDONLY); - if (fd != -1) { - enum { SCSI_TOP, SCSI_HOST, SCSI_VENDOR, SCSI_TYPE } state = SCSI_TOP; - char * start, * chptr, * next, * end; - char scsi_disk_count = 'a'; - char scsi_cdrom_count = '0'; - char scsi_tape_count = '0'; + log_message("looking for media adapters"); + probe_that_type(MEDIA_ADAPTERS, bus); - int i = read(fd, &buf, sizeof(buf)); - if (i < 1) { - close(fd); - goto end_scsi; + /* ----------------------------------------------- */ + log_message("looking for DAC960"); + { + FILE * f; + if ((f = fopen("/tmp/syslog", "rb"))) { + while (fgets(buf, sizeof(buf), f)) { + char * start; + if ((start = strstr(buf, "/dev/rd/"))) { + char * end = strchr(start, ':'); + if (!end) + log_message("Inconsistency in syslog, line:\n%s", buf); + else { + *end = '\0'; + tmp[count].name = strdup(start+5); + tmp[count].type = DISK; + start = end + 2; + end = strchr(start, ','); + if (end) { + *end = '\0'; + tmp[count].model = strdup(start); + } else + tmp[count].model = "(unknown)"; + log_message("DAC960: found %s (%s)", tmp[count].name, tmp[count].model); + count++; + } + } + } + fclose(f); } - close(fd); - buf[i] = '\0'; - - if (!strncmp(buf, "Attached devices: none", strlen("Attached devices: none"))) - goto end_scsi; - - start = buf; - while (*start) { - char tmp_model[50]; - char tmp_name[10]; - - chptr = start; - while (*chptr != '\n') chptr++; - *chptr = '\0'; - next = chptr + 1; - - switch (state) { - case SCSI_TOP: - if (strncmp(start, "Attached devices: ", strlen("Attached devices: "))) - goto end_scsi; - state = SCSI_HOST; - break; + } + /* ----------------------------------------------- */ + log_message("looking for other disks"); + { + glob_t globbuf; + // TODO: We should switch everything to here, and later switch to ignoring + // some types of disks (ram, loop, ...) rather than a list to accept. + glob("/sys/block/nvme*", 0, NULL, &globbuf); + glob("/sys/block/vd*", GLOB_APPEND, NULL, &globbuf); + glob("/sys/block/cciss*", GLOB_APPEND, NULL, &globbuf); + glob("/sys/block/fd*", GLOB_APPEND, NULL, &globbuf); + glob("/sys/block/sd*", GLOB_APPEND, NULL, &globbuf); + glob("/sys/block/st*", GLOB_APPEND, NULL, &globbuf); + glob("/sys/block/sr*", GLOB_APPEND, NULL, &globbuf); + + for (int i = 0; i < globbuf.gl_pathc; i++) { + char *name, *pathend; + char path[64]; + char model[64]; + int vendor_length = 0; + + strncpy(path, globbuf.gl_pathv[i], sizeof(path)); + name = strdup(path + 11); + + // Replace ! with /, for example for cciss!c0d0 devices + char * c = name; + while((c = strchr(c, '!')) != NULL) { + *c = '/'; + c++; + } - case SCSI_HOST: - if (strncmp(start, "Host: ", strlen("Host: "))) - goto end_scsi; - state = SCSI_VENDOR; - break; + pathend = path + strlen(path); - case SCSI_VENDOR: - if (strncmp(start, " Vendor: ", strlen(" Vendor: "))) - goto end_scsi; - - /* (1) Grab Vendor info */ - start += 10; - end = chptr = strstr(start, "Model:"); - if (!chptr) - goto end_scsi; - - chptr--; - while (*chptr == ' ') - chptr--; - if (*chptr == ':') { - chptr++; - *(chptr + 1) = '\0'; - strcpy(tmp_model,"(unknown)"); - } else { - *(chptr + 1) = '\0'; - strcpy(tmp_model, start); + // Check if this device had been handled by other code + int exists = 0; + for (int j = 0; j < count; j++) { + if (!strcmp(name, tmp[j].name)) { + exists = 1; + break; } + } + if (exists) { + free(name); + continue; + } - /* (2) Grab Model info */ - start = end; - start += 7; - - chptr = strstr(start, "Rev:"); - if (!chptr) - goto end_scsi; - - chptr--; - while (*chptr == ' ') chptr--; - *(chptr + 1) = '\0'; - - strcat(tmp_model, " "); - strcat(tmp_model, start); - - tmp[count].model = strdup(tmp_model); - - state = SCSI_TYPE; + strcpy(model, "Unknown Disk"); - break; + strcpy(pathend, "/device/vendor"); + vendor_length = read_attribute(path, model); - case SCSI_TYPE: - if (strncmp(" Type:", start, 7)) - goto end_scsi; - *tmp_name = '\0'; - - if (strstr(start, "Direct-Access")) { - sprintf(tmp_name, "sd%c", scsi_disk_count++); - tmp[count].type = DISK; - } else if (strstr(start, "Sequential-Access")) { - sprintf(tmp_name, "st%c", scsi_tape_count++); - tmp[count].type = TAPE; - } else if (strstr(start, "CD-ROM")) { - sprintf(tmp_name, "scd%c", scsi_cdrom_count++); - tmp[count].type = CDROM; - } + if (vendor_length) { + strcat(model, " "); + vendor_length++; + } - if (*tmp_name) { - tmp[count].name = strdup(tmp_name); - log_message("SCSI/%d: %s is a %s", tmp[count].type, tmp[count].name, tmp[count].model); - tmp[count].bus = SCSI; - count++; - } - - state = SCSI_HOST; + strcpy(pathend, "/device/model"); + read_attribute(path, model+vendor_length); + + strcpy(pathend, "/capability"); + read_attribute(path, buf); + long caps = strtol(buf, NULL, 16); + + // GENHD_FL_UP (0x0010): indicated that the block device is “up†but the kernel has removed that info + if (caps && 0) { + log_message("Ignoring device %s (not up)", name); + free(name); + continue; + } + + if (caps & 0x0400) { + log_message("Ignoring device %s (hidden)", name); + free(name); + continue; + } + + tmp[count].type = DISK; + if (caps & 0x0008 || !strncmp(name, "sr", 2)) { + tmp[count].type = CDROM; + } else if (!strncmp(name, "fd", 2)) { + tmp[count].type = FLOPPY; + } else if (!strncmp(name, "st", 2)) { + tmp[count].type = TAPE; } - - start = next; + + tmp[count].name = name; + tmp[count].model = strdup(model); + count++; } - - end_scsi: + globfree(&globbuf); } /* ----------------------------------------------- */ tmp[count].name = NULL; count++; - medias = memdup(tmp, sizeof(struct media_info) * count); + medias = _memdup(tmp, sizeof(struct media_info) * count); } /* Finds by media */ -void get_medias(enum media_type media, char *** names, char *** models) +void get_medias(enum media_type media, char *** names, char *** models, enum media_bus bus) { struct media_info * m; char * tmp_names[50]; char * tmp_models[50]; int count; - find_media(); + find_media(bus); m = medias; @@ -425,59 +730,74 @@ void get_medias(enum media_type media, char *** names, char *** models) tmp_names[count] = NULL; tmp_models[count++] = NULL; - *names = memdup(tmp_names, sizeof(char *) * count); - *models = memdup(tmp_models, sizeof(char *) * count); + *names = _memdup(tmp_names, sizeof(char *) * count); + *models = _memdup(tmp_models, sizeof(char *) * count); } -#endif /* DISABLE_MEDIAS */ #ifndef DISABLE_NETWORK -int net_device_available(char * device) { - struct ifreq req; - int s; - - s = socket(AF_INET, SOCK_DGRAM, 0); - if (s < 0) { - log_perror(device); - return 0; - } - strcpy(req.ifr_name, device); - if (ioctl(s, SIOCGIFFLAGS, &req)) { - /* if we can't get the flags, the networking device isn't available */ - close(s); - return 0; +static int is_net_interface_blacklisted(char *intf) +{ + /* see detect_devicess::is_lan_interface() */ + char * blacklist[] = { "lo", "ippp", "isdn", "plip", "ppp", "wifi", "sit", NULL }; + char ** ptr = blacklist; + + while (ptr && *ptr) { + if (!strncmp(intf, *ptr, strlen(*ptr))) + return 1; + ptr++; } - close(s); - return 1; -} + return 0; +} char ** get_net_devices(void) { - char * devices[] = { - "eth0", "eth1", "eth2", "eth3", - "tr0", - "plip0", "plip1", "plip2", - "fddi0", - NULL - }; - char ** ptr = devices; char * tmp[50]; - int i = 0; static int already_probed = 0; + FILE * f; + int i = 0; if (!already_probed) { - already_probed = 1; /* cut off loop brought by: probe_that_type => my_insmod => get_net_devices */ - probe_that_type(NETWORK_DEVICES); + already_probed = 1; /* cut off loop brought by: probe_that_type => my_modprobe => get_net_devices */ + probe_that_type(NETWORK_DEVICES, BUS_ANY); } - while (ptr && *ptr) { - if (net_device_available(*ptr)) - tmp[i++] = strdup(*ptr); - ptr++; + /* use /proc/net/dev since SIOCGIFCONF doesn't work with some drivers (rt2500) */ + f = fopen("/proc/net/dev", "rb"); + if (f) { + char line[128]; + + /* skip the two first lines */ + fgets(line, sizeof(line), f); + fgets(line, sizeof(line), f); + + while (1) { + char *start, *end; + if (!fgets(line, sizeof(line), f)) + break; + start = line; + while (*start == ' ') + start++; + end = strchr(start, ':'); + if (end) + end[0] = '\0'; + if (!is_net_interface_blacklisted(start)) { + log_message("found net interface %s", start); + tmp[i++] = strdup(start); + } else { + log_message("found net interface %s, but blacklisted", start); + } + } + + fclose(f); + } else { + log_message("net: could not open devices file"); } + tmp[i++] = NULL; - return memdup(tmp, sizeof(char *) * i); + return _memdup(tmp, sizeof(char *) * i); + } #endif /* DISABLE_NETWORK */ diff --git a/mdk-stage1/probing.h b/mdk-stage1/probing.h index ea618b7b1..702c9d056 100644 --- a/mdk-stage1/probing.h +++ b/mdk-stage1/probing.h @@ -1,7 +1,7 @@ /* - * Guillaume Cottenceau (gc@mandrakesoft.com) + * Guillaume Cottenceau (gc) * - * Copyright 2000 MandrakeSoft + * Copyright 2000 Mandriva * * This software may be freely redistributed under the terms of the GNU * public license. @@ -24,13 +24,40 @@ enum media_type { CDROM, DISK, FLOPPY, TAPE, UNKNOWN_MEDIA }; -enum driver_type { SCSI_ADAPTERS, NETWORK_DEVICES, ANY_DRIVER_TYPE }; +enum driver_type { MEDIA_ADAPTERS, NETWORK_DEVICES, USB_CONTROLLERS, + VIRTIO_DEVICES, ANY_DRIVER_TYPE }; -void get_medias(enum media_type media, char *** names, char *** models); +enum media_bus { BUS_IDE, BUS_SCSI, BUS_USB, BUS_PCMCIA, BUS_ANY }; + +#define VIRTIO_PCI_VENDOR 0x1af4 +#define VIRTIO_ID_NET 0x0001 +#define VIRTIO_ID_BLOCK 0x0002 +#define VIRTIO_ID_BALLOON 0x0005 + +void find_media(enum media_bus bus); +void get_medias(enum media_type media, char *** names, char *** models, enum media_bus bus); char ** get_net_devices(void); -void net_discovered_interface(char * intf_name); char * get_net_intf_description(char * intf_name); -void prepare_intf_descr(const char * intf_descr); +void probe_that_type(enum driver_type type, enum media_bus bus); + +/* Make sure the MATCH_ALL value is greater than all possible values + for subvendor & subdevice: this simplifies the orderer */ +#define PCITABLE_MATCH_ALL 0x10000 +struct pcitable_entry { + /* some bits stolen from pci-resource/pci-ids.h + * FIXME: split pci-ids.h into pci-ids.c and pci-ids.h so that the header can be re-used + */ + unsigned short vendor; /* PCI vendor id */ + unsigned short device; /* PCI device id */ + unsigned int subvendor; /* PCI subvendor id */ + unsigned int subdevice; /* PCI subdevice id */ + char module[20]; /* module to load */ + char description[100]; /* PCI human readable description */ +}; +extern struct pcitable_entry *detected_devices; +extern int detected_devices_len; +void probing_detect_devices(); +void probing_destroy(void); #endif diff --git a/mdk-stage1/rescue-gui.c b/mdk-stage1/rescue-gui.c new file mode 100644 index 000000000..c7aae6126 --- /dev/null +++ b/mdk-stage1/rescue-gui.c @@ -0,0 +1,301 @@ +/* + * Guillaume Cottenceau (gc) + * + * Copyright 2001 Mandriva + * + * + * This software may be freely redistributed under the terms of the GNU + * public license. + * + * 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> +#define _USE_BSD +#include <sys/types.h> +#include <sys/time.h> +#include <sys/resource.h> +#include <sys/wait.h> +#include <unistd.h> +#include <string.h> +#include <stdio.h> +#include <sys/mount.h> +#include <fcntl.h> +#include <sys/ioctl.h> +#include <linux/unistd.h> +#include <sys/select.h> +#include <linux/reboot.h> + +#include "config-stage1.h" +#include "frontend.h" +#include "utils.h" +#include "params.h" + +#include <sys/syscall.h> + +static inline long reboot(void) +{ + return (long) syscall(__NR_reboot, LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, LINUX_REBOOT_CMD_RESTART, 0); +} + +#if defined(__i386__) || defined(__x86_64__) +#define ENABLE_RESCUE_MS_BOOT 1 +#endif + +char * env[] = { + "PATH=/usr/bin:/bin:/sbin:/usr/sbin:/mnt/sbin:/mnt/usr/sbin:/mnt/bin:/mnt/usr/bin", + "LD_LIBRARY_PATH=/lib:/usr/lib:/mnt/lib:/mnt/usr/lib" +#if defined(__x86_64__) + ":/lib64:/usr/lib64:/mnt/lib64:/mnt/usr/lib64" +#endif + , + "HOME=/", + "TERM=linux", + "TERMINFO=/etc/terminfo", + NULL +}; + +/* pause() already exists and causes the invoking process to sleep + until a signal is received */ +static void PAUSE(void) { + unsigned char t; + fflush(stdout); + read(0, &t, 1); +} + + +/* ------ UUURGH this is duplicated from `init.c', don't edit here........ */ +void fatal_error(char *msg) +{ + printf("FATAL ERROR IN RESCUE: %s\n\nI can't recover from this.\nYou may reboot your system.\n", msg); + while (1); +} + +#define LOOP_CLR_FD 0x4C01 +void del_loop(char *device) +{ + int fd; + if ((fd = open(device, O_RDONLY, 0)) < 0) { + printf("del_loop open failed\n"); + return; + } + + if (ioctl(fd, LOOP_CLR_FD, 0) < 0) { + printf("del_loop ioctl failed"); + return; + } + + close(fd); +} +struct filesystem { char * dev; char * name; char * fs; int mounted; }; +void unmount_filesystems(void) +{ + int fd, size; + char buf[65535]; /* this should be big enough */ + char *p; + struct filesystem fs[500]; + int numfs = 0; + int i, nb; + + printf("unmounting filesystems...\n"); + + fd = open("/proc/mounts", O_RDONLY, 0); + if (fd < 1) { + printf("ERROR: failed to open /proc/mounts"); + sleep(2); + return; + } + + size = read(fd, buf, sizeof(buf) - 1); + buf[size] = '\0'; + + close(fd); + + p = buf; + while (*p) { + fs[numfs].mounted = 1; + fs[numfs].dev = p; + while (*p != ' ') p++; + *p++ = '\0'; + fs[numfs].name = p; + while (*p != ' ') p++; + *p++ = '\0'; + fs[numfs].fs = p; + while (*p != ' ') p++; + *p++ = '\0'; + while (*p != '\n') p++; + p++; + if (strcmp(fs[numfs].name, "/") != 0) numfs++; /* skip if root, no need to take initrd root in account */ + } + + /* Pixel's ultra-optimized sorting algorithm: + multiple passes trying to umount everything until nothing moves + anymore (a.k.a holy shotgun method) */ + do { + nb = 0; + for (i = 0; i < numfs; i++) { + /*printf("trying with %s\n", fs[i].name);*/ + if (fs[i].mounted && umount(fs[i].name) == 0) { + if (strncmp(fs[i].dev + sizeof("/dev/") - 1, "loop", + sizeof("loop") - 1) == 0) + del_loop(fs[i].dev); + + printf("\t%s\n", fs[i].name); + fs[i].mounted = 0; + nb++; + } + } + } while (nb); + + for (i = nb = 0; i < numfs; i++) + if (fs[i].mounted) { + printf("\t%s umount failed\n", fs[i].name); + if (strcmp(fs[i].fs, "ext4") == 0) nb++; /* don't count not-ext4 umount failed */ + } + + if (nb) { + printf("failed to umount some filesystems\n"); + while (1); + } +} +/* ------ UUURGH -- end */ + + +/* ------ UUURGH -- this is dirrrrrttttyyyyyy */ +void probe_that_type(void) {} + + +int main(int argc __attribute__ ((unused)), char **argv __attribute__ ((unused))) +{ + enum return_type results; + + char install_bootloader[] = "Re-install Boot Loader"; +#if ENABLE_RESCUE_MS_BOOT + char restore_ms_boot[] = "Restore Windows Boot Loader"; +#endif + char mount_parts[] = "Mount your partitions under /mnt"; + char go_to_console[] = "Go to console"; + char reboot_[] = "Reboot"; + char doc[] = "Doc: what's addressed by this Rescue?"; + + char upgrade[] = "Upgrade to New Version"; + char rootpass[] = "Reset Root Password"; + char userpass[] = "Reset User Password"; + char factory[] = "Reset to Factory Defaults"; + char backup[] = "Backup User Files"; + char restore[] = "Restore User Files from Backup"; + char badblocks[] = "Test Key for Badblocks"; + + char * actions_default[] = { install_bootloader, +#if ENABLE_RESCUE_MS_BOOT + restore_ms_boot, +#endif + mount_parts, go_to_console, reboot_, doc, NULL }; + char * actions_flash_rescue[] = { rootpass, userpass, factory, backup, restore, + badblocks, go_to_console, reboot_, NULL }; + char * actions_flash_upgrade[] = { upgrade, go_to_console, reboot_, NULL }; + + + char * flash_mode; + char ** actions; + char * choice; + + process_cmdline(); + flash_mode = get_param_valued("flash"); + actions = !flash_mode ? + actions_default : + streq(flash_mode, "upgrade") ? actions_flash_upgrade : actions_flash_rescue; + + init_frontend("Welcome to " DISTRIB_NAME " Rescue (" DISTRIB_VERSION ") " __DATE__ " " __TIME__); + + do { + int pid; + char * binary = NULL; + + choice = ""; + results = ask_from_list("Please choose the desired action.", actions, &choice); + + if (ptr_begins_static_str(choice, install_bootloader)) { + binary = "/usr/bin/install_bootloader"; + } +#if ENABLE_RESCUE_MS_BOOT + if (ptr_begins_static_str(choice, restore_ms_boot)) { + binary = "/usr/bin/restore_ms_boot"; + } +#endif + if (ptr_begins_static_str(choice, mount_parts)) { + binary = "/usr/bin/guessmounts"; + } + if (ptr_begins_static_str(choice, reboot_)) { + finish_frontend(); + sync(); sync(); + sleep(2); + unmount_filesystems(); + sync(); sync(); + printf("rebooting system\n"); + sleep(2); + reboot(); + } + if (ptr_begins_static_str(choice, doc)) { + binary = "/usr/bin/rescue-doc"; + } + + /* Mandriva Flash entries */ + if (ptr_begins_static_str(choice, rootpass)) { + binary = "/usr/bin/reset_rootpass"; + } + if (ptr_begins_static_str(choice, userpass)) { + binary = "/usr/bin/reset_userpass"; + } + if (ptr_begins_static_str(choice, factory)) { + binary = "/usr/bin/clear_systemloop"; + } + if (ptr_begins_static_str(choice, backup)) { + binary = "/usr/bin/backup_systemloop"; + } + if (ptr_begins_static_str(choice, restore)) { + binary = "/usr/bin/restore_systemloop"; + } + if (ptr_begins_static_str(choice, badblocks)) { + binary = "/usr/bin/test_badblocks"; + } + if (ptr_begins_static_str(choice, upgrade)) { + binary = "/usr/bin/upgrade"; + } + + if (binary) { + int wait_status; + suspend_to_console(); + if (!(pid = fork())) { + + char * child_argv[2]; + child_argv[0] = binary; + child_argv[1] = NULL; + + execve(child_argv[0], child_argv, env); + printf("Can't execute binary (%s)\n<press Enter>\n", binary); + PAUSE(); + + return 33; + } + while (wait4(-1, &wait_status, 0, NULL) != pid) {}; + printf("<press Enter to return to Rescue menu>"); + PAUSE(); + resume_from_suspend(); + if (!WIFEXITED(wait_status) || WEXITSTATUS(wait_status) != 0) { + error_message("Program exited abnormally (return code %d).", WEXITSTATUS(wait_status)); + if (WIFSIGNALED(wait_status)) + error_message("(received signal %d)", WTERMSIG(wait_status)); + } + } + + } while (results == RETURN_OK && !ptr_begins_static_str(choice, go_to_console)); + + finish_frontend(); + printf("Bye.\n"); + + return 0; +} diff --git a/mdk-stage1/stage1-data/stage1-with-sash.tar.bz2 b/mdk-stage1/stage1-data/stage1-with-sash.tar.bz2 Binary files differdeleted file mode 100644 index 56279ae90..000000000 --- a/mdk-stage1/stage1-data/stage1-with-sash.tar.bz2 +++ /dev/null diff --git a/mdk-stage1/stage1-data/stage1.tar.bz2 b/mdk-stage1/stage1-data/stage1.tar.bz2 Binary files differdeleted file mode 100644 index 98e62b362..000000000 --- a/mdk-stage1/stage1-data/stage1.tar.bz2 +++ /dev/null diff --git a/mdk-stage1/stage1.c b/mdk-stage1/stage1.c index 8956a2a7f..94bb1e0df 100644 --- a/mdk-stage1/stage1.c +++ b/mdk-stage1/stage1.c @@ -1,9 +1,7 @@ /* - * Guillaume Cottenceau (gc@mandrakesoft.com) + * Guillaume Cottenceau (gc) * - * Copyright 2000 MandrakeSoft - * - * View the homepage: http://us.mandrakesoft.com/~gc/html/stage1.html + * Copyright 2000-2004 Mandriva * * * This software may be freely redistributed under the terms of the GNU @@ -22,19 +20,21 @@ * */ -#include <sys/mount.h> +#include <stdlib.h> +#include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> -#include <unistd.h> -#include <sys/ioctl.h> -#include <signal.h> - -#include <stdlib.h> #include <stdio.h> +#include <sys/ioctl.h> +#include <sys/mount.h> #include <string.h> #include <errno.h> #include <ctype.h> +#include <stdarg.h> +#include <signal.h> +#include <linux/unistd.h> +#include <libldetect.h> #include "stage1.h" @@ -43,9 +43,10 @@ #include "frontend.h" #include "modules.h" #include "tools.h" +#include "utils.h" #include "automatic.h" #include "mount.h" -#include "insmod.h" +#include "thirdparty.h" #ifdef ENABLE_PCMCIA #include "pcmcia/pcmcia.h" @@ -64,9 +65,9 @@ #endif -/* globals */ +/************************************************************ + * globals */ -char * method_name; void fatal_error(char *msg) @@ -76,12 +77,51 @@ void fatal_error(char *msg) } -/* spawns a shell on console #2 */ -static void spawn_shell(void) +/************************************************************ + * special frontend functs + * (the principle is to not pollute frontend code with stage1-specific stuff) */ + +void stg1_error_message(char *msg, ...) { + va_list args; + va_start(args, msg); + unset_automatic(); + verror_message(msg, args); + va_end(args); +} + +void stg1_fatal_message(char *msg, ...) +{ + va_list args; + va_start(args, msg); + unset_automatic(); + verror_message(msg, args); + va_end(args); + exit(1); +} + +void stg1_info_message(char *msg, ...) +{ + va_list args; + va_start(args, msg); + if (IS_AUTOMATIC) { + vlog_message(msg, args); + return; + } + vinfo_message(msg, args); + va_end(args); +} + + #ifdef SPAWN_SHELL +static pid_t shell_pid = 0; + +/************************************************************ + * spawns a shell on console #2 */ +static void spawn_shell(void) +{ int fd; - char * shell_name = "/sbin/sash"; + char * shell_name[] = { "/bin/sh", NULL }; log_message("spawning a shell"); @@ -91,12 +131,12 @@ static void spawn_shell(void) log_message("cannot open /dev/tty2 -- no shell will be provided"); return; } - else if (access(shell_name, X_OK)) { - log_message("cannot open shell - %s doesn't exist", shell_name); + else if (access(shell_name[0], X_OK)) { + log_message("cannot open shell - %s doesn't exist", shell_name[0]); return; } - if (!fork()) { + if (!(shell_pid = fork())) { dup2(fd, 0); dup2(fd, 1); dup2(fd, 2); @@ -106,23 +146,23 @@ static void spawn_shell(void) if (ioctl(0, TIOCSCTTY, NULL)) log_perror("could not set new controlling tty"); - execl(shell_name, shell_name, NULL); - log_message("execl of %s failed: %s", shell_name, strerror(errno)); + execv(shell_name[0], shell_name); + log_message("execve of %s failed: %s", shell_name[0], strerror(errno)); + exit(-1); } close(fd); } -#endif } +#endif - +#ifdef SPAWN_INTERACTIVE char * interactive_fifo = "/tmp/stage1-fifo"; static pid_t interactive_pid = 0; /* spawns my small interactive on console #6 */ static void spawn_interactive(void) { -#ifdef SPAWN_INTERACTIVE int fd; char * dev = "/dev/tty6"; @@ -153,7 +193,7 @@ static void spawn_interactive(void) perror("could not set new controlling tty"); fif_out = open(interactive_fifo, O_WRONLY); - printf("Please enter your command (availables: [+,-] [rescue,expert]).\n"); + printf("Please enter your command (availables: [+,-] [rescue]).\n"); while (1) { char s[50]; @@ -171,87 +211,53 @@ static void spawn_interactive(void) close(fd); } -#endif } +#endif -static void expert_third_party_modules(void) +#ifdef ENABLE_PCMCIA +static void handle_pcmcia(void) { - enum return_type results; - char * floppy_mount_location = "/tmp/floppy"; - char ** modules; - char final_name[500] = "/tmp/floppy/"; - char * choice; - int rc; - char * questions[] = { "Options", NULL }; - static char ** answers = NULL; - - results = ask_yes_no("If you want to insert third-party kernel modules, insert " - "a Linux (ext2fs) formatted floppy containing the modules and confirm. Otherwise, select \"no\".");; - if (results != RETURN_OK) - return; - - my_insmod("floppy", ANY_DRIVER_TYPE, NULL); + char * pcmcia_adapter; - if (my_mount("/dev/fd0", floppy_mount_location, "ext2") == -1) { - error_message("I can't find a Linux ext2 floppy in first floppy drive."); - return expert_third_party_modules(); - } - - modules = list_directory(floppy_mount_location); - - if (!modules || !*modules) { - error_message("No modules found on floppy disk."); - umount(floppy_mount_location); - return expert_third_party_modules(); - } - - results = ask_from_list("Which driver would you like to insmod?", modules, &choice); - if (results != RETURN_OK) { - umount(floppy_mount_location); + pcmcia_adapter = pcmcia_probe(); + if (!pcmcia_adapter) { + log_message("no pcmcia adapter found"); return; } + my_modprobe("pcmcia_core", ANY_DRIVER_TYPE, NULL); + my_modprobe(pcmcia_adapter, ANY_DRIVER_TYPE, NULL); + /* ds is an alias for pcmcia in recent 2.6 kernels + but we don't have modules.alias in install, so try to load both */ + my_modprobe("ds", ANY_DRIVER_TYPE, NULL); + my_modprobe("pcmcia", ANY_DRIVER_TYPE, NULL); + + /* setup a dynamic resource database for non statically mapped PCMCIA sockets */ + pcmcia_socket_startup(-1); - strcat(final_name, choice); - - results = ask_from_entries("Please enter the options:", questions, &answers, 24, NULL); - if (results != RETURN_OK) { - umount(floppy_mount_location); - return expert_third_party_modules(); - } + add_to_env("PCMCIA", pcmcia_adapter); +} +#endif - rc = insmod_call(final_name, answers[0]); - umount(floppy_mount_location); +#ifndef ENABLE_NETWORK_STANDALONE +static void handle_hid(void) +{ + struct hid_entries entry_list; + unsigned int i; - if (rc) { - log_message("\tfailed"); - error_message("Insmod failed."); + entry_list = hid_probe(); + for (i = 0; i < entry_list.nb; i++) { + if (entry_list.entries[i].module != NULL) + my_modprobe(entry_list.entries[i].module, ANY_DRIVER_TYPE, NULL); } - - return expert_third_party_modules(); + my_modprobe("hid_generic", ANY_DRIVER_TYPE, NULL); } -static void handle_pcmcia(char ** pcmcia_adapter) -{ -#ifdef ENABLE_PCMCIA - *pcmcia_adapter = pcmcia_probe(); - if (!*pcmcia_adapter) { - log_message("no pcmcia adapter found"); - return; - } - my_insmod("pcmcia_core", ANY_DRIVER_TYPE, NULL); - my_insmod(*pcmcia_adapter, ANY_DRIVER_TYPE, NULL); - my_insmod("ds", ANY_DRIVER_TYPE, NULL); - - /* call to cardmgr takes time, let's use the wait message */ - wait_message("Enabling PCMCIA extension cards..."); - log_message("cardmgr rc: %d", cardmgr_call()); - remove_wait_message(); -#endif -} +/************************************************************ + */ -static enum return_type method_select_and_prepare(void) +static void method_select_and_prepare(void) { enum return_type results; char * choice; @@ -268,13 +274,20 @@ static enum return_type method_select_and_prepare(void) char * network_nfs_install = "NFS server"; char * network_nfs_install_auto = "nfs"; char * network_ftp_install = "FTP server"; char * network_ftp_install_auto = "ftp"; char * network_http_install = "HTTP server"; char * network_http_install_auto = "http"; +#ifndef DISABLE_KA + char * network_ka_install = "KA server"; char * network_ka_install_auto = "ka"; #endif +#endif + char * thirdparty_install = "Load third party modules"; char * thirdparty_install_auto = "thirdparty"; i = 0; #ifndef DISABLE_NETWORK means[i] = network_nfs_install; means_auto[i++] = network_nfs_install_auto; means[i] = network_ftp_install; means_auto[i++] = network_ftp_install_auto; means[i] = network_http_install; means_auto[i++] = network_http_install_auto; +#ifndef DISABLE_KA + means[i] = network_ka_install; means_auto[i++] = network_ka_install_auto; +#endif #endif #ifndef DISABLE_CDROM means[i] = cdrom_install; means_auto[i++] = cdrom_install_auto; @@ -282,14 +295,15 @@ static enum return_type method_select_and_prepare(void) #ifndef DISABLE_DISK means[i] = disk_install; means_auto[i++] = disk_install_auto; #endif + means[i] = thirdparty_install; means_auto[i++] = thirdparty_install_auto; means[i] = NULL; - results = ask_from_list_auto("Please choose the mean of installation.", means, &choice, "method", means_auto); + unlink(IMAGE_LOCATION); - if (results != RETURN_OK) - return method_select_and_prepare(); + results = ask_from_list_auto("Please choose the installation method.", means, &choice, "method", means_auto); - results = RETURN_ERROR; + if (results != RETURN_OK) + return method_select_and_prepare(); #ifndef DISABLE_CDROM if (!strcmp(choice, cdrom_install)) @@ -304,92 +318,126 @@ static enum return_type method_select_and_prepare(void) #ifndef DISABLE_NETWORK if (!strcmp(choice, network_nfs_install)) results = nfs_prepare(); - + if (!strcmp(choice, network_ftp_install)) results = ftp_prepare(); if (!strcmp(choice, network_http_install)) results = http_prepare(); + +#ifndef DISABLE_KA + if (!strcmp(choice, network_ka_install)) + results = ka_prepare(); +#endif #endif + if (!strcmp(choice, thirdparty_install)) { + thirdparty_load_modules(); + return method_select_and_prepare(); + } + if (results != RETURN_OK) return method_select_and_prepare(); - return RETURN_OK; + /* try to find third party modules on the install media */ + thirdparty_load_media_modules(); } +#endif +void finish_preparing(void) +{ +#ifdef SPAWN_SHELL + if (shell_pid != 0) { + int fd; + const char *clear = "\033[H\033[J"; + kill(shell_pid, 9); + log_message("killed shell"); + fd = open("/dev/tty2", O_RDWR); + write(fd, clear, strlen(clear)); + close(fd); + } +#endif +} -int main(int argc, char **argv, char **env) +int main(int argc __attribute__ ((unused)), char **argv __attribute__ ((unused)), char **env) { - enum return_type ret; - char ** argptr; - char * stage2_args[30]; - char * pcmcia_adapter = NULL; +#ifdef ENABLE_NETWORK_STANDALONE + open_log(); + init_frontend(""); + + unlink("/etc/resolv.conf"); /* otherwise it is read-only */ + set_param(MODE_AUTOMATIC); + grab_automatic_params("network:dhcp"); - if (getpid() > 50) + intf_select_and_up(); + finish_frontend(); + return 0; +#else + if (getenv("DEBUGSTAGE1")) { + set_param(MODE_DEBUGSTAGE1); set_param(MODE_TESTING); + } +#ifdef SPAWN_INTERACTIVE spawn_interactive(); +#endif open_log(); - log_message("welcome to the " DISTRIB_NAME " install (stage1, version " VERSION " built " __DATE__ " " __TIME__")"); + log_message("welcome to the " DISTRIB_NAME " install (mdk-stage1, version " DISTRIB_VERSION " built " __DATE__ " " __TIME__")"); process_cmdline(); - handle_env(env); +#ifdef SPAWN_SHELL spawn_shell(); +#endif init_modules_insmoding(); - init_frontend(); + init_frontend("Welcome to " DISTRIB_DESCR ", " __DATE__ " " __TIME__); - if (IS_EXPERT) - expert_third_party_modules(); + probe_that_type(VIRTIO_DEVICES, BUS_ANY); - handle_pcmcia(&pcmcia_adapter); + /* load usb interface as soon as possible, helps usb mouse detection in stage2 */ + probe_that_type(USB_CONTROLLERS, BUS_USB); - ret = method_select_and_prepare(); + if (IS_THIRDPARTY) + thirdparty_load_modules(); - finish_frontend(); - close_log(); +#ifdef ENABLE_PCMCIA + if (!IS_NOAUTO) + handle_pcmcia(); +#endif + + handle_hid(); - if (ret != RETURN_OK) - fatal_error("could not select an installation method"); + if (IS_CHANGEDISK) + stg1_info_message("You are starting the installation with an alternate booting method. " + "Please change your disk, and insert the Installation disk."); - if (!IS_RAMDISK) { - if (symlink(IMAGE_LOCATION LIVE_LOCATION, STAGE2_LOCATION) != 0) { - printf("symlink from " IMAGE_LOCATION LIVE_LOCATION " to " STAGE2_LOCATION " failed"); - fatal_error(strerror(errno)); - } + if (IS_RESCUE && total_memory() < MEM_LIMIT_RESCUE) { + stg1_error_message("You are starting the rescue with a low memory configuration. " + "Our experience shows that your system may crash at any point " + "or lock up for no apparent reason. Continue at " + "your own risk. Alternatively, you may reboot your system now."); } + method_select_and_prepare(); + + thirdparty_destroy(); + + if (access(STAGE2_LOCATION, R_OK) != 0) + if (symlink(IMAGE_LOCATION_REL "/" LIVE_LOCATION_REL, STAGE2_LOCATION) != 0) + log_perror("symlink from " IMAGE_LOCATION_REL "/" LIVE_LOCATION_REL " to " STAGE2_LOCATION " failed"); + +#ifdef SPAWN_INTERACTIVE if (interactive_pid != 0) kill(interactive_pid, 9); - - if (IS_RESCUE) { - int fd = open("/proc/sys/kernel/real-root-dev", O_RDWR); -#ifdef __sparc__ - write(fd, "0x1030000", sizeof("0x1030000")); /* ram3 or sparc */ -#else - write(fd, "0x103", sizeof("0x103")); /* ram3 */ #endif - close(fd); - return 66; - } - if (IS_TESTING) - return 0; + finish_preparing(); - argptr = stage2_args; - *argptr++ = "/usr/bin/runinstall2"; - *argptr++ = "--method"; - *argptr++ = method_name; - if (pcmcia_adapter) { - *argptr++ = "--pcmcia"; - *argptr++ = pcmcia_adapter; - } - *argptr++ = NULL; + finish_frontend(); + close_log(); - execve(stage2_args[0], stage2_args, grab_env()); + if (IS_RESCUE) + return 66; /* ask init to exec new init */ - printf("error in exec of stage2 :-(\n"); - fatal_error(strerror(errno)); - - return 0; /* shut up compiler (we can't get here anyway!) */ + return 0; +#endif } diff --git a/mdk-stage1/stage1.h b/mdk-stage1/stage1.h index b99a8fa65..575241323 100644 --- a/mdk-stage1/stage1.h +++ b/mdk-stage1/stage1.h @@ -1,7 +1,7 @@ /* - * Guillaume Cottenceau (gc@mandrakesoft.com) + * Guillaume Cottenceau (gc) * - * Copyright 2000 MandrakeSoft + * Copyright 2000 Mandriva * * This software may be freely redistributed under the terms of the GNU * public license. @@ -23,30 +23,40 @@ #define _STAGE1_H_ #include "config-stage1.h" -#include "tools.h" +#include "params.h" /* Some global stuff */ -enum return_type { RETURN_OK, RETURN_BACK, RETURN_ERROR }; - -extern char * method_name; extern char * interactive_fifo; #define MODE_TESTING (1 << 0) -#define MODE_EXPERT (1 << 1) #define MODE_RESCUE (1 << 3) #define MODE_AUTOMATIC (1 << 4) -#define MODE_SPECIAL_STAGE2 (1 << 8) +#define MODE_KEEP_MOUNTED (1 << 5) /* for rescue */ +#define MODE_DEBUGSTAGE1 (1 << 6) #define MODE_RAMDISK (1 << 9) +#define MODE_CHANGEDISK (1 << 10) +#define MODE_THIRDPARTY (1 << 11) +#define MODE_NOAUTO (1 << 12) +#define MODE_NETAUTO (1 << 13) +#define MODE_RECOVERY (1 << 14) #define IS_TESTING (get_param(MODE_TESTING)) -#define IS_EXPERT (get_param(MODE_EXPERT)) #define IS_RESCUE (get_param(MODE_RESCUE)) #define IS_AUTOMATIC (get_param(MODE_AUTOMATIC)) -#define IS_SPECIAL_STAGE2 (get_param(MODE_SPECIAL_STAGE2)) -#define IS_RAMDISK (get_param(MODE_RAMDISK)) +#define IS_DEBUGSTAGE1 (get_param(MODE_DEBUGSTAGE1)) +#define IS_CHANGEDISK (get_param(MODE_CHANGEDISK)) +#define IS_THIRDPARTY (get_param(MODE_THIRDPARTY)) +#define IS_NOAUTO (get_param(MODE_NOAUTO)) +#define IS_NETAUTO (get_param(MODE_NETAUTO)) +#define IS_RECOVERY (get_param(MODE_RECOVERY)) +#define KEEP_MOUNTED (!IS_RESCUE || get_param(MODE_KEEP_MOUNTED)) + +void fatal_error(char *msg) __attribute__ ((noreturn)); + -void fatal_error(char *msg); +void stg1_error_message(char *msg, ...) __attribute__ ((format (printf, 1, 2))); +void stg1_info_message(char *msg, ...) __attribute__ ((format (printf, 1, 2))); #endif diff --git a/mdk-stage1/stdio-frontend.c b/mdk-stage1/stdio-frontend.c index 7e3cf9b83..8c09330b5 100644 --- a/mdk-stage1/stdio-frontend.c +++ b/mdk-stage1/stdio-frontend.c @@ -1,7 +1,7 @@ /* - * Guillaume Cottenceau (gc@mandrakesoft.com) + * Guillaume Cottenceau (gc) * - * Copyright 2000 MandrakeSoft + * Copyright 2000 Mandriva * * This software may be freely redistributed under the terms of the GNU * public license. @@ -26,16 +26,16 @@ #include <fcntl.h> #include <sys/ioctl.h> #include <termios.h> -#include "stage1.h" -#include "log.h" -#include "newt.h" -#include "frontend.h" +#include <probing.h> +#include "frontend.h" +#include "utils.h" -void init_frontend(void) +void init_frontend(char * welcome_msg) { - printf("Welcome to " DISTRIB_NAME " (" VERSION ") " __DATE__ " " __TIME__ "\n"); + printf(welcome_msg); + printf("\n"); } @@ -46,18 +46,19 @@ void finish_frontend(void) static void get_any_response(void) { unsigned char t; - printf(" (press <enter> to proceed)"); + printf("\n\t(press <enter> to proceed)"); fflush(stdout); read(0, &t, 1); fcntl(0, F_SETFL, O_NONBLOCK); while (read(0, &t, 1) > 0); fcntl(0, F_SETFL, 0); } - + static int get_int_response(void) { char s[50]; - int j = 0, i = 0; /* (0) tied to Cancel */ + int j = 0; + unsigned int i = 0; /* (0) tied to Cancel */ fflush(stdout); read(0, &(s[i++]), 1); fcntl(0, F_SETFL, O_NONBLOCK); @@ -73,16 +74,21 @@ static int get_int_response(void) static char * get_string_response(char * initial_string) { /* I won't use a scanf/%s since I also want the null string to be accepted -- also, I want the initial_string */ - char s[50]; + char s[500]; int i = 0; + int b_index = 0; + char b; + struct termios t; - + + memset(s, '\0', sizeof(s)); + if (initial_string) { printf(initial_string); strcpy(s, initial_string); i = strlen(s); } - + /* from ncurses/tinfo/lib_raw.c:(cbreak) */ tcgetattr(0, &t); t.c_lflag &= ~ICANON; @@ -98,18 +104,50 @@ static char * get_string_response(char * initial_string) fcntl(0, F_SETFL, O_NONBLOCK); while (1) { - if (read(0, &(s[i]), 1) > 0) { - if (s[i] == 13) + if (read(0, &b, 1) > 0) { + if (b_index == 1) { + if (b == 91) { + b_index++; + continue; + } + else + b_index = 0; + } + if (b_index == 2) { + if (b == 67) { + if (s[i] != '\0') { + printf("\033[C"); + i++; + } + } + if (b == 68) { + if (i > 0) { + printf("\033[D"); + i--; + } + } + b_index = 0; + continue; + } + + if (b == 13) break; - if (s[i] == 127) { + if (b == 127) { if (i > 0) { printf("\033[D"); printf(" "); printf("\033[D"); + if (s[i] == '\0') + s[i-1] = '\0'; + else + s[i-1] = ' '; i--; } + } else if (b == 27) { + b_index++; } else { - printf("%c", s[i]); + printf("%c", b); + s[i] = b; i++; } } @@ -123,44 +161,30 @@ static char * get_string_response(char * initial_string) fcntl(0, F_SETFL, 0); printf("\n"); - s[i] = '\0'; return strdup(s); } -static void blocking_msg(char *type, char *fmt, va_list args) +static void blocking_msg(char *type, char *fmt, va_list ap) { printf(type); - vprintf(fmt, args); + vprintf(fmt, ap); get_any_response(); } -void error_message(char *msg, ...) +void verror_message(char *msg, va_list ap) { - va_list args; - va_start(args, msg); - va_end(args); - blocking_msg("> Error! ", msg, args); - unset_param(MODE_AUTOMATIC); + blocking_msg("> Error! ", msg, ap); } -void info_message(char *msg, ...) +void vinfo_message(char *msg, va_list ap) { - va_list args; - va_start(args, msg); - va_end(args); - if (!IS_AUTOMATIC) - blocking_msg("> Notice: ", msg, args); - else - vlog_message(msg, args); + blocking_msg("> Notice: ", msg, ap); } -void wait_message(char *msg, ...) +void vwait_message(char *msg, va_list ap) { - va_list args; printf("Please wait: "); - va_start(args, msg); - vprintf(msg, args); - va_end(args); + vprintf(msg, ap); fflush(stdout); } @@ -172,116 +196,90 @@ void remove_wait_message(void) static int size_progress; static int actually_drawn; -#define PROGRESS_SIZE 60 -void init_progression(char *msg, int size) +#define PROGRESS_SIZE 45 +void init_progression_raw(char *msg, int size) { int i; size_progress = size; - printf("%s\n", msg); + printf("%s ", msg); if (size) { - printf("["); actually_drawn = 0; for (i=0; i<PROGRESS_SIZE; i++) printf("."); - printf("]\033[G["); /* only works on ANSI-compatibles */ + printf("]\033[G%s [", msg); /* only works on ANSI-compatibles */ fflush(stdout); - } + } else + printf("\n"); } -void update_progression(int current_size) +void update_progression_raw(int current_size) { if (size_progress) { - if (current_size <= size_progress) - while ((int)((current_size*PROGRESS_SIZE)/size_progress) > actually_drawn) { - printf("*"); - actually_drawn++; - } + if (current_size > size_progress) + current_size = size_progress; + while ((int)((current_size*PROGRESS_SIZE)/size_progress) > actually_drawn) { + printf("*"); + actually_drawn++; + } } else - printf("\033[G%d bytes read", current_size); - + printf("\033[GStatus: [%8d] bytes loaded...", current_size); + fflush(stdout); } -void end_progression(void) +void end_progression_raw(void) { if (size_progress) { - update_progression(size_progress); + update_progression_raw(size_progress); printf("]\n"); } else printf(" done.\n"); } -enum return_type ask_from_list_comments(char *msg, char ** elems, char ** elems_comments, char ** choice) +enum return_type ask_from_list_index(char *msg, char ** elems, char ** elems_comments, int *answer) { - char ** sav_elems = elems; - int i, j; - - printf("> %s\n(0) Cancel\n", msg); - i = 1; - while (elems && *elems) { - printf("(%d) %s (%s)\n", i, *elems, *elems_comments); - i++; - elems++; - elems_comments++; + int justify_number = 1; + void print_choice_number(int i) { + char tmp[500]; + snprintf(tmp, sizeof(tmp), "[%%%dd]", justify_number); + printf(tmp, i); } + int i = 1; + int j = 0; - printf("? "); - - j = get_int_response(); - - if (j == 0) - return RETURN_BACK; - - if (j >= 1 && j < i) { - *choice = strdup(sav_elems[j-1]); - return RETURN_OK; - } - - return RETURN_ERROR; -} + if (string_array_length(elems) >= 10) + justify_number = 2; + i = 1; -enum return_type ask_from_list(char *msg, char ** elems, char ** choice) -{ - char ** sav_elems = elems; - int i, j; + printf("> %s\n", msg); + print_choice_number(0); + printf(" Cancel"); - i = 0; while (elems && *elems) { - i++; - elems++; - } - - if (i < 10) { - printf("> %s\n(0) Cancel\n", msg); - for (j=0; j<i; j++) - printf("(%d) %s\n", j+1, sav_elems[j]); - } - else { - printf("> %s\n( 0) Cancel\n", msg); - if (i < 20) - for (j=0; j<i; j++) - printf("(%2d) %s\n", j+1, sav_elems[j]); - else { - if (i < 40) - for (j=0; j<i-1; j += 2) - printf("(%2d) %-34s (%2d) %s\n", j+1, sav_elems[j], j+2, sav_elems[j+1]); - else - for (j=0; j<i-3; j += 4) - printf("(%2d) %-14s (%2d) %-14s (%2d) %-14s (%2d) %s\n", - j+1, sav_elems[j], j+2, sav_elems[j+1], j+3, sav_elems[j+2], j+4, sav_elems[j+3]); - if (j < i) { - while (j < i) { - printf("(%2d) %-14s ", j+1, sav_elems[j]); - j++; - } + if (elems_comments && *elems_comments) { + printf("\n"); + print_choice_number(i); + printf(" %s (%s)", *elems, *elems_comments); + j = 0; + } else { + if (j == 0) printf("\n"); - } + print_choice_number(i); + printf(" %-14s ", *elems); + j++; } + if (j == 4) + j = 0; + + if (elems_comments) + elems_comments++; + i++; + elems++; } - printf("? "); + printf("\n? "); j = get_int_response(); @@ -289,7 +287,7 @@ enum return_type ask_from_list(char *msg, char ** elems, char ** choice) return RETURN_BACK; if (j >= 1 && j <= i) { - *choice = strdup(sav_elems[j-1]); + *answer = j - 1; return RETURN_OK; } @@ -301,7 +299,7 @@ enum return_type ask_yes_no(char *msg) { int j; - printf("> %s\n(0) Yes\n(1) No\n(2) Back\n? ", msg); + printf("> %s\n[0] Yes [1] No [2] Back\n? ", msg); j = get_int_response(); @@ -313,7 +311,7 @@ enum return_type ask_yes_no(char *msg) } -enum return_type ask_from_entries(char *msg, char ** questions, char *** answers, int entry_size, void (*callback_func)(char ** strings)) +enum return_type ask_from_entries(char *msg, char ** questions, char *** answers, int entry_size UNUSED, void (*callback_func)(char ** strings) UNUSED) { int j, i = 0; char ** already_answers = NULL; @@ -327,7 +325,7 @@ enum return_type ask_from_entries(char *msg, char ** questions, char *** answers } if (*answers == NULL) - *answers = (char **) malloc(sizeof(char *) * i); + *answers = (char **) calloc(1, sizeof(char *) * i); else already_answers = *answers; @@ -342,7 +340,7 @@ enum return_type ask_from_entries(char *msg, char ** questions, char *** answers (*answers)[j] = get_string_response(NULL); } - printf("(0) Cancel (1) Accept (2) Re-enter answers\n? "); + printf("[0] Cancel [1] Accept [2] Re-enter answers\n? "); r = get_int_response(); if (r == 0) return RETURN_BACK; @@ -350,3 +348,7 @@ enum return_type ask_from_entries(char *msg, char ** questions, char *** answers return RETURN_OK; } } + + +void suspend_to_console(void) {} +void resume_from_suspend(void) {} diff --git a/mdk-stage1/thirdparty.c b/mdk-stage1/thirdparty.c new file mode 100644 index 000000000..78bbf485a --- /dev/null +++ b/mdk-stage1/thirdparty.c @@ -0,0 +1,460 @@ +/* + * Guillaume Cottenceau (gc) + * Olivier Blin (oblin) + * + * Copyright 2005 Mandriva + * + * This software may be freely redistributed under the terms of the GNU + * public license. + * + * 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 <stdio.h> +#include <string.h> +#include <sys/mount.h> +#include <sys/utsname.h> + +#include "stage1.h" +#include "tools.h" +#include "utils.h" +#include "log.h" +#include "modules.h" +#include "mount.h" +#include "frontend.h" +#include "partition.h" +#include "automatic.h" +#include "probing.h" + +#include "thirdparty.h" + +#define THIRDPARTY_MOUNT_LOCATION "/tmp/thirdparty" + +#define N_PCITABLE_ENTRIES 100 +static struct pcitable_entry pcitable[N_PCITABLE_ENTRIES]; +static int pcitable_len = 0; + +static enum return_type thirdparty_choose_device(char ** device, int probe_only) +{ + char ** medias, ** medias_models; + char ** ptr, ** ptr_models; +#ifndef DISABLE_DISK + char ** disk_medias, ** disk_medias_models; + int disk_count; + char * parts[50]; + char * parts_comments[50]; +#endif +#ifndef DISABLE_CDROM + char ** cdrom_medias, ** cdrom_medias_models; + int cdrom_count; +#endif + char * floppy_dev; + enum return_type results; + int count = 0; + + wait_message("Looking for floppy, disk and cdrom devices ..."); + +#ifndef DISABLE_DISK + disk_count = get_disks(&disk_medias, &disk_medias_models); + count += disk_count; +#endif +#ifndef DISABLE_CDROM + cdrom_count = get_cdroms(&cdrom_medias, &cdrom_medias_models); + count += cdrom_count; +#endif + + floppy_dev = floppy_device(); + if (floppy_dev && strstr(floppy_dev, "/dev/") == floppy_dev) { + floppy_dev = floppy_dev + 5; + } + if (floppy_dev) + count += 1; + + remove_wait_message(); + + if (count == 0) { + stg1_error_message("I can't find any floppy, disk or cdrom on this system. " + "No third-party kernel modules will be used."); + return RETURN_BACK; + } + + if (probe_only) { +#ifndef DISABLE_DISK + free(disk_medias); + free(disk_medias_models); +#endif +#ifndef DISABLE_CDROM + free(cdrom_medias); + free(cdrom_medias_models); +#endif + return RETURN_OK; + } + + ptr = medias = malloc((count + 1) * sizeof(char *)); + ptr_models =medias_models = malloc((count + 1) * sizeof(char *)); +#ifndef DISABLE_DISK + memcpy(ptr, disk_medias, disk_count * sizeof(char *)); + memcpy(ptr_models, disk_medias_models, disk_count * sizeof(char *)); + free(disk_medias); + free(disk_medias_models); + ptr += disk_count; + ptr_models += disk_count; +#endif +#ifndef DISABLE_CDROM + memcpy(ptr, cdrom_medias, cdrom_count * sizeof(char *)); + memcpy(ptr_models, cdrom_medias_models, cdrom_count * sizeof(char *)); + free(cdrom_medias); + free(cdrom_medias_models); + cdrom_medias = ptr; /* used later to know if a cdrom is selected */ + ptr += cdrom_count; + ptr_models += cdrom_count; +#endif + if (floppy_dev) { + ptr[0] = floppy_dev; + ptr_models[0] = "Floppy device"; + ptr++; + ptr_models++; + } + ptr[0] = NULL; + ptr_models[0] = NULL; + + if (count == 1) { + *device = medias[0]; + } else { + results = ask_from_list_comments("If you want to insert third-party kernel modules, " + "please select the disk containing the modules.", + medias, medias_models, device); + if (results != RETURN_OK) + return results; + } + + if (floppy_dev && streq(*device, floppy_dev)) { + /* a floppy is selected, don't try to list partitions */ + return RETURN_OK; + } + +#ifndef DISABLE_CDROM + for (ptr = cdrom_medias; ptr < cdrom_medias + cdrom_count; ptr++) { + if (*device == *ptr) { + /* a cdrom is selected, don't try to list partitions */ + log_message("thirdparty: a cdrom is selected, using it (%s)", *device); + return RETURN_OK; + } + } +#endif + +#ifndef DISABLE_DISK + /* a disk or usb key is selected */ + if (list_partitions(*device, parts, parts_comments)) { + stg1_error_message("Could not read partitions information."); + return RETURN_ERROR; + } + + if (parts[0] == NULL) { + stg1_error_message("No partition found."); + return RETURN_ERROR; + } + + /* only one partition has been discovered, don't ask which one to use */ + if (parts[1] == NULL) { + log_message("thirdparty: found only one partition on device (%s)", parts[0]); + *device = parts[0]; + return RETURN_OK; + } + + results = ask_from_list_comments("Please select the partition containing " + "the third party modules.", + parts, parts_comments, device); + if (results == RETURN_OK) + return RETURN_OK; +#endif + + stg1_error_message("Sorry, no third party device can be used."); + + return RETURN_BACK; +} + + +static enum return_type thirdparty_mount_device(char * device) +{ + log_message("third party: trying to mount device %s", device); + if (try_mount(device, THIRDPARTY_MOUNT_LOCATION) != 0) { + stg1_error_message("I can't mount the selected device (%s).", device); + return RETURN_ERROR; + } + return RETURN_OK; +} + + +static enum return_type thirdparty_prompt_modules(const char *modules_location, char ** modules_list) +{ + enum return_type results; + char final_name[500]; + char *module_name; + int rc; + char * questions[] = { "Options", NULL }; + static char ** answers = NULL; + + while (1) { + results = ask_from_list("Which driver would you like to insmod?", modules_list, &module_name); + if (results != RETURN_OK) + break; + + sprintf(final_name, "%s/%s", modules_location, module_name); + + results = ask_from_entries("Please enter the options:", questions, &answers, 24, NULL); + if (results != RETURN_OK) + continue; + + rc = insmod_local_file(final_name, answers[0]); + if (rc) { + log_message("\tfailed"); + stg1_error_message("Insmod failed."); + } + } + return RETURN_OK; +} + + +static int pcitable_orderer(const void *a, const void *b) +{ + int ret; + struct pcitable_entry *ap = (struct pcitable_entry *)a; + struct pcitable_entry *bp = (struct pcitable_entry *)b; + + if ((ret = ap->vendor - bp->vendor) != 0) + return ret; + if ((ret = ap->device - bp->device) != 0) + return ret; + if ((ret = ap->subvendor - bp->subvendor) != 0) + return ret; + if ((ret = ap->subdevice - bp->subdevice) != 0) + return ret; + + return 0; +} + + +static void thirdparty_load_pcitable(const char *modules_location) +{ + char pcitable_filename[100]; + FILE * f = NULL; + + snprintf(pcitable_filename, sizeof(pcitable_filename), "%s/pcitable", modules_location); + if (!(f = fopen(pcitable_filename, "rb"))) { + log_message("third_party: no external pcitable found"); + return; + } + pcitable_len = 0; + while (pcitable_len < N_PCITABLE_ENTRIES) { + char buf[200]; + struct pcitable_entry *e; + if (!fgets(buf, sizeof(buf), f)) break; + e = &pcitable[pcitable_len++]; + if (sscanf(buf, "%hx\t%hx\t\"%[^ \"]\"\t\"%[^\"]\"", &e->vendor, &e->device, e->module, e->description) == 4) + e->subvendor = e->subdevice = PCITABLE_MATCH_ALL; + else + sscanf(buf, "%hx\t%hx\t%x\t%x\t\"%[^ \"]\"\t\"%[^\"]\"", &e->vendor, &e->device, &e->subvendor, &e->subdevice, e->module, e->description); + } + fclose(f); + + /* sort pcitable by most specialised entries first */ + qsort(pcitable, pcitable_len, sizeof(pcitable[0]), pcitable_orderer); +} + + +static int thirdparty_is_detected(char *driver) { + int i, j; + + for (i = 0; i < detected_devices_len ; i++) { + /* first look for the IDs in the third-party pcitable */ + for (j = 0; j < pcitable_len ; j++) { + if (pcitable[j].vendor == detected_devices[i].vendor && + pcitable[j].device == detected_devices[i].device && + !strcmp(pcitable[j].module, driver)) { + const int subvendor = pcitable[j].subvendor; + const int subdevice = pcitable[j].subdevice; + if ((subvendor == PCITABLE_MATCH_ALL && subdevice == PCITABLE_MATCH_ALL) || + (subvendor == detected_devices[i].subvendor && subdevice == detected_devices[i].subdevice)) { + log_message("probing: found device for module %s", driver); + return 1; + } + } + } + /* if not found, compare with the detected driver */ + if (!strcmp(detected_devices[i].module, driver)) { + log_message("probing: found device for module %s", driver); + return 1; + } + } + + return 0; +} + +static enum return_type thirdparty_autoload_modules(const char *modules_location, char ** modules_list, FILE *f, int load_detected_only) +{ + while (1) { + char final_name[500]; + char module[500]; + char * options; + char ** entry = modules_list; + + if (!fgets(module, sizeof(module), f)) break; + if (module[0] == '#' || strlen(module) == 0) + continue; + + while (module[strlen(module)-1] == '\n') + module[strlen(module)-1] = '\0'; + options = strchr(module, ' '); + if (options) { + options[0] = '\0'; + options++; + } + + if (load_detected_only && !thirdparty_is_detected(module)) { + log_message("third party: no device detected for module %s, skipping", module); + continue; + } + + log_message("third party: auto-loading module (%s) with options (%s)", module, options); + while (entry && *entry) { + if (!strncmp(*entry, module, strlen(module)) && (*entry)[strlen(module)] == '.') { + sprintf(final_name, "%s/%s", modules_location, *entry); + if (insmod_local_file(final_name, options)) { + log_message("\t%s (third party media): failed", *entry); + stg1_error_message("Insmod %s (third party media) failed.", *entry); + } + break; + } + entry++; + } + if (!entry || !*entry) { + enum insmod_return ret = my_modprobe(module, ANY_DRIVER_TYPE, options); + if (ret != INSMOD_OK) { + log_message("\t%s (marfile): failed", module); + stg1_error_message("Insmod %s (marfile) failed.", module); + } + } + } + + return RETURN_OK; +} + +static enum return_type thirdparty_try_directory(char * root_directory, int interactive) { + char modules_location[100]; + char modules_location_release[100]; + char *list_filename; + FILE *f_load, *f_detect; + char **modules_list, **modules_list_release; + struct utsname kernel_uname; + + /* look first in the specific third-party directory */ + snprintf(modules_location, sizeof(modules_location), "%s" THIRDPARTY_DIRECTORY, root_directory); + modules_list = list_directory(modules_location); + + /* if it's empty, look in the root of selected device */ + if (!modules_list || !modules_list[0]) { + modules_location[strlen(root_directory)] = '\0'; + modules_list = list_directory(modules_location); + if (interactive) + add_to_env("THIRDPARTY_DIR", ""); + } else { + if (interactive) + add_to_env("THIRDPARTY_DIR", THIRDPARTY_DIRECTORY); + } + + if (uname(&kernel_uname)) { + log_perror("uname failed"); + return RETURN_ERROR; + } + snprintf(modules_location_release, sizeof(modules_location_release), "%s/%s", modules_location, kernel_uname.release); + modules_list_release = list_directory(modules_location_release); + if (modules_list_release && modules_list_release[0]) { + strcpy(modules_location, modules_location_release); + modules_list = modules_list_release; + } + + log_message("third party: using modules location %s", modules_location); + + if (!modules_list || !*modules_list) { + log_message("third party: no modules found"); + if (interactive) + stg1_error_message("No modules found on selected device."); + return RETURN_ERROR; + } + + list_filename = alloca(strlen(modules_location) + 10 /* max: "/to_detect" */ + 1); + + sprintf(list_filename, "%s/to_load", modules_location); + f_load = fopen(list_filename, "rb"); + if (f_load) { + thirdparty_autoload_modules(modules_location, modules_list, f_load, 0); + fclose(f_load); + } + + sprintf(list_filename, "%s/to_detect", modules_location); + f_detect = fopen(list_filename, "rb"); + if (f_detect) { + probing_detect_devices(); + thirdparty_load_pcitable(modules_location); + thirdparty_autoload_modules(modules_location, modules_list, f_detect, 1); + fclose(f_detect); + } + + if (f_load || f_detect) + return RETURN_OK; + else if (interactive) { + if (IS_AUTOMATIC) + stg1_error_message("I can't find a \"to_load\" file. Please select the modules manually."); + log_message("third party: no \"to_load\" file, prompting for modules"); + return thirdparty_prompt_modules(modules_location, modules_list); + } else { + return RETURN_OK; + } +} + +void thirdparty_load_media_modules(void) +{ + thirdparty_try_directory(IMAGE_LOCATION, 0); +} + +void thirdparty_load_modules(void) +{ + enum return_type results; + char * device; + + device = NULL; + if (IS_AUTOMATIC) { + device = get_auto_value("thirdparty"); + thirdparty_choose_device(NULL, 1); /* probe only to create devices */ + log_message("third party: trying automatic device %s", device); + if (thirdparty_mount_device(device) != RETURN_OK) + device = NULL; + } + + while (!device || streq(device, "")) { + results = thirdparty_choose_device(&device, 0); + if (results == RETURN_BACK) + return; + if (thirdparty_mount_device(device) != RETURN_OK) + device = NULL; + } + + log_message("third party: using device %s", device); + add_to_env("THIRDPARTY_DEVICE", device); + + results = thirdparty_try_directory(THIRDPARTY_MOUNT_LOCATION, 1); + umount(THIRDPARTY_MOUNT_LOCATION); + + if (results != RETURN_OK) + return thirdparty_load_modules(); +} + +void thirdparty_destroy(void) +{ + probing_destroy(); +} diff --git a/mdk-stage1/thirdparty.h b/mdk-stage1/thirdparty.h new file mode 100644 index 000000000..1c2ac2a05 --- /dev/null +++ b/mdk-stage1/thirdparty.h @@ -0,0 +1,35 @@ +/* + * Guillaume Cottenceau (gc) + * Olivier Blin (oblin) + * + * Copyright 2000 Mandriva + * + * This software may be freely redistributed under the terms of the GNU + * public license. + * + * 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. + * + */ + +#ifndef _THIRDPARTY_H_ +#define _THIRDPARTY_H_ + +#define THIRDPARTY_DIRECTORY "/install/thirdparty" + +/* load third party modules present on install media + * use to_load and to_detect files in /install/thirdparty + * do not prompt user + */ +void thirdparty_load_media_modules(void); + +/* load modules if to_load or to_detect files are present + * prompt user if no to_load file is present + */ +void thirdparty_load_modules(void); + +/* destroy all data structures related to the thirdparty module */ +void thirdparty_destroy(void); + +#endif diff --git a/mdk-stage1/tools.c b/mdk-stage1/tools.c index 9d0f083f6..2e27688ea 100644 --- a/mdk-stage1/tools.c +++ b/mdk-stage1/tools.c @@ -1,7 +1,7 @@ /* - * Guillaume Cottenceau (gc@mandrakesoft.com) + * Guillaume Cottenceau (gc) * - * Copyright 2000 MandrakeSoft + * Copyright 2000 Mandriva * * This software may be freely redistributed under the terms of the GNU * public license. @@ -21,16 +21,19 @@ #include <stdlib.h> #include <unistd.h> +#include <sys/time.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <string.h> -#include <ctype.h> #include <stdio.h> #include <dirent.h> #include <sys/types.h> -#include <bzlib.h> #include <sys/mount.h> +#include <sys/poll.h> +#include <errno.h> +#include <sys/ioctl.h> +#include <linux/fd.h> #include "stage1.h" #include "log.h" #include "mount.h" @@ -38,373 +41,255 @@ #include "automatic.h" #include "tools.h" +#include "utils.h" +#include "params.h" +#include "probing.h" +#include "modules.h" +#include "lomount.h" - -static struct param_elem params[50]; -static int param_number = 0; - -void process_cmdline(void) +int image_has_stage2() { - char buf[512]; - int fd, size, i; - - log_message("opening /proc/cmdline... "); - - if ((fd = open("/proc/cmdline", O_RDONLY)) == -1) - fatal_error("could not open /proc/cmdline"); - - size = read(fd, buf, sizeof(buf)); - buf[size-1] = '\0'; // -1 to eat the \n - close(fd); - - log_message("\t%s", buf); - - i = 0; - while (buf[i] != '\0') { - char *name, *value = NULL; - int j = i; - while (buf[i] != ' ' && buf[i] != '=' && buf[i] != '\0') - i++; - if (i == j) { - i++; - continue; - } - name = memdup(&buf[j], i-j + 1); - name[i-j] = '\0'; - - if (buf[i] == '=') { - int k = i+1; - i++; - while (buf[i] != ' ' && buf[i] != '\0') - i++; - value = memdup(&buf[k], i-k + 1); - value[i-k] = '\0'; - } - - params[param_number].name = name; - params[param_number].value = value; - param_number++; - if (!strcmp(name, "expert")) set_param(MODE_EXPERT); - if (!strcmp(name, "rescue")) set_param(MODE_RESCUE); - if (!strcmp(name, "special_stage2")) set_param(MODE_SPECIAL_STAGE2); - if (!strcmp(name, "automatic")) { - set_param(MODE_AUTOMATIC); - grab_automatic_params(value); - } - if (buf[i] == '\0') - break; - i++; - } - - log_message("\tgot %d args", param_number); + return access(COMPRESSED_FILE_REL(IMAGE_LOCATION "/"), R_OK) == 0 || + access(IMAGE_LOCATION "/" LIVE_LOCATION_REL, R_OK) == 0; } - -int stage1_mode = 0; - -int get_param(int i) +enum return_type create_IMAGE_LOCATION(char *location_full) { -#ifdef SPAWN_INTERACTIVE - static int fd = 0; - char buf[5000]; - char * ptr; - int nb; - - if (fd <= 0) { - fd = open(interactive_fifo, O_RDONLY); - if (fd == -1) - return (stage1_mode & i); - fcntl(fd, F_SETFL, O_NONBLOCK); - } - - if (fd > 0) { - if ((nb = read(fd, buf, sizeof(buf))) > 0) { - buf[nb] = '\0'; - ptr = buf; - while ((ptr = strstr(ptr, "+ "))) { - if (!strncmp(ptr+2, "expert", 6)) set_param(MODE_EXPERT); - if (!strncmp(ptr+2, "rescue", 6)) set_param(MODE_RESCUE); - ptr++; - } - ptr = buf; - while ((ptr = strstr(ptr, "- "))) { - if (!strncmp(ptr+2, "expert", 6)) unset_param(MODE_EXPERT); - if (!strncmp(ptr+2, "rescue", 6)) unset_param(MODE_RESCUE); - ptr++; - } - } - } -#endif - - return (stage1_mode & i); -} + struct stat statbuf; + int offset = strncmp(location_full, IMAGE_LOCATION_DIR, sizeof(IMAGE_LOCATION_DIR) - 1) == 0 ? sizeof(IMAGE_LOCATION_DIR) - 1 : 0; + char *with_arch = asprintf_("%s/%s", location_full, ARCH); -char * get_param_valued(char *param_name) -{ - int i; - for (i = 0; i < param_number ; i++) - if (!strcmp(params[i].name, param_name)) - return params[i].value; + log_message("trying %s", with_arch); - return NULL; -} + if (stat(with_arch, &statbuf) == 0 && S_ISDIR(statbuf.st_mode)) + location_full = with_arch; -void set_param_valued(char *param_name, char *param_value) -{ - params[param_number].name = param_name; - params[param_number].value = param_value; - param_number++; -} + log_message("assuming %s is a mirror tree", location_full + offset); -void set_param(int i) -{ - stage1_mode |= i; - if (i == MODE_RESCUE) { - set_param_valued("special_stage2", "rescue"); - set_param(MODE_SPECIAL_STAGE2); - } -} - -void unset_param(int i) -{ - stage1_mode &= ~i; -} + unlink(IMAGE_LOCATION); + if (symlink(location_full + offset, IMAGE_LOCATION) != 0) + return RETURN_ERROR; -int charstar_to_int(char * s) -{ - int number = 0; - while (*s && isdigit(*s)) { - number = (number * 10) + (*s - '0'); - s++; - } - return number; + return RETURN_OK; } -int total_memory(void) +int ramdisk_possible(void) { - int value; - struct stat statr; - if (stat("/proc/kcore", &statr)) + if (total_memory() > (IS_RESCUE ? MEM_LIMIT_RESCUE : MEM_LIMIT_DRAKX)) + return 1; + else { + log_message("warning, ramdisk is not possible due to low mem!"); return 0; - - /* drakx powered: use /proc/kcore and rounds every 4 Mbytes */ - value = 4 * ((int)((float)statr.st_size / 1024 / 1024 / 4 + 0.5)); - log_message("Total Memory: %d Mbytes", value); - - return value; + } } - -int ramdisk_possible(void) +int compressed_image_preload(void) { - if (total_memory() > MEM_LIMIT_RAMDISK) + if (total_memory() > (IS_RESCUE ? MEM_LIMIT_RESCUE_PRELOAD : MEM_LIMIT_DRAKX_PRELOAD)) return 1; else { - log_message("warning, ramdisk is not possible due to low mem!"); + log_message("warning, not preloading compressed due to low mem"); return 0; } } - -static void save_stuff_for_rescue(void) +enum return_type save_fd(int from_fd, char * to, void (*callback_func)(int overall)) { - void save_this_file(char * file) { - char buf[5000]; - int fd_r, fd_w, i; - char location[100]; - - if ((fd_r = open(file, O_RDONLY)) < 0) { - log_message("can't open %s for read", file); - return; - } - strcpy(location, STAGE2_LOCATION); - strcat(location, file); - if ((fd_w = open(location, O_WRONLY)) < 0) { - log_message("can't open %s for write", location); - close(fd_r); - return; + FILE * f_to; + size_t quantity __attribute__((aligned(16))), overall = 0; + char buf[4096] __attribute__((aligned(4096))); + int ret = RETURN_ERROR; + + if (!(f_to = fopen(to, "w"))) { + log_perror(to); + goto close_from; + } + + do { + quantity = read(from_fd, buf, sizeof(buf)); + if (quantity > 0) { + if (fwrite(buf, 1, quantity, f_to) != quantity) { + log_message("short write (%s)", strerror(errno)); + goto cleanup; + } + } else if (quantity == -1) { + log_message("an error occured: %s", strerror(errno)); + goto cleanup; } - if ((i = read(fd_r, buf, sizeof(buf))) <= 0) { - log_message("can't read from %s", file); - close(fd_r); close(fd_w); - return; - } - if (write(fd_w, buf, i) != i) - log_message("can't write %d bytes to %s", i, location); - close(fd_r); close(fd_w); - log_message("saved file %s for rescue (%d bytes)", file, i); - } - save_this_file("/etc/resolv.conf"); -} + if (callback_func) { + overall += quantity; + callback_func(overall); + } + } while (quantity); -enum return_type load_ramdisk_fd(int ramdisk_fd, int size) + ret = RETURN_OK; + + cleanup: + fclose(f_to); + close_from: + close(from_fd); + + return ret; +} + +enum return_type copy_file(char * from, char * to, void (*callback_func)(int overall)) { - BZFILE * st2; - char * ramdisk = "/dev/ram3"; /* warning, verify that this file exists in the initrd (and actually is a ramdisk device file) */ - int ram_fd; - char buffer[4096]; - int z_errnum; - char * wait_msg = "Loading program into memory..."; - int bytes_read = 0; - int actually; - int seems_ok = 0; - - st2 = BZ2_bzdopen(ramdisk_fd, "r"); - - if (!st2) { - log_message("Opening compressed ramdisk: %s", BZ2_bzerror(st2, &z_errnum)); - error_message("Could not open compressed ramdisk file."); - return RETURN_ERROR; - } + int from_fd; - ram_fd = open(ramdisk, O_WRONLY); - if (ram_fd == -1) { - log_perror(ramdisk); - error_message("Could not open ramdisk device file."); - return RETURN_ERROR; - } - - init_progression(wait_msg, size); + log_message("copy_file: %s -> %s", from, to); - while ((actually = BZ2_bzread(st2, buffer, sizeof(buffer))) > 0) { - seems_ok = 1; - if (write(ram_fd, buffer, actually) != actually) { - log_perror("writing ramdisk"); - remove_wait_message(); - return RETURN_ERROR; - } - update_progression((int)((bytes_read += actually) / RAMDISK_COMPRESSION_RATIO)); - } + from_fd = open(from, O_RDONLY); + if (from_fd != -1) { + return save_fd(from_fd, to, callback_func); + } else { + log_perror(from); + return RETURN_ERROR; + } +} - if (!seems_ok) { - log_message("reading compressed ramdisk: %s", BZ2_bzerror(st2, &z_errnum)); - remove_wait_message(); - error_message("Could not uncompress second stage ramdisk."); - return RETURN_ERROR; - } +enum return_type mount_compressed_image(char *compressed_image, char *location_mount) +{ + if (lomount(compressed_image, location_mount, NULL, 1)) { + stg1_error_message("Could not mount compressed loopback :(."); + return RETURN_ERROR; + } + return RETURN_OK; +} +enum return_type preload_mount_compressed_fd(int compressed_fd, int image_size, char *image_name, char *location_mount) +{ + int ret; + char *compressed_tmpfs = asprintf_("/tmp/%s", image_name); + char *buf = "Loading program into memory..."; + init_progression(buf, image_size); + ret = save_fd(compressed_fd, compressed_tmpfs, update_progression); end_progression(); + if (ret != RETURN_OK) + return ret; + + return mount_compressed_image(compressed_tmpfs, location_mount); +} - BZ2_bzclose(st2); /* opened by gzdopen, but also closes the associated fd */ - close(ram_fd); +enum return_type mount_compressed_image_may_preload(char *image_name, char *location_mount, int preload) +{ + char *compressed_image = asprintf_("%s/%s", COMPRESSED_LOCATION, image_name); - if (my_mount(ramdisk, STAGE2_LOCATION, "ext2")) - return RETURN_ERROR; + log_message("mount_compressed_may_preload: %s into %s (preload = %d)", compressed_image, location_mount, preload); - set_param(MODE_RAMDISK); + if (access(compressed_image, R_OK) != 0) return RETURN_ERROR; - if (IS_RESCUE) { - save_stuff_for_rescue(); - if (umount(STAGE2_LOCATION)) { - log_perror(ramdisk); + if (preload) { + int compressed_fd = open(compressed_image, O_RDONLY); + if (compressed_fd != -1) { + return preload_mount_compressed_fd(compressed_fd, file_size(compressed_image), image_name, location_mount); + } else { + log_perror(compressed_image); return RETURN_ERROR; } - return RETURN_OK; /* fucksike, I lost several hours wondering why the kernel won't see the rescue if it is alreay mounted */ + } else { + return mount_compressed_image(compressed_image, location_mount); } - - return RETURN_OK; } +enum return_type may_load_compressed_image(void) +{ + if (!IS_RESCUE && access(IMAGE_LOCATION "/" LIVE_LOCATION_REL, R_OK) == 0) { + /* LIVE install */ + return RETURN_OK; + } else { + /* compressed install */ + return mount_compressed_image_may_preload(COMPRESSED_NAME(""), STAGE2_LOCATION, compressed_image_preload()); + } +} -char * get_ramdisk_realname(void) +enum return_type load_compressed_fd(int fd, int size) { - char img_name[500]; - char * stg2_name = get_param_valued("special_stage2"); - char * begin_img = RAMDISK_LOCATION; - char * end_img = "_stage2.bz2"; + return preload_mount_compressed_fd(fd, size, COMPRESSED_NAME(""), STAGE2_LOCATION); +} - if (!stg2_name) - stg2_name = "mdkinst"; +int try_mount(char * dev, char * location) +{ + char device_fullname[50]; + snprintf(device_fullname, sizeof(device_fullname), "/dev/%s", dev); - if (IS_RESCUE) - stg2_name = "rescue"; - - strcpy(img_name, begin_img); - strcat(img_name, stg2_name); - strcat(img_name, end_img); + if (my_mount(device_fullname, location, "auto", 0) == -1) { + return 1; + } - return strdup(img_name); + return 0; } - -enum return_type load_ramdisk(void) +#ifndef DISABLE_DISK +int get_disks(char *** names, char *** models) { - int st2_fd; - struct stat statr; - char img_name[500]; - - strcpy(img_name, IMAGE_LOCATION); - strcat(img_name, get_ramdisk_realname()); + char ** ptr; + int count = 0; - log_message("trying to load %s as a ramdisk", img_name); + my_modprobe("ide_disk", ANY_DRIVER_TYPE, NULL); + my_modprobe("sd_mod", ANY_DRIVER_TYPE, NULL); - st2_fd = open(img_name, O_RDONLY); /* to be able to see the progression */ + get_medias(DISK, names, models, BUS_ANY); - if (st2_fd == -1) { - log_message("open ramdisk file (%s) failed", img_name); - error_message("Could not open compressed ramdisk file (%s).", img_name); - return RETURN_ERROR; + ptr = *names; + while (ptr && *ptr) { + count++; + ptr++; } - if (stat(img_name, &statr)) - return RETURN_ERROR; - else - return load_ramdisk_fd(st2_fd, statr.st_size); + return count; } +#endif -/* pixel's */ -void * memdup(void *src, size_t size) +#ifndef DISABLE_CDROM +int get_cdroms(char *** names, char *** models) { - void * r; - r = malloc(size); - memcpy(r, src, size); - return r; -} + char ** ptr; + int count = 0; + my_modprobe("ide_cd_mod", ANY_DRIVER_TYPE, NULL); + my_modprobe("sr_mod", ANY_DRIVER_TYPE, NULL); -static char ** my_env = NULL; -static int env_size = 0; + get_medias(CDROM, names, models, BUS_ANY); -void handle_env(char ** env) -{ - char ** ptr = env; + ptr = *names; while (ptr && *ptr) { + count++; ptr++; - env_size++; } - my_env = malloc(sizeof(char *) * 100); - memcpy(my_env, env, sizeof(char *) * (env_size+1)); -} - -char ** grab_env(void) { - return my_env; -} -void add_to_env(char * name, char * value) -{ - char tmp[500]; - sprintf(tmp, "%s=%s", name, value); - my_env[env_size] = strdup(tmp); - env_size++; - my_env[env_size] = NULL; + return count; } +#endif - -char ** list_directory(char * direct) +char * floppy_device(void) { - char * tmp[50000]; /* in /dev there can be many many files.. */ - int i = 0; - struct dirent *ep; - DIR *dp = opendir(direct); - while (dp && (ep = readdir(dp))) { - if (strcmp(ep->d_name, ".") && strcmp(ep->d_name, "..")) { - tmp[i] = strdup(ep->d_name); - i++; - } - } - if (dp) - closedir(dp); - tmp[i] = NULL; - return memdup(tmp, sizeof(char*) * (i+1)); + char ** names, ** models; + int fd; + my_modprobe("floppy", ANY_DRIVER_TYPE, NULL); + fd = open("/dev/fd0", O_RDONLY|O_NONBLOCK); + if (fd != -1) { + char drivtyp[17]; + if (!ioctl(fd, FDGETDRVTYP, (void *)drivtyp)) { + struct floppy_drive_struct ds; + log_message("/dev/fd0 type: %s", drivtyp); + if (!ioctl(fd, FDPOLLDRVSTAT, &ds)) { + log_message("\ttrack: %d", ds.track); + if (ds.track >= 0) { + close(fd); + return "/dev/fd0"; + } + } + } else { + log_perror("can't FDGETDRVTYP /dev/fd0"); + } + close(fd); + } + log_message("seems that you don't have a regular floppy drive"); + my_modprobe("sd_mod", ANY_DRIVER_TYPE, NULL); + get_medias(FLOPPY, &names, &models, BUS_ANY); + if (names && *names) + return asprintf_("/dev/%s", *names); + else + return NULL; } diff --git a/mdk-stage1/tools.h b/mdk-stage1/tools.h index 8ec084451..87c0c1d49 100644 --- a/mdk-stage1/tools.h +++ b/mdk-stage1/tools.h @@ -1,7 +1,8 @@ + /* - * Guillaume Cottenceau (gc@mandrakesoft.com) + * Guillaume Cottenceau (gc) * - * Copyright 2000 MandrakeSoft + * Copyright 2000 Mandriva * * This software may be freely redistributed under the terms of the GNU * public license. @@ -24,27 +25,22 @@ #include <stdlib.h> -void process_cmdline(void); -int get_param(int i); -void set_param(int i); -void unset_param(int i); -int charstar_to_int(char * s); -int total_memory(void); +int image_has_stage2(); +enum return_type create_IMAGE_LOCATION(char *location_full); int ramdisk_possible(void); -char * get_ramdisk_realname(void); -enum return_type load_ramdisk(void); -enum return_type load_ramdisk_fd(int ramdisk_fd, int size); -void * memdup(void *src, size_t size); -void add_to_env(char * name, char * value); -void handle_env(char ** env); -char ** grab_env(void); -char ** list_directory(char * direct); - -struct param_elem -{ - char * name; - char * value; -}; - +enum return_type copy_file(char * from, char * to, void (*callback_func)(int overall)); +enum return_type preload_mount_compressed_fd(int compressed_fd, int image_size, char *image_name, char *location_mount); +enum return_type mount_compressed_image(char *compressed_image, char *location_mount); +enum return_type mount_compressed_image_may_preload(char *image_name, char *location_mount, int preload); +enum return_type load_compressed_fd(int fd, int size); +enum return_type may_load_compressed_image(void); +int try_mount(char * dev, char * location); +#ifndef DISABLE_DISK +int get_disks(char *** names, char *** models); +#endif +#ifndef DISABLE_CDROM +int get_cdroms(char *** names, char *** models); +#endif +char * floppy_device(void); #endif diff --git a/mdk-stage1/update-pci-ids.pl b/mdk-stage1/update-pci-ids.pl new file mode 100755 index 000000000..1b084ea80 --- /dev/null +++ b/mdk-stage1/update-pci-ids.pl @@ -0,0 +1,27 @@ +#!/usr/bin/perl + +use lib '../kernel'; +use strict; +use MDK::Common; + + +my %t = ( + network => 'network/main|gigabit|pcmcia|virtual|wireless', + medias_ide => 'disk/ide', + medias_other => 'disk/scsi|hardware_raid|sata|virtual bus/firewire', +); + +foreach my $type (keys %t) { + my @modules = chomp_(`perl ../kernel/modules.pl pci_modules4stage1 "$t{$type}"`) + or die "unable to get PCI modules"; + + print "#ifndef DISABLE_".uc($type)." +char* ${type}_pci_modules[] = { +"; + printf qq|\t"%s",\n|, $_ foreach @modules; + print "}; +unsigned int ${type}_pci_modules_len = sizeof(${type}_pci_modules) / sizeof(char *); +#endif + +"; +} diff --git a/mdk-stage1/update-pcmcia-ids.pl b/mdk-stage1/update-pcmcia-ids.pl new file mode 100755 index 000000000..9eb25c66e --- /dev/null +++ b/mdk-stage1/update-pcmcia-ids.pl @@ -0,0 +1,42 @@ +#!/usr/bin/perl + +use lib '../kernel'; +use strict; +use MDK::Common; + +my @aliases; +my ($main) = `ls -t /lib/modules/*/modules.alias`; +foreach (cat_(chomp_($main))) { + push @aliases, [ $1, $2 ] if /^alias\s+(pcmcia:\S+)\s+(\S+)$/; #- modalias, module +} +@aliases or die "unable to get PCMCIA aliases"; + +print ' +struct pcmcia_alias { + const char *modalias; + const char *module; +}; + +'; + +my %t = ( + network => 'network/pcmcia', + medias => 'disk/pcmcia', +); + +foreach my $type (keys %t) { + my @modules = chomp_(`perl ../kernel/modules.pl pci_modules4stage1 "$t{$type}"`) + or die "unable to get PCMCIA modules"; + + print "#ifndef DISABLE_".uc($type)." +struct pcmcia_alias ${type}_pcmcia_ids[] = { +"; + print qq|\t{ "$_->[0]", "$_->[1]" },\n| foreach grep { member($_->[1], @modules) } @aliases; + print "}; +unsigned int ${type}_pcmcia_num_ids = sizeof(${type}_pcmcia_ids) / sizeof(struct pcmcia_alias); + +#endif + +"; + +} diff --git a/mdk-stage1/update-usb-ids.pl b/mdk-stage1/update-usb-ids.pl new file mode 100755 index 000000000..1ea45f9df --- /dev/null +++ b/mdk-stage1/update-usb-ids.pl @@ -0,0 +1,24 @@ +#!/usr/bin/perl + +use lib '../kernel'; +use strict; +use MDK::Common; + +my @modules = chomp_(`perl ../kernel/modules.pl pci_modules4stage1 "bus/usb"`) + or die "unable to get USB controller modules"; +print "char *usb_controller_modules[] = { +"; +printf qq|\t"%s",\n|, $_ foreach @modules; +print "}; +unsigned int usb_controller_modules_len = sizeof(usb_controller_modules) / sizeof(char *); +"; + +@modules = chomp_(`perl ../kernel/modules.pl pci_modules4stage1 "network/usb disk/usb"`) + or die "unable to get USB modules"; + +print "char *usb_modules[] = { +"; +printf qq|\t"%s",\n|, $_ foreach @modules; +print "}; +unsigned int usb_modules_len = sizeof(usb_modules) / sizeof(char *); +"; diff --git a/mdk-stage1/url.c b/mdk-stage1/url.c index 0f919812b..14f1e25d6 100644 --- a/mdk-stage1/url.c +++ b/mdk-stage1/url.c @@ -1,7 +1,7 @@ /* - * Guillaume Cottenceau (gc@mandrakesoft.com) + * Guillaume Cottenceau (gc) * - * Copyright 2000 MandrakeSoft + * Copyright 2000 Mandriva * * This software may be freely redistributed under the terms of the GNU * public license. @@ -32,33 +32,36 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <strings.h> #include <sys/socket.h> #include <sys/time.h> #include <sys/types.h> #include <unistd.h> +#include <sys/poll.h> #include <netinet/in.h> #include <netinet/ip.h> #include <arpa/inet.h> -#include "log.h" #include "dns.h" +#include "log.h" #include "tools.h" +#include "utils.h" #include "url.h" #define TIMEOUT_SECS 60 #define BUFFER_SIZE 4096 +#define HTTP_MAX_RECURSION 5 static int ftp_check_response(int sock, char ** str) { static char buf[BUFFER_SIZE + 1]; int bufLength = 0; - fd_set emptySet, readSet; + struct pollfd polls; char * chptr, * start; - struct timeval timeout; int bytesRead, rc = 0; int doesContinue = 1; char errorCode[4]; @@ -66,21 +69,10 @@ static int ftp_check_response(int sock, char ** str) errorCode[0] = '\0'; do { - FD_ZERO(&emptySet); - FD_ZERO(&readSet); - FD_SET(sock, &readSet); - - timeout.tv_sec = TIMEOUT_SECS; - timeout.tv_usec = 0; - - rc = select(sock + 1, &readSet, &emptySet, &emptySet, &timeout); - if (rc < 1) { - if (rc==0) - return FTPERR_BAD_SERVER_RESPONSE; - else - rc = FTPERR_UNKNOWN; - } else - rc = 0; + polls.fd = sock; + polls.events = POLLIN; + if (poll(&polls, 1, TIMEOUT_SECS*1000) != 1) + return FTPERR_BAD_SERVER_RESPONSE; bytesRead = read(sock, buf + bufLength, sizeof(buf) - bufLength - 1); @@ -125,7 +117,7 @@ static int ftp_check_response(int sock, char ** str) } else { bufLength = 0; } - } while (doesContinue && !rc); + } while (doesContinue); if (*errorCode == '4' || *errorCode == '5') { if (!strncmp(errorCode, "550", 3)) { @@ -145,15 +137,9 @@ static int ftp_command(int sock, char * command, char * param) char buf[500]; int rc; - strcpy(buf, command); - if (param) { - strcat(buf, " "); - strcat(buf, param); - } - - strcat(buf, "\r\n"); + snprintf(buf, sizeof(buf), "%s%s%s\r\n", command, param ? " " : "", param ? param : ""); - if (write(sock, buf, strlen(buf)) != strlen(buf)) { + if (write(sock, buf, strlen(buf)) != (ssize_t)strlen(buf)) { return FTPERR_SERVER_IO_ERROR; } @@ -163,17 +149,15 @@ static int ftp_command(int sock, char * command, char * param) return 0; } -static int get_host_address(const char * host, struct in_addr * address) +static int get_host_address(char * host, struct in_addr * address) { if (isdigit(host[0])) { if (!inet_aton(host, address)) { return FTPERR_BAD_HOST_ADDR; } } else { - if (mygethostbyname((char *) host, address)) { - errno = h_errno; + if (mygethostbyname(host, address)) return FTPERR_BAD_HOSTNAME; - } } return 0; @@ -184,7 +168,6 @@ int ftp_open_connection(char * host, char * name, char * password, char * proxy) int sock; struct in_addr serverAddress; struct sockaddr_in destPort; - char * buf; int rc; int port = 21; @@ -194,9 +177,7 @@ int ftp_open_connection(char * host, char * name, char * password, char * proxy) } if (strcmp(proxy, "")) { - buf = alloca(strlen(name) + strlen(host) + 5); - sprintf(buf, "%s@%s", name, host); - name = buf; + name = asprintf_("%s@%s", name, host); host = proxy; } @@ -325,7 +306,7 @@ int ftp_data_command(int sock, char * command, char * param) } -static int ftp_get_filesize(int sock, char * remotename) +int ftp_get_filesize(int sock, char * remotename) { int size = 0; char buf[2000]; @@ -346,14 +327,14 @@ static int ftp_get_filesize(int sock, char * remotename) return -1; } - fd = ftp_data_command(sock, "LIST", NULL); + fd = ftp_data_command(sock, "LIST", file); if (fd <= 0) { close(sock); return -1; } ptr = buf; - while ((tot = read(fd, ptr, sizeof(buf) - (ptr - buf))) != 0) + while ((tot = read(fd, ptr, sizeof(buf) - (ptr - buf) - 1)) != 0) ptr += tot; *ptr = '\0'; close(fd); @@ -394,7 +375,6 @@ int ftp_start_download(int sock, char * remotename, int * size) log_message("FTP: could not get filesize (trying to continue)"); *size = 0; } - return ftp_data_command(sock, "RETR", remotename); } @@ -407,40 +387,76 @@ int ftp_end_data_command(int sock) return 0; } - -int http_download_file(char * hostname, char * remotename, int * size) + +char *str_ftp_error(int error) +{ + return error == FTPERR_PASSIVE_ERROR ? "error with passive connection" : + error == FTPERR_FAILED_CONNECT ? "couldn't connect to server" : + error == FTPERR_FILE_NOT_FOUND ? "file not found" : + error == FTPERR_BAD_SERVER_RESPONSE ? "bad server response (server too busy?)" : + NULL; +} + + +static int _http_download_file(char * hostport, char * remotename, int * size, char * proxyprotocol, char * proxyname, char * proxyport, int recursion) { char * buf; - struct timeval timeout; + char * hostname = strdup(hostport); char headers[4096]; char * nextChar = headers; - int checkedCode; + int statusCode; struct in_addr serverAddress; + struct pollfd polls; int sock; int rc; struct sockaddr_in destPort; - fd_set readSet; - char * header_content_length = "Content-Length: "; + const char * header_content_length = "Content-Length: "; + const char * header_location = "Location: http://"; + char * http_server_name; + int http_server_port; + + if (proxyprotocol) { + http_server_name = proxyname; + http_server_port = atoi(proxyport); + } else { + char *port = strchr(hostname, ':'); + if (port) { + *port = '\0'; + http_server_name = hostname; + http_server_port = atoi(++port); + } else { + http_server_name = hostname; + http_server_port = 80; + } + } + + log_message("HTTP: connecting to server %s:%i (%s)", + http_server_name, http_server_port, + proxyprotocol ? "proxy" : "no proxy"); - if ((rc = get_host_address(hostname, &serverAddress))) return rc; + if ((rc = get_host_address(http_server_name, &serverAddress))) return rc; sock = socket(AF_INET, SOCK_STREAM, IPPROTO_IP); if (sock < 0) { + free(hostname); return FTPERR_FAILED_CONNECT; } destPort.sin_family = AF_INET; - destPort.sin_port = htons(80); + destPort.sin_port = htons(http_server_port); destPort.sin_addr = serverAddress; if (connect(sock, (struct sockaddr *) &destPort, sizeof(destPort))) { close(sock); + free(hostname); return FTPERR_FAILED_CONNECT; } - buf = alloca(strlen(remotename) + 20); - sprintf(buf, "GET %s HTTP/0.9\r\n\r\n", remotename); + buf = proxyprotocol ? asprintf_("GET %s://%s%s HTTP/1.0\r\nHost: %s\r\n\r\n", proxyprotocol, hostname, remotename, hostname) + : asprintf_("GET %s HTTP/1.0\r\nHost: %s\r\n\r\n", remotename, hostname); + write(sock, buf, strlen(buf)); + free(hostname); /* This is fun; read the response a character at a time until we: @@ -448,15 +464,12 @@ int http_download_file(char * hostname, char * remotename, int * size) 2) Get a \r\n\r\n, which means we're done */ *nextChar = '\0'; - checkedCode = 0; + statusCode = 0; while (!strstr(headers, "\r\n\r\n")) { - FD_ZERO(&readSet); - FD_SET(sock, &readSet); + polls.fd = sock; + polls.events = POLLIN; + rc = poll(&polls, 1, TIMEOUT_SECS*1000); - timeout.tv_sec = TIMEOUT_SECS; - timeout.tv_usec = 0; - - rc = select(sock + 1, &readSet, NULL, NULL, &timeout); if (rc == 0) { close(sock); return FTPERR_SERVER_TIMEOUT; @@ -478,10 +491,9 @@ int http_download_file(char * hostname, char * remotename, int * size) return FTPERR_SERVER_IO_ERROR; } - if (!checkedCode && strstr(headers, "\r\n")) { + if (!statusCode && strstr(headers, "\r\n")) { char * start, * end; - checkedCode = 1; start = headers; while (!isspace(*start) && *start) start++; if (!*start) { @@ -498,10 +510,16 @@ int http_download_file(char * hostname, char * remotename, int * size) } *end = '\0'; - if (!strcmp(start, "404")) { + log_message("HTTP: server response '%s'", start); + if (streq(start, "404")) { close(sock); return FTPERR_FILE_NOT_FOUND; - } else if (strcmp(start, "200")) { + } else if (streq(start, "302")) { + log_message("HTTP: found, but document has moved"); + statusCode = 302; + } else if (streq(start, "200")) { + statusCode = 200; + } else { close(sock); return FTPERR_BAD_SERVER_RESPONSE; } @@ -510,6 +528,34 @@ int http_download_file(char * hostname, char * remotename, int * size) } } + if (statusCode == 302) { + if (recursion >= HTTP_MAX_RECURSION) { + log_message("HTTP: too many levels of recursion, aborting"); + close(sock); + return FTPERR_UNKNOWN; + } + if ((buf = strstr(headers, header_location))) { + char * found_host; + char *found_file; + found_host = buf + strlen(header_location); + if ((found_file = index(found_host, '/'))) { + if ((buf = index(found_file, '\r'))) { + buf[0] = '\0'; + remotename = strdup(found_file); + found_file[0] = '\0'; + hostname = strdup(found_host); + log_message("HTTP: redirected to new host \"%s\" and file \"%s\"", hostname, remotename); + } + } + + } + /* + * don't fail if new URL can't be parsed, + * asking the same URL may work if the DNS server are doing round-robin + */ + return _http_download_file(hostname, remotename, size, proxyprotocol, proxyname, proxyport, recursion + 1); + } + if ((buf = strstr(headers, header_content_length))) *size = charstar_to_int(buf + strlen(header_content_length)); else @@ -517,3 +563,9 @@ int http_download_file(char * hostname, char * remotename, int * size) return sock; } + + +int http_download_file(char * hostname, char * remotename, int * size, char * proxyprotocol, char * proxyname, char * proxyport) +{ + return _http_download_file(hostname, remotename, size, proxyprotocol, proxyname, proxyport, 0); +} diff --git a/mdk-stage1/url.h b/mdk-stage1/url.h index 5a59bd814..2c80e4432 100644 --- a/mdk-stage1/url.h +++ b/mdk-stage1/url.h @@ -1,7 +1,7 @@ /* - * Guillaume Cottenceau (gc@mandrakesoft.com) + * Guillaume Cottenceau (gc) * - * Copyright 2000 MandrakeSoft + * Copyright 2000 Mandriva * * This software may be freely redistributed under the terms of the GNU * public license. @@ -23,10 +23,12 @@ #define _URL_H_ int ftp_open_connection(char * host, char * name, char * password, char * proxy); +int ftp_get_filesize(int sock, char * remotename); int ftp_start_download(int sock, char * remotename, int * size); int ftp_end_data_command(int sock); +char *str_ftp_error(int error); -int http_download_file(char * hostname, char * remotename, int * size); +int http_download_file(char * hostname, char * remotename, int * size, char * proxyprotocol, char * proxyname, char * proxyport); #define FTPERR_BAD_SERVER_RESPONSE -1 diff --git a/mdk-stage1/utils.c b/mdk-stage1/utils.c new file mode 100644 index 000000000..6ad3a8f6f --- /dev/null +++ b/mdk-stage1/utils.c @@ -0,0 +1,191 @@ +/* + * Guillaume Cottenceau (gc) + * + * Copyright 2000 Mandriva + * + * This software may be freely redistributed under the terms of the GNU + * public license. + * + * 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 <stdio.h> +#include <string.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <unistd.h> +#include <ctype.h> +#include <dirent.h> +#include <sys/sysinfo.h> +#include <sys/utsname.h> + +#include "utils.h" +#include "log.h" + +// warning, many things rely on the fact that: +// - when failing it returns 0 +// - it stops on first non-digit char +int charstar_to_int(const char * s) +{ + int number = 0; + while (*s && isdigit(*s)) { + number = (number * 10) + (*s - '0'); + s++; + } + return number; +} + +off_t file_size(const char * path) +{ + struct stat statr; + if (stat(path, &statr)) + return -1; + else + return statr.st_size; +} + +char * cat_file(const char * file, struct stat * s) { + char * buf; + int fd = open(file, O_RDONLY); + if (fd == -1) { + log_perror(file); + return NULL; + } + + fstat(fd, s); + buf = malloc(s->st_size + 1); + if (read(fd, buf, s->st_size) != (ssize_t)s->st_size) { + close(fd); + free(buf); + log_perror(file); + return NULL; + } + buf[s->st_size] = '\0'; + close(fd); + + return buf; +} + +int line_counts(const char * buf) { + const char * ptr = buf; + int line = 0; + while (ptr) { + line++; + ptr = strchr(ptr + 1, '\n'); + } + return line; +} + +int total_memory(void) +{ + int value; + struct sysinfo sys_info; + if (sysinfo(&sys_info) < 0) { + log_perror("sysinfo"); + return 0; + } + value = sys_info.totalram * sys_info.mem_unit / 1024 / 1024; + log_message("Total Memory: %d Mbytes", value); + + return value; +} + +/* pixel's */ +void * _memdup(void *src, size_t size) +{ + void * r; + r = malloc(size); + memcpy(r, src, size); + return r; +} + + +void add_to_env(char * name, char * value) +{ + FILE* fakeenv = fopen("/tmp/env", "a"); + if (fakeenv) { + char* e = asprintf_("%s=%s\n", name, value); + fwrite(e, 1, strlen(e), fakeenv); + free(e); + fclose(fakeenv); + } else + log_message("couldn't fopen to fake env"); +} + +char ** list_directory(char * direct) +{ + char * tmp[50000]; /* in /dev there can be many many files.. */ + int i = 0; + struct dirent *ep; + DIR *dp = opendir(direct); + while (dp && (ep = readdir(dp))) { + if (strcmp(ep->d_name, ".") && strcmp(ep->d_name, "..")) { + tmp[i] = strdup(ep->d_name); + i++; + } + } + if (dp) + closedir(dp); + tmp[i] = NULL; + return _memdup(tmp, sizeof(char*) * (i+1)); +} + + +int string_array_length(char ** a) +{ + int i = 0; + if (!a) + return -1; + while (a && *a) { + a++; + i++; + } + return i; +} + +char * asprintf_(const char *msg, ...) +{ + int n; + char * s; + char dummy; + va_list arg_ptr; + va_start(arg_ptr, msg); + n = vsnprintf(&dummy, sizeof(dummy), msg, arg_ptr); + va_start(arg_ptr, msg); + if ((s = malloc(n + 1))) { + vsnprintf(s, n + 1, msg, arg_ptr); + va_end(arg_ptr); + return s; + } + va_end(arg_ptr); + return strdup(""); +} + + +void lowercase(char *s) +{ + int i = 0; + while (s[i]) { + s[i] = tolower(s[i]); + i++; + } +} + +char *my_dirname(char *path) { + char *p = strrchr (path, '/'); + char *tmp; + int len; + if (!p) + return path; + len = p-path+1; + tmp = malloc(len); + strncpy(tmp, path, len-1); + tmp[len-1] = '\0'; + return tmp; +} + diff --git a/mdk-stage1/utils.h b/mdk-stage1/utils.h new file mode 100644 index 000000000..b8a77b0ad --- /dev/null +++ b/mdk-stage1/utils.h @@ -0,0 +1,36 @@ +/* + * Guillaume Cottenceau (gc) + * + * Copyright 2000 Mandriva + * + * This software may be freely redistributed under the terms of the GNU + * public license. + * + * 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. + * + */ + +#ifndef _UTILS_H_ +#define _UTILS_H_ + +#include <sys/stat.h> + +int charstar_to_int(const char * s); +off_t file_size(const char * path); +char * cat_file(const char * file, struct stat * s); +int line_counts(const char * buf); +int total_memory(void); +void * _memdup(void *src, size_t size); +void add_to_env(char * name, char * value); +char ** list_directory(char * direct); +int string_array_length(char ** a); +char * asprintf_(const char *msg, ...); +char *my_dirname(char *path); +void lowercase(char *s); + +#define ptr_begins_static_str(pointer,static_str) (!strncmp(pointer,static_str,sizeof(static_str)-1)) +#define streq(a,b) (!strcmp(a,b)) + +#endif diff --git a/mdk-stage1/wireless.c b/mdk-stage1/wireless.c new file mode 100644 index 000000000..2fde04f84 --- /dev/null +++ b/mdk-stage1/wireless.c @@ -0,0 +1,160 @@ +/* + * Olivier Blin (oblin) + * Martin Whitaker (martinw) + * + * Copyright 2005 Mandriva + * Copyright 2020 Mageia + * + * This software may be freely redistributed under the terms of the GNU + * public license. + * + * 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 <sys/ioctl.h> +#include <sys/types.h> +#include <sys/socket.h> +#include <errno.h> +#include <signal.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <linux/types.h> +#include <linux/if.h> +#include <linux/wireless.h> + +#include "automatic.h" +#include "stage1.h" +#include "log.h" +#include "utils.h" +#include "wireless.h" + +#define WPA_SUPPLICANT_CONF "/etc/wpa_supplicant.conf" +#define WPA_SUPPLICANT_CTRL "/var/run/wpa_supplicant" +#define WPA_SUPPLICANT_LOG "/var/log/wpa_supplicant.log" +#define WPA_SUPPLICANT_PID "/var/run/wpa_supplicant.pid" + +int wireless_open_socket() +{ + return socket(AF_INET, SOCK_DGRAM, 0); +} + +int wireless_close_socket(int socket) +{ + return close(socket); +} + +static int wireless_ioctl(int socket, const char *ifname, int request, struct iwreq *wrq) +{ + strncpy(wrq->ifr_name, ifname, IFNAMSIZ); + return ioctl(socket, request, wrq); +} + +int wireless_is_aware(int socket, const char *ifname) +{ + struct iwreq wrq; + return wireless_ioctl(socket, ifname, SIOCGIWNAME, &wrq) == 0; +} + +enum return_type configure_wireless(const char *ifname) +{ + enum return_type results; + char * security[] = { "No security", "WEP", "WPA/WPA2 Personal", NULL }; + char * security_auto[] = { "none", "wep", "wpa_psk", NULL }; + char * choice = NULL; + char * message = NULL; + char * questions[] = { "ESSID", "", NULL }; + char * questions_auto[] = { "essid", "" }; + char * key_mgmt = NULL; + static char ** answers = NULL; + FILE * fd; + char cmd[256]; + int status; + + int wsock = wireless_open_socket(); + if (!wireless_is_aware(wsock, ifname)) { + log_message("interface %s doesn't support wireless", ifname); + wireless_close_socket(wsock); + return RETURN_OK; + } + wireless_close_socket(wsock); + + results = ask_from_list_auto("Please select your wireless security mode.", + security, &choice, "wireless_security", security_auto); + if (results != RETURN_OK) { + return RETURN_BACK; + } + + if (streq(choice, security[2])) { + message = "Please enter your wireless settings. " + "The ESSID is your wireless network identifier. " + "The passphrase must be a string of between 8 and 63 ASCII characters."; + questions[1] = "passphrase"; + questions_auto[1] = "wpa_psk"; + key_mgmt = "WPA-PSK"; + } else if (streq(choice, security[1])) { + message = "Please enter your wireless settings. " + "The ESSID is your wireless network identifier. " + "The WEP key must be either a string of 10 or 26 hexadecimal digits, without any separators, " + "or a string of 5 or 13 ASCII characters enclosed in double quote marks (e.g. \"12345\")."; + questions[1] = "WEP key"; + questions_auto[1] = "wep_key"; + key_mgmt = "NONE"; + } else { + message = "Please enter your wireless settings. " + "The ESSID is your wireless network identifier."; + questions[1] = NULL; + questions_auto[1] = NULL; + key_mgmt = "NONE"; + } + results = ask_from_entries_auto(message, questions, &answers, 32, questions_auto, NULL); + if (results != RETURN_OK) { + return RETURN_BACK; + } + + fd = fopen(WPA_SUPPLICANT_PID, "r"); + if (fd) { + unsigned pid = 0; + unsigned count = fscanf(fd, "%u", &pid); + fclose(fd); + if (count == 1 && pid > 1) { + log_message("terminating wpa_supplicant (pid %u)", pid); + kill(pid, SIGQUIT); + sleep(1); + } + } + + fd = fopen(WPA_SUPPLICANT_CONF, "w"); + if (fd == NULL) { + stg1_error_message("unable to create " WPA_SUPPLICANT_CONF ": %s", strerror(errno)); + return RETURN_ERROR; + } + fprintf(fd, "ctrl_interface=" WPA_SUPPLICANT_CTRL "\n"); + fprintf(fd, "ap_scan=1\n"); + fprintf(fd, "network={\n"); + fprintf(fd, " key_mgmt=%s\n", key_mgmt); + fprintf(fd, " scan_ssid=1\n"); + fprintf(fd, " ssid=\"%s\"\n", answers[0]); + if (streq(choice, security[2])) { + fprintf(fd, " psk=\"%s\"\n", answers[1]); + } else if (streq(choice, security[1])) { + fprintf(fd, " wep_key0=%s\n", answers[1]); + } + fprintf(fd, "}\n"); + fclose(fd); + + snprintf(cmd, sizeof(cmd), "/usr/sbin/wpa_supplicant -D nl80211,wext -B -i %s -c %s -f %s -P %s", + ifname, WPA_SUPPLICANT_CONF, WPA_SUPPLICANT_LOG, WPA_SUPPLICANT_PID); + log_message("running %s", cmd); + status = system(cmd); + if (status != 0) { + stg1_error_message("unable to start wpa_supplicant daemon for interface \"%s\": %d", ifname, status); + return RETURN_ERROR; + } + + return RETURN_OK; +} diff --git a/mdk-stage1/insmod-modutils/insmod-frontend.c b/mdk-stage1/wireless.h index 2b3aa1acb..7443f5c99 100644 --- a/mdk-stage1/insmod-modutils/insmod-frontend.c +++ b/mdk-stage1/wireless.h @@ -1,7 +1,7 @@ /* - * Guillaume Cottenceau (gc@mandrakesoft.com) + * Olivier Blin (oblin) * - * Copyright 2000 MandrakeSoft + * Copyright 2005 Mandriva * * This software may be freely redistributed under the terms of the GNU * public license. @@ -12,13 +12,14 @@ * */ -#include <stdio.h> +#ifndef _WIRELESS_H_ +#define _WIRELESS_H_ +#include "frontend.h" -int insmod_main( int argc, char **argv); +int wireless_open_socket(); +int wireless_close_socket(int socket); +int wireless_is_aware(int socket, const char *ifname); +enum return_type configure_wireless(const char *ifname); -int main( int argc, char **argv) -{ - printf("Using insmod provided by modutils.\n"); - return insmod_main(argc, argv); -} +#endif diff --git a/mdk-stage1/zlibsupport.c b/mdk-stage1/zlibsupport.c new file mode 100644 index 000000000..2b171e72d --- /dev/null +++ b/mdk-stage1/zlibsupport.c @@ -0,0 +1,292 @@ +/* Support for compressed modules. Willy Tarreau <willy@meta-x.org> + * did the support for modutils, Andrey Borzenkov <arvidjaar@mail.ru> + * ported it to module-init-tools, and I said it was too ugly to live + * and rewrote it 8). + * + * (C) 2003 Rusty Russell, IBM Corporation. + */ +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <stdlib.h> +#include <unistd.h> +#include <sys/mman.h> +#include <stdio.h> +#include <errno.h> + +#include "zlibsupport.h" + +#define CONFIG_USE_LIBLZMA +#ifdef CONFIG_USE_ZLIB +#include <zlib.h> +#ifdef CONFIG_USE_LIBLZMA +#include <lzma.h> + +typedef struct lzma_file { + uint8_t buf[1<<14]; + lzma_stream strm; + FILE *fp; + lzma_bool eof; +} lzma_FILE; +#else +typedef unsigned char lzma_bool; +typedef int lzma_ret; +#define LZMA_OK 0 +#endif + +typedef enum xFile_e { + XF_NONE, + XF_GZIP, + XF_XZ, + XF_FAIL +} xFile_t; + +typedef struct xFile_s { + xFile_t type; + lzma_bool eof; + union { + gzFile gz; +#ifdef CONFIG_USE_LIBLZMA + lzma_FILE *xz; +#endif + } f; + FILE *fp; +} xFile; + +#ifdef CONFIG_USE_LIBLZMA +static lzma_FILE *lzma_open(lzma_ret *lzma_error, FILE *fp) +{ + lzma_ret *ret = lzma_error; + lzma_FILE *lzma_file; + lzma_stream tmp = LZMA_STREAM_INIT; + + lzma_file = calloc(1, sizeof(*lzma_file)); + + lzma_file->fp = fp; + lzma_file->eof = 0; + lzma_file->strm = tmp; + + *ret = lzma_auto_decoder(&lzma_file->strm, -1, 0); + + if (*ret != LZMA_OK) { + (void) fclose(lzma_file->fp); + free(lzma_file); + return NULL; + } + return lzma_file; +} + +static ssize_t lzma_read(lzma_ret *lzma_error, lzma_FILE *lzma_file, void *buf, size_t len) +{ + lzma_ret *ret = lzma_error; + lzma_bool eof = 0; + + if (!lzma_file) + return -1; + if (lzma_file->eof) + return 0; + + lzma_file->strm.next_out = buf; + lzma_file->strm.avail_out = len; + for (;;) { + if (!lzma_file->strm.avail_in) { + lzma_file->strm.next_in = (uint8_t *)lzma_file->buf; + lzma_file->strm.avail_in = fread(lzma_file->buf, 1, sizeof(lzma_file->buf), lzma_file->fp); + if (!lzma_file->strm.avail_in) + eof = 1; + } + *ret = lzma_code(&lzma_file->strm, LZMA_RUN); + if (*ret == LZMA_STREAM_END) { + lzma_file->eof = 1; + return len - lzma_file->strm.avail_out; + } + if (*ret != LZMA_OK) + return -1; + if (!lzma_file->strm.avail_out) + return len; + if (eof) + return -1; + } +} +#endif + +static xFile xOpen(int fd, const char *filename) { + xFile xF = {XF_FAIL, 0, {NULL}, NULL}; + lzma_ret ret = LZMA_OK; + unsigned char buf[8]; + + if (fd == -1 && filename != NULL) + if ((fd = open(filename, O_RDONLY)) < 0) + return xF; + if (read(fd, buf, sizeof(buf)) < 0) + return xF; + lseek(fd, 0, SEEK_SET); + if (filename != NULL) { + close(fd); + fd = -1; + } + if (buf[0] == 0xFD && buf[1] == '7' && buf[2] == 'z' && + buf[3] == 'X' && buf[4] == 'Z' && buf[5] == 0x00) + xF.type = XF_XZ; + else if (buf[0] == 0x1F && buf[1] == 0x8B) + xF.type = XF_GZIP; + else + xF.type = XF_NONE; + + switch(xF.type) { + case XF_GZIP: + xF.f.gz = (fd == -1 && filename != NULL) ? gzopen(filename, "rb") : gzdopen(fd, "rb"); + if(xF.f.gz == NULL) + xF.type = XF_FAIL; + break; + case XF_NONE: + xF.fp = (fd == -1 && filename != NULL) ? fopen(filename, "rb") : fdopen(fd, "rb"); + break; +#ifdef CONFIG_USE_LIBLZMA + case XF_XZ: + xF.fp = (fd == -1 && filename != NULL) ? fopen(filename, "rb") : fdopen(fd, "rb"); + if(xF.fp == NULL) + xF.type = XF_FAIL; + if(xF.type == XF_NONE || xF.type == XF_FAIL) break; + xF.f.xz = lzma_open(&ret, xF.fp); + if(ret != LZMA_OK) + xF.type = XF_FAIL; + break; +#endif + default: + break; + } + + return xF; +} + +static int xClose(xFile *xF) { + int ret = -1; + switch(xF->type) { + case XF_GZIP: + ret = gzclose(xF->f.gz); + break; +#ifdef CONFIG_USE_LIBLZMA + case XF_XZ: + lzma_end(&xF->f.xz->strm); + free(xF->f.xz); +#endif + case XF_NONE: + ret = fclose(xF->fp); + break; + default: + break; + } + return ret; +} + +static ssize_t xRead(xFile *xF, lzma_ret *ret, void *buf, size_t len) { + ssize_t sz; + switch(xF->type) { + case XF_GZIP: + sz = gzread(xF->f.gz, buf, len); + xF->eof = gzeof(xF->f.gz); + break; +#ifdef CONFIG_USE_LIBLZMA + case XF_XZ: + sz = lzma_read(ret, xF->f.xz, buf, len); + xF->eof = xF->f.xz->eof; + break; +#endif + case XF_NONE: + sz = fread(buf, 1, len, xF->fp); + xF->eof = feof(xF->fp); + break; + default: + sz = -1; + break; + } + return sz; +} + +void *grab_contents(xFile *xF, unsigned long *size) +{ + unsigned int max = 16384; + void *buffer = calloc(1, max); + lzma_ret ret; + + if (!buffer) + return NULL; + + *size = 0; + while ((ret = xRead(xF, &ret, buffer + *size, max - *size)) > 0) { + *size += ret; + if (*size == max) { + void *p; + + p = realloc(buffer, max *= 2); + if (!p) + goto out_err; + + buffer = p; + } + } + if (ret < 0) + goto out_err; + + return buffer; + +out_err: + free(buffer); + return NULL; +} + +/* gzopen handles uncompressed files transparently. */ +void *grab_file(const char *filename, unsigned long *size) +{ + xFile xF; + void *buffer; + + xF = xOpen(-1, filename); + if (xF.type == XF_FAIL) + return NULL; + buffer = grab_contents(&xF, size); + xClose(&xF); + return buffer; +} + +void release_file(void *data, unsigned long size) +{ + free(data); +} +#else /* ... !CONFIG_USE_ZLIB */ + +void *grab_fd(int fd, unsigned long *size) +{ + struct stat st; + void *map; + int ret; + + ret = fstat(fd, &st); + if (ret < 0) + return NULL; + *size = st.st_size; + map = mmap(0, *size, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0); + if (map == MAP_FAILED) + map = NULL; + return map; +} + +void *grab_file(const char *filename, unsigned long *size) +{ + int fd; + void *map; + + fd = open(filename, O_RDONLY, 0); + if (fd < 0) + return NULL; + map = grab_fd(fd, size); + close(fd); + return map; +} + +void release_file(void *data, unsigned long size) +{ + munmap(data, size); +} +#endif diff --git a/mdk-stage1/zlibsupport.h b/mdk-stage1/zlibsupport.h new file mode 100644 index 000000000..be3c7296a --- /dev/null +++ b/mdk-stage1/zlibsupport.h @@ -0,0 +1,11 @@ +#ifndef _ZLIB_SUPPORT_H +#define _ZLIB_SUPPORT_H + +/* Grab file. Decompresses if that is supported. Returns NULL on error. */ +extern void *grab_file(const char *filename, unsigned long *size); +extern void *grab_fd(int fd, unsigned long *size); + +/* Free it up. */ +extern void release_file(void *data, unsigned long size); + +#endif /* _ZLIB_SUPPORT_H */ |
