diff options
author | Pascal Rigaux <pixel@mandriva.com> | 2003-06-12 14:10:44 +0000 |
---|---|---|
committer | Pascal Rigaux <pixel@mandriva.com> | 2003-06-12 14:10:44 +0000 |
commit | 014a65964c200155ec01d633c8653c3840cec9c2 (patch) | |
tree | 2a0f56e94e232bb3be8563f3a80fe45bbeaf4c53 | |
parent | 726052354a8a77b85e11c620e3c9fbe98522ff57 (diff) | |
download | drakx-014a65964c200155ec01d633c8653c3840cec9c2.tar drakx-014a65964c200155ec01d633c8653c3840cec9c2.tar.gz drakx-014a65964c200155ec01d633c8653c3840cec9c2.tar.bz2 drakx-014a65964c200155ec01d633c8653c3840cec9c2.tar.xz drakx-014a65964c200155ec01d633c8653c3840cec9c2.zip |
merge with x86_64-branch
564 files changed, 17766 insertions, 6153 deletions
@@ -19,9 +19,15 @@ endif ifeq (ia64,$(ARCH)) BOOT_IMG = all.img endif +ifeq (x86_64,$(ARCH)) + BOOT_IMG = cdrom.img hd.img network.img usb.img blank.img other.img +endif FBOOT_IMG = $(BOOT_IMG:%=images/%) -FBOOT_RDZ = $(FBOOT_IMG:%.img=%.rdz) images/all.rdz +FBOOT_RDZ = $(FBOOT_IMG:%.img=%.rdz) +ifneq (all.img,$(findstring all.img,$(BOOT_IMG))) +FBOOT_RDZ += images/all.rdz +endif .PHONY: dirs install @@ -65,6 +71,11 @@ install_only: cp -f images/cdrom-changedisk.img $(ROOTDEST)/images endif + ifeq (x86_64,$(ARCH)) + rm -rf $(ROOTDEST)/isolinux + cp -af isolinux $(ROOTDEST) + endif + install live_update $(ROOTDEST)/live_update make -C perl-install full_stage2 make -C perl-install/share/advertising install diff --git a/docs/README b/docs/README index d35508e66..f35b3c49f 100644 --- a/docs/README +++ b/docs/README @@ -267,6 +267,43 @@ then, on another computer: % DISPLAY=test_machine:0 xwd -root | convert - screenshot.png ******************************************************************************** +* Auto install ***************************************************************** +******************************************************************************** +A powerful auto-install system is available. It allows performing +an install without any human interaction. + +To feed automatic parameters to the stage1 part (the textmode +part - might not be necessary for you if you plan to do +cdrom-based auto-installs, but mostly highly needed when doing +network installs), please refer to ../mdk-stage1/doc/TECH-INFOS. + +About the stage2 part (the actual installer, at the time you're +(usually) running in graphical mode), please refer to the nice +documentation written by David Eastcott. Either install the +package "drakx-autoinstall-doc" from contrib, or browse: + +http://members.shaw.ca/mandrake/drakx/9.0/HTML/ + +The previous document will explain you how to setup the contents +of the auto_inst.cfg file. Note that you have 3 alternatives for +providing this file: +- from a floppy disk; use "kickstart=floppy" as kernel parameter, + as explained in the document +- from the installation volume itself; put the file in the + "Mandrake/base" directory of the installation volume; use + "kickstart" only, or "kickstart=filename" to specify another + filename than auto_inst.cfg +- specified by the network; setup your DHCP server to provide the + "bootfile" parameter, this file will be used as the + "auto_inst.cfg" file, in the case you also provide the + "netauto" boot parameter + +In any case, if the specified file ends with -IP or -IP.pl, IP +will be substituted by the IP address of the machine, when doing +a network install. Might be useful so that you can control all +your auto installs from your server. + +******************************************************************************** * Miscellaneous **************************************************************** ******************************************************************************** > o Media access methods: nfs, ftp, http, hd, cdrom diff --git a/kernel/Makefile b/kernel/Makefile index 4f424ea95..0d478b9a5 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -7,7 +7,7 @@ all.modules: ../mdk-stage1/mar/mar update_kernel list_modules.pm `../tools/specific_arch ./update_kernel` ../mdk-stage1/mar/mar: - make -C `dirname $@` + make -C `dirname $@` mar clean: rm -rf *~ modules.description all.modules all.modules64 diff --git a/kernel/check_mar.pl b/kernel/check_mar.pl index d29e65088..19225410a 100755 --- a/kernel/check_mar.pl +++ b/kernel/check_mar.pl @@ -7,14 +7,14 @@ my $mar = '../mdk-stage1/mar/mar'; my %sanity_check = ( hd => [ - if_(arch() !~ /x86_64/, 'aic7xxx'), - qw(sym53c8xx initio), - if_(arch() !~ /ppc/, 'advansys'), + qw(aic7xxx sym53c8xx), + if_(arch() !~ /x86_64/, 'initio'), + if_(arch() !~ /ppc|x86_64/, 'advansys'), ], network => [ - qw(3c59x eepro100 tulip via-rhine ne2k-pci 8139too), - if_(arch() !~ /ppc|x86_64/, 'e100'), - if_(arch() !~ /ppc|ia64/, 'tlan'), + qw(3c59x eepro100 tulip via-rhine ne2k-pci 8139too), + if_(arch() !~ /ppc/, 'e100'), + if_(arch() !~ /ppc|x86_64|ia64/, 'tlan'), ], ); diff --git a/kernel/list_modules.pm b/kernel/list_modules.pm index 0d38c874d..303fadb46 100644 --- a/kernel/list_modules.pm +++ b/kernel/list_modules.pm @@ -16,7 +16,7 @@ our %l = ( main => [ if_(arch() =~ /ppc/, qw(mace bmac gmac)), if_(arch() =~ /^sparc/, qw(myri_sbus sunbmac sunhme sunqe)), - if_(arch() !~ /alpha/ && arch() !~ /sparc/, + if_(arch() !~ /alpha|sparc/, qw(3c501 3c503 3c505 3c507 3c509 3c515), # 3c90x qw(82596 abyss ac3200 acenic aironet4500_card at1700 atp com20020-pci), qw(cs89x0 de600 de620 r8169), @@ -24,7 +24,8 @@ our %l = ( qw(depca dmfe e100 e1000 e2100 eepro eepro100 eexpress epic100 eth16i), qw(ewrk3 hamachi hp hp-plus hp100 ibmtr), qw(lance natsemi ne ne2k-pci ni5010 ni52 ni65 nvnet olympic pcnet32 plip rcpci), #old_tulip - qw(sb1000 sis900 sk98lin smc-ultra smc9194 starfire tg3 tlan tmspci tulip via-rhine), #sktr + qw(sb1000 sis900 sk98lin smc-ultra smc9194 starfire tlan tmspci tulip via-rhine), #sktr + qw(tg3 bcm5700), qw(wd winbond-840 yellowfin ns83820), qw(iph5526), #- fibre channel @@ -62,7 +63,7 @@ our %l = ( qw(eata eata_pio eata_dma), ), '53c7,8xx', - qw(aic7xxx pci2000 qlogicisp sym53c8xx), # ncr53c8xx + qw(aic7xxx pci2000 qlogicisp sym53c8xx mptscsih mptbase), # ncr53c8xx ], hardware_raid => [ if_(arch() =~ /^sparc/, qw(pluto)), @@ -99,7 +100,7 @@ our %l = ( cdrom => [ qw(isofs) ], loopback => [ qw(isofs loop) ], local => [ - if_(arch() =~ /^i.86/, qw(vfat fat)), + if_(arch() =~ /^i.86|x86_64/, qw(vfat fat)), if_(arch() =~ /^ppc/, qw(hfs)), qw(reiserfs), ], @@ -143,6 +144,7 @@ our %l = ( qw(busmouse msbusmouse logibusmouse serial qpmouse atixlmouse), ], char => [ + if_(arch() =~ /ia64/, qw(efivars)), qw(amd768_rng applicom n_r3964 nvram pc110pad ppdev), qw(mxser moxa isicom wdt_pci epca synclink istallion sonypi i810-tco sx), #- what are these??? ], diff --git a/kernel/modules.pl b/kernel/modules.pl index 235853f3e..a5b210ffe 100644 --- a/kernel/modules.pl +++ b/kernel/modules.pl @@ -28,6 +28,7 @@ my @skip_modules_on_stage1 = ( qw(sktr tmspci ibmtr abyss), # alt token ring qw(old_tulip rtl8139), if_(arch() =~ /alpha|ppc/, qw(sb1000)), + if_(arch() !~ /x86_64|ia64/, qw(tg3 bcm5700)), #- important gigabit cards qw( r8169 apa1480_cb @@ -37,6 +38,7 @@ my @skip_modules_on_stage1 = ( qla2200 qla2300 iph5526 ), + if_(arch() =~ /x86_64/, qw(53c7,8xx initio ataraid advansys atp870u)), #- old 'AM53C974', # deprecated by tmscsim qw(ac3200 at1700 atp ni5010 ni52 ni65), #- unused from Jeff "u14-34f", #- duplicate from ultrastor.o diff --git a/kernel/update_kernel b/kernel/update_kernel index 8ab1d2e5d..b778fd150 100755 --- a/kernel/update_kernel +++ b/kernel/update_kernel @@ -1,11 +1,17 @@ #!/bin/bash ALL_KERNELS="all.kernels" +RPMS=/RPMS # move stuff to this new "kernel" directory if [ ! -d all.kernels ]; then - mv ../all.kernels . - rm -rf ../all.modules + if [ -d ../all.kernels ]; then + mv ../all.kernels . + rm -rf ../all.modules + else + # make sure "all.kernels" directory exists + mkdir all.kernels + fi fi function create_marfile() { @@ -38,13 +44,23 @@ function create_modules() { [ -e $ALL_KERNELS/.main ] && main=$(cat $ALL_KERNELS/.main) -rpm=$(rpm -qp --qf '%{name}' /RPMS/kernel-BOOT-*.rpm | perl -pe 's/kernel-BOOT-(.*)\.(.*)/$1-${2}BOOT/') +ARCH=`uname -m | sed -e 's/i.86/i386/' -e 's/sparc.*/sparc/'` + +if [ "$ARCH" == "ia64" ] || [ "$ARCH" == "ppc" ]; then + rpm=$(rpm -qp --qf '%{name}' $RPMS/kernel-[0-9]*.rpm | perl -pe 's/kernel-((\.?[0-9]+){3})\.(.*)/$1-${3}/') +else + rpm=$(rpm -qp --qf '%{name}' $RPMS/kernel-BOOT-*.rpm | perl -pe 's/kernel-BOOT-((\.?[0-9]+){3})\.(.*)/$1-${3}BOOT/') +fi if [ -n "$rpm" -a ! -e $ALL_KERNELS/$rpm ]; then [ -n "$main" ] && rm -rf $ALL_KERNELS/$main cd $ALL_KERNELS rm -rf $rpm ; mkdir $rpm cd $rpm - rpm2cpio /RPMS/kernel-BOOT-*.rpm | cpio -id + if [ "$ARCH" == "ia64" ] || [ "$ARCH" == "ppc" ]; then + rpm2cpio $RPMS/kernel-[0-9]*.rpm | cpio -id + else + rpm2cpio $RPMS/kernel-BOOT-*.rpm | cpio -id + fi find -type f -name "*.o.gz" | xargs gunzip cd ../.. @@ -61,7 +77,6 @@ fi cd .. } -ARCH=`uname -m | sed -e 's/i.86/i386/' -e 's/sparc.*/sparc/'` eval `perl modules.pl images` @@ -70,12 +85,12 @@ if [ "$ARCH" == "i386" ]; then #disable any existing resolution!!! /usr/sbin/rdev -v $i 65535 #788 #785 done -else - if [ "$ARCH" == "ppc" ]; then - cp -f "$KERNEL_BOOT_PATH"/boot/vmlinux . - else - cp -f "$KERNEL_BOOT_PATH"/boot/vmlinux.gz . - fi +elif [ "$ARCH" == "ppc" ]; then + cp -f "$KERNEL_BOOT_PATH"/boot/vmlinux . +elif [ "$ARCH" == "ia64" ]; then + cp -f "$KERNEL_BOOT_PATH"/boot/efi/vmlinuz* . +else + cp -f "$KERNEL_BOOT_PATH"/boot/vmlinuz* . fi @@ -91,6 +106,7 @@ for i in $ALL_KERNELS/*; do create_modules ../../$i $kern else echo "$kern ($main)" + find ../../$i -type f -name "*.o.gz" | xargs gunzip create_modules ../../$i $kern 2>/dev/null fi ) || exit 1 diff --git a/make_boot_img b/make_boot_img index b26668e15..2bbca5ae6 100755 --- a/make_boot_img +++ b/make_boot_img @@ -14,7 +14,10 @@ my ($arch) = $Config{archname} =~ /(.*?)-/; rename 'all.kernels', 'kernel/all.kernels'; rename 'all.modules', 'kernel/all.modules'; -$DEFAULT_append = "ramdisk_size=32000 root=/dev/ram3"; +# default ramdisk size +$ramdisk_size = 128000; + +$default_append = "ramdisk_size=$ramdisk_size root=/dev/ram3"; $default_vga = "vga=788"; $instdir = "mdk-stage1"; @@ -73,13 +76,17 @@ foreach (@kernels) { rename("$img-$main", "$img"); } } +if ($arch =~ /x86_64/ && $img =~ /all/) { + # isolinux is supposed to work on all those new hardware + isolinux($main, @kernels); +} if ($arch =~ /i.86/ && $img =~ /all/) { isolinux($main, @kernels); my ($img, $img_sav) = ("images/cdrom.img-$main", 'images/cdrom.img-sav'); rename($img, $img_sav); $type = 'cdrom'; - boot_img_i386($mnt, $img, "kernel/all.kernels/$main/boot/vmlinu*", sub { $_[0] =~ s/\bautomatic=\S+\b//; "$_[0] changedisk" }); + $::{"boot_img_$arch"}->($mnt, $img, "kernel/all.kernels/$main/boot/vmlinu*", sub { $_[0] =~ s/\bautomatic=\S+\b//; "$_[0] changedisk" }); rename($img, 'images/cdrom-changedisk.img'); rename($img_sav, $img); } @@ -110,10 +117,11 @@ sub initrd { _ "$sudo mount -t ext2 $tmp $mnt -o loop"; _ "$sudo tar xjC $mnt -f $tar"; + symlinkf "/tmp/stage2/lib64", "$mnt/lib64" if ($arch =~ /x86_64/); install_stripped("$instdir/init", "$mnt/sbin"); - install_stripped("$instdir/$install", "$mnt/sbin/stage1"); + install_stripped("$instdir/$install", "$mnt/sbin/stage1"); - if ($type eq "network" || $type eq "usb" || $type eq "all" || $type eq "other" || $type eq "blank") { + if (member($type, qw(network usb all other blank)) && $arch !~ /x86_64/) { install_stripped("$instdir/ppp/pppd-bin", "$mnt/sbin/pppd"); install_stripped("$instdir/rp-pppoe/pppoe-bin", "$mnt/sbin/pppoe"); _ "$sudo mknod $mnt/dev/ppp c 108 0"; @@ -121,7 +129,7 @@ sub initrd { _ "$sudo mknod $mnt/dev/ttyp0 c 3 0"; } - if (member($type, qw(pcmcia all network)) && $arch !~ /ppc/ && $arch !~ /ia64/) { + if (member($type, qw(pcmcia all network)) && $arch !~ /ppc|ia64|x86_64/) { _ "$sudo cp -a /etc/pcmcia $mnt/etc"; _ "cp $mnt/etc/pcmcia/config /tmp/pcmcia_config_tmp"; _ "tools/patch_pcmcia_config.pl /tmp/pcmcia_config_tmp kernel/all.modules/$main/modules.dep"; @@ -219,6 +227,43 @@ F3 boot.msg _ "df $mnt"; } +sub boot_img_x86_64 { + my ($mnt, $img, $kernel) = @_; + + __ "$sudo umount $mnt 2>/dev/null"; + + _ "dd if=/dev/zero of=$img bs=1k count=1440"; + _ "/sbin/mkfs.vfat $img"; + _ "$sudo syslinux -s $img"; + _ "$sudo mount -t vfat -o umask=0 $img $mnt -o loop"; + + _ "cat $kernel > $mnt/vmlinuz"; + my $rdz = $img; $rdz =~ s/\.img/.rdz/; + initrd "${mnt}2", $rdz if ! -e $rdz; + eval { _ "cp -f $rdz $mnt/$type.rdz" }; + if ($@) { + unlink "$mnt/$type.rdz"; + my $avail = (split ' ', `df $mnt`)[-3]; + my $s = int((-s $rdz) / 1024); + die sprintf("not enough room for $rdz: need %d KB (available %d KB < needed %d KB)\n", $s - $avail, $avail, $s); + } + + my $timeout = 72; + output "$mnt/syslinux.cfg", +"default linux +prompt 1 +timeout $timeout +" . join('', map { +"label $_->[0] + kernel vmlinuz + append initrd=$type.rdz $_->[1] +" +} entries_append($type)); + + _ "sync"; + _ "df $mnt"; +} + sub boot_img_alpha { my ($mnt, $img) = @_; @@ -258,14 +303,14 @@ image=vmlinux label=linux root=/dev/ram3 initrd=$type.rdz - append=\" ramdisk_size=120000\" + append=\" ramdisk_size=$ramdisk_size\" read-only image=vmlinux label=rescue root=/dev/ram3 initrd=$type.rdz - append=\" rescue ramdisk_size=120000\" + append=\" rescue ramdisk_size=$ramdisk_size\" "); _ "sync"; _ "df $mnt"; @@ -312,44 +357,44 @@ image[sun4c,sun4d,sun4m]=/$boot/vmlinux label=linux alias=install initrd=/$boot/live.rdz - append=\"ramdisk_size=32000 root=/dev/ram3\" + append=\"ramdisk_size=$ramdisk_size root=/dev/ram3\" image[sun4c,sun4d,sun4m]=/$boot/vmlinux label=text initrd=/$boot/live.rdz - append=\"ramdisk_size=32000 text root=/dev/ram3\" + append=\"ramdisk_size=$ramdisk_size text root=/dev/ram3\" image[sun4c,sun4d,sun4m]=/$boot/vmlinux label=expert initrd=/$boot/live.rdz - append=\"ramdisk_size=32000 expert root=/dev/ram3\" + append=\"ramdisk_size=$ramdisk_size expert root=/dev/ram3\" image[sun4c,sun4d,sun4m]=/$boot/vmlinux label=ks initrd=/$boot/live.rdz - append=\"ramdisk_size=32000 ks root=/dev/ram3\" + append=\"ramdisk_size=$ramdisk_size ks root=/dev/ram3\" image[sun4c,sun4d,sun4m]=/$boot/vmlinux label=rescue initrd=/$boot/live.rdz - append=\"ramdisk_size=32000 rescue rw root=/dev/ram3\" + append=\"ramdisk_size=$ramdisk_size rescue rw root=/dev/ram3\" image[sun4u]=/$boot/vmlinux64 label=linux alias=install initrd=/$boot/live64.rdz - append=\"ramdisk_size=32000 root=/dev/ram3\" + append=\"ramdisk_size=$ramdisk_size root=/dev/ram3\" image[sun4u]=/$boot/vmlinux64 label=text initrd=/$boot/live64.rdz - append=\"ramdisk_size=32000 text root=/dev/ram3\" + append=\"ramdisk_size=$ramdisk_size text root=/dev/ram3\" image[sun4u]=/$boot/vmlinux64 label=expert initrd=/$boot/live64.rdz - append=\"ramdisk_size=32000 expert root=/dev/ram3\" + append=\"ramdisk_size=$ramdisk_size expert root=/dev/ram3\" image[sun4u]=/$boot/vmlinux64 label=ks initrd=/$boot/live64.rdz - append=\"ramdisk_size=32000 ks root=/dev/ram3\" + append=\"ramdisk_size=$ramdisk_size ks root=/dev/ram3\" image[sun4u]=/$boot/vmlinux64 label=rescue initrd=/$boot/live64.rdz - append=\"ramdisk_size=32000 rescue rw root=/dev/ram3\" + append=\"ramdisk_size=$ramdisk_size rescue rw root=/dev/ram3\" "); output("$dir/$boot/README", " @@ -397,7 +442,7 @@ message=/boot.msg image=/vmlinux$I.gz label=linux initrd=/$type.rdz - append=\"ramdisk_size=32000 $ltype root=/dev/ram3\" + append=\"ramdisk_size=$ramdisk_size $ltype root=/dev/ram3\" "); _ "genromfs -d $dir -f /dev/ram -A 2048,/.. -a 512 -V \'DrakX boot disk\'"; _ "$sudo mount -t romfs /dev/ram $mnt"; @@ -429,56 +474,56 @@ image = cd:,\\\\\\\\vmlinux label = install-novideo root = /dev/ram3 initrd = cd:,\\\\\\\\all.gz - initrd-size = 32000 + initrd-size = $ramdisk_size append = \" video=ofonly\" image = cd:,\\\\\\\\vmlinux label = install-atyfb root = /dev/ram3 initrd = cd:,\\\\\\\\all.gz - initrd-size = 32000 + initrd-size = $ramdisk_size append = \" video=atyfb:vmode:17\" image = cd:,\\\\\\\\vmlinux label = install-aty128fb root = /dev/ram3 initrd = cd:,\\\\\\\\all.gz - initrd-size = 32000 + initrd-size = $ramdisk_size append = \" video=aty128fb:vmode:17\" image = cd:,\\\\\\\\vmlinux label = install-text root = /dev/ram3 initrd = cd:,\\\\\\\\all.gz - initrd-size = 32000 + initrd-size = $ramdisk_size append = \" text video=ofonly\" image = enet:0,vmlinux label = install-net root = /dev/ram3 initrd = enet:0,all.gz - initrd-size = 32000 + initrd-size = $ramdisk_size append = \" video=ofonly\" image = enet:0,vmlinux label = install-net-text root = /dev/ram3 initrd = enet:0,all.gz - initrd-size = 32000 + initrd-size = $ramdisk_size append = \" text video=ofonly\" image = cd:,\\\\\\\\vmlinux label = rescue root = /dev/ram3 initrd = cd:,\\\\\\\\all.gz - initrd-size = 32000 + initrd-size = $ramdisk_size append = \" rescue video=ofonly\" image = enet:0,vmlinux label = rescue-net root = /dev/ram3 initrd = enet:0,all.gz - initrd-size = 32000 + initrd-size = $ramdisk_size append = \" rescue video=ofonly\" "); #- seem to need 2 yaboot.conf, one in the root, and one in boot diff --git a/mdk-stage1/Makefile b/mdk-stage1/Makefile index 81378031d..36cc85702 100644 --- a/mdk-stage1/Makefile +++ b/mdk-stage1/Makefile @@ -1,4 +1,4 @@ - #****************************************************************************** + #***************************************************************************** # # mdk-stage1 - the program that will load second-stage install # @@ -33,6 +33,10 @@ # init with glibc # stage1 with glibc # + # x86-64 + # init with minilibc + # stage1 with dietlibc + # #***************************************************************************** @@ -53,6 +57,10 @@ ifeq (i386, $(ARCH)) INITSRC = minilibc.c init.c INIT_DEFS = -DINIT_HEADERS=\"minilibc.h\" -fno-builtin else +ifeq (x86_64, $(ARCH)) +INITSRC = minilibc.c init.c +INIT_DEFS = -DINIT_HEADERS=\"minilibc.h\" -fno-builtin +else INITSRC = init.c ifeq (ia64, $(ARCH)) INIT_DEFS = -DINIT_HEADERS=\"init-libc-headers.h\" $(GLIBC_INCLUDES) @@ -60,33 +68,33 @@ else INIT_DEFS = -DINIT_HEADERS=\"init-libc-headers.h\" $(DIETLIBC_INCLUDES) endif endif +endif INITOBJS = $(subst .c,.o,$(INITSRC)) #- frontends NEWT_FRONTEND_SRC = newt-frontend.c -GLIBC_NEWT_FRONTEND_LIBS = newt/libnewt.a slang/libslang.a -DIETLIBC_NEWT_FRONTEND_LIBS = $(subst .a,-DIET.a,$(GLIBC_NEWT_FRONTEND_LIBS)) +NEWT_FRONTEND_LIBS = newt/libnewt.a slang/libslang.a STDIO_FRONTEND_SRC = stdio-frontend.c -GLIBC_STDIO_FRONTEND_LIBS = -DIETLIBC_STDIO_FRONTEND_LIBS = +STDIO_FRONTEND_LIBS = +STDIO_FRONTEND_LIBS = FRONTEND_OBJS = $(subst .c,.o,$($(F)_FRONTEND_SRC)) -FRONTEND_LINK = $(FRONTEND_OBJS) $($(L)_$(F)_FRONTEND_LIBS) +FRONTEND_LINK = $(FRONTEND_OBJS) $($(F)_FRONTEND_LIBS) +INSMOD = insmod-modutils ifeq (i386, $(ARCH)) INSMOD = insmod-busybox -else -INSMOD = insmod-modutils +endif +ifeq (x86_64, $(ARCH)) +INSMOD = insmod-busybox endif -GLIBC_STAGE1_OWN_LIBS = $(INSMOD)/libinsmod.a mar/libmar.a bzlib/libbzlib.a -DIETLIBC_STAGE1_OWN_LIBS = $(subst .a,-DIET.a,$(GLIBC_STAGE1_OWN_LIBS)) -STAGE1_OWN_LIBS = $($(L)_STAGE1_OWN_LIBS) +STAGE1_OWN_LIBS = $(INSMOD)/libinsmod.a mar/libmar.a bzlib/libbzlib.a ifeq (DIETLIBC, $(L)) @@ -94,8 +102,12 @@ STAGE1_NETWORK_LIBS = $(top_dir)/dietlibc/bin-$(ARCH)/librpc.a endif ifeq (GLIBC, $(L)) +ifeq (x86_64, $(ARCH)) +STAGE1_NETWORK_LIBS = /usr/lib64/libresolv.a +else STAGE1_NETWORK_LIBS = /usr/lib/libresolv.a endif +endif #- stage1 itself STAGE1SRC = stage1.c log.c tools.c modules.c probing.c mount.c automatic.c frontend-common.c @@ -130,6 +142,10 @@ STAGE1OBJS-FULL = $(subst .c,-FULL.o,$(STAGE1SRC) $(CDROMSRC) $(DISKSRC) $(NETWO ifeq (i386, $(ARCH)) LDFLAGS_INIT = -static -nostdlib /usr/lib/crt1.o else +ifeq (x86_64, $(ARCH)) +LDFLAGS_INIT = -static -nostdlib /usr/lib64/crt1.o +INIT_LIBC = $(GLIBC_LIBC) +else ifeq (ia64, $(ARCH)) LDFLAGS_INIT = $(GLIBC_LDFLAGS_STAGE1) INIT_LIBC = $(GLIBC_LIBC) @@ -138,6 +154,7 @@ LDFLAGS_INIT = $(DIETLIBC_LDFLAGS_STAGE1) INIT_LIBC = $(DIETLIBC_LIBC) endif endif +endif BINS = init stage1-full @@ -145,24 +162,33 @@ BINS = init stage1-full ifeq (i386, $(ARCH)) BINS += stage1-cdrom stage1-disk stage1-network stage1-usb endif +ifeq (x86_64, $(ARCH)) +BINS += stage1-cdrom stage1-disk stage1-network stage1-usb +endif -ifneq (ia64, $(ARCH)) +ifeq (i386, $(ARCH)) DIRS = dietlibc endif -DIRS += mar pci-resource usb-resource bzlib $(INSMOD) slang newt ppp/pppd rp-pppoe/src -ifeq (i386,$(ARCH)) +ifeq (ppc, $(ARCH)) +DIRS = dietlibc +endif +ifeq (x86_64, $(ARCH)) +DIRS = dietlibc +endif +DIRS += mar pci-resource usb-resource bzlib $(INSMOD) slang newt +ifneq (x86_64, $(ARCH)) +DIRS += ppp/pppd rp-pppoe/src +endif +ifeq (i386, $(ARCH)) DIRS += pcmcia_ endif ifeq (i386,$(ARCH)) -GLIBC_PCMCIA_LIB = pcmcia_/libpcmcia.a -DIETLIBC_PCMCIA_LIB = $(subst .a,-DIET.a,$(GLIBC_PCMCIA_LIB)) -PCMCIA_LIB = $($(L)_PCMCIA_LIB) +PCMCIA_LIB = pcmcia_/libpcmcia.a PCMCIA_DEFS = -DENABLE_PCMCIA endif - USB_DEFS_GEN = -DENABLE_USB USB_DEFS = -DENABLE_USB -DDISABLE_PCIADAPTERS @@ -178,23 +204,23 @@ init: $(INITOBJS) $(INIT_LIBC) $(STRIPCMD) $@ stage1-cdrom: $(STAGE1OBJS-CDROM) $(STAGE1_OWN_LIBS) $(FRONTEND_LINK) $(STAGE1_LIBC) - $(CC) $(LDFLAGS_STAGE1) -o $@ $^ + $(DIET) $(CC) $(LDFLAGS_STAGE1) -o $@ $^ $(STRIPCMD) $@ stage1-disk: $(STAGE1OBJS-DISK) $(STAGE1_OWN_LIBS) $(FRONTEND_LINK) $(STAGE1_LIBC) - $(CC) $(LDFLAGS_STAGE1) -o $@ $^ + $(DIET) $(CC) $(LDFLAGS_STAGE1) -o $@ $^ $(STRIPCMD) $@ stage1-network: $(STAGE1OBJS-NETWORK) $(STAGE1_OWN_LIBS) $(STAGE1_NETWORK_LIBS) $(FRONTEND_LINK) $(PCMCIA_LIB) $(STAGE1_LIBC) - $(CC) $(LDFLAGS_STAGE1) -o $@ $^ + $(DIET) $(CC) $(LDFLAGS_STAGE1) -o $@ $^ $(STRIPCMD) $@ stage1-usb: $(STAGE1OBJS-USB) $(STAGE1_OWN_LIBS) $(STAGE1_NETWORK_LIBS) $(FRONTEND_LINK) $(STAGE1_LIBC) - $(CC) $(LDFLAGS_STAGE1) -o $@ $^ + $(DIET) $(CC) $(LDFLAGS_STAGE1) -o $@ $^ $(STRIPCMD) $@ stage1-full: $(STAGE1OBJS-FULL) $(STAGE1_OWN_LIBS) $(STAGE1_NETWORK_LIBS) $(FRONTEND_LINK) $(PCMCIA_LIB) $(STAGE1_LIBC) - $(CC) $(LDFLAGS_STAGE1) -o $@ $^ + $(DIET) $(CC) $(LDFLAGS_STAGE1) -o $@ $^ $(STRIPCMD) $@ @@ -202,22 +228,22 @@ $(INITOBJS): %.o: %.c $(COMPILE) $(INIT_DEFS) -c $< $(STAGE1OBJS-CDROM): %-CDROM.o: %.c - $(COMPILE) $(INCLUDES) $(CDROM_DEFS) -c $< -o $@ + $(DIET) $(COMPILE) $(INCLUDES) $(CDROM_DEFS) -c $< -o $@ $(STAGE1OBJS-DISK): %-DISK.o: %.c - $(COMPILE) $(INCLUDES) $(DISK_DEFS) -c $< -o $@ + $(DIET) $(COMPILE) $(INCLUDES) $(DISK_DEFS) -c $< -o $@ $(STAGE1OBJS-NETWORK): %-NETWORK.o: %.c - $(COMPILE) $(INCLUDES) $(NETWORK_DEFS) $(PCMCIA_DEFS) -c $< -o $@ + $(DIET) $(COMPILE) $(INCLUDES) $(NETWORK_DEFS) $(PCMCIA_DEFS) -c $< -o $@ $(STAGE1OBJS-USB): %-USB.o: %.c - $(COMPILE) $(INCLUDES) $(USB_DEFS) -c $< -o $@ + $(DIET) $(COMPILE) $(INCLUDES) $(USB_DEFS) -c $< -o $@ $(STAGE1OBJS-FULL): %-FULL.o: %.c - $(COMPILE) $(INCLUDES) $(USB_DEFS_GEN) $(PCMCIA_DEFS) -c $< -o $@ + $(DIET) $(COMPILE) $(INCLUDES) $(USB_DEFS_GEN) $(PCMCIA_DEFS) -c $< -o $@ .c.o: - $(COMPILE) $(INCLUDES) -c $< + $(DIET) $(COMPILE) $(INCLUDES) -c $< clean: @@ -236,7 +262,7 @@ tar-mkinitrd_helper: clean rm -rf mkinitrd_helper-subdir rescue-gui: rescue-gui.o frontend-common.o $(FRONTEND_LINK) $(STAGE1_LIBC) - $(CC) $(LDFLAGS_STAGE1) -o $@ $^ + $(DIET) $(CC) $(LDFLAGS_STAGE1) -o $@ $^ $(STRIPCMD) $@ diff --git a/mdk-stage1/Makefile.common b/mdk-stage1/Makefile.common index 7506c1381..cc9e602da 100644 --- a/mdk-stage1/Makefile.common +++ b/mdk-stage1/Makefile.common @@ -32,6 +32,13 @@ endif ifeq (ppc, $(ARCH)) L = GLIBC endif +ifeq (x86_64, $(ARCH)) +#L = GLIBC +endif + +ifeq (DIETLIBC, $(L)) +DIET = $(top_dir)/dietlibc/bin-$(ARCH)/diet +endif #- flags used by all stuff @@ -46,11 +53,11 @@ GLIBC_INCLUDES = -I. -I$(top_dir)/bzlib INCLUDES = $($(L)_INCLUDES) GLIBC_LDFLAGS_STAGE1 = -static -DIETLIBC_LDFLAGS_STAGE1 = -nostdlib $(top_dir)/dietlibc/bin-$(ARCH)/start.o +DIETLIBC_LDFLAGS_STAGE1 = -nostdlib LDFLAGS_STAGE1 = $($(L)_LDFLAGS_STAGE1) GLIBC_LIBC = -DIETLIBC_LIBC = $(top_dir)/dietlibc/bin-$(ARCH)/dietlibc.a +DIETLIBC_LIBC = STAGE1_LIBC = $($(L)_LIBC) STRIPCMD = strip -R .note -R .comment diff --git a/mdk-stage1/bzlib/Makefile b/mdk-stage1/bzlib/Makefile index 03a2c254b..8e4bba791 100644 --- a/mdk-stage1/bzlib/Makefile +++ b/mdk-stage1/bzlib/Makefile @@ -29,27 +29,14 @@ INCS = TARGETS = $(LIBNAME).a -ifeq (DIETLIBC, $(L)) -TARGETS += $(LIBNAME)-DIET.a -endif - all: $(TARGETS) clean: rm -f *.o *.a -OBJS-DIET = $(subst .o,-DIET.o,$(OBJS)) - $(LIBNAME).a: $(OBJS) ar -cru $@ $^ ranlib $@ -$(LIBNAME)-DIET.a: $(OBJS-DIET) - ar -cru $@ $^ - ranlib $@ - $(OBJS): %.o: %.c - $(CC) $(CFLAGS) $(DEFS) $(INCS) $(GLIBC_INCLUDES) -c $< -o $@ - -$(OBJS-DIET): %-DIET.o: %.c - $(CC) $(CFLAGS) $(DEFS) $(INCS) $(DIETLIBC_INCLUDES) -c $< -o $@ + $(DIET) $(CC) $(CFLAGS) $(DEFS) $(INCS) $(INCLUDES) -c $< -o $@ diff --git a/mdk-stage1/dhcp.c b/mdk-stage1/dhcp.c index 9725eca45..451452227 100644 --- a/mdk-stage1/dhcp.c +++ b/mdk-stage1/dhcp.c @@ -211,7 +211,7 @@ static void parse_reply(struct bootp_request * breq, struct interface_info * int unsigned char * chptr; unsigned char option, length; - if (breq->bootfile && strlen(breq->bootfile) > 0 && !strcmp(breq->bootfile, "autoinst.cfg.pl")) + if (breq->bootfile && strlen(breq->bootfile) > 0 && IS_NETAUTO) stage2_kickstart = strdup(breq->bootfile); memcpy(&intf->ip, &breq->yiaddr, 4); diff --git a/mdk-stage1/dietlibc/.cvsignore b/mdk-stage1/dietlibc/.cvsignore index 7c88cb004..f0be42e21 100644 --- a/mdk-stage1/dietlibc/.cvsignore +++ b/mdk-stage1/dietlibc/.cvsignore @@ -10,3 +10,19 @@ bin-i386 bin-mips bin-ppc bin-sparc +bin-mipsel +bin-parisc +bin-s390 +bin-sparc64 +pic-alpha +pic-arm +pic-i386 +pic-mips +pic-ppc +pic-sparc +pic-mipsel +pic-parisc +pic-s390 +pic-sparc64 +bin-ia64 +bin-x86_64 diff --git a/mdk-stage1/dietlibc/AUTHOR b/mdk-stage1/dietlibc/AUTHOR index 6d8ab1a05..3f6a44e6d 100644 --- a/mdk-stage1/dietlibc/AUTHOR +++ b/mdk-stage1/dietlibc/AUTHOR @@ -1 +1,3 @@ Felix von Leitner <felix-dietlibc@fefe.de> + +Please see the file THANKS for additional authors and contributors. diff --git a/mdk-stage1/dietlibc/BUGS b/mdk-stage1/dietlibc/BUGS new file mode 100644 index 000000000..d030db5e6 --- /dev/null +++ b/mdk-stage1/dietlibc/BUGS @@ -0,0 +1,8 @@ +Please report bugs to + + felix-dietlibc@fefe.de + +or to the mailing list at + + dietlibc@fefe.de + diff --git a/mdk-stage1/dietlibc/CAVEAT b/mdk-stage1/dietlibc/CAVEAT new file mode 100644 index 000000000..efd20d6f5 --- /dev/null +++ b/mdk-stage1/dietlibc/CAVEAT @@ -0,0 +1,5 @@ + +Beware! Much of this code is untested! + +Someday, we will have a test suite and everything will be just fine. + diff --git a/mdk-stage1/dietlibc/CHANGES b/mdk-stage1/dietlibc/CHANGES new file mode 100644 index 000000000..de4f88c3e --- /dev/null +++ b/mdk-stage1/dietlibc/CHANGES @@ -0,0 +1,911 @@ +0.22: + fix i386 libm + fix netinet/ip_icmp.h (Rui Prior) + make strings.h susv3 compliant (Gunnar Ritter) + remove stdio dependence in abort + fix truncate64, ftruncate64 (Luc Van Oostenryck and Yuri Kozlov) + fix and improve erand48() (Luc Van Oostenryck) + fix realpath for non-existant directories (Gergely Nagy and Gerrit Pape) + fix DNS timeout and IPv6 socket reuse + strtoul now accepts "-1" as well (Thomas Ogrisegg) + add i386 strcasecmp and __ltostr (Thomas Ogrisegg) + add killpg prototype (Luc Van Oostenryck) + remove some compiler warnings (Luc Van Oostenryck) + better rand() from Knuth's TAOCP (Luc Van Oostenryck) + fix unified x86_64 unified syscall 64-bit return value issue (Gwenole) + the getdents64 emulation was broken and repairing it opened a can of + worms. So I ripped it out. I also changed the readdir64 emulation + to work if there is no getdents64. + fix ia64 start.S (Thanks to Volker Birk for an account on his ia64 box) + many ia64 fixes (waitpid, nice, fork, vfork, time, utime ...) + More fixes from Gwenole (printf %p only printed the last 32 bits, I + botched the getdents64 #ifdefs, we violated the x86_64 ABI) + change signal() to do as glibc does + remove a few more warnings + add new 2.5 syscall #defines + add epoll_create, epoll_ctl and epoll_wait + the new x86 syscall numbers exceed 255, breaking our %al optimization + I worked around it with conditional assembly in cpp macros. Ugh. + more MIPS fixes (the stoned MIPS ABI for restartable syscalls expects + the instruction before the syscall to be a load immediate) + fix fread() from a pipe (oops, tried to lseek) + #define _POSIX_VDISABLE in termios.h (Laurent Bercot) + two *printf fixes (Gernot Tenchio) + add nan and +-inf handling in __dtostr + add _SC_NGROUPS_MAX support to sysconf (Felix J. Ogris) + make assert() use expect(), slight optimization + add i386 vfork (Thomas Ogrisegg) + fix SA_NODEFER on sparc (Gerrit Pape, Thomas Bader) + fix sin, cos and __dtostr (Gernot Tenchio) + add /dev/epoll ioctl constants to sys/ioctl.h + add linux/eventpoll.h for /dev/epoll + fix lseek64 on 64-bit architectures + Olaf: fix x86_64 start-code (we have reg-args) + fixing some broken macros in sparc32-code (.udiv,.urem) + adding strndup (GNU Extension) + fix glob strncpy (R.L. Horn) + fix regfree (Uwe Ohse) + fix puts in full stdio mode (would omit \n) + fix wrong types on powerpc, broke *stat (Gerrit Pape) + allow more than 64k in i386 memchr (Karsten Scheibler) + make strftime work it WANT_TZFILE_PARSER is not set (Gwenole Beauchesne) + build parisc on parisc64, change libgcc link order on sparc (Gerrit Pape) + +0.21: + use gcc's size_t, ptrdiff_t and wchar_t types (Olaf) + use -G 8 on MIPS to reduce code size (Johannes Stezenbach) + add munlock (Jens Låås) + argh, atexit fell victim to bit rot (or maybe Olaf) + add WANT_INET_ADDR_DNS to make gethostbyname not look up IP numbers + but use them to fill in the struct hostent directly. + signal is now a correct signal (Olaf) + read optimizer cflags for diet -Os gcc from ~/.diet/gcc, overriding + the built-in defaults. + add file "SECURITY". I will document design tradeoffs that have + security implications there. + fixed regex LINEEND condition + add .size directive to i386 syscalls + shove a few more bytes off the i386 socket calls + setjmp, longjmp and clone for x86_64 are now implemented but not tested (Olaf) + fix sparc signals + +0.20: + calloc was botched + umount and stime for x86_64 (Gwenole Beauchesne) + some malloc fixes for very big numbers (Enrico Scholz, me) + x86_64 unified syscall did not preserve rbx violating ABI (Gwenole) + realpath fix if path did not contain a slash (Gwenole) + add ucontext + add asm/statfs.h to work around people using <linux/fs.h> + +0.19: + current gcc cvs makes __thread a keyword (Eric Troan) + be more strict regarding hostile DNS packets (me) + fix ia64 compile problems (Gerrit Pape) + make killpg a function and not a macro (broke bash 2.05b) + fix ia64 start code and unified syscall (me) + add sparc/strlen.S from Thomas Ogrisegg + add more space to ARM __jmp_buf in setjmp.h (Andre) + fix libcompat/syscall.S (did't compile on arm) + add integer overflow fix in xdr_array after bugtraq advisory (me) + fix x86_64 socket calls and mmap (and some more) (Gwenole Beauchesne) + add calloc integer overflow fix after RUS-CERT advisory (me) + add fread and fwrite integer overflow fix (me) + +0.18: + add stpcpy (from Thomas Ogrisegg) + check in mktime fix (from Luc Van Oostenryck) + add libm2.s from contrib to i386 (oops, how long has it been sitting + there?) + add truncate64 and ftruncate64 and prototype for truncate (only had ftruncate) + Michal Ludvig ported the diet libc to the x86_64 architecture (the + upcoming AMD Hammer chips!). You can't even buy the chips yet and + the diet libc already supports it! Amazing ;-) + Michal's patch also fixed several of the outstanding warnings. Thanks! + Andre sent a patch to add ARM profiling. He says it does not work + yet, but it's a start. + added getdents64 backwards compatibility and include it in large file + support #defines + perror now checks if the message is NULL like glibc (Thomas Ogrisegg) + ftell did not take ungetc into account (Kevin Ryde through Debian). + Thomas Ogrisegg sent a port to IA64! + sigaddset, sigdelset and setismember segfaulted for signal 0 (Gunnar Ritter) + Enrico Scholz reported several bugs in the header files. + change __malloc__ to __attribute_malloc__ + add pa-risc socketcall (but see TODO) (Felix J. Ogris) + fix *rand48 initialization (Kevin Ryde) + fnmatch infinite loop fix (Piotr Esden-Tempski) + make signal() into a sigaction wrapper function + add memrchr (Emil) + remove __attribute__((const)) from getpid() (Yuri Kozlov) + make getserv* also work if proto is NULL (Jens Låås) + now clone on parisc works (Thomas Ogrisegg) + getopt* fix from Thomas Walpuski + add syscall() to libcompat (Thomas Ogrisegg) + fix strncpy and strrchr i386 assembly versions for dynamic linking + (John K. Hohm) + allow short option grouping in getopt* (Ralf Wildenhues) + make the DNS resolver IPv6 transport capable (WANT_IPV6_DNS) + mention -v in diet.1 (Bryan Henderson) + auto-detect gcc 3 on i386 and remove compiler option warnings + putenv tweak (Thomas Ogrisegg) + add missing socket syscalls for PA-RISC and IA64 (Thomas Ogrisegg) + add cpio.h and tar.h (Thomas Ogrisegg) + change opendir/readdir/closedir from malloc to mmap (Thomas Ogrisegg) + cleanups from Florian LaRoche + +0.17: + fix several bugs in getservent_r + Gunnar Ritter reported the following: + moved tcgetpgrp and tcsetpgrp to unistd.h + adjusted lstat->lstat64 #define to make it work with function pointers + move __dietlibc__ #define from features.h to diet + Thomas Ogrisegg sent x86 memccpy and strncpy routines and introduced + an dietfeatures.h #define WANT_FULL_POSIX_COMPAT + Thomas also sent me profiling support (so far only on x86, but + profiling/PORTING describes what needs to be done for other + architectures)! + add contrib/dprof.c, also from Thomas. + Andreas Krennmair sent a patch to add the BSD regex interface to + libcompat + Andre noticed that __dtostr never sets first to false. Oops! + Andre has provided a largely untested patch that seems to fix the problem. + Igor Gilitschenski sent a patch for the "%8.7lx" issue. + abort did not flush all stdio streams + fix some nasty regular expression bugs + write a stupid malloc checker (contrib/debug-realloc.c) to help me + debug my regular expressions. Please read contrib/debug-realloc.txt + our i386 memchr,memcmp were broken for the count=0 case + fix DNS domain search + i386 memccpy exchanged esi and edi :-( I should do more checks before + accepting external code... + +0.16: + "diet -v" or "diet -Os" segfaulted without further arguments. + Andre found two very embarassing bugs in my four lines of md5 glue. + I need to get more sleep. + Thanks Ogrisegg found that ptrace does not work as documented and + provided a wrapper that emulates the glibc behaviour. + Dirk Engling saved 8 bytes and 4 cycles in the ARM clone() + fix ptrace.h for S/390 and ARM + provide a PORTING document so we don't lose track of which file need + to be touched to port the diet libc to a new platform. + remove a few warnings + provide a prototype for usleep. + make __dtostr work on ARM by using long instead of long long. + Idea by Dirk Engling. + fix an argument counting bug in *scanf (Thomas Ogrisegg) + Forgot an #endif in asm/sigcontext.h (Mike Castle) + Kurt Garloff sent in patches to + fix struct termios on non-x86 architectures + printf("%+05d\n",500) was broken (Raimar Falke told me, Olaf fixed it) + create libcompat.a (and move daemon to it) + add getdelim and getline + *printf now recognize 'z' integer flag (and ignore it) + Dirk Engling provided a strcpy.S for ARM. + Olaf: fixed *scanf familie. It hadn't wored with "long long". + Hans Lermen fixed i386/getenv.S + diet -Os no longer discards -fpic and -fno-pic + fix i386 rand/random to use correct RAND_MAX (thanks, Jaroslav + Macodiseas) + sys/ipc.h now includes sys/types.h + Olaf: started to make the sparc64 port + scandir should not sort if compar() is NULL (reported by Andrea Marrosu) + +0.15: + vfork sucks. I reverted to the old behavior where vfork==fork. + fix bsearch (and remove i386 assembly bsearch, needs to be redone). + Thanks Ogrisegg sent a patch to make the PA-RISC unified syscall + thread-safe! + remove vfork and add alarm to dynamic syscalls. + fix diet-dyn to link in dyn_dstop.o and not dyn_stop.o. + The MD5 code generated unaligned accesses when passed an unaligned + pointer on little endian ARM and MIPS. + MIPS unified syscall didn't compile anymore. + Put up new mipsel target to cross compile for little endian mips. + The mips target will again explicitly set endianness to big endian. + Compiling natively on a MIPS box should not touch the endianness. + Duh, when we removed return0, we broke tzset when the time zone parser + was disabled. Uwe Ohse noticed this. Thanks! + Fix gethostbyname to match host names case insensitively in /etc/hosts. + Oops, this was reported 6 weeks ago but I overlooked the email. + Thanks, Denis Rachal! + vsnprintf's zero termination was broken. + Uwe Ohse found a few more bugs: + Remove WANT_BUGGY_GLIBC_STRSEP. The Linux man page is broken, glibc + does it correctly. + Make inet_aton use strtoul instead of strtol + fdopen would close the file descriptor if it could not malloc the + buffer. + strftime updates. + Make _FILE_OFFSET_BITS includes -Wundef clean + Andre found a typo in endian.h for big endian mips + Ryan told me that fmod was not included in libm. Oops. + strstr(whatever,"") returned NULL, not whatever. Found by a new test + suite entry for strstr that I wrote. + Thomas Ogrisegg suggested or sent patches for the following: + add <asm/sigcontext.h> for profiling support. + make strncpy a #define in string.h to save a few bytes. + an i386 assembler getenv implementation (roughly half the size) + add grantpt, ptsname, unlockpt + add a getenv test suite entry. + Andre contributed an ARM assembler md5 implementation and he fixed mmap + on ARM. + add glibc macro names in sys/reboot.h. Mentioned by Laurent G. Bercot + getservent_r did not parse lines without aliases. Thanks, Jaroslav + Macodiseas! + fix MIPS start code (argv[0] was always corrupt) + removed annoying -Wconversion gcc switch + add -v to diet.c and fix MIPS CFLAGS in diet. Thanks, Johannes Stezenbach + Kurt Garloff sent these diffs: + add fdatasync (and make it a pthread cancellation point) + numerous alpha issues, like using .quad instead of .long for + offsets, change strip to -strip in Makefile (so a failing strip does + not abort the make), try to be more friendly to the gcc 2.96 that + SuSE 7.1 AXP ships with. + +0.14: + fix brk again (missing __brk, trivial oversight) + a new i386/atol.S that is 4 bytes smaller (and faster, too!). Thanks, + Thomas Ogrisegg! + Thomas also contributed a PA-RISC port including testandset, so + libpthread will work once we implement clone! Great work, Thomas. + made the fake locale more believable. + If you need gettext, use http://www.ca.postgresql.org/~petere/gettext.html + moved _exit into the unified syscall on x86. + Uwe Ohse found many more bugs: + getpass EINTR handling, ttyname, sysconf_cpus with SLASH_PROC_OK, + liblatin1 was more or less completely broken if you gave it chars as + arguments, not ints (signedness). execvp had a buffer overflow in + case a PATH element exceeded PATH_MAX, but it's not a security + problem since setuid programs need to set their path to some known + value anyway. + hasmntopt did not work with foo=bar style options + Uwe also improved ftw's stack usage. + Put movl instead of popl rationale in comment in i386/unified.S since + three people have suggested saving a few bytes with popl now ;) + I discovered __attribute__((malloc)) and started using it. For gcc 3, + it improves the optimizer when functions return malloced pointers. + Steven Rostedt pointed out that my setvbuf was broken with regard to + size==0 and sent a patch to fix it. + Thomas Ogrisegg made setenv smaller. + Olaf: implemented the parisc clone and an atomic testandset, modified the + libpthread to respect the parisc UPgrowing stack. still non functional, + because the unified syscall uses errno :( + tcgetospeed read from the wrong termios field. Thanks, Gunnar Ritter! + Fixed asprintf (relied on vsnprintf(NULL,...) to return length but + don't write anything which was no longer the case. It also + allocated one byte unnecessarily, which Uwe Ohse found. + Fix ttyname (readlink does not \0-terminate, forgot to do that). + +0.13: + add readdir64 and automatic mapping if _FILE_OFFSET_BITS == 64 + make diet not include the linker safeguard stuff when preprocessing + Olaf: port to S/390! + me: fix vfork (it was put into dietlibc.a twice) + res_query did not initialize last + diet (not diet-dyn, of course) now adds -static to the gcc command line + fixed fflush on input streams (tic from ncurses exposed this) + duh, there is an alarm system call, too, so we use it and not setitimer + fix comparison in gmtime_r that caused Jan 1 to be converted to Dec 32. + rewrote __dtostr (it also has one more argument now) + Thanks to Erik Troan for bringing these to my attention: + make putenv behave like glibc (putenv("HOME") == unsetenv("HOME")) + fix strncat for the case where n == 0 (security implications?) + fix bsearch (it didn't find the very last element in the array, same + bug in both the C and the i386 assembly version). + fixed FNM_PATHNAME in fnmatch + fix brk (the syscall was documented incorrectly in the Linux man page) + Thanks, Thomas Ogrisegg! + added negated character classes to fnmatch (not required by POSIX) + make the utmp routines open utmp read-only if read-write doesn't work. + remove syscalls.c directory, it is obsolete now with unified syscalls + +0.12: + more contributions from Frank Klemm. + iconv can now do UCS-2, too. + Imported several x86 assembly routines from Wouter van Kleunen. + Lots of bug fixes, and several more i386 specific versions of common + routines to make them smaller. + add memmem (a GNU extension that looks useful) + several changes from Michal Ludvig: inttypes.h gets C99 macros, + add pivot_root syscall, %n for *scanf. + add adjtimex (thanks, Laurent BERCOT) + add Frank Klemm's optimized md5 + add -Os option to diet (see diet.1). + several IPv6 constants and HZ were missing, thanks Johannes Kloos. + add 32-bit uid/gid syscalls. + add rand48 (thanks, Johannes Kloos) + fixed a lot of bugs in getopt* (thanks, Johannes) + add strxfrm and tweak limits.h. glib-1.3.8 now compiles without changes. + add a few more module syscalls. modutils-2.4.9 now compiles without changes. + fix gethostent alias list termination. Major oops. + add execle and two DNS constants (from Johannes Kloos). + opendir did not close-on-exec (thanks, Laurent Bercot). + DNS will now properly signal errors and set h_errno. + A few more cleanups (thanks, Andreas Jabs and Matthias Andree). + Added an uber-cool linker safeguard feature! Idea by Matthias Andree. + If you enable WANT_SAFEGUARD in dietfeatures.h, diet will include an + external reference to a symbol that is only in the diet libc. So, + when you accidentally link a diet libc compiled object file against + glibc, the linker will barf. This will bloat your object files, but + you can remove all the references with "strip -R .note" from + the binaries in the end (which you should do anyway). + fix ARM unified syscall (select did not work). + add getpwent_r ala glibc and replace getpwent + do the same for getgrent and getspent + remove entlib (new code is smaller) + rewrite getserv* to use parselib (and provide ..._r, too) + add getpwnam_r and getpwuid_r + rewrite getproto* to use parselib (and protive ..._r, too) + Olaf muddled with the dynamic linker. It's a clean-room + implementation in the sense that it once worked for Olaf in a clean + room ;) + add if_nameindex and if_freenameindex. + fixed arm unified syscalls to work with current binutils (; is no + longer a line separator but starts a comment, switched to .macro) + changed all st_[cma]time types to signed long so comparisons against + LONG_MIN will work correctly. (GNU tar does this) + fixed two bugs regarding ungetc. + add getusershell, setusershell, endusershell (for vs_ftpd) + add prctl, dirfd (also for vs_ftpd) + fixed strftime (was completely hosed) + added real make install target + +0.11: + fix major oops in DNS routines (only with WANT_FULL_RESOLV_CONF enabled). + fix vsscanf bug (Thanks, David Chappell). + add floor, ceil and memchr prototypes. + add __builtin_expect and expect #defines for gcc versions below 3.0 + cleaner errno vs __errno_location handling + add placeholder iconv (iconv_open will always return EINVAL) + try to remove kernel 2.4 header dependency in IPv6 sockaddr_in6 + initialization of getaddrinfo. + fix vsnprintf %X (printed lower case) + I wrote a new getopt. It appears to actually work (it is POSIX + compliant, it does not sort argv like the GNU version) and is only + a little over 300 bytes on x86. + Guillaume Cottenceau just wrote me that strncat should be even more + broken than it already is: it should append n bytes AND THEN \0! + I wonder how many programmers have produces off-by-one errors here... + Fix regexec offset return. autoconf now believes that diet libc has + POSIX regular expressions. + Fix fnmatch (a/b/* matched a/b/c/d even if FNM_PATHNAME was set) + Fix regular expression match for x* when there is no x at all. + Fix memory leak in error case in gethostbyname(2|). Thanks, Dietz Pröpper. + Add %h to vsnprintf. + Add FAQ. + Make %h work for signed numbers and add %hh to vsnprintf. + initgroups ignored the group argument :-( + remove printf references and nested functions from glob. + added an errno in libpthread that will display a prominent linker + warning. + started getting rid of kernel headers. Big task! :-( + add res_mkquery. The diet libc can now compile and link mtr. + Olaf: added a lot of code in libdl (not yet complete), changed the + startup code to make it work with his libdl and ld.so (needs still work + too) + __dns_readstartfiles only took the first domain or search path. + Thanks, Anthony de Boer + Olaf: added clone and a new unified_syscall for PowerPC + also dynlinker is now available (i386 only at this time) + crufted together a stdarg.h implementation from the various gcc headers. + implement getopt_long (ugh, the GNU people need professional help) + fixed word delimiters in regex (they looked for space, i.e. "," did + not work as delimiter) + errno.h now declares sys_errlist and sys_nerr. + added mkdtemp. + Uwe Ohse reported all of the following bugs: + ttyname should return 0 if !isatty. + realpath returns NULL if "." cannot be opened + putenv erroneously accepted (and mishandled) entries without "=". + popen returned 255 instead of 127 if /bin/sh could not be run. + fgetc did not set the internal EOF indicator on EOF. + bsearch contained an assumption about integer arithmetic overflow + behavior. + system did not set SIGCHLD and thus contained a race. + popen did not set close-on-exec and could leak an fd on malloc error. + daemon did not check whether open returns an fd below 3 + perror did not save errno. + Olaf: Peter Jones reported some problems with perror; strerror had the + same problem. + Peter also posted a patch to atexit/exit. With some modifications it is + now implemented. + Unbuffered stdio and ungetc can no longer be disabled. I will try to + implement part of it using ELF weak symbols. + Added minimal sysconf (tehe) from David Chappell. + Added overflow handling for strtoul and strtol. + Added WANT_ETC_HOSTS in dietfeatures.h and made gethostbyname/2 use + it before falling back to DNS if enabled. + Added a littie backwards compatibility cruft for gpm (man, do these + sources stink!) + Added openpty. + Squeeze a few bytes off the is* routines, courtesy of Peter Jones. + Fix fseek return value. + Add dirname and basename. + Add a few i386 math routines contributed by Frank Klemm. + Fixed getservent (did not allow _ and - in the aliases). + Thanks, Oden Eriksson + Added a float.h so configure believes we have ANSI header files. + Fix a lot more stdio bugs that Uwe Ohse pointed out. + Olaf: has added a new scanf and printf core that is suitable for all + scanf and printf function implementations + Imported a few more functions and optimizations from Frank Klemm (he + also rewrote dtostr to have more precision) + Olaf: checked in a new sig* function family (based on rt_sig*). + legacy <2.2 signal-handling doesn't work at the moment. + Made rudimentary iconv that can convert back and forth between + iso-8859-1, utf-8 and ucs-4 (for debugging). + Thanks to Markus Kuhn for the excellent utf-8(7)! + +0.10: + update getpagesize. + add personality. + add "%*s" and "%*.*s" support to vsnprintf. + add putchar (apparently arm-linux-gcc will substitute printf("\n") + with putchar('\n') behind your back...?! + import include/scsi/ from glibc. + add iopl. + add execl and sigdelset prototypes. + add getopt_long stuff to getopt.h (may compile but won't link). + add RPC headers (no code yet). + add mlockall, munlockall + make "diet gcc foo.c" work. + added Sun RPC code and removed as many warnings as possible in a + heroic act of self-mutilation. + added getproto* and getdtablesize for the RPC cruft :-( + added getpass. mount from util-linux actually compiles now! + fix the sig*set routines. mount actually works now *bg* + fix fwrite dividing by zero when trying to fwrite n records of size 0. + added an initial regex implementation (3500 bytes!!!). + add llseek and lseek64 with optional lseek fall-back. + add res_init. + add asprintf (ugh, what an ugly function). + expanded arpa/nameser.h to include backwards compatibility defines + add ut_name alias to ut_host in struct utmp. + add inet_ntop, inet_pton, gethostbyname2. + add sysinfo, recvmsg, sendmsg. + add endmntent, getmntent, setmntent. + fix fnmatch (thanks, Guillaume Cottenceau!) + add setenv. + remove __restrict from mntent.h, add __restrict__ removal alias for + older gcc versions in sys/cdefs.h. + add rlim_t, sig_atomic_t declarations. + add sigsetjmp #define for __sigsetjmp (oops). + (Thanks to Chris Siebenmann for these three bug reports) + add a gruesome hack to printf floating point to accept %f and kludge + together support for %.2f. Don't look at the code, please! + fixed tcsetpgrp (oops, this is embarassing! Thanks, Chris Siebenmann) + imported fix for entlib by Jeff Garzik. + add glob implementation from Guillaume Cottenceau (Thanks!!) + add libdl fragments from Olaf (Yeah! One step closer to dynamic linking!) + add REG_ICASE and word start/end handling to my regular expressions. + my regular expressions now actually match substrings (i.e. "foobar" to "bar"). + wrap getcwd to comply to man page (the syscall returns the number of + bytes, not the buffer) + add realpath. + fix vfprintf. + fix *scanf %s zero termination. + add abs, labs, llabs. + add <sys/io.h>, ioperm syscall. + add flock to <sys/file.h> + fixes to bsearch and the regular expressions. + add fake herror. + add scandir and alphasort. + add killpg + implemented a gross hack to make libpthread compile when + dietfeatures.h does not define WANT_THREAD_SAFE (it's empty then). + add getaddrinfo and freeaddrinfo (man, what a fucked up interface!) + fix sigsuspend (syscall had completely fscked up arguments!) + RLIM_INFINITY from the kernel is broken. Thanks to Chris Siebenmann + for sending a patch. + add getserv*. + add WANT_FULL_RESOLV_CONF so that the DNS routines use "domain" and + "search" from resolv.conf. + +0.9: + fixed initgroups (oops) + Cleanup appending file open for stdio (thanks, James Antill) + imported vfprintf fix from James Antill. + add fnmatch + change index, rindex and bcmp as weak ELF symbols (were #defined before) + Olaf added character classes to *scanf. + Put object and library files into a separate directory (bin-$ARCH). + Add "cross" make target to make all architectures. + Add "diet" program and man page. + Add getgrnam, getgrgid + Add cfmakeraw (Thanks, Antonio Musumeci) + localtime won't call gettimeofday when the tzfile parser is used. + +0.8: + vsnprintf(0,...) estimated the length of strings with a padding width + incorrectly. + new reboot() from Olaf. + added prototypes for getsockopt and setsockopt. + added experimental sem* and shm* + define EXIT_SUCCESS and EXIT_FAILURE + added setvbuf (only changes mode, not buffer) + added dietwarning.h (woohoo, linker warnings!) and used it to warn of + insecurity (system, sprintf) or bloat (printf and stdio). + added qsort() and bsearch(). Benchmark on 1000 random ints: + glibc: 679414 cycles qsort and 3352 cycles bsearch + diet libc: 300010 cycles qsort, 553 cycles bsearch + I have no idea why glibc is so slow. + added __isnan (references by libm.a from glibc). + added popen() and pclose(). Now the diet libc can link slsh (from + S-Lang!) + corrected usleep. It was more of an msleep until now. + corrected __dtostr (it looped when trying to format "0.0"). + several fixes to stdio (thanks to S-Lang's excellent test suite!) + added ungetc (does it work?) + added inet_aton (yuck!) + added gethostbyname, gethostbyaddr, gethostbyname_r and gethostbyaddr_r + added h_errno and __h_errno_location + added inet_ntoa + added setpgrp and getpgrp, strsignal and execv (thanks, Olaf) + add bcopy, index, rindex macros + add isgraph and isxdigit + add strftime (ugh!!!) + Olaf fixed strftime, gmtime_r leap year bug. + Jeff Garzik contributed a spec file. I put it in contrib and hope + everbody knows what to do with it... + Olaf checked in a ton of libpthread stuff. + added mkstemp using /dev/urandom (harder to guess than getpid()). + add large file backwards compatibility support (so gzip will run on + kernel 2.2 and 2.0) + added shutdown + added nice + added pseudo-locale support for is* (they are now weak aliases, + isupper -> __isupper_ascii etc). So, for example, liblatin1 can + overwrite the default is* functions. + added liblatin1.a + added tzfile implementation (does it work for anyone else?) + added syslog(3) (thanks to Rene Müller!) + Jeff Garzik contributed getgr*, getpw* and getsp* in one tiny package. + Thanks! + merged duplicate code in execv and execvp into exec_lib.o + +0.7.2: + added several prototypes to already implemented functions and + <sys/reboot.h>. Thanks for Abraham for pointing this out. + added prototypes for process group and dup syscalls. Thanks to + Abraham again. He also contributed an implementation for daemon(), + an ugly BSD hack. I decided to diversify the lib/ directory a + little and now created a libugly/ directory for stuff like system() + and daemon() ;-) + added libstdio and moved all that stdio crap from lib/ there. The + idea is to start separating now what we will separate for shared + libraries anyway. + optimized x86 unified-syscall by Olaf. + added limits.h, removed __ARCHBITS from endian.h (use __WORDSIZE from + limits.h instead) + added remove.c and enough cruft to limits.h to make it compile lzo, + lzop and bzip2. + added mktime, asctime_r, asctime and ctime (needed for gzip). + Someone will need to implement a reader for the glibc localtime file + format some day (man tzfile, ugh!) :-( + added unlink prototype to unistd.h. + added gmtime and gmtime_r. + fixed sparc unified syscall error handling (please upgrade!). + removed readdir glibc compatibility cruft. + removed stat glibc compatibility cruft. + oops, my fread was broken for pipes. + Olaf found a bug in pipe() for sparc, too. + +0.7.1: + optimized away the static arrays from __ltostr and __lltostr. + optimized away the static arrays (and more!) from strtoul and strtoull. + added system (by Olaf). + added tolower and toupper + added getopt from Olaf (~600 bytes on x86!) + added clone for mips (by Olaf). + fixed longjmp and setjmp on sparc not to require glibc include files. + added pause for all (by Olaf). + added __attribute__ ((__const__)) to ctype.h + added isupper and islower. + added putc and putchar as macros. + added strcasecmp and strncasecmp (thanks to Abraham vd Merwe for + insightful discussions and patches I partially used for the last three) + added getpriority and setpriority (also by Abraham) + oops, I broke strtoul in a recent optimization attempt. + oi, setjmp and longjmp were broken on other platforms, too! + Thanks to Sébastien Côté for reporting this. + +0.7: + clone support for i386,alpha,arm and sparc by Olaf. + Initial dynamic loading glue for i386, also by Olaf. + We don't have a dynamic loader yet, so this is not yet usable. + added readv, sigdelset, sigaltstack, sigfillset, sigismember, usleep, + vsprintf, writev, all by Olaf. + imported readdir fix from Guillaume. Mhh, can the kernel interface + really be this broken? + Found a kludgy way to detect whether the kernel includes define struct + stat64 (they also define STAT64_HAS_BROKEN_ST_INO). If this does + not work for you, please tell me! + Removed bogus __seek_types enum, it's a bunch of #defines now. + Fixed stdio line buffering. The code was already there but I forgot + to mark stdio and stdout as line buffered. This should really be + done dynamically using isatty, though. + Removed superfluous "if (1)" in execvp.c + +0.6.14: + *scanf did not append the 0 byte for %s. + added creat and changed creat to call open directly instead of open64. + did for fread what 0.6.10 did for fwrite. + repaired buffered stdio a little (line buffering is still not + supported). + [All of these bugs have been reported by Guillaume. Thanks!] + added __pure__ to strchr and strrchr in <string.h> + +0.6.13: + included COPYING to make clear that the diet libc is covered by the + GNU General Public License (and _not_ the LGPL). That means that + you need to obtain a license from me if you want to use the diet + libc in a proprietary program that you want to distribute. + The x86 unified syscall swapped arguments #4 and #5 and noone + noticed until now! Thanks to Guillaume Cottenceau for reporting + this! + The malloc had a subtle bug with small allocations that could cause + segfault. Guillaume reported it, Olaf fixed it. + +0.6.12: + added assert, statfs and fstatfs + added include/net/if.h so fget compiles again. + +0.6.11: + added putenv. + +0.6.10: + fixed fwrite. It returned the number of bytes written, not the number + of records. Thanks to Albert D. Cahalan for pointing this out. + fixed fgets. It returned EOF on empty lines. Thanks, Erik Frey. + added brk and sbrk. harold@nb.com.sg made me do it. + +0.6.9: + fixed execvp not to return on ENOENT + did for {open|read|close|seek|tell}dir what I did for stat before. + The glibc compatibility part is currently non-functional. + fixed white space handling in sscanf " (" would not match " (". + fixed printf to accept 'l' flag. + fixed getpwuid (ignored last line) + +0.6.8: + Olaf contributed initial thread-safe syscalls for i386, alpha, sparc, + mips and arm. I did the one for ppc. They can be enabled in dietfeatures.h. + added strlcpy and strlcat from OpenBSD. + added stat64, fstat64 and lstat64. + added endian.h and made ending of strlen.c endianness-aware + added string routines size tweak to dietfeatures.h. Most of the + string routines have been unrolled. This is up to three times as + fast but creates up to three times larger code. Now you can disable + the unrolling. + added sendfile. + I also added pread. It works on x86 and sparc but not on ppc and mips. + I have no idea what's going on. strace disagrees with the kernel. + Can anyone help? I asked the Linux kernel mailing list for help, too. + added a few aliases of the type __libc_open for open. nm on + libpthreads.so indicates that we will need them. + +0.6.7: + the sources now compile without warnings with -Wall. + printf now prints "(null)" when %s is passed NULL. This can be + removed with WANT_NULL_PRINTF in dietfeatures.h + added vfprintf, execl, ttyname. + stat, lstat and fstat are now #defined to __dietstat, __dietlstat and + __dietfstat so they can use the normal kernel struct stat. + stat, lstat and fstat are now C wrappers that convert to the glibc + struct stat. So we can avoid that overhead for programs that use + dietlibc headers. + +0.6.6: + changed the Makefiles so you can now set CFLAGS on the command line + added memccmp (analogous to memccpy) and strncmp. + Olaf fixed another bug in the sparc unified syscall. + Paul Clifford contributed a C version of his strlen.S that is much + more efficient than the previous strlen on all platforms! It also + looks like technology from Roswell. ;-} + added a "real" stdio. Well, almost. Please contribute! + added dietfeatures.h so you can remove features you don't need. + removed debug code from vsnprintf that changed \0 to ' ' (argh!). + stdio now works with simple programs and minigzip from libz. + stdio uses some major trickery to avoid linking the stdio, stderr and + stdout (and reserving space for them) when they are not used. + +0.6.5: + Red Plait <redplait@ixcelerator.com> found several bugs in diet libc, + most of them bugs in the new header files, but also missing sigset + functions. + Paul Clifford contributed an assembly strlen.S for ARM and fixed + several bugs. + Fixed ppc/setjmp and mips/pipe. + Olaf contributed a new sparc unified syscall. + +0.6.4: + declared is* static inline in getservent. + added assert_fail, strtoul, isalpha, isdigit, isalnum, isascii. + changed strlen to return 0 when passed NULL. + new, much smaller unified syscall for MIPS. Thanks to Olaf the Mad + Scientist who actually implemented this without access to a MIPS + box, just from reading the architecture manual. And it worked out + of the box. + started a set of system includes, mainly so that I can use lcc and + my alpha-linux cross compiler (which is unable to cross-compile + glibc). diet libc can now be compiled without any include files + from a normal libc. The includes do declare more than diet libc + currently delivers and they are still far from complete for real + applications. + I will only add assembly versions that are smaller _and_ faster than + the C version. Larger routines are only accepted if they are called + very often and are substantially faster. + added i386 assembly strchr, which is smaller and faster than the old + version. It is, however, larger than the version contributed by + proton (thanks, anyway). + added i386 strlen (31% faster, 14% smaller) + "make t" will now create a map file called "mapfile". + +0.6.3: + added sys_errlist, strerror and perror + added isblank + added atol + +0.6.2: + mmap for ARM didn't compile. Thanks, Paul! + +0.6.1: + split mmap into the architecture specific subdirectories. + getenv now copes with environ==NULL, thanks Paul Clifford. + Paul also contributed a smaller ARM startup code. + +0.6: + strcat returned the wrong result. Thanks, Dietz Pröpper. + strtod now understands a negative exponent (oops, thanks Bertram Barth) + Port to arm-linux-gnu, but on the Netwinder I use for testing the + __dtostr does not work (I have no idea why!) + The MIPS port now uses (much smaller) non-PIC code. That means that + the applications you link against diet libc also have to be compiled + non-PIC. I suggest copying the CFLAGS from the diet libc Makefile. + Thanks to Ralf Bächle for helping me with this! + I made subdirectories for the architectures and use VPATH to override + VPATH so that make finds the source file automatically. That should + simplify the sources greatly. + Olaf Dreesen contributed Alpha support including setjmp and longjmp! + ARM and MIPS now also have setjmp and longjmp + "compile" and "load" are now make targets. Use them for djb programs. + added contrib/elftrunc.c which will remove unnecessary ELF headers. + Again, contributed from Olaf. Great work! + +0.5.12: + printf also does signed numbers. + If you don't use atexit, dietlibc now does not link exit, only _exit. + *printf now correctly returns the number of bytes written. + Olaf contributed experimental sscanf and vsscanf implementations. + If passed NULL as buffer, snprintf will not write anything but still + return the number of bytes it would have written. + Initial MIPS port! (Oh, the agony!) + No setjmp and longjmp support yet! Please contribute! + I even implemented unified syscalls for MIPS. Still, MIPS code is + almost twice the size of SPARC code. If anyone knows why: please + tell me! + +0.5.11: + I implemented new unified syscalls for x86, sparc and ppc, this time based + on .s files and not .c files, and I moved the syscalls into + subdirectores to clean the dietlibc sources up a little. + A binary consisting of printf("%s is %d\n","olaf",23) is now + 2864 bytes on sparc + 2488 bytes on intel + I kludgily implemented fprintf(stdout,... and fprintf(stderr,... + to make a few more applications work. + Olaf Dreesen also implemented some unified syscall stuff for x86. + He discovered that with our unified syscall interface it actually + costs <10 bytes total to make all system calls thread safe! + I implemented atexit() (can register up to 4 callbacks). + I implemented strtod and __dtostr (the opposite). Now we can add + floating point support to vsnprintf and sscanf! + +0.5.10: + I actually saw that I can not only merge the errno handling code of + the system calls on x86, I can also merge the rest (including the + arguments) except for setting the system call number. All those + system calls are now just a jump to a unified system call handler. + I got rid of x86openclose again. The savings are substantial: + chown from embutils went from 7664 to 7184 bytes! + If I'd move the system call wrappers to assembly language, I could + even reduce the alignment (does not matter since it's just a jump + anyway) and get rid of the "ret" behind each jump (one byte per + system call!) + +0.5.9: + added memchr, strpbrk, strstr, strtol, isspace (hehe) + fixed strdup + fixed return values for strcpy and strcat (thanks to Norbert Berzen) + Olaf Dreesen contributed a strtol and initial {sn|vsn|}printf implementation + (no signed integers, only strings and unsigned integers (but + supporting octal, hex and decimal). Thanks, Olaf! (by the way: + that code must be wonderful, I don't understand it at all *bg*) + Olaf's printf does understand padding like in "%08d" and "%8d" and + automatically pads pointers with '0'. + Rewrote the x86 start code, old: 22 instructions, new: 12 instructions. + Thanks to proton for inspiration on this. + The new x86 start code also does not reference exit any more, thus saving + 64 bytes for executables that don't call exit explicitly. + [insert maniacal laughter] EVERY BYTE COUNTS!1!! ;-) + Moved errno and environ to start.S, saving no byte binary size but + speeding up compilation and slightly shortening dietlibc.a ;-) + For x86: joined open and close into one assembler file, sharing the + errno handling. This is a feasibility test and it actually saves a + few bytes. I think I will reimplement the _syscall[1-6] macros on + all platforms now to share the errno handling code for them. + +0.5.8: + fixed strchr to be able to look for 0. + + added _llseek, ftruncate, getpgid, getresgid, getresuid, getsid, + memccpy, memmove, mprotect, setregid, setresgid, setresuid, setreuid, + strncpy, swapon, truncate, strtok, strtok_r, strspn, strcspn (all + contributed by Olaf Dreesen) + + added execvp, getcwd + + fixed __xmknod + + Note: can it be that the ftw interface really is so broken that I + cannot implement it without having to implement some searching data + structure? I included an experimental ftw implementation that will + not follow symlinks. + +0.5.7: + oops, if_nametoindex was broken! + +0.5.6: + ported to ppc-linux. + fixed i386 sigsetjmp (I mistyped the function name) + included sigjmp.c + +0.5.5: + added wait, sys_siglist, longjmp/setjmp/sigsetjmp for i386 and sparc + actually, it wasn't fork that wasn't working for sparc, it was pipe. + I fixed it now. + dietlibc/SPARC assumes -msupersparc (does not provide div, mul, etc) + fixed readdir to use getdents and not the intel inline asm + +0.5.4: + ported to sparclinux (sparc32 only). Beware: does not work yet. + added raise, abort, readlink, strcat, geteuid, geteuid, wait3, access + +0.5.3: + added tcsetattr and getenv to compile e3 + +0.5.2: + added vhangup, tcgetattr, isatty and memcmp for fgetty + (http://www.fefe.de/fgetty/) + added localtime from uC-libc. + +0.5.1: + stat and friends actually work now. Yuck! Another case of + translation between kernel and userland. Why can't the kernel + people and the libc people simply agree on a standard? + removed many unnecessary includes to speed up compilation. + added -fomit-frame-pointer and i386 compilation target to reduce code size. + inlined socketcall to reduce code size. + "load" and "compile" are examples for djb code. + +0.5: + Olaf Dreesen contributed a much smaller implementation of malloc and friends. + each object file is now treated with "strip -x -R .note -R .comment" + split each system call into a separate object file + added ntohs, htons, alarm, if_indextoname and if_nametoindex + +0.4.1: + oops, the strchr implementation was wrong. Thanks Jens Laas! + +0.4: + copied opendir and friends from uC-libc. + added getservent and getservby* in gerservent.c + +0.3: + remove readdir system call + added getdents system call + added getpwnam/getpwuid implementation in getpwnam.c + added a few string functions (in str*.c) + diff --git a/mdk-stage1/dietlibc/COPYING b/mdk-stage1/dietlibc/COPYING new file mode 100644 index 000000000..5b6e7c66c --- /dev/null +++ b/mdk-stage1/dietlibc/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + 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 + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + <signature of Ty Coon>, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/mdk-stage1/dietlibc/FAQ b/mdk-stage1/dietlibc/FAQ new file mode 100644 index 000000000..d6595dcc9 --- /dev/null +++ b/mdk-stage1/dietlibc/FAQ @@ -0,0 +1,224 @@ +diet libc FAQ. + + +Q: How do I compile this? I don't see a configure? +A: Just type make. + + +Q: How do I install it? make install? +A: Yep. It will then install itself to /opt/diet, with the wrapper in + /opt/diet/bin/diet. Or you don't install it at all. + The diet libc comes with a wrapper called "diet", which can be found + in bin-$(ARCH)/diet, i.e. bin-i386/diet for most of us. Copy this + wrapper somewhere in your path (for example ~/bin) and then just + compile stuff by prepending diet to the command line, e.g. "diet gcc + -pipe -g -o t t.c". + + +Q: How do I compile programs using autoconf with the diet libc? +A: Set CC in the environment properly. For Bourne Shells: + + $ CC="diet gcc -nostdinc" ./configure --disable-nls + + That should be enough, but you might also want to set + --disable-shared and --enable-static for packages using libtool. + + +Q: My program complains about missing asm/* or linux/* header files! +A: It is quite linux specific. You can try omitting the -nostdinc, but + except for some cases conflicts are likely. You should not be using + the kernel headers in your software. + + +Q: Do you have cross compiling support? +A: Yes. Just type something like "make ARCH=arm CROSS=arm-linux- all". + For arm, alpha, mips, ppc, sparc and i386, shortcuts exist. You can + also use "make arm", for example. You still use the same "diet" + program as for normal compilation, but you can then say + + $ diet sparc-linux-gcc -pipe -g -o t t.c + + Programs using autoconf can be configured like this: + + $ CC="diet sparc-linux-gcc" ./configure --disable-nls + + +Q: There are a few warnings about possibly uninitialized variables when + compiling the diet libc. Can't you remove them? +A: This type of warning can only be removed by a) compiling without + warnings or b) initializing the variables in question. In all cases, + the variables won't actually be used uninitialized, but adding an + explicit initializer will add a few bytes of code. As you know, the + goal of the diet libc is to not waste a single byte of code, so we + don't add initializers ;-) + + +Q: When linking binaries, I get warnings about stdio and printf all the + time. What gives? +A: Since the diet libc was written to make writing small programs + possible, it also tries to assist in the process of seeing causes of + bloat. Premier causes for bloat are stdio and the printf family of + functions. The diet libc will also warn you if you still use + assert() (which is normally not enabled in production code) or if you + use functions that use static buffers (like gethostbyname and + friends). + + +Q: My program stopped parsing command line arguments properly! Now what? +A: The getopt in the diet libc adheres to the Single Unix Specification. + In particular, it initialized optind to 1 (not 0) and breaks if + someone sets optint to 0 (as some misguided legacy programs to). + Also, it does not reorder arguments, i.e. something like "rm -f foo -v" + will not see -v as option but rather as non-option argument. If you + need GNU getopt behaviour, please use GNU getopt instead of the diet + libc code. + + +Q: I get linker errors about missing __ctype_b! +A: This happens when you link in code that was compiled with the glibc + headers. The most common culprit is a library like -lncurses, + -lcrypto or -lresolv. All external libraries you use have to be + compiled with the diet libc headers (CC="diet gcc"), and there is no + libresolv with the diet libc, it's in the main libc! + + +Q: My program links, but when I run it, I get no output at all and it + appears to terminate immediately. +A: This normally happens if you link in glibc. The major reason for + this was that shared libraries were linked in. diet sets -static + since version 0.13, so if it still happens to you, you need to strace + and debug your software. + + +Q: Why aren't you compatible to glibc? I thought the interface was a + standard? +A: Yes, the interface is, but a lot of details are missing. For + example, the diet libc uses a different "struct stat" layout than + glibc. We use the one from the kernel, glibc uses an own one and + links in translation code. This is part of the reason why glibc is + so big and ugly. If we support all of this, we end up as bloated as + glibc. + + +Q: Where is the test suite? +A: The humble beginnings are in the "test" directory, but it can't be + run automatically yet. + + +Q: GPL sucks! Now I can't compile my BSD programs with the diet libc! +A: Wrong. You can compile them, and you can use them. You just can't + redistribute the binaries. If you are a distribution vendor and want + to use the diet libc to make BSD licensed binaries for the install + or rescue floppy which you sell commercially, please talk to me. + + +Q: Where are the shared libaries? make install didn't install them! +A: You have to explicitly build them with "make dyn". Since they are + experimental and only supported on a small subset of the platforms, + that is not default. Also, I recommend you only use shared libraries + if you really know what you are doing. For example, you can't just + use your system shared libraries, because they have a dependency on + glibc in them, so the program will crash. And you have to explicitly + compile the code with -fPIC or -fpic. You can then use them by + substituting "diet-dyn" for "diet" on the command line. + + +Q: My target platform does not have a MMU. Should I be using uClibc? +A: I am not aware of any issues with MMU-less systems. You should be + able to use the diet libc just fine. Having a MMU or not is mostly + an issue for the kernel, not libc. + + +Q: How do I make myself a cross compiler? +A: untar binutils and gcc (I used version 2.11.2 and 3.0.4 respectively) + Then use the --target=arm-linux (or whatever platform you want) + configure options. For gcc, add --enable-languages=c (otherwise gcc + will try to make C++, Objective C and Java, too, and those + compilations will fail because they require installed libc headers + which you don't have yet). I recommend using --enable-static + --disable-shared, too, because otherwise the binutils shared + libraries will overwrite each other if you install more than one + cross binutils for different targets. + binutils$ ./configure --enable-static --disable-shared --prefix=/opt/cross --target=arm-linux + gcc$ ./configure --enable-static --disable-shared --prefix=/opt/cross --target=arm-linux --enable-languages=c + For some platforms, gcc compilation will fail while trying to compile + some part of libgcc.a because it depends on some libc header file. + This is a gcc bug and you should complain using gccbug, because you + can't cross-compile libc unless you successfully installed the cross + compiler. + + +Q: Where are the xdr_* symbols? +Q: Where are the RPC symbols? +Q: util-linux says that rpcgen output does not work?! +A: Add -lrpc. The code is from Sun and frankly it is so ugly and so + rarely used that I don't want to include it in libc. + + +Q: I am missing some BSD/GNU extension! +A: I started adding a few of them to libcompat. You have to link it in + manually, though, as using them is bad for portability and I want + people to make a conscious effort to write non-portable applications + by not including them in the libc itself. + + +Q: I'm just starting with the diet libc. Should I use the tarball or + the CVS version? +A: Always use the CVS version. We generally don't add unstable test + stuff on the CVS tree, and our APIs are stable (they are + standardized, remember?). In fact, we don't add much stuff at all. + Most changes are bug fixes and optimizations, and in general you'll + want those. + + +Q: Does the diet libc support profiling (with gprof)? +A: There is experimental support for profiling, but so far it only works + on x86. To use it, do "make profiling" before make install. Then, + diet will link in the support code if it finds a -pg on the gcc + command line. + + +Q: I get compiler errors in a line with caddr_t, u_long, n_short or + nlong or similar. +A: Add -D_BSD_SOURCE to the compiler command line. The diet libc tries + to encourage portable and standards compliant programming, so it + hides these legacy BSD types from the standard name space. The + reason is that the Single Unix Specification contains a specification + of the socket API but does not mention those types. + + +Q: I get compiler errors in a line with u_int8_t or similar. +A: Add -D_GNU_SOURCE to the compiler command line. See previous + question. This is a very questionable GNU extension. The C Standard + defines uint8_t, uint16_t and uint32_t. Use those instead. + + +Q: Can I compile or use the diet libc with a compiler that is not gcc? +A: Compile: no. Use: yes. + + +Q: Can you please port the diet libc to FreeBSD/Solaris/Windows? +A: No. + + +Q: Why do you support non-embedded platforms like IA64 and x86_64? +A: The diet libc is also useful for servers because it can improve + performance by an order of magnitude for certain programming models. + Please see http://www.fefe.de/fnord/ (in particular .../fnord/SPEED) + for an example and/or read http://www.fefe.de/talk.pdf for some + benchmarks. + + +Q: I just compiled hello world and the binary is larger than with glibc! +A: You forgot to add the dynamic glibc to your size comparison. Please + use -static when linking with glibc to see the difference. + + +Q: Should I compile my kernel with the diet libc? +A: The kernel is not linked against any libc. In fact, the libc is the + user space interface to the kernel. So unless you are talking about + "user mode linux" (which is a special version of the kernel that + happens to be a user space program) you cannot link the kernel + against the diet libc. Linking user space Linux with the diet libc + should be possible in theory but I don't think anyone has actually + tried it. diff --git a/mdk-stage1/dietlibc/Makefile b/mdk-stage1/dietlibc/Makefile index b6e7b2783..0fe32e61b 100644 --- a/mdk-stage1/dietlibc/Makefile +++ b/mdk-stage1/dietlibc/Makefile @@ -1,13 +1,101 @@ -ARCH=$(shell uname -m | sed 's/i[4-9]86/i386/') +INSTALL=install +prefix?=/usr +# Set the following to install to a different root +#DESTDIR=/tmp/fefix +# Use "make DEBUG=1" to compile a debug version. + +MYARCH:=$(shell uname -m | sed -e 's/i[4-9]86/i386/' -e 's/armv[3-6][lb]/arm/' -e 's/ppc64/ppc/') + +# This extra-ugly cruft is here so make will not run uname and sed each +# time it looks at $(OBJDIR). This alone sped up running make when +# nothing has to be done from 1 sec to 0.12 sec on a 900 MHz Athlon. +# We don't use ARCH:=$(MYARCH) so we can detect unknown architectures. +ifeq ($(MYARCH),i386) +ARCH=i386 +else +ifeq ($(MYARCH),mips) +ARCH=mips +else +ifeq ($(MYARCH),alpha) +ARCH=alpha +else +ifeq ($(MYARCH),ppc) +ARCH=ppc +else +ifeq ($(MYARCH),arm) +ARCH=arm +else +ifeq ($(MYARCH),sparc) +ARCH=sparc +else +ifeq ($(MYARCH),sparc64) +ARCH=sparc64 +else +ifeq ($(MYARCH),s390) +ARCH=s390 +else +ifeq ($(MYARCH),mipsel) +ARCH=mipsel +else +ifeq ($(MYARCH),parisc) +ARCH=parisc +else +ifeq ($(MYARCH),parisc64) +ARCH=parisc +MYARCH=parisc +else +ifeq ($(MYARCH),x86_64) +ARCH=x86_64 +else +ifeq ($(MYARCH),ia64) +ARCH=ia64 +else +$(error unknown architecture, please fix Makefile) +endif +endif +endif +endif +endif +endif +endif +endif +endif +endif +endif +endif +endif + +# ARCH=$(MYARCH) + +LIBDIR=${prefix}/lib +ifeq ($(ARCH),x86_64) +LIBDIR=${prefix}/lib64 +endif +BINDIR=${prefix}/bin +MAN1DIR=${prefix}/share/man/man1 +INSTALLHOME=$(LIBDIR)/dietlibc OBJDIR=bin-$(ARCH) +ILIBDIR=$(INSTALLHOME)/lib-$(ARCH) -all: $(OBJDIR) $(OBJDIR)/start.o $(OBJDIR)/dietlibc.a $(OBJDIR)/liblatin1.a $(OBJDIR)/librpc.a $(OBJDIR)/diet +HOME=$(shell pwd) -CFLAGS=-pipe +WHAT= $(OBJDIR) $(OBJDIR)/start.o $(OBJDIR)/dyn_start.o $(OBJDIR)/dyn_stop.o \ + $(OBJDIR)/dietlibc.a $(OBJDIR)/liblatin1.a \ + $(OBJDIR)/libcompat.a $(OBJDIR)/libm.a \ + $(OBJDIR)/librpc.a $(OBJDIR)/libpthread.a \ + $(OBJDIR)/diet $(OBJDIR)/diet-i + +all: $(WHAT) + +profiling: $(OBJDIR)/libgmon.a $(OBJDIR)/pstart.o + +CFLAGS=-pipe -nostdinc CROSS= -VPATH=lib:libstdio:libugly:libcruft:libcrypt:libshell:liblatin1:librpc:libregex:syscalls.c +CC=gcc + +VPATH=lib:libstdio:libugly:libcruft:libcrypt:libshell:liblatin1:libcompat:libdl:librpc:libregex:libm:profiling SYSCALLOBJ=$(patsubst syscalls.s/%.S,$(OBJDIR)/%.o,$(wildcard syscalls.s/*.S)) @@ -17,13 +105,23 @@ LIBSTDIOOBJ=$(patsubst libstdio/%.c,$(OBJDIR)/%.o,$(wildcard libstdio/*.c)) LIBCRUFTOBJ=$(patsubst libcruft/%.c,$(OBJDIR)/%.o,$(wildcard libcruft/*.c)) LIBCRYPTOBJ=$(patsubst libcrypt/%.c,$(OBJDIR)/%.o,$(wildcard libcrypt/*.c)) LIBSHELLOBJ=$(patsubst libshell/%.c,$(OBJDIR)/%.o,$(wildcard libshell/*.c)) +LIBCOMPATOBJ=$(patsubst libcompat/%.c,$(OBJDIR)/%.o,$(wildcard libcompat/*.c)) $(OBJDIR)/syscall.o +LIBMATH=$(patsubst libm/%.c,%.o,$(wildcard libm/*.c)) LIBRPCOBJ=$(patsubst librpc/%.c,$(OBJDIR)/%.o,$(wildcard librpc/*.c)) LIBREGEXOBJ=$(patsubst libregex/%.c,$(OBJDIR)/%.o,$(wildcard libregex/*.c)) +LIBDLOBJ=$(patsubst libdl/%.c,$(OBJDIR)/%.o,$(wildcard libdl/*.c)) $(OBJDIR)/_dl_jump.o + +LIBPTHREAD_OBJS=$(patsubst libpthread/%.c,$(OBJDIR)/%.o,$(shell ./threadsafe.sh)) $(OBJDIR)/__testandset.o + +LIBGMON_OBJS=$(OBJDIR)/__mcount.o $(OBJDIR)/monitor.o $(OBJDIR)/profil.o + include $(ARCH)/Makefile.add -ifeq ($(CFLAGS),-pipe) +LIBMATHOBJ=$(patsubst %,$(OBJDIR)/%,$(LIBMATH)) + +ifeq ($(CFLAGS),-pipe -nostdinc) CFLAGS+=-O -fomit-frame-pointer endif @@ -31,28 +129,39 @@ ifneq ($(DEBUG),) CFLAGS = -g COMMENT = : endif -CFLAGS += -Wall -Wno-switch +CFLAGS += -Wall -W -Wchar-subscripts -Wmissing-prototypes -Wmissing-declarations -Wno-switch -Wredundant-decls -Wno-unused PWD=$(shell pwd) .SUFFIXES: .SUFFIXES: .S .c -$(OBJDIR): +# added real dynamic dietlibc.so +PICODIR = pic-$(ARCH) + +$(OBJDIR) $(PICODIR): mkdir $@ % :: %,v -$(OBJDIR)/%.o: %.S +$(OBJDIR)/pstart.o: start.S + $(CROSS)$(CC) -I. -Iinclude $(CFLAGS) -DPROFILING -c $< -o $@ + +$(OBJDIR)/%.o: %.S $(ARCH)/syscalls.h $(CROSS)$(CC) -I. -Iinclude $(CFLAGS) -c $< -o $@ +$(OBJDIR)/pthread_%.o: libpthread/pthread_%.c + $(CROSS)$(CC) -I. -Iinclude $(CFLAGS) -c $< -o $@ + $(COMMENT) -$(CROSS)strip -x -R .comment -R .note $@ + $(OBJDIR)/%.o: %.c $(CROSS)$(CC) -I. -Iinclude $(CFLAGS) -c $< -o $@ - $(COMMENT) $(CROSS)strip -x -R .comment -R .note $@ + $(COMMENT) -$(CROSS)strip -x -R .comment -R .note $@ -DIETLIBC_OBJ = $(SYSCALLOBJ) $(LIBOBJ) $(LIBSTDIOOBJ) $(LIBUGLYOBJ) \ +DIETLIBC_OBJ = $(OBJDIR)/unified.o \ +$(SYSCALLOBJ) $(LIBOBJ) $(LIBSTDIOOBJ) $(LIBUGLYOBJ) \ $(LIBCRUFTOBJ) $(LIBCRYPTOBJ) $(LIBSHELLOBJ) $(LIBREGEXOBJ) \ -$(OBJDIR)/__longjmp.o $(OBJDIR)/setjmp.o $(OBJDIR)/unified.o \ +$(OBJDIR)/__longjmp.o $(OBJDIR)/setjmp.o \ $(OBJDIR)/mmap.o $(OBJDIR)/clone.o $(OBJDIR)/dietlibc.a: $(DIETLIBC_OBJ) $(OBJDIR)/start.o @@ -65,67 +174,179 @@ LIBLATIN1_OBJS=$(patsubst liblatin1/%.c,$(OBJDIR)/%.o,$(wildcard liblatin1/*.c)) $(OBJDIR)/liblatin1.a: $(LIBLATIN1_OBJS) $(CROSS)ar cru $@ $^ +$(OBJDIR)/libgmon.a: $(LIBGMON_OBJS) + $(CROSS)ar cru $@ $^ + +$(OBJDIR)/libpthread.a: $(LIBPTHREAD_OBJS) dietfeatures.h + $(CROSS)ar cru $@ $(LIBPTHREAD_OBJS) + +$(OBJDIR)/libcompat.a: $(LIBCOMPATOBJ) + $(CROSS)ar cru $@ $(LIBCOMPATOBJ) + +$(OBJDIR)/libm.a: $(LIBMATHOBJ) + $(CROSS)ar cru $@ $(LIBMATHOBJ) + $(OBJDIR)/libdietc.so: $(OBJDIR)/dietlibc.a $(CROSS)ld -whole-archive -shared -o $@ $^ +dyn: dyn_lib + +# added dynamic linker +$(OBJDIR)/libdl.a: $(LIBDLOBJ) + $(CROSS)ar cru $@ $(LIBDLOBJ) + +dyn_lib: $(PICODIR) $(PICODIR)/libc.so $(PICODIR)/dstart.o \ + $(PICODIR)/dyn_so_start.o $(PICODIR)/dyn_start.o $(PICODIR)/dyn_stop.o \ + $(PICODIR)/libpthread.so $(PICODIR)/libdl.so $(PICODIR)/libcompat.so \ + $(PICODIR)/diet-dyn $(PICODIR)/diet-dyn-i + +$(PICODIR)/%.o: %.S $(ARCH)/syscalls.h + $(CROSS)$(CC) -I. -Iinclude $(CFLAGS) -fPIC -D__DYN_LIB -c $< -o $@ + +$(PICODIR)/pthread_%.o: libpthread/pthread_%.c + $(CROSS)$(CC) -I. -Iinclude $(CFLAGS) -fPIC -D__DYN_LIB -c $< -o $@ + $(COMMENT) $(CROSS)strip -x -R .comment -R .note $@ + +$(PICODIR)/%.o: %.c + $(CROSS)$(CC) -I. -Iinclude $(CFLAGS) -fPIC -D__DYN_LIB -c $< -o $@ + $(COMMENT) $(CROSS)strip -x -R .comment -R .note $@ + +$(PICODIR)/dstart.o: start.S + $(CROSS)$(CC) -I. -Iinclude $(CFLAGS) -fPIC -D__DYN_LIB -c $< -o $@ + +$(PICODIR)/dyn_so_start.o: dyn_start.c + $(CROSS)$(CC) -I. -Iinclude $(CFLAGS) -fPIC -D__DYN_LIB -D__DYN_LIB_SHARED -c $< -o $@ + $(COMMENT) $(CROSS)strip -x -R .comment -R .note $@ + +DYN_LIBC_PIC = $(LIBOBJ) $(LIBSTDIOOBJ) $(LIBUGLYOBJ) \ +$(LIBCRUFTOBJ) $(LIBCRYPTOBJ) $(LIBSHELLOBJ) $(LIBREGEXOBJ) + +DYN_LIBC_OBJ = $(PICODIR)/dyn_syscalls.o $(PICODIR)/errlist.o \ + $(patsubst $(OBJDIR)/%.o,$(PICODIR)/%.o,$(DYN_LIBC_PIC)) + +DYN_PTHREAD_OBJS = $(patsubst $(OBJDIR)/%.o,$(PICODIR)/%.o,$(LIBPTHREAD_OBJS)) + +DYN_LIBDL_OBJS = $(patsubst $(OBJDIR)/%.o,$(PICODIR)/%.o,$(LIBDLOBJ)) + +DYN_LIBCOMPAT_OBJS = $(patsubst $(OBJDIR)/%.o,$(PICODIR)/%.o,$(LIBCOMPATOBJ)) + +$(PICODIR)/libc.so: $(PICODIR) $(DYN_LIBC_OBJ) + $(CROSS)$(CC) -nostdlib -shared -o $@ $(CFLAGS) -fPIC $(DYN_LIBC_OBJ) -lgcc -Wl,-soname=libc.so + +$(PICODIR)/libpthread.so: $(DYN_PTHREAD_OBJS) dietfeatures.h + $(CROSS)$(CC) -nostdlib -shared -o $@ $(CFLAGS) -fPIC $(DYN_PTHREAD_OBJS) -L$(PICODIR) -lc -Wl,-soname=libpthread.so + +$(PICODIR)/libdl.so: libdl/_dl_main.c dietfeatures.h + $(CROSS)$(CC) -D__OD_CLEAN_ROOM -DNODIETREF -fPIC -nostdlib -shared -o $@ $(CFLAGS) -I. -Iinclude libdl/_dl_main.c -Wl,-soname=libdl.so + +#$(PICODIR)/libdl.so: $(DYN_LIBDL_OBJS) dietfeatures.h +# $(CROSS)$(CC) -nostdlib -shared -o $@ $(CFLAGS) -fPIC $(DYN_LIBDL_OBJS) -L$(PICODIR) -ldietc -Wl,-soname=libdl.so + +$(PICODIR)/libcompat.so: $(DYN_LIBCOMPAT_OBJS) dietfeatures.h + $(CROSS)$(CC) -nostdlib -shared -o $@ $(CFLAGS) -fPIC $(DYN_LIBCOMPAT_OBJS) -L$(PICODIR) -lc -Wl,-soname=libcompat.so + + + $(SYSCALLOBJ): syscalls.h -$(OBJDIR)/diet: diet.c $(OBJDIR)/start.o $(OBJDIR)/dietlibc.a - $(CROSS)$(CC) -Iinclude $(CFLAGS) -nostdlib -o $@ $^ -DDIETHOME=\"$(PWD)\" +VERSION=dietlibc-$(shell head -1 CHANGES|sed 's/://') +CURNAME=$(notdir $(shell pwd)) + +$(OBJDIR)/diet: $(OBJDIR)/start.o $(OBJDIR)/dyn_start.o diet.c $(OBJDIR)/dietlibc.a $(OBJDIR)/dyn_stop.o + $(CROSS)$(CC) -Iinclude $(CFLAGS) -nostdlib -o $@ $^ -DDIETHOME=\"$(HOME)\" -DVERSION=\"$(VERSION)\" -lgcc + $(CROSS)strip -R .comment -R .note $@ + +$(OBJDIR)/diet-i: $(OBJDIR)/start.o $(OBJDIR)/dyn_start.o diet.c $(OBJDIR)/dietlibc.a $(OBJDIR)/dyn_stop.o + $(CROSS)$(CC) -Iinclude $(CFLAGS) -nostdlib -o $@ $^ -DDIETHOME=\"$(INSTALLHOME)\" -DVERSION=\"$(VERSION)\" -DINSTALLVERSION -lgcc $(CROSS)strip -R .comment -R .note $@ +$(PICODIR)/diet-dyn: $(PICODIR)/start.o $(PICODIR)/dyn_start.o diet.c + $(CROSS)$(CC) -Iinclude $(CFLAGS) -fPIC -nostdlib -o $@ $^ -DDIETHOME=\"$(HOME)\" -D__DYN_LIB -DVERSION=\"$(VERSION)\" -L$(PICODIR) -lc -lgcc $(PICODIR)/dyn_stop.o -Wl,-dynamic-linker=$(HOME)/$(PICODIR)/libdl.so + $(CROSS)strip -R .command -R .note $@ + +$(PICODIR)/diet-dyn-i: $(PICODIR)/start.o $(PICODIR)/dyn_start.o diet.c + $(CROSS)$(CC) -Iinclude $(CFLAGS) -fPIC -nostdlib -o $@ $^ -DDIETHOME=\"$(prefix)\" -D__DYN_LIB -DVERSION=\"$(VERSION)\" -L$(PICODIR) -lc -lgcc $(PICODIR)/dyn_stop.o -Wl,-dynamic-linker=$(ILIBDIR)/libdl.so -DINSTALLVERSION + $(CROSS)strip -R .command -R .note $@ + $(OBJDIR)/djb: $(OBJDIR)/compile $(OBJDIR)/load $(OBJDIR)/compile: - echo 'exec gcc $(CFLAGS) -I$(PWD)/$(OBJDIR)/include -c $${1+"$$@"}' > $@ + echo 'exec' $(CC) '$(CFLAGS) -I$(PWD)/$(OBJDIR)/include -c $${1+"$$@"}' > $@ chmod 755 $@ $(OBJDIR)/load: - echo 'main="$$1"; shift; exec gcc -nostdlib -o "$$main" $(PWD)/$(OBJDIR)/start.o "$$main".o $${1+"$$@"} $(PWD)/$(OBJDIR)/dietlibc.a -lgcc' > $@ + echo 'main="$$1"; shift; exec' $(CC) '-nostdlib -o "$$main" $(PWD)/$(OBJDIR)/start.o "$$main".o $${1+"$$@"} $(PWD)/$(OBJDIR)/dietlibc.a -lgcc' > $@ chmod 755 $@ clean: rm -f *.o *.a t t1 compile load exports mapfile libdietc.so - rm -rf bin-* + rm -rf bin-* pic-* + $(MAKE) -C libdl clean -tar: clean - rm -f armv4l - ln -sf arm armv4l - cd ..; tar cvvf dietlibc.tar.bz2 dietlibc --use=bzip2 --exclude CVS +tar: clean rename + cd ..; tar cvvf $(VERSION).tar.bz2 $(VERSION) --use=bzip2 --exclude CVS + +rename: + if test $(CURNAME) != $(VERSION); then cd .. && mv $(CURNAME) $(VERSION); fi $(OBJDIR)/exports: $(OBJDIR)/dietlibc.a nm -g $(OBJDIR)/dietlibc.a | grep -w T | awk '{ print $$3 }' | sort -u > $(OBJDIR)/exports .PHONY: t t1 t: - $(CROSS)$(CC) -g $(CFLAGS) -fno-builtin -nostdlib -Iinclude -o t t.c $(OBJDIR)/start.o $(OBJDIR)/dietlibc.a -lgcc -Wl,-Map,mapfile + $(CROSS)$(CC) -g $(CFLAGS) -fno-builtin -nostdlib -Iinclude -o t t.c $(OBJDIR)/start.o $(OBJDIR)/dyn_start.o $(OBJDIR)/dietlibc.a -lgcc $(OBJDIR)/dyn_stop.o -Wl,-Map,mapfile t1: $(CROSS)$(CC) -g -o t1 t.c -install: $(OBJDIR)/start.o $(OBJDIR)/dietlibc.a $(OBJDIR)/liblatin1.a $(OBJDIR)/diet - cp $(OBJDIR)/start.o $(INSTALLPREFIX)$(prefix)/lib/dietstart.o - cp $(OBJDIR)/dietlibc.a $(INSTALLPREFIX)$(prefix)/lib/libdietc.a - cp $(OBJDIR)/liblatin1.a $(INSTALLPREFIX)$(prefix)/lib/libdietlatin1.a - cp $(OBJDIR)/diet $(INSTALLPREFIX)$(prefix)/bin/diet - -.PHONY: sparc ppc mips arm alpha i386 - -arm sparc ppc alpha i386: - $(MAKE) ARCH=$@ CROSS=$@-linux- all t bin-$@/libdietc.so - -mips: - $(MAKE) ARCH=$@ CROSS=$@-linux-gnu- all t bin-$@/libdietc.so +install: $(OBJDIR)/start.o $(OBJDIR)/dietlibc.a $(OBJDIR)/librpc.a $(OBJDIR)/liblatin1.a $(OBJDIR)/libcompat.a $(OBJDIR)/diet-i + $(INSTALL) -d $(DESTDIR)$(ILIBDIR) $(DESTDIR)$(MAN1DIR) $(DESTDIR)$(BINDIR) + $(INSTALL) $(OBJDIR)/start.o $(DESTDIR)$(ILIBDIR)/start.o + $(INSTALL) -m 644 $(OBJDIR)/libm.a $(OBJDIR)/libpthread.a $(OBJDIR)/librpc.a \ +$(OBJDIR)/liblatin1.a $(OBJDIR)/libcompat.a $(DESTDIR)$(ILIBDIR) + $(INSTALL) -m 644 $(OBJDIR)/dietlibc.a $(DESTDIR)$(ILIBDIR)/libc.a +ifeq ($(MYARCH),$(ARCH)) + $(INSTALL) $(OBJDIR)/diet-i $(DESTDIR)$(BINDIR)/diet + -$(INSTALL) $(PICODIR)/diet-dyn-i $(DESTDIR)$(BINDIR)/diet-dyn +endif + -$(INSTALL) $(OBJDIR)/pstart.o $(OBJDIR)/libgmon.a $(OBJDIR)/dyn_start.o $(OBJDIR)/dyn_stop.o $(DESTDIR)$(ILIBDIR) + -$(INSTALL) $(PICODIR)/libc.so $(DESTDIR)$(ILIBDIR)/libc.so + -$(INSTALL) $(PICODIR)/libpthread.so $(DESTDIR)$(ILIBDIR)/libpthread.so + -$(INSTALL) $(PICODIR)/libdl.so $(DESTDIR)$(ILIBDIR)/libdl.so + -$(INSTALL) $(PICODIR)/libcompat.so $(DESTDIR)$(ILIBDIR)/libcompat.so + -$(INSTALL) $(PICODIR)/dyn_start.o $(DESTDIR)$(ILIBDIR)/dyn_dstart.o + -$(INSTALL) $(PICODIR)/dyn_stop.o $(DESTDIR)$(ILIBDIR)/dyn_dstop.o + -$(INSTALL) $(PICODIR)/dstart.o $(PICODIR)/dyn_so_start.o $(DESTDIR)$(ILIBDIR) + $(INSTALL) -m 644 diet.1 $(DESTDIR)$(MAN1DIR)/diet.1 + if test -f $(PICODIR)/libc.so -a ! -f $(DESTDIR)/etc/diet.ld.conf; then echo "$(ILIBDIR)" > $(DESTDIR)/etc/diet.ld.conf; fi + for i in `find include -name \*.h`; do install -m 644 -D $$i $(DESTDIR)$(INSTALLHOME)/$$i; done + +.PHONY: sparc ppc mips arm alpha i386 parisc mipsel powerpc s390 sparc64 +.PHONY: x86_64 ia64 + +arm sparc ppc alpha i386 mips parisc s390 sparc64 x86_64 ia64: + $(MAKE) ARCH=$@ CROSS=$@-linux- all + +# Cross compile for little endian MIPS +mipsel: + $(MAKE) ARCH=$@ CROSS=mips-linux- all + +mips-gnu: + $(MAKE) ARCH=$@ CROSS=$@-linux-gnu- all + +# Some people named their cross compiler toolchain powerpc-linux-gcc +powerpc: + $(MAKE) ARCH=ppc CROSS=powerpc-linux- all cross: - $(MAKE) arm sparc ppc alpha i386 mips + $(MAKE) arm sparc ppc alpha i386 mips sparc64 # these depend on dietfeatures.h for large file backward compatibility -$(OBJDIR)/__fstat64.o $(OBJDIR)/__lstat64.o $(OBJDIR)/__stat64.o: dietfeatures.h +$(OBJDIR)/__fstat64.o $(OBJDIR)/__lstat64.o $(OBJDIR)/__stat64.o $(OBJDIR)/lseek64.o $(OBJDIR)/readdir64.o $(OBJDIR)/stat64.o $(OBJDIR)/lstat64.o $(OBJDIR)/fstat64.o $(OBJDIR)/truncate64.o $(OBJDIR)/__truncate64.o $(OBJDIR)/ftruncate64.o $(OBJDIR)/__ftruncate64.o $(PICODIR)/dyn_syscalls.o $(PICODIR)/__truncate64.o $(PICODIR)/__ftruncate64.o $(PICODIR)/__stat64.o $(PICODIR)/__lstat64.o $(PICODIR)/__fstat64.o: dietfeatures.h # these depend on dietfeatures.h for thread support -$(OBJDIR)/alloc.o $(OBJDIR)/perror.o $(OBJDIR)/logging.o $(OBJDIR)/unified.o: dietfeatures.h +$(OBJDIR)/alloc.o $(OBJDIR)/perror.o $(OBJDIR)/logging.o $(OBJDIR)/unified.o $(OBJDIR)/clone.o $(OBJDIR)/set_errno.o: dietfeatures.h # these depend on dietfeatures.h for linker warnings $(OBJDIR)/assert_fail.o $(OBJDIR)/sprintf.o $(OBJDIR)/vsnprintf.o $(OBJDIR)/___div.o $(OBJDIR)/fflush.o $(OBJDIR)/setvbuf.o $(OBJDIR)/system.o $(OBJDIR)/sendfile.o $(OBJDIR)/setenv.o: dietfeatures.h @@ -137,10 +358,56 @@ fclose.o $(OBJDIR)/fdglue.o $(OBJDIR)/fflush.o $(OBJDIR)/fgetc.o $(OBJDIR)/fputc strcasecmp.o $(OBJDIR)/strcat.o $(OBJDIR)/strchr.o $(OBJDIR)/strcmp.o $(OBJDIR)/strcpy.o $(OBJDIR)/strlen.o $(OBJDIR)/strncasecmp.o $(OBJDIR)/strncat.o $(OBJDIR)/strrchr.o: dietfeatures.h # these depend on dietfeatures.h for /proc -$(OBJDIR)/tty.o: dietfeatures.h - -# these depend on dietfeatures.h for ungetc support ;-) -$(OBJDIR)/ungetc.o: dietfeatures.h +$(OBJDIR)/ttyname.o $(OBJDIR)/sysconf_cpus.o: dietfeatures.h # these depend on dietfeatures.h for WANT_TZFILE_PARSER -$(OBJDIR)/localtime_r.o: dietfeatures.h +$(OBJDIR)/localtime_r.o $(OBJDIR)/strftime.o: dietfeatures.h + +# these depend on dietfeatures.h for WANT_SMALL_STDIO_BUFS +$(LIBSTDIOOBJ): dietfeatures.h + +# these depend on dietfeatures.h for WANT_FULL_RESOLV_CONF +$(OBJDIR)/dnscruft.o $(OBJDIR)/dnscruft2.o: dietfeatures.h + +# these depend on dietfeatures.h for WANT_THREAD_SAFE and errno +$(LIBRPCOBJ) $(OBJDIR)/logging.o $(OBJDIR)/alloc.o $(OBJDIR)/cfsetospeed.o $(OBJDIR)/cfsetispeed.o \ +$(OBJDIR)/execl.o $(OBJDIR)/execlp.o $(OBJDIR)/execv.o $(OBJDIR)/execvp.o $(OBJDIR)/isatty.o \ +$(OBJDIR)/lockf.o $(OBJDIR)/perror.o $(OBJDIR)/remove.o $(OBJDIR)/set_errno.o $(OBJDIR)/sigemptyset.o \ +$(OBJDIR)/tcsetattr.o $(OBJDIR)/dnscruft2.o $(OBJDIR)/dnscruft.o $(OBJDIR)/entlib.o \ +$(OBJDIR)/gethostbyaddr.o $(OBJDIR)/gethostbyaddr_r.o $(OBJDIR)/gethostbyname.o \ +$(OBJDIR)/gethostbyname_r.o $(OBJDIR)/gethostbyname2.o $(OBJDIR)/gethostbyname2_r.o \ +$(OBJDIR)/inet_pton.o $(OBJDIR)/mkstemp.o $(OBJDIR)/mktemp.o $(OBJDIR)/tempnam.o \ +$(OBJDIR)/glob.o $(OBJDIR)/realpath.o $(OBJDIR)/fdglue.o $(OBJDIR)/fdglue2.o \ +$(OBJDIR)/getaddrinfo.o $(OBJDIR)/getnameinfo.o $(OBJDIR)/getprotoent.o \ +$(OBJDIR)/getservent.o $(OBJDIR)/iconv.o $(OBJDIR)/iconv_open.o \ +$(OBJDIR)/netent.o $(OBJDIR)/system.o $(OBJDIR)/stdin.o $(OBJDIR)/stdout.o \ +$(OBJDIR)/stderr.o: dietfeatures.h + +# these depend on dietfeatures.h for WANT_CRYPT_MD5 +$(OBJDIR)/crypt.o: dietfeatures.h + +# these depend on dietfeatures.h for WANT_FREAD_OPTIMIZATION +$(OBJDIR)/fread.o $(OBJDIR)/fwrite.o: dietfeatures.h + +# these depend on dietfeatures.h for WANT_DYNAMIC +$(OBJDIR)/start.o $(OBJDIR)/dyn_start.o $(OBJDIR)/dyn_stop.o: dietfeatures.h + +$(OBJDIR)/unified.o: dietuglyweaks.h + +$(OBJDIR)/adjtimex.o: include/sys/timex.h + +$(OBJDIR)/fgetc_unlocked.o $(OBJDIR)/fread.o $(OBJDIR)/ungetc.o: dietstdio.h + +# these depend on dietfeatures.h for WANT_LINKER_WARNINGS +$(OBJDIR)/setlinebuf.o $(OBJDIR)/bzero.o $(OBJDIR)/setegid.o \ +$(OBJDIR)/seteuid.o: dietfeatures.h + +# these depend on dietfeatures.h for WANT_FULL_POSIX_COMPAT +$(OBJDIR)/strncpy.o: dietfeatures.h +$(OBJDIR)/strxfrm.o: dietfeatures.h + +# these depend on dietfeatures.h for WANT_INET_ADDR_DNS +$(OBJDIR)/gethostbyname_r.o: dietfeatures.h + + +# CFLAGS+=-W -Wshadow -Wid-clash-31 -Wpointer-arith -Wcast-align -Wstrict-prototypes -Wwrite-strings diff --git a/mdk-stage1/dietlibc/PORTING b/mdk-stage1/dietlibc/PORTING new file mode 100644 index 000000000..4e2a6358c --- /dev/null +++ b/mdk-stage1/dietlibc/PORTING @@ -0,0 +1,28 @@ +To port the diet libc to a new architecture, you need to: + + - edit Makefile to detect the architecture + - create a directory for the architecture, and put a Makefile.add in + it. Look at the other Makefile.adds for guidance. + - provide start.S (the start code, look at glibc) + - provide unified.S (the unified syscall) + - provide syscalls.h (the syscall numbers, from asm/unistd.h) + - provide setjmp and longjmp + - edit include/setjmp.h + - pipe, clone and mmap often need special care + - edit include/sys/ioctl.h + - edit include/sys/ptrace.h + - edit include/asm/sigcontext.h + - edit include/sys/ucontext.h + - edit include/endian.h + - edit include/fcntl.h + - edit include/sys/mman.h + - edit include/sys/shm.h + - edit include/sys/stat.h + - edit include/errno.h + - edit syscalls.h + - edit include/termios.h + - edit diet.c to make it recognize the architecture and add proper + CFLAGS + - edit libcompat/syscall.S + +(I may have missed a few) diff --git a/mdk-stage1/dietlibc/README b/mdk-stage1/dietlibc/README index ce9838832..2a1fa332c 100644 --- a/mdk-stage1/dietlibc/README +++ b/mdk-stage1/dietlibc/README @@ -1,3 +1,8 @@ + The system library is a challenge to all those using the computer to + write their own faster and better routines or to bow to the superior + strength and skill of a true master. + --http://www.inner.net/users/cmetz/program-like-a-klingon + diet libc to statically link programs that don't need all the bloat from glibc. @@ -7,10 +12,7 @@ To compile: $ make -make should compile the diet libc itself without warnings. In addition -to the diet libc, the default make target includes t, which is a test -program and probably contains code which produces warnings. You can -safely ignore them. +make should compile the diet libc itself. When make is done, it will have created dietlibc.a in bin-i386 (or bin-ppc, bin-alpha, bin-sparc, bin-ppc or bin-arm, depending on your @@ -41,3 +43,7 @@ The embedded utils are small replacements for common utilities like mv, chown, ls, and even a small tar that can extract tar files. The binary repository contains a few utilities I linked against the diet libc, for example gzip, bzip2 and fdisk. + + +The license for the diet libc is the GNU General Public License, version +2 (as included in the file COPYING). diff --git a/mdk-stage1/dietlibc/SECURITY b/mdk-stage1/dietlibc/SECURITY new file mode 100644 index 000000000..67debc6e7 --- /dev/null +++ b/mdk-stage1/dietlibc/SECURITY @@ -0,0 +1,13 @@ +The diet libc was written with small code and embedded devices in mind, +not with security for network servers. + +Of course we still try to avoid buffer overflows, but there are some +parts of the code where tradeoffs have been made. This file is meant to +document them. + + 1. The DNS routines do not check whether the answer came from the IP + of the DNS server. The rationale is that people who can sniff the + network to find out the query, source port and DNS sequence number + can also spoof DNS packets to appear to come from the server we + asked, so it does not actually increase security to have that + check. diff --git a/mdk-stage1/dietlibc/THANKS b/mdk-stage1/dietlibc/THANKS new file mode 100644 index 000000000..cda9400b6 --- /dev/null +++ b/mdk-stage1/dietlibc/THANKS @@ -0,0 +1,31 @@ +The malloc code was done by Olaf Dreesen, who also helped with the SPARC +start code and fork(). Olaf also did the printf and scanf routines and +he implemented pthreads (wow!) and his now writing a dynamic linker, and +he ported the diet libc to S/390. + +Thomas Ogrisegg ported the diet libc to PA-RISC and IA64 and fixed a few things. + +I initially took some syscalls from Redhat minilibc, but the code has +been completely replaced now. + +I initially took localtime and the directory reading routines from +uClibc, but the code has been completely replaced now. + +syslog and crypt were contributed by René Müller. + +Jeff Garzik contributed {get,set}{pw,gr,sp}ent. + +Uwe Ohse went through the code and fixed many bugs. + +Frank Klemm contributed the math library and a lot of correctness and +smallness patches and rewrote many functions in ix86 assembly language. + +Erik Troan found several important bugs and sent in patches to fix them. + +I also grabbed code from glibc (mostly assembly routines), and looked at +the OpenBSD libc for inspiration. + +Michal Ludvig did the porting to x86_64 and Gwenole Beauchesne helped +finish the port. + +Johannes Stezenbach improved the MIPS port. diff --git a/mdk-stage1/dietlibc/TODO b/mdk-stage1/dietlibc/TODO new file mode 100644 index 000000000..3e323ad44 --- /dev/null +++ b/mdk-stage1/dietlibc/TODO @@ -0,0 +1,26 @@ + - "locale" + - real regerror + - improve code size and quality with __restrict__. + - FPU exception handling (for mawk) + - res_mkquery should not assume op is QUERY + - syslog + - gethost/netent -> parselib? + - Look at qsort (the make test suite exhibits the worst case) + - Make __dtostr do scientific notation. + - fix %g in printf. They are more or less completely b0rken (in + particular rounding the last digit does not work). + - qmail-queue dumps core since we added vfork. Editing fork.h to #define + vfork to fork works. What happens here? + - use TCP if buf[2]&2 is non-zero in DNS answers. + - look at mktime: "Falls tm_isdst == -1 gesetzt, so sollte mktime + versuchen herauszufinden, ob Sommerzeit eingestellt ist (und laut linux + manpage auch tzname setzen), ansonsten die angegebene DST + berücksichtigen." + - better rand()? + - try to make zebra compile. + - printf %e + - move DNS stuff to libresolv.a? + - x86_64: readdir fails their test (Gwenole Beauchesne) + - regular expressions standards compliance; test suite from AT&T + - fgetpwent (needed for cvm) + - investigate putting some libgcc symbols in dietlibc.so for gcc<3 diff --git a/mdk-stage1/dietlibc/alpha/Makefile.add b/mdk-stage1/dietlibc/alpha/Makefile.add index 10ff0faef..68b10b43c 100644 --- a/mdk-stage1/dietlibc/alpha/Makefile.add +++ b/mdk-stage1/dietlibc/alpha/Makefile.add @@ -2,4 +2,4 @@ CFLAGS+=-Os -Iinclude -fomit-frame-pointer -fstrict-aliasing VPATH:=alpha:syscalls.s:$(VPATH) -LIBOBJ+=$(patsubst %,$(OBJDIR)/%,divq.o divl.o remq.o reml.o seteuid.o __time.o) +LIBOBJ+=$(patsubst %,$(OBJDIR)/%,divq.o divl.o remq.o reml.o __time.o __alarm.o) diff --git a/mdk-stage1/dietlibc/alpha/__longjmp.S b/mdk-stage1/dietlibc/alpha/__longjmp.S index d86d76717..31e374d0f 100644 --- a/mdk-stage1/dietlibc/alpha/__longjmp.S +++ b/mdk-stage1/dietlibc/alpha/__longjmp.S @@ -1,11 +1,10 @@ -#ifdef __alpha__ - #include <setjmp.h> .text .align 2 .global __longjmp +.type __longjmp,@function __longjmp: mov $17, $0 /* a1 -> v0 */ @@ -18,7 +17,7 @@ __longjmp: ldq $26, (JB_PC*8) ($16) /* ra */ ldq $fp, (JB_FP*8) ($16) /* fp */ - ldq $1, (JB_SP*8) ($16) /* sp */ + ldq $sp, (JB_SP*8) ($16) /* sp */ ldt $f2, (JB_F2*8) ($16) /* f2 */ ldt $f3, (JB_F3*8) ($16) /* f3 */ @@ -30,9 +29,5 @@ __longjmp: 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/clone.S b/mdk-stage1/dietlibc/alpha/clone.S index b7e32d707..28e61a8bc 100644 --- a/mdk-stage1/dietlibc/alpha/clone.S +++ b/mdk-stage1/dietlibc/alpha/clone.S @@ -1,5 +1,5 @@ #include "syscalls.h" -#include <asm/errno.h> +#include <errno.h> .text .align 2 diff --git a/mdk-stage1/dietlibc/alpha/setjmp.S b/mdk-stage1/dietlibc/alpha/setjmp.S index 3768056be..04bfd3d94 100644 --- a/mdk-stage1/dietlibc/alpha/setjmp.S +++ b/mdk-stage1/dietlibc/alpha/setjmp.S @@ -1,15 +1,16 @@ #include <setjmp.h> .text +.weak setjmp +.type setjmp,@function +setjmp: +.weak __setjmp +.type __setjmp,@function +__setjmp: + mov 0, $17 .global __sigsetjmp +.type __sigsetjmp,@function __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 */ @@ -19,7 +20,7 @@ __sigsetjmp: stq $26, (JB_PC*8) ($16) /* ra */ stq $fp, (JB_FP*8) ($16) /* fp */ - stq $1, (JB_SP*8) ($16) /* sp */ + stq $sp, (JB_SP*8) ($16) /* sp */ stt $f2, (JB_F2*8) ($16) /* f2 */ stt $f3, (JB_F3*8) ($16) /* f3 */ @@ -30,17 +31,5 @@ __sigsetjmp: stt $f8, (JB_F8*8) ($16) /* f8 */ stt $f9, (JB_F9*8) ($16) /* f9 */ - br $26, __sigjmp_save /* call __sigjmp_save */ + br $31, __sigjmp_save /* jmp __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/start.S b/mdk-stage1/dietlibc/alpha/start.S index 00b8e950d..850ce2420 100644 --- a/mdk-stage1/dietlibc/alpha/start.S +++ b/mdk-stage1/dietlibc/alpha/start.S @@ -1,7 +1,3 @@ -#include "start.h" - -#ifdef __alpha__ - .text .align 2 .set noreorder @@ -17,19 +13,21 @@ _start: ldgp $gp, 0($gp) /* prepare to call main */ - ldl $16, 0($sp) /* argc */ + ldl $16, 0($sp) /* argc / a0 */ - lda $17, 8($sp) /* argv */ + lda $17, 8($sp) /* argv / a1 */ - addq $16, 1, $18 /* argp */ + addq $16, 1, $18 /* argp / a2 */ s8addq $18, $17, $18 /* (8*(argc+1))+argv -> argp */ stq $18, environ - mov $0, $21 /* mov v0(dynload) to a5 */ - +#ifdef WANT_DYNAMIC +/* in v0 ($0) is the ld.so _fini pointer */ + mov $0, $19 /* mov v0(dynload) to a3 */ + jsr $26, dyn_start +#else jsr $26, main +#endif mov $0, $16 jsr $26, exit /* YES, CALL! for threads and atexit ! (+4 byte) */ - -#endif diff --git a/mdk-stage1/dietlibc/alpha/unified.S b/mdk-stage1/dietlibc/alpha/unified.S index 02a1c9bcd..506bf7387 100644 --- a/mdk-stage1/dietlibc/alpha/unified.S +++ b/mdk-stage1/dietlibc/alpha/unified.S @@ -1,15 +1,25 @@ #include <dietfeatures.h> +#include "syscalls.h" +.weak exit +exit: +.global _exit +_exit: + lda $0, __NR_exit .global __unified_syscall __unified_syscall: callsys bne $19, .Lerror + +/* here we go and "reuse" the return for weak-void functions */ +#include "dietuglyweaks.h" + ret $31, ($26), 0x01 .Lerror: .global error_unified_syscall error_unified_syscall: -#ifdef WANT_THREAD_SAVE +#ifdef WANT_THREAD_SAFE 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 */ diff --git a/mdk-stage1/dietlibc/diet.1 b/mdk-stage1/dietlibc/diet.1 new file mode 100644 index 000000000..c28aeba40 --- /dev/null +++ b/mdk-stage1/dietlibc/diet.1 @@ -0,0 +1,31 @@ +.TH diet 1 "April 2001" +.SH NAME +.PP +diet \- mangle gcc command line arguments +.SH SYNOPSIS +.PP +.B diet [-v] [-Os] +[\fInormal gcc command line\fP] +.SH DESCRIPTION +.PP +diet is a small wrapper around gcc. It will try to look at the command +line you specify and try to mangle it so that gcc will compile against +the diet libc header files and link against the diet libc itself. + +diet tries to be smart for cross compiling. If the first argument is +not gcc but sparc-linux-gcc, diet will guess that you want to cross +compile for sparc and use bin-sparc/dietlibc.a instead of the dietlibc.a +for your default architecture. + +The -v option will make diet print the modified gcc command line before +executing it. + +When passed the -Os option before the gcc argument, diet will mangle the +gcc options to include the best known for-size optimization settings for +the platform. +.SH FILES +~/.diet/\fIcompiler\fR may contain compiler options as you would +specify them on the command line, i.e. separated by spaces. Those will +then be used instead of the built-in defaults for diet -Os. +.SH AUTHOR +Felix von Leitner <felix-dietlibc@fefe.de> diff --git a/mdk-stage1/dietlibc/diet.c b/mdk-stage1/dietlibc/diet.c index 1de6befc8..c3a053ac8 100644 --- a/mdk-stage1/dietlibc/diet.c +++ b/mdk-stage1/dietlibc/diet.c @@ -1,7 +1,11 @@ #include <string.h> #include <unistd.h> +#include <fcntl.h> #include <stdio.h> #include <stdlib.h> +#include <write12.h> + +#include "dietfeatures.h" /* goal: * when invoked as @@ -15,90 +19,341 @@ * "sparc-linux-gcc -nostdlib -static -o t t.o /path/to/dietlibc/bin-sparc/start.o /path/to/dietlibc/bin-sparc/dietlibc.a" */ -void error(const char *message) { - write(2,message,strlen(message)); +static void error(const char *message) { + __write2(message); exit(1); } +static const char* Os[] = { + "i386","-Os","-mpreferred-stack-boundary=2", + "-malign-functions=0","-malign-jumps=0", + "-malign-loops=0","-fomit-frame-pointer",0, + "x86_64","-Os","-fno-omit-frame-pointer",0, + "sparc","-Os","-mcpu=supersparc",0, + "sparc64","-Os","-m64",0, + "alpha","-Os","-fomit-frame-pointer",0, + "arm","-Os","-fomit-frame-pointer",0, + "mips","-Os","-fomit-frame-pointer","-mno-abicalls","-G","8","-fno-pic",0, + "ppc","-Os","-fomit-frame-pointer","-mpowerpc-gpopt","-mpowerpc-gfxopt",0, + "s390","-Os","-fomit-frame-pointer",0, + "sh","-Os","-fomit-frame-pointer",0, + "ia64","-Os","-fno-omit-frame-pointer",0, + "x86_64","-Os","-fstrict-aliasing","-momit-leaf-frame-pointer","-mfance-math-387",0, + 0}; + int main(int argc,char *argv[]) { - int link=0; + int _link=0; int compile=0; + int preprocess=0; + int verbose=0; + int profile=0; char diethome[]=DIETHOME; - char platform[1000]=DIETHOME "/bin-"; - char *nostdlib="-nostdlib"; - char *libgcc="-lgcc"; - char dashL[1000]="-L"; + char platform[1000]; +#ifdef __DYN_LIB + int shared=0; +#endif + char* shortplatform=0; +#ifdef WANT_SAFEGUARD + char safeguard1[]="-include"; + char safeguard2[]=DIETHOME "/include/dietref.h"; +#endif + const char *nostdlib="-nostdlib"; + const char *libgcc="-lgcc"; + char dashL[1000]; + char dashstatic[]="-static"; int i; + int mangleopts=0; + char manglebuf[1024]; + +#ifdef INSTALLVERSION + strcpy(platform,DIETHOME "/lib-"); +#else +#ifndef __DYN_LIB + strcpy(platform,DIETHOME "/bin-"); +#else + strcpy(platform,DIETHOME "/pic-"); +#endif +#endif + strcpy(dashL,"-L"); if (argc<2) { - error("usage: diet [gcc command line]\n" - "e.g. diet gcc -c t.c\n" +usage: + if (verbose) { + __write2( +#ifdef __DYN_LIB + "dyn-" +#endif + "diet version " VERSION +#ifndef INSTALLVERSION + " (non-install version in source tree)" +#endif + "\n\n"); + } + error("usage: diet [-v] [-Os] gcc command line\n" + "e.g. diet -Os gcc -c t.c\n" "or diet sparc-linux-gcc -o foo foo.c bar.o\n"); } + if (!strcmp(argv[1],"-v")) { + ++argv; --argc; + verbose=1; + } + if (argv[1] && !strcmp(argv[1],"-Os")) { + ++argv; --argc; + mangleopts=1; + } + if (!argv[1]) goto usage; { char *tmp=strchr(argv[1],0)-2; - char *tmp2; + char *tmp2,*tmp3; char *cc=argv[1]; if (tmp<cc) goto donttouch; - if ((tmp2=strchr(cc,'-'))) { /* cross compiling? */ + if ((tmp2=strstr(cc,"linux-"))) { /* cross compiling? */ int len=strlen(platform); + --tmp2; + tmp3=strchr(cc,'-'); + if (tmp3<tmp2) tmp2=tmp3; if (tmp2-cc>90) error("platform name too long!\n"); - memmove(platform+len,argv[1],tmp2-cc); + shortplatform=platform+len; + memmove(shortplatform,argv[1],(size_t)(tmp2-cc)); platform[tmp2-cc+len]=0; -/* printf("found platform %s\n",platform); */ + if (shortplatform[0]=='i' && shortplatform[2]=='8' && shortplatform[3]=='6') shortplatform[1]='3'; } else { #ifdef __sparc__ - strcat(platform,"sparc"); +#ifdef __arch64__ + shortplatform="sparc64"; +#else + shortplatform="sparc"; #endif -#ifdef __ppc__ - strcat(platform,"ppc"); +#endif +#ifdef __powerpc__ + shortplatform="ppc"; #endif #ifdef __i386__ - strcat(platform,"i386"); + shortplatform="i386"; #endif #ifdef __alpha__ - strcat(platform,"alpha"); + shortplatform="alpha"; #endif #ifdef __arm__ - strcat(platform,"arm"); + shortplatform="arm"; #endif #ifdef __mips__ - strcat(platform,"mips"); + shortplatform="mips"; +#endif +#ifdef __s390__ + shortplatform="s390"; +#endif +#ifdef __sh__ + shortplatform="sh"; +#endif +#ifdef __hppa__ + shortplatform="parisc"; +#endif +#ifdef __x86_64__ + shortplatform="x86_64"; +#endif +#ifdef __ia64__ + shortplatform="ia64"; #endif + { + char *tmp=platform+strlen(platform); + strcpy(tmp,shortplatform); + shortplatform=tmp; + } + } + /* MIPS needs special handling. If argv contains -EL, change + * platform name to mipsel */ + if (!strcmp(shortplatform,"mips")) { + int i; + for (i=1; i<argc; ++i) + if (!strcmp(argv[i],"-EL")) + strcpy(shortplatform,"mipsel"); } strcat(dashL,platform); if (!strcmp(tmp,"cc")) { char **newargv; char **dest; char *a,*b,*c; +#ifdef WANT_DYNAMIC + char *d,*e,*f; +#endif /* we need to add -I... if the command line contains -c, -S or -E */ - for (i=2; i<argc; ++i) - if (!strcmp(argv[i],"-c") || !strcmp(argv[i],"-S") || !strcmp(argv[i],"-E")) + for (i=2; i<argc; ++i) { + if (argv[i][0]=='-' && argv[i][1]=='M') + goto pp; + if (!strcmp(argv[i],"-pg")) + profile=1; + if (!strcmp(argv[i],"-c") || !strcmp(argv[i],"-S")) compile=1; + if (!strcmp(argv[i],"-E")) +pp: + preprocess=compile=1; + } /* we need to add -nostdlib if we are not compiling*/ - link=!compile; + _link=!compile; +#ifdef __DYN_LIB + if (_link) { + for (i=2; i<argc; ++i) + if (!strcmp(argv[i],"-shared")) { + shared=1; + _link=0; + } + } +#endif #if 0 for (i=2; i<argc; ++i) if (!strcmp(argv[i],"-o")) - if (!compile) link=1; + if (!compile) _link=1; #endif - newargv=alloca(sizeof(char*)*(argc+6)); + newargv=alloca(sizeof(char*)*(argc+100)); a=alloca(strlen(diethome)+20); b=alloca(strlen(platform)+20); c=alloca(strlen(platform)+20); strcpy(a,"-I"); strcat(a,diethome); strcat(a,"/include"); - strcpy(b,platform); strcat(b,"/start.o"); +#ifndef __DYN_LIB + strcpy(b,platform); + if (profile) strcat(b,"/pstart.o"); else strcat(b,"/start.o"); +#ifdef INSTALLVERSION + strcpy(c,platform); strcat(c,"/libc.a"); +#else strcpy(c,platform); strcat(c,"/dietlibc.a"); +#endif +#else + strcpy(b,platform); strcat(b,"/dstart.o"); + strcpy(c,"-lc"); +#endif + +#ifdef WANT_DYNAMIC + d=alloca(strlen(platform)+20); + e=alloca(strlen(platform)+20); +#ifdef __DYN_LIB + strcpy(d,platform); + strcpy(e,platform); + if (shared) + strcat(d,"/dyn_so_start.o"); +#ifdef INSTALLVERSION + else + strcat(d,"/dyn_dstart.o"); + strcat(e,"/dyn_dstop.o"); +#else + else + strcat(d,"/dyn_start.o"); + strcat(e,"/dyn_stop.o"); +#endif +#else + strcpy(d,platform); strcat(d,"/dyn_start.o"); + strcpy(e,platform); strcat(e,"/dyn_stop.o"); +#endif +#endif dest=newargv; *dest++=argv[1]; - if (link) { *dest++=nostdlib; *dest++=dashL; } - if (compile || link) *dest++=a; - for (i=2; i<argc; ++i) +#ifndef __DYN_LIB + if (_link) { *dest++=(char*)nostdlib; *dest++=dashstatic; *dest++=dashL; } +#else + /* avoid R_*_COPY relocations */ + *dest++="-fPIC"; + if (_link || shared) { *dest++=(char*)nostdlib; *dest++=dashL; } +#endif +#ifdef WANT_SAFEGUARD + if (compile && !preprocess) { + *dest++=safeguard1; + *dest++=safeguard2; + } +#endif + if (_link) { *dest++=b; } +#ifdef WANT_DYNAMIC + if (_link) { *dest++=d; } +#endif + for (i=2; i<argc; ++i) { + if (mangleopts) + if (argv[i][0]=='-' && (argv[i][1]=='O' || argv[i][1]=='f' || argv[i][1]=='m')) { + if (strcmp(argv[i],"-fpic") && strcmp(argv[i],"-fno-pic")) + continue; + } *dest++=argv[i]; - if (link) { *dest++=b; *dest++=c; *dest++=libgcc; } + } +#ifndef __DYN_LIB + if (compile || _link) *dest++=a; +#else + if (compile || _link || shared) *dest++=a; +#endif + *dest++="-D__dietlibc__"; + if (mangleopts) { + const char **o=Os; + + { + int fd; + char* tmp=getenv("HOME"); + if (tmp) { + if (strlen(tmp)+strlen(cc)<900) { + strcpy(manglebuf,tmp); + strcat(manglebuf,"/.diet/"); + strcat(manglebuf,cc); + if ((fd=open(manglebuf,O_RDONLY))>=0) { + int len=read(fd,manglebuf,1023); + if (len>0) { + int i; + manglebuf[len]=0; + *dest++=manglebuf; + for (i=1; i<len; ++i) { + if (manglebuf[i]==' ' || manglebuf[i]=='\n') { + manglebuf[i]=0; + if (i+1<len) + *dest++=manglebuf+i+1; + } + } + goto incorporated; + } + } + } + } + } + for (o=Os;*o;++o) { + if (!strcmp(*o,shortplatform)) { + ++o; + while (*o) { + *dest++=(char*)*o; + ++o; + } + break; + } else + while (*o) ++o; + } + } +incorporated: + if (_link) { + if (profile) *dest++="-lgmon"; + if (!strcmp(shortplatform,"sparc") || !strcmp(shortplatform,"sparc64")) { + *dest++=(char*)libgcc; *dest++=c; + } else { + *dest++=c; *dest++=(char*)libgcc; + } + } +#ifdef WANT_DYNAMIC + if (_link) { *dest++=e; } +#endif +#ifdef __DYN_LIB + if (shared){ *dest++=c; } + f=alloca(strlen(platform)+100); + if (_link) { + strcpy(f,"-Wl,-dynamic-linker="); + strcat(f,platform); +// strcat(f,"/diet-linux.so"); + strcat(f,"/libdl.so"); + *dest++=f; + } +#endif *dest=0; + if (verbose) { + int i; + for (i=0; newargv[i]; i++) { + __write2(newargv[i]); + __write2(" "); + } + __write2("\n"); + } execvp(newargv[0],newargv); goto error; } else if (!strcmp(tmp,"ld")) { @@ -107,6 +362,6 @@ int main(int argc,char *argv[]) { donttouch: execvp(argv[1],argv+1); error: - error("execvp failed!\n"); + error("execvp() failed!\n"); return 1; } diff --git a/mdk-stage1/dietlibc/dietdirent.h b/mdk-stage1/dietlibc/dietdirent.h index d732cf7dc..dbd7206a6 100644 --- a/mdk-stage1/dietlibc/dietdirent.h +++ b/mdk-stage1/dietlibc/dietdirent.h @@ -1,6 +1,8 @@ +#include <sys/shm.h> + struct __dirstream { int fd; - char buf[1024]; + char buf[PAGE_SIZE-(sizeof (int)*3)]; unsigned int num; unsigned int cur; }; /* stream data from opendir() */ diff --git a/mdk-stage1/dietlibc/dietfeatures.h b/mdk-stage1/dietlibc/dietfeatures.h index e1de38577..a7b84d5b9 100644 --- a/mdk-stage1/dietlibc/dietfeatures.h +++ b/mdk-stage1/dietlibc/dietfeatures.h @@ -3,40 +3,106 @@ /* 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_FLOATING_POINT_IN_PRINTF */ +/* #define WANT_FLOATING_POINT_IN_SCANF */ #define WANT_CHARACTER_CLASSES_IN_SCANF #define WANT_NULL_PRINTF +/* #define WANT_LONGLONG_PRINTF */ +/* #define WANT_LONGLONG_SCANF */ -#define SLASH_PROC_OK +/* 128 or 2048 bytes buffer size? */ +/* #define WANT_SMALL_STDIO_BUFS */ + +/* want fread to read() directly if size of data is larger than buffer? + * This costs a few bytes but is worth it if the application is already + * buffering. */ +#define WANT_FREAD_OPTIMIZATION -// #define WANT_BUFFERED_STDIO +/* this is only for meaningful for ttyname and sysconf_cpus so far */ +#define SLASH_PROC_OK /* use errno_location instead of errno */ -// #define WANT_THREAD_SAFE +/* #define WANT_THREAD_SAFE */ -/* make the startcode, etc. dynamic aware */ -/* #undef WANT_DYNAMIC */ +/* make the startcode, etc. dynamic aware ({con,de}structors) */ +/* #define WANT_DYNAMIC */ /* do you want smaller or faster string routines? */ /* #define WANT_FASTER_STRING_ROUTINES */ -/* do you want ungetc? makes fgetc more complex */ -#define WANT_UNGETC +/* define this to have strncpy zero-fill and not just zero-terminate the + * string */ +/* #define WANT_FULL_POSIX_COMPAT */ -// #define WANT_LINKER_WARNINGS +/* read the comment in lib/strncat.c for an explanation */ +/* #define WANT_NON_COMPLIANT_STRNCAT */ + +/* #define WANT_LINKER_WARNINGS */ /* you need to define this if you want to run your programs with large - * file support on kernel 2.2 or 2.4 */ -// #define WANT_LARGEFILE_BACKCOMPAT + * file support on kernel 2.2 or 2.0 */ +/* #define WANT_LARGEFILE_BACKCOMPAT */ /* do you want localtime(3) to read /etc/localtime? * Needed for daylight saving time etc. */ -// #define WANT_TZFILE_PARSER +/* #define WANT_TZFILE_PARSER */ + +/* do you want the DNS routines to parse and use "domain" and "search" + * lines from /etc/resolv.conf? Normally not used on boot floppies and + * embedded environments. */ +#define WANT_FULL_RESOLV_CONF + +/* do you want IPv6 transport support in the DNS resolver? */ +/* #define WANT_IPV6_DNS */ + +/* do you want gethostbyname and friends to consult /etc/hosts? */ +#define WANT_ETC_HOSTS + +/* do you want gethostbyname to understand dotted decimal IP numbers + * directly and not try to resolve them? */ +#define WANT_INET_ADDR_DNS + +/* do you want math functions high precision rather than fast/small? */ +/* #define WANT_HIGH_PRECISION_MATH */ + +/* do you want support for matherr? */ +/* #define WANT_MATHERR */ + +/* do you want crypt(3) to use MD5 if the salt starts with "$1$"? */ +/* #define WANT_CRYPT_MD5 */ + +/* do you want diet to include a safeguard dependency to make linking + * against glibc fail? This may fail with older binutils. */ +#define WANT_SAFEGUARD + +/* dy you want that malloc(0) return a pointer to a "zero-length" object + * that is realloc-able; means realloc(..,size) gives a NEW object (like a + * call to malloc(size)). + * WARNING: this violates C99 */ +/* #define WANT_MALLOC_ZERO */ + /* stop uncommenting here ;-) */ #ifndef WANT_FASTER_STRING_ROUTINES #define WANT_SMALL_STRING_ROUTINES #endif +#ifdef WANT_THREAD_SAFE +#ifndef __ASSEMBLER__ +#define errno (*__errno_location()) +#define _REENTRANT +#endif +#endif + +#ifdef __DYN_LIB +/* with shared libraries you MUST have a dynamic aware startcode */ +#ifndef WANT_DYNAMIC +#define WANT_DYNAMIC +#endif +/* saveguard crashes with shared objects ... */ +#ifdef WANT_SAFEGUARD +#undef WANT_SAFEGUARD +#endif +#endif + #endif diff --git a/mdk-stage1/dietlibc/dietstdio.h b/mdk-stage1/dietlibc/dietstdio.h index a1cbeba83..2e0e93601 100644 --- a/mdk-stage1/dietlibc/dietstdio.h +++ b/mdk-stage1/dietlibc/dietstdio.h @@ -1,81 +1,77 @@ -/* diet stdio -- no buffering ;-} */ +/* diet stdio */ -#include "dietfeatures.h" +#include <sys/cdefs.h> #include <sys/types.h> -#ifdef WANT_THREAD_SAVE +#include "dietfeatures.h" +#ifdef WANT_THREAD_SAFE #include <pthread.h> #endif +#include <stdarg.h> +#ifdef WANT_SMALL_STDIO_BUFS #define BUFSIZE 128 +#else +#define BUFSIZE 2048 +#endif -typedef struct __file { +struct __stdio_file { int fd; int flags; -#ifdef WANT_BUFFERED_STDIO unsigned int bs; /* read: bytes in buffer */ unsigned int bm; /* position in buffer */ - char buf[BUFSIZE]; - struct __file *next; /* for fflush */ -#endif + unsigned int buflen; /* length of buf */ + char *buf; + struct __stdio_file *next; /* for fflush */ pid_t popen_kludge; -#ifdef WANT_UNGETC - char ungetbuf; + unsigned char ungetbuf; char ungotten; -#endif -#ifdef WANT_THREAD_SAVE +#ifdef WANT_THREAD_SAFE pthread_mutex_t m; #endif -} FILE; - -extern FILE *__stdio_root; +}; #define ERRORINDICATOR 1 #define EOFINDICATOR 2 #define BUFINPUT 4 #define BUFLINEWISE 8 #define NOBUF 16 -#define UNSEEKABLE 32 +#define STATICBUF 32 +#define FDPIPE 64 #define _IONBF 0 #define _IOLBF 1 #define _IOFBF 2 +#include <stdio.h> + /* 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); +extern int __buffered_outs(const char *s,size_t len); -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); +/* ..scanf */ +struct arg_scanf { + void *data; + int (*getch)(void*); + int (*putch)(int,void*); +}; -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 __v_scanf(struct arg_scanf* fn, const unsigned char *format, va_list arg_ptr); -long 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); +struct arg_printf { + void *data; + int (*put)(void*,size_t,void*); +}; -size_t fread( void *ptr, size_t size, size_t nmemb, FILE *stream); +int __v_printf(struct arg_printf* fn, const unsigned char *format, va_list arg_ptr); -size_t fwrite( const void *ptr, size_t size, size_t nmemb, FILE *stream); - -int fflush(FILE *stream); - -int fclose(FILE *stream); +extern FILE *__stdio_root; -extern FILE *stdout, *stderr, *stdin; +int __fflush_stdin(void); +int __fflush_stdout(void); +int __fflush_stderr(void); -#define EOF (int)(-1) +FILE* __stdio_init_file(int fd,int closeonerror); +int __stdio_parse_mode(const char *mode); +void __stdio_flushall(void); diff --git a/mdk-stage1/dietlibc/i386/Makefile.add b/mdk-stage1/dietlibc/i386/Makefile.add index b685cc360..83b18ae29 100644 --- a/mdk-stage1/dietlibc/i386/Makefile.add +++ b/mdk-stage1/dietlibc/i386/Makefile.add @@ -1,3 +1,8 @@ -CFLAGS+=-march=i386 -mcpu=i386 -Os -fomit-frame-pointer +M:=$(shell ./findcflags.sh $(CC)) +LIBOBJ+=$(OBJDIR)/__ten.o $(OBJDIR)/md5asm.o $(OBJDIR)/mmap64.o +LIBMATH+=acos.o asin.o atan.o atan2.o ceil.o cos.o exp.o exp10.o exp2.o expm1.o fabs.o floor.o hypot.o log.o log10.o log2.o sin.o sqrt.o tan.o copysign.o sincos.o __half.o ldexp.o pow.o ilogb.o cbrt.o log1p.o sqrtl.o fmod.o libm2.o +#CFLAGS+=-march=i386 -Os -fomit-frame-pointer -malign-functions=0 -malign-jumps=0 -malign-loops=0 -mpreferred-stack-boundary=2 +CFLAGS+=$(M) VPATH:=i386:syscalls.s:$(VPATH) +LIBGMON_OBJS+=$(OBJDIR)/mcount.o diff --git a/mdk-stage1/dietlibc/i386/__longjmp.S b/mdk-stage1/dietlibc/i386/__longjmp.S index 098275037..a09191f0b 100644 --- a/mdk-stage1/dietlibc/i386/__longjmp.S +++ b/mdk-stage1/dietlibc/i386/__longjmp.S @@ -2,6 +2,7 @@ .text .global __longjmp +.type __longjmp,@function __longjmp: movl 4(%esp), %ecx /* User's jmp_buf in %ecx. */ movl 8(%esp), %eax /* Second argument is return value. */ diff --git a/mdk-stage1/dietlibc/i386/__testandset.S b/mdk-stage1/dietlibc/i386/__testandset.S index af7b4d5a0..29b02d57a 100644 --- a/mdk-stage1/dietlibc/i386/__testandset.S +++ b/mdk-stage1/dietlibc/i386/__testandset.S @@ -1,5 +1,6 @@ .text .global __testandset +.type __testandset,@function __testandset: xorl %eax, %eax movl 0x4(%esp),%edx diff --git a/mdk-stage1/dietlibc/i386/clone.S b/mdk-stage1/dietlibc/i386/clone.S index ac02eb468..ea43bc2e2 100644 --- a/mdk-stage1/dietlibc/i386/clone.S +++ b/mdk-stage1/dietlibc/i386/clone.S @@ -1,17 +1,21 @@ -#include <asm/unistd.h> +#include "syscalls.h" +#include <errno.h> +#include "PIC.h" .text +.type clone,@function .weak clone clone: +.type __clone,@function .global __clone __clone: + mov $-EINVAL, %eax + movl 4(%esp), %ecx /* have non null thread_funcion */ - testl %ecx, %ecx - je .Lclone_error + jecxz .Lclone_error movl 8(%esp), %ecx /* have non null child_stack pointer */ - testl %ecx, %ecx - je .Lclone_error + jecxz .Lclone_error /* put the parameter on thread stack */ subl $8, %ecx @@ -31,9 +35,7 @@ __clone: testl %eax, %eax jl .Lclone_error - je .Lstart_thread - ret - + jne .Lreturn .Lstart_thread: xorl %ebp,%ebp call *%ebx @@ -43,9 +45,16 @@ __clone: .Lclone_error: negl %eax pushl %eax +#ifdef PIC + pushl %ebx + PIC_INIT + call __errno_location@PLT + popl %ebx +#else call __errno_location +#endif popl %ecx movl %ecx, (%eax) - xorl %eax, %eax - decl %eax + orl $-1, %eax +.Lreturn: ret diff --git a/mdk-stage1/dietlibc/i386/setjmp.S b/mdk-stage1/dietlibc/i386/setjmp.S index 9bfecf565..09b266c61 100644 --- a/mdk-stage1/dietlibc/i386/setjmp.S +++ b/mdk-stage1/dietlibc/i386/setjmp.S @@ -1,61 +1,40 @@ #include <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 +.type setjmp,@function setjmp: .globl __setjmp +.type __setjmp,@function __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. */ + popl %eax + popl %ecx + pushl $0 + pushl %ecx + pushl %eax .globl __sigsetjmp +.type __sigsetjmp,@function __sigsetjmp: - movl 4(%esp), %eax /* User's jmp_buf in %eax. */ + movl 4(%esp), %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) + leal 4(%esp), %edx /* Save SP as it will be after we return. */ movl 0(%esp), %ecx /* Save PC we are returning to now. */ + movl %edx, (JB_SP*4)(%eax) 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 + call 1f + addl $_GLOBAL_OFFSET_TABLE_, %ecx + jmp *__sigjmp_save@GOT(%ecx) +1: movl (%esp), %ecx + ret #else jmp __sigjmp_save #endif diff --git a/mdk-stage1/dietlibc/i386/start.S b/mdk-stage1/dietlibc/i386/start.S index 167bb779c..1a825fc2a 100644 --- a/mdk-stage1/dietlibc/i386/start.S +++ b/mdk-stage1/dietlibc/i386/start.S @@ -1,42 +1,51 @@ -#include "start.h" +#include "dietfeatures.h" +#include "PIC.h" -#ifdef __i386__ .text -.globl _start +.global _start _start: -#if 0 - popl %ecx - movl %esp, %esi - leal 4(%esp,%ecx,4),%eax +#if 1 + popl %ecx /* %ecx = argc */ + movl %esp,%esi /* %esi = argv */ + pushl %ecx #else - movl (%esp),%ecx /* %ecx = argc */ - leal 4(%esp),%esi /* %esi = argv */ - - leal 4(%esi,%ecx,4),%eax /* eax = 4*ecx+4 = envp */ + movl (%esp),%ecx /* %ecx = argc */ + leal 4(%esp),%esi /* %esi = argv */ #endif - pushl %eax - pushl %esi - pushl %ecx - movl %eax,environ + leal 4(%esi,%ecx,4),%eax /* %eax = envp = (4*ecx)+%esi+4 */ #ifdef WANT_DYNAMIC -/* in %edx we have the dynamic _fini ( register this if non null ) */ - test %edx, %edx - je .Linit +/* in %edx we have the ld.so dynamic _fini ( register this if non null ) */ push %edx - call atexit - pop %edx -.Linit: - call _init - push $_fini - call atexit - pop %edx #endif - call main - pushl %eax - call exit -.Lfefe: - .size _start,.Lfefe-_start + pushl %eax + pushl %esi + pushl %ecx + PIC_INIT /* non-PIC: this is an empty line */ + PUT_VAR %eax, environ, %ecx /* non-PIC: movl %eax,environ */ + +#ifdef PROFILING + pushl $_etext + pushl $.text + call monitor + addl $0x8, %esp +#endif + +#ifdef WANT_DYNAMIC + call _dyn_start +#else + call main +#endif + +#ifdef PROFILING + pushl %eax + call _stop_monitor + popl %eax #endif + pushl %eax + call exit + hlt /* die now ! will ya ... */ +.Lstart: + .size _start,.Lstart-_start diff --git a/mdk-stage1/dietlibc/i386/unified.S b/mdk-stage1/dietlibc/i386/unified.S index f182bdb4b..989bf37b5 100644 --- a/mdk-stage1/dietlibc/i386/unified.S +++ b/mdk-stage1/dietlibc/i386/unified.S @@ -1,13 +1,33 @@ + #include <dietfeatures.h> .text +.global __unified_syscall_256 +.type __unified_syscall_256,@function +__unified_syscall_256: + movzwl %ax,%eax + jmp .L1 +.L2: +.size __unified_syscall_256,.L2-__unified_syscall_256 +.weak exit +exit: +.global _exit +.type _exit,@function +_exit: + movb $1,%al .global __unified_syscall +.type __unified_syscall,@function __unified_syscall: +.size _exit,__unified_syscall-_exit movzbl %al, %eax +.L1: push %edi push %esi push %ebx movl %esp,%edi + /* we use movl instead of pop because otherwise a signal would + destroy the stack frame and crash the program, although it + would save a few bytes. */ movl 0x10(%edi),%ebx movl 0x14(%edi),%ecx movl 0x18(%edi),%edx @@ -16,19 +36,24 @@ __unified_syscall: int $0x80 cmp $-124,%eax jbe .Lnoerror -#ifdef WANT_THREAD_SAVE + neg %eax +#ifdef WANT_THREAD_SAFE movl %eax,%ebx call __errno_location - neg %ebx movl %ebx,(%eax) + orl $-1,%eax #else - neg %eax mov %eax,errno + sbb %eax,%eax # eax = eax - eax - CY = -1 #endif - xor %eax,%eax - dec %eax .Lnoerror: pop %ebx pop %esi pop %edi + +/* here we go and "reuse" the return for weak-void functions */ +#include "dietuglyweaks.h" + ret +.L3: +.size __unified_syscall,.L3-__unified_syscall diff --git a/mdk-stage1/dietlibc/include/alloca.h b/mdk-stage1/dietlibc/include/alloca.h index e69de29bb..41f92354f 100644 --- a/mdk-stage1/dietlibc/include/alloca.h +++ b/mdk-stage1/dietlibc/include/alloca.h @@ -0,0 +1,13 @@ +#ifndef _ALLOCA_H +#define _ALLOCA_H + +#include <sys/cdefs.h> +#include <sys/types.h> + +#ifdef __GNUC__ +#define alloca(x) __builtin_alloca(x) +#else +void *alloca(size_t size) __THROW; +#endif + +#endif diff --git a/mdk-stage1/dietlibc/include/arpa/inet.h b/mdk-stage1/dietlibc/include/arpa/inet.h index 6d5a6dc35..bb278d399 100644 --- a/mdk-stage1/dietlibc/include/arpa/inet.h +++ b/mdk-stage1/dietlibc/include/arpa/inet.h @@ -9,6 +9,7 @@ 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; +char *inet_ntoa_r(struct in_addr in,char* buf) __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; diff --git a/mdk-stage1/dietlibc/include/arpa/nameser.h b/mdk-stage1/dietlibc/include/arpa/nameser.h index 1ee048d66..9327006b0 100644 --- a/mdk-stage1/dietlibc/include/arpa/nameser.h +++ b/mdk-stage1/dietlibc/include/arpa/nameser.h @@ -89,6 +89,42 @@ typedef enum __ns_class { ns_c_max = 65536 } ns_class; +/* + * Currently defined opcodes. + */ +typedef enum __ns_opcode { + ns_o_query = 0, /* Standard query. */ + ns_o_iquery = 1, /* Inverse query (deprecated/unsupported). */ + ns_o_status = 2, /* Name server status query (unsupported). */ + /* Opcode 3 is undefined/reserved. */ + ns_o_notify = 4, /* Zone change notification. */ + ns_o_update = 5, /* Zone update message. */ + ns_o_max = 6 +} ns_opcode; + +/* + * Currently defined response codes. + */ +typedef enum __ns_rcode { + ns_r_noerror = 0, /* No error occurred. */ + ns_r_formerr = 1, /* Format error. */ + ns_r_servfail = 2, /* Server failure. */ + ns_r_nxdomain = 3, /* Name error. */ + ns_r_notimpl = 4, /* Unimplemented. */ + ns_r_refused = 5, /* Operation refused. */ + /* these are for BIND_UPDATE */ + ns_r_yxdomain = 6, /* Name exists */ + ns_r_yxrrset = 7, /* RRset exists */ + ns_r_nxrrset = 8, /* RRset does not exist */ + ns_r_notauth = 9, /* Not authoritative for zone */ + ns_r_notzone = 10, /* Zone of record different from zone section */ + ns_r_max = 11, + /* The following are TSIG extended errors */ + ns_r_badsig = 16, + ns_r_badkey = 17, + ns_r_badtime = 18 +} ns_rcode; + typedef struct { unsigned id :16; /* query identification number */ #if BYTE_ORDER == BIG_ENDIAN diff --git a/mdk-stage1/dietlibc/include/assert.h b/mdk-stage1/dietlibc/include/assert.h index bb573d0f2..a8ce3ce87 100644 --- a/mdk-stage1/dietlibc/include/assert.h +++ b/mdk-stage1/dietlibc/include/assert.h @@ -4,24 +4,35 @@ #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) +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__ +# if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L +# define __ASSERT_FUNCTION __func__ +# else +# define __ASSERT_FUNCTION ((const char *) 0) +# endif #endif #undef assert #ifdef NDEBUG #define assert(expr) #else +#ifdef expect +# define assert(expr) \ + ((void) (expect((long)(expr),0) ? 0 : \ + (__assert_fail (#expr, \ + __FILE__, __LINE__, __ASSERT_FUNCTION), 0))) +#else # define assert(expr) \ ((void) ((expr) ? 0 : \ (__assert_fail (#expr, \ __FILE__, __LINE__, __ASSERT_FUNCTION), 0))) #endif +#endif #endif diff --git a/mdk-stage1/dietlibc/include/daemon.h b/mdk-stage1/dietlibc/include/daemon.h index 9049f367d..e2413d42b 100644 --- a/mdk-stage1/dietlibc/include/daemon.h +++ b/mdk-stage1/dietlibc/include/daemon.h @@ -1,6 +1,6 @@ #ifndef _DAEMON_H #define _DAEMON_H -extern int daemon (int nochdir,int noclose); +#include <unistd.h> #endif diff --git a/mdk-stage1/dietlibc/include/dirent.h b/mdk-stage1/dietlibc/include/dirent.h index b0ad4f5ec..ad8b3a41a 100644 --- a/mdk-stage1/dietlibc/include/dirent.h +++ b/mdk-stage1/dietlibc/include/dirent.h @@ -3,15 +3,30 @@ #include <sys/cdefs.h> #include <sys/types.h> +#include <limits.h> -#include <linux/dirent.h> +struct dirent { + long d_ino; + off_t d_off; + unsigned short d_reclen; + char d_name[256]; /* We must not include limits.h! */ +}; + +#ifndef __STRICT_ANSI__ +struct dirent64 { + uint64_t d_ino; + int64_t d_off; + unsigned short d_reclen; + unsigned char d_type; + char d_name[256]; +}; +#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 typedef struct __dirstream DIR; @@ -23,4 +38,27 @@ void rewinddir (DIR *__dirp) __THROW; void seekdir (DIR *__dirp, long int __pos) __THROW; long int telldir (DIR *__dirp) __THROW; +int scandir(const char *dir, struct dirent ***namelist, + int (*selection)(const struct dirent *), + int (*compar)(const struct dirent **, const struct dirent **)) __THROW; +int scandir64(const char *dir, struct dirent64 ***namelist, + int (*selection)(const struct dirent64 *), + int (*compar)(const struct dirent64 **, const struct dirent64 **)) __THROW; + +int alphasort(const struct dirent **a, const struct dirent **b) __THROW __attribute__((const)); +int alphasort64(const struct dirent64 **a, const struct dirent64 **b) __THROW __attribute__((const)); + +#define MAXNAMLEN NAME_MAX + +#ifdef _BSD_SOURCE +extern int dirfd(DIR *dirp) __THROW; +#endif + +#if defined _FILE_OFFSET_BITS && _FILE_OFFSET_BITS == 64 +#define dirent dirent64 +#define readdir readdir64 +#define scandir scandir64 +#define alphasort alphasort64 +#endif + #endif diff --git a/mdk-stage1/dietlibc/include/dlfcn.h b/mdk-stage1/dietlibc/include/dlfcn.h index b96f8f615..0ddcafdba 100644 --- a/mdk-stage1/dietlibc/include/dlfcn.h +++ b/mdk-stage1/dietlibc/include/dlfcn.h @@ -7,6 +7,9 @@ #define RTLD_LOCAL 0x00000 #define RTLD_GLOBAL 0x10000 +#define RTLD_DEFAULT ((void*)1) +#define RTLD_NEXT ((void*)2) + void *dlopen (const char *filename, int flag); const char *dlerror(void); void *dlsym(void *handle, char *symbol); diff --git a/mdk-stage1/dietlibc/include/elf.h b/mdk-stage1/dietlibc/include/elf.h index be09dbee4..7b198bad3 100644 --- a/mdk-stage1/dietlibc/include/elf.h +++ b/mdk-stage1/dietlibc/include/elf.h @@ -1 +1,780 @@ -#include <linux/elf.h> +#ifndef _ELF_H +#define _ELF_H + +#include <inttypes.h> + +/* 32-bit ELF base types. */ +typedef uint32_t Elf32_Addr; +typedef uint16_t Elf32_Half; +typedef uint32_t Elf32_Off; +typedef int32_t Elf32_Sword; +typedef uint32_t Elf32_Word; + +/* 64-bit ELF base types. */ +typedef uint64_t Elf64_Addr; +typedef uint16_t Elf64_Half; +typedef int16_t Elf64_SHalf; +typedef uint64_t Elf64_Off; +typedef int32_t Elf64_Sword; +typedef uint32_t Elf64_Word; +typedef uint64_t Elf64_Xword; +typedef int64_t Elf64_Sxword; + +/* These constants are for the segment types stored in the image headers */ +#define PT_NULL 0 +#define PT_LOAD 1 +#define PT_DYNAMIC 2 +#define PT_INTERP 3 +#define PT_NOTE 4 +#define PT_SHLIB 5 +#define PT_PHDR 6 +#define PT_LOPROC 0x70000000 +#define PT_HIPROC 0x7fffffff +#define PT_MIPS_REGINFO 0x70000000 + +/* Flags in the e_flags field of the header */ +#define EF_MIPS_NOREORDER 0x00000001 +#define EF_MIPS_PIC 0x00000002 +#define EF_MIPS_CPIC 0x00000004 +#define EF_MIPS_ARCH 0xf0000000 + +/* These constants define the different elf file types */ +#define ET_NONE 0 +#define ET_REL 1 +#define ET_EXEC 2 +#define ET_DYN 3 +#define ET_CORE 4 +#define ET_LOPROC 0xff00 +#define ET_HIPROC 0xffff + +/* These constants define the various ELF target machines */ +#define EM_NONE 0 +#define EM_M32 1 +#define EM_SPARC 2 +#define EM_386 3 +#define EM_68K 4 +#define EM_88K 5 +#define EM_486 6 /* Perhaps disused */ +#define EM_860 7 + +#define EM_MIPS 8 /* MIPS R3000 (officially, big-endian only) */ +#define EM_MIPS_RS4_BE 10 /* MIPS R4000 big-endian */ + +#define EM_PARISC 15 /* HPPA */ +#define EM_SPARC32PLUS 18 /* Sun's "v8plus" */ +#define EM_PPC 20 /* PowerPC */ +#define EM_S390 22 /* IBM S/390 */ + +#define EM_ARM 40 /* ARM */ +#define EM_SH 42 /* SuperH */ +#define EM_SPARCV9 43 /* SPARC v9 64-bit */ +#define EM_IA_64 50 /* HP/Intel IA-64 */ +#define EM_X86_64 62 /* AMD x86-64 */ +#define EM_CRIS 76 /* Axis Communications 32-bit embedded processor */ + +/* + * This is an interim value that we will use until the committee comes + * up with a final number. + */ +#define EM_ALPHA 0x9026 + +/* + * This is the old interim value for S/390 architecture + */ +#define EM_S390_OLD 0xA390 + +/* This is the info that is needed to parse the dynamic section of the file */ +#define DT_NULL 0 +#define DT_NEEDED 1 +#define DT_PLTRELSZ 2 +#define DT_PLTGOT 3 +#define DT_HASH 4 +#define DT_STRTAB 5 +#define DT_SYMTAB 6 +#define DT_RELA 7 +#define DT_RELASZ 8 +#define DT_RELAENT 9 +#define DT_STRSZ 10 +#define DT_SYMENT 11 +#define DT_INIT 12 +#define DT_FINI 13 +#define DT_SONAME 14 +#define DT_RPATH 15 +#define DT_SYMBOLIC 16 +#define DT_REL 17 +#define DT_RELSZ 18 +#define DT_RELENT 19 +#define DT_PLTREL 20 +#define DT_DEBUG 21 +#define DT_TEXTREL 22 +#define DT_JMPREL 23 +#define DT_NUM 24 +#define DT_LOPROC 0x70000000 +#define DT_HIPROC 0x7fffffff +#define DT_MIPS_RLD_VERSION 0x70000001 +#define DT_MIPS_TIME_STAMP 0x70000002 +#define DT_MIPS_ICHECKSUM 0x70000003 +#define DT_MIPS_IVERSION 0x70000004 +#define DT_MIPS_FLAGS 0x70000005 + #define RHF_NONE 0 + #define RHF_HARDWAY 1 + #define RHF_NOTPOT 2 +#define DT_MIPS_BASE_ADDRESS 0x70000006 +#define DT_MIPS_CONFLICT 0x70000008 +#define DT_MIPS_LIBLIST 0x70000009 +#define DT_MIPS_LOCAL_GOTNO 0x7000000a +#define DT_MIPS_CONFLICTNO 0x7000000b +#define DT_MIPS_LIBLISTNO 0x70000010 +#define DT_MIPS_SYMTABNO 0x70000011 +#define DT_MIPS_UNREFEXTNO 0x70000012 +#define DT_MIPS_GOTSYM 0x70000013 +#define DT_MIPS_HIPAGENO 0x70000014 +#define DT_MIPS_RLD_MAP 0x70000016 + +/* This info is needed when parsing the symbol table */ +#define STB_LOCAL 0 +#define STB_GLOBAL 1 +#define STB_WEAK 2 + +#define STT_NOTYPE 0 +#define STT_OBJECT 1 +#define STT_FUNC 2 +#define STT_SECTION 3 +#define STT_FILE 4 + +#define ELF32_ST_BIND(x) ((x) >> 4) +#define ELF32_ST_TYPE(x) (((unsigned int) x) & 0xf) + +#define ELF64_ST_BIND(val) ELF32_ST_BIND (val) +#define ELF64_ST_TYPE(val) ELF32_ST_TYPE (val) + +/* Symbolic values for the entries in the auxiliary table + put on the initial stack */ +#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_PLATFORM 15 /* string identifying CPU for optimizations */ +#define AT_HWCAP 16 /* arch dependent hints at CPU capabilities */ +#define AT_CLKTCK 17 /* frequency at which times() increments */ + +typedef struct dynamic{ + Elf32_Sword d_tag; + union{ + Elf32_Sword d_val; + Elf32_Addr d_ptr; + } d_un; +} Elf32_Dyn; + +typedef struct { + Elf64_Sxword d_tag; /* entry tag value */ + union { + Elf64_Xword d_val; + Elf64_Addr d_ptr; + } d_un; +} Elf64_Dyn; + +/* The following are used with relocations */ +#define ELF32_R_SYM(x) ((x) >> 8) +#define ELF32_R_TYPE(x) ((x) & 0xff) + +#define ELF64_R_SYM(x) ((x) >> 32) +#define ELF64_R_TYPE(x) ((x) & 0xffffffff) + +#define R_386_NONE 0 +#define R_386_32 1 +#define R_386_PC32 2 +#define R_386_GOT32 3 +#define R_386_PLT32 4 +#define R_386_COPY 5 +#define R_386_GLOB_DAT 6 +#define R_386_JMP_SLOT 7 +#define R_386_RELATIVE 8 +#define R_386_GOTOFF 9 +#define R_386_GOTPC 10 +#define R_386_NUM 11 + +#define R_MIPS_NONE 0 +#define R_MIPS_16 1 +#define R_MIPS_32 2 +#define R_MIPS_REL32 3 +#define R_MIPS_26 4 +#define R_MIPS_HI16 5 +#define R_MIPS_LO16 6 +#define R_MIPS_GPREL16 7 +#define R_MIPS_LITERAL 8 +#define R_MIPS_GOT16 9 +#define R_MIPS_PC16 10 +#define R_MIPS_CALL16 11 +#define R_MIPS_GPREL32 12 +/* The remaining relocs are defined on Irix, although they are not + in the MIPS ELF ABI. */ +#define R_MIPS_UNUSED1 13 +#define R_MIPS_UNUSED2 14 +#define R_MIPS_UNUSED3 15 +#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 +/* + * The following two relocation types are specified in the MIPS ABI + * conformance guide version 1.2 but not yet in the psABI. + */ +#define R_MIPS_GOTHI16 22 +#define R_MIPS_GOTLO16 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 +/* + * The following two relocation types are specified in the MIPS ABI + * conformance guide version 1.2 but not yet in the psABI. + */ +#define R_MIPS_CALLHI16 30 +#define R_MIPS_CALLLO16 31 +/* + * This range is reserved for vendor specific relocations. + */ +#define R_MIPS_LOVENDOR 100 +#define R_MIPS_HIVENDOR 127 + + +/* + * Sparc ELF relocation types + */ +#define R_SPARC_NONE 0 +#define R_SPARC_8 1 +#define R_SPARC_16 2 +#define R_SPARC_32 3 +#define R_SPARC_DISP8 4 +#define R_SPARC_DISP16 5 +#define R_SPARC_DISP32 6 +#define R_SPARC_WDISP30 7 +#define R_SPARC_WDISP22 8 +#define R_SPARC_HI22 9 +#define R_SPARC_22 10 +#define R_SPARC_13 11 +#define R_SPARC_LO10 12 +#define R_SPARC_GOT10 13 +#define R_SPARC_GOT13 14 +#define R_SPARC_GOT22 15 +#define R_SPARC_PC10 16 +#define R_SPARC_PC22 17 +#define R_SPARC_WPLT30 18 +#define R_SPARC_COPY 19 +#define R_SPARC_GLOB_DAT 20 +#define R_SPARC_JMP_SLOT 21 +#define R_SPARC_RELATIVE 22 +#define R_SPARC_UA32 23 +#define R_SPARC_PLT32 24 +#define R_SPARC_HIPLT22 25 +#define R_SPARC_LOPLT10 26 +#define R_SPARC_PCPLT32 27 +#define R_SPARC_PCPLT22 28 +#define R_SPARC_PCPLT10 29 +#define R_SPARC_10 30 +#define R_SPARC_11 31 +#define R_SPARC_WDISP16 40 +#define R_SPARC_WDISP19 41 +#define R_SPARC_7 43 +#define R_SPARC_5 44 +#define R_SPARC_6 45 + +/* Bits present in AT_HWCAP, primarily for Sparc32. */ + +#define HWCAP_SPARC_FLUSH 1 /* CPU supports flush instruction. */ +#define HWCAP_SPARC_STBAR 2 +#define HWCAP_SPARC_SWAP 4 +#define HWCAP_SPARC_MULDIV 8 +#define HWCAP_SPARC_V9 16 +#define HWCAP_SPARC_ULTRA3 32 + +/* + * 68k ELF relocation types + */ +#define R_68K_NONE 0 +#define R_68K_32 1 +#define R_68K_16 2 +#define R_68K_8 3 +#define R_68K_PC32 4 +#define R_68K_PC16 5 +#define R_68K_PC8 6 +#define R_68K_GOT32 7 +#define R_68K_GOT16 8 +#define R_68K_GOT8 9 +#define R_68K_GOT32O 10 +#define R_68K_GOT16O 11 +#define R_68K_GOT8O 12 +#define R_68K_PLT32 13 +#define R_68K_PLT16 14 +#define R_68K_PLT8 15 +#define R_68K_PLT32O 16 +#define R_68K_PLT16O 17 +#define R_68K_PLT8O 18 +#define R_68K_COPY 19 +#define R_68K_GLOB_DAT 20 +#define R_68K_JMP_SLOT 21 +#define R_68K_RELATIVE 22 + +/* + * Alpha ELF relocation types + */ +#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 */ + +/* Legal values for e_flags field of Elf64_Ehdr. */ + +#define EF_ALPHA_32BIT 1 /* All addresses are below 2GB */ + +/* + * PowerPC + */ + +/* 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 ELF relocation types + */ +#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 + +/* 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 + +/* AMD x86-64 relocations. */ +#define R_X86_64_NONE 0 /* No reloc */ +#define R_X86_64_64 1 /* Direct 64 bit */ +#define R_X86_64_PC32 2 /* PC relative 32 bit signed */ +#define R_X86_64_GOT32 3 /* 32 bit GOT entry */ +#define R_X86_64_PLT32 4 /* 32 bit PLT address */ +#define R_X86_64_COPY 5 /* Copy symbol at runtime */ +#define R_X86_64_GLOB_DAT 6 /* Create GOT entry */ +#define R_X86_64_JUMP_SLOT 7 /* Create PLT entry */ +#define R_X86_64_RELATIVE 8 /* Adjust by program base */ +#define R_X86_64_GOTPCREL 9 /* 32 bit signed PC relative + offset to GOT */ +#define R_X86_64_32 10 /* Direct 32 bit zero extended */ +#define R_X86_64_32S 11 /* Direct 32 bit sign extended */ +#define R_X86_64_16 12 /* Direct 16 bit zero extended */ +#define R_X86_64_PC16 13 /* 16 bit sign extended pc relative */ +#define R_X86_64_8 14 /* Direct 8 bit sign extended */ +#define R_X86_64_PC8 15 /* 8 bit sign extended pc relative */ +#define R_X86_64_DTPMOD64 16 /* ID of module containing symbol */ +#define R_X86_64_DTPOFF64 17 /* Offset in module's TLS block */ +#define R_X86_64_TPOFF64 18 /* Offset in initial TLS block */ +#define R_X86_64_TLSGD 19 /* 32 bit signed PC relative offset + to two GOT entries for GD symbol */ +#define R_X86_64_TLSLD 20 /* 32 bit signed PC relative offset + to two GOT entries for LD symbol */ +#define R_X86_64_DTPOFF32 21 /* Offset in TLS block */ +#define R_X86_64_GOTTPOFF 22 /* 32 bit signed PC relative offset + to GOT entry for IE symbol */ +#define R_X86_64_TPOFF32 23 /* Offset in initial TLS block */ + +#define R_X86_64_NUM 24 + +typedef struct elf32_rel { + Elf32_Addr r_offset; + Elf32_Word r_info; +} Elf32_Rel; + +typedef struct elf64_rel { + Elf64_Addr r_offset; /* Location at which to apply the action */ + Elf64_Xword r_info; /* index and type of relocation */ +} Elf64_Rel; + +typedef struct elf32_rela{ + Elf32_Addr r_offset; + Elf32_Word r_info; + Elf32_Sword r_addend; +} Elf32_Rela; + +typedef struct elf64_rela { + Elf64_Addr r_offset; /* Location at which to apply the action */ + Elf64_Xword r_info; /* index and type of relocation */ + Elf64_Sxword r_addend; /* Constant addend used to compute value */ +} Elf64_Rela; + +typedef struct elf32_sym{ + Elf32_Word st_name; + Elf32_Addr st_value; + Elf32_Word st_size; + unsigned char st_info; + unsigned char st_other; + Elf32_Half st_shndx; +} Elf32_Sym; + +typedef struct elf64_sym { + Elf64_Word st_name; /* Symbol name, index in string tbl */ + unsigned char st_info; /* Type and binding attributes */ + unsigned char st_other; /* No defined meaning, 0 */ + Elf64_Half st_shndx; /* Associated section index */ + Elf64_Addr st_value; /* Value of the symbol */ + Elf64_Xword st_size; /* Associated symbol size */ +} Elf64_Sym; + + +#define EI_NIDENT 16 + +typedef struct elf32_hdr{ + unsigned char e_ident[EI_NIDENT]; + Elf32_Half e_type; + Elf32_Half e_machine; + Elf32_Word e_version; + Elf32_Addr e_entry; /* Entry point */ + Elf32_Off e_phoff; + Elf32_Off e_shoff; + Elf32_Word e_flags; + Elf32_Half e_ehsize; + Elf32_Half e_phentsize; + Elf32_Half e_phnum; + Elf32_Half e_shentsize; + Elf32_Half e_shnum; + Elf32_Half e_shstrndx; +} Elf32_Ehdr; + +typedef struct elf64_hdr { + unsigned char e_ident[16]; /* ELF "magic number" */ + Elf64_Half e_type; + Elf64_Half e_machine; + Elf64_Word e_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; + Elf64_Half e_ehsize; + Elf64_Half e_phentsize; + Elf64_Half e_phnum; + Elf64_Half e_shentsize; + Elf64_Half e_shnum; + Elf64_Half e_shstrndx; +} Elf64_Ehdr; + +/* These constants define the permissions on sections in the program + header, p_flags. */ +#define PF_R 0x4 +#define PF_W 0x2 +#define PF_X 0x1 + +typedef struct elf32_phdr{ + Elf32_Word p_type; + Elf32_Off p_offset; + Elf32_Addr p_vaddr; + Elf32_Addr p_paddr; + Elf32_Word p_filesz; + Elf32_Word p_memsz; + Elf32_Word p_flags; + Elf32_Word p_align; +} Elf32_Phdr; + +typedef struct elf64_phdr { + Elf64_Word p_type; + Elf64_Word p_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, file & memory */ +} Elf64_Phdr; + +/* sh_type */ +#define SHT_NULL 0 +#define SHT_PROGBITS 1 +#define SHT_SYMTAB 2 +#define SHT_STRTAB 3 +#define SHT_RELA 4 +#define SHT_HASH 5 +#define SHT_DYNAMIC 6 +#define SHT_NOTE 7 +#define SHT_NOBITS 8 +#define SHT_REL 9 +#define SHT_SHLIB 10 +#define SHT_DYNSYM 11 +#define SHT_NUM 12 +#define SHT_LOPROC 0x70000000 +#define SHT_HIPROC 0x7fffffff +#define SHT_LOUSER 0x80000000 +#define SHT_HIUSER 0xffffffff +#define SHT_MIPS_LIST 0x70000000 +#define SHT_MIPS_CONFLICT 0x70000002 +#define SHT_MIPS_GPTAB 0x70000003 +#define SHT_MIPS_UCODE 0x70000004 + +/* sh_flags */ +#define SHF_WRITE 0x1 +#define SHF_ALLOC 0x2 +#define SHF_EXECINSTR 0x4 +#define SHF_MASKPROC 0xf0000000 +#define SHF_MIPS_GPREL 0x10000000 +#define SHF_ALPHA_GPREL 0x10000000 + +/* special section indexes */ +#define SHN_UNDEF 0 +#define SHN_LORESERVE 0xff00 +#define SHN_LOPROC 0xff00 +#define SHN_HIPROC 0xff1f +#define SHN_ABS 0xfff1 +#define SHN_COMMON 0xfff2 +#define SHN_HIRESERVE 0xffff +#define SHN_MIPS_ACCOMON 0xff00 + +typedef struct { + Elf32_Word sh_name; + Elf32_Word sh_type; + Elf32_Word sh_flags; + Elf32_Addr sh_addr; + Elf32_Off sh_offset; + Elf32_Word sh_size; + Elf32_Word sh_link; + Elf32_Word sh_info; + Elf32_Word sh_addralign; + Elf32_Word sh_entsize; +} Elf32_Shdr; + +typedef struct elf64_shdr { + Elf64_Word sh_name; /* Section name, index in string tbl */ + Elf64_Word sh_type; /* Type of section */ + Elf64_Xword sh_flags; /* Miscellaneous section attributes */ + Elf64_Addr sh_addr; /* Section virtual addr at execution */ + Elf64_Off sh_offset; /* Section file offset */ + Elf64_Xword sh_size; /* Size of section in bytes */ + Elf64_Word sh_link; /* Index of 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; + +#define EI_MAG0 0 /* e_ident[] indexes */ +#define EI_MAG1 1 +#define EI_MAG2 2 +#define EI_MAG3 3 +#define EI_CLASS 4 +#define EI_DATA 5 +#define EI_VERSION 6 +#define EI_PAD 7 + +#define ELFMAG0 0x7f /* EI_MAG */ +#define ELFMAG1 'E' +#define ELFMAG2 'L' +#define ELFMAG3 'F' +#define ELFMAG "\177ELF" +#define SELFMAG 4 + +#define ELFCLASSNONE 0 /* EI_CLASS */ +#define ELFCLASS32 1 +#define ELFCLASS64 2 +#define ELFCLASSNUM 3 + +#define ELFDATANONE 0 /* e_ident[EI_DATA] */ +#define ELFDATA2LSB 1 +#define ELFDATA2MSB 2 + +#define EV_NONE 0 /* e_version, EI_VERSION */ +#define EV_CURRENT 1 +#define EV_NUM 2 + +/* Notes used in ET_CORE */ +#define NT_PRSTATUS 1 +#define NT_PRFPREG 2 +#define NT_PRPSINFO 3 +#define NT_TASKSTRUCT 4 +#define NT_PRFPXREG 20 + +/* Note header in a PT_NOTE section */ +typedef struct elf32_note { + Elf32_Word n_namesz; /* Name size */ + Elf32_Word n_descsz; /* Content size */ + Elf32_Word n_type; /* Content type */ +} Elf32_Nhdr; + +/* Note header in a PT_NOTE section */ +typedef struct elf64_note { + Elf64_Word n_namesz; /* Name size */ + Elf64_Word n_descsz; /* Content size */ + Elf64_Word n_type; /* Content type */ +} Elf64_Nhdr; + +#if ELF_CLASS == ELFCLASS32 + +extern Elf32_Dyn _DYNAMIC []; +#define elfhdr elf32_hdr +#define elf_phdr elf32_phdr +#define elf_note elf32_note + +#else + +extern Elf64_Dyn _DYNAMIC []; +#define elfhdr elf64_hdr +#define elf_phdr elf64_phdr +#define elf_note elf64_note + +#endif + + +#endif diff --git a/mdk-stage1/dietlibc/include/endian.h b/mdk-stage1/dietlibc/include/endian.h index 463c24fff..93b1f2948 100644 --- a/mdk-stage1/dietlibc/include/endian.h +++ b/mdk-stage1/dietlibc/include/endian.h @@ -4,35 +4,42 @@ #define __LITTLE_ENDIAN 1234 #define __BIG_ENDIAN 4321 -#ifdef __i386__ -#define __BYTE_ORDER __LITTLE_ENDIAN -#define __FLOAT_WORD_ORDER __BYTE_ORDER +#if defined(__i386__) || defined(__x86_64__) || defined(__ia64__) +#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 +#define __BYTE_ORDER __BIG_ENDIAN +#define __FLOAT_WORD_ORDER __BYTE_ORDER +#endif + +#ifdef __hppa__ +/* I hope this is correct...? */ +#define __BYTE_ORDER __BIG_ENDIAN +#define __FLOAT_WORD_ORDER __BYTE_ORDER #endif #ifdef __mips__ #ifdef __MIPSEB__ -#define __BIG_ENDIAN__ +#define __BYTE_ORDER __BIG_ENDIAN +#define __FLOAT_WORD_ORDER __BYTE_ORDER #endif #endif #ifndef __BYTE_ORDER #ifdef __BIG_ENDIAN__ -#define __BYTE_ORDER __BIG_ENDIAN -#define __FLOAT_WORD_ORDER __BYTE_ORDER +#define __BYTE_ORDER __BIG_ENDIAN +#define __FLOAT_WORD_ORDER __BYTE_ORDER #else -#define __BYTE_ORDER __LITTLE_ENDIAN -#define __FLOAT_WORD_ORDER __BYTE_ORDER +#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 +#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 @@ -40,4 +47,16 @@ # define __LONG_LONG_PAIR(HI, LO) HI, LO #endif +#if defined(__alpha__) || defined(__mips64) || defined(__sparc_v9__) || defined(__x86_64__) || defined(__ia64__) +#define __WORDSIZE 64 +#endif + +#if defined(__sparc__) && (__arch64__) +#define __WORDSIZE 64 +#endif + +#ifndef __WORDSIZE +#define __WORDSIZE 32 +#endif + #endif diff --git a/mdk-stage1/dietlibc/include/errno.h b/mdk-stage1/dietlibc/include/errno.h index d1c68f39c..12aa394da 100644 --- a/mdk-stage1/dietlibc/include/errno.h +++ b/mdk-stage1/dietlibc/include/errno.h @@ -1,11 +1,546 @@ #ifndef _ERRNO_H -#define _ERRNO_H +#define _ERRNO_H -extern int errno; +#if defined(__alpha__) + +#define EPERM 1 /* Operation not permitted */ +#define ENOENT 2 /* No such file or directory */ +#define ESRCH 3 /* No such process */ +#define EINTR 4 /* Interrupted system call */ +#define EIO 5 /* I/O error */ +#define ENXIO 6 /* No such device or address */ +#define E2BIG 7 /* Arg list too long */ +#define ENOEXEC 8 /* Exec format error */ +#define EBADF 9 /* Bad file number */ +#define ECHILD 10 /* No child processes */ +#define EDEADLK 11 /* Resource deadlock would occur */ +#define ENOMEM 12 /* Out of memory */ +#define EACCES 13 /* Permission denied */ +#define EFAULT 14 /* Bad address */ +#define ENOTBLK 15 /* Block device required */ +#define EBUSY 16 /* Device or resource busy */ +#define EEXIST 17 /* File exists */ +#define EXDEV 18 /* Cross-device link */ +#define ENODEV 19 /* No such device */ +#define ENOTDIR 20 /* Not a directory */ +#define EISDIR 21 /* Is a directory */ +#define EINVAL 22 /* Invalid argument */ +#define ENFILE 23 /* File table overflow */ +#define EMFILE 24 /* Too many open files */ +#define ENOTTY 25 /* Not a typewriter */ +#define ETXTBSY 26 /* Text file busy */ +#define EFBIG 27 /* File too large */ +#define ENOSPC 28 /* No space left on device */ +#define ESPIPE 29 /* Illegal seek */ +#define EROFS 30 /* Read-only file system */ +#define EMLINK 31 /* Too many links */ +#define EPIPE 32 /* Broken pipe */ +#define EDOM 33 /* Math argument out of domain of func */ +#define ERANGE 34 /* Math result not representable */ +#define EAGAIN 35 /* Try again */ +#define EWOULDBLOCK EAGAIN /* Operation would block */ +#define EINPROGRESS 36 /* Operation now in progress */ +#define EALREADY 37 /* Operation already in progress */ +#define ENOTSOCK 38 /* Socket operation on non-socket */ +#define EDESTADDRREQ 39 /* Destination address required */ +#define EMSGSIZE 40 /* Message too long */ +#define EPROTOTYPE 41 /* Protocol wrong type for socket */ +#define ENOPROTOOPT 42 /* Protocol not available */ +#define EPROTONOSUPPORT 43 /* Protocol not supported */ +#define ESOCKTNOSUPPORT 44 /* Socket type not supported */ +#define EOPNOTSUPP 45 /* Operation not supported on transport endpoint */ +#define ENOTSUP EOPNOTSUPP/* Operation not supported on transport endpoint */ +#define EPFNOSUPPORT 46 /* Protocol family not supported */ +#define EAFNOSUPPORT 47 /* Address family not supported by protocol */ +#define EADDRINUSE 48 /* Address already in use */ +#define EADDRNOTAVAIL 49 /* Cannot assign requested address */ +#define ENETDOWN 50 /* Network is down */ +#define ENETUNREACH 51 /* Network is unreachable */ +#define ENETRESET 52 /* Network dropped connection because of reset */ +#define ECONNABORTED 53 /* Software caused connection abort */ +#define ECONNRESET 54 /* Connection reset by peer */ +#define ENOBUFS 55 /* No buffer space available */ +#define EISCONN 56 /* Transport endpoint is already connected */ +#define ENOTCONN 57 /* Transport endpoint is not connected */ +#define ESHUTDOWN 58 /* Cannot send after transport endpoint shutdown */ +#define ETOOMANYREFS 59 /* Too many references: cannot splice */ +#define ETIMEDOUT 60 /* Connection timed out */ +#define ECONNREFUSED 61 /* Connection refused */ +#define ELOOP 62 /* Too many symbolic links encountered */ +#define ENAMETOOLONG 63 /* File name too long */ +#define EHOSTDOWN 64 /* Host is down */ +#define EHOSTUNREACH 65 /* No route to host */ +#define ENOTEMPTY 66 /* Directory not empty */ +#define EUSERS 68 /* Too many users */ +#define EDQUOT 69 /* Quota exceeded */ +#define ESTALE 70 /* Stale NFS file handle */ +#define EREMOTE 71 /* Object is remote */ +#define ENOLCK 77 /* No record locks available */ +#define ENOSYS 78 /* Function not implemented */ +#define ENOMSG 80 /* No message of desired type */ +#define EIDRM 81 /* Identifier removed */ +#define ENOSR 82 /* Out of streams resources */ +#define ETIME 83 /* Timer expired */ +#define EBADMSG 84 /* Not a data message */ +#define EPROTO 85 /* Protocol error */ +#define ENODATA 86 /* No data available */ +#define ENOSTR 87 /* Device not a stream */ +#define ENOPKG 92 /* Package not installed */ +#define EILSEQ 116 /* Illegal byte sequence */ +/* The following are just random noise.. */ +#define ECHRNG 88 /* Channel number out of range */ +#define EL2NSYNC 89 /* Level 2 not synchronized */ +#define EL3HLT 90 /* Level 3 halted */ +#define EL3RST 91 /* Level 3 reset */ +#define ELNRNG 93 /* Link number out of range */ +#define EUNATCH 94 /* Protocol driver not attached */ +#define ENOCSI 95 /* No CSI structure available */ +#define EL2HLT 96 /* Level 2 halted */ +#define EBADE 97 /* Invalid exchange */ +#define EBADR 98 /* Invalid request descriptor */ +#define EXFULL 99 /* Exchange full */ +#define ENOANO 100 /* No anode */ +#define EBADRQC 101 /* Invalid request code */ +#define EBADSLT 102 /* Invalid slot */ +#define EDEADLOCK EDEADLK +#define EBFONT 104 /* Bad font file format */ +#define ENONET 105 /* Machine is not on the network */ +#define ENOLINK 106 /* Link has been severed */ +#define EADV 107 /* Advertise error */ +#define ESRMNT 108 /* Srmount error */ +#define ECOMM 109 /* Communication error on send */ +#define EMULTIHOP 110 /* Multihop attempted */ +#define EDOTDOT 111 /* RFS specific error */ +#define EOVERFLOW 112 /* Value too large for defined data type */ +#define ENOTUNIQ 113 /* Name not unique on network */ +#define EBADFD 114 /* File descriptor in bad state */ +#define EREMCHG 115 /* Remote address changed */ +#define EUCLEAN 117 /* Structure needs cleaning */ +#define ENOTNAM 118 /* Not a XENIX named type file */ +#define ENAVAIL 119 /* No XENIX semaphores available */ +#define EISNAM 120 /* Is a named type file */ +#define EREMOTEIO 121 /* Remote I/O error */ +#define ELIBACC 122 /* Can not access a needed shared library */ +#define ELIBBAD 123 /* Accessing a corrupted shared library */ +#define ELIBSCN 124 /* .lib section in a.out corrupted */ +#define ELIBMAX 125 /* Attempting to link in too many shared libraries */ +#define ELIBEXEC 126 /* Cannot exec a shared library directly */ +#define ERESTART 127 /* Interrupted system call should be restarted */ +#define ESTRPIPE 128 /* Streams pipe error */ +#define ENOMEDIUM 129 /* No medium found */ +#define EMEDIUMTYPE 130 /* Wrong medium type */ + +#elif defined(__mips__) + +#define EPERM 1 /* Operation not permitted */ +#define ENOENT 2 /* No such file or directory */ +#define ESRCH 3 /* No such process */ +#define EINTR 4 /* Interrupted system call */ +#define EIO 5 /* I/O error */ +#define ENXIO 6 /* No such device or address */ +#define E2BIG 7 /* Arg list too long */ +#define ENOEXEC 8 /* Exec format error */ +#define EBADF 9 /* Bad file number */ +#define ECHILD 10 /* No child processes */ +#define EAGAIN 11 /* Try again */ +#define ENOMEM 12 /* Out of memory */ +#define EACCES 13 /* Permission denied */ +#define EFAULT 14 /* Bad address */ +#define ENOTBLK 15 /* Block device required */ +#define EBUSY 16 /* Device or resource busy */ +#define EEXIST 17 /* File exists */ +#define EXDEV 18 /* Cross-device link */ +#define ENODEV 19 /* No such device */ +#define ENOTDIR 20 /* Not a directory */ +#define EISDIR 21 /* Is a directory */ +#define EINVAL 22 /* Invalid argument */ +#define ENFILE 23 /* File table overflow */ +#define EMFILE 24 /* Too many open files */ +#define ENOTTY 25 /* Not a typewriter */ +#define ETXTBSY 26 /* Text file busy */ +#define EFBIG 27 /* File too large */ +#define ENOSPC 28 /* No space left on device */ +#define ESPIPE 29 /* Illegal seek */ +#define EROFS 30 /* Read-only file system */ +#define EMLINK 31 /* Too many links */ +#define EPIPE 32 /* Broken pipe */ +#define EDOM 33 /* Math argument out of domain of func */ +#define ERANGE 34 /* Math result not representable */ +#define ENOMSG 35 /* No message of desired type */ +#define EIDRM 36 /* Identifier removed */ +#define ECHRNG 37 /* Channel number out of range */ +#define EL2NSYNC 38 /* Level 2 not synchronized */ +#define EL3HLT 39 /* Level 3 halted */ +#define EL3RST 40 /* Level 3 reset */ +#define ELNRNG 41 /* Link number out of range */ +#define EUNATCH 42 /* Protocol driver not attached */ +#define ENOCSI 43 /* No CSI structure available */ +#define EL2HLT 44 /* Level 2 halted */ +#define EDEADLK 45 /* Resource deadlock would occur */ +#define ENOLCK 46 /* No record locks available */ +#define EBADE 50 /* Invalid exchange */ +#define EBADR 51 /* Invalid request descriptor */ +#define EXFULL 52 /* Exchange full */ +#define ENOANO 53 /* No anode */ +#define EBADRQC 54 /* Invalid request code */ +#define EBADSLT 55 /* Invalid slot */ +#define EDEADLOCK 56 /* File locking deadlock error */ +#define EBFONT 59 /* Bad font file format */ +#define ENOSTR 60 /* Device not a stream */ +#define ENODATA 61 /* No data available */ +#define ETIME 62 /* Timer expired */ +#define ENOSR 63 /* Out of streams resources */ +#define ENONET 64 /* Machine is not on the network */ +#define ENOPKG 65 /* Package not installed */ +#define EREMOTE 66 /* Object is remote */ +#define ENOLINK 67 /* Link has been severed */ +#define EADV 68 /* Advertise error */ +#define ESRMNT 69 /* Srmount error */ +#define ECOMM 70 /* Communication error on send */ +#define EPROTO 71 /* Protocol error */ +#define EDOTDOT 73 /* RFS specific error */ +#define EMULTIHOP 74 /* Multihop attempted */ +#define EBADMSG 77 /* Not a data message */ +#define ENAMETOOLONG 78 /* File name too long */ +#define EOVERFLOW 79 /* Value too large for defined data type */ +#define ENOTUNIQ 80 /* Name not unique on network */ +#define EBADFD 81 /* File descriptor in bad state */ +#define EREMCHG 82 /* Remote address changed */ +#define ELIBACC 83 /* Can not access a needed shared library */ +#define ELIBBAD 84 /* Accessing a corrupted shared library */ +#define ELIBSCN 85 /* .lib section in a.out corrupted */ +#define ELIBMAX 86 /* Attempting to link in too many shared libraries */ +#define ELIBEXEC 87 /* Cannot exec a shared library directly */ +#define EILSEQ 88 /* Illegal byte sequence */ +#define ENOSYS 89 /* Function not implemented */ +#define ELOOP 90 /* Too many symbolic links encountered */ +#define ERESTART 91 /* Interrupted system call should be restarted */ +#define ESTRPIPE 92 /* Streams pipe error */ +#define ENOTEMPTY 93 /* Directory not empty */ +#define EUSERS 94 /* Too many users */ +#define ENOTSOCK 95 /* Socket operation on non-socket */ +#define EDESTADDRREQ 96 /* Destination address required */ +#define EMSGSIZE 97 /* Message too long */ +#define EPROTOTYPE 98 /* Protocol wrong type for socket */ +#define ENOPROTOOPT 99 /* Protocol not available */ +#define EPROTONOSUPPORT 120 /* Protocol not supported */ +#define ESOCKTNOSUPPORT 121 /* Socket type not supported */ +#define EOPNOTSUPP 122 /* Operation not supported on transport endpoint */ +#define ENOTSUP EOPNOTSUPP/* Operation not supported on transport endpoint */ +#define EPFNOSUPPORT 123 /* Protocol family not supported */ +#define EAFNOSUPPORT 124 /* Address family not supported by protocol */ +#define EADDRINUSE 125 /* Address already in use */ +#define EADDRNOTAVAIL 126 /* Cannot assign requested address */ +#define ENETDOWN 127 /* Network is down */ +#define ENETUNREACH 128 /* Network is unreachable */ +#define ENETRESET 129 /* Network dropped connection because of reset */ +#define ECONNABORTED 130 /* Software caused connection abort */ +#define ECONNRESET 131 /* Connection reset by peer */ +#define ENOBUFS 132 /* No buffer space available */ +#define EISCONN 133 /* Transport endpoint is already connected */ +#define ENOTCONN 134 /* Transport endpoint is not connected */ +#define EUCLEAN 135 /* Structure needs cleaning */ +#define ENOTNAM 137 /* Not a XENIX named type file */ +#define ENAVAIL 138 /* No XENIX semaphores available */ +#define EISNAM 139 /* Is a named type file */ +#define EREMOTEIO 140 /* Remote I/O error */ +#define EINIT 141 /* Reserved */ +#define EREMDEV 142 /* Error 142 */ +#define ESHUTDOWN 143 /* Cannot send after transport endpoint shutdown */ +#define ETOOMANYREFS 144 /* Too many references: cannot splice */ +#define ETIMEDOUT 145 /* Connection timed out */ +#define ECONNREFUSED 146 /* Connection refused */ +#define EHOSTDOWN 147 /* Host is down */ +#define EHOSTUNREACH 148 /* No route to host */ +#define EWOULDBLOCK EAGAIN /* Operation would block */ +#define EALREADY 149 /* Operation already in progress */ +#define EINPROGRESS 150 /* Operation now in progress */ +#define ESTALE 151 /* Stale NFS file handle */ +#define ECANCELED 158 /* AIO operation canceled */ +#define ENOMEDIUM 159 /* No medium found */ +#define EMEDIUMTYPE 160 /* Wrong medium type */ +#define EDQUOT 1133 /* Quota exceeded */ + +#elif defined(__sparc__) + +#define EPERM 1 /* Operation not permitted */ +#define ENOENT 2 /* No such file or directory */ +#define ESRCH 3 /* No such process */ +#define EINTR 4 /* Interrupted system call */ +#define EIO 5 /* I/O error */ +#define ENXIO 6 /* No such device or address */ +#define E2BIG 7 /* Arg list too long */ +#define ENOEXEC 8 /* Exec format error */ +#define EBADF 9 /* Bad file number */ +#define ECHILD 10 /* No child processes */ +#define EAGAIN 11 /* Try again */ +#define ENOMEM 12 /* Out of memory */ +#define EACCES 13 /* Permission denied */ +#define EFAULT 14 /* Bad address */ +#define ENOTBLK 15 /* Block device required */ +#define EBUSY 16 /* Device or resource busy */ +#define EEXIST 17 /* File exists */ +#define EXDEV 18 /* Cross-device link */ +#define ENODEV 19 /* No such device */ +#define ENOTDIR 20 /* Not a directory */ +#define EISDIR 21 /* Is a directory */ +#define EINVAL 22 /* Invalid argument */ +#define ENFILE 23 /* File table overflow */ +#define EMFILE 24 /* Too many open files */ +#define ENOTTY 25 /* Not a typewriter */ +#define ETXTBSY 26 /* Text file busy */ +#define EFBIG 27 /* File too large */ +#define ENOSPC 28 /* No space left on device */ +#define ESPIPE 29 /* Illegal seek */ +#define EROFS 30 /* Read-only file system */ +#define EMLINK 31 /* Too many links */ +#define EPIPE 32 /* Broken pipe */ +#define EDOM 33 /* Math argument out of domain of func */ +#define ERANGE 34 /* Math result not representable */ +#define EWOULDBLOCK EAGAIN /* Operation would block */ +#define EINPROGRESS 36 /* Operation now in progress */ +#define EALREADY 37 /* Operation already in progress */ +#define ENOTSOCK 38 /* Socket operation on non-socket */ +#define EDESTADDRREQ 39 /* Destination address required */ +#define EMSGSIZE 40 /* Message too long */ +#define EPROTOTYPE 41 /* Protocol wrong type for socket */ +#define ENOPROTOOPT 42 /* Protocol not available */ +#define EPROTONOSUPPORT 43 /* Protocol not supported */ +#define ESOCKTNOSUPPORT 44 /* Socket type not supported */ +#define EOPNOTSUPP 45 /* Op not supported on transport endpoint */ +#define ENOTSUP EOPNOTSUPP/* Operation not supported on transport endpoint */ +#define EPFNOSUPPORT 46 /* Protocol family not supported */ +#define EAFNOSUPPORT 47 /* Address family not supported by protocol */ +#define EADDRINUSE 48 /* Address already in use */ +#define EADDRNOTAVAIL 49 /* Cannot assign requested address */ +#define ENETDOWN 50 /* Network is down */ +#define ENETUNREACH 51 /* Network is unreachable */ +#define ENETRESET 52 /* Net dropped connection because of reset */ +#define ECONNABORTED 53 /* Software caused connection abort */ +#define ECONNRESET 54 /* Connection reset by peer */ +#define ENOBUFS 55 /* No buffer space available */ +#define EISCONN 56 /* Transport endpoint is already connected */ +#define ENOTCONN 57 /* Transport endpoint is not connected */ +#define ESHUTDOWN 58 /* No send after transport endpoint shutdown */ +#define ETOOMANYREFS 59 /* Too many references: cannot splice */ +#define ETIMEDOUT 60 /* Connection timed out */ +#define ECONNREFUSED 61 /* Connection refused */ +#define ELOOP 62 /* Too many symbolic links encountered */ +#define ENAMETOOLONG 63 /* File name too long */ +#define EHOSTDOWN 64 /* Host is down */ +#define EHOSTUNREACH 65 /* No route to host */ +#define ENOTEMPTY 66 /* Directory not empty */ +#define EPROCLIM 67 /* SUNOS: Too many processes */ +#define EUSERS 68 /* Too many users */ +#define EDQUOT 69 /* Quota exceeded */ +#define ESTALE 70 /* Stale NFS file handle */ +#define EREMOTE 71 /* Object is remote */ +#define ENOSTR 72 /* Device not a stream */ +#define ETIME 73 /* Timer expired */ +#define ENOSR 74 /* Out of streams resources */ +#define ENOMSG 75 /* No message of desired type */ +#define EBADMSG 76 /* Not a data message */ +#define EIDRM 77 /* Identifier removed */ +#define EDEADLK 78 /* Resource deadlock would occur */ +#define ENOLCK 79 /* No record locks available */ +#define ENONET 80 /* Machine is not on the network */ +#define ERREMOTE 81 /* SunOS: Too many lvls of remote in path */ +#define ENOLINK 82 /* Link has been severed */ +#define EADV 83 /* Advertise error */ +#define ESRMNT 84 /* Srmount error */ +#define ECOMM 85 /* Communication error on send */ +#define EPROTO 86 /* Protocol error */ +#define EMULTIHOP 87 /* Multihop attempted */ +#define EDOTDOT 88 /* RFS specific error */ +#define EREMCHG 89 /* Remote address changed */ +#define ENOSYS 90 /* Function not implemented */ +#define ESTRPIPE 91 /* Streams pipe error */ +#define EOVERFLOW 92 /* Value too large for defined data type */ +#define EBADFD 93 /* File descriptor in bad state */ +#define ECHRNG 94 /* Channel number out of range */ +#define EL2NSYNC 95 /* Level 2 not synchronized */ +#define EL3HLT 96 /* Level 3 halted */ +#define EL3RST 97 /* Level 3 reset */ +#define ELNRNG 98 /* Link number out of range */ +#define EUNATCH 99 /* Protocol driver not attached */ +#define ENOCSI 100 /* No CSI structure available */ +#define EL2HLT 101 /* Level 2 halted */ +#define EBADE 102 /* Invalid exchange */ +#define EBADR 103 /* Invalid request descriptor */ +#define EXFULL 104 /* Exchange full */ +#define ENOANO 105 /* No anode */ +#define EBADRQC 106 /* Invalid request code */ +#define EBADSLT 107 /* Invalid slot */ +#define EDEADLOCK 108 /* File locking deadlock error */ +#define EBFONT 109 /* Bad font file format */ +#define ELIBEXEC 110 /* Cannot exec a shared library directly */ +#define ENODATA 111 /* No data available */ +#define ELIBBAD 112 /* Accessing a corrupted shared library */ +#define ENOPKG 113 /* Package not installed */ +#define ELIBACC 114 /* Can not access a needed shared library */ +#define ENOTUNIQ 115 /* Name not unique on network */ +#define ERESTART 116 /* Interrupted syscall should be restarted */ +#define EUCLEAN 117 /* Structure needs cleaning */ +#define ENOTNAM 118 /* Not a XENIX named type file */ +#define ENAVAIL 119 /* No XENIX semaphores available */ +#define EISNAM 120 /* Is a named type file */ +#define EREMOTEIO 121 /* Remote I/O error */ +#define EILSEQ 122 /* Illegal byte sequence */ +#define ELIBMAX 123 /* Atmpt to link in too many shared libs */ +#define ELIBSCN 124 /* .lib section in a.out corrupted */ +#define ENOMEDIUM 125 /* No medium found */ +#define EMEDIUMTYPE 126 /* Wrong medium type */ + +#else + +/* i386, arm, ppc, x86_64, ia64 */ + +#define EPERM 1 /* Operation not permitted */ +#define ENOENT 2 /* No such file or directory */ +#define ESRCH 3 /* No such process */ +#define EINTR 4 /* Interrupted system call */ +#define EIO 5 /* I/O error */ +#define ENXIO 6 /* No such device or address */ +#define E2BIG 7 /* Arg list too long */ +#define ENOEXEC 8 /* Exec format error */ +#define EBADF 9 /* Bad file number */ +#define ECHILD 10 /* No child processes */ +#define EAGAIN 11 /* Try again */ +#define ENOMEM 12 /* Out of memory */ +#define EACCES 13 /* Permission denied */ +#define EFAULT 14 /* Bad address */ +#define ENOTBLK 15 /* Block device required */ +#define EBUSY 16 /* Device or resource busy */ +#define EEXIST 17 /* File exists */ +#define EXDEV 18 /* Cross-device link */ +#define ENODEV 19 /* No such device */ +#define ENOTDIR 20 /* Not a directory */ +#define EISDIR 21 /* Is a directory */ +#define EINVAL 22 /* Invalid argument */ +#define ENFILE 23 /* File table overflow */ +#define EMFILE 24 /* Too many open files */ +#define ENOTTY 25 /* Not a typewriter */ +#define ETXTBSY 26 /* Text file busy */ +#define EFBIG 27 /* File too large */ +#define ENOSPC 28 /* No space left on device */ +#define ESPIPE 29 /* Illegal seek */ +#define EROFS 30 /* Read-only file system */ +#define EMLINK 31 /* Too many links */ +#define EPIPE 32 /* Broken pipe */ +#define EDOM 33 /* Math argument out of domain of func */ +#define ERANGE 34 /* Math result not representable */ +#define EDEADLK 35 /* Resource deadlock would occur */ +#define ENAMETOOLONG 36 /* File name too long */ +#define ENOLCK 37 /* No record locks available */ +#define ENOSYS 38 /* Function not implemented */ +#define ENOTEMPTY 39 /* Directory not empty */ +#define ELOOP 40 /* Too many symbolic links encountered */ +#define EWOULDBLOCK EAGAIN /* Operation would block */ +#define ENOMSG 42 /* No message of desired type */ +#define EIDRM 43 /* Identifier removed */ +#define ECHRNG 44 /* Channel number out of range */ +#define EL2NSYNC 45 /* Level 2 not synchronized */ +#define EL3HLT 46 /* Level 3 halted */ +#define EL3RST 47 /* Level 3 reset */ +#define ELNRNG 48 /* Link number out of range */ +#define EUNATCH 49 /* Protocol driver not attached */ +#define ENOCSI 50 /* No CSI structure available */ +#define EL2HLT 51 /* Level 2 halted */ +#define EBADE 52 /* Invalid exchange */ +#define EBADR 53 /* Invalid request descriptor */ +#define EXFULL 54 /* Exchange full */ +#define ENOANO 55 /* No anode */ +#define EBADRQC 56 /* Invalid request code */ +#define EBADSLT 57 /* Invalid slot */ +#define EDEADLOCK EDEADLK +#define EBFONT 59 /* Bad font file format */ +#define ENOSTR 60 /* Device not a stream */ +#define ENODATA 61 /* No data available */ +#define ETIME 62 /* Timer expired */ +#define ENOSR 63 /* Out of streams resources */ +#define ENONET 64 /* Machine is not on the network */ +#define ENOPKG 65 /* Package not installed */ +#define EREMOTE 66 /* Object is remote */ +#define ENOLINK 67 /* Link has been severed */ +#define EADV 68 /* Advertise error */ +#define ESRMNT 69 /* Srmount error */ +#define ECOMM 70 /* Communication error on send */ +#define EPROTO 71 /* Protocol error */ +#define EMULTIHOP 72 /* Multihop attempted */ +#define EDOTDOT 73 /* RFS specific error */ +#define EBADMSG 74 /* Not a data message */ +#define EOVERFLOW 75 /* Value too large for defined data type */ +#define ENOTUNIQ 76 /* Name not unique on network */ +#define EBADFD 77 /* File descriptor in bad state */ +#define EREMCHG 78 /* Remote address changed */ +#define ELIBACC 79 /* Can not access a needed shared library */ +#define ELIBBAD 80 /* Accessing a corrupted shared library */ +#define ELIBSCN 81 /* .lib section in a.out corrupted */ +#define ELIBMAX 82 /* Attempting to link in too many shared libraries */ +#define ELIBEXEC 83 /* Cannot exec a shared library directly */ +#define EILSEQ 84 /* Illegal byte sequence */ +#define ERESTART 85 /* Interrupted system call should be restarted */ +#define ESTRPIPE 86 /* Streams pipe error */ +#define EUSERS 87 /* Too many users */ +#define ENOTSOCK 88 /* Socket operation on non-socket */ +#define EDESTADDRREQ 89 /* Destination address required */ +#define EMSGSIZE 90 /* Message too long */ +#define EPROTOTYPE 91 /* Protocol wrong type for socket */ +#define ENOPROTOOPT 92 /* Protocol not available */ +#define EPROTONOSUPPORT 93 /* Protocol not supported */ +#define ESOCKTNOSUPPORT 94 /* Socket type not supported */ +#define EOPNOTSUPP 95 /* Operation not supported on transport endpoint */ +#define ENOTSUP EOPNOTSUPP/* Operation not supported on transport endpoint */ +#define EPFNOSUPPORT 96 /* Protocol family not supported */ +#define EAFNOSUPPORT 97 /* Address family not supported by protocol */ +#define EADDRINUSE 98 /* Address already in use */ +#define EADDRNOTAVAIL 99 /* Cannot assign requested address */ +#define ENETDOWN 100 /* Network is down */ +#define ENETUNREACH 101 /* Network is unreachable */ +#define ENETRESET 102 /* Network dropped connection because of reset */ +#define ECONNABORTED 103 /* Software caused connection abort */ +#define ECONNRESET 104 /* Connection reset by peer */ +#define ENOBUFS 105 /* No buffer space available */ +#define EISCONN 106 /* Transport endpoint is already connected */ +#define ENOTCONN 107 /* Transport endpoint is not connected */ +#define ESHUTDOWN 108 /* Cannot send after transport endpoint shutdown */ +#define ETOOMANYREFS 109 /* Too many references: cannot splice */ +#define ETIMEDOUT 110 /* Connection timed out */ +#define ECONNREFUSED 111 /* Connection refused */ +#define EHOSTDOWN 112 /* Host is down */ +#define EHOSTUNREACH 113 /* No route to host */ +#define EALREADY 114 /* Operation already in progress */ +#define EINPROGRESS 115 /* Operation now in progress */ +#define ESTALE 116 /* Stale NFS file handle */ +#define EUCLEAN 117 /* Structure needs cleaning */ +#define ENOTNAM 118 /* Not a XENIX named type file */ +#define ENAVAIL 119 /* No XENIX semaphores available */ +#define EISNAM 120 /* Is a named type file */ +#define EREMOTEIO 121 /* Remote I/O error */ +#define EDQUOT 122 /* Quota exceeded */ +#define ENOMEDIUM 123 /* No medium found */ +#define EMEDIUMTYPE 124 /* Wrong medium type */ +#endif -#include <linux/errno.h> +#define __SYS_NERR ((EMEDIUMTYPE) + 1) + +#ifndef __ASSEMBLER__ + +#ifndef _REENTRANT +extern int errno; +#else +#define errno (*__errno_location()) +#endif extern int *__errno_location(void); -extern void __set_errno(int error); + +#define __set_errno(x) errno=(x) + +#ifdef _BSD_SOURCE +extern const char *const sys_errlist[]; +extern int sys_nerr; +#endif + +#endif #endif diff --git a/mdk-stage1/dietlibc/include/fcntl.h b/mdk-stage1/dietlibc/include/fcntl.h index b792502c1..33f58d82a 100644 --- a/mdk-stage1/dietlibc/include/fcntl.h +++ b/mdk-stage1/dietlibc/include/fcntl.h @@ -6,13 +6,549 @@ #include <sys/types.h> #include <unistd.h> -#include <asm/fcntl.h> +#define F_LINUX_SPECIFIC_BASE 1024 + +#if defined(__i386__) || defined(__s390__) || defined(__x86_64__) || defined(__ia64__) + +/* open/fcntl - O_SYNC is only implemented on blocks devices and on files + located on an ext2 file system */ +#define O_ACCMODE 0003 +#define O_RDONLY 00 +#define O_WRONLY 01 +#define O_RDWR 02 +#define O_CREAT 0100 /* not fcntl */ +#define O_EXCL 0200 /* not fcntl */ +#define O_NOCTTY 0400 /* not fcntl */ +#define O_TRUNC 01000 /* not fcntl */ +#define O_APPEND 02000 +#define O_NONBLOCK 04000 +#define O_NDELAY O_NONBLOCK +#define O_SYNC 010000 +#define FASYNC 020000 /* fcntl, for BSD compatibility */ +#define O_DIRECT 040000 /* direct disk access hint - currently ignored */ +#define O_LARGEFILE 0100000 +#define O_DIRECTORY 0200000 /* must be a directory */ +#define O_NOFOLLOW 0400000 /* don't follow links */ + +#define F_DUPFD 0 /* dup */ +#define F_GETFD 1 /* get close_on_exec */ +#define F_SETFD 2 /* set/clear close_on_exec */ +#define F_GETFL 3 /* get file->f_flags */ +#define F_SETFL 4 /* set file->f_flags */ +#define F_GETLK 5 +#define F_SETLK 6 +#define F_SETLKW 7 +#define F_SETOWN 8 /* for sockets. */ +#define F_GETOWN 9 /* for sockets. */ +#define F_SETSIG 10 /* for sockets. */ +#define F_GETSIG 11 /* for sockets. */ + +#define F_GETLK64 12 /* using 'struct flock64' */ +#define F_SETLK64 13 +#define F_SETLKW64 14 + +#define FD_CLOEXEC 1 /* actually anything with low bit set goes */ + +/* for posix fcntl() and lockf() */ +#define F_RDLCK 0 +#define F_WRLCK 1 +#define F_UNLCK 2 + +/* for old implementation of bsd flock () */ +#define F_EXLCK 4 /* or 3 */ +#define F_SHLCK 8 /* or 4 */ + +/* for leases */ +#define F_INPROGRESS 16 + +/* operations for bsd flock(), also used by the kernel implementation */ +#define LOCK_SH 1 /* shared lock */ +#define LOCK_EX 2 /* exclusive lock */ +#define LOCK_NB 4 /* or'd with one of the above to prevent + blocking */ +#define LOCK_UN 8 /* remove lock */ + +#define LOCK_MAND 32 /* This is a mandatory flock */ +#define LOCK_READ 64 /* ... Which allows concurrent read operations */ +#define LOCK_WRITE 128 /* ... Which allows concurrent write operations */ +#define LOCK_RW 192 /* ... Which allows concurrent read & write ops */ + +struct flock { + short l_type; + short l_whence; + off_t l_start; + off_t l_len; + pid_t l_pid; +}; + +struct flock64 { + short l_type; + short l_whence; + loff_t l_start; + loff_t l_len; + pid_t l_pid; +}; + +#elif defined(__alpha__) + +/* open/fcntl - O_SYNC is only implemented on blocks devices and on files + located on an ext2 file system */ +#define O_ACCMODE 0003 +#define O_RDONLY 00 +#define O_WRONLY 01 +#define O_RDWR 02 +#define O_CREAT 01000 /* not fcntl */ +#define O_TRUNC 02000 /* not fcntl */ +#define O_EXCL 04000 /* not fcntl */ +#define O_NOCTTY 010000 /* not fcntl */ + +#define O_NONBLOCK 00004 +#define O_APPEND 00010 +#define O_NDELAY O_NONBLOCK +#define O_SYNC 040000 +#define FASYNC 020000 /* fcntl, for BSD compatibility */ +#define O_DIRECT 040000 /* direct disk access - should check with OSF/1 */ +#define O_DIRECTORY 0100000 /* must be a directory */ +#define O_NOFOLLOW 0200000 /* don't follow links */ +#define O_LARGEFILE 0400000 /* will be set by the kernel on every open */ + +#define F_DUPFD 0 /* dup */ +#define F_GETFD 1 /* get close_on_exec */ +#define F_SETFD 2 /* set/clear close_on_exec */ +#define F_GETFL 3 /* get file->f_flags */ +#define F_SETFL 4 /* set file->f_flags */ +#define F_GETLK 7 +#define F_SETLK 8 +#define F_SETLKW 9 + +#define F_SETOWN 5 /* for sockets. */ +#define F_GETOWN 6 /* for sockets. */ +#define F_SETSIG 10 /* for sockets. */ +#define F_GETSIG 11 /* for sockets. */ + +/* for F_[GET|SET]FL */ +#define FD_CLOEXEC 1 /* actually anything with low bit set goes */ + +/* for posix fcntl() and lockf() */ +#define F_RDLCK 1 +#define F_WRLCK 2 +#define F_UNLCK 8 + +/* for old implementation of bsd flock () */ +#define F_EXLCK 16 /* or 3 */ +#define F_SHLCK 32 /* or 4 */ + +#define F_INPROGRESS 64 + +/* operations for bsd flock(), also used by the kernel implementation */ +#define LOCK_SH 1 /* shared lock */ +#define LOCK_EX 2 /* exclusive lock */ +#define LOCK_NB 4 /* or'd with one of the above to prevent + blocking */ +#define LOCK_UN 8 /* remove lock */ +#define LOCK_MAND 32 /* This is a mandatory flock */ +#define LOCK_READ 64 /* ... Which allows concurrent read operations */ +#define LOCK_WRITE 128 /* ... Which allows concurrent write operations */ +#define LOCK_RW 192 /* ... Which allows concurrent read & write ops */ + +struct flock { + short l_type; + short l_whence; + off_t l_start; + off_t l_len; + pid_t l_pid; +}; + +#elif defined(__mips__) + +/* open/fcntl - O_SYNC is only implemented on blocks devices and on files + located on an ext2 file system */ +#define O_ACCMODE 0x0003 +#define O_RDONLY 0x0000 +#define O_WRONLY 0x0001 +#define O_RDWR 0x0002 +#define O_APPEND 0x0008 +#define O_SYNC 0x0010 +#define O_NONBLOCK 0x0080 +#define O_CREAT 0x0100 /* not fcntl */ +#define O_TRUNC 0x0200 /* not fcntl */ +#define O_EXCL 0x0400 /* not fcntl */ +#define O_NOCTTY 0x0800 /* not fcntl */ +#define FASYNC 0x1000 /* fcntl, for BSD compatibility */ +#define O_LARGEFILE 0x2000 /* allow large file opens - currently ignored */ +#define O_DIRECT 0x8000 /* direct disk access hint - currently ignored */ +#define O_DIRECTORY 0x10000 /* must be a directory */ +#define O_NOFOLLOW 0x20000 /* don't follow links */ + +#define O_NDELAY O_NONBLOCK + +#define F_DUPFD 0 /* dup */ +#define F_GETFD 1 /* get close_on_exec */ +#define F_SETFD 2 /* set/clear close_on_exec */ +#define F_GETFL 3 /* get file->f_flags */ +#define F_SETFL 4 /* set file->f_flags */ +#define F_GETLK 14 +#define F_SETLK 6 +#define F_SETLKW 7 + +#define F_SETOWN 24 /* for sockets. */ +#define F_GETOWN 23 /* for sockets. */ +#define F_SETSIG 10 /* for sockets. */ +#define F_GETSIG 11 /* for sockets. */ + +/* for F_[GET|SET]FL */ +#define FD_CLOEXEC 1 /* actually anything with low bit set goes */ + +/* for posix fcntl() and lockf() */ +#define F_RDLCK 0 +#define F_WRLCK 1 +#define F_UNLCK 2 + +/* for old implementation of bsd flock () */ +#define F_EXLCK 4 /* or 3 */ +#define F_SHLCK 8 /* or 4 */ + +/* for leases */ +#define F_INPROGRESS 16 + +/* operations for bsd flock(), also used by the kernel implementation */ +#define LOCK_SH 1 /* shared lock */ +#define LOCK_EX 2 /* exclusive lock */ +#define LOCK_NB 4 /* or'd with one of the above to prevent XXXXXXXXXXXXXXXXXX + blocking */ +#define LOCK_UN 8 /* remove lock */ + +#define LOCK_MAND 32 /* This is a mandatory flock */ +#define LOCK_READ 64 /* ... Which allows concurrent read operations */ +#define LOCK_WRITE 128 /* ... Which allows concurrent write operations */ +#define LOCK_RW 192 /* ... Which allows concurrent read & write ops */ + +typedef struct flock { + short l_type; + short l_whence; + off_t l_start; + off_t l_len; + long l_sysid; /* XXXXXXXXXXXXXXXXXXXXXXXXX */ + pid_t l_pid; + long pad[4]; /* ZZZZZZZZZZZZZZZZZZZZZZZZZZ */ +} flock_t; + +#elif defined(__sparc__) + +/* open/fcntl - O_SYNC is only implemented on blocks devices and on files + located on an ext2 file system */ +#define O_RDONLY 0x0000 +#define O_WRONLY 0x0001 +#define O_RDWR 0x0002 +#define O_ACCMODE 0x0003 +#define O_APPEND 0x0008 +#define FASYNC 0x0040 /* fcntl, for BSD compatibility */ +#define O_CREAT 0x0200 /* not fcntl */ +#define O_TRUNC 0x0400 /* not fcntl */ +#define O_EXCL 0x0800 /* not fcntl */ +#define O_SYNC 0x2000 +#define O_NONBLOCK 0x4000 +#define O_NDELAY (0x0004 | O_NONBLOCK) +#define O_NOCTTY 0x8000 /* not fcntl */ +#define O_DIRECTORY 0x10000 /* must be a directory */ +#define O_NOFOLLOW 0x20000 /* don't follow links */ +#define O_LARGEFILE 0x40000 + +#define F_DUPFD 0 /* dup */ +#define F_GETFD 1 /* get close_on_exec */ +#define F_SETFD 2 /* set/clear close_on_exec */ +#define F_GETFL 3 /* get file->f_flags */ +#define F_SETFL 4 /* set file->f_flags */ +#define F_GETOWN 5 /* for sockets. */ +#define F_SETOWN 6 /* for sockets. */ +#define F_GETLK 7 +#define F_SETLK 8 +#define F_SETLKW 9 +#define F_SETSIG 10 /* for sockets. */ +#define F_GETSIG 11 /* for sockets. */ + +#define F_GETLK64 12 /* using 'struct flock64' */ +#define F_SETLK64 13 +#define F_SETLKW64 14 + +/* for F_[GET|SET]FL */ +#define FD_CLOEXEC 1 /* actually anything with low bit set goes */ + +/* for posix fcntl() and lockf() */ +#define F_RDLCK 1 +#define F_WRLCK 2 +#define F_UNLCK 3 + +/* for old implementation of bsd flock () */ +#define F_EXLCK 4 /* or 3 */ +#define F_SHLCK 8 /* or 4 */ + +/* for leases */ +#define F_INPROGRESS 16 + +/* operations for bsd flock(), also used by the kernel implementation */ +#define LOCK_SH 1 /* shared lock */ +#define LOCK_EX 2 /* exclusive lock */ +#define LOCK_NB 4 /* or'd with one of the above to prevent + blocking */ +#define LOCK_UN 8 /* remove lock */ + +#define LOCK_MAND 32 /* This is a mandatory flock */ +#define LOCK_READ 64 /* ... Which allows concurrent read operations */ +#define LOCK_WRITE 128 /* ... Which allows concurrent write operations */ +#define LOCK_RW 192 /* ... Which allows concurrent read & write ops */ + +struct flock { + short l_type; + short l_whence; + off_t l_start; + off_t l_len; + pid_t l_pid; + short __unused; +}; + +#ifdef __arch64__ +#define flock64 flock +#else +struct flock64 { + short l_type; + short l_whence; + loff_t l_start; + loff_t l_len; + pid_t l_pid; + short __unused; +}; +#endif + +#elif defined(__powerpc__) + +/* open/fcntl - O_SYNC is only implemented on blocks devices and on files + located on an ext2 file system */ +#define O_ACCMODE 0003 +#define O_RDONLY 00 +#define O_WRONLY 01 +#define O_RDWR 02 +#define O_CREAT 0100 /* not fcntl */ +#define O_EXCL 0200 /* not fcntl */ +#define O_NOCTTY 0400 /* not fcntl */ +#define O_TRUNC 01000 /* not fcntl */ +#define O_APPEND 02000 +#define O_NONBLOCK 04000 +#define O_NDELAY O_NONBLOCK +#define O_SYNC 010000 +#define FASYNC 020000 /* fcntl, for BSD compatibility */ +#define O_DIRECTORY 040000 /* must be a directory */ +#define O_NOFOLLOW 0100000 /* don't follow links */ +#define O_LARGEFILE 0200000 +#define O_DIRECT 0400000 /* direct disk access hint - currently ignored */ + +#define F_DUPFD 0 /* dup */ +#define F_GETFD 1 /* get close_on_exec */ +#define F_SETFD 2 /* set/clear close_on_exec */ +#define F_GETFL 3 /* get file->f_flags */ +#define F_SETFL 4 /* set file->f_flags */ +#define F_GETLK 5 +#define F_SETLK 6 +#define F_SETLKW 7 + +#define F_SETOWN 8 /* for sockets. */ +#define F_GETOWN 9 /* for sockets. */ +#define F_SETSIG 10 /* for sockets. */ +#define F_GETSIG 11 /* for sockets. */ + +#define F_GETLK64 12 /* using 'struct flock64' */ +#define F_SETLK64 13 +#define F_SETLKW64 14 + +/* for F_[GET|SET]FL */ +#define FD_CLOEXEC 1 /* actually anything with low bit set goes */ + +/* for posix fcntl() and lockf() */ +#define F_RDLCK 0 +#define F_WRLCK 1 +#define F_UNLCK 2 + +/* for old implementation of bsd flock () */ +#define F_EXLCK 4 /* or 3 */ +#define F_SHLCK 8 /* or 4 */ + +/* for leases */ +#define F_INPROGRESS 16 + +/* operations for bsd flock(), also used by the kernel implementation */ +#define LOCK_SH 1 /* shared lock */ +#define LOCK_EX 2 /* exclusive lock */ +#define LOCK_NB 4 /* or'd with one of the above to prevent + blocking */ +#define LOCK_UN 8 /* remove lock */ + +#define LOCK_MAND 32 /* This is a mandatory flock */ +#define LOCK_READ 64 /* ... Which allows concurrent read operations */ +#define LOCK_WRITE 128 /* ... Which allows concurrent write operations */ +#define LOCK_RW 192 /* ... Which allows concurrent read & write ops */ + +struct flock { + short l_type; + short l_whence; + off_t l_start; + off_t l_len; + pid_t l_pid; +}; + +struct flock64 { + short l_type; + short l_whence; + loff_t l_start; + loff_t l_len; + pid_t l_pid; +}; + +#elif defined (__arm__) + +/* open/fcntl - O_SYNC is only implemented on blocks devices and on files + located on an ext2 file system */ +#define O_ACCMODE 0003 +#define O_RDONLY 00 +#define O_WRONLY 01 +#define O_RDWR 02 +#define O_CREAT 0100 /* not fcntl */ +#define O_EXCL 0200 /* not fcntl */ +#define O_NOCTTY 0400 /* not fcntl */ +#define O_TRUNC 01000 /* not fcntl */ +#define O_APPEND 02000 +#define O_NONBLOCK 04000 +#define O_NDELAY O_NONBLOCK +#define O_SYNC 010000 +#define FASYNC 020000 /* fcntl, for BSD compatibility */ +#define O_DIRECTORY 040000 /* must be a directory */ +#define O_NOFOLLOW 0100000 /* don't follow links */ +#define O_DIRECT 0200000 /* direct disk access hint - currently ignored */ +#define O_LARGEFILE 0400000 + +#define F_DUPFD 0 /* dup */ +#define F_GETFD 1 /* get close_on_exec */ +#define F_SETFD 2 /* set/clear close_on_exec */ +#define F_GETFL 3 /* get file->f_flags */ +#define F_SETFL 4 /* set file->f_flags */ +#define F_GETLK 5 +#define F_SETLK 6 +#define F_SETLKW 7 + +#define F_SETOWN 8 /* for sockets. */ +#define F_GETOWN 9 /* for sockets. */ +#define F_SETSIG 10 /* for sockets. */ +#define F_GETSIG 11 /* for sockets. */ + +#define F_GETLK64 12 /* using 'struct flock64' */ +#define F_SETLK64 13 +#define F_SETLKW64 14 + +/* for F_[GET|SET]FL */ +#define FD_CLOEXEC 1 /* actually anything with low bit set goes */ + +/* for posix fcntl() and lockf() */ +#define F_RDLCK 0 +#define F_WRLCK 1 +#define F_UNLCK 2 + +/* for old implementation of bsd flock () */ +#define F_EXLCK 4 /* or 3 */ +#define F_SHLCK 8 /* or 4 */ + +/* for leases */ +#define F_INPROGRESS 16 + +/* operations for bsd flock(), also used by the kernel implementation */ +#define LOCK_SH 1 /* shared lock */ +#define LOCK_EX 2 /* exclusive lock */ +#define LOCK_NB 4 /* or'd with one of the above to prevent + blocking */ +#define LOCK_UN 8 /* remove lock */ + +#define LOCK_MAND 32 /* This is a mandatory flock */ +#define LOCK_READ 64 /* ... Which allows concurrent read operations */ +#define LOCK_WRITE 128 /* ... Which allows concurrent write operations */ +#define LOCK_RW 192 /* ... Which allows concurrent read & write ops */ + +struct flock { + short l_type; + short l_whence; + off_t l_start; + off_t l_len; + pid_t l_pid; +}; + +struct flock64 { + short l_type; + short l_whence; + loff_t l_start; + loff_t l_len; + pid_t l_pid; +}; + +#elif defined(__hppa__) + +/* Copied from bits/fcntl.h */ + +#define O_RDONLY 00000000 +#define O_WRONLY 00000001 +#define O_RDWR 00000002 +#define O_ACCMODE 00000003 +#define O_APPEND 00000010 +#define O_BLKSEEK 00000100 /* HPUX only */ +#define O_CREAT 00000400 /* not fcntl */ +#define O_TRUNC 00001000 /* not fcntl */ +#define O_EXCL 00002000 /* not fcntl */ +#define O_ASYNC 00020000 +#define O_SYNC 00100000 +#define O_NONBLOCK 00200004 /* HPUX has separate NDELAY & NONBLOCK */ +#define O_NDELAY O_NONBLOCK +#define O_NOCTTY 00400000 /* not fcntl */ +#define O_DIRECTORY 00010000 + +#define F_DUPFD 0 /* Duplicate file descriptor. */ +#define F_GETFD 1 /* Get file descriptor flags. */ +#define F_SETFD 2 /* Set file descriptor flags. */ +#define F_GETFL 3 /* Get file status flags. */ +#define F_SETFL 4 /* Set file status flags. */ +#define F_GETLK 5 /* Get record locking info. */ +#define F_SETLK 6 /* Set record locking info (non-blocking). */ +#define F_SETLKW 7 /* Set record locking info (blocking). */ + +#define F_GETLK64 8 /* Get record locking info. */ +#define F_SETLK64 9 /* Set record locking info (non-blocking). */ +#define F_SETLKW64 10 /* Set record locking info (blocking). */ + +#define FD_CLOEXEC 1 /* actually anything with low bit set goes */ + +#define F_RDLCK 1 /* Read lock. */ +#define F_WRLCK 2 /* Write lock. */ +#define F_UNLCK 3 /* Remove lock. */ + +#define F_EXLCK 4 /* or 3 */ +#define F_SHLCK 8 /* or 4 */ + +struct flock +{ + short int l_type; /* Type of lock: F_RDLCK, F_WRLCK, or F_UNLCK. */ + short int l_whence; /* Where `l_start' is relative to (like `lseek'). */ + off_t l_start; /* Offset where the lock begins. */ + off_t l_len; /* Size of the locked area; zero means until EOF. */ + pid_t l_pid; /* Process holding the lock. */ +}; + +struct flock64 +{ + short int l_type; /* Type of lock: F_RDLCK, F_WRLCK, or F_UNLCK. */ + short int l_whence; /* Where `l_start' is relative to (like `lseek'). */ + off64_t l_start; /* Offset where the lock begins. */ + off64_t l_len; /* Size of the locked area; zero means until EOF. */ + pid_t l_pid; /* Process holding the lock. */ +}; + +#endif 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; @@ -21,4 +557,8 @@ extern int lockf64 (int __fd, int __cmd, off64_t __len) __THROW; #define F_TLOCK 2 /* Test and lock a region for exclusive use. */ #define F_TEST 3 /* Test a region for other processes locks. */ +#if !defined(O_ASYNC) && defined(FASYNC) +#define O_ASYNC FASYNC +#endif + #endif diff --git a/mdk-stage1/dietlibc/include/features.h b/mdk-stage1/dietlibc/include/features.h index 5b0283f20..d2b92d15c 100644 --- a/mdk-stage1/dietlibc/include/features.h +++ b/mdk-stage1/dietlibc/include/features.h @@ -1,3 +1,8 @@ -#warning "someone included features.h, apparently someone is including glibc headers!" +#ifndef _FEATURES_H +#define _FEATURES_H -#define __dietlibc__ +#ifndef __dietlibc__ +#error "not using the diet wrapper?!" +#endif + +#endif diff --git a/mdk-stage1/dietlibc/include/fnmatch.h b/mdk-stage1/dietlibc/include/fnmatch.h index 762b43ff7..146e700bd 100644 --- a/mdk-stage1/dietlibc/include/fnmatch.h +++ b/mdk-stage1/dietlibc/include/fnmatch.h @@ -12,4 +12,6 @@ int fnmatch(const char *pattern, const char *string, int flags) __THROW; #define FNM_LEADING_DIR 8 #define FNM_CASEFOLD 16 +#define FNM_NOMATCH 1 + #endif diff --git a/mdk-stage1/dietlibc/include/ftw.h b/mdk-stage1/dietlibc/include/ftw.h index c888f0021..e0450518e 100644 --- a/mdk-stage1/dietlibc/include/ftw.h +++ b/mdk-stage1/dietlibc/include/ftw.h @@ -32,19 +32,19 @@ enum # define FTW_SLN FTW_SLN }; -typedef int (*__ftw_func_t) (__const char *__filename, - __const struct stat *__status, int __flag) __THROW; +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, +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 (*__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, +typedef int (*__nftw64_func_t) (const char *__filename, + const struct stat64 *__status, int __flag, struct FTW *__info) __THROW; #endif diff --git a/mdk-stage1/dietlibc/include/getopt.h b/mdk-stage1/dietlibc/include/getopt.h index ebfc5522d..db1592c52 100644 --- a/mdk-stage1/dietlibc/include/getopt.h +++ b/mdk-stage1/dietlibc/include/getopt.h @@ -1,12 +1,8 @@ #ifndef __GETOPT_H__ #define __GETOPT_H__ -extern int optind,opterr; -extern char *optarg; -int getopt(int argc, char *argv[], char *options); +#include <unistd.h> -/* the following was taken from GNU getopt, it's not actually supported - * by the diet libc! */ extern int optopt; struct option { diff --git a/mdk-stage1/dietlibc/include/glob.h b/mdk-stage1/dietlibc/include/glob.h index 80febbccf..bc8f779c9 100644 --- a/mdk-stage1/dietlibc/include/glob.h +++ b/mdk-stage1/dietlibc/include/glob.h @@ -1,6 +1,8 @@ #ifndef _GLOB_H #define _GLOB_H +#include <sys/cdefs.h> +#include <sys/types.h> typedef struct { size_t gl_pathc; /* Count of paths matched so far */ diff --git a/mdk-stage1/dietlibc/include/grp.h b/mdk-stage1/dietlibc/include/grp.h index 32bf49afc..08b153137 100644 --- a/mdk-stage1/dietlibc/include/grp.h +++ b/mdk-stage1/dietlibc/include/grp.h @@ -19,7 +19,17 @@ extern struct group *getgrent(void) __THROW; extern void setgrent(void) __THROW; extern void endgrent(void) __THROW; +int getgrent_r(struct group *res, char *buf, size_t buflen, + struct group **res_sig) __THROW; +int getgrnam_r(const char* name, + struct group *res, char *buf, size_t buflen, + struct group **res_sig) __THROW; +int getgrgid_r(uid_t uid, + struct group *res, char *buf, size_t buflen, + struct group **res_sig) __THROW; + extern int setgroups(size_t n, const gid_t *groups) __THROW; +extern int setgroups32(size_t n, const gid32_t *groups) __THROW; extern int initgroups(const char *user, gid_t group) __THROW; #endif diff --git a/mdk-stage1/dietlibc/include/inttypes.h b/mdk-stage1/dietlibc/include/inttypes.h index e69de29bb..32637f5f7 100644 --- a/mdk-stage1/dietlibc/include/inttypes.h +++ b/mdk-stage1/dietlibc/include/inttypes.h @@ -0,0 +1,247 @@ +#ifndef _INTTYPES_H +#define _INTTYPES_H + +#include <sys/cdefs.h> +#include <endian.h> + +# if __WORDSIZE == 64 +# define __PRI64_PREFIX "l" +# define __PRIPTR_PREFIX "l" +# else +# define __PRI64_PREFIX "ll" +# define __PRIPTR_PREFIX +# endif + +/* Macros for printing format specifiers. */ + +/* Decimal notation. */ +# define PRId8 "d" +# define PRId16 "d" +# define PRId32 "d" +# define PRId64 __PRI64_PREFIX "d" + +# define PRIdLEAST8 "d" +# define PRIdLEAST16 "d" +# define PRIdLEAST32 "d" +# define PRIdLEAST64 __PRI64_PREFIX "d" + +# define PRIdFAST8 "d" +# define PRIdFAST16 "d" +# define PRIdFAST32 "d" +# define PRIdFAST64 __PRI64_PREFIX "d" + + +# define PRIi8 "i" +# define PRIi16 "i" +# define PRIi32 "i" +# define PRIi64 __PRI64_PREFIX "i" + +# define PRIiLEAST8 "i" +# define PRIiLEAST16 "i" +# define PRIiLEAST32 "i" +# define PRIiLEAST64 __PRI64_PREFIX "i" + +# define PRIiFAST8 "i" +# define PRIiFAST16 "i" +# define PRIiFAST32 "i" +# define PRIiFAST64 __PRI64_PREFIX "i" + +/* Octal notation. */ +# define PRIo8 "o" +# define PRIo16 "o" +# define PRIo32 "o" +# define PRIo64 __PRI64_PREFIX "o" + +# define PRIoLEAST8 "o" +# define PRIoLEAST16 "o" +# define PRIoLEAST32 "o" +# define PRIoLEAST64 __PRI64_PREFIX "o" + +# define PRIoFAST8 "o" +# define PRIoFAST16 "o" +# define PRIoFAST32 "o" +# define PRIoFAST64 __PRI64_PREFIX "o" + +/* Unsigned integers. */ +# define PRIu8 "u" +# define PRIu16 "u" +# define PRIu32 "u" +# define PRIu64 __PRI64_PREFIX "u" + +# define PRIuLEAST8 "u" +# define PRIuLEAST16 "u" +# define PRIuLEAST32 "u" +# define PRIuLEAST64 __PRI64_PREFIX "u" + +# define PRIuFAST8 "u" +# define PRIuFAST16 "u" +# define PRIuFAST32 "u" +# define PRIuFAST64 __PRI64_PREFIX "u" + +/* lowercase hexadecimal notation. */ +# define PRIx8 "x" +# define PRIx16 "x" +# define PRIx32 "x" +# define PRIx64 __PRI64_PREFIX "x" + +# define PRIxLEAST8 "x" +# define PRIxLEAST16 "x" +# define PRIxLEAST32 "x" +# define PRIxLEAST64 __PRI64_PREFIX "x" + +# define PRIxFAST8 "x" +# define PRIxFAST16 "x" +# define PRIxFAST32 "x" +# define PRIxFAST64 __PRI64_PREFIX "x" + +/* UPPERCASE hexadecimal notation. */ +# define PRIX8 "X" +# define PRIX16 "X" +# define PRIX32 "X" +# define PRIX64 __PRI64_PREFIX "X" + +# define PRIXLEAST8 "X" +# define PRIXLEAST16 "X" +# define PRIXLEAST32 "X" +# define PRIXLEAST64 __PRI64_PREFIX "X" + +# define PRIXFAST8 "X" +# define PRIXFAST16 "X" +# define PRIXFAST32 "X" +# define PRIXFAST64 __PRI64_PREFIX "X" + + +/* Macros for printing `intmax_t' and `uintmax_t'. */ +# define PRIdMAX __PRI64_PREFIX "d" +# define PRIiMAX __PRI64_PREFIX "i" +# define PRIoMAX __PRI64_PREFIX "o" +# define PRIuMAX __PRI64_PREFIX "u" +# define PRIxMAX __PRI64_PREFIX "x" +# define PRIXMAX __PRI64_PREFIX "X" + + +/* Macros for printing `intptr_t' and `uintptr_t'. */ +# define PRIdPTR __PRIPTR_PREFIX "d" +# define PRIiPTR __PRIPTR_PREFIX "i" +# define PRIoPTR __PRIPTR_PREFIX "o" +# define PRIuPTR __PRIPTR_PREFIX "u" +# define PRIxPTR __PRIPTR_PREFIX "x" +# define PRIXPTR __PRIPTR_PREFIX "X" + + +/* Macros for scanning format specifiers. */ + +/* Signed decimal notation. */ +# define SCNd8 "hhd" +# define SCNd16 "hd" +# define SCNd32 "d" +# define SCNd64 __PRI64_PREFIX "d" + +# define SCNdLEAST8 "hhd" +# define SCNdLEAST16 "hd" +# define SCNdLEAST32 "d" +# define SCNdLEAST64 __PRI64_PREFIX "d" + +# define SCNdFAST8 "hhd" +# define SCNdFAST16 __PRIPTR_PREFIX "d" +# define SCNdFAST32 __PRIPTR_PREFIX "d" +# define SCNdFAST64 __PRI64_PREFIX "d" + +/* Signed decimal notation. */ +# define SCNi8 "hhi" +# define SCNi16 "hi" +# define SCNi32 "i" +# define SCNi64 __PRI64_PREFIX "i" + +# define SCNiLEAST8 "hhi" +# define SCNiLEAST16 "hi" +# define SCNiLEAST32 "i" +# define SCNiLEAST64 __PRI64_PREFIX "i" + +# define SCNiFAST8 "hhi" +# define SCNiFAST16 __PRIPTR_PREFIX "i" +# define SCNiFAST32 __PRIPTR_PREFIX "i" +# define SCNiFAST64 __PRI64_PREFIX "i" + +/* Unsigned decimal notation. */ +# define SCNu8 "hhu" +# define SCNu16 "hu" +# define SCNu32 "u" +# define SCNu64 __PRI64_PREFIX "u" + +# define SCNuLEAST8 "hhu" +# define SCNuLEAST16 "hu" +# define SCNuLEAST32 "u" +# define SCNuLEAST64 __PRI64_PREFIX "u" + +# define SCNuFAST8 "hhu" +# define SCNuFAST16 __PRIPTR_PREFIX "u" +# define SCNuFAST32 __PRIPTR_PREFIX "u" +# define SCNuFAST64 __PRI64_PREFIX "u" + +/* Octal notation. */ +# define SCNo8 "hho" +# define SCNo16 "ho" +# define SCNo32 "o" +# define SCNo64 __PRI64_PREFIX "o" + +# define SCNoLEAST8 "hho" +# define SCNoLEAST16 "ho" +# define SCNoLEAST32 "o" +# define SCNoLEAST64 __PRI64_PREFIX "o" + +# define SCNoFAST8 "hho" +# define SCNoFAST16 __PRIPTR_PREFIX "o" +# define SCNoFAST32 __PRIPTR_PREFIX "o" +# define SCNoFAST64 __PRI64_PREFIX "o" + +/* Hexadecimal notation. */ +# define SCNx8 "hhx" +# define SCNx16 "hx" +# define SCNx32 "x" +# define SCNx64 __PRI64_PREFIX "x" + +# define SCNxLEAST8 "hhx" +# define SCNxLEAST16 "hx" +# define SCNxLEAST32 "x" +# define SCNxLEAST64 __PRI64_PREFIX "x" + +# define SCNxFAST8 "hhx" +# define SCNxFAST16 __PRIPTR_PREFIX "x" +# define SCNxFAST32 __PRIPTR_PREFIX "x" +# define SCNxFAST64 __PRI64_PREFIX "x" + + +/* Macros for scanning `intmax_t' and `uintmax_t'. */ +# define SCNdMAX __PRI64_PREFIX "d" +# define SCNiMAX __PRI64_PREFIX "i" +# define SCNoMAX __PRI64_PREFIX "o" +# define SCNuMAX __PRI64_PREFIX "u" +# define SCNxMAX __PRI64_PREFIX "x" + +/* Macros for scanning `intptr_t' and `uintptr_t'. */ +# define SCNdPTR __PRIPTR_PREFIX "d" +# define SCNiPTR __PRIPTR_PREFIX "i" +# define SCNoPTR __PRIPTR_PREFIX "o" +# define SCNuPTR __PRIPTR_PREFIX "u" +# define SCNxPTR __PRIPTR_PREFIX "x" + +typedef signed char int8_t; +typedef signed short int16_t; +typedef signed int int32_t; + +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef unsigned int uint32_t; + +typedef signed long int intptr_t; +typedef unsigned long int uintptr_t; + +#ifndef __STRICT_ANSI__ +__extension__ typedef signed long long int64_t; +__extension__ typedef unsigned long long uint64_t; +__extension__ typedef signed long long int intmax_t; +__extension__ typedef unsigned long long int uintmax_t; +#endif + +#endif diff --git a/mdk-stage1/dietlibc/include/limits.h b/mdk-stage1/dietlibc/include/limits.h index a333debfd..b5577a0bf 100644 --- a/mdk-stage1/dietlibc/include/limits.h +++ b/mdk-stage1/dietlibc/include/limits.h @@ -1,18 +1,7 @@ #ifndef _LIMITS_H #define _LIMITS_H -#include <linux/limits.h> - -#define __WORDSIZE 32 - -#ifdef __alpha__ -#undef __WORDSIZE -#define __WORDSIZE 64 -#endif - -#ifndef PATH_MAX -#define PATH_MAX 4096 -#endif +#include <endian.h> #define CHAR_BIT 8 @@ -20,6 +9,18 @@ #define SCHAR_MAX 0x7f #define UCHAR_MAX 0xff +#ifdef __CHAR_UNSIGNED__ +#undef CHAR_MIN +#define CHAR_MIN 0 +#undef CHAR_MAX +#define CHAR_MAX UCHAR_MAX +#else +#undef CHAR_MIN +#define CHAR_MIN SCHAR_MIN +#undef CHAR_MAX +#define CHAR_MAX SCHAR_MAX +#endif + #define SHRT_MIN (-SHRT_MAX-1) #define SHRT_MAX 0x7fff #define USHRT_MAX 0xffff @@ -43,6 +44,30 @@ /* Maximum value an `unsigned long long int' can hold. (Minimum is 0.) */ #define ULLONG_MAX 18446744073709551615ULL -#define PASS_MAX 256 +#define SSIZE_MIN LONG_MIN +#define SSIZE_MAX LONG_MAX + +#define PASS_MAX 256 + +#define NR_OPEN 1024 + +#define NGROUPS_MAX 32 /* supplemental group IDs are available */ +#define ARG_MAX 131072 /* # bytes of args + environ for exec() */ +#define CHILD_MAX 999 /* no limit :-) */ +#define OPEN_MAX 256 /* # open files a process may have */ +#define LINK_MAX 127 /* # links a file may have */ +#define MAX_CANON 255 /* size of the canonical input queue */ +#define MAX_INPUT 255 /* size of the type-ahead buffer */ +#define NAME_MAX 255 /* # chars in a file name */ +#define PATH_MAX 4095 /* # chars in a path name */ +#define PIPE_BUF 4096 /* # bytes in atomic write to a pipe */ + +#define RTSIG_MAX 32 + +#define LINE_MAX 2048 + +/* mutt demanded these */ +#define _POSIX_PATH_MAX PATH_MAX +#define MB_LEN_MAX 16 #endif diff --git a/mdk-stage1/dietlibc/include/locale.h b/mdk-stage1/dietlibc/include/locale.h index acbeec8c1..5cd002019 100644 --- a/mdk-stage1/dietlibc/include/locale.h +++ b/mdk-stage1/dietlibc/include/locale.h @@ -1,6 +1,84 @@ -#warning "there is no locale support for diet libc yet" +#ifndef _LOCALE_H +#define _LOCALE_H -#define setlocale(a,b) 0 -#define bindtextdomain -#define textdomain +#include <sys/cdefs.h> +enum { + LC_CTYPE = 0, + LC_NUMERIC = 1, + LC_TIME = 2, + LC_COLLATE = 3, + LC_MONETARY = 4, + LC_MESSAGES = 5, + LC_ALL = 6, + LC_PAPER = 7, + LC_NAME = 8, + LC_ADDRESS = 9, + LC_TELEPHONE = 10, + LC_MEASUREMENT = 11, + LC_IDENTIFICATION = 12 +}; + +/* Structure giving information about numeric and monetary notation. */ +struct lconv { + /* Numeric (non-monetary) information. */ + char *decimal_point; + char *thousands_sep; + /* Each element is the number of digits in each group; + elements with higher indices are farther left. + An element with value CHAR_MAX means that no further grouping is done. + An element with value 0 means that the previous element is used + for all groups farther left. */ + char *grouping; + + /* Monetary information. */ + + /* First three chars are a currency symbol from ISO 4217. + Fourth char is the separator. Fifth char is '\0'. */ + char *int_curr_symbol; + char *currency_symbol; /* Local currency symbol. */ + char *mon_decimal_point; /* Decimal point character. */ + char *mon_thousands_sep; /* Thousands separator. */ + char *mon_grouping; /* Like `grouping' element (above). */ + char *positive_sign; /* Sign for positive values. */ + char *negative_sign; /* Sign for negative values. */ + char int_frac_digits; /* Int'l fractional digits. */ + char frac_digits; /* Local fractional digits. */ + /* 1 if currency_symbol precedes a positive value, 0 if succeeds. */ + char p_cs_precedes; + /* 1 iff a space separates currency_symbol from a positive value. */ + char p_sep_by_space; + /* 1 if currency_symbol precedes a negative value, 0 if succeeds. */ + char n_cs_precedes; + /* 1 iff a space separates currency_symbol from a negative value. */ + char n_sep_by_space; + /* Positive and negative sign positions: + 0 Parentheses surround the quantity and currency_symbol. + 1 The sign string precedes the quantity and currency_symbol. + 2 The sign string follows the quantity and currency_symbol. + 3 The sign string immediately precedes the currency_symbol. + 4 The sign string immediately follows the currency_symbol. */ + char p_sign_posn; + char n_sign_posn; + /* 1 if int_curr_symbol precedes a positive value, 0 if succeeds. */ + char int_p_cs_precedes; + /* 1 iff a space separates int_curr_symbol from a positive value. */ + char int_p_sep_by_space; + /* 1 if int_curr_symbol precedes a negative value, 0 if succeeds. */ + char int_n_cs_precedes; + /* 1 iff a space separates int_curr_symbol from a negative value. */ + char int_n_sep_by_space; + /* Positive and negative sign positions: + 0 Parentheses surround the quantity and int_curr_symbol. + 1 The sign string precedes the quantity and int_curr_symbol. + 2 The sign string follows the quantity and int_curr_symbol. + 3 The sign string immediately precedes the int_curr_symbol. + 4 The sign string immediately follows the int_curr_symbol. */ + char int_p_sign_posn; + char int_n_sign_posn; +}; + +char *setlocale (int category, const char *locale) __THROW; +struct lconv *localeconv (void) __THROW; + +#endif diff --git a/mdk-stage1/dietlibc/include/math.h b/mdk-stage1/dietlibc/include/math.h index 2f4f2e33f..2cb545237 100644 --- a/mdk-stage1/dietlibc/include/math.h +++ b/mdk-stage1/dietlibc/include/math.h @@ -48,6 +48,7 @@ double acosh(double d) __THROW __attribute__((__const__)); double atanh(double d) __THROW __attribute__((__const__)); double exp(double d) __THROW __attribute__((__const__)); +double exp10(double d) __THROW __attribute__((__const__)); double log(double d) __THROW __attribute__((__const__)); double log10(double d) __THROW __attribute__((__const__)); @@ -57,5 +58,39 @@ double sqrt(double x) __THROW __attribute__((__const__)); double fabs(double x) __THROW __attribute__((__const__)); double fmod(double x, double y) __THROW __attribute__((__const__)); +double floor(double x) __attribute__((__const__)); +double ceil(double x) __attribute__((__const__)); + +double expm1(double x) __THROW __attribute__((__const__)); +double hypot(double x, double y) __THROW __attribute__((__const__)); +double atan2(double x, double y) __THROW __attribute__((__const__)); + +double copysign(double value, double sign) __attribute__((__const__)); + +# define HUGE_VAL \ + (__extension__ \ + ((union { unsigned __l __attribute__((__mode__(__DI__))); double __d; }) \ + { __l: 0x000000007ff00000ULL }).__d) + +#ifdef _GNU_SOURCE +void sincos(double x, double* sinx, double* cosx); +double ipow (double mant, int expo); +#endif + +int isnan(double d) __attribute__((__const__)); +int isinf(double d) __attribute__((__const__)); +int finite(double d) __attribute__((__const__)); + +double j0(double x); +double j1(double x); +double jn(int n, double x); +double y0(double x); +double y1(double x); +double yn(int n, double x); +double erf(double x); +double erfc(double x); +double lgamma(double x); + +double rint(double x); #endif diff --git a/mdk-stage1/dietlibc/include/net/if.h b/mdk-stage1/dietlibc/include/net/if.h index 88f386f46..ac4737db3 100644 --- a/mdk-stage1/dietlibc/include/net/if.h +++ b/mdk-stage1/dietlibc/include/net/if.h @@ -2,10 +2,101 @@ #define _NET_IF_H #include <sys/cdefs.h> +#include <sys/socket.h> -#include <linux/if.h> +/* Standard interface flags. */ +#define IFF_UP 0x1 /* interface is up */ +#define IFF_BROADCAST 0x2 /* broadcast address valid */ +#define IFF_DEBUG 0x4 /* turn on debugging */ +#define IFF_LOOPBACK 0x8 /* is a loopback net */ +#define IFF_POINTOPOINT 0x10 /* interface is has p-p link */ +#define IFF_NOTRAILERS 0x20 /* avoid use of trailers */ +#define IFF_RUNNING 0x40 /* resources allocated */ +#define IFF_NOARP 0x80 /* no ARP protocol */ +#define IFF_PROMISC 0x100 /* receive all packets */ +#define IFF_ALLMULTI 0x200 /* receive all multicast packets*/ + +#define IFF_MASTER 0x400 /* master of a load balancer */ +#define IFF_SLAVE 0x800 /* slave of a load balancer */ + +#define IFF_MULTICAST 0x1000 /* Supports multicast */ + +#define IFF_VOLATILE (IFF_LOOPBACK|IFF_POINTOPOINT|IFF_BROADCAST|IFF_MASTER|IFF_SLAVE|IFF_RUNNING) + +#define IFF_PORTSEL 0x2000 /* can set media type */ +#define IFF_AUTOMEDIA 0x4000 /* auto media select active */ +#define IFF_DYNAMIC 0x8000 /* dialup device with changing addresses*/ + +struct ifmap { + unsigned long mem_start; + unsigned long mem_end; + unsigned short base_addr; + unsigned char irq; + unsigned char dma; + unsigned char port; + /* 3 bytes spare */ +}; + +struct ifreq { +#define IFHWADDRLEN 6 +#define IFNAMSIZ 16 + union + { + char ifrn_name[IFNAMSIZ]; /* if name, e.g. "en0" */ + } ifr_ifrn; + union { + struct sockaddr ifru_addr; + struct sockaddr ifru_dstaddr; + struct sockaddr ifru_broadaddr; + struct sockaddr ifru_netmask; + struct sockaddr ifru_hwaddr; + short ifru_flags; + int ifru_ivalue; + int ifru_mtu; + struct ifmap ifru_map; + char ifru_slave[IFNAMSIZ]; /* Just fits the size */ + char ifru_newname[IFNAMSIZ]; + char* ifru_data; + } ifr_ifru; +}; + +#define ifr_name ifr_ifrn.ifrn_name /* interface name */ +#define ifr_hwaddr ifr_ifru.ifru_hwaddr /* MAC address */ +#define ifr_addr ifr_ifru.ifru_addr /* address */ +#define ifr_dstaddr ifr_ifru.ifru_dstaddr /* other end of p-p lnk */ +#define ifr_broadaddr ifr_ifru.ifru_broadaddr /* broadcast address */ +#define ifr_netmask ifr_ifru.ifru_netmask /* interface net mask */ +#define ifr_flags ifr_ifru.ifru_flags /* flags */ +#define ifr_metric ifr_ifru.ifru_ivalue /* metric */ +#define ifr_mtu ifr_ifru.ifru_mtu /* mtu */ +#define ifr_map ifr_ifru.ifru_map /* device map */ +#define ifr_slave ifr_ifru.ifru_slave /* slave device */ +#define ifr_data ifr_ifru.ifru_data /* for use by interface */ +#define ifr_ifindex ifr_ifru.ifru_ivalue /* interface index */ +#define ifr_bandwidth ifr_ifru.ifru_ivalue /* link bandwidth */ +#define ifr_qlen ifr_ifru.ifru_ivalue /* Queue length */ +#define ifr_newname ifr_ifru.ifru_newname /* New name */ + +struct ifconf { + int ifc_len; /* size of buffer */ + union { + char * ifcu_buf; + struct ifreq *ifcu_req; + } ifc_ifcu; +}; + +#define ifc_buf ifc_ifcu.ifcu_buf /* buffer address */ +#define ifc_req ifc_ifcu.ifcu_req /* array of structures */ unsigned int if_nametoindex (const char *ifname) __THROW; char *if_indextoname (unsigned int ifindex, char *ifname) __THROW; +struct if_nameindex { + unsigned int if_index; + char *if_name; +}; + +struct if_nameindex* if_nameindex(void) __THROW; +void if_freenameindex(struct if_nameindex* ptr) __THROW; + #endif diff --git a/mdk-stage1/dietlibc/include/net/if_arp.h b/mdk-stage1/dietlibc/include/net/if_arp.h index fe37a22dc..b1054066a 100644 --- a/mdk-stage1/dietlibc/include/net/if_arp.h +++ b/mdk-stage1/dietlibc/include/net/if_arp.h @@ -1,6 +1,113 @@ #ifndef _NET_IF_ARP_H #define _NET_IF_ARP_H -#include <linux/if_arp.h> +#include <sys/socket.h> +#define MAX_ADDR_LEN 7 + +/* ARP protocol HARDWARE identifiers. */ +#define ARPHRD_NETROM 0 /* from KA9Q: NET/ROM pseudo */ +#define ARPHRD_ETHER 1 /* Ethernet 10Mbps */ +#define ARPHRD_EETHER 2 /* Experimental Ethernet */ +#define ARPHRD_AX25 3 /* AX.25 Level 2 */ +#define ARPHRD_PRONET 4 /* PROnet token ring */ +#define ARPHRD_CHAOS 5 /* Chaosnet */ +#define ARPHRD_IEEE802 6 /* IEEE 802.2 Ethernet/TR/TB */ +#define ARPHRD_ARCNET 7 /* ARCnet */ +#define ARPHRD_APPLETLK 8 /* APPLEtalk */ +#define ARPHRD_DLCI 15 /* Frame Relay DLCI */ +#define ARPHRD_ATM 19 /* ATM */ +#define ARPHRD_METRICOM 23 /* Metricom STRIP (new IANA id) */ + +/* Dummy types for non ARP hardware */ +#define ARPHRD_SLIP 256 +#define ARPHRD_CSLIP 257 +#define ARPHRD_SLIP6 258 +#define ARPHRD_CSLIP6 259 +#define ARPHRD_RSRVD 260 /* Notional KISS type */ +#define ARPHRD_ADAPT 264 +#define ARPHRD_ROSE 270 +#define ARPHRD_X25 271 /* CCITT X.25 */ +#define ARPHRD_HWX25 272 /* Boards with X.25 in firmware */ +#define ARPHRD_PPP 512 +#define ARPHRD_CISCO 513 /* Cisco HDLC */ +#define ARPHRD_HDLC ARPHRD_CISCO +#define ARPHRD_LAPB 516 /* LAPB */ +#define ARPHRD_DDCMP 517 /* Digital's DDCMP protocol */ +#define ARPHRD_RAWHDLC 518 /* Raw HDLC */ + +#define ARPHRD_TUNNEL 768 /* IPIP tunnel */ +#define ARPHRD_TUNNEL6 769 /* IPIP6 tunnel */ +#define ARPHRD_FRAD 770 /* Frame Relay Access Device */ +#define ARPHRD_SKIP 771 /* SKIP vif */ +#define ARPHRD_LOOPBACK 772 /* Loopback device */ +#define ARPHRD_LOCALTLK 773 /* Localtalk device */ +#define ARPHRD_FDDI 774 /* Fiber Distributed Data Interface */ +#define ARPHRD_BIF 775 /* AP1000 BIF */ +#define ARPHRD_SIT 776 /* sit0 device - IPv6-in-IPv4 */ +#define ARPHRD_IPDDP 777 /* IP over DDP tunneller */ +#define ARPHRD_IPGRE 778 /* GRE over IP */ +#define ARPHRD_PIMREG 779 /* PIMSM register interface */ +#define ARPHRD_HIPPI 780 /* High Performance Parallel Interface */ +#define ARPHRD_ASH 781 /* Nexus 64Mbps Ash */ +#define ARPHRD_ECONET 782 /* Acorn Econet */ +#define ARPHRD_IRDA 783 /* Linux-IrDA */ +/* ARP works differently on different FC media .. so */ +#define ARPHRD_FCPP 784 /* Point to point fibrechannel */ +#define ARPHRD_FCAL 785 /* Fibrechannel arbitrated loop */ +#define ARPHRD_FCPL 786 /* Fibrechannel public loop */ +#define ARPHRD_FCFABRIC 787 /* Fibrechannel fabric */ + /* 787->799 reserved for fibrechannel media types */ +#define ARPHRD_IEEE802_TR 800 /* Magic type ident for TR */ +#define ARPHRD_IEEE80211 801 /* IEEE 802.11 */ + +#define ARPHRD_VOID 0xFFFF /* Void type, nothing is known */ + +/* ARP protocol opcodes. */ +#define ARPOP_REQUEST 1 /* ARP request */ +#define ARPOP_REPLY 2 /* ARP reply */ +#define ARPOP_RREQUEST 3 /* RARP request */ +#define ARPOP_RREPLY 4 /* RARP reply */ +#define ARPOP_InREQUEST 8 /* InARP request */ +#define ARPOP_InREPLY 9 /* InARP reply */ +#define ARPOP_NAK 10 /* (ATM)ARP NAK */ + + +/* ARP ioctl request. */ +struct arpreq { + struct sockaddr arp_pa; /* protocol address */ + struct sockaddr arp_ha; /* hardware address */ + int arp_flags; /* flags */ + struct sockaddr arp_netmask; /* netmask (only for proxy arps) */ + char arp_dev[16]; +}; + +struct arpreq_old { + struct sockaddr arp_pa; /* protocol address */ + struct sockaddr arp_ha; /* hardware address */ + int arp_flags; /* flags */ + struct sockaddr arp_netmask; /* netmask (only for proxy arps) */ +}; + +/* ARP Flag values. */ +#define ATF_COM 0x02 /* completed entry (ha valid) */ +#define ATF_PERM 0x04 /* permanent entry */ +#define ATF_PUBL 0x08 /* publish entry */ +#define ATF_USETRAILERS 0x10 /* has requested trailers */ +#define ATF_NETMASK 0x20 /* want to use a netmask (only + for proxy entries) */ +#define ATF_DONTPUB 0x40 /* don't answer this addresses */ + +/* + * This structure defines an ethernet arp header. + */ + +struct arphdr +{ + unsigned short ar_hrd; /* format of hardware address */ + unsigned short ar_pro; /* format of protocol address */ + unsigned char ar_hln; /* length of hardware address */ + unsigned char ar_pln; /* length of protocol address */ + unsigned short ar_op; /* ARP opcode (command) */ +}; #endif diff --git a/mdk-stage1/dietlibc/include/net/route.h b/mdk-stage1/dietlibc/include/net/route.h index 5e5db7b1a..383bb8370 100644 --- a/mdk-stage1/dietlibc/include/net/route.h +++ b/mdk-stage1/dietlibc/include/net/route.h @@ -1,6 +1,52 @@ -#ifndef _NET_IF_ROUTE_H -#define _NET_IF_ROUTE_H +#ifndef _NET_ROUTE_H +#define _NET_ROUTE_H -#include <linux/route.h> +#include <inttypes.h> +#include <netinet/in.h> + +/* This structure gets passed by the SIOCADDRT and SIOCDELRT calls. */ +struct rtentry { + unsigned long rt_pad1; + struct sockaddr rt_dst; /* target address */ + struct sockaddr rt_gateway; /* gateway addr (RTF_GATEWAY) */ + struct sockaddr rt_genmask; /* target network mask (IP) */ + unsigned short rt_flags; + short rt_pad2; + unsigned long rt_pad3; + void *rt_pad4; + short rt_metric; /* +1 for binary compatibility! */ + char *rt_dev; /* forcing the device at add */ + unsigned long rt_mtu; /* per route MTU/Window */ +#ifndef __KERNEL__ +#define rt_mss rt_mtu /* Compatibility :-( */ +#endif + unsigned long rt_window; /* Window clamping */ + unsigned short rt_irtt; /* Initial RTT */ +}; + +#define RTF_UP 0x0001 /* route usable */ +#define RTF_GATEWAY 0x0002 /* destination is a gateway */ +#define RTF_HOST 0x0004 /* host entry (net otherwise) */ +#define RTF_REINSTATE 0x0008 /* reinstate route after tmout */ +#define RTF_DYNAMIC 0x0010 /* created dyn. (by redirect) */ +#define RTF_MODIFIED 0x0020 /* modified dyn. (by redirect) */ +#define RTF_MTU 0x0040 /* specific MTU for this route */ +#define RTF_MSS RTF_MTU /* Compatibility :-( */ +#define RTF_WINDOW 0x0080 /* per route window clamping */ +#define RTF_IRTT 0x0100 /* Initial round trip time */ +#define RTF_REJECT 0x0200 /* Reject route */ + +struct in6_rtmsg { + struct in6_addr rtmsg_dst; + struct in6_addr rtmsg_src; + struct in6_addr rtmsg_gateway; + uint32_t rtmsg_type; + uint16_t rtmsg_dst_len; + uint16_t rtmsg_src_len; + uint32_t rtmsg_metric; + unsigned long int rtmsg_info; + uint32_t rtmsg_flags; + int rtmsg_ifindex; +}; #endif diff --git a/mdk-stage1/dietlibc/include/netdb.h b/mdk-stage1/dietlibc/include/netdb.h index e90ea81ac..be64f659f 100644 --- a/mdk-stage1/dietlibc/include/netdb.h +++ b/mdk-stage1/dietlibc/include/netdb.h @@ -13,8 +13,7 @@ #define _PATH_SERVICES "/etc/services" /* Description of data base entry for a single service. */ -struct servent -{ +struct servent { char *s_name; /* Official service name. */ char **s_aliases; /* Alias list. */ int s_port; /* Port number. */ @@ -22,14 +21,24 @@ struct servent }; extern void endservent (void) __THROW; -extern struct servent *getservent (void) __THROW; +extern void setservent(int stayopen) __THROW; + +extern int getservent_r(struct servent *res, char *buf, size_t buflen, + struct servent **res_sig) __THROW; +extern int getservbyname_r(const char* name,const char* proto, + struct servent *res, char *buf, size_t buflen, + struct servent **res_sig) __THROW; +extern int getservbyport_r(int port,const char* proto, + struct servent *res, char *buf, size_t buflen, + struct servent **res_sig) __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 -{ +struct hostent { char *h_name; /* Official name of host. */ char **h_aliases; /* Alias list. */ int h_addrtype; /* Host address type. */ @@ -40,6 +49,7 @@ struct hostent extern void endhostent (void) __THROW; extern struct hostent *gethostent (void) __THROW; +extern struct hostent *gethostent_r (char* buf,int len) __THROW; extern struct hostent *gethostbyaddr (const void *__addr, socklen_t __len, int __type) __THROW; extern struct hostent *gethostbyname (const char *__name) __THROW; @@ -55,11 +65,16 @@ extern int gethostbyname_r(const char* NAME, struct hostent* RESULT_BUF,char* BU #define TRY_AGAIN 2 #define NO_RECOVERY 3 #define NO_ADDRESS 4 +#define NO_DATA 5 extern int gethostbyaddr_r(const char* addr, size_t length, int format, struct hostent* result, char *buf, size_t buflen, struct hostent **RESULT, int *h_errnop) __THROW; +int gethostbyname2_r(const char* name, int AF, struct hostent* result, + char *buf, size_t buflen, + struct hostent **RESULT, int *h_errnop) __THROW; + struct protoent { char *p_name; /* official protocol name */ char **p_aliases; /* alias list */ @@ -72,19 +87,38 @@ struct protoent *getprotobynumber(int proto) __THROW; void setprotoent(int stayopen) __THROW; void endprotoent(void) __THROW; +int getprotoent_r(struct protoent *res, char *buf, size_t buflen, + struct protoent **res_sig) __THROW; +int getprotobyname_r(const char* name, + struct protoent *res, char *buf, size_t buflen, + struct protoent **res_sig) __THROW; +int getprotobynumber_r(int proto, + struct protoent *res, char *buf, size_t buflen, + struct protoent **res_sig) __THROW; + -/* Description of data base entry for a single network. NOTE: here a - poor assumption is made. The network number is expected to fit - into an unsigned long int variable. */ -struct netent -{ - char *n_name; /* Official name of network. */ - char **n_aliases; /* Alias list. */ - int n_addrtype; /* Net address type. */ - uint32_t n_net; /* Network number. */ +void sethostent(int stayopen) __THROW; + +/* dummy */ +extern int h_errno; + +struct netent { + char *n_name; /* official network name */ + char **n_aliases; /* alias list */ + int n_addrtype; /* net address type */ + unsigned long int n_net; /* network number */ }; -extern struct netent *getnetbyname (__const char *__name) __THROW; +struct netent *getnetbyaddr(unsigned long net, int type) __THROW; +void endnetent(void) __THROW; +void setnetent(int stayopen) __THROW; +struct netent *getnetbyname(const char *name) __THROW; +struct netent *getnetent(void) __THROW; + +extern const char *hstrerror (int err_num) __THROW; +void herror(const char *s) __THROW; +#define NI_MAXHOST 1025 +#define NI_MAXSERV 32 #endif diff --git a/mdk-stage1/dietlibc/include/netinet/in.h b/mdk-stage1/dietlibc/include/netinet/in.h index 0569c8289..0b5278759 100644 --- a/mdk-stage1/dietlibc/include/netinet/in.h +++ b/mdk-stage1/dietlibc/include/netinet/in.h @@ -1,9 +1,404 @@ #ifndef _NETINET_IN_H #define _NETINET_IN_H -#include <linux/in.h> -#include <linux/in6.h> +#include <sys/types.h> +#include <sys/socket.h> +#include <endian.h> + +/* Standard well-defined IP protocols. */ +enum { + IPPROTO_IP = 0, /* Dummy protocol for TCP */ +#define IPPROTO_IP IPPROTO_IP + IPPROTO_ICMP = 1, /* Internet Control Message Protocol */ +#define IPPROTO_ICMP IPPROTO_ICMP + IPPROTO_IGMP = 2, /* Internet Group Management Protocol */ +#define IPPROTO_IGMP IPPROTO_IGMP + IPPROTO_IPIP = 4, /* IPIP tunnels (older KA9Q tunnels use 94) */ +#define IPPROTO_IPIP IPPROTO_IPIP + IPPROTO_TCP = 6, /* Transmission Control Protocol */ +#define IPPROTO_TCP IPPROTO_TCP + IPPROTO_EGP = 8, /* Exterior Gateway Protocol */ +#define IPPROTO_EGP IPPROTO_EGP + IPPROTO_PUP = 12, /* PUP protocol */ +#define IPPROTO_PUP IPPROTO_PUP + IPPROTO_UDP = 17, /* User Datagram Protocol */ +#define IPPROTO_UDP IPPROTO_UDP + IPPROTO_IDP = 22, /* XNS IDP protocol */ +#define IPPROTO_IDP IPPROTO_IDP + IPPROTO_RSVP = 46, /* RSVP protocol */ +#define IPPROTO_RSVP IPPROTO_RSVP + IPPROTO_GRE = 47, /* Cisco GRE tunnels (rfc 1701,1702) */ +#define IPPROTO_GRE IPPROTO_GRE + IPPROTO_IPV6 = 41, /* IPv6-in-IPv4 tunnelling */ +#define IPPROTO_IPV6 IPPROTO_IPV6 + IPPROTO_PIM = 103, /* Protocol Independent Multicast */ +#define IPPROTO_PIM IPPROTO_PIM + IPPROTO_ESP = 50, /* Encapsulation Security Payload protocol */ +#define IPPROTO_ESP IPPROTO_ESP + IPPROTO_AH = 51, /* Authentication Header protocol */ +#define IPPROTO_AH IPPROTO_AH + IPPROTO_COMP = 108, /* Compression Header protocol */ +#define IPPROTO_COMP IPPROTO_COMP + IPPROTO_RAW = 255, /* Raw IP packets */ +#define IPPROTO_RAW IPPROTO_RAW + IPPROTO_MAX +}; + +#define IP_TOS 1 +#define IP_TTL 2 +#define IP_HDRINCL 3 +#define IP_OPTIONS 4 +#define IP_ROUTER_ALERT 5 +#define IP_RECVOPTS 6 +#define IP_RETOPTS 7 +#define IP_PKTINFO 8 +#define IP_PKTOPTIONS 9 +#define IP_MTU_DISCOVER 10 +#define IP_RECVERR 11 +#define IP_RECVTTL 12 +#define IP_RECVTOS 13 +#define IP_MTU 14 +#define IP_FREEBIND 15 + +/* BSD compatibility */ +#define IP_RECVRETOPTS IP_RETOPTS + +/* IP_MTU_DISCOVER values */ +#define IP_PMTUDISC_DONT 0 /* Never send DF frames */ +#define IP_PMTUDISC_WANT 1 /* Use per route hints */ +#define IP_PMTUDISC_DO 2 /* Always DF */ + +#define IP_MULTICAST_IF 32 +#define IP_MULTICAST_TTL 33 +#define IP_MULTICAST_LOOP 34 +#define IP_ADD_MEMBERSHIP 35 +#define IP_DROP_MEMBERSHIP 36 + +/* These need to appear somewhere around here */ +#define IP_DEFAULT_MULTICAST_TTL 1 +#define IP_DEFAULT_MULTICAST_LOOP 1 + +#define IN6ADDR_ANY_INIT {{{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }}} +#define IN6ADDR_LOOPBACK_INIT {{{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 }}} +extern const struct in6_addr in6addr_any; +extern const struct in6_addr in6addr_loopback; + +typedef uint16_t in_port_t; +typedef uint32_t in_addr_t; + +struct in_addr { + in_addr_t s_addr; +}; + +struct ip_mreq { + struct in_addr imr_multiaddr; /* IP multicast address of group */ + struct in_addr imr_interface; /* local IP address of interface */ +}; + +struct ip_mreqn { + struct in_addr imr_multiaddr; /* IP multicast address of group */ + struct in_addr imr_address; /* local IP address of interface */ + int imr_ifindex; /* Interface index */ +}; + +struct in_pktinfo { + int ipi_ifindex; + struct in_addr ipi_spec_dst; + struct in_addr ipi_addr; +}; + +/* Structure describing an Internet (IP) socket address. */ +#define __SOCK_SIZE__ 16 /* sizeof(struct sockaddr) */ +struct sockaddr_in { + sa_family_t sin_family; /* Address family */ + in_port_t sin_port; /* Port number */ + struct in_addr sin_addr; /* Internet address */ + /* Pad to size of `struct sockaddr'. */ + unsigned char sin_zero[__SOCK_SIZE__ - sizeof(short int) - + sizeof(unsigned short int) - sizeof(struct in_addr)]; +}; + + +/* + * Definitions of the bits in an Internet address integer. + * On subnets, host and network parts are found according + * to the subnet mask, not these masks. + */ +#define IN_CLASSA(a) ((((long int) (a)) & 0x80000000) == 0) +#define IN_CLASSA_NET 0xff000000 +#define IN_CLASSA_NSHIFT 24 +#define IN_CLASSA_HOST (0xffffffff & ~IN_CLASSA_NET) +#define IN_CLASSA_MAX 128 + +#define IN_CLASSB(a) ((((long int) (a)) & 0xc0000000) == 0x80000000) +#define IN_CLASSB_NET 0xffff0000 +#define IN_CLASSB_NSHIFT 16 +#define IN_CLASSB_HOST (0xffffffff & ~IN_CLASSB_NET) +#define IN_CLASSB_MAX 65536 + +#define IN_CLASSC(a) ((((long int) (a)) & 0xe0000000) == 0xc0000000) +#define IN_CLASSC_NET 0xffffff00 +#define IN_CLASSC_NSHIFT 8 +#define IN_CLASSC_HOST (0xffffffff & ~IN_CLASSC_NET) + +#define IN_CLASSD(a) ((((long int) (a)) & 0xf0000000) == 0xe0000000) +#define IN_MULTICAST(a) IN_CLASSD(a) +#define IN_MULTICAST_NET 0xF0000000 + +#define IN_EXPERIMENTAL(a) ((((long int) (a)) & 0xf0000000) == 0xf0000000) +#define IN_BADCLASS(a) IN_EXPERIMENTAL((a)) + +/* Address to accept any incoming messages. */ +#define INADDR_ANY ((unsigned long int) 0x00000000) + +/* Address to send to all hosts. */ +#define INADDR_BROADCAST ((unsigned long int) 0xffffffff) + +/* Address indicating an error return. */ +#define INADDR_NONE ((unsigned long int) 0xffffffff) + +/* Network number for local host loopback. */ +#define IN_LOOPBACKNET 127 + +/* Address to loopback in software to local host. */ +#define INADDR_LOOPBACK 0x7f000001 /* 127.0.0.1 */ +#define IN_LOOPBACK(a) ((((long int) (a)) & 0xff000000) == 0x7f000000) + +/* Defines for Multicast INADDR */ +#define INADDR_UNSPEC_GROUP 0xe0000000U /* 224.0.0.0 */ +#define INADDR_ALLHOSTS_GROUP 0xe0000001U /* 224.0.0.1 */ +#define INADDR_ALLRTRS_GROUP 0xe0000002U /* 224.0.0.2 */ +#define INADDR_MAX_LOCAL_GROUP 0xe00000ffU /* 224.0.0.255 */ + +struct in6_addr { + union { + uint8_t u6_addr8[16]; + uint16_t u6_addr16[8]; + uint32_t u6_addr32[4]; + } in6_u; +#define s6_addr in6_u.u6_addr8 +#define s6_addr16 in6_u.u6_addr16 +#define s6_addr32 in6_u.u6_addr32 +}; + +struct sockaddr_in6 { + unsigned short int sin6_family; /* AF_INET6 */ + uint16_t sin6_port; /* Transport layer port # */ + uint32_t sin6_flowinfo; /* IPv6 flow information */ + struct in6_addr sin6_addr; /* IPv6 address */ + uint32_t sin6_scope_id; /* scope id (new in RFC2553) */ +}; + +struct sockaddr_in_pad { + sa_family_t sin_family; /* Address family */ + in_port_t sin_port; /* Port number */ + struct in_addr sin_addr; /* Internet address */ + /* Pad to size of `struct sockaddr_in6'. */ + unsigned char sin_zero[sizeof(struct sockaddr_in6) - sizeof(short int) - + sizeof(unsigned short int) - sizeof(struct in_addr)]; +}; + +struct ipv6_mreq { + /* IPv6 multicast address of group */ + struct in6_addr ipv6mr_multiaddr; + /* local IPv6 address of interface */ + int ipv6mr_interface; +}; + +struct in6_flowlabel_req { + struct in6_addr flr_dst; + uint32_t flr_label; + uint8_t flr_action; + uint8_t flr_share; + uint16_t flr_flags; + uint16_t flr_expires; + uint16_t flr_linger; + uint32_t __flr_pad; + /* Options in format of IPV6_PKTOPTIONS */ +}; + +#define IPV6_FL_A_GET 0 +#define IPV6_FL_A_PUT 1 +#define IPV6_FL_A_RENEW 2 + +#define IPV6_FL_F_CREATE 1 +#define IPV6_FL_F_EXCL 2 + +#define IPV6_FL_S_NONE 0 +#define IPV6_FL_S_EXCL 1 +#define IPV6_FL_S_PROCESS 2 +#define IPV6_FL_S_USER 3 +#define IPV6_FL_S_ANY 255 + +#define IPV6_FLOWINFO_FLOWLABEL 0x000fffff +#define IPV6_FLOWINFO_PRIORITY 0x0ff00000 + +/* + * IPV6 extension headers + */ +#define IPPROTO_HOPOPTS 0 /* IPv6 hop-by-hop options */ +#define IPPROTO_ROUTING 43 /* IPv6 routing header */ +#define IPPROTO_FRAGMENT 44 /* IPv6 fragmentation header */ +#define IPPROTO_ICMPV6 58 /* ICMPv6 */ +#define IPPROTO_NONE 59 /* IPv6 no next header */ +#define IPPROTO_DSTOPTS 60 /* IPv6 destination options */ + +/* IPv6 TLV options. */ +#define IPV6_TLV_PAD0 0 +#define IPV6_TLV_PADN 1 +#define IPV6_TLV_ROUTERALERT 5 +#define IPV6_TLV_JUMBO 194 + +/* IPV6 socket options. */ +#define IPV6_ADDRFORM 1 +#define IPV6_PKTINFO 2 +#define IPV6_HOPOPTS 3 +#define IPV6_DSTOPTS 4 +#define IPV6_RTHDR 5 +#define IPV6_PKTOPTIONS 6 +#define IPV6_CHECKSUM 7 +#define IPV6_HOPLIMIT 8 +#define IPV6_NEXTHOP 9 +#define IPV6_AUTHHDR 10 +#define IPV6_FLOWINFO 11 + +#define IPV6_UNICAST_HOPS 16 +#define IPV6_MULTICAST_IF 17 +#define IPV6_MULTICAST_HOPS 18 +#define IPV6_MULTICAST_LOOP 19 +#define IPV6_ADD_MEMBERSHIP 20 +#define IPV6_DROP_MEMBERSHIP 21 +#define IPV6_ROUTER_ALERT 22 +#define IPV6_MTU_DISCOVER 23 +#define IPV6_MTU 24 +#define IPV6_RECVERR 25 + +/* IPV6_MTU_DISCOVER values */ +#define IPV6_PMTUDISC_DONT 0 +#define IPV6_PMTUDISC_WANT 1 +#define IPV6_PMTUDISC_DO 2 + +/* Flowlabel */ +#define IPV6_FLOWLABEL_MGR 32 +#define IPV6_FLOWINFO_SEND 33 + +#define IPV6_MIN_MTU 1280 + +struct in6_pktinfo { + struct in6_addr ipi6_addr; + int ipi6_ifindex; +}; + +struct in6_ifreq { + struct in6_addr ifr6_addr; + uint32_t ifr6_prefixlen; + int ifr6_ifindex; +}; + +#define IPV6_SRCRT_STRICT 0x01 /* this hop must be a neighbor */ +#define IPV6_SRCRT_TYPE_0 0 /* IPv6 type 0 Routing Header */ + +/* routing header */ +struct ipv6_rt_hdr { + uint8_t nexthdr; + uint8_t hdrlen; + uint8_t type; + uint8_t segments_left; + /* type specific data, variable length field */ +}; + +struct ipv6_opt_hdr { + uint8_t nexthdr; + uint8_t hdrlen; + /* TLV encoded option data follows. */ +}; + +#define ipv6_destopt_hdr ipv6_opt_hdr +#define ipv6_hopopt_hdr ipv6_opt_hdr + +/* routing header type 0 (used in cmsghdr struct) */ + +#ifndef __STRICT_ANSI__ +struct rt0_hdr { + struct ipv6_rt_hdr rt_hdr; + uint32_t bitmap; /* strict/loose bit map */ + struct in6_addr addr[0]; +#define rt0_type rt_hdr.type; +}; +#endif + +struct ipv6hdr { +#if __BYTE_ORDER == __LITTLE_ENDIAN + unsigned int flow_lbl:20, + priority:8, + version:4; +#else + unsigned int version:4, + priority:8, + flow_lbl:20; +#endif + + uint16_t payload_len; + uint8_t nexthdr; + uint8_t hop_limit; + + struct in6_addr saddr; + struct in6_addr daddr; +}; +/* fnord */ #define IPPORT_RESERVED 1024 +#define INET6_ADDRSTRLEN 46 + +#undef htonl +#undef htons +#undef ntohl +#undef ntohs +unsigned long int htonl(unsigned long int hostlong); +unsigned short int htons(unsigned short int hostshort); +unsigned long int ntohl(unsigned long int netlong); +unsigned short int ntohs(unsigned short int netshort); + +#define IN6_IS_ADDR_UNSPECIFIED(a) \ + (((__const uint32_t *) (a))[0] == 0 \ + && ((__const uint32_t *) (a))[1] == 0 \ + && ((__const uint32_t *) (a))[2] == 0 \ + && ((__const uint32_t *) (a))[3] == 0) + +#define IN6_IS_ADDR_LOOPBACK(a) \ + (((__const uint32_t *) (a))[0] == 0 \ + && ((__const uint32_t *) (a))[1] == 0 \ + && ((__const uint32_t *) (a))[2] == 0 \ + && ((__const uint32_t *) (a))[3] == htonl (1)) + +#define IN6_IS_ADDR_MULTICAST(a) (((__const uint8_t *) (a))[0] == 0xff) + +#define IN6_IS_ADDR_LINKLOCAL(a) \ + ((((__const uint32_t *) (a))[0] & htonl (0xffc00000)) \ + == htonl (0xfe800000)) + +#define IN6_IS_ADDR_SITELOCAL(a) \ + ((((__const uint32_t *) (a))[0] & htonl (0xffc00000)) \ + == htonl (0xfec00000)) + +#define IN6_IS_ADDR_V4MAPPED(a) \ + ((((__const uint32_t *) (a))[0] == 0) \ + && (((__const uint32_t *) (a))[1] == 0) \ + && (((__const uint32_t *) (a))[2] == htonl (0xffff))) + +#define IN6_IS_ADDR_V4COMPAT(a) \ + ((((__const uint32_t *) (a))[0] == 0) \ + && (((__const uint32_t *) (a))[1] == 0) \ + && (((__const uint32_t *) (a))[2] == 0) \ + && (ntohl (((__const uint32_t *) (a))[3]) > 1)) + +#define IN6_ARE_ADDR_EQUAL(a,b) \ + ((((__const uint32_t *) (a))[0] == ((__const uint32_t *) (b))[0]) \ + && (((__const uint32_t *) (a))[1] == ((__const uint32_t *) (b))[1]) \ + && (((__const uint32_t *) (a))[2] == ((__const uint32_t *) (b))[2]) \ + && (((__const uint32_t *) (a))[3] == ((__const uint32_t *) (b))[3])) + +/* old legacy bullshit */ +int bindresvport(int sd, struct sockaddr_in* sin); #endif diff --git a/mdk-stage1/dietlibc/include/netinet/ip.h b/mdk-stage1/dietlibc/include/netinet/ip.h index 35bf9cc42..4ebf21706 100644 --- a/mdk-stage1/dietlibc/include/netinet/ip.h +++ b/mdk-stage1/dietlibc/include/netinet/ip.h @@ -1,6 +1,121 @@ #ifndef _NETINET_IP_H #define _NETINET_IP_H -#include <linux/ip.h> +#include <inttypes.h> +#include <endian.h> +#include <netinet/in.h> + +#define IPVERSION 4 /* IP version number */ +#define IP_MAXPACKET 65535 /* maximum packet size */ + +#define IPTOS_TOS_MASK 0x1E +#define IPTOS_TOS(tos) ((tos)&IPTOS_TOS_MASK) +#define IPTOS_LOWDELAY 0x10 +#define IPTOS_THROUGHPUT 0x08 +#define IPTOS_RELIABILITY 0x04 +#define IPTOS_MINCOST 0x02 +#define IPTOS_LOWCOST IPTOS_MINCOST + +#define IPTOS_PREC_MASK 0xE0 +#define IPTOS_PREC(tos) ((tos)&IPTOS_PREC_MASK) +#define IPTOS_PREC_NETCONTROL 0xe0 +#define IPTOS_PREC_INTERNETCONTROL 0xc0 +#define IPTOS_PREC_CRITIC_ECP 0xa0 +#define IPTOS_PREC_FLASHOVERRIDE 0x80 +#define IPTOS_PREC_FLASH 0x60 +#define IPTOS_PREC_IMMEDIATE 0x40 +#define IPTOS_PREC_PRIORITY 0x20 +#define IPTOS_PREC_ROUTINE 0x00 + + +/* IP options */ +#define IPOPT_COPY 0x80 +#define IPOPT_CLASS_MASK 0x60 +#define IPOPT_NUMBER_MASK 0x1f + +#define IPOPT_COPIED(o) ((o)&IPOPT_COPY) +#define IPOPT_CLASS(o) ((o)&IPOPT_CLASS_MASK) +#define IPOPT_NUMBER(o) ((o)&IPOPT_NUMBER_MASK) + +#define IPOPT_CONTROL 0x00 +#define IPOPT_RESERVED1 0x20 +#define IPOPT_MEASUREMENT 0x40 +#define IPOPT_RESERVED2 0x60 + +#define IPOPT_END (0 |IPOPT_CONTROL) +#define IPOPT_NOOP (1 |IPOPT_CONTROL) +#define IPOPT_SEC (2 |IPOPT_CONTROL|IPOPT_COPY) +#define IPOPT_LSRR (3 |IPOPT_CONTROL|IPOPT_COPY) +#define IPOPT_TIMESTAMP (4 |IPOPT_MEASUREMENT) +#define IPOPT_RR (7 |IPOPT_CONTROL) +#define IPOPT_SID (8 |IPOPT_CONTROL|IPOPT_COPY) +#define IPOPT_SSRR (9 |IPOPT_CONTROL|IPOPT_COPY) +#define IPOPT_RA (20|IPOPT_CONTROL|IPOPT_COPY) + +#define IPVERSION 4 +#define MAXTTL 255 +#define IPDEFTTL 64 + +/* struct timestamp, struct route and MAX_ROUTES are removed. + + REASONS: it is clear that nobody used them because: + - MAX_ROUTES value was wrong. + - "struct route" was wrong. + - "struct timestamp" had fatally misaligned bitfields and was completely unusable. + */ + +#define IPOPT_OPTVAL 0 +#define IPOPT_OLEN 1 +#define IPOPT_OFFSET 2 +#define IPOPT_MINOFF 4 +#define MAX_IPOPTLEN 40 +#define IPOPT_NOP IPOPT_NOOP +#define IPOPT_EOL IPOPT_END +#define IPOPT_TS IPOPT_TIMESTAMP + +#define IPOPT_TS_TSONLY 0 /* timestamps only */ +#define IPOPT_TS_TSANDADDR 1 /* timestamps and addresses */ +#define IPOPT_TS_PRESPEC 3 /* specified modules only */ + +struct iphdr { /* size 20/0x14 */ +#if __BYTE_ORDER == __LITTLE_ENDIAN + unsigned int ihl:4, version:4; /* offset 0; version=ip version (4) */ +#else + unsigned int version:4, ihl:4; /* offset 0; ihl=ip header length, measured in words (5) */ +#endif + unsigned char tos; /* offset 1 */ + unsigned short tot_len; /* offset 2; total bytes in packet in network byte order */ + unsigned short id; /* offset 4 */ + unsigned short frag_off; /* offset 6 */ + unsigned char ttl; /* offset 8 */ + unsigned char protocol; /* offset 9; 1=ICMP, 6=TCP, 17=UDP (see netinet/in.h) */ + unsigned short check; /* offset 10/0xa */ + unsigned int saddr; /* offset 12/0xc */ + unsigned int daddr; /* offset 16/0x10 */ + /*The options start here. */ +}; + +struct ip { +#if __BYTE_ORDER == __LITTLE_ENDIAN + unsigned int ip_hl:4; /* header length */ + unsigned int ip_v:4; /* version */ +#endif +#if __BYTE_ORDER == __BIG_ENDIAN + unsigned int ip_v:4; /* version */ + unsigned int ip_hl:4; /* header length */ +#endif + unsigned char ip_tos; /* type of service */ + unsigned short ip_len; /* total length */ + unsigned short ip_id; /* identification */ + unsigned short ip_off; /* fragment offset field */ +#define IP_RF 0x8000 /* reserved fragment flag */ +#define IP_DF 0x4000 /* dont fragment flag */ +#define IP_MF 0x2000 /* more fragments flag */ +#define IP_OFFMASK 0x1fff /* mask for fragmenting bits */ + unsigned char ip_ttl; /* time to live */ + unsigned char ip_p; /* protocol */ + unsigned short ip_sum; /* checksum */ + struct in_addr ip_src, ip_dst; /* source and dest address */ +}; #endif diff --git a/mdk-stage1/dietlibc/include/paths.h b/mdk-stage1/dietlibc/include/paths.h index 0e36bb10e..9073d267a 100644 --- a/mdk-stage1/dietlibc/include/paths.h +++ b/mdk-stage1/dietlibc/include/paths.h @@ -13,4 +13,11 @@ #define _PATH_GROUP "/etc/group" #define _PATH_SHADOW "/etc/shadow" +#define _PATH_SHELLS "/etc/shells" + +#define _PATH_VARRUN "/var/run/" + +/* puke */ +#define _PATH_MAILDIR "/var/mail" + #endif diff --git a/mdk-stage1/dietlibc/include/pthread.h b/mdk-stage1/dietlibc/include/pthread.h index e922ab28b..e243c0281 100644 --- a/mdk-stage1/dietlibc/include/pthread.h +++ b/mdk-stage1/dietlibc/include/pthread.h @@ -5,9 +5,6 @@ #include <signal.h> #include <setjmp.h> -/* arg... kernel haeder... */ -#define ENOTSUP 524 /* Operation is not supported */ - #define PTHREAD_STACK_SIZE 16384 #define PTHREAD_THREADS_MAX 128 @@ -19,9 +16,16 @@ #define PTHREAD_DESTRUCTOR_ITERATIONS 10 typedef struct _pthread_descr_struct *_pthread_descr; -typedef unsigned long int pthread_t; +typedef int pthread_t; /* Fast locks */ +#ifdef __parisc__ +#define PTHREAD_SPIN_LOCKED 0 +#define PTHREAD_SPIN_UNLOCKED 1 +#else +#define PTHREAD_SPIN_LOCKED 1 +#define PTHREAD_SPIN_UNLOCKED 0 +#endif struct _pthread_fastlock { int __spinlock; }; @@ -49,18 +53,24 @@ enum }; #define PTHREAD_MUTEX_INITIALIZER \ -{{0}, 0, PTHREAD_MUTEX_FAST_NP, 0} +{{PTHREAD_SPIN_UNLOCKED}, 0, PTHREAD_MUTEX_FAST_NP, 0} #define PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP \ -{{0}, 0, PTHREAD_MUTEX_RECURSIVE_NP, 0} +{{PTHREAD_SPIN_UNLOCKED}, 0, PTHREAD_MUTEX_RECURSIVE_NP, 0} #define PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP \ -{{0}, 0, PTHREAD_MUTEX_ERRORCHECK_NP, 0} +{{PTHREAD_SPIN_UNLOCKED}, 0, PTHREAD_MUTEX_ERRORCHECK_NP, 0} typedef struct { int __mutexkind; } pthread_mutexattr_t; +int pthread_mutexattr_init(pthread_mutexattr_t *attr); +int pthread_mutexattr_destroy(pthread_mutexattr_t *attr); + +int pthread_mutexattr_getkind_np(const pthread_mutexattr_t *attr, int *kind); +int pthread_mutexattr_setkind_np(pthread_mutexattr_t *attr, int kind); + int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr); int pthread_mutex_lock(pthread_mutex_t *mutex); @@ -77,7 +87,7 @@ typedef struct { } pthread_cond_t; #define PTHREAD_COND_INITIALIZER \ -{{0},0} +{{PTHREAD_SPIN_UNLOCKED},0} int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr); int pthread_cond_destroy(pthread_cond_t *cond); @@ -164,9 +174,14 @@ int pthread_attr_getstackaddr(pthread_attr_t *attr, void **stack); int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize); int pthread_attr_getstacksize(pthread_attr_t *attr, size_t *stacksize); +int pthread_setschedparam(pthread_t target_thread, int policy, + const struct sched_param *param); +int pthread_getschedparam(pthread_t target_thread, int *policy, + struct sched_param *param); + /* ONCE */ typedef int pthread_once_t; -#define PTHREAD_ONCE_INIT 0 +#define PTHREAD_ONCE_INIT PTHREAD_SPIN_UNLOCKED int __pthread_once(pthread_once_t* once_control, void (*init_routine)(void)); int pthread_once(pthread_once_t* once_control, void (*init_routine)(void)); @@ -210,7 +225,7 @@ pid_t pthread_atfork(void (*prepare)(void), void (*parent)(void), void (*child)(void)); /* THREADS */ -int pthread_create (pthread_t *__thread, +int pthread_create (pthread_t *__threadarg, const pthread_attr_t *__attr, void *(*__start_routine) (void *), void *__arg); @@ -224,4 +239,6 @@ int pthread_detach (pthread_t __th); pthread_t pthread_self (void); int pthread_equal (pthread_t __thread1, pthread_t __thread2); +int pthread_sigmask(int how, const sigset_t*newset, sigset_t *oldset); + #endif diff --git a/mdk-stage1/dietlibc/include/pwd.h b/mdk-stage1/dietlibc/include/pwd.h index e6fb5d0be..8901a2d7f 100644 --- a/mdk-stage1/dietlibc/include/pwd.h +++ b/mdk-stage1/dietlibc/include/pwd.h @@ -3,6 +3,7 @@ #include <sys/cdefs.h> #include <sys/types.h> +#include <stdio.h> struct passwd { char *pw_name; /* Username. */ @@ -14,11 +15,21 @@ struct passwd { char *pw_shell; /* Shell program. */ }; -extern struct passwd *getpwuid (uid_t __uid) __THROW; -extern struct passwd *getpwnam (const char *__name) __THROW; +extern struct passwd *getpwuid (uid_t uid) __THROW; +extern struct passwd *getpwnam (const char *name) __THROW; extern struct passwd *getpwent(void) __THROW; extern void setpwent(void) __THROW; extern void endpwent(void) __THROW; +extern int putpwent(const struct passwd *p, FILE *stream) __THROW; + +int getpwent_r(struct passwd *res, char *buf, size_t buflen, + struct passwd **res_sig) __THROW; +int getpwnam_r(const char* name, + struct passwd *res, char *buf, size_t buflen, + struct passwd **res_sig) __THROW; +int getpwuid_r(uid_t uid, + struct passwd *res, char *buf, size_t buflen, + struct passwd **res_sig) __THROW; #endif diff --git a/mdk-stage1/dietlibc/include/regex.h b/mdk-stage1/dietlibc/include/regex.h index be609d9db..abc9ab57b 100644 --- a/mdk-stage1/dietlibc/include/regex.h +++ b/mdk-stage1/dietlibc/include/regex.h @@ -38,6 +38,7 @@ typedef struct __regex_t { int brackets,cflags; regmatch_t *l; } regex_t; +#define re_nsub r.pieces int regcomp(regex_t *preg, const char *regex, int cflags) __THROW; int regexec(const regex_t *preg, const char *string, size_t nmatch, regmatch_t pmatch[], int eflags) __THROW; @@ -61,7 +62,10 @@ enum __regex_errors { REG_BADPAT, /* Invalid use of pattern operators such as group or list. */ REG_ESIZE, /* Compiled regular expression requires a pattern buffer larger than 64Kb. This is not defined by POSIX.2. */ - REG_ESPACE, /* regcomp ran out of space */ + REG_ESPACE /* regcomp ran out of space */ }; +char * re_comp(char * regex); +int re_exec(char * string); + #endif diff --git a/mdk-stage1/dietlibc/include/resolv.h b/mdk-stage1/dietlibc/include/resolv.h index 4e90799c2..dae226582 100644 --- a/mdk-stage1/dietlibc/include/resolv.h +++ b/mdk-stage1/dietlibc/include/resolv.h @@ -1 +1,124 @@ -void res_init(void); +#ifndef _RESOLV_H +#define _RESOLV_H + +#include <sys/param.h> +#include <sys/types.h> +#include <stdio.h> +#include <netinet/in.h> + +#ifndef _PATH_RESCONF +#define _PATH_RESCONF "/etc/resolv.conf" +#endif + +/* + * Global defines and variables for resolver stub. + */ +#define MAXNS 8 /* max # name servers we'll track */ +#define MAXDFLSRCH 3 /* # default domain levels to try */ +#define MAXDNSRCH 6 /* max # domains in search path */ +#define LOCALDOMAINPARTS 2 /* min levels in name that is "local" */ + +#define RES_TIMEOUT 5 /* min. seconds between retries */ +#define MAXRESOLVSORT 10 /* number of net to sort on */ +#define RES_MAXNDOTS 15 /* should reflect bit field size */ + +struct res_state { + int retrans; /* retransmission time interval */ + int retry; /* number of times to retransmit */ + unsigned long options; /* option flags - see below. */ + int nscount; /* number of name servers */ + struct sockaddr_in_pad + nsaddr_list[MAXNS]; /* address of name server */ +#define nsaddr nsaddr_list[0] /* for backward compatibility */ + unsigned short id; /* current message id */ + char *dnsrch[MAXDNSRCH+1]; /* components of domain to search */ + char defdname[256]; /* default domain (deprecated) */ + unsigned long pfcode; /* RES_PRF_ flags - see below. */ + unsigned ndots:4; /* threshold for initial abs. query */ + unsigned nsort:4; /* number of elements in sort_list[] */ + char unused[3]; + struct { + struct in_addr addr; + uint32_t mask; + } sort_list[MAXRESOLVSORT]; + char pad[72]; /* on an i386 this means 512b total */ +}; + +/* + * Resolver options (keep these in synch with res_debug.c, please) + */ +#define RES_INIT 0x00000001 /* address initialized */ +#define RES_DEBUG 0x00000002 /* print debug messages */ +#define RES_AAONLY 0x00000004 /* authoritative answers only (!IMPL)*/ +#define RES_USEVC 0x00000008 /* use virtual circuit */ +#define RES_PRIMARY 0x00000010 /* query primary server only (!IMPL) */ +#define RES_IGNTC 0x00000020 /* ignore trucation errors */ +#define RES_RECURSE 0x00000040 /* recursion desired */ +#define RES_DEFNAMES 0x00000080 /* use default domain name */ +#define RES_STAYOPEN 0x00000100 /* Keep TCP socket open */ +#define RES_DNSRCH 0x00000200 /* search up local domain tree */ +#define RES_INSECURE1 0x00000400 /* type 1 security disabled */ +#define RES_INSECURE2 0x00000800 /* type 2 security disabled */ +#define RES_NOALIASES 0x00001000 /* shuts off HOSTALIASES feature */ +#define RES_USE_INET6 0x00002000 /* use/map IPv6 in gethostbyname() */ + +#define RES_DEFAULT (RES_RECURSE | RES_DEFNAMES | RES_DNSRCH) + +/* + * Resolver "pfcode" values. Used by dig. + */ +#define RES_PRF_STATS 0x00000001 +/* 0x00000002 */ +#define RES_PRF_CLASS 0x00000004 +#define RES_PRF_CMD 0x00000008 +#define RES_PRF_QUES 0x00000010 +#define RES_PRF_ANS 0x00000020 +#define RES_PRF_AUTH 0x00000040 +#define RES_PRF_ADD 0x00000080 +#define RES_PRF_HEAD1 0x00000100 +#define RES_PRF_HEAD2 0x00000200 +#define RES_PRF_TTLID 0x00000400 +#define RES_PRF_HEADX 0x00000800 +#define RES_PRF_QUERY 0x00001000 +#define RES_PRF_REPLY 0x00002000 +#define RES_PRF_INIT 0x00004000 +/* 0x00008000 */ + +struct res_sym { + int number; /* Identifying number, like T_MX */ + char * name; /* Its symbolic name, like "MX" */ + char * humanname; /* Its fun name, like "mail exchanger" */ +}; + +extern struct res_state _res; +extern const struct res_sym __p_class_syms[]; +extern const struct res_sym __p_type_syms[]; + +int res_init(void) __THROW; + +int res_query(const char *dname, int class, int type, + unsigned char *answer, int anslen) __THROW; + +int res_search(const char *dname, int class, int type, + unsigned char *answer, int anslen) __THROW; + +int res_querydomain(const char *name, const char *domain, + int class, int type, unsigned char *answer, + int anslen) __THROW; + +int res_mkquery(int op, const char *dname, int class, + int type, char *data, int datalen, const unsigned char* newrr, + char *buf, int buflen) __THROW; + +int res_send(const char *msg, int msglen, char *answer, + int anslen) __THROW; + +int dn_comp(unsigned char *msg, unsigned char *comp_dn, + int length, unsigned char **dnptrs, unsigned char *exp_dn, + unsigned char **lastdnptr) __THROW; + +int dn_expand(unsigned char *msg, unsigned char *eomorig, + unsigned char *comp_dn, unsigned char *exp_dn, + int length) __THROW; + +#endif diff --git a/mdk-stage1/dietlibc/include/rpc/auth.h b/mdk-stage1/dietlibc/include/rpc/auth.h index 4aa7d21ce..6e0ae0675 100644 --- a/mdk-stage1/dietlibc/include/rpc/auth.h +++ b/mdk-stage1/dietlibc/include/rpc/auth.h @@ -42,6 +42,7 @@ #define _RPC_AUTH_H 1 #include <sys/cdefs.h> +#include <sys/socket.h> #include <rpc/xdr.h> __BEGIN_DECLS @@ -71,8 +72,8 @@ enum auth_stat { union des_block { struct { - u_int32_t high; - u_int32_t low; + uint32_t high; + uint32_t low; } key; char c[8]; }; @@ -84,8 +85,8 @@ extern bool_t xdr_des_block (XDR *__xdrs, des_block *__blkp) __THROW; */ struct opaque_auth { enum_t oa_flavor; /* flavor of auth */ - caddr_t oa_base; /* address of more auth stuff */ - u_int oa_length; /* not to exceed MAX_AUTH_BYTES */ + char* oa_base; /* address of more auth stuff */ + unsigned int oa_length; /* not to exceed MAX_AUTH_BYTES */ }; /* @@ -104,7 +105,7 @@ struct AUTH { int (*ah_refresh) (AUTH *); /* refresh credentials */ void (*ah_destroy) (AUTH *); /* destroy this structure */ } *ah_ops; - caddr_t ah_private; + char* ah_private; }; @@ -162,10 +163,10 @@ extern AUTH *authunix_create (char *__machname,uid_t __uid, gid_t __gid, int __len, gid_t *__aup_gids) __THROW; extern AUTH *authunix_create_default (void) __THROW; extern AUTH *authnone_create (void) __THROW; -extern AUTH *authdes_create (const char *__servername, u_int __window, +extern AUTH *authdes_create (const char *__servername, unsigned int __window, struct sockaddr *__syncaddr, des_block *__ckey) __THROW; -extern AUTH *authdes_pk_create (const char *, netobj *, u_int, +extern AUTH *authdes_pk_create (const char *, netobj *, unsigned int, struct sockaddr *, des_block *) __THROW; @@ -183,11 +184,11 @@ extern AUTH *authdes_pk_create (const char *, netobj *, u_int, * */ extern int getnetname (char *) __THROW; -extern int host2netname (char *, __const char *, __const char *) __THROW; -extern int user2netname (char *, __const uid_t, __const char *) __THROW; -extern int netname2user (__const char *, uid_t *, gid_t *, int *, gid_t *) +extern int host2netname (char *, const char *, const char *) __THROW; +extern int user2netname (char *, const uid_t, const char *) __THROW; +extern int netname2user (const char *, uid_t *, gid_t *, int *, gid_t *) __THROW; -extern int netname2host (__const char *, char *, __const int) __THROW; +extern int netname2host (const char *, char *, const int) __THROW; /* * diff --git a/mdk-stage1/dietlibc/include/rpc/auth_des.h b/mdk-stage1/dietlibc/include/rpc/auth_des.h index 198b299e7..8accd3779 100644 --- a/mdk-stage1/dietlibc/include/rpc/auth_des.h +++ b/mdk-stage1/dietlibc/include/rpc/auth_des.h @@ -86,22 +86,22 @@ struct authdes_verf #define adv_nickname adv_int_u /* Map a des credential into a unix cred. */ -extern int authdes_getucred (__const struct authdes_cred * __adc, +extern int authdes_getucred (const struct authdes_cred * __adc, uid_t * __uid, gid_t * __gid, short *__grouplen, gid_t * __groups) __THROW; /* Get the public key for NAME and place it in KEY. NAME can only be up to MAXNETNAMELEN bytes long and the destination buffer KEY should have HEXKEYBYTES + 1 bytes long to fit all characters from the key. */ -extern int getpublickey (__const char *__name, char *__key) __THROW; +extern int getpublickey (const char *__name, char *__key) __THROW; /* Get the secret key for NAME and place it in KEY. PASSWD is used to decrypt the encrypted key stored in the database. NAME can only be up to MAXNETNAMELEN bytes long and the destination buffer KEY should have HEXKEYBYTES + 1 bytes long to fit all characters from the key. */ -extern int getsecretkey (__const char *__name, char *__key, - __const char *__passwd) __THROW; +extern int getsecretkey (const char *__name, char *__key, + const char *__passwd) __THROW; extern int rtime (struct sockaddr_in *__addrp, struct rpc_timeval *__timep, struct rpc_timeval *__timeout) __THROW; diff --git a/mdk-stage1/dietlibc/include/rpc/auth_unix.h b/mdk-stage1/dietlibc/include/rpc/auth_unix.h index 7a1bfa9f0..9dd8142f1 100644 --- a/mdk-stage1/dietlibc/include/rpc/auth_unix.h +++ b/mdk-stage1/dietlibc/include/rpc/auth_unix.h @@ -64,11 +64,11 @@ __BEGIN_DECLS */ struct authunix_parms { - u_long aup_time; + unsigned long aup_time; char *aup_machname; uid_t aup_uid; gid_t aup_gid; - u_int aup_len; + unsigned int aup_len; gid_t *aup_gids; }; diff --git a/mdk-stage1/dietlibc/include/rpc/clnt.h b/mdk-stage1/dietlibc/include/rpc/clnt.h index 60b0fafdf..9b100556c 100644 --- a/mdk-stage1/dietlibc/include/rpc/clnt.h +++ b/mdk-stage1/dietlibc/include/rpc/clnt.h @@ -109,8 +109,8 @@ struct rpc_err { int RE_errno; /* related system error */ enum auth_stat RE_why; /* why the auth error occurred */ struct { - u_long low; /* lowest verion supported */ - u_long high; /* highest verion supported */ + unsigned long low; /* lowest verion supported */ + unsigned long high; /* highest verion supported */ } RE_vers; struct { /* maybe meaningful if RPC_FAILED */ long s1; @@ -133,19 +133,19 @@ typedef struct CLIENT CLIENT; struct CLIENT { AUTH *cl_auth; /* authenticator */ struct clnt_ops { - enum clnt_stat (*cl_call) (CLIENT *, u_long, xdrproc_t, caddr_t, xdrproc_t, - caddr_t, struct timeval); + enum clnt_stat (*cl_call) (CLIENT *, unsigned long, xdrproc_t, char*, xdrproc_t, + char*, struct timeval); /* call remote procedure */ void (*cl_abort) (void); /* abort a call */ void (*cl_geterr) (CLIENT *, struct rpc_err *); /* get specific error code */ - bool_t (*cl_freeres) (CLIENT *, xdrproc_t, caddr_t); + bool_t (*cl_freeres) (CLIENT *, xdrproc_t, char*); /* frees results */ void (*cl_destroy) (CLIENT *); /* destroy this structure */ bool_t (*cl_control) (CLIENT *, int, char *); /* the ioctl() of rpc */ } *cl_ops; - caddr_t cl_private; /* private stuff */ + char* cl_private; /* private stuff */ }; @@ -160,11 +160,11 @@ struct CLIENT { * enum clnt_stat * CLNT_CALL(rh, proc, xargs, argsp, xres, resp, timeout) * CLIENT *rh; - * u_long proc; + * unsigned long proc; * xdrproc_t xargs; - * caddr_t argsp; + * char* argsp; * xdrproc_t xres; - * caddr_t resp; + * char* resp; * struct timeval timeout; */ #define CLNT_CALL(rh, proc, xargs, argsp, xres, resp, secs) \ @@ -194,7 +194,7 @@ struct CLIENT { * CLNT_FREERES(rh, xres, resp); * CLIENT *rh; * xdrproc_t xres; - * caddr_t resp; + * char* resp; */ #define CLNT_FREERES(rh,xres,resp) ((*(rh)->cl_ops->cl_freeres)(rh,xres,resp)) #define clnt_freeres(rh,xres,resp) ((*(rh)->cl_ops->cl_freeres)(rh,xres,resp)) @@ -203,7 +203,7 @@ struct CLIENT { * bool_t * CLNT_CONTROL(cl, request, info) * CLIENT *cl; - * u_int request; + * unsigned int request; * char *info; */ #define CLNT_CONTROL(cl,rq,in) ((*(cl)->cl_ops->cl_control)(cl,rq,in)) @@ -253,16 +253,16 @@ struct CLIENT { * and network administration. */ -#define RPCTEST_PROGRAM ((u_long)1) -#define RPCTEST_VERSION ((u_long)1) -#define RPCTEST_NULL_PROC ((u_long)2) -#define RPCTEST_NULL_BATCH_PROC ((u_long)3) +#define RPCTEST_PROGRAM ((unsigned long)1) +#define RPCTEST_VERSION ((unsigned long)1) +#define RPCTEST_NULL_PROC ((unsigned long)2) +#define RPCTEST_NULL_BATCH_PROC ((unsigned long)3) /* * By convention, procedure 0 takes null arguments and returns them */ -#define NULLPROC ((u_long)0) +#define NULLPROC ((unsigned long)0) /* * Below are the client handle creation routines for the various @@ -274,10 +274,10 @@ struct CLIENT { * Memory based rpc (for speed check and testing) * CLIENT * * clntraw_create(prog, vers) - * u_long prog; - * u_long vers; + * unsigned long prog; + * unsigned long vers; */ -extern CLIENT *clntraw_create (__const u_long __prog, __const u_long __vers) +extern CLIENT *clntraw_create (const unsigned long __prog, const unsigned long __vers) __THROW; @@ -287,12 +287,12 @@ extern CLIENT *clntraw_create (__const u_long __prog, __const u_long __vers) * CLIENT * * clnt_create(host, prog, vers, prot) * char *host; -- hostname - * u_long prog; -- program number + * unsigned long prog; -- program number * u_ong vers; -- version number * char *prot; -- protocol */ -extern CLIENT *clnt_create (__const char *__host, __const u_long __prog, - __const u_long __vers, __const char *__prot) +extern CLIENT *clnt_create (const char *__host, const unsigned long __prog, + const unsigned long __vers, const char *__prot) __THROW; @@ -301,23 +301,23 @@ extern CLIENT *clnt_create (__const char *__host, __const u_long __prog, * CLIENT * * clnttcp_create(raddr, prog, vers, sockp, sendsz, recvsz) * struct sockaddr_in *raddr; - * u_long prog; - * u_long version; + * unsigned long prog; + * unsigned long version; * register int *sockp; - * u_int sendsz; - * u_int recvsz; + * unsigned int sendsz; + * unsigned int recvsz; */ -extern CLIENT *clnttcp_create (struct sockaddr_in *__raddr, u_long __prog, - u_long __version, int *__sockp, u_int __sendsz, - u_int __recvsz) __THROW; +extern CLIENT *clnttcp_create (struct sockaddr_in *__raddr, unsigned long __prog, + unsigned long __version, int *__sockp, unsigned int __sendsz, + unsigned int __recvsz) __THROW; /* * UDP based rpc. * CLIENT * * clntudp_create(raddr, program, version, wait, sockp) * struct sockaddr_in *raddr; - * u_long program; - * u_long version; + * unsigned long program; + * unsigned long version; * struct timeval wait_resend; * int *sockp; * @@ -325,20 +325,20 @@ extern CLIENT *clnttcp_create (struct sockaddr_in *__raddr, u_long __prog, * CLIENT * * clntudp_bufcreate(raddr, program, version, wait, sockp, sendsz, recvsz) * struct sockaddr_in *raddr; - * u_long program; - * u_long version; + * unsigned long program; + * unsigned long version; * struct timeval wait_resend; * int *sockp; - * u_int sendsz; - * u_int recvsz; + * unsigned int sendsz; + * unsigned int recvsz; */ -extern CLIENT *clntudp_create (struct sockaddr_in *__raddr, u_long __program, - u_long __version, struct timeval __wait_resend, +extern CLIENT *clntudp_create (struct sockaddr_in *__raddr, unsigned long __program, + unsigned long __version, struct timeval __wait_resend, int *__sockp) __THROW; extern CLIENT *clntudp_bufcreate (struct sockaddr_in *__raddr, - u_long __program, u_long __version, + unsigned long __program, unsigned long __version, struct timeval __wait_resend, int *__sockp, - u_int __sendsz, u_int __recvsz) __THROW; + unsigned int __sendsz, unsigned int __recvsz) __THROW; @@ -348,28 +348,28 @@ extern CLIENT *clntudp_bufcreate (struct sockaddr_in *__raddr, * CLIENT * * clntunix_create(raddr, prog, vers, sockp, sendsz, recvsz) * struct sockaddr_un *raddr; - * u_long prog; - * u_long version; + * unsigned long prog; + * unsigned long version; * register int *sockp; - * u_int sendsz; - * u_int recvsz; + * unsigned int sendsz; + * unsigned int recvsz; */ -extern CLIENT *clntunix_create (struct sockaddr_un *__raddr, u_long __program, - u_long __version, int *__sockp, - u_int __sendsz, u_int __recvsz) __THROW; +extern CLIENT *clntunix_create (struct sockaddr_un *__raddr, unsigned long __program, + unsigned long __version, int *__sockp, + unsigned int __sendsz, unsigned int __recvsz) __THROW; -extern int callrpc (__const char *__host, __const u_long __prognum, - __const u_long __versnum, __const u_long __procnum, - __const xdrproc_t __inproc, __const char *__in, - __const xdrproc_t __outproc, char *__out) __THROW; +extern int callrpc (const char *__host, const unsigned long __prognum, + const unsigned long __versnum, const unsigned long __procnum, + const xdrproc_t __inproc, const char *__in, + const xdrproc_t __outproc, char *__out) __THROW; extern int _rpc_dtablesize (void) __THROW; /* * Print why creation failed */ -extern void clnt_pcreateerror (__const char *__msg) __THROW; /* stderr */ -extern char *clnt_spcreateerror(__const char *__msg) __THROW; /* string */ +extern void clnt_pcreateerror (const char *__msg) __THROW; /* stderr */ +extern char *clnt_spcreateerror(const char *__msg) __THROW; /* string */ /* * Like clnt_perror(), but is more verbose in its output @@ -379,9 +379,9 @@ extern void clnt_perrno (enum clnt_stat __num) __THROW; /* stderr */ /* * Print an English error message, given the client error code */ -extern void clnt_perror (CLIENT *__clnt, __const char *__msg) __THROW; +extern void clnt_perror (CLIENT *__clnt, const char *__msg) __THROW; /* stderr */ -extern char *clnt_sperror (CLIENT *__clnt, __const char *__msg) __THROW; +extern char *clnt_sperror (CLIENT *__clnt, const char *__msg) __THROW; /* string */ /* @@ -404,8 +404,8 @@ extern char *clnt_sperrno (enum clnt_stat __num) __THROW; /* string */ /* * get the port number on the host for the rpc program,version and proto */ -extern int getrpcport (__const char * __host, u_long __prognum, - u_long __versnum, u_int proto) __THROW; +extern int getrpcport (const char * __host, unsigned long __prognum, + unsigned long __versnum, unsigned int proto) __THROW; /* * get the local host's IP address without consulting diff --git a/mdk-stage1/dietlibc/include/rpc/key_prot.h b/mdk-stage1/dietlibc/include/rpc/key_prot.h index 3e2eb7208..c398b82f8 100644 --- a/mdk-stage1/dietlibc/include/rpc/key_prot.h +++ b/mdk-stage1/dietlibc/include/rpc/key_prot.h @@ -136,11 +136,11 @@ bool_t xdr_cryptkeyres(); #define MAXGIDS 16 struct unixcred { - u_int uid; - u_int gid; + unsigned int uid; + unsigned int gid; struct { - u_int gids_len; - u_int *gids_val; + unsigned int gids_len; + unsigned int *gids_val; } gids; }; typedef struct unixcred unixcred; @@ -205,61 +205,61 @@ bool_t xdr_key_netstres(); #endif -#define KEY_PROG ((u_long)100029) -#define KEY_VERS ((u_long)1) +#define KEY_PROG ((unsigned long)100029) +#define KEY_VERS ((unsigned long)1) #ifdef __cplusplus -#define KEY_SET ((u_long)1) +#define KEY_SET ((unsigned long)1) extern "C" keystatus * key_set_1(opaque *, CLIENT *); extern "C" keystatus * key_set_1_svc(opaque *, struct svc_req *); -#define KEY_ENCRYPT ((u_long)2) +#define KEY_ENCRYPT ((unsigned long)2) extern "C" cryptkeyres * key_encrypt_1(cryptkeyarg *, CLIENT *); extern "C" cryptkeyres * key_encrypt_1_svc(cryptkeyarg *, struct svc_req *); -#define KEY_DECRYPT ((u_long)3) +#define KEY_DECRYPT ((unsigned long)3) extern "C" cryptkeyres * key_decrypt_1(cryptkeyarg *, CLIENT *); extern "C" cryptkeyres * key_decrypt_1_svc(cryptkeyarg *, struct svc_req *); -#define KEY_GEN ((u_long)4) +#define KEY_GEN ((unsigned long)4) extern "C" des_block * key_gen_1(void *, CLIENT *); extern "C" des_block * key_gen_1_svc(void *, struct svc_req *); -#define KEY_GETCRED ((u_long)5) +#define KEY_GETCRED ((unsigned long)5) extern "C" getcredres * key_getcred_1(netnamestr *, CLIENT *); extern "C" getcredres * key_getcred_1_svc(netnamestr *, struct svc_req *); #elif __STDC__ -#define KEY_SET ((u_long)1) +#define KEY_SET ((unsigned long)1) extern keystatus * key_set_1(opaque *, CLIENT *); extern keystatus * key_set_1_svc(opaque *, struct svc_req *); -#define KEY_ENCRYPT ((u_long)2) +#define KEY_ENCRYPT ((unsigned long)2) extern cryptkeyres * key_encrypt_1(cryptkeyarg *, CLIENT *); extern cryptkeyres * key_encrypt_1_svc(cryptkeyarg *, struct svc_req *); -#define KEY_DECRYPT ((u_long)3) +#define KEY_DECRYPT ((unsigned long)3) extern cryptkeyres * key_decrypt_1(cryptkeyarg *, CLIENT *); extern cryptkeyres * key_decrypt_1_svc(cryptkeyarg *, struct svc_req *); -#define KEY_GEN ((u_long)4) +#define KEY_GEN ((unsigned long)4) extern des_block * key_gen_1(void *, CLIENT *); extern des_block * key_gen_1_svc(void *, struct svc_req *); -#define KEY_GETCRED ((u_long)5) +#define KEY_GETCRED ((unsigned long)5) extern getcredres * key_getcred_1(netnamestr *, CLIENT *); extern getcredres * key_getcred_1_svc(netnamestr *, struct svc_req *); #else /* Old Style C */ -#define KEY_SET ((u_long)1) +#define KEY_SET ((unsigned long)1) extern keystatus * key_set_1(); extern keystatus * key_set_1_svc(); -#define KEY_ENCRYPT ((u_long)2) +#define KEY_ENCRYPT ((unsigned long)2) extern cryptkeyres * key_encrypt_1(); extern cryptkeyres * key_encrypt_1_svc(); -#define KEY_DECRYPT ((u_long)3) +#define KEY_DECRYPT ((unsigned long)3) extern cryptkeyres * key_decrypt_1(); extern cryptkeyres * key_decrypt_1_svc(); -#define KEY_GEN ((u_long)4) +#define KEY_GEN ((unsigned long)4) extern des_block * key_gen_1(); extern des_block * key_gen_1_svc(); -#define KEY_GETCRED ((u_long)5) +#define KEY_GETCRED ((unsigned long)5) extern getcredres * key_getcred_1(); extern getcredres * key_getcred_1_svc(); #endif /* Old Style C */ -#define KEY_VERS2 ((u_long)2) +#define KEY_VERS2 ((unsigned long)2) #ifdef __cplusplus extern "C" keystatus * key_set_2(opaque *, CLIENT *); @@ -272,19 +272,19 @@ extern "C" des_block * key_gen_2(void *, CLIENT *); extern "C" des_block * key_gen_2_svc(void *, struct svc_req *); extern "C" getcredres * key_getcred_2(netnamestr *, CLIENT *); extern "C" getcredres * key_getcred_2_svc(netnamestr *, struct svc_req *); -#define KEY_ENCRYPT_PK ((u_long)6) +#define KEY_ENCRYPT_PK ((unsigned long)6) extern "C" cryptkeyres * key_encrypt_pk_2(cryptkeyarg2 *, CLIENT *); extern "C" cryptkeyres * key_encrypt_pk_2_svc(cryptkeyarg2 *, struct svc_req *); -#define KEY_DECRYPT_PK ((u_long)7) +#define KEY_DECRYPT_PK ((unsigned long)7) extern "C" cryptkeyres * key_decrypt_pk_2(cryptkeyarg2 *, CLIENT *); extern "C" cryptkeyres * key_decrypt_pk_2_svc(cryptkeyarg2 *, struct svc_req *); -#define KEY_NET_PUT ((u_long)8) +#define KEY_NET_PUT ((unsigned long)8) extern "C" keystatus * key_net_put_2(key_netstarg *, CLIENT *); extern "C" keystatus * key_net_put_2_svc(key_netstarg *, struct svc_req *); -#define KEY_NET_GET ((u_long)9) +#define KEY_NET_GET ((unsigned long)9) extern "C" key_netstres * key_net_get_2(void *, CLIENT *); extern "C" key_netstres * key_net_get_2_svc(void *, struct svc_req *); -#define KEY_GET_CONV ((u_long)10) +#define KEY_GET_CONV ((unsigned long)10) extern "C" cryptkeyres * key_get_conv_2(opaque *, CLIENT *); extern "C" cryptkeyres * key_get_conv_2_svc(opaque *, struct svc_req *); @@ -299,19 +299,19 @@ extern des_block * key_gen_2(void *, CLIENT *); extern des_block * key_gen_2_svc(void *, struct svc_req *); extern getcredres * key_getcred_2(netnamestr *, CLIENT *); extern getcredres * key_getcred_2_svc(netnamestr *, struct svc_req *); -#define KEY_ENCRYPT_PK ((u_long)6) +#define KEY_ENCRYPT_PK ((unsigned long)6) extern cryptkeyres * key_encrypt_pk_2(cryptkeyarg2 *, CLIENT *); extern cryptkeyres * key_encrypt_pk_2_svc(cryptkeyarg2 *, struct svc_req *); -#define KEY_DECRYPT_PK ((u_long)7) +#define KEY_DECRYPT_PK ((unsigned long)7) extern cryptkeyres * key_decrypt_pk_2(cryptkeyarg2 *, CLIENT *); extern cryptkeyres * key_decrypt_pk_2_svc(cryptkeyarg2 *, struct svc_req *); -#define KEY_NET_PUT ((u_long)8) +#define KEY_NET_PUT ((unsigned long)8) extern keystatus * key_net_put_2(key_netstarg *, CLIENT *); extern keystatus * key_net_put_2_svc(key_netstarg *, struct svc_req *); -#define KEY_NET_GET ((u_long)9) +#define KEY_NET_GET ((unsigned long)9) extern key_netstres * key_net_get_2(void *, CLIENT *); extern key_netstres * key_net_get_2_svc(void *, struct svc_req *); -#define KEY_GET_CONV ((u_long)10) +#define KEY_GET_CONV ((unsigned long)10) extern cryptkeyres * key_get_conv_2(opaque *, CLIENT *); extern cryptkeyres * key_get_conv_2_svc(opaque *, struct svc_req *); @@ -326,19 +326,19 @@ extern des_block * key_gen_2(); extern des_block * key_gen_2_svc(); extern getcredres * key_getcred_2(); extern getcredres * key_getcred_2_svc(); -#define KEY_ENCRYPT_PK ((u_long)6) +#define KEY_ENCRYPT_PK ((unsigned long)6) extern cryptkeyres * key_encrypt_pk_2(); extern cryptkeyres * key_encrypt_pk_2_svc(); -#define KEY_DECRYPT_PK ((u_long)7) +#define KEY_DECRYPT_PK ((unsigned long)7) extern cryptkeyres * key_decrypt_pk_2(); extern cryptkeyres * key_decrypt_pk_2_svc(); -#define KEY_NET_PUT ((u_long)8) +#define KEY_NET_PUT ((unsigned long)8) extern keystatus * key_net_put_2(); extern keystatus * key_net_put_2_svc(); -#define KEY_NET_GET ((u_long)9) +#define KEY_NET_GET ((unsigned long)9) extern key_netstres * key_net_get_2(); extern key_netstres * key_net_get_2_svc(); -#define KEY_GET_CONV ((u_long)10) +#define KEY_GET_CONV ((unsigned long)10) extern cryptkeyres * key_get_conv_2(); extern cryptkeyres * key_get_conv_2_svc(); #endif /* Old Style C */ diff --git a/mdk-stage1/dietlibc/include/rpc/netdb.h b/mdk-stage1/dietlibc/include/rpc/netdb.h index da4bddfc4..a991d3a95 100644 --- a/mdk-stage1/dietlibc/include/rpc/netdb.h +++ b/mdk-stage1/dietlibc/include/rpc/netdb.h @@ -52,12 +52,12 @@ struct rpcent extern void setrpcent (int __stayopen) __THROW; extern void endrpcent (void) __THROW; -extern struct rpcent *getrpcbyname (__const char *__name) __THROW; +extern struct rpcent *getrpcbyname (const char *__name) __THROW; extern struct rpcent *getrpcbynumber (int __number) __THROW; extern struct rpcent *getrpcent (void) __THROW; #ifdef __USE_MISC -extern int getrpcbyname_r (__const char *__name, struct rpcent *__result_buf, +extern int getrpcbyname_r (const char *__name, struct rpcent *__result_buf, char *__buffer, size_t __buflen, struct rpcent **__result) __THROW; diff --git a/mdk-stage1/dietlibc/include/rpc/pmap_clnt.h b/mdk-stage1/dietlibc/include/rpc/pmap_clnt.h index 68bc8d8ec..c63922772 100644 --- a/mdk-stage1/dietlibc/include/rpc/pmap_clnt.h +++ b/mdk-stage1/dietlibc/include/rpc/pmap_clnt.h @@ -45,7 +45,7 @@ __BEGIN_DECLS -typedef bool_t (*resultproc_t) (caddr_t resp, struct sockaddr_in *raddr); +typedef bool_t (*resultproc_t) (char* resp, struct sockaddr_in *raddr); /* * Usage: @@ -63,34 +63,34 @@ typedef bool_t (*resultproc_t) (caddr_t resp, struct sockaddr_in *raddr); * the procedure eachresult is called. Its form is: * done = eachresult(resp, raddr) * bool_t done; - * caddr_t resp; + * char* resp; * struct sockaddr_in raddr; * where resp points to the results of the call and raddr is the * address if the responder to the broadcast. */ -extern bool_t pmap_set (__const u_long __program, __const u_long __vers, - int __protocol, u_short __port) __THROW; -extern bool_t pmap_unset (__const u_long __program, __const u_long __vers) +extern bool_t pmap_set (const unsigned long __program, const unsigned long __vers, + int __protocol, unsigned short __port) __THROW; +extern bool_t pmap_unset (const unsigned long __program, const unsigned long __vers) __THROW; extern struct pmaplist *pmap_getmaps (struct sockaddr_in *__address) __THROW; extern enum clnt_stat pmap_rmtcall (struct sockaddr_in *__addr, - __const u_long __prog, - __const u_long __vers, - __const u_long __proc, + const unsigned long __prog, + const unsigned long __vers, + const unsigned long __proc, xdrproc_t __xdrargs, - caddr_t __argsp, xdrproc_t __xdrres, - caddr_t __resp, struct timeval __tout, - u_long *__port_ptr) __THROW; -extern enum clnt_stat clnt_broadcast (__const u_long __prog, - __const u_long __vers, - __const u_long __proc, xdrproc_t __xargs, - caddr_t __argsp, xdrproc_t __xresults, - caddr_t __resultsp, + char* __argsp, xdrproc_t __xdrres, + char* __resp, struct timeval __tout, + unsigned long *__port_ptr) __THROW; +extern enum clnt_stat clnt_broadcast (const unsigned long __prog, + const unsigned long __vers, + const unsigned long __proc, xdrproc_t __xargs, + char* __argsp, xdrproc_t __xresults, + char* __resultsp, resultproc_t __eachresult) __THROW; -extern u_short pmap_getport (struct sockaddr_in *__address, - __const u_long __program, - __const u_long __version, u_int __protocol) +extern unsigned short pmap_getport (struct sockaddr_in *__address, + const unsigned long __program, + const unsigned long __version, unsigned int __protocol) __THROW; __END_DECLS diff --git a/mdk-stage1/dietlibc/include/rpc/pmap_prot.h b/mdk-stage1/dietlibc/include/rpc/pmap_prot.h index fd7fb8e7e..da06d34c1 100644 --- a/mdk-stage1/dietlibc/include/rpc/pmap_prot.h +++ b/mdk-stage1/dietlibc/include/rpc/pmap_prot.h @@ -75,17 +75,17 @@ __BEGIN_DECLS * The service supports remote procedure calls on udp/ip or tcp/ip socket 111. */ -#define PMAPPORT ((u_short)111) -#define PMAPPROG ((u_long)100000) -#define PMAPVERS ((u_long)2) -#define PMAPVERS_PROTO ((u_long)2) -#define PMAPVERS_ORIG ((u_long)1) -#define PMAPPROC_NULL ((u_long)0) -#define PMAPPROC_SET ((u_long)1) -#define PMAPPROC_UNSET ((u_long)2) -#define PMAPPROC_GETPORT ((u_long)3) -#define PMAPPROC_DUMP ((u_long)4) -#define PMAPPROC_CALLIT ((u_long)5) +#define PMAPPORT ((unsigned short)111) +#define PMAPPROG ((unsigned long)100000) +#define PMAPVERS ((unsigned long)2) +#define PMAPVERS_PROTO ((unsigned long)2) +#define PMAPVERS_ORIG ((unsigned long)1) +#define PMAPPROC_NULL ((unsigned long)0) +#define PMAPPROC_SET ((unsigned long)1) +#define PMAPPROC_UNSET ((unsigned long)2) +#define PMAPPROC_GETPORT ((unsigned long)3) +#define PMAPPROC_DUMP ((unsigned long)4) +#define PMAPPROC_CALLIT ((unsigned long)5) struct pmap { long unsigned pm_prog; diff --git a/mdk-stage1/dietlibc/include/rpc/pmap_rmt.h b/mdk-stage1/dietlibc/include/rpc/pmap_rmt.h index 160f998ca..3b975d0fb 100644 --- a/mdk-stage1/dietlibc/include/rpc/pmap_rmt.h +++ b/mdk-stage1/dietlibc/include/rpc/pmap_rmt.h @@ -46,8 +46,8 @@ __BEGIN_DECLS struct rmtcallargs { - u_long prog, vers, proc, arglen; - caddr_t args_ptr; + unsigned long prog, vers, proc, arglen; + char* args_ptr; xdrproc_t xdr_args; }; @@ -55,9 +55,9 @@ extern bool_t xdr_rmtcall_args (XDR *__xdrs, struct rmtcallargs *__crp) __THROW; struct rmtcallres { - u_long *port_ptr; - u_long resultslen; - caddr_t results_ptr; + unsigned long *port_ptr; + unsigned long resultslen; + char* results_ptr; xdrproc_t xdr_results; }; diff --git a/mdk-stage1/dietlibc/include/rpc/rpc.h b/mdk-stage1/dietlibc/include/rpc/rpc.h index 20b341d74..a966d2e23 100644 --- a/mdk-stage1/dietlibc/include/rpc/rpc.h +++ b/mdk-stage1/dietlibc/include/rpc/rpc.h @@ -67,6 +67,4 @@ /* routines for parsing /etc/rpc */ #include <rpc/netdb.h> /* structures and routines to parse /etc/rpc */ -int bindresvport(int sd, struct sockaddr_in* sin) __THROW; - #endif /* rpc/rpc.h */ diff --git a/mdk-stage1/dietlibc/include/rpc/rpc_msg.h b/mdk-stage1/dietlibc/include/rpc/rpc_msg.h index 636d60ea9..d597608ab 100644 --- a/mdk-stage1/dietlibc/include/rpc/rpc_msg.h +++ b/mdk-stage1/dietlibc/include/rpc/rpc_msg.h @@ -44,8 +44,8 @@ * Copyright (C) 1984, Sun Microsystems, Inc. */ -#define RPC_MSG_VERSION ((u_long) 2) -#define RPC_SERVICE_PORT ((u_short) 2048) +#define RPC_MSG_VERSION ((unsigned long) 2) +#define RPC_SERVICE_PORT ((unsigned short) 2048) __BEGIN_DECLS @@ -93,11 +93,11 @@ struct accepted_reply { enum accept_stat ar_stat; union { struct { - u_long low; - u_long high; + unsigned long low; + unsigned long high; } AR_versions; struct { - caddr_t where; + char* where; xdrproc_t proc; } AR_results; /* and many other null cases */ @@ -113,8 +113,8 @@ struct rejected_reply { enum reject_stat rj_stat; union { struct { - u_long low; - u_long high; + unsigned long low; + unsigned long high; } RJ_versions; enum auth_stat RJ_why; /* why authentication did not work */ } ru; @@ -139,10 +139,10 @@ struct reply_body { * Body of an rpc request call. */ struct call_body { - u_long cb_rpcvers; /* must be equal to two */ - u_long cb_prog; - u_long cb_vers; - u_long cb_proc; + unsigned long cb_rpcvers; /* must be equal to two */ + unsigned long cb_prog; + unsigned long cb_vers; + unsigned long cb_proc; struct opaque_auth cb_cred; struct opaque_auth cb_verf; /* protocol specific - provided by client */ }; @@ -151,7 +151,7 @@ struct call_body { * The rpc message */ struct rpc_msg { - u_long rm_xid; + unsigned long rm_xid; enum msg_type rm_direction; union { struct call_body RM_cmb; diff --git a/mdk-stage1/dietlibc/include/rpc/svc.h b/mdk-stage1/dietlibc/include/rpc/svc.h index 27c997dde..ec598ba79 100644 --- a/mdk-stage1/dietlibc/include/rpc/svc.h +++ b/mdk-stage1/dietlibc/include/rpc/svc.h @@ -75,18 +75,18 @@ enum xprt_stat { typedef struct SVCXPRT SVCXPRT; struct SVCXPRT { int xp_sock; - u_short xp_port; /* associated port number */ + unsigned short xp_port; /* associated port number */ const struct xp_ops { bool_t (*xp_recv) (SVCXPRT *__xprt, struct rpc_msg *__msg); /* receive incoming requests */ enum xprt_stat (*xp_stat) (SVCXPRT *__xprt); /* get transport status */ bool_t (*xp_getargs) (SVCXPRT *__xprt, xdrproc_t __xdr_args, - caddr_t args_ptr); /* get arguments */ + char* args_ptr); /* get arguments */ bool_t (*xp_reply) (SVCXPRT *__xprt, struct rpc_msg *__msg); /* send reply */ bool_t (*xp_freeargs) (SVCXPRT *__xprt, xdrproc_t __xdr_args, - caddr_t args_ptr); + char* args_ptr); /* free mem allocated for args */ void (*xp_destroy) (SVCXPRT *__xprt); /* destroy this struct */ @@ -94,8 +94,8 @@ struct SVCXPRT { int xp_addrlen; /* length of remote address */ struct sockaddr_in xp_raddr; /* remote address */ struct opaque_auth xp_verf; /* raw response verifier */ - caddr_t xp_p1; /* private */ - caddr_t xp_p2; /* private */ + char* xp_p1; /* private */ + char* xp_p2; /* private */ char xp_pad [256]; /* padding, internal use */ }; @@ -110,7 +110,7 @@ struct SVCXPRT { * SVCXPRT *xprt; * struct rpc_msg *msg; * xdrproc_t xargs; - * caddr_t argsp; + * char* argsp; */ #define SVC_RECV(xprt, msg) \ (*(xprt)->xp_ops->xp_recv)((xprt), (msg)) @@ -151,7 +151,7 @@ struct svc_req { rpcvers_t rq_vers; /* service protocol version */ rpcproc_t rq_proc; /* the desired procedure */ struct opaque_auth rq_cred; /* raw creds from the wire */ - caddr_t rq_clntcred; /* read only cooked cred */ + char* rq_clntcred; /* read only cooked cred */ SVCXPRT *rq_xprt; /* associated transport */ }; @@ -227,7 +227,7 @@ extern void xprt_unregister (SVCXPRT *__xprt) __THROW; */ extern bool_t svc_sendreply (SVCXPRT *xprt, xdrproc_t __xdr_results, - caddr_t __xdr_location) __THROW; + char* __xdr_location) __THROW; extern void svcerr_decode (SVCXPRT *__xprt) __THROW; @@ -294,20 +294,20 @@ extern SVCXPRT *svcraw_create (void) __THROW; * Udp based rpc. */ extern SVCXPRT *svcudp_create (int __sock) __THROW; -extern SVCXPRT *svcudp_bufcreate (int __sock, u_int __sendsz, u_int __recvsz) +extern SVCXPRT *svcudp_bufcreate (int __sock, unsigned int __sendsz, unsigned int __recvsz) __THROW; /* * Tcp based rpc. */ -extern SVCXPRT *svctcp_create (int __sock, u_int __sendsize, u_int __recvsize) +extern SVCXPRT *svctcp_create (int __sock, unsigned int __sendsize, unsigned int __recvsize) __THROW; /* * Unix based rpc. */ -extern SVCXPRT *svcunix_create (int __sock, u_int __sendsize, u_int __recvsize, +extern SVCXPRT *svcunix_create (int __sock, unsigned int __sendsize, unsigned int __recvsize, char *__path) __THROW; diff --git a/mdk-stage1/dietlibc/include/rpc/types.h b/mdk-stage1/dietlibc/include/rpc/types.h index e2e8402be..d4be65e38 100644 --- a/mdk-stage1/dietlibc/include/rpc/types.h +++ b/mdk-stage1/dietlibc/include/rpc/types.h @@ -52,10 +52,6 @@ typedef unsigned long rpcport_t; # define TRUE (1) #endif -#ifndef NULL -# define NULL 0 -#endif - #include <stdlib.h> /* For malloc decl. */ #define mem_alloc(bsize) malloc(bsize) #define mem_free(ptr, bsize) free(ptr) @@ -63,13 +59,23 @@ typedef unsigned long rpcport_t; #ifndef makedev /* ie, we haven't already included it */ #include <sys/types.h> #endif + +# ifndef __dietlibc_u_char_defined +typedef char* caddr_t; +typedef uint32_t u_long; +typedef unsigned char u_char; +typedef unsigned short u_short; +typedef unsigned int u_int; +# define __dietlibc_u_char_defined +#endif + #include <sys/time.h> #include <sys/param.h> #include <netinet/in.h> #ifndef INADDR_LOOPBACK -#define INADDR_LOOPBACK (u_long)0x7F000001 +#define INADDR_LOOPBACK 0x7F000001UL #endif #ifndef MAXHOSTNAMELEN #define MAXHOSTNAMELEN 64 diff --git a/mdk-stage1/dietlibc/include/rpc/xdr.h b/mdk-stage1/dietlibc/include/rpc/xdr.h index ce092f085..590392070 100644 --- a/mdk-stage1/dietlibc/include/rpc/xdr.h +++ b/mdk-stage1/dietlibc/include/rpc/xdr.h @@ -118,13 +118,13 @@ struct XDR /* get a long from underlying stream */ bool_t (*x_putlong) (XDR *__xdrs, const long *__lp); /* put a long to " */ - bool_t (*x_getbytes) (XDR *__xdrs, caddr_t __addr, u_int __len); + bool_t (*x_getbytes) (XDR *__xdrs, char* __addr, unsigned int __len); /* get some bytes from " */ - bool_t (*x_putbytes) (XDR *__xdrs, const char *__addr, u_int __len); + bool_t (*x_putbytes) (XDR *__xdrs, const char *__addr, unsigned int __len); /* put some bytes to " */ - u_int (*x_getpostn) (const XDR *__xdrs); + unsigned int (*x_getpostn) (const XDR *__xdrs); /* returns bytes off from beginning */ - bool_t (*x_setpostn) (XDR *__xdrs, u_int __pos); + bool_t (*x_setpostn) (XDR *__xdrs, unsigned int __pos); /* lets you reposition the stream */ int32_t *(*x_inline) (XDR *__xdrs, int __len); /* buf quick ptr to buffered data */ @@ -136,9 +136,9 @@ struct XDR /* put a int to " */ } *x_ops; - caddr_t x_public; /* users' data */ - caddr_t x_private; /* pointer to private data */ - caddr_t x_base; /* private used for position info */ + char* x_public; /* users' data */ + char* x_private; /* pointer to private data */ + char* x_base; /* private used for position info */ int x_handy; /* extra private word */ }; @@ -149,7 +149,7 @@ struct XDR * The opaque pointer generally points to a structure of the data type * to be decoded. If this pointer is 0, then the type routines should * allocate dynamic storage of the appropriate size and return it. - * bool_t (*xdrproc_t)(XDR *, caddr_t *); + * bool_t (*xdrproc_t)(XDR *, char* *); */ typedef bool_t (*xdrproc_t) (XDR *, void *,...); @@ -160,9 +160,9 @@ typedef bool_t (*xdrproc_t) (XDR *, void *,...); * XDR *xdrs; * int32_t *int32p; * long *longp; - * caddr_t addr; - * u_int len; - * u_int pos; + * char* addr; + * unsigned int len; + * unsigned int pos; */ #define XDR_GETINT32(xdrs, int32p) \ (*(xdrs)->x_ops->x_getint32)(xdrs, int32p) @@ -263,17 +263,17 @@ struct xdr_discrim * in the RPC code will not work on 64bit Solaris platforms ! */ #define IXDR_GET_LONG(buf) \ - ((long)ntohl((u_long)*__extension__((u_int32_t*)(buf))++)) + ((long)ntohl((unsigned long)*__extension__((uint32_t*)(buf))++)) #define IXDR_PUT_LONG(buf, v) \ - (*__extension__((u_int32_t*)(buf))++ = (long)htonl((u_long)(v))) -#define IXDR_GET_U_LONG(buf) ((u_long)IXDR_GET_LONG(buf)) + (*__extension__((uint32_t*)(buf))++ = (long)htonl((unsigned long)(v))) +#define IXDR_GET_U_LONG(buf) ((unsigned long)IXDR_GET_LONG(buf)) #define IXDR_PUT_U_LONG(buf, v) IXDR_PUT_LONG(buf, (long)(v)) #define IXDR_GET_BOOL(buf) ((bool_t)IXDR_GET_LONG(buf)) #define IXDR_GET_ENUM(buf, t) ((t)IXDR_GET_LONG(buf)) #define IXDR_GET_SHORT(buf) ((short)IXDR_GET_LONG(buf)) -#define IXDR_GET_U_SHORT(buf) ((u_short)IXDR_GET_LONG(buf)) +#define IXDR_GET_U_SHORT(buf) ((unsigned short)IXDR_GET_LONG(buf)) #define IXDR_PUT_BOOL(buf, v) IXDR_PUT_LONG(buf, (long)(v)) #define IXDR_PUT_ENUM(buf, v) IXDR_PUT_LONG(buf, (long)(v)) @@ -288,15 +288,15 @@ struct xdr_discrim */ extern bool_t xdr_void (void) __THROW; extern bool_t xdr_short (XDR *__xdrs, short *__sp) __THROW; -extern bool_t xdr_u_short (XDR *__xdrs, u_short *__usp) __THROW; +extern bool_t xdr_u_short (XDR *__xdrs, unsigned short *__usp) __THROW; extern bool_t xdr_int (XDR *__xdrs, int *__ip) __THROW; -extern bool_t xdr_u_int (XDR *__xdrs, u_int *__up) __THROW; +extern bool_t xdr_u_int (XDR *__xdrs, unsigned int *__up) __THROW; extern bool_t xdr_long (XDR *__xdrs, long *__lp) __THROW; -extern bool_t xdr_u_long (XDR *__xdrs, u_long *__ulp) __THROW; -extern bool_t xdr_hyper (XDR *__xdrs, __quad_t *__llp) __THROW; -extern bool_t xdr_u_hyper (XDR *__xdrs, __u_quad_t *__ullp) __THROW; -extern bool_t xdr_longlong_t (XDR *__xdrs, __quad_t *__llp) __THROW; -extern bool_t xdr_u_longlong_t (XDR *__xdrs, __u_quad_t *__ullp) __THROW; +extern bool_t xdr_u_long (XDR *__xdrs, unsigned long *__ulp) __THROW; +extern bool_t xdr_hyper (XDR *__xdrs, int64_t *__llp) __THROW; +extern bool_t xdr_u_hyper (XDR *__xdrs, uint64_t *__ullp) __THROW; +extern bool_t xdr_longlong_t (XDR *__xdrs, int64_t *__llp) __THROW; +extern bool_t xdr_u_longlong_t (XDR *__xdrs, uint64_t *__ullp) __THROW; extern bool_t xdr_int8_t (XDR *__xdrs, int8_t *__ip) __THROW; extern bool_t xdr_uint8_t (XDR *__xdrs, uint8_t *__up) __THROW; extern bool_t xdr_int16_t (XDR *__xdrs, int16_t *__ip) __THROW; @@ -307,28 +307,28 @@ extern bool_t xdr_int64_t (XDR *__xdrs, int64_t *__ip) __THROW; extern bool_t xdr_uint64_t (XDR *__xdrs, uint64_t *__up) __THROW; extern bool_t xdr_bool (XDR *__xdrs, bool_t *__bp) __THROW; extern bool_t xdr_enum (XDR *__xdrs, enum_t *__ep) __THROW; -extern bool_t xdr_array (XDR * _xdrs, caddr_t *__addrp, u_int *__sizep, - u_int __maxsize, u_int __elsize, xdrproc_t __elproc) +extern bool_t xdr_array (XDR * _xdrs, char* *__addrp, unsigned int *__sizep, + unsigned int __maxsize, unsigned int __elsize, xdrproc_t __elproc) __THROW; -extern bool_t xdr_bytes (XDR *__xdrs, char **__cpp, u_int *__sizep, - u_int __maxsize) __THROW; -extern bool_t xdr_opaque (XDR *__xdrs, caddr_t __cp, u_int __cnt) __THROW; -extern bool_t xdr_string (XDR *__xdrs, char **__cpp, u_int __maxsize) __THROW; +extern bool_t xdr_bytes (XDR *__xdrs, char **__cpp, unsigned int *__sizep, + unsigned int __maxsize) __THROW; +extern bool_t xdr_opaque (XDR *__xdrs, char* __cp, unsigned int __cnt) __THROW; +extern bool_t xdr_string (XDR *__xdrs, char **__cpp, unsigned int __maxsize) __THROW; extern bool_t xdr_union (XDR *__xdrs, enum_t *__dscmp, char *__unp, const struct xdr_discrim *__choices, xdrproc_t dfault) __THROW; extern bool_t xdr_char (XDR *__xdrs, char *__cp) __THROW; -extern bool_t xdr_u_char (XDR *__xdrs, u_char *__cp) __THROW; -extern bool_t xdr_vector (XDR *__xdrs, char *__basep, u_int __nelem, - u_int __elemsize, xdrproc_t __xdr_elem) __THROW; +extern bool_t xdr_u_char (XDR *__xdrs, unsigned char *__cp) __THROW; +extern bool_t xdr_vector (XDR *__xdrs, char *__basep, unsigned int __nelem, + unsigned int __elemsize, xdrproc_t __xdr_elem) __THROW; extern bool_t xdr_float (XDR *__xdrs, float *__fp) __THROW; extern bool_t xdr_double (XDR *__xdrs, double *__dp) __THROW; -extern bool_t xdr_reference (XDR *__xdrs, caddr_t *__xpp, u_int __size, +extern bool_t xdr_reference (XDR *__xdrs, char* *__xpp, unsigned int __size, xdrproc_t __proc) __THROW; extern bool_t xdr_pointer (XDR *__xdrs, char **__objpp, - u_int __obj_size, xdrproc_t __xdr_obj) __THROW; + unsigned int __obj_size, xdrproc_t __xdr_obj) __THROW; extern bool_t xdr_wrapstring (XDR *__xdrs, char **__cpp) __THROW; -extern u_long xdr_sizeof (xdrproc_t, void *) __THROW; +extern unsigned long xdr_sizeof (xdrproc_t, void *) __THROW; /* * Common opaque bytes objects used by many rpc protocols; @@ -337,7 +337,7 @@ extern u_long xdr_sizeof (xdrproc_t, void *) __THROW; #define MAX_NETOBJ_SZ 1024 struct netobj { - u_int n_len; + unsigned int n_len; char *n_bytes; }; typedef struct netobj netobj; @@ -349,16 +349,16 @@ extern bool_t xdr_netobj (XDR *__xdrs, struct netobj *__np) __THROW; */ /* XDR using memory buffers */ -extern void xdrmem_create (XDR *__xdrs, const caddr_t __addr, - u_int __size, enum xdr_op __xop) __THROW; +extern void xdrmem_create (XDR *__xdrs, const char* __addr, + unsigned int __size, enum xdr_op __xop) __THROW; /* XDR using stdio library */ extern void xdrstdio_create (XDR *__xdrs, FILE *__file, enum xdr_op __xop) __THROW; /* XDR pseudo records for tcp */ -extern void xdrrec_create (XDR *__xdrs, u_int __sendsize, - u_int __recvsize, caddr_t __tcp_handle, +extern void xdrrec_create (XDR *__xdrs, unsigned int __sendsize, + unsigned int __recvsize, char* __tcp_handle, int (*__readit) (char *, char *, int), int (*__writeit) (char *, char *, int)) __THROW; diff --git a/mdk-stage1/dietlibc/include/sched.h b/mdk-stage1/dietlibc/include/sched.h index 5e4430d29..b6442c73b 100644 --- a/mdk-stage1/dietlibc/include/sched.h +++ b/mdk-stage1/dietlibc/include/sched.h @@ -4,13 +4,6 @@ #include <time.h> #include <sys/types.h> -#ifndef u16 -#define u16 __u16 -#endif - -/* till those F**KIN' kernel headers are sane: A COPY ! - * #include <linux/sched.h> - * A COPY OF THE STUFF WE NEED.... *GRUMBLE* */ /* * cloning flags: @@ -26,7 +19,9 @@ #define CLONE_PARENT 0x00008000 /* set if we want to have the same parent as the cloner */ #define CLONE_THREAD 0x00010000 /* Same thread group? */ -#define CLONE_SIGNAL (CLONE_SIGHAND | CLONE_THREA) +#define CLONE_SIGNAL (CLONE_SIGHAND | CLONE_THREAD) + +int clone(void*(*fn)(void*),void*stack,int flags,void*arg); /* * Scheduling policies @@ -42,7 +37,7 @@ #define SCHED_YIELD 0x10 struct sched_param { - int sched_priority; + int sched_priority; }; /* END OF COPY form kernel-header */ diff --git a/mdk-stage1/dietlibc/include/setjmp.h b/mdk-stage1/dietlibc/include/setjmp.h index 66fc288f4..b591936ac 100644 --- a/mdk-stage1/dietlibc/include/setjmp.h +++ b/mdk-stage1/dietlibc/include/setjmp.h @@ -16,6 +16,42 @@ typedef int __jmp_buf[6]; # define JB_SIZE 24 #endif +#ifdef __x86_64__ +#ifndef __ASSEMBLER__ +typedef long __jmp_buf[8]; +#endif +# define JB_RBX 0 +# define JB_RBP 1 +# define JB_R12 2 +# define JB_R13 3 +# define JB_R14 4 +# define JB_R15 5 +# define JB_RSP 6 +# define JB_PC 7 +# define JB_SIZE 64 +#endif + +#ifdef __s390__ +#ifndef __ASSEMBLER__ +typedef struct { + long int gregs[10]; + long fpregs[4]; +} __jmp_buf[1]; +#endif +#define __JB_GPR6 0 +#define __JB_GPR7 1 +#define __JB_GPR8 2 +#define __JB_GPR9 3 +#define __JB_GPR10 4 +#define __JB_GPR11 5 +#define __JB_GPR12 6 +#define __JB_GPR13 7 +#define __JB_GPR14 8 +#define __JB_GPR15 9 + +#define _JMPBUF_UNWINDS(jmpbuf, address) ((int) (address) < (jmpbuf)->gregs[__JB_GPR15]) +#endif + #ifdef __alpha__ #define JB_S0 0 #define JB_S1 1 @@ -55,18 +91,80 @@ typedef struct #endif #ifdef __sparc__ +#ifdef __arch64__ + +#define MC_TSTATE 0 +#define MC_PC 1 +#define MC_NPC 2 +#define MC_Y 3 +#define MC_G1 4 +#define MC_G2 5 +#define MC_G3 6 +#define MC_G4 7 +#define MC_G5 8 +#define MC_G6 9 +#define MC_G7 10 +#define MC_O0 11 +#define MC_O1 12 +#define MC_O2 13 +#define MC_O3 14 +#define MC_O4 15 +#define MC_O5 16 +#define MC_O6 17 +#define MC_O7 18 +#define MC_NGREG 19 + +#define FLAG_SAVEMASK 512 +#ifndef __ASSEMBLER__ +#include <signal.h> + +/* this equal to ucontext from "include/asm-sparc64/uctx.h" */ +typedef struct __sparc64_jmp_buf { + struct __sparc64_jmp_buf *uc_link; + unsigned long uc_flags; + sigset_t uc_sigmask; + struct { + unsigned long mc_gregs[MC_NGREG]; + unsigned long mc_fp; + unsigned long mc_i7; + struct { + union { + unsigned int sregs[32]; + unsigned long dregs[32]; + long double qregs[16]; + } mcfpu_fregs; + unsigned long mcfpu_fsr; + unsigned long mcfpu_fprs; + unsigned long mcfpu_gsr; + struct { + unsigned long *mcfq_addr; + unsigned int mcfq_insn; + } *mcfpu_fq; + unsigned char mcfpu_qcnt; + unsigned char mcfpu_qentsz; + unsigned char mcfpu_enab; + } mc_fpregs; + } uc_mcontext; +} __jmp_buf[1]; + +#endif + +#else + #define JB_SP 0 #define JB_FP 1 #define JB_PC 2 #ifndef __ASSEMBLER__ typedef int __jmp_buf[3]; #endif + +#endif #endif #ifdef __arm__ #define __JMP_BUF_SP 8 #ifndef __ASSEMBLER__ -typedef int __jmp_buf[10]; +typedef int __jmp_buf[24]; #endif #endif @@ -83,39 +181,49 @@ typedef long int __jmp_buf[58]; #endif #endif +#ifdef __hppa__ #ifndef __ASSEMBLER__ +typedef double __jmp_buf[21]; +#endif +#endif -typedef int sig_atomic_t; -#define __sig_atomic_t sig_atomic_t +#ifdef __ia64__ +#ifndef __ASSEMBLER__ +typedef long __jmp_buf[70] __attribute__ ((aligned(16))); +#endif +#endif -# define _SIGSET_NWORDS (1024 / (8 * sizeof (unsigned long int))) -typedef struct - { - unsigned long int __val[_SIGSET_NWORDS]; - } __sigset_t; +#ifndef __ASSEMBLER__ +#include <signal.h> + +/* typedef int sig_atomic_t; */ +#define __sig_atomic_t sig_atomic_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]; +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 int __sigsetjmp(jmp_buf __env,int __savemask) __THROW; -extern void longjmp (jmp_buf __env, int __val) - __THROW __attribute__ ((__noreturn__)); +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__)); +extern void siglongjmp(sigjmp_buf __env,int __val) + __THROW __attribute__((__noreturn__)); +#ifdef _BSD_SOURCE +#define setjmp(env) __sigsetjmp(env,1) +#else #define setjmp(env) __sigsetjmp(env,0) +#endif #define sigsetjmp(a,b) __sigsetjmp(a,b) #endif diff --git a/mdk-stage1/dietlibc/include/shadow.h b/mdk-stage1/dietlibc/include/shadow.h index 4d6341af1..1c84de9e6 100644 --- a/mdk-stage1/dietlibc/include/shadow.h +++ b/mdk-stage1/dietlibc/include/shadow.h @@ -19,6 +19,12 @@ struct spwd { extern struct spwd *getspent(void) __THROW; extern void setspent(void) __THROW; extern void endspent(void) __THROW; -extern struct spwd *getspnam (__const char *__name) __THROW; +extern struct spwd *getspnam (const char *__name) __THROW; + +int getspent_r(struct spwd *res, char *buf, size_t buflen, + struct spwd **res_sig) __THROW; +int getspnam_r(const char* name, + struct spwd *res, char *buf, size_t buflen, + struct spwd **res_sig) __THROW; #endif /* _SHADOW_H */ diff --git a/mdk-stage1/dietlibc/include/signal.h b/mdk-stage1/dietlibc/include/signal.h index 9ed93fe83..fdc0518cf 100644 --- a/mdk-stage1/dietlibc/include/signal.h +++ b/mdk-stage1/dietlibc/include/signal.h @@ -5,31 +5,496 @@ #define __WANT_POSIX1B_SIGNALS__ -#include <linux/types.h> -#include <linux/signal.h> +#include <sys/types.h> +#include <sys/time.h> + +#define NSIG 32 + +#ifdef __mips__ +#define _NSIG 128 +#else +#define _NSIG 64 +#endif + +#define SIGHUP 1 +#define SIGINT 2 +#define SIGQUIT 3 +#define SIGILL 4 +#define SIGTRAP 5 +#define SIGABRT 6 +#define SIGIOT 6 +#define SIGFPE 8 +#define SIGKILL 9 +#define SIGSEGV 11 +#define SIGPIPE 13 +#define SIGALRM 14 +#define SIGTERM 15 +#define SIGUNUSED 31 +#if defined(__i386__) || defined(__x86_64__) || defined(__powerpc__) || defined(__arm__) \ + || defined(__s390__) || defined(__ia64__) +#define SIGBUS 7 +#define SIGUSR1 10 +#define SIGUSR2 12 +#define SIGSTKFLT 16 +#define SIGCHLD 17 +#define SIGCONT 18 +#define SIGSTOP 19 +#define SIGTSTP 20 +#define SIGTTIN 21 +#define SIGTTOU 22 +#define SIGURG 23 +#define SIGXCPU 24 +#define SIGXFSZ 25 +#define SIGVTALRM 26 +#define SIGPROF 27 +#define SIGWINCH 28 +#define SIGIO 29 +#define SIGPWR 30 +#define SIGSYS 31 +#elif defined(__alpha__) || defined(__sparc__) +#define SIGEMT 7 +#define SIGBUS 10 +#define SIGSYS 12 +#define SIGURG 16 +#define SIGSTOP 17 +#define SIGTSTP 18 +#define SIGCONT 19 +#define SIGCHLD 20 +#define SIGTTIN 21 +#define SIGTTOU 22 +#define SIGIO 23 +#define SIGXCPU 24 +#define SIGXFSZ 25 +#define SIGVTALRM 26 +#define SIGPROF 27 +#define SIGWINCH 28 +#define SIGPWR 29 +#define SIGUSR1 30 +#define SIGUSR2 31 +#if defined(__alpha__) +#define SIGINFO SIGPWR +#endif +#elif defined(__mips__) +#define SIGEMT 7 +#define SIGBUS 10 +#define SIGSYS 12 +#define SIGUSR1 16 +#define SIGUSR2 17 +#define SIGCHLD 18 +#define SIGPWR 19 +#define SIGWINCH 20 +#define SIGURG 21 +#define SIGIO 22 +#define SIGSTOP 23 +#define SIGTSTP 24 +#define SIGCONT 25 +#define SIGTTIN 26 +#define SIGTTOU 27 +#define SIGVTALRM 28 +#define SIGPROF 29 +#define SIGXCPU 30 +#define SIGXFSZ 31 +#elif defined(__hppa__) +#define SIGEMT 7 +#define SIGBUS 10 +#define SIGSYS 12 +#define SIGUSR1 16 +#define SIGUSR2 17 +#define SIGCHLD 18 +#define SIGPWR 19 +#define SIGVTALRM 20 +#define SIGPROF 21 +#define SIGIO 22 +#define SIGWINCH 23 +#define SIGSTOP 24 +#define SIGTSTP 25 +#define SIGCONT 26 +#define SIGTTIN 27 +#define SIGTTOU 28 +#define SIGURG 29 +#define SIGLOST 30 +#define SIGUNUSED 31 +#define SIGRESERVE SIGUNUSE +#define SIGXCPU 33 +#define SIGXFSZ 34 +#define SIGSTKFLT 36 + +#else +#error signal layout not yet known +#endif + +#define SIGCLD SIGCHLD +#define SIGLOST SIGPWR +#define SIGPOLL SIGIO + +/* These should not be considered constants from userland. */ +#ifdef __hppa__ +#define SIGRTMIN 37 +#else +#define SIGRTMIN 32 +#endif +#define SIGRTMAX (_NSIG-1) + +/* SA_FLAGS values: */ +#if defined(__alpha__) +#define SA_ONSTACK 0x00000001 +#define SA_RESTART 0x00000002 +#define SA_NOCLDSTOP 0x00000004 +#define SA_NODEFER 0x00000008 +#define SA_RESETHAND 0x00000010 +#define SA_NOCLDWAIT 0x00000020 /* not supported yet */ +#define SA_SIGINFO 0x00000040 +#define SA_INTERRUPT 0x20000000 /* dummy -- ignored */ +#elif defined(__hppa__) +#define SA_ONSTACK 0x00000001 +#define SA_RESETHAND 0x00000004 +#define SA_NOCLDSTOP 0x00000008 +#define SA_SIGINFO 0x00000010 +#define SA_NODEFER 0x00000020 +#define SA_RESTART 0x00000040 +#define SA_NOCLDWAIT 0x00000080 /* not supported yet */ +#define _SA_SIGGFAULT 0x00000100 /* HPUX */ +#define SA_INTERRUPT 0x20000000 /* dummy -- ignored */ +#define SA_RESTORER 0x04000000 /* obsolete -- ignored */ +#elif defined (__sparc__) +#define SV_SSTACK 1 /* This signal handler should use sig-stack */ +#define SV_INTR 2 /* Sig return should not restart system call */ +#define SV_RESET 4 /* Set handler to SIG_DFL upon taken signal */ +#define SV_IGNCHILD 8 /* Do not send SIGCHLD */ + +#define SA_NOCLDSTOP SV_IGNCHILD +#define SA_STACK SV_SSTACK +#define SA_ONSTACK SV_SSTACK +#define SA_RESTART SV_INTR +#define SA_RESETHAND SV_RESET +#define SA_INTERRUPT 0x10 +#define SA_NODEFER 0x20 +#define SA_SHIRQ 0x40 +#define SA_NOCLDWAIT 0x100 /* not supported yet */ +#define SA_SIGINFO 0x200 +#else +#if defined (__mips__) +#define SA_NOCLDSTOP 0x00000001 +#define SA_SIGINFO 0x00000008 +#define SA_NOCLDWAIT 0x00010000 /* Not supported yet */ +#else +#define SA_NOCLDSTOP 0x00000001 +#define SA_NOCLDWAIT 0x00000002 /* not supported yet */ +#define SA_SIGINFO 0x00000004 +#endif +#if defined(__arm__) +#define SA_THIRTYTWO 0x02000000 +#endif +#define SA_RESTORER 0x04000000 +#define SA_ONSTACK 0x08000000 +#define SA_RESTART 0x10000000 +#define SA_INTERRUPT 0x20000000 /* dummy -- ignored */ +#define SA_NODEFER 0x40000000 +#define SA_RESETHAND 0x80000000 +#endif + +/* ugh, historic Linux legacy, for gpm :-( */ +#define SA_NOMASK SA_NODEFER +#define SA_ONESHOT SA_RESETHAND + +/* sigaltstack controls */ +#define SS_ONSTACK 1 +#define SS_DISABLE 2 + +#define MINSIGSTKSZ 2048 +#define SIGSTKSZ 8192 + +#if defined(__alpha__) || defined(__mips__) +#define SIG_BLOCK 1 /* for blocking signals */ +#define SIG_UNBLOCK 2 /* for unblocking signals */ +#define SIG_SETMASK 3 /* for setting the signal mask */ +#else +#define SIG_BLOCK 0 /* for blocking signals */ +#define SIG_UNBLOCK 1 /* for unblocking signals */ +#define SIG_SETMASK 2 /* for setting the signal mask */ +#endif + +typedef int sig_atomic_t; typedef void (*sighandler_t)(int); +#ifdef _BSD_SOURCE +typedef sighandler_t sig_t; +#endif + +#define SIG_DFL ((sighandler_t)0) /* default signal handling */ +#define SIG_IGN ((sighandler_t)1) /* ignore signal */ +#define SIG_ERR ((sighandler_t)-1) /* error return from signal */ + +typedef union sigval { + int sival_int; + void *sival_ptr; +} sigval_t; + +#define SI_MAX_SIZE 128 +#define SI_PAD_SIZE ((SI_MAX_SIZE/sizeof(int)) - 3) + +typedef struct siginfo { + int si_signo; + int si_errno; + int si_code; + union { + int _pad[SI_PAD_SIZE]; + /* kill() */ + struct { + pid_t _pid; /* sender's pid */ + uid_t _uid; /* sender's uid */ + } _kill; + /* POSIX.1b timers */ + struct { + unsigned int _timer1; + unsigned int _timer2; + } _timer; + /* POSIX.1b signals */ + struct { + pid_t _pid; /* sender's pid */ + uid_t _uid; /* sender's uid */ + sigval_t _sigval; + } _rt; + /* SIGCHLD */ + struct { + pid_t _pid; /* which child */ + uid_t _uid; /* sender's uid */ + int _status; /* exit code */ + clock_t _utime; + clock_t _stime; + } _sigchld; + /* SIGILL, SIGFPE, SIGSEGV, SIGBUS */ + struct { + void *_addr; /* faulting insn/memory ref. */ + } _sigfault; + /* SIGPOLL */ + struct { + int _band; /* POLL_IN, POLL_OUT, POLL_MSG */ + int _fd; + } _sigpoll; + } _sifields; +} siginfo_t; + +/* + * How these fields are to be accessed. + */ +#define si_pid _sifields._kill._pid +#define si_uid _sifields._kill._uid +#define si_status _sifields._sigchld._status +#define si_utime _sifields._sigchld._utime +#define si_stime _sifields._sigchld._stime +#define si_value _sifields._rt._sigval +#define si_int _sifields._rt._sigval.sival_int +#define si_ptr _sifields._rt._sigval.sival_ptr +#define si_addr _sifields._sigfault._addr +#define si_band _sifields._sigpoll._band +#define si_fd _sifields._sigpoll._fd + +/* Values for `si_code'. Positive values are reserved for kernel-generated + signals. */ +enum { + SI_ASYNCNL = -6, /* Sent by asynch name lookup completion. */ +# define SI_ASYNCNL SI_ASYNCNL + SI_SIGIO, /* Sent by queued SIGIO. */ +# define SI_SIGIO SI_SIGIO + SI_ASYNCIO, /* Sent by AIO completion. */ +# define SI_ASYNCIO SI_ASYNCIO + SI_MESGQ, /* Sent by real time mesq state change. */ +# define SI_MESGQ SI_MESGQ + SI_TIMER, /* Sent by timer expiration. */ +# define SI_TIMER SI_TIMER + SI_QUEUE, /* Sent by sigqueue. */ +# define SI_QUEUE SI_QUEUE + SI_USER, /* Sent by kill, sigsend, raise. */ +# define SI_USER SI_USER + SI_KERNEL = 0x80 /* Send by kernel. */ +#define SI_KERNEL SI_KERNEL +}; + + +/* `si_code' values for SIGILL signal. */ +enum { + ILL_ILLOPC = 1, /* Illegal opcode. */ +# define ILL_ILLOPC ILL_ILLOPC + ILL_ILLOPN, /* Illegal operand. */ +# define ILL_ILLOPN ILL_ILLOPN + ILL_ILLADR, /* Illegal addressing mode. */ +# define ILL_ILLADR ILL_ILLADR + ILL_ILLTRP, /* Illegal trap. */ +# define ILL_ILLTRP ILL_ILLTRP + ILL_PRVOPC, /* Privileged opcode. */ +# define ILL_PRVOPC ILL_PRVOPC + ILL_PRVREG, /* Privileged register. */ +# define ILL_PRVREG ILL_PRVREG + ILL_COPROC, /* Coprocessor error. */ +# define ILL_COPROC ILL_COPROC + ILL_BADSTK /* Internal stack error. */ +# define ILL_BADSTK ILL_BADSTK +}; + +/* `si_code' values for SIGFPE signal. */ +enum { + FPE_INTDIV = 1, /* Integer divide by zero. */ +# define FPE_INTDIV FPE_INTDIV + FPE_INTOVF, /* Integer overflow. */ +# define FPE_INTOVF FPE_INTOVF + FPE_FLTDIV, /* Floating point divide by zero. */ +# define FPE_FLTDIV FPE_FLTDIV + FPE_FLTOVF, /* Floating point overflow. */ +# define FPE_FLTOVF FPE_FLTOVF + FPE_FLTUND, /* Floating point underflow. */ +# define FPE_FLTUND FPE_FLTUND + FPE_FLTRES, /* Floating point inexact result. */ +# define FPE_FLTRES FPE_FLTRES + FPE_FLTINV, /* Floating point invalid operation. */ +# define FPE_FLTINV FPE_FLTINV + FPE_FLTSUB /* Subscript out of range. */ +# define FPE_FLTSUB FPE_FLTSUB +}; + +/* `si_code' values for SIGSEGV signal. */ +enum { + SEGV_MAPERR = 1, /* Address not mapped to object. */ +# define SEGV_MAPERR SEGV_MAPERR + SEGV_ACCERR /* Invalid permissions for mapped object. */ +# define SEGV_ACCERR SEGV_ACCERR +}; + +/* `si_code' values for SIGBUS signal. */ +enum { + BUS_ADRALN = 1, /* Invalid address alignment. */ +# define BUS_ADRALN BUS_ADRALN + BUS_ADRERR, /* Non-existant physical address. */ +# define BUS_ADRERR BUS_ADRERR + BUS_OBJERR /* Object specific hardware error. */ +# define BUS_OBJERR BUS_OBJERR +}; + +/* `si_code' values for SIGTRAP signal. */ +enum { + TRAP_BRKPT = 1, /* Process breakpoint. */ +# define TRAP_BRKPT TRAP_BRKPT + TRAP_TRACE /* Process trace trap. */ +# define TRAP_TRACE TRAP_TRACE +}; + +/* `si_code' values for SIGCHLD signal. */ +enum { + CLD_EXITED = 1, /* Child has exited. */ +# define CLD_EXITED CLD_EXITED + CLD_KILLED, /* Child was killed. */ +# define CLD_KILLED CLD_KILLED + CLD_DUMPED, /* Child terminated abnormally. */ +# define CLD_DUMPED CLD_DUMPED + CLD_TRAPPED, /* Traced child has trapped. */ +# define CLD_TRAPPED CLD_TRAPPED + CLD_STOPPED, /* Child has stopped. */ +# define CLD_STOPPED CLD_STOPPED + CLD_CONTINUED /* Stopped child has continued. */ +# define CLD_CONTINUED CLD_CONTINUED +}; + +/* `si_code' values for SIGPOLL signal. */ +enum { + POLL_IN = 1, /* Data input available. */ +# define POLL_IN POLL_IN + POLL_OUT, /* Output buffers available. */ +# define POLL_OUT POLL_OUT + POLL_MSG, /* Input message available. */ +# define POLL_MSG POLL_MSG + POLL_ERR, /* I/O error. */ +# define POLL_ERR POLL_ERR + POLL_PRI, /* High priority input available. */ +# define POLL_PRI POLL_PRI + POLL_HUP /* Device disconnected. */ +# define POLL_HUP POLL_HUP +}; + +#define _NSIG_WORDS ((_NSIG/sizeof(long))>>3) + +typedef struct { + unsigned long sig[_NSIG_WORDS]; +} sigset_t; + +struct sigaction { +#if defined(__alpha__) + union { + sighandler_t _sa_handler; + void (*_sa_sigaction)(int, siginfo_t*, void*); + } _u; + sigset_t sa_mask; + unsigned long sa_flags; +#elif defined(__ia64__) || defined(__hppa__) + union { + sighandler_t _sa_handler; + void (*_sa_sigaction)(int, siginfo_t*, void*); + } _u; + unsigned long sa_flags; + sigset_t sa_mask; +#elif defined(__mips__) + unsigned long sa_flags; + union { + sighandler_t _sa_handler; + void (*_sa_sigaction)(int, siginfo_t*, void*); + } _u; + sigset_t sa_mask; + void (*sa_restorer)(void); + int sa_resv[1]; +#else /* arm, i386, ppc, s390, sparc, saprc64, x86_64 */ + union { + sighandler_t _sa_handler; + void (*_sa_sigaction)(int, siginfo_t*, void*); + } _u; + unsigned long sa_flags; + void (*sa_restorer)(void); + sigset_t sa_mask; +#endif +}; + +#define sa_handler _u._sa_handler +#define sa_sigaction _u._sa_sigaction + +typedef struct sigaltstack { +#if defined(__mips__) + void *ss_sp; + size_t ss_size; + int ss_flags; +#else + void *ss_sp; + int ss_flags; + size_t ss_size; +#endif +} stack_t; + +int sigaltstack(const struct sigaltstack *newstack, struct sigaltstack *oldstack) __THROW; + int sigemptyset(sigset_t *set) __THROW; int sigfillset(sigset_t *set) __THROW; int sigaddset(sigset_t *set, int signum) __THROW; int sigdelset(sigset_t *set, int signum) __THROW; +int sigismember(const sigset_t *set, int signo) __THROW; +int sigsuspend(const sigset_t *mask) __THROW; +int sigpending(sigset_t *set) __THROW; int sigprocmask(int how, const sigset_t *set, sigset_t *oldset) __THROW; + + sighandler_t signal(int signum, sighandler_t action); + int raise (int sig) __THROW; +int kill(pid_t pid, int sig) __THROW; + int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact) __THROW; -int sigaltstack(const struct sigaltstack *newstack, struct sigaltstack *oldstack) __THROW; -#ifndef SIGCLD -#define SIGCLD SIGCHLD -#endif +int sigtimedwait(const sigset_t *mask, siginfo_t *info, const struct timespec *ts) __THROW; +int sigqueueinfo(int pid, int sig, siginfo_t *info) __THROW; +int siginterrupt(int sig, int flag) __THROW; -extern const char *const sys_siglist[]; +int killpg(int pgrp, int sig) __THROW; -typedef __sighandler_t sig_t; +/* 0 is OK ! kernel puts in MAX_THREAD_TIMEOUT :) */ +#define sigwaitinfo(m, i) sigtimedwait((m),(i),0) -#ifndef NSIG -#define NSIG _NSIG -#endif +extern const char *const sys_siglist[]; #endif diff --git a/mdk-stage1/dietlibc/include/stdint.h b/mdk-stage1/dietlibc/include/stdint.h index d287e6794..bbc7ddf0c 100644 --- a/mdk-stage1/dietlibc/include/stdint.h +++ b/mdk-stage1/dietlibc/include/stdint.h @@ -1,6 +1,30 @@ #ifndef _STDINT_H #define _STDINT_H -#include <sys/types.h> +#include <inttypes.h> + +typedef int8_t int_least8_t; +typedef int16_t int_least16_t; +typedef int32_t int_least32_t; +typedef uint8_t uint_least8_t; +typedef uint16_t uint_least16_t; +typedef uint32_t uint_least32_t; + +#ifndef __STRICT_ANSI__ +typedef int64_t int_least64_t; +typedef uint64_t uint_least64_t; +#endif + +typedef signed char int_fast8_t; +typedef signed long int int_fast16_t; +typedef signed long int int_fast32_t; +typedef signed long long int int_fast64_t; + +typedef unsigned char uint_fast8_t; +typedef unsigned long int uint_fast16_t; +typedef unsigned long int uint_fast32_t; +typedef unsigned long long int uint_fast64_t; + +#include <endian.h> #endif diff --git a/mdk-stage1/dietlibc/include/stdio.h b/mdk-stage1/dietlibc/include/stdio.h index 92d9dc0cb..04783c3b8 100644 --- a/mdk-stage1/dietlibc/include/stdio.h +++ b/mdk-stage1/dietlibc/include/stdio.h @@ -3,6 +3,7 @@ #include <sys/cdefs.h> #include <sys/types.h> +#include <sys/stat.h> typedef struct __stdio_file FILE; @@ -10,28 +11,32 @@ FILE *fopen (const char *path, const char *mode) __THROW; FILE *fdopen (int fildes, const char *mode) __THROW; FILE *freopen (const char *path, const char *mode, FILE *stream) __THROW; -int printf(const char *format, ...) __THROW; -int fprintf(FILE *stream, const char *format, ...) __THROW; -int sprintf(char *str, const char *format, ...) __THROW; -int snprintf(char *str, size_t size, const char *format, ...) __THROW; -int asprintf(char **ptr, const char* format, ...) __THROW; +int printf(const char *format, ...) __THROW __attribute__((format(printf,1,2))); +int fprintf(FILE *stream, const char *format, ...) __THROW __attribute__((format(printf,2,3))); +int sprintf(char *str, const char *format, ...) __THROW __attribute__((format(printf,2,3))); +int snprintf(char *str, size_t size, const char *format, ...) __THROW __attribute__((format(printf,3,4))); +int asprintf(char **ptr, const char* format, ...) __THROW __attribute_malloc__ __attribute__((format(printf,2,3))); -int scanf( const char *format, ...) __THROW; -int fscanf( FILE *stream, const char *format, ...) __THROW; -int sscanf( const char *str, const char *format, ...) __THROW; +int scanf(const char *format, ...) __THROW __attribute__((format(scanf,1,2))); +int fscanf(FILE *stream, const char *format, ...) __THROW __attribute__((format(scanf,2,3))); +int sscanf(const char *str, const char *format, ...) __THROW __attribute__((format(scanf,2,3))); #include <stdarg.h> -int vprintf(const char *format, va_list ap) __THROW; -int vfprintf(FILE *stream, const char *format, va_list ap) __THROW; -int vsprintf(char *str, const char *format, va_list ap) __THROW; -int vsnprintf(char *str, size_t size, const char *format, va_list ap) __THROW; +int vprintf(const char *format, va_list ap) __THROW __attribute__((format(printf,1,0))); +int vfprintf(FILE *stream, const char *format, va_list ap) __THROW __attribute__((format(printf,2,0))); +int vsprintf(char *str, const char *format, va_list ap) __THROW __attribute__((format(printf,2,0))); +int vsnprintf(char *str, size_t size, const char *format, va_list ap) __THROW __attribute__((format(printf,3,0))); -int vscanf( const char *format, va_list ap) __THROW; -int vsscanf( const char *str, const char *format, va_list ap) __THROW; -int vfscanf( FILE *stream, const char *format, va_list ap) __THROW; +int fdprintf(int fd, const char *format, ...) __THROW __attribute__((format(printf,2,3))); +int vfdprintf(int fd, const char *format, va_list ap) __THROW __attribute__((format(printf,2,0))); + +int vscanf(const char *format, va_list ap) __THROW __attribute__((format(scanf,1,0))); +int vsscanf(const char *str, const char *format, va_list ap) __THROW __attribute__((format(scanf,2,0))); +int vfscanf(FILE *stream, const char *format, va_list ap) __THROW __attribute__((format(scanf,2,0))); int fgetc(FILE *stream) __THROW; +int fgetc_unlocked(FILE *stream) __THROW; char *fgets(char *s, int size, FILE *stream) __THROW; int getc(FILE *stream) __THROW; int getchar(void) __THROW; @@ -39,34 +44,53 @@ char *gets(char *s) __THROW; int ungetc(int c, FILE *stream) __THROW; int fputc(int c, FILE *stream) __THROW; +int fputc_unlocked(int c, FILE *stream) __THROW; int fputs(const char *s, FILE *stream) __THROW; +int putchar(int c) __THROW; + #define putc(c,stream) fputc(c,stream) #define putchar(c) fputc(c,stdout) #define getchar() fgetc(stdin) #define getc(stream) fgetc(stream) +#define getc_unlocked(stream) fgetc_unlocked(stream) int puts(const char *s) __THROW; -long fseek( FILE *stream, long offset, int whence) __THROW; -long ftell( FILE *stream) __THROW; -void rewind( FILE *stream) __THROW; -int fgetpos( FILE *stream, fpos_t *pos) __THROW; -int fsetpos( FILE *stream, fpos_t *pos) __THROW; +int fseek(FILE *stream, long offset, int whence) __THROW; +long ftell(FILE *stream) __THROW; +int fseeko(FILE *stream, off_t offset, int whence) __THROW; +off_t ftello(FILE *stream) __THROW; -size_t fread( void *ptr, size_t size, size_t nmemb, FILE *stream) __THROW; +#ifndef __NO_STAT64 +int fseeko64(FILE *stream, loff_t offset, int whence) __THROW; +loff_t ftello64(FILE *stream) __THROW; -size_t fwrite( const void *ptr, size_t size, size_t nmemb, FILE *stream) __THROW; +#if defined _FILE_OFFSET_BITS && _FILE_OFFSET_BITS == 64 +#define off_t loff_t +#define fseeko(foo,bar,baz) fseeko64(foo,bar,baz) +#define ftello(foo) ftello64(foo) +#endif + +#endif + +void rewind(FILE *stream) __THROW; +int fgetpos(FILE *stream, fpos_t *pos) __THROW; +int fsetpos(FILE *stream, fpos_t *pos) __THROW; + +size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream) __THROW; + +size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream) __THROW; int fflush(FILE *stream) __THROW; int fclose(FILE *stream) __THROW; -void clearerr(FILE *stream) __THROW; int feof (FILE *stream) __THROW; -int ferror( FILE *stream) __THROW; -int fileno( FILE *stream) __THROW; +int ferror(FILE *stream) __THROW; +int fileno(FILE *stream) __THROW; +void clearerr(FILE *stream) __THROW; int remove(const char *pathname) __THROW; @@ -74,7 +98,7 @@ void perror(const char *s) __THROW; extern FILE *stdin, *stdout, *stderr; -#define EOF (int)(-1) +#define EOF (-1) #define BUFSIZ 128 @@ -91,7 +115,33 @@ int setvbuf(FILE *stream, char *buf, int mode , size_t size) __THROW; FILE *popen(const char *command, const char *type) __THROW; int pclose(FILE *stream) __THROW; -#define getc_unlocked(stream) getc(stream) -#define putc_unlocked(c,stream) putc(c,stream) +#ifndef SEEK_SET +#define SEEK_SET 0 +#define SEEK_CUR 1 +#define SEEK_END 2 +#endif + +#define L_tmpnam 128 +#define P_tmpdir "/tmp" +char* tmpnam(char *s) __THROW; /* DO NOT USE!!! Use mkstemp instead! */ +char* tempnam(char* dir,char* _template); /* dito */ +FILE* tmpfile(void) __THROW; + +#define FILENAME_MAX 4095 +#define FOPEN_MAX 16 + +#ifdef _POSIX_SOURCE +#define L_ctermid 9 +#define L_cuserid 9 +#endif + +void flockfile(FILE* f) __THROW; +void funlockfile(FILE* f) __THROW; + +#ifdef _GNU_SOURCE +ssize_t getline(char **lineptr, size_t *n, FILE *stream); +ssize_t getdelim(char **lineptr, size_t *n, int delim, FILE *stream); +#define getline(lineptr,n,stream) getdelim(lineptr,n,'\n',stream) +#endif #endif diff --git a/mdk-stage1/dietlibc/include/stdlib.h b/mdk-stage1/dietlibc/include/stdlib.h index 6a13a48ff..5824a6ffa 100644 --- a/mdk-stage1/dietlibc/include/stdlib.h +++ b/mdk-stage1/dietlibc/include/stdlib.h @@ -1,32 +1,38 @@ #ifndef _STDLIB_H #define _STDLIB_H +#ifndef __ASSEMBLER__ + #include <sys/cdefs.h> #include <sys/types.h> +#include <alloca.h> -#define __LIBC_DIETLIBC__ - -void *calloc(size_t nmemb, size_t size) __THROW; -void *malloc(size_t size) __THROW; +void *calloc(size_t nmemb, size_t size) __attribute_malloc__ __THROW; +void *malloc(size_t size) __attribute_malloc__ __THROW; void free(void *ptr) __THROW; -void *realloc(void *ptr, size_t size) __THROW; +void *realloc(void *ptr, size_t size) __attribute_malloc__ __THROW; char *getenv(const char *name) __THROW __pure__; int putenv(const char *string) __THROW; int setenv(const char *name, const char *value, int overwrite) __THROW; void unsetenv(const char *name) __THROW; +int system (const char * string) __THROW; int atexit(void (*function)(void)) __THROW; +float strtof(const char *nptr, char **endptr) __THROW; double strtod(const char *nptr, char **endptr) __THROW; +long double strtold(const char *nptr, char **endptr) __THROW; long int strtol(const char *nptr, char **endptr, int base) __THROW; unsigned long int strtoul(const char *nptr, char **endptr, int base) __THROW; -int __ltostr(char *s, int size, unsigned long i, int base, char UpCase) __THROW; -#ifdef __GNUC__ -long long int strtoll(const char *nptr, char **endptr, int base) __THROW; -unsigned long long int strtoull(const char *nptr, char **endptr, int base) __THROW; -int __lltostr(char *s, int size, unsigned long long i, int base, char UpCase) __THROW; +extern int __ltostr(char *s, unsigned int size, unsigned long i, unsigned int base, int UpCase) __THROW; +extern int __dtostr(double d,char *buf,unsigned int maxlen,unsigned int prec,unsigned int prec2) __THROW; + +#ifndef __STRICT_ANSI__ +__extension__ long long int strtoll(const char *nptr, char **endptr, int base) __THROW; +__extension__ unsigned long long int strtoull(const char *nptr, char **endptr, int base) __THROW; +__extension__ int __lltostr(char *s, unsigned int size, unsigned long long i, unsigned int base, int UpCase) __THROW; #endif int atoi(const char *nptr) __THROW; @@ -36,32 +42,59 @@ double atof(const char *nptr) __THROW; void exit(int status) __THROW __attribute__((noreturn)); void abort(void) __THROW; -/* warning: the rand() implementation of the diet libc really sucks. */ -#define RAND_MAX 32767 - extern int rand(void) __THROW; +extern int rand_r(unsigned int *seed) __THROW; extern void srand(unsigned int seed) __THROW; +#ifdef _BSD_SOURCE +extern int random(void) __THROW; +extern void srandom(unsigned int seed) __THROW; +#endif + +typedef unsigned short randbuf[3]; +double drand48(void) __THROW; +long lrand48(void) __THROW; +long mrand48(void) __THROW; +void srand48(long seed) __THROW; +unsigned short *seed48(randbuf buf) __THROW; +void lcong48(unsigned short param[7]) __THROW; +long jrand48(randbuf buf) __THROW; +long nrand48(randbuf buf) __THROW; +double erand48(randbuf buf) __THROW; void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)) __THROW; void *bsearch(const void *key, const void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)) __THROW; extern char **environ; -#define EXIT_SUCCESS 0 -#define EXIT_FAILURE 1 - /* now this function is the greatest bullshit I have ever seen. * The ISO people must be out of their minds. */ typedef struct { int quot,rem; } div_t; div_t div(int numer, int denom) __THROW __attribute__((const)); -void *alloca(size_t size) __THROW; /* gcc built-in */ - char *realpath(const char *path, char *resolved_path) __THROW; -int abs(int j) __THROW; +int mkstemp(char *_template); +char* mkdtemp(char *_template); + +char* mktemp(char *_template); + +int abs(int i) __THROW __attribute__((const)); +long int labs(long int i) __THROW __attribute__((const)); +__extension__ long long int llabs(long long int i) __THROW __attribute__((const)); + +#ifdef _XOPEN_SOURCE +int grantpt (int fd) __THROW; +int unlockpt (int fd) __THROW; +char *ptsname (int fd) __THROW; +#endif + +#endif + +#define EXIT_FAILURE 1 +#define EXIT_SUCCESS 0 + +#define RAND_MAX ((1<<31) -2) -long int random(void) __THROW; -void srandom(unsigned int seed) __THROW; +#define MB_CUR_MAX 1 #endif diff --git a/mdk-stage1/dietlibc/include/string.h b/mdk-stage1/dietlibc/include/string.h index 1ef78ae54..4c56bf8bb 100644 --- a/mdk-stage1/dietlibc/include/string.h +++ b/mdk-stage1/dietlibc/include/string.h @@ -5,53 +5,80 @@ #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__; + +/* gcc unfortunately has some internal prototypes that are not compliant + * to the single unix specification and if we define the correct + * prototypes here, gcc emits warnings. */ +#if __GNUC__ > 2 || defined(__mips__) || defined(__alpha__) || defined(__arm__) || defined(__x86_64__) +void* memset(void *s, int c, size_t n) __THROW; int memcmp(const void *s1, const void *s2, size_t n) __THROW __pure__; -int strcmp(const char *s1, const char *s2) __THROW __pure__; +void* memcpy(void *dest, const void *src, size_t n) __THROW; +#endif + +#if __GNUC__ < 3 || defined(__x86_64__) +/* gcc 3 unfortunately has internal prototypes for these functions that + * differ from ours. Unfortunately, gcc will complain whether we have + * the correct prototypes or whether we don't have prototypes :-( */ +char *strncpy(char *dest, const char *src, size_t n) __THROW; int strncmp(const char *s1, const char *s2, size_t n) __THROW __pure__; +char *strncat(char *dest, const char *src, size_t n) __THROW; +#endif -int strcasecmp(const char *s1, const char *s2) __THROW __pure__; -int strncasecmp(const char *s1, const char *s2, size_t n) __THROW __pure__; +int strcmp(const char *s1, const char *s2) __THROW __pure__; size_t strlen(const char *s) __THROW __pure__; char *strstr(const char *haystack, const char *needle) __THROW __pure__; -char *strdup(const char *s) __THROW; +char *strdup(const char *s) __attribute_malloc__ __THROW; char *strchr(const char *s, int c) __THROW __pure__; char *strrchr(const char *s, int c) __THROW __pure__; char *strcat(char *dest, const char *src) __THROW; -char *strncat(char *dest, const char *src, size_t n) __THROW; -size_t strspn(const char *s, const char *accept) __THROW; +size_t strspn(const char *s, const char *_accept) __THROW; size_t strcspn(const char *s, const char *reject) __THROW; -char *strpbrk(const char *s, const char *accept) __THROW; +char *strpbrk(const char *s, const char *_accept) __THROW; char *strsep(char **stringp, const char *delim) __THROW; -void* memset(void *s, int c, size_t n) __THROW; +void* memchr(const void *s, int c, size_t n) __THROW __pure__; +#ifdef _GNU_SOURCE +void* memrchr(const void *s, int c, size_t n) __THROW __pure__; +#endif -#undef NULL -#define NULL (void*)0 +/* I would like to make this const, but Paul Jarc points out it has to + * be char* :-( */ +char *strerror(int errnum) __THROW; +/* work around b0rken GNU crapware like tar 1.13.19 */ +#define strerror strerror -#define bzero(s,n) memset(s,0,n) -#define bcopy(src,dest,n) memmove(dest,src,n) -#define bcmp(a,b,n) memcmp(a,b,n) +#ifdef _GNU_SOURCE +const char *strsignal(int signum) __THROW; +void *memmem(const void *haystack, size_t haystacklen, const void *needle, size_t needlelen) __THROW; -char *strerror(int errnum) __THROW; -char *strsignal(int signum) __THROW; +char *strndup(const char *s,size_t n) __attribute_malloc__ __THROW; +#endif char *strtok(char *s, const char *delim) __THROW; char *strtok_r(char *s, const char *delim, char **ptrptr) __THROW; -int ffs(int i) __THROW __attribute__((__const__)); +size_t strlcpy(char *dst, const char *src, size_t size) __THROW; +size_t strlcat(char *dst, const char *src, size_t size) __THROW; + +int strcoll(const char *s1, const char *s2) __THROW; +size_t strxfrm(char *dest, const char *src, size_t n) __THROW; + +#ifdef _BSD_SOURCE +#include <strings.h> +#endif + +char *stpcpy(char *dest, const char *src); #endif diff --git a/mdk-stage1/dietlibc/include/strings.h b/mdk-stage1/dietlibc/include/strings.h index ec947a9b9..fd2616465 100644 --- a/mdk-stage1/dietlibc/include/strings.h +++ b/mdk-stage1/dietlibc/include/strings.h @@ -1,2 +1,23 @@ -#warning "your code included obsolescent <strings.h>. Please change that to <string.h>!" -#include <string.h> +#ifndef _STRINGS_H +#define _STRINGS_H + +#include <stddef.h> +#include <sys/cdefs.h> + +int strcasecmp(const char *s1, const char *s2) __THROW __pure__; +int strncasecmp(const char *s1, const char *s2, size_t n) __THROW __pure__; +int ffs(int i) __THROW __attribute__((__const__)); + +int bcmp(const void *, const void *, size_t) __THROW __pure__; +void bcopy(const void *, void *, size_t) __THROW; +void bzero(void *, size_t) __THROW; +char *index(const char *, int) __THROW __pure__; +char *rindex(const char *, int) __THROW __pure__; + +#define bzero(s,n) memset(s,0,n) +#define bcopy(src,dest,n) memmove(dest,src,n) +#define bcmp(a,b,n) memcmp(a,b,n) +#define index(a,b) strchr(a,b) +#define rindex(a,b) strrchr(a,b) + +#endif diff --git a/mdk-stage1/dietlibc/include/sys/cdefs.h b/mdk-stage1/dietlibc/include/sys/cdefs.h index 895bb74b8..45d3e50d6 100644 --- a/mdk-stage1/dietlibc/include/sys/cdefs.h +++ b/mdk-stage1/dietlibc/include/sys/cdefs.h @@ -1,10 +1,7 @@ #ifndef _SYS_CDEFS_H #define _SYS_CDEFS_H -#define __dietlibc__ - #ifndef __cplusplus -#define throw () #define __THROW #define __BEGIN_DECLS #define __END_DECLS @@ -16,21 +13,43 @@ #ifndef __GNUC__ #define __attribute__(xyz) +#define __extension__ #endif -#define __pure__ -#ifdef __GNUC__ #if (__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 96)) -#undef __pure__ #define __pure__ __attribute__ ((__pure__)) +#else +#define __pure__ #endif #if (__GNUC__ == 2) && (__GNUC_MINOR__ < 95) #define __restrict__ #endif +#ifndef __STRICT_ANSI__ +#if __GNUC__ < 3 +#define __builtin_expect(foo,bar) (foo) +#define expect(foo,bar) (foo) +#else +#define expect(foo,bar) __builtin_expect(foo,bar) +#define __attribute_malloc__ __attribute__((malloc)) +#endif +#endif + +#ifndef __attribute_malloc__ +#define __attribute_malloc__ #endif #define __P(x) x +#define __ptr_t void* + +#ifdef __STRICT_ANSI__ +#define inline +#endif + +#ifndef __i386__ +#define regparm(x) +#endif + #endif diff --git a/mdk-stage1/dietlibc/include/sys/file.h b/mdk-stage1/dietlibc/include/sys/file.h index 93787fd42..cf2c74305 100644 --- a/mdk-stage1/dietlibc/include/sys/file.h +++ b/mdk-stage1/dietlibc/include/sys/file.h @@ -2,18 +2,9 @@ #define _SYS_FILE_H #include <sys/cdefs.h> +#include <fcntl.h> extern int fcntl(int fd, int cmd, ...) __THROW; extern int flock(int fd, int operation) __THROW; -/* Operations for the `flock' call. */ -#define LOCK_SH 1 /* Shared lock. */ -#define LOCK_EX 2 /* Exclusive lock. */ -#define LOCK_UN 8 /* Unlock. */ - -/* Can be OR'd in to one of the above. */ -#define LOCK_NB 4 /* Don't block when locking. */ - - - #endif /* _SYS_FILE_H */ diff --git a/mdk-stage1/dietlibc/include/sys/io.h b/mdk-stage1/dietlibc/include/sys/io.h index cce841735..5edf33a57 100644 --- a/mdk-stage1/dietlibc/include/sys/io.h +++ b/mdk-stage1/dietlibc/include/sys/io.h @@ -1,41 +1,44 @@ -#ifndef _IO_H -#define _IO_H +#ifndef _SYS_IO_H +#define _SYS_IO_H -int ioperm(unsigned long from, unsigned long num, int turn_on) __THROW; +#include <sys/cdefs.h> -#ifdef __i386__ - -static __inline void -outb (unsigned char value, unsigned short int port) -{ - __asm__ __volatile__ ("outb %b0,%w1": :"a" (value), "Nd" (port)); -} +extern int ioperm(unsigned long from, unsigned long num, int turn_on) __THROW; +extern int iopl(int level) __THROW; -static __inline unsigned char -inb (unsigned short int port) -{ +#ifndef __STRICT_ANSI__ +/* anyone have a cleaner solution for this mess? */ +#ifdef __i386__ +static inline unsigned char inb (unsigned short int port) { unsigned char _v; - __asm__ __volatile__ ("inb %w1,%0":"=a" (_v):"Nd" (port)); return _v; } -static __inline unsigned short int -inw (unsigned short int port) -{ +static inline unsigned short inw (unsigned short int port) { unsigned short _v; - __asm__ __volatile__ ("inw %w1,%0":"=a" (_v):"Nd" (port)); return _v; } -static __inline void -outw (unsigned short int value, unsigned short int port) -{ - __asm__ __volatile__ ("outw %w0,%w1": :"a" (value), "Nd" (port)); +static inline unsigned int inl (unsigned short int port) { + unsigned int _v; + __asm__ __volatile__ ("inl %w1,%0":"=a" (_v):"Nd" (port)); + return _v; +} + +static inline void outb (unsigned char value, unsigned short int port) { + __asm__ __volatile__ ("outb %b0,%w1": :"a" (value), "Nd" (port)); +} +static inline void outw (unsigned short value, unsigned short int port) { + __asm__ __volatile__ ("outw %w0,%w1": :"a" (value), "Nd" (port)); } +static inline void outl (unsigned int value, unsigned short int port) { + __asm__ __volatile__ ("outl %0,%w1": :"a" (value), "Nd" (port)); +} +#endif #endif #endif diff --git a/mdk-stage1/dietlibc/include/sys/ioctl.h b/mdk-stage1/dietlibc/include/sys/ioctl.h index fca1aeeab..a7890f038 100644 --- a/mdk-stage1/dietlibc/include/sys/ioctl.h +++ b/mdk-stage1/dietlibc/include/sys/ioctl.h @@ -2,8 +2,30 @@ #define _IOCTL_H #include <sys/cdefs.h> -#include <linux/ioctl.h> -#include <asm/ioctls.h> + +#if defined(__i386__) || defined(__x86_64__) || defined(__ia64__) +#include <sys/i386-ioctl.h> +#elif defined(__alpha__) +#include <sys/alpha-ioctl.h> +#elif defined(__arm__) +#include <sys/arm-ioctl.h> +#elif defined(__sparc__) +#include <sys/sparc-ioctl.h> +#elif defined(__mips__) +#include <sys/mips-ioctl.h> +#elif defined(__powerpc__) +#include <sys/ppc-ioctl.h> +#elif defined(__s390__) +#include <sys/s390-ioctl.h> +#elif defined(__hppa__) +#include <sys/hppa-ioctl.h> +#endif + +/* used for /dev/epoll */ +#define EP_ALLOC _IOR('P', 1, int) +#define EP_POLL _IOWR('P', 2, struct evpoll) +#define EP_FREE _IO('P', 3) +#define EP_ISPOLLED _IOWR('P', 4, struct pollfd) int ioctl(int d, int request, ...) __THROW; diff --git a/mdk-stage1/dietlibc/include/sys/ipc.h b/mdk-stage1/dietlibc/include/sys/ipc.h index 9184a2a82..481d97b62 100644 --- a/mdk-stage1/dietlibc/include/sys/ipc.h +++ b/mdk-stage1/dietlibc/include/sys/ipc.h @@ -2,7 +2,48 @@ #define _SYS_IPC_H #include <sys/cdefs.h> -#include <linux/ipc.h> -#include <asm/page.h> +#include <sys/types.h> + +#define SEMOP 1 +#define SEMGET 2 +#define SEMCTL 3 +#define MSGSND 11 +#define MSGRCV 12 +#define MSGGET 13 +#define MSGCTL 14 +#define SHMAT 21 +#define SHMDT 22 +#define SHMGET 23 +#define SHMCTL 24 + +#define IPC_PRIVATE ((key_t) 0) + +#define IPC_CREAT 00001000 /* create if key is nonexistent */ +#define IPC_EXCL 00002000 /* fail if key exists */ +#define IPC_NOWAIT 00004000 /* return error on wait */ + +#define IPC_RMID 0 /* remove resource */ +#define IPC_SET 1 /* set ipc_perm options */ +#define IPC_STAT 2 /* get ipc_perm options */ +#define IPC_INFO 3 /* see ipcs */ + +/* + * Version flags for semctl, msgctl, and shmctl commands + * These are passed as bitflags or-ed with the actual command + */ +#define IPC_OLD 0 /* Old version (no 32-bit UID support on many + architectures) */ +#define IPC_64 0x0100 /* New version (support 32-bit UIDs, bigger + message sizes, etc. */ + +struct ipc_perm { + key_t key; + uid_t uid; + gid_t gid; + uid_t cuid; + gid_t cgid; + mode_t mode; + unsigned short seq; +}; #endif diff --git a/mdk-stage1/dietlibc/include/sys/kd.h b/mdk-stage1/dietlibc/include/sys/kd.h index 9e9a5152b..98b337ede 100644 --- a/mdk-stage1/dietlibc/include/sys/kd.h +++ b/mdk-stage1/dietlibc/include/sys/kd.h @@ -1,6 +1,183 @@ #ifndef _SYS_KD_H #define _SYS_KD_H -#include <linux/kd.h> +/* 0x4B is 'K', to avoid collision with termios and vt */ + +#define GIO_FONT 0x4B60 /* gets font in expanded form */ +#define PIO_FONT 0x4B61 /* use font in expanded form */ + +#define GIO_FONTX 0x4B6B /* get font using struct consolefontdesc */ +#define PIO_FONTX 0x4B6C /* set font using struct consolefontdesc */ + +struct consolefontdesc { + unsigned short charcount; /* characters in font (256 or 512) */ + unsigned short charheight; /* scan lines per character (1-32) */ + char *chardata; /* font data in expanded form */ +}; + +#define PIO_FONTRESET 0x4B6D /* reset to default font */ + +#define GIO_CMAP 0x4B70 /* gets colour palette on VGA+ */ +#define PIO_CMAP 0x4B71 /* sets colour palette on VGA+ */ + +#define KIOCSOUND 0x4B2F /* start sound generation (0 for off) */ +#define KDMKTONE 0x4B30 /* generate tone */ + +#define KDGETLED 0x4B31 /* return current led state */ +#define KDSETLED 0x4B32 /* set led state [lights, not flags] */ +#define LED_SCR 0x01 /* scroll lock led */ +#define LED_CAP 0x04 /* caps lock led */ +#define LED_NUM 0x02 /* num lock led */ + +#define KDGKBTYPE 0x4B33 /* get keyboard type */ +#define KB_84 0x01 +#define KB_101 0x02 /* this is what we always answer */ +#define KB_OTHER 0x03 + +#define KDADDIO 0x4B34 /* add i/o port as valid */ +#define KDDELIO 0x4B35 /* del i/o port as valid */ +#define KDENABIO 0x4B36 /* enable i/o to video board */ +#define KDDISABIO 0x4B37 /* disable i/o to video board */ + +#define KDSETMODE 0x4B3A /* set text/graphics mode */ +#define KD_TEXT 0x00 +#define KD_GRAPHICS 0x01 +#define KD_TEXT0 0x02 /* obsolete */ +#define KD_TEXT1 0x03 /* obsolete */ +#define KDGETMODE 0x4B3B /* get current mode */ + +#define KDMAPDISP 0x4B3C /* map display into address space */ +#define KDUNMAPDISP 0x4B3D /* unmap display from address space */ + +typedef char scrnmap_t; + +#define E_TABSZ 256 +#define GIO_SCRNMAP 0x4B40 /* get screen mapping from kernel */ +#define PIO_SCRNMAP 0x4B41 /* put screen mapping table in kernel */ +#define GIO_UNISCRNMAP 0x4B69 /* get full Unicode screen mapping */ +#define PIO_UNISCRNMAP 0x4B6A /* set full Unicode screen mapping */ + +#define GIO_UNIMAP 0x4B66 /* get unicode-to-font mapping from kernel */ + +struct unipair { + unsigned short unicode; + unsigned short fontpos; +}; + +struct unimapdesc { + unsigned short entry_ct; + struct unipair *entries; +}; + +#define PIO_UNIMAP 0x4B67 /* put unicode-to-font mapping in kernel */ +#define PIO_UNIMAPCLR 0x4B68 /* clear table, possibly advise hash algorithm */ + +struct unimapinit { + unsigned short advised_hashsize; /* 0 if no opinion */ + unsigned short advised_hashstep; /* 0 if no opinion */ + unsigned short advised_hashlevel; /* 0 if no opinion */ +}; + +#define UNI_DIRECT_BASE 0xF000 /* start of Direct Font Region */ +#define UNI_DIRECT_MASK 0x01FF /* Direct Font Region bitmask */ + +#define K_RAW 0x00 +#define K_XLATE 0x01 +#define K_MEDIUMRAW 0x02 +#define K_UNICODE 0x03 +#define KDGKBMODE 0x4B44 /* gets current keyboard mode */ +#define KDSKBMODE 0x4B45 /* sets current keyboard mode */ + +#define K_METABIT 0x03 +#define K_ESCPREFIX 0x04 +#define KDGKBMETA 0x4B62 /* gets meta key handling mode */ +#define KDSKBMETA 0x4B63 /* sets meta key handling mode */ + +#define K_SCROLLLOCK 0x01 +#define K_CAPSLOCK 0x02 +#define K_NUMLOCK 0x04 +#define KDGKBLED 0x4B64 /* get led flags (not lights) */ +#define KDSKBLED 0x4B65 /* set led flags (not lights) */ + +struct kbentry { + unsigned char kb_table; + unsigned char kb_index; + unsigned short kb_value; +}; + +#define K_NORMTAB 0x00 +#define K_SHIFTTAB 0x01 +#define K_ALTTAB 0x02 +#define K_ALTSHIFTTAB 0x03 + +#define KDGKBENT 0x4B46 /* gets one entry in translation table */ +#define KDSKBENT 0x4B47 /* sets one entry in translation table */ + +struct kbsentry { + unsigned char kb_func; + unsigned char kb_string[512]; +}; + +#define KDGKBSENT 0x4B48 /* gets one function key string entry */ +#define KDSKBSENT 0x4B49 /* sets one function key string entry */ + +struct kbdiacr { + unsigned char diacr, base, result; +}; + +struct kbdiacrs { + unsigned int kb_cnt; /* number of entries in following array */ + struct kbdiacr kbdiacr[256]; /* MAX_DIACR from keyboard.h */ +}; + +#define KDGKBDIACR 0x4B4A /* read kernel accent table */ +#define KDSKBDIACR 0x4B4B /* write kernel accent table */ + +struct kbkeycode { + unsigned int scancode, keycode; +}; + +#define KDGETKEYCODE 0x4B4C /* read kernel keycode table entry */ +#define KDSETKEYCODE 0x4B4D /* write kernel keycode table entry */ + +#define KDSIGACCEPT 0x4B4E /* accept kbd generated signals */ + +struct hwclk_time { + unsigned int sec; /* 0..59 */ + unsigned int min; /* 0..59 */ + unsigned int hour; /* 0..23 */ + unsigned int day; /* 1..31 */ + unsigned int mon; /* 0..11 */ + unsigned int year; /* 70... */ + int wday; /* 0..6, 0 is Sunday, -1 means unknown/don't set */ +}; + +#define KDGHWCLK 0x4B50 /* get hardware clock */ +#define KDSHWCLK 0x4B51 /* set hardware clock */ + +struct kbd_repeat { + int delay; /* in msec; <= 0: don't change */ + int rate; /* in msec; <= 0: don't change */ +}; + +#define KDKBDREP 0x4B52 /* set keyboard delay/repeat rate; + * actually used values are returned */ + +#define KDFONTOP 0x4B72 /* font operations */ + +struct console_font_op { + unsigned int op; /* operation code KD_FONT_OP_* */ + unsigned int flags; /* KD_FONT_FLAG_* */ + unsigned int width, height; /* font size */ + unsigned int charcount; + unsigned char *data; /* font data with height fixed to 32 */ +}; + +#define KD_FONT_OP_SET 0 /* Set font */ +#define KD_FONT_OP_GET 1 /* Get font */ +#define KD_FONT_OP_SET_DEFAULT 2 /* Set font to default, data points to name / NULL */ +#define KD_FONT_OP_COPY 3 /* Copy from another console */ + +#define KD_FONT_FLAG_DONT_RECALC 1 /* Don't recalculate hw charcell size [compat] */ #endif diff --git a/mdk-stage1/dietlibc/include/sys/mman.h b/mdk-stage1/dietlibc/include/sys/mman.h index dc398ba90..298773a92 100644 --- a/mdk-stage1/dietlibc/include/sys/mman.h +++ b/mdk-stage1/dietlibc/include/sys/mman.h @@ -3,13 +3,160 @@ #include <sys/cdefs.h> #include <sys/types.h> -#include <linux/mman.h> -#include <asm/page.h> -#ifndef PAGE_SIZE -#warning PAGE_SIZE undefined +#define MREMAP_MAYMOVE 1UL +#define MREMAP_FIXED 2UL + +#define PROT_READ 0x1 /* page can be read */ +#define PROT_WRITE 0x2 /* page can be written */ +#define PROT_EXEC 0x4 /* page can be executed */ +#define PROT_NONE 0x0 /* page can not be accessed */ + +#define MAP_SHARED 0x01 /* Share changes */ +#define MAP_PRIVATE 0x02 /* Changes are private */ + +#ifdef __mips__ +#define MAP_FIXED 0x010 /* Interpret addr exactly */ +#define MAP_NORESERVE 0x0400 /* don't check for reservations */ +#define MAP_ANONYMOUS 0x0800 /* don't use a file */ +#define MAP_GROWSDOWN 0x1000 /* stack-like segment */ +#define MAP_DENYWRITE 0x2000 /* ETXTBSY */ +#define MAP_EXECUTABLE 0x4000 /* mark it as an executable */ +#define MAP_LOCKED 0x8000 /* pages are locked */ +#define MS_ASYNC 0x0001 /* sync memory asynchronously */ +#define MS_INVALIDATE 0x0002 /* invalidate mappings & caches */ +#define MS_SYNC 0x0004 /* synchronous memory sync */ +#define MCL_CURRENT 1 /* lock all current mappings */ +#define MCL_FUTURE 2 /* lock all future mappings */ +#define MADV_NORMAL 0x0 /* default page-in behavior */ +#define MADV_RANDOM 0x1 /* page-in minimum required */ +#define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ +#define MADV_WILLNEED 0x3 /* pre-fault pages */ +#define MADV_DONTNEED 0x4 /* discard these pages */ +#else + +#ifdef __alpha__ +#define MAP_FIXED 0x100 /* Interpret addr exactly */ +#define MAP_ANONYMOUS 0x10 /* don't use a file */ +#define MAP_GROWSDOWN 0x1000 /* stack-like segment */ +#define MAP_DENYWRITE 0x2000 /* ETXTBSY */ +#define MAP_EXECUTABLE 0x4000 /* mark it as an executable */ +#define MAP_LOCKED 0x8000 /* lock the mapping */ +#define MAP_NORESERVE 0x10000 /* don't check for reservations */ +#define MS_ASYNC 1 /* sync memory asynchronously */ +#define MS_SYNC 2 /* synchronous memory sync */ +#define MS_INVALIDATE 4 /* invalidate the caches */ +#define MCL_CURRENT 8192 /* lock all currently mapped pages */ +#define MCL_FUTURE 16384 /* lock all additions to address space */ +#define MADV_NORMAL 0 /* no further special treatment */ +#define MADV_RANDOM 1 /* expect random page references */ +#define MADV_SEQUENTIAL 2 /* expect sequential page references */ +#define MADV_WILLNEED 3 /* will need these pages */ +#define MADV_SPACEAVAIL 5 /* ensure resources are available */ +#define MADV_DONTNEED 6 /* dont need these pages */ +#else +#define MAP_FIXED 0x10 /* Interpret addr exactly */ +#define MAP_ANONYMOUS 0x20 /* don't use a file */ #endif +#if defined(__i386__) || defined(__s390__) || defined(__x86_64__) +#define MAP_GROWSDOWN 0x0100 /* stack-like segment */ +#define MAP_DENYWRITE 0x0800 /* ETXTBSY */ +#define MAP_EXECUTABLE 0x1000 /* mark it as an executable */ +#define MAP_LOCKED 0x2000 /* pages are locked */ +#define MAP_NORESERVE 0x4000 /* don't check for reservations */ +#define MS_ASYNC 1 /* sync memory asynchronously */ +#define MS_INVALIDATE 2 /* invalidate the caches */ +#define MS_SYNC 4 /* synchronous memory sync */ +#define MCL_CURRENT 1 /* lock all current mappings */ +#define MCL_FUTURE 2 /* lock all future mappings */ +#define MADV_NORMAL 0x0 /* default page-in behavior */ +#define MADV_RANDOM 0x1 /* page-in minimum required */ +#define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ +#define MADV_WILLNEED 0x3 /* pre-fault pages */ +#define MADV_DONTNEED 0x4 /* discard these pages */ +#elif defined(__sparc__) || defined (__powerpc__) +#define MAP_RENAME MAP_ANONYMOUS /* In SunOS terminology */ +#define MAP_NORESERVE 0x40 /* don't reserve swap pages */ +#define MAP_INHERIT 0x80 /* SunOS doesn't do this, but... */ +#define MAP_LOCKED 0x100 /* lock the mapping */ +#define _MAP_NEW 0x80000000 /* Binary compatibility is fun... */ +#define MAP_GROWSDOWN 0x0100 /* stack-like segment */ +#define MAP_DENYWRITE 0x0800 /* ETXTBSY */ +#define MAP_EXECUTABLE 0x1000 /* mark it as an executable */ +#define MS_ASYNC 1 /* sync memory asynchronously */ +#define MS_INVALIDATE 2 /* invalidate the caches */ +#define MS_SYNC 4 /* synchronous memory sync */ +#define MCL_CURRENT 0x2000 /* lock all currently mapped pages */ +#define MCL_FUTURE 0x4000 /* lock all additions to address space */ +#define MADV_NORMAL 0x0 /* default page-in behavior */ +#define MADV_RANDOM 0x1 /* page-in minimum required */ +#define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ +#define MADV_WILLNEED 0x3 /* pre-fault pages */ +#define MADV_DONTNEED 0x4 /* discard these pages */ +#define MADV_FREE 0x5 /* (Solaris) contents can be freed */ +#elif defined (__arm__) +#define MAP_GROWSDOWN 0x0100 /* stack-like segment */ +#define MAP_DENYWRITE 0x0800 /* ETXTBSY */ +#define MAP_EXECUTABLE 0x1000 /* mark it as an executable */ +#define MAP_LOCKED 0x2000 /* pages are locked */ +#define MAP_NORESERVE 0x4000 /* don't check for reservations */ +#define MS_ASYNC 1 /* sync memory asynchronously */ +#define MS_INVALIDATE 2 /* invalidate the caches */ +#define MS_SYNC 4 /* synchronous memory sync */ +#define MCL_CURRENT 1 /* lock all current mappings */ +#define MCL_FUTURE 2 /* lock all future mappings */ +#define MADV_NORMAL 0x0 /* default page-in behavior */ +#define MADV_RANDOM 0x1 /* page-in minimum required */ +#define MADV_SEQUENTIAL 0x2 /* read-ahead aggressively */ +#define MADV_WILLNEED 0x3 /* pre-fault pages */ +#define MADV_DONTNEED 0x4 /* discard these pages */ + +#elif defined(__hppa__) +#define MAP_TYPE 0x03 /* Mask for type of mapping */ +#define MAP_FIXED 0x04 /* Interpret addr exactly */ +#define MAP_ANONYMOUS 0x10 /* don't use a file */ + +#define MAP_DENYWRITE 0x0800 /* ETXTBSY */ +#define MAP_EXECUTABLE 0x1000 /* mark it as an executable */ +#define MAP_LOCKED 0x2000 /* pages are locked */ +#define MAP_NORESERVE 0x4000 /* don't check for reservations */ +#define MAP_GROWSDOWN 0x8000 /* stack-like segment */ + +#define MS_SYNC 1 /* synchronous memory sync */ +#define MS_ASYNC 2 /* sync memory asynchronously */ +#define MS_INVALIDATE 4 /* invalidate the caches */ + +#define MCL_CURRENT 1 /* lock all current mappings */ +#define MCL_FUTURE 2 + +#elif defined(__ia64__) + +#define MAP_TYPE 0x0f /* Mask for type of mapping */ +#define MAP_FIXED 0x10 /* Interpret addr exactly */ +#define MAP_ANONYMOUS 0x20 /* don't use a file */ + +#define MAP_GROWSDOWN 0x0100 /* stack-like segment */ +#define MAP_GROWSUP 0x0200 /* register stack-like segment */ +#define MAP_DENYWRITE 0x0800 /* ETXTBSY */ +#define MAP_EXECUTABLE 0x1000 /* mark it as an executable */ +#define MAP_LOCKED 0x2000 /* pages are locked */ +#define MAP_NORESERVE 0x4000 /* don't check for reservations */ +#define MAP_WRITECOMBINED 0x10000 /* write-combine the area */ +#define MAP_NONCACHED 0x20000 /* don't cache the memory */ + +#define MS_ASYNC 1 /* sync memory asynchronously */ +#define MS_INVALIDATE 2 /* invalidate the caches */ +#define MS_SYNC 4 /* synchronous memory sync */ + +#endif + +#endif + +/* compatibility flags */ +#define MAP_ANON MAP_ANONYMOUS +#define MAP_FILE 0 + #define MAP_FAILED ((void *) -1) extern void *mmap (void *__addr, size_t __len, int __prot, @@ -19,15 +166,19 @@ 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; + unsigned long __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 int mlockall(int flags) __THROW; +int mlock(const void *addr, size_t len) __THROW; +int munlock(const void *addr, size_t len) __THROW; int munlockall(void) __THROW; +int madvise(void *start, size_t length, int advice) __THROW; + +#define _POSIX_MAPPED_FILES + #endif diff --git a/mdk-stage1/dietlibc/include/sys/mount.h b/mdk-stage1/dietlibc/include/sys/mount.h index 2e9e86774..a5170fda9 100644 --- a/mdk-stage1/dietlibc/include/sys/mount.h +++ b/mdk-stage1/dietlibc/include/sys/mount.h @@ -3,17 +3,78 @@ #include <sys/cdefs.h> #include <sys/types.h> -#include <linux/fs.h> +#define _LINUX_CONFIG_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 +}; int mount(const char* specialfile, const char* dir, const char* filesystemtype, unsigned long rwflag, const void * data) __THROW; int umount(const char *specialfile) __THROW; - -int umount(const char *dir) __THROW; - int umount2(const char *specialfile, int mflag) __THROW; -int umount2(const char *dir, int mflag) __THROW; - #endif diff --git a/mdk-stage1/dietlibc/include/sys/msg.h b/mdk-stage1/dietlibc/include/sys/msg.h index ea1e470b6..564fd9472 100644 --- a/mdk-stage1/dietlibc/include/sys/msg.h +++ b/mdk-stage1/dietlibc/include/sys/msg.h @@ -1,9 +1,53 @@ #ifndef _SYS_MSG_H #define _SYS_MSG_H -#include <linux/msg.h> #include <sys/ipc.h> -#include <asm/page.h> + +/* ipcs ctl commands */ +#define MSG_STAT 11 +#define MSG_INFO 12 + +/* msgrcv options */ +#define MSG_NOERROR 010000 /* no error if message is too big */ +#define MSG_EXCEPT 020000 /* recv any msg except of specified type.*/ + +struct msqid_ds { + struct ipc_perm msg_perm; + struct msg *msg_first; /* first message on queue,unused */ + struct msg *msg_last; /* last message in queue,unused */ + time_t msg_stime; /* last msgsnd time */ + time_t msg_rtime; /* last msgrcv time */ + time_t msg_ctime; /* last change time */ + unsigned long msg_lcbytes; /* Reuse junk fields for 32 bit */ + unsigned long msg_lqbytes; /* ditto */ + unsigned short msg_cbytes; /* current number of bytes on queue */ + unsigned short msg_qnum; /* number of messages in queue */ + unsigned short msg_qbytes; /* max number of bytes on queue */ + pid_t msg_lspid; /* pid of last msgsnd */ + pid_t msg_lrpid; /* last receive pid */ +}; + +/* message buffer for msgsnd and msgrcv calls */ +struct msgbuf { + long mtype; /* type of message */ + char mtext[1]; /* message text */ +}; + +/* buffer for msgctl calls IPC_INFO, MSG_INFO */ +struct msginfo { + int msgpool; + int msgmap; + int msgmax; + int msgmnb; + int msgmni; + int msgssz; + int msgtql; + unsigned short msgseg; +}; + +#define MSGMNI 16 /* <= IPCMNI */ /* max # of msg queue identifiers */ +#define MSGMAX 8192 /* <= INT_MAX */ /* max size of message (bytes) */ +#define MSGMNB 16384 /* <= INT_MAX */ /* default max size of a message queue */ extern int msgctl (int msqid, int cmd, struct msqid_ds *buf) __THROW; extern int msgget (key_t key, int msgflg) __THROW; diff --git a/mdk-stage1/dietlibc/include/sys/mtio.h b/mdk-stage1/dietlibc/include/sys/mtio.h index e70663407..08c735dcc 100644 --- a/mdk-stage1/dietlibc/include/sys/mtio.h +++ b/mdk-stage1/dietlibc/include/sys/mtio.h @@ -1,6 +1,340 @@ #ifndef _SYS_MTIO_H #define _SYS_MTIO_H -#include <linux/mtio.h> +#include <sys/ioctl.h> + +/* structure for MTIOCTOP - mag tape op command */ +struct mtop { + short int mt_op; /* operations defined below */ + int mt_count; /* how many of them */ +}; + +/* Magnetic Tape operations [Not all operations supported by all drivers]: */ +#define MTRESET 0 /* +reset drive in case of problems */ +#define MTFSF 1 /* forward space over FileMark, + * position at first record of next file + */ +#define MTBSF 2 /* backward space FileMark (position before FM) */ +#define MTFSR 3 /* forward space record */ +#define MTBSR 4 /* backward space record */ +#define MTWEOF 5 /* write an end-of-file record (mark) */ +#define MTREW 6 /* rewind */ +#define MTOFFL 7 /* rewind and put the drive offline (eject?) */ +#define MTNOP 8 /* no op, set status only (read with MTIOCGET) */ +#define MTRETEN 9 /* retension tape */ +#define MTBSFM 10 /* +backward space FileMark, position at FM */ +#define MTFSFM 11 /* +forward space FileMark, position at FM */ +#define MTEOM 12 /* goto end of recorded media (for appending files). + * MTEOM positions after the last FM, ready for + * appending another file. + */ +#define MTERASE 13 /* erase tape -- be careful! */ + +#define MTRAS1 14 /* run self test 1 (nondestructive) */ +#define MTRAS2 15 /* run self test 2 (destructive) */ +#define MTRAS3 16 /* reserved for self test 3 */ + +#define MTSETBLK 20 /* set block length (SCSI) */ +#define MTSETDENSITY 21 /* set tape density (SCSI) */ +#define MTSEEK 22 /* seek to block (Tandberg, etc.) */ +#define MTTELL 23 /* tell block (Tandberg, etc.) */ +#define MTSETDRVBUFFER 24 /* set the drive buffering according to SCSI-2 */ + /* ordinary buffered operation with code 1 */ +#define MTFSS 25 /* space forward over setmarks */ +#define MTBSS 26 /* space backward over setmarks */ +#define MTWSM 27 /* write setmarks */ + +#define MTLOCK 28 /* lock the drive door */ +#define MTUNLOCK 29 /* unlock the drive door */ +#define MTLOAD 30 /* execute the SCSI load command */ +#define MTUNLOAD 31 /* execute the SCSI unload command */ +#define MTCOMPRESSION 32/* control compression with SCSI mode page 15 */ +#define MTSETPART 33 /* Change the active tape partition */ +#define MTMKPART 34 /* Format the tape with one or two partitions */ + +/* structure for MTIOCGET - mag tape get status command */ + +typedef int daddr_t; + +struct mtget { + long int mt_type; /* type of magtape device */ + long int mt_resid; /* residual count: (not sure) + * number of bytes ignored, or + * number of files not skipped, or + * number of records not skipped. + */ + /* the following registers are device dependent */ + long int mt_dsreg; /* status register */ + long int mt_gstat; /* generic (device independent) status */ + long int mt_erreg; /* error register */ + /* The next two fields are not always used */ + daddr_t mt_fileno; /* number of current file on tape */ + daddr_t mt_blkno; /* current block number */ +}; + +/* + * Constants for mt_type. Not all of these are supported, + * and these are not all of the ones that are supported. + */ +#define MT_ISUNKNOWN 0x01 +#define MT_ISQIC02 0x02 /* Generic QIC-02 tape streamer */ +#define MT_ISWT5150 0x03 /* Wangtek 5150EQ, QIC-150, QIC-02 */ +#define MT_ISARCHIVE_5945L2 0x04 /* Archive 5945L-2, QIC-24, QIC-02? */ +#define MT_ISCMSJ500 0x05 /* CMS Jumbo 500 (QIC-02?) */ +#define MT_ISTDC3610 0x06 /* Tandberg 6310, QIC-24 */ +#define MT_ISARCHIVE_VP60I 0x07 /* Archive VP60i, QIC-02 */ +#define MT_ISARCHIVE_2150L 0x08 /* Archive Viper 2150L */ +#define MT_ISARCHIVE_2060L 0x09 /* Archive Viper 2060L */ +#define MT_ISARCHIVESC499 0x0A /* Archive SC-499 QIC-36 controller */ +#define MT_ISQIC02_ALL_FEATURES 0x0F /* Generic QIC-02 with all features */ +#define MT_ISWT5099EEN24 0x11 /* Wangtek 5099-een24, 60MB, QIC-24 */ +#define MT_ISTEAC_MT2ST 0x12 /* Teac MT-2ST 155mb drive, Teac DC-1 card (Wangtek type) */ +#define MT_ISEVEREX_FT40A 0x32 /* Everex FT40A (QIC-40) */ +#define MT_ISDDS1 0x51 /* DDS device without partitions */ +#define MT_ISDDS2 0x52 /* DDS device with partitions */ +#define MT_ISONSTREAM_SC 0x61 /* OnStream SCSI tape drives (SC-x0) + and SCSI emulated (DI, DP, USB) */ +#define MT_ISSCSI1 0x71 /* Generic ANSI SCSI-1 tape unit */ +#define MT_ISSCSI2 0x72 /* Generic ANSI SCSI-2 tape unit */ + +/* QIC-40/80/3010/3020 ftape supported drives. + * 20bit vendor ID + 0x800000 (see ftape-vendors.h) + */ +#define MT_ISFTAPE_UNKNOWN 0x800000 /* obsolete */ +#define MT_ISFTAPE_FLAG 0x800000 + +struct mt_tape_info { + long int t_type; /* device type id (mt_type) */ + char* t_name; /* descriptive name */ +}; + +#define MT_TAPE_INFO { \ + {MT_ISUNKNOWN, "Unknown type of tape device"}, \ + {MT_ISQIC02, "Generic QIC-02 tape streamer"}, \ + {MT_ISWT5150, "Wangtek 5150, QIC-150"}, \ + {MT_ISARCHIVE_5945L2, "Archive 5945L-2"}, \ + {MT_ISCMSJ500, "CMS Jumbo 500"}, \ + {MT_ISTDC3610, "Tandberg TDC 3610, QIC-24"}, \ + {MT_ISARCHIVE_VP60I, "Archive VP60i, QIC-02"}, \ + {MT_ISARCHIVE_2150L, "Archive Viper 2150L"}, \ + {MT_ISARCHIVE_2060L, "Archive Viper 2060L"}, \ + {MT_ISARCHIVESC499, "Archive SC-499 QIC-36 controller"}, \ + {MT_ISQIC02_ALL_FEATURES, "Generic QIC-02 tape, all features"}, \ + {MT_ISWT5099EEN24, "Wangtek 5099-een24, 60MB"}, \ + {MT_ISTEAC_MT2ST, "Teac MT-2ST 155mb data cassette drive"}, \ + {MT_ISEVEREX_FT40A, "Everex FT40A, QIC-40"}, \ + {MT_ISONSTREAM_SC, "OnStream SC-, DI-, DP-, or USB tape drive"}, \ + {MT_ISSCSI1, "Generic SCSI-1 tape"}, \ + {MT_ISSCSI2, "Generic SCSI-2 tape"}, \ + {0, NULL} \ +} + + +/* structure for MTIOCPOS - mag tape get position command */ + +struct mtpos { + long int mt_blkno; /* current block number */ +}; + + +/* structure for MTIOCGETCONFIG/MTIOCSETCONFIG primarily intended + * as an interim solution for QIC-02 until DDI is fully implemented. + */ +struct mtconfiginfo { + long int mt_type; /* drive type */ + long int ifc_type; /* interface card type */ + unsigned short int irqnr; /* IRQ number to use */ + unsigned short int dmanr; /* DMA channel to use */ + unsigned short int port; /* IO port base address */ + + unsigned long int debug; /* debugging flags */ + + unsigned int have_dens:1; + unsigned int have_bsf:1; + unsigned int have_fsr:1; + unsigned int have_bsr:1; + unsigned int have_eod:1; + unsigned int have_seek:1; + unsigned int have_tell:1; + unsigned int have_ras1:1; + unsigned int have_ras2:1; + unsigned int have_ras3:1; + unsigned int have_qfa:1; + + unsigned int pad1:5; + char reserved[10]; +}; + +/* structure for MTIOCVOLINFO, query information about the volume + * currently positioned at (zftape) + */ +struct mtvolinfo { + unsigned int mt_volno; /* vol-number */ + unsigned int mt_blksz; /* blocksize used when recording */ + unsigned int mt_rawsize; /* raw tape space consumed, in kb */ + unsigned int mt_size; /* volume size after decompression, in kb */ + unsigned int mt_cmpr:1; /* this volume has been compressed */ +}; + +/* raw access to a floppy drive, read and write an arbitrary segment. + * For ftape/zftape to support formatting etc. + */ +#define MT_FT_RD_SINGLE 0 +#define MT_FT_RD_AHEAD 1 +#define MT_FT_WR_ASYNC 0 /* start tape only when all buffers are full */ +#define MT_FT_WR_MULTI 1 /* start tape, continue until buffers are empty */ +#define MT_FT_WR_SINGLE 2 /* write a single segment and stop afterwards */ +#define MT_FT_WR_DELETE 3 /* write deleted data marks, one segment at time */ + +struct mtftseg { + unsigned int mt_segno; /* the segment to read or write */ + unsigned int mt_mode; /* modes for read/write (sync/async etc.) */ + int mt_result; /* result of r/w request, not of the ioctl */ + void *mt_data; /* User space buffer: must be 29kb */ +}; + +/* get tape capacity (ftape/zftape) + */ +struct mttapesize { + unsigned long mt_capacity; /* entire, uncompressed capacity of a cartridge */ + unsigned long mt_used; /* what has been used so far, raw uncompressed amount */ +}; + +/* possible values of the ftfmt_op field + */ +#define FTFMT_SET_PARMS 1 /* set software parms */ +#define FTFMT_GET_PARMS 2 /* get software parms */ +#define FTFMT_FORMAT_TRACK 3 /* start formatting a tape track */ +#define FTFMT_STATUS 4 /* monitor formatting a tape track */ +#define FTFMT_VERIFY 5 /* verify the given segment */ + +struct ftfmtparms { + unsigned char ft_qicstd; /* QIC-40/QIC-80/QIC-3010/QIC-3020 */ + unsigned char ft_fmtcode; /* Refer to the QIC specs */ + unsigned char ft_fhm; /* floppy head max */ + unsigned char ft_ftm; /* floppy track max */ + unsigned short ft_spt; /* segments per track */ + unsigned short ft_tpc; /* tracks per cartridge */ +}; + +struct ftfmttrack { + unsigned int ft_track; /* track to format */ + unsigned char ft_gap3; /* size of gap3, for FORMAT_TRK */ +}; + +struct ftfmtstatus { + unsigned int ft_segment; /* segment currently being formatted */ +}; + +struct ftfmtverify { + unsigned int ft_segment; /* segment to verify */ + unsigned long ft_bsm; /* bsm as result of VERIFY cmd */ +}; + +struct mtftformat { + unsigned int fmt_op; /* operation to perform */ + union fmt_arg { + struct ftfmtparms fmt_parms; /* format parameters */ + struct ftfmttrack fmt_track; /* ctrl while formatting */ + struct ftfmtstatus fmt_status; + struct ftfmtverify fmt_verify; /* for verifying */ + } fmt_arg; +}; + +/* mag tape io control commands */ +#define MTIOCTOP _IOW('m', 1, struct mtop) /* do a mag tape op */ +#define MTIOCGET _IOR('m', 2, struct mtget) /* get tape status */ +#define MTIOCPOS _IOR('m', 3, struct mtpos) /* get tape position */ + +/* The next two are used by the QIC-02 driver for runtime reconfiguration. + * See tpqic02.h for struct mtconfiginfo. + */ +#define MTIOCGETCONFIG _IOR('m', 4, struct mtconfiginfo) /* get tape config */ +#define MTIOCSETCONFIG _IOW('m', 5, struct mtconfiginfo) /* set tape config */ + +/* the next six are used by the floppy ftape drivers and its frontends + * sorry, but MTIOCTOP commands are write only. + */ +#define MTIOCRDFTSEG _IOWR('m', 6, struct mtftseg) /* read a segment */ +#define MTIOCWRFTSEG _IOWR('m', 7, struct mtftseg) /* write a segment */ +#define MTIOCVOLINFO _IOR('m', 8, struct mtvolinfo) /* info about volume */ +#define MTIOCGETSIZE _IOR('m', 9, struct mttapesize)/* get cartridge size*/ +#define MTIOCFTFORMAT _IOWR('m', 10, struct mtftformat) /* format ftape */ +#define MTIOCFTCMD _IOWR('m', 11, struct mtftcmd) /* send QIC-117 cmd */ + +/* Generic Mag Tape (device independent) status macros for examining + * mt_gstat -- HP-UX compatible. + * There is room for more generic status bits here, but I don't + * know which of them are reserved. At least three or so should + * be added to make this really useful. + */ +#define GMT_EOF(x) ((x) & 0x80000000) +#define GMT_BOT(x) ((x) & 0x40000000) +#define GMT_EOT(x) ((x) & 0x20000000) +#define GMT_SM(x) ((x) & 0x10000000) /* DDS setmark */ +#define GMT_EOD(x) ((x) & 0x08000000) /* DDS EOD */ +#define GMT_WR_PROT(x) ((x) & 0x04000000) +/* #define GMT_ ? ((x) & 0x02000000) */ +#define GMT_ONLINE(x) ((x) & 0x01000000) +#define GMT_D_6250(x) ((x) & 0x00800000) +#define GMT_D_1600(x) ((x) & 0x00400000) +#define GMT_D_800(x) ((x) & 0x00200000) +/* #define GMT_ ? ((x) & 0x00100000) */ +/* #define GMT_ ? ((x) & 0x00080000) */ +#define GMT_DR_OPEN(x) ((x) & 0x00040000) /* door open (no tape) */ +/* #define GMT_ ? ((x) & 0x00020000) */ +#define GMT_IM_REP_EN(x) ((x) & 0x00010000) /* immediate report mode */ +/* 16 generic status bits unused */ + + +/* SCSI-tape specific definitions */ +/* Bitfield shifts in the status */ +#define MT_ST_BLKSIZE_SHIFT 0 +#define MT_ST_BLKSIZE_MASK 0xffffff +#define MT_ST_DENSITY_SHIFT 24 +#define MT_ST_DENSITY_MASK 0xff000000 + +#define MT_ST_SOFTERR_SHIFT 0 +#define MT_ST_SOFTERR_MASK 0xffff + +/* Bitfields for the MTSETDRVBUFFER ioctl */ +#define MT_ST_OPTIONS 0xf0000000 +#define MT_ST_BOOLEANS 0x10000000 +#define MT_ST_SETBOOLEANS 0x30000000 +#define MT_ST_CLEARBOOLEANS 0x40000000 +#define MT_ST_WRITE_THRESHOLD 0x20000000 +#define MT_ST_DEF_BLKSIZE 0x50000000 +#define MT_ST_DEF_OPTIONS 0x60000000 +#define MT_ST_TIMEOUTS 0x70000000 +#define MT_ST_SET_TIMEOUT (MT_ST_TIMEOUTS | 0x000000) +#define MT_ST_SET_LONG_TIMEOUT (MT_ST_TIMEOUTS | 0x100000) + +#define MT_ST_BUFFER_WRITES 0x1 +#define MT_ST_ASYNC_WRITES 0x2 +#define MT_ST_READ_AHEAD 0x4 +#define MT_ST_DEBUGGING 0x8 +#define MT_ST_TWO_FM 0x10 +#define MT_ST_FAST_MTEOM 0x20 +#define MT_ST_AUTO_LOCK 0x40 +#define MT_ST_DEF_WRITES 0x80 +#define MT_ST_CAN_BSR 0x100 +#define MT_ST_NO_BLKLIMS 0x200 +#define MT_ST_CAN_PARTITIONS 0x400 +#define MT_ST_SCSI2LOGICAL 0x800 +#define MT_ST_SYSV 0x1000 + +/* The mode parameters to be controlled. Parameter chosen with bits 20-28 */ +#define MT_ST_CLEAR_DEFAULT 0xfffff +#define MT_ST_DEF_DENSITY (MT_ST_DEF_OPTIONS | 0x100000) +#define MT_ST_DEF_COMPRESSION (MT_ST_DEF_OPTIONS | 0x200000) +#define MT_ST_DEF_DRVBUFFER (MT_ST_DEF_OPTIONS | 0x300000) + +/* The offset for the arguments for the special HP changer load command. */ +#define MT_ST_HPLOADER_OFFSET 10000 + +/* Specify default tape device. */ +#ifndef DEFTAPE +#define DEFTAPE "/dev/tape/0" +#endif #endif diff --git a/mdk-stage1/dietlibc/include/sys/param.h b/mdk-stage1/dietlibc/include/sys/param.h index 05f4d40e2..0744dccdb 100644 --- a/mdk-stage1/dietlibc/include/sys/param.h +++ b/mdk-stage1/dietlibc/include/sys/param.h @@ -3,6 +3,26 @@ #include <limits.h> -#define MAXPATHLEN PATH_MAX +#define MAXPATHLEN PATH_MAX +#define MAXHOSTNAMELEN 64 +#define NGROUPS 32 +#define NOGROUP (-1) + +#undef MIN +#undef MAX +#define MIN(a,b) (((a)<(b))?(a):(b)) +#define MAX(a,b) (((a)>(b))?(a):(b)) + +#ifdef __alpha__ +#define HZ 1024 +#else +#define HZ 100 +#endif + +#ifndef howmany +# define howmany(x, y) (((x)+((y)-1))/(y)) +#endif +#define roundup(x, y) ((((x)+((y)-1))/(y))*(y)) +#define powerof2(x) ((((x)-1)&(x))==0) #endif diff --git a/mdk-stage1/dietlibc/include/sys/poll.h b/mdk-stage1/dietlibc/include/sys/poll.h index adce26687..fe36df79d 100644 --- a/mdk-stage1/dietlibc/include/sys/poll.h +++ b/mdk-stage1/dietlibc/include/sys/poll.h @@ -3,9 +3,45 @@ #include <sys/cdefs.h> -#include <linux/poll.h> +enum { + POLLIN = 0x0001, +#define POLLIN POLLIN + POLLPRI = 0x0002, +#define POLLPRI POLLPRI + POLLOUT = 0x0004, +#define POLLOUT POLLOUT + POLLERR = 0x0008, +#define POLLERR POLLERR + POLLHUP = 0x0010, +#define POLLHUP POLLHUP + POLLNVAL = 0x0020, +#define POLLNVAL POLLNVAL + POLLRDNORM = 0x0040, +#define POLLRDNORM POLLRDNORM + POLLRDBAND = 0x0080, +#define POLLRDBAND POLLRDBAND + POLLWRBAND = 0x0200, +#define POLLWRBAND POLLWRBAND + POLLMSG = 0x0400, +#define POLLMSG POLLMSG +/* POLLREMOVE is for /dev/epoll (/dev/misc/eventpoll), + * a new event notification mechanism for 2.6 */ + POLLREMOVE = 0x1000, +#define POLLREMOVE POLLREMOVE +}; -extern int poll(struct pollfd *ufds, unsigned int nfds, int timeout) __THROW; +#if defined(__sparc__) || defined (__mips__) +#define POLLWRNORM POLLOUT +#else +#define POLLWRNORM 0x0100 +#endif + +struct pollfd { + int fd; + short events; + short revents; +}; +extern int poll(struct pollfd *ufds, unsigned int nfds, int timeout) __THROW; #endif /* _SYS_POLL_H */ diff --git a/mdk-stage1/dietlibc/include/sys/ptrace.h b/mdk-stage1/dietlibc/include/sys/ptrace.h index 9dd730bc6..b09d3ac3a 100644 --- a/mdk-stage1/dietlibc/include/sys/ptrace.h +++ b/mdk-stage1/dietlibc/include/sys/ptrace.h @@ -3,8 +3,844 @@ #include <sys/cdefs.h> -#include <linux/ptrace.h> +#define PTRACE_TRACEME 0 +#define PTRACE_PEEKTEXT 1 +#define PTRACE_PEEKDATA 2 +#define PTRACE_PEEKUSR 3 +#define PTRACE_PEEKUSER PTRACE_PEEKUSR +#define PTRACE_POKETEXT 4 +#define PTRACE_POKEDATA 5 +#define PTRACE_POKEUSR 6 +#define PTRACE_POKEUSER PTRACE_POKEUSR +#define PTRACE_CONT 7 +#define PTRACE_KILL 8 +#define PTRACE_SINGLESTEP 9 -extern long int ptrace (int request, ...) __THROW; +#define PTRACE_ATTACH 0x10 +#define PTRACE_DETACH 0x11 + +#define PTRACE_SYSCALL 24 + +#define PT_TRACE_ME PTRACE_TRACEME +#define PT_READ_I PTRACE_PEEKTEXT +#define PT_READ_D PTRACE_PEEKDATA +#define PT_READ_U PTRACE_READ_U +#define PT_WRITE_I PTRACE_POKETEXT +#define PT_WRITE_D PTRACE_POKEDATA +#define PT_WRITE_U PTRACE_POKEUSER +#define PT_CONTINUE PTRACE_CONT +#define PT_KILL PTRACE_KILL +#define PT_STEP PTRACE_SINGLESTEP +#define PT_GETREGS PTRACE_GETREGS +#define PT_SETREGS PTRACE_SETREGS +#define PT_GETFPREGS PTRACE_GETFPREGS +#define PT_SETFPREGS PTRACE_SETFPREGS +#define PT_ATTACH PTRACE_ATTACH +#define PT_DETACH PTRACE_DETACH + +#if defined(__i386__) +#define EBX 0 +#define ECX 1 +#define EDX 2 +#define ESI 3 +#define EDI 4 +#define EBP 5 +#define EAX 6 +#define DS 7 +#define ES 8 +#define FS 9 +#define GS 10 +#define ORIG_EAX 11 +#define EIP 12 +#define CS 13 +#define EFL 14 +#define UESP 15 +#define SS 16 +#define FRAME_SIZE 17 + +/* this struct defines the way the registers are stored on the + stack during a system call. */ + +struct pt_regs { + long ebx; + long ecx; + long edx; + long esi; + long edi; + long ebp; + long eax; + int xds; + int xes; + long orig_eax; + long eip; + int xcs; + long eflags; + long esp; + int xss; +}; + +/* Arbitrarily choose the same ptrace numbers as used by the Sparc code. */ +#define PTRACE_GETREGS 12 +#define PTRACE_SETREGS 13 +#define PTRACE_GETFPREGS 14 +#define PTRACE_SETFPREGS 15 +#define PTRACE_GETFPXREGS 18 +#define PTRACE_SETFPXREGS 19 + +#define PTRACE_SETOPTIONS 21 + +/* options set using PTRACE_SETOPTIONS */ +#define PTRACE_O_TRACESYSGOOD 0x00000001 + +#elif defined(__s390__) + +#define PT_PSWMASK 0x00 +#define PT_PSWADDR 0x04 +#define PT_GPR0 0x08 +#define PT_GPR1 0x0C +#define PT_GPR2 0x10 +#define PT_GPR3 0x14 +#define PT_GPR4 0x18 +#define PT_GPR5 0x1C +#define PT_GPR6 0x20 +#define PT_GPR7 0x24 +#define PT_GPR8 0x28 +#define PT_GPR9 0x2C +#define PT_GPR10 0x30 +#define PT_GPR11 0x34 +#define PT_GPR12 0x38 +#define PT_GPR13 0x3C +#define PT_GPR14 0x40 +#define PT_GPR15 0x44 +#define PT_ACR0 0x48 +#define PT_ACR1 0x4C +#define PT_ACR2 0x50 +#define PT_ACR3 0x54 +#define PT_ACR4 0x58 +#define PT_ACR5 0x5C +#define PT_ACR6 0x60 +#define PT_ACR7 0x64 +#define PT_ACR8 0x68 +#define PT_ACR9 0x6C +#define PT_ACR10 0x70 +#define PT_ACR11 0x74 +#define PT_ACR12 0x78 +#define PT_ACR13 0x7C +#define PT_ACR14 0x80 +#define PT_ACR15 0x84 +#define PT_ORIGGPR2 0x88 +#define PT_FPC 0x90 +#define PT_FPR0_HI 0x98 +#define PT_FPR0_LO 0x9C +#define PT_FPR1_HI 0xA0 +#define PT_FPR1_LO 0xA4 +#define PT_FPR2_HI 0xA8 +#define PT_FPR2_LO 0xAC +#define PT_FPR3_HI 0xB0 +#define PT_FPR3_LO 0xB4 +#define PT_FPR4_HI 0xB8 +#define PT_FPR4_LO 0xBC +#define PT_FPR5_HI 0xC0 +#define PT_FPR5_LO 0xC4 +#define PT_FPR6_HI 0xC8 +#define PT_FPR6_LO 0xCC +#define PT_FPR7_HI 0xD0 +#define PT_FPR7_LO 0xD4 +#define PT_FPR8_HI 0xD8 +#define PT_FPR8_LO 0XDC +#define PT_FPR9_HI 0xE0 +#define PT_FPR9_LO 0xE4 +#define PT_FPR10_HI 0xE8 +#define PT_FPR10_LO 0xEC +#define PT_FPR11_HI 0xF0 +#define PT_FPR11_LO 0xF4 +#define PT_FPR12_HI 0xF8 +#define PT_FPR12_LO 0xFC +#define PT_FPR13_HI 0x100 +#define PT_FPR13_LO 0x104 +#define PT_FPR14_HI 0x108 +#define PT_FPR14_LO 0x10C +#define PT_FPR15_HI 0x110 +#define PT_FPR15_LO 0x114 +#define PT_CR_9 0x118 +#define PT_CR_10 0x11C +#define PT_CR_11 0x120 +#define PT_IEEE_IP 0x13C +#define PT_LASTOFF PT_IEEE_IP +#define PT_ENDREGS 0x140-1 + +#define NUM_GPRS 16 +#define NUM_FPRS 16 +#define NUM_CRS 16 +#define NUM_ACRS 16 +#define GPR_SIZE 4 +#define FPR_SIZE 8 +#define FPC_SIZE 4 +#define FPC_PAD_SIZE 4 /* gcc insists on aligning the fpregs */ +#define CR_SIZE 4 +#define ACR_SIZE 4 + +#define STACK_FRAME_OVERHEAD 96 /* size of minimum stack frame */ + +#include <inttypes.h> + +/* this typedef defines how a Program Status Word looks like */ +typedef struct { + uint32_t mask; + uint32_t addr; +} psw_t __attribute__ ((aligned(8))); + +typedef union +{ + float f; + double d; + uint64_t ui; + struct + { + uint32_t hi; + uint32_t lo; + } fp; +} freg_t; + +typedef struct +{ + uint32_t fpc; + freg_t fprs[NUM_FPRS]; +} s390_fp_regs; + +#define FPC_EXCEPTION_MASK 0xF8000000 +#define FPC_FLAGS_MASK 0x00F80000 +#define FPC_DXC_MASK 0x0000FF00 +#define FPC_RM_MASK 0x00000003 +#define FPC_VALID_MASK 0xF8F8FF03 + +typedef struct +{ + psw_t psw; + uint32_t gprs[NUM_GPRS]; + uint32_t acrs[NUM_ACRS]; + uint32_t orig_gpr2; +} s390_regs; + +struct pt_regs +{ + psw_t psw; + uint32_t gprs[NUM_GPRS]; + uint32_t acrs[NUM_ACRS]; + uint32_t orig_gpr2; + uint32_t trap; + uint32_t old_ilc; +}; + +typedef struct +{ + uint32_t cr[3]; +} per_cr_words __attribute__((packed)); + +#define PER_EM_MASK 0xE8000000 + +typedef uint32_t addr_t; + +typedef struct +{ + unsigned em_branching : 1; + unsigned em_instruction_fetch : 1; + /* + * Switching on storage alteration automatically fixes + * the storage alteration event bit in the users std. + */ + unsigned em_storage_alteration : 1; + unsigned em_gpr_alt_unused : 1; + unsigned em_store_real_address : 1; + unsigned : 3; + unsigned branch_addr_ctl : 1; + unsigned : 1; + unsigned storage_alt_space_ctl : 1; + unsigned : 21; + addr_t starting_addr; + addr_t ending_addr; +} per_cr_bits __attribute__((packed)); + +typedef struct +{ + uint16_t perc_atmid; /* 0x096 */ + uint32_t address; /* 0x098 */ + uint8_t access_id; /* 0x0a1 */ +} per_lowcore_words __attribute__((packed)); + +typedef struct +{ + unsigned perc_branching : 1; /* 0x096 */ + unsigned perc_instruction_fetch : 1; + unsigned perc_storage_alteration : 1; + unsigned perc_gpr_alt_unused : 1; + unsigned perc_store_real_address : 1; + unsigned : 4; + unsigned atmid_validity_bit : 1; + unsigned atmid_psw_bit_32 : 1; + unsigned atmid_psw_bit_5 : 1; + unsigned atmid_psw_bit_16 : 1; + unsigned atmid_psw_bit_17 : 1; + unsigned si : 2; + addr_t address; /* 0x098 */ + unsigned : 4; /* 0x0a1 */ + unsigned access_id : 4; +} per_lowcore_bits __attribute__((packed)); + +typedef struct +{ + union { + per_cr_words words; + per_cr_bits bits; + } control_regs __attribute__((packed)); + /* + * Use these flags instead of setting em_instruction_fetch + * directly they are used so that single stepping can be + * switched on & off while not affecting other tracing + */ + unsigned single_step : 1; + unsigned instruction_fetch : 1; + unsigned : 30; + /* + * These addresses are copied into cr10 & cr11 if single + * stepping is switched off + */ + uint32_t starting_addr; + uint32_t ending_addr; + union { + per_lowcore_words words; + per_lowcore_bits bits; + } lowcore; +} per_struct __attribute__((packed)); + +typedef struct +{ + uint32_t len; + addr_t kernel_addr; + addr_t process_addr; +} ptrace_area; + +/* + * S/390 specific non posix ptrace requests. I chose unusual values so + * they are unlikely to clash with future ptrace definitions. + */ +#define PTRACE_PEEKUSR_AREA 0x5000 +#define PTRACE_POKEUSR_AREA 0x5001 +#define PTRACE_PEEKTEXT_AREA 0x5002 +#define PTRACE_PEEKDATA_AREA 0x5003 +#define PTRACE_POKETEXT_AREA 0x5004 +#define PTRACE_POKEDATA_AREA 0x5005 +/* + * PT_PROT definition is loosely based on hppa bsd definition in + * gdb/hppab-nat.c + */ +#define PTRACE_PROT 21 + +typedef enum +{ + ptprot_set_access_watchpoint, + ptprot_set_write_watchpoint, + ptprot_disable_watchpoint +} ptprot_flags; + +typedef struct +{ + addr_t lowaddr; + addr_t hiaddr; + ptprot_flags prot; +} ptprot_area; + +/* Sequence of bytes for breakpoint illegal instruction. */ +#define S390_BREAKPOINT {0x0,0x1} +#define S390_BREAKPOINT_U16 ((uint16_t)0x0001) +#define S390_SYSCALL_OPCODE ((uint16_t)0x0a00) +#define S390_SYSCALL_SIZE 2 + +/* + * The user_regs_struct defines the way the user registers are + * store on the stack for signal handling. + */ +struct user_regs_struct +{ + psw_t psw; + uint32_t gprs[NUM_GPRS]; + uint32_t acrs[NUM_ACRS]; + uint32_t orig_gpr2; + s390_fp_regs fp_regs; + /* + * These per registers are in here so that gdb can modify them + * itself as there is no "official" ptrace interface for hardware + * watchpoints. This is the way intel does it. + */ + per_struct per_info; + addr_t ieee_instruction_pointer; + /* Used to give failing instruction back to user for ieee exceptions */ +}; + +#elif defined(__arm__) + +/* this assumes armv */ +#define USR26_MODE 0x00 +#define FIQ26_MODE 0x01 +#define IRQ26_MODE 0x02 +#define SVC26_MODE 0x03 +#define USR_MODE 0x10 +#define FIQ_MODE 0x11 +#define IRQ_MODE 0x12 +#define SVC_MODE 0x13 +#define ABT_MODE 0x17 +#define UND_MODE 0x1b +#define SYSTEM_MODE 0x1f +#define MODE_MASK 0x1f +#define T_BIT 0x20 +#define F_BIT 0x40 +#define I_BIT 0x80 +#define CC_V_BIT (1 << 28) +#define CC_C_BIT (1 << 29) +#define CC_Z_BIT (1 << 30) +#define CC_N_BIT (1 << 31) +#define PCMASK 0 + +struct pt_regs { + long uregs[18]; +}; + +#define ARM_cpsr uregs[16] +#define ARM_pc uregs[15] +#define ARM_lr uregs[14] +#define ARM_sp uregs[13] +#define ARM_ip uregs[12] +#define ARM_fp uregs[11] +#define ARM_r10 uregs[10] +#define ARM_r9 uregs[9] +#define ARM_r8 uregs[8] +#define ARM_r7 uregs[7] +#define ARM_r6 uregs[6] +#define ARM_r5 uregs[5] +#define ARM_r4 uregs[4] +#define ARM_r3 uregs[3] +#define ARM_r2 uregs[2] +#define ARM_r1 uregs[1] +#define ARM_r0 uregs[0] +#define ARM_ORIG_r0 uregs[17] + +#elif defined(__alpha__) + +struct pt_regs { + unsigned long r0; + unsigned long r1; + unsigned long r2; + unsigned long r3; + unsigned long r4; + unsigned long r5; + unsigned long r6; + unsigned long r7; + unsigned long r8; + unsigned long r19; + unsigned long r20; + unsigned long r21; + unsigned long r22; + unsigned long r23; + unsigned long r24; + unsigned long r25; + unsigned long r26; + unsigned long r27; + unsigned long r28; + unsigned long hae; +/* JRP - These are the values provided to a0-a2 by PALcode */ + unsigned long trap_a0; + unsigned long trap_a1; + unsigned long trap_a2; +/* These are saved by PAL-code: */ + unsigned long ps; + unsigned long pc; + unsigned long gp; + unsigned long r16; + unsigned long r17; + unsigned long r18; +}; + +struct switch_stack { + unsigned long r9; + unsigned long r10; + unsigned long r11; + unsigned long r12; + unsigned long r13; + unsigned long r14; + unsigned long r15; + unsigned long r26; + unsigned long fp[32]; /* fp[31] is fpcr */ +}; + +#elif defined(__mips__) + +/* 0 - 31 are integer registers, 32 - 63 are fp registers. */ +#define FPR_BASE 32 +#define PC 64 +#define CAUSE 65 +#define BADVADDR 66 +#define MMHI 67 +#define MMLO 68 +#define FPC_CSR 69 +#define FPC_EIR 70 + +struct pt_regs { + /* Pad bytes for argument save space on the stack. */ + unsigned long pad0[6]; + /* Saved main processor registers. */ + unsigned long regs[32]; + /* Other saved registers. */ + unsigned long lo; + unsigned long hi; + /* saved cp0 registers */ + unsigned long cp0_epc; + unsigned long cp0_badvaddr; + unsigned long cp0_status; + unsigned long cp0_cause; +}; + +#elif defined(__sparc__) + +struct pt_regs { + unsigned long psr; + unsigned long pc; + unsigned long npc; + unsigned long y; + unsigned long u_regs[16]; /* globals and ins */ +}; + +#define UREG_G0 0 +#define UREG_G1 1 +#define UREG_G2 2 +#define UREG_G3 3 +#define UREG_G4 4 +#define UREG_G5 5 +#define UREG_G6 6 +#define UREG_G7 7 +#define UREG_I0 8 +#define UREG_I1 9 +#define UREG_I2 10 +#define UREG_I3 11 +#define UREG_I4 12 +#define UREG_I5 13 +#define UREG_I6 14 +#define UREG_I7 15 +#define UREG_WIM UREG_G0 +#define UREG_FADDR UREG_G0 +#define UREG_FP UREG_I6 +#define UREG_RETPC UREG_I7 + +/* A register window */ +struct reg_window { + unsigned long locals[8]; + unsigned long ins[8]; +}; + +/* A Sparc stack frame */ +struct sparc_stackf { + unsigned long locals[8]; + unsigned long ins[6]; + struct sparc_stackf *fp; + unsigned long callers_pc; + char *structptr; + unsigned long xargs[6]; + unsigned long xxargs[1]; +}; + +#define TRACEREG_SZ sizeof(struct pt_regs) +#define STACKFRAME_SZ sizeof(struct sparc_stackf) +#define REGWIN_SZ sizeof(struct reg_window) + +/* These are for pt_regs. */ +#define PT_PSR 0x0 +#define PT_PC 0x4 +#define PT_NPC 0x8 +#define PT_Y 0xc +#define PT_G0 0x10 +#define PT_WIM PT_G0 +#define PT_G1 0x14 +#define PT_G2 0x18 +#define PT_G3 0x1c +#define PT_G4 0x20 +#define PT_G5 0x24 +#define PT_G6 0x28 +#define PT_G7 0x2c +#define PT_I0 0x30 +#define PT_I1 0x34 +#define PT_I2 0x38 +#define PT_I3 0x3c +#define PT_I4 0x40 +#define PT_I5 0x44 +#define PT_I6 0x48 +#define PT_FP PT_I6 +#define PT_I7 0x4c + +/* Reg_window offsets */ +#define RW_L0 0x00 +#define RW_L1 0x04 +#define RW_L2 0x08 +#define RW_L3 0x0c +#define RW_L4 0x10 +#define RW_L5 0x14 +#define RW_L6 0x18 +#define RW_L7 0x1c +#define RW_I0 0x20 +#define RW_I1 0x24 +#define RW_I2 0x28 +#define RW_I3 0x2c +#define RW_I4 0x30 +#define RW_I5 0x34 +#define RW_I6 0x38 +#define RW_I7 0x3c + +/* Stack_frame offsets */ +#define SF_L0 0x00 +#define SF_L1 0x04 +#define SF_L2 0x08 +#define SF_L3 0x0c +#define SF_L4 0x10 +#define SF_L5 0x14 +#define SF_L6 0x18 +#define SF_L7 0x1c +#define SF_I0 0x20 +#define SF_I1 0x24 +#define SF_I2 0x28 +#define SF_I3 0x2c +#define SF_I4 0x30 +#define SF_I5 0x34 +#define SF_FP 0x38 +#define SF_PC 0x3c +#define SF_RETP 0x40 +#define SF_XARG0 0x44 +#define SF_XARG1 0x48 +#define SF_XARG2 0x4c +#define SF_XARG3 0x50 +#define SF_XARG4 0x54 +#define SF_XARG5 0x58 +#define SF_XXARG 0x5c + +/* Stuff for the ptrace system call */ +#define PTRACE_SUNATTACH 10 +#define PTRACE_SUNDETACH 11 +#define PTRACE_GETREGS 12 +#define PTRACE_SETREGS 13 +#define PTRACE_GETFPREGS 14 +#define PTRACE_SETFPREGS 15 +#define PTRACE_READDATA 16 +#define PTRACE_WRITEDATA 17 +#define PTRACE_READTEXT 18 +#define PTRACE_WRITETEXT 19 +#define PTRACE_GETFPAREGS 20 +#define PTRACE_SETFPAREGS 21 + +#define PTRACE_GETUCODE 29 /* stupid bsd-ism */ + +#elif defined(__powerpc__) + +struct pt_regs { + unsigned long gpr[32]; + unsigned long nip; + unsigned long msr; + unsigned long orig_gpr3; /* Used for restarting system calls */ + unsigned long ctr; + unsigned long link; + unsigned long xer; + unsigned long ccr; + unsigned long mq; /* 601 only (not used at present) */ + /* Used on APUS to hold IPL value. */ + unsigned long trap; /* Reason for being here */ + unsigned long dar; /* Fault registers */ + unsigned long dsisr; + unsigned long result; /* Result of a system call */ +}; + +/* + * Offsets used by 'ptrace' system call interface. + * These can't be changed without breaking binary compatibility + * with MkLinux, etc. + */ +#define PT_R0 0 +#define PT_R1 1 +#define PT_R2 2 +#define PT_R3 3 +#define PT_R4 4 +#define PT_R5 5 +#define PT_R6 6 +#define PT_R7 7 +#define PT_R8 8 +#define PT_R9 9 +#define PT_R10 10 +#define PT_R11 11 +#define PT_R12 12 +#define PT_R13 13 +#define PT_R14 14 +#define PT_R15 15 +#define PT_R16 16 +#define PT_R17 17 +#define PT_R18 18 +#define PT_R19 19 +#define PT_R20 20 +#define PT_R21 21 +#define PT_R22 22 +#define PT_R23 23 +#define PT_R24 24 +#define PT_R25 25 +#define PT_R26 26 +#define PT_R27 27 +#define PT_R28 28 +#define PT_R29 29 +#define PT_R30 30 +#define PT_R31 31 + +#define PT_NIP 32 +#define PT_MSR 33 +#define PT_CTR 35 +#define PT_LNK 36 +#define PT_XER 37 +#define PT_CCR 38 +#define PT_MQ 39 + +#define PT_FPR0 48 /* each FP reg occupies 2 slots in this space */ +#define PT_FPR31 (PT_FPR0 + 2*31) +#define PT_FPSCR (PT_FPR0 + 2*32 + 1) + +#elif defined(__hppa__) + +#include <inttypes.h> + +struct pt_regs { + unsigned long gr[32]; /* PSW is in gr[0] */ + uint64_t fr[32]; + unsigned long sr[ 8]; + unsigned long iasq[2]; + unsigned long iaoq[2]; + unsigned long cr27; + unsigned long pad0; /* available for other uses */ + unsigned long orig_r28; + unsigned long ksp; + unsigned long kpc; + unsigned long sar; /* CR11 */ + unsigned long iir; /* CR19 */ + unsigned long isr; /* CR20 */ + unsigned long ior; /* CR21 */ + unsigned long ipsw; /* CR22 */ +}; + +#define PTRACE_SINGLEBLOCK 12 /* resume execution until next branch */ +#define PTRACE_GETSIGINFO 13 /* get child's siginfo structure */ +#define PTRACE_SETSIGINFO 14 /* set child's siginfo structure */ + +#elif defined(__ia64__) + +struct ia64_fpreg { + union { + unsigned long bits[2]; + } u; +} __attribute__ ((aligned (16))); + +struct pt_regs { + unsigned long cr_ipsr; /* interrupted task's psr */ + unsigned long cr_iip; /* interrupted task's instruction pointer */ + unsigned long cr_ifs; /* interrupted task's function state */ + unsigned long ar_unat; /* interrupted task's NaT register (preserved) */ + unsigned long ar_pfs; /* prev function state */ + unsigned long ar_rsc; /* RSE configuration */ + unsigned long ar_rnat; /* RSE NaT */ + unsigned long ar_bspstore; /* RSE bspstore */ + unsigned long pr; /* 64 predicate registers (1 bit each) */ + unsigned long b6; /* scratch */ + unsigned long loadrs; /* size of dirty partition << 16 */ + unsigned long r1; /* the gp pointer */ + unsigned long r2; /* scratch */ + unsigned long r3; /* scratch */ + unsigned long r12; /* interrupted task's memory stack pointer */ + unsigned long r13; /* thread pointer */ + unsigned long r14; /* scratch */ + unsigned long r15; /* scratch */ + unsigned long r8; /* scratch (return value register 0) */ + unsigned long r9; /* scratch (return value register 1) */ + unsigned long r10; /* scratch (return value register 2) */ + unsigned long r11; /* scratch (return value register 3) */ + unsigned long r16; /* scratch */ + unsigned long r17; /* scratch */ + unsigned long r18; /* scratch */ + unsigned long r19; /* scratch */ + unsigned long r20; /* scratch */ + unsigned long r21; /* scratch */ + unsigned long r22; /* scratch */ + unsigned long r23; /* scratch */ + unsigned long r24; /* scratch */ + unsigned long r25; /* scratch */ + unsigned long r26; /* scratch */ + unsigned long r27; /* scratch */ + unsigned long r28; /* scratch */ + unsigned long r29; /* scratch */ + unsigned long r30; /* scratch */ + unsigned long r31; /* scratch */ + unsigned long ar_ccv; /* compare/exchange value (scratch) */ + unsigned long ar_fpsr; /* floating point status (preserved) */ + unsigned long b0; /* return pointer (bp) */ + unsigned long b7; /* scratch */ + struct ia64_fpreg f6; /* scratch */ + struct ia64_fpreg f7; /* scratch */ + struct ia64_fpreg f8; /* scratch */ + struct ia64_fpreg f9; /* scratch */ +}; + +struct switch_stack { + unsigned long caller_unat; /* user NaT collection register (preserved) */ + unsigned long ar_fpsr; /* floating-point status register */ + + struct ia64_fpreg f2; /* preserved */ + struct ia64_fpreg f3; /* preserved */ + struct ia64_fpreg f4; /* preserved */ + struct ia64_fpreg f5; /* preserved */ + + struct ia64_fpreg f10; /* scratch, but untouched by kernel */ + struct ia64_fpreg f11; /* scratch, but untouched by kernel */ + struct ia64_fpreg f12; /* scratch, but untouched by kernel */ + struct ia64_fpreg f13; /* scratch, but untouched by kernel */ + struct ia64_fpreg f14; /* scratch, but untouched by kernel */ + struct ia64_fpreg f15; /* scratch, but untouched by kernel */ + struct ia64_fpreg f16; /* preserved */ + struct ia64_fpreg f17; /* preserved */ + struct ia64_fpreg f18; /* preserved */ + struct ia64_fpreg f19; /* preserved */ + struct ia64_fpreg f20; /* preserved */ + struct ia64_fpreg f21; /* preserved */ + struct ia64_fpreg f22; /* preserved */ + struct ia64_fpreg f23; /* preserved */ + struct ia64_fpreg f24; /* preserved */ + struct ia64_fpreg f25; /* preserved */ + struct ia64_fpreg f26; /* preserved */ + struct ia64_fpreg f27; /* preserved */ + struct ia64_fpreg f28; /* preserved */ + struct ia64_fpreg f29; /* preserved */ + struct ia64_fpreg f30; /* preserved */ + struct ia64_fpreg f31; /* preserved */ + + unsigned long r4; /* preserved */ + unsigned long r5; /* preserved */ + unsigned long r6; /* preserved */ + unsigned long r7; /* preserved */ + + unsigned long b0; /* so we can force a direct return in copy_thread */ + unsigned long b1; + unsigned long b2; + unsigned long b3; + unsigned long b4; + unsigned long b5; + + unsigned long ar_pfs; /* previous function state */ + unsigned long ar_lc; /* loop counter (preserved) */ + unsigned long ar_unat; /* NaT bits for r4-r7 */ + unsigned long ar_rnat; /* RSE NaT collection register */ + unsigned long ar_bspstore; /* RSE dirty base (preserved) */ + unsigned long pr; /* 64 predicate registers (1 bit each) */ +}; + +#endif + +extern long int ptrace(int request, ...) __THROW; #endif diff --git a/mdk-stage1/dietlibc/include/sys/reboot.h b/mdk-stage1/dietlibc/include/sys/reboot.h index ba58d296a..b17a556e5 100644 --- a/mdk-stage1/dietlibc/include/sys/reboot.h +++ b/mdk-stage1/dietlibc/include/sys/reboot.h @@ -1,9 +1,26 @@ #ifndef _SYS_REBOOT_H #define _SYS_REBOOT_H -#include <linux/reboot.h> +#define LINUX_REBOOT_MAGIC1 0xfee1dead +#define LINUX_REBOOT_MAGIC2 672274793 +#define LINUX_REBOOT_MAGIC2A 85072278 +#define LINUX_REBOOT_MAGIC2B 369367448 + +#define LINUX_REBOOT_CMD_RESTART 0x01234567 +#define LINUX_REBOOT_CMD_HALT 0xCDEF0123 +#define LINUX_REBOOT_CMD_CAD_ON 0x89ABCDEF +#define LINUX_REBOOT_CMD_CAD_OFF 0x00000000 +#define LINUX_REBOOT_CMD_POWER_OFF 0x4321FEDC +#define LINUX_REBOOT_CMD_RESTART2 0xA1B2C3D4 /* Reboot or halt the system. */ -int reboot (int flag, void *arg); +int reboot (int flag); + +/* the glibc people changed their macro names :-/ */ +#define RB_AUTOBOOT 0x01234567 +#define RB_HALT_SYSTEM 0xcdef0123 +#define RB_ENABLE_CAD 0x89abcdef +#define RB_DISABLE_CAD 0 +#define RB_POWER_OFF 0x4321fedc #endif /* _SYS_REBOOT_H */ diff --git a/mdk-stage1/dietlibc/include/sys/resource.h b/mdk-stage1/dietlibc/include/sys/resource.h index 442434cd1..df31b82ab 100644 --- a/mdk-stage1/dietlibc/include/sys/resource.h +++ b/mdk-stage1/dietlibc/include/sys/resource.h @@ -1,8 +1,59 @@ #ifndef _SYS_RESOURCE_H #define _SYS_RESOURCE_H +#include <time.h> #include <sys/cdefs.h> -#include <linux/resource.h> + +#define RUSAGE_SELF 0 +#define RUSAGE_CHILDREN (-1) +#define RUSAGE_BOTH (-2) /* sys_wait4() uses this */ + +struct rusage { + struct timeval ru_utime; /* user time used */ + struct timeval ru_stime; /* system time used */ + long ru_maxrss; /* maximum resident set size */ + long ru_ixrss; /* integral shared memory size */ + long ru_idrss; /* integral unshared data size */ + long ru_isrss; /* integral unshared stack size */ + long ru_minflt; /* page reclaims */ + long ru_majflt; /* page faults */ + long ru_nswap; /* swaps */ + long ru_inblock; /* block input operations */ + long ru_oublock; /* block output operations */ + long ru_msgsnd; /* messages sent */ + long ru_msgrcv; /* messages received */ + long ru_nsignals; /* signals received */ + long ru_nvcsw; /* voluntary context switches */ + long ru_nivcsw; /* involuntary " */ +}; + +struct rlimit { + unsigned long rlim_cur; + unsigned long rlim_max; +}; + +#define PRIO_MIN (-20) +#define PRIO_MAX 20 + +#define PRIO_PROCESS 0 +#define PRIO_PGRP 1 +#define PRIO_USER 2 + +#define RLIMIT_CPU 0 /* CPU time in ms */ +#define RLIMIT_FSIZE 1 /* Maximum filesize */ +#define RLIMIT_DATA 2 /* max data size */ +#define RLIMIT_STACK 3 /* max stack size */ +#define RLIMIT_CORE 4 /* max core file size */ +#define RLIMIT_RSS 5 /* max resident set size */ +#define RLIMIT_NPROC 6 /* max number of processes */ +#define RLIMIT_NOFILE 7 /* max number of open files */ +#define RLIMIT_MEMLOCK 8 /* max locked-in-memory address space */ +#define RLIMIT_AS 9 /* address space limit */ +#define RLIMIT_LOCKS 10 /* maximum file locks held */ + +#define RLIM_NLIMITS 11 + +#define RLIM_INFINITY ((long)(~0UL>>1)) int getpriority(int which, int who) __THROW; int setpriority(int which, int who, int prio) __THROW; diff --git a/mdk-stage1/dietlibc/include/sys/select.h b/mdk-stage1/dietlibc/include/sys/select.h index e69de29bb..ce67b8bee 100644 --- a/mdk-stage1/dietlibc/include/sys/select.h +++ b/mdk-stage1/dietlibc/include/sys/select.h @@ -0,0 +1,22 @@ +#ifndef _SYS_SELECT_H +#define _SYS_SELECT_H + +typedef long int fd_mask; + +#define NFDBITS (8 * sizeof(unsigned long)) +#define FD_SETSIZE 1024 +#define __FDSET_LONGS (FD_SETSIZE/NFDBITS) +#define __FDELT(d) ((d) / NFDBITS) +#define __FDMASK(d) (1UL << ((d) % NFDBITS)) + +typedef struct { + unsigned long fds_bits [__FDSET_LONGS]; +} fd_set; + +#define FD_SET(d, set) ((set)->fds_bits[__FDELT(d)] |= __FDMASK(d)) +#define FD_CLR(d, set) ((set)->fds_bits[__FDELT(d)] &= ~__FDMASK(d)) +#define FD_ISSET(d, set) (((set)->fds_bits[__FDELT(d)] & __FDMASK(d)) != 0) +#define FD_ZERO(set) \ + ((void) memset ((void*) (set), 0, sizeof (fd_set))) + +#endif diff --git a/mdk-stage1/dietlibc/include/sys/sem.h b/mdk-stage1/dietlibc/include/sys/sem.h index cc182649c..ad16b5f53 100644 --- a/mdk-stage1/dietlibc/include/sys/sem.h +++ b/mdk-stage1/dietlibc/include/sys/sem.h @@ -1,11 +1,81 @@ #ifndef _SYS_SEM_H #define _SYS_SEM_H -#include <linux/sem.h> #include <sys/ipc.h> +/* semop flags */ +#define SEM_UNDO 0x1000 /* undo the operation on exit */ + +/* semctl Command Definitions. */ +#define GETPID 11 /* get sempid */ +#define GETVAL 12 /* get semval */ +#define GETALL 13 /* get all semval's */ +#define GETNCNT 14 /* get semncnt */ +#define GETZCNT 15 /* get semzcnt */ +#define SETVAL 16 /* set semval */ +#define SETALL 17 /* set all semval's */ + +/* ipcs ctl cmds */ +#define SEM_STAT 18 +#define SEM_INFO 19 + +struct semid_ds { + struct ipc_perm sem_perm; /* permissions .. see ipc.h */ + time_t sem_otime; /* last semop time */ + time_t sem_ctime; /* last change time */ + struct sem *sem_base; /* ptr to first semaphore in array */ + struct sem_queue *sem_pending; /* pending operations to be processed */ + struct sem_queue **sem_pending_last; /* last pending operation */ + struct sem_undo *undo; /* undo requests on this array */ + unsigned short sem_nsems; /* no. of semaphores in array */ +}; + +/* semop system calls takes an array of these. */ +struct sembuf { + unsigned short sem_num; /* semaphore index in array */ + short sem_op; /* semaphore operation */ + short sem_flg; /* operation flags */ +}; + +/* please complain to the glibc goons for the following misbehaviour */ +#if 0 +/* arg for semctl system calls. */ +union semun { + int val; /* value for SETVAL */ + struct semid_ds *buf; /* buffer for IPC_STAT & IPC_SET */ + unsigned short *array; /* array for GETALL & SETALL */ + struct seminfo *__buf; /* buffer for IPC_INFO */ + void *__pad; +}; +#endif +#define _SEM_SEMUN_UNDEFINED + +struct seminfo { + int semmap; + int semmni; + int semmns; + int semmnu; + int semmsl; + int semopm; + int semume; + int semusz; + int semvmx; + int semaem; +}; + +#define SEMMNI 128 /* <= IPCMNI max # of semaphore identifiers */ +#define SEMMSL 250 /* <= 8 000 max num of semaphores per id */ +#define SEMMNS (SEMMNI*SEMMSL) /* <= INT_MAX max # of semaphores in system */ +#define SEMOPM 32 /* <= 1 000 max num of ops per semop call */ +#define SEMVMX 32767 /* <= 32767 semaphore maximum value */ + extern int semget( key_t key, int nsems, int semflg) __THROW; -extern int semctl(int semid, int semnum, int cmd, union semun arg) __THROW; + +/* The prototype really is: + * extern int semctl(int semid, int semnum, int cmd, union semun arg) __THROW; + * glibc bug compatibility forces us to write it like this: */ +extern int semctl(int semid, int semnum, int cmd, ...) __THROW; + extern int semop(int semid, struct sembuf *sops, unsigned nsops) __THROW; #endif diff --git a/mdk-stage1/dietlibc/include/sys/sendfile.h b/mdk-stage1/dietlibc/include/sys/sendfile.h index 2e0c04add..ce6630676 100644 --- a/mdk-stage1/dietlibc/include/sys/sendfile.h +++ b/mdk-stage1/dietlibc/include/sys/sendfile.h @@ -2,8 +2,12 @@ #define _SYS_SENDFILE_H #include <sys/cdefs.h> +#include <sys/types.h> -extern ssize_t sendfile (int __out_fd, int __in_fd, off_t *offset, - size_t __count) __THROW; +extern ssize_t sendfile (int out_fd, int in_fd, off_t* offset, + size_t count) __THROW; + +extern ssize_t sendfile64 (int out_fd, int in_fd, loff_t* offset, + size_t count) __THROW; #endif /* sys/sendfile.h */ diff --git a/mdk-stage1/dietlibc/include/sys/shm.h b/mdk-stage1/dietlibc/include/sys/shm.h index c27f5ddcf..879a8786e 100644 --- a/mdk-stage1/dietlibc/include/sys/shm.h +++ b/mdk-stage1/dietlibc/include/sys/shm.h @@ -1,12 +1,70 @@ #ifndef _SYS_SHM_H #define _SYS_SHM_H -#include <linux/shm.h> #include <sys/ipc.h> -#include <asm/page.h> -#ifndef PAGE_SIZE -#define PAGE_SIZE getpagesize() +#define SHMMAX 0x2000000 /* max shared seg size (bytes) */ +#define SHMMIN 1 /* min shared seg size (bytes) */ +#define SHMMNI 4096 /* max num of segs system wide */ +#define SHMALL (SHMMAX/PAGE_SIZE*(SHMMNI/16)) /* max shm system wide (pages) */ +#define SHMSEG SHMMNI /* max shared segs per process */ + +struct shmid_ds { + struct ipc_perm shm_perm; /* operation perms */ + int shm_segsz; /* size of segment (bytes) */ + time_t shm_atime; /* last attach time */ + time_t shm_dtime; /* last detach time */ + time_t shm_ctime; /* last change time */ + pid_t shm_cpid; /* pid of creator */ + pid_t shm_lpid; /* pid of last operator */ + unsigned short shm_nattch; /* no. of current attaches */ + unsigned short shm_unused; /* compatibility */ + void *shm_unused2; /* ditto - used by DIPC */ + void *shm_unused3; /* unused */ +}; + +/* permission flag for shmget */ +#define SHM_R 0400 /* or S_IRUGO from <linux/stat.h> */ +#define SHM_W 0200 /* or S_IWUGO from <linux/stat.h> */ + +/* mode for attach */ +#define SHM_RDONLY 010000 /* read-only access */ +#define SHM_RND 020000 /* round attach address to SHMLBA boundary */ +#define SHM_REMAP 040000 /* take-over region on attach */ + +/* super user shmctl commands */ +#define SHM_LOCK 11 +#define SHM_UNLOCK 12 + +/* ipcs ctl commands */ +#define SHM_STAT 13 +#define SHM_INFO 14 + +/* Obsolete, used only for backwards compatibility */ +struct shminfo { + int shmmax; + int shmmin; + int shmmni; + int shmseg; + int shmall; +}; + +struct shm_info { + int used_ids; + unsigned long shm_tot; /* total allocated shm */ + unsigned long shm_rss; /* total resident shm */ + unsigned long shm_swp; /* total swapped shm */ + unsigned long swap_attempts; + unsigned long swap_successes; +}; + +#if defined(__i386__) || defined(__mips__) || defined(__arm__) || defined(__powerpc__) || defined(__s390__) || defined(__hppa__) || defined(__x86_64__) || defined(__ia64__) +#define PAGE_SIZE 4096UL +#define PAGE_SHIFT 12 +#elif defined(__alpha__) || defined(__sparc__) +/* sun4* has 4k except sun4 architecture, sparc64 has 8k */ +#define PAGE_SIZE 8192UL +#define PAGE_SHIFT 13 #endif extern int shmget(key_t key, int size, int shmflg) __THROW; diff --git a/mdk-stage1/dietlibc/include/sys/socket.h b/mdk-stage1/dietlibc/include/sys/socket.h index a1435501c..a1130c4f6 100644 --- a/mdk-stage1/dietlibc/include/sys/socket.h +++ b/mdk-stage1/dietlibc/include/sys/socket.h @@ -3,26 +3,380 @@ #include <sys/cdefs.h> #include <sys/types.h> -#include <linux/socket.h> -#ifndef SOCK_DGRAM -/* the Linux kernel headers suck really badly on non-x86 */ +/* For setsockoptions(2) */ +#if defined(__alpha__) || defined(__mips__) +#define SOL_SOCKET 0xffff + +#define SO_DEBUG 0x0001 +#define SO_REUSEADDR 0x0004 +#define SO_TYPE 0x1008 +#define SO_ERROR 0x1007 +#define SO_DONTROUTE 0x0010 +#define SO_BROADCAST 0x0020 +#define SO_SNDBUF 0x1001 +#define SO_RCVBUF 0x1002 +#define SO_KEEPALIVE 0x0008 +#define SO_OOBINLINE 0x0100 +#define SO_NO_CHECK 11 +#define SO_PRIORITY 12 +#define SO_LINGER 0x0080 +#define SO_BSDCOMPAT 14 +/* To add :#define SO_REUSEPORT 15 */ +#define SO_PASSCRED 17 +#define SO_PEERCRED 18 +#define SO_RCVLOWAT 0x1004 +#define SO_SNDLOWAT 0x1003 +#define SO_RCVTIMEO 0x1006 +#define SO_SNDTIMEO 0x1005 +#define SO_ACCEPTCONN 0x1009 + +#define SO_STYLE SO_TYPE /* Synonym */ + +#elif defined(__hppa__) +#define SOL_SOCKET 0xffff + +#define SO_DEBUG 0x0001 +#define SO_REUSEADDR 0x0004 +#define SO_KEEPALIVE 0x0008 +#define SO_DONTROUTE 0x0010 +#define SO_BROADCAST 0x0020 +#define SO_LINGER 0x0080 +#define SO_OOBINLINE 0x0100 +/* To add :#define SO_REUSEPORT 0x0200 */ +#define SO_SNDBUF 0x1001 +#define SO_RCVBUF 0x1002 +#define SO_SNDLOWAT 0x1003 +#define SO_RCVLOWAT 0x1004 +#define SO_SNDTIMEO 0x1005 +#define SO_RCVTIMEO 0x1006 +#define SO_ERROR 0x1007 +#define SO_TYPE 0x1008 +#define SO_PEERNAME 0x2000 + +#define SO_NO_CHECK 0x400b +#define SO_PRIORITY 0x400c +#define SO_BSDCOMPAT 0x400e +#define SO_PASSCRED 0x4010 +#define SO_PEERCRED 0x4011 +#define SO_TIMESTAMP 0x4012 +#define SCM_TIMESTAMP SO_TIMESTAMP + +/* Security levels - as per NRL IPv6 - don't actually do anything */ +#define SO_SECURITY_AUTHENTICATION 0x4016 +#define SO_SECURITY_ENCRYPTION_TRANSPORT 0x4017 +#define SO_SECURITY_ENCRYPTION_NETWORK 0x4018 + +#define SO_BINDTODEVICE 0x4019 + +/* Socket filtering */ +#define SO_ATTACH_FILTER 0x401a +#define SO_DETACH_FILTER 0x401b + +#define SO_ACCEPTCONN 0x401c + +#elif defined(__sparc__) +#define SOL_SOCKET 0xffff + +#define SO_DEBUG 0x0001 +#define SO_PASSCRED 0x0002 +#define SO_REUSEADDR 0x0004 +#define SO_KEEPALIVE 0x0008 +#define SO_DONTROUTE 0x0010 +#define SO_BROADCAST 0x0020 +#define SO_PEERCRED 0x0040 +#define SO_LINGER 0x0080 +#define SO_OOBINLINE 0x0100 +/* To add :#define SO_REUSEPORT 0x0200 */ +#define SO_BSDCOMPAT 0x0400 +#define SO_RCVLOWAT 0x0800 +#define SO_SNDLOWAT 0x1000 +#define SO_RCVTIMEO 0x2000 +#define SO_SNDTIMEO 0x4000 +#define SO_ACCEPTCONN 0x8000 + +#define SO_DONTLINGER (~SO_LINGER) /* Older SunOS compat. hack */ + +#define SO_SNDBUF 0x1001 +#define SO_RCVBUF 0x1002 +#define SO_ERROR 0x1007 +#define SO_TYPE 0x1008 + +#define SO_ATTACH_FILTER 0x001a +#define SO_DETACH_FILTER 0x001b + +#define SO_PEERNAME 0x001c +#define SO_TIMESTAMP 0x001d +#define SCM_TIMESTAMP SO_TIMESTAMP + +/* Security levels - as per NRL IPv6 - don't actually do anything */ +#define SO_SECURITY_AUTHENTICATION 0x5001 +#define SO_SECURITY_ENCRYPTION_TRANSPORT 0x5002 +#define SO_SECURITY_ENCRYPTION_NETWORK 0x5004 + +#else + +#define SOL_SOCKET 1 + +#define SO_DEBUG 1 +#define SO_REUSEADDR 2 +#define SO_TYPE 3 +#define SO_ERROR 4 +#define SO_DONTROUTE 5 +#define SO_BROADCAST 6 +#define SO_SNDBUF 7 +#define SO_RCVBUF 8 +#define SO_KEEPALIVE 9 +#define SO_OOBINLINE 10 +#define SO_NO_CHECK 11 +#define SO_PRIORITY 12 +#define SO_LINGER 13 +#define SO_BSDCOMPAT 14 +/* To add :#define SO_REUSEPORT 15 */ +#define SO_PASSCRED 16 +#define SO_PEERCRED 17 +#define SO_RCVLOWAT 18 +#define SO_SNDLOWAT 19 +#define SO_RCVTIMEO 20 +#define SO_SNDTIMEO 21 +#define SO_ACCEPTCONN 30 + +#endif + +#if !defined(__hppa__) && !defined(__sparc__) +/* Security levels - as per NRL IPv6 - don't actually do anything */ +#define SO_SECURITY_AUTHENTICATION 22 +#define SO_SECURITY_ENCRYPTION_TRANSPORT 23 +#define SO_SECURITY_ENCRYPTION_NETWORK 24 + +#define SO_BINDTODEVICE 25 + +/* Socket filtering */ +#define SO_ATTACH_FILTER 26 +#define SO_DETACH_FILTER 27 + +#define SO_PEERNAME 28 +#define SO_TIMESTAMP 29 +#define SCM_TIMESTAMP SO_TIMESTAMP +#endif + +/* Socket types. */ +#ifdef __mips__ +#define SOCK_DGRAM 1 /* datagram (conn.less) socket */ +#define SOCK_STREAM 2 /* stream (connection) socket */ +#else #define SOCK_STREAM 1 /* stream (connection) socket */ #define SOCK_DGRAM 2 /* datagram (conn.less) socket */ +#endif #define SOCK_RAW 3 /* raw socket */ #define SOCK_RDM 4 /* reliably-delivered message */ #define SOCK_SEQPACKET 5 /* sequential packet socket */ #define SOCK_PACKET 10 /* linux specific way of */ -#endif + /* getting packets at the dev */ + /* level. For writing rarp and */ + /* other similar things on the */ + /* user level. */ + +struct sockaddr { + sa_family_t sa_family; + char sa_data[14]; +}; + +struct linger { + int l_onoff; + int l_linger; +}; + +struct iovec { + void* iov_base; /* BSD uses caddr_t (1003.1g requires void *) */ + size_t iov_len; /* Must be size_t (1003.1g) */ +}; + +struct msghdr { + void* msg_name; /* Socket name */ + int msg_namelen; /* Length of name */ + struct iovec* msg_iov; /* Data blocks */ + size_t msg_iovlen; /* Number of blocks */ + void* msg_control; /* Per protocol magic (eg BSD file descriptor passing) */ + size_t msg_controllen; /* Length of cmsg list */ + unsigned msg_flags; +}; + +struct cmsghdr { + size_t cmsg_len; /* data byte count, including hdr */ + int cmsg_level; /* originating protocol */ + int cmsg_type; /* protocol-specific type */ +}; + +#define UIO_FASTIOV 8 +#define UIO_MAXIOV 1024 + +/* "Socket"-level control message types: */ + +#define SCM_RIGHTS 0x01 /* rw: access rights (array of int) */ +#define SCM_CREDENTIALS 0x02 /* rw: struct ucred */ +#define SCM_CONNECT 0x03 /* rw: struct scm_connect */ + +struct ucred { + unsigned int pid; + unsigned int uid; + unsigned int gid; +}; + +/* Supported address families. */ +#define AF_UNSPEC 0 +#define AF_UNIX 1 /* Unix domain sockets */ +#define AF_LOCAL 1 /* POSIX name for AF_UNIX */ +#define AF_INET 2 /* Internet IP Protocol */ +#define AF_AX25 3 /* Amateur Radio AX.25 */ +#define AF_IPX 4 /* Novell IPX */ +#define AF_APPLETALK 5 /* AppleTalk DDP */ +#define AF_NETROM 6 /* Amateur Radio NET/ROM */ +#define AF_BRIDGE 7 /* Multiprotocol bridge */ +#define AF_ATMPVC 8 /* ATM PVCs */ +#define AF_X25 9 /* Reserved for X.25 project */ +#define AF_INET6 10 /* IP version 6 */ +#define AF_ROSE 11 /* Amateur Radio X.25 PLP */ +#define AF_DECnet 12 /* Reserved for DECnet project */ +#define AF_NETBEUI 13 /* Reserved for 802.2LLC project*/ +#define AF_SECURITY 14 /* Security callback pseudo AF */ +#define AF_KEY 15 /* PF_KEY key management API */ +#define AF_NETLINK 16 +#define AF_ROUTE AF_NETLINK /* Alias to emulate 4.4BSD */ +#define AF_PACKET 17 /* Packet family */ +#define AF_ASH 18 /* Ash */ +#define AF_ECONET 19 /* Acorn Econet */ +#define AF_ATMSVC 20 /* ATM SVCs */ +#define AF_SNA 22 /* Linux SNA Project (nutters!) */ +#define AF_IRDA 23 /* IRDA sockets */ +#define AF_PPPOX 24 /* PPPoX sockets */ +#define AF_WANPIPE 25 /* Wanpipe API Sockets */ +#define AF_MAX 32 /* For now.. */ + +/* Protocol families, same as address families. */ +#define PF_UNSPEC AF_UNSPEC +#define PF_UNIX AF_UNIX +#define PF_LOCAL AF_LOCAL +#define PF_INET AF_INET +#define PF_AX25 AF_AX25 +#define PF_IPX AF_IPX +#define PF_APPLETALK AF_APPLETALK +#define PF_NETROM AF_NETROM +#define PF_BRIDGE AF_BRIDGE +#define PF_ATMPVC AF_ATMPVC +#define PF_X25 AF_X25 +#define PF_INET6 AF_INET6 +#define PF_ROSE AF_ROSE +#define PF_DECnet AF_DECnet +#define PF_NETBEUI AF_NETBEUI +#define PF_SECURITY AF_SECURITY +#define PF_KEY AF_KEY +#define PF_NETLINK AF_NETLINK +#define PF_ROUTE AF_ROUTE +#define PF_PACKET AF_PACKET +#define PF_ASH AF_ASH +#define PF_ECONET AF_ECONET +#define PF_ATMSVC AF_ATMSVC +#define PF_SNA AF_SNA +#define PF_IRDA AF_IRDA +#define PF_PPPOX AF_PPPOX +#define PF_WANPIPE AF_WANPIPE +#define PF_MAX AF_MAX + +/* Maximum queue length specifiable by listen. */ +#define SOMAXCONN 128 + +/* Flags we can use with send/ and recv. + Added those for 1003.1g not all are supported yet */ +#define MSG_OOB 1 +#define MSG_PEEK 2 +#define MSG_DONTROUTE 4 +#define MSG_TRYHARD 4 /* Synonym for MSG_DONTROUTE for DECnet */ +#define MSG_CTRUNC 8 +#define MSG_PROBE 0x10 /* Do not send. Only probe path f.e. for MTU */ +#define MSG_TRUNC 0x20 +#define MSG_DONTWAIT 0x40 /* Nonblocking io */ +#define MSG_EOR 0x80 /* End of record */ +#define MSG_WAITALL 0x100 /* Wait for a full request */ +#define MSG_FIN 0x200 +#define MSG_EOF MSG_FIN +#define MSG_SYN 0x400 +#define MSG_CONFIRM 0x800 /* Confirm path validity */ +#define MSG_RST 0x1000 +#define MSG_ERRQUEUE 0x2000 /* Fetch message from error queue */ +#define MSG_NOSIGNAL 0x4000 /* Do not generate SIGPIPE */ +#define MSG_MORE 0x8000 /* Sender will send more */ + +/* Setsockoptions(2) level. Thanks to BSD these must match IPPROTO_xxx */ +#define SOL_IP 0 +/* #define SOL_ICMP 1 No-no-no! Due to Linux :-) we cannot use SOL_ICMP=1 */ +#define SOL_TCP 6 +#define SOL_UDP 17 +#define SOL_IPV6 41 +#define SOL_ICMPV6 58 +#define SOL_RAW 255 +#define SOL_IPX 256 +#define SOL_AX25 257 +#define SOL_ATALK 258 +#define SOL_NETROM 259 +#define SOL_ROSE 260 +#define SOL_DECNET 261 +#define SOL_X25 262 +#define SOL_PACKET 263 +#define SOL_ATM 264 /* ATM layer (cell level) */ +#define SOL_AAL 265 /* ATM Adaption Layer (packet level) */ +#define SOL_IRDA 266 + +/* IPX options */ +#define IPX_TYPE 1 + +#define CMSG_ALIGN(len) ( ((len)+sizeof(long)-1) & ~(sizeof(long)-1) ) +#define __CMSG_NXTHDR(ctl, len, cmsg) __cmsg_nxthdr((ctl),(len),(cmsg)) +#define CMSG_NXTHDR(mhdr, cmsg) cmsg_nxthdr((mhdr), (cmsg)) + +static inline struct cmsghdr* __cmsg_nxthdr(void *__ctl, size_t __size, struct cmsghdr *__cmsg) +{ + struct cmsghdr * __ptr; + __ptr = (struct cmsghdr*)(((unsigned char *) __cmsg) + CMSG_ALIGN(__cmsg->cmsg_len)); + if ((unsigned long)((char*)(__ptr+1) - (char *) __ctl) > __size) + return (struct cmsghdr *)0; + return __ptr; +} + +static inline struct cmsghdr* cmsg_nxthdr (struct msghdr *__msg, struct cmsghdr *__cmsg) +{ + return __cmsg_nxthdr(__msg->msg_control, __msg->msg_controllen, __cmsg); +} + +#define CMSG_DATA(cmsg) ((void *)((char *)(cmsg) + CMSG_ALIGN(sizeof(struct cmsghdr)))) +#define CMSG_SPACE(len) (CMSG_ALIGN(sizeof(struct cmsghdr)) + CMSG_ALIGN(len)) +#define CMSG_LEN(len) (CMSG_ALIGN(sizeof(struct cmsghdr)) + (len)) + +#define __CMSG_FIRSTHDR(ctl,len) ((len) >= sizeof(struct cmsghdr) ? \ + (struct cmsghdr *)(ctl) : \ + (struct cmsghdr *)NULL) +#define CMSG_FIRSTHDR(msg) __CMSG_FIRSTHDR((msg)->msg_control, (msg)->msg_controllen) struct sockaddr_storage { - char __tmp[sizeof(struct sockaddr)]; + sa_family_t ss_family; + uint32_t __ss_align; + char __ss_padding[(128 - (2 * sizeof (uint32_t ))) ]; }; +#ifndef SOCK_DGRAM +/* the Linux kernel headers suck really badly on non-x86 */ +#define SOCK_STREAM 1 /* stream (connection) socket */ +#define SOCK_DGRAM 2 /* datagram (conn.less) socket */ +#define SOCK_RAW 3 /* raw socket */ +#define SOCK_RDM 4 /* reliably-delivered message */ +#define SOCK_SEQPACKET 5 /* sequential packet socket */ +#define SOCK_PACKET 10 /* linux specific way of */ +#endif + int socket(int domain, int type, int protocol) __THROW; int accept(int s, struct sockaddr *addr, socklen_t *addrlen) __THROW; int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen) __THROW; -int bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen) __THROW; +int bind(int sockfd, const struct sockaddr *my_addr, socklen_t addrlen) __THROW; int recv(int s, void *buf, size_t len, int flags) __THROW; int recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen) __THROW; int recvmsg(int s, struct msghdr *msg, int flags) __THROW; @@ -43,4 +397,130 @@ int listen(int s, int backlog) __THROW; #define SHUT_RDWR 2 int shutdown(int s, int how) __THROW; +int socketpair(int d, int type, int protocol, int sv[2]); + +/* currently not supported: */ +#define NI_NOFQDN 1 + +#define NI_NUMERICHOST 2 +#define NI_NAMEREQD 4 +#define NI_NUMERICSERV 8 +#define NI_DGRAM 16 + +struct addrinfo { + int ai_flags; + int ai_family; + int ai_socktype; + int ai_protocol; + size_t ai_addrlen; + struct sockaddr *ai_addr; + char *ai_canonname; + struct addrinfo *ai_next; +}; + +int getnameinfo(const struct sockaddr *sa, socklen_t salen, char *host, + size_t hostlen, char *serv, size_t servlen, int flags) __THROW; +int getaddrinfo(const char *node, const char *service, const struct + addrinfo *hints, struct addrinfo **res) __THROW; +void freeaddrinfo(struct addrinfo *res) __THROW; +const char *gai_strerror(int errcode) __THROW; + +#define EAI_FAMILY -1 +#define EAI_SOCKTYPE -2 +#define EAI_BADFLAGS -3 +#define EAI_NONAME -4 +#define EAI_SERVICE -5 +#define EAI_ADDRFAMILY -6 +#define EAI_NODATA -7 +#define EAI_MEMORY -8 +#define EAI_FAIL -9 +#define EAI_AGAIN -10 +#define EAI_SYSTEM -11 + +#define AI_NUMERICHOST 1 +#define AI_CANONNAME 2 +#define AI_PASSIVE 4 + +/* Linux-specific socket ioctls */ +#define SIOCINQ FIONREAD +#define SIOCOUTQ TIOCOUTQ + +/* Routing table calls. */ +#define SIOCADDRT 0x890B /* add routing table entry */ +#define SIOCDELRT 0x890C /* delete routing table entry */ +#define SIOCRTMSG 0x890D /* call to routing system */ + +/* Socket configuration controls. */ +#define SIOCGIFNAME 0x8910 /* get iface name */ +#define SIOCSIFLINK 0x8911 /* set iface channel */ +#define SIOCGIFCONF 0x8912 /* get iface list */ +#define SIOCGIFFLAGS 0x8913 /* get flags */ +#define SIOCSIFFLAGS 0x8914 /* set flags */ +#define SIOCGIFADDR 0x8915 /* get PA address */ +#define SIOCSIFADDR 0x8916 /* set PA address */ +#define SIOCGIFDSTADDR 0x8917 /* get remote PA address */ +#define SIOCSIFDSTADDR 0x8918 /* set remote PA address */ +#define SIOCGIFBRDADDR 0x8919 /* get broadcast PA address */ +#define SIOCSIFBRDADDR 0x891a /* set broadcast PA address */ +#define SIOCGIFNETMASK 0x891b /* get network PA mask */ +#define SIOCSIFNETMASK 0x891c /* set network PA mask */ +#define SIOCGIFMETRIC 0x891d /* get metric */ +#define SIOCSIFMETRIC 0x891e /* set metric */ +#define SIOCGIFMEM 0x891f /* get memory address (BSD) */ +#define SIOCSIFMEM 0x8920 /* set memory address (BSD) */ +#define SIOCGIFMTU 0x8921 /* get MTU size */ +#define SIOCSIFMTU 0x8922 /* set MTU size */ +#define SIOCSIFNAME 0x8923 /* set interface name */ +#define SIOCSIFHWADDR 0x8924 /* set hardware address */ +#define SIOCGIFENCAP 0x8925 /* get/set encapsulations */ +#define SIOCSIFENCAP 0x8926 +#define SIOCGIFHWADDR 0x8927 /* Get hardware address */ +#define SIOCGIFSLAVE 0x8929 /* Driver slaving support */ +#define SIOCSIFSLAVE 0x8930 +#define SIOCADDMULTI 0x8931 /* Multicast address lists */ +#define SIOCDELMULTI 0x8932 +#define SIOCGIFINDEX 0x8933 /* name -> if_index mapping */ +#define SIOGIFINDEX SIOCGIFINDEX /* misprint compatibility :-) */ +#define SIOCSIFPFLAGS 0x8934 /* set/get extended flags set */ +#define SIOCGIFPFLAGS 0x8935 +#define SIOCDIFADDR 0x8936 /* delete PA address */ +#define SIOCSIFHWBROADCAST 0x8937 /* set hardware broadcast addr */ +#define SIOCGIFCOUNT 0x8938 /* get number of devices */ + +#define SIOCGIFBR 0x8940 /* Bridging support */ +#define SIOCSIFBR 0x8941 /* Set bridging options */ + +#define SIOCGIFTXQLEN 0x8942 /* Get the tx queue length */ +#define SIOCSIFTXQLEN 0x8943 /* Set the tx queue length */ + +#define SIOCGIFDIVERT 0x8944 /* Frame diversion support */ +#define SIOCSIFDIVERT 0x8945 /* Set frame diversion options */ + +#define SIOCETHTOOL 0x8946 /* Ethtool interface */ + +/* ARP cache control calls. */ + /* 0x8950 - 0x8952 * obsolete calls, don't re-use */ +#define SIOCDARP 0x8953 /* delete ARP table entry */ +#define SIOCGARP 0x8954 /* get ARP table entry */ +#define SIOCSARP 0x8955 /* set ARP table entry */ + +/* RARP cache control calls. */ +#define SIOCDRARP 0x8960 /* delete RARP table entry */ +#define SIOCGRARP 0x8961 /* get RARP table entry */ +#define SIOCSRARP 0x8962 /* set RARP table entry */ + +/* Driver configuration calls */ + +#define SIOCGIFMAP 0x8970 /* Get device parameters */ +#define SIOCSIFMAP 0x8971 /* Set device parameters */ + +/* DLCI configuration calls */ + +#define SIOCADDDLCI 0x8980 /* Create new DLCI device */ +#define SIOCDELDLCI 0x8981 /* Delete DLCI device */ + +#define SIOCDEVPRIVATE 0x89F0 /* to 89FF */ + +#define _LINUX_SOCKET_H + #endif diff --git a/mdk-stage1/dietlibc/include/sys/stat.h b/mdk-stage1/dietlibc/include/sys/stat.h index 10fddfa42..d31cbd1f2 100644 --- a/mdk-stage1/dietlibc/include/sys/stat.h +++ b/mdk-stage1/dietlibc/include/sys/stat.h @@ -3,30 +3,499 @@ #include <sys/cdefs.h> #include <sys/types.h> +#include <endian.h> -#include <linux/stat.h> -#include <asm/stat.h> +#if defined(__i386__) +struct stat { + unsigned short st_dev; + unsigned short __pad1; + unsigned long st_ino; + unsigned short st_mode; + unsigned short st_nlink; + unsigned short st_uid; + unsigned short st_gid; + unsigned short st_rdev; + unsigned short __pad2; + unsigned long st_size; + unsigned long st_blksize; + unsigned long st_blocks; + signed long st_atime; + unsigned long __unused1; + signed long st_mtime; + unsigned long __unused2; + signed long st_ctime; + unsigned long __unused3; + unsigned long __unused4; + unsigned long __unused5; +}; + +struct stat64 { + unsigned short st_dev; + unsigned char __pad0[10]; + +#define STAT64_HAS_BROKEN_ST_INO 1 + unsigned long __st_ino; + + unsigned int st_mode; + unsigned int st_nlink; + + unsigned long st_uid; + unsigned long st_gid; + + unsigned short st_rdev; + unsigned char __pad3[10]; + +__extension__ long long st_size; + unsigned long st_blksize; + + unsigned long st_blocks; /* Number 512-byte blocks allocated. */ + unsigned long __pad4; /* future possible st_blocks high bits */ + + unsigned long st_atime; + unsigned long __pad5; + + signed long st_mtime; + unsigned long __pad6; + + unsigned long st_ctime; + unsigned long __pad7; /* will be high 32 bits of ctime someday */ + +__extension__ unsigned long long st_ino; +}; +#elif defined(__sparc__) +struct stat { + unsigned short st_dev; + unsigned long st_ino; + unsigned short st_mode; + short st_nlink; + unsigned short st_uid; + unsigned short st_gid; + unsigned short st_rdev; + long st_size; + long st_atime; + unsigned long __unused1; + long st_mtime; + unsigned long __unused2; + long st_ctime; + unsigned long __unused3; + long st_blksize; + long st_blocks; + unsigned long __unused4[2]; +}; + +struct stat64 { + unsigned char __pad0[6]; + unsigned short st_dev; + +__extension__ unsigned long long st_ino; + + unsigned int st_mode; + unsigned int st_nlink; + + unsigned int st_uid; + unsigned int st_gid; + + unsigned char __pad2[6]; + unsigned short st_rdev; + + unsigned char __pad3[8]; + +__extension__ long long st_size; + unsigned int st_blksize; + + unsigned char __pad4[8]; + unsigned int st_blocks; + + signed int st_atime; + unsigned int __unused1; + + signed int st_mtime; + unsigned int __unused2; + + signed int st_ctime; + unsigned int __unused3; + + unsigned int __unused4; + unsigned int __unused5; +}; +#elif defined(__alpha__) +struct stat { + unsigned int st_dev; + unsigned int st_ino; + unsigned int st_mode; + unsigned int st_nlink; + unsigned int st_uid; + unsigned int st_gid; + unsigned int st_rdev; + long st_size; + signed long st_atime; + signed long st_mtime; + signed long st_ctime; + unsigned int st_blksize; + int st_blocks; + unsigned int st_flags; + unsigned int st_gen; +}; +#elif defined(__mips__) +struct stat { + unsigned int st_dev; + long st_pad1[3]; /* Reserved for network id */ + ino_t st_ino; + unsigned int st_mode; + int st_nlink; + int st_uid; + int st_gid; + unsigned int st_rdev; + long st_pad2[2]; + long st_size; + long st_pad3; + /* + * Actually this should be timestruc_t st_atime, st_mtime and st_ctime + * but we don't have it under Linux. + */ + time_t st_atime; + long reserved0; + time_t st_mtime; + long reserved1; + time_t st_ctime; + long reserved2; + long st_blksize; + long st_blocks; + char st_fstype[16]; /* Filesystem type name */ + long st_pad4[8]; + /* Linux specific fields */ + unsigned int st_flags; + unsigned int st_gen; +}; + +struct stat64 { + unsigned long st_dev; + unsigned long st_pad0[3]; /* Reserved for st_dev expansion */ +__extension__ unsigned long long st_ino; + unsigned int st_mode; + unsigned int st_nlink; + unsigned int st_uid; + unsigned int st_gid; + unsigned long st_rdev; + unsigned long st_pad1[3]; /* Reserved for st_rdev expansion */ +__extension__ long long st_size; + /* + * Actually this should be timestruc_t st_atime, st_mtime and st_ctime + * but we don't have it under Linux. + */ + time_t st_atime; + unsigned long reserved0; /* Reserved for st_atime expansion */ + time_t st_mtime; + unsigned long reserved1; /* Reserved for st_atime expansion */ + time_t st_ctime; + unsigned long reserved2; /* Reserved for st_atime expansion */ + unsigned long st_blksize; + unsigned long st_pad2; +__extension__ long long st_blocks; +}; +#elif defined(__powerpc__) +struct stat { + dev_t st_dev; + ino_t st_ino; + mode_t st_mode; + nlink_t st_nlink; + uid_t st_uid; + gid_t st_gid; + dev_t st_rdev; + off_t st_size; + unsigned long st_blksize; + unsigned long st_blocks; + signed long st_atime; + unsigned long __unused1; + signed long st_mtime; + unsigned long __unused2; + signed long st_ctime; + unsigned long __unused3; + unsigned long __unused4; + unsigned long __unused5; +}; + +/* This matches struct stat64 in glibc2.1. + */ +struct stat64 { +__extension__ unsigned long long st_dev; /* Device. */ +__extension__ unsigned long long st_ino; /* File serial number. */ + unsigned int st_mode; /* File mode. */ + unsigned int st_nlink; /* Link count. */ + unsigned int st_uid; /* User ID of the file's owner. */ + unsigned int st_gid; /* Group ID of the file's group. */ +__extension__ unsigned long long st_rdev; /* Device number, if device. */ + unsigned short int __pad2; +__extension__ long long st_size; /* Size of file, in bytes. */ + long st_blksize; /* Optimal block size for I/O. */ + +__extension__ long long st_blocks; /* Number 512-byte blocks allocated. */ + long st_atime; /* Time of last access. */ + unsigned long int __unused1; + long st_mtime; /* Time of last modification. */ + unsigned long int __unused2; + long st_ctime; /* Time of last status change. */ + unsigned long int __unused3; + unsigned long int __unused4; + unsigned long int __unused5; +}; +#elif defined(__arm__) +struct stat { + unsigned short st_dev; + unsigned short __pad1; + unsigned long st_ino; + unsigned short st_mode; + unsigned short st_nlink; + unsigned short st_uid; + unsigned short st_gid; + unsigned short st_rdev; + unsigned short __pad2; + unsigned long st_size; + unsigned long st_blksize; + unsigned long st_blocks; + signed long st_atime; + unsigned long __unused1; + signed long st_mtime; + unsigned long __unused2; + signed long st_ctime; + unsigned long __unused3; + unsigned long __unused4; + unsigned long __unused5; +}; + +/* This matches struct stat64 in glibc2.1, hence the absolutely + * insane amounts of padding around dev_t's. + */ +struct stat64 { + unsigned short st_dev; + unsigned char __pad0[10]; + +#define STAT64_HAS_BROKEN_ST_INO 1 + unsigned long __st_ino; + unsigned int st_mode; + unsigned int st_nlink; + + unsigned long st_uid; + unsigned long st_gid; + + unsigned short st_rdev; + unsigned char __pad3[10]; + +__extension__ long long st_size; + unsigned long st_blksize; + + unsigned long st_blocks; /* Number 512-byte blocks allocated. */ + unsigned long __pad4; /* future possible st_blocks high bits */ + + signed long st_atime; + unsigned long __pad5; + + signed long st_mtime; + unsigned long __pad6; + + signed long st_ctime; + unsigned long __pad7; /* will be high 32 bits of ctime someday */ + +__extension__ unsigned long long st_ino; +}; +#elif defined(__s390__) +struct stat { + unsigned short st_dev; + unsigned short __pad1; + unsigned long st_ino; + unsigned short st_mode; + unsigned short st_nlink; + unsigned short st_uid; + unsigned short st_gid; + unsigned short st_rdev; + unsigned short __pad2; + unsigned long st_size; + unsigned long st_blksize; + unsigned long st_blocks; + unsigned long st_atime; + unsigned long __unused1; + unsigned long st_mtime; + unsigned long __unused2; + unsigned long st_ctime; + unsigned long __unused3; + unsigned long __unused4; + unsigned long __unused5; +}; +struct stat64 { + unsigned char __pad0[6]; + unsigned short st_dev; + unsigned int __pad1; +#define STAT64_HAS_BROKEN_ST_INO 1 + unsigned long __st_ino; + unsigned int st_mode; + unsigned int st_nlink; + unsigned long st_uid; + unsigned long st_gid; + unsigned char __pad2[6]; + unsigned short st_rdev; + unsigned int __pad3; +__extension__ long long st_size; + unsigned long st_blksize; + unsigned char __pad4[4]; + unsigned long __pad5; /* future possible st_blocks high bits */ + unsigned long st_blocks; /* Number 512-byte blocks allocated. */ + unsigned long st_atime; + unsigned long __pad6; + unsigned long st_mtime; + unsigned long __pad7; + unsigned long st_ctime; + unsigned long __pad8; /* will be high 32 bits of ctime someday */ +__extension__ unsigned long long st_ino; +}; + +#elif defined(__hppa__) + +struct stat { + unsigned long long st_dev; + unsigned short int _pad1; + unsigned long st_ino; + unsigned long st_mode; + unsigned long st_nlink; + unsigned long st_uid; + unsigned long st_gid; + unsigned long long st_rdev; + unsigned short int _pad2; + unsigned long st_size; + unsigned long st_blksize; + unsigned long st_blocks; + unsigned long st_atime; + unsigned long int unused1; + unsigned long st_mtime; + unsigned long int unused2; + unsigned long st_ctime; + unsigned long int unused3; + unsigned long long unused4; +}; + +struct stat64 { + unsigned long long st_dev; + unsigned int __pad1; +#define STAT64_HAS_BROKEN_ST_INO 1 + unsigned long __st_ino; + unsigned long st_mode; + unsigned long st_nlink; + unsigned long st_uid; + unsigned long st_gid; + unsigned long long st_rdev; + unsigned int __pad2; + unsigned long long st_size; + unsigned long long st_blksize; + + unsigned long long st_blocks; + unsigned long st_atime; + unsigned long int __unused1; + unsigned long st_mtime; + unsigned long int __unused2; + unsigned long st_ctime; + unsigned long int __unused3; + unsigned long long st_ino; +}; + +#elif defined(__x86_64__) +struct stat { + unsigned long st_dev; + unsigned long st_ino; + unsigned long st_nlink; + unsigned int st_mode; + unsigned int st_uid; + unsigned int st_gid; + unsigned int __pad0; + unsigned long st_rdev; + unsigned long st_size; + unsigned long st_blksize; + unsigned long st_blocks; + unsigned long st_atime; + unsigned long __reserved0; + unsigned long st_mtime; + unsigned long __reserved1; + unsigned long st_ctime; + unsigned long __reserved2; + long __unused[3]; +}; + +#elif defined(__ia64__) + +struct stat { + unsigned long st_dev; + unsigned long st_ino; + unsigned long st_nlink; + unsigned int st_mode; + unsigned int st_uid; + unsigned int st_gid; + unsigned int __pad; + unsigned long st_rdev; + unsigned long st_size; + unsigned long st_atime; + unsigned long reserved; + unsigned long st_mtime; + unsigned long reserved2; + unsigned long st_ctime; + unsigned long reserved3; + unsigned long st_blksize; + long st_blocks; + unsigned long pad[3]; +}; -#ifndef STAT64_HAS_BROKEN_ST_INO -#define __NO_STAT64 #endif +#define S_IFMT 00170000 +#define S_IFSOCK 0140000 +#define S_IFLNK 0120000 +#define S_IFREG 0100000 +#define S_IFBLK 0060000 +#define S_IFDIR 0040000 +#define S_IFCHR 0020000 +#define S_IFIFO 0010000 +#define S_ISUID 0004000 +#define S_ISGID 0002000 +#define S_ISVTX 0001000 + +#define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK) +#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) +#define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) +#define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR) +#define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK) +#define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO) +#define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK) + +#define S_IRWXU 00700 +#define S_IRUSR 00400 +#define S_IWUSR 00200 +#define S_IXUSR 00100 + +#define S_IRWXG 00070 +#define S_IRGRP 00040 +#define S_IWGRP 00020 +#define S_IXGRP 00010 + +#define S_IRWXO 00007 +#define S_IROTH 00004 +#define S_IWOTH 00002 +#define S_IXOTH 00001 + extern int stat(const char *__file, struct stat *__buf) __THROW; extern int fstat(int __fd, struct stat *__buf) __THROW; extern int lstat(const char *__file, struct stat *__buf) __THROW; -#ifdef __NO_STAT64 -#undef _FILE_OFFSET_BITS +#if __WORDSIZE == 64 +#define __NO_STAT64 #else extern int stat64(const char *__file, struct stat64 *__buf) __THROW; extern int fstat64(int __fd, struct stat64 *__buf) __THROW; extern int lstat64(const char *__file, struct stat64 *__buf) __THROW; -#endif -#if _FILE_OFFSET_BITS == 64 -#define lstat(file,buf) lstat64(file,buf) -#define fstat(file,buf) fstat64(file,buf) +#if defined _FILE_OFFSET_BITS && _FILE_OFFSET_BITS == 64 +#define lstat lstat64 +#define fstat fstat64 #define stat stat64 +#define pread pread64 +#define pwrite pwrite64 +#endif #endif #define major(dev) (((dev)>>8) & 0xff) @@ -34,15 +503,10 @@ extern int lstat64(const char *__file, struct stat64 *__buf) __THROW; #define makedev(major, minor) ((((unsigned int) (major)) << 8) | ((unsigned int) (minor))) 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; #define S_IREAD S_IRUSR diff --git a/mdk-stage1/dietlibc/include/sys/sysinfo.h b/mdk-stage1/dietlibc/include/sys/sysinfo.h index 5f059d469..cf88be34c 100644 --- a/mdk-stage1/dietlibc/include/sys/sysinfo.h +++ b/mdk-stage1/dietlibc/include/sys/sysinfo.h @@ -2,7 +2,25 @@ #define _SYS_SYSINFO_H #include <sys/cdefs.h> -#include <linux/kernel.h> + +#define SI_LOAD_SHIFT 16 +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 short pad; /* explicit padding */ + 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.. */ +}; + int sysinfo(struct sysinfo *info) __THROW; diff --git a/mdk-stage1/dietlibc/include/sys/syslog.h b/mdk-stage1/dietlibc/include/sys/syslog.h index 91bf0d1fa..8722038a5 100644 --- a/mdk-stage1/dietlibc/include/sys/syslog.h +++ b/mdk-stage1/dietlibc/include/sys/syslog.h @@ -92,7 +92,7 @@ void vsyslog (int priority, const char *format, va_list arg_ptr) __THROW; /* yuck yuck yuck, only needed for syslogd. */ typedef struct _code { - char *c_name; + const char *const c_name; int c_val; } CODE; diff --git a/mdk-stage1/dietlibc/include/sys/time.h b/mdk-stage1/dietlibc/include/sys/time.h index 11144f57b..9fc40089f 100644 --- a/mdk-stage1/dietlibc/include/sys/time.h +++ b/mdk-stage1/dietlibc/include/sys/time.h @@ -2,11 +2,39 @@ #define _SYS_TIME_H 1 #include <sys/cdefs.h> - #include <sys/types.h> -#include <linux/time.h> +#include <sys/select.h> + +struct timespec { + time_t tv_sec; /* seconds */ + long tv_nsec; /* nanoseconds */ +}; + +struct timeval { + time_t tv_sec; /* seconds */ + suseconds_t tv_usec; /* microseconds */ +}; + +struct timezone { + int tz_minuteswest; /* minutes west of Greenwich */ + int tz_dsttime; /* type of dst correction */ +}; + +#define ITIMER_REAL 0 +#define ITIMER_VIRTUAL 1 +#define ITIMER_PROF 2 -#if defined __USE_GNU || defined __USE_BSD +struct itimerspec { + struct timespec it_interval; /* timer period */ + struct timespec it_value; /* timer expiration */ +}; + +struct itimerval { + struct timeval it_interval; /* timer interval */ + struct timeval it_value; /* current value */ +}; + +#if defined _GNU_SOURCE || defined _BSD_SOURCE typedef struct timezone *__timezone_ptr_t; #else typedef void *__timezone_ptr_t; @@ -18,17 +46,17 @@ int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue 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; +extern int utimes (const char *__file, const struct timeval __tvp[2]) __THROW; -struct tm -{ +extern int adjtime (const struct timeval *delta, struct timeval *olddelta) __THROW; + +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_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]*/ @@ -37,10 +65,4 @@ struct tm const char *tm_zone; /* Timezone abbreviation. */ }; -struct tm* gmtime(const time_t *t) __THROW; -struct tm* gmtime_r(const time_t *t, struct tm *r) __THROW; - -struct tm* localtime(const time_t *t) __THROW; -struct tm* localtime_r(const time_t *t, struct tm *r) __THROW; - #endif diff --git a/mdk-stage1/dietlibc/include/sys/times.h b/mdk-stage1/dietlibc/include/sys/times.h index 72ec62fec..27f75cdc5 100644 --- a/mdk-stage1/dietlibc/include/sys/times.h +++ b/mdk-stage1/dietlibc/include/sys/times.h @@ -1,8 +1,16 @@ #ifndef _SYS_TIMES_H #define _SYS_TIMES_H -#include <linux/times.h> +#include <sys/cdefs.h> +#include <sys/types.h> -clock_t times(struct tms *buf); +struct tms { + clock_t tms_utime; + clock_t tms_stime; + clock_t tms_cutime; + clock_t tms_cstime; +}; + +clock_t times(struct tms *buf) __THROW; #endif diff --git a/mdk-stage1/dietlibc/include/sys/types.h b/mdk-stage1/dietlibc/include/sys/types.h index 34dbaa9f1..a3d2bf4be 100644 --- a/mdk-stage1/dietlibc/include/sys/types.h +++ b/mdk-stage1/dietlibc/include/sys/types.h @@ -1,33 +1,133 @@ #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; +#include <inttypes.h> +#include <stddef.h> + +typedef unsigned long int blkcnt_t; /* Used for file block counts */ +typedef unsigned long int blksize_t; /* Used for block sizes */ +typedef unsigned long int clock_t; /* Used for system times in + clock ticks or CLOCKS_PER_SEC + (see <time.h>). */ + +/* TODO: + clockid_t + Used for clock ID type in the clock and timer functions. + fsblkcnt_t + Used for file system block counts + fsfilcnt_t + Used for file system file counts + pthread_attr_t + Used to identify a thread attribute object. + pthread_cond_t + Used for condition variables. + pthread_condattr_t + Used to identify a condition attribute object. + pthread_key_t + Used for thread-specific data keys. + pthread_mutex_t + Used for mutexes. + pthread_mutexattr_t + Used to identify a mutex attribute object. + pthread_once_t + Used for dynamic package initialisation. + pthread_rwlock_t + Used for read-write locks. + pthread_rwlockattr_t + Used for read-write lock attributes. + pthread_t + Used to identify a thread. + timer_t + Used for timer ID returned by timer_create(). +*/ + +#if defined(__alpha__) || defined(__mips__) || defined(__powerpc__) || defined(__hppa__) || defined(__sparc64__) \ + || defined(__x86_64__) || defined(__ia64__) +typedef unsigned int uid_t; /* Used for user IDs. */ +typedef unsigned int gid_t; /* Used for group IDs. */ +typedef unsigned int dev_t; /* Used for device IDs. */ #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; +typedef unsigned short uid_t; /* Used for user IDs. */ +typedef unsigned short gid_t; /* Used for group IDs. */ +typedef unsigned short dev_t; /* Used for device IDs. */ #endif +#if defined(__alpha__) || defined(__mips__) || defined(__powerpc__) || defined(__sparc64__) \ + || defined(__x86_64__) || defined(__ia64__) +typedef unsigned int mode_t; /* Used for some file attributes. */ +#else +typedef unsigned short mode_t; /* Used for some file attributes. */ +#endif -#ifdef __quad_t -typedef __quad_t off64_t; -typedef __u_quad_t ino64_t; -typedef __quad_t blkcnt64_t; +#if defined(__alpha__) || defined(__mips__) || defined(__sparc64__) \ + || defined(__x86_64__) || defined(__ia64__) +typedef unsigned int nlink_t; /* Used for link counts. */ +#else +typedef unsigned short nlink_t; /* Used for link counts. */ #endif +typedef signed int id_t; /* Used as a general identifier; can be + used to contain at least a pid_t, + uid_t or a gid_t. */ +typedef unsigned long ino_t; /* Used for file serial numbers. */ +typedef signed int key_t; /* Used for interprocess communication. */ +typedef signed int pid_t; /* Used for process IDs and process group IDs. */ +typedef signed long ssize_t; /* Used for a count of bytes or an error indication. */ +typedef signed long suseconds_t; /* Used for time in microseconds. */ +typedef signed long time_t; /* Used for time in seconds. */ +typedef signed long useconds_t; /* Used for time in microseconds. */ + +/* non-susv2 types: */ +__extension__ typedef signed long long loff_t; /* 64-bit offset */ + +__extension__ typedef signed long long off64_t; +#if defined _FILE_OFFSET_BITS && _FILE_OFFSET_BITS == 64 +typedef off64_t off_t; +#else +typedef signed long off_t; /* Used for file sizes. */ +#endif + +__extension__ typedef unsigned long long ino64_t; +__extension__ typedef signed long long blkcnt64_t; + +typedef uint32_t uid32_t; +typedef uint32_t gid32_t; + typedef long int fpos_t; -#define socklen_t socklen_t +#define __socklen_t_defined typedef unsigned int socklen_t; +typedef unsigned short sa_family_t; -typedef long int blksize_t; -typedef long int blkcnt_t; +#ifdef _BSD_SOURCE +/* die, BSD, die! */ +typedef uint16_t nshort; +typedef uint32_t ntime; +typedef uint32_t nlong; +typedef uint32_t ulong; +typedef uint16_t n_short; +typedef uint32_t n_time; +typedef uint32_t n_long; +# ifndef __dietlibc_u_char_defined +typedef char* caddr_t; +typedef uint32_t u_long; +typedef unsigned char u_char; +typedef unsigned short u_short; +typedef unsigned int u_int; +# define __dietlibc_u_char_defined +# endif +typedef unsigned char uchar; +typedef unsigned short ushort; +typedef unsigned int uint; +#endif + +#ifdef _GNU_SOURCE +typedef uint8_t u_int8_t; +typedef uint16_t u_int16_t; +typedef uint32_t u_int32_t; +#ifndef __STRICT_ANSI__ +typedef uint64_t u_int64_t; +#endif +#endif #endif diff --git a/mdk-stage1/dietlibc/include/sys/uio.h b/mdk-stage1/dietlibc/include/sys/uio.h index d64fd33c9..5edbdc8b2 100644 --- a/mdk-stage1/dietlibc/include/sys/uio.h +++ b/mdk-stage1/dietlibc/include/sys/uio.h @@ -1,7 +1,7 @@ #ifndef _SYS_UIO #define _SYS_UIO 1 -#include <linux/uio.h> +#include <sys/socket.h> int readv(int filedes, const struct iovec *vector, size_t count); int writev(int filedes, const struct iovec *vector, size_t count); diff --git a/mdk-stage1/dietlibc/include/sys/un.h b/mdk-stage1/dietlibc/include/sys/un.h index 213d9290e..000a937c1 100644 --- a/mdk-stage1/dietlibc/include/sys/un.h +++ b/mdk-stage1/dietlibc/include/sys/un.h @@ -3,6 +3,11 @@ #include <sys/cdefs.h> -#include <linux/un.h> +#define UNIX_PATH_MAX 108 + +struct sockaddr_un { + sa_family_t sun_family; /* AF_UNIX */ + char sun_path[UNIX_PATH_MAX]; /* pathname */ +}; #endif /* sys/un.h */ diff --git a/mdk-stage1/dietlibc/include/sys/vfs.h b/mdk-stage1/dietlibc/include/sys/vfs.h index e4740a225..19b3242bb 100644 --- a/mdk-stage1/dietlibc/include/sys/vfs.h +++ b/mdk-stage1/dietlibc/include/sys/vfs.h @@ -3,7 +3,31 @@ #include <sys/cdefs.h> #include <sys/types.h> -#include <linux/vfs.h> + +typedef struct { + int __val[2]; +} __kernel_fsid_t; + +struct statfs { + long f_type; + long f_bsize; +#ifdef __mips__ + long f_frsize; +#endif + long f_blocks; + long f_bfree; +#ifndef __mips__ + long f_bavail; +#endif + long f_files; + long f_ffree; +#ifdef __mips__ + long f_bavail; +#endif + __kernel_fsid_t f_fsid; + long f_namelen; + long f_spare[6]; +}; int statfs(const char *path, struct statfs *buf) __THROW; int fstatfs(int fd, struct statfs *buf) __THROW; diff --git a/mdk-stage1/dietlibc/include/sys/wait.h b/mdk-stage1/dietlibc/include/sys/wait.h index eb70112e2..0ba55499e 100644 --- a/mdk-stage1/dietlibc/include/sys/wait.h +++ b/mdk-stage1/dietlibc/include/sys/wait.h @@ -3,7 +3,13 @@ #include <sys/cdefs.h> #include <sys/resource.h> -#include <linux/wait.h> + +#define WNOHANG 0x00000001 +#define WUNTRACED 0x00000002 + +#define __WNOTHREAD 0x20000000 /* Don't wait on children of other threads in this group */ +#define __WALL 0x40000000 /* Wait on all children, regardless of type */ +#define __WCLONE 0x80000000 /* Wait only on non-SIGCHLD children */ /* If WIFEXITED(STATUS), the low-order 8 bits of the status. */ #define __WEXITSTATUS(status) (((status) & 0xff00) >> 8) @@ -26,6 +32,8 @@ /* Nonzero if STATUS indicates the child is stopped. */ #define WIFSTOPPED(status) (((status) & 0xff) == 0x7f) +/* Nonzero if STATUS indicates the child dumped core. */ +#define WCOREDUMP(status) ((status) & 0x80) pid_t wait(int *status) __THROW; pid_t waitpid(pid_t pid, int *status, int options) __THROW; diff --git a/mdk-stage1/dietlibc/include/termios.h b/mdk-stage1/dietlibc/include/termios.h index f10909c1b..12e02c5d7 100644 --- a/mdk-stage1/dietlibc/include/termios.h +++ b/mdk-stage1/dietlibc/include/termios.h @@ -4,19 +4,380 @@ #include <sys/cdefs.h> #include <sys/types.h> -/* man, the Linux kernel headers suck */ -#define __USE_BSD -#include <linux/termios.h> -#undef __USE_BSD +struct winsize { + unsigned short ws_row; + unsigned short ws_col; + unsigned short ws_xpixel; + unsigned short ws_ypixel; +}; + +#define NCC 8 +struct termio { + unsigned short c_iflag; /* input mode flags */ + unsigned short c_oflag; /* output mode flags */ + unsigned short c_cflag; /* control mode flags */ + unsigned short c_lflag; /* local mode flags */ + unsigned char c_line; /* line discipline */ + unsigned char c_cc[NCC]; /* control characters */ +}; + +/* modem lines */ +#ifdef __mips__ +#define TIOCM_LE 0x001 +#define TIOCM_DTR 0x002 +#define TIOCM_RTS 0x004 +#define TIOCM_ST 0x010 +#define TIOCM_SR 0x020 +#define TIOCM_CTS 0x040 +#define TIOCM_CAR 0x100 +#define TIOCM_RNG 0x200 +#define TIOCM_DSR 0x400 +#define TIOCM_CD TIOCM_CAR +#define TIOCM_RI TIOCM_RNG +#define TIOCM_OUT1 0x2000 +#define TIOCM_OUT2 0x4000 +#define TIOCM_LOOP 0x8000 +#else +#define TIOCM_LE 0x001 +#define TIOCM_DTR 0x002 +#define TIOCM_RTS 0x004 +#define TIOCM_ST 0x008 +#define TIOCM_SR 0x010 +#define TIOCM_CTS 0x020 +#define TIOCM_CAR 0x040 +#define TIOCM_RNG 0x080 +#define TIOCM_DSR 0x100 +#define TIOCM_CD TIOCM_CAR +#define TIOCM_RI TIOCM_RNG +#define TIOCM_OUT1 0x2000 +#define TIOCM_OUT2 0x4000 +#define TIOCM_LOOP 0x8000 +#endif + +/* line disciplines */ +#define N_TTY 0 +#define N_SLIP 1 +#define N_MOUSE 2 +#define N_PPP 3 +#define N_STRIP 4 +#define N_AX25 5 +#define N_X25 6 /* X.25 async */ +#define N_6PACK 7 +#define N_MASC 8 /* Reserved for Mobitex module <kaz@cafe.net> */ +#define N_R3964 9 /* Reserved for Simatic R3964 module */ +#define N_PROFIBUS_FDL 10 /* Reserved for Profibus <Dave@mvhi.com> */ +#define N_IRDA 11 /* Linux IR - http://irda.sourceforge.net/ */ +#define N_SMSBLOCK 12 /* SMS block mode - for talking to GSM data cards about SMS messages */ +#define N_HDLC 13 /* synchronous HDLC */ +#define N_SYNC_PPP 14 /* synchronous PPP */ +#define N_HCI 15 /* Bluetooth HCI UART */ + +typedef unsigned char cc_t; +typedef unsigned int speed_t; +typedef unsigned int tcflag_t; + +#define _POSIX_VDISABLE '\0' + +#if defined(__i386__) || defined(__arm__) || defined(__ia64__) || defined(__hppa__) || defined(__s390__) || defined(__s390x__) || defined(__x86_64__) +#define NCCS 19 +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 */ +}; +#elif defined(__mips__) || defined(__mips64__) +#define NCCS 23 +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 */ + /* + * Seems nonexistent in the ABI, but Linux assumes existence ... + */ + cc_t c_line; /* line discipline */ + cc_t c_cc[NCCS]; /* control characters */ +}; +#elif defined(powerpc) || defined(__alpha__) +#define NCCS 19 +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_cc[NCCS]; /* control characters */ + cc_t c_line; /* line discipline (== c_cc[19]) */ + speed_t c_ispeed; /* input speed */ + speed_t c_ospeed; /* output speed */ +}; +#elif defined(__sparc__) +#define NCCS 17 +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 */ +}; +#else +# error "Struct termios undefined on your architecture" +#endif + +/* c_cc characters */ +#if defined(__alpha__) +#define VEOF 0 +#define VEOL 1 +#define VEOL2 2 +#define VERASE 3 +#define VWERASE 4 +#define VKILL 5 +#define VREPRINT 6 +#define VSWTC 7 +#define VINTR 8 +#define VQUIT 9 +#define VSUSP 10 +#define VSTART 12 +#define VSTOP 13 +#define VLNEXT 14 +#define VDISCARD 15 +#define VMIN 16 +#define VTIME 17 +#elif defined(__mips__) +#define VINTR 0 +#define VQUIT 1 +#define VERASE 2 +#define VKILL 3 +#define VMIN 4 +#define VTIME 5 +#define VEOL2 6 +#define VSWTC 7 +#define VSWTCH VSWTC +#define VSTART 8 +#define VSTOP 9 +#define VSUSP 10 +#define VREPRINT 12 +#define VDISCARD 13 +#define VWERASE 14 +#define VLNEXT 15 +#define VEOF 16 +#define VEOL 17 +#elif defined(__powerpc__) +#define VINTR 0 +#define VQUIT 1 +#define VERASE 2 +#define VKILL 3 +#define VEOF 4 +#define VMIN 5 +#define VEOL 6 +#define VTIME 7 +#define VEOL2 8 +#define VSWTC 9 +#define VWERASE 10 +#define VREPRINT 11 +#define VSUSP 12 +#define VSTART 13 +#define VSTOP 14 +#define VLNEXT 15 +#define VDISCARD 16 +#elif defined(__sparc__) +#define VINTR 0 +#define VQUIT 1 +#define VERASE 2 +#define VKILL 3 +#define VEOF 4 +#define VEOL 5 +#define VEOL2 6 +#define VSWTC 7 +#define VSTART 8 +#define VSTOP 9 +#define VSUSP 10 +#define VDSUSP 11 +#define VREPRINT 12 +#define VDISCARD 13 +#define VWERASE 14 +#define VLNEXT 15 +#define VMIN 16 +#define VTIME 17 +#else /* arm, i386, parisc, s390, x86_64 */ +#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 +#endif + +/* 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 XTABS 0014000 +#define BSDLY 0020000 +#define BS0 0000000 +#define BS1 0020000 +#define VTDLY 0040000 +#define VT0 0000000 +#define VT1 0040000 +#define FFDLY 0100000 +#define FF0 0000000 +#define FF1 0100000 + +/* 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 CMSPAR 010000000000 /* mark or space (stick) parity */ +#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 ECHOCTL 0001000 +#define ECHOPRT 0002000 +#define ECHOKE 0004000 +#ifdef __mips__ +#define IEXTEN 0000400 +#define FLUSHO 0020000 +#define TOSTOP 0100000 +#else +#define TOSTOP 0000400 +#define FLUSHO 0010000 +#define IEXTEN 0100000 +#endif +#define PENDIN 0040000 + +/* 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 */ +#ifdef __mips__ +#define TCSANOW 0x540e +#define TCSADRAIN 0x540f +#define TCSAFLUSH 0x5410 +#else +#define TCSANOW 0 +#define TCSADRAIN 1 +#define TCSAFLUSH 2 +#endif -pid_t tcgetpgrp(int fd) __THROW; -int tcsetpgrp(int fd, pid_t pgrpid) __THROW; int tcgetattr(int fd, struct termios *termios_p) __THROW; int tcsetattr(int fd, int optional_actions, struct termios *termios_p) __THROW; speed_t cfgetospeed(struct termios *termios_p) __THROW; int cfsetospeed(struct termios *termios_p, speed_t speed) __THROW; speed_t cfgetispeed(struct termios *termios_p) __THROW; int cfsetispeed(struct termios *termios_p, speed_t speed) __THROW; +void cfmakeraw(struct termios *t) __THROW; + int tcflush(int fd, int queue_selector) __THROW; +int tcdrain(int fd) __THROW; +int tcflow (int fd,int action) __THROW; +int tcsendbreak (int fd,int duration) __THROW; #endif diff --git a/mdk-stage1/dietlibc/include/time.h b/mdk-stage1/dietlibc/include/time.h index 827c85b97..29681fa3d 100644 --- a/mdk-stage1/dietlibc/include/time.h +++ b/mdk-stage1/dietlibc/include/time.h @@ -7,7 +7,6 @@ extern int __isleap(int year); int nanosleep(const struct timespec *req, struct timespec *rem) __THROW; -unsigned int sleep(unsigned int secs) __THROW; time_t mktime(struct tm *timeptr) __THROW __pure__; @@ -16,9 +15,26 @@ char *asctime_r(const struct tm *timeptr, char *buf) __THROW; char *ctime(const time_t *timep) __THROW; -size_t strftime(char *s, size_t max, const char *format, const struct tm *tm) __THROW; +size_t strftime(char *s, size_t max, const char *format, const struct tm *tm) __THROW __attribute__((format(strftime,3,0))); time_t time(time_t *t) __THROW; int stime(time_t *t) __THROW; +double difftime(time_t time1, time_t time0) __THROW __attribute__((const)); + +#define CLOCKS_PER_SEC 1000000l + +extern long int timezone; +extern int daylight; +extern char* tzname[2]; + +void tzset (void) __THROW; + +struct tm* localtime(const time_t* t) __THROW; +struct tm* gmtime(const time_t* t) __THROW; +struct tm* localtime_r(const time_t* t, struct tm* r) __THROW; +struct tm* gmtime_r(const time_t* t, struct tm* r) __THROW; + +clock_t clock(void); + #endif diff --git a/mdk-stage1/dietlibc/include/unistd.h b/mdk-stage1/dietlibc/include/unistd.h index 1a528c0e4..2fba5d584 100644 --- a/mdk-stage1/dietlibc/include/unistd.h +++ b/mdk-stage1/dietlibc/include/unistd.h @@ -2,12 +2,14 @@ #define _UNISTD_H #include <sys/cdefs.h> -#include <dirent.h> #include <sys/types.h> #include <sys/time.h> -#include <getopt.h> -#include <linux/sysctl.h> #include <sys/stat.h> +#include <sys/fsuid.h> + +extern int optind,opterr; +extern char *optarg; +int getopt(int argc, char *const argv[], const char *options); /* Values for the second argument to access. These may be OR'd together. */ @@ -17,28 +19,28 @@ #define F_OK 0 /* Test for existence. */ /* Test for access to NAME using the real UID and real GID. */ -extern int access (__const char *__name, int __type) __THROW; +extern int access (const char *__name, int __type) __THROW; +#ifndef SEEK_SET #define SEEK_SET 0 #define SEEK_CUR 1 #define SEEK_END 2 +#endif #define STDIN_FILENO 0 #define STDOUT_FILENO 1 #define STDERR_FILENO 2 off_t lseek(int fildes, off_t offset, int whence) __THROW; -int llseek(int fildes, unsigned long hi, unsigned long lo, loff_t* result,int whence) __THROW; #ifndef __NO_STAT64 loff_t lseek64(int fildes, loff_t offset, int whence) __THROW; -#endif -#if _FILE_OFFSET_BITS == 64 +#if defined _FILE_OFFSET_BITS && _FILE_OFFSET_BITS == 64 #define lseek(fildes,offset,whence) lseek64(fildes,offset,whence) #endif +#endif 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; @@ -60,23 +62,24 @@ int execlp(const char *file, const char *arg, ...) __THROW; int execv(const char *path, char *const argv[]) __THROW; int execvp(const char *file, char *const argv[]) __THROW; int execl(const char *path, ...) __THROW; +int execle(const char *path, ...) __THROW; -pid_t getpid(void) __attribute__((__const__)) __THROW; +pid_t getpid(void) __THROW; pid_t getppid(void) __THROW; -int kill(pid_t pid, int sig) __THROW; int setpgid (pid_t pid,pid_t pgid) __THROW; pid_t getpgid (pid_t pid) __THROW; int setpgrp (void) __THROW; pid_t getpgrp (void) __THROW; +pid_t getsid(pid_t pid) __THROW; pid_t setsid (void) __THROW; int dup (int oldfd) __THROW; int dup2 (int oldfd,int newfd) __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; +struct dirent; +struct dirent64; +int getdents(int fd, struct dirent *dirp, unsigned int count) __THROW; +int getdents64(int fd, struct dirent64 *dirp, unsigned int count) __THROW; pid_t fork(void) __THROW; pid_t vfork(void) __THROW; @@ -90,6 +93,8 @@ int fchown(int fd, uid_t owner, gid_t group) __THROW; int lchown(const char *path, uid_t owner, gid_t group) __THROW; int fsync(int fd) __THROW; +#define _POSIX_SYNCHRONIZED_IO +int fdatasync(int fd) __THROW; int pipe(int filedes[2]) __THROW; @@ -101,7 +106,7 @@ void *sbrk(ptrdiff_t increment) __THROW; int gethostname(char *name, size_t len) __THROW; int sethostname(const char *name, size_t len) __THROW; -void usleep(unsigned long usec) __THROW; +int usleep(unsigned long useconds) __THROW; unsigned int sleep(unsigned int seconds) __THROW; unsigned int alarm(unsigned int seconds) __THROW; @@ -111,11 +116,16 @@ int isatty(int desc) __THROW; void _exit(int status) __THROW __attribute__((noreturn)); -extern int daemon (int nochdir,int noclose) __THROW; +extern int daemon(int nochdir,int noclose) __THROW; + +int pause(void) __THROW; -#if _FILE_OFFSET_BITS == 64 +#if defined _FILE_OFFSET_BITS && _FILE_OFFSET_BITS == 64 #define open open64 #define creat creat64 +#define truncate truncate64 +#define ftruncate ftruncate64 +#define getdents getdents64 #endif extern char* getlogin(void) __THROW; @@ -137,32 +147,87 @@ int setreuid(uid_t ruid, uid_t euid) __THROW; #define setegid(egid) setregid(-1,egid) int rename(const char *oldpath, const char *newpath) __THROW; +int truncate(const char *path, off_t length) __THROW; int ftruncate(int fd, off_t length) __THROW; - -int mkstemp(char *Template) __THROW; +#ifndef __NO_STAT64 +int truncate64(const char *path, loff_t length) __THROW; +int ftruncate64(int fd, loff_t length) __THROW; +#endif int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout) __THROW; int nice(int inc) __THROW; -extern char *__environ[]; +extern char **__environ; char *crypt(const char *key, const char *salt) __THROW; void encrypt(char block[64], int edflag) __THROW; void setkey(const char *key) __THROW; -size_t getpagesize(void) __attribute__((__const__)) __THROW; +size_t getpagesize(void) __THROW __attribute__((__const__)); int getdomainname(char *name, size_t len) __THROW; int setdomainname(const char *name, size_t len) __THROW; int getgroups(int size, gid_t list[]) __THROW; +int getdtablesize(void) __THROW; +char *getpass(const char * prompt) __THROW; /* warning: linux specific: */ +int llseek(int fildes, unsigned long hi, unsigned long lo, loff_t* result,int whence) __THROW; + +/* include <linux/sysctl.h> to get all the definitions! */ +struct __sysctl_args; int _sysctl(struct __sysctl_args *args) __THROW; -int sendfile(int out_fd, int in_fd, off_t *offset, size_t count) __THROW; -int getdtablesize(void) __THROW; -char *getpass(const char * prompt) __THROW; +#define _SC_CLK_TCK 1 +#define _SC_ARG_MAX 2 +#define _SC_NGROUPS_MAX 3 +#define _SC_OPEN_MAX 4 +#define _SC_PAGESIZE 5 +#define _SC_NPROCESSORS_ONLN 6 +#define _SC_NPROCESSORS_CONF _SC_NPROCESSORS_ONLN +long sysconf(int name) __THROW; +#define _PC_PATH_MAX 1 +#define _PC_VDISABLE 2 + +pid_t tcgetpgrp(int fd) __THROW; +int tcsetpgrp(int fd, pid_t pgrpid) __THROW; + +int profil(unsigned short *buf, size_t bufsiz, size_t offset, unsigned int scale); + +/* Linux only: */ +int getresuid(uid_t *ruid, uid_t *euid, uid_t *suid) __THROW; +int getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid) __THROW; +int setresuid(uid_t ruid, uid_t euid, uid_t suid) __THROW; +int setresgid(gid_t rgid, gid_t egid, gid_t sgid) __THROW; + +/* 32-bit uid support */ +int chown32(const char *path, uid32_t owner, gid32_t group) __THROW; +int fchown32(int fd, uid32_t owner, gid32_t group) __THROW; +int lchown32(const char *path, uid32_t owner, gid32_t group) __THROW; +uid32_t getuid32(void) __THROW; +uid32_t geteuid32(void) __THROW; +gid32_t getgid32(void) __THROW; +gid32_t getegid32(void) __THROW; +int setuid32(uid32_t uid) __THROW; +int setgid32(gid32_t gid) __THROW; +int setreuid32(uid32_t ruid, uid32_t euid) __THROW; +int setregid32(gid32_t rgid, gid32_t egid) __THROW; +#define seteuid32(euid) setreuid32(-1,euid) +#define setegid32(egid) setregid32(-1,egid) +int getgroups32(int size, gid32_t list[]) __THROW; +int getresuid32(uid32_t *ruid, uid32_t *euid, uid32_t *suid); +int getresgid32(gid32_t *rgid, gid32_t *egid, gid32_t *sgid); +int setresuid32(uid32_t ruid, uid32_t euid, uid32_t suid) __THROW; +int setresgid32(gid32_t rgid, gid32_t egid, gid32_t sgid) __THROW; + +#ifdef _BSD_SOURCE +char *getusershell(void); +void setusershell(void); +void endusershell(void); +#endif + +#define _POSIX_VERSION 199506L #endif diff --git a/mdk-stage1/dietlibc/include/utmp.h b/mdk-stage1/dietlibc/include/utmp.h index 2946be921..cc2adc9f6 100644 --- a/mdk-stage1/dietlibc/include/utmp.h +++ b/mdk-stage1/dietlibc/include/utmp.h @@ -11,6 +11,11 @@ #define _PATH_UTMP "/var/run/utmp" #define _PATH_WTMP "/var/log/wtmp" +#ifdef _BSD_SOURCE +/* die, BSD, die!!! */ +#define UTMP_FILE _PATH_UTMP +#define WTMP_FILE _PATH_WTMP +#endif /* The structure describing an entry in the database of previous logins. */ @@ -38,11 +43,13 @@ struct utmp char ut_id[4]; /* Inittab ID. */ char ut_user[UT_NAMESIZE]; /* Username. */ char ut_host[UT_HOSTSIZE]; /* Hostname for remote login. */ -#define ut_name ut_host +#define ut_name ut_user struct exit_status ut_exit; /* Exit status of a process marked as DEAD_PROCESS. */ long int ut_session; /* Session ID, used for windowing. */ +#define ut_time ut_tv.tv_sec struct timeval ut_tv; /* Time entry was made. */ +#define ut_addr ut_addr_v6[0] int32_t ut_addr_v6[4]; /* Internet address of remote host. */ char __unused[20]; /* Reserved for future use. */ }; @@ -70,4 +77,18 @@ struct utmp #define _HAVE_UT_TV 1 #define _HAVE_UT_HOST 1 +struct utmp *getutent(void) __THROW; +struct utmp *getutid(struct utmp *ut) __THROW; +struct utmp *getutline(struct utmp *ut) __THROW; + +void pututline(struct utmp *ut) __THROW; + +void setutent(void) __THROW; +void endutent(void) __THROW; + +void utmpname(const char *file) __THROW; + +void updwtmp(const char *wtmp_file, const struct utmp *ut); +void logwtmp(const char *line, const char *name, const char *host); + #endif diff --git a/mdk-stage1/dietlibc/lib/__dtostr.c b/mdk-stage1/dietlibc/lib/__dtostr.c index e9a8a83d3..580258936 100644 --- a/mdk-stage1/dietlibc/lib/__dtostr.c +++ b/mdk-stage1/dietlibc/lib/__dtostr.c @@ -1,104 +1,140 @@ -#include <stdio.h> +#include <stdlib.h> +#include <endian.h> +#include <math.h> /* convert double to string. Helper for sprintf. */ -int __dtostr(double d,char *buf,int maxlen,int prec) { +static int copystring(char* buf,int maxlen, const char* s) { + int i; + for (i=0; i<3&&i<maxlen; ++i) + buf[i]=s[i]; + if (i<maxlen) { buf[i]=0; ++i; } + return i; +} + +int __dtostr(double d,char *buf,unsigned int maxlen,unsigned int prec,unsigned int prec2) { +#if 1 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; +#else +#if __BYTE_ORDER == __LITTLE_ENDIAN + signed long e=(((((unsigned long*)&d)[1])>>20)&((1<<11)-1))-1023; +#else + signed long e=(((*((unsigned long*)&d))>>20)&((1<<11)-1))-1023; +#endif +#endif /* 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) */ + signed long e10; /* step 3: calculate 10^e10 */ - int i; - double tmp=10.0; + unsigned int i; + double backup=d; + double tmp; char *oldbuf=buf; - int initial=1; + if (isnan(d)) return copystring(buf,maxlen,"nan"); + if ((i=isinf(d))) return copystring(buf,maxlen,i>0?"inf":"-inf"); + e10=1+(long)(e*0.30102999566398119802); /* log10(2) */ + /* Wir iterieren von Links bis wir bei 0 sind oder maxlen erreicht + * ist. Wenn maxlen erreicht ist, machen wir das nochmal in + * scientific notation. Wenn dann von prec noch was übrig ist, geben + * wir einen Dezimalpunkt aus und geben prec2 Nachkommastellen aus. + * Wenn prec2 Null ist, geben wir so viel Stellen aus, wie von prec + * noch übrig ist. */ if (d==0.0) { - *buf='0'; ++buf; - goto done; + prec2=prec2==0?1:prec2+2; + prec2=prec2>maxlen?8:prec2; + for (i=0; i<prec2; ++i) buf[i]='0'; + buf[1]='.'; buf[i]=0; + return i; } - if (s) { d=-d; *buf='-'; --maxlen; buf++; } + + if (d < 0.0) { d=-d; *buf='-'; --maxlen; ++buf; } + + /* + Perform rounding. It needs to be done before we generate any + digits as the carry could propagate through the whole number. + */ + + tmp = 0.5; + for (i = 0; i < prec2; i++) { tmp *= 0.1; } + d += tmp; + + if (d < 1.0) { *buf='0'; --maxlen; ++buf; } /* printf("e=%d e10=%d prec=%d\n",e,e10,prec); */ - if (e10>=0) { + if (e10>0) { + int first=1; /* are we about to write the first digit? */ + tmp = 10.0; i=e10; 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; + /* the number is greater than 1. Iterate through digits before the + * decimal point until we reach the decimal point or maxlen is + * reached (in which case we switch to scientific notation). */ + while (tmp>0.9) { + char digit; + double fraction=d/tmp; + digit=(int)(fraction); /* floor() */ + if (!first || digit) { + first=0; + *buf=digit+'0'; ++buf; + if (!maxlen) { + /* use scientific notation */ + int len=__dtostr(backup/tmp,oldbuf,maxlen,prec,prec2); + int initial=1; + if (len==0) return 0; + maxlen-=len; buf+=len; + if (maxlen>0) { + *buf='e'; + ++buf; + } + --maxlen; + for (len=1000; len>0; len/=10) { + if (e10>=len || !initial) { + if (maxlen>0) { + *buf=(e10/len)+'0'; + ++buf; + } + --maxlen; + initial=0; + e10=e10%len; + } + } + if (maxlen>0) goto fini; + return 0; } - initial=0; - e10=e10%len; + d-=digit*tmp; + --maxlen; } + tmp/=10.0; } - if (maxlen>=0) return buf-oldbuf; - return 0; } - /* step 5: loop through the digits, inserting the decimal point when - * appropriate */ - if (d<1.0) { - double x=1.0; - int first=1; - do { - if (--maxlen<0) return buf-oldbuf; - *buf='0'; ++buf; - if (first) { - first=0; - *buf='.'; ++buf; - if (--maxlen<0) return buf-oldbuf; - } - x/=10.0; - } while (x>d); + else + { + tmp = 0.1; } - 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; + + if (buf==oldbuf) { + if (!maxlen) return 0; --maxlen; + *buf='0'; ++buf; + } + if (prec2 || prec>(unsigned int)(buf-oldbuf)+1) { /* more digits wanted */ + if (!maxlen) return 0; --maxlen; + *buf='.'; ++buf; + prec-=buf-oldbuf-1; + if (prec2) prec=prec2; + if (prec>maxlen) return 0; + while (prec>0) { + char digit; + double fraction=d/tmp; + digit=(int)(fraction); /* floor() */ + *buf=digit+'0'; ++buf; + d-=digit*tmp; + tmp/=10.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; } -done: +fini: *buf=0; return buf-oldbuf; } diff --git a/mdk-stage1/dietlibc/lib/__fstat64.c b/mdk-stage1/dietlibc/lib/__fstat64.c index 6f9fcb2c5..f2f9858ea 100644 --- a/mdk-stage1/dietlibc/lib/__fstat64.c +++ b/mdk-stage1/dietlibc/lib/__fstat64.c @@ -1,9 +1,8 @@ +#include <errno.h> #include "dietfeatures.h" - #ifdef WANT_LARGEFILE_BACKCOMPAT #include <sys/stat.h> #ifndef __NO_STAT64 -#include <errno.h> extern int __dietlibc_fstat64(int __fd, struct stat64 *__buf); extern void __stat64_cvt(const struct stat *src,struct stat64 *dest); @@ -11,11 +10,7 @@ extern void __stat64_cvt(const struct stat *src,struct stat64 *dest); int fstat64(int __fd, struct stat64 *__buf) { if (__dietlibc_fstat64(__fd,__buf)) { struct stat temp; -#ifdef WANT_THREAD_SAFE - if (*__errno_location()!=ENOSYS) return -1; -#else if (errno!=ENOSYS) return -1; -#endif if (fstat(__fd,&temp)) return -1; __stat64_cvt(&temp,__buf); } diff --git a/mdk-stage1/dietlibc/lib/__getcwd.c b/mdk-stage1/dietlibc/lib/__getcwd.c index e97fc4520..8616704ec 100644 --- a/mdk-stage1/dietlibc/lib/__getcwd.c +++ b/mdk-stage1/dietlibc/lib/__getcwd.c @@ -1,3 +1,4 @@ +#include <unistd.h> #include <stdlib.h> extern int __syscall_getcwd(char* buf, size_t size); diff --git a/mdk-stage1/dietlibc/lib/__isnan.c b/mdk-stage1/dietlibc/lib/__isnan.c index 9d21e9824..de74b8a9f 100644 --- a/mdk-stage1/dietlibc/lib/__isnan.c +++ b/mdk-stage1/dietlibc/lib/__isnan.c @@ -1,9 +1,10 @@ -#include <stdio.h> +#include <math.h> -int __isnan(double d) { +int isnan(double d) { unsigned long long *x=(unsigned long long *)&d; - return (*x==0x7FF8002000000000ll || *x==0x7FF0002000000000); + return (*x==0x7FF8000000000000ll || *x==0x7FF0000000000000 || *x==0xfff8000000000000); } +int __isnan(double d) __attribute__((alias("isnan"))); #if 0 TestFromIeeeExtended("7FFF0000000000000000"); /* +infinity */ diff --git a/mdk-stage1/dietlibc/lib/__lltostr.c b/mdk-stage1/dietlibc/lib/__lltostr.c index eb4a27cef..fe4701f29 100644 --- a/mdk-stage1/dietlibc/lib/__lltostr.c +++ b/mdk-stage1/dietlibc/lib/__lltostr.c @@ -1,9 +1,11 @@ #include <string.h> +int __lltostr(char *s, int size, unsigned long long i, int base, char UpCase); + int __lltostr(char *s, int size, unsigned long long i, int base, char UpCase) { char *tmp; - int j=0; + unsigned int j=0; s[--size]=0; diff --git a/mdk-stage1/dietlibc/lib/__lstat64.c b/mdk-stage1/dietlibc/lib/__lstat64.c index a871f3917..0eab6a94b 100644 --- a/mdk-stage1/dietlibc/lib/__lstat64.c +++ b/mdk-stage1/dietlibc/lib/__lstat64.c @@ -1,9 +1,8 @@ +#include <errno.h> #include "dietfeatures.h" - #ifdef WANT_LARGEFILE_BACKCOMPAT #include <sys/stat.h> #ifndef __NO_STAT64 -#include <errno.h> extern int __dietlibc_lstat64(const char *__file, struct stat64 *__buf); extern void __stat64_cvt(const struct stat *src,struct stat64 *dest); @@ -11,11 +10,7 @@ extern void __stat64_cvt(const struct stat *src,struct stat64 *dest); int lstat64(const char *__file, struct stat64 *__buf) { if (__dietlibc_lstat64(__file,__buf)) { struct stat temp; -#ifdef WANT_THREAD_SAFE - if (*__errno_location()!=ENOSYS) return -1; -#else if (errno!=ENOSYS) return -1; -#endif if (lstat(__file,&temp)) return -1; __stat64_cvt(&temp,__buf); } diff --git a/mdk-stage1/dietlibc/lib/__ltostr.c b/mdk-stage1/dietlibc/lib/__ltostr.c index 57e0690d2..fa71be9ab 100644 --- a/mdk-stage1/dietlibc/lib/__ltostr.c +++ b/mdk-stage1/dietlibc/lib/__ltostr.c @@ -1,9 +1,10 @@ #include <string.h> +#include <stdlib.h> -int __ltostr(char *s, int size, unsigned long i, int base, char UpCase) +int __ltostr(char *s, unsigned int size, unsigned long i, unsigned int base, int UpCase) { char *tmp; - int j=0; + unsigned int j=0; s[--size]=0; diff --git a/mdk-stage1/dietlibc/lib/__stat64.c b/mdk-stage1/dietlibc/lib/__stat64.c index dfb0d4315..fcbdfef2d 100644 --- a/mdk-stage1/dietlibc/lib/__stat64.c +++ b/mdk-stage1/dietlibc/lib/__stat64.c @@ -1,9 +1,8 @@ +#include <errno.h> #include "dietfeatures.h" - #ifdef WANT_LARGEFILE_BACKCOMPAT #include <sys/stat.h> #ifndef __NO_STAT64 -#include <errno.h> extern int __dietlibc_stat64(const char *__file, struct stat64 *__buf); extern void __stat64_cvt(const struct stat *src,struct stat64 *dest); @@ -11,11 +10,7 @@ extern void __stat64_cvt(const struct stat *src,struct stat64 *dest); int stat64(const char *__file, struct stat64 *__buf) { if (__dietlibc_stat64(__file,__buf)) { struct stat temp; -#ifdef WANT_THREAD_SAFE - if (*__errno_location()!=ENOSYS) return -1; -#else if (errno!=ENOSYS) return -1; -#endif if (stat(__file,&temp)) return -1; __stat64_cvt(&temp,__buf); } diff --git a/mdk-stage1/dietlibc/lib/__stat64_cvt.c b/mdk-stage1/dietlibc/lib/__stat64_cvt.c index dced352a4..c4ce8bea4 100644 --- a/mdk-stage1/dietlibc/lib/__stat64_cvt.c +++ b/mdk-stage1/dietlibc/lib/__stat64_cvt.c @@ -1,6 +1,8 @@ #include <sys/stat.h> #ifndef __NO_STAT64 +void __stat64_cvt(const struct stat *src,struct stat64 *dest); + void __stat64_cvt(const struct stat *src,struct stat64 *dest) { dest->st_dev=src->st_dev; dest->st_ino=src->st_ino; diff --git a/mdk-stage1/dietlibc/lib/_brk.c b/mdk-stage1/dietlibc/lib/_brk.c index 6d0b29c03..e73d7b621 100644 --- a/mdk-stage1/dietlibc/lib/_brk.c +++ b/mdk-stage1/dietlibc/lib/_brk.c @@ -1,14 +1,13 @@ #include <unistd.h> -extern int __diet_brk(void *end_data_segment); +extern void* __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 __libc_brk(void *end_data_segment); + +int __libc_brk(void *end_data_segment) { + return ((__curbrk=__diet_brk(end_data_segment))==(void*)-1?-1:0); } -int brk (void *end_data_segment) __attribute__((weak,alias("__brk"))); +int brk(void *end_data_segment) __attribute__((weak,alias("__libc_brk"))); diff --git a/mdk-stage1/dietlibc/lib/abort.c b/mdk-stage1/dietlibc/lib/abort.c index 55bfb8f0f..7c49a32ef 100644 --- a/mdk-stage1/dietlibc/lib/abort.c +++ b/mdk-stage1/dietlibc/lib/abort.c @@ -1,10 +1,16 @@ -#include <linux/types.h> -#include <linux/signal.h> +#include <sys/types.h> #include <signal.h> #include <stdlib.h> +#include <stdio.h> + +#ifndef __PIC__ +void __stdio_flushall(void) __attribute__((weak)); +void __stdio_flushall(void) { } +#endif void abort() { sigset_t t; + __stdio_flushall(); if (!sigemptyset(&t) && !sigaddset(&t, SIGABRT)) sigprocmask(SIG_UNBLOCK, &t, 0); while (1) diff --git a/mdk-stage1/dietlibc/lib/abs.c b/mdk-stage1/dietlibc/lib/abs.c index 9d7055358..d3b75f202 100644 --- a/mdk-stage1/dietlibc/lib/abs.c +++ b/mdk-stage1/dietlibc/lib/abs.c @@ -1,6 +1,6 @@ -#include <stdlib.h> +#include <endian.h> -int abs(int j) -{ - return (j < 0) ? -j : j; -} +int abs(int i) { return i>=0?i:-i; } +#if __WORDSIZE == 32 +long labs(long i) __attribute__((alias("abs"))); +#endif diff --git a/mdk-stage1/dietlibc/lib/accept.c b/mdk-stage1/dietlibc/lib/accept.c index c7e8254ca..08359b894 100644 --- a/mdk-stage1/dietlibc/lib/accept.c +++ b/mdk-stage1/dietlibc/lib/accept.c @@ -1,14 +1,12 @@ -#include <linux/net.h> +#include <linuxnet.h> extern int socketcall(int callno,long* args); +int __libc_accept(int a, void * addr, void * addr2); + int __libc_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 accept(int a, void * addr, void * addr2) __attribute__((weak,alias("__libc_accept"))); diff --git a/mdk-stage1/dietlibc/lib/alloc.c b/mdk-stage1/dietlibc/lib/alloc.c index 8cb87a69b..a2b3b73a1 100644 --- a/mdk-stage1/dietlibc/lib/alloc.c +++ b/mdk-stage1/dietlibc/lib/alloc.c @@ -1,23 +1,27 @@ /* * malloc/free by O.Dreesen + * + * first TRY: + * lists w/magics + * and now the second TRY + * let the kernel map all the stuff (if there is something to do) */ -#include <linux/unistd.h> -#include <asm/mman.h> -#include <linux/errno.h> -#include "dietfeatures.h" - -#if 0 +#include <unistd.h> #include <sys/mman.h> -#define _LIBC #include <errno.h> -#endif +#include "dietfeatures.h" -#include <linux/types.h> +#include <sys/cdefs.h> +#include <sys/types.h> +#include <stddef.h> +#include <stdlib.h> +#include <string.h> + +#include <sys/shm.h> /* for PAGE_SIZE */ -#if defined(MAP_ANONYMOUS) && !defined(MAP_ANON) -#define MAP_ANON MAP_ANONYMOUS -#endif + +/* -- HELPER CODE --------------------------------------------------------- */ #ifndef MAP_FAILED #define MAP_FAILED ((void*)-1) @@ -27,217 +31,207 @@ #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 union { + void* next; + size_t size; +} __alloc_t; -typedef struct t_alloc_head { - unsigned int magic1; - struct t_alloc_head *ptr; - unsigned long size; - unsigned int magic2; -} alloc_head; +#define BLOCK_START(b) (((void*)(b))-sizeof(__alloc_t)) +#define BLOCK_RET(b) (((void*)(b))+sizeof(__alloc_t)) -/* guess what ? the virtual block size */ -#define MEM_BLOCK_SIZE 4096 +#define MEM_BLOCK_SIZE PAGE_SIZE +#define PAGE_ALIGN(s) (((s)+MEM_BLOCK_SIZE-1)&(unsigned long)(~(MEM_BLOCK_SIZE-1))) -/* minimum allocated bytes */ -#define MEM_ALLOC_MIN 4 +/* a simple mmap :) */ -/* Initial start position in memory */ -#define MEM_ALLOC_START ((char*)0x18000000) +#ifdef __i386__ +/* regparm exists only on i386 */ +static void *do_mmap(size_t size) __attribute__((regparm(1))); +static size_t get_index(size_t _size) __attribute__((regparm(1))); +static void* __small_malloc(size_t _size) __attribute__((regparm(1))); +#endif -/* 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))) +static void *do_mmap(size_t size) { + return mmap(0, size, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE, -1, (size_t)0); +} -#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) +/* -- SMALL MEM ----------------------------------------------------------- */ -#define ALLOC_MAGIC1 0xbad2f7ee -#define ALLOC_MAGIC2 0xf7ee2bad +static __alloc_t* __small_mem[8]; -/* freelist handler */ -static alloc_head base = {ALLOC_MAGIC1,&base,0,ALLOC_MAGIC2}; -static char *alloc_get_end = MEM_ALLOC_START; +#define __SMALL_NR(i) (MEM_BLOCK_SIZE/(i)) -void __libc_free(void *ptr) -{ - alloc_head *prev,*p,*block; +#define __MIN_SMALL_SIZE __SMALL_NR(256) /* 16 / 32 */ +#define __MAX_SMALL_SIZE __SMALL_NR(2) /* 2048 / 4096 */ - if (ptr==NULL) return; +#define GET_SIZE(s) (__MIN_SMALL_SIZE<<get_index((s))) - block=START_BLOCK(ptr); - if (block->magic1 != ALLOC_MAGIC1) return; - if (block->magic2 != ALLOC_MAGIC2) return; +#define FIRST_SMALL(p) (((unsigned long)(p))&(~(MEM_BLOCK_SIZE-1))) - 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 */ +static inline int __ind_shift() { return (MEM_BLOCK_SIZE==4096)?4:5; } - /* emergency escape: freelist has ONLY one entry the freelist base */ - if (p->ptr==p) break; +static size_t get_index(size_t _size) { + register size_t idx=0; + if (_size) { + register size_t size=((_size-1)&(MEM_BLOCK_SIZE-1))>>__ind_shift(); + while(size) { size>>=1; ++idx; } } - prev->ptr = block; + return idx; +} - if (END_OF_BLOCK(block)==p) - { /* join right neighbor */ - block->ptr = p->ptr; - block->size += p->size; - } - else - block->ptr = p; +/* small mem */ +static void __small_free(void*_ptr,size_t _size) __attribute__((regparm(2))); - if (END_OF_BLOCK(prev)==block) - { /* join left neighbor */ - prev->size += block->size; - prev->ptr = block->ptr; - } +static void __small_free(void*_ptr,size_t _size) { + __alloc_t* ptr=BLOCK_START(_ptr); + size_t size=_size; + size_t idx=get_index(size); + + memset(ptr,0,size); /* allways zero out small mem */ + + ptr->next=__small_mem[idx]; + __small_mem[idx]=ptr; } -void free(void *ptr) __attribute__((weak,alias("__libc_free"))); - -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; +static void* __small_malloc(size_t _size) { + __alloc_t *ptr; + size_t size=_size; + size_t idx; + + idx=get_index(size); + ptr=__small_mem[idx]; - /* make a header */ - ah=(alloc_head*)tmp; - ah->magic1=ALLOC_MAGIC1; - ah->magic2=ALLOC_MAGIC2; - ah->ptr=ah; - ah->size=size; + if (ptr==0) { /* no free blocks ? */ + register int i,nr; + ptr=do_mmap(MEM_BLOCK_SIZE); + if (ptr==MAP_FAILED) return MAP_FAILED; + + __small_mem[idx]=ptr; + + nr=__SMALL_NR(size)-1; + for (i=0;i<nr;i++) { + ptr->next=(((void*)ptr)+size); + ptr=ptr->next; + } + ptr->next=0; + + ptr=__small_mem[idx]; + } - /* link new free maped pages in freelist */ - __libc_free(START_DATA(tmp)); + /* get a free block */ + __small_mem[idx]=ptr->next; + ptr->next=0; - return &base; + return ptr; } -void *__libc_malloc(size_t size) -{ - alloc_head *p, *prev; - size_t need; +/* -- PUBLIC FUNCTIONS ---------------------------------------------------- */ - /* 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 */ - } +static void _alloc_libc_free(void *ptr) { + register size_t size; + if (ptr) { + size=((__alloc_t*)BLOCK_START(ptr))->size; + if (size) { + if (size<=__MAX_SMALL_SIZE) + __small_free(ptr,size); 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->magic1=ALLOC_MAGIC1; - tmp->magic2=ALLOC_MAGIC2; - tmp->ptr=p->ptr; - tmp->size=p->size-need; /* remaining size */ - } + munmap(BLOCK_START(ptr),size); + } + } +} +void __libc_free(void *ptr) __attribute__((alias("_alloc_libc_free"))); +void free(void *ptr) __attribute__((weak,alias("_alloc_libc_free"))); +void if_freenameindex(void* ptr) __attribute__((alias("free"))); - p->size=need; /* set size */ - } - p->ptr=p; /* self-link */ +#ifdef WANT_MALLOC_ZERO +static __alloc_t zeromem[2]={{0},{0}}; +#endif - return (void*)START_DATA(p); - } - else if (p==&base) - { - if ((p=alloc_get_mem(need))==NULL) goto err_out; - } +static void* _alloc_libc_malloc(size_t size) { + __alloc_t* ptr; + size_t need; +#ifdef WANT_MALLOC_ZERO + if (!size) return BLOCK_RET(zeromem); +#else + if (!size) goto retzero; +#endif + size+=sizeof(__alloc_t); + if (size<sizeof(__alloc_t)) goto retzero; + if (size<=__MAX_SMALL_SIZE) { + need=GET_SIZE(size); + ptr=__small_malloc(need); + } + else { + need=PAGE_ALIGN(size); + if (!need) ptr=MAP_FAILED; else ptr=do_mmap(need); } + if (ptr==MAP_FAILED) goto err_out; + ptr->size=need; + return BLOCK_RET(ptr); err_out: - return NULL; + (*__errno_location())=ENOMEM; +retzero: + return 0; } -void *malloc(size_t size) __attribute__((weak,alias("__libc_malloc"))); - -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* __libc_malloc(size_t size) __attribute__((alias("_alloc_libc_malloc"))); +void* malloc(size_t size) __attribute__((weak,alias("_alloc_libc_malloc"))); + +void *calloc(size_t nmemb, size_t _size) { + register size_t size=_size*nmemb; + if (nmemb && size/nmemb!=_size) { + (*__errno_location())=ENOMEM; + return 0; + } + return malloc(size); } -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; +void* __libc_realloc(void* ptr, size_t _size); +void* __libc_realloc(void* ptr, size_t _size) { + register size_t size=_size; + if (ptr) { + if (size) { + __alloc_t* tmp=BLOCK_START(ptr); + size+=sizeof(__alloc_t); + if (size<sizeof(__alloc_t)) goto retzero; + size=(size<=__MAX_SMALL_SIZE)?GET_SIZE(size):PAGE_ALIGN(size); + if (tmp->size!=size) { + if ((tmp->size<=__MAX_SMALL_SIZE)) { + void *new=_alloc_libc_malloc(_size); + if (new) { + register __alloc_t* foo=BLOCK_START(new); + size=foo->size; + if (size>tmp->size) size=tmp->size; + if (size) memcpy(new,ptr,size-sizeof(__alloc_t)); + _alloc_libc_free(ptr); + } + ptr=new; + } + else { + register __alloc_t* foo; + size=PAGE_ALIGN(size); + foo=mremap(tmp,tmp->size,size,MREMAP_MAYMOVE); + if (foo==MAP_FAILED) { +retzero: + (*__errno_location())=ENOMEM; + ptr=0; + } + else { + foo->size=size; + ptr=BLOCK_RET(foo); + } } - return NULL; - } - if (diff>=sizeof(alloc_head)) - { - tmp->size=need; - tf=END_OF_BLOCK(tmp); - tf->magic1=ALLOC_MAGIC1; - tf->magic2=ALLOC_MAGIC2; - tf->ptr=tf; - tf->size=diff; - free(START_DATA(tf)); } - return ptr; } - else - free(ptr); + else { /* size==0 */ + _alloc_libc_free(ptr); + } } - else if (size>0) - return malloc(size); - return NULL; + else { /* ptr==0 */ + if (size) { + ptr=_alloc_libc_malloc(size); + } + } + return ptr; } +void* realloc(void* ptr, size_t size) __attribute__((weak,alias("__libc_realloc"))); + diff --git a/mdk-stage1/dietlibc/lib/assert_fail.c b/mdk-stage1/dietlibc/lib/assert_fail.c index 3d6ba65c1..35b8b186a 100644 --- a/mdk-stage1/dietlibc/lib/assert_fail.c +++ b/mdk-stage1/dietlibc/lib/assert_fail.c @@ -2,14 +2,15 @@ #include <string.h> #include <unistd.h> #include "dietwarning.h" +#include <write12.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); 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); + unsigned int alen=strlen(assertion); + unsigned int flen=strlen(file); + unsigned int fulen=function?strlen(function):0; char *buf=(char*)alloca(alen+flen+fulen+50); if (buf) { char *tmp; @@ -22,7 +23,7 @@ void __assert_fail (const char *assertion, const char *file, unsigned int line, strcat(buf,"Assertion `"); strcat(buf,assertion); strcat(buf,"' failed.\n"); - write(2,buf,strlen(buf)); + __write2(buf); } abort(); } diff --git a/mdk-stage1/dietlibc/lib/atexit.c b/mdk-stage1/dietlibc/lib/atexit.c index 8204af06c..e0eef19c6 100644 --- a/mdk-stage1/dietlibc/lib/atexit.c +++ b/mdk-stage1/dietlibc/lib/atexit.c @@ -1,23 +1,31 @@ +#include <stdlib.h> + typedef void (*function)(void); -static function __atexitlist[4]; +#define NUM_ATEXIT 32 + +static function __atexitlist[NUM_ATEXIT]; +static int atexit_counter = 0; int atexit(function t) { - int i; - for (i=0; i<4; i++) - if (__atexitlist[i]==0) { - __atexitlist[i]=t; - return 0; - } + if (atexit_counter<NUM_ATEXIT) { + __atexitlist[atexit_counter]=t; + ++atexit_counter; + return 0; + } return -1; } extern void _exit(int code) __attribute__((noreturn)); +extern void __thread_doexit(); -void exit(int code) { - if (__atexitlist[3]) __atexitlist[3](); - if (__atexitlist[2]) __atexitlist[2](); - if (__atexitlist[1]) __atexitlist[1](); - if (__atexitlist[0]) __atexitlist[0](); +void __libc_exit(int code); +void __libc_exit(int code) { + register int i=atexit_counter; + __thread_doexit(); + while(i) { + __atexitlist[--i](); + } _exit(code); } +void exit(int code) __attribute__((alias("__libc_exit"))); diff --git a/mdk-stage1/dietlibc/lib/atoi.c b/mdk-stage1/dietlibc/lib/atoi.c index fe952b8c4..10b618950 100644 --- a/mdk-stage1/dietlibc/lib/atoi.c +++ b/mdk-stage1/dietlibc/lib/atoi.c @@ -1,8 +1,19 @@ +#include <endian.h> +#include <ctype.h> +#include <stdlib.h> + +#if __WORDSIZE == 64 int atoi(const char* s) { - int v=0; + 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; + while ( *s == ' ' || (unsigned int)(*s - 9) < 5u) s++; + switch (*s) { + case '-': sign=-1; + case '+': ++s; + } + while ((unsigned int) (*s - '0') < 10u) { + v=v*10+*s-'0'; ++s; + } + return sign==-1?-v:v; } +#endif diff --git a/mdk-stage1/dietlibc/lib/atol.c b/mdk-stage1/dietlibc/lib/atol.c index 558a004b9..5961a1881 100644 --- a/mdk-stage1/dietlibc/lib/atol.c +++ b/mdk-stage1/dietlibc/lib/atol.c @@ -1,8 +1,23 @@ +#include <endian.h> +#include <ctype.h> +#include <stdlib.h> + 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; + int sign=0; + while ( *s == ' ' || (unsigned int)(*s - 9) < 5u) ++s; + switch (*s) { + case '-': sign=-1; + case '+': ++s; + } + while ((unsigned int) (*s - '0') < 10u) { + v=v*10+*s-'0'; ++s; + } + return sign?-v:v; } + +#if __WORDSIZE == 64 +long long int atoll(const char* s) __attribute__((alias("atol"))); +#else +int atoi(const char* s) __attribute__((alias("atol"))); +#endif diff --git a/mdk-stage1/dietlibc/lib/bind.c b/mdk-stage1/dietlibc/lib/bind.c index ec1c93e1b..dae80f491 100644 --- a/mdk-stage1/dietlibc/lib/bind.c +++ b/mdk-stage1/dietlibc/lib/bind.c @@ -1,12 +1,11 @@ -#include <linux/net.h> +#include <linuxnet.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 +int __libc_bind(int a, void * b, int c); +int __libc_bind(int a, void * b, int c) { unsigned long args[] = { a, (long) b, c }; return socketcall(SYS_BIND, args); -#endif } + +int bind(int a, void * b, int c) __attribute__((weak,alias("__libc_bind"))); diff --git a/mdk-stage1/dietlibc/lib/bsearch.c b/mdk-stage1/dietlibc/lib/bsearch.c index d2f5c74b2..14605f1f6 100644 --- a/mdk-stage1/dietlibc/lib/bsearch.c +++ b/mdk-stage1/dietlibc/lib/bsearch.c @@ -1,20 +1,20 @@ +#include <assert.h> #include <stdlib.h> void *bsearch(const void *key, const void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)) { - const char *v, *r; - int res; - r=base+(nmemb-1)*size; - do { - register int num=nmemb/2; - v=base+num*size; - if ((res=compar(key,v))<0) { - r=v-size; - nmemb=num; - } else { - if (res==0) return (void*)v; - base=v+size; - nmemb-=num; - } - } while ((char*)base<=r); + size_t m; + while (nmemb) { + int tmp; + void *p; + m=nmemb/2; + p=(void *) (((const char *) base) + (m * size)); + if ((tmp=(*compar)(key,p))<0) { + nmemb=m; + } else if (tmp>0) { + base=p+size; + nmemb-=m+1; + } else + return p; + } return 0; } diff --git a/mdk-stage1/dietlibc/lib/cfmakeraw.c b/mdk-stage1/dietlibc/lib/cfmakeraw.c index 7f6df9913..e33c783c9 100644 --- a/mdk-stage1/dietlibc/lib/cfmakeraw.c +++ b/mdk-stage1/dietlibc/lib/cfmakeraw.c @@ -1,8 +1,7 @@ #include <termios.h> #include <sys/ioctl.h> -void cfmakeraw(struct termios *t) -{ +void cfmakeraw(struct termios *t) { t->c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON); t->c_oflag &= ~OPOST; t->c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN); diff --git a/mdk-stage1/dietlibc/lib/closedir.c b/mdk-stage1/dietlibc/lib/closedir.c index e73025eb1..3aade81b3 100644 --- a/mdk-stage1/dietlibc/lib/closedir.c +++ b/mdk-stage1/dietlibc/lib/closedir.c @@ -1,10 +1,11 @@ #include "dietdirent.h" +#include <sys/mman.h> #include <unistd.h> #include <dirent.h> #include <stdlib.h> int closedir (DIR* d) { int res=close(d->fd); - free(d); + munmap (d, PAGE_SIZE); return res; } diff --git a/mdk-stage1/dietlibc/lib/connect.c b/mdk-stage1/dietlibc/lib/connect.c index 01fd61a6c..642303ef3 100644 --- a/mdk-stage1/dietlibc/lib/connect.c +++ b/mdk-stage1/dietlibc/lib/connect.c @@ -1,14 +1,11 @@ -#include <linux/net.h> +#include <linuxnet.h> extern int socketcall(int callno,long* args); +int __libc_connect(int a, void * b, int c); int __libc_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 connect(int a, void * b, int c) __attribute__((weak,alias("__libc_connect"))); diff --git a/mdk-stage1/dietlibc/lib/creat.c b/mdk-stage1/dietlibc/lib/creat.c index 82145b515..41d8236aa 100644 --- a/mdk-stage1/dietlibc/lib/creat.c +++ b/mdk-stage1/dietlibc/lib/creat.c @@ -1,5 +1,7 @@ #include <fcntl.h> -int creat(const char *file,mode_t mode) { +int __libc_creat(const char *file,mode_t mode); +int __libc_creat(const char *file,mode_t mode) { return open(file,O_WRONLY|O_CREAT|O_TRUNC,mode); } +int creat(const char *file,mode_t mode) __attribute__((weak,alias("__libc_creat"))); diff --git a/mdk-stage1/dietlibc/lib/errno_location.c b/mdk-stage1/dietlibc/lib/errno_location.c index 286f833c9..298c9c3cf 100644 --- a/mdk-stage1/dietlibc/lib/errno_location.c +++ b/mdk-stage1/dietlibc/lib/errno_location.c @@ -1,5 +1,5 @@ extern int errno; +int *__errno_location(void) __attribute__((weak)); int *__errno_location() { return &errno; } -int *errno_location() __attribute__((weak,alias("__errno_location"))); diff --git a/mdk-stage1/dietlibc/lib/exec_lib.c b/mdk-stage1/dietlibc/lib/exec_lib.c index 3129224a0..575c03d6d 100644 --- a/mdk-stage1/dietlibc/lib/exec_lib.c +++ b/mdk-stage1/dietlibc/lib/exec_lib.c @@ -3,18 +3,19 @@ extern char **environ; +int __exec_shell(const char *file, char *const argv[]); int __exec_shell(const char *file, char *const argv[]) { int i; for (i = 0; argv[i]; i++); { - char *shell_argv[i + 1]; + const char *shell_argv[i + 1]; shell_argv[0] = _PATH_BSHELL; - shell_argv[1] = (char *) file; + shell_argv[1] = file; for (; i > 1; i--) shell_argv[i] = argv[i - 1]; - return execve(_PATH_BSHELL, shell_argv, environ); + return execve(_PATH_BSHELL, (char*const*)shell_argv, environ); } } diff --git a/mdk-stage1/dietlibc/lib/execl.c b/mdk-stage1/dietlibc/lib/execl.c index 71459e71f..360bd3908 100644 --- a/mdk-stage1/dietlibc/lib/execl.c +++ b/mdk-stage1/dietlibc/lib/execl.c @@ -2,6 +2,7 @@ #include <unistd.h> #include <errno.h> #include <stdlib.h> +#include "dietfeatures.h" int execl( const char *path,...) { va_list ap; @@ -19,6 +20,6 @@ int execl( const char *path,...) { va_end (ap); return execve(path,argv,environ); } - __set_errno(ENOMEM); + errno=ENOMEM; return -1; } diff --git a/mdk-stage1/dietlibc/lib/execlp.c b/mdk-stage1/dietlibc/lib/execlp.c index 3aea1e960..27dc0bb95 100644 --- a/mdk-stage1/dietlibc/lib/execlp.c +++ b/mdk-stage1/dietlibc/lib/execlp.c @@ -2,7 +2,7 @@ #include <unistd.h> #include <errno.h> #include <stdlib.h> -#include "dietstdarg.h" +#include "dietfeatures.h" int execlp(const char* file, const char *arg,...) { va_list ap,bak; @@ -15,12 +15,12 @@ int execlp(const char* file, const char *arg,...) { ++n; va_end (ap); if ((argv=(char **)alloca(n*sizeof(char*)))) { - argv[0]=arg; + argv[0]=(char*)arg; for (i=0; i<n; ++i) argv[i+1]=va_arg(bak,char *); va_end (bak); return execvp(file,argv); } - __set_errno(ENOMEM); + errno=ENOMEM; return -1; } diff --git a/mdk-stage1/dietlibc/lib/execv.c b/mdk-stage1/dietlibc/lib/execv.c index efd760253..d7acfa29f 100644 --- a/mdk-stage1/dietlibc/lib/execv.c +++ b/mdk-stage1/dietlibc/lib/execv.c @@ -4,10 +4,12 @@ #include <unistd.h> #include <errno.h> #include "exec_lib.h" +#include "dietfeatures.h" int execv(const char *file, char *const argv[]) { if (execve(file,argv,environ)==-1) { - if (errno==ENOEXEC) __exec_shell(file,argv); + if (errno==ENOEXEC) + __exec_shell(file,argv); } return -1; } diff --git a/mdk-stage1/dietlibc/lib/execvp.c b/mdk-stage1/dietlibc/lib/execvp.c index 20521d69f..72447af7a 100644 --- a/mdk-stage1/dietlibc/lib/execvp.c +++ b/mdk-stage1/dietlibc/lib/execvp.c @@ -4,31 +4,40 @@ #include <unistd.h> #include <errno.h> #include "exec_lib.h" +#include "dietfeatures.h" int execvp(const char *file, char *const argv[]) { - char *path=getenv("PATH"); + const 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); + if (errno==ENOEXEC) + __exec_shell(file,argv); return -1; } } if (!path) path=_PATH_DEFPATH; - for (cur=path; cur; cur=next) { + for (cur=(char*)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); + } else { + if (next-cur>=PATH_MAX-3) { error: errno=EINVAL; return -1; } + memmove(buf,cur,(size_t)(next-cur)); + } buf[next-cur]='/'; - memmove(&buf[next-cur+1],file,strlen(file)+1); + { + int len=strlen(file); + if (len+(next-cur)>=PATH_MAX-2) goto error; + 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==ENOEXEC) + return __exec_shell(buf,argv); if ((errno!=EACCES) && (errno!=ENOENT)) return -1; } if (*next==0) break; diff --git a/mdk-stage1/dietlibc/lib/ftw.c b/mdk-stage1/dietlibc/lib/ftw.c index a3c04af9a..af13a7f86 100644 --- a/mdk-stage1/dietlibc/lib/ftw.c +++ b/mdk-stage1/dietlibc/lib/ftw.c @@ -1,52 +1,47 @@ -#include <linux/stat.h> +#include <sys/stat.h> #include <unistd.h> #include <limits.h> #include <ftw.h> #include <dirent.h> #include <string.h> #include <stdlib.h> +#include "dietdirent.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; +int ftw(const char*dir,int(*f)(const char*file,const struct stat*sb,int flag),int dpth){ + char* cd; + size_t cdl; + 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; + int r; + unsigned int oldlen=0; + char* filename; /* the warning gcc issues here is bogus */ + if(chdir(dir))return-1; + cd=alloca(PATH_MAX+1); + if(!getcwd(cd,PATH_MAX))return-1; + cd[PATH_MAX]='\0'; + cdl=strlen(cd); + if(!(d=opendir(".")))return-1; + while((de=readdir(d))){ + int flg; + size_t nl; + if(de->d_name[0]=='.'){if(!de->d_name[1])continue;if(de->d_name[1]=='.'&&!de->d_name[2])continue;} + nl=strlen(de->d_name); + if (nl+cdl+2>oldlen) + filename=alloca(oldlen=nl+cdl+2); + memmove(filename,cd,cdl); + filename[cdl]='/'; + memmove(filename+cdl+1,de->d_name,nl+1); + if(!lstat(de->d_name,&sb)){ + if(S_ISLNK(sb.st_mode))flg=FTW_SL;else if(S_ISDIR(sb.st_mode))flg=FTW_D;else flg=FTW_F; + }else flg=FTW_NS; + r=f(filename,&sb,flg); + if(r){closedir(d);return r;} + if(flg==FTW_D&&dpth){ + r=ftw(filename,f,dpth-1); + fchdir(d->fd); + if (r){closedir(d);return r;} } -/* puts(de->d_name); */ } - closedir(d); - return 0; + return closedir(d); } diff --git a/mdk-stage1/dietlibc/lib/getdomainname.c b/mdk-stage1/dietlibc/lib/getdomainname.c index 2554fe4c3..75486b010 100644 --- a/mdk-stage1/dietlibc/lib/getdomainname.c +++ b/mdk-stage1/dietlibc/lib/getdomainname.c @@ -2,12 +2,13 @@ #include <sys/types.h> #include <sys/utsname.h> +#include <unistd.h> int getdomainname(char *name,size_t len) { struct utsname u; int res=uname(&u); if (res==0) { - int i; + size_t i; if (len>=_UTSNAME_DOMAIN_LENGTH) len=_UTSNAME_DOMAIN_LENGTH; for (i=0; i<len; i++) diff --git a/mdk-stage1/dietlibc/lib/getenv.c b/mdk-stage1/dietlibc/lib/getenv.c index fc37e9927..5b529c17f 100644 --- a/mdk-stage1/dietlibc/lib/getenv.c +++ b/mdk-stage1/dietlibc/lib/getenv.c @@ -1,7 +1,6 @@ +#include <stdlib.h> #include <string.h> -extern char **environ; - extern char *getenv(const char *s) { int i; diff --git a/mdk-stage1/dietlibc/lib/gethostname.c b/mdk-stage1/dietlibc/lib/gethostname.c index ccc0fbc8e..c3d2f3d5e 100644 --- a/mdk-stage1/dietlibc/lib/gethostname.c +++ b/mdk-stage1/dietlibc/lib/gethostname.c @@ -2,12 +2,13 @@ #include <sys/types.h> #include <sys/utsname.h> +#include <unistd.h> int gethostname(char *name,size_t len) { struct utsname u; int res=uname(&u); if (res==0) { - int i; + size_t i; if (len>=_UTSNAME_NODENAME_LENGTH) len=_UTSNAME_NODENAME_LENGTH; for (i=0; i<len; i++) diff --git a/mdk-stage1/dietlibc/lib/getopt.c b/mdk-stage1/dietlibc/lib/getopt.c index 93097122f..aa1988f8d 100644 --- a/mdk-stage1/dietlibc/lib/getopt.c +++ b/mdk-stage1/dietlibc/lib/getopt.c @@ -1,118 +1,63 @@ -#include "getopt.h" #include <string.h> - -/* - * by Olaf Dreesen - */ - -int opterr; - -int optind=1; -char *optarg; - -static int opt_unknown=1,opt_unknown_len; - -static int getopt_check(int c,char*o,int ol) -{ - int i; - if (c==':') return 2; - for (i=0;i<ol;i++) - { - if (o[i]==c) - { - if (o[i+1]==':') return 1; - return 0; +#include <getopt.h> + +static void getopterror(int which) { + static char error1[]="Unknown option `-x'.\n"; + static char error2[]="Missing argument for `-x'.\n"; + if (opterr) { + if (which) { + error2[23]=optopt; + write(2,error2,28); + } else { + error1[17]=optopt; + write(2,error1,22); } } - return 2; } -static void getopt_sort(char*v[],int oi) -{ - int i; - char *tmp, *tmp2=0; - - if (opt_unknown_len) - { - tmp=v[optind-(1+oi)]; - if (oi) tmp2=v[optind-1]; - - for (i=opt_unknown+opt_unknown_len;i>opt_unknown;i--) v[i+oi]=v[i-1]; - - v[opt_unknown++]=tmp; - if (oi) v[opt_unknown++]=tmp2; +int getopt(int argc, char * const argv[], const char *optstring) { + static int lastidx=0,lastofs=0; + char *tmp; + if (optind==0) optind=1; /* whoever started setting optind to 0 should be shot */ +again: + if (optind>argc || !argv[optind] || *argv[optind]!='-' || argv[optind][1]==0) + return -1; + if (argv[optind][1]=='-' && argv[optind][2]==0) { + ++optind; + return -1; } -} - -static char* nextchar; -int getopt(int c,char*v[],char*o) -{ - int ol=strlen(o); - int ret=0; - int oi=0; - - optarg=0; - - while (nextchar || (optind<c)) - { - if (nextchar) - { - if ((ret=(*(++nextchar)))) - { - switch (getopt_check(ret,o,ol)) - { - case 1: - if (*(++nextchar)) - optarg=nextchar; - else - { - if (optind<c) - { - oi=1; - optarg=v[optind++]; - } - else - ret='?'; - } - nextchar=0; - case 0: - if (!nextchar) - getopt_sort(v,oi); - else - if (!(*(nextchar+1))) - getopt_sort(v,oi); - return ret; - break; - default: - return '?'; - break; - } - } - else - nextchar=0; + if (lastidx!=optind) { + lastidx=optind; lastofs=0; + } + optopt=argv[optind][lastofs+1]; + if ((tmp=strchr(optstring,optopt))) { + if (*tmp==0) { /* apparently, we looked for \0, i.e. end of argument */ + ++optind; + goto again; } - else - { - if ((v[optind][0]=='-')&&((v[optind][1]!=0))) - { - if ((v[optind][1]=='-')&&(v[optind][2]==0)) - { - getopt_sort(v,oi); - optind=opt_unknown; - return -1; - } - else - { - nextchar=v[optind]; - } + if (tmp[1]==':') { /* argument expected */ + if (tmp[2]==':' || argv[optind][lastofs+2]) { /* "-foo", return "oo" as optarg */ + if (!*(optarg=argv[optind]+lastofs+2)) optarg=0; + goto found; } - else - { - ++opt_unknown_len; + optarg=argv[optind+1]; + if (!optarg) { /* missing argument */ + ++optind; + if (*optstring==':') return ':'; + getopterror(1); + return ':'; } ++optind; + } else { + ++lastofs; + return optopt; } +found: + ++optind; + return optopt; + } else { /* not found */ + getopterror(0); + ++optind; + return '?'; } - optind=opt_unknown; - return -1; } diff --git a/mdk-stage1/dietlibc/lib/getpeername.c b/mdk-stage1/dietlibc/lib/getpeername.c index 8adcddf55..c806c720d 100644 --- a/mdk-stage1/dietlibc/lib/getpeername.c +++ b/mdk-stage1/dietlibc/lib/getpeername.c @@ -1,13 +1,12 @@ -#include <linux/net.h> +#include <linuxnet.h> +#include <sys/socket.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 }; +int __libc_getpeername(int a, void * b, int *c); +int __libc_getpeername(int a, void * b, int *c) { + unsigned long args[] = { a, (long) b, (long) c }; return socketcall(SYS_GETPEERNAME, args); -#endif } +int getpeername(int a, struct sockaddr* b, socklen_t *c) __attribute__((weak,alias("__libc_getpeername"))); diff --git a/mdk-stage1/dietlibc/lib/getsockname.c b/mdk-stage1/dietlibc/lib/getsockname.c index 61a3ea24a..6c81e317d 100644 --- a/mdk-stage1/dietlibc/lib/getsockname.c +++ b/mdk-stage1/dietlibc/lib/getsockname.c @@ -1,13 +1,12 @@ -#include <linux/net.h> +#include <linuxnet.h> +#include <sys/socket.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 +int __libc_getsockname(int a, void * b, int c); +int __libc_getsockname(int a, void * b, int c) { unsigned long args[] = { a, (long) b, c }; return socketcall(SYS_GETSOCKNAME, args); -#endif } +int getsockname(int a, struct sockaddr* b, socklen_t* c) __attribute__((weak,alias("__libc_getsockname"))); diff --git a/mdk-stage1/dietlibc/lib/getsockopt.c b/mdk-stage1/dietlibc/lib/getsockopt.c index 8c0a57557..05b71d77d 100644 --- a/mdk-stage1/dietlibc/lib/getsockopt.c +++ b/mdk-stage1/dietlibc/lib/getsockopt.c @@ -1,13 +1,12 @@ -#include <linux/net.h> +#include <linuxnet.h> +#include <sys/socket.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 +int __libc_getsockopt(int a, int b, int c, void *d, int e); +int __libc_getsockopt(int a, int b, int c, void *d, int e) { unsigned long args[] = { a, b, c, (long)d, e }; return socketcall(SYS_GETSOCKOPT, args); -#endif } +int getsockopt(int s, int level, int optname, void * optval, socklen_t *optlen) __attribute__((weak,alias("__libc_getsockopt"))); diff --git a/mdk-stage1/dietlibc/lib/htonl.c b/mdk-stage1/dietlibc/lib/htonl.c index 490de42c4..04a1e4265 100644 --- a/mdk-stage1/dietlibc/lib/htonl.c +++ b/mdk-stage1/dietlibc/lib/htonl.c @@ -1,4 +1,5 @@ #include <endian.h> +#include <netinet/in.h> unsigned long int htonl(unsigned long int hostlong) { #if __BYTE_ORDER==__LITTLE_ENDIAN diff --git a/mdk-stage1/dietlibc/lib/htons.c b/mdk-stage1/dietlibc/lib/htons.c index 765d3bbc5..071001911 100644 --- a/mdk-stage1/dietlibc/lib/htons.c +++ b/mdk-stage1/dietlibc/lib/htons.c @@ -1,4 +1,5 @@ #include <endian.h> +#include <netinet/in.h> unsigned short int htons(unsigned short int hostshort) { #if __BYTE_ORDER==__LITTLE_ENDIAN diff --git a/mdk-stage1/dietlibc/lib/if_indextoname.c b/mdk-stage1/dietlibc/lib/if_indextoname.c index e683755f6..cc3111ed8 100644 --- a/mdk-stage1/dietlibc/lib/if_indextoname.c +++ b/mdk-stage1/dietlibc/lib/if_indextoname.c @@ -1,5 +1,4 @@ -#include <linux/if.h> -#include <linux/net.h> +#include <net/if.h> #include <sys/ioctl.h> #include <unistd.h> #include <sys/socket.h> diff --git a/mdk-stage1/dietlibc/lib/if_nametoindex.c b/mdk-stage1/dietlibc/lib/if_nametoindex.c index 5923963b1..c9dd1b051 100644 --- a/mdk-stage1/dietlibc/lib/if_nametoindex.c +++ b/mdk-stage1/dietlibc/lib/if_nametoindex.c @@ -1,5 +1,4 @@ -#include <linux/if.h> -#include <linux/net.h> +#include <net/if.h> #include <sys/ioctl.h> #include <unistd.h> #include <sys/socket.h> @@ -8,7 +7,7 @@ #define SOCK_DGRAM 2 #endif -int if_nametoindex(char* blub) { +unsigned int if_nametoindex(const char* blub) { struct ifreq ifr; int fd; char *tmp; diff --git a/mdk-stage1/dietlibc/lib/isalnum.c b/mdk-stage1/dietlibc/lib/isalnum.c index 4d363fab9..3192cc20d 100644 --- a/mdk-stage1/dietlibc/lib/isalnum.c +++ b/mdk-stage1/dietlibc/lib/isalnum.c @@ -1,7 +1,9 @@ #include <ctype.h> -int __isalnum_ascii(int c) { - return isalpha(c) || isdigit(c); +int __isalnum_ascii ( int ch ); +int __isalnum_ascii ( int ch ) { + return (unsigned int)((ch | 0x20) - 'a') < 26u || + (unsigned int)( ch - '0') < 10u; } -int isalnum(int c) __attribute__((weak,alias("__isalnum_ascii"))); +int isalnum ( int ch ) __attribute__((weak,alias("__isalnum_ascii"))); diff --git a/mdk-stage1/dietlibc/lib/isalpha.c b/mdk-stage1/dietlibc/lib/isalpha.c index 07ea69696..efd8b1940 100644 --- a/mdk-stage1/dietlibc/lib/isalpha.c +++ b/mdk-stage1/dietlibc/lib/isalpha.c @@ -1,7 +1,8 @@ #include <ctype.h> -int __isalpha_ascii(int c) { - return (c>='a' && c<='z') || (c>='A' && c<='Z'); +int __isalpha_ascii ( int ch ); +int __isalpha_ascii ( int ch ) { + return (unsigned int)((ch | 0x20) - 'a') < 26u; } -int isalpha(int c) __attribute__((weak,alias("__isalpha_ascii"))); +int isalpha ( int ch ) __attribute__((weak,alias("__isalpha_ascii"))); diff --git a/mdk-stage1/dietlibc/lib/isascii.c b/mdk-stage1/dietlibc/lib/isascii.c index e06994783..57a23ba44 100644 --- a/mdk-stage1/dietlibc/lib/isascii.c +++ b/mdk-stage1/dietlibc/lib/isascii.c @@ -1,6 +1,6 @@ #include <ctype.h> -int isascii(int c) { - return (c & 0x80) == 0; +int isascii ( int ch ) +{ + return (unsigned int)ch < 128u; } - diff --git a/mdk-stage1/dietlibc/lib/isatty.c b/mdk-stage1/dietlibc/lib/isatty.c index b31609720..4858a364d 100644 --- a/mdk-stage1/dietlibc/lib/isatty.c +++ b/mdk-stage1/dietlibc/lib/isatty.c @@ -2,11 +2,11 @@ #include <termios.h> #undef ioctl #include <sys/ioctl.h> +#include <errno.h> +#include <unistd.h> +#include "dietfeatures.h" -extern int errno; - -int isatty(int fd) -{ +int isatty(int fd) { int save; int is_tty; struct termios term; diff --git a/mdk-stage1/dietlibc/lib/isblank.c b/mdk-stage1/dietlibc/lib/isblank.c index 034e543b1..f13ca304a 100644 --- a/mdk-stage1/dietlibc/lib/isblank.c +++ b/mdk-stage1/dietlibc/lib/isblank.c @@ -1,6 +1,6 @@ #include <ctype.h> -int isblank(int ch) +int isblank ( int ch ) { - return ((ch==' ')||(ch=='\t')); + return ch == ' ' || ch == '\t'; } diff --git a/mdk-stage1/dietlibc/lib/iscntrl.c b/mdk-stage1/dietlibc/lib/iscntrl.c index a183a54f1..98dbae6f3 100644 --- a/mdk-stage1/dietlibc/lib/iscntrl.c +++ b/mdk-stage1/dietlibc/lib/iscntrl.c @@ -1,7 +1,8 @@ #include <ctype.h> -int __iscntrl_ascii(int c) { - return (c<32) || (c==127); +int __iscntrl_ascii ( int ch ); +int __iscntrl_ascii ( int ch ) { + return (unsigned int)ch < 32u || ch == 127; } -int iscntrl(int c) __attribute__((weak,alias("__iscntrl_ascii"))); +int iscntrl ( int ch ) __attribute__((weak,alias("__iscntrl_ascii"))); diff --git a/mdk-stage1/dietlibc/lib/isdigit.c b/mdk-stage1/dietlibc/lib/isdigit.c index 8a7c3e801..d04d281a8 100644 --- a/mdk-stage1/dietlibc/lib/isdigit.c +++ b/mdk-stage1/dietlibc/lib/isdigit.c @@ -1,7 +1,8 @@ #include <ctype.h> -int __isdigit_ascii(int c) { - return (c>='0' && c<='9'); +int __isdigit_ascii ( int ch ); +int __isdigit_ascii ( int ch ) { + return (unsigned int)(ch - '0') < 10u; } -int isdigit(int c) __attribute__((weak,alias("__isdigit_ascii"))); +int isdigit ( int ch ) __attribute__((weak,alias("__isdigit_ascii"))); diff --git a/mdk-stage1/dietlibc/lib/isgraph.c b/mdk-stage1/dietlibc/lib/isgraph.c index 807f90ff0..83419e788 100644 --- a/mdk-stage1/dietlibc/lib/isgraph.c +++ b/mdk-stage1/dietlibc/lib/isgraph.c @@ -1,5 +1,6 @@ -int __isgraph_ascii(int c) { - return (c>=33 && c<=126); +int __isgraph_ascii ( int ch ); +int __isgraph_ascii ( int ch ) { + return (unsigned int)(ch - '!') < 127u - '!'; } -int isgraph(int c) __attribute__((weak,alias("__isgraph_ascii"))); +int isgraph ( int ch ) __attribute__((weak,alias("__isgraph_ascii"))); diff --git a/mdk-stage1/dietlibc/lib/islower.c b/mdk-stage1/dietlibc/lib/islower.c index 6a9afa519..8d219c43a 100644 --- a/mdk-stage1/dietlibc/lib/islower.c +++ b/mdk-stage1/dietlibc/lib/islower.c @@ -1,7 +1,8 @@ #include <ctype.h> -int __islower_ascii(int c) { - return (c>='a' && c<='z'); +int __islower_ascii ( int ch ); +int __islower_ascii ( int ch ) { + return (unsigned int) (ch - 'a') < 26u; } -int islower(int c) __attribute__((weak,alias("__islower_ascii"))); +int islower ( int ch ) __attribute__((weak,alias("__islower_ascii"))); diff --git a/mdk-stage1/dietlibc/lib/isprint.c b/mdk-stage1/dietlibc/lib/isprint.c index e980658a5..51ff5b6ee 100644 --- a/mdk-stage1/dietlibc/lib/isprint.c +++ b/mdk-stage1/dietlibc/lib/isprint.c @@ -1,6 +1,7 @@ -int __isprint_ascii(int c) { - return (c>=32 && c<=126); +int __isprint_ascii ( int ch ); +int __isprint_ascii ( int ch ) { + return (unsigned int)(ch - ' ') < 127u - ' '; } -int isprint(int c) __attribute__((weak,alias("__isprint_ascii"))); +int isprint ( int ch ) __attribute__((weak,alias("__isprint_ascii"))); diff --git a/mdk-stage1/dietlibc/lib/ispunct.c b/mdk-stage1/dietlibc/lib/ispunct.c index 2fd1183b1..8bbfcdb5a 100644 --- a/mdk-stage1/dietlibc/lib/ispunct.c +++ b/mdk-stage1/dietlibc/lib/ispunct.c @@ -1,7 +1,9 @@ #include <ctype.h> -int __ispunct_ascii(int c) { - return isprint(c) && !( isalnum(c) || isspace(c) ); +int __ispunct_ascii ( int ch ); +int __ispunct_ascii ( int ch ) +{ + return isprint (ch) && !isalnum (ch) && !isspace (ch); } -int ispunct(int c) __attribute__((weak,alias("__ispunct_ascii"))); +int ispunct ( int ch ) __attribute__((weak,alias("__ispunct_ascii"))); diff --git a/mdk-stage1/dietlibc/lib/isspace.c b/mdk-stage1/dietlibc/lib/isspace.c index 916f784ab..bfa46648b 100644 --- a/mdk-stage1/dietlibc/lib/isspace.c +++ b/mdk-stage1/dietlibc/lib/isspace.c @@ -1,8 +1,9 @@ #include <ctype.h> -int __isspace_ascii(int ch) +int __isspace_ascii ( int ch ); +int __isspace_ascii ( int ch ) { - return ((ch==' ')||(ch=='\f')||(ch=='\t')||(ch=='\v')||(ch=='\r')||(ch=='\n')); + return (unsigned int)(ch - 9) < 5u || ch == ' '; } -int isspace(int c) __attribute__((weak,alias("__isspace_ascii"))); +int isspace ( int ch ) __attribute__((weak,alias("__isspace_ascii"))); diff --git a/mdk-stage1/dietlibc/lib/isupper.c b/mdk-stage1/dietlibc/lib/isupper.c index 933dfc169..048d4fd6c 100644 --- a/mdk-stage1/dietlibc/lib/isupper.c +++ b/mdk-stage1/dietlibc/lib/isupper.c @@ -1,7 +1,9 @@ #include <ctype.h> -int __isupper_ascii(int c) { - return (c>='A' && c<='Z'); +int __isupper_ascii ( int ch ); +int __isupper_ascii ( int ch ) +{ + return (unsigned int)(ch - 'A') < 26u; } -int isupper(int c) __attribute__((weak,alias("__isupper_ascii"))); +int isupper ( int ch ) __attribute__((weak,alias("__isupper_ascii"))); diff --git a/mdk-stage1/dietlibc/lib/isxdigit.c b/mdk-stage1/dietlibc/lib/isxdigit.c index 22a711f2d..bca8e74ac 100644 --- a/mdk-stage1/dietlibc/lib/isxdigit.c +++ b/mdk-stage1/dietlibc/lib/isxdigit.c @@ -1,5 +1,8 @@ -int __isxdigit_ascii(int c) { - return ((c>='0'&&c<='9') || (c>='A'&&c<='F') || (c>='a'&&c<='f')); +int __isxdigit_ascii ( int ch ); +int __isxdigit_ascii ( int ch ) +{ + return (unsigned int)( ch - '0') < 10u || + (unsigned int)((ch | 0x20) - 'a') < 6u; } -int isxdigit(int c) __attribute__((weak,alias("__isxdigit_ascii"))); +int isxdigit ( int ch ) __attribute__((weak,alias("__isxdigit_ascii"))); diff --git a/mdk-stage1/dietlibc/lib/listen.c b/mdk-stage1/dietlibc/lib/listen.c index 56a51be06..661b86a63 100644 --- a/mdk-stage1/dietlibc/lib/listen.c +++ b/mdk-stage1/dietlibc/lib/listen.c @@ -1,13 +1,12 @@ -#include <linux/net.h> +#include <linuxnet.h> +#include <sys/socket.h> extern int socketcall(int callno,long* args); -int listen(int a, int b) { -#ifdef __i386__ - return socketcall(SYS_LISTEN, (long*)&a); -#else +int __libc_listen(int a, int b); +int __libc_listen(int a, int b) { unsigned long args[] = { a, b, 0 }; return socketcall(SYS_LISTEN, args); -#endif } +int listen(int s, int backlog) __attribute__((weak,alias("__libc_listen"))); diff --git a/mdk-stage1/dietlibc/lib/lockf.c b/mdk-stage1/dietlibc/lib/lockf.c index 2b1d004ef..1b6fcb80c 100644 --- a/mdk-stage1/dietlibc/lib/lockf.c +++ b/mdk-stage1/dietlibc/lib/lockf.c @@ -2,6 +2,7 @@ #include <fcntl.h> #include <unistd.h> #include <errno.h> +#include "dietfeatures.h" int lockf(int fd, int cmd, off_t len) { struct flock fl; diff --git a/mdk-stage1/dietlibc/lib/longjmp.c b/mdk-stage1/dietlibc/lib/longjmp.c index d0a5719c1..6f1afb4b1 100644 --- a/mdk-stage1/dietlibc/lib/longjmp.c +++ b/mdk-stage1/dietlibc/lib/longjmp.c @@ -1,51 +1,16 @@ -/* 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); +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 __libc_longjmp(sigjmp_buf env,int val); +void __libc_longjmp(sigjmp_buf env,int val) { + if (env[0].__mask_was_saved) { + sigprocmask(SIG_SETMASK,(sigset_t*)&env[0].__saved_mask,0); + } + if (val==0) val=1; + __longjmp(env[0].__jmpbuf,val); } - -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"))); +void __siglongjmp(sigjmp_buf env,int val) __attribute__((alias("__libc_longjmp"))); +void longjmp(sigjmp_buf env,int val) __attribute__((weak,alias("__libc_longjmp"))); +void siglongjmp(sigjmp_buf env,int val) __attribute__((weak,alias("__libc_longjmp"))); diff --git a/mdk-stage1/dietlibc/lib/lseek64.c b/mdk-stage1/dietlibc/lib/lseek64.c index f39e779f9..62acf4a2b 100644 --- a/mdk-stage1/dietlibc/lib/lseek64.c +++ b/mdk-stage1/dietlibc/lib/lseek64.c @@ -1,22 +1,16 @@ +#include <errno.h> #include "dietfeatures.h" -#ifdef WANT_LARGEFILE_BACKCOMPAT #include <sys/stat.h> #ifndef __NO_STAT64 -#include <errno.h> #include <unistd.h> loff_t lseek64(int fildes, loff_t offset, int whence) { loff_t tmp; - if (llseek(fildes,offset>>32,offset&0xffffffff,&tmp,whence)) { -#ifdef WANT_THREAD_SAFE - if (*__errno_location()!=ENOSYS) return -1; -#else + if (llseek(fildes,(unsigned long)(offset>>32),(unsigned long)offset&0xffffffff,&tmp,whence)) { if (errno!=ENOSYS) return -1; -#endif return (loff_t)lseek(fildes,(off_t)offset,whence); } return tmp; } #endif -#endif diff --git a/mdk-stage1/dietlibc/lib/memccpy.c b/mdk-stage1/dietlibc/lib/memccpy.c index 6d6ac98ab..3208cfabb 100644 --- a/mdk-stage1/dietlibc/lib/memccpy.c +++ b/mdk-stage1/dietlibc/lib/memccpy.c @@ -1,6 +1,7 @@ #define _POSIX_SOURCE #define _XOPEN_SOURCE #include <sys/types.h> +#include <string.h> void *memccpy(void *dst, const void *src, int c, size_t count) { diff --git a/mdk-stage1/dietlibc/lib/memchr.c b/mdk-stage1/dietlibc/lib/memchr.c index 93d81328a..ae76bb150 100644 --- a/mdk-stage1/dietlibc/lib/memchr.c +++ b/mdk-stage1/dietlibc/lib/memchr.c @@ -1,9 +1,13 @@ #include <sys/types.h> +#include <string.h> -char *memchr(const char *s, int c, size_t n) { +void* memchr(const void *s, int c, size_t n) { + register const char* t=s; int i; - for (i=n; i; --i) - if (*s++==c) - return (char*)s; + for (i=n; i; --i) { + if (*t==c) + return (char*)t; + ++t; + } return 0; } diff --git a/mdk-stage1/dietlibc/lib/memcmp.c b/mdk-stage1/dietlibc/lib/memcmp.c index c05a46863..4c8f77142 100644 --- a/mdk-stage1/dietlibc/lib/memcmp.c +++ b/mdk-stage1/dietlibc/lib/memcmp.c @@ -1,5 +1,7 @@ #include <sys/types.h> +/* gcc is broken and has a non-SUSv2 compliant internal prototype. + * This causes it to warn about a type mismatch here. Ignore it. */ int memcmp(const void *dst, const void *src, size_t count) { register int r; register const char *d=dst; diff --git a/mdk-stage1/dietlibc/lib/memcpy.c b/mdk-stage1/dietlibc/lib/memcpy.c index 0c688b509..ebfd1e60a 100644 --- a/mdk-stage1/dietlibc/lib/memcpy.c +++ b/mdk-stage1/dietlibc/lib/memcpy.c @@ -1,5 +1,7 @@ #include <sys/types.h> +/* gcc is broken and has a non-SUSv2 compliant internal prototype. + * This causes it to warn about a type mismatch here. Ignore it. */ void* memcpy(void* dst, const void* src, size_t count) { register char *d=dst; register const char *s=src; diff --git a/mdk-stage1/dietlibc/lib/memmove.c b/mdk-stage1/dietlibc/lib/memmove.c index 7adb2be91..58414d503 100644 --- a/mdk-stage1/dietlibc/lib/memmove.c +++ b/mdk-stage1/dietlibc/lib/memmove.c @@ -1,6 +1,7 @@ #define _POSIX_SOURCE #define _XOPEN_SOURCE #include <sys/types.h> +#include <string.h> void *memmove(void *dst, const void *src, size_t count) { diff --git a/mdk-stage1/dietlibc/lib/memset.c b/mdk-stage1/dietlibc/lib/memset.c index 5f9ae49ee..a019eca44 100644 --- a/mdk-stage1/dietlibc/lib/memset.c +++ b/mdk-stage1/dietlibc/lib/memset.c @@ -1,6 +1,8 @@ #include <sys/types.h> -void * memset(void * dst, int s, size_t count) { +/* gcc is broken and has a non-SUSv2 compliant internal prototype. + * This causes it to warn about a type mismatch here. Ignore it. */ +void* memset(void * dst, int s, size_t count) { register char * a = dst; count++; /* this actually creates smaller code than using count-- */ while (--count) diff --git a/mdk-stage1/dietlibc/lib/mkfifo.c b/mdk-stage1/dietlibc/lib/mkfifo.c index 596efbe27..1bd132e65 100644 --- a/mdk-stage1/dietlibc/lib/mkfifo.c +++ b/mdk-stage1/dietlibc/lib/mkfifo.c @@ -1,6 +1,6 @@ -#include <linux/stat.h> +#include <sys/stat.h> #include <unistd.h> int mkfifo(const char *fn,mode_t mode) { - return mknod(fn,S_IFIFO|mode,0); + return mknod(fn,(mode_t)(mode|S_IFIFO),0); } diff --git a/mdk-stage1/dietlibc/lib/msgctl.c b/mdk-stage1/dietlibc/lib/msgctl.c index 19ea6d8cf..51cffdef0 100644 --- a/mdk-stage1/dietlibc/lib/msgctl.c +++ b/mdk-stage1/dietlibc/lib/msgctl.c @@ -1,9 +1,8 @@ #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> -#include <asm/ipc.h> -extern int __ipc(); +extern int __ipc(int,int,int,int,void*); int msgctl(int msqid, int cmd, struct msqid_ds *buf) { return __ipc(MSGCTL,msqid,cmd,0,buf); diff --git a/mdk-stage1/dietlibc/lib/msgget.c b/mdk-stage1/dietlibc/lib/msgget.c index 9bca09ebe..6023c1786 100644 --- a/mdk-stage1/dietlibc/lib/msgget.c +++ b/mdk-stage1/dietlibc/lib/msgget.c @@ -1,9 +1,8 @@ #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> -#include <asm/ipc.h> -extern int __ipc(); +extern int __ipc(int,key_t,int,int,int); int msgget(key_t key,int flag) { return __ipc(MSGGET,key,flag,0,0); diff --git a/mdk-stage1/dietlibc/lib/msgrcv.c b/mdk-stage1/dietlibc/lib/msgrcv.c index b4ae9cc6c..8168187a5 100644 --- a/mdk-stage1/dietlibc/lib/msgrcv.c +++ b/mdk-stage1/dietlibc/lib/msgrcv.c @@ -1,9 +1,13 @@ #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> -#include <asm/ipc.h> -extern int __ipc(); +extern int __ipc(int,int,size_t,int,void*); + +struct ipc_kludge { + struct msgbuf *msgp; + long msgtyp; +}; int msgrcv(int msqid, void *msgp, size_t msgsz, long int msgtyp, int msgflg) { struct ipc_kludge tmp; diff --git a/mdk-stage1/dietlibc/lib/msgsnd.c b/mdk-stage1/dietlibc/lib/msgsnd.c index 6203053f0..6e9ef445e 100644 --- a/mdk-stage1/dietlibc/lib/msgsnd.c +++ b/mdk-stage1/dietlibc/lib/msgsnd.c @@ -1,9 +1,8 @@ #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> -#include <asm/ipc.h> -extern int __ipc(); +extern int __ipc(int,int,size_t,int,const void*); int msgsnd (int msqid, const void *msgp, size_t msgsz, int msgflg) { return __ipc(MSGSND,msqid, msgsz, msgflg, msgp); diff --git a/mdk-stage1/dietlibc/lib/open64.c b/mdk-stage1/dietlibc/lib/open64.c index f1499d017..2599e2259 100644 --- a/mdk-stage1/dietlibc/lib/open64.c +++ b/mdk-stage1/dietlibc/lib/open64.c @@ -1,14 +1,13 @@ -#include <linux/types.h> -#include <linux/fcntl.h> +#include <sys/types.h> +#include <fcntl.h> #ifndef O_LARGEFILE #define O_LARGEFILE 0 #endif -extern int open(const char* file,int oflag,int mode); - +int __libc_open64(const char* file,int oflag,int mode); int __libc_open64(const char* file,int oflag,int mode) { return open(file,oflag|O_LARGEFILE,mode); } -int open64(const char* file,int oflag,int mode) __attribute__((weak,alias("__libc_open64"))); +int open64(const char* file,int oflag,...) __attribute__((weak,alias("__libc_open64"))); diff --git a/mdk-stage1/dietlibc/lib/opendir.c b/mdk-stage1/dietlibc/lib/opendir.c index 5c0c4a305..2530d1ac9 100644 --- a/mdk-stage1/dietlibc/lib/opendir.c +++ b/mdk-stage1/dietlibc/lib/opendir.c @@ -1,18 +1,26 @@ #include "dietdirent.h" +#include <sys/mman.h> #include <unistd.h> #include <dirent.h> #include <stdlib.h> #include <fcntl.h> -DIR *opendir (const char *name) { - DIR *t=(DIR*)malloc(sizeof(DIR)); - if (t) { - if ((t->fd=open(name,O_RDONLY|O_DIRECTORY))>=0) { - t->num=t->cur=0; - } else { - free(t); - t=0; - } +DIR* opendir ( const char* name ) { + int fd = open (name, O_RDONLY | O_DIRECTORY); + DIR* t = NULL; + + if ( fd >= 0 ) { + if (fcntl (fd, F_SETFD, FD_CLOEXEC) < 0) + goto lose; + t = (DIR *) mmap (NULL, PAGE_SIZE, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + if (t == MAP_FAILED) +lose: + close (fd); + else + t->fd = fd; } + + return t; } diff --git a/mdk-stage1/dietlibc/lib/perror.c b/mdk-stage1/dietlibc/lib/perror.c index ecab7250b..0a45fb9d6 100644 --- a/mdk-stage1/dietlibc/lib/perror.c +++ b/mdk-stage1/dietlibc/lib/perror.c @@ -1,22 +1,24 @@ #include "dietfeatures.h" #include <unistd.h> #include <string.h> +#include <stdio.h> + +#define _BSD_SOURCE #include <errno.h> -extern char *sys_errlist[]; -extern int sys_nerr; -extern int errno; +extern const char __sys_err_unknown []; + +void perror ( const char* prepend ) +{ + register const char* message = __sys_err_unknown; + + if ( (unsigned int) errno < (unsigned int) __SYS_NERR ) + message = sys_errlist [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) -#ifdef WANT_THREAD_SAFE - message=sys_errlist[*__errno_location()]; -#else - message=sys_errlist[errno]; -#endif - write(2,message,strlen(message)); - write(2,"\n",1); + if (prepend) { + write ( 2, prepend, strlen(prepend) ); + write ( 2, ": ", 2 ); + } + 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 index b922aa93e..fd6c49149 100644 --- a/mdk-stage1/dietlibc/lib/pread.c +++ b/mdk-stage1/dietlibc/lib/pread.c @@ -3,6 +3,7 @@ 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); size_t __libc_pread(int fd, void *buf, size_t count, off_t offset) { return __pread(fd,buf,count,offset,0); } diff --git a/mdk-stage1/dietlibc/lib/pread64.c b/mdk-stage1/dietlibc/lib/pread64.c index e6ba4d103..6dc93cefa 100644 --- a/mdk-stage1/dietlibc/lib/pread64.c +++ b/mdk-stage1/dietlibc/lib/pread64.c @@ -5,8 +5,9 @@ #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); 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)); + return __pread(fd,buf,count,__LONG_LONG_PAIR ((off_t)(offset&0xffffffff),(off_t)(offset>>32))); } int pread64(int fd, void *buf, size_t count, off_t offset) __attribute__((weak,alias("__libc_pread64"))); diff --git a/mdk-stage1/dietlibc/lib/putenv.c b/mdk-stage1/dietlibc/lib/putenv.c index 274b16b0e..448d59840 100644 --- a/mdk-stage1/dietlibc/lib/putenv.c +++ b/mdk-stage1/dietlibc/lib/putenv.c @@ -1,21 +1,24 @@ #include <stdlib.h> #include <string.h> +#include <errno.h> int putenv(const char *string) { - int len; + size_t len; int envc; + int remove=0; char *tmp; const char **ep; char **newenv; - static char **origenv=0; + static char **origenv; if (!origenv) origenv=environ; - if (!(tmp=strchr(string,'='))) + if (!(tmp=strchr(string,'='))) { len=strlen(string); - else + remove=1; + } else len=tmp-string+1; for (envc=0, ep=(const char**)environ; *ep; ++ep) { - if (!memcmp(string,*ep,len)) { /* found */ - if (!tmp) { + if (*string == **ep && !memcmp(string,*ep,len)) { + if (remove) { for (; ep[1]; ++ep) ep[0]=ep[1]; ep[0]=0; return 0; @@ -26,11 +29,11 @@ int putenv(const char *string) { ++envc; } if (tmp) { - newenv=(char**)malloc((envc+2)*sizeof(char*)); + newenv = (char**) realloc(environ==origenv?0:origenv, + (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/qsort.c b/mdk-stage1/dietlibc/lib/qsort.c index 2a8824bf3..62217e142 100644 --- a/mdk-stage1/dietlibc/lib/qsort.c +++ b/mdk-stage1/dietlibc/lib/qsort.c @@ -1,3 +1,4 @@ +#include <sys/cdefs.h> #include <stdlib.h> #include <assert.h> @@ -19,7 +20,7 @@ static inline void iswap(void *a,void *b,size_t size) { } static inline void swap(void *base,size_t size,size_t a,size_t b) { - iswap(base+a*size,base+b*size,size); + iswap((char*)base+a*size,(char*)base+b*size,size); } #if 0 @@ -30,18 +31,19 @@ void dumparray() { } #endif +void isort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)); void isort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)) { - int i; - while (nmemb>1) { + size_t i; + while (expect(nmemb>1,1)) { char *min=base; char *tmp=min+size; for (i=1; i<nmemb; ++i) { - if (compar(tmp,min)<0) + if (expect(compar(tmp,min)<0,0)) min=tmp; tmp+=size; } iswap(min,base,size); - base+=size; + (char*)base+=size; nmemb-=1; } } @@ -55,7 +57,7 @@ void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, co static int level=0; char* v; /* pivot */ char* mid, *max, *min; - int lmemb; + size_t lmemb; #if 0 int left,right; @@ -71,8 +73,8 @@ void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, co return isort(base,nmemb,size,compar); } { - mid=base+(nmemb/2)*size; - max=base+(nmemb-1)*size; + mid=(char*)base+(nmemb/2)*size; + max=(char*)base+(nmemb-1)*size; if (compar(base,max)<0) /* a[left] < a[right] */ if (compar(base,mid)<0) /* a[left] < a[med] */ @@ -97,8 +99,8 @@ void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, co v=max; min=base; lmemb=0; for (;;) { - while (compar(min,v)<0) { min+=size; ++lmemb; } - while (compar(max-=size,v)>0) ; + while (expect(compar(min,v)<0,1)) { min+=size; ++lmemb; } + while (expect(compar(max-=size,v)>0,1)) ; if (min>=max) break; iswap(min,max,size); } diff --git a/mdk-stage1/dietlibc/lib/raise.c b/mdk-stage1/dietlibc/lib/raise.c index 606546034..0f548fc3b 100644 --- a/mdk-stage1/dietlibc/lib/raise.c +++ b/mdk-stage1/dietlibc/lib/raise.c @@ -1,7 +1,6 @@ -#include <linux/types.h> +#include <sys/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/rand.c b/mdk-stage1/dietlibc/lib/rand.c index 10bfaf94d..beb2d2717 100644 --- a/mdk-stage1/dietlibc/lib/rand.c +++ b/mdk-stage1/dietlibc/lib/rand.c @@ -2,8 +2,11 @@ static unsigned int seed=1; -int rand() { - return ((seed = seed * 1103515245 + 12345) % ((unsigned int)RAND_MAX + 1)); +int rand(void) { + return rand_r(&seed); } void srand(unsigned int i) { seed=i; } + +int random(void) __attribute__((alias("rand"))); +void srandom(unsigned int i) __attribute__((alias("srand"))); diff --git a/mdk-stage1/dietlibc/lib/readdir.c b/mdk-stage1/dietlibc/lib/readdir.c index 689f5d08b..ed885a5f0 100644 --- a/mdk-stage1/dietlibc/lib/readdir.c +++ b/mdk-stage1/dietlibc/lib/readdir.c @@ -5,7 +5,7 @@ struct dirent* readdir(DIR *d) { if (!d->num || (d->cur += ((struct dirent*)(d->buf+d->cur))->d_reclen)>=d->num) { - int res=getdents(d->fd,(struct dirent*)d->buf,1023); + int res=getdents(d->fd,(struct dirent*)d->buf,sizeof (d->buf)-1); if (res<=0) return 0; d->num=res; d->cur=0; } diff --git a/mdk-stage1/dietlibc/lib/reboot.c b/mdk-stage1/dietlibc/lib/reboot.c index 7f47a95dd..421068504 100644 --- a/mdk-stage1/dietlibc/lib/reboot.c +++ b/mdk-stage1/dietlibc/lib/reboot.c @@ -1,8 +1,8 @@ #include <sys/reboot.h> -int __reboot(int magic1, int magic2, int cmd, void * arg); +int __reboot(unsigned int magic1, unsigned int magic2, int cmd); -int reboot(int cmd, void *arg) +int reboot(int cmd) { - return __reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, cmd, arg); + return __reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, cmd); } diff --git a/mdk-stage1/dietlibc/lib/recv.c b/mdk-stage1/dietlibc/lib/recv.c index bc6b1e5d7..c6bab4fb1 100644 --- a/mdk-stage1/dietlibc/lib/recv.c +++ b/mdk-stage1/dietlibc/lib/recv.c @@ -1,14 +1,12 @@ -#include <linux/net.h> +#include <sys/types.h> +#include <linuxnet.h> extern int socketcall(int callno,long* args); +int __libc_recv(int a, const void * b, size_t c, int flags); int __libc_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 } int recv(int a, const void * b, size_t c, int flags) diff --git a/mdk-stage1/dietlibc/lib/recvfrom.c b/mdk-stage1/dietlibc/lib/recvfrom.c index 802ad665f..b66ce3813 100644 --- a/mdk-stage1/dietlibc/lib/recvfrom.c +++ b/mdk-stage1/dietlibc/lib/recvfrom.c @@ -1,14 +1,12 @@ -#include <linux/net.h> +#include <sys/types.h> +#include <linuxnet.h> extern int socketcall(int callno,long* args); +int __libc_recvfrom(int a, const void * b, size_t c, int flags, void *to, void *tolen); int __libc_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 } int recvfrom(int a, const void * b, size_t c, int flags, void *to, void *tolen) diff --git a/mdk-stage1/dietlibc/lib/recvmsg.c b/mdk-stage1/dietlibc/lib/recvmsg.c index c14c58c78..d843ce9c0 100644 --- a/mdk-stage1/dietlibc/lib/recvmsg.c +++ b/mdk-stage1/dietlibc/lib/recvmsg.c @@ -1,14 +1,12 @@ -#include <linux/net.h> +#include <sys/socket.h> +#include <linuxnet.h> extern int socketcall(int callno,long* args); +int __libc_recvmsg(int a, struct msghdr* msg, int flags); int __libc_recvmsg(int a, struct msghdr* msg, int flags) { -#ifdef __i386__ - return socketcall(SYS_RECVMSG, (long*)&a); -#else unsigned long args[] = { a, (long) msg, flags }; return socketcall(SYS_RECVMSG, args); -#endif } int recvmsg(int a, struct msghdr *msg, int flags) diff --git a/mdk-stage1/dietlibc/lib/remove.c b/mdk-stage1/dietlibc/lib/remove.c index d5125bfed..06f686356 100644 --- a/mdk-stage1/dietlibc/lib/remove.c +++ b/mdk-stage1/dietlibc/lib/remove.c @@ -1,5 +1,7 @@ #include <unistd.h> #include <errno.h> +#include "dietfeatures.h" +#include <stdio.h> int remove(const char* filename) { if (unlink(filename)) { diff --git a/mdk-stage1/dietlibc/lib/sbrk.c b/mdk-stage1/dietlibc/lib/sbrk.c index 945ad5a16..799ce7428 100644 --- a/mdk-stage1/dietlibc/lib/sbrk.c +++ b/mdk-stage1/dietlibc/lib/sbrk.c @@ -1,20 +1,21 @@ #include <unistd.h> -extern int __brk(void *end_data_segment); +extern int __libc_brk(void *end_data_segment); extern void* __curbrk; -void* __sbrk(ptrdiff_t increment) { +void* __libc_sbrk(ptrdiff_t increment); +void* __libc_sbrk(ptrdiff_t increment) { void* oldbrk; if (__curbrk==0) - if (__brk(0) < 0) + if (__libc_brk(0) < 0) return (void*)-1; if (increment==0) return __curbrk; oldbrk=__curbrk; - if (__brk(oldbrk+increment)<0) + if (__libc_brk((char*)oldbrk+increment)<0) return (void*)-1; return oldbrk; } -void* sbrk (ptrdiff_t increment) __attribute__((weak,alias("__sbrk"))); +void* sbrk (ptrdiff_t increment) __attribute__((weak,alias("__libc_sbrk"))); diff --git a/mdk-stage1/dietlibc/lib/semctl.c b/mdk-stage1/dietlibc/lib/semctl.c index ddc0aae95..cec0b7535 100644 --- a/mdk-stage1/dietlibc/lib/semctl.c +++ b/mdk-stage1/dietlibc/lib/semctl.c @@ -1,10 +1,17 @@ #include <sys/types.h> #include <sys/ipc.h> -#include <sys/sem.h> -#include <asm/ipc.h> -extern int __ipc(); +extern int __ipc(int,int,int,int,void*); +union semun { + int val; /* value for SETVAL */ + struct semid_ds *buf; /* buffer for IPC_STAT & IPC_SET */ + unsigned short *array; /* array for GETALL & SETALL */ + struct seminfo *__buf; /* buffer for IPC_INFO */ + void *__pad; +}; + +int semctl(int semid, int semnum, int cmd, union semun arg); int semctl(int semid, int semnum, int cmd, union semun arg) { return __ipc(SEMCTL,semid,semnum,cmd,&arg); } diff --git a/mdk-stage1/dietlibc/lib/semget.c b/mdk-stage1/dietlibc/lib/semget.c index 056aeae04..c3649eea1 100644 --- a/mdk-stage1/dietlibc/lib/semget.c +++ b/mdk-stage1/dietlibc/lib/semget.c @@ -1,9 +1,8 @@ #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> -#include <asm/ipc.h> -extern int __ipc(); +extern int __ipc(int,key_t,int,int,int); int semget(key_t key, int nsems, int semflg) { return __ipc(SEMGET,key,nsems,semflg,0); diff --git a/mdk-stage1/dietlibc/lib/semop.c b/mdk-stage1/dietlibc/lib/semop.c index abfde73a7..4d2e748cc 100644 --- a/mdk-stage1/dietlibc/lib/semop.c +++ b/mdk-stage1/dietlibc/lib/semop.c @@ -1,9 +1,8 @@ #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> -#include <asm/ipc.h> -extern int __ipc(); +extern int __ipc(int,int,unsigned,int,void*); int semop(int semid,struct sembuf *sops,unsigned nsops) { return __ipc(SEMOP,semid,nsops,0,sops); diff --git a/mdk-stage1/dietlibc/lib/send.c b/mdk-stage1/dietlibc/lib/send.c index c1adf1b5d..783ecaf89 100644 --- a/mdk-stage1/dietlibc/lib/send.c +++ b/mdk-stage1/dietlibc/lib/send.c @@ -1,14 +1,12 @@ -#include <linux/net.h> +#include <sys/types.h> +#include <linuxnet.h> extern int socketcall(int callno,long* args); +int __libc_send(int a, const void * b, size_t c, int flags); int __libc_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 } int send(int a, const void * b, size_t c, int flags) diff --git a/mdk-stage1/dietlibc/lib/sendmsg.c b/mdk-stage1/dietlibc/lib/sendmsg.c index 277265985..bb5d1711a 100644 --- a/mdk-stage1/dietlibc/lib/sendmsg.c +++ b/mdk-stage1/dietlibc/lib/sendmsg.c @@ -1,14 +1,12 @@ -#include <linux/net.h> +#include <sys/socket.h> +#include <linuxnet.h> extern int socketcall(int callno,long* args); +int __libc_sendmsg(int a, const struct msghdr* msg, int flags); int __libc_sendmsg(int a, const struct msghdr* msg, int flags) { -#ifdef __i386__ - return socketcall(SYS_SENDMSG, (long*)&a); -#else unsigned long args[] = { a, (long) msg, flags }; return socketcall(SYS_SENDMSG, args); -#endif } int sendmsg(int a, const struct msghdr *msg, int flags) diff --git a/mdk-stage1/dietlibc/lib/sendto.c b/mdk-stage1/dietlibc/lib/sendto.c index 078c010ea..d3239932b 100644 --- a/mdk-stage1/dietlibc/lib/sendto.c +++ b/mdk-stage1/dietlibc/lib/sendto.c @@ -1,15 +1,13 @@ -#include <linux/net.h> +#include <sys/socket.h> +#include <linuxnet.h> extern int socketcall(int callno,long* args); +int __libc_sendto(int a, const void * b, size_t c, int flags, void *to, int tolen); int __libc_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 } -int sendto(int a, const void * b, size_t c, int flags, void *to, int tolen) +int sendto(int a, const void * b, size_t c, int flags, const struct sockaddr* to, socklen_t tolen) __attribute__ ((weak, alias("__libc_sendto"))); diff --git a/mdk-stage1/dietlibc/lib/setsockopt.c b/mdk-stage1/dietlibc/lib/setsockopt.c index 781e9c31c..e4bab349f 100644 --- a/mdk-stage1/dietlibc/lib/setsockopt.c +++ b/mdk-stage1/dietlibc/lib/setsockopt.c @@ -1,13 +1,12 @@ -#include <linux/net.h> +#include <linuxnet.h> +#include <sys/socket.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 +int __libc_setsockopt(int a, int b, int c, void *d, void *e); +int __libc_setsockopt(int a, int b, int c, void *d, void *e) { unsigned long args[] = { a, b, c, (long)d, (long) e }; return socketcall(SYS_SETSOCKOPT, args); -#endif } +int setsockopt(int s, int level, int optname, const void* optval, socklen_t optlen) __attribute__((weak,alias("__libc_setsockopt"))); diff --git a/mdk-stage1/dietlibc/lib/shmat.c b/mdk-stage1/dietlibc/lib/shmat.c index 63284b1ea..d4b34c120 100644 --- a/mdk-stage1/dietlibc/lib/shmat.c +++ b/mdk-stage1/dietlibc/lib/shmat.c @@ -1,15 +1,14 @@ #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> -#include <asm/ipc.h> -extern void* __ipc(); +extern void* __ipc(int,int,int,void*,const void*); void* shmat(int shmid,const void* shmaddr,int shmflg) { void* raddr; register void* result; result=__ipc(SHMAT,shmid,shmflg,&raddr,shmaddr); - if ((unsigned long)result <= -(unsigned long)SHMLBA) + if ((unsigned long)result <= -(unsigned long)8196) result=raddr; return result; } diff --git a/mdk-stage1/dietlibc/lib/shmctl.c b/mdk-stage1/dietlibc/lib/shmctl.c index 8f942f2a4..92b9d1fbb 100644 --- a/mdk-stage1/dietlibc/lib/shmctl.c +++ b/mdk-stage1/dietlibc/lib/shmctl.c @@ -1,9 +1,8 @@ #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> -#include <asm/ipc.h> -extern int __ipc(); +extern int __ipc(int,int,int,int,void*); int shmctl(int shmid, int cmd, struct shmid_ds *buf) { return __ipc(SHMCTL,shmid,cmd,0,buf); diff --git a/mdk-stage1/dietlibc/lib/shmdt.c b/mdk-stage1/dietlibc/lib/shmdt.c index 36db10f08..54dc6f41b 100644 --- a/mdk-stage1/dietlibc/lib/shmdt.c +++ b/mdk-stage1/dietlibc/lib/shmdt.c @@ -1,9 +1,8 @@ #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> -#include <asm/ipc.h> -extern int __ipc(); +extern int __ipc(int,int,int,int,const void*); int shmdt(const void* shmaddr) { return __ipc(SHMDT,0,0,0,shmaddr); diff --git a/mdk-stage1/dietlibc/lib/shmget.c b/mdk-stage1/dietlibc/lib/shmget.c index 9b03f5deb..bf1dc2030 100644 --- a/mdk-stage1/dietlibc/lib/shmget.c +++ b/mdk-stage1/dietlibc/lib/shmget.c @@ -1,9 +1,8 @@ #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> -#include <asm/ipc.h> -extern int __ipc(); +extern int __ipc(int,key_t,int,int,int); int shmget(key_t key, int size, int shmflg) { return __ipc(SHMGET,key,size,shmflg,0); diff --git a/mdk-stage1/dietlibc/lib/shutdown.c b/mdk-stage1/dietlibc/lib/shutdown.c index 0a6be6c37..0e7b8755c 100644 --- a/mdk-stage1/dietlibc/lib/shutdown.c +++ b/mdk-stage1/dietlibc/lib/shutdown.c @@ -1,14 +1,12 @@ -#include <linux/net.h> +#include <linuxnet.h> +#include <sys/socket.h> extern int socketcall(int callno,long* args); +int __libc_shutdown(int s, int how); int __libc_shutdown(int s, int how) { -#ifdef __i386__ - return socketcall(SYS_SHUTDOWN, (long*)&s); -#else unsigned long args[] = { s, (long) how, 0 }; return socketcall(SYS_SHUTDOWN, args); -#endif } int shutdown(int s, int how) __attribute__((weak,alias("__libc_shutdown"))); diff --git a/mdk-stage1/dietlibc/lib/sigaddset.c b/mdk-stage1/dietlibc/lib/sigaddset.c index 8ce69ea77..1c2632e67 100644 --- a/mdk-stage1/dietlibc/lib/sigaddset.c +++ b/mdk-stage1/dietlibc/lib/sigaddset.c @@ -1,15 +1,17 @@ -#define __KERNEL__ -#define sigaddset foobar -#include <asm/signal.h> -#undef sigaddset +#include <signal.h> +#include <errno.h> -int __sigaddset(sigset_t *set, int signo) { - unsigned long sig = signo - 1; - if (_NSIG_WORDS == 1) - set->sig[0] |= 1UL << sig; - else - set->sig[sig / _NSIG_BPW] |= 1UL << (sig % _NSIG_BPW); - return 0; -} +#define __sigmask(sig) ( ((unsigned long)1) << (((sig)-1) % (8*sizeof(unsigned long))) ) +#define __sigword(sig) ( ((sig)-1) / (8*sizeof(unsigned long)) ) -int sigaddset (sigset_t *env, int signo) __attribute__((weak,alias("__sigaddset"))); +int sigaddset(sigset_t *set, int signo) { + if ((signo<1)||(signo>SIGRTMAX)) { + (*__errno_location())=EINVAL; + return -1; + } else { + unsigned long __mask = __sigmask (signo); + unsigned long __word = __sigword (signo); + set->sig[__word]|=__mask; + return 0; + } +} diff --git a/mdk-stage1/dietlibc/lib/sigdelset.c b/mdk-stage1/dietlibc/lib/sigdelset.c index 2c3385ea8..0c47ce348 100644 --- a/mdk-stage1/dietlibc/lib/sigdelset.c +++ b/mdk-stage1/dietlibc/lib/sigdelset.c @@ -1,15 +1,17 @@ -#define __KERNEL__ -#define sigdelset foobar -#include <asm/signal.h> -#undef sigdelset +#include <signal.h> +#include <errno.h> -int __sigdelset(sigset_t *set, int signo) { - unsigned long sig = signo - 1; - if (_NSIG_WORDS == 1) - set->sig[0] &= ~(1UL << sig); - else - set->sig[sig / _NSIG_BPW] &= ~(1UL << (sig % _NSIG_BPW)); - return 0; -} +#define __sigmask(sig) ( ((unsigned long)1) << (((sig)-1) % (8*sizeof(unsigned long))) ) +#define __sigword(sig) ( ((sig)-1) / (8*sizeof(unsigned long)) ) -int sigdelset (sigset_t *env, int signo) __attribute__((weak,alias("__sigdelset"))); +int sigdelset(sigset_t *set, int signo) { + if ((signo<1)||(signo>SIGRTMAX)) { + (*__errno_location())=EINVAL; + return -1; + } else { + unsigned long __mask = __sigmask (signo); + unsigned long __word = __sigword (signo); + set->sig[__word]&=~__mask; + return 0; + } +} diff --git a/mdk-stage1/dietlibc/lib/sigemptyset.c b/mdk-stage1/dietlibc/lib/sigemptyset.c index f4532f96e..4efee2550 100644 --- a/mdk-stage1/dietlibc/lib/sigemptyset.c +++ b/mdk-stage1/dietlibc/lib/sigemptyset.c @@ -1,14 +1,12 @@ -#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; + set->sig[0]=0; + if (_NSIG_WORDS>1) set->sig[1]=0; + if (_NSIG_WORDS>2) { + set->sig[2]=0; + set->sig[3]=0; } - memset(set,0,sizeof(*set)); return 0; } diff --git a/mdk-stage1/dietlibc/lib/sigfillset.c b/mdk-stage1/dietlibc/lib/sigfillset.c index ddac6e391..b4e369fe4 100644 --- a/mdk-stage1/dietlibc/lib/sigfillset.c +++ b/mdk-stage1/dietlibc/lib/sigfillset.c @@ -1,11 +1,11 @@ -#define __KERNEL__ -#include <asm/signal.h> +#include <signal.h> -int __sigfillset (sigset_t *set) { - int i; - for (i=0; i<_NSIG_WORDS; i++) - set->sig[i]=~0; +int sigfillset(sigset_t *set) { + set->sig[0]=(unsigned long)-1; + if (_NSIG_WORDS>1) set->sig[1]=(unsigned long)-1; + if (_NSIG_WORDS>2) { + set->sig[2]=(unsigned long)-1; + set->sig[3]=(unsigned long)-1; + } return 0; } - -int sigfillset(sigset_t *env) __attribute__((weak,alias("__sigfillset"))); diff --git a/mdk-stage1/dietlibc/lib/sigismember.c b/mdk-stage1/dietlibc/lib/sigismember.c index 67a258884..8ffe9762a 100644 --- a/mdk-stage1/dietlibc/lib/sigismember.c +++ b/mdk-stage1/dietlibc/lib/sigismember.c @@ -1,21 +1,16 @@ -#define __USE_EXTERN_INLINES 1 #include <signal.h> +#include <errno.h> -# define __sigmask(sig) \ - (((unsigned long int) 1) << (((sig) - 1) % (8 * sizeof (unsigned long int)))) +#define __sigmask(sig) ( ((unsigned long)1) << (((sig)-1) % (8*sizeof(unsigned long))) ) +#define __sigword(sig) ( ((sig)-1) / (8*sizeof(unsigned long)) ) -# 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 __sigismember(const __sigset_t *set, int signo) { - unsigned long int __mask = __sigmask (signo); - unsigned long int __word = __sigword (signo); - return (set->__val[__word] & __mask); +int sigismember(const sigset_t *set, int signo) { + if ((signo<1)||(signo>SIGRTMAX)) { + (*__errno_location())=EINVAL; + return -1; + } else { + unsigned long __mask = __sigmask (signo); + unsigned long __word = __sigword (signo); + return (set->sig[__word] & __mask)?1:0; + } } - -int sigismember(const sigset_t *env, int signo) __attribute__((weak,alias("__sigismember"))); diff --git a/mdk-stage1/dietlibc/lib/sigjmp.c b/mdk-stage1/dietlibc/lib/sigjmp.c index be97c62cc..73c8baa8e 100644 --- a/mdk-stage1/dietlibc/lib/sigjmp.c +++ b/mdk-stage1/dietlibc/lib/sigjmp.c @@ -1,35 +1,10 @@ -/* 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 <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); +int __sigjmp_save(sigjmp_buf env,int savemask); +int __sigjmp_save(sigjmp_buf env,int savemask) { + if (savemask) { + env[0].__mask_was_saved=(sigprocmask(SIG_BLOCK,(sigset_t*)0,(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 index ec5b99533..45c51f1b6 100644 --- a/mdk-stage1/dietlibc/lib/sleep.c +++ b/mdk-stage1/dietlibc/lib/sleep.c @@ -1,4 +1,4 @@ -#include <linux/time.h> +#include <unistd.h> #include <time.h> unsigned int sleep(unsigned int secs) { diff --git a/mdk-stage1/dietlibc/lib/snprintf.c b/mdk-stage1/dietlibc/lib/snprintf.c index 096c06115..141b4ec13 100644 --- a/mdk-stage1/dietlibc/lib/snprintf.c +++ b/mdk-stage1/dietlibc/lib/snprintf.c @@ -1,7 +1,6 @@ #include <stdarg.h> #include <sys/types.h> - -int vsnprintf (char *str,size_t size,const char *format, va_list arg_ptr); +#include <stdio.h> int snprintf(char *str,size_t size,const char *format,...) { diff --git a/mdk-stage1/dietlibc/lib/socket.c b/mdk-stage1/dietlibc/lib/socket.c index 1684a6a2b..c18df5123 100644 --- a/mdk-stage1/dietlibc/lib/socket.c +++ b/mdk-stage1/dietlibc/lib/socket.c @@ -1,12 +1,11 @@ -#include <linux/net.h> +#include <linuxnet.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 +int __libc_socket(int a, int b, int c); +int __libc_socket(int a, int b, int c) { unsigned long args[] = { a, b, c }; return socketcall(SYS_SOCKET, args); -#endif } + +int socket(int a,int b,int c) __attribute__((weak,alias("__libc_socket"))); diff --git a/mdk-stage1/dietlibc/lib/sprintf.c b/mdk-stage1/dietlibc/lib/sprintf.c index b355d01f9..37fd831d9 100644 --- a/mdk-stage1/dietlibc/lib/sprintf.c +++ b/mdk-stage1/dietlibc/lib/sprintf.c @@ -1,18 +1,14 @@ #include <stdarg.h> -#include <linux/types.h> +#include <sys/types.h> #include <stdlib.h> -#include "dietwarning.h" - -int vsnprintf (char *str,size_t size,const char *format, va_list arg_ptr); +#include <stdio.h> 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); + n=vsprintf(dest,format,arg_ptr); va_end (arg_ptr); return n; } - -link_warning("sprintf","warning: Avoid sprintf; use snprintf. It is more secure and faster.") diff --git a/mdk-stage1/dietlibc/lib/sscanf.c b/mdk-stage1/dietlibc/lib/sscanf.c index 341e74bba..e608878ef 100644 --- a/mdk-stage1/dietlibc/lib/sscanf.c +++ b/mdk-stage1/dietlibc/lib/sscanf.c @@ -1,6 +1,5 @@ #include <stdarg.h> - -int vsscanf(const char *str, const char *format, va_list arg_ptr); +#include <stdio.h> int sscanf(const char *str, const char *format, ...) { diff --git a/mdk-stage1/dietlibc/lib/strcasecmp.c b/mdk-stage1/dietlibc/lib/strcasecmp.c index d978488a4..cf1592567 100644 --- a/mdk-stage1/dietlibc/lib/strcasecmp.c +++ b/mdk-stage1/dietlibc/lib/strcasecmp.c @@ -1,17 +1,18 @@ -#include <ctype.h> -#include "dietfeatures.h" +#include <strings.h> -int strcasecmp(register const char *s,register const char *t) { - register char x; +int strcasecmp ( const char* s1, const char* s2 ) +{ + register unsigned int x2; + register unsigned int x1; - for (;;) { - x = tolower(*s); if (x != tolower(*t)) break; if (!x) break; ++s; ++t; -#ifndef WANT_SMALL_STRING_ROUTINES - x = tolower(*s); if (x != tolower(*t)) break; if (!x) break; ++s; ++t; - x = tolower(*s); if (x != tolower(*t)) break; if (!x) break; ++s; ++t; - x = tolower(*s); if (x != tolower(*t)) break; if (!x) break; ++s; ++t; -#endif - } - return ((int)(unsigned int)(unsigned char) x) - - ((int)(unsigned int)(unsigned char) *t); + while (1) { + x2 = *s2++ - 'A'; if (x2 < 26u) x2 += 32; + x1 = *s1++ - 'A'; if (x1 < 26u) x1 += 32; + if ( x2 != x1 ) + break; + if ( x1 == (unsigned int)-'A' ) + break; + } + + return x1 - x2; } diff --git a/mdk-stage1/dietlibc/lib/strchr.c b/mdk-stage1/dietlibc/lib/strchr.c index 0c2050da6..3a4c9b5b4 100644 --- a/mdk-stage1/dietlibc/lib/strchr.c +++ b/mdk-stage1/dietlibc/lib/strchr.c @@ -1,4 +1,5 @@ #include "dietfeatures.h" +#include <string.h> char *strchr(register const char *t, int c) { register char ch; diff --git a/mdk-stage1/dietlibc/lib/strcmp.c b/mdk-stage1/dietlibc/lib/strcmp.c index 0db324e66..3892379e5 100644 --- a/mdk-stage1/dietlibc/lib/strcmp.c +++ b/mdk-stage1/dietlibc/lib/strcmp.c @@ -14,3 +14,5 @@ int strcmp(register const char *s,register const char *t) { return ((int)(unsigned int)(unsigned char) x) - ((int)(unsigned int)(unsigned char) *t); } + +int strcoll(const char *s,const char* t) __attribute__((weak,alias("strcmp"))); diff --git a/mdk-stage1/dietlibc/lib/strcpy.c b/mdk-stage1/dietlibc/lib/strcpy.c index 49693c30d..444054e71 100644 --- a/mdk-stage1/dietlibc/lib/strcpy.c +++ b/mdk-stage1/dietlibc/lib/strcpy.c @@ -3,13 +3,16 @@ char* strcpy(register char* s,register const char* t) { char *dest=s; +#ifndef WANT_SMALL_STRING_ROUTINES 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 } +#else + while ((*dest++=*t++)); + return s; +#endif } diff --git a/mdk-stage1/dietlibc/lib/strerror.c b/mdk-stage1/dietlibc/lib/strerror.c index f15b86aae..7cb79d988 100644 --- a/mdk-stage1/dietlibc/lib/strerror.c +++ b/mdk-stage1/dietlibc/lib/strerror.c @@ -1,10 +1,20 @@ +#include "dietfeatures.h" +#include <unistd.h> #include <string.h> -extern char *sys_errlist[]; -extern int sys_nerr; +#define _BSD_SOURCE +#include <errno.h> -char *strerror(int errnum) { - if (errnum>=0 && errnum<sys_nerr) - return sys_errlist[errnum]; - return "[unknown error]"; +extern const char __sys_err_unknown[]; + +char*strerror(int errnum) { + register const char*message=__sys_err_unknown; + + if ( (unsigned int)errnum < (unsigned int)__SYS_NERR ) + message=sys_errlist[errnum]; +#if defined(__mips__) + if ( errnum == 1133 ) + message="Quota exceeded"; +#endif + return (char*)message; } diff --git a/mdk-stage1/dietlibc/lib/strlen.c b/mdk-stage1/dietlibc/lib/strlen.c index 56c085dac..96da5a540 100644 --- a/mdk-stage1/dietlibc/lib/strlen.c +++ b/mdk-stage1/dietlibc/lib/strlen.c @@ -4,7 +4,7 @@ #ifdef WANT_SMALL_STRING_ROUTINES size_t strlen(const char *s) { - register int i; + register size_t i; if (!s) return 0; for (i=0; *s; ++s) ++i; return i; diff --git a/mdk-stage1/dietlibc/lib/strncasecmp.c b/mdk-stage1/dietlibc/lib/strncasecmp.c index 8a5445e53..543fe56ba 100644 --- a/mdk-stage1/dietlibc/lib/strncasecmp.c +++ b/mdk-stage1/dietlibc/lib/strncasecmp.c @@ -1,18 +1,22 @@ -#include <ctype.h> #include <sys/types.h> -#include <string.h> +#include <strings.h> -int strncasecmp(const char *s, const char *t, size_t n) { - register char x; - register const char* u=s+n; - for (;;) { - x = tolower(*s); if (x!=tolower(*t)) break; if (!x) break; if (++s>=u) return 0; ++t; -#ifndef WANT_SMALL_STRING_ROUTINES - x = tolower(*s); if (x!=tolower(*t)) break; if (!x) break; if (++s>=u) return 0; ++t; - x = tolower(*s); if (x!=tolower(*t)) break; if (!x) break; if (++s>=u) return 0; ++t; - x = tolower(*s); if (x!=tolower(*t)) break; if (!x) break; if (++s>=u) return 0; ++t; -#endif - } - return ((int)(unsigned int)(unsigned char) x) - - ((int)(unsigned int)(unsigned char) *t); +int strncasecmp ( const char* s1, const char* s2, size_t len ) +{ + register unsigned int x2; + register unsigned int x1; + register const char* end = s1 + len; + + while (1) { + if ( s1 >= end ) + return 0; + x2 = *s2++ - 'A'; if (x2 < 26u) x2 += 32; + x1 = *s1++ - 'A'; if (x1 < 26u) x1 += 32; + if ( x2 != x1 ) + break; + if ( x1 == (unsigned int)-'A' ) + break; + } + + return x1 - x2; } diff --git a/mdk-stage1/dietlibc/lib/strncat.c b/mdk-stage1/dietlibc/lib/strncat.c index a08e97916..9802d5678 100644 --- a/mdk-stage1/dietlibc/lib/strncat.c +++ b/mdk-stage1/dietlibc/lib/strncat.c @@ -9,14 +9,16 @@ * the last written bytes is always '\0'. */ #endif +/* gcc is broken and has a non-SUSv2 compliant internal prototype. + * This causes it to warn about a type mismatch here. Ignore it. */ char *strncat(char *s, const char *t, size_t n) { char *dest=s; register char *max; s+=strlen(s); #ifdef WANT_NON_COMPLIANT_STRNCAT - max=s+n-1; + if ((max=s+n-1)<=s) goto fini; #else - max=s+n; + if ((max=s+n)==s) goto fini; #endif for (;;) { if (!(*s = *t)) break; if (++s==max) break; ++t; @@ -27,5 +29,6 @@ char *strncat(char *s, const char *t, size_t n) { #endif } *s=0; +fini: return dest; } diff --git a/mdk-stage1/dietlibc/lib/strncmp.c b/mdk-stage1/dietlibc/lib/strncmp.c index 7c08c0fa7..b3b56cfbb 100644 --- a/mdk-stage1/dietlibc/lib/strncmp.c +++ b/mdk-stage1/dietlibc/lib/strncmp.c @@ -1,6 +1,17 @@ #include <sys/types.h> #include <string.h> +/* gcc is broken and has a non-SUSv2 compliant internal prototype. + * This causes it to warn about a type mismatch here. Ignore it. */ int strncmp(const char *s1, const char *s2, size_t n) { - return memccmp(s1,s2,0,n); + register const char* a=s1; + register const char* b=s2; + register const char* fini=a+n; + while (a<fini) { + register int res=*a-*b; + if (res) return res; + if (!*a) return 0; + ++a; ++b; + } + return 0; } diff --git a/mdk-stage1/dietlibc/lib/strncpy.c b/mdk-stage1/dietlibc/lib/strncpy.c index 531387b7f..31b682a1e 100644 --- a/mdk-stage1/dietlibc/lib/strncpy.c +++ b/mdk-stage1/dietlibc/lib/strncpy.c @@ -2,9 +2,14 @@ #define _XOPEN_SOURCE #include <sys/types.h> #include <string.h> +#include "dietfeatures.h" -char *strncpy(char *dest, const char *src, size_t n) -{ +/* gcc is broken and has a non-SUSv2 compliant internal prototype. + * This causes it to warn about a type mismatch here. Ignore it. */ +char *strncpy(char *dest, const char *src, size_t n) { +#ifdef WANT_FULL_POSIX_COMPAT + memset(dest,0,n); +#endif memccpy(dest,src,0,n); return dest; } diff --git a/mdk-stage1/dietlibc/lib/strsep.c b/mdk-stage1/dietlibc/lib/strsep.c index a1bf1872a..db76f89b5 100644 --- a/mdk-stage1/dietlibc/lib/strsep.c +++ b/mdk-stage1/dietlibc/lib/strsep.c @@ -4,6 +4,7 @@ char *strsep(char **stringp, const char *delim) { register char *tmp=*stringp; register char *tmp2=tmp; register const char *tmp3; + if (!*stringp) return 0; for (tmp2=tmp; *tmp2; ++tmp2) { for (tmp3=delim; *tmp3; ++tmp3) if (*tmp2==*tmp3) { /* delimiter found */ @@ -12,5 +13,6 @@ char *strsep(char **stringp, const char *delim) { return tmp; } } - return 0; + *stringp=0; + return tmp; } diff --git a/mdk-stage1/dietlibc/lib/strstr.c b/mdk-stage1/dietlibc/lib/strstr.c index 641d9d7ac..0632cc28a 100644 --- a/mdk-stage1/dietlibc/lib/strstr.c +++ b/mdk-stage1/dietlibc/lib/strstr.c @@ -2,12 +2,14 @@ #include <string.h> char *strstr(const char *haystack, const char *needle) { - int nl=strlen(needle); - int hl=strlen(haystack); + size_t nl=strlen(needle); + size_t hl=strlen(haystack); int i; + if (!nl) goto found; if (nl>hl) return 0; for (i=hl-nl+1; i; --i) { - if (!memcmp(haystack,needle,nl)) + if (*haystack==*needle && !memcmp(haystack,needle,nl)) +found: return (char*)haystack; ++haystack; } diff --git a/mdk-stage1/dietlibc/lib/strtod.c b/mdk-stage1/dietlibc/lib/strtod.c index cbe983d84..5d50cc535 100644 --- a/mdk-stage1/dietlibc/lib/strtod.c +++ b/mdk-stage1/dietlibc/lib/strtod.c @@ -1,52 +1,66 @@ #include <string.h> +#include <stdlib.h> +#include <ctype.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; +double strtod(const char* s, char** endptr) { + register const char* p = s; + register long double value = 0.L; + int sign = +1; + long double factor; + unsigned int expo; + + while ( isspace(*p) ) + p++; + + switch (*p) { + case '-': sign = -1; + case '+': p++; + default : break; } - } - if ((*c|32)=='e') { - int exp=0; - double factor=10; - if (c[1]<'0') { - switch (c[1]) { - case '-': factor=0.1; - case '+': c++; break; - default: - d=0; - c=nptr; - goto done; - } + + while ( (unsigned int)(*p - '0') < 10u ) + value = value*10 + (*p++ - '0'); + + if ( *p == '.' ) { + factor = 1.; + + p++; + while ( (unsigned int)(*p - '0') < 10u ) { + factor *= 0.1; + value += (*p++ - '0') * factor; + } } - while (isdigit(*++c)) - exp=exp*10+(*c-'0'); - while (exp) { /* XXX: this introduces rounding errors */ - d*=factor; --exp; + + if ( (*p | 32) == 'e' ) { + expo = 0; + factor = 10.L; + + switch (*++p) { // ja hier weiß ich nicht, was mindestens nach einem 'E' folgenden MUSS. + case '-': factor = 0.1; + case '+': p++; + break; + case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': + break; + default : value = 0.L; + p = s; + goto done; + } + + while ( (unsigned int)(*p - '0') < 10u ) + expo = 10 * expo + (*p++ - '0'); + + while ( 1 ) { + if ( expo & 1 ) + value *= factor; + if ( (expo >>= 1) == 0 ) + break; + factor *= factor; + } } - } + done: - if (endptr) *endptr=(char*)c; - return d; + if ( endptr != NULL ) + *endptr = (char*)p; + + return value * sign; } diff --git a/mdk-stage1/dietlibc/lib/strtok.c b/mdk-stage1/dietlibc/lib/strtok.c index 86337da7b..e041703e3 100644 --- a/mdk-stage1/dietlibc/lib/strtok.c +++ b/mdk-stage1/dietlibc/lib/strtok.c @@ -1,4 +1,4 @@ -char *strtok_r(char *s, const char *delim, char **ptrptr); +#include <string.h> static char *strtok_pos; diff --git a/mdk-stage1/dietlibc/lib/strtol.c b/mdk-stage1/dietlibc/lib/strtol.c index ead89f408..2624aca0e 100644 --- a/mdk-stage1/dietlibc/lib/strtol.c +++ b/mdk-stage1/dietlibc/lib/strtol.c @@ -1,7 +1,10 @@ #include <ctype.h> +#include "dietfeatures.h" +#include <errno.h> +#include <limits.h> +#include <stdlib.h> -extern unsigned long int strtoul(const char *nptr, char **endptr, int base); - +#define ABS_LONG_MIN 2147483648UL long int strtol(const char *nptr, char **endptr, int base) { int neg=0; @@ -9,7 +12,15 @@ long int strtol(const char *nptr, char **endptr, int base) while(isspace(*nptr)) nptr++; - if (*nptr == '-' && isdigit(nptr[1])) { neg=-1; nptr++; } + if (*nptr == '-') { neg=-1; ++nptr; } v=strtoul(nptr,endptr,base); + if (v>=ABS_LONG_MIN) { + if (v==ABS_LONG_MIN && neg) { + errno=0; + return v; + } + errno=ERANGE; + return (neg?LONG_MIN:LONG_MAX); + } return (neg?-v:v); } diff --git a/mdk-stage1/dietlibc/lib/strtoll.c b/mdk-stage1/dietlibc/lib/strtoll.c index 7b8e28a1d..9e05e740e 100644 --- a/mdk-stage1/dietlibc/lib/strtoll.c +++ b/mdk-stage1/dietlibc/lib/strtoll.c @@ -1,8 +1,7 @@ #include <ctype.h> +#include <stdlib.h> -extern unsigned long int strtoull(const char *nptr, char **endptr, int base); - -long int strtoll(const char *nptr, char **endptr, int base) +long long int strtoll(const char *nptr, char **endptr, int base) { int neg=0; unsigned long long int v; diff --git a/mdk-stage1/dietlibc/lib/strtoul.c b/mdk-stage1/dietlibc/lib/strtoul.c index 3f93962a9..e9c09fb59 100644 --- a/mdk-stage1/dietlibc/lib/strtoul.c +++ b/mdk-stage1/dietlibc/lib/strtoul.c @@ -1,32 +1,44 @@ #include <ctype.h> - -/* static char *num="0123456789abcdefghijklmnopqrstuvwxyz"; */ +#include "dietfeatures.h" +#include <errno.h> +#include <limits.h> +#include <stdlib.h> unsigned long int strtoul(const char *nptr, char **endptr, int base) { - long int v=0; + int neg = 0; + unsigned long int v=0; while(isspace(*nptr)) ++nptr; - + if (*nptr == '-') { neg=1; nptr++; } if (*nptr == '+') ++nptr; + if (base==16 && nptr[0]=='0') goto skip0x; if (!base) { if (*nptr=='0') { base=8; - if ((*(nptr+1)=='x')||(*(nptr+1)=='X')) { +skip0x: + if (nptr[1]=='x'||nptr[1]=='X') { nptr+=2; base=16; } - } - else + } else base=10; } while(*nptr) { register unsigned char c=*nptr; - c=(c>='a'?c-'a'+10:c>='A'?c-'A'+10:c-'0'); + c=(c>='a'?c-'a'+10:c>='A'?c-'A'+10:c<='9'?c-'0':0xff); if (c>=base) break; - v=v*base+c; + { + register unsigned long int w=v*base; + if (w<v) { + errno=ERANGE; + return ULONG_MAX; + } + v=w+c; + } ++nptr; } if (endptr) *endptr=(char *)nptr; - return v; + errno=0; /* in case v==ULONG_MAX, ugh! */ + return (neg?-v:v); } diff --git a/mdk-stage1/dietlibc/lib/strtoull.c b/mdk-stage1/dietlibc/lib/strtoull.c index 40818958d..d6073e32a 100644 --- a/mdk-stage1/dietlibc/lib/strtoull.c +++ b/mdk-stage1/dietlibc/lib/strtoull.c @@ -1,4 +1,5 @@ #include <ctype.h> +#include <stdlib.h> unsigned long long int strtoull(const char *nptr, char **endptr, int base) { diff --git a/mdk-stage1/dietlibc/lib/sys_siglist.c b/mdk-stage1/dietlibc/lib/sys_siglist.c index 80d7b3fb0..a753848d9 100644 --- a/mdk-stage1/dietlibc/lib/sys_siglist.c +++ b/mdk-stage1/dietlibc/lib/sys_siglist.c @@ -1,37 +1,174 @@ -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 - }; +const char *const sys_siglist[] = { + "Signal 0", + "Hangup", + "Interrupt", + "Quit", + "Illegal instruction", + "Trace/breakpoint trap", + "ABRT/IOT trap", +#if defined(__alpha__) || defined(__sparc__) || defined(__mips__) || defined(__hppa__) + "EMT trap", +#else + "Bus error", +#endif + "Floating point exception", + "Killed", +#if defined(__alpha__) || defined(__sparc__) || defined(__mips__) || defined(__hppa__) + "Bus error", +#else + "User defined signal 1", +#endif + "Segmentation fault", +#if defined(__alpha__) || defined(__sparc__) || defined(__mips__) || defined(__hppa__) + "Bad system call", +#else + "User defined signal 2", +#endif + "Broken pipe", + "Alarm clock", + "Terminated", +#if defined(__hppa__) + "User defined signal 1", + "User defined signal 2", + "Child exited", + "Power lost", + "Virtual timer expired", + "Profiling timer expired", + "I/O possible", + "Window changed", + "Stopped (signal)", + "Stopped", + "Continued", + "Stopped (tty input)", + "Stopped (tty output)", + "Urgent I/O condition", + "Power lost", + "Unknown", + "Unknown", + "CPU time limit exceeded", + "File size limit exceeded", + "Unknown", + "Stack fault", +#elif defined(__mips__) + "User defined signal 1", + "User defined signal 2", + "Child exited", + "Power lost", + "Window changed", + "Urgent I/O condition", + "I/O possible", + "Stopped (signal)", + "Stopped", + "Continued", + "Stopped (tty input)", + "Stopped (tty output)", + "Virtual timer expired", + "Profiling timer expired", + "CPU time limit exceeded", + "File size limit exceeded", +#elif defined(__alpha__) || defined(__sparc__) + "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", + "Power/Resource lost", + "User defined signal 1", + "User defined signal 2", +#else + "Stack fault", + "Child exited", + "Continued", + "Stopped (signal)", + "Stopped", + "Stopped (tty input)", + "Stopped (tty output)", + "Urgent I/O condition", + "CPU time limit exceeded", + "File size limit exceeded", + "Virtual timer expired", + "Profiling timer expired", + "Window changed", + "I/O possible", + "Power lost", + "Bad system call", +#endif +#ifndef __hppa__ + "Real time signal", + "Real time signal", + "Real time signal", + "Real time signal", + "Real time signal", +#endif + "Real time signal", + "Real time signal", + "Real time signal", + "Real time signal", + "Real time signal", + "Real time signal", + "Real time signal", + "Real time signal", + "Real time signal", + "Real time signal", + "Real time signal", + "Real time signal", + "Real time signal", + "Real time signal", + "Real time signal", + "Real time signal", + "Real time signal", + "Real time signal", + "Real time signal", + "Real time signal", + "Real time signal", + "Real time signal", + "Real time signal", + "Real time signal", + "Real time signal", + "Real time signal", + "Real time signal", +#ifdef __mips__ + "Real time signal", + "Real time signal", + "Real time signal", + "Real time signal", + "Real time signal", + "Real time signal", + "Real time signal", + "Real time signal", + "Real time signal", + "Real time signal", + "Real time signal", + "Real time signal", + "Real time signal", + "Real time signal", + "Real time signal", + "Real time signal", + "Real time signal", + "Real time signal", + "Real time signal", + "Real time signal", + "Real time signal", + "Real time signal", + "Real time signal", + "Real time signal", + "Real time signal", + "Real time signal", + "Real time signal", + "Real time signal", + "Real time signal", + "Real time signal", + "Real time signal", + "Real time signal", +#endif + 0 +}; diff --git a/mdk-stage1/dietlibc/lib/tcdrain.c b/mdk-stage1/dietlibc/lib/tcdrain.c index 7a760f643..bb2018fb4 100644 --- a/mdk-stage1/dietlibc/lib/tcdrain.c +++ b/mdk-stage1/dietlibc/lib/tcdrain.c @@ -1,5 +1,6 @@ #include <sys/ioctl.h> +int __libc_tcdrain(int fd); int __libc_tcdrain(int fd) { return ioctl(fd, TCSBRK, 1); diff --git a/mdk-stage1/dietlibc/lib/tcflush.c b/mdk-stage1/dietlibc/lib/tcflush.c index a19fe11d1..2e5447728 100644 --- a/mdk-stage1/dietlibc/lib/tcflush.c +++ b/mdk-stage1/dietlibc/lib/tcflush.c @@ -1,23 +1,9 @@ -#include <unistd.h> -#include <termios.h> #include <sys/ioctl.h> -#include <asm/errno.h> - -extern int errno; - -/* Flush pending data on FD. */ -int tcflush(int fd, int queue_selector) +int __libc_tcflush(int fd, int queue_selector); +int __libc_tcflush(int fd, int queue_selector) { - switch (queue_selector) { - case TCIFLUSH: - return ioctl(fd, TCFLSH, 0); - case TCOFLUSH: - return ioctl(fd, TCFLSH, 1); - case TCIOFLUSH: - return ioctl(fd, TCFLSH, 2); - default: - errno = EINVAL; - return -1; - } + return ioctl(fd, TCFLSH, queue_selector); } + +int tcflush(int fd) __attribute__((weak,alias("__libc_tcflush"))); diff --git a/mdk-stage1/dietlibc/lib/tcgetpgrp.c b/mdk-stage1/dietlibc/lib/tcgetpgrp.c index f2a290651..8d5d4614a 100644 --- a/mdk-stage1/dietlibc/lib/tcgetpgrp.c +++ b/mdk-stage1/dietlibc/lib/tcgetpgrp.c @@ -1,7 +1,12 @@ #include <termios.h> #include <sys/ioctl.h> +#include <unistd.h> int tcgetpgrp(int fildes) { - return ioctl(fildes, TIOCGPGRP); + int foo; + if (ioctl(fildes, TIOCGPGRP, &foo)==-1) + return -1; + else + return foo; } diff --git a/mdk-stage1/dietlibc/lib/tcsetattr.c b/mdk-stage1/dietlibc/lib/tcsetattr.c index cf70354d2..03fe8adee 100644 --- a/mdk-stage1/dietlibc/lib/tcsetattr.c +++ b/mdk-stage1/dietlibc/lib/tcsetattr.c @@ -1,27 +1,37 @@ -#define tcsetattr libc_tcsetattr #include <termios.h> #include <sys/ioctl.h> -#undef tcsetattr +#include <errno.h> +#include "dietfeatures.h" -#include <asm/errno.h> +#if !defined(__powerpc__) && !defined(__sparc__) && !defined(__alpha__) && !defined(__hppa__) +#if TCSANOW==0 && TCSADRAIN==1 && TCSAFLUSH==2 && TCSETSW-TCSETS==1 && TCSETSF-TCSETS==2 +#define shortcut +#endif +#endif -extern int errno; +int tcsetattr ( int fildes, int optional_actions, struct termios* termios_p ) +{ +#ifdef shortcut -/* Hack around a kernel bug; value must correspond to the one used in speed.c */ -#define IBAUD0 020000000000 + if ( (unsigned int)optional_actions < 3u ) + return ioctl ( fildes, TCSETS+optional_actions, termios_p ); -int tcsetattr(int fildes, int optional_actions, struct termios *termios_p) -{ - termios_p->c_iflag &= ~IBAUD0; - 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; - } + +#else + + 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; + } + +#endif } diff --git a/mdk-stage1/dietlibc/lib/tcsetpgrp.c b/mdk-stage1/dietlibc/lib/tcsetpgrp.c index 6c40b5c79..8cf3165c2 100644 --- a/mdk-stage1/dietlibc/lib/tcsetpgrp.c +++ b/mdk-stage1/dietlibc/lib/tcsetpgrp.c @@ -1,5 +1,6 @@ #include <termios.h> #include <sys/ioctl.h> +#include <unistd.h> int tcsetpgrp(int fildes, pid_t pgrpid) { diff --git a/mdk-stage1/dietlibc/lib/tolower.c b/mdk-stage1/dietlibc/lib/tolower.c index 4b7c7cf2d..c24932ef4 100644 --- a/mdk-stage1/dietlibc/lib/tolower.c +++ b/mdk-stage1/dietlibc/lib/tolower.c @@ -1,6 +1,8 @@ #include <ctype.h> -inline int tolower(int c) { - return (c>='A' && c<='Z')?c-'A'+'a':c; +int tolower(int ch) { + if ( (unsigned int)(ch - 'A') < 26u ) + ch += 'a' - 'A'; + return ch; } diff --git a/mdk-stage1/dietlibc/lib/toupper.c b/mdk-stage1/dietlibc/lib/toupper.c index c048e60bb..f7d415e95 100644 --- a/mdk-stage1/dietlibc/lib/toupper.c +++ b/mdk-stage1/dietlibc/lib/toupper.c @@ -1,6 +1,8 @@ #include <ctype.h> -inline int toupper(int c) { - return (c>='a' && c<='z')?c-'a'+'A':c; +inline int toupper(int ch) { + if ( (unsigned int)(ch - 'a') < 26u ) + ch += 'A' - 'a'; + return ch; } diff --git a/mdk-stage1/dietlibc/lib/ttyname.c b/mdk-stage1/dietlibc/lib/ttyname.c index a6b479088..2bbc7f2a9 100644 --- a/mdk-stage1/dietlibc/lib/ttyname.c +++ b/mdk-stage1/dietlibc/lib/ttyname.c @@ -1,30 +1,35 @@ #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); +#include <stdlib.h> char *ttyname(int fd) { #ifdef SLASH_PROC_OK char ibuf[20]; static char obuf[20]; + int len; + if (!isatty(fd)) return 0; 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; + ibuf[__ltostr(ibuf+14,6,(unsigned long)fd,10,0)+14]=0; + if ((len=readlink(ibuf,obuf,sizeof(obuf)-1))<0) return 0; + obuf[len]=0; return obuf; #else - static char buf[20]="/dev/tty"; + static char buf[20]; struct stat s; char *c=buf+8; int n; + if (!isatty(fd)) return 0; if (fstat(fd,&s)) return 0; + strcpy(buf,"/dev/tty"); 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'; @@ -34,16 +39,18 @@ 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; + goto duh; case 136: case 137: case 138: case 139: - buf[5]='p'; buf[7]='s'; + buf[7]='s'; +duh: + buf[5]='p'; n+=(major(s.st_rdev)-136)<<8; *c='/'; ++c; goto num; diff --git a/mdk-stage1/dietlibc/lib/usleep.c b/mdk-stage1/dietlibc/lib/usleep.c index 494f99233..8f07416a8 100644 --- a/mdk-stage1/dietlibc/lib/usleep.c +++ b/mdk-stage1/dietlibc/lib/usleep.c @@ -1,12 +1,12 @@ -#include <linux/time.h> #include <time.h> +#include <unistd.h> /* nano * 1000 == usecs * usecs * 1000 == msecs * msecs * 1000 = secs */ -void usleep(unsigned int usecs) { +int usleep(unsigned long usecs) { struct timespec t; t.tv_sec=usecs/1000000; t.tv_nsec=(usecs%1000000)*1000; - nanosleep(&t,&t); + return nanosleep(&t,&t); } diff --git a/mdk-stage1/dietlibc/lib/vfork.c b/mdk-stage1/dietlibc/lib/vfork.c index 795cddb05..d54416d5d 100644 --- a/mdk-stage1/dietlibc/lib/vfork.c +++ b/mdk-stage1/dietlibc/lib/vfork.c @@ -1,6 +1,4 @@ -#include <linux/types.h> #include <unistd.h> -pid_t vfork(void) { - return fork(); -} +pid_t vfork() { return fork(); } + diff --git a/mdk-stage1/dietlibc/lib/vsnprintf.c b/mdk-stage1/dietlibc/lib/vsnprintf.c index f425066e3..dd06d6483 100644 --- a/mdk-stage1/dietlibc/lib/vsnprintf.c +++ b/mdk-stage1/dietlibc/lib/vsnprintf.c @@ -1,238 +1,33 @@ -#include "dietfeatures.h" #include <stdarg.h> #include <sys/types.h> +#include <unistd.h> #include <stdlib.h> #include <string.h> -#include "dietwarning.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); - -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; - 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 '*': - width=va_arg(arg_ptr,int); - goto inn_vsnprintf; - - case '.': - flag_dot=1; - if (*format=='*') { - preci=va_arg(arg_ptr,int); - ++format; - } else { - 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); - if (flag_dot && buf_len>preci) buf_len=preci; - if (buf_len>size-apos) buf_len=size-apos; - -print_out: - if (str) { - if (width && (!flag_left)) - { - for (pad=width-buf_len; pad>0; --pad) str[apos++]=padwith; - } - for(i=0;i<buf_len;++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>buf_len?width:buf_len; - } else { - apos+=size>buf_len?buf_len:size; - } - } - - 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 'f': - case 'g': - { - double d=va_arg(arg_ptr,double); - buf_len=__dtostr(d,buf,sizeof(buf),width?width:6); - if (flag_dot) { - char *tmp; - if ((tmp=strchr(buf,'.'))) { - while (preci>-1 && *++tmp) --preci; - *tmp=0; - } - } - 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; +#include "dietstdio.h" + +struct str_data { + unsigned char* str; + size_t len; + size_t size; +}; + +static int swrite(void*ptr, size_t nmemb, struct str_data* sd) { + size_t tmp=sd->size-sd->len; + if (tmp>0) { + size_t len=nmemb; + if (len>tmp) len=tmp; + if (sd->str) { + memcpy(sd->str+sd->len,ptr,len); + sd->str[sd->len+len]=0; } + sd->len+=len; } - if (str) str[apos]=0; - return apos; + return nmemb; } -link_warning("vsnprintf","warning: the printf functions add several kilobytes of bloat.") - +int vsnprintf(char* str, size_t size, const char *format, va_list arg_ptr) { + struct str_data sd = { str, 0, size }; + struct arg_printf ap = { &sd, (int(*)(void*,size_t,void*)) swrite }; + if (size) --sd.size; + return __v_printf(&ap,format,arg_ptr); +} diff --git a/mdk-stage1/dietlibc/lib/vsprintf.c b/mdk-stage1/dietlibc/lib/vsprintf.c index 10ff04bd7..6cd5a40b1 100644 --- a/mdk-stage1/dietlibc/lib/vsprintf.c +++ b/mdk-stage1/dietlibc/lib/vsprintf.c @@ -1,10 +1,12 @@ #include <stdarg.h> -#include <linux/types.h> +#include <sys/types.h> #include <stdlib.h> - -int vsnprintf (char *str,size_t size,const char *format, va_list arg_ptr); +#include <stdio.h> +#include "dietwarning.h" int vsprintf(char *dest,const char *format, va_list arg_ptr) { - return vsnprintf(dest,1000000,format,arg_ptr); + return vsnprintf(dest,(size_t)-1,format,arg_ptr); } + +link_warning("vsprintf","warning: Avoid *sprintf; use *snprintf. It is more secure.") diff --git a/mdk-stage1/dietlibc/lib/vsscanf.c b/mdk-stage1/dietlibc/lib/vsscanf.c index 1c4c9b787..329cfd02a 100644 --- a/mdk-stage1/dietlibc/lib/vsscanf.c +++ b/mdk-stage1/dietlibc/lib/vsscanf.c @@ -1,304 +1,25 @@ -#include "dietfeatures.h" #include <stdarg.h> #include <sys/types.h> -#include <ctype.h> #include <stdlib.h> -#include <string.h> +#include "dietstdio.h" +#include <unistd.h> -const char *skip_ws(const char *str) -{ - while ((*str)&&(isspace(*str))) str++; - return str; +struct str_data { + unsigned char* str; +}; + +static int sgetc(struct str_data* sd) { + register unsigned int ret = *(sd->str++); + return (ret)?(int)ret:-1; } -extern double strtod(const char *s,char **f); +static int sputc(int c, struct str_data* sd) { + return (*(--sd->str)==c)?c:-1; +} -int vsscanf(const char *str, const char *format, va_list arg_ptr) +int vsscanf(const char* str, const char* format, va_list arg_ptr) { - int n=0,div; - unsigned char ch; - - char flag_discard, flag_malloc, flag_half, flag_long, flag_longlong; - char flag_width; - - unsigned long width; - - /* arg_ptr tmps */ -#ifdef WANT_FLOATING_POINT_IN_SCANF - 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 && (!isspace(*str))) - { - if (!flag_discard) *(s++)=*(str); - if (!*str) break; - ++str; - --width; - } - *s=0; - } - break; - -#ifdef WANT_CHARACTER_CLASSES_IN_SCANF - case '[': - { - char cset[256]; - int flag_not=0; - int flag_dash=0; - memset(cset,0,sizeof(cset)); - ch=*format++; - - /* first char specials */ - if (ch=='^') - { - flag_not=1; - ch=*format++; - } - if ((ch=='-')||(ch==']')) - { - cset[ch]=1; - ch=*format++; - } - - /* almost all non special chars */ - for (;(*format) && (*format!=']');++format) { - if (flag_dash) - { - register unsigned char tmp=*format; - for (;ch<=tmp;++ch) cset[ch]=1; - flag_dash=0; - ch=*(++format); - } - else if (*format=='-') flag_dash=1; - else - { - cset[ch]=1; - ch=*format; - } - } - - /* last char specials */ - if (flag_dash) cset['-']=1; - else cset[ch]=1; - - /* like %c or %s */ - if (!flag_discard) - { - s=(char *)va_arg(arg_ptr,char*); - ++n; - } - while (width && (cset[(unsigned char)(*str)]-flag_not)) - { - if (!flag_discard) *(s++)=*(str); - if (!*str) break; - ++str; - --width; - } - } - break; -#endif - } - break; - - default: - if (prevfmt<format) { - while (prevfmt<format) { - if (*str!=*prevfmt) return n; - ++str; ++prevfmt; - } - } else - if (*(str++)!=ch) return n; - break; - } - } - return n; + struct str_data fdat = { (unsigned char*)str }; + struct arg_scanf farg = { (void*)&fdat, (int(*)(void*))sgetc, (int(*)(int,void*))sputc }; + return __v_scanf(&farg,format,arg_ptr); } diff --git a/mdk-stage1/dietlibc/libcruft/dnscruft.c b/mdk-stage1/dietlibc/libcruft/dnscruft.c index d7a0efa50..bd8bee79a 100644 --- a/mdk-stage1/dietlibc/libcruft/dnscruft.c +++ b/mdk-stage1/dietlibc/libcruft/dnscruft.c @@ -7,51 +7,100 @@ #include <string.h> #include <ctype.h> #include <stdlib.h> +#include <resolv.h> +#include <net/if.h> +#include "dietfeatures.h" int __dns_fd=-1; +#ifdef WANT_IPV6_DNS +int __dns_fd6=-1; +#endif -void __dns_make_fd() { +/* the ad-hoc internal API from hell ;-) */ +void __dns_make_fd(void); +void __dns_make_fd6(void); +void __dns_readstartfiles(void); +int __dns_decodename(unsigned char *packet,unsigned int offset,unsigned char *dest, + unsigned int maxlen,unsigned char* behindpacket); + +void __dns_make_fd(void) { int tmp; struct sockaddr_in si; - if (__dns_fd>0) return; + if (__dns_fd>=0) return; tmp=socket(PF_INET,SOCK_DGRAM,IPPROTO_UDP); - if (tmp<0) { - perror("__dns_make_fd!socket"); - return; - } + if (tmp<0) return; si.sin_family=AF_INET; si.sin_port=0; si.sin_addr.s_addr=INADDR_ANY; - if (bind(tmp,(struct sockaddr*)&si,sizeof(si))) { - perror("__dns_make_fd!bind"); - return; - } + if (bind(tmp,(struct sockaddr*)&si,sizeof(si))) return; __dns_fd=tmp; } -int __dns_servers=0; -struct sockaddr __dns_server_ips[8]; +#ifdef WANT_IPV6_DNS +void __dns_make_fd6(void) { + int tmp; + struct sockaddr_in6 si; + if (__dns_fd6>=0) return; + tmp=socket(PF_INET6,SOCK_DGRAM,IPPROTO_UDP); + if (tmp<0) return; + si.sin6_family=AF_INET6; + si.sin6_port=0; + memset(&si.sin6_addr,0,16); + if (bind(tmp,(struct sockaddr*)&si,sizeof(si))) return; + __dns_fd6=tmp; +} +#endif -int __dns_search=0; +static int parsesockaddr(const char* c,void* x) { + struct sockaddr_in to; + if (inet_aton(c,&to.sin_addr)) { + to.sin_port=htons(53); + to.sin_family=AF_INET; + memmove(x,&to,sizeof(struct sockaddr_in_pad)); + return 1; +#ifdef WANT_IPV6_DNS + } else { + struct sockaddr_in6 to6; + char* d=strchr(c,'%'); + to6.sin6_flowinfo=to6.sin6_scope_id=0; + if (d) + to6.sin6_scope_id=if_nametoindex(d+1); + if (inet_pton(AF_INET6,c,&to6.sin6_addr)) { + to6.sin6_port=htons(53); + to6.sin6_family=AF_INET6; + memmove(x,&to6,sizeof(struct sockaddr_in_pad)); + return 1; + } +#endif + } + return 0; +} + +#ifdef WANT_FULL_RESOLV_CONF +int __dns_search; char *__dns_domains[8]; +#endif -void __dns_readstartfiles() { +void __dns_readstartfiles(void) { int fd; - char *buf=alloca(4096); + char __buf[4096]; + char *buf=__buf; int len; - if (__dns_servers>0) return; + if (_res.nscount>0) return; { struct sockaddr_in to; +#ifdef WANT_IPV6_DNS + struct sockaddr_in6 to6; +#endif char *cacheip=getenv("DNSCACHEIP"); - if (cacheip) { - to.sin_port=htons(53); - to.sin_family=AF_INET; - if (inet_aton(cacheip,&to.sin_addr)) { - memmove(__dns_server_ips,&to,sizeof(struct sockaddr)); - ++__dns_servers; - } - } +#ifdef WANT_FULL_RESOLV_CONF + __dns_search=0; +#endif + if (cacheip) + if (parsesockaddr(cacheip,_res.nsaddr_list)) + ++_res.nscount; } + _res.options=RES_RECURSE; if ((fd=open("/etc/resolv.conf",O_RDONLY))<0) return; len=read(fd,buf,4096); close(fd); @@ -65,21 +114,35 @@ void __dns_readstartfiles() { { char *tmp=buf; struct sockaddr_in i; + char save; while (buf<last && !isspace(*buf)) ++buf; if (buf>=last) break; + save=*buf; *buf=0; - if (inet_aton(tmp,&i.sin_addr)) { - i.sin_family=AF_INET; - i.sin_port=htons(53); - memmove(&__dns_server_ips[__dns_servers],&i,sizeof(struct sockaddr)); - if (__dns_servers<8) ++__dns_servers; - } + if (parsesockaddr(tmp,&_res.nsaddr_list[_res.nscount])) + if (_res.nscount<MAXNS) ++_res.nscount; + *buf=save; } } } - if (!strncmp(buf,"search",6) || !strncmp(buf,"domain",6)) { +#ifdef WANT_FULL_RESOLV_CONF + else if (!strncmp(buf,"search",6) || !strncmp(buf,"domain",6)) { buf+=6; + while (buf<last && *buf!='\n') { + char save; + while (buf<last && (*buf==',' || isblank(*buf))) ++buf; + __dns_domains[__dns_search]=buf; + while (buf<last && (*buf=='.' || *buf=='-' || isalnum(*buf))) ++buf; + save=*buf; + if (buf<last) *buf=0; + if (__dns_domains[__dns_search]<buf && + (__dns_domains[__dns_search]=strdup(__dns_domains[__dns_search]))) + ++__dns_search; + if (buf<last) *buf=save; + } + continue; } +#endif while (buf<last && *buf!='\n') ++buf; while (buf<last && *buf=='\n') ++buf; } @@ -87,21 +150,24 @@ void __dns_readstartfiles() { } /* return length of decoded data or -1 */ -int __dns_decodename(unsigned char *packet,int offset,unsigned char *dest,int maxlen) { +int __dns_decodename(unsigned char *packet,unsigned int offset,unsigned char *dest, + unsigned int maxlen,unsigned char* behindpacket) { unsigned char *tmp; unsigned char *max=dest+maxlen; unsigned char *after=packet+offset; int ok=0; for (tmp=after; maxlen>0&&*tmp; ) { + if (tmp>=behindpacket) return -1; if ((*tmp>>6)==3) { /* goofy DNS decompression */ unsigned int ofs=((unsigned int)(*tmp&0x3f)<<8)|*(tmp+1); - if (ofs>=offset) return -1; /* RFC1035: "pointer to a _prior_ occurrance" */ + if (ofs>=(unsigned int)offset) return -1; /* RFC1035: "pointer to a _prior_ occurrance" */ if (after<tmp+2) after=tmp+2; tmp=packet+ofs; ok=0; } else { unsigned int duh; if (dest+*tmp+1>max) return -1; + if (tmp+*tmp+1>=behindpacket) return -1; for (duh=*tmp; duh>0; --duh) *dest++=*++tmp; *dest++='.'; ok=1; diff --git a/mdk-stage1/dietlibc/libcruft/dnscruft2.c b/mdk-stage1/dietlibc/libcruft/dnscruft2.c index b59207072..d4e132e42 100644 --- a/mdk-stage1/dietlibc/libcruft/dnscruft2.c +++ b/mdk-stage1/dietlibc/libcruft/dnscruft2.c @@ -8,178 +8,166 @@ #include <sys/poll.h> #include <unistd.h> #include <errno.h> +#include <arpa/nameser.h> +#include <resolv.h> +#include "dietfeatures.h" +#include "dietdns.h" -#include <stdio.h> +extern void __dns_readstartfiles(void); -extern int h_errno; - -static char dnspacket[]="\xfe\xfe\001\000\000\001\000\000\000\000\000\000"; - -extern void __dns_make_fd(); -extern int __dns_fd; - -extern int __dns_servers; -extern struct sockaddr __dns_server_ips[]; - -extern void __dns_readstartfiles(); - -extern int __dns_decodename(unsigned char *packet,int offset,unsigned char *dest,int maxlen); +extern int __dns_decodename(unsigned char *packet,unsigned int offset,unsigned char *dest, + unsigned int maxlen,unsigned char* behindpacket); /* Oh boy, this interface sucks so badly, there are no words for it. * Not one, not two, but _three_ error signalling methods! (*h_errnop * nonzero? return value nonzero? *RESULT zero?) The glibc goons * really outdid themselves with this one. */ +#ifdef WANT_FULL_RESOLV_CONF +static int __dns_gethostbyx_r_inner(const char* name, struct hostent* result, + char *buf, size_t buflen, + struct hostent **RESULT, int *h_errnop, int lookfor); + +static int __dns_gethostbyx_r_inner(const char* name, struct hostent* result, + char *buf, size_t buflen, + struct hostent **RESULT, int *h_errnop, int lookfor) { +#else int __dns_gethostbyx_r(const char* name, struct hostent* result, char *buf, size_t buflen, struct hostent **RESULT, int *h_errnop, int lookfor) { +#endif int names,ips; unsigned char *cur; unsigned char *max; - unsigned char packet[512]; - __dns_make_fd(); + unsigned char inpkg[1500]; + char* tmp; + int size; if (lookfor==1) { - result->h_aliases=(char**)(buf+8*4); result->h_addrtype=AF_INET; result->h_length=4; - result->h_addr_list=(char**)buf; } else { - result->h_aliases=(char**)(buf+8*16); result->h_addrtype=AF_INET6; result->h_length=16; - result->h_addr_list=(char**)buf; } + result->h_aliases=(char**)(buf+8*sizeof(char*)); + result->h_addr_list=(char**)buf; result->h_aliases[0]=0; cur=buf+16*sizeof(char*); max=buf+buflen; names=ips=0; - memmove(packet,dnspacket,12); - *(unsigned short*)packet=rand(); + if ((size=res_query(name,C_IN,lookfor,inpkg,512))<0) { +invalidpacket: + *h_errnop=HOST_NOT_FOUND; + return -1; + } { - unsigned char* x; - const char* y,* tmp; - x=packet+12; y=name; - while (*y) { - while (*y=='.') ++y; - for (tmp=y; *tmp && *tmp!='.'; ++tmp) ; - *x=tmp-y; - if (!(tmp-y)) break; - ++x; - if (x>=packet+510-(tmp-y)) { *h_errnop=ERANGE; return 1; } - memmove(x,y,tmp-y); - x+=tmp-y; - if (!*tmp) { - *x=0; - break; - } - y=tmp; - } - *++x= 0; *++x= lookfor; /* A */ - *++x= 0; *++x= 1; /* IN */ - ++x; + tmp=inpkg+12; { - int i; /* current server */ - int j; /* timeout count down */ - struct pollfd duh; - i=0; j=30; - __dns_readstartfiles(); - duh.fd=__dns_fd; - duh.events=POLLIN; - for (j=30; j>0; --j) { - sendto(__dns_fd,packet,x-packet,0,(struct sockaddr*)&(__dns_server_ips[i]),sizeof(struct sockaddr)); - if (++i > __dns_servers) i=0; - if (poll(&duh,1,1) == 1) { - /* read and parse answer */ - unsigned char inpkg[1500]; - /*int len=*/ read(__dns_fd,inpkg,1500); -#if 0 - { - int tft=open("duh",0); - read(tft,inpkg,1500); - close(tft); - } -#endif - /* header, question, answer, authority, additional */ - if (inpkg[0]!=packet[0] || inpkg[1]!=packet[1]) continue; /* wrong ID */ - if ((inpkg[2]&0xf9) != 0x81) continue; /* not answer */ - if ((inpkg[3]&0x0f) != 0) break; /* error */ - tmp=inpkg+12; - { - char name[257]; - unsigned short q=((unsigned short)inpkg[4]<<8)+inpkg[5]; - while (q>0) { - while (*tmp) tmp+=*tmp+1; - tmp+=5; - --q; - } - q=((unsigned short)inpkg[6]<<8)+inpkg[7]; - if (q<1) break; - while (q>0) { - int decofs=__dns_decodename(inpkg,tmp-(char*)inpkg,name,256); - if (decofs<0) break; - tmp=inpkg+decofs; - --q; - if (tmp[0]!=0 || tmp[1]!=lookfor || /* TYPE != A */ - tmp[2]!=0 || tmp[3]!=1) { /* CLASS != IN */ - if (tmp[1]==5) { /* CNAME */ - tmp+=10; - decofs=__dns_decodename(inpkg,tmp-(char*)inpkg,name,256); - if (decofs<0) break; - tmp=inpkg+decofs; - } else - break; - continue; - } - tmp+=10; /* skip type, class, TTL and length */ - { - int slen; - if (lookfor==1 || lookfor==28) /* A or AAAA*/ { - slen=strlen(name); - if (cur+slen+8+(lookfor==28?12:0)>=max) { *h_errnop=NO_RECOVERY; return 1; } - } else if (lookfor==12) /* PTR */ { - decofs=__dns_decodename(inpkg,tmp-(char*)inpkg,name,256); - if (decofs<0) break; - tmp=inpkg+decofs; - slen=strlen(name); - } else - slen=strlen(name); - strcpy(cur,name); - if (names==0) - result->h_name=cur; - else - result->h_aliases[names-1]=cur; - result->h_aliases[names]=0; - ++names; + char Name[257]; + unsigned short q=((unsigned short)inpkg[4]<<8)+inpkg[5]; + while (q>0) { + if (tmp>(char*)inpkg+size) goto invalidpacket; + while (*tmp) { tmp+=*tmp+1; if (tmp>(char*)inpkg+size) goto invalidpacket; } + tmp+=5; + --q; + } + if (tmp>(char*)inpkg+size) goto invalidpacket; + q=((unsigned short)inpkg[6]<<8)+inpkg[7]; + if (q<1) goto nodata; + while (q>0) { + int decofs=__dns_decodename(inpkg,(size_t)(tmp-(char*)inpkg),Name,256,inpkg+size); + if (decofs<0) break; + tmp=inpkg+decofs; + --q; + if (tmp[0]!=0 || tmp[1]!=lookfor || /* TYPE != A */ + tmp[2]!=0 || tmp[3]!=1) { /* CLASS != IN */ + if (tmp[1]==5) { /* CNAME */ + tmp+=10; + decofs=__dns_decodename(inpkg,(size_t)(tmp-(char*)inpkg),Name,256,inpkg+size); + if (decofs<0) break; + tmp=inpkg+decofs; + } else + break; + continue; + } + tmp+=10; /* skip type, class, TTL and length */ + { + int slen; + if (lookfor==1 || lookfor==28) /* A or AAAA*/ { + slen=strlen(Name); + if (cur+slen+8+(lookfor==28?12:0)>=max) { *h_errnop=NO_RECOVERY; return -1; } + } else if (lookfor==12) /* PTR */ { + decofs=__dns_decodename(inpkg,(size_t)(tmp-(char*)inpkg),Name,256,inpkg+size); + if (decofs<0) break; + tmp=inpkg+decofs; + slen=strlen(Name); + } else + slen=strlen(Name); + strcpy(cur,Name); + if (names==0) + result->h_name=cur; + else + result->h_aliases[names-1]=cur; + result->h_aliases[names]=0; + if (names<8) ++names; /* cur+=slen+1; */ - cur+=(slen|3)+1; - result->h_addr_list[ips++] = cur; - if (lookfor==1) /* A */ { - *(int*)cur=*(int*)tmp; - cur+=4; - result->h_addr_list[ips]=0; - } else if (lookfor==28) /* AAAA */ { - { - int i; - for (i=0; i<16; ++i) cur[i]=tmp[i]; - } - cur+=16; - result->h_addr_list[ips]=0; - } - } -/* puts(name); */ + cur+=(slen|3)+1; + result->h_addr_list[ips++] = cur; + if (lookfor==1) /* A */ { + *(int*)cur=*(int*)tmp; + cur+=4; + result->h_addr_list[ips]=0; + } else if (lookfor==28) /* AAAA */ { + { + int k; + for (k=0; k<16; ++k) cur[k]=tmp[k]; } + cur+=16; + result->h_addr_list[ips]=0; } -/* printf("%d answers\n",((unsigned short)inpkg[6]<<8)+inpkg[7]); - printf("ok\n");*/ - *h_errnop=0; - *RESULT=result; - return 0; } -/*kaputt:*/ +/* puts(Name); */ } } } - return 1; + if (!names) { +nodata: + *h_errnop=NO_DATA; + return -1; + } + *h_errnop=0; + *RESULT=result; + return 0; +} + +#ifdef WANT_FULL_RESOLV_CONF +extern int __dns_search; +extern char *__dns_domains[]; + +int __dns_gethostbyx_r(const char* name, struct hostent* result, + char *buf, size_t buflen, + struct hostent **RESULT, int *h_errnop, int lookfor) { + const char *tmp=name; + char Buf[MAXDNAME+1]; + int res; + size_t len=strlen(name); + int count=0; + __dns_readstartfiles(); + memmove(Buf,name,len); + Buf[len]=Buf[MAXDNAME]=0; +// printf("appending %d: %p\n",count,__dns_domains[count]); + while ((res=__dns_gethostbyx_r_inner(tmp,result,buf,buflen,RESULT,h_errnop,lookfor))) { + if (res==-1 && *h_errnop!=HOST_NOT_FOUND) break; + if (count==__dns_search) break; + Buf[len]='.'; +// printf("appending %d: %p (%s)\n",count,__dns_domains[count],__dns_domains[count]); + memccpy(Buf+len+1,__dns_domains[count],0,MAXDNAME-len-1); + tmp=Buf; + ++count; + } + return res; } +#endif + diff --git a/mdk-stage1/dietlibc/libcruft/getgrgid.c b/mdk-stage1/dietlibc/libcruft/getgrgid.c index 0c223056c..c0daac5e0 100644 --- a/mdk-stage1/dietlibc/libcruft/getgrgid.c +++ b/mdk-stage1/dietlibc/libcruft/getgrgid.c @@ -1,14 +1,11 @@ #include <grp.h> #include <string.h> -#include <stdlib.h> + +extern struct group __group_pw; +extern char __group_buf[1000]; struct group *getgrgid(gid_t gid) { struct group *tmp; - setgrent(); - for (;;) { - tmp=getgrent(); - if (!tmp) return 0; - if (tmp->gr_gid == gid) - return tmp; - } + getgrgid_r(gid,&__group_pw,__group_buf,sizeof(__group_buf),&tmp); + return tmp; } diff --git a/mdk-stage1/dietlibc/libcruft/getgrnam.c b/mdk-stage1/dietlibc/libcruft/getgrnam.c index 1bdbb42a8..2664ab3f6 100644 --- a/mdk-stage1/dietlibc/libcruft/getgrnam.c +++ b/mdk-stage1/dietlibc/libcruft/getgrnam.c @@ -1,14 +1,11 @@ #include <grp.h> #include <string.h> -#include <stdlib.h> + +extern struct group __group_pw; +extern char __group_buf[1000]; struct group *getgrnam(const char* name) { struct group *tmp; - setgrent(); - for (;;) { - tmp=getgrent(); - if (!tmp) return 0; - if (!strcmp(tmp->gr_name,name)) - return tmp; - } + getgrnam_r(name,&__group_pw,__group_buf,sizeof(__group_buf),&tmp); + return tmp; } diff --git a/mdk-stage1/dietlibc/libcruft/gethostbyaddr.c b/mdk-stage1/dietlibc/libcruft/gethostbyaddr.c index a4207d44d..74828df56 100644 --- a/mdk-stage1/dietlibc/libcruft/gethostbyaddr.c +++ b/mdk-stage1/dietlibc/libcruft/gethostbyaddr.c @@ -5,34 +5,31 @@ #include <netdb.h> #include <stdlib.h> #include <arpa/inet.h> -#include <sys/poll.h> #include <unistd.h> #include <errno.h> +#include "dietwarning.h" -extern int h_errno; +static const int hostentsize=((sizeof(struct hostent)+15)&(-16)); + +extern size_t __dns_buflen; +extern char* __dns_buf; +extern void __dns_makebuf(size_t x); struct hostent* gethostbyaddr(const void *addr, socklen_t len, int type) { - static struct hostent hostbuf; + struct hostent *hostbuf; struct hostent *hp; - size_t hstbuflen; - char *tmphstbuf; int res; - int herr; - - hstbuflen = 1024; - /* Allocate buffer, remember to free it to avoid a memory leakage. */ - tmphstbuf = malloc (hstbuflen); - while ((res = gethostbyaddr_r (addr, len, type, &hostbuf, tmphstbuf, hstbuflen, - &hp, &herr)) == ERANGE) - { - /* Enlarge the buffer. */ - hstbuflen *= 2; - tmphstbuf = realloc (tmphstbuf, hstbuflen); - } - /* Check for errors. */ - if (res || hp == NULL) - return NULL; + __dns_buflen=512; + do { + __dns_makebuf(__dns_buflen*2); if (!__dns_buf) return 0; + hostbuf=(struct hostent*)__dns_buf; + } while ((res = gethostbyaddr_r (addr, len, type, hostbuf, + __dns_buf+hostentsize, + __dns_buflen-hostentsize, &hp, + &h_errno)) == ERANGE); + if (res) hp=0; return hp; } +link_warning("gethostbyaddr","warning: gethostbyaddr() leaks memory. Use gethostbyaddr_r instead!") diff --git a/mdk-stage1/dietlibc/libcruft/gethostbyaddr_r.c b/mdk-stage1/dietlibc/libcruft/gethostbyaddr_r.c index 37174ab13..d18053c45 100644 --- a/mdk-stage1/dietlibc/libcruft/gethostbyaddr_r.c +++ b/mdk-stage1/dietlibc/libcruft/gethostbyaddr_r.c @@ -5,15 +5,10 @@ #include <netdb.h> #include <stdlib.h> #include <arpa/inet.h> -#include <sys/poll.h> #include <unistd.h> #include <errno.h> - -#include <stdio.h> - -extern int __dns_gethostbyx_r(const char* name, struct hostent* result, - char *buf, size_t buflen, - struct hostent **RESULT, int *h_errnop, int lookfor); +#include "dietfeatures.h" +#include "dietdns.h" static int i2a(char* dest,unsigned int x) { register unsigned int tmp=x; @@ -24,6 +19,10 @@ static int i2a(char* dest,unsigned int x) { return len+1; } +static char hexdigit(char c) { + return c>9?c-10+'a':c+'0'; +} + /* Oh boy, this interface sucks so badly, there are no words for it. * Not one, not two, but _three_ error signalling methods! (*h_errnop * nonzero? return value nonzero? *RESULT zero?) The glibc goons @@ -31,21 +30,55 @@ static int i2a(char* dest,unsigned int x) { int gethostbyaddr_r(const char* addr, size_t length, int format, struct hostent* result, char *buf, size_t buflen, struct hostent **RESULT, int *h_errnop) { + char tmpbuf[100]; + char* tmp; + int res; + (void)length; /* shut gcc up about unused length. The length is implicit with format */ +#ifdef WANT_ETC_HOSTS + { + struct hostent* r; + while ((r=gethostent_r(buf,buflen))) { + if (r->h_addrtype==format && !memcmp(r->h_addr_list[0],addr,r->h_length)) { /* found it! */ + memmove(result,r,sizeof(struct hostent)); + *RESULT=result; + *h_errnop=0; + return 0; + } + } + endhostent(); + } +#endif if (format==AF_INET) { - char tmpbuf[50]; - char *tmp; - int res; tmp=tmpbuf+i2a(tmpbuf,(unsigned char)addr[3]); *tmp++='.'; tmp+=i2a(tmp,(unsigned char)addr[2]); *tmp++='.'; tmp+=i2a(tmp,(unsigned char)addr[1]); *tmp++='.'; tmp+=i2a(tmp,(unsigned char)addr[0]); strcpy(tmp,".in-addr.arpa"); - res= __dns_gethostbyx_r(tmpbuf,result,buf+4,buflen-4,RESULT,h_errnop,12); /* 12 == ns_t_ptr */ - if (res==0) { - result->h_addr_list[0]=buf; - result->h_addr_list[1]=buf; - *(int*)buf=*(int*)addr; + } else if (format==AF_INET6) { + int i; + tmp=tmpbuf; + for (i=15; i>=0; --i) { + tmp[0]=hexdigit(addr[i]&0xf); + tmp[1]='.'; + tmp[2]=hexdigit((addr[i]>>4)&0xf); + tmp[3]='.'; + tmp+=4; + } + strcpy(tmp,".ip6.int"); + } else return 1; + if (buflen<sizeof(struct hostent)+16) { + errno=ENOMEM; + *h_errnop=NO_RECOVERY; + return 1; + } + res= __dns_gethostbyx_r(tmpbuf,result,buf+16,buflen-16,RESULT,h_errnop,12); /* 12 == ns_t_ptr */ + if (res==0) { + if (format==AF_INET) { + result->h_length=4; + result->h_addrtype=format; } - return res; + memcpy(buf,addr,result->h_length); + result->h_addr_list[0]=buf; + result->h_addr_list[1]=0; } - return 1; + return res; } diff --git a/mdk-stage1/dietlibc/libcruft/gethostbyname.c b/mdk-stage1/dietlibc/libcruft/gethostbyname.c index 5db5bf3c5..b4849be96 100644 --- a/mdk-stage1/dietlibc/libcruft/gethostbyname.c +++ b/mdk-stage1/dietlibc/libcruft/gethostbyname.c @@ -5,35 +5,30 @@ #include <netdb.h> #include <stdlib.h> #include <arpa/inet.h> -#include <sys/poll.h> #include <unistd.h> #include <errno.h> +#include "dietwarning.h" -extern int h_errno; +static const int hostentsize=((sizeof(struct hostent)+15)&(-16)); -struct hostent* gethostbyname (const char *host) -{ - static struct hostent hostbuf; +extern size_t __dns_buflen; +extern char* __dns_buf; +extern void __dns_makebuf(size_t x); + +struct hostent* gethostbyname (const char *host) { + struct hostent *hostbuf; struct hostent *hp; - size_t hstbuflen; - char *tmphstbuf; int res; - int herr; - - hstbuflen = 1024; - /* Allocate buffer, remember to free it to avoid a memory leakage. */ - tmphstbuf = malloc (hstbuflen); - while ((res = gethostbyname_r (host, &hostbuf, tmphstbuf, hstbuflen, - &hp, &herr)) == ERANGE) - { - /* Enlarge the buffer. */ - hstbuflen *= 2; - tmphstbuf = realloc (tmphstbuf, hstbuflen); - } - /* Check for errors. */ - if (res || hp == NULL) - return NULL; + __dns_buflen=512; + do { + __dns_makebuf(__dns_buflen*2); if (!__dns_buf) return 0; + hostbuf=(struct hostent*)__dns_buf; + } while ((res = gethostbyname_r (host, hostbuf, __dns_buf+hostentsize, + __dns_buflen-hostentsize, &hp, + &h_errno)) == ERANGE); + if (res) hp=0; return hp; } +link_warning("gethostbyname","warning: gethostbyname() leaks memory. Use gethostbyname_r instead!") diff --git a/mdk-stage1/dietlibc/libcruft/gethostbyname2.c b/mdk-stage1/dietlibc/libcruft/gethostbyname2.c index 3d8296616..1ca140dbe 100644 --- a/mdk-stage1/dietlibc/libcruft/gethostbyname2.c +++ b/mdk-stage1/dietlibc/libcruft/gethostbyname2.c @@ -1,4 +1,3 @@ - #include <string.h> #include <sys/types.h> #include <sys/socket.h> @@ -6,35 +5,32 @@ #include <netdb.h> #include <stdlib.h> #include <arpa/inet.h> -#include <sys/poll.h> #include <unistd.h> #include <errno.h> +#include "dietwarning.h" + +static const int hostentsize=((sizeof(struct hostent)+15)&(-16)); -extern int h_errno; +extern size_t __dns_buflen; +extern char* __dns_buf; +extern void __dns_makebuf(size_t x); -struct hostent* gethostbyname2(const char *host,int AF) -{ - static struct hostent hostbuf; +struct hostent* gethostbyname2(const char *host,int AF) { + struct hostent *hostbuf; struct hostent *hp; - size_t hstbuflen; - char *tmphstbuf; int res; int herr; - hstbuflen = 1024; - /* Allocate buffer, remember to free it to avoid a memory leakage. */ - tmphstbuf = malloc (hstbuflen); - - while ((res = gethostbyname2_r (host, AF,&hostbuf, tmphstbuf, hstbuflen, - &hp, &herr)) == ERANGE) - { - /* Enlarge the buffer. */ - hstbuflen *= 2; - tmphstbuf = realloc (tmphstbuf, hstbuflen); - } - /* Check for errors. */ - if (res || hp == NULL) - return NULL; + __dns_buflen=512; + do { + __dns_makebuf(__dns_buflen*2); if (!__dns_buf) return 0; + hostbuf=(struct hostent*)__dns_buf; + } while ((res = gethostbyname2_r (host, AF, hostbuf, + __dns_buf+hostentsize, + __dns_buflen-hostentsize, &hp, + &herr)) == ERANGE); + if (res) hp=0; return hp; } +link_warning("gethostbyname2","warning: gethostbyname2() leaks memory. Use gethostbyname2_r instead!") diff --git a/mdk-stage1/dietlibc/libcruft/gethostbyname2_r.c b/mdk-stage1/dietlibc/libcruft/gethostbyname2_r.c index b505ccfbc..75da5e320 100644 --- a/mdk-stage1/dietlibc/libcruft/gethostbyname2_r.c +++ b/mdk-stage1/dietlibc/libcruft/gethostbyname2_r.c @@ -5,15 +5,10 @@ #include <netdb.h> #include <stdlib.h> #include <arpa/inet.h> -#include <sys/poll.h> #include <unistd.h> +#include "dietfeatures.h" #include <errno.h> - -#include <stdio.h> - -extern int __dns_gethostbyx_r(const char* name, struct hostent* result, - char *buf, size_t buflen, - struct hostent **RESULT, int *h_errnop, int lookfor); +#include "dietdns.h" /* Oh boy, this interface sucks so badly, there are no words for it. * Not one, not two, but _three_ error signalling methods! (*h_errnop @@ -22,7 +17,7 @@ extern int __dns_gethostbyx_r(const char* name, struct hostent* result, int gethostbyname2_r(const char* name, int AF, struct hostent* result, char *buf, size_t buflen, struct hostent **RESULT, int *h_errnop) { - int L=strlen(name); + size_t L=strlen(name); int lookfor=0; switch (AF) { case AF_INET: lookfor=1; break; @@ -31,6 +26,30 @@ int gethostbyname2_r(const char* name, int AF, struct hostent* result, } result->h_name=buf; if (buflen<L) { *h_errnop=ERANGE; return 1; } +#ifdef WANT_ETC_HOSTS + { + struct hostent* r; + while ((r=gethostent_r(buf,buflen))) { + if (r->h_addrtype==AF) { + int i; + if (!strcmp(r->h_name,name)) { /* found it! */ +found: + memmove(result,r,sizeof(struct hostent)); + *RESULT=result; + *h_errnop=0; + endhostent(); + return 0; + } + for (i=0; i<16; ++i) { + if (r->h_aliases[i]) { + if (!strcmp(r->h_aliases[i],name)) goto found; + } else break; + } + } + } + endhostent(); + } +#endif strcpy(buf,name); return __dns_gethostbyx_r(name,result,buf+L,buflen-L,RESULT,h_errnop,lookfor); } diff --git a/mdk-stage1/dietlibc/libcruft/gethostbyname_r.c b/mdk-stage1/dietlibc/libcruft/gethostbyname_r.c index d5a531f0f..d7a713e20 100644 --- a/mdk-stage1/dietlibc/libcruft/gethostbyname_r.c +++ b/mdk-stage1/dietlibc/libcruft/gethostbyname_r.c @@ -1,19 +1,15 @@ #include <string.h> +#include <strings.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include <stdlib.h> #include <arpa/inet.h> -#include <sys/poll.h> #include <unistd.h> +#include "dietfeatures.h" #include <errno.h> - -#include <stdio.h> - -extern int __dns_gethostbyx_r(const char* name, struct hostent* result, - char *buf, size_t buflen, - struct hostent **RESULT, int *h_errnop, int lookfor); +#include "dietdns.h" /* Oh boy, this interface sucks so badly, there are no words for it. * Not one, not two, but _three_ error signalling methods! (*h_errnop @@ -22,9 +18,51 @@ extern int __dns_gethostbyx_r(const char* name, struct hostent* result, int gethostbyname_r(const char* name, struct hostent* result, char *buf, size_t buflen, struct hostent **RESULT, int *h_errnop) { - int L=strlen(name); + size_t L=strlen(name); result->h_name=buf; if (buflen<L) { *h_errnop=ERANGE; return 1; } strcpy(buf,name); +#ifdef WANT_INET_ADDR_DNS + result->h_addr_list=(char**)(buf+strlen(name)+1); + result->h_addr_list+=sizeof(unsigned long)-((unsigned long)(result->h_addr_list)&(sizeof(unsigned long)-1)); + result->h_addr_list[0]=(char*)&result->h_addr_list[2]; + if (inet_pton(AF_INET,name,result->h_addr_list[0])) { + result->h_addrtype=AF_INET; + result->h_length=4; +commonip: + result->h_aliases=result->h_addr_list+2*sizeof(char**); + result->h_aliases[0]=0; + result->h_addr_list[1]=0; + *RESULT=result; + *h_errnop=0; + return 0; + } else if (inet_pton(AF_INET6,name,result->h_addr_list[0])) { + result->h_addrtype=AF_INET6; + result->h_length=16; + goto commonip; + } +#endif +#ifdef WANT_ETC_HOSTS + { + struct hostent* r; + while ((r=gethostent_r(buf,buflen))) { + int i; + if (r->h_addrtype==AF_INET && !strcasecmp(r->h_name,name)) { /* found it! */ +found: + memmove(result,r,sizeof(struct hostent)); + *RESULT=result; + *h_errnop=0; + endhostent(); + return 0; + } + for (i=0; i<16; ++i) { + if (r->h_aliases[i]) { + if (!strcasecmp(r->h_aliases[i],name)) goto found; + } else break; + } + } + endhostent(); + } +#endif return __dns_gethostbyx_r(name,result,buf+L,buflen-L,RESULT,h_errnop,1); } diff --git a/mdk-stage1/dietlibc/libcruft/getlogin.c b/mdk-stage1/dietlibc/libcruft/getlogin.c index 359f44d9f..844d68c70 100644 --- a/mdk-stage1/dietlibc/libcruft/getlogin.c +++ b/mdk-stage1/dietlibc/libcruft/getlogin.c @@ -1,5 +1,6 @@ #include <stdlib.h> +#include <unistd.h> -char* getlogin() { +char* getlogin(void) { return getenv("LOGNAME"); } diff --git a/mdk-stage1/dietlibc/libcruft/getpagesize.c b/mdk-stage1/dietlibc/libcruft/getpagesize.c index dea4a9693..536d3dcef 100644 --- a/mdk-stage1/dietlibc/libcruft/getpagesize.c +++ b/mdk-stage1/dietlibc/libcruft/getpagesize.c @@ -6,6 +6,7 @@ #define PAGE_SIZE 4096 #endif +size_t __libc_getpagesize(void); size_t __libc_getpagesize(void) { return PAGE_SIZE; } diff --git a/mdk-stage1/dietlibc/libcruft/getpass.c b/mdk-stage1/dietlibc/libcruft/getpass.c index 3da7cd2b3..2183284b3 100644 --- a/mdk-stage1/dietlibc/libcruft/getpass.c +++ b/mdk-stage1/dietlibc/libcruft/getpass.c @@ -3,30 +3,42 @@ #include <limits.h> #include <fcntl.h> #include <string.h> +#include <errno.h> + +static inline int _tcsetattr(int fd,int optional,struct termios *termios_p) { + int tmp; + for (;;) { + if ((tmp=tcsetattr(fd,optional,termios_p))) + if (errno==EINTR) continue; + break; + } + return tmp; +} char *getpass(const char* prompt) { struct termios old,tmp; int out,in=open("/dev/tty",O_RDWR); int doclose=(in>=0); static char buf[PASS_MAX]; - if (doclose) { in=0; out=2; } else out=in; + if (!doclose) { in=0; out=2; } else out=in; if (!tcgetattr(in,&old)) { tmp=old; tmp.c_lflag &= ~(ECHO|ISIG); - tcsetattr(in,TCSAFLUSH,&tmp); + _tcsetattr(in,TCSAFLUSH,&tmp); } write(out,prompt,strlen(prompt)); { int nread,ofs=0; for (;;) { - nread=read(in,buf+ofs,PASS_MAX-ofs); - if (nread<0) { + nread=read(in,buf+ofs,1); + if (nread<=0) { + if (errno==EINTR) continue; buf[ofs]=0; break; } else if (ofs+nread>=PASS_MAX) { buf[PASS_MAX-1]=0; break; - } else if (buf[ofs+nread-1]=='\n') { + } else if (buf[ofs]=='\n') { buf[ofs+nread-1]=0; break; } @@ -34,7 +46,7 @@ char *getpass(const char* prompt) { } write(out,"\n",1); } - tcsetattr(in,TCSAFLUSH,&old); + _tcsetattr(in,TCSAFLUSH,&old); if (doclose) close(in); return buf; } diff --git a/mdk-stage1/dietlibc/libcruft/getpwnam.c b/mdk-stage1/dietlibc/libcruft/getpwnam.c index 53aae74d1..d2e204150 100644 --- a/mdk-stage1/dietlibc/libcruft/getpwnam.c +++ b/mdk-stage1/dietlibc/libcruft/getpwnam.c @@ -1,14 +1,11 @@ #include <pwd.h> #include <string.h> -#include <stdlib.h> -struct passwd *getpwnam(const char * name) { +extern struct passwd __passwd_pw; +extern char __passwd_buf[1000]; + +struct passwd *getpwnam(const char* name) { struct passwd *tmp; - setpwent(); - for (;;) { - tmp=getpwent(); - if (!tmp) return 0; - if (!strcmp(tmp->pw_name,name)) - return tmp; - } + getpwnam_r(name,&__passwd_pw,__passwd_buf,sizeof(__passwd_buf),&tmp); + return tmp; } diff --git a/mdk-stage1/dietlibc/libcruft/getpwuid.c b/mdk-stage1/dietlibc/libcruft/getpwuid.c index eef14e6e8..bca6a8a0c 100644 --- a/mdk-stage1/dietlibc/libcruft/getpwuid.c +++ b/mdk-stage1/dietlibc/libcruft/getpwuid.c @@ -2,13 +2,11 @@ #include <string.h> #include <stdlib.h> +extern struct passwd __passwd_pw; +extern char __passwd_buf[1000]; + struct passwd *getpwuid(uid_t uid) { struct passwd *tmp; - setpwent(); - for (;;) { - tmp=getpwent(); - if (!tmp) return 0; - if (tmp->pw_uid==uid) - return tmp; - } + getpwuid_r(uid,&__passwd_pw,__passwd_buf,sizeof(__passwd_buf),&tmp); + return tmp; } diff --git a/mdk-stage1/dietlibc/libcruft/getspnam.c b/mdk-stage1/dietlibc/libcruft/getspnam.c index e6573345d..a4eafbfb2 100644 --- a/mdk-stage1/dietlibc/libcruft/getspnam.c +++ b/mdk-stage1/dietlibc/libcruft/getspnam.c @@ -1,14 +1,11 @@ #include <shadow.h> #include <string.h> -#include <stdlib.h> -struct spwd *getspnam(const char * name) { +extern struct spwd __shadow_pw; +extern char __shadow_buf[1000]; + +struct spwd *getspnam(const char* name) { struct spwd *tmp; - setspent(); - for (;;) { - tmp=getspent(); - if (!tmp) return 0; - if (!strcmp(tmp->sp_namp,name)) - return tmp; - } + getspnam_r(name,&__shadow_pw,__shadow_buf,sizeof(__shadow_buf),&tmp); + return tmp; } diff --git a/mdk-stage1/dietlibc/libcruft/herrno_location.c b/mdk-stage1/dietlibc/libcruft/herrno_location.c index 203f73d4b..5908fe212 100644 --- a/mdk-stage1/dietlibc/libcruft/herrno_location.c +++ b/mdk-stage1/dietlibc/libcruft/herrno_location.c @@ -1,5 +1,8 @@ -extern int h_errno; +#include <errno.h> +#include <resolv.h> +#include <netdb.h> -int *__h_errno_location() { return &h_errno; } +int *__h_errno_location(void); +int *__h_errno_location(void) { return &h_errno; } -int *h_errno_location() __attribute__((weak,alias("__h_errno_location"))); +int *h_errno_location(void) __attribute__((weak,alias("__h_errno_location"))); diff --git a/mdk-stage1/dietlibc/libcruft/inet_aton.c b/mdk-stage1/dietlibc/libcruft/inet_aton.c index ac7d9d007..01adb341e 100644 --- a/mdk-stage1/dietlibc/libcruft/inet_aton.c +++ b/mdk-stage1/dietlibc/libcruft/inet_aton.c @@ -24,7 +24,7 @@ int inet_aton(const char *cp, struct in_addr *inp) { char *tmp=(char*)cp; for (i=24; ;) { long j; - j=strtol(tmp,&tmp,0); + j=strtoul(tmp,&tmp,0); if (*tmp==0) { ip|=j; break; diff --git a/mdk-stage1/dietlibc/libcruft/inet_ntoa.c b/mdk-stage1/dietlibc/libcruft/inet_ntoa.c index f8c975f7a..632d81424 100644 --- a/mdk-stage1/dietlibc/libcruft/inet_ntoa.c +++ b/mdk-stage1/dietlibc/libcruft/inet_ntoa.c @@ -2,8 +2,6 @@ #include <netinet/in.h> #include <arpa/inet.h> -extern char *inet_ntoa_r(struct in_addr in,char* buf); - char *inet_ntoa(struct in_addr in) { static char buf[20]; return inet_ntoa_r(in,buf); diff --git a/mdk-stage1/dietlibc/libcruft/inet_ntop.c b/mdk-stage1/dietlibc/libcruft/inet_ntop.c index 77c47f239..81bee0a90 100644 --- a/mdk-stage1/dietlibc/libcruft/inet_ntop.c +++ b/mdk-stage1/dietlibc/libcruft/inet_ntop.c @@ -1,6 +1,6 @@ +#include <sys/socket.h> #include <arpa/inet.h> - -extern char *inet_ntoa_r(struct in_addr in,char* buf); +#include <string.h> static const unsigned char V4mappedprefix[12]={0,0,0,0,0,0,0,0,0,0,0xff,0xff}; @@ -17,8 +17,7 @@ static int fmt_xlong(char* s,unsigned int i) { return s-bak+1; } -unsigned int fmt_ip6(char *s,const char ip[16]) -{ +static unsigned int fmt_ip6(char *s,const char ip[16]) { unsigned int len; unsigned int i; unsigned int temp; @@ -53,13 +52,16 @@ unsigned int fmt_ip6(char *s,const char ip[16]) } } } + if (compressing) { + *s++=':'; ++len; + } *s=0; return len; } const char* inet_ntop(int AF, const void *CP, char *BUF, size_t LEN) { char buf[100]; - int len; + size_t len; if (AF==AF_INET) { inet_ntoa_r(*(struct in_addr*)CP,buf); len=strlen(buf); diff --git a/mdk-stage1/dietlibc/libcruft/inet_pton.c b/mdk-stage1/dietlibc/libcruft/inet_pton.c index d5c17509c..a62785d5f 100644 --- a/mdk-stage1/dietlibc/libcruft/inet_pton.c +++ b/mdk-stage1/dietlibc/libcruft/inet_pton.c @@ -1,6 +1,9 @@ #include <stdlib.h> +#include <sys/socket.h> #include <arpa/inet.h> #include <errno.h> +#include <string.h> +#include "dietfeatures.h" static unsigned int scan_ip6(const char *s,char ip[16]) { @@ -9,8 +12,8 @@ static unsigned int scan_ip6(const char *s,char ip[16]) unsigned long u; char suffix[16]; - int prefixlen=0; - int suffixlen=0; + unsigned int prefixlen=0; + unsigned int suffixlen=0; for (i=0; i<16; i++) ip[i]=0; @@ -26,7 +29,7 @@ static unsigned int scan_ip6(const char *s,char ip[16]) } { char *tmp; - u=strtol(s,&tmp,16); + u=strtoul(s,&tmp,16); i=tmp-s; } @@ -60,7 +63,7 @@ static unsigned int scan_ip6(const char *s,char ip[16]) i=tmp-s; } if (!i) { - len--; + if (*s) len--; break; } if (suffixlen+prefixlen<=12 && s[i]=='.') { @@ -83,12 +86,14 @@ static unsigned int scan_ip6(const char *s,char ip[16]) } int inet_pton(int AF, const char *CP, void *BUF) { + int len; if (AF==AF_INET) { if (!inet_aton(CP,(struct in_addr*)BUF)) return 0; } else if (AF==AF_INET6) { - if (CP[scan_ip6(CP,BUF)]) - return 0; + if (CP[len=scan_ip6(CP,BUF)]) + if (CP[len]!='%') /* allow "fe80::220:e0ff:fe69:ad92%eth0" */ + return 0; } else { errno=EAFNOSUPPORT; return -1; diff --git a/mdk-stage1/dietlibc/libcruft/initgroups.c b/mdk-stage1/dietlibc/libcruft/initgroups.c index 7d24866e9..932fddfd6 100644 --- a/mdk-stage1/dietlibc/libcruft/initgroups.c +++ b/mdk-stage1/dietlibc/libcruft/initgroups.c @@ -3,9 +3,10 @@ #include <string.h> int initgroups(const char *user, gid_t group) { - int n=0; + int n=1; gid_t grouplist[32]; struct group *g; + grouplist[0]=group; setgrent(); while ((g=getgrent())) { char **duh=g->gr_mem; diff --git a/mdk-stage1/dietlibc/libcruft/mkstemp.c b/mdk-stage1/dietlibc/libcruft/mkstemp.c index 3b24ecb54..7dc19d4ed 100644 --- a/mdk-stage1/dietlibc/libcruft/mkstemp.c +++ b/mdk-stage1/dietlibc/libcruft/mkstemp.c @@ -1,14 +1,21 @@ #include <unistd.h> #include <fcntl.h> #include <string.h> +#include <stdlib.h> #include <errno.h> +#include "dietfeatures.h" + +#ifndef O_NOFOLLOW +#define O_NOFOLLOW 0 +#endif int mkstemp(char* template) { char *tmp=template+strlen(template)-6; int randfd; int i,res; unsigned int random; - for (i=0; i<6; ++i) if (tmp[i]!='X') { __set_errno(EINVAL); return -1; } + if (tmp<template) goto error; + for (i=0; i<6; ++i) if (tmp[i]!='X') { error: errno=EINVAL; return -1; } randfd=open("/dev/urandom",O_RDONLY); for (;;) { read(randfd,&random,sizeof(random)); @@ -16,8 +23,9 @@ int mkstemp(char* template) { int hexdigit=(random>>(i*5))&0x1f; tmp[i]=hexdigit>9?hexdigit+'a'-10:hexdigit+'0'; } - res=open(template,O_CREAT|O_RDWR|O_EXCL,0600); - if (res>=0) return res; + res=open(template,O_CREAT|O_RDWR|O_EXCL|O_NOFOLLOW,0600); + if (res>=0 || errno!=EEXIST) break; } close(randfd); + return res; } diff --git a/mdk-stage1/dietlibc/libcruft/res_init.c b/mdk-stage1/dietlibc/libcruft/res_init.c index 9322af298..78baa2b30 100644 --- a/mdk-stage1/dietlibc/libcruft/res_init.c +++ b/mdk-stage1/dietlibc/libcruft/res_init.c @@ -1,7 +1,9 @@ -extern int __dns_servers; +#include <resolv.h> + extern void __dns_readstartfiles(void); int res_init(void) { - __dns_servers=0; + _res.nscount=0; __dns_readstartfiles(); + return 0; } diff --git a/mdk-stage1/dietlibc/libcrypt/crypt.c b/mdk-stage1/dietlibc/libcrypt/crypt.c index 933397f5f..3c162d513 100644 --- a/mdk-stage1/dietlibc/libcrypt/crypt.c +++ b/mdk-stage1/dietlibc/libcrypt/crypt.c @@ -1,8 +1,9 @@ #include "dietfeatures.h" #include <unistd.h> +#include <md5.h> /* Initial permutation, */ -static char IP[] = { +static const char IP[] = { 57,49,41,33,25,17, 9, 1, 59,51,43,35,27,19,11, 3, 61,53,45,37,29,21,13, 5, @@ -14,7 +15,7 @@ static char IP[] = { }; /* Final permutation, FP = IP^(-1) */ -static char FP[] = { +static const char FP[] = { 39, 7,47,15,55,23,63,31, 38, 6,46,14,54,22,62,30, 37, 5,45,13,53,21,61,29, @@ -28,14 +29,14 @@ static char FP[] = { /* Permuted-choice 1 from the key bits to yield C and D. * Note that bits 8,16... are left out: They are intended for a parity check. */ -static char PC1_C[] = { +static const char PC1_C[] = { 56,48,40,32,24,16, 8, 0,57,49,41,33,25,17, 9, 1,58,50,42,34,26, 18,10, 2,59,51,43,35 }; -static char PC1_D[] = { +static const char PC1_D[] = { 62,54,46,38,30,22,14, 6,61,53,45,37,29,21, 13, 5,60,52,44,36,28, @@ -43,18 +44,18 @@ static char PC1_D[] = { }; /* Sequence of shifts used for the key schedule. */ -static char shifts[] = { 1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1 }; +static const char shifts[] = { 1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1 }; /* * Permuted-choice 2, to pick out the bits from the CD array that generate * the key schedule. */ -static char PC2_C[] = { +static const char PC2_C[] = { 13, 16, 10, 23, 0, 4, 2, 27, 14, 5, 20, 9, 22, 18, 11, 3, 25, 7, 15, 6, 26, 19, 12, 1 }; -static char PC2_D[] = { +static const char PC2_D[] = { 12, 23, 2, 8, 18, 26, 1, 11, 22, 16, 4, 19, 15, 20, 10, 27, 5, 24, 17, 13, 21, 7, 0, 3 }; @@ -68,7 +69,7 @@ static char KS[16][48]; /* The E bit-selection table. */ static char E[48]; -static char e2[] = { +static const char e2[] = { 32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9, 8, 9, 10, 11, 12, 13, 12, 13, 14, 15, 16, 17, 16, 17, 18, 19, 20, 21, 20, 21, 22, 23, 24, 25, @@ -119,7 +120,7 @@ void setkey(const char *key) /* The 8 selection functions. For some reason, they give a 0-origin index, * unlike everything else. */ -static char S[8][64] = { +static const char S[8][64] = { { 14, 4,13, 1, 2,15,11, 8, 3,10, 6,12, 5, 9, 0, 7, 0,15, 7, 4,14, 2,13, 1,10, 6,12,11, 9, 5, 3, 8, @@ -178,7 +179,7 @@ static char S[8][64] = { }; /* P is a permutation on the selected combination of the current L and key. */ -static char P[] = { +static const char P[] = { 15, 6,19,20, 28,11,27,16, 0,14,22,25, 4,17,30, 9, 1, 7,23,13, 31,26, 2, 8, 18,12,29, 5, 21,10, 3,24 }; @@ -192,11 +193,12 @@ static char f[32]; static char preS[48]; /* The payoff: encrypt a block. */ -void encrypt(char block[64], int edflag) +void encrypt(char block[64],int edflag) { int i, ii; register int t, j, k; + (void)edflag; /* First, permute the bits in the input */ for(j=0; j < 64; j++) L[j] = block[(int)IP[j]]; @@ -253,7 +255,10 @@ char * crypt(const char *pw, const char *salt) { register int i, j, c; static char block[66], iobuf[16]; - +#ifdef WANT_CRYPT_MD5 + if (salt[0]=='$' && salt[1]=='1' && salt[2]=='$') + return md5crypt(pw,salt); +#endif for(i=0; i < 66; i++) block[i] = 0; for(i=0; (c= *pw) && i < 64; pw++) { @@ -287,7 +292,7 @@ char * crypt(const char *pw, const char *salt) } for(i=0; i < 25; i++) - encrypt(block, 0); + encrypt(block,0); for(i=0; i < 11; i++) { c = 0; diff --git a/mdk-stage1/dietlibc/libdl/Makefile b/mdk-stage1/dietlibc/libdl/Makefile index c0463f887..29164f105 100644 --- a/mdk-stage1/dietlibc/libdl/Makefile +++ b/mdk-stage1/dietlibc/libdl/Makefile @@ -1,24 +1,38 @@ # local "test" make file -SRC = $(wildcard *.c) test/test.c +CC = gcc +DCC = diet $(CC) + +SRC = $(wildcard *.c) # test/test.c OBJ = _dl_jump.o $(SRC:.c=.o) -#CFLAGS = -Wall -O2 -CFLAGS = -g +#CFLAGS = -Wall -D__OD_CLEAN_ROOM -DNODIETREF -fPIC -g -O +CFLAGS = -Wall -O2 -D__OD_CLEAN_ROOM -DNODIETREF -fPIC -frerun-loop-opt -fschedule-insns2 $(DEB) # -fomit-frame-pointer %.o : %.S - $(HOME)/bin/diet gcc $(CFLAGS) -c -o $@ $^ + $(DCC) $(CFLAGS) -c -o $@ $^ %.o : %.c - $(HOME)/bin/diet gcc $(CFLAGS) -c -o $@ $^ + $(DCC) $(CFLAGS) -c -o $@ $^ + +it: t.out + +a.out: t.out + gcc -O -g test/a.c t.out -L/opt/diet/lib-i386 -lc -lgcc -o $@ -Wl,-dynamic-linker=`pwd`/t.out -nostdlib + +t.out: _dl_main.o + ld -shared -o $@ $? -soname=libdl.so + +all: test.out libdl.a -all: test.out +libdl.a: $(OBJ) + ar cru $@ $^ -test.g: test.c +test.g: test/test.c gcc -o $@ $^ -ldl -test.out: $(OBJ) - $(HOME)/bin/diet gcc -o $@ $^ +test.out: $(OBJ) test/test.o + diet gcc -o $@ $^ clean: $(RM) *.o *.a *.out *~ # *.so diff --git a/mdk-stage1/dietlibc/libdl/README b/mdk-stage1/dietlibc/libdl/README index 5d77bde34..6f1d0e46e 100644 --- a/mdk-stage1/dietlibc/libdl/README +++ b/mdk-stage1/dietlibc/libdl/README @@ -1,6 +1,82 @@ -this is the experimental libdl test-pre-pre-alpha code +this is the experimental libdl written by Olaf Dreesen -Shouldn't work yet had some problems with the elf specs... -and more inconsistencies... +Fri Nov 15 16:23:28 CET 2002 + + fixing the copy-relocation bug. + + TODO as last time.... plus + - dlsym with RTLD_NEXT + +Wed Nov 6 19:08:00 CET 2002 + + Ups.. misunderstood the manual-page of dlopen. + now dlopen(0,...) works the way it is described in the susv2, BUT still not + complete. + + TODO: + - gdb support + + - RTLD_GLOBAL/RTLD_LOCAL + at the moment ALL are GLOBAL. + + - open of a shared object ONCE + there is no library hard-, symlink detection yet. + + - code for other archs then i386 and arm + + +Fri Sep 13 16:28:42 CEST 2002 + + this unified libdl/dynlinker is now the default. + + +Mon Mar 11 19:44:20 CET 2002 + + the unified libdl/dynlinker now seems to stand the NORMAL usage so I think + it should be tested outside my CLEANROOM :) + + TODO: code for other archs than i386 and arm + + +Thu Nov 1 18:41:36 MET 2001 + + ufffff.... now the libdl code can be used in the libdl.so :) + Status: it works in my clean room on i386, arm-code started + + TODO: see below :) + + +Wed Jul 4 11:55:00 MEST 2001 + + Uwe Ohse pointed to some flaws in my code, I have started to fix them.... + + TODO: rebuild the code in a more readable and consistent way. + TODO: code for other archs than i386 + + +Thu Jun 21 15:32:45 MEST 2001 + + It work good enough to make a libdietc.so possible. + + TODO: rebuild the code in a more readable and consistent way. + TODO: code for other archs than i386 + + +Thu Jun 7 14:10:03 MEST 2001 + + Status: test-pre-alpha code + the code is now "testable" ... + I need a dyn-dietlibc specific ld.so. (in work) + + TODO: rebuild the code in a more readable and consistent way. + + +INITIAL May ? : + + Status: test-pre-pre-alpha code + + Shouldn't work yet. Had and have some problems with the elf specs... + and more inconsistencies... + diff --git a/mdk-stage1/dietlibc/libdl/_dl_int.h b/mdk-stage1/dietlibc/libdl/_dl_int.h index 659e6ee0f..1bab10a92 100644 --- a/mdk-stage1/dietlibc/libdl/_dl_int.h +++ b/mdk-stage1/dietlibc/libdl/_dl_int.h @@ -1,31 +1,151 @@ #ifndef ___DL_INT_H__ #define ___DL_INT_H__ +#if defined(__alpha__) || defined(__sparc64__) || defined(__x86_64__) +#define ELF_CLASS ELFCLASS64 +#else +#define ELF_CLASS ELFCLASS32 +#endif + #include <elf.h> +#include <dlfcn.h> + +#include "_dl_rel.h" + +#if ELF_CLASS == ELFCLASS32 + +#define Elf_Addr Elf32_Addr + +#define Elf_Dyn Elf32_Dyn +#define Elf_Ehdr Elf32_Ehdr +#define Elf_Phdr Elf32_Phdr +#define Elf_Rel Elf32_Rel +#define Elf_Rela Elf32_Rela +#define Elf_Sym Elf32_Sym + +#define ELF_R_SYM(x) ELF32_R_SYM((x)) +#define ELF_R_TYPE(x) ELF32_R_TYPE((x)) + +#define ELF_ST_BIND(x) ELF32_ST_BIND((x)) +#define ELF_ST_TYPE(x) ELF32_ST_TYPE((x)) + +#else + +#define Elf_Addr Elf64_Addr + +#define Elf_Dyn Elf64_Dyn +#define Elf_Ehdr Elf64_Ehdr +#define Elf_Phdr Elf64_Phdr +#define Elf_Rel Elf64_Rel +#define Elf_Rela Elf64_Rela +#define Elf_Sym Elf64_Sym + +#define ELF_R_SYM(x) ELF64_R_SYM((x)) +#define ELF_R_TYPE(x) ELF64_R_TYPE((x)) + +#define ELF_ST_BIND(x) ELF64_ST_BIND((x)) +#define ELF_ST_TYPE(x) ELF64_ST_TYPE((x)) + +#endif + +//#define DEBUG +#ifdef DEBUG +#ifndef __DIET_LD_SO__ +#include <stdio.h> +#define pf(s) write(2,s,strlen(s)) +#define ph(l) fdprintf(2,"%08lx",(l)) +#endif +#endif + +#define RTLD_USER 0x10000000 +#define RTLD_NOSONAME 0x20000000 +#define LDSO_FLAGS (RTLD_LAZY|RTLD_GLOBAL|RTLD_NOSONAME) struct _dl_handle { + char * mem_base; /* base address of maped *.so / or zero if program | Elf_Addr l_addr */ + char * l_name; /* Abloslute filename of this object */ + Elf_Dyn* dynamic; /* _DYNAMIC */ + + struct _dl_handle *next; + struct _dl_handle *prev; + + unsigned int flags; /* FLAGS */ + + char * name; /* name of shared object */ + /* basic */ - void * mem_base; /* base address of maped *.so */ unsigned long mem_size; /* len of mem block */ - unsigned int lnk_count; /* reference count */ + unsigned long lnk_count; /* reference count (other libraries) */ + + /* lazy evaluator data */ + unsigned long*pltgot; /* PLT/GOT */ /* symbol resolve helper */ unsigned long*hash_tab; /* hash table */ - Elf32_Sym * dyn_sym_tab; /* dynamic symbol table */ char * dyn_str_tab; /* dyn_name table */ + Elf_Sym * dyn_sym_tab; /* dynamic symbol table */ + _dl_rel_t* plt_rel; /* PLT relocation table */ - Elf32_Rel * plt_rel; /* PLT relocation table */ - - /* FINI */ + /* INIT / FINI */ void (*fini)(void); }; -#define HASH_BUCKET_LEN(p) ((p)) +/* debug communication (GDB) (dyn-linker only) */ +struct r_debug { + int r_version; + struct _dl_handle* r_map; + unsigned long r_brk; + enum { + RT_CONSISTENT, /* mapping complete */ + RT_ADD, /* begin add object */ + RT_DELETE, /* begin del object */ + } r_state; + unsigned long r_ldbase; +}; + +#define HASH_BUCKET_LEN(p) (*((p))) #define HASH_BUCKET(p) ((p)+2) -#define HASH_CHAIN_LEN(p) ((p)+1) +#define HASH_CHAIN_LEN(p) (*((p)+1)) #define HASH_CHAIN(p) ((p)+2+HASH_BUCKET_LEN(p)) -unsigned long elf_hash(const unsigned char *name); +/* _dl_alloc.c */ +extern struct _dl_handle* _dl_root_handle; +extern struct _dl_handle* _dl_top_handle; +extern struct _dl_handle* _dl_free_list; +#ifndef __DIET_LD_SO__ +void _dl_free_handle(struct _dl_handle* dh); +struct _dl_handle* _dl_get_handle(); +struct _dl_handle* _dl_find_lib(const char* name); + +/* _dl_open.c */ +void *_dl_open(const char* filename, int flags); + +/* _dl_load.c */ +void *_dl_load(const char* filename, const char*pathname, int fd, int flags); +struct _dl_handle* _dl_dyn_scan(struct _dl_handle* dh, void* dyn_addr, int flags); + +/* _dl_search.c */ +void _dl_set_rpath(const char *path); +const char* _dl_get_rpath(); +int _dl_search(char *buf, int len, const char *filename); + +/* dlsym.c */ +void *_dlsym(void*dh,char*symbol); +void *_dl_sym_search_str(struct _dl_handle*h,char*name); +void *_dl_sym(struct _dl_handle * h, int symbol); + +/* _dl_queue.c */ +int _dl_queue_lib(const char* name, int flags); +int _dl_open_dep(); + +/* _dl_relocate.c */ +int _dl_relocate(struct _dl_handle* dh, _dl_rel_t *rel, int num); + +/* dlerror.c */ +extern unsigned int _dl_error; +extern const char* _dl_error_location; +extern const char* _dl_error_data; +#endif #endif diff --git a/mdk-stage1/dietlibc/libdl/_dl_jump.S b/mdk-stage1/dietlibc/libdl/_dl_jump.S index 134f31ea5..bd7115258 100644 --- a/mdk-stage1/dietlibc/libdl/_dl_jump.S +++ b/mdk-stage1/dietlibc/libdl/_dl_jump.S @@ -1,8 +1,55 @@ .text .global _dl_jump _dl_jump: + +#ifdef __i386__ +.type _dl_jump,@function + + pushl %eax # save register args... + pushl %ecx + pushl %edx + + pushl %ebx + + pushl 20(%esp) # 2. arg from plt + pushl 20(%esp) # 1. arg from plt + +#ifdef __DYN_LIB + call 1f +1: popl %ebx + addl $_GLOBAL_OFFSET_TABLE_+[.-1b],%ebx + call do_rel@PLT +#else call do_rel - pop %edx - pop %edx - jmp *%eax +#endif + addl $8, %esp + + popl %ebx + + popl %edx # restore register args... + popl %ecx + + xchgl %eax, (%esp) # restore eax and save function pointer (for return) + + ret $8 # remove arguments from plt and jump to REAL function + +#endif + +#ifdef __arm__ +.type _dl_jump,function + + stmdb sp!, {r0, r1, r2, r3} + sub r1, ip, lr + sub r1, r1, #4 + add r1, r1, r1 /* dyntab entry */ + ldr r0, [lr, #-4] /* dynlib handle */ +#ifdef __DYN_LIB + bl do_rel(PLT) +#else + bl do_rel +#endif + mov r12, r0 + ldmia sp!, {r0, r1, r2, r3, lr} + mov pc, r12 +#endif diff --git a/mdk-stage1/dietlibc/libdl/_dl_open.c b/mdk-stage1/dietlibc/libdl/_dl_open.c index 1f907db21..f7bd0af95 100644 --- a/mdk-stage1/dietlibc/libdl/_dl_open.c +++ b/mdk-stage1/dietlibc/libdl/_dl_open.c @@ -1,207 +1,35 @@ -#include <stdio.h> -#include <unistd.h> -#include <sys/mman.h> +#include <fcntl.h> #include <dlfcn.h> -#include <linux/elf.h> +#include <limits.h> +#ifndef __DIET_LD_SO__ +#include <string.h> +#endif #include "_dl_int.h" -struct _dl_handle dl_test; - -#define _ELF_DWN_ROUND(ps,n) ((n)&(~((ps)-1))) -#define _ELF_UP_ROUND(ps,n) ((((n)&((ps)-1))?(ps):0)+ _ELF_DWN_ROUND((ps),(n))) -#define _ELF_RST_ROUND(ps,n) ((n)&((ps)-1)) - -void _dl_jump(); - -/* - * this file is a Q. & D. hack ... don't think this is bug free or meaningfull - */ - -static void *do_map_in(void *base, unsigned long length, int flags, int fd, unsigned long offset) -{ - int perm = 0; - if (flags & PF_X) perm|=PROT_EXEC; - if (flags & PF_R) perm|=PROT_READ; - if (flags & PF_W) perm|=PROT_WRITE; - return mmap(base, length, perm, MAP_PRIVATE|((base)?MAP_FIXED:0), fd, offset); -} - -unsigned long do_rel(struct _dl_handle * tmp_dl, unsigned long off) -{ -// struct _dl_handle * tmp_dl = ((void*)*((&off)-1)); - Elf32_Rel *tmp = ((void*)tmp_dl->plt_rel)+off; - int sym=ELF32_R_SYM(tmp->r_info); - register unsigned long sym_val; - - printf("do_rel %08x %08x\n",tmp_dl,off); - - printf ("do_rel %08x+%x\n",tmp_dl->plt_rel,off); - printf("do_rel @ %08x with type %d -> %d\n",tmp->r_offset,ELF32_R_TYPE(tmp->r_info),sym); - - printf("do_rel sym %08x\n",tmp_dl->dyn_sym_tab[sym].st_value); - - /* modify GOT for REAL symbol */ - sym_val=((unsigned long)(tmp_dl->mem_base+tmp_dl->dyn_sym_tab[sym].st_value)); - *((unsigned long*)(tmp_dl->mem_base+tmp->r_offset))=sym_val; - - printf("do_rel sym %08x\n",sym_val); - /* HOWTO JUMP ?!? */ - return sym_val; -} - -void *_dl_open(const char*pathname, int fd, int flag) -{ - int ps=getpagesize(); - int i; - unsigned char buf[1024]; - char *m=0,*d; - struct _dl_handle *ret=0; - - unsigned long l; - - Elf32_Ehdr *eh; - Elf32_Phdr *ph; - - int ld_nr=0; - Elf32_Phdr *ld[4]={0,0,0,0}; - Elf32_Phdr *dyn=0; - - if (fd==-1) return 0; - - printf("_dl_open: %s\n",pathname); - - read(fd, buf, 1024); - eh=(Elf32_Ehdr*)buf; - ph=(Elf32_Phdr*)&buf[eh->e_phoff]; - - for (i=0; i<eh->e_phnum; i++) { - if (ph[i].p_type==PT_LOAD) { - ld[ld_nr++]=ph+i; - } - if (ph[i].p_type==PT_DYNAMIC) { - dyn=ph+i; - } +#ifdef __DIET_LD_SO__ +static +#endif +void*_dl_open(const char*filename,int flags) { + int fd; + char buf[PATH_MAX]; + const char*p=0; + + for (fd=0;filename[fd] && (p==0);++fd) if (filename[fd]=='/') p=filename; + if (p) { +#ifdef __DIET_LD_SO__ + if ((fd=_dl_sys_open(p,O_RDONLY,0))<0) fd=-1; +#else + fd=open(p,O_RDONLY); +#endif + } else { + p=buf; + fd=_dl_search(buf,sizeof(buf)-1,filename); } - - if (ld_nr==1) { - unsigned long offset = _ELF_DWN_ROUND(ps,ld[0]->p_offset); - unsigned long off = _ELF_RST_ROUND(ps,ld[0]->p_offset); - unsigned long length = _ELF_UP_ROUND(ps,ld[0]->p_memsz+off); - m = (char*)do_map_in(0, length, ld[0]->p_flags, fd, offset); - - /* zero pad bss */ - l = ld[0]->p_offset+ld[0]->p_filesz; - memset(m+l,0,length-l); - - dl_test.mem_base=m; - dl_test.mem_size=length; - dl_test.lnk_count=0; - - ret = &dl_test; - } - else if (ld_nr==2) { /* aem... yes Quick & Really Dirty / for the avarage 99% */ - //unsigned long text_addr = _ELF_DWN_ROUND(ps,ld[0]->p_vaddr); - unsigned long text_offset = _ELF_DWN_ROUND(ps,ld[0]->p_offset); - unsigned long text_off = _ELF_RST_ROUND(ps,ld[0]->p_offset); - unsigned long text_size = _ELF_UP_ROUND(ps,ld[0]->p_memsz+text_off); - - unsigned long data_addr = _ELF_DWN_ROUND(ps,ld[1]->p_vaddr); - unsigned long data_offset = _ELF_DWN_ROUND(ps,ld[1]->p_offset); - unsigned long data_off = _ELF_RST_ROUND(ps,ld[1]->p_offset); - unsigned long data_size = _ELF_UP_ROUND(ps,ld[1]->p_memsz+data_off); - unsigned long data_fsize = _ELF_UP_ROUND(ps,ld[1]->p_filesz+data_off); - - /* mmap all mem_blocks for *.so */ - l = text_size+data_size; - - dl_test.mem_size=l; - - m = (char*) do_map_in(0,l,ld[0]->p_flags,fd,text_offset); - - /* release data,bss part */ - mprotect(m+data_addr, data_size, PROT_NONE); - - /* mmap data,bss part */ - d = (char*) do_map_in(m+data_addr,data_fsize,ld[1]->p_flags,fd,data_offset); - - /* zero pad bss */ - l = data_off+ld[1]->p_filesz; - memset(d+l,0,data_size-l); - - /* more bss ? */ - if (data_size>data_fsize) { - l = data_size-data_fsize; - mmap(d+data_fsize, l, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0); - } - - dl_test.mem_base=m; - dl_test.lnk_count=0; - ret = &dl_test; - } - - printf("_dl_open pre resolv\n"); - if (ret) { - Elf32_Dyn* dyn_tab = (void*)m+dyn->p_vaddr; - void (*init)(); - unsigned long* got=0; - void* jmprel=0; - int pltreltype=0; - int pltrelsize=0; - - printf("_dl_open IN resolv\n"); - for(i=0;dyn_tab[i].d_tag;i++) { - if (dyn_tab[i].d_tag==DT_HASH) { - ret->hash_tab = (unsigned long*)(m+dyn_tab[i].d_un.d_ptr); - } - if (dyn_tab[i].d_tag==DT_SYMTAB) { - ret->dyn_sym_tab = (Elf32_Sym*)(m+dyn_tab[i].d_un.d_ptr); - } - if (dyn_tab[i].d_tag==DT_STRTAB) { - ret->dyn_str_tab = (char*)(m+dyn_tab[i].d_un.d_ptr); - } - if (dyn_tab[i].d_tag==DT_FINI) { - ret->fini = (void(*)(void))(m+dyn_tab[i].d_un.d_val); - } - if (dyn_tab[i].d_tag==DT_INIT) { - init = (void(*)(void))(m+dyn_tab[i].d_un.d_val); - printf("init @ %08x\n",init); - } - if (dyn_tab[i].d_tag==DT_PLTGOT) { - got=(unsigned long*)(m+dyn_tab[i].d_un.d_val); - } - if (dyn_tab[i].d_tag==DT_PLTREL) { - pltreltype=dyn_tab[i].d_un.d_val; - } - if (dyn_tab[i].d_tag==DT_PLTRELSZ) { - pltrelsize=dyn_tab[i].d_un.d_val; - } - if (dyn_tab[i].d_tag==DT_JMPREL) { - jmprel=(m+dyn_tab[i].d_un.d_val); - dl_test.plt_rel=jmprel; - } - } - /* GOT */ - got[0]+=(unsigned long)m; - got[1]=(unsigned long)&dl_test; -// got[2]=(unsigned long)do_rel; - got[2]=(unsigned long)(_dl_jump); - /* */ - - if (pltreltype == DT_REL) { - Elf32_Rel *tmp = jmprel; - for (;(char*)tmp<(((char*)jmprel)+pltrelsize);(char*)tmp=((char*)tmp)+sizeof(Elf32_Rel)) { - *((unsigned long*)(m+tmp->r_offset))+=(unsigned long)m; -// *((unsigned long*)(m+tmp->r_offset))+=(unsigned long)do_rel; - printf("rel @ %08x with type %d -> %d\n",tmp->r_offset,ELF32_R_TYPE(tmp->r_info),ELF32_R_SYM(tmp->r_info)); - } - } - - printf("_dl_open post resolv, pre init\n"); - init(); + if (fd==-1) { + _dl_error_data=filename; + _dl_error=1; + return 0; } - printf("_dl_open post resolv, init\n"); - - close(fd); - return ret; + return _dl_load(filename,p,fd,flags); } diff --git a/mdk-stage1/dietlibc/libdl/_dl_search.c b/mdk-stage1/dietlibc/libdl/_dl_search.c index 5e3217d46..ccf9c51c5 100644 --- a/mdk-stage1/dietlibc/libdl/_dl_search.c +++ b/mdk-stage1/dietlibc/libdl/_dl_search.c @@ -1,68 +1,95 @@ -#include <unistd.h> #include <stdlib.h> -#include <string.h> #include <dlfcn.h> #include <fcntl.h> -#include <stdio.h> + +#include "_dl_int.h" #define WANT_LD_SO_CONF_SEARCH static const char *_dl_search_rpath=0; + +#ifndef __DIET_LD_SO__ +#include <unistd.h> +#include <string.h> void _dl_set_rpath(const char *path) { _dl_search_rpath=path; } +const char* _dl_get_rpath() { return _dl_search_rpath; } +#endif /* search a colon (semicolon) seperated path for the libraray "filename" */ -static int _dl_search_path(char *buf, int len, const char*path, const int pathlen, const char *filename) -{ - int fd,l=len,i=1; - const char *c,*pe=path+pathlen; +static int _dl_search_path(char*buf,int len,const char*path,const int pathlen,const char*filename) { + int fd,i=1,fl=strlen(filename),ml=len-fl; + const char*c,*pe=path+pathlen; if (path) { - for (c=path; c<pe; c+=i) { + for (c=path;c<pe;c+=i) { + int l=len-1; if ((*c==':')||(*c==';')) ++c; i=strcspn(c,":;"); if (i) { - strncpy(buf, c, i); buf[i]=0; - l-=i; - strncat(buf, "/", l); + if (i>ml) continue; /* if len(path-entry)+len(filename)+2 is greater than the buffer ? SKIP */ + memcpy(buf,c,i); + buf[i]='/'; + l-=++i; } - else - buf[0]=0; - strncat(buf, filename, --l); -// printf("_dl_search: %s\n",buf); + memcpy(buf+i,filename,fl); + buf[i+fl]=0; +#ifdef DEBUG +// pf(__func__": "); pf(buf); pf("\n"); +#endif +#ifdef __DIET_LD_SO__ + if ((fd=_dl_sys_open(buf,O_RDONLY,0))>-1) return fd; +#else if ((fd=open(buf,O_RDONLY))!=-1) return fd; +#endif } } return -1; } /* parse the SMALL file "conf" for lib directories (aem... hang me if you can :) ) */ -static int _dl_search_conf(char *buf, int len, const char *conf, const char *filename) -{ +static int _dl_search_conf(char*buf,int len,const char*conf,const char*filename) { char ld_so_conf[1024]; - int i,l,fd=open(conf,O_RDONLY); - if (fd!=-1) { + int i,l,fd; +#ifdef __DIET_LD_SO__ + if ((fd=_dl_sys_open(conf,O_RDONLY,0))>-1) { + l=_dl_sys_read(fd,ld_so_conf,sizeof(ld_so_conf)-1); +#else + if ((fd=open(conf,O_RDONLY))!=-1) { l=read(fd,ld_so_conf,sizeof(ld_so_conf)-1); +#endif ld_so_conf[sizeof(ld_so_conf)-1]=0; +#ifdef __DIET_LD_SO__ + _dl_sys_close(fd); +#else close(fd); - if (ld_so_conf[l-1]=='\n') ld_so_conf[--l]=0; - for (i=0;i<l;i++) if (ld_so_conf[i]=='\n') ld_so_conf[i]=':'; - if ((fd=_dl_search_path(buf,len,ld_so_conf,l,filename))!=-1) return fd; +#endif + if (l>0) { + if (ld_so_conf[l-1]=='\n') ld_so_conf[--l]=0; + for (i=0;i<l;i++) if (ld_so_conf[i]=='\n') ld_so_conf[i]=':'; + if ((fd=_dl_search_path(buf,len,ld_so_conf,l,filename))!=-1) return fd; + } } return -1; } -int _dl_search(char *buf, int len, const char *filename) -{ +#ifdef __DIET_LD_SO__ +static +#endif +int _dl_search(char*buf,int len,const char*filename) { int fd; - /* 1. search the LD_RUN_PATH (from the executable */ + /* 1. search the LD_RUN_PATH (from the executable) */ if (_dl_search_rpath) { if ((fd=_dl_search_path(buf,len,_dl_search_rpath,strlen(_dl_search_rpath),filename))!=-1) return fd; } /* 2. IF we have a "secure" enviroment THEN search LD_LIBRARY_PATH */ - if (getuid()==geteuid()) { +#ifdef __DIET_LD_SO__ + if ((at_uid==at_euid)&&(at_gid==at_egid)) { +#else + if ((getuid()==geteuid())&&(getgid()==getegid())) { +#endif char *p=getenv("LD_LIBRARY_PATH"); if (p) if ((fd=_dl_search_path(buf,len,p,strlen(p),filename))!=-1) return fd; @@ -78,7 +105,7 @@ int _dl_search(char *buf, int len, const char *filename) /* default path search */ { - const char* def_path="/usr/lib:/lib"; + const char def_path[]="/usr/lib:/lib"; return _dl_search_path(buf,len,def_path,strlen(def_path),filename); } } diff --git a/mdk-stage1/dietlibc/libdl/dlclose.c b/mdk-stage1/dietlibc/libdl/dlclose.c index 384550c47..6fafedcf5 100644 --- a/mdk-stage1/dietlibc/libdl/dlclose.c +++ b/mdk-stage1/dietlibc/libdl/dlclose.c @@ -1,14 +1,38 @@ +#include <sys/mman.h> + #include "_dl_int.h" -int dlclose (void *handle) -{ - if (handle) { - struct _dl_handle *h = handle; - if (h->lnk_count) { - --h->lnk_count; - return -1; +static void dec_referenced_libs(struct _dl_handle*dh) { + Elf_Dyn* dyn_tab=dh->dynamic; + int i; + for(i=0;dyn_tab[i].d_tag;i++) { + if (dyn_tab[i].d_tag==DT_NEEDED) { + char *lib_name=dh->dyn_str_tab+dyn_tab[i].d_un.d_val; +#ifdef DEBUG + pf(__FUNCTION__); pf(": lib: "); pf(lib_name); pf("\n"); +#endif + dlclose(_dl_find_lib(lib_name)); } - if (munmap(h->mem_base,h->mem_size)!=0) return -1; + } +} + +int dlclose(void*handle) { + _dl_error_location="dlclose"; + if (handle) { + struct _dl_handle*dh=handle; + if (--(dh->lnk_count)) return 0; /* not yet unreferenced */ + +#ifdef DEBUG + pf(__FUNCTION__); pf(": "); pf(dh->name); pf("\n"); +#endif + if (dh->fini) dh->fini(); + dec_referenced_libs(dh); +#ifdef __DIET_LD_SO__ + if (_dl_sys_munmap(dh->mem_base,dh->mem_size)<0) return -1; +#else + if (munmap(dh->mem_base,dh->mem_size)==-1) return -1; +#endif + _dl_free_handle(handle); } return 0; } diff --git a/mdk-stage1/dietlibc/libdl/dlerror.c b/mdk-stage1/dietlibc/libdl/dlerror.c index 1e31bae54..3fea0b75c 100644 --- a/mdk-stage1/dietlibc/libdl/dlerror.c +++ b/mdk-stage1/dietlibc/libdl/dlerror.c @@ -1,4 +1,55 @@ -const char *dlerror(void) -{ - return "HAE ?!?"; + +#include "_dl_int.h" + +#ifdef __DIET_LD_SO__ +static unsigned int _dl_error; +static const char*_dl_error_location; +static const char*_dl_error_data; +#else +#include <string.h> +unsigned int _dl_error; +const char*_dl_error_location; +const char*_dl_error_data; +#endif + +static struct _dl_err_msg { + char*msg; + int len; +} _dl_error_msg[]={ +#define MSG(n) { (n), sizeof((n))-1 } + MSG("can't open: "), /* 1 */ + MSG("can't stat: "), /* 2 */ + MSG("shared object is not position independent: "), /* 3 */ + MSG("can't resolve all symbols in: "), /* 4 */ + MSG("can't find symbol: "), /* 5 */ + MSG("invalid relocation type in: "), /* 6 */ + MSG("internal error: layout not yet supported: "), /* 7 */ +}; + +const char *dlerror(void) { + static char buf[1024],*p=buf; + register int l,len=sizeof(buf)-1; + if (_dl_error==0) return 0; + + buf[0]=0; + buf[len]=0; + --_dl_error; + + if (_dl_error>=(sizeof(_dl_error_msg)/sizeof(struct _dl_err_msg))) + return "HAE ?!?"; + + if (_dl_error_location) { + l=strlen(_dl_error_location); + strncpy(p,_dl_error_location,len); len-=l; p+=l; + strncpy(p,": ",len); len-=2; p+=2; + } + l=_dl_error_msg[_dl_error].len; + strncpy(p,_dl_error_msg[_dl_error].msg,len); len-=l; p+=l; + strncpy(p,_dl_error_data,len); + + _dl_error_location=0; + _dl_error_data=""; + _dl_error=0; + + return buf; } diff --git a/mdk-stage1/dietlibc/libdl/dlopen.c b/mdk-stage1/dietlibc/libdl/dlopen.c index 1693d889f..79fa7903c 100644 --- a/mdk-stage1/dietlibc/libdl/dlopen.c +++ b/mdk-stage1/dietlibc/libdl/dlopen.c @@ -2,20 +2,25 @@ #include <dlfcn.h> #include <limits.h> -int _dl_search(char*buf, int bufsize, const char*filename); -void *_dl_open(const char*pathname, int fd, int flag); +#include "_dl_int.h" -void *dlopen (const char *filename, int flag) -{ - int fd; - char buf[PATH_MAX]; - const char *p; - if (*filename=='/') - fd=open(p=filename,O_RDONLY); - else { - p=buf; - fd=_dl_search(buf,sizeof(buf),filename); +#ifdef __DIET_LD_SO__ +static +#endif +void*_dlopen(const char *filename, int flags) { + struct _dl_handle* ret; + if (filename) { + if ((ret=_dl_find_lib(filename))) { + ++(ret->lnk_count); /* add a reference */ + return ret; + } + return _dl_open(filename,flags); } + /* return 1 as an indicator for dlsym to search ALL global objects */ + return RTLD_DEFAULT; +} - return _dl_open(p,fd,flag); +void*dlopen(const char *filename, int flags) { + _dl_error_location="dlopen"; + return _dlopen(filename,flags|RTLD_USER|RTLD_NOSONAME); } diff --git a/mdk-stage1/dietlibc/libdl/dlsym.c b/mdk-stage1/dietlibc/libdl/dlsym.c index 2af940837..c58bb4d11 100644 --- a/mdk-stage1/dietlibc/libdl/dlsym.c +++ b/mdk-stage1/dietlibc/libdl/dlsym.c @@ -1,7 +1,92 @@ #include "_dl_int.h" -void *dlsym(void *handle, char *symbol) -{ - printf("dlsym(%08x,%s) -> %08x\n",handle,symbol,elf_hash(symbol)%17); - return 0; +#include "elf_hash.h" + +#ifdef __DIET_LD_SO__ +static +#endif +void *_dlsym(void*handle,char*symbol) { + unsigned long*sym=0; + if (handle) { + struct _dl_handle*dh=(struct _dl_handle*)handle; + unsigned long hash =elf_hash(symbol); + unsigned long bhash=hash%HASH_BUCKET_LEN(dh->hash_tab); + unsigned long*chain=HASH_CHAIN(dh->hash_tab); + unsigned long ind; + char *name=dh->dyn_str_tab; + +#ifdef DEBUG +// pf(__FUNCTION__); pf(": bucket("); ph(bhash); pf(",\""); pf(symbol); pf("\")\n"); +#endif + + ind=HASH_BUCKET(dh->hash_tab)[bhash]; +#ifdef DEBUG +// pf(__FUNCTION__); pf(": chain ("); ph(ind); pf(",\""); pf(symbol); pf("\")\n"); +#endif + + while(ind) { + int ptr=dh->dyn_sym_tab[ind].st_name; +#ifdef DEBUG +// pf(__FUNCTION__); pf(": symbol(\""); pf(name+ptr); pf("\",\"); pf(symbol); pf("\")\n"); +#endif + if (strcmp(name+ptr,symbol)==0) { + if (ELF_ST_TYPE(dh->dyn_sym_tab[ind].st_shndx)!=0) { + sym=(long*)(dh->mem_base+dh->dyn_sym_tab[ind].st_value); + break; /* ok found ... */ + } + } + ind=chain[ind]; + } +#ifdef DEBUG + pf(__FUNCTION__); pf(": symbol \""); pf(symbol); pf("\" @ "); ph((long)sym); pf("\n"); +#endif + } + return sym; +} + +#ifdef __DIET_LD_SO__ +static +#endif +void*_dl_sym_search_str(struct _dl_handle*dh,char*name) { + void *sym=0; + struct _dl_handle*tmp; +#ifdef DEBUG + pf(__FUNCTION__); pf(": search for: "); pf(name); pf("\n"); +#endif + for (tmp=_dl_root_handle;tmp && (!sym);tmp=tmp->next) { +// if (!(tmp->flags&RTLD_GLOBAL)) continue; +#ifdef DEBUG + pf(__FUNCTION__); pf(": searching in "); pf(tmp->name); pf("\n"); +#endif + sym=_dlsym((void*)tmp,name); +#ifdef DEBUG + if (sym) { pf(__FUNCTION__); pf(": found: "); pf(name); pf(" @ "); ph((long)sym); pf("\n"); } +#endif + } + return sym; +} + +#ifdef __DIET_LD_SO__ +static +#endif +void*_dl_sym(struct _dl_handle*dh,int symbol) { + char *name=dh->dyn_str_tab+dh->dyn_sym_tab[symbol].st_name; + void*sym=_dl_sym_search_str(dh,name); +#ifdef DEBUG + pf(__FUNCTION__); pf(": "); ph(symbol); pf(" -> "); ph((long)sym); pf("\n"); +#endif + return sym; +} + +void*dlsym(void*handle,char*symbol) { + void*h; + if (handle==RTLD_DEFAULT || !handle /* RTLD_DEFAULT is NULL on glibc */ ) + h=_dl_sym_search_str(0,symbol); + else h=_dlsym(handle,symbol); + if (h==0) { + _dl_error_location="dlsym"; + _dl_error_data=symbol; + _dl_error=5; + } + return h; } diff --git a/mdk-stage1/dietlibc/liblatin1/latin1-iscntrl.c b/mdk-stage1/dietlibc/liblatin1/latin1-iscntrl.c index b0c3605b0..5a6361442 100644 --- a/mdk-stage1/dietlibc/liblatin1/latin1-iscntrl.c +++ b/mdk-stage1/dietlibc/liblatin1/latin1-iscntrl.c @@ -1,5 +1,6 @@ #include <ctype.h> -int iscntrl(int c) { +int iscntrl(int x) { + unsigned char c=x&0xff; return (c<32) || (c>=127 && c<=160); } diff --git a/mdk-stage1/dietlibc/liblatin1/latin1-isgraph.c b/mdk-stage1/dietlibc/liblatin1/latin1-isgraph.c index c8d4a5df0..e79a19e52 100644 --- a/mdk-stage1/dietlibc/liblatin1/latin1-isgraph.c +++ b/mdk-stage1/dietlibc/liblatin1/latin1-isgraph.c @@ -1,4 +1,7 @@ -int isgraph(int c) { +#include <ctype.h> + +int isgraph(int x) { + unsigned char c=x&0xff; return (c>=33 && c<=126) || (c>=161 && c<=255); } diff --git a/mdk-stage1/dietlibc/liblatin1/latin1-islower.c b/mdk-stage1/dietlibc/liblatin1/latin1-islower.c index cab1a5171..c5ad18d1e 100644 --- a/mdk-stage1/dietlibc/liblatin1/latin1-islower.c +++ b/mdk-stage1/dietlibc/liblatin1/latin1-islower.c @@ -1,5 +1,6 @@ #include <ctype.h> int islower(int c) { - return (c>='a' && c<='z') || (c>=223 && c<=255 && c!=247); + unsigned char x=c&0xff; + return (x>='a' && x<='z') || (x>=223 && x<=255 && x!=247); } diff --git a/mdk-stage1/dietlibc/liblatin1/latin1-isprint.c b/mdk-stage1/dietlibc/liblatin1/latin1-isprint.c index f632483a0..9493892b1 100644 --- a/mdk-stage1/dietlibc/liblatin1/latin1-isprint.c +++ b/mdk-stage1/dietlibc/liblatin1/latin1-isprint.c @@ -1,4 +1,6 @@ +#include <ctype.h> -int isprint(int c) { +int isprint(int x) { + unsigned char c=x&0xff; return (c>=32 && c<=126) || (c>=160 && c<=255); } diff --git a/mdk-stage1/dietlibc/liblatin1/latin1-isupper.c b/mdk-stage1/dietlibc/liblatin1/latin1-isupper.c index 1c1d59db8..a024548fd 100644 --- a/mdk-stage1/dietlibc/liblatin1/latin1-isupper.c +++ b/mdk-stage1/dietlibc/liblatin1/latin1-isupper.c @@ -1,5 +1,6 @@ #include <ctype.h> int isupper(int c) { - return (c>='A' && c<='Z') || (c>=192 && c<=222 && c!=215); + unsigned char x=c&0xff; + return (x>='A' && x<='Z') || (x>=192 && x<=222 && x!=215); } diff --git a/mdk-stage1/dietlibc/libpthread/CHANGES b/mdk-stage1/dietlibc/libpthread/CHANGES index d39d990ba..63376623b 100644 --- a/mdk-stage1/dietlibc/libpthread/CHANGES +++ b/mdk-stage1/dietlibc/libpthread/CHANGES @@ -1,6 +1,12 @@ This is the pthread implementation of dietlibc. Written from scratch by Olaf Dreesen. +Mon Aug 6 15:46:39 MEST 2001 + + Ups... did the wrong error handling... the error is returned not put to + errno... + probably thread_key is not SMP save... + Thu Apr 12 16:47:12 MEST 2001 added conditional variables... diff --git a/mdk-stage1/dietlibc/libpthread/Makefile b/mdk-stage1/dietlibc/libpthread/Makefile index 06420f43a..f2ab8d8dc 100644 --- a/mdk-stage1/dietlibc/libpthread/Makefile +++ b/mdk-stage1/dietlibc/libpthread/Makefile @@ -12,14 +12,14 @@ VPATH=../$(ARCH)/ PTHREAD_OBJS = \ __testandset.o \ \ - thread_internal.o \ - thread_key.o \ + pthread_internal.o \ + pthread_key.o \ \ pthread_once.o pthread_spinlock.o \ \ pthread_create.o pthread_detach.o \ pthread_join.o pthread_self.o \ - pthread_exit.o \ + pthread_exit.o pthread_equal.o \ \ pthread_cleanup_push.o \ pthread_cleanup_pop.o \ @@ -72,6 +72,7 @@ PTHREAD_OBJS = \ pthread_sys_create.o \ pthread_sys_fcntl.o \ pthread_sys_fsync.o \ + pthread_sys_fdatasync.o \ pthread_sys_nanosleep.o \ pthread_sys_logging.o \ pthread_sys_open.o \ diff --git a/mdk-stage1/dietlibc/libpthread/README b/mdk-stage1/dietlibc/libpthread/README index 3139c731d..ee85a572d 100644 --- a/mdk-stage1/dietlibc/libpthread/README +++ b/mdk-stage1/dietlibc/libpthread/README @@ -3,7 +3,7 @@ LIBPTHREAD This is the pthread implementation of dietlibc. Written from scratch by Olaf Dreesen. -1. STATUS: incomplete but should work (or not... I had a lot of heisen-bugs...) +1. STATUS: near complete and should work (or not... I had a lot of heisen-bugs...) On non i386 archs the kernel header have major differences... NO workaround yet for this problems... @@ -15,13 +15,7 @@ Nested thread creation is now working fine... 2. HOW-TO make this lib: - 1. generate the dietlibc in the parent directory. - and make sure you have WANT_THREAD_SAVE active in the file: - dietfeatures.h - - 2. change back here and type make - - and then you should have a libpthread.a + it is a standard dietlibc helper lib... 3. NOTES diff --git a/mdk-stage1/dietlibc/libpthread/pthread_atfork.c b/mdk-stage1/dietlibc/libpthread/pthread_atfork.c index 2dc612dcc..70ca9f162 100644 --- a/mdk-stage1/dietlibc/libpthread/pthread_atfork.c +++ b/mdk-stage1/dietlibc/libpthread/pthread_atfork.c @@ -36,7 +36,7 @@ int pthread_atfork(void (*prepare)(void), __pthread_unlock(&__atfork_struct_lock); __NO_ASYNC_CANCEL_END; - if (ret) (*(__errno_location()))=ENOMEM; + if (ret) ret=ENOMEM; return ret; } diff --git a/mdk-stage1/dietlibc/libpthread/pthread_attr_init.c b/mdk-stage1/dietlibc/libpthread/pthread_attr_init.c index 726e88fe5..fbcefa3bd 100644 --- a/mdk-stage1/dietlibc/libpthread/pthread_attr_init.c +++ b/mdk-stage1/dietlibc/libpthread/pthread_attr_init.c @@ -1,3 +1,4 @@ +#include <string.h> #include <unistd.h> #include <errno.h> diff --git a/mdk-stage1/dietlibc/libpthread/pthread_attr_setdetachstate.c b/mdk-stage1/dietlibc/libpthread/pthread_attr_setdetachstate.c index 690ad5f8e..f5eab5816 100644 --- a/mdk-stage1/dietlibc/libpthread/pthread_attr_setdetachstate.c +++ b/mdk-stage1/dietlibc/libpthread/pthread_attr_setdetachstate.c @@ -13,6 +13,5 @@ int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate) attr->__detachstate=detachstate; return 0; } - (*(__errno_location()))=EINVAL; - return -1; + return EINVAL; } diff --git a/mdk-stage1/dietlibc/libpthread/pthread_attr_setinheritsched.c b/mdk-stage1/dietlibc/libpthread/pthread_attr_setinheritsched.c index f38e6e35e..0b7a691e7 100644 --- a/mdk-stage1/dietlibc/libpthread/pthread_attr_setinheritsched.c +++ b/mdk-stage1/dietlibc/libpthread/pthread_attr_setinheritsched.c @@ -13,6 +13,5 @@ int pthread_attr_setinheritsched(pthread_attr_t *attr, int inherit) attr->__inheritsched=inherit; return 0; } - (*(__errno_location()))=EINVAL; - return -1; + return EINVAL; } diff --git a/mdk-stage1/dietlibc/libpthread/pthread_attr_setschedparam.c b/mdk-stage1/dietlibc/libpthread/pthread_attr_setschedparam.c index 833c0111b..a3e5a9b4a 100644 --- a/mdk-stage1/dietlibc/libpthread/pthread_attr_setschedparam.c +++ b/mdk-stage1/dietlibc/libpthread/pthread_attr_setschedparam.c @@ -12,12 +12,11 @@ int pthread_attr_setschedparam(pthread_attr_t *attr, const struct sched_param *p attr->__schedparam.sched_priority=0; return 0; } - if (((attr->__schedpolicy == SCHED_RR) || (attr->__schedpolicy == SCHED_RR)) + if (((attr->__schedpolicy == SCHED_RR) || (attr->__schedpolicy == SCHED_FIFO)) && ((param->sched_priority > 0) && (param->sched_priority < 100))) { attr->__schedparam.sched_priority=param->sched_priority; return 0; } - (*(__errno_location()))=EINVAL; - return -1; + return EINVAL; } diff --git a/mdk-stage1/dietlibc/libpthread/pthread_attr_setschedpolicy.c b/mdk-stage1/dietlibc/libpthread/pthread_attr_setschedpolicy.c index e845bca32..227d3f7ad 100644 --- a/mdk-stage1/dietlibc/libpthread/pthread_attr_setschedpolicy.c +++ b/mdk-stage1/dietlibc/libpthread/pthread_attr_setschedpolicy.c @@ -17,9 +17,8 @@ int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy) attr->__schedpolicy=policy; return 0; } - (*(__errno_location()))=ENOTSUP; + return ENOTSUP; } else - (*(__errno_location()))=EINVAL; - return -1; + return EINVAL; } diff --git a/mdk-stage1/dietlibc/libpthread/pthread_attr_setscope.c b/mdk-stage1/dietlibc/libpthread/pthread_attr_setscope.c index 39088c9b2..9be11ca2d 100644 --- a/mdk-stage1/dietlibc/libpthread/pthread_attr_setscope.c +++ b/mdk-stage1/dietlibc/libpthread/pthread_attr_setscope.c @@ -11,8 +11,7 @@ int pthread_attr_setscope(pthread_attr_t *attr, int scope) if (scope==PTHREAD_SCOPE_SYSTEM) return 0; if (scope==PTHREAD_SCOPE_PROCESS) - (*(__errno_location()))=ENOTSUP; + return ENOTSUP; else - (*(__errno_location()))=EINVAL; - return -1; + return EINVAL; } diff --git a/mdk-stage1/dietlibc/libpthread/pthread_attr_setstacksize.c b/mdk-stage1/dietlibc/libpthread/pthread_attr_setstacksize.c index cfbab7747..1a0aae929 100644 --- a/mdk-stage1/dietlibc/libpthread/pthread_attr_setstacksize.c +++ b/mdk-stage1/dietlibc/libpthread/pthread_attr_setstacksize.c @@ -12,6 +12,5 @@ int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize) attr->__stacksize=stacksize; return 0; } - (*(__errno_location()))=EINVAL; - return -1; + return EINVAL; } diff --git a/mdk-stage1/dietlibc/libpthread/pthread_cancel.c b/mdk-stage1/dietlibc/libpthread/pthread_cancel.c index 4c87a3ed1..c0ae60349 100644 --- a/mdk-stage1/dietlibc/libpthread/pthread_cancel.c +++ b/mdk-stage1/dietlibc/libpthread/pthread_cancel.c @@ -14,14 +14,12 @@ int pthread_cancel(pthread_t th) j=__find_thread_id(th); if (j==-1) { - (*(__errno_location()))=ESRCH; - return -1; + return ESRCH; } thread = __get_thread_struct(j); if (thread==0) { - (*(__errno_location()))=ESRCH; - return -1; + return ESRCH; } if (thread->cancelstate!=PTHREAD_CANCEL_DISABLE) { diff --git a/mdk-stage1/dietlibc/libpthread/pthread_cond_broadcast.c b/mdk-stage1/dietlibc/libpthread/pthread_cond_broadcast.c index d3c2274f3..776e0adfc 100644 --- a/mdk-stage1/dietlibc/libpthread/pthread_cond_broadcast.c +++ b/mdk-stage1/dietlibc/libpthread/pthread_cond_broadcast.c @@ -10,14 +10,17 @@ int pthread_cond_broadcast(pthread_cond_t *cond) __THREAD_INIT(); + __NO_ASYNC_CANCEL_BEGIN; __pthread_lock(&(cond->lock)); - while ((tmp=cond->wait_chain)) { - cond->wait_chain=tmp->waitnext; + + for (tmp=cond->wait_chain;tmp;tmp=tmp->waitnext) { tmp->waitnext=0; tmp->waiting=0; } - __pthread_unlock(&(cond->lock)); + cond->wait_chain=0; + __pthread_unlock(&(cond->lock)); + __NO_ASYNC_CANCEL_STOP; return 0; } diff --git a/mdk-stage1/dietlibc/libpthread/pthread_cond_destroy.c b/mdk-stage1/dietlibc/libpthread/pthread_cond_destroy.c index 9a6cc4f0b..b553b41df 100644 --- a/mdk-stage1/dietlibc/libpthread/pthread_cond_destroy.c +++ b/mdk-stage1/dietlibc/libpthread/pthread_cond_destroy.c @@ -1,3 +1,4 @@ +#include <string.h> #include <unistd.h> #include <errno.h> @@ -9,8 +10,7 @@ int pthread_cond_destroy(pthread_cond_t *cond) __THREAD_INIT(); if (cond->wait_chain) { - (*__errno_location())=EBUSY; - return 1; + return EBUSY; } memset(cond,0,sizeof(pthread_cond_t)); diff --git a/mdk-stage1/dietlibc/libpthread/pthread_cond_init.c b/mdk-stage1/dietlibc/libpthread/pthread_cond_init.c index 20b38bef2..76dd5cb97 100644 --- a/mdk-stage1/dietlibc/libpthread/pthread_cond_init.c +++ b/mdk-stage1/dietlibc/libpthread/pthread_cond_init.c @@ -1,3 +1,4 @@ +#include <string.h> #include <unistd.h> #include <errno.h> diff --git a/mdk-stage1/dietlibc/libpthread/pthread_cond_signal.c b/mdk-stage1/dietlibc/libpthread/pthread_cond_signal.c index 60bf2119c..02a3c028e 100644 --- a/mdk-stage1/dietlibc/libpthread/pthread_cond_signal.c +++ b/mdk-stage1/dietlibc/libpthread/pthread_cond_signal.c @@ -10,9 +10,11 @@ int pthread_cond_signal(pthread_cond_t *cond) __THREAD_INIT(); + __NO_ASYNC_CANCEL_BEGIN; __pthread_lock(&(cond->lock)); if ((tmp=cond->wait_chain)) cond->wait_chain=tmp->waitnext; __pthread_unlock(&(cond->lock)); + __NO_ASYNC_CANCEL_STOP; if (tmp) { tmp->waitnext=0; diff --git a/mdk-stage1/dietlibc/libpthread/pthread_cond_timedwait.c b/mdk-stage1/dietlibc/libpthread/pthread_cond_timedwait.c index 6613f2ca9..71d80bdb5 100644 --- a/mdk-stage1/dietlibc/libpthread/pthread_cond_timedwait.c +++ b/mdk-stage1/dietlibc/libpthread/pthread_cond_timedwait.c @@ -9,13 +9,14 @@ int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, { _pthread_descr tmp; _pthread_descr this; - int ret; + int ret=0; __THREAD_INIT(); this=__thread_self(); /* put in wait-chain */ + __NO_ASYNC_CANCEL_BEGIN; __pthread_lock(&(cond->lock)); this->waiting=1; if (cond->wait_chain) { @@ -23,21 +24,51 @@ int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, tmp->waitnext=this; } else cond->wait_chain=this; __pthread_unlock(&(cond->lock)); + __NO_ASYNC_CANCEL_STOP; - /* Aeh yeah / wait till signal */ + /* Aeh yeah / wait till cond-signal OR timeout */ pthread_mutex_unlock(mutex); - ret=nanosleep(abstime,0); + while (this->waiting) { + struct timeval tv; + gettimeofday(&tv,0); + if ((abstime->tv_sec <= tv.tv_sec) && (abstime->tv_nsec <= (tv.tv_usec*1000))) { + ret = 1; + break; + } + __thread_wait_some_time(); + if (this->canceled) break; /* a cancel */ + } pthread_mutex_lock(mutex); - __TEST_CANCEL(); - - if (ret) { - if ((*__errno_location())!=EINTR) return -1; - return 0; + __NO_ASYNC_CANCEL_BEGIN; + __pthread_lock(&(cond->lock)); + if (this->waiting) { /* still waiting -> TIMEOUT or SIGNAL */ + _pthread_descr prev; + /* remove from wait-chain */ + prev=cond->wait_chain; + if ((prev=cond->wait_chain)==this) { + cond->wait_chain=this->waitnext; + } else { + for (tmp=prev->waitnext;tmp;prev=tmp,tmp=prev->waitnext) { + if (tmp==this) { + prev->waitnext=this->waitnext; + break; + } + } + } + this->waiting=0; + this->waitnext=0; } + __pthread_unlock(&(cond->lock)); + __NO_ASYNC_CANCEL_END; + + if (ret) return ETIMEDOUT; - (*__errno_location())=ETIMEDOUT; - return -1; + { + register int err = (*__errno_location()); + if (err==EINTR) return err; + } + return 0; } diff --git a/mdk-stage1/dietlibc/libpthread/pthread_cond_wait.c b/mdk-stage1/dietlibc/libpthread/pthread_cond_wait.c index 0c6c0ae13..8db49e840 100644 --- a/mdk-stage1/dietlibc/libpthread/pthread_cond_wait.c +++ b/mdk-stage1/dietlibc/libpthread/pthread_cond_wait.c @@ -14,6 +14,7 @@ int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex) this=__thread_self(); /* put in wait-chain */ + __NO_ASYNC_CANCEL_BEGIN; __pthread_lock(&(cond->lock)); this->waiting=1; if (cond->wait_chain) { @@ -21,16 +22,37 @@ int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex) tmp->waitnext=this; } else cond->wait_chain=this; __pthread_unlock(&(cond->lock)); + __NO_ASYNC_CANCEL_STOP; /* Aeh yeah / wait till signal */ pthread_mutex_unlock(mutex); while (this->waiting) { __thread_wait_some_time(); - if (this->canceled) this->waiting=0; /* we got a cancel signal */ + if (this->canceled) break; /* we got a cancel signal */ } pthread_mutex_lock(mutex); - __TEST_CANCEL(); + __NO_ASYNC_CANCEL_BEGIN; + __pthread_lock(&(cond->lock)); + if (this->waiting) { /* still waiting -> SIGNAL */ + _pthread_descr prev; + /* remove from wait-chain */ + prev=cond->wait_chain; + if ((prev=cond->wait_chain)==this) { + cond->wait_chain=this->waitnext; + } else { + for (tmp=prev->waitnext;tmp;prev=tmp,tmp=prev->waitnext) { + if (tmp==this) { + prev->waitnext=this->waitnext; + break; + } + } + } + this->waiting=0; + this->waitnext=0; + } + __pthread_unlock(&(cond->lock)); + __NO_ASYNC_CANCEL_END; return 0; } diff --git a/mdk-stage1/dietlibc/libpthread/pthread_create.c b/mdk-stage1/dietlibc/libpthread/pthread_create.c index b4a499081..714c2bf4b 100644 --- a/mdk-stage1/dietlibc/libpthread/pthread_create.c +++ b/mdk-stage1/dietlibc/libpthread/pthread_create.c @@ -15,21 +15,20 @@ int pthread_create (pthread_t *thread, const pthread_attr_t *attr, __THREAD_INIT(); if (start_routine==0) { - (*(__errno_location()))=EINVAL; - return -1; + return EINVAL; } td = __thread_get_free(); if (td) { + td->go.__spinlock=PTHREAD_SPIN_LOCKED; if (!(attr)) { pthread_attr_init(&default_attr); attr=&default_attr; } if ((td->policy!=SCHED_OTHER)&&(td->priority==0)) { - (*(__errno_location()))=EINVAL; - return -1; + return EINVAL; } if (attr->__inheritsched==PTHREAD_INHERIT_SCHED) { @@ -48,14 +47,17 @@ int pthread_create (pthread_t *thread, const pthread_attr_t *attr, td->stack_size = attr->__stacksize; - if (!(td->stack_addr)) { + if (!(attr->__stackaddr)) { char *stack=(char*)malloc(td->stack_size); if (!(stack)) { - (*(__errno_location()))=EINVAL; - return -1; + return EINVAL; } td->stack_begin = stack; +#ifdef __parisc__ + td->stack_addr = stack; +#else td->stack_addr = stack+td->stack_size; +#endif } else { td->stack_begin = 0; td->stack_addr = attr->__stackaddr; @@ -65,12 +67,15 @@ int pthread_create (pthread_t *thread, const pthread_attr_t *attr, if (ret>1) *thread=ret; - else + else { + ++td->exited; /* mark as exited */ __thread_cleanup(td); + if (ret<0) return (*(__errno_location())); + return EAGAIN; + } } else - (*(__errno_location()))=EAGAIN; + return EAGAIN; - if (ret<2) return -1; - return ret; + return 0; } diff --git a/mdk-stage1/dietlibc/libpthread/pthread_detach.c b/mdk-stage1/dietlibc/libpthread/pthread_detach.c index c07280389..2f72b97a7 100644 --- a/mdk-stage1/dietlibc/libpthread/pthread_detach.c +++ b/mdk-stage1/dietlibc/libpthread/pthread_detach.c @@ -13,19 +13,12 @@ int pthread_detach(pthread_t th) j=__find_thread_id(th); if (j==-1) { - (*(__errno_location()))=ESRCH; - return -1; + return ESRCH; } thread = __get_thread_struct(j); - if (thread==0) { - (*(__errno_location()))=ESRCH; - return -1; - } - if (thread->detached) { - (*(__errno_location()))=EINVAL; - return -1; + return EINVAL; } if (!thread->joined) { diff --git a/mdk-stage1/dietlibc/libpthread/pthread_join.c b/mdk-stage1/dietlibc/libpthread/pthread_join.c index 5b295bad1..39c076555 100644 --- a/mdk-stage1/dietlibc/libpthread/pthread_join.c +++ b/mdk-stage1/dietlibc/libpthread/pthread_join.c @@ -16,35 +16,24 @@ int pthread_join(pthread_t th, void **thread_return) j=__find_thread_id(th); if (j==-1) { - (*(__errno_location()))=ESRCH; - return -1; + return ESRCH; } thread = __get_thread_struct(j); /* error handling */ if (thread==0) { - (*(__errno_location()))=ESRCH; - return -1; + return ESRCH; } if (this==thread) { - (*(__errno_location()))=EDEADLK; - return -1; + return EDEADLK; } if (thread->detached || thread->joined) { - (*(__errno_location()))=EINVAL; - return -1; + return EINVAL; } - thread->joined=this; - this->join=1; - - while(this->join) __thread_wait_some_time(); - - if (thread_return) *thread_return=this->retval; - - return 0; + return __thread_join(thread,thread_return); } diff --git a/mdk-stage1/dietlibc/libpthread/pthread_key_create.c b/mdk-stage1/dietlibc/libpthread/pthread_key_create.c index 44fccea6a..9718c695b 100644 --- a/mdk-stage1/dietlibc/libpthread/pthread_key_create.c +++ b/mdk-stage1/dietlibc/libpthread/pthread_key_create.c @@ -1,3 +1,4 @@ +#include <string.h> #include <unistd.h> #include <errno.h> @@ -19,7 +20,7 @@ int pthread_key_create(pthread_key_t *key, void (*destructor)(const void*)) if (!__thread_keys[i].used) { __thread_keys[i].used=1; __thread_keys[i].destructor=destructor; - memset(__thread_keys[i].tkd,0,PTHREAD_THREADS_MAX*sizeof(struct _thread_key)); + memset(__thread_keys[i].tkd,0,PTHREAD_THREADS_MAX*sizeof(void*)); *key=i; ret=0; break; @@ -29,7 +30,7 @@ int pthread_key_create(pthread_key_t *key, void (*destructor)(const void*)) __pthread_unlock(&__thread_keys_lock); __NO_ASYNC_CANCEL_END; - if (ret) (*__errno_location())=EAGAIN; - return ret; + if (ret) return EAGAIN; + return 0; } diff --git a/mdk-stage1/dietlibc/libpthread/pthread_key_delete.c b/mdk-stage1/dietlibc/libpthread/pthread_key_delete.c index b1bc366e2..8f7fb577f 100644 --- a/mdk-stage1/dietlibc/libpthread/pthread_key_delete.c +++ b/mdk-stage1/dietlibc/libpthread/pthread_key_delete.c @@ -10,8 +10,7 @@ int pthread_key_delete(pthread_key_t key) __THREAD_INIT(); if (key>=PTHREAD_KEYS_MAX) { - (*__errno_location())=EINVAL; - return -1; + return EINVAL; } __thread_keys[key].used=0; diff --git a/mdk-stage1/dietlibc/libpthread/pthread_mutex_destroy.c b/mdk-stage1/dietlibc/libpthread/pthread_mutex_destroy.c index 33a16abd4..f5d66613c 100644 --- a/mdk-stage1/dietlibc/libpthread/pthread_mutex_destroy.c +++ b/mdk-stage1/dietlibc/libpthread/pthread_mutex_destroy.c @@ -8,9 +8,8 @@ int pthread_mutex_destroy(pthread_mutex_t *mutex) { __THREAD_INIT(); - if ((mutex->owner)||(mutex->lock.__spinlock)) { - (*(__errno_location()))=EBUSY; - return -1; + if ((mutex->owner)||(mutex->lock.__spinlock==PTHREAD_SPIN_LOCKED)) { + return EBUSY; } return 0; } diff --git a/mdk-stage1/dietlibc/libpthread/pthread_mutex_init.c b/mdk-stage1/dietlibc/libpthread/pthread_mutex_init.c index b1797fb20..65161d0ec 100644 --- a/mdk-stage1/dietlibc/libpthread/pthread_mutex_init.c +++ b/mdk-stage1/dietlibc/libpthread/pthread_mutex_init.c @@ -1,6 +1,6 @@ #include <unistd.h> #include <errno.h> - +#include <string.h> #include <pthread.h> #include "thread_internal.h" diff --git a/mdk-stage1/dietlibc/libpthread/pthread_mutex_lock.c b/mdk-stage1/dietlibc/libpthread/pthread_mutex_lock.c index 0c3ade9e8..0df2bcd8d 100644 --- a/mdk-stage1/dietlibc/libpthread/pthread_mutex_lock.c +++ b/mdk-stage1/dietlibc/libpthread/pthread_mutex_lock.c @@ -15,19 +15,18 @@ int pthread_mutex_lock(pthread_mutex_t *mutex) this = __thread_self(); - if (this!=mutex->owner) { - /* wait for mutex to free */ - __pthread_lock(&(mutex->lock)); - - mutex->owner=this; - } - else if (mutex->kind==PTHREAD_MUTEX_ERRORCHECK_NP) - { - (*(__errno_location()))=EDEADLK; - return -1; + if (this==mutex->owner) { + if (mutex->kind==PTHREAD_MUTEX_ERRORCHECK_NP) + return EDEADLK; + if (mutex->kind==PTHREAD_MUTEX_RECURSIVE_NP) { + ++(mutex->count); + return 0; + } } - if (mutex->kind==PTHREAD_MUTEX_RECURSIVE_NP) ++(mutex->count); + /* wait for mutex to free */ + __pthread_lock(&(mutex->lock)); + mutex->owner=this; return 0; } diff --git a/mdk-stage1/dietlibc/libpthread/pthread_mutex_trylock.c b/mdk-stage1/dietlibc/libpthread/pthread_mutex_trylock.c index fcf63f75e..620d26150 100644 --- a/mdk-stage1/dietlibc/libpthread/pthread_mutex_trylock.c +++ b/mdk-stage1/dietlibc/libpthread/pthread_mutex_trylock.c @@ -18,16 +18,13 @@ int pthread_mutex_trylock(pthread_mutex_t *mutex) if (this!=mutex->owner) { /* wait for mutex to free */ if (__pthread_trylock(&(mutex->lock))) { - (*(__errno_location()))=EBUSY; - return -1; + return EBUSY; } mutex->owner=this; } - else if (mutex->kind==PTHREAD_MUTEX_ERRORCHECK_NP) - { - (*(__errno_location()))=EDEADLK; - return -1; + else if (mutex->kind==PTHREAD_MUTEX_ERRORCHECK_NP) { + return EDEADLK; } if (mutex->kind==PTHREAD_MUTEX_RECURSIVE_NP) ++(mutex->count); diff --git a/mdk-stage1/dietlibc/libpthread/pthread_mutex_unlock.c b/mdk-stage1/dietlibc/libpthread/pthread_mutex_unlock.c index 0b5a1d0f7..0c12282c1 100644 --- a/mdk-stage1/dietlibc/libpthread/pthread_mutex_unlock.c +++ b/mdk-stage1/dietlibc/libpthread/pthread_mutex_unlock.c @@ -17,17 +17,14 @@ int pthread_mutex_unlock(pthread_mutex_t *mutex) if (this==mutex->owner) { if (mutex->kind==PTHREAD_MUTEX_RECURSIVE_NP) { - if (--(mutex->count)) - return 0; + if (--(mutex->count)) return 0; } mutex->owner=0; __pthread_unlock(&(mutex->lock)); } - else if (mutex->kind==PTHREAD_MUTEX_ERRORCHECK_NP) - { - (*(__errno_location()))=EPERM; - return -1; + else if (mutex->kind==PTHREAD_MUTEX_ERRORCHECK_NP) { + return EPERM; } return 0; diff --git a/mdk-stage1/dietlibc/libpthread/pthread_mutexattr_setkind_np.c b/mdk-stage1/dietlibc/libpthread/pthread_mutexattr_setkind_np.c index ac600f8ed..8b110fe5a 100644 --- a/mdk-stage1/dietlibc/libpthread/pthread_mutexattr_setkind_np.c +++ b/mdk-stage1/dietlibc/libpthread/pthread_mutexattr_setkind_np.c @@ -13,6 +13,5 @@ int pthread_mutexattr_setkind_np(pthread_mutexattr_t *attr, int kind) attr->__mutexkind=kind; return 0; } - (*(__errno_location()))=EINVAL; - return -1; + return EINVAL; } diff --git a/mdk-stage1/dietlibc/libpthread/pthread_setcancelstate.c b/mdk-stage1/dietlibc/libpthread/pthread_setcancelstate.c index b906492fb..f832bef70 100644 --- a/mdk-stage1/dietlibc/libpthread/pthread_setcancelstate.c +++ b/mdk-stage1/dietlibc/libpthread/pthread_setcancelstate.c @@ -20,6 +20,5 @@ int pthread_setcancelstate(int state, int *oldstate) return 0; } - (*(__errno_location()))=EINVAL; - return -1; + return EINVAL; } diff --git a/mdk-stage1/dietlibc/libpthread/pthread_setcanceltype.c b/mdk-stage1/dietlibc/libpthread/pthread_setcanceltype.c index 03d1f53de..f5669b70d 100644 --- a/mdk-stage1/dietlibc/libpthread/pthread_setcanceltype.c +++ b/mdk-stage1/dietlibc/libpthread/pthread_setcanceltype.c @@ -20,6 +20,5 @@ int pthread_setcanceltype(int type, int *oldtype) return 0; } - (*(__errno_location()))=EINVAL; - return -1; + return EINVAL; } diff --git a/mdk-stage1/dietlibc/libpthread/pthread_setspecific.c b/mdk-stage1/dietlibc/libpthread/pthread_setspecific.c index 78339c20b..b66ce31d0 100644 --- a/mdk-stage1/dietlibc/libpthread/pthread_setspecific.c +++ b/mdk-stage1/dietlibc/libpthread/pthread_setspecific.c @@ -15,7 +15,6 @@ int pthread_setspecific(pthread_key_t key, const void *value) __thread_keys[key].tkd[id]=value; return 0; } - (*__errno_location())=EINVAL; - return -1; + return EINVAL; } diff --git a/mdk-stage1/dietlibc/libpthread/pthread_spinlock.c b/mdk-stage1/dietlibc/libpthread/pthread_spinlock.c index 449782adf..463c186bd 100644 --- a/mdk-stage1/dietlibc/libpthread/pthread_spinlock.c +++ b/mdk-stage1/dietlibc/libpthread/pthread_spinlock.c @@ -2,12 +2,12 @@ #include <pthread.h> #include "thread_internal.h" -static void __pthread_acquire(int * spinlock) +void __pthread_lock(struct _pthread_fastlock * lock) { int cnt = 0; struct timespec tm; - while (__testandset(spinlock)) { + while (__testandset(&lock->__spinlock)) { if (cnt < MAX_SPIN_COUNT) { sched_yield(); cnt++; @@ -20,11 +20,6 @@ static void __pthread_acquire(int * spinlock) } } -void __pthread_lock(struct _pthread_fastlock * lock) -{ - __pthread_acquire(&lock->__spinlock); -} - int __pthread_trylock(struct _pthread_fastlock * lock) { return __testandset(&lock->__spinlock); @@ -32,7 +27,8 @@ int __pthread_trylock(struct _pthread_fastlock * lock) int __pthread_unlock(struct _pthread_fastlock * lock) { - return (lock->__spinlock = 0); + lock->__spinlock = PTHREAD_SPIN_UNLOCKED; + return 0; } diff --git a/mdk-stage1/dietlibc/libpthread/pthread_sys_alloc.c b/mdk-stage1/dietlibc/libpthread/pthread_sys_alloc.c index 9f7d23d79..9fd4bcd95 100644 --- a/mdk-stage1/dietlibc/libpthread/pthread_sys_alloc.c +++ b/mdk-stage1/dietlibc/libpthread/pthread_sys_alloc.c @@ -3,10 +3,11 @@ #include <pthread.h> #include "thread_internal.h" +#include <stdlib.h> + static pthread_mutex_t mutex_alloc = PTHREAD_MUTEX_INITIALIZER; -void free(void *ptr) -{ +void free(void *ptr) { __NO_ASYNC_CANCEL_BEGIN; pthread_mutex_lock(&mutex_alloc); __libc_free(ptr); @@ -14,8 +15,7 @@ void free(void *ptr) __NO_ASYNC_CANCEL_END; } -void *malloc(size_t size) -{ +void *malloc(size_t size) { register void *ret; __NO_ASYNC_CANCEL_BEGIN; pthread_mutex_lock(&mutex_alloc); @@ -24,3 +24,13 @@ void *malloc(size_t size) __NO_ASYNC_CANCEL_END; return ret; } + +void* realloc(void* ptr, size_t size) { + register void *ret; + __NO_ASYNC_CANCEL_BEGIN; + pthread_mutex_lock(&mutex_alloc); + ret=__libc_realloc(ptr, size); + pthread_mutex_unlock(&mutex_alloc); + __NO_ASYNC_CANCEL_END; + return ret; +} diff --git a/mdk-stage1/dietlibc/libpthread/pthread_sys_fcntl.c b/mdk-stage1/dietlibc/libpthread/pthread_sys_fcntl.c index 99210a488..c7c3fb884 100644 --- a/mdk-stage1/dietlibc/libpthread/pthread_sys_fcntl.c +++ b/mdk-stage1/dietlibc/libpthread/pthread_sys_fcntl.c @@ -3,6 +3,7 @@ #include <pthread.h> #include "thread_internal.h" +int fcntl(int fd, int cmd, void *arg); int fcntl(int fd, int cmd, void *arg) { __TEST_CANCEL(); diff --git a/mdk-stage1/dietlibc/libpthread/pthread_sys_logging.c b/mdk-stage1/dietlibc/libpthread/pthread_sys_logging.c index 6070ad219..f9f93dce2 100644 --- a/mdk-stage1/dietlibc/libpthread/pthread_sys_logging.c +++ b/mdk-stage1/dietlibc/libpthread/pthread_sys_logging.c @@ -4,6 +4,8 @@ #include <pthread.h> #include "thread_internal.h" +#include <syslog.h> + static pthread_mutex_t mutex_syslog = PTHREAD_MUTEX_INITIALIZER; void closelog(void) diff --git a/mdk-stage1/dietlibc/libpthread/pthread_sys_open.c b/mdk-stage1/dietlibc/libpthread/pthread_sys_open.c index 513f6a323..8d9fb5523 100644 --- a/mdk-stage1/dietlibc/libpthread/pthread_sys_open.c +++ b/mdk-stage1/dietlibc/libpthread/pthread_sys_open.c @@ -3,6 +3,7 @@ #include <pthread.h> #include "thread_internal.h" +int __pthread_open(const char *pathname, int flags, mode_t mode); int __pthread_open(const char *pathname, int flags, mode_t mode) { __TEST_CANCEL(); diff --git a/mdk-stage1/dietlibc/libpthread/pthread_sys_tcdrain.c b/mdk-stage1/dietlibc/libpthread/pthread_sys_tcdrain.c index 1ac33adfc..d5d94978b 100644 --- a/mdk-stage1/dietlibc/libpthread/pthread_sys_tcdrain.c +++ b/mdk-stage1/dietlibc/libpthread/pthread_sys_tcdrain.c @@ -3,6 +3,8 @@ #include <pthread.h> #include "thread_internal.h" +#include <termios.h> + int tcdrain(int fd) { __TEST_CANCEL(); diff --git a/mdk-stage1/dietlibc/libpthread/pthread_sys_waitpid.c b/mdk-stage1/dietlibc/libpthread/pthread_sys_waitpid.c index 76d5ddca7..e5020221a 100644 --- a/mdk-stage1/dietlibc/libpthread/pthread_sys_waitpid.c +++ b/mdk-stage1/dietlibc/libpthread/pthread_sys_waitpid.c @@ -3,6 +3,8 @@ #include <pthread.h> #include "thread_internal.h" +#include <sys/wait.h> + pid_t waitpid(pid_t pid, int *status, int options) { __TEST_CANCEL(); diff --git a/mdk-stage1/dietlibc/libpthread/pthread_testcancel.c b/mdk-stage1/dietlibc/libpthread/pthread_testcancel.c index 68f91e743..4151faca3 100644 --- a/mdk-stage1/dietlibc/libpthread/pthread_testcancel.c +++ b/mdk-stage1/dietlibc/libpthread/pthread_testcancel.c @@ -10,7 +10,7 @@ void pthread_testcancel() thread=__thread_self(); - if (thread->canceled) { + if (thread && thread->canceled) { pthread_exit(PTHREAD_CANCELED); } } diff --git a/mdk-stage1/dietlibc/libpthread/thread_internal.h b/mdk-stage1/dietlibc/libpthread/thread_internal.h index 5eb3bbd08..7843fb59d 100644 --- a/mdk-stage1/dietlibc/libpthread/thread_internal.h +++ b/mdk-stage1/dietlibc/libpthread/thread_internal.h @@ -9,6 +9,8 @@ #error "the diet libc is not compiled with thread safeness enabled!" #endif +#undef errno + /* cleanup */ #define PTHREAD_MAX_CLEANUP 8 struct thread_cleanup_t { @@ -18,15 +20,13 @@ struct thread_cleanup_t { /* the thread descriptor / internal */ struct _pthread_descr_struct { - /* runtime handling */ - struct _pthread_descr_struct *joined; /* a joined thread or NULL */ - /* conditional variables */ struct _pthread_descr_struct *waitnext; /* an other waiting thread or NULL */ int waiting; /* internal waiting "lock" */ /* thread/process data */ int pid; /* Process id */ + int exited; /* Process is dead */ int policy; /* thread scheduling policy */ int priority; /* thread priority */ @@ -42,7 +42,7 @@ struct _pthread_descr_struct { /* thread exit handling */ void *retval; /* thread return value */ - int join; /* thread waits for other to return */ + int joined; /* flag other thread has joined */ jmp_buf jmp_exit; /* pthread_exit jump */ /* thread flags */ @@ -58,7 +58,7 @@ struct _pthread_descr_struct { void* arg; /* thread argument */ /* create thread / manager thread lock */ - struct _pthread_fastlock *manager_lock; + struct _pthread_fastlock go; /* cleanup stack */ struct thread_cleanup_t cleanup_stack[PTHREAD_MAX_CLEANUP]; @@ -84,12 +84,13 @@ int __clone(void* (*fn)(void*), void* stack, int flags, void *arg); int __find_thread_id(int pid); _pthread_descr __get_thread_struct(int id); -_pthread_descr __thread_get_free(); -_pthread_descr __thread_self(); +_pthread_descr __thread_get_free(void); +_pthread_descr __thread_self(void); -void __thread_cleanup(_pthread_descr th); +int __thread_join(_pthread_descr join, void **return_value); +#define __thread_cleanup(th) (void)__thread_join((th),0) -void __thread_wait_some_time(); +void __thread_wait_some_time(void); #define __NO_ASYNC_CANCEL_BEGIN { int oldtype; pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &oldtype); #define __NO_ASYNC_CANCEL_END pthread_setcanceltype(oldtype,0); pthread_testcancel(); } @@ -100,7 +101,7 @@ int signal_manager_thread(_pthread_descr td); /* init stuff */ extern pthread_once_t __thread_inited; -void __thread_init(); +void __thread_init(void); #define __THREAD_INIT() __pthread_once(&__thread_inited, __thread_init) #define __TEST_CANCEL() pthread_testcancel() @@ -108,6 +109,7 @@ void __thread_init(); void __libc_free(void *ptr); void *__libc_malloc(size_t size); +void *__libc_realloc(void* ptr, size_t size); void __libc_closelog(void); void __libc_openlog(const char *ident, int option, int facility); @@ -119,6 +121,7 @@ int __libc_close(int fd); int __libc_creat(const char *pathname, mode_t mode); int __libc_fcntl(int fd, int cmd, void *arg); int __libc_fsync(int fd); +int __libc_fdatasync(int fd); int __libc_nanosleep(const struct timespec *req, struct timespec *rem); int __libc_open(const char *pathname, int flags, mode_t mode); int __libc_pause(void); diff --git a/mdk-stage1/dietlibc/libregex/rx.c b/mdk-stage1/dietlibc/libregex/rx.c index b28358c2e..9bab3e22c 100644 --- a/mdk-stage1/dietlibc/libregex/rx.c +++ b/mdk-stage1/dietlibc/libregex/rx.c @@ -1,8 +1,11 @@ +#define NDEBUG #include <regex.h> #include <stdlib.h> +#include <string.h> #include <ctype.h> #include <sys/types.h> #include <string.h> +#include <assert.h> /* this is ugly. * the idea is to build a parse tree, then do some poor man's OOP with a @@ -40,7 +43,7 @@ struct regex { struct atom { matcher m; void* next; - enum { EMPTY, REGEX, BRACKET, ANY, LINESTART, LINEEND, WORDSTART, WORDEND, CHAR, } type; + enum { ILLEGAL, EMPTY, REGEX, BRACKET, ANY, LINESTART, LINEEND, WORDSTART, WORDEND, CHAR, } type; int bnum; union { struct regex r; @@ -64,7 +67,7 @@ struct branch { }; static void clearcc(unsigned int* x) { - memset(x,0,sizeof(*x)); + memset(x,0,sizeof(struct bracketed)); } static void setcc(unsigned int* x,unsigned int bit) { @@ -84,9 +87,9 @@ static const char* parsebracketed(struct bracketed*__restrict__ b,const char*__r if (*t=='^') { negflag=1; ++t; } do { if (*t==0) return s; - setcc(b->cc,rx->cflags®_ICASE?*t:tolower(*t)); + setcc(b->cc,rx->cflags®_ICASE?tolower(*t):*t); if (t[1]=='-' && t[2]!=']') { - for (i=*t+1; i<=t[2]; ++i) setcc(b->cc,rx->cflags®_ICASE?i:tolower(i)); + for (i=*t+1; i<=t[2]; ++i) setcc(b->cc,rx->cflags®_ICASE?tolower(i):i); t+=2; } ++t; @@ -97,55 +100,79 @@ static const char* parsebracketed(struct bracketed*__restrict__ b,const char*__r static const char* parseregex(struct regex* r,const char* s,regex_t* rx); -static int matchatom(void*__restrict__ x,const char*__restrict__ s,int ofs,struct __regex_t*__restrict__ preg,int plus,int eflags) { +static int matchatom(void*__restrict__ x,const unsigned char*__restrict__ s,int ofs,struct __regex_t*__restrict__ preg,int plus,int eflags) { register struct atom* a=(struct atom*)x; int matchlen=0; + assert(a->type!=ILLEGAL); switch (a->type) { case EMPTY: -// printf("matching EMPTY against \"%s\"\n",s); - preg->l[a->bnum].rm_so=preg->l[a->bnum].rm_eo=ofs; +#ifdef DEBUG + printf("matching atom EMPTY against \"%s\"\n",s); + printf("a->bnum is %d\n",a->bnum); +#endif + if (a->bnum>=0) preg->l[a->bnum].rm_so=preg->l[a->bnum].rm_eo=ofs; goto match; case REGEX: -// printf("matching REGEX against \"%s\"\n",s); - if ((matchlen=a->u.r.m(a,s,ofs,preg,0,eflags))>=0) { +#ifdef DEBUG + printf("matching atom REGEX against \"%s\"\n",s); + printf("a->bnum is %d\n",a->bnum); +#endif + if ((matchlen=a->u.r.m(&a->u.r,s,ofs,preg,0,eflags))>=0) { + assert(a->bnum>=0); preg->l[a->bnum].rm_so=ofs; preg->l[a->bnum].rm_eo=ofs+matchlen; goto match; } break; case BRACKET: -// printf("matching BRACKET against \"%s\"\n",s); +#ifdef DEBUG + printf("matching atom BRACKET against \"%s\"\n",s); +#endif matchlen=1; if (*s=='\n' && (preg->cflags®_NEWLINE)) break; if (*s && issetcc(a->u.b.cc,(preg->cflags®_ICASE?tolower(*s):*s))) goto match; break; case ANY: -// printf("matching ANY against \"%s\"\n",s); +#ifdef DEBUG + printf("matching atom ANY against \"%s\"\n",s); +#endif if (*s=='\n' && (preg->cflags®_NEWLINE)) break; matchlen=1; if (*s) goto match; break; case LINESTART: -// printf("matching LINESTART against \"%s\"\n",s); +#ifdef DEBUG + printf("matching atom LINESTART against \"%s\"\n",s); +#endif if (ofs==0 && (eflags®_NOTBOL)==0) { goto match; } break; case LINEEND: -// printf("matching LINEEND against \"%s\"\n",s); - if ((*s && *s!='\n') || (eflags®_NOTEOL)==0) break; +#ifdef DEBUG + printf("matching atom LINEEND against \"%s\"\n",s); +#endif + if ((*s && *s!='\n') || (eflags®_NOTEOL)) break; goto match; case WORDSTART: - if ((ofs==0 || isspace(s[-1])) && !isspace(*s)) +#ifdef DEBUG + printf("matching atom WORDSTART against \"%s\"\n",s); +#endif + if ((ofs==0 || !isalnum(s[-1])) && isalnum(*s)) goto match; break; case WORDEND: - if (ofs>0 && !isspace(s[-1]) && isspace(*s)) +#ifdef DEBUG + printf("matching atom WORDEND against \"%s\"\n",s); +#endif + if (ofs>0 && isalnum(s[-1]) && !isalnum(*s)) goto match; break; case CHAR: -// printf("matching CHAR %c against \"%s\"\n",a->u.c,s); +#ifdef DEBUG + printf("matching atom CHAR %c against \"%s\"\n",a->u.c,s); +#endif matchlen=1; if (((preg->cflags®_ICASE)?tolower(*s):*s)==a->u.c) goto match; break; @@ -160,7 +187,7 @@ match: static const char* parseatom(struct atom*__restrict__ a,const char*__restrict__ s,regex_t*__restrict__ rx) { const char *tmp; - a->m=matchatom; + a->m=(matcher)matchatom; a->bnum=-1; switch (*s) { case '(': @@ -203,7 +230,7 @@ static const char* parseatom(struct atom*__restrict__ a,const char*__restrict__ } default: a->type=CHAR; - a->u.c=rx->cflags®_ICASE?*s:tolower(*s); + a->u.c=rx->cflags®_ICASE?tolower(*s):*s; break; } return s+1; @@ -213,9 +240,15 @@ static const char* parseatom(struct atom*__restrict__ a,const char*__restrict__ static int matchpiece(void*__restrict__ x,const char*__restrict__ s,int ofs,struct __regex_t*__restrict__ preg,int plus,int eflags) { register struct piece* a=(struct piece*)x; int matchlen=0; - int tmp,num=0; - unsigned int *offsets=alloca(sizeof(int)*a->max); + int tmp=0,num=0; + unsigned int *offsets; + assert(a->max>0 && a->max<1000); +#ifdef DEBUG + printf("alloca(%d)\n",sizeof(int)*a->max); +#endif + offsets=alloca(sizeof(int)*a->max); offsets[0]=0; +// printf("allocating %d offsets...\n",a->max); // printf("matchpiece \"%s\"...\n",s); /* first, try to match the atom as often as possible, up to a->max times */ if (a->max == 1 && a->min == 1) @@ -227,6 +260,7 @@ static int matchpiece(void*__restrict__ x,const char*__restrict__ s,int ofs,stru a->a.next=save; ++num; matchlen+=tmp; +// printf("setting offsets[%d] to %d\n",num,tmp); offsets[num]=tmp; } else { a->a.next=save; @@ -235,12 +269,13 @@ static int matchpiece(void*__restrict__ x,const char*__restrict__ s,int ofs,stru } if (num<a->min) return -1; /* already at minimum matches; signal mismatch */ /* then, while the rest does not match, back off */ - for (;;) { + for (;num>=0;) { if (a->next) tmp=((struct atom*)(a->next))->m(a->next,s+matchlen,ofs+matchlen,preg,plus+matchlen,eflags); else tmp=plus+matchlen; if (tmp>=0) break; /* it did match; don't back off any further */ +// printf("using offsets[%d] (%d)\n",num,offsets[num]); matchlen-=offsets[num]; --num; } @@ -279,6 +314,11 @@ static const char* parsepiece(struct piece*__restrict__ p,const char*__restrict_ static int matchbranch(void*__restrict__ x,const char*__restrict__ s,int ofs,struct __regex_t*__restrict__ preg,int plus,int eflags) { register struct branch* a=(struct branch*)x; int tmp; +#ifdef DEBUG + printf("%08p matching branch against \"%s\"\n",a,s); + printf("%p %p\n",&a->p->m,a->p->m); +#endif + assert(a->p->m==matchpiece); tmp=a->p->m(a->p,s,ofs,preg,plus,eflags); if (tmp>=0) { if (a->next) @@ -291,7 +331,7 @@ static int matchbranch(void*__restrict__ x,const char*__restrict__ s,int ofs,str static const char* parsebranch(struct branch*__restrict__ b,const char*__restrict__ s,regex_t*__restrict__ rx,int*__restrict__ pieces) { struct piece p; - const char *tmp; + const char *tmp; /* the gcc warning here is bogus */ b->m=matchbranch; b->num=0; b->p=0; for (;;) { @@ -305,9 +345,11 @@ static const char* parsebranch(struct branch*__restrict__ b,const char*__restric tmp=parsepiece(&p,s,rx); if (tmp==s) return s; } +// printf("b->p from %p to ",b->p); if (!(b->p=realloc(b->p,++b->num*sizeof(p)))) return s; +// printf("%p (size %d)\n",b->p,b->num*sizeof(p)); b->p[b->num-1]=p; - if (*s=='|') { ++tmp; break; } + if (*tmp=='|') { break; } s=tmp; } *pieces+=b->num; @@ -318,7 +360,11 @@ static const char* parsebranch(struct branch*__restrict__ b,const char*__restric static int matchregex(void*__restrict__ x,const char*__restrict__ s,int ofs,struct __regex_t*__restrict__ preg,int plus,int eflags) { register struct regex* a=(struct regex*)x; int i,tmp; +#ifdef DEBUG + printf("%08p matching regex against \"%s\"\n",a,s); +#endif for (i=0; i<a->num; ++i) { + assert(a->b[i].m==matchbranch); tmp=a->b[i].m(&a->b[i],s,ofs,preg,plus,eflags); if (tmp>=0) { if (a->next) @@ -335,12 +381,15 @@ static const char* parseregex(struct regex*__restrict__ r,const char*__restrict_ const char *tmp; r->m=matchregex; r->num=0; r->b=0; r->pieces=0; + p->brackets=0; for (;;) { tmp=parsebranch(&b,s,p,&r->pieces); if (tmp==s) return s; +// printf("r->b from %p to ",r->b); if (!(r->b=realloc(r->b,++r->num*sizeof(b)))) return s; +// printf("%p (size %d)\n",r->b,r->num*sizeof(b)); r->b[r->num-1]=b; - s=tmp; + s=tmp; if (*s=='|') ++s; } return tmp; } @@ -355,7 +404,7 @@ static void regex_putnext(struct regex* r,void* next); static void atom_putnext(struct atom*__restrict__ a,void*__restrict__ next) { a->next=next; if (a->type==REGEX) - regex_putnext(&a->u.r,next); + regex_putnext(&a->u.r,0); } static void piece_putnext(struct piece*__restrict__ p,void*__restrict__ next) { @@ -365,8 +414,12 @@ static void piece_putnext(struct piece*__restrict__ p,void*__restrict__ next) { static void branch_putnext(struct branch*__restrict__ b,void*__restrict__ next) { int i; - for (i=0; i<b->num-1; ++i) - piece_putnext(&b->p[i],&b->p[i+1]); + for (i=0; i<b->num-1; ++i) { + if (b->p[i+1].min==1 && b->p[i+1].max==1) + piece_putnext(&b->p[i],&b->p[i+1].a); + else + piece_putnext(&b->p[i],&b->p[i+1]); + } piece_putnext(&b->p[i],0); b->next=next; } @@ -381,21 +434,29 @@ static void regex_putnext(struct regex*__restrict__ r,void*__restrict__ next) { int regcomp(regex_t*__restrict__ preg, const char*__restrict__ regex, int cflags) { - const char* t=parseregex(&preg->r,regex,preg); + const char* t; + preg->cflags=cflags; + t=parseregex(&preg->r,regex,preg); if (t==regex) return -1; regex_putnext(&preg->r,0); - preg->cflags=cflags; return 0; } int regexec(const regex_t*__restrict__ preg, const char*__restrict__ string, size_t nmatch, regmatch_t pmatch[], int eflags) { int matched; const char *orig=string; - ((regex_t*)preg)->l=alloca(sizeof(regmatch_t)*(preg->brackets+1)); + assert(preg->brackets+1>0 && preg->brackets<1000); +#ifdef DEBUG + printf("alloca(%d)\n",sizeof(regmatch_t)*(preg->brackets+3)); +#endif + ((regex_t*)preg)->l=alloca(sizeof(regmatch_t)*(preg->brackets+3)); while (*string) { matched=preg->r.m((void*)&preg->r,string,string-orig,(regex_t*)preg,0,eflags); +// printf("ebp on stack = %x\n",stack[1]); if (matched>=0) { - if ((preg->cflags®_NOSUB)==0) memmove(pmatch,preg->l,nmatch*sizeof(regmatch_t)); + preg->l[0].rm_so=string-orig; + preg->l[0].rm_eo=string-orig+matched; + if ((preg->cflags®_NOSUB)==0) memcpy(pmatch,preg->l,nmatch*sizeof(regmatch_t)); return 0; } ++string; eflags|=REG_NOTBOL; @@ -407,10 +468,9 @@ int regexec(const regex_t*__restrict__ preg, const char*__restrict__ string, siz void regfree(regex_t* preg) { int i; - for (i=0; i<preg->r.num; ++i) { + for (i=0; i<preg->r.num; ++i) free(preg->r.b[i].p); free(preg->r.b); - } } size_t regerror(int errcode, const regex_t*__restrict__ preg, char*__restrict__ errbuf, size_t errbuf_size) { diff --git a/mdk-stage1/dietlibc/librpc/auth_none.c b/mdk-stage1/dietlibc/librpc/auth_none.c index 7a4dffe87..59124bae4 100644 --- a/mdk-stage1/dietlibc/librpc/auth_none.c +++ b/mdk-stage1/dietlibc/librpc/auth_none.c @@ -46,14 +46,11 @@ static char sccsid[] = #include <rpc/auth.h> #define MAX_MARSHEL_SIZE 20 -/* - * Authenticator operations routines - */ static void authnone_verf(); -static void authnone_destroy(); -static bool_t authnone_marshal(); static bool_t authnone_validate(); static bool_t authnone_refresh(); +static void authnone_destroy(); +static bool_t authnone_marshal(AUTH *client, XDR *xdrs); static struct auth_ops ops = { authnone_verf, @@ -66,7 +63,7 @@ static struct auth_ops ops = { static struct authnone_private { AUTH no_client; char marshalled_client[MAX_MARSHEL_SIZE]; - u_int mcnt; + unsigned int mcnt; } *authnone_private; AUTH *authnone_create() @@ -86,7 +83,7 @@ AUTH *authnone_create() ap->no_client.ah_ops = &ops; xdrs = &xdr_stream; xdrmem_create(xdrs, ap->marshalled_client, - (u_int) MAX_MARSHEL_SIZE, XDR_ENCODE); + (unsigned int) MAX_MARSHEL_SIZE, XDR_ENCODE); (void) xdr_opaque_auth(xdrs, &ap->no_client.ah_cred); (void) xdr_opaque_auth(xdrs, &ap->no_client.ah_verf); ap->mcnt = XDR_GETPOS(xdrs); @@ -126,3 +123,4 @@ static bool_t authnone_refresh() static void authnone_destroy() { } + diff --git a/mdk-stage1/dietlibc/librpc/auth_unix.c b/mdk-stage1/dietlibc/librpc/auth_unix.c index 5daeb5f4a..59eb6ff18 100644 --- a/mdk-stage1/dietlibc/librpc/auth_unix.c +++ b/mdk-stage1/dietlibc/librpc/auth_unix.c @@ -78,9 +78,9 @@ static struct auth_ops auth_unix_ops = { struct audata { struct opaque_auth au_origcred; /* original credentials */ struct opaque_auth au_shcred; /* short hand cred */ - u_long au_shfaults; /* short hand cache faults */ + unsigned long au_shfaults; /* short hand cache faults */ char au_marshed[MAX_AUTH_BYTES]; - u_int au_mpos; /* xdr pos at end of marshed */ + unsigned int au_mpos; /* xdr pos at end of marshed */ }; #define AUTH_PRIVATE(auth) ((struct audata *)auth->ah_private) @@ -121,7 +121,7 @@ AUTH *authunix_create __P ((char *machname, uid_t uid, } #endif auth->ah_ops = &auth_unix_ops; - auth->ah_private = (caddr_t) au; + auth->ah_private = (char*) au; auth->ah_verf = au->au_shcred = _null_auth; au->au_shfaults = 0; @@ -133,7 +133,7 @@ AUTH *authunix_create __P ((char *machname, uid_t uid, aup.aup_machname = machname; aup.aup_uid = uid; aup.aup_gid = gid; - aup.aup_len = (u_int) len; + aup.aup_len = (unsigned int) len; aup.aup_gids = aup_gids; /* @@ -145,14 +145,14 @@ AUTH *authunix_create __P ((char *machname, uid_t uid, au->au_origcred.oa_length = len = XDR_GETPOS(&xdrs); au->au_origcred.oa_flavor = AUTH_UNIX; #ifdef KERNEL - au->au_origcred.oa_base = mem_alloc((u_int) len); + au->au_origcred.oa_base = mem_alloc((unsigned int) len); #else - if ((au->au_origcred.oa_base = mem_alloc((u_int) len)) == NULL) { + if ((au->au_origcred.oa_base = mem_alloc((unsigned int) len)) == NULL) { (void) fprintf(stderr, "authunix_create: out of memory\n"); return (NULL); } #endif - bcopy(mymem, au->au_origcred.oa_base, (u_int) len); + memmove(au->au_origcred.oa_base, mymem, (unsigned int) len); /* * set auth handle to reflect new cred. @@ -288,7 +288,7 @@ register AUTH *auth; if (auth->ah_verf.oa_base != NULL) mem_free(auth->ah_verf.oa_base, auth->ah_verf.oa_length); - mem_free((caddr_t) auth, sizeof(*auth)); + mem_free((char*) auth, sizeof(*auth)); } /* @@ -311,3 +311,4 @@ register AUTH *auth; } XDR_DESTROY(xdrs); } + diff --git a/mdk-stage1/dietlibc/librpc/authunix_prot.c b/mdk-stage1/dietlibc/librpc/authunix_prot.c index ddcadb808..53897a364 100644 --- a/mdk-stage1/dietlibc/librpc/authunix_prot.c +++ b/mdk-stage1/dietlibc/librpc/authunix_prot.c @@ -59,7 +59,7 @@ register struct authunix_parms *p; && xdr_string(xdrs, &(p->aup_machname), MAX_MACHINE_NAME) && xdr_int(xdrs, &a) && xdr_int(xdrs, &b) - && xdr_array(xdrs, (caddr_t *) & (p->aup_gids), + && xdr_array(xdrs, (char* *) & (p->aup_gids), &(p->aup_len), NGRPS, sizeof(int), (xdrproc_t)xdr_int)) { p->aup_uid=(uid_t)a; p->aup_gid=(gid_t)b; diff --git a/mdk-stage1/dietlibc/librpc/bindresvport.c b/mdk-stage1/dietlibc/librpc/bindresvport.c index 8b65261dd..1131cc263 100644 --- a/mdk-stage1/dietlibc/librpc/bindresvport.c +++ b/mdk-stage1/dietlibc/librpc/bindresvport.c @@ -37,6 +37,7 @@ #include <errno.h> #include <sys/socket.h> #include <netinet/in.h> +#include "dietfeatures.h" /* * Bind a socket to a privileged IP port @@ -48,7 +49,6 @@ struct sockaddr_in *sin; int res; static short port; struct sockaddr_in myaddr; - extern int errno; int i; #define STARTPORT 600 @@ -57,7 +57,7 @@ struct sockaddr_in *sin; if (sin == (struct sockaddr_in *) 0) { sin = &myaddr; - bzero(sin, sizeof(*sin)); + memset(sin,0,sizeof(*sin)); sin->sin_family = AF_INET; } else if (sin->sin_family != AF_INET) { errno = EPFNOSUPPORT; diff --git a/mdk-stage1/dietlibc/librpc/clnt_generic.c b/mdk-stage1/dietlibc/librpc/clnt_generic.c index 9bb81cc80..5c0b96af9 100644 --- a/mdk-stage1/dietlibc/librpc/clnt_generic.c +++ b/mdk-stage1/dietlibc/librpc/clnt_generic.c @@ -44,8 +44,8 @@ static char sccsid[] = "@(#)clnt_generic.c 1.4 87/08/11 (C) 1987 SMI"; * returns client handle. Default options are set, which the user can * change using the rpc equivalent of ioctl()'s. */ -CLIENT *clnt_create __P ((const char *hostname, const u_long prog, - const u_long vers, const char *proto)) +CLIENT *clnt_create __P ((const char *hostname, const unsigned long prog, + const unsigned long vers, const char *proto)) { struct hostent *h; struct protoent *p; @@ -68,14 +68,14 @@ CLIENT *clnt_create __P ((const char *hostname, const u_long prog, return (NULL); } #ifdef __linux__ - bzero((char *) &sin, sizeof(sin)); + memset((char*)&sin,0,sizeof(sin)); #endif sin.sin_family = h->h_addrtype; sin.sin_port = 0; #ifndef __linux__ - bzero(sin.sin_zero, sizeof(sin.sin_zero)); + memset(sin.sin_zero,0,sizeof(sin.sin_zero)); #endif - bcopy(h->h_addr, (char *) &sin.sin_addr, h->h_length); + memmove((char *) &sin.sin_addr, h->h_addr, h->h_length); p = getprotobyname(proto); if (p == NULL) { rpc_createerr.cf_stat = RPC_UNKNOWNPROTO; diff --git a/mdk-stage1/dietlibc/librpc/clnt_raw.c b/mdk-stage1/dietlibc/librpc/clnt_raw.c index 7479b55d6..52ab64421 100644 --- a/mdk-stage1/dietlibc/librpc/clnt_raw.c +++ b/mdk-stage1/dietlibc/librpc/clnt_raw.c @@ -54,7 +54,7 @@ static struct clntraw_private { XDR xdr_stream; char _raw_buf[UDPMSGSIZE]; char mashl_callmsg[MCALL_MSG_SIZE]; - u_int mcnt; + unsigned int mcnt; } *clntraw_private; static enum clnt_stat clntraw_call(); @@ -73,14 +73,12 @@ static struct clnt_ops client_ops = { clntraw_control }; -void svc_getreq(); - /* * Create a client handle for memory based rpc. */ CLIENT *clntraw_create(prog, vers) -u_long prog; -u_long vers; +unsigned long prog; +unsigned long vers; { register struct clntraw_private *clp = clntraw_private; struct rpc_msg call_msg; @@ -123,11 +121,11 @@ u_long vers; static enum clnt_stat clntraw_call(h, proc, xargs, argsp, xresults, resultsp, timeout) CLIENT *h; -u_long proc; +unsigned long proc; xdrproc_t xargs; -caddr_t argsp; +char* argsp; xdrproc_t xresults; -caddr_t resultsp; +char* resultsp; struct timeval timeout; { register struct clntraw_private *clp = clntraw_private; @@ -202,7 +200,7 @@ static void clntraw_geterr() static bool_t clntraw_freeres(cl, xdr_res, res_ptr) CLIENT *cl; xdrproc_t xdr_res; -caddr_t res_ptr; +char* res_ptr; { register struct clntraw_private *clp = clntraw_private; register XDR *xdrs = &clp->xdr_stream; @@ -228,3 +226,4 @@ static bool_t clntraw_control() static void clntraw_destroy() { } + diff --git a/mdk-stage1/dietlibc/librpc/clnt_simple.c b/mdk-stage1/dietlibc/librpc/clnt_simple.c index f309f86ff..e1f4c5f6c 100644 --- a/mdk-stage1/dietlibc/librpc/clnt_simple.c +++ b/mdk-stage1/dietlibc/librpc/clnt_simple.c @@ -54,8 +54,8 @@ static struct callrpc_private { char *oldhost; } *callrpc_private; -int callrpc (const char *host, const u_long prognum, - const u_long versnum, const u_long procnum, +int callrpc (const char *host, const unsigned long prognum, + const unsigned long versnum, const unsigned long procnum, const xdrproc_t inproc, const char *in, const xdrproc_t outproc, char *out) { @@ -91,11 +91,11 @@ int callrpc (const char *host, const u_long prognum, return ((int) RPC_UNKNOWNHOST); timeout.tv_usec = 0; timeout.tv_sec = 5; - bcopy(hp->h_addr, (char *) &server_addr.sin_addr, hp->h_length); + memmove((char *) &server_addr.sin_addr, hp->h_addr, hp->h_length); server_addr.sin_family = AF_INET; server_addr.sin_port = 0; - if ((crp->client = clntudp_create(&server_addr, (u_long) prognum, - (u_long) versnum, timeout, + if ((crp->client = clntudp_create(&server_addr, (unsigned long) prognum, + (unsigned long) versnum, timeout, &crp->socket)) == NULL) return ((int) rpc_createerr.cf_stat); crp->valid = 1; diff --git a/mdk-stage1/dietlibc/librpc/clnt_tcp.c b/mdk-stage1/dietlibc/librpc/clnt_tcp.c index 8c39e8933..56bf3315a 100644 --- a/mdk-stage1/dietlibc/librpc/clnt_tcp.c +++ b/mdk-stage1/dietlibc/librpc/clnt_tcp.c @@ -57,11 +57,10 @@ static char sccsid[] = "@(#)clnt_tcp.c 1.37 87/10/05 Copyr 1984 Sun Micro"; #include <errno.h> #include <rpc/pmap_clnt.h> #include <unistd.h> +#include "dietfeatures.h" #define MCALL_MSG_SIZE 24 -extern int errno; - static int readtcp(); static int writetcp(); @@ -89,7 +88,7 @@ struct ct_data { struct sockaddr_in ct_addr; struct rpc_err ct_error; char ct_mcall[MCALL_MSG_SIZE]; /* marshalled callmsg */ - u_int ct_mpos; /* pos after marshal */ + unsigned int ct_mpos; /* pos after marshal */ XDR ct_xdrs; }; @@ -109,11 +108,11 @@ struct ct_data { */ CLIENT *clnttcp_create(raddr, prog, vers, sockp, sendsz, recvsz) struct sockaddr_in *raddr; -u_long prog; -u_long vers; +unsigned long prog; +unsigned long vers; register int *sockp; -u_int sendsz; -u_int recvsz; +unsigned int sendsz; +unsigned int recvsz; { CLIENT *h; register struct ct_data *ct; @@ -139,12 +138,12 @@ u_int recvsz; * If no port number given ask the pmap for one */ if (raddr->sin_port == 0) { - u_short port; + unsigned short port; if ((port = pmap_getport(raddr, prog, vers, IPPROTO_TCP)) == 0) { - mem_free((caddr_t) ct, sizeof(struct ct_data)); + mem_free((char*) ct, sizeof(struct ct_data)); - mem_free((caddr_t) h, sizeof(CLIENT)); + mem_free((char*) h, sizeof(CLIENT)); return ((CLIENT *) NULL); } raddr->sin_port = htons(port); @@ -206,9 +205,9 @@ u_int recvsz; * and authnone for authentication. */ xdrrec_create(&(ct->ct_xdrs), sendsz, recvsz, - (caddr_t) ct, readtcp, writetcp); + (char*) ct, readtcp, writetcp); h->cl_ops = &tcp_ops; - h->cl_private = (caddr_t) ct; + h->cl_private = (char*) ct; h->cl_auth = authnone_create(); return (h); @@ -216,9 +215,9 @@ u_int recvsz; /* * Something goofed, free stuff and barf */ - mem_free((caddr_t) ct, sizeof(struct ct_data)); + mem_free((char*) ct, sizeof(struct ct_data)); - mem_free((caddr_t) h, sizeof(CLIENT)); + mem_free((char*) h, sizeof(CLIENT)); return ((CLIENT *) NULL); } @@ -226,18 +225,18 @@ static enum clnt_stat clnttcp_call(h, proc, xdr_args, args_ptr, xdr_results, results_ptr, timeout) register CLIENT *h; -u_long proc; +unsigned long proc; xdrproc_t xdr_args; -caddr_t args_ptr; +char* args_ptr; xdrproc_t xdr_results; -caddr_t results_ptr; +char* results_ptr; struct timeval timeout; { register struct ct_data *ct = (struct ct_data *) h->cl_private; register XDR *xdrs = &(ct->ct_xdrs); struct rpc_msg reply_msg; - u_long x_id; - u_long *msg_x_id = (u_long *) (ct->ct_mcall); /* yuk */ + unsigned long x_id; + unsigned long *msg_x_id = (unsigned long *) (ct->ct_mcall); /* yuk */ register bool_t shipnow; int refreshes = 2; @@ -332,7 +331,7 @@ struct rpc_err *errp; static bool_t clnttcp_freeres(cl, xdr_res, res_ptr) CLIENT *cl; xdrproc_t xdr_res; -caddr_t res_ptr; +char* res_ptr; { register struct ct_data *ct = (struct ct_data *) cl->cl_private; register XDR *xdrs = &(ct->ct_xdrs); @@ -379,9 +378,9 @@ CLIENT *h; (void) close(ct->ct_sock); } XDR_DESTROY(&(ct->ct_xdrs)); - mem_free((caddr_t) ct, sizeof(struct ct_data)); + mem_free((char*) ct, sizeof(struct ct_data)); - mem_free((caddr_t) h, sizeof(CLIENT)); + mem_free((char*) h, sizeof(CLIENT)); } /* @@ -391,7 +390,7 @@ CLIENT *h; */ static int readtcp(ct, buf, len) register struct ct_data *ct; -caddr_t buf; +char* buf; register int len; { #ifdef FD_SETSIZE @@ -447,7 +446,7 @@ register int len; static int writetcp(ct, buf, len) struct ct_data *ct; -caddr_t buf; +char* buf; int len; { register int i, cnt; @@ -461,3 +460,4 @@ int len; } return (len); } + diff --git a/mdk-stage1/dietlibc/librpc/clnt_udp.c b/mdk-stage1/dietlibc/librpc/clnt_udp.c index 7305d3ff1..874ef62db 100644 --- a/mdk-stage1/dietlibc/librpc/clnt_udp.c +++ b/mdk-stage1/dietlibc/librpc/clnt_udp.c @@ -45,8 +45,7 @@ static char sccsid[] = "@(#)clnt_udp.c 1.39 87/08/11 Copyr 1984 Sun Micro"; #include <errno.h> #include <rpc/pmap_clnt.h> #include <unistd.h> - -extern int errno; +#include "dietfeatures.h" /* * UDP bases client side rpc operations @@ -67,6 +66,7 @@ static struct clnt_ops udp_ops = { clntudp_control }; + /* * Private data kept per client handle */ @@ -79,10 +79,10 @@ struct cu_data { struct timeval cu_total; struct rpc_err cu_error; XDR cu_outxdrs; - u_int cu_xdrpos; - u_int cu_sendsz; + unsigned int cu_xdrpos; + unsigned int cu_sendsz; char *cu_outbuf; - u_int cu_recvsz; + unsigned int cu_recvsz; char cu_inbuf[1]; }; @@ -105,12 +105,12 @@ struct cu_data { CLIENT *clntudp_bufcreate(raddr, program, version, wait, sockp, sendsz, recvsz) struct sockaddr_in *raddr; -u_long program; -u_long version; +unsigned long program; +unsigned long version; struct timeval wait; register int *sockp; -u_int sendsz; -u_int recvsz; +unsigned int sendsz; +unsigned int recvsz; { CLIENT *cl; register struct cu_data *cu; @@ -137,7 +137,7 @@ u_int recvsz; (void) gettimeofday(&now, (struct timezone *) 0); if (raddr->sin_port == 0) { - u_short port; + unsigned short port; if ((port = pmap_getport(raddr, program, version, IPPROTO_UDP)) == 0) { @@ -146,7 +146,7 @@ u_int recvsz; raddr->sin_port = htons(port); } cl->cl_ops = &udp_ops; - cl->cl_private = (caddr_t) cu; + cl->cl_private = (char*) cu; cu->cu_raddr = *raddr; cu->cu_rlen = sizeof(cu->cu_raddr); cu->cu_wait = wait; @@ -186,16 +186,16 @@ u_int recvsz; return (cl); fooy: if (cu) - mem_free((caddr_t) cu, sizeof(*cu) + sendsz + recvsz); + mem_free((char*) cu, sizeof(*cu) + sendsz + recvsz); if (cl) - mem_free((caddr_t) cl, sizeof(CLIENT)); + mem_free((char*) cl, sizeof(CLIENT)); return ((CLIENT *) NULL); } CLIENT *clntudp_create(raddr, program, version, wait, sockp) struct sockaddr_in *raddr; -u_long program; -u_long version; +unsigned long program; +unsigned long version; struct timeval wait; register int *sockp; { @@ -207,11 +207,11 @@ register int *sockp; static enum clnt_stat clntudp_call(cl, proc, xargs, argsp, xresults, resultsp, utimeout) register CLIENT *cl; /* client handle */ -u_long proc; /* procedure number */ +unsigned long proc; /* procedure number */ xdrproc_t xargs; /* xdr routine for args */ -caddr_t argsp; /* pointer to args */ +char* argsp; /* pointer to args */ xdrproc_t xresults; /* xdr routine for results */ -caddr_t resultsp; /* pointer to results */ +char* resultsp; /* pointer to results */ struct timeval utimeout; /* seconds to wait before giving up */ { register struct cu_data *cu = (struct cu_data *) cl->cl_private; @@ -250,7 +250,7 @@ struct timeval utimeout; /* seconds to wait before giving up */ /* * the transaction is the first thing in the out buffer */ - (*(u_short *) (cu->cu_outbuf))++; + (*(unsigned short *) (cu->cu_outbuf))++; if ((!XDR_PUTLONG(xdrs, (long *) &proc)) || (!AUTH_MARSHALL(cl->cl_auth, xdrs)) || (!(*xargs) (xdrs, argsp))) return (cu->cu_error.re_status = RPC_CANTENCODEARGS); @@ -324,10 +324,10 @@ struct timeval utimeout; /* seconds to wait before giving up */ cu->cu_error.re_errno = errno; return (cu->cu_error.re_status = RPC_CANTRECV); } - if (inlen < sizeof(u_long)) + if (inlen < sizeof(unsigned long)) continue; /* see if reply transaction id matches sent id */ - if (*((u_long *) (cu->cu_inbuf)) != *((u_long *) (cu->cu_outbuf))) + if (*((unsigned long *) (cu->cu_inbuf)) != *((unsigned long *) (cu->cu_outbuf))) continue; /* we now assume we have the proper reply */ break; @@ -336,7 +336,7 @@ struct timeval utimeout; /* seconds to wait before giving up */ /* * now decode and validate the response */ - xdrmem_create(&reply_xdrs, cu->cu_inbuf, (u_int) inlen, XDR_DECODE); + xdrmem_create(&reply_xdrs, cu->cu_inbuf, (unsigned int) inlen, XDR_DECODE); ok = xdr_replymsg(&reply_xdrs, &reply_msg); /* XDR_DESTROY(&reply_xdrs); save a few cycles on noop destroy */ if (ok) { @@ -380,7 +380,7 @@ struct rpc_err *errp; static bool_t clntudp_freeres(cl, xdr_res, res_ptr) CLIENT *cl; xdrproc_t xdr_res; -caddr_t res_ptr; +char* res_ptr; { register struct cu_data *cu = (struct cu_data *) cl->cl_private; register XDR *xdrs = &(cu->cu_outxdrs); @@ -432,6 +432,7 @@ CLIENT *cl; (void) close(cu->cu_sock); } XDR_DESTROY(&(cu->cu_outxdrs)); - mem_free((caddr_t) cu, (sizeof(*cu) + cu->cu_sendsz + cu->cu_recvsz)); - mem_free((caddr_t) cl, sizeof(CLIENT)); + mem_free((char*) cu, (sizeof(*cu) + cu->cu_sendsz + cu->cu_recvsz)); + mem_free((char*) cl, sizeof(CLIENT)); } + diff --git a/mdk-stage1/dietlibc/librpc/get_myaddress.c b/mdk-stage1/dietlibc/librpc/get_myaddress.c index cd63383d0..1ce2c2b32 100644 --- a/mdk-stage1/dietlibc/librpc/get_myaddress.c +++ b/mdk-stage1/dietlibc/librpc/get_myaddress.c @@ -64,6 +64,6 @@ void get_myaddress(struct sockaddr_in* addr) exit(1); } addr->sin_family = AF_INET; - bcopy((char *) hp->h_addr, (char *) &addr->sin_addr, hp->h_length); + memmove((char *) &addr->sin_addr, (char *) hp->h_addr, hp->h_length); addr->sin_port = htons(PMAPPORT); } diff --git a/mdk-stage1/dietlibc/librpc/getrpcent.c b/mdk-stage1/dietlibc/librpc/getrpcent.c index 5e7f694d2..71774a2eb 100644 --- a/mdk-stage1/dietlibc/librpc/getrpcent.c +++ b/mdk-stage1/dietlibc/librpc/getrpcent.c @@ -44,6 +44,7 @@ static char sccsid[] = #include <netdb.h> #include <sys/socket.h> #include <string.h> +#include <arpa/inet.h> /* * Internet version. @@ -60,9 +61,7 @@ struct rpcdata { char *domain; } *rpcdata; -static struct rpcent *interpret(); -struct hostent *gethostent(); -char *inet_ntoa(); +static struct rpcent *interpret(const char* val, size_t len); #ifndef __linux__ static char *index(); @@ -195,7 +194,7 @@ char *s; } #endif -static struct rpcent *interpret(const char* val, int len) +static struct rpcent *interpret(const char* val, size_t len) { register struct rpcdata *d = _rpcdata(); char *p; @@ -203,7 +202,7 @@ static struct rpcent *interpret(const char* val, int len) if (d == 0) return 0; - strncpy(d->line, val, len); + strncpy(d->line, val, (size_t)len); p = d->line; d->line[len] = '\n'; if (*p == '#') diff --git a/mdk-stage1/dietlibc/librpc/getrpcport.c b/mdk-stage1/dietlibc/librpc/getrpcport.c index a7085cbe7..7b6e50a7d 100644 --- a/mdk-stage1/dietlibc/librpc/getrpcport.c +++ b/mdk-stage1/dietlibc/librpc/getrpcport.c @@ -42,15 +42,15 @@ static char sccsid[] = "@(#)getrpcport.c 1.3 87/08/11 SMI"; #include <string.h> #include <rpc/pmap_clnt.h> -extern int getrpcport (const char * host, u_long prognum, - u_long versnum, u_int proto) +extern int getrpcport (const char * host, unsigned long prognum, + unsigned long versnum, unsigned int proto) { struct sockaddr_in addr; struct hostent *hp; if ((hp = gethostbyname(host)) == NULL) return (0); - bcopy(hp->h_addr, (char *) &addr.sin_addr, hp->h_length); + memmove((char *) &addr.sin_addr, hp->h_addr, hp->h_length); addr.sin_family = AF_INET; addr.sin_port = 0; return (pmap_getport(&addr, prognum, versnum, proto)); diff --git a/mdk-stage1/dietlibc/librpc/pmap_clnt.c b/mdk-stage1/dietlibc/librpc/pmap_clnt.c index 428675656..9dbf3f624 100644 --- a/mdk-stage1/dietlibc/librpc/pmap_clnt.c +++ b/mdk-stage1/dietlibc/librpc/pmap_clnt.c @@ -48,18 +48,15 @@ static char sccsid[] = static struct timeval timeout = { 5, 0 }; static struct timeval tottimeout = { 60, 0 }; -void clnt_perror(); - - /* * Set a mapping between program,version and port. * Calls the pmap service remotely to do the mapping. */ bool_t pmap_set(program, version, protocol, port) -u_long program; -u_long version; +unsigned long program; +unsigned long version; int protocol; -u_short port; +unsigned short port; { struct sockaddr_in myaddress; int socket = -1; @@ -77,7 +74,7 @@ u_short port; parms.pm_vers = version; parms.pm_prot = protocol; parms.pm_port = port; - if (CLNT_CALL(client, PMAPPROC_SET, (xdrproc_t)xdr_pmap, (caddr_t)&parms, (xdrproc_t)xdr_bool, (caddr_t)&rslt, + if (CLNT_CALL(client, PMAPPROC_SET, (xdrproc_t)xdr_pmap, (char*)&parms, (xdrproc_t)xdr_bool, (void*)&rslt, tottimeout) != RPC_SUCCESS) { clnt_perror(client, "Cannot register service"); return (FALSE); @@ -92,8 +89,8 @@ u_short port; * Calls the pmap service remotely to do the un-mapping. */ bool_t pmap_unset(program, version) -u_long program; -u_long version; +unsigned long program; +unsigned long version; { struct sockaddr_in myaddress; int socket = -1; @@ -110,7 +107,7 @@ u_long version; parms.pm_prog = program; parms.pm_vers = version; parms.pm_port = parms.pm_prot = 0; - CLNT_CALL(client, PMAPPROC_UNSET, (xdrproc_t)xdr_pmap, (caddr_t)&parms, (xdrproc_t)xdr_bool, (caddr_t)&rslt, + CLNT_CALL(client, PMAPPROC_UNSET, (xdrproc_t)xdr_pmap, (char*)&parms, (xdrproc_t)xdr_bool, (void*)&rslt, tottimeout); CLNT_DESTROY(client); (void) close(socket); diff --git a/mdk-stage1/dietlibc/librpc/pmap_getmaps.c b/mdk-stage1/dietlibc/librpc/pmap_getmaps.c index 6940783fb..de51a733a 100644 --- a/mdk-stage1/dietlibc/librpc/pmap_getmaps.c +++ b/mdk-stage1/dietlibc/librpc/pmap_getmaps.c @@ -48,14 +48,13 @@ static char sccsid[] = #include <netdb.h> #include <stdio.h> #include <errno.h> +#include <netinet/in.h> //#include <net/if.h> #include <sys/ioctl.h> #define NAMELEN 255 #define MAX_BROADCAST_SIZE 1400 #include <unistd.h> -extern int errno; - /* * Get a copy of the current port maps. * Calls the pmap service remotely to do get the maps. @@ -74,7 +73,7 @@ struct sockaddr_in *address; client = clnttcp_create(address, PMAPPROG, PMAPVERS, &socket, 50, 500); if (client != (CLIENT *) NULL) { if (CLNT_CALL(client, PMAPPROC_DUMP, (xdrproc_t)xdr_void, NULL, (xdrproc_t)xdr_pmaplist, - (caddr_t)&head, minutetimeout) != RPC_SUCCESS) { + (char*)&head, minutetimeout) != RPC_SUCCESS) { clnt_perror(client, "pmap_getmaps rpc problem"); } CLNT_DESTROY(client); diff --git a/mdk-stage1/dietlibc/librpc/pmap_getport.c b/mdk-stage1/dietlibc/librpc/pmap_getport.c index 174dca41a..edf199e69 100644 --- a/mdk-stage1/dietlibc/librpc/pmap_getport.c +++ b/mdk-stage1/dietlibc/librpc/pmap_getport.c @@ -55,18 +55,18 @@ static struct timeval tottimeout = { 60, 0 }; * Calls the pmap service remotely to do the lookup. * Returns 0 if no map exists. */ -u_short pmap_getport(address, program, version, protocol) +unsigned short pmap_getport(address, program, version, protocol) struct sockaddr_in *address; -u_long program; -u_long version; -u_int protocol; +unsigned long program; +unsigned long version; +unsigned int protocol; { - u_short port = 0; + unsigned short port = 0; int socket = -1; register CLIENT *client; struct pmap parms; - address->sin_port = htons(PMAPPORT); + address->sin_port = htons((unsigned short)PMAPPORT); client = clntudp_bufcreate(address, PMAPPROG, PMAPVERS, timeout, &socket, RPCSMALLMSGSIZE, RPCSMALLMSGSIZE); @@ -75,8 +75,8 @@ u_int protocol; parms.pm_vers = version; parms.pm_prot = protocol; parms.pm_port = 0; /* not needed or used */ - if (CLNT_CALL(client, PMAPPROC_GETPORT, (xdrproc_t)xdr_pmap, (caddr_t)&parms, - (xdrproc_t)xdr_u_short, (caddr_t)&port, tottimeout) != RPC_SUCCESS) { + if (CLNT_CALL(client, PMAPPROC_GETPORT, (xdrproc_t)xdr_pmap, (char*)&parms, + (xdrproc_t)xdr_u_short, (char*)&port, tottimeout) != RPC_SUCCESS) { rpc_createerr.cf_stat = RPC_PMAPFAILURE; clnt_geterr(client, &rpc_createerr.cf_error); } else if (port == 0) { diff --git a/mdk-stage1/dietlibc/librpc/pmap_prot2.c b/mdk-stage1/dietlibc/librpc/pmap_prot2.c index 870c844ed..cd2deb036 100644 --- a/mdk-stage1/dietlibc/librpc/pmap_prot2.c +++ b/mdk-stage1/dietlibc/librpc/pmap_prot2.c @@ -107,8 +107,8 @@ bool_t xdr_pmaplist(XDR* xdrs, struct pmaplist** rp) */ if (freeing) next = &((*rp)->pml_next); - if (!xdr_reference(xdrs, (caddr_t *) rp, - (u_int) sizeof(struct pmaplist), (xdrproc_t)xdr_pmap)) + if (!xdr_reference(xdrs, (char* *) rp, + (unsigned int) sizeof(struct pmaplist), (xdrproc_t)xdr_pmap)) return (FALSE); rp = (freeing) ? next : &((*rp)->pml_next); diff --git a/mdk-stage1/dietlibc/librpc/pmap_rmt.c b/mdk-stage1/dietlibc/librpc/pmap_rmt.c index 02efcf91c..390bd736e 100644 --- a/mdk-stage1/dietlibc/librpc/pmap_rmt.c +++ b/mdk-stage1/dietlibc/librpc/pmap_rmt.c @@ -49,11 +49,12 @@ static char sccsid[] = "@(#)pmap_rmt.c 1.21 87/08/27 Copyr 1984 Sun Micro"; //#include <net/if.h> #include <sys/ioctl.h> #include <arpa/inet.h> +#include <netinet/in.h> #define MAX_BROADCAST_SIZE 1400 #include <unistd.h> #include <string.h> +#include "dietfeatures.h" -extern int errno; static struct timeval timeout = { 3, 0 }; @@ -64,42 +65,40 @@ static struct timeval timeout = { 3, 0 }; * remotely call that routine with the given parameters. This allows * programs to do a lookup and call in one step. */ -enum clnt_stat -pmap_rmtcall(addr, prog, vers, proc, xdrargs, argsp, xdrres, resp, tout, - port_ptr) -struct sockaddr_in *addr; -u_long prog, vers, proc; -xdrproc_t xdrargs, xdrres; -caddr_t argsp, resp; -struct timeval tout; -u_long *port_ptr; -{ - int socket = -1; - register CLIENT *client; - struct rmtcallargs a; - struct rmtcallres r; - enum clnt_stat stat; +enum clnt_stat pmap_rmtcall (struct sockaddr_in *addr, + const unsigned long prog, + const unsigned long vers, + const unsigned long proc, + xdrproc_t xdrargs, + char* argsp, xdrproc_t xdrres, + char* resp, struct timeval tout, + unsigned long *port_ptr) { + int socket = -1; + register CLIENT *client; + struct rmtcallargs a; + struct rmtcallres r; + enum clnt_stat stat; - addr->sin_port = htons(PMAPPORT); - client = clntudp_create(addr, PMAPPROG, PMAPVERS, timeout, &socket); - if (client != (CLIENT *) NULL) { - a.prog = prog; - a.vers = vers; - a.proc = proc; - a.args_ptr = argsp; - a.xdr_args = xdrargs; - r.port_ptr = port_ptr; - r.results_ptr = resp; - r.xdr_results = xdrres; - stat = CLNT_CALL(client, PMAPPROC_CALLIT, (xdrproc_t)xdr_rmtcall_args, (caddr_t)&a, - (xdrproc_t)xdr_rmtcallres, (caddr_t)&r, tout); - CLNT_DESTROY(client); - } else { - stat = RPC_FAILED; - } - (void) close(socket); - addr->sin_port = 0; - return (stat); + addr->sin_port = htons((short)PMAPPORT); + client = clntudp_create(addr, PMAPPROG, PMAPVERS, timeout, &socket); + if (client != (CLIENT *) NULL) { + a.prog = prog; + a.vers = vers; + a.proc = proc; + a.args_ptr = argsp; + a.xdr_args = xdrargs; + r.port_ptr = port_ptr; + r.results_ptr = resp; + r.xdr_results = xdrres; + stat = CLNT_CALL(client, PMAPPROC_CALLIT, (xdrproc_t)xdr_rmtcall_args, (char*)&a, + (xdrproc_t)xdr_rmtcallres, (char*)&r, tout); + CLNT_DESTROY(client); + } else { + stat = RPC_FAILED; + } + (void) close(socket); + addr->sin_port = 0; + return (stat); } @@ -109,7 +108,7 @@ u_long *port_ptr; */ bool_t xdr_rmtcall_args(XDR* xdrs, struct rmtcallargs* cap) { - u_int lenposition, argposition, position; + unsigned int lenposition, argposition, position; if (xdr_u_long(xdrs, &(cap->prog)) && xdr_u_long(xdrs, &(cap->vers)) && xdr_u_long(xdrs, &(cap->proc))) { @@ -120,7 +119,7 @@ bool_t xdr_rmtcall_args(XDR* xdrs, struct rmtcallargs* cap) if (!(*(cap->xdr_args)) (xdrs, cap->args_ptr)) return (FALSE); position = XDR_GETPOS(xdrs); - cap->arglen = (u_long) position - (u_long) argposition; + cap->arglen = (unsigned long) position - (unsigned long) argposition; XDR_SETPOS(xdrs, lenposition); if (!xdr_u_long(xdrs, &(cap->arglen))) return (FALSE); @@ -136,12 +135,12 @@ bool_t xdr_rmtcall_args(XDR* xdrs, struct rmtcallargs* cap) */ bool_t xdr_rmtcallres(XDR* xdrs, struct rmtcallres* crp) { - caddr_t port_ptr; + char* port_ptr; - port_ptr = (caddr_t) crp->port_ptr; - if (xdr_reference(xdrs, &port_ptr, sizeof(u_long), + port_ptr = (char*) crp->port_ptr; + if (xdr_reference(xdrs, &port_ptr, sizeof(unsigned long), (xdrproc_t)xdr_u_long) && xdr_u_long(xdrs, &crp->resultslen)) { - crp->port_ptr = (u_long *) port_ptr; + crp->port_ptr = (unsigned long *) port_ptr; return ((*(crp->xdr_results)) (xdrs, crp->results_ptr)); } return (FALSE); @@ -222,13 +221,13 @@ char *buf; /* why allocxate more when we can use existing... */ enum clnt_stat clnt_broadcast(prog, vers, proc, xargs, argsp, xresults, resultsp, eachresult) -u_long prog; /* program number */ -u_long vers; /* version number */ -u_long proc; /* procedure number */ +unsigned long prog; /* program number */ +unsigned long vers; /* version number */ +unsigned long proc; /* procedure number */ xdrproc_t xargs; /* xdr routine for args */ -caddr_t argsp; /* pointer to args */ +char* argsp; /* pointer to args */ xdrproc_t xresults; /* xdr routine for results */ -caddr_t resultsp; /* pointer to results */ +char* resultsp; /* pointer to results */ resultproc_t eachresult; /* call with each result obtained */ { enum clnt_stat stat; @@ -248,8 +247,8 @@ resultproc_t eachresult; /* call with each result obtained */ #endif /* def FD_SETSIZE */ register int i; bool_t done = FALSE; - register u_long xid; - u_long port; + register unsigned long xid; + unsigned long port; struct in_addr addrs[20]; struct sockaddr_in baddr, raddr; /* broadcast and response addresses */ struct rmtcallargs a; @@ -281,9 +280,9 @@ resultproc_t eachresult; /* call with each result obtained */ mask = (1 << sock); #endif /* def FD_SETSIZE */ nets = getbroadcastnets(addrs, sock, inbuf); - bzero((char *) &baddr, sizeof(baddr)); + memset((char*)&baddr,0,sizeof(baddr)); baddr.sin_family = AF_INET; - baddr.sin_port = htons(PMAPPORT); + baddr.sin_port = htons((short)PMAPPORT); baddr.sin_addr.s_addr = htonl(INADDR_ANY); /* baddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY); */ (void) gettimeofday(&t, (struct timezone *) 0); @@ -318,7 +317,7 @@ resultproc_t eachresult; /* call with each result obtained */ for (t.tv_sec = 4; t.tv_sec <= 14; t.tv_sec += 2) { for (i = 0; i < nets; i++) { baddr.sin_addr = addrs[i]; - if (sendto(sock, outbuf, outlen, 0, + if (sendto(sock, outbuf, (size_t)outlen, 0, (struct sockaddr *) &baddr, sizeof(struct sockaddr)) != outlen) { perror("Cannot send broadcast packet"); @@ -332,7 +331,7 @@ resultproc_t eachresult; /* call with each result obtained */ } recv_again: msg.acpted_rply.ar_verf = _null_auth; - msg.acpted_rply.ar_results.where = (caddr_t) & r; + msg.acpted_rply.ar_results.where = (char*) & r; msg.acpted_rply.ar_results.proc = (xdrproc_t)xdr_rmtcallres; readfds = mask; switch (select(_rpc_dtablesize(), &readfds, 0, 0, &t)) { @@ -361,18 +360,18 @@ resultproc_t eachresult; /* call with each result obtained */ stat = RPC_CANTRECV; goto done_broad; } - if (inlen < sizeof(u_long)) + if ((size_t)inlen < sizeof(unsigned long)) goto recv_again; /* * see if reply transaction id matches sent id. * If so, decode the results. */ - xdrmem_create(xdrs, inbuf, (u_int) inlen, XDR_DECODE); + xdrmem_create(xdrs, inbuf, (unsigned int) inlen, XDR_DECODE); if (xdr_replymsg(xdrs, &msg)) { if ((msg.rm_xid == xid) && (msg.rm_reply.rp_stat == MSG_ACCEPTED) && (msg.acpted_rply.ar_stat == SUCCESS)) { - raddr.sin_port = htons((u_short) port); + raddr.sin_port = htons((unsigned short) port); done = (*eachresult) (resultsp, &raddr); } /* otherwise, we just ignore the errors ... */ diff --git a/mdk-stage1/dietlibc/librpc/rpc_callmsg.c b/mdk-stage1/dietlibc/librpc/rpc_callmsg.c index 4b3a9880e..a3514f41c 100644 --- a/mdk-stage1/dietlibc/librpc/rpc_callmsg.c +++ b/mdk-stage1/dietlibc/librpc/rpc_callmsg.c @@ -83,14 +83,14 @@ register struct rpc_msg *cmsg; IXDR_PUT_ENUM(buf, oa->oa_flavor); IXDR_PUT_LONG(buf, oa->oa_length); if (oa->oa_length) { - bcopy(oa->oa_base, (caddr_t) buf, oa->oa_length); + memmove((char*) buf, oa->oa_base, oa->oa_length); buf += RNDUP(oa->oa_length) / sizeof(long); } oa = &cmsg->rm_call.cb_verf; IXDR_PUT_ENUM(buf, oa->oa_flavor); IXDR_PUT_LONG(buf, oa->oa_length); if (oa->oa_length) { - bcopy(oa->oa_base, (caddr_t) buf, oa->oa_length); + memmove((char*) buf, oa->oa_base, oa->oa_length); /* no real need.... buf += RNDUP(oa->oa_length) / sizeof (long); */ @@ -122,7 +122,7 @@ register struct rpc_msg *cmsg; return (FALSE); } if (oa->oa_base == NULL) { - oa->oa_base = (caddr_t) + oa->oa_base = (char*) mem_alloc(oa->oa_length); } buf = XDR_INLINE(xdrs, RNDUP(oa->oa_length)); @@ -132,7 +132,7 @@ register struct rpc_msg *cmsg; return (FALSE); } } else { - bcopy((caddr_t) buf, oa->oa_base, oa->oa_length); + memmove(oa->oa_base, (char*) buf, oa->oa_length); /* no real need.... buf += RNDUP(oa->oa_length) / sizeof (long); @@ -155,7 +155,7 @@ register struct rpc_msg *cmsg; return (FALSE); } if (oa->oa_base == NULL) { - oa->oa_base = (caddr_t) + oa->oa_base = (char*) mem_alloc(oa->oa_length); } buf = XDR_INLINE(xdrs, RNDUP(oa->oa_length)); @@ -165,7 +165,7 @@ register struct rpc_msg *cmsg; return (FALSE); } } else { - bcopy((caddr_t) buf, oa->oa_base, oa->oa_length); + memmove(oa->oa_base, (char*) buf, oa->oa_length); /* no real need... buf += RNDUP(oa->oa_length) / sizeof (long); diff --git a/mdk-stage1/dietlibc/librpc/rpc_prot.c b/mdk-stage1/dietlibc/librpc/rpc_prot.c index 19a4db27f..d5ca5ab77 100644 --- a/mdk-stage1/dietlibc/librpc/rpc_prot.c +++ b/mdk-stage1/dietlibc/librpc/rpc_prot.c @@ -74,7 +74,7 @@ bool_t xdr_des_block(xdrs, blkp) register XDR *xdrs; register des_block *blkp; { - return (xdr_opaque(xdrs, (caddr_t) blkp, sizeof(des_block))); + return (xdr_opaque(xdrs, (char*) blkp, sizeof(des_block))); } /* * * * * * * * * * * * * * XDR RPC MESSAGE * * * * * * * * * * * * * * * */ @@ -146,7 +146,7 @@ register struct rpc_msg *rmsg; xdr_enum(xdrs, (enum_t *) & (rmsg->rm_direction)) && (rmsg->rm_direction == REPLY)) return (xdr_union(xdrs, (enum_t *) & (rmsg->rm_reply.rp_stat), - (caddr_t) & (rmsg->rm_reply.ru), reply_dscrm, + (char*) & (rmsg->rm_reply.ru), reply_dscrm, NULL_xdrproc_t)); return (FALSE); } diff --git a/mdk-stage1/dietlibc/librpc/svc.c b/mdk-stage1/dietlibc/librpc/svc.c index 4fcdb5216..b430deb4a 100644 --- a/mdk-stage1/dietlibc/librpc/svc.c +++ b/mdk-stage1/dietlibc/librpc/svc.c @@ -44,12 +44,11 @@ static char sccsid[] = "@(#)svc.c 1.41 87/10/13 Copyr 1984 Sun Micro"; #include <errno.h> #include <rpc/rpc.h> #include <rpc/pmap_clnt.h> +#include <string.h> #ifdef __linux__ #include <sys/types.h> #endif -extern int errno; - #ifdef FD_SETSIZE static SVCXPRT **xports; #else @@ -69,8 +68,8 @@ static SVCXPRT *xports[NOFILE]; */ static struct svc_callout { struct svc_callout *sc_next; - u_long sc_prog; - u_long sc_vers; + unsigned long sc_prog; + unsigned long sc_vers; void (*sc_dispatch) (); } *svc_head; @@ -135,8 +134,8 @@ SVCXPRT *xprt; */ bool_t svc_register(xprt, prog, vers, dispatch, protocol) SVCXPRT *xprt; -u_long prog; -u_long vers; +unsigned long prog; +unsigned long vers; void (*dispatch) (); rpcprot_t protocol; { @@ -170,8 +169,8 @@ rpcprot_t protocol; * Remove a service program from the callout list. */ void svc_unregister(prog, vers) -u_long prog; -u_long vers; +unsigned long prog; +unsigned long vers; { struct svc_callout *prev; register struct svc_callout *s; @@ -184,7 +183,7 @@ u_long vers; prev->sc_next = s->sc_next; } s->sc_next = NULL_SVC; - mem_free((char *) s, (u_int) sizeof(struct svc_callout)); + mem_free((char *) s, (unsigned int) sizeof(struct svc_callout)); /* now unregister the information with the local binder service */ (void) pmap_unset(prog, vers); @@ -195,8 +194,8 @@ u_long vers; * struct. */ static struct svc_callout *svc_find(prog, vers, prev) -u_long prog; -u_long vers; +unsigned long prog; +unsigned long vers; struct svc_callout **prev; { register struct svc_callout *s, *p; @@ -220,7 +219,7 @@ struct svc_callout **prev; bool_t svc_sendreply(xprt, xdr_results, xdr_location) register SVCXPRT *xprt; xdrproc_t xdr_results; -caddr_t xdr_location; +char* xdr_location; { struct rpc_msg rply; @@ -324,8 +323,8 @@ register SVCXPRT *xprt; */ void svcerr_progvers(xprt, low_vers, high_vers) register SVCXPRT *xprt; -u_long low_vers; -u_long high_vers; +unsigned long low_vers; +unsigned long high_vers; { struct rpc_msg rply; @@ -389,13 +388,13 @@ int *readfds; enum xprt_stat stat; struct rpc_msg msg; int prog_found; - u_long low_vers; - u_long high_vers; + unsigned long low_vers; + unsigned long high_vers; struct svc_req r; register SVCXPRT *xprt; - register u_long mask; + register unsigned long mask; register int bit; - register u_long *maskp; + register unsigned long *maskp; register int setsize; register int sock; char cred_area[2 * MAX_AUTH_BYTES + RQCRED_SIZE]; @@ -409,9 +408,9 @@ int *readfds; setsize = _rpc_dtablesize(); #ifdef __linux__ /*#define NFDBITS 32*/ - maskp = (u_long *) readfds; + maskp = (unsigned long *) readfds; #else - maskp = (u_long *) readfds->fds_bits; + maskp = (unsigned long *) readfds->fds_bits; #endif for (sock = 0; sock < setsize; sock += NFDBITS) { for (mask = *maskp++; (bit = ffs(mask)); mask ^= (1 << (bit - 1))) { diff --git a/mdk-stage1/dietlibc/librpc/svc_auth_unix.c b/mdk-stage1/dietlibc/librpc/svc_auth_unix.c index 7e0305f0a..e81eba7d9 100644 --- a/mdk-stage1/dietlibc/librpc/svc_auth_unix.c +++ b/mdk-stage1/dietlibc/librpc/svc_auth_unix.c @@ -64,7 +64,7 @@ register struct rpc_msg *msg; char area_machname[MAX_MACHINE_NAME + 1]; gid_t area_gids[NGRPS]; } *area; - u_int auth_len; + unsigned int auth_len; int str_len, gid_len; register int i; @@ -72,7 +72,7 @@ register struct rpc_msg *msg; aup = &area->area_aup; aup->aup_machname = area->area_machname; aup->aup_gids = area->area_gids; - auth_len = (u_int) msg->rm_call.cb_cred.oa_length; + auth_len = (unsigned int) msg->rm_call.cb_cred.oa_length; xdrmem_create(&xdrs, msg->rm_call.cb_cred.oa_base, auth_len, XDR_DECODE); buf = XDR_INLINE(&xdrs, auth_len); @@ -83,7 +83,7 @@ register struct rpc_msg *msg; stat = AUTH_BADCRED; goto done; } - bcopy((caddr_t) buf, aup->aup_machname, (u_int) str_len); + memmove(aup->aup_machname, (char*) buf, (unsigned int) str_len); aup->aup_machname[str_len] = 0; str_len = RNDUP(str_len); buf += str_len / sizeof(long); diff --git a/mdk-stage1/dietlibc/librpc/svc_raw.c b/mdk-stage1/dietlibc/librpc/svc_raw.c index c13ea5e06..eebb433ee 100644 --- a/mdk-stage1/dietlibc/librpc/svc_raw.c +++ b/mdk-stage1/dietlibc/librpc/svc_raw.c @@ -69,6 +69,7 @@ static struct xp_ops server_ops = { svcraw_destroy }; + SVCXPRT *svcraw_create() { register struct svcraw_private *srp = svcraw_private; @@ -130,7 +131,7 @@ struct rpc_msg *msg; static bool_t svcraw_getargs(xprt, xdr_args, args_ptr) SVCXPRT *xprt; xdrproc_t xdr_args; -caddr_t args_ptr; +char* args_ptr; { register struct svcraw_private *srp = svcraw_private; @@ -142,7 +143,7 @@ caddr_t args_ptr; static bool_t svcraw_freeargs(xprt, xdr_args, args_ptr) SVCXPRT *xprt; xdrproc_t xdr_args; -caddr_t args_ptr; +char* args_ptr; { register struct svcraw_private *srp = svcraw_private; register XDR *xdrs; @@ -157,3 +158,4 @@ caddr_t args_ptr; static void svcraw_destroy() { } + diff --git a/mdk-stage1/dietlibc/librpc/svc_run.c b/mdk-stage1/dietlibc/librpc/svc_run.c index c7150e357..506b37942 100644 --- a/mdk-stage1/dietlibc/librpc/svc_run.c +++ b/mdk-stage1/dietlibc/librpc/svc_run.c @@ -39,6 +39,7 @@ static char sccsid[] = "@(#)svc_run.c 1.1 87/10/13 Copyr 1984 Sun Micro"; #include <rpc/rpc.h> #include <errno.h> #include <unistd.h> +#include "dietfeatures.h" void svc_run() { @@ -47,7 +48,6 @@ void svc_run() #else int readfds; #endif /* def FD_SETSIZE */ - extern int errno; for (;;) { #ifdef FD_SETSIZE diff --git a/mdk-stage1/dietlibc/librpc/svc_simple.c b/mdk-stage1/dietlibc/librpc/svc_simple.c index 0bb9a19eb..d2310de1e 100644 --- a/mdk-stage1/dietlibc/librpc/svc_simple.c +++ b/mdk-stage1/dietlibc/librpc/svc_simple.c @@ -73,8 +73,8 @@ int registerrpc(int prognum, int versnum, int procnum, char *(*progname)(), xdrp return (-1); } } - (void) pmap_unset((u_long) prognum, (u_long) versnum); - if (!svc_register(transp, (u_long) prognum, (u_long) versnum, + (void) pmap_unset((unsigned long) prognum, (unsigned long) versnum); + if (!svc_register(transp, (unsigned long) prognum, (unsigned long) versnum, universal, IPPROTO_UDP)) { (void) fprintf(stderr, "couldn't register prog %d vers %d\n", prognum, versnum); @@ -120,7 +120,7 @@ SVCXPRT *transp; for (pl = proglst; pl != NULL; pl = pl->p_nxt) if (pl->p_prognum == prog && pl->p_procnum == proc) { /* decode arguments into a CLEAN buffer */ - bzero(xdrbuf, sizeof(xdrbuf)); /* required ! */ + memset(xdrbuf, 0, sizeof(xdrbuf)); /* required ! */ if (!svc_getargs(transp, pl->p_inproc, xdrbuf)) { svcerr_decode(transp); return; diff --git a/mdk-stage1/dietlibc/librpc/svc_tcp.c b/mdk-stage1/dietlibc/librpc/svc_tcp.c index 6edafa1b1..0444bc0d0 100644 --- a/mdk-stage1/dietlibc/librpc/svc_tcp.c +++ b/mdk-stage1/dietlibc/librpc/svc_tcp.c @@ -48,6 +48,7 @@ static char sccsid[] = "@(#)svc_tcp.c 1.21 87/08/11 Copyr 1984 Sun Micro"; #include <errno.h> #include <string.h> #include <unistd.h> +#include "dietfeatures.h" /* * Ops vector for TCP/IP based rpc service handle @@ -59,14 +60,7 @@ static bool_t svctcp_reply(); static bool_t svctcp_freeargs(); static void svctcp_destroy(); -static struct xp_ops svctcp_op = { - svctcp_recv, - svctcp_stat, - svctcp_getargs, - svctcp_reply, - svctcp_freeargs, - svctcp_destroy -}; +static struct xp_ops svctcp_op; /* * Ops vector for TCP/IP rendezvous handler @@ -87,13 +81,13 @@ static int readtcp(), writetcp(); static SVCXPRT *makefd_xprt(); struct tcp_rendezvous { /* kept in xprt->xp_p1 */ - u_int sendsize; - u_int recvsize; + unsigned int sendsize; + unsigned int recvsize; }; struct tcp_conn { /* kept in xprt->xp_p1 */ enum xprt_stat strm_stat; - u_long x_id; + unsigned long x_id; XDR xdrs; char verf_body[MAX_AUTH_BYTES]; }; @@ -120,8 +114,8 @@ struct tcp_conn { /* kept in xprt->xp_p1 */ */ SVCXPRT *svctcp_create(sock, sendsize, recvsize) register int sock; -u_int sendsize; -u_int recvsize; +unsigned int sendsize; +unsigned int recvsize; { bool_t madesock = FALSE; register SVCXPRT *xprt; @@ -136,7 +130,7 @@ u_int recvsize; } madesock = TRUE; } - bzero((char *) &addr, sizeof(addr)); + memset((char *) &addr, 0, sizeof(addr)); addr.sin_family = AF_INET; if (bindresvport(sock, &addr)) { addr.sin_port = 0; @@ -162,7 +156,7 @@ u_int recvsize; return (NULL); } xprt->xp_p2 = NULL; - xprt->xp_p1 = (caddr_t) r; + xprt->xp_p1 = (char*) r; xprt->xp_verf = _null_auth; xprt->xp_ops = &svctcp_rendezvous_op; xprt->xp_port = ntohs(addr.sin_port); @@ -177,8 +171,8 @@ u_int recvsize; */ SVCXPRT *svcfd_create(fd, sendsize, recvsize) int fd; -u_int sendsize; -u_int recvsize; +unsigned int sendsize; +unsigned int recvsize; { return (makefd_xprt(fd, sendsize, recvsize)); @@ -186,8 +180,8 @@ u_int recvsize; static SVCXPRT *makefd_xprt(fd, sendsize, recvsize) int fd; -u_int sendsize; -u_int recvsize; +unsigned int sendsize; +unsigned int recvsize; { register SVCXPRT *xprt; register struct tcp_conn *cd; @@ -207,9 +201,9 @@ u_int recvsize; } cd->strm_stat = XPRT_IDLE; xdrrec_create(&(cd->xdrs), sendsize, recvsize, - (caddr_t) xprt, readtcp, writetcp); + (char*) xprt, readtcp, writetcp); xprt->xp_p2 = NULL; - xprt->xp_p1 = (caddr_t) cd; + xprt->xp_p1 = (char*) cd; xprt->xp_verf.oa_base = cd->verf_body; xprt->xp_addrlen = 0; xprt->xp_ops = &svctcp_op; /* truely deals with calls */ @@ -267,9 +261,9 @@ register SVCXPRT *xprt; /* an actual connection socket */ XDR_DESTROY(&(cd->xdrs)); } - mem_free((caddr_t) cd, sizeof(struct tcp_conn)); + mem_free((char*) cd, sizeof(struct tcp_conn)); - mem_free((caddr_t) xprt, sizeof(SVCXPRT)); + mem_free((char*) xprt, sizeof(SVCXPRT)); } /* @@ -285,7 +279,7 @@ static struct timeval wait_per_try = { 35, 0 }; */ static int readtcp(xprt, buf, len) register SVCXPRT *xprt; -caddr_t buf; +char* buf; register int len; { register int sock = xprt->xp_sock; @@ -327,7 +321,7 @@ register int len; */ static int writetcp(xprt, buf, len) register SVCXPRT *xprt; -caddr_t buf; +char* buf; int len; { register int i, cnt; @@ -372,7 +366,7 @@ register struct rpc_msg *msg; static bool_t svctcp_getargs(xprt, xdr_args, args_ptr) SVCXPRT *xprt; xdrproc_t xdr_args; -caddr_t args_ptr; +char* args_ptr; { return ((*xdr_args) @@ -382,7 +376,7 @@ caddr_t args_ptr; static bool_t svctcp_freeargs(xprt, xdr_args, args_ptr) SVCXPRT *xprt; xdrproc_t xdr_args; -caddr_t args_ptr; +char* args_ptr; { register XDR *xdrs = &(((struct tcp_conn *) (xprt->xp_p1))->xdrs); @@ -404,3 +398,13 @@ register struct rpc_msg *msg; (void) xdrrec_endofrecord(xdrs, TRUE); return (stat); } + +static struct xp_ops svctcp_op = { + svctcp_recv, + svctcp_stat, + svctcp_getargs, + svctcp_reply, + svctcp_freeargs, + svctcp_destroy +}; + diff --git a/mdk-stage1/dietlibc/librpc/svc_udp.c b/mdk-stage1/dietlibc/librpc/svc_udp.c index 1cdb5ce91..af22f289f 100644 --- a/mdk-stage1/dietlibc/librpc/svc_udp.c +++ b/mdk-stage1/dietlibc/librpc/svc_udp.c @@ -45,10 +45,9 @@ static char sccsid[] = "@(#)svc_udp.c 1.24 87/08/11 Copyr 1984 Sun Micro"; #include <errno.h> #include <string.h> #include <unistd.h> - +#include "dietfeatures.h" #define rpc_buffer(xprt) ((xprt)->xp_p1) -#define MAX(a, b) ((a > b) ? a : b) static bool_t svcudp_recv(); static bool_t svcudp_reply(); @@ -57,23 +56,14 @@ static bool_t svcudp_getargs(); static bool_t svcudp_freeargs(); static void svcudp_destroy(); -static struct xp_ops svcudp_op = { - svcudp_recv, - svcudp_stat, - svcudp_getargs, - svcudp_reply, - svcudp_freeargs, - svcudp_destroy -}; - -extern int errno; +static struct xp_ops svcudp_op; /* * kept in xprt->xp_p2 */ struct svcudp_data { - u_int su_iosz; /* byte size of send.recv buffer */ - u_long su_xid; /* transaction id */ + unsigned int su_iosz; /* byte size of send.recv buffer */ + unsigned long su_xid; /* transaction id */ XDR su_xdrs; /* XDR handle */ char su_verfbody[MAX_AUTH_BYTES]; /* verifier body */ char *su_cache; /* cached data, NULL if no cache */ @@ -81,8 +71,8 @@ struct svcudp_data { #define su_data(xprt) ((struct svcudp_data *)(xprt->xp_p2)) -static int cache_get(SVCXPRT* xprt, struct rpc_msg* msg, char** replyp, u_long* replylenp); -static void cache_set(SVCXPRT* xprt, u_long replylen); +static int cache_get(SVCXPRT* xprt, struct rpc_msg* msg, char** replyp, unsigned long* replylenp); +static void cache_set(SVCXPRT* xprt, unsigned long replylen); /* * Usage: @@ -99,7 +89,7 @@ static void cache_set(SVCXPRT* xprt, u_long replylen); */ SVCXPRT *svcudp_bufcreate(sock, sendsz, recvsz) register int sock; -u_int sendsz, recvsz; +unsigned int sendsz, recvsz; { bool_t madesock = FALSE; register SVCXPRT *xprt; @@ -114,7 +104,7 @@ u_int sendsz, recvsz; } madesock = TRUE; } - bzero((char *) &addr, sizeof(addr)); + memset((char *) &addr, 0, sizeof(addr)); addr.sin_family = AF_INET; if (bindresvport(sock, &addr)) { addr.sin_port = 0; @@ -144,7 +134,7 @@ u_int sendsz, recvsz; xdrmem_create(&(su->su_xdrs), rpc_buffer(xprt), su->su_iosz, XDR_DECODE); su->su_cache = NULL; - xprt->xp_p2 = (caddr_t) su; + xprt->xp_p2 = (char*) su; xprt->xp_verf.oa_base = su->su_verfbody; xprt->xp_ops = &svcudp_op; xprt->xp_port = ntohs(addr.sin_port); @@ -175,7 +165,7 @@ struct rpc_msg *msg; register XDR *xdrs = &(su->su_xdrs); register int rlen; char *reply; - u_long replylen; + unsigned long replylen; again: xprt->xp_addrlen = sizeof(struct sockaddr_in); @@ -185,7 +175,7 @@ struct rpc_msg *msg; &(xprt->xp_addrlen)); if (rlen == -1 && errno == EINTR) goto again; - if (rlen < 4 * sizeof(u_long)) + if (rlen < 4 * sizeof(unsigned long)) return (FALSE); xdrs->x_op = XDR_DECODE; XDR_SETPOS(xdrs, 0); @@ -222,7 +212,7 @@ struct rpc_msg *msg; == slen) { stat = TRUE; if (su->su_cache && slen >= 0) { - cache_set(xprt, (u_long) slen); + cache_set(xprt, (unsigned long) slen); } } } @@ -232,7 +222,7 @@ struct rpc_msg *msg; static bool_t svcudp_getargs(xprt, xdr_args, args_ptr) SVCXPRT *xprt; xdrproc_t xdr_args; -caddr_t args_ptr; +char* args_ptr; { return ((*xdr_args) (&(su_data(xprt)->su_xdrs), args_ptr)); @@ -241,7 +231,7 @@ caddr_t args_ptr; static bool_t svcudp_freeargs(xprt, xdr_args, args_ptr) SVCXPRT *xprt; xdrproc_t xdr_args; -caddr_t args_ptr; +char* args_ptr; { register XDR *xdrs = &(su_data(xprt)->su_xdrs); @@ -258,9 +248,9 @@ register SVCXPRT *xprt; (void) close(xprt->xp_sock); XDR_DESTROY(&(su->su_xdrs)); mem_free(rpc_buffer(xprt), su->su_iosz); - mem_free((caddr_t) su, sizeof(struct svcudp_data)); + mem_free((char*) su, sizeof(struct svcudp_data)); - mem_free((caddr_t) xprt, sizeof(SVCXPRT)); + mem_free((char*) xprt, sizeof(SVCXPRT)); } @@ -281,7 +271,7 @@ register SVCXPRT *xprt; (type *) mem_alloc((unsigned) (sizeof(type) * (size))) #define BZERO(addr, type, size) \ - bzero((char *) addr, sizeof(type) * (int) (size)) + memset((char *) addr, 0, sizeof(type) * (int) (size)) /* * An entry in the cache @@ -291,16 +281,16 @@ struct cache_node { /* * Index into cache is xid, proc, vers, prog and address */ - u_long cache_xid; - u_long cache_proc; - u_long cache_vers; - u_long cache_prog; + unsigned long cache_xid; + unsigned long cache_proc; + unsigned long cache_vers; + unsigned long cache_prog; struct sockaddr_in cache_addr; /* * The cached reply and length */ char *cache_reply; - u_long cache_replylen; + unsigned long cache_replylen; /* * Next node on the list, if there is a collision */ @@ -313,13 +303,13 @@ struct cache_node { * The entire cache */ struct udp_cache { - u_long uc_size; /* size of cache */ + unsigned long uc_size; /* size of cache */ cache_ptr *uc_entries; /* hash table of entries in cache */ cache_ptr *uc_fifo; /* fifo list of entries in cache */ - u_long uc_nextvictim; /* points to next victim in fifo list */ - u_long uc_prog; /* saved program number */ - u_long uc_vers; /* saved version number */ - u_long uc_proc; /* saved procedure number */ + unsigned long uc_nextvictim; /* points to next victim in fifo list */ + unsigned long uc_prog; /* saved program number */ + unsigned long uc_vers; /* saved version number */ + unsigned long uc_proc; /* saved procedure number */ struct sockaddr_in uc_addr; /* saved caller's address */ }; @@ -335,7 +325,7 @@ struct udp_cache { * Enable use of the cache. * Note: there is no disable. */ -int svcudp_enablecache(SVCXPRT* transp, u_long size) +int svcudp_enablecache(SVCXPRT* transp, unsigned long size) { struct svcudp_data *su = su_data(transp); struct udp_cache *uc; @@ -371,13 +361,13 @@ int svcudp_enablecache(SVCXPRT* transp, u_long size) /* * Set an entry in the cache */ -static void cache_set(SVCXPRT* xprt, u_long replylen) +static void cache_set(SVCXPRT* xprt, unsigned long replylen) { register cache_ptr victim; register cache_ptr *vicp; register struct svcudp_data *su = su_data(xprt); struct udp_cache *uc = (struct udp_cache *) su->su_cache; - u_int loc; + unsigned int loc; char *newbuf; /* @@ -434,14 +424,14 @@ static void cache_set(SVCXPRT* xprt, u_long replylen) * Try to get an entry from the cache * return 1 if found, 0 if not found */ -static int cache_get(SVCXPRT* xprt, struct rpc_msg* msg, char** replyp, u_long* replylenp) +static int cache_get(SVCXPRT* xprt, struct rpc_msg* msg, char** replyp, unsigned long* replylenp) { - u_int loc; + unsigned int loc; register cache_ptr ent; register struct svcudp_data *su = su_data(xprt); register struct udp_cache *uc = (struct udp_cache *) su->su_cache; -# define EQADDR(a1, a2) (bcmp((char*)&a1, (char*)&a2, sizeof(a1)) == 0) +# define EQADDR(a1, a2) (memcmp((char*)&a1, (char*)&a2, sizeof(a1)) == 0) loc = CACHE_LOC(xprt, su->su_xid); for (ent = uc->uc_entries[loc]; ent != NULL; ent = ent->cache_next) { @@ -465,3 +455,13 @@ static int cache_get(SVCXPRT* xprt, struct rpc_msg* msg, char** replyp, u_long* uc->uc_addr = xprt->xp_raddr; return (0); } + +static struct xp_ops svcudp_op = { + svcudp_recv, + svcudp_stat, + svcudp_getargs, + svcudp_reply, + svcudp_freeargs, + svcudp_destroy +}; + diff --git a/mdk-stage1/dietlibc/librpc/xdr.c b/mdk-stage1/dietlibc/librpc/xdr.c index 864b47dea..836a5697a 100644 --- a/mdk-stage1/dietlibc/librpc/xdr.c +++ b/mdk-stage1/dietlibc/librpc/xdr.c @@ -52,7 +52,7 @@ static char sccsid[] = "@(#)xdr.c 1.35 87/08/12"; */ #define XDR_FALSE ((long) 0) #define XDR_TRUE ((long) 1) -#define LASTUNSIGNED ((u_int) 0-1) +#define LASTUNSIGNED ((unsigned int) 0-1) /* * for unit alignment @@ -76,7 +76,7 @@ void xdr_free(xdrproc_t proc, char* objp) */ bool_t xdr_void( /* xdrs, addr */ ) /* XDR *xdrs; */ - /* caddr_t addr; */ + /* char* addr; */ { return (TRUE); @@ -108,10 +108,10 @@ bool_t xdr_u_int(XDR* xdrs, unsigned int* up) #ifdef lint (void) (xdr_short(xdrs, (short *) up)); - return (xdr_u_long(xdrs, (u_long *) up)); + return (xdr_u_long(xdrs, (unsigned long *) up)); #else - if (sizeof(u_int) == sizeof(u_long)) { - return (xdr_u_long(xdrs, (u_long *) up)); + if (sizeof(unsigned int) == sizeof(unsigned long)) { + return (xdr_u_long(xdrs, (unsigned long *) up)); } else { return (xdr_short(xdrs, (short *) up)); } @@ -184,19 +184,19 @@ bool_t xdr_short(XDR* xdrs, short* sp) */ bool_t xdr_u_short(XDR* xdrs, unsigned short* usp) { - u_long l; + unsigned long l; switch (xdrs->x_op) { case XDR_ENCODE: - l = (u_long) * usp; + l = (unsigned long) * usp; return (XDR_PUTLONG(xdrs, &l)); case XDR_DECODE: if (!XDR_GETLONG(xdrs, &l)) { return (FALSE); } - *usp = (u_short) l; + *usp = (unsigned short) l; return (TRUE); case XDR_FREE: @@ -226,7 +226,7 @@ bool_t xdr_char(XDR* xdrs, char* cp) */ bool_t xdr_u_char(XDR* xdrs, unsigned char* cp) { - u_int u; + unsigned int u; u = (*cp); if (!xdr_u_int(xdrs, &u)) { @@ -297,10 +297,10 @@ enum_t *ep; */ bool_t xdr_opaque(xdrs, cp, cnt) register XDR *xdrs; -caddr_t cp; -register u_int cnt; +char* cp; +register unsigned int cnt; { - register u_int rndup; + register unsigned int rndup; static char crud[BYTES_PER_XDR_UNIT]; /* @@ -349,11 +349,11 @@ register u_int cnt; bool_t xdr_bytes(xdrs, cpp, sizep, maxsize) register XDR *xdrs; char **cpp; -register u_int *sizep; -u_int maxsize; +register unsigned int *sizep; +unsigned int maxsize; { register char *sp = *cpp; /* sp is the actual string pointer */ - register u_int nodesize; + register unsigned int nodesize; /* * first deal with the length since xdr bytes are counted @@ -465,11 +465,11 @@ bool_t xdr_union(XDR* xdrs, enum_t* dscmp, char* unp, const struct xdr_discrim* bool_t xdr_string(xdrs, cpp, maxsize) register XDR *xdrs; char **cpp; -u_int maxsize; +unsigned int maxsize; { register char *sp = *cpp; /* sp is the actual string pointer */ - u_int size; - u_int nodesize; + unsigned int size; + unsigned int nodesize; /* * first deal with the length since xdr strings are counted-strings diff --git a/mdk-stage1/dietlibc/librpc/xdr_array.c b/mdk-stage1/dietlibc/librpc/xdr_array.c index f8ae12b19..f0c9bbbb3 100644 --- a/mdk-stage1/dietlibc/librpc/xdr_array.c +++ b/mdk-stage1/dietlibc/librpc/xdr_array.c @@ -48,7 +48,7 @@ static char sccsid[] = #include <rpc/xdr.h> #include <string.h> -#define LASTUNSIGNED ((u_int)0-1) +#define LASTUNSIGNED ((unsigned int)0-1) /* @@ -60,17 +60,17 @@ static char sccsid[] = */ bool_t xdr_array(xdrs, addrp, sizep, maxsize, elsize, elproc) register XDR *xdrs; -caddr_t *addrp; /* array pointer */ -u_int *sizep; /* number of elements */ -u_int maxsize; /* max numberof elements */ -u_int elsize; /* size in bytes of each element */ +char* *addrp; /* array pointer */ +unsigned int *sizep; /* number of elements */ +unsigned int maxsize; /* max numberof elements */ +unsigned int elsize; /* size in bytes of each element */ xdrproc_t elproc; /* xdr routine to handle each element */ { - register u_int i; - register caddr_t target = *addrp; - register u_int c; /* the actual element count */ + register unsigned int i; + register char* target = *addrp; + register unsigned int c; /* the actual element count */ register bool_t stat = TRUE; - register u_int nodesize; + register unsigned int nodesize; /* like strings, arrays are really counted arrays */ if (!xdr_u_int(xdrs, sizep)) { @@ -80,7 +80,17 @@ xdrproc_t elproc; /* xdr routine to handle each element */ if ((c > maxsize) && (xdrs->x_op != XDR_FREE)) { return (FALSE); } - nodesize = c * elsize; + /* duh, look for integer overflow (fefe) */ + { + unsigned int i; + nodesize = 0; + for (i=c; i; --i) { + unsigned int tmp=nodesize+elsize; + if (tmp<nodesize) /* overflow */ + return FALSE; + nodesize=tmp; + } + } /* * if we are deserializing, we may need to allocate an array. @@ -96,7 +106,7 @@ xdrproc_t elproc; /* xdr routine to handle each element */ (void) fprintf(stderr, "xdr_array: out of memory\n"); return (FALSE); } - bzero(target, nodesize); + memset(target, 0, nodesize); break; case XDR_FREE: @@ -134,11 +144,11 @@ xdrproc_t elproc; /* xdr routine to handle each element */ bool_t xdr_vector(xdrs, basep, nelem, elemsize, xdr_elem) register XDR *xdrs; register char *basep; -register u_int nelem; -register u_int elemsize; +register unsigned int nelem; +register unsigned int elemsize; register xdrproc_t xdr_elem; { - register u_int i; + register unsigned int i; register char *elptr; elptr = basep; diff --git a/mdk-stage1/dietlibc/librpc/xdr_mem.c b/mdk-stage1/dietlibc/librpc/xdr_mem.c index 755f6abf1..5bc54cd4a 100644 --- a/mdk-stage1/dietlibc/librpc/xdr_mem.c +++ b/mdk-stage1/dietlibc/librpc/xdr_mem.c @@ -52,7 +52,7 @@ static bool_t xdrmem_getlong(); static bool_t xdrmem_putlong(); static bool_t xdrmem_getbytes(); static bool_t xdrmem_putbytes(); -static u_int xdrmem_getpos(); +static unsigned int xdrmem_getpos(); static bool_t xdrmem_setpos(); static int32_t *xdrmem_inline(); static void xdrmem_destroy(); @@ -68,20 +68,21 @@ static struct xdr_ops xdrmem_ops = { xdrmem_destroy }; + /* * The procedure xdrmem_create initializes a stream descriptor for a * memory buffer. */ void xdrmem_create(xdrs, addr, size, op) register XDR *xdrs; -caddr_t addr; -u_int size; +const char* addr; +unsigned int size; enum xdr_op op; { xdrs->x_op = op; xdrs->x_ops = &xdrmem_ops; - xdrs->x_private = xdrs->x_base = addr; + xdrs->x_private = xdrs->x_base = (char*)addr; xdrs->x_handy = size; } @@ -98,7 +99,7 @@ long *lp; if ((xdrs->x_handy -= sizeof(long)) < 0) return (FALSE); - *lp = (long) ntohl((u_long) (*((long *) (xdrs->x_private)))); + *lp = (long) ntohl((unsigned long) (*((long *) (xdrs->x_private)))); xdrs->x_private += sizeof(long); return (TRUE); @@ -112,7 +113,7 @@ long *lp; if ((xdrs->x_handy -= sizeof(long)) < 0) return (FALSE); - *(long *) xdrs->x_private = (long) htonl((u_long) (*lp)); + *(long *) xdrs->x_private = (long) htonl((unsigned long) (*lp)); xdrs->x_private += sizeof(long); return (TRUE); @@ -120,43 +121,43 @@ long *lp; static bool_t xdrmem_getbytes(xdrs, addr, len) register XDR *xdrs; -caddr_t addr; -register u_int len; +char* addr; +register unsigned int len; { if ((xdrs->x_handy -= len) < 0) return (FALSE); - bcopy(xdrs->x_private, addr, len); + memmove(addr, xdrs->x_private, len); xdrs->x_private += len; return (TRUE); } static bool_t xdrmem_putbytes(xdrs, addr, len) register XDR *xdrs; -caddr_t addr; -register u_int len; +char* addr; +register unsigned int len; { if ((xdrs->x_handy -= len) < 0) return (FALSE); - bcopy(addr, xdrs->x_private, len); + memmove(xdrs->x_private, addr, len); xdrs->x_private += len; return (TRUE); } -static u_int xdrmem_getpos(xdrs) +static unsigned int xdrmem_getpos(xdrs) register XDR *xdrs; { - return ((u_int) xdrs->x_private - (u_int) xdrs->x_base); + return ((unsigned int) xdrs->x_private - (unsigned int) xdrs->x_base); } static bool_t xdrmem_setpos(xdrs, pos) register XDR *xdrs; -u_int pos; +unsigned int pos; { - register caddr_t newaddr = xdrs->x_base + pos; - register caddr_t lastaddr = xdrs->x_private + xdrs->x_handy; + register char* newaddr = xdrs->x_base + pos; + register char* lastaddr = xdrs->x_private + xdrs->x_handy; if ((long) newaddr > (long) lastaddr) return (FALSE); @@ -178,3 +179,4 @@ int len; } return (buf); } + diff --git a/mdk-stage1/dietlibc/librpc/xdr_rec.c b/mdk-stage1/dietlibc/librpc/xdr_rec.c index 83e800f5e..759a76108 100644 --- a/mdk-stage1/dietlibc/librpc/xdr_rec.c +++ b/mdk-stage1/dietlibc/librpc/xdr_rec.c @@ -42,7 +42,7 @@ static char sccsid[] = "@(#)xdr_rec.c 1.21 87/08/11 Copyr 1984 Sun Micro"; * and the tcp transport level. A record is composed on one or more * record fragments. A record fragment is a thirty-two bit header followed * by n bytes of data, where n is contained in the header. The header - * is represented as a htonl(u_long). Thegh order bit encodes + * is represented as a htonl(unsigned long). Thegh order bit encodes * whether or not the fragment is the last fragment of the record * (1 => fragment is last, 0 => more fragments to follow. * The other 31 bits encode the byte length of the fragment. @@ -56,13 +56,13 @@ static char sccsid[] = "@(#)xdr_rec.c 1.21 87/08/11 Copyr 1984 Sun Micro"; extern long lseek(); -static u_int fix_buf_size(); +static unsigned int fix_buf_size(); static bool_t xdrrec_getlong(); static bool_t xdrrec_putlong(); static bool_t xdrrec_getbytes(); static bool_t xdrrec_putbytes(); -static u_int xdrrec_getpos(); +static unsigned int xdrrec_getpos(); static bool_t xdrrec_setpos(); static int32_t *xdrrec_inline(); static void xdrrec_destroy(); @@ -78,6 +78,7 @@ static struct xdr_ops xdrrec_ops = { xdrrec_destroy }; + /* * A record is composed of one or more record fragments. * A record fragment is a two-byte header followed by zero to @@ -91,32 +92,32 @@ static struct xdr_ops xdrrec_ops = { * meet the needs of xdr and rpc based on tcp. */ -#define LAST_FRAG ((u_long)(1 << 31)) +#define LAST_FRAG ((unsigned long)(1 << 31)) typedef struct rec_strm { - caddr_t tcp_handle; - caddr_t the_buffer; + char* tcp_handle; + char* the_buffer; /* * out-goung bits */ int (*writeit) (); - caddr_t out_base; /* output buffer (points to frag header) */ - caddr_t out_finger; /* next output position */ - caddr_t out_boundry; /* data cannot up to this address */ - u_long *frag_header; /* beginning of curren fragment */ + char* out_base; /* output buffer (points to frag header) */ + char* out_finger; /* next output position */ + char* out_boundry; /* data cannot up to this address */ + unsigned long *frag_header; /* beginning of curren fragment */ bool_t frag_sent; /* true if buffer sent in middle of record */ /* * in-coming bits */ int (*readit) (); - u_long in_size; /* fixed size of the input buffer */ - caddr_t in_base; - caddr_t in_finger; /* location of next byte to be had */ - caddr_t in_boundry; /* can read up to this location */ + unsigned long in_size; /* fixed size of the input buffer */ + char* in_base; + char* in_finger; /* location of next byte to be had */ + char* in_boundry; /* can read up to this location */ long fbtbc; /* fragment bytes to be consumed */ bool_t last_frag; - u_int sendsize; - u_int recvsize; + unsigned int sendsize; + unsigned int recvsize; } RECSTREAM; @@ -131,9 +132,9 @@ typedef struct rec_strm { */ void xdrrec_create(xdrs, sendsize, recvsize, tcp_handle, readit, writeit) register XDR *xdrs; -register u_int sendsize; -register u_int recvsize; -caddr_t tcp_handle; +register unsigned int sendsize; +register unsigned int recvsize; +char* tcp_handle; int (*readit) (); /* like read, but pass it a tcp_handle, not sock */ int (*writeit) (); /* like write, but pass it a tcp_handle, not sock */ { @@ -159,20 +160,20 @@ int (*writeit) (); /* like write, but pass it a tcp_handle, not sock */ return; } for (rstrm->out_base = rstrm->the_buffer; - (u_int) rstrm->out_base % BYTES_PER_XDR_UNIT != 0; + (unsigned long) rstrm->out_base % BYTES_PER_XDR_UNIT != 0; rstrm->out_base++); rstrm->in_base = rstrm->out_base + sendsize; /* * now the rest ... */ xdrs->x_ops = &xdrrec_ops; - xdrs->x_private = (caddr_t) rstrm; + xdrs->x_private = (char*) rstrm; rstrm->tcp_handle = tcp_handle; rstrm->readit = readit; rstrm->writeit = writeit; rstrm->out_finger = rstrm->out_boundry = rstrm->out_base; - rstrm->frag_header = (u_long *) rstrm->out_base; - rstrm->out_finger += sizeof(u_long); + rstrm->frag_header = (unsigned long *) rstrm->out_base; + rstrm->out_finger += sizeof(unsigned long); rstrm->out_boundry += sendsize; rstrm->frag_sent = FALSE; rstrm->in_size = recvsize; @@ -198,15 +199,15 @@ long *lp; /* first try the inline, fast case */ if ((rstrm->fbtbc >= sizeof(long)) && - (((int) rstrm->in_boundry - (int) buflp) >= sizeof(long))) { - *lp = (long) ntohl((u_long) (*buflp)); + (((long) rstrm->in_boundry - (long) buflp) >= sizeof(long))) { + *lp = (long) ntohl((unsigned long) (*buflp)); rstrm->fbtbc -= sizeof(long); rstrm->in_finger += sizeof(long); } else { - if (!xdrrec_getbytes(xdrs, (caddr_t) & mylong, sizeof(long))) + if (!xdrrec_getbytes(xdrs, (char*) & mylong, sizeof(long))) return (FALSE); - *lp = (long) ntohl((u_long) mylong); + *lp = (long) ntohl((unsigned long) mylong); } return (TRUE); } @@ -216,17 +217,17 @@ long *lp; */ static bool_t flush_out(RECSTREAM* rstrm, bool_t eor) { - register u_long eormask = (eor == TRUE) ? LAST_FRAG : 0; - register u_long len = (u_long) (rstrm->out_finger) - - (u_long) (rstrm->frag_header) - sizeof(u_long); + register unsigned long eormask = (eor == TRUE) ? LAST_FRAG : 0; + register unsigned long len = (unsigned long) (rstrm->out_finger) - + (unsigned long) (rstrm->frag_header) - sizeof(unsigned long); *(rstrm->frag_header) = htonl(len | eormask); - len = (u_long) (rstrm->out_finger) - (u_long) (rstrm->out_base); + len = (unsigned long) (rstrm->out_finger) - (unsigned long) (rstrm->out_base); if ((*(rstrm->writeit)) (rstrm->tcp_handle, rstrm->out_base, (int) len) != (int) len) return (FALSE); - rstrm->frag_header = (u_long *) rstrm->out_base; - rstrm->out_finger = (caddr_t) rstrm->out_base + sizeof(u_long); + rstrm->frag_header = (unsigned long *) rstrm->out_base; + rstrm->out_finger = (char*) rstrm->out_base + sizeof(unsigned long); return (TRUE); } @@ -235,12 +236,12 @@ static bool_t fill_input_buf(rstrm) register RECSTREAM *rstrm; { - register caddr_t where; - u_int i; + register char* where; + unsigned int i; register int len; where = rstrm->in_base; - i = (u_int) rstrm->in_boundry % BYTES_PER_XDR_UNIT; + i = (unsigned long) rstrm->in_boundry % BYTES_PER_XDR_UNIT; where += i; len = rstrm->in_size - i; if ((len = (*(rstrm->readit)) (rstrm->tcp_handle, where, len)) == -1) @@ -255,20 +256,20 @@ static bool_t /* knows nothing about records! Only about input buffers */ get_input_bytes(rstrm, addr, len) register RECSTREAM *rstrm; -register caddr_t addr; +register char* addr; register int len; { register int current; while (len > 0) { - current = (int) rstrm->in_boundry - (int) rstrm->in_finger; + current = (long) rstrm->in_boundry - (long) rstrm->in_finger; if (current == 0) { if (!fill_input_buf(rstrm)) return (FALSE); continue; } current = (len < current) ? len : current; - bcopy(rstrm->in_finger, addr, current); + memmove(addr, rstrm->in_finger, current); rstrm->in_finger += current; addr += current; len -= current; @@ -281,9 +282,9 @@ static bool_t set_input_fragment(rstrm) register RECSTREAM *rstrm; { - u_long header; + unsigned long header; - if (!get_input_bytes(rstrm, (caddr_t) & header, sizeof(header))) + if (!get_input_bytes(rstrm, (char*) & header, sizeof(header))) return (FALSE); header = (long) ntohl(header); rstrm->last_frag = ((header & LAST_FRAG) == 0) ? FALSE : TRUE; @@ -300,7 +301,7 @@ long cnt; register int current; while (cnt > 0) { - current = (int) rstrm->in_boundry - (int) rstrm->in_finger; + current = (long) rstrm->in_boundry - (long) rstrm->in_finger; if (current == 0) { if (!fill_input_buf(rstrm)) return (FALSE); @@ -313,8 +314,8 @@ long cnt; return (TRUE); } -static u_int fix_buf_size(s) -register u_int s; +static unsigned int fix_buf_size(s) +register unsigned int s; { if (s < 100) @@ -341,7 +342,7 @@ long *lp; dest_lp = ((long *) (rstrm->out_finger)); rstrm->out_finger += sizeof(long); } - *dest_lp = (long) htonl((u_long) (*lp)); + *dest_lp = (long) htonl((unsigned long) (*lp)); return (TRUE); } @@ -349,8 +350,8 @@ static bool_t /* must manage buffers, fragments, and records */ xdrrec_getbytes(xdrs, addr, len) XDR *xdrs; -register caddr_t addr; -register u_int len; +register char* addr; +register unsigned int len; { register RECSTREAM *rstrm = (RECSTREAM *) (xdrs->x_private); register int current; @@ -376,16 +377,16 @@ register u_int len; static bool_t xdrrec_putbytes(xdrs, addr, len) XDR *xdrs; -register caddr_t addr; -register u_int len; +register char* addr; +register unsigned int len; { register RECSTREAM *rstrm = (RECSTREAM *) (xdrs->x_private); register int current; while (len > 0) { - current = (u_int) rstrm->out_boundry - (u_int) rstrm->out_finger; + current = (unsigned long) rstrm->out_boundry - (unsigned long) rstrm->out_finger; current = (len < current) ? len : current; - bcopy(addr, rstrm->out_finger, current); + memmove(rstrm->out_finger, addr, current); rstrm->out_finger += current; addr += current; len -= current; @@ -398,13 +399,13 @@ register u_int len; return (TRUE); } -static u_int xdrrec_getpos(xdrs) +static unsigned int xdrrec_getpos(xdrs) register XDR *xdrs; { register RECSTREAM *rstrm = (RECSTREAM *) xdrs->x_private; register long pos; - pos = lseek((int) rstrm->tcp_handle, (long) 0, 1); + pos = lseek((int)((long) rstrm->tcp_handle), (long) 0, 1); if (pos != -1) switch (xdrs->x_op) { @@ -417,27 +418,27 @@ register XDR *xdrs; break; default: - pos = (u_int) - 1; + pos = (unsigned int) - 1; break; } - return ((u_int) pos); + return ((unsigned int) pos); } static bool_t xdrrec_setpos(xdrs, pos) register XDR *xdrs; -u_int pos; +unsigned int pos; { register RECSTREAM *rstrm = (RECSTREAM *) xdrs->x_private; - u_int currpos = xdrrec_getpos(xdrs); + unsigned int currpos = xdrrec_getpos(xdrs); int delta = currpos - pos; - caddr_t newpos; + char* newpos; if ((int) currpos != -1) switch (xdrs->x_op) { case XDR_ENCODE: newpos = rstrm->out_finger - delta; - if ((newpos > (caddr_t) (rstrm->frag_header)) && + if ((newpos > (char*) (rstrm->frag_header)) && (newpos < rstrm->out_boundry)) { rstrm->out_finger = newpos; return (TRUE); @@ -493,7 +494,7 @@ register XDR *xdrs; mem_free(rstrm->the_buffer, rstrm->sendsize + rstrm->recvsize + BYTES_PER_XDR_UNIT); - mem_free((caddr_t) rstrm, sizeof(RECSTREAM)); + mem_free((char*) rstrm, sizeof(RECSTREAM)); } @@ -554,20 +555,19 @@ XDR *xdrs; bool_t sendnow; { register RECSTREAM *rstrm = (RECSTREAM *) (xdrs->x_private); - register u_long len; /* fragment length */ + register unsigned long len; /* fragment length */ if (sendnow || rstrm->frag_sent || - ((u_long) rstrm->out_finger + sizeof(u_long) >= - (u_long) rstrm->out_boundry)) { + ((unsigned long) rstrm->out_finger + sizeof(unsigned long) >= + (unsigned long) rstrm->out_boundry)) { rstrm->frag_sent = FALSE; return (flush_out(rstrm, TRUE)); } - len = (u_long) (rstrm->out_finger) - (u_long) (rstrm->frag_header) - - sizeof(u_long); - *(rstrm->frag_header) = htonl((u_long) len | LAST_FRAG); - rstrm->frag_header = (u_long *) rstrm->out_finger; - rstrm->out_finger += sizeof(u_long); + len = (unsigned long) (rstrm->out_finger) - (unsigned long) (rstrm->frag_header) - + sizeof(unsigned long); + *(rstrm->frag_header) = htonl((unsigned long) len | LAST_FRAG); + rstrm->frag_header = (unsigned long *) rstrm->out_finger; + rstrm->out_finger += sizeof(unsigned long); return (TRUE); } - diff --git a/mdk-stage1/dietlibc/librpc/xdr_reference.c b/mdk-stage1/dietlibc/librpc/xdr_reference.c index 7715d821c..3e42d12f3 100644 --- a/mdk-stage1/dietlibc/librpc/xdr_reference.c +++ b/mdk-stage1/dietlibc/librpc/xdr_reference.c @@ -45,7 +45,7 @@ static char sccsid[] = "@(#)xdr_reference.c 1.11 87/08/11 SMI"; #include <rpc/xdr.h> #include <string.h> -#define LASTUNSIGNED ((u_int)0-1) +#define LASTUNSIGNED ((unsigned int)0-1) /* * XDR an indirect pointer @@ -58,11 +58,11 @@ static char sccsid[] = "@(#)xdr_reference.c 1.11 87/08/11 SMI"; */ bool_t xdr_reference(xdrs, pp, size, proc) register XDR *xdrs; -caddr_t *pp; /* the pointer to work on */ -u_int size; /* size of the object pointed to */ +char* *pp; /* the pointer to work on */ +unsigned int size; /* size of the object pointed to */ xdrproc_t proc; /* xdr routine to handle the object */ { - register caddr_t loc = *pp; + register char* loc = *pp; register bool_t stat; if (loc == NULL) @@ -71,12 +71,12 @@ xdrproc_t proc; /* xdr routine to handle the object */ return (TRUE); case XDR_DECODE: - *pp = loc = (caddr_t) mem_alloc(size); + *pp = loc = (char*) mem_alloc(size); if (loc == NULL) { (void) fprintf(stderr, "xdr_reference: out of memory\n"); return (FALSE); } - bzero(loc, (int) size); + memset(loc, 0, (int) size); break; } @@ -112,7 +112,7 @@ xdrproc_t proc; /* xdr routine to handle the object */ bool_t xdr_pointer(xdrs, objpp, obj_size, xdr_obj) register XDR *xdrs; char **objpp; -u_int obj_size; +unsigned int obj_size; xdrproc_t xdr_obj; { diff --git a/mdk-stage1/dietlibc/librpc/xdr_stdio.c b/mdk-stage1/dietlibc/librpc/xdr_stdio.c index e3190e0a9..1bc9ada16 100644 --- a/mdk-stage1/dietlibc/librpc/xdr_stdio.c +++ b/mdk-stage1/dietlibc/librpc/xdr_stdio.c @@ -51,7 +51,7 @@ static bool_t xdrstdio_getlong(); static bool_t xdrstdio_putlong(); static bool_t xdrstdio_getbytes(); static bool_t xdrstdio_putbytes(); -static u_int xdrstdio_getpos(); +static unsigned int xdrstdio_getpos(); static bool_t xdrstdio_setpos(); static int32_t *xdrstdio_inline(); static void xdrstdio_destroy(); @@ -70,6 +70,7 @@ static struct xdr_ops xdrstdio_ops = { xdrstdio_destroy /* destroy stream */ }; + /* * Initialize a stdio xdr stream. * Sets the xdr stream handle xdrs for use on the stream file. @@ -83,7 +84,7 @@ enum xdr_op op; xdrs->x_op = op; xdrs->x_ops = &xdrstdio_ops; - xdrs->x_private = (caddr_t) file; + xdrs->x_private = (char*) file; xdrs->x_handy = 0; xdrs->x_base = 0; } @@ -104,7 +105,7 @@ XDR *xdrs; register long *lp; { - if (fread((caddr_t) lp, sizeof(long), 1, (FILE *) xdrs->x_private) != + if (fread((char*) lp, sizeof(long), 1, (FILE *) xdrs->x_private) != 1) return (FALSE); #ifndef mc68000 @@ -123,7 +124,7 @@ long *lp; lp = &mycopy; #endif - if (fwrite((caddr_t) lp, sizeof(long), 1, (FILE *) xdrs->x_private) != + if (fwrite((char*) lp, sizeof(long), 1, (FILE *) xdrs->x_private) != 1) return (FALSE); return (TRUE); @@ -131,8 +132,8 @@ long *lp; static bool_t xdrstdio_getbytes(xdrs, addr, len) XDR *xdrs; -caddr_t addr; -u_int len; +char* addr; +unsigned int len; { if ((len != 0) @@ -143,8 +144,8 @@ u_int len; static bool_t xdrstdio_putbytes(xdrs, addr, len) XDR *xdrs; -caddr_t addr; -u_int len; +char* addr; +unsigned int len; { if ((len != 0) @@ -153,16 +154,16 @@ u_int len; return (TRUE); } -static u_int xdrstdio_getpos(xdrs) +static unsigned int xdrstdio_getpos(xdrs) XDR *xdrs; { - return ((u_int) ftell((FILE *) xdrs->x_private)); + return ((unsigned int) ftell((FILE *) xdrs->x_private)); } static bool_t xdrstdio_setpos(xdrs, pos) XDR *xdrs; -u_int pos; +unsigned int pos; { return ((fseek((FILE *) xdrs->x_private, (long) pos, 0) < 0) ? @@ -171,7 +172,7 @@ u_int pos; static int32_t *xdrstdio_inline(xdrs, len) XDR *xdrs; -u_int len; +unsigned int len; { /* @@ -185,3 +186,4 @@ u_int len; */ return (NULL); } + diff --git a/mdk-stage1/dietlibc/libshell/fnmatch.c b/mdk-stage1/dietlibc/libshell/fnmatch.c index 4e7664510..ef43735f6 100644 --- a/mdk-stage1/dietlibc/libshell/fnmatch.c +++ b/mdk-stage1/dietlibc/libshell/fnmatch.c @@ -1,5 +1,6 @@ #include <ctype.h> #include <fnmatch.h> +#include <string.h> #define NOTFIRST 128 @@ -11,6 +12,7 @@ static int match(char c,char d,int flags) { } int fnmatch(const char *pattern, const char *string, int flags) { + /*printf("fnmatch(\"%s\",\"%s\")\n",pattern,string);*/ if (*string==0) { while (*pattern=='*') ++pattern; return (!!*pattern); @@ -18,31 +20,36 @@ int fnmatch(const char *pattern, const char *string, int flags) { if (*string=='.' && *pattern!='.' && (flags&FNM_PERIOD)) { /* don't match if FNM_PERIOD and this is the first char */ if ((flags&FNM_PERIOD) && (!(flags&NOTFIRST))) - return 1; + return FNM_NOMATCH; /* don't match if FNM_PERIOD and FNM_FILE_NAME and previous was '/' */ if ((flags&(FNM_FILE_NAME|FNM_PERIOD)) && string[-1]=='/') - return 1; + return FNM_NOMATCH; } flags|=NOTFIRST; switch (*pattern) { case '[': - ++pattern; - while (*pattern && *pattern!=']') { - if (flags&FNM_PATHNAME || *string!='/') { + { + int neg=0; + ++pattern; + if (*string=='/' && flags&FNM_PATHNAME) return FNM_NOMATCH; + if (*pattern=='^') { neg=1; ++pattern; } + while (*pattern && *pattern!=']') { int res=0; if (pattern[1]=='-') { if (*string>=*pattern && *string<=pattern[2]) res=1; if (flags&FNM_CASEFOLD) { if (tolower(*string)>=tolower(*pattern) && tolower(*string)<=tolower(pattern[2])) res=1; } - } else + pattern+=3; + } else { res=match(*pattern,*string,flags); - if (res) { + ++pattern; + } + if (res ^ neg) { while (*pattern && *pattern!=']') ++pattern; return fnmatch(pattern+1,string+1,flags); } } - ++pattern; } break; case '\\': @@ -55,12 +62,9 @@ int fnmatch(const char *pattern, const char *string, int flags) { } break; case '*': - if (!pattern[1] || fnmatch(pattern+1,string,flags)==0) - return 0; - else - if (*string!='/') - return fnmatch(pattern,string+1,flags); - break; + if ((*string=='/' && flags&FNM_PATHNAME) || fnmatch(pattern,string+1,flags)) + return fnmatch(pattern+1,string,flags); + return 0; case 0: if (*string==0 || (*string=='/' && (flags&FNM_LEADING_DIR))) return 0; @@ -70,5 +74,5 @@ int fnmatch(const char *pattern, const char *string, int flags) { return fnmatch(pattern+1,string+1,flags); break; } - return 1; + return FNM_NOMATCH; } diff --git a/mdk-stage1/dietlibc/libshell/glob.c b/mdk-stage1/dietlibc/libshell/glob.c index 34d09d87a..def55f8dc 100644 --- a/mdk-stage1/dietlibc/libshell/glob.c +++ b/mdk-stage1/dietlibc/libshell/glob.c @@ -24,6 +24,7 @@ #include <fnmatch.h> #include <dirent.h> #include <pwd.h> +#include "dietfeatures.h" #include <glob.h> @@ -38,7 +39,7 @@ static int cmp_func(const void * a, const void * b) return 1; if (s2 == NULL) return -1; - return strcmp(s1, s2); + return strcoll(s1, s2); } @@ -47,6 +48,38 @@ static int cmp_func(const void * a, const void * b) The GLOB_NOSORT bit in FLAGS is ignored. No sorting is ever done. The GLOB_APPEND flag is assumed to be set (always appends). Prepends DIRECTORY in constructed PGLOB. */ +static void close_dir_keep_errno(DIR* dp) { + int save = errno; + if (dp) + closedir (dp); + errno=save; +} + +static int add_entry(const char* name,glob_t *pglob,int* nfound) { + pglob->gl_pathv = (char **) realloc(pglob->gl_pathv, + (pglob->gl_pathc + pglob->gl_offs + 2) + * sizeof (char *)); + if (pglob->gl_pathv == NULL) + return 1; + pglob->gl_pathv[pglob->gl_offs + pglob->gl_pathc] = strdup(name); + pglob->gl_pathv[pglob->gl_offs + pglob->gl_pathc + 1] = NULL; + pglob->gl_pathc++; + (*nfound)++; + return 0; +} + +static void build_fullname(char * fullname, const char * directory, const char * filename) { + char *dest=fullname; + if (directory[0]=='/' && !directory[1]) { + *dest='/'; ++dest; + } else if (directory[0]!='.' || directory[1]) { + strcpy(dest,directory); + dest=strchr(dest,0); + *dest='/'; ++dest; + } + strcpy(dest,filename); +} + static int glob_in_dir(const char *pattern, const char *directory, int flags, int errfunc(const char * epath, int eerrno), glob_t *pglob) @@ -57,33 +90,6 @@ static int glob_in_dir(const char *pattern, const char *directory, int flags, int i; char * ptr; - void close_dir_keep_errno(void) { - int save = errno; - if (dp) - closedir (dp); - __set_errno(save); - } - int add_entry(const char * name) { - pglob->gl_pathv = (char **) realloc(pglob->gl_pathv, - (pglob->gl_pathc + pglob->gl_offs + 2) - * sizeof (char *)); - if (pglob->gl_pathv == NULL) - return 1; - pglob->gl_pathv[pglob->gl_offs + pglob->gl_pathc] = strdup(name); - pglob->gl_pathv[pglob->gl_offs + pglob->gl_pathc + 1] = NULL; - pglob->gl_pathc++; - nfound++; - return 0; - } - void build_fullname(char * fullname, int fullnamesize, const char * directory, const char * filename) { - if (!strcmp(directory, "/")) - snprintf(fullname, fullnamesize, "/%s", filename); - else if (!strcmp(directory, ".")) - snprintf(fullname, fullnamesize, "%s", filename); - else - snprintf(fullname, fullnamesize, "%s/%s", directory, filename); - } - if (!dp) { if (errno != ENOTDIR && ((errfunc != NULL && (*errfunc) (directory, errno)) @@ -96,19 +102,19 @@ static int glob_in_dir(const char *pattern, const char *directory, int flags, while ((ep = readdir(dp))) { i = strlen(directory) + strlen(ep->d_name) + 2; ptr = (char *) alloca(i); - build_fullname(ptr, i, directory, ep->d_name); + build_fullname(ptr, directory, ep->d_name); if (flags & GLOB_ONLYDIR) { struct stat statr; if (stat(ptr, &statr) || !S_ISDIR(statr.st_mode)) continue; } if (fnmatch(pattern, ep->d_name, fnm_flags) == 0) - if (add_entry(ptr)) + if (add_entry(ptr,pglob,&nfound)) goto memory_error; } } - close_dir_keep_errno(); + close_dir_keep_errno(dp); if (nfound != 0) pglob->gl_flags = flags; @@ -116,8 +122,8 @@ static int glob_in_dir(const char *pattern, const char *directory, int flags, /* nfound == 0 */ i = strlen(directory) + strlen(pattern) + 2; ptr = (char *) alloca(i); - build_fullname(ptr, i, directory, pattern); - if (add_entry(ptr)) + build_fullname(ptr, directory, pattern); + if (add_entry(ptr,pglob,&nfound)) goto memory_error; } @@ -127,7 +133,7 @@ static int glob_in_dir(const char *pattern, const char *directory, int flags, /* We're in trouble since we can't free the already allocated memory. [allocated from strdup(filame)] * Well, after all, when malloc returns NULL we're already in a bad mood, and no doubt the * program will manage to segfault by itself very soon :-). */ - close_dir_keep_errno(); + close_dir_keep_errno(dp); return GLOB_NOSPACE; } @@ -146,7 +152,7 @@ int glob(const char *pattern, int flags, int errfunc(const char * epath, int eer char * ptr, * ptr2; if (pattern == NULL || pglob == NULL || (flags & ~__GLOB_FLAGS) != 0) { - __set_errno (EINVAL); + errno=EINVAL; return -1; } @@ -196,10 +202,10 @@ int glob(const char *pattern, int flags, int errfunc(const char * epath, int eer if (filename == NULL) { /* We have no '/' in the pattern */ filename = pattern_; - dirname = "."; + dirname = (char*)"."; } else if (filename == pattern_) { /* "/pattern". */ - dirname = "/"; + dirname = (char*)"/"; filename++; } else { dirname = pattern_; @@ -293,13 +299,13 @@ int glob(const char *pattern, int flags, int errfunc(const char * epath, int eer } /* okay now we add the new entry */ - k = strlen(dirs.gl_pathv[i]) + 1 + strlen(filename) + 1; + k = strlen(dirs.gl_pathv[i]) + strlen(filename) + 2; if ((pglob->gl_pathv[j] = malloc(k)) == NULL) { globfree(&dirs); globfree(pglob); return GLOB_NOSPACE; } - snprintf(pglob->gl_pathv[j], k, "%s/%s", dirs.gl_pathv[i], filename); + build_fullname(pglob->gl_pathv[j], dirs.gl_pathv[i], filename); pglob->gl_pathc++; pglob->gl_pathv[j+1] = NULL; } diff --git a/mdk-stage1/dietlibc/libshell/realpath.c b/mdk-stage1/dietlibc/libshell/realpath.c index 1377018e5..9aee2c585 100644 --- a/mdk-stage1/dietlibc/libshell/realpath.c +++ b/mdk-stage1/dietlibc/libshell/realpath.c @@ -5,21 +5,21 @@ #include <string.h> #include "dietfeatures.h" -char *realpath(const char *path, char *resolved_path) { +char* realpath(const char *path, char *resolved_path) { int fd=open(".",O_RDONLY); - char *tmp=""; + char* tmp=(char*)""; + if (fd<0) return 0; if (chdir(path)) { -#ifdef WANT_THREAD_SAFE - if (*__errno_location()==ENOTDIR) -#else - if (errno==ENOTDIR) -#endif - { - if ((tmp=strrchr(path,'/'))) { + if (errno==ENOTDIR) { + char* match; + if ((match=strrchr(path,'/'))) { + tmp=match; memmove(resolved_path,path,tmp-path); resolved_path[tmp-path]=0; if (chdir(resolved_path)) { resolved_path=0; goto abort; } } + } else { + resolved_path=0; goto abort; } } if (!getcwd(resolved_path,PATH_MAX)) { resolved_path=0; goto abort; } diff --git a/mdk-stage1/dietlibc/libstdio/fclose.c b/mdk-stage1/dietlibc/libstdio/fclose.c index a955c6086..491ed2522 100644 --- a/mdk-stage1/dietlibc/libstdio/fclose.c +++ b/mdk-stage1/dietlibc/libstdio/fclose.c @@ -4,14 +4,9 @@ int fclose(FILE *stream) { int res; -#ifdef WANT_BUFFERED_STDIO FILE *f,*fl; -#endif - if (!stream) - return EOF; fflush(stream); res=close(stream->fd); -#ifdef WANT_BUFFERED_STDIO for (fl=0,f=__stdio_root; f; fl=f,f=f->next) if (f==stream) { if (fl) @@ -20,7 +15,8 @@ int fclose(FILE *stream) { __stdio_root=f->next; break; } -#endif + if ((!(stream->flags&STATICBUF))&&(stream->buf)) + free(stream->buf); free(stream); return res; } diff --git a/mdk-stage1/dietlibc/libstdio/fdglue.c b/mdk-stage1/dietlibc/libstdio/fdglue.c index 1c3918f1f..9542711e2 100644 --- a/mdk-stage1/dietlibc/libstdio/fdglue.c +++ b/mdk-stage1/dietlibc/libstdio/fdglue.c @@ -1,13 +1,9 @@ -#include "dietstdio.h" #include <unistd.h> #include <fcntl.h> #include <errno.h> #include <stdlib.h> - -#ifdef WANT_BUFFERED_STDIO -extern int __stdio_atexit; -extern void __stdio_flushall(); -#endif +#include <pthread.h> +#include "dietstdio.h" int __stdio_parse_mode(const char *mode) { int f=0; @@ -24,29 +20,3 @@ int __stdio_parse_mode(const char *mode) { } } -FILE* __stdio_init_file(int fd) { - FILE *tmp=(FILE*)malloc(sizeof(FILE)); - if (!tmp) { - close(fd); - errno=ENOMEM; - return 0; - } - tmp->fd=fd; -#ifdef WANT_BUFFERED_STDIO - tmp->bm=0; - tmp->bs=0; -#endif -#ifdef WANT_UNGETC - tmp->ungotten = 0; -#endif - tmp->flags=0; -#ifdef WANT_BUFFERED_STDIO - if (__stdio_atexit==0) { - __stdio_atexit=1; - atexit(__stdio_flushall); - } - tmp->next=__stdio_root; - __stdio_root=tmp; -#endif - return tmp; -} diff --git a/mdk-stage1/dietlibc/libstdio/fdopen.c b/mdk-stage1/dietlibc/libstdio/fdopen.c index aee14fb0c..748b716eb 100644 --- a/mdk-stage1/dietlibc/libstdio/fdopen.c +++ b/mdk-stage1/dietlibc/libstdio/fdopen.c @@ -1,21 +1,13 @@ +#include <errno.h> +#include "dietfeatures.h" #include <sys/types.h> #include <dietstdio.h> #include <unistd.h> -#define SEEK_END 2 - -int __stdio_parse_mode(const char *mode); -FILE* __stdio_init_file(int fd); - -FILE *fdopen (int filedes, const char *mode) { +FILE *fdopen(int filedes, const char *mode) { int f=0; /* O_RDONLY, O_WRONLY or O_RDWR */ - int fd; f=__stdio_parse_mode(mode); - if ((fd=filedes)<0) return 0; - { - FILE * ret = __stdio_init_file(fd); - ret->flags |= UNSEEKABLE; - return ret; - } + if (filedes<0) { errno=EBADF; return 0; } + return __stdio_init_file(filedes,0); } diff --git a/mdk-stage1/dietlibc/libstdio/feof.c b/mdk-stage1/dietlibc/libstdio/feof.c index b7e86fe3b..bf2267fcf 100644 --- a/mdk-stage1/dietlibc/libstdio/feof.c +++ b/mdk-stage1/dietlibc/libstdio/feof.c @@ -1,9 +1,7 @@ #include <dietstdio.h> int feof(FILE *stream) { -#ifdef WANT_UNGETC /* yuck!!! */ if (stream->ungotten) return 0; -#endif return (stream->flags&EOFINDICATOR); } diff --git a/mdk-stage1/dietlibc/libstdio/fflush.c b/mdk-stage1/dietlibc/libstdio/fflush.c index 7078e04f4..e0e23b3ba 100644 --- a/mdk-stage1/dietlibc/libstdio/fflush.c +++ b/mdk-stage1/dietlibc/libstdio/fflush.c @@ -1,21 +1,16 @@ -#include "dietstdio.h" #include <unistd.h> #include <stdlib.h> #include "dietwarning.h" +#include "dietstdio.h" FILE *__stdio_root; -#ifdef WANT_BUFFERED_STDIO int __stdio_atexit=0; -void __stdio_flushall() { +void __stdio_flushall(void) { fflush(0); } -extern int __fflush_stdin(); -extern int __fflush_stdout(); -extern int __fflush_stderr(); - int fflush(FILE *stream) { if (stream==0) { int res; @@ -28,15 +23,20 @@ int fflush(FILE *stream) { res=-1; return res; } +// if (stream->flags&NOBUF) return 0; if (stream->flags&BUFINPUT) { register int tmp; - if ((tmp=stream->bm-stream->bs)) lseek(stream->fd,tmp,SEEK_CUR); - } else - if (stream->bm && write(stream->fd,stream->buf,stream->bm)!=stream->bm) { + if ((tmp=stream->bm-stream->bs)) { + lseek(stream->fd,tmp,SEEK_CUR); + } + stream->bs=stream->bm=0; + } else { + if (stream->bm && write(stream->fd,stream->buf,stream->bm)!=(int)stream->bm) { stream->flags|=ERRORINDICATOR; return -1; } - stream->bm=0; + stream->bm=0; + } return 0; } @@ -50,13 +50,15 @@ int __fflush4(FILE *stream,int next) { stream->flags=(stream->flags&~BUFINPUT)|next; return res; } + if (stream->fd==0) __fflush_stdout(); return 0; } -#else -int fflush(FILE *stream) { - return 0; +/* Internal function, has no prototype. + * This is defined here because of the weak symbol ELF semantics */ +int __stdio_outs(const char *s,size_t len); +int __stdio_outs(const char *s,size_t len) { + return fwrite(s,1,(size_t)len,stdout)==len?1:0; } -#endif -link_warning("fflush","warning: your code uses stdio (several kilobytes of bloat).") +link_warning("fflush","warning: your code uses stdio (7+k bloat).") diff --git a/mdk-stage1/dietlibc/libstdio/fgets.c b/mdk-stage1/dietlibc/libstdio/fgets.c index c613d452d..d2ce4195d 100644 --- a/mdk-stage1/dietlibc/libstdio/fgets.c +++ b/mdk-stage1/dietlibc/libstdio/fgets.c @@ -1,11 +1,9 @@ #include "dietstdio.h" -extern int ferror(FILE *stream); - char *fgets(char *s, int size, FILE *stream) { char *orig=s; int l; - for (l=size; l>0;) { + for (l=size; l>1;) { int c=fgetc(stream); if (c==EOF) break; *s=c; diff --git a/mdk-stage1/dietlibc/libstdio/fopen.c b/mdk-stage1/dietlibc/libstdio/fopen.c index aac17be42..3d9c28198 100644 --- a/mdk-stage1/dietlibc/libstdio/fopen.c +++ b/mdk-stage1/dietlibc/libstdio/fopen.c @@ -2,13 +2,7 @@ #include <dietstdio.h> #include <unistd.h> -#define SEEK_END 2 - extern int __stdio_atexit; -extern void __stdio_flushall(); - -extern int __stdio_parse_mode(const char *mode); -extern FILE* __stdio_init_file(int fd); FILE *fopen (const char *path, const char *mode) { int f=0; /* O_RDONLY, O_WRONLY or O_RDWR */ @@ -17,5 +11,5 @@ FILE *fopen (const char *path, const char *mode) { f=__stdio_parse_mode(mode); if ((fd=open(path,f,0666))<0) return 0; - return __stdio_init_file(fd); + return __stdio_init_file(fd,1); } diff --git a/mdk-stage1/dietlibc/libstdio/fprintf.c b/mdk-stage1/dietlibc/libstdio/fprintf.c index 237fd1e51..6b3849a33 100644 --- a/mdk-stage1/dietlibc/libstdio/fprintf.c +++ b/mdk-stage1/dietlibc/libstdio/fprintf.c @@ -1,23 +1,13 @@ #include <stdarg.h> -#include <linux/types.h> +#include <sys/types.h> #include <stdio.h> #include <stdlib.h> -extern int vsnprintf (char *str,size_t size,const char *format, va_list arg_ptr); - int fprintf(FILE *f,const char *format,...) { int n; - char *printf_buf; -/* char printf_buf[1024]; */ va_list arg_ptr; - va_start(arg_ptr, format); - n=vsnprintf(0,1000000,format,arg_ptr); -/* write(1,printf_buf,strlen(printf_buf)); */ - va_end (arg_ptr); - va_start (arg_ptr, format); - printf_buf=alloca(n+2); - n=vsnprintf(printf_buf,n+1,format,arg_ptr); - va_end (arg_ptr); - fwrite(printf_buf,n,1,f); + va_start(arg_ptr,format); + n=vfprintf(f,format,arg_ptr); + va_end(arg_ptr); return n; } diff --git a/mdk-stage1/dietlibc/libstdio/fread.c b/mdk-stage1/dietlibc/libstdio/fread.c index 29afa1489..813a98fb2 100644 --- a/mdk-stage1/dietlibc/libstdio/fread.c +++ b/mdk-stage1/dietlibc/libstdio/fread.c @@ -4,48 +4,43 @@ size_t fread( void *ptr, size_t size, size_t nmemb, FILE *stream) { int res; -#ifdef WANT_BUFFERED_STDIO unsigned long i,j; j=size*nmemb; -#ifdef WANT_UNGETC + i=0; + + if (!j || j/nmemb!=size) return 0; if (stream->ungotten) { + stream->ungotten=0; *(char*)ptr=stream->ungetbuf; - ptr=((char*)ptr)+1; - --j; + ++i; } if (!j) return 1; + +#ifdef WANT_FREAD_OPTIMIZATION + if ( !(stream->flags&FDPIPE) && (j>stream->buflen)) { + size_t tmp=j-i; + int res; + fflush(stream); + while ((res=read(stream->fd,ptr+i,tmp))<(int)tmp) { + if (res==-1) { + stream->flags|=ERRORINDICATOR; + goto exit; + } else if (!res) { + stream->flags|=EOFINDICATOR; + goto exit; + } + i+=res; tmp-=res; + } + return nmemb; + } #endif - for (i=0; i<j; ++i) { + for (; i<j; ++i) { res=fgetc(stream); if (res==EOF) +exit: return i/size; else ((unsigned char*)ptr)[i]=(unsigned char)res; } return nmemb; -#else -#ifdef WANT_UNGETC - unsigned long j=size*nmemb; -#endif - fflush(stream); -#ifdef WANT_UNGETC - if (stream->ungotten) { - *(char*)ptr=stream->ungetbuf; - ptr=((char*)ptr)+1; - --j; - } - if (!j) return 1; - res=read(stream->fd,ptr,j); -#else - res=read(stream->fd,ptr,size*nmemb); -#endif - if (res<0) { - stream->flags|=ERRORINDICATOR; - return 0; - } else if (res<size*nmemb) - if (!(stream->flags & UNSEEKABLE) - || ((stream->flags & UNSEEKABLE) && res == 0)) - stream->flags|=EOFINDICATOR; - return res/size; -#endif } diff --git a/mdk-stage1/dietlibc/libstdio/fseek.c b/mdk-stage1/dietlibc/libstdio/fseek.c index 5bb96bc6e..a49230f0a 100644 --- a/mdk-stage1/dietlibc/libstdio/fseek.c +++ b/mdk-stage1/dietlibc/libstdio/fseek.c @@ -1,11 +1,10 @@ #include <dietstdio.h> #include <unistd.h> -long fseek(FILE *stream, long offset, int whence) { +int fseek(FILE *stream, long offset, int whence) { fflush(stream); -#ifdef WANT_BUFFERED_STDIO stream->bm=0; stream->bs=0; -#endif stream->flags&=~(ERRORINDICATOR|EOFINDICATOR); - return (lseek(stream->fd,offset,whence)); + stream->ungotten=0; + return lseek(stream->fd,offset,whence)!=-1?0:-1; } diff --git a/mdk-stage1/dietlibc/libstdio/ftell.c b/mdk-stage1/dietlibc/libstdio/ftell.c index 42d2c9f26..48f74858a 100644 --- a/mdk-stage1/dietlibc/libstdio/ftell.c +++ b/mdk-stage1/dietlibc/libstdio/ftell.c @@ -3,5 +3,5 @@ long ftell(FILE *stream) { fflush(stream); - return (lseek(stream->fd,0,SEEK_CUR)); + return (lseek(stream->fd,0,SEEK_CUR)-stream->ungotten); } diff --git a/mdk-stage1/dietlibc/libstdio/fwrite.c b/mdk-stage1/dietlibc/libstdio/fwrite.c index 5691661a5..e2536ccfb 100644 --- a/mdk-stage1/dietlibc/libstdio/fwrite.c +++ b/mdk-stage1/dietlibc/libstdio/fwrite.c @@ -1,30 +1,28 @@ #include <sys/types.h> #include "dietstdio.h" #include <unistd.h> +#include <errno.h> -size_t fwrite( const 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 res; -#ifdef WANT_BUFFERED_STDIO - long len=size*nmemb; + unsigned long len=size*nmemb; long i; - if (len>BUFSIZE || (stream->flags&NOBUF)) { - if (!(stream->flags&NOBUF)) fflush(stream); - res=write(stream->fd,ptr,size*nmemb); + if (!nmemb || len/nmemb!=size) return 0; /* check for integer overflow */ + if (len>stream->buflen || (stream->flags&NOBUF)) { + fflush(stream); + do { + res=write(stream->fd,ptr,size*nmemb); + } while (res==-1 && errno==EINTR); } else { register const unsigned char *c=ptr; - for (i=size*nmemb; i>0; --i,++c) - if (fputc(*c,stream)) { - res=-1; - break; - } - res=size*nmemb; + for (i=len; i>0; --i,++c) + if (fputc(*c,stream)) { res=len-i; goto abort; } + res=len; } -#else - res=write(stream->fd,ptr,size*nmemb); -#endif if (res<0) { stream->flags|=ERRORINDICATOR; return 0; } +abort: return size?res/size:0; } diff --git a/mdk-stage1/dietlibc/libstdio/printf.c b/mdk-stage1/dietlibc/libstdio/printf.c index 571420dc3..5af172c58 100644 --- a/mdk-stage1/dietlibc/libstdio/printf.c +++ b/mdk-stage1/dietlibc/libstdio/printf.c @@ -1,29 +1,15 @@ #include <stdarg.h> -#include <linux/types.h> +#include <sys/types.h> #include <unistd.h> #include <stdlib.h> #include "dietstdio.h" -int vsnprintf (char *str,size_t size,const char *format, va_list arg_ptr); - int printf(const char *format,...) { int n; - char *printf_buf; -/* char printf_buf[1024]; */ va_list arg_ptr; va_start(arg_ptr, format); - n=vsnprintf(0,1000000,format,arg_ptr); -/* write(1,printf_buf,strlen(printf_buf)); */ - va_end (arg_ptr); - va_start (arg_ptr, format); - printf_buf=alloca(n+2); - n=vsnprintf(printf_buf,n+1,format,arg_ptr); -#ifdef WANT_BUFFERED_STDIO - fwrite(printf_buf,n,1,stdout); -#else - write(1,printf_buf,n); -#endif - va_end (arg_ptr); + n=vprintf(format, arg_ptr); + va_end(arg_ptr); return n; } diff --git a/mdk-stage1/dietlibc/libstdio/setvbuf.c b/mdk-stage1/dietlibc/libstdio/setvbuf.c index d0b1b7640..b8b50addf 100644 --- a/mdk-stage1/dietlibc/libstdio/setvbuf.c +++ b/mdk-stage1/dietlibc/libstdio/setvbuf.c @@ -1,18 +1,34 @@ #include <sys/types.h> #include "dietstdio.h" #include <unistd.h> +#include <stdlib.h> #include "dietwarning.h" -int setvbuf(FILE *stream, char *buf, int flags , size_t size) { -#ifdef WANT_BUFFERED_STDIO +static int set_flags (FILE *stream, int flags) { switch (flags) { - case _IONBF: stream->flags = (stream->flags & ~(BUFLINEWISE)) | NOBUF; break; - case _IOLBF: stream->flags = (stream->flags & ~(BUFLINEWISE|NOBUF)) | BUFLINEWISE; break; - case _IOFBF: stream->flags = stream->flags & ~(NOBUF | BUFLINEWISE); break; - default: return -1; + case _IONBF: stream->flags = (stream->flags & ~(BUFLINEWISE)) | NOBUF; break; + case _IOLBF: stream->flags = (stream->flags & ~(NOBUF)) | BUFLINEWISE; break; + case _IOFBF: stream->flags = stream->flags & ~(NOBUF | BUFLINEWISE); break; + default: return -1; } -#endif return 0; } -link_warning("setvbuf","setvbuf does not implement changing the buffer in diet libc.") +int setvbuf(FILE *stream, char *buf, int flags, size_t size) { + if (buf) { + if (!(stream->flags&STATICBUF)) free(stream->buf); + stream->buf=buf; + } + else { + char *tmp; + if (!size) { + return set_flags(stream,flags); + } + if (!(tmp=malloc(size))) return -1; + if (!(stream->flags&STATICBUF)) free(stream->buf); + stream->buf=tmp; + } + stream->buflen=size; + stream->bm=stream->bs=0; + return set_flags(stream,flags); +} diff --git a/mdk-stage1/dietlibc/libstdio/stderr.c b/mdk-stage1/dietlibc/libstdio/stderr.c index a82b1b727..a9a34fd7e 100644 --- a/mdk-stage1/dietlibc/libstdio/stderr.c +++ b/mdk-stage1/dietlibc/libstdio/stderr.c @@ -1,13 +1,22 @@ #include <dietstdio.h> -#ifdef WANT_BUFFERED_STDIO -static FILE __stderr = { 2, NOBUF, 0, 0 }; - -int __fflush_stderr() { - return fflush(stderr); -} -#else -static FILE __stderr = { 2, 0 }; +static FILE __stderr = { + .fd=2, + .flags=NOBUF, + .bs=0, .bm=0, + .buflen=0, + .buf=0, + .next=0, + .popen_kludge=0, + .ungetbuf=0, + .ungotten=0 +#ifdef WANT_THREAD_SAFE + , .m=PTHREAD_MUTEX_INITIALIZER #endif +}; FILE *stderr=&__stderr; + +int __fflush_stderr(void) { + return fflush(stderr); +} diff --git a/mdk-stage1/dietlibc/libstdio/stdin.c b/mdk-stage1/dietlibc/libstdio/stdin.c index 2db82f9ab..217f3f609 100644 --- a/mdk-stage1/dietlibc/libstdio/stdin.c +++ b/mdk-stage1/dietlibc/libstdio/stdin.c @@ -1,13 +1,23 @@ #include <dietstdio.h> -#ifdef WANT_BUFFERED_STDIO -static FILE __stdin = { 0, BUFINPUT, 0, 0 }; - -int __fflush_stdin() { - return fflush(stdin); -} -#else -static FILE __stdin = { 0, 0 }; +static char __stdin_buf[BUFSIZE]; +static FILE __stdin = { + .fd=0, + .flags=BUFINPUT|STATICBUF, + .bs=0, .bm=0, + .buflen=BUFSIZE, + .buf=__stdin_buf, + .next=0, + .popen_kludge=0, + .ungetbuf=0, + .ungotten=0 +#ifdef WANT_THREAD_SAFE + , .m=PTHREAD_MUTEX_INITIALIZER #endif +}; FILE *stdin=&__stdin; + +int __fflush_stdin(void) { + return fflush(stdin); +} diff --git a/mdk-stage1/dietlibc/libstdio/stdout.c b/mdk-stage1/dietlibc/libstdio/stdout.c index 481fb1014..08054d0d4 100644 --- a/mdk-stage1/dietlibc/libstdio/stdout.c +++ b/mdk-stage1/dietlibc/libstdio/stdout.c @@ -1,14 +1,23 @@ #include <dietstdio.h> -#ifdef WANT_BUFFERED_STDIO -static FILE __stdout = { 1, BUFLINEWISE, 0, 0 }; - -int __fflush_stdout() { - return fflush(stdout); -} -#else -static FILE __stdout = { 1, 0 }; +static char __stdout_buf[BUFSIZE]; +static FILE __stdout = { + .fd=1, + .flags=BUFLINEWISE|STATICBUF, + .bs=0, .bm=0, + .buflen=BUFSIZE, + .buf=__stdout_buf, + .next=0, + .popen_kludge=0, + .ungetbuf=0, + .ungotten=0 +#ifdef WANT_THREAD_SAFE + , .m=PTHREAD_MUTEX_INITIALIZER #endif +}; FILE *stdout=&__stdout; +int __fflush_stdout(void) { + return fflush(stdout); +} diff --git a/mdk-stage1/dietlibc/libstdio/ungetc.c b/mdk-stage1/dietlibc/libstdio/ungetc.c index ae03e9381..133e92820 100644 --- a/mdk-stage1/dietlibc/libstdio/ungetc.c +++ b/mdk-stage1/dietlibc/libstdio/ungetc.c @@ -1,11 +1,10 @@ #include "dietstdio.h" -#ifdef WANT_UNGETC int ungetc(int c, FILE *stream) { - if (stream->ungotten) + if (stream->ungotten || c<0 || c>255) return EOF; stream->ungotten=1; - stream->ungetbuf=(char)(unsigned char)c; + stream->ungetbuf=(unsigned char)c; + stream->flags&=~(ERRORINDICATOR|EOFINDICATOR); return c; } -#endif diff --git a/mdk-stage1/dietlibc/libugly/asctime_r.c b/mdk-stage1/dietlibc/libugly/asctime_r.c index 46325927c..43c5e2cb2 100644 --- a/mdk-stage1/dietlibc/libugly/asctime_r.c +++ b/mdk-stage1/dietlibc/libugly/asctime_r.c @@ -16,7 +16,7 @@ char *asctime_r(const struct tm *t, char *buf) { if (buf[8]=='0') buf[8]=' '; buf[10]=' '; num2str(buf+11,t->tm_hour); - if (buf[11]=='0') buf[11]=' '; +// if (buf[11]=='0') buf[11]=' '; buf[13]=':'; num2str(buf+14,t->tm_min); buf[16]=':'; diff --git a/mdk-stage1/dietlibc/libugly/asprintf.c b/mdk-stage1/dietlibc/libugly/asprintf.c index d10c20b4a..9db1f67c7 100644 --- a/mdk-stage1/dietlibc/libugly/asprintf.c +++ b/mdk-stage1/dietlibc/libugly/asprintf.c @@ -1,21 +1,18 @@ #include <stdarg.h> -#include <linux/types.h> +#include <sys/types.h> #include <stdlib.h> +#include <stdio.h> #include "dietwarning.h" -extern int vsnprintf (char *str,size_t size,const char *format, va_list arg_ptr); - int asprintf(char **s, const char *format,...) { int n; va_list arg_ptr; va_start(arg_ptr, format); n=vsnprintf(0,1000000,format,arg_ptr); - va_end (arg_ptr); va_start (arg_ptr, format); - if ((*s=malloc(n+2))) { + if ((*s=malloc(n+1))) { n=vsnprintf(*s,n+1,format,arg_ptr); - va_end(arg_ptr); return n; } return -1; diff --git a/mdk-stage1/dietlibc/libugly/getmntent.c b/mdk-stage1/dietlibc/libugly/getmntent.c index 250a77b7f..1a1bdca24 100644 --- a/mdk-stage1/dietlibc/libugly/getmntent.c +++ b/mdk-stage1/dietlibc/libugly/getmntent.c @@ -5,11 +5,11 @@ struct mntent *getmntent(FILE *filep) { static struct mntent m; - char buf[1024]; + static char buf[1024]; do { char *tmp=buf; int num; - fgets(buf,1024,filep); + if (!fgets(buf,1024,filep)) return 0; /* "/dev/ide/host0/bus0/target0/lun0/part2 / reiserfs defaults 1 1" */ for (num=0; num<6; ++num) { switch (num) { @@ -17,12 +17,13 @@ struct mntent *getmntent(FILE *filep) { case 1: m.mnt_dir=tmp; break; case 2: m.mnt_type=tmp; break; case 3: m.mnt_opts=tmp; break; - case 4: m.mnt_freq=strtol(tmp,&tmp,0); if (*tmp!=' ') continue; break; + case 4: m.mnt_freq=strtol(tmp,&tmp,0); if (*tmp!=' ' && *tmp!='\t') continue; break; case 5: m.mnt_passno=strtol(tmp,&tmp,0); if (*tmp=='\n') return &m; break; } - if ((tmp=strchr(tmp,' '))) { + while (*tmp && *tmp!=' ' && *tmp!='\n' && *tmp!='\t') ++tmp; + if (*tmp) { if (num<4) *tmp++=0; - while (*tmp==' ') ++tmp; + while (*tmp==' ' || *tmp=='\t') ++tmp; } else continue; } diff --git a/mdk-stage1/dietlibc/libugly/getprotoent.c b/mdk-stage1/dietlibc/libugly/getprotoent.c index a648e2307..3f0fd4d41 100644 --- a/mdk-stage1/dietlibc/libugly/getprotoent.c +++ b/mdk-stage1/dietlibc/libugly/getprotoent.c @@ -1,130 +1,10 @@ -#include <unistd.h> -#include <fcntl.h> #include <netdb.h> -#include <sys/mman.h> -#include <errno.h> -#include <netinet/in.h> -#include <string.h> -#include <ctype.h> -static int protofd=-1; -static char* protomap; -static unsigned int protolen; +extern struct protoent __protoent_pw; +extern char __protoent_buf[1000]; -static char* aliases[10]; - -static char *cur; - -/* ip 0 IP # internet protocol, pseudo protocol number */ struct protoent *getprotoent(void) { - static struct protoent pe; - char *last; - int aliasidx; - if (protofd<0) { - protofd=open(_PATH_SERVICES,O_RDONLY); - if (protofd<0) return 0; - protolen=lseek(protofd,0,SEEK_END); - protomap=mmap(0,protolen,PROT_READ|PROT_WRITE,MAP_PRIVATE,protofd,0); - if ((long)protomap==(-1)) goto error; - cur=protomap; - } - last=protomap+protolen; -again: - pe.p_name=0; - pe.p_aliases=aliases; aliases[0]=0; - pe.p_proto=0; - if (cur>=last) return 0; - if (*cur=='#' || *cur=='\n') goto parseerror; - /* first, the primary name */ - if (!isalpha(*cur)) goto parseerror; - pe.p_name=cur; - pe.p_aliases=aliases; - while (cur<last && isalnum(*cur)) cur++; - if (cur>=last) return 0; - if (*cur=='\n') goto parseerror; - *cur=0; cur++; - /* second, the protocol number */ - while (cur<last && isblank(*cur)) cur++; - while (cur<last && isdigit(*cur)) { - pe.p_proto=pe.p_proto*10+*cur-'0'; - cur++; - } -/* pe.p_proto=htons(pe.s_proto); */ - if (cur>=last) return 0; - if (*cur=='\n') { *cur++=0; return &pe; } - *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=='\n') { *cur++=0; ++aliasidx; break; } - if (cur>=last || !isblank(*cur)) break; - *cur++=0; - } - aliases[aliasidx]=0; - return &pe; -parseerror: - while (cur<last && *cur!='\n') cur++; - cur++; - goto again; -error: - if (protomap!=(char*)-1) munmap(protomap,protolen); - if (protofd!=-1) close(protofd); - protomap=(char*)-1; - protofd=-1; - errno=ENOMEM; - return 0; -} - -void setprotoent(int stayopen) { - cur=protomap; -} - -struct protoent *getprotobyname(const char *name) { - struct protoent *s; - setprotoent(0); - for (s=getprotoent(); s; s=getprotoent()) { - char **tmp; -#if 0 - write(1,"found ",6); - write(1,s->p_name,strlen(s->p_name)); - write(1,"/",1); - write(1,s->p_proto,strlen(s->p_proto)); - write(1,"\n",1); - if (!strcmp(name,"auth")) { - tmp=s->p_aliases; - write(1," aka ",5); - while (*tmp) { - write(1,*tmp,strlen(*tmp)); - write(1,", ",2); - ++tmp; - } - write(1,"\n",1); - } -#endif - if (!strcmp(name,s->p_name)) - return s; - tmp=s->p_aliases; - while (*tmp) - if (!strcmp(name,*tmp++)) return s; - } - return 0; + struct protoent* tmp; + getprotoent_r(&__protoent_pw,__protoent_buf,sizeof(__protoent_buf),&tmp); + return tmp; } - -struct protoent *getprotobynumber(int proto) { - struct protoent *s; - for (s=getprotoent(); s; s=getprotoent()) { - if (proto==s->p_proto) - return s; - } - return 0; -} - -void endprotoent(void) { - if (protomap!=(char*)-1) munmap(protomap,protolen); - if (protofd!=-1) close(protofd); - protomap=(char*)-1; - protofd=-1; -} - diff --git a/mdk-stage1/dietlibc/libugly/gmtime_r.c b/mdk-stage1/dietlibc/libugly/gmtime_r.c index c102d10fa..6bc0bb5b2 100644 --- a/mdk-stage1/dietlibc/libugly/gmtime_r.c +++ b/mdk-stage1/dietlibc/libugly/gmtime_r.c @@ -3,7 +3,7 @@ /* seconds per day */ #define SPD 24*60*60 -extern unsigned int __spm[]; +extern short __spm[]; struct tm *gmtime_r(const time_t *timep, struct tm *r) { time_t i; @@ -14,7 +14,7 @@ struct tm *gmtime_r(const time_t *timep, struct tm *r) { r->tm_wday=(4+work)%7; for (i=1970; ; ++i) { register time_t k=__isleap(i)?366:365; - if (work>k) + if (work>=k) work-=k; else break; @@ -28,7 +28,7 @@ struct tm *gmtime_r(const time_t *timep, struct tm *r) { work-=1; } - for (i=11; i && __spm[i]>work; --i) ; + for (i=11; i && (__spm[i]>work); --i) ; r->tm_mon=i; r->tm_mday+=work-__spm[i]; return r; diff --git a/mdk-stage1/dietlibc/libugly/isleap.c b/mdk-stage1/dietlibc/libugly/isleap.c index dcfa1ced6..d83712792 100644 --- a/mdk-stage1/dietlibc/libugly/isleap.c +++ b/mdk-stage1/dietlibc/libugly/isleap.c @@ -1,3 +1,5 @@ +#include <time.h> + int __isleap(int year) { /* every fourth year is a leap year except for century years that are * not divisible by 400. */ diff --git a/mdk-stage1/dietlibc/libugly/localtime_r.c b/mdk-stage1/dietlibc/libugly/localtime_r.c index d4bc073ce..5d420303c 100644 --- a/mdk-stage1/dietlibc/libugly/localtime_r.c +++ b/mdk-stage1/dietlibc/libugly/localtime_r.c @@ -3,8 +3,11 @@ #include <sys/time.h> #ifdef WANT_TZFILE_PARSER -extern void __maplocaltime(); +extern void __maplocaltime(void); extern time_t __tzfile_map(time_t t, int *isdst); +#else +extern long int timezone; +extern int daylight; #endif struct tm* localtime_r(const time_t* t, struct tm* r) { @@ -15,7 +18,8 @@ struct tm* localtime_r(const time_t* t, struct tm* r) { #else struct timezone tz; gettimeofday(0, &tz); - tmp=*t-tz.tz_minuteswest*60L; + timezone=tz.tz_minuteswest*60L; + tmp=*t+timezone; #endif return gmtime_r(&tmp,r); } diff --git a/mdk-stage1/dietlibc/libugly/logging.c b/mdk-stage1/dietlibc/libugly/logging.c index 69c2c2337..680a1f850 100644 --- a/mdk-stage1/dietlibc/libugly/logging.c +++ b/mdk-stage1/dietlibc/libugly/logging.c @@ -1,3 +1,4 @@ +#include <errno.h> #include "dietfeatures.h" #include <stdio.h> @@ -5,7 +6,6 @@ #include <stdarg.h> #include <errno.h> #include <unistd.h> -#include <asm/socket.h> #include <fcntl.h> #include <syslog.h> #include <string.h> @@ -14,9 +14,9 @@ #include <signal.h> #define _PATH_CONSOLE "/dev/console" -#define BUF_SIZE 512 /* messagebuffer size (>= 200) */ +#define BUF_SIZE 2048 /* messagebuffer size (>= 200) */ -#define MAX_LOGTAG 80 +#define MAX_LOGTAG 1000 /* those have to be global *sigh* */ static volatile int connected = 0; /* have done connect */ @@ -37,13 +37,15 @@ static void closelog_intern(void) connected = 0; } -void closelog(void) +void __libc_closelog(void); +void __libc_closelog(void) { closelog_intern(); LogTag[0]=0; LogType = SOCK_DGRAM; } +void closelog(void) __attribute__((weak,alias("__libc_closelog"))); static void openlog_intern(int option, int facility) { @@ -63,27 +65,15 @@ static void openlog_intern(int option, int facility) } } if ((LogFile != -1) && !connected) { -#ifdef WANT_THREAD_SAFE - int old_errno = (*(__errno_location())); -#else int old_errno=errno; -#endif if(connect(LogFile, &SyslogAddr, sizeof(SyslogAddr)) == -1) { -#ifdef WANT_THREAD_SAFE - int saved_errno = (*(__errno_location())); -#else int saved_errno=errno; -#endif close(LogFile); LogFile = -1; if((LogType == SOCK_DGRAM) && (saved_errno == EPROTOTYPE)) { /* retry with SOCK_STREAM instead of SOCK_DGRAM */ LogType = SOCK_STREAM; -#ifdef WANT_THREAD_SAFE - (*(__errno_location()))=old_errno; -#else errno=old_errno; -#endif continue; } } @@ -94,7 +84,8 @@ static void openlog_intern(int option, int facility) } /* has to be secured against multiple, simultanious call's in threaded environment */ -void openlog(const char *ident, int option, int facility) +void __libc_openlog(const char *ident, int option, int facility); +void __libc_openlog(const char *ident, int option, int facility) { if (ident) { strncpy(LogTag,ident,MAX_LOGTAG); @@ -102,6 +93,7 @@ void openlog(const char *ident, int option, int facility) } openlog_intern(option, facility); } +void openlog(const char *ident, int option, int facility) __attribute__((weak,alias("__libc_openlog"))); int setlogmask(int mask) { @@ -110,7 +102,8 @@ int setlogmask(int mask) return old; } -void vsyslog(int priority, const char *format, va_list arg_ptr) +void __libc_vsyslog(int priority, const char *format, va_list arg_ptr); +void __libc_vsyslog(int priority, const char *format, va_list arg_ptr) { char buffer[BUF_SIZE]; char time_buf[20]; @@ -122,11 +115,7 @@ void vsyslog(int priority, const char *format, va_list arg_ptr) int sigpipe; struct sigaction action, oldaction; struct sigaction *oldaction_ptr = NULL; -#ifdef WANT_THREAD_SAFE - int saved_errno = (*(__errno_location())); -#else int saved_errno = errno; -#endif /* check for invalid priority/facility bits */ if (priority & ~(LOG_PRIMASK|LOG_FACMASK)) { @@ -156,11 +145,7 @@ void vsyslog(int priority, const char *format, va_list arg_ptr) buflen = 41; } else { -#ifdef WANT_THREAD_SAFE - (*(__errno_location()))=saved_errno; -#else errno=saved_errno; -#endif buflen = vsnprintf(buffer+headerlen, BUF_SIZE - headerlen, format, arg_ptr); } if (LogStat & LOG_PERROR) { @@ -201,6 +186,7 @@ void vsyslog(int priority, const char *format, va_list arg_ptr) if (sigpipe == 0) sigaction(SIGPIPE, &oldaction, (struct sigaction *) NULL); } +void vsyslog(int priority, const char *format, va_list arg_ptr) __attribute__((weak,alias("__libc_vsyslog"))); void syslog(int priority, const char *format, ...) { diff --git a/mdk-stage1/dietlibc/libugly/mktime.c b/mdk-stage1/dietlibc/libugly/mktime.c index ee4dab6c1..348068e1d 100644 --- a/mdk-stage1/dietlibc/libugly/mktime.c +++ b/mdk-stage1/dietlibc/libugly/mktime.c @@ -1,21 +1,53 @@ #include <time.h> -/* seconds per day */ -#define SPD 24*60*60 - -extern unsigned int __spm[]; - -time_t mktime(struct tm *t) { - time_t x=0; - unsigned int i; - if (t->tm_year<70) return (time_t)(-1); - for (i=70; i<t->tm_year; ++i) { - x+=__isleap(i+1900)?366:365; - } - t->tm_yday=__spm[t->tm_mon] + t->tm_mday-1 + ((t->tm_mon>2) && __isleap(t->tm_year)?1:0); - x+=t->tm_yday; - /* x is now the number of days since Jan 1 1970 */ - t->tm_wday=(4+x)%7; - x = x*SPD + t->tm_hour*60*60 + t->tm_min*60 + t->tm_sec; - return x; +extern const short __spm []; + +time_t mktime ( register struct tm* const t ) +{ + register time_t day; + register time_t i; + + if ( t->tm_year < 70 ) + return (time_t) -1; + + day = t->tm_yday = __spm [t->tm_mon] + t->tm_mday-1 + ( __isleap (t->tm_year+1900) & (t->tm_mon > 1) ); + + for ( i = 70; i < t->tm_year; i++ ) + day += 365 + __isleap (i+1900); + + /* day is now the number of days since 'Jan 1 1970' */ + i = 7; + t->tm_wday = (day + 4) % i; /* Sunday=0, Monday=1, ..., Saturday=6 */ + + i = 24; + day *= i; + i = 60; + return ((day + t->tm_hour) * i + t->tm_min) * i + t->tm_sec; +} + +#if 0 + +#include <math.h> + +main() +{ + int i, j, k; + static char *s[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; + + for (i=70; i<200; i++) + for (j=0; j<12; j++) + for (k=1; k<=31; k++) { + struct tm t; + double x; + t.tm_year = i; + t.tm_mon = j; + t.tm_mday = k; + t.tm_hour = 0; + t.tm_min = 0; + t.tm_sec = 0; + x = mktime (&t); + printf ("%4d.%5.0f %2u.%02u.%04u %s\n", (int)floor(x/86400), x-86400.*(int)floor(x/86400), k, j+1, 1900+i, s[t.tm_wday] ); + } + } +#endif diff --git a/mdk-stage1/dietlibc/libugly/popen.c b/mdk-stage1/dietlibc/libugly/popen.c index e0e441495..aa9a2cde0 100644 --- a/mdk-stage1/dietlibc/libugly/popen.c +++ b/mdk-stage1/dietlibc/libugly/popen.c @@ -1,32 +1,38 @@ #include "dietstdio.h" #include <unistd.h> +#include <fcntl.h> +#include "binshstr.h" extern char **environ; FILE *popen(const char *command, const char *type) { int pfd[2]; int fd0; + FILE* f; pid_t pid; + if (pipe(pfd)<0) return 0; fd0=(*type=='r'); - if ((pid=vfork())<0) { + if (!(f=fdopen(pfd[!fd0],type))) { + close(pfd[0]); /* malloc failed */ + close(pfd[1]); + return 0; + } + if ((pid=fork())<0) { close(pfd[0]); close(pfd[1]); return 0; } if (!pid) { /* child */ - char *argv[]={"sh","-c",0,0}; + const char *argv[]={__sh,"-c",0,0}; close(pfd[!fd0]); close(fd0); dup2(pfd[fd0],fd0); close(pfd[fd0]); - argv[2]=(char*)command; - execve("/bin/sh",argv,environ); - _exit(255); + argv[2]=command; + execve(__binsh,(char*const*)argv,environ); + _exit(127); } close(pfd[fd0]); - { - register FILE* f; - if ((f=fdopen(pfd[!fd0],type))) - f->popen_kludge=pid; - return f; - } + fcntl (pfd[!fd0], F_SETFD, FD_CLOEXEC); + f->popen_kludge=pid; + return f; } diff --git a/mdk-stage1/dietlibc/libugly/setenv.c b/mdk-stage1/dietlibc/libugly/setenv.c index bf47cdb79..c65910471 100644 --- a/mdk-stage1/dietlibc/libugly/setenv.c +++ b/mdk-stage1/dietlibc/libugly/setenv.c @@ -5,13 +5,15 @@ link_warning("setenv","setenv calls malloc. Avoid it in small programs."); int setenv(const char *name, const char *value, int overwrite) { - char *c=malloc(strlen(name)+strlen(value)+3); if (getenv(name)) { if (!overwrite) return 0; unsetenv(name); } - strcpy(c,name); - strcat(c,"="); - strcat(c,value); - return putenv(c); + { + char *c=malloc(strlen(name)+strlen(value)+3); + strcpy(c,name); + strcat(c,"="); + strcat(c,value); + return putenv(c); + } } diff --git a/mdk-stage1/dietlibc/libugly/strftime.c b/mdk-stage1/dietlibc/libugly/strftime.c index b7e750ab1..365d0c84f 100644 --- a/mdk-stage1/dietlibc/libugly/strftime.c +++ b/mdk-stage1/dietlibc/libugly/strftime.c @@ -1,182 +1,118 @@ #include <sys/types.h> #include <time.h> - -static char *sweekdays[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"}; -static char *weekdays[]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"}; -static char *smonths[]={"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"}; -static char *months[]={"January","February","March","April","May","June","July","August","September","October","November","December"}; -static char *ampm[]={"am","pm","AM","PM"}; - -static int i2a(char* dest,unsigned int x) { - register unsigned int tmp=x; - register int len=0; - *dest++=tmp/10+'0'; tmp=tmp%10; ++len; - *dest++=tmp+'0'; - return 2; +#include "dietfeatures.h" + +static const char sweekdays [7] [4] = { + "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" +}; +static const char weekdays [7] [10] = { + "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" +}; +static const char smonths [12] [4] = { + "Jan", "Feb", "Mar", "Apr", "May", "Jun", + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" +}; +static const char* months [12] = { + "January", "February", "March", "April", smonths[5-1], "June", + "July", "August", "September", "October", "November", "December" +}; +static const char ampm [4] [3] = { + "am", "pm", + "AM", "PM" +}; + +static int i2a ( char* dest,unsigned int x ) +{ + int div = 10; + *dest++ = x/div + '0'; + *dest++ = x%div + '0'; + *dest++ = '\0'; + return 2; } -static int i2as(char* dest,unsigned int x) { - int len=i2a(dest,x); - if (*dest=='0') *dest=' '; - return len; -} - -size_t strftime(char *s, size_t max, const char *format, const struct tm *tm) { - char *t=s; - const char *src; - char buf[5]; - while (*format) { - switch (*format) { - case 0: break; - case '%': - switch (*++format) { - case '%': *t='%'; ++t; break; - case 'a': src=sweekdays[tm->tm_wday]; goto append; - case 'A': src=weekdays[tm->tm_wday]; goto append; - case 'h': - case 'b': src=smonths[tm->tm_mon]; goto append; - case 'B': src=months[tm->tm_mon]; goto append; - case 'c': t+=strftime(t,max-(t-s),"%b %a %d %k:%M:%S %Z %Y",tm); break; - case 'C': buf[i2a(buf,(tm->tm_year+1900)/100)]=0; src=buf; goto append; - case 'd': buf[i2a(buf,tm->tm_mday)]=0; src=buf; goto append; - case 'e': buf[i2as(buf,tm->tm_mday)]=0; src=buf; goto append; - case 'H': buf[i2a(buf,tm->tm_hour)]=0; src=buf; goto append; - case 'I': buf[i2a(buf,tm->tm_hour%12)]=0; src=buf; goto append; - case 'j': buf[i2a(buf,tm->tm_yday)]=0; src=buf; goto append; - case 'k': buf[i2as(buf,tm->tm_hour)]=0; src=buf; goto append; - case 'l': buf[i2as(buf,tm->tm_hour%12)]=0; src=buf; goto append; - case 'm': buf[i2a(buf,tm->tm_mon+1)]=0; src=buf; goto append; - case 'M': buf[i2a(buf,tm->tm_min)]=0; src=buf; goto append; - case 'n': *t='\n'; break; - case 'p': src=ampm[tm->tm_hour>11?3:2]; goto append; - case 'P': src=ampm[tm->tm_hour>11?1:0]; goto append; - case 'r': t+=strftime(t,max-(t-s),"%I:%M:%S %p",tm); break; - case 'R': t+=strftime(t,max-(t-s),"%H:%M",tm); break; - case 'S': buf[i2a(buf,tm->tm_sec)]=0; src=buf; goto append; - case 't': *t='\t'; break; - case 'T': t+=strftime(t,max-(t-s),"%H:%M:%S",tm); break; - case 'u': buf[i2a(buf,tm->tm_wday?tm->tm_wday:7)]=0; src=buf; goto append; - case 'w': buf[i2a(buf,tm->tm_wday)]=0; src=buf; goto append; - case 'x': t+=strftime(t,max-(t-s),"%b %a %d",tm); break; - case 'X': t+=strftime(t,max-(t-s),"%k:%M:%S",tm); break; - case 'y': buf[i2a(buf,tm->tm_year%100)]=0; src=buf; goto append; - case 'Y': i2a(buf,(tm->tm_year+1900)/100); buf[i2a(buf+2,(tm->tm_year%100))+2]=0; src=buf; goto append; - case 'Z': src="GMT"; goto append; /* hehe */ -append: - while (*src && t<s+max) { *t=*src; ++t; ++src; } - }; - break; - default: - *t=*format; ++t; +size_t strftime ( char* dst, size_t max, const char* format, const struct tm* tm ) +{ + char* p = dst; + const char* src; + unsigned int no; + char buf [5]; + + + for ( ; *format != '\0'; format++ ) { + if (*format == '%') { + if (*++format == '%') { + *p++ = '%'; + } + else +again: + switch (*format) { +// case '%': *p++ = '%'; break; // reduce size of jump table + case 'n': *p++ = '\n'; break; + case 't': *p++ = '\t'; break; + case 'O': case 'E': ++format; goto again; + case 'c': src = "%b %a %d %k:%M:%S %Z %Y"; goto _strf; + case 'r': src = "%I:%M:%S %p"; goto _strf; + case 'R': src = "%H:%M"; goto _strf; + case 'x': src = "%b %a %d"; goto _strf; + case 'X': src = "%k:%M:%S"; goto _strf; + case 'D': src = "%m/%d/%y"; goto _strf; + case 'T': src = "%H:%M:%S"; + _strf: p += strftime (p, (size_t)(dst+max-p), src, tm); break; + case 'a': src = sweekdays [tm->tm_wday]; goto _str; + case 'A': src = weekdays [tm->tm_wday]; goto _str; + case 'h': + case 'b': src = smonths [tm->tm_mon]; goto _str; + case 'B': src = months [tm->tm_mon]; goto _str; + case 'p': src = ampm [tm->tm_hour > 12 ? 3 : 2]; goto _str; + case 'P': src = ampm [tm->tm_hour > 12 ? 1 : 0]; goto _str; + case 'C': no = tm->tm_year/100 + 19; goto _no; + case 'd': no = tm->tm_mday; goto _no; + case 'e': no = tm->tm_mday; goto _nos; + case 'H': no = tm->tm_hour; goto _no; + case 'I': no = tm->tm_hour % 12; goto _no; + case 'j': no = tm->tm_yday; goto _no; + case 'k': no = tm->tm_hour; goto _nos; + case 'l': no = tm->tm_hour % 12; goto _nos; + case 'm': no = tm->tm_mon + 1; goto _no; + case 'M': no = tm->tm_min; goto _no; + case 'S': no = tm->tm_sec; goto _no; + case 'u': no = tm->tm_wday ? tm->tm_wday : 7; goto _no; + case 'w': no = tm->tm_wday; goto _no; + case 'U': no = (tm->tm_yday - tm->tm_wday + 7) / 7; goto _no; + case 'W': no = (tm->tm_yday - (tm->tm_wday - 1 + 7) % 7 + 7) / 7; goto _no; + case 'Z': +#ifdef WANT_TZFILE_PARSER + tzset(); src = tzname[0]; +#else + src = "[unknown timezone]"; +#endif + goto _str; + case 'Y': i2a ( buf+0, (unsigned int)(tm->tm_year / 100 + 19) ); + i2a ( buf+2, (unsigned int)(tm->tm_year % 100) ); + src = buf; + goto _str; + case 'y': no = tm->tm_year % 100; goto _no; + _no: i2a ( buf, no ); /* append number 'no' */ + src = buf; + goto _str; + _nos: i2a ( buf, no ); /* the same, but '0'->' ' */ + if (buf[0] == '0') + buf[0] = ' '; + src = buf; + _str: while (*src && p < dst+max) /* append string */ + *p++ = *src++; + break; + }; + } else { + *p++ = *format; + } + + if (p >= dst+max) + break; } - ++format; - if (t>=s+max) break; - continue; - } - *t=0; return t-s; + + *p = '\0'; + return p - dst; } - -/* - %u The day of the week as a decimal, range 1 to 7, - Monday being 1. See also %w. (SU) - - %U The week number of the current year as a decimal - number, range 00 to 53, starting with the first - Sunday as the first day of week 01. See also %V and - %W. - - %V The ISO 8601:1988 week number of the current year - as a decimal number, range 01 to 53, where week 1 - is the first week that has at least 4 days in the - current year, and with Monday as the first day of - the week. See also %U and %W. (SU) - - %w The day of the week as a decimal, range 0 to 6, - Sunday being 0. See also %u. - - %W The week number of the current year as a decimal - number, range 00 to 53, starting with the first - Monday as the first day of week 01. - - %x The preferred date representation for the current - locale without the time. - - %X The preferred time representation for the current - locale without the date. - - %y The year as a decimal number without a century - (range 00 to 99). - - %Y The year as a decimal number including the century. - - %z The time-zone as hour offset from GMT. Required to - emit RFC822-conformant dates (using "%a, %d %b %Y - %H:%M:%S %z"). (GNU) - - %Z The time zone or name or abbreviation. - - %+ The date and time in date(1) format. (TZ) - - %% A literal `%' character. - - Some conversion specifiers can be modified by preceding - them by the E or O modifier to indicate that an alterna - tive format should be used. If the alternative format or - specification does not exist for the current locale, the - behaviour will be as if the unmodified conversion specifi - cation were used. (SU) The Single Unix Specification men - tions %Ec, %EC, %Ex, %EX, %Ry, %EY, %Od, %Oe, %OH, %OI, - %Om, %OM, %OS, %Ou, %OU, %OV, %Ow, %OW, %Oy, where the - effect of the O modifier is to use alternative numeric - symbols (say, roman numerals), and that of the E modifier - - - -GNU 29 March 1999 3 - - - - - -STRFTIME(3) Linux Programmer's Manual STRFTIME(3) - - - is to use a locale-dependent alternative representation. - - The broken-down time structure tm is defined in <time.h>. - See also ctime(3). - - -RETURN VALUE - The strftime() function returns the number of characters - placed in the array s, not including the terminating NUL - character, provided the string, including the terminating - NUL, fits. Otherwise, it returns 0, and the contents of - the array is undefined. (Thus at least since libc 4.4.4; - very old versions of libc, such as libc 4.4.1, would - return max if the array was too small.) - - Note that the return value 0 does not necessarily indicate - an error; for example, in many locales %p yields an empty - string. - -ENVIRONMENT - The environment variables TZ and LC_TIME are used. - -CONFORMING TO - ANSI C, SVID 3, ISO 9899. There are strict inclusions - between the set of conversions given in ANSI C (unmarked), - those given in the Single Unix Specification (marked SU), - those given in Olson's timezone package (marked TZ), and - those given in glibc (marked GNU), except that %+ is not - supported in glibc2. On the other hand glibc2 has several - more extensions. POSIX.1 only refers to ANSI C; POSIX.2 - describes under date(1) several extensions that could - apply to strftime as well. - -SEE ALSO - date(1), time(2), ctime(3), setlocale(3), sprintf(3) - -*/ diff --git a/mdk-stage1/dietlibc/libugly/strsignal.c b/mdk-stage1/dietlibc/libugly/strsignal.c index 54314d2c7..d72777571 100644 --- a/mdk-stage1/dietlibc/libugly/strsignal.c +++ b/mdk-stage1/dietlibc/libugly/strsignal.c @@ -1,92 +1,10 @@ +#define _GNU_SOURCE +#include <string.h> #include <signal.h> -/* F....ng Kernel haeder is damn broken... */ -#ifndef _NSIG -#define _NSIG 64 -#endif -#include <asm/signal.h> -char * strsignal(int sig) { - if (sig==SIGHUP) - return "Hangup"; - else if (sig==SIGINT) - return "Interrupt"; - else if (sig==SIGQUIT) - return "Quit"; - else if (sig==SIGILL) - return "Illegal instruction"; - else if (sig==SIGTRAP) - return "Trace/breakpoint trap"; - else if (sig==SIGABRT) - return "Aborted"; - else if (sig==SIGFPE) - return "Floating point exception"; - else if (sig==SIGKILL) - return "Killed"; - else if (sig==SIGBUS) - return "Bus error"; - else if (sig==SIGSEGV) - return "Segmentation fault"; - else if (sig==SIGPIPE) - return "Broken pipe"; - else if (sig==SIGALRM) - return "Alarm clock"; - else if (sig==SIGTERM) - return "Terminated"; - else if (sig==SIGURG) - return "Urgent I/O condition"; - else if (sig==SIGSTOP) - return "Stopped (signal)"; - else if (sig==SIGTSTP) - return "Stopped"; - else if (sig==SIGCONT) - return "Continue"; - else if (sig==SIGCHLD) - return "Child exited"; - else if (sig==SIGTTIN) - return "Stopped (tty input)"; - else if (sig==SIGTTOU) - return "Stopped (tty output)"; - else if (sig==SIGIO) - return "I/O possible"; - else if (sig==SIGXCPU) - return "CPU time limit exceeded"; - else if (sig==SIGXFSZ) - return "File size limit exceeded"; - else if (sig==SIGVTALRM) - return "Virtual timer expired"; - else if (sig==SIGPROF) - return "Profiling timer expired"; - else if (sig==SIGWINCH) - return "Window changed"; - else if (sig==SIGUSR1) - return "User defined signal 1"; - else if (sig==SIGUSR2) - return "User defined signal 1"; -#ifdef SIGEMT - else if (sig==SIGEMT) - return "EMT trap"; -#endif -#ifdef SIGSYS - else if (sig==SIGSYS) - return "Bad system call"; -#endif -#ifdef SIGSTKFLT - else if (sig==SIGSTKFLT) - return "Stack fault"; -#endif -#ifdef SIGINFO - else if (sig==SIGINFO) - return "Information request"; -#elif defined(SIGPWR) && (!defined(SIGLOST) || (SIGPWR!=SIGLOST)) - else if (sig==SIGPWR) - return "Power falure"; -#endif -#ifdef SIGLOST - else if (sig==SIGLOST) - return "Resource lost"; -#endif - else if ((sig>=SIGRTMIN)&&(sig<=SIGRTMAX)) - return "Real time signal"; +const char* strsignal(int sig) { + if (sig<=SIGRTMAX) + return sys_siglist[sig]; else return "(unknown signal)"; } diff --git a/mdk-stage1/dietlibc/libugly/system.c b/mdk-stage1/dietlibc/libugly/system.c index b9eea20eb..714aad056 100644 --- a/mdk-stage1/dietlibc/libugly/system.c +++ b/mdk-stage1/dietlibc/libugly/system.c @@ -1,23 +1,19 @@ #include <signal.h> -#include <asm/errno.h> #include <errno.h> #include <unistd.h> +#include <sys/wait.h> #include "dietwarning.h" - -#define SHELL_PATH "/bin/sh" /* Path of the shell. */ -#define SHELL_NAME "sh" /* Name to give it. */ +#include "dietfeatures.h" +#include "binshstr.h" extern char **environ; -int __libc_fork(); -int __libc_waitpid(int pid, int *status, int options); -int execve(const char*filename, char *const argv[], char *const envp[]); -void __set_errno(int errno); -int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); +int __libc_system (const char *line); int __libc_system (const char *line) { struct sigaction sa, intr, quit; + sigset_t block,omask; int save,pid,ret=-1; if (line == 0) return __libc_system("exit 0") == 0; @@ -29,38 +25,48 @@ int __libc_system (const char *line) if (sigaction(SIGINT, &sa, &intr)<0) return -1; if (sigaction(SIGQUIT, &sa, &quit)<0) { save = errno; +undo: sigaction (SIGINT, &intr, (struct sigaction*)0); - __set_errno (save); + errno=save; return -1; } + sigemptyset(&block); + sigaddset(&block,SIGCHLD); + if (sigprocmask(SIG_BLOCK,&block,&omask)<0) { + save=errno; + sigaction (SIGQUIT, &quit, (struct sigaction*)0); + goto undo; + } - pid=__libc_fork(); + pid=fork(); if (pid>0) { /* parent */ int n; do - n=__libc_waitpid(pid, &ret, 0); + n=waitpid(pid, &ret, 0); while ((n==-1) && (errno==EINTR)); if (n!=pid) ret=-1; } else if (!pid) { /* child */ const char *nargs[4]; - nargs[0] = SHELL_NAME; + nargs[0] = __sh; nargs[1] = "-c"; nargs[2] = line; nargs[3] = 0; sigaction(SIGINT, &intr, (struct sigaction*)0); sigaction(SIGQUIT, &quit, (struct sigaction*)0); + sigprocmask(SIG_SETMASK,&omask,0); - execve(SHELL_PATH,(char *const *)nargs, environ); + execve(__binsh,(char *const *)nargs, environ); _exit(127); } save = errno; sigaction (SIGINT, &intr, (struct sigaction *)0); sigaction (SIGQUIT, &quit, (struct sigaction *)0); - __set_errno(save); + sigprocmask(SIG_SETMASK,&omask,0); + errno=save; return ret; } diff --git a/mdk-stage1/dietlibc/libugly/time_table_spd.c b/mdk-stage1/dietlibc/libugly/time_table_spd.c index bfe1cf86d..6850d76c4 100644 --- a/mdk-stage1/dietlibc/libugly/time_table_spd.c +++ b/mdk-stage1/dietlibc/libugly/time_table_spd.c @@ -1,6 +1,7 @@ +#include <time.h> -/* seconds per month -- nonleap! */ -const unsigned int __spm[12] = +/* days per month -- nonleap! */ +const short __spm[12] = { 0, (31), (31+28), diff --git a/mdk-stage1/dietlibc/libugly/tzfile.c b/mdk-stage1/dietlibc/libugly/tzfile.c index 5702d4bea..e0e8f7846 100644 --- a/mdk-stage1/dietlibc/libugly/tzfile.c +++ b/mdk-stage1/dietlibc/libugly/tzfile.c @@ -3,28 +3,30 @@ #include <fcntl.h> #include <sys/mman.h> #include <netinet/in.h> +#include <time.h> -#include <stdio.h> +/* #include <stdio.h> */ + +char* tzname[2]={"GMT","GMT"}; #ifdef WANT_TZFILE_PARSER static char *tzfile=0; static int tzlen=-1; -void __maplocaltime() { +void __maplocaltime(void); +void __maplocaltime(void) { int fd; unsigned int len; if (tzlen>=0) return; tzlen=0; if ((fd=open("/etc/localtime",O_RDONLY))<0) return; len=lseek(fd,0,SEEK_END); - if ((tzfile=mmap(0,len,PROT_READ,MAP_SHARED,fd,0))==MAP_FAILED) return; + if ((tzfile=mmap(0,len,PROT_READ,MAP_PRIVATE,fd,0))==MAP_FAILED) return; close(fd); if (ntohl(*(int*)tzfile) != 0x545a6966) return; tzlen=len; } -char *tzset(void) __attribute__((weak,alias("__maplocaltime"))); - static unsigned long __myntohl(const unsigned char* c) { return (((unsigned long)c[0])<<24) + (((unsigned long)c[1])<<16) + @@ -32,6 +34,7 @@ static unsigned long __myntohl(const unsigned char* c) { ((unsigned long)c[3]); } +time_t __tzfile_map(time_t t, int *isdst); time_t __tzfile_map(time_t t, int *isdst) { /* "TZif" plus 16 reserved bytes. */ char *tmp; @@ -64,23 +67,41 @@ time_t __tzfile_map(time_t t, int *isdst) { printf("%s(%lu,%d,%d)",i?", ":"",ntohl(*(int*)tmp),tmp[4],tmp[5]); tmp+=6; } printf("\n"); + for (i=0; i<tzh_charcnt; ++i) { + printf("%s\"%s\"",i?", ":"",tmp); + tmp+=strlen(tmp); + } + printf("\n"); #endif tmp=tzfile+20+6*4; - for (i=0; i<tzh_timecnt; ++i) + daylight=(tzh_timecnt>0); + for (i=0; i<tzh_timecnt; ++i) { if ((time_t)__myntohl(tmp+i*4) >= t) { + char* tz=tmp; /* printf("match at %d\n",i); */ tmp+=tzh_timecnt*4; i=tmp[i-1]; /* printf("using index %d\n",i); */ tmp+=tzh_timecnt; + tz+=tzh_timecnt*5+tzh_leapcnt*4+tzh_typecnt*6; tmp+=i*6; /* printf("(%lu,%d,%d)\n",ntohl(*(int*)tmp),tmp[4],tmp[5]); */ *isdst=tmp[4]; - return t+__myntohl(tmp); + tzname[0]=tz+tmp[5]; + timezone=-(__myntohl(tmp)); + return t-timezone; } + } return t; } + +void tzset(void) { + int isdst; + __maplocaltime(); + __tzfile_map(time(0),&isdst); +} + #else -void tzset(void) __attribute__((weak,alias("return0"))); +void tzset(void) __attribute__((weak,alias("__nop"))); #endif diff --git a/mdk-stage1/dietlibc/ppc/__testandset.S b/mdk-stage1/dietlibc/ppc/__testandset.S index a6063fbb2..146982337 100644 --- a/mdk-stage1/dietlibc/ppc/__testandset.S +++ b/mdk-stage1/dietlibc/ppc/__testandset.S @@ -2,10 +2,11 @@ .type __testandset,@function .align 2 __testandset: - lwarx 5,0,3 - add 0,4,5 - stwcx 0,0,3 - bne __testandset +1: lwarx 5,0,3 + li 0,1 + stwcx. 0,0,3 + bne- 1b + mr 3,5 blr .size __testandset,.-__testandset diff --git a/mdk-stage1/dietlibc/ppc/mmap.c b/mdk-stage1/dietlibc/ppc/mmap.c index 25d2926b2..d03e87089 100644 --- a/mdk-stage1/dietlibc/ppc/mmap.c +++ b/mdk-stage1/dietlibc/ppc/mmap.c @@ -1,5 +1,7 @@ -#include <linux/types.h> -#include <linux/unistd.h> +#include "dietfeatures.h" +#include <sys/types.h> +#include <errno.h> +#include "syscalls.h" int mmap(void*start,size_t length,int prot,int flags,int fd,off_t offset) { unsigned long __sc_ret, __sc_err; @@ -29,9 +31,10 @@ int mmap(void*start,size_t length,int prot,int flags,int fd,off_t offset) { "r" (__sc_6), "r" (__sc_7), "r" (__sc_8) - : __syscall_clobbers); + : "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"); __sc_ret = __sc_3; __sc_err = __sc_0; } - __syscall_return (int); + return (__sc_err & 0x10000000 ? errno = __sc_ret, __sc_ret = -1 : 0), + (int) __sc_ret; } diff --git a/mdk-stage1/dietlibc/ppc/start.S b/mdk-stage1/dietlibc/ppc/start.S index c7afeecd2..7b2aed7fb 100644 --- a/mdk-stage1/dietlibc/ppc/start.S +++ b/mdk-stage1/dietlibc/ppc/start.S @@ -1,21 +1,17 @@ -#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 + 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) + clrrwi 1,1,4 + li 0,0 + stwu 1,-16(1) + mtlr 0 + stw 0,0(1) - /* r9 enthält den initialen Stackpointer. + /* r9 contains the initial stack pointer argc = (r9) argv = (r9+4) envp = argv+(argc+1)*4 */ @@ -27,18 +23,20 @@ _start: slwi 5,5,2 /* (argc+1)*4 */ add 5,5,4 /* argv+(argc+1)*4 */ - lis 6,environ@ha - stw 5,environ@l(6) + lis 14,environ@ha + stw 5,environ@l(14) +#ifdef WANT_DYNAMIC + mr 6,7 + bl _dyn_start +#else bl main +#endif b exit .size _start,.-_start /* Define a symbol for the first piece of initialized data. */ - .section ".data" + .section ".data" __data_start: - -#endif - diff --git a/mdk-stage1/dietlibc/ppc/unified.S b/mdk-stage1/dietlibc/ppc/unified.S index d2b419f0b..eb136a96b 100644 --- a/mdk-stage1/dietlibc/ppc/unified.S +++ b/mdk-stage1/dietlibc/ppc/unified.S @@ -1,21 +1,40 @@ #include <dietfeatures.h> +#include "syscalls.h" .text +.type exit,@function +.weak exit +exit: +.type _exit,@function +.global _exit +_exit: + li 0,__NR_exit .global __unified_syscall __unified_syscall: sc - mfcr 0 - andis. 9,0,4096 - mr 0,3 - beq .L1 -#ifdef WANT_THREAD_SAVE - bl __set_errno + bnslr+ + +.global error_unified_syscall +error_unified_syscall: +#ifdef WANT_THREAD_SAFE + stwu 1,-16(1) + mflr 0 + stw 0,20(1) + stw 3,12(1) + bl __errno_location + lwz 0,12(1) + stw 0,0(3) + lwz 0,20(1) + mtlr 0 + addi 1,1,16 #else lis 9,errno@ha stw 3,errno@l(9) #endif - li 0,-1 -.L1: - mr 3,0 + li 3,-1 + +/* here we go and "reuse" the return for weak-void functions */ +#include "dietuglyweaks.h" + blr diff --git a/mdk-stage1/dietlibc/sparc/Makefile.add b/mdk-stage1/dietlibc/sparc/Makefile.add index 0de05b1db..102175bc5 100644 --- a/mdk-stage1/dietlibc/sparc/Makefile.add +++ b/mdk-stage1/dietlibc/sparc/Makefile.add @@ -1,3 +1,4 @@ CFLAGS+=-mcpu=supersparc -Os VPATH:=sparc:syscalls.s:$(VPATH) +LIBOBJ+=$(OBJDIR)/udiv.o $(OBJDIR)/umul.o $(OBJDIR)/urem.o diff --git a/mdk-stage1/dietlibc/sparc/__longjmp.S b/mdk-stage1/dietlibc/sparc/__longjmp.S index 72e001a2f..6550d2b5c 100644 --- a/mdk-stage1/dietlibc/sparc/__longjmp.S +++ b/mdk-stage1/dietlibc/sparc/__longjmp.S @@ -10,6 +10,7 @@ .text .global __longjmp +.type __longjmp,function __longjmp: /* Store our arguments in global registers so we can still use them while unwinding frames and their register windows. */ diff --git a/mdk-stage1/dietlibc/sparc/clone.S b/mdk-stage1/dietlibc/sparc/clone.S index 58b438249..fd8d1d126 100644 --- a/mdk-stage1/dietlibc/sparc/clone.S +++ b/mdk-stage1/dietlibc/sparc/clone.S @@ -1,10 +1,11 @@ -#include <asm/errno.h> -#include <asm/unistd.h> +#include <errno.h> +#include "syscalls.h" .text .align 4 .weak clone clone: +.type __clone,#function .global __clone __clone: save %sp, -96, %sp diff --git a/mdk-stage1/dietlibc/sparc/fork.S b/mdk-stage1/dietlibc/sparc/fork.S index 869c9b30c..a54cab2a9 100644 --- a/mdk-stage1/dietlibc/sparc/fork.S +++ b/mdk-stage1/dietlibc/sparc/fork.S @@ -10,7 +10,7 @@ __libc_fork: bcc,a 1f nop save %sp, -96, %sp -#ifdef WANT_THREAD_SAVE +#ifdef WANT_THREAD_SAFE call __errno_location nop #else diff --git a/mdk-stage1/dietlibc/sparc/mmap.c b/mdk-stage1/dietlibc/sparc/mmap.c index 25ebdc24e..5342bac4e 100644 --- a/mdk-stage1/dietlibc/sparc/mmap.c +++ b/mdk-stage1/dietlibc/sparc/mmap.c @@ -1,5 +1,5 @@ -#include <linux/types.h> -#include <linux/unistd.h> +#include <sys/types.h> +#include "syscalls.h" #define __SYSCALL_STRING \ "ta 0x10;" \ diff --git a/mdk-stage1/dietlibc/sparc/pipe.S b/mdk-stage1/dietlibc/sparc/pipe.S index 820da2570..076822765 100644 --- a/mdk-stage1/dietlibc/sparc/pipe.S +++ b/mdk-stage1/dietlibc/sparc/pipe.S @@ -9,7 +9,7 @@ pipe: bcc,a 1f nop save %sp, -96, %sp -#ifdef WANT_THREAD_SAVE +#ifdef WANT_THREAD_SAFE call __errno_location nop #else diff --git a/mdk-stage1/dietlibc/sparc/setjmp.S b/mdk-stage1/dietlibc/sparc/setjmp.S index efc5a7013..579df757c 100644 --- a/mdk-stage1/dietlibc/sparc/setjmp.S +++ b/mdk-stage1/dietlibc/sparc/setjmp.S @@ -6,32 +6,34 @@ #define ST_FLUSH_WINDOWS 0x03 -.section .rodata .text .globl __setjmp +.type __setjmp,function __setjmp: - b 1f - set 0, %o1 + b 1f + set 0, %o1 .size __setjmp,.-__setjmp .globl setjmp +.type setjmp,function setjmp: - set 1, %o1 + set 1, %o1 .size setjmp,.-setjmp .globl __sigsetjmp +.type __sigsetjmp,function __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 + /* 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)] + 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 + mov %o7, %g1 + call __sigjmp_save + mov %g1, %o7 .size __sigsetjmp,.-__sigsetjmp diff --git a/mdk-stage1/dietlibc/sparc/shmat.c b/mdk-stage1/dietlibc/sparc/shmat.c index 73b2d89a9..b7dce2e83 100644 --- a/mdk-stage1/dietlibc/sparc/shmat.c +++ b/mdk-stage1/dietlibc/sparc/shmat.c @@ -1,7 +1,7 @@ #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> -#include <asm/ipc.h> +#include <unistd.h> extern void* __ipc(); diff --git a/mdk-stage1/dietlibc/sparc/start.S b/mdk-stage1/dietlibc/sparc/start.S index e948aaddc..c6408ee8f 100644 --- a/mdk-stage1/dietlibc/sparc/start.S +++ b/mdk-stage1/dietlibc/sparc/start.S @@ -1,46 +1,50 @@ -#include "start.h" - -#ifdef __sparc__ - .section ".text" - .align 4 - .global _start - .type _start,@function + .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 +/* 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 +/* 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 + 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. */ +/* 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. */ +/* Let libc do the rest of the initialization, and call main. */ +#ifdef WANT_DYNAMIC + call dyn_start +#else call main - mov %g1, %o5 +#endif + mov %g1, %o3 b exit mov %o0, %i0 - /* Die very horribly if exit returns. */ - unimp +/* Die very horribly if exit returns. */ - .size _start, .-_start -#endif +/* here we go and "reuse" the return for weak-void functions */ +#include "dietuglyweaks.h" + ret + nop + + .size _start, .-_start diff --git a/mdk-stage1/dietlibc/sparc/udiv.S b/mdk-stage1/dietlibc/sparc/udiv.S index 87479e7bd..fe8d04969 100644 --- a/mdk-stage1/dietlibc/sparc/udiv.S +++ b/mdk-stage1/dietlibc/sparc/udiv.S @@ -48,8 +48,6 @@ C_LABEL(name);\ .type name,@function; -#define LOC(name) . ## L ## name - #define END(name) \ .size name, . - name @@ -70,11 +68,11 @@ ENTRY(.udiv) 1: cmp %o3, %o5 ! if %o1 exceeds %o0, done - blu LOC(got_result) ! (and algorithm fails otherwise) + blu .Lgot_result ! (and algorithm fails otherwise) clr %o2 sethi %hi(1 << (32 - 4 - 1)), %g1 cmp %o3, %g1 - blu LOC(not_really_big) + blu .Lnot_really_big clr %o4 ! Here the dividend is >= 2**(31-N) or so. We must be careful here, @@ -92,7 +90,7 @@ ENTRY(.udiv) ! Now compute %g2. 2: addcc %o5, %o5, %o5 - bcc LOC(not_too_big) + bcc .Lnot_too_big add %g2, 1, %g2 ! We get here if the %o1 overflowed while shifting. @@ -101,14 +99,14 @@ ENTRY(.udiv) sll %g1, 4, %g1 ! high order bit srl %o5, 1, %o5 ! rest of %o5 add %o5, %g1, %o5 - b LOC(do_single_div) + b .Ldo_single_div sub %g2, 1, %g2 - LOC(not_too_big): + .Lnot_too_big: 3: cmp %o5, %o3 blu 2b nop - be LOC(do_single_div) + be .Ldo_single_div nop /* NB: these are commented out in the V8-Sparc manual as well */ /* (I do not understand this) */ @@ -123,15 +121,15 @@ ENTRY(.udiv) ! 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): + .Ldo_single_div: subcc %g2, 1, %g2 - bl LOC(end_regular_divide) + bl .Lend_regular_divide nop sub %o3, %o5, %o3 mov 1, %o2 - b LOC(end_single_divloop) + b .Lend_single_divloop nop - LOC(single_divloop): + .Lsingle_divloop: sll %o2, 1, %o2 bl 1f srl %o5, 1, %o5 @@ -143,66 +141,66 @@ ENTRY(.udiv) add %o3, %o5, %o3 sub %o2, 1, %o2 2: - LOC(end_single_divloop): + .Lend_single_divloop: subcc %g2, 1, %g2 - bge LOC(single_divloop) + bge .Lsingle_divloop tst %o3 - b,a LOC(end_regular_divide) + b,a .Lend_regular_divide -LOC(not_really_big): +.Lnot_really_big: 1: sll %o5, 4, %o5 cmp %o5, %o3 bleu 1b addcc %o4, 1, %o4 - be LOC(got_result) + be .Lgot_result sub %o4, 1, %o4 tst %o3 ! set up for initial iteration -LOC(divloop): +.Ldivloop: sll %o2, 4, %o2 ! depth 1, accumulated bits 0 - bl LOC(1.16) + bl .L1.16 srl %o5,1,%o5 ! remainder is positive subcc %o3,%o5,%o3 ! depth 2, accumulated bits 1 - bl LOC(2.17) + bl .L2.17 srl %o5,1,%o5 ! remainder is positive subcc %o3,%o5,%o3 ! depth 3, accumulated bits 3 - bl LOC(3.19) + bl .L3.19 srl %o5,1,%o5 ! remainder is positive subcc %o3,%o5,%o3 ! depth 4, accumulated bits 7 - bl LOC(4.23) + bl .L4.23 srl %o5,1,%o5 ! remainder is positive subcc %o3,%o5,%o3 b 9f add %o2, (7*2+1), %o2 -LOC(4.23): +.L4.23: ! remainder is negative addcc %o3,%o5,%o3 b 9f add %o2, (7*2-1), %o2 -LOC(3.19): +.L3.19: ! remainder is negative addcc %o3,%o5,%o3 ! depth 4, accumulated bits 5 - bl LOC(4.21) + bl .L4.21 srl %o5,1,%o5 ! remainder is positive subcc %o3,%o5,%o3 b 9f add %o2, (5*2+1), %o2 -LOC(4.21): +.L4.21: ! remainder is negative addcc %o3,%o5,%o3 b 9f @@ -210,41 +208,41 @@ LOC(4.21): -LOC(2.17): +.L2.17: ! remainder is negative addcc %o3,%o5,%o3 ! depth 3, accumulated bits 1 - bl LOC(3.17) + bl .L3.17 srl %o5,1,%o5 ! remainder is positive subcc %o3,%o5,%o3 ! depth 4, accumulated bits 3 - bl LOC(4.19) + bl .L4.19 srl %o5,1,%o5 ! remainder is positive subcc %o3,%o5,%o3 b 9f add %o2, (3*2+1), %o2 -LOC(4.19): +.L4.19: ! remainder is negative addcc %o3,%o5,%o3 b 9f add %o2, (3*2-1), %o2 -LOC(3.17): +.L3.17: ! remainder is negative addcc %o3,%o5,%o3 ! depth 4, accumulated bits 1 - bl LOC(4.17) + bl .L4.17 srl %o5,1,%o5 ! remainder is positive subcc %o3,%o5,%o3 b 9f add %o2, (1*2+1), %o2 -LOC(4.17): +.L4.17: ! remainder is negative addcc %o3,%o5,%o3 b 9f @@ -253,46 +251,46 @@ LOC(4.17): -LOC(1.16): +.L1.16: ! remainder is negative addcc %o3,%o5,%o3 ! depth 2, accumulated bits -1 - bl LOC(2.15) + bl .L2.15 srl %o5,1,%o5 ! remainder is positive subcc %o3,%o5,%o3 ! depth 3, accumulated bits -1 - bl LOC(3.15) + bl .L3.15 srl %o5,1,%o5 ! remainder is positive subcc %o3,%o5,%o3 ! depth 4, accumulated bits -1 - bl LOC(4.15) + bl .L4.15 srl %o5,1,%o5 ! remainder is positive subcc %o3,%o5,%o3 b 9f add %o2, (-1*2+1), %o2 -LOC(4.15): +.L4.15: ! remainder is negative addcc %o3,%o5,%o3 b 9f add %o2, (-1*2-1), %o2 -LOC(3.15): +.L3.15: ! remainder is negative addcc %o3,%o5,%o3 ! depth 4, accumulated bits -3 - bl LOC(4.13) + bl .L4.13 srl %o5,1,%o5 ! remainder is positive subcc %o3,%o5,%o3 b 9f add %o2, (-3*2+1), %o2 -LOC(4.13): +.L4.13: ! remainder is negative addcc %o3,%o5,%o3 b 9f @@ -300,41 +298,41 @@ LOC(4.13): -LOC(2.15): +.L2.15: ! remainder is negative addcc %o3,%o5,%o3 ! depth 3, accumulated bits -3 - bl LOC(3.13) + bl .L3.13 srl %o5,1,%o5 ! remainder is positive subcc %o3,%o5,%o3 ! depth 4, accumulated bits -5 - bl LOC(4.11) + bl .L4.11 srl %o5,1,%o5 ! remainder is positive subcc %o3,%o5,%o3 b 9f add %o2, (-5*2+1), %o2 -LOC(4.11): +.L4.11: ! remainder is negative addcc %o3,%o5,%o3 b 9f add %o2, (-5*2-1), %o2 -LOC(3.13): +.L3.13: ! remainder is negative addcc %o3,%o5,%o3 ! depth 4, accumulated bits -7 - bl LOC(4.9) + bl .L4.9 srl %o5,1,%o5 ! remainder is positive subcc %o3,%o5,%o3 b 9f add %o2, (-7*2+1), %o2 -LOC(4.9): +.L4.9: ! remainder is negative addcc %o3,%o5,%o3 b 9f @@ -344,16 +342,16 @@ LOC(4.9): 9: -LOC(end_regular_divide): +.Lend_regular_divide: subcc %o4, 1, %o4 - bge LOC(divloop) + bge .Ldivloop tst %o3 - bl,a LOC(got_result) + bl,a .Lgot_result ! non-restoring fixup here (one instruction only!) sub %o2, 1, %o2 -LOC(got_result): +.Lgot_result: retl mov %o2, %o0 diff --git a/mdk-stage1/dietlibc/sparc/umul.S b/mdk-stage1/dietlibc/sparc/umul.S index 15038ab2a..5d7d60f2b 100644 --- a/mdk-stage1/dietlibc/sparc/umul.S +++ b/mdk-stage1/dietlibc/sparc/umul.S @@ -25,8 +25,6 @@ C_LABEL(name);\ .type name,@function; -#define LOC(name) . ## L ## name - #define END(name) \ .size name, . - name @@ -34,7 +32,7 @@ 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 + be .Lmul_shortway ! if zero, can do it the short way andcc %g0, %g0, %o4 ! zero the partial product; clear N & V /* @@ -124,7 +122,7 @@ ENTRY(.umul) addcc %o4, %o2, %o1 ! add compensation and put upper half in place #endif -LOC(mul_shortway): +.Lmul_shortway: /* * Short multiply. 12 steps, followed by a final shift step. * The resulting bits are off by 12 and (32-12) = 20 bit positions, diff --git a/mdk-stage1/dietlibc/sparc/unified.S b/mdk-stage1/dietlibc/sparc/unified.S index 3cd609da5..873a522df 100644 --- a/mdk-stage1/dietlibc/sparc/unified.S +++ b/mdk-stage1/dietlibc/sparc/unified.S @@ -1,6 +1,14 @@ #include <dietfeatures.h> +#include "syscalls.h" .text +.weak exit +.type exit,function +exit: +.global _exit +.type _exit,function +_exit: + mov __NR_exit, %g1 .global __unified_syscall __unified_syscall: ta 0x10 @@ -14,7 +22,7 @@ __unified_syscall: cmp %l2, 0xfe bgu 2f neg %i0, %l3 -#ifdef WANT_THREAD_SAVE +#ifdef WANT_THREAD_SAFE call __errno_location nop #else diff --git a/mdk-stage1/dietlibc/sparc/urem.S b/mdk-stage1/dietlibc/sparc/urem.S index 943cb7873..f7a9fd394 100644 --- a/mdk-stage1/dietlibc/sparc/urem.S +++ b/mdk-stage1/dietlibc/sparc/urem.S @@ -48,8 +48,6 @@ C_LABEL(name);\ .type name,@function; -#define LOC(name) . ## L ## name - #define END(name) \ .size name, . - name @@ -70,11 +68,11 @@ ENTRY(.urem) 1: cmp %o3, %o5 ! if %o1 exceeds %o0, done - blu LOC(got_result) ! (and algorithm fails otherwise) + blu .Lgot_result ! (and algorithm fails otherwise) clr %o2 sethi %hi(1 << (32 - 4 - 1)), %g1 cmp %o3, %g1 - blu LOC(not_really_big) + blu .Lnot_really_big clr %o4 ! Here the dividend is >= 2**(31-N) or so. We must be careful here, @@ -92,7 +90,7 @@ ENTRY(.urem) ! Now compute %g2. 2: addcc %o5, %o5, %o5 - bcc LOC(not_too_big) + bcc .Lnot_too_big add %g2, 1, %g2 ! We get here if the %o1 overflowed while shifting. @@ -101,14 +99,14 @@ ENTRY(.urem) sll %g1, 4, %g1 ! high order bit srl %o5, 1, %o5 ! rest of %o5 add %o5, %g1, %o5 - b LOC(do_single_div) + b .Ldo_single_div sub %g2, 1, %g2 - LOC(not_too_big): + .Lnot_too_big: 3: cmp %o5, %o3 blu 2b nop - be LOC(do_single_div) + be .Ldo_single_div nop /* NB: these are commented out in the V8-Sparc manual as well */ /* (I do not understand this) */ @@ -123,15 +121,15 @@ ENTRY(.urem) ! 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): + .Ldo_single_div: subcc %g2, 1, %g2 - bl LOC(end_regular_divide) + bl .Lend_regular_divide nop sub %o3, %o5, %o3 mov 1, %o2 - b LOC(end_single_divloop) + b .Lend_single_divloop nop - LOC(single_divloop): + .Lsingle_divloop: sll %o2, 1, %o2 bl 1f srl %o5, 1, %o5 @@ -143,66 +141,66 @@ ENTRY(.urem) add %o3, %o5, %o3 sub %o2, 1, %o2 2: - LOC(end_single_divloop): + .Lend_single_divloop: subcc %g2, 1, %g2 - bge LOC(single_divloop) + bge .Lsingle_divloop tst %o3 - b,a LOC(end_regular_divide) + b,a .Lend_regular_divide -LOC(not_really_big): +.Lnot_really_big: 1: sll %o5, 4, %o5 cmp %o5, %o3 bleu 1b addcc %o4, 1, %o4 - be LOC(got_result) + be .Lgot_result sub %o4, 1, %o4 tst %o3 ! set up for initial iteration -LOC(divloop): +.Ldivloop: sll %o2, 4, %o2 ! depth 1, accumulated bits 0 - bl LOC(1.16) + bl .L1.16 srl %o5,1,%o5 ! remainder is positive subcc %o3,%o5,%o3 ! depth 2, accumulated bits 1 - bl LOC(2.17) + bl .L2.17 srl %o5,1,%o5 ! remainder is positive subcc %o3,%o5,%o3 ! depth 3, accumulated bits 3 - bl LOC(3.19) + bl .L3.19 srl %o5,1,%o5 ! remainder is positive subcc %o3,%o5,%o3 ! depth 4, accumulated bits 7 - bl LOC(4.23) + bl .L4.23 srl %o5,1,%o5 ! remainder is positive subcc %o3,%o5,%o3 b 9f add %o2, (7*2+1), %o2 -LOC(4.23): +.L4.23: ! remainder is negative addcc %o3,%o5,%o3 b 9f add %o2, (7*2-1), %o2 -LOC(3.19): +.L3.19: ! remainder is negative addcc %o3,%o5,%o3 ! depth 4, accumulated bits 5 - bl LOC(4.21) + bl .L4.21 srl %o5,1,%o5 ! remainder is positive subcc %o3,%o5,%o3 b 9f add %o2, (5*2+1), %o2 -LOC(4.21): +.L4.21: ! remainder is negative addcc %o3,%o5,%o3 b 9f @@ -210,41 +208,41 @@ LOC(4.21): -LOC(2.17): +.L2.17: ! remainder is negative addcc %o3,%o5,%o3 ! depth 3, accumulated bits 1 - bl LOC(3.17) + bl .L3.17 srl %o5,1,%o5 ! remainder is positive subcc %o3,%o5,%o3 ! depth 4, accumulated bits 3 - bl LOC(4.19) + bl .L4.19 srl %o5,1,%o5 ! remainder is positive subcc %o3,%o5,%o3 b 9f add %o2, (3*2+1), %o2 -LOC(4.19): +.L4.19: ! remainder is negative addcc %o3,%o5,%o3 b 9f add %o2, (3*2-1), %o2 -LOC(3.17): +.L3.17: ! remainder is negative addcc %o3,%o5,%o3 ! depth 4, accumulated bits 1 - bl LOC(4.17) + bl .L4.17 srl %o5,1,%o5 ! remainder is positive subcc %o3,%o5,%o3 b 9f add %o2, (1*2+1), %o2 -LOC(4.17): +.L4.17: ! remainder is negative addcc %o3,%o5,%o3 b 9f @@ -253,46 +251,46 @@ LOC(4.17): -LOC(1.16): +.L1.16: ! remainder is negative addcc %o3,%o5,%o3 ! depth 2, accumulated bits -1 - bl LOC(2.15) + bl .L2.15 srl %o5,1,%o5 ! remainder is positive subcc %o3,%o5,%o3 ! depth 3, accumulated bits -1 - bl LOC(3.15) + bl .L3.15 srl %o5,1,%o5 ! remainder is positive subcc %o3,%o5,%o3 ! depth 4, accumulated bits -1 - bl LOC(4.15) + bl .L4.15 srl %o5,1,%o5 ! remainder is positive subcc %o3,%o5,%o3 b 9f add %o2, (-1*2+1), %o2 -LOC(4.15): +.L4.15: ! remainder is negative addcc %o3,%o5,%o3 b 9f add %o2, (-1*2-1), %o2 -LOC(3.15): +.L3.15: ! remainder is negative addcc %o3,%o5,%o3 ! depth 4, accumulated bits -3 - bl LOC(4.13) + bl .L4.13 srl %o5,1,%o5 ! remainder is positive subcc %o3,%o5,%o3 b 9f add %o2, (-3*2+1), %o2 -LOC(4.13): +.L4.13: ! remainder is negative addcc %o3,%o5,%o3 b 9f @@ -300,41 +298,41 @@ LOC(4.13): -LOC(2.15): +.L2.15: ! remainder is negative addcc %o3,%o5,%o3 ! depth 3, accumulated bits -3 - bl LOC(3.13) + bl .L3.13 srl %o5,1,%o5 ! remainder is positive subcc %o3,%o5,%o3 ! depth 4, accumulated bits -5 - bl LOC(4.11) + bl .L4.11 srl %o5,1,%o5 ! remainder is positive subcc %o3,%o5,%o3 b 9f add %o2, (-5*2+1), %o2 -LOC(4.11): +.L4.11: ! remainder is negative addcc %o3,%o5,%o3 b 9f add %o2, (-5*2-1), %o2 -LOC(3.13): +.L3.13: ! remainder is negative addcc %o3,%o5,%o3 ! depth 4, accumulated bits -7 - bl LOC(4.9) + bl .L4.9 srl %o5,1,%o5 ! remainder is positive subcc %o3,%o5,%o3 b 9f add %o2, (-7*2+1), %o2 -LOC(4.9): +.L4.9: ! remainder is negative addcc %o3,%o5,%o3 b 9f @@ -344,16 +342,16 @@ LOC(4.9): 9: -LOC(end_regular_divide): +.Lend_regular_divide: subcc %o4, 1, %o4 - bge LOC(divloop) + bge .Ldivloop tst %o3 - bl,a LOC(got_result) + bl,a .Lgot_result ! non-restoring fixup here (one instruction only!) add %o3, %o1, %o3 -LOC(got_result): +.Lgot_result: retl mov %o3, %o0 diff --git a/mdk-stage1/dietlibc/syscalls.h b/mdk-stage1/dietlibc/syscalls.h index eba7a3c00..aa62f67a9 100644 --- a/mdk-stage1/dietlibc/syscalls.h +++ b/mdk-stage1/dietlibc/syscalls.h @@ -1,142 +1,35 @@ -#ifdef __ASSEMBLER__ +#if defined(__i386__) +#include "i386/syscalls.h" -#include <asm/unistd.h> +#elif defined(__x86_64__) +#include "x86_64/syscalls.h" +#elif defined(__sparc__) +#if defined(__arch64__) +#include "sparc64/syscalls.h" #else - -#include <linux/unistd.h> - -#endif - -#ifdef __i386__ - -#define syscall_weak(name,wsym,sym) \ -.text; \ -.weak wsym; \ -wsym: ; \ -.global sym; \ -sym: \ - movb $__NR_##name,%al; \ - jmp __unified_syscall - -#define syscall(name,sym) \ -.text; \ -.global sym; \ -sym: \ - movb $__NR_##name,%al; \ - jmp __unified_syscall - +#include "sparc/syscalls.h" #endif -#ifdef __sparc__ - -#define syscall_weak(name,wsym,sym) \ -.text; \ -.weak wsym; \ -wsym: ; \ -.global sym; \ -sym: \ - b __unified_syscall; \ - mov __NR_##name, %g1 - -#define syscall(name,sym) \ -.text; \ -.global sym; \ -sym: \ - b __unified_syscall; \ - mov __NR_##name, %g1 - -#endif - -#ifdef __powerpc__ - -#define syscall_weak(name,wsym,sym) \ -.text; \ -.weak wsym; \ -wsym: ; \ -.global sym; \ -sym: \ - li 0,__NR_##name; \ - b __unified_syscall +#elif defined(__powerpc__) +#include "ppc/syscalls.h" -#define syscall(name,sym) \ -.text; \ -.global sym; \ -sym: \ - li 0,__NR_##name; \ - b __unified_syscall +#elif defined(__mips__) +#include "mips/syscalls.h" -#endif - - -#ifdef __mips__ - -#define syscall_weak(name,wsym,sym) \ -.text; \ -.weak wsym; \ -wsym: ; \ -.global sym; \ -.ent sym; \ -sym: \ - li $2,__NR_##name; \ - la $25,__unified_syscall; \ - jr $25; \ -.end sym - -#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_weak(name,wsym,sym) \ -.text; \ -.weak wsym; \ -wsym: ; \ -.global sym; \ -sym: \ - swi __NR_##name; \ - b __unified_syscall - -#define syscall(name,sym) \ -.text; \ -.global sym; \ -sym: \ - swi __NR_##name; \ - b __unified_syscall - -#endif +#elif defined(__arm__) +#include "arm/syscalls.h" +#elif defined(__s390__) +#include "s390/syscalls.h" -#ifdef __alpha__ +#elif defined(__alpha__) +#include "alpha/syscalls.h" -#define syscall_weak(name,wsym,sym) \ -.text ; \ -.align 2 ; \ -.weak wsym; \ -.type wsym,@function ; \ -wsym: ; \ -.global sym ; \ -.type sym,@function ; \ -sym: ; \ - lda $0, __NR_##name($31) ; \ - br __unified_syscall +#elif defined(__hppa__) +#include "parisc/syscalls.h" -#define syscall(name,sym) \ -.text ; \ -.align 2 ; \ -.global sym ; \ -.type sym,@function ; \ -sym: ; \ - lda $0, __NR_##name($31) ; \ - br __unified_syscall +#elif defined(__ia64__) +#include "ia64/syscalls.h" #endif diff --git a/mdk-stage1/dietlibc/syscalls.s/__pread.S b/mdk-stage1/dietlibc/syscalls.s/__pread.S index ad47c7873..ae2068352 100644 --- a/mdk-stage1/dietlibc/syscalls.s/__pread.S +++ b/mdk-stage1/dietlibc/syscalls.s/__pread.S @@ -1,3 +1,3 @@ #include "syscalls.h" -syscall_weak(pread,__pread,__libc__pread) +syscall(pread,__pread) diff --git a/mdk-stage1/dietlibc/syscalls.s/_llseek.S b/mdk-stage1/dietlibc/syscalls.s/_llseek.S index 3e240d822..68d021168 100644 --- a/mdk-stage1/dietlibc/syscalls.s/_llseek.S +++ b/mdk-stage1/dietlibc/syscalls.s/_llseek.S @@ -1,3 +1,7 @@ #include "syscalls.h" +#ifdef __NR__llseek +.global llseek +llseek: syscall(_llseek,_llseek) +#endif diff --git a/mdk-stage1/dietlibc/syscalls.s/fstat64.S b/mdk-stage1/dietlibc/syscalls.s/fstat64.S index 0c7a41609..f034ddf5b 100644 --- a/mdk-stage1/dietlibc/syscalls.s/fstat64.S +++ b/mdk-stage1/dietlibc/syscalls.s/fstat64.S @@ -1,8 +1,10 @@ #include "dietfeatures.h" #include "syscalls.h" +#ifdef __NR_fstat64 #ifdef WANT_LARGEFILE_BACKCOMPAT syscall(fstat64,__dietlibc_fstat64) #else syscall(fstat64,fstat64) #endif +#endif diff --git a/mdk-stage1/dietlibc/syscalls.s/getdents64.S b/mdk-stage1/dietlibc/syscalls.s/getdents64.S index 16859addf..691d8f650 100644 --- a/mdk-stage1/dietlibc/syscalls.s/getdents64.S +++ b/mdk-stage1/dietlibc/syscalls.s/getdents64.S @@ -1,3 +1,4 @@ +#include "dietfeatures.h" #include "syscalls.h" #ifdef __NR_getdents64 diff --git a/mdk-stage1/dietlibc/syscalls.s/getresuid.S b/mdk-stage1/dietlibc/syscalls.s/getresuid.S index 62f6d764f..95c5505a8 100644 --- a/mdk-stage1/dietlibc/syscalls.s/getresuid.S +++ b/mdk-stage1/dietlibc/syscalls.s/getresuid.S @@ -1,7 +1,7 @@ #include "syscalls.h" -#ifdef __getresuid +#ifdef __NR_getresuid -syscall(getresuid) +syscall(getresuid,getresuid) #endif diff --git a/mdk-stage1/dietlibc/syscalls.s/ioperm.S b/mdk-stage1/dietlibc/syscalls.s/ioperm.S index 0acfde07a..74a51fc4b 100644 --- a/mdk-stage1/dietlibc/syscalls.s/ioperm.S +++ b/mdk-stage1/dietlibc/syscalls.s/ioperm.S @@ -1,3 +1,5 @@ #include "syscalls.h" +#ifdef __NR_ioperm syscall(ioperm,ioperm) +#endif diff --git a/mdk-stage1/dietlibc/syscalls.s/ipc.S b/mdk-stage1/dietlibc/syscalls.s/ipc.S index 40479400d..476878e52 100644 --- a/mdk-stage1/dietlibc/syscalls.s/ipc.S +++ b/mdk-stage1/dietlibc/syscalls.s/ipc.S @@ -1,3 +1,5 @@ #include "syscalls.h" +#ifdef __NR_ipc syscall(ipc,__ipc) +#endif diff --git a/mdk-stage1/dietlibc/syscalls.s/lstat64.S b/mdk-stage1/dietlibc/syscalls.s/lstat64.S index 33fd5ab94..021cb0578 100644 --- a/mdk-stage1/dietlibc/syscalls.s/lstat64.S +++ b/mdk-stage1/dietlibc/syscalls.s/lstat64.S @@ -1,8 +1,10 @@ #include "dietfeatures.h" #include "syscalls.h" +#ifdef __NR_lstat64 #ifdef WANT_LARGEFILE_BACKCOMPAT syscall(lstat64,__dietlibc_lstat64) #else syscall(lstat64,lstat64) #endif +#endif diff --git a/mdk-stage1/dietlibc/syscalls.s/nice.S b/mdk-stage1/dietlibc/syscalls.s/nice.S index 7d3f740b2..4dad30edb 100644 --- a/mdk-stage1/dietlibc/syscalls.s/nice.S +++ b/mdk-stage1/dietlibc/syscalls.s/nice.S @@ -1,3 +1,5 @@ #include "syscalls.h" +#ifdef __NR_nice syscall(nice,nice) +#endif diff --git a/mdk-stage1/dietlibc/syscalls.s/pause.S b/mdk-stage1/dietlibc/syscalls.s/pause.S index cdf42cabd..d154f1538 100644 --- a/mdk-stage1/dietlibc/syscalls.s/pause.S +++ b/mdk-stage1/dietlibc/syscalls.s/pause.S @@ -1,3 +1,5 @@ #include "syscalls.h" +#ifdef __NR_pause syscall_weak(pause,pause,__libc_pause) +#endif diff --git a/mdk-stage1/dietlibc/syscalls.s/sendfile.S b/mdk-stage1/dietlibc/syscalls.s/sendfile.S index 12d6195dd..4dcb0ef69 100644 --- a/mdk-stage1/dietlibc/syscalls.s/sendfile.S +++ b/mdk-stage1/dietlibc/syscalls.s/sendfile.S @@ -3,4 +3,4 @@ syscall_weak(sendfile,sendfile,__libc_sendfile) -link_warning(sendfile,"sendfile is not portable and does not support large files") +link_warning(sendfile,"sendfile is not portable") diff --git a/mdk-stage1/dietlibc/syscalls.s/setresgid.S b/mdk-stage1/dietlibc/syscalls.s/setresgid.S index 64cbac94e..2277cbaf4 100644 --- a/mdk-stage1/dietlibc/syscalls.s/setresgid.S +++ b/mdk-stage1/dietlibc/syscalls.s/setresgid.S @@ -1,7 +1,7 @@ #include "syscalls.h" -#ifdef __setresgid +#ifdef __NR_setresgid -syscall(setresgid) +syscall(setresgid,setresgid) #endif diff --git a/mdk-stage1/dietlibc/syscalls.s/setresuid.S b/mdk-stage1/dietlibc/syscalls.s/setresuid.S index 20b6abee9..cd322b77e 100644 --- a/mdk-stage1/dietlibc/syscalls.s/setresuid.S +++ b/mdk-stage1/dietlibc/syscalls.s/setresuid.S @@ -1,7 +1,7 @@ #include "syscalls.h" -#ifdef __setresuid +#ifdef __NR_setresuid -syscall(setresuid) +syscall(setresuid,setresuid) #endif diff --git a/mdk-stage1/dietlibc/syscalls.s/socketcall.S b/mdk-stage1/dietlibc/syscalls.s/socketcall.S index 5837c049a..b97b37f0c 100644 --- a/mdk-stage1/dietlibc/syscalls.s/socketcall.S +++ b/mdk-stage1/dietlibc/syscalls.s/socketcall.S @@ -1,3 +1,5 @@ #include "syscalls.h" +#ifdef __NR_socketcall syscall(socketcall,socketcall) +#endif diff --git a/mdk-stage1/dietlibc/syscalls.s/stat64.S b/mdk-stage1/dietlibc/syscalls.s/stat64.S index 734fcab20..7dc54d955 100644 --- a/mdk-stage1/dietlibc/syscalls.s/stat64.S +++ b/mdk-stage1/dietlibc/syscalls.s/stat64.S @@ -1,8 +1,10 @@ #include "dietfeatures.h" #include "syscalls.h" +#ifdef __NR_stat64 #ifdef WANT_LARGEFILE_BACKCOMPAT syscall(stat64,__dietlibc_stat64) #else syscall(stat64,stat64) #endif +#endif diff --git a/mdk-stage1/dietlibc/syscalls.s/stime.S b/mdk-stage1/dietlibc/syscalls.s/stime.S index 9d9f5bf0a..281809c27 100644 --- a/mdk-stage1/dietlibc/syscalls.s/stime.S +++ b/mdk-stage1/dietlibc/syscalls.s/stime.S @@ -1,3 +1,5 @@ #include "syscalls.h" +#ifdef __NR_stime syscall(stime,stime) +#endif diff --git a/mdk-stage1/dietlibc/syscalls.s/syslog.S b/mdk-stage1/dietlibc/syscalls.s/syslog.S index 6af3c4eac..4ebd81a39 100644 --- a/mdk-stage1/dietlibc/syscalls.s/syslog.S +++ b/mdk-stage1/dietlibc/syscalls.s/syslog.S @@ -1,3 +1,3 @@ #include "syscalls.h" -syscall(syslog,__syscall_syslog) +syscall_weak(syslog,__syscall_syslog,klogctl) diff --git a/mdk-stage1/dietlibc/syscalls.s/time.S b/mdk-stage1/dietlibc/syscalls.s/time.S index 26c79091c..aa646cfdf 100644 --- a/mdk-stage1/dietlibc/syscalls.s/time.S +++ b/mdk-stage1/dietlibc/syscalls.s/time.S @@ -1,3 +1,5 @@ #include "syscalls.h" +#ifdef __NR_time syscall(time,time) +#endif diff --git a/mdk-stage1/dietlibc/syscalls.s/umount2.S b/mdk-stage1/dietlibc/syscalls.s/umount2.S index 4cdd6a200..b27b353ed 100644 --- a/mdk-stage1/dietlibc/syscalls.s/umount2.S +++ b/mdk-stage1/dietlibc/syscalls.s/umount2.S @@ -1,3 +1,5 @@ #include "syscalls.h" +#ifdef __NR_umount2 syscall(umount2,umount2) +#endif diff --git a/mdk-stage1/dietlibc/syscalls.s/waitpid.S b/mdk-stage1/dietlibc/syscalls.s/waitpid.S index 5cdc18afb..bedc73eb6 100644 --- a/mdk-stage1/dietlibc/syscalls.s/waitpid.S +++ b/mdk-stage1/dietlibc/syscalls.s/waitpid.S @@ -1,3 +1,5 @@ #include "syscalls.h" +#ifdef __NR_waitpid syscall_weak(waitpid,waitpid,__libc_waitpid) +#endif diff --git a/mdk-stage1/disk.c b/mdk-stage1/disk.c index a9a31d3d7..375727fdf 100644 --- a/mdk-stage1/disk.c +++ b/mdk-stage1/disk.c @@ -176,7 +176,7 @@ static enum return_type try_with_device(char *dev_name) } while (fgets(buf, sizeof(buf), f)) { - bzero(name, sizeof(name)); + 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); diff --git a/mdk-stage1/dns.c b/mdk-stage1/dns.c index d1e67c78d..266864d37 100644 --- a/mdk-stage1/dns.c +++ b/mdk-stage1/dns.c @@ -23,7 +23,7 @@ // dietlibc can do hostname lookup, whereas glibc can't when linked statically :-( -#ifdef __LIBC_DIETLIBC__ +#if defined(__dietlibc__) #include <unistd.h> #include <string.h> @@ -67,14 +67,13 @@ char * mygethostbyaddr(char * ipnum) struct hostent * host; if (!inet_aton(ipnum, &in)) return NULL; - host = gethostbyaddr(&in, strlen((void *) &in), AF_INET); + host = gethostbyaddr(&in.s_addr, sizeof(in.s_addr) /* INADDRSZ */, AF_INET); if (host && host->h_name) return host->h_name; return NULL; } - -#else // __LIBC_DIETLIBC__ +#elif defined(__GLIBC__) #include <alloca.h> #include <sys/socket.h> @@ -210,4 +209,8 @@ int mygethostbyname(char * name, struct in_addr * addr) { return rc; } +#else + +#error "Unsupported C library" + #endif diff --git a/mdk-stage1/frontend.h b/mdk-stage1/frontend.h index 4f2d112b7..3f58a3d3f 100644 --- a/mdk-stage1/frontend.h +++ b/mdk-stage1/frontend.h @@ -21,7 +21,13 @@ #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 + enum return_type { RETURN_OK, RETURN_BACK, RETURN_ERROR }; void init_frontend(char * welcome_msg); diff --git a/mdk-stage1/init-libc-headers.h b/mdk-stage1/init-libc-headers.h index 01761e869..1e6807615 100644 --- a/mdk-stage1/init-libc-headers.h +++ b/mdk-stage1/init-libc-headers.h @@ -35,6 +35,7 @@ #include <sys/wait.h> #include <linux/unistd.h> #include <sys/select.h> +#include <sys/ioctl.h> #ifndef SOCK_STREAM #define SOCK_STREAM 1 diff --git a/mdk-stage1/init.c b/mdk-stage1/init.c index dc4239ac3..73258230a 100644 --- a/mdk-stage1/init.c +++ b/mdk-stage1/init.c @@ -33,7 +33,11 @@ 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:/usr/X11R6/lib:/mnt/usr/X11R6/lib" +#if defined(__x86_64__) || defined(__ppc64__) + ":/lib64:/usr/lib64:/usr/X11R6/lib64:/mnt/lib64:/mnt/usr/lib64:/mnt/usr/X11R6/lib64" +#endif + , "HOME=/", "TERM=linux", "TERMINFO=/etc/terminfo", diff --git a/mdk-stage1/insmod-busybox/Config.h b/mdk-stage1/insmod-busybox/Config.h index 8388416b7..f02ac0253 100644 --- a/mdk-stage1/insmod-busybox/Config.h +++ b/mdk-stage1/insmod-busybox/Config.h @@ -49,10 +49,11 @@ //#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 insmod/lsmod/rmmod for post 2.1 kernels +#define BB_FEATURE_NEW_MODULE_INTERFACE +// +// Support insmod/lsmod/rmmod for pre 2.1 kernels +//#define BB_FEATURE_OLD_MODULE_INTERFACE // // Support module version checking //#define BB_FEATURE_INSMOD_VERSION_CHECKING @@ -126,7 +127,7 @@ #endif // #if defined BB_INSMOD -#ifndef BB_FEATURE_INSMOD_OLD_KERNEL -#define BB_FEATURE_INSMOD_NEW_KERNEL +#if ! defined BB_FEATURE_NEW_MODULE_INTERFACE && ! defined BB_FEATURE_OLD_MODULE_INTERFACE +#define BB_FEATURE_NEW_MODULE_INTERFACE #endif #endif diff --git a/mdk-stage1/insmod-busybox/Makefile b/mdk-stage1/insmod-busybox/Makefile index c8649ae0d..236874f96 100644 --- a/mdk-stage1/insmod-busybox/Makefile +++ b/mdk-stage1/insmod-busybox/Makefile @@ -13,53 +13,31 @@ top_dir = .. include $(top_dir)/Makefile.common -all: insmod insmod-DIET libinsmod.a libinsmod-DIET.a +all: insmod libinsmod.a clean: - rm -f *.o insmod insmod-DIET libinsmod.a libinsmod-DIET.a + rm -f *.o insmod libinsmod.a -FLAGS = -c -Wall -Os -fomit-frame-pointer -D_GNU_SOURCE -DBB_VER='"0.47"' -DBB_BT='"2000.12.06-14:02+0000"' +FLAGS = -c -Wall -Os -fomit-frame-pointer -D_GNU_SOURCE -DBB_VER='"0.60.5"' -DBB_BT='"2003.04.16-15:25+0000"' insmod: insmod-frontend.o insmod.o utility-standalone.o - gcc -o $@ $^ + $(DIET) gcc -o $@ $^ $(STRIPCMD) $@ -insmod-DIET: insmod-frontend-DIET.o insmod-DIET.o utility-standalone-DIET.o - gcc $(DIETLIBC_LDFLAGS_STAGE1) -o $@ $^ $(DIETLIBC_LIBC) - $(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 - -insmod-frontend-DIET.o: insmod-frontend.c busybox.h - gcc $(FLAGS) $(DIETLIBC_INCLUDES) -o $@ insmod-frontend.c + $(DIET) gcc $(FLAGS) $(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 + $(DIET) gcc $(FLAGS) $(INCLUDES) utility.c utility-standalone.o: utility.c busybox.h - gcc $(FLAGS) $(GLIBC_INCLUDES) -o $@ -D_STANDALONE_ utility.c - -utility-standalone-DIET.o: utility.c busybox.h - gcc $(FLAGS) $(DIETLIBC_INCLUDES) -o $@ -D_STANDALONE_ utility.c + $(DIET) gcc $(FLAGS) $(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 - + $(DIET) gcc $(FLAGS) $(INCLUDES) insmod.c diff --git a/mdk-stage1/insmod-busybox/busybox.h b/mdk-stage1/insmod-busybox/busybox.h index a2d620c8b..9e6052fce 100644 --- a/mdk-stage1/insmod-busybox/busybox.h +++ b/mdk-stage1/insmod-busybox/busybox.h @@ -464,4 +464,14 @@ extern int sysinfo (struct sysinfo* info); #define isclr(a,i) (((a)[(i)/NBBY] & (1<<((i)%NBBY))) == 0) #endif +/* Merge from busybox 0.60.5 */ +#define error_msg errorMsg +#define perror_msg(FORMAT,...) error_msg(FORMAT ": %s", ## __VA_ARGS__, strerror(errno)) +#define recursive_action recursiveAction + +#define safe_strncpy(DST, SRC, SIZE) do { \ + (DST)[SIZE-1] = '\0'; \ + return strncpy((DST), (SRC),(SIZE)-1); \ +} while (0) + #endif /* _BB_INTERNAL_H_ */ diff --git a/mdk-stage1/insmod-busybox/insmod.c b/mdk-stage1/insmod-busybox/insmod.c index bdf7ba5f7..e86054f97 100644 --- a/mdk-stage1/insmod-busybox/insmod.c +++ b/mdk-stage1/insmod-busybox/insmod.c @@ -2,16 +2,40 @@ /* * 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> + * This version of insmod supports x86, ARM, SH3/4, powerpc, m68k, + * MIPS, and x86-64. + * + * + * Copyright (C) 1999,2000 by Lineo, inc. and Erik Andersen + * Copyright (C) 1999-2002 Erik Andersen <andersee@debian.org> + * Written by Erik Andersen 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. + * and (theoretically) SH3. I have only tested SH4 in little endian mode. + * + * Modified by Alcove, Julien Gaulmin <julien.gaulmin@alcove.fr> and + * Nicolas Ferre <nicolas.ferre@alcove.fr> to support ARM7TDMI. Only + * very minor changes required to also work with StrongArm and presumably + * all ARM based systems. + * + * Magnus Damm <damm@opensource.se> 22-May-2002. + * The plt and got code are now using the same structs. + * Added generic linked list code to fully support PowerPC. + * Replaced the mess in arch_apply_relocation() with architecture blocks. + * The arch_create_got() function got cleaned up with architecture blocks. + * These blocks should be easy maintain and sync with obj_xxx.c in modutils. + * + * Magnus Damm <damm@opensource.se> added PowerPC support 20-Feb-2001. + * PowerPC specific code stolen from modutils-2.3.16, + * written by Paul Mackerras, Copyright 1996, 1997 Linux International. + * I've only tested the code on mpc8xx platforms in big-endian mode. + * Did some cleanup and added BB_USE_xxx_ENTRIES... + * + * Quinn Jensen <jensenq@lineo.com> added MIPS support 23-Feb-2001. + * based on modutils-2.4.2 + * MIPS specific support for Elf loading and relocation. + * Copyright 1996, 1997 Linux International. + * Contributed by Ralf Baechle <ralf@gnu.ai.mit.edu> * * Based almost entirely on the Linux modutils-2.3.11 implementation. * Copyright 1996, 1997 Linux International. @@ -37,7 +61,6 @@ */ #include "../insmod.h" -#include "busybox.h" #include <stdlib.h> #include <stdio.h> #include <stddef.h> @@ -46,7 +69,133 @@ #include <dirent.h> #include <ctype.h> #include <assert.h> +#include <string.h> +#include <fcntl.h> #include <sys/utsname.h> +#include "busybox.h" + +#ifdef BB_FEATURE_NEW_MODULE_INTERFACE +# undef BB_FEATURE_OLD_MODULE_INTERFACE +# define new_sys_init_module init_module +#else +# define old_sys_init_module init_module +#endif + +#ifdef BB_FEATURE_INSMOD_LOADINKMEM +#define LOADBITS 0 +#else +#define LOADBITS 1 +#endif + +#if defined(__arm__) +#define BB_USE_PLT_ENTRIES +#define BB_PLT_ENTRY_SIZE 8 +#define BB_USE_GOT_ENTRIES +#define BB_GOT_ENTRY_SIZE 8 +#define BB_USE_SINGLE + +#define MATCH_MACHINE(x) (x == EM_ARM) +#define SHT_RELM SHT_REL +#define Elf32_RelM Elf32_Rel +#define ELFCLASSM ELFCLASS32 +#endif + +#if defined(__i386__) +#define BB_USE_GOT_ENTRIES +#define BB_GOT_ENTRY_SIZE 4 +#define BB_USE_SINGLE + +#ifndef EM_486 +#define MATCH_MACHINE(x) (x == EM_386) +#else +#define MATCH_MACHINE(x) (x == EM_386 || x == EM_486) +#endif + +#define SHT_RELM SHT_REL +#define Elf32_RelM Elf32_Rel +#define ELFCLASSM ELFCLASS32 +#endif + +#if defined(__x86_64__) +#define BB_USE_GOT_ENTRIES +#define BB_GOT_ENTRY_SIZE 8 +#define BB_USE_SINGLE + +#define MATCH_MACHINE(x) (x == EM_X86_64) + +#define SHT_RELM SHT_RELA +#define Elf64_RelM Elf64_Rela +#define ELFCLASSM ELFCLASS64 +#endif + +#if defined(__mc68000__) +#define BB_USE_GOT_ENTRIES +#define BB_GOT_ENTRY_SIZE 4 +#define BB_USE_SINGLE + +#define MATCH_MACHINE(x) (x == EM_68K) +#define SHT_RELM SHT_RELA +#define Elf32_RelM Elf32_Rela +#endif + +#if defined(__mips__) +/* 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 +#define ELFCLASSM ELFCLASS32 +#define ARCHDATAM "__dbe_table" +#endif + +#if defined(__powerpc__) +#define BB_USE_PLT_ENTRIES +#define BB_PLT_ENTRY_SIZE 16 +#define BB_USE_PLT_LIST +#define BB_LIST_ARCHTYPE ElfW(Addr) +#define BB_USE_LIST + +#define MATCH_MACHINE(x) (x == EM_PPC) +#define SHT_RELM SHT_RELA +#define Elf32_RelM Elf32_Rela +#define ELFCLASSM ELFCLASS32 +#define ARCHDATAM "__ftr_fixup" +#endif + +#if defined(__sh__) +#define BB_USE_GOT_ENTRIES +#define BB_GOT_ENTRY_SIZE 4 +#define BB_USE_SINGLE + +#define MATCH_MACHINE(x) (x == EM_SH) +#define SHT_RELM SHT_RELA +#define Elf32_RelM Elf32_Rela +#define ELFCLASSM ELFCLASS32 + +/* 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 +#endif + +#ifndef SHT_RELM +#error Sorry, but insmod.c does not yet support this architecture... +#endif //---------------------------------------------------------------------------- //--------modutils module.h, lines 45-242 @@ -75,9 +224,7 @@ #ifndef MODUTILS_MODULE_H -#define MODUTILS_MODULE_H 1 - -#ident "$Id$" +#define MODUTILS_MODULE_H /* 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 @@ -134,7 +281,7 @@ struct old_module }; /* Sent to init_module(2) or'ed into the code size parameter. */ -#define OLD_MOD_AUTOCLEAN 0x40000000 /* big enough, but no sign problems... */ +static const int 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, @@ -157,9 +304,9 @@ int old_sys_init_module(const char *name, char *code, unsigned codesize, #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 +static const int tgt_sizeof_long = 8; +static const int tgt_sizeof_char_p = 8; +static const int tgt_sizeof_void_p = 8; #define tgt_long long long #endif @@ -210,8 +357,23 @@ struct new_module unsigned tgt_long persist_end; unsigned tgt_long can_unload; unsigned tgt_long runsize; +#ifdef BB_FEATURE_NEW_MODULE_INTERFACE + const char *kallsyms_start; /* All symbols for kernel debugging */ + const char *kallsyms_end; + const char *archdata_start; /* arch specific data for module */ + const char *archdata_end; + const char *kernel_data; /* Reserved for kernel internal use */ +#endif }; +#ifdef ARCHDATAM +#define ARCHDATA_SEC_NAME ARCHDATAM +#else +#define ARCHDATA_SEC_NAME "__archdata" +#endif +#define KALLSYMS_SEC_NAME "__kallsyms" + + struct new_module_info { unsigned long addr; @@ -221,11 +383,11 @@ struct new_module_info }; /* 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 +static const int NEW_MOD_RUNNING = 1; +static const int NEW_MOD_DELETED = 2; +static const int NEW_MOD_AUTOCLEAN = 4; +static const int NEW_MOD_VISITED = 8; +static const int 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, @@ -233,11 +395,11 @@ int query_module(const char *name, int which, void *buf, size_t bufsize, /* 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 +static const int QM_MODULES = 1; +static const int QM_DEPS = 2; +static const int QM_REFS = 3; +static const int QM_SYMBOLS = 4; +static const int QM_INFO = 5; /*======================================================================*/ /* The system calls unchanged between 2.0 and 2.1. */ @@ -281,52 +443,18 @@ int delete_module(const char *); #ifndef MODUTILS_OBJ_H -#define MODUTILS_OBJ_H 1 - -#ident "$Id$" +static const int MODUTILS_OBJ_H = 1; /* The relocatable object is manipulated using elfin types. */ #include <stdio.h> #include <elf.h> +#include <endian.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 - +#if __BYTE_ORDER == __LITTLE_ENDIAN +#define ELFDATAM ELFDATA2LSB +#elif __BYTE_ORDER == __BIG_ENDIAN +#define ELFDATAM ELFDATA2MSB #endif #ifndef ElfW @@ -421,78 +549,79 @@ struct obj_symbol_patch /* Generic object manipulation routines. */ -unsigned long obj_elf_hash(const char *); - -unsigned long obj_elf_hash_n(const char *, unsigned long len); +static unsigned long obj_elf_hash(const char *); -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); +static unsigned long obj_elf_hash_n(const char *, unsigned long len); -struct obj_symbol *obj_find_symbol (struct obj_file *f, +static struct obj_symbol *obj_find_symbol (struct obj_file *f, const char *name); -ElfW(Addr) obj_symbol_final_value(struct obj_file *f, +static ElfW(Addr) obj_symbol_final_value(struct obj_file *f, struct obj_symbol *sym); -void obj_set_symbol_compare(struct obj_file *f, +#ifdef BB_FEATURE_INSMOD_VERSION_CHECKING +static void obj_set_symbol_compare(struct obj_file *f, int (*cmp)(const char *, const char *), unsigned long (*hash)(const char *)); +#endif -struct obj_section *obj_find_section (struct obj_file *f, +static struct obj_section *obj_find_section (struct obj_file *f, const char *name); -void obj_insert_section_load_order (struct obj_file *f, +static 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, +static 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, +static 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); +static void *obj_extend_section (struct obj_section *sec, unsigned long more); -int obj_string_patch(struct obj_file *f, int secidx, ElfW(Addr) offset, +static 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, +#ifdef BB_FEATURE_NEW_MODULE_INTERFACE +static int obj_symbol_patch(struct obj_file *f, int secidx, ElfW(Addr) offset, struct obj_symbol *sym); +#endif -int obj_check_undefineds(struct obj_file *f); +static int obj_check_undefineds(struct obj_file *f); -void obj_allocate_commons(struct obj_file *f); +static void obj_allocate_commons(struct obj_file *f); -unsigned long obj_load_size (struct obj_file *f); +static unsigned long obj_load_size (struct obj_file *f); -int obj_relocate (struct obj_file *f, ElfW(Addr) base); +static int obj_relocate (struct obj_file *f, ElfW(Addr) base); -struct obj_file *obj_load(FILE *f); +static struct obj_file *obj_load(FILE *f, int loadprogbits); -int obj_create_image (struct obj_file *f, char *image); +static int obj_create_image (struct obj_file *f, char *image); /* Architecture specific manipulation routines. */ -struct obj_file *arch_new_file (void); +static struct obj_file *arch_new_file (void); -struct obj_section *arch_new_section (void); +static struct obj_section *arch_new_section (void); -struct obj_symbol *arch_new_symbol (void); +static struct obj_symbol *arch_new_symbol (void); -enum obj_reloc arch_apply_relocation (struct obj_file *f, +static 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); +static void arch_create_got (struct obj_file *f); -struct new_module; -int arch_init_module (struct obj_file *f, struct new_module *); +#ifdef BB_FEATURE_NEW_MODULE_INTERFACE +static int arch_init_module (struct obj_file *f, struct new_module *); +#endif #endif /* obj.h */ //---------------------------------------------------------------------------- @@ -504,41 +633,75 @@ int arch_init_module (struct obj_file *f, struct new_module *); #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 +static const int STRVERSIONLEN = 32; /*======================================================================*/ -int flag_force_load = 1; -int flag_autoclean = 0; -int flag_export = 1; +static const int flag_force_load = 1; +static const int flag_autoclean = 0; +static const int flag_quiet = 0; +static const 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 */ +#if defined(BB_USE_LIST) + +struct arch_list_entry +{ + struct arch_list_entry *next; + BB_LIST_ARCHTYPE addend; + int offset; + int inited : 1; +}; + +#endif + +#if defined(BB_USE_SINGLE) -struct arch_got_entry { +struct arch_single_entry +{ int offset; - unsigned offset_done:1; - unsigned reloc_done:1; + int inited : 1; + int allocated : 1; }; +#endif + +#if defined(__mips__) +struct mips_hi16 +{ + struct mips_hi16 *next; + Elf32_Addr *addr; + Elf32_Addr value; +}; +#endif + struct arch_file { struct obj_file root; +#if defined(BB_USE_PLT_ENTRIES) + struct obj_section *plt; +#endif +#if defined(BB_USE_GOT_ENTRIES) struct obj_section *got; +#endif +#if defined(__mips__) + struct mips_hi16 *mips_hi16_list; +#endif }; struct arch_symbol { struct obj_symbol root; - struct arch_got_entry gotent; +#if defined(BB_USE_PLT_ENTRIES) +#if defined(BB_USE_PLT_LIST) + struct arch_list_entry *pltent; +#else + struct arch_single_entry pltent; +#endif +#endif +#if defined(BB_USE_GOT_ENTRIES) + struct arch_single_entry gotent; +#endif }; @@ -550,308 +713,736 @@ struct external_module { struct new_module_symbol *syms; }; -struct new_module_symbol *ksyms; -size_t nksyms; +static struct new_module_symbol *ksyms; +static 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 +static struct external_module *ext_modules; +static int n_ext_modules; +static int n_ext_modules_used; 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) +#ifndef FILENAME_MAX +#define FILENAME_MAX 4095 #endif -static char m_filename[BUFSIZ + 1] = "\0"; -static char m_fullName[BUFSIZ + 1] = "\0"; -/*======================================================================*/ +static char m_filename[FILENAME_MAX]; +static char m_fullName[FILENAME_MAX]; + /*======================================================================*/ -struct obj_file *arch_new_file(void) +static struct obj_file *arch_new_file(void) { struct arch_file *f; f = xmalloc(sizeof(*f)); - f->got = NULL; + + memset(f, 0, sizeof(*f)); + return &f->root; } -struct obj_section *arch_new_section(void) +static struct obj_section *arch_new_section(void) { return xmalloc(sizeof(struct obj_section)); } -struct obj_symbol *arch_new_symbol(void) +static struct obj_symbol *arch_new_symbol(void) { struct arch_symbol *sym; sym = xmalloc(sizeof(*sym)); - memset(&sym->gotent, 0, sizeof(sym->gotent)); + + memset(sym, 0, sizeof(*sym)); + return &sym->root; } -enum obj_reloc +static 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 + ElfW(RelM) *rel, ElfW(Addr) v) { struct arch_file *ifile = (struct arch_file *) f; + enum obj_reloc ret = obj_reloc_ok; + ElfW(Addr) *loc = (ElfW(Addr) *) (targsec->contents + rel->r_offset); + ElfW(Addr) dot = targsec->header.sh_addr + rel->r_offset; +#if defined(BB_USE_GOT_ENTRIES) || defined(BB_USE_PLT_ENTRIES) struct arch_symbol *isym = (struct arch_symbol *) sym; +#endif +#if defined(BB_USE_GOT_ENTRIES) + ElfW(Addr) got = ifile->got ? ifile->got->header.sh_addr : 0; +#endif +#if defined(BB_USE_PLT_ENTRIES) + ElfW(Addr) plt = ifile->plt ? ifile->plt->header.sh_addr : 0; + unsigned long *ip; +#if defined(BB_USE_PLT_LIST) + struct arch_list_entry *pe; +#else + struct arch_single_entry *pe; +#endif +#endif - 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; + switch (ELF32_R_TYPE(rel->r_info)) { - enum obj_reloc ret = obj_reloc_ok; +#if defined(__arm__) + case R_ARM_NONE: + break; - switch (ELF32_R_TYPE(rel->r_info)) { + case R_ARM_ABS32: + *loc += v; + break; + + case R_ARM_GOT32: + goto bb_use_got; + + case R_ARM_GOTPC: + /* relative reloc, always to _GLOBAL_OFFSET_TABLE_ + * (which is .got) similar to branch, + * but is full 32 bits relative */ + + assert(got); + *loc += got - dot; + break; + + case R_ARM_PC24: + case R_ARM_PLT32: + goto bb_use_plt; + + case R_ARM_GOTOFF: /* address relative to the got */ + assert(got); + *loc += v - got; + break; + +#elif defined(__i386__) -/* 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: + 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; + goto bb_use_got; + + case R_386_GOTOFF: + assert(got != 0); + *loc += v - got; + break; + +#elif defined(__x86_64__) + + case R_X86_64_NONE: + break; + + case R_X86_64_64: + *loc += v; + break; + + case R_X86_64_32: + *(unsigned int *) loc += v; + break; + + case R_X86_64_32S: + *(signed int *) loc += v; + break; + + case R_X86_64_16: + *(unsigned short *) loc += v; + break; + + case R_X86_64_8: + *(unsigned char *) loc += v; + break; + + case R_X86_64_PC32: + *(unsigned int *) loc += v - dot; + break; + + case R_X86_64_PC16: + *(unsigned short *) loc += v - dot; + break; + + case R_X86_64_PC8: + *(unsigned char *) loc += v - dot; + break; + + case R_X86_64_GLOB_DAT: + case R_X86_64_JUMP_SLOT: + *loc = v; + break; + + case R_X86_64_RELATIVE: + *loc += f->baseaddr; + break; + + case R_X86_64_GOT32: + case R_X86_64_GOTPCREL: + goto bb_use_got; + +#elif defined(__mc68000__) + + case R_68K_NONE: + break; + + case R_68K_32: + *loc += v; + break; + + case R_68K_8: + if (v > 0xff) { + ret = obj_reloc_overflow; } - *loc += isym->gotent.offset; + *(char *)loc = v; break; -#endif -#if defined(__sh__) - case R_SH_GOTOFF: -#else - case R_386_GOTOFF: -#endif + case R_68K_16: + if (v > 0xffff) { + ret = obj_reloc_overflow; + } + *(short *)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_GLOB_DAT: + case R_68K_JMP_SLOT: + *loc = v; + break; + + case R_68K_RELATIVE: + *(int *)loc += f->baseaddr; + break; + + case R_68K_GOT32: + goto bb_use_got; + + case R_68K_GOTOFF: assert(got != 0); *loc += v - got; break; +#elif defined(__mips__) + + 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 = ifile->mips_hi16_list; + ifile->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 (ifile->mips_hi16_list != NULL) { + struct mips_hi16 *l; + + l = ifile->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; + } + + ifile->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; + } + +#elif defined(__powerpc__) + + 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: + goto bb_use_plt; + + case R_PPC_REL32: + *loc = v - dot; + break; + + case R_PPC_ADDR32: + *loc = v; + break; + +#elif defined(__sh__) + + case R_SH_NONE: + break; + + case R_SH_DIR32: + *loc += v; + break; + + case R_SH_REL32: + *loc += v - dot; + break; + + case R_SH_PLT32: + *loc = v - dot; + break; + + case R_SH_GLOB_DAT: + case R_SH_JMP_SLOT: + *loc = v; + break; + + case R_SH_RELATIVE: + *loc = f->baseaddr + rel->r_addend; + break; + + case R_SH_GOTPC: + assert(got != 0); + *loc = got - dot + rel->r_addend; + break; + + case R_SH_GOT32: + goto bb_use_got; + + case R_SH_GOTOFF: + assert(got != 0); + *loc = v - got; + break; + +#endif + default: + printf("Warning: unhandled reloc %d\n",(int)ELF32_R_TYPE(rel->r_info)); ret = obj_reloc_unhandled; break; + +#if defined(BB_USE_PLT_ENTRIES) + + bb_use_plt: + + /* find the plt entry and initialize it if necessary */ + assert(isym != NULL); + +#if defined(BB_USE_PLT_LIST) + for (pe = isym->pltent; pe != NULL && pe->addend != rel->r_addend;) + pe = pe->next; + assert(pe != NULL); +#else + pe = &isym->pltent; +#endif + + if (! pe->inited) { + ip = (unsigned long *) (ifile->plt->contents + pe->offset); + + /* generate some machine code */ + +#if defined(__arm__) + ip[0] = 0xe51ff004; /* ldr pc,[pc,#-4] */ + ip[1] = v; /* sym@ */ +#endif +#if defined(__powerpc__) + 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 */ +#endif + 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; + + /* merge the offset into the instruction. */ +#if defined(__arm__) + /* Convert to words. */ + v >>= 2; + + *loc = (*loc & ~0x00ffffff) | ((v + *loc) & 0x00ffffff); +#endif +#if defined(__powerpc__) + *loc = (*loc & ~0x03fffffc) | (v & 0x03fffffc); +#endif + break; +#endif /* BB_USE_PLT_ENTRIES */ + +#if defined(BB_USE_GOT_ENTRIES) + bb_use_got: + + assert(isym != NULL); + /* needs an entry in the .got: set it, once */ + if (!isym->gotent.inited) { + isym->gotent.inited = 1; + *(ElfW(Addr) *) (ifile->got->contents + isym->gotent.offset) = v; + } + /* make the reloc with_respect_to_.got */ +#if defined(__sh__) + *loc += isym->gotent.offset + rel->r_addend; +#elif defined(__i386__) || defined(__arm__) || defined(__mc68000__) + *loc += isym->gotent.offset; +#elif defined(__x86_64__) + /* XXX are these really correct? */ + if (ELF64_R_TYPE(rel->r_info) == R_X86_64_GOTPCREL) + *(unsigned int *) loc += v + isym->gotent.offset; + else + *loc += isym->gotent.offset; +#endif + break; + +#endif /* BB_USE_GOT_ENTRIES */ } return ret; } -int arch_create_got(struct obj_file *f) +#if defined(BB_USE_LIST) + +static int arch_list_add(ElfW(RelM) *rel, struct arch_list_entry **list, + int offset, int size) { - struct arch_file *ifile = (struct arch_file *) f; - int i, n, offset = 0, gotneeded = 0; + struct arch_list_entry *pe; + + for (pe = *list; pe != NULL; pe = pe->next) { + if (pe->addend == rel->r_addend) { + break; + } + } + + if (pe == NULL) { + pe = xmalloc(sizeof(struct arch_list_entry)); + pe->next = *list; + pe->addend = rel->r_addend; + pe->offset = offset; + pe->inited = 0; + *list = pe; + return size; + } + return 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; +#if defined(BB_USE_SINGLE) - symsec = ifile->root.sections[relsec->header.sh_link]; - strsec = ifile->root.sections[symsec->header.sh_link]; +static int arch_single_init(ElfW(RelM) *rel, struct arch_single_entry *single, + int offset, int size) +{ + if (single->allocated == 0) { + single->allocated = 1; + single->offset = offset; + single->inited = 0; + return size; + } + return 0; +} +#endif -#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)); +#if defined(BB_USE_GOT_ENTRIES) || defined(BB_USE_PLT_ENTRIES) + +static struct obj_section *arch_xsect_init(struct obj_file *f, char *name, + int offset, int size) +{ + struct obj_section *myrelsec = obj_find_section(f, name); + + if (offset == 0) { + offset += size; + } + + if (myrelsec) { + obj_extend_section(myrelsec, offset); + } else { + myrelsec = obj_create_alloced_section(f, name, + size, offset); + assert(myrelsec); + } + + return myrelsec; +} + +#endif + +static void arch_create_got(struct obj_file *f) +{ +#if defined(BB_USE_GOT_ENTRIES) || defined(BB_USE_PLT_ENTRIES) + struct arch_file *ifile = (struct arch_file *) f; + int i; +#if defined(BB_USE_GOT_ENTRIES) + int got_offset = 0, got_needed = 0, got_allocate; +#endif +#if defined(BB_USE_PLT_ENTRIES) + int plt_offset = 0, plt_needed = 0, plt_allocate; #endif - symtab = (Elf32_Sym *) symsec->contents; + struct obj_section *relsec, *symsec, *strsec; + ElfW(RelM) *rel, *relend; + ElfW(Sym) *symtab, *extsym; + const char *strtab, *name; + struct arch_symbol *intsym; + + for (i = 0; i < f->header.e_shnum; ++i) { + relsec = f->sections[i]; + + if (relsec->header.sh_type != SHT_RELM) + continue; + + symsec = f->sections[relsec->header.sh_link]; + 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) { - Elf32_Sym *extsym; - struct arch_symbol *intsym; - const char *name; + extsym = &symtab[ELF32_R_SYM(rel->r_info)]; + +#if defined(BB_USE_GOT_ENTRIES) + got_allocate = 0; +#endif +#if defined(BB_USE_PLT_ENTRIES) + plt_allocate = 0; +#endif switch (ELF32_R_TYPE(rel->r_info)) { -#if defined(__sh__) - case R_SH_GOTPC: - case R_SH_GOTOFF: -#else + +#if defined(__arm__) + + case R_ARM_PC24: + case R_ARM_PLT32: + plt_allocate = 1; + break; + + case R_ARM_GOTOFF: + case R_ARM_GOTPC: + got_needed = 1; + continue; + + case R_ARM_GOT32: + got_allocate = 1; + break; + +#elif defined(__i386__) + case R_386_GOTPC: case R_386_GOTOFF: -#endif - gotneeded = 1; - default: + got_needed = 1; continue; -#if defined(__sh__) - case R_SH_GOT32: -#else case R_386_GOT32: -#endif + got_allocate = 1; + break; + +#elif defined(__x86_64__) + + case R_X86_64_GOTPCREL: + case R_X86_64_GOT32: + got_needed = 1; + continue; + +#elif defined(__powerpc__) + + case R_PPC_REL24: + plt_allocate = 1; + break; + +#elif defined(__mc68000__) + + case R_68K_GOT32: + got_allocate = 1; + break; + + case R_68K_GOTOFF: + got_needed = 1; + continue; + +#elif defined(__sh__) + + case R_SH_GOT32: + got_allocate = 1; break; + + case R_SH_GOTPC: + case R_SH_GOTOFF: + got_needed = 1; + continue; + +#endif + default: + continue; } - extsym = &symtab[ELF32_R_SYM(rel->r_info)]; - if (extsym->st_name) + if (extsym->st_name != 0) { name = strtab + extsym->st_name; - else + } 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; } + intsym = (struct arch_symbol *) obj_find_symbol(f, name); +#if defined(BB_USE_GOT_ENTRIES) + if (got_allocate) { + got_offset += arch_single_init( + rel, &intsym->gotent, + got_offset, BB_GOT_ENTRY_SIZE); + + got_needed = 1; + } +#endif +#if defined(BB_USE_PLT_ENTRIES) + if (plt_allocate) { +#if defined(BB_USE_PLT_LIST) + plt_offset += arch_list_add( + rel, &intsym->pltent, + plt_offset, BB_PLT_ENTRY_SIZE); +#else + plt_offset += arch_single_init( + rel, &intsym->pltent, + plt_offset, BB_PLT_ENTRY_SIZE); +#endif + plt_needed = 1; + } +#endif } } - if (offset > 0 || gotneeded) - ifile->got = - obj_create_alloced_section(&ifile->root, ".got", 4, offset); +#if defined(BB_USE_GOT_ENTRIES) + if (got_needed) { + ifile->got = arch_xsect_init(f, ".got", got_offset, + BB_GOT_ENTRY_SIZE); + } +#endif - return 1; +#if defined(BB_USE_PLT_ENTRIES) + if (plt_needed) { + ifile->plt = arch_xsect_init(f, ".plt", plt_offset, + BB_PLT_ENTRY_SIZE); + } +#endif + +#endif /* defined(BB_USE_GOT_ENTRIES) || defined(BB_USE_PLT_ENTRIES) */ } -int arch_init_module(struct obj_file *f, struct new_module *mod) +#ifdef BB_FEATURE_NEW_MODULE_INTERFACE +static int arch_init_module(struct obj_file *f, struct new_module *mod) { return 1; } +#endif /*======================================================================*/ /* Standard ELF hash function. */ -inline unsigned long obj_elf_hash_n(const char *name, unsigned long n) +static inline unsigned long obj_elf_hash_n(const char *name, unsigned long n) { unsigned long h = 0; unsigned long g; @@ -869,38 +1460,12 @@ inline unsigned long obj_elf_hash_n(const char *name, unsigned long n) return h; } -unsigned long obj_elf_hash(const char *name) +static 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) @@ -926,7 +1491,7 @@ static unsigned long ncv_symbol_hash(const char *str) return obj_elf_hash_n(str, len); } -void +static void obj_set_symbol_compare(struct obj_file *f, int (*cmp) (const char *, const char *), unsigned long (*hash) (const char *)) @@ -954,8 +1519,8 @@ obj_set_symbol_compare(struct obj_file *f, #endif /* BB_FEATURE_INSMOD_VERSION_CHECKING */ - -struct obj_symbol *obj_add_symbol(struct obj_file *f, const char *name, +static 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) @@ -1020,7 +1585,7 @@ struct obj_symbol *obj_add_symbol(struct obj_file *f, const char *name, /* 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); + error_msg("%s multiply defined", name); return sym; } } @@ -1031,8 +1596,13 @@ struct obj_symbol *obj_add_symbol(struct obj_file *f, const char *name, f->symtab[hash] = sym; sym->ksymidx = -1; - if (ELFW(ST_BIND) (info) == STB_LOCAL) - f->local_symtab[symidx] = sym; + if (ELFW(ST_BIND)(info) == STB_LOCAL && symidx != -1) { + if (symidx >= f->local_symtab_size) + error_msg("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; @@ -1044,7 +1614,8 @@ struct obj_symbol *obj_add_symbol(struct obj_file *f, const char *name, return sym; } -struct obj_symbol *obj_find_symbol(struct obj_file *f, const char *name) +static 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; @@ -1056,7 +1627,7 @@ struct obj_symbol *obj_find_symbol(struct obj_file *f, const char *name) return NULL; } -ElfW(Addr) +static ElfW(Addr) obj_symbol_final_value(struct obj_file * f, struct obj_symbol * sym) { if (sym) { @@ -1070,7 +1641,7 @@ ElfW(Addr) } } -struct obj_section *obj_find_section(struct obj_file *f, const char *name) +static struct obj_section *obj_find_section(struct obj_file *f, const char *name) { int i, n = f->header.e_shnum; @@ -1103,7 +1674,7 @@ static int obj_load_order_prio(struct obj_section *a) return ac; } -void +static void obj_insert_section_load_order(struct obj_file *f, struct obj_section *sec) { struct obj_section **p; @@ -1115,7 +1686,7 @@ obj_insert_section_load_order(struct obj_file *f, struct obj_section *sec) *p = sec; } -struct obj_section *obj_create_alloced_section(struct obj_file *f, +static struct obj_section *obj_create_alloced_section(struct obj_file *f, const char *name, unsigned long align, unsigned long size) @@ -1141,7 +1712,7 @@ struct obj_section *obj_create_alloced_section(struct obj_file *f, return sec; } -struct obj_section *obj_create_alloced_section_first(struct obj_file *f, +static struct obj_section *obj_create_alloced_section_first(struct obj_file *f, const char *name, unsigned long align, unsigned long size) @@ -1170,15 +1741,16 @@ struct obj_section *obj_create_alloced_section_first(struct obj_file *f, return sec; } -void *obj_extend_section(struct obj_section *sec, unsigned long more) +static 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); + if (more) { + 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. */ @@ -1283,7 +1855,7 @@ old_process_module_arguments(struct obj_file *f, int argc, char **argv) /* 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); + error_msg("symbol for parameter %s not found", p); return 0; } @@ -1296,7 +1868,7 @@ old_process_module_arguments(struct obj_file *f, int argc, char **argv) str = alloca(strlen(q)); for (r = str, q++; *q != '"'; ++q, ++r) { if (*q == '\0') { - errorMsg("improperly terminated string argument for %s", p); + error_msg("improperly terminated string argument for %s", p); return 0; } else if (*q == '\\') switch (*++q) { @@ -1355,19 +1927,19 @@ old_process_module_arguments(struct obj_file *f, int argc, char **argv) while (*q++ == ','); } else { char *contents = f->sections[sym->secidx]->contents; - char *loc = contents + sym->value; + char *myloc = 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 *); + obj_string_patch(f, sym->secidx, myloc - contents, q); + myloc += sizeof(char *); q = r; } /* last part */ - obj_string_patch(f, sym->secidx, loc - contents, q); + obj_string_patch(f, sym->secidx, myloc - contents, q); } argc--, argv++; @@ -1395,7 +1967,7 @@ old_get_module_version(struct obj_file *f, char str[STRVERSIONLEN]) return -1; p = f->sections[sym->secidx]->contents + sym->value; - strncpy(str, p, STRVERSIONLEN); + safe_strncpy(str, p, STRVERSIONLEN); a = strtoul(p, &p, 10); if (*p != '.') @@ -1412,7 +1984,7 @@ old_get_module_version(struct obj_file *f, char str[STRVERSIONLEN]) #endif /* BB_FEATURE_INSMOD_VERSION_CHECKING */ -#ifdef BB_FEATURE_INSMOD_OLD_KERNEL +#ifdef BB_FEATURE_OLD_MODULE_INTERFACE /* Fetch all the symbols and divvy them up as appropriate for the modules. */ @@ -1424,15 +1996,18 @@ static int old_get_kernel_symbols(const char *m_name) int nks, nms, nmod, i; nks = get_kernel_syms(NULL); - if (nks < 0) { - errorMsg("get_kernel_syms: %s: %s", m_name, strerror(errno)); + if (nks <= 0) { + if (nks) + perror_msg("get_kernel_syms: %s", m_name); + else + error_msg("No kernel symbols"); return 0; } ks = k = xmalloc(nks * sizeof(*ks)); if (get_kernel_syms(ks) != nks) { - logperror("inconsistency with get_kernel_syms -- is someone else " + perror("inconsistency with get_kernel_syms -- is someone else " "playing with modules?"); free(ks); return 0; @@ -1445,7 +2020,6 @@ static int old_get_kernel_symbols(const char *m_name) 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) @@ -1567,7 +2141,8 @@ old_init_module(const char *m_name, struct obj_file *f, ksym->name = (unsigned long) str - (unsigned long) symtab; - str = stpcpy(str, sym->name) + 1; + strcpy(str, sym->name); + str += strlen(sym->name) + 1; ksym++; } } @@ -1606,7 +2181,7 @@ old_init_module(const char *m_name, struct obj_file *f, m_size | (flag_autoclean ? OLD_MOD_AUTOCLEAN : 0), &routines, symtab); if (ret) - errorMsg("init_module: %s: %s", m_name, strerror(errno)); + perror_msg("init_module: %s", m_name); free(image); free(symtab); @@ -1619,7 +2194,7 @@ old_init_module(const char *m_name, struct obj_file *f, #define old_create_mod_use_count(x) TRUE #define old_init_module(x, y, z) TRUE -#endif /* BB_FEATURE_INSMOD_OLD_KERNEL */ +#endif /* BB_FEATURE_OLD_MODULE_INTERFACE */ @@ -1649,7 +2224,7 @@ new_process_module_arguments(struct obj_file *f, int argc, char **argv) p = get_modinfo_value(f, key); key += 5; if (p == NULL) { - errorMsg("invalid parameter %s", key); + error_msg("invalid parameter %s", key); return 0; } @@ -1657,7 +2232,7 @@ new_process_module_arguments(struct obj_file *f, int argc, char **argv) /* 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); + error_msg("symbol for parameter %s not found", key); return 0; } @@ -1685,7 +2260,7 @@ new_process_module_arguments(struct obj_file *f, int argc, char **argv) str = alloca(strlen(q)); for (r = str, q++; *q != '"'; ++q, ++r) { if (*q == '\0') { - errorMsg("improperly terminated string argument for %s", + error_msg("improperly terminated string argument for %s", key); return 0; } else if (*q == '\\') @@ -1779,7 +2354,7 @@ new_process_module_arguments(struct obj_file *f, int argc, char **argv) /* 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" + error_msg("parameter type 'c' for %s must be followed by" " the maximum size", key); return 0; } @@ -1787,7 +2362,7 @@ new_process_module_arguments(struct obj_file *f, int argc, char **argv) /* Check length */ if (strlen(str) >= charssize) { - errorMsg("string too long for %s (max %ld)", key, + error_msg("string too long for %s (max %ld)", key, charssize - 1); return 0; } @@ -1816,7 +2391,7 @@ new_process_module_arguments(struct obj_file *f, int argc, char **argv) break; default: - errorMsg("unknown parameter type '%c' for %s", *p, key); + error_msg("unknown parameter type '%c' for %s", *p, key); return 0; } } @@ -1835,21 +2410,21 @@ new_process_module_arguments(struct obj_file *f, int argc, char **argv) case ',': if (++n > max) { - errorMsg("too many values for %s (max %d)", key, max); + error_msg("too many values for %s (max %d)", key, max); return 0; } ++q; break; default: - errorMsg("invalid argument syntax for %s", key); + error_msg("invalid argument syntax for %s", key); return 0; } } end_of_arg: if (n < min) { - errorMsg("too few values for %s (min %d)", key, min); + error_msg("too few values for %s (min %d)", key, min); return 0; } @@ -1880,7 +2455,7 @@ new_get_module_version(struct obj_file *f, char str[STRVERSIONLEN]) p = get_modinfo_value(f, "kernel_version"); if (p == NULL) return -1; - strncpy(str, p, STRVERSIONLEN); + safe_strncpy(str, p, STRVERSIONLEN); a = strtoul(p, &p, 10); if (*p != '.') @@ -1898,7 +2473,7 @@ new_get_module_version(struct obj_file *f, char str[STRVERSIONLEN]) #endif /* BB_FEATURE_INSMOD_VERSION_CHECKING */ -#ifdef BB_FEATURE_INSMOD_NEW_KERNEL +#ifdef BB_FEATURE_NEW_MODULE_INTERFACE /* Fetch the loaded modules, and all currently exported symbols. */ @@ -1914,57 +2489,59 @@ static int new_get_kernel_symbols(void) module_names = xmalloc(bufsize = 256); retry_modules_load: if (query_module(NULL, QM_MODULES, module_names, bufsize, &ret)) { - if (errno == ENOSPC) { + if (errno == ENOSPC && bufsize < ret) { module_names = xrealloc(module_names, bufsize = ret); goto retry_modules_load; } - errorMsg("QM_MODULES: %s", strerror(errno)); + perror_msg("QM_MODULES"); 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)); + if (nmod){ + ext_modules = modules = xmalloc(nmod * sizeof(*modules)); + memset(modules, 0, nmod * sizeof(*modules)); + 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; + } + perror_msg("query_module: QM_INFO: %s", mn); 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; + + 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: + perror_msg("query_module: QM_SYMBOLS: %s", mn); + 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; + } } } @@ -1973,11 +2550,11 @@ static int new_get_kernel_symbols(void) syms = xmalloc(bufsize = 16 * 1024); retry_kern_sym_load: if (query_module(NULL, QM_SYMBOLS, syms, bufsize, &ret)) { - if (errno == ENOSPC) { + if (errno == ENOSPC && bufsize < ret) { syms = xrealloc(syms, bufsize = ret); goto retry_kern_sym_load; } - errorMsg("kernel: QM_SYMBOLS: %s", strerror(errno)); + perror_msg("kernel: QM_SYMBOLS"); return 0; } nksyms = nsyms = ret; @@ -2106,6 +2683,10 @@ new_init_module(const char *m_name, struct obj_file *f, tgt_long m_addr; sec = obj_find_section(f, ".this"); + if (!sec || !sec->contents) { + perror_msg("corrupt module %s?",m_name); + exit(EXIT_FAILURE); + } module = (struct new_module *) sec->contents; m_addr = sec->header.sh_addr; @@ -2146,6 +2727,16 @@ new_init_module(const char *m_name, struct obj_file *f, 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 = (void*)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 = (void*)sec->header.sh_addr; + module->kallsyms_end = module->kallsyms_start + sec->header.sh_size; + } if (!arch_init_module(f, module)) return 0; @@ -2158,7 +2749,7 @@ new_init_module(const char *m_name, struct obj_file *f, ret = new_sys_init_module(m_name, (struct new_module *) image); if (ret) - errorMsg("init_module: %s: %s", m_name, strerror(errno)); + perror_msg("init_module: %s", m_name); free(image); @@ -2170,13 +2761,14 @@ new_init_module(const char *m_name, struct obj_file *f, #define new_init_module(x, y, z) TRUE #define new_create_this_module(x, y) 0 #define new_create_module_ksymtab(x) +#define query_module(v, w, x, y, z) -1 -#endif /* BB_FEATURE_INSMOD_OLD_KERNEL */ +#endif /* BB_FEATURE_NEW_MODULE_INTERFACE */ /*======================================================================*/ -int +static int obj_string_patch(struct obj_file *f, int secidx, ElfW(Addr) offset, const char *string) { @@ -2205,7 +2797,8 @@ obj_string_patch(struct obj_file *f, int secidx, ElfW(Addr) offset, return 1; } -int +#ifdef BB_FEATURE_NEW_MODULE_INTERFACE +static int obj_symbol_patch(struct obj_file *f, int secidx, ElfW(Addr) offset, struct obj_symbol *sym) { @@ -2220,8 +2813,9 @@ obj_symbol_patch(struct obj_file *f, int secidx, ElfW(Addr) offset, return 1; } +#endif -int obj_check_undefineds(struct obj_file *f) +static int obj_check_undefineds(struct obj_file *f) { unsigned long i; int ret = 1; @@ -2234,7 +2828,9 @@ int obj_check_undefineds(struct obj_file *f) sym->secidx = SHN_ABS; sym->value = 0; } else { - errorMsg("unresolved symbol %s", sym->name); + if (!flag_quiet) { + error_msg("unresolved symbol %s", sym->name); + } ret = 0; } } @@ -2243,7 +2839,7 @@ int obj_check_undefineds(struct obj_file *f) return ret; } -void obj_allocate_commons(struct obj_file *f) +static void obj_allocate_commons(struct obj_file *f) { struct common_entry { struct common_entry *next; @@ -2341,14 +2937,18 @@ void obj_allocate_commons(struct obj_file *f) 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 != 0) 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) +static unsigned long obj_load_size(struct obj_file *f) { unsigned long dot = 0; struct obj_section *sec; @@ -2369,7 +2969,7 @@ unsigned long obj_load_size(struct obj_file *f) return dot; } -int obj_relocate(struct obj_file *f, ElfW(Addr) base) +static int obj_relocate(struct obj_file *f, ElfW(Addr) base) { int i, n = f->header.e_shnum; int ret = 1; @@ -2457,11 +3057,11 @@ int obj_relocate(struct obj_file *f, ElfW(Addr) base) errmsg = "Unhandled relocation"; bad_reloc: if (extsym) { - errorMsg("%s of type %ld for %s", errmsg, + error_msg("%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, + error_msg("%s of type %ld", errmsg, (long) ELFW(R_TYPE) (rel->r_info)); } ret = 0; @@ -2499,7 +3099,7 @@ int obj_relocate(struct obj_file *f, ElfW(Addr) base) return ret; } -int obj_create_image(struct obj_file *f, char *image) +static int obj_create_image(struct obj_file *f, char *image) { struct obj_section *sec; ElfW(Addr) base = f->baseaddr; @@ -2507,7 +3107,7 @@ int obj_create_image(struct obj_file *f, char *image) for (sec = f->load_order; sec; sec = sec->load_next) { char *secimg; - if (sec->header.sh_size == 0) + if (sec->contents == 0 || sec->header.sh_size == 0) continue; secimg = image + (sec->header.sh_addr - base); @@ -2521,7 +3121,7 @@ int obj_create_image(struct obj_file *f, char *image) /*======================================================================*/ -struct obj_file *obj_load(FILE * fp) +static struct obj_file *obj_load(FILE * fp, int loadprogbits) { struct obj_file *f; ElfW(Shdr) * section_headers; @@ -2538,7 +3138,7 @@ struct obj_file *obj_load(FILE * fp) fseek(fp, 0, SEEK_SET); if (fread(&f->header, sizeof(f->header), 1, fp) != 1) { - errorMsg("error reading ELF header: %s", strerror(errno)); + perror_msg("error reading ELF header"); return NULL; } @@ -2546,25 +3146,25 @@ struct obj_file *obj_load(FILE * fp) || 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"); + error_msg("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"); + error_msg("ELF file not for this architecture"); return NULL; } if (f->header.e_type != ET_REL) { - errorMsg("ELF file not a relocatable object"); + error_msg("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", + error_msg("section header size mismatch: %lu != %lu", (unsigned long) f->header.e_shentsize, (unsigned long) sizeof(ElfW(Shdr))); return NULL; @@ -2577,7 +3177,7 @@ struct obj_file *obj_load(FILE * fp) 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)); + perror_msg("error reading ELF section headers"); return NULL; } @@ -2592,7 +3192,7 @@ struct obj_file *obj_load(FILE * fp) sec->header = section_headers[i]; sec->idx = i; - switch (sec->header.sh_type) { + if(sec->header.sh_size) switch (sec->header.sh_type) { case SHT_NULL: case SHT_NOTE: case SHT_NOBITS: @@ -2600,6 +3200,12 @@ struct obj_file *obj_load(FILE * fp) break; case SHT_PROGBITS: +#if LOADBITS + if (!loadprogbits) { + sec->contents = NULL; + break; + } +#endif case SHT_SYMTAB: case SHT_STRTAB: case SHT_RELM: @@ -2607,7 +3213,7 @@ struct obj_file *obj_load(FILE * fp) 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)); + perror_msg("error reading ELF section data"); return NULL; } } else { @@ -2617,11 +3223,11 @@ struct obj_file *obj_load(FILE * fp) #if SHT_RELM == SHT_REL case SHT_RELA: - errorMsg("RELA relocations not supported on this architecture"); + error_msg("RELA relocations not supported on this architecture"); return NULL; #else case SHT_REL: - errorMsg("REL relocations not supported on this architecture"); + error_msg("REL relocations not supported on this architecture"); return NULL; #endif @@ -2634,7 +3240,7 @@ struct obj_file *obj_load(FILE * fp) break; } - errorMsg("can't handle sections of type %ld", + error_msg("can't handle sections of type %ld", (long) sec->header.sh_type); return NULL; } @@ -2652,6 +3258,12 @@ struct obj_file *obj_load(FILE * fp) for (i = 0; i < shnum; ++i) { struct obj_section *sec = f->sections[i]; + /* .modinfo should be contents only but gcc has no attribute for that. + * The kernel may have marked .modinfo as ALLOC, ignore this bit. + */ + if (strcmp(sec->name, ".modinfo") == 0) + sec->header.sh_flags &= ~SHF_ALLOC; + if (sec->header.sh_flags & SHF_ALLOC) obj_insert_section_load_order(f, sec); @@ -2663,7 +3275,7 @@ struct obj_file *obj_load(FILE * fp) ElfW(Sym) * sym; if (sec->header.sh_entsize != sizeof(ElfW(Sym))) { - errorMsg("symbol size mismatch: %lu != %lu", + error_msg("symbol size mismatch: %lu != %lu", (unsigned long) sec->header.sh_entsize, (unsigned long) sizeof(ElfW(Sym))); return NULL; @@ -2675,38 +3287,72 @@ struct obj_file *obj_load(FILE * fp) /* 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); + f->local_symtab = xcalloc(j, sizeof(struct obj_symbol *)); /* 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 + 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", + error_msg("relocation entry size mismatch: %lu != %lu", (unsigned long) sec->header.sh_entsize, (unsigned long) sizeof(ElfW(RelM))); return NULL; } break; + /* XXX Relocation code from modutils-2.3.19 is not here. + * Why? That's about 20 lines of code from obj/obj_load.c, + * which gets done in a second pass through the sections. + * This BusyBox insmod does similar work in obj_relocate(). */ } } return f; } +#ifdef BB_FEATURE_INSMOD_LOADINKMEM +/* + * load the unloaded sections directly into the memory allocated by + * kernel for the module + */ + +static int obj_load_progbits(FILE * fp, struct obj_file* f, char* imagebase) +{ + ElfW(Addr) base = f->baseaddr; + struct obj_section* sec; + + for (sec = f->load_order; sec; sec = sec->load_next) { + + /* section already loaded? */ + if (sec->contents != NULL) + continue; + + if (sec->header.sh_size == 0) + continue; + + sec->contents = imagebase + (sec->header.sh_addr - base); + fseek(fp, sec->header.sh_offset, SEEK_SET); + if (fread(sec->contents, sec->header.sh_size, 1, fp) != 1) { + error_msg("error reading ELF section data: %s\n", strerror(errno)); + return 0; + } + + } + return 1; +} +#endif + static void hide_special_symbols(struct obj_file *f) { static const char *const specials[] = { @@ -2725,6 +3371,121 @@ static void hide_special_symbols(struct obj_file *f) ELFW(ST_INFO) (STB_LOCAL, ELFW(ST_TYPE) (sym->info)); } +#ifdef BB_FEATURE_INSMOD_CHECK_TAINTED +static int obj_gpl_license(struct obj_file *f, const char **license) +{ + struct obj_section *sec; + /* This list must match *exactly* the list of allowable licenses in + * linux/include/linux/module.h. Checking for leading "GPL" will not + * work, somebody will use "GPL sucks, this is proprietary". + */ + static const char *gpl_licenses[] = { + "GPL", + "GPL v2", + "GPL and additional rights", + "Dual BSD/GPL", + "Dual MPL/GPL", + }; + + if ((sec = obj_find_section(f, ".modinfo"))) { + const char *value, *ptr, *endptr; + ptr = sec->contents; + endptr = ptr + sec->header.sh_size; + while (ptr < endptr) { + if ((value = strchr(ptr, '=')) && strncmp(ptr, "license", value-ptr) == 0) { + int i; + if (license) + *license = value+1; + for (i = 0; i < sizeof(gpl_licenses)/sizeof(gpl_licenses[0]); ++i) { + if (strcmp(value+1, gpl_licenses[i]) == 0) + return(0); + } + return(2); + } + if (strchr(ptr, '\0')) + ptr = strchr(ptr, '\0') + 1; + else + ptr = endptr; + } + } + return(1); +} + +#define TAINT_FILENAME "/proc/sys/kernel/tainted" +#define TAINT_PROPRIETORY_MODULE (1<<0) +#define TAINT_FORCED_MODULE (1<<1) +#define TAINT_UNSAFE_SMP (1<<2) +#define TAINT_URL "http://www.tux.org/lkml/#export-tainted" + +static void set_tainted(struct obj_file *f, int fd, char *m_name, + int kernel_has_tainted, int taint, const char *text1, const char *text2) +{ + char buf[80]; + int oldval; + static int first = 1; + if (fd < 0 && !kernel_has_tainted) + return; /* New modutils on old kernel */ + printf("Warning: loading %s will taint the kernel: %s%s\n", + m_name, text1, text2); + if (first) { + printf(" See %s for information about tainted modules\n", TAINT_URL); + first = 0; + } + if (fd >= 0) { + read(fd, buf, sizeof(buf)-1); + buf[sizeof(buf)-1] = '\0'; + oldval = strtoul(buf, NULL, 10); + sprintf(buf, "%d\n", oldval | taint); + write(fd, buf, strlen(buf)); + } +} +#endif + +/* Check if loading this module will taint the kernel. */ +static void check_tainted_module(struct obj_file *f, char *m_name) +{ +#ifdef BB_FEATURE_INSMOD_CHECK_TAINTED + static const char tainted_file[] = TAINT_FILENAME; + int fd, kernel_has_tainted; + const char *ptr; + + kernel_has_tainted = 1; + if ((fd = open(tainted_file, O_RDWR)) < 0) { + if (errno == ENOENT) + kernel_has_tainted = 0; + else if (errno == EACCES) + kernel_has_tainted = 1; + else { + perror(tainted_file); + kernel_has_tainted = 0; + } + } + + switch (obj_gpl_license(f, &ptr)) { + case 0: + break; + case 1: + set_tainted(f, fd, m_name, kernel_has_tainted, TAINT_PROPRIETORY_MODULE, "no license", ""); + break; + case 2: + /* The module has a non-GPL license so we pretend that the + * kernel always has a taint flag to get a warning even on + * kernels without the proc flag. + */ + set_tainted(f, fd, m_name, 1, TAINT_PROPRIETORY_MODULE, "non-GPL license - ", ptr); + break; + default: + set_tainted(f, fd, m_name, 1, TAINT_PROPRIETORY_MODULE, "Unexpected return from obj_gpl_license", ""); + break; + } + + if (flag_force_load) + set_tainted(f, fd, m_name, 1, TAINT_FORCED_MODULE, "forced load", ""); + + if (fd >= 0) + close(fd); +#endif +} void my_usage(void) { @@ -2742,18 +3503,16 @@ extern int insmod_main( int argc, char **argv) ElfW(Addr) m_addr; FILE *fp; struct obj_file *f; - char m_name[BUFSIZ + 1] = "\0"; - int exit_status = FALSE; + char m_name[FILENAME_MAX] = "\0"; + int exit_status = EXIT_FAILURE; int m_has_modinfo; #ifdef BB_FEATURE_INSMOD_VERSION_CHECKING - int k_version; - char k_strversion[STRVERSIONLEN]; + struct utsname uts_info; char m_strversion[STRVERSIONLEN]; int m_version; int m_crcs; #endif - if (argc <= 1) my_usage(); @@ -2773,7 +3532,7 @@ extern int insmod_main( int argc, char **argv) strcpy(m_fullName, m_name); strcat(m_fullName, ".o"); - /* Get a filedesc for the module */ + /* Get a filedesc for the module. Check we we have a complete path */ if ((fp = fopen(*argv, "r")) == NULL) { errorMsg("Module %s not found", *argv); return -1; @@ -2781,7 +3540,7 @@ extern int insmod_main( int argc, char **argv) memcpy(m_filename, *argv, strlen(*argv)); - if ((f = obj_load(fp)) == NULL) { + if ((f = obj_load(fp, LOADBITS)) == NULL) { logperror("Could not load the module"); goto out; } @@ -2793,31 +3552,33 @@ extern int insmod_main( int argc, char **argv) #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 (!flag_quiet) { + if (uname(&uts_info) < 0) + uts_info.release[0] = '\0'; + 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) { + error_msg("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; + if (strncmp(uts_info.release, m_strversion, STRVERSIONLEN) != 0) { + if (flag_force_load) { + error_msg("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, uts_info.release); + } else { + error_msg("kernel-module version mismatch\n" + "\t%s was compiled for kernel version %s\n" + "\twhile this kernel is version %s.", + m_filename, m_strversion, uts_info.release); + goto out; + } } } k_crcs = 0; @@ -2826,21 +3587,21 @@ extern int insmod_main( int argc, char **argv) k_new_syscalls = !query_module(NULL, 0, NULL, 0, NULL); if (k_new_syscalls) { -#ifdef BB_FEATURE_INSMOD_NEW_KERNEL +#ifdef BB_FEATURE_NEW_MODULE_INTERFACE if (!new_get_kernel_symbols()) goto out; k_crcs = new_is_kernel_checksummed(); #else - errorMsg("Not configured to support new kernels"); + error_msg("Not configured to support new kernels"); goto out; #endif } else { -#ifdef BB_FEATURE_INSMOD_OLD_KERNEL +#ifdef BB_FEATURE_OLD_MODULE_INTERFACE if (!old_get_kernel_symbols(m_name)) goto out; k_crcs = old_is_kernel_checksummed(); #else - errorMsg("Not configured to support old kernels"); + error_msg("Not configured to support old kernels"); goto out; #endif } @@ -2871,13 +3632,14 @@ extern int insmod_main( int argc, char **argv) goto out; } obj_allocate_commons(f); + check_tainted_module(f, m_name); if (m_has_modinfo - ? !new_process_module_arguments(f, argc-1, argv+1) - : !old_process_module_arguments(f, argc-1, argv+1)) - { + ? !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); @@ -2889,25 +3651,31 @@ extern int insmod_main( int argc, char **argv) m_size = obj_load_size(f); - errno = 0; m_addr = create_module(m_name, m_size); - switch (errno) { - case 0: - break; + if (m_addr==-1) switch (errno) { case EEXIST: - errorMsg("A module named %s already exists", m_name); - /* Considered as a success in stage1 */ - fclose(fp); - return(TRUE); + error_msg("A module named %s already exists", m_name); + goto out; case ENOMEM: - errorMsg("Can't allocate kernel memory for module; needed %lu bytes", + error_msg("Can't allocate kernel memory for module; needed %lu bytes", m_size); goto out; default: - errorMsg("create_module: %s: %s", m_name, strerror(errno)); + perror_msg("create_module: %s", m_name); goto out; } +#if !LOADBITS + /* + * the PROGBITS section was not loaded by the obj_load + * now we can load them directly into the kernel memory + */ + if (!obj_load_progbits(fp, f, (char*)m_addr)) { + delete_module(m_name); + goto out; + } +#endif + if (!obj_relocate(f, m_addr)) { delete_module(m_name); goto out; @@ -2921,14 +3689,13 @@ extern int insmod_main( int argc, char **argv) goto out; } - exit_status = TRUE; + exit_status = EXIT_SUCCESS; out: fclose(fp); return(exit_status); } - int insmod_call(char * full_filename, char * params) { int argc = 2; diff --git a/mdk-stage1/insmod-modutils/Makefile b/mdk-stage1/insmod-modutils/Makefile index e8f78d2d0..48508ba1f 100644 --- a/mdk-stage1/insmod-modutils/Makefile +++ b/mdk-stage1/insmod-modutils/Makefile @@ -15,12 +15,16 @@ include $(top_dir)/Makefile.common INCS = -I./include -DEFS = -Wno-error -D_GNU_SOURCE -DELF_MACHINE_H='"elf_$(ARCH).h"' -DARCH_$(ARCH) +TAINT_URL = http://www.tux.org/lkml/\#export-tainted + +DEFS = -Wno-error -D_GNU_SOURCE \ + -DELF_MACHINE_H='"elf_$(ARCH).h"' -DARCH_$(ARCH) \ + -DTAINT_URL='"$(TAINT_URL)"' DIRS = util obj -all: dirs insmod libinsmod.a #libinsmod-DIET.a +all: dirs insmod libinsmod.a dirs: @for n in . $(DIRS); do \ @@ -31,11 +35,11 @@ clean: @for n in $(DIRS); do \ (cd $$n; make clean) \ done - rm -rf t *.o insmod libinsmod.a libinsmod-DIET.a + rm -rf t *.o insmod libinsmod.a insmod: insmod-frontend.o insmod.o ./util/libutil-STANDALONE.a ./obj/libobj.a - gcc -o $@ $^ + $(DIET) gcc -o $@ $^ $(STRIPCMD) $@ t/.create_stuff: util/libutil.a obj/libobj.a @@ -48,16 +52,8 @@ 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 $(CFLAGS) $(DEFS) $(INCS) $(GLIBC_INCLUDES) -c insmod-frontend.c + $(DIET) gcc $(CFLAGS) $(DEFS) $(INCS) $(INCLUDES) -c insmod-frontend.c insmod.o: insmod.c - gcc $(CFLAGS) $(DEFS) $(INCS) $(GLIBC_INCLUDES) -c insmod.c - -insmod-DIET.o: insmod.c - gcc $(CFLAGS) $(DEFS) $(INCS) $(DIETLIBC_INCLUDES) -o $@ -c insmod.c - + $(DIET) gcc $(CFLAGS) $(DEFS) $(INCS) $(INCLUDES) -c insmod.c diff --git a/mdk-stage1/insmod-modutils/include/config.h b/mdk-stage1/insmod-modutils/include/config.h index 11da6a523..3a37b00d4 100644 --- a/mdk-stage1/insmod-modutils/include/config.h +++ b/mdk-stage1/insmod-modutils/include/config.h @@ -28,6 +28,7 @@ #include <stdio.h> #include <sys/utsname.h> +#define MODUTILS_MACROS "/lib/modutils/macros" #define ETC_MODULES_CONF "/etc/modules.conf" #define EXEC_PRE_INSTALL 0 @@ -92,6 +93,8 @@ enum gen_file_enum { GEN_ISAPNPMAPFILE, GEN_USBMAPFILE, GEN_PARPORTMAPFILE, + GEN_IEEE1394MAPFILE, + GEN_PNPBIOSMAPFILE, GEN_DEPFILE, }; diff --git a/mdk-stage1/insmod-modutils/include/elf_alpha.h b/mdk-stage1/insmod-modutils/include/elf_alpha.h index f1ec66f1c..4202bcc14 100644 --- a/mdk-stage1/insmod-modutils/include/elf_alpha.h +++ b/mdk-stage1/insmod-modutils/include/elf_alpha.h @@ -1,5 +1,4 @@ /* Machine-specific elf macros for the Alpha. */ -#ident "$Id$" #define ELFCLASSM ELFCLASS64 #define ELFDATAM ELFDATA2LSB diff --git a/mdk-stage1/insmod-modutils/include/elf_arm.h b/mdk-stage1/insmod-modutils/include/elf_arm.h index f6b531e88..cf04cafe0 100644 --- a/mdk-stage1/insmod-modutils/include/elf_arm.h +++ b/mdk-stage1/insmod-modutils/include/elf_arm.h @@ -1,5 +1,4 @@ /* Machine-specific elf macros for ARM. */ -#ident "$Id$" #define ELFCLASSM ELFCLASS32 #define ELFDATAM ELFDATA2LSB diff --git a/mdk-stage1/insmod-modutils/include/elf_i386.h b/mdk-stage1/insmod-modutils/include/elf_i386.h index c6c2d326e..f5c57d384 100644 --- a/mdk-stage1/insmod-modutils/include/elf_i386.h +++ b/mdk-stage1/insmod-modutils/include/elf_i386.h @@ -1,5 +1,4 @@ /* Machine-specific elf macros for i386 et al. */ -#ident "$Id$" #define ELFCLASSM ELFCLASS32 #define ELFDATAM ELFDATA2LSB diff --git a/mdk-stage1/insmod-modutils/include/elf_m68k.h b/mdk-stage1/insmod-modutils/include/elf_m68k.h index 817fc8f2c..c488ba9d1 100644 --- a/mdk-stage1/insmod-modutils/include/elf_m68k.h +++ b/mdk-stage1/insmod-modutils/include/elf_m68k.h @@ -1,5 +1,4 @@ /* Machine-specific elf macros for m68k. */ -#ident "$Id$" #define ELFCLASSM ELFCLASS32 #define ELFDATAM ELFDATA2MSB diff --git a/mdk-stage1/insmod-modutils/include/elf_mips.h b/mdk-stage1/insmod-modutils/include/elf_mips.h index 8a0430216..4b91ddd01 100644 --- a/mdk-stage1/insmod-modutils/include/elf_mips.h +++ b/mdk-stage1/insmod-modutils/include/elf_mips.h @@ -1,5 +1,4 @@ /* Machine-specific elf macros for MIPS. */ -#ident "$Id$" #define ELFCLASSM ELFCLASS32 #ifdef __MIPSEB__ diff --git a/mdk-stage1/insmod-modutils/include/elf_ppc.h b/mdk-stage1/insmod-modutils/include/elf_ppc.h index 71596de8c..b0060ace1 100644 --- a/mdk-stage1/insmod-modutils/include/elf_ppc.h +++ b/mdk-stage1/insmod-modutils/include/elf_ppc.h @@ -1,5 +1,4 @@ /* Machine-specific elf macros for the PowerPC. */ -#ident "$Id$" #define ELFCLASSM ELFCLASS32 #define ELFDATAM ELFDATA2MSB diff --git a/mdk-stage1/insmod-modutils/include/elf_s390.h b/mdk-stage1/insmod-modutils/include/elf_s390.h index 547d66b83..7a35bde93 100644 --- a/mdk-stage1/insmod-modutils/include/elf_s390.h +++ b/mdk-stage1/insmod-modutils/include/elf_s390.h @@ -1,10 +1,11 @@ /* Machine-specific elf macros for i386 et al. */ -#ident "$Id$" #define ELFCLASSM ELFCLASS32 #define ELFDATAM ELFDATA2MSB -#define MATCH_MACHINE(x) (x == EM_S390) +#define EM_S390_OLD 0xa390 + +#define MATCH_MACHINE(x) (x == EM_S390 || x == EM_S390_OLD) #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 index 9b5c348d9..8903b2654 100644 --- a/mdk-stage1/insmod-modutils/include/elf_sparc.h +++ b/mdk-stage1/insmod-modutils/include/elf_sparc.h @@ -1,5 +1,4 @@ /* Machine-specific elf macros for the Sparc. */ -#ident "$Id$" #define ELFCLASSM ELFCLASS32 #define ELFDATAM ELFDATA2MSB diff --git a/mdk-stage1/insmod-modutils/include/elf_sparc64.h b/mdk-stage1/insmod-modutils/include/elf_sparc64.h index 158edd7e1..891e0c3d9 100644 --- a/mdk-stage1/insmod-modutils/include/elf_sparc64.h +++ b/mdk-stage1/insmod-modutils/include/elf_sparc64.h @@ -1,5 +1,4 @@ /* Machine-specific elf macros for the Sparc. */ -#ident "$Id$" #define ELFCLASSM ELFCLASS64 #define ELFDATAM ELFDATA2MSB diff --git a/mdk-stage1/insmod-modutils/include/elf_x86_64.h b/mdk-stage1/insmod-modutils/include/elf_x86_64.h new file mode 100644 index 000000000..6d7581b3f --- /dev/null +++ b/mdk-stage1/insmod-modutils/include/elf_x86_64.h @@ -0,0 +1,9 @@ +/* Machine-specific elf macros for x86_64. */ + +#define ELFCLASSM ELFCLASS64 +#define ELFDATAM ELFDATA2LSB + +#define MATCH_MACHINE(x) (x == EM_X86_64) + +#define SHT_RELM SHT_RELA +#define Elf64_RelM Elf64_Rela diff --git a/mdk-stage1/insmod-modutils/include/kallsyms.h b/mdk-stage1/insmod-modutils/include/kallsyms.h index 9748873cf..90bb75f22 100644 --- a/mdk-stage1/insmod-modutils/include/kallsyms.h +++ b/mdk-stage1/insmod-modutils/include/kallsyms.h @@ -1,3 +1,6 @@ +#ifndef MODUTILS_KALLSYMS_H +#define MODUTILS_KALLSYMS_H 1 + /* kallsyms headers Copyright 2000 Keith Owens <kaos@ocs.com.au> @@ -24,11 +27,6 @@ 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 diff --git a/mdk-stage1/insmod-modutils/include/kerneld.h b/mdk-stage1/insmod-modutils/include/kerneld.h index 3bc2c9d42..f32e34b4a 100644 --- a/mdk-stage1/insmod-modutils/include/kerneld.h +++ b/mdk-stage1/insmod-modutils/include/kerneld.h @@ -4,8 +4,6 @@ #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" */ diff --git a/mdk-stage1/insmod-modutils/include/module.h b/mdk-stage1/insmod-modutils/include/module.h index db49ab2b2..ae8224f8a 100644 --- a/mdk-stage1/insmod-modutils/include/module.h +++ b/mdk-stage1/insmod-modutils/include/module.h @@ -1,3 +1,6 @@ +#ifndef MODUTILS_MODULE_H +#define MODUTILS_MODULE_H 1 + /* Definitions for the Linux module syscall interface. Copyright 1996, 1997 Linux International. @@ -20,11 +23,6 @@ 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. */ @@ -207,4 +205,13 @@ int delete_module(const char *); */ extern unsigned int safemode; +/*======================================================================*/ +/* Tainted kernel information. This must match include/linux/kernel.h */ +/* and kernel/panic.c. */ + +#define TAINT_FILENAME "/proc/sys/kernel/tainted" +#define TAINT_PROPRIETORY_MODULE (1<<0) +#define TAINT_FORCED_MODULE (1<<1) +#define TAINT_UNSAFE_SMP (1<<2) + #endif /* module.h */ diff --git a/mdk-stage1/insmod-modutils/include/obj.h b/mdk-stage1/insmod-modutils/include/obj.h index b140c65c3..de346b16a 100644 --- a/mdk-stage1/insmod-modutils/include/obj.h +++ b/mdk-stage1/insmod-modutils/include/obj.h @@ -1,3 +1,6 @@ +#ifndef MODUTILS_OBJ_H +#define MODUTILS_OBJ_H 1 + /* Elf object file loading and relocation routines. Copyright 1996, 1997 Linux International. @@ -21,16 +24,13 @@ 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 <sys/types.h> #include <elf.h> #include ELF_MACHINE_H +#include "module.h" #ifndef ElfW # if ELFCLASSM == ELFCLASS32 @@ -77,7 +77,7 @@ struct obj_symbol { struct obj_symbol *next; /* hash table link */ const char *name; - unsigned long value; + tgt_long value; unsigned long size; int secidx; /* the defining section index/module */ int info; @@ -161,6 +161,8 @@ struct obj_symbol_patch_struct #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 obj_kallsyms ObjW(kallsyms) +#define obj_gpl_license ObjW(gpl_license) #define arch_new_file ObjW(arch_new_file) #define arch_new_section ObjW(arch_new_section) #define arch_new_symbol ObjW(arch_new_symbol) @@ -198,7 +200,8 @@ void obj_insert_section_load_order (struct obj_file *f, struct obj_section *obj_create_alloced_section (struct obj_file *f, const char *name, unsigned long align, - unsigned long size); + unsigned long size, + unsigned long flags); struct obj_section *obj_create_alloced_section_first (struct obj_file *f, const char *name, @@ -264,7 +267,7 @@ union obj_ptr_4 { void *ptr; }; union obj_ptr_8 { - Elf64_Xword addr; + u_int64_t addr; /* Should be Elf64_Xword but not all users have this yet */ void *ptr; }; @@ -272,4 +275,24 @@ void *obj_addr_to_native_ptr(ElfW(Addr)); ElfW(Addr) obj_native_ptr_to_addr(void *); +/* Standard method of finding relocation symbols, sets isym */ +#define obj_find_relsym(isym, f, find, rel, symtab, strtab) \ + { \ + unsigned long symndx = ELFW(R_SYM)((rel)->r_info); \ + ElfW(Sym) *extsym = (symtab)+symndx; \ + if (ELFW(ST_BIND)(extsym->st_info) == STB_LOCAL) { \ + isym = (typeof(isym)) (f)->local_symtab[symndx]; \ + } \ + else { \ + const char *name; \ + if (extsym->st_name) \ + name = (strtab) + extsym->st_name; \ + else \ + name = (f)->sections[extsym->st_shndx]->name; \ + isym = (typeof(isym)) obj_find_symbol((find), name); \ + } \ + } + +int obj_gpl_license(struct obj_file *, const char **); + #endif /* obj.h */ diff --git a/mdk-stage1/insmod-modutils/include/util.h b/mdk-stage1/insmod-modutils/include/util.h index b2e4a67c3..0a1354bec 100644 --- a/mdk-stage1/insmod-modutils/include/util.h +++ b/mdk-stage1/insmod-modutils/include/util.h @@ -1,3 +1,6 @@ +#ifndef MODUTILS_UTIL_H +#define MODUTILS_UTIL_H 1 + /* Miscelaneous utility functions. Copyright 1996, 1997 Linux International. @@ -20,11 +23,6 @@ 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> diff --git a/mdk-stage1/insmod-modutils/include/version.h b/mdk-stage1/insmod-modutils/include/version.h index 51ca0eb29..9ca0c57a9 100644 --- a/mdk-stage1/insmod-modutils/include/version.h +++ b/mdk-stage1/insmod-modutils/include/version.h @@ -1 +1 @@ -#define MODUTILS_VERSION "2.4.2" +#define MODUTILS_VERSION "2.4.19" diff --git a/mdk-stage1/insmod-modutils/insmod.c b/mdk-stage1/insmod-modutils/insmod.c index 359b28837..b0b7c2a0d 100644 --- a/mdk-stage1/insmod-modutils/insmod.c +++ b/mdk-stage1/insmod-modutils/insmod.c @@ -54,16 +54,15 @@ Keith Owens <kaos@ocs.com.au> November 2000. Add persistent data support. Keith Owens <kaos@ocs.com.au> November 2000. + Add tainted module support. + Keith Owens <kaos@ocs.com.au> September 2001. */ -#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> @@ -71,6 +70,7 @@ #include <getopt.h> #include <sys/stat.h> #include <sys/file.h> +#include <sys/fcntl.h> #include "module.h" #include "obj.h" @@ -90,9 +90,12 @@ static int flag_silent_probe = 0; static int flag_export = 1; static int flag_load_map = 0; static int flag_ksymoops = 1; +static int flag_numeric_only = 0; static int n_ext_modules_used; static int m_has_modinfo; +static int gplonly_seen; +static int warnings; extern int insmod_main(int argc, char **argv); extern int insmod_main_32(int argc, char **argv); @@ -105,6 +108,15 @@ extern int kallsyms_main(int argc, char **argv); /*======================================================================*/ +/* Only use the numeric part of the version string? */ + +static void use_numeric_only(int major, int minor, char *str) +{ + if (((major << 8) + minor) >= 0x0205 /* kernel 2.5 */ + || flag_numeric_only) + *str = '\0'; +} + /* Get the kernel version in the canonical integer form. */ static int get_kernel_version(char str[STRVERSIONLEN]) @@ -112,8 +124,9 @@ 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; + strncpy(str, uts_info.release, STRVERSIONLEN-1); + str[STRVERSIONLEN-1] = '\0'; + p = str; a = strtoul(p, &p, 10); if (*p != '.') @@ -124,6 +137,7 @@ static int get_kernel_version(char str[STRVERSIONLEN]) c = strtoul(p + 1, &q, 10); if (p + 1 == q) return -1; + use_numeric_only(a, b, q); return a << 16 | b << 8 | c; } @@ -232,7 +246,7 @@ static unsigned long ncv_symbol_hash(const char *str) * 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 *syms, size_t nsyms, int gpl) { struct module_symbol *s; size_t i; @@ -247,8 +261,57 @@ static int add_symbols_from(struct obj_file *f, int idx, */ struct obj_symbol *sym; + /* GPL licensed modules can use symbols exported with + * EXPORT_SYMBOL_GPL, so ignore any GPLONLY_ prefix on the + * exported names. Non-GPL modules never see any GPLONLY_ + * symbols so they cannot fudge it by adding the prefix on + * their references. + */ + if (strncmp((char *)s->name, "GPLONLY_", 8) == 0) { + gplonly_seen = 1; + if (gpl) + ((char *)s->name) += 8; + else + continue; + } + sym = obj_find_symbol(f, (char *) s->name); - if (sym && !ELFW(ST_BIND) (sym->info) == STB_LOCAL) { +#ifdef ARCH_ppc64 + if (!sym) + { + static size_t buflen = 0; + static char *buf = 0; + int len; + + /* ppc64 is one of those architectures with + function descriptors. A function is exported + and accessed across object boundaries via its + function descriptor. The function code symbol + happens to be the function name, prefixed with + '.', and a function call is a branch to the + code symbol. The linker recognises when a call + crosses object boundaries, and inserts a stub + to call via the function descriptor. + obj_ppc64.c of course does the same thing, so + here we recognise that an undefined code symbol + can be satisfied by the corresponding function + descriptor symbol. */ + + len = strlen ((char *) s->name) + 2; + if (buflen < len) + { + buflen = len + (len >> 1); + if (buf) + free (buf); + buf = malloc (buflen); + } + buf[0] = '.'; + strcpy (buf + 1, (char *) s->name); + sym = obj_find_symbol(f, buf); + } +#endif /* ARCH_ppc64 */ + + 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); @@ -264,7 +327,7 @@ static int add_symbols_from(struct obj_file *f, int idx, return used; } -static void add_kernel_symbols(struct obj_file *f) +static void add_kernel_symbols(struct obj_file *f, int gpl) { struct module_stat *m; size_t i, nused = 0; @@ -272,13 +335,13 @@ static void add_kernel_symbols(struct obj_file *f) /* 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)) + add_symbols_from(f, SHN_HIRESERVE + 2 + i, m->syms, m->nsyms, gpl)) 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); + add_symbols_from(f, SHN_HIRESERVE + 1, ksyms, nksyms, gpl); } static void hide_special_symbols(struct obj_file *f) @@ -326,7 +389,7 @@ static void print_load_map(struct obj_file *f) if (a == -1) a = 0; - lprintf("%-16s%08lx %0*lx 2**%d", + lprintf("%-15s %08lx %0*lx 2**%d", sec->name, (long)sec->header.sh_size, (int) (2 * sizeof(void *)), @@ -465,9 +528,10 @@ static int old_create_mod_use_count(struct obj_file *f) */ got = obj_find_symbol(f, "_GLOBAL_OFFSET_TABLE_"); if (got) -{ + { sec = obj_create_alloced_section(f, ".got", - sizeof(long), sizeof(long)); + sizeof(long), sizeof(long), + SHF_WRITE); got->secidx = sec->idx; /* mark the symbol as defined */ } return 1; @@ -491,7 +555,8 @@ static void add_ksymtab(struct obj_file *f, struct obj_symbol *sym) sec = NULL; } if (!sec) - sec = obj_create_alloced_section(f, "__ksymtab", tgt_sizeof_void_p, 0); + sec = obj_create_alloced_section(f, "__ksymtab", + tgt_sizeof_void_p, 0, 0); if (!sec) return; sec->header.sh_flags |= SHF_ALLOC; @@ -513,9 +578,9 @@ static int create_module_ksymtab(struct obj_file *f) 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)); + sec = obj_create_alloced_section(f, ".kmodtab", + tgt_sizeof_void_p, + sizeof(struct module_ref) * n_ext_modules_used, 0); if (!sec) return 0; @@ -524,6 +589,9 @@ static int create_module_ksymtab(struct obj_file *f) for (i = 0; i < n_module_stat; ++i) if (module_stat[i].status /* used */) { dep->dep = module_stat[i].addr; +#ifdef ARCH_ppc64 + dep->dep |= ppc64_module_base (f); +#endif obj_symbol_patch(f, sec->idx, (char *) &dep->ref - sec->contents, tm); dep->next_ref = 0; ++dep; @@ -573,7 +641,9 @@ static int get_module_version(struct obj_file *f, char str[STRVERSIONLEN]) } else m_has_modinfo = 1; - strncpy(str, p, STRVERSIONLEN); + strncpy(str, p, STRVERSIONLEN-1); + str[STRVERSIONLEN-1] = '\0'; + p = str; a = strtoul(p, &p, 10); if (*p != '.') @@ -584,6 +654,7 @@ static int get_module_version(struct obj_file *f, char str[STRVERSIONLEN]) c = strtoul(p + 1, &q, 10); if (p + 1 == q) return -1; + use_numeric_only(a, b, q); return a << 16 | b << 8 | c; } @@ -645,6 +716,7 @@ static void add_ksymoops_symbols(struct obj_file *f, const char *filename, int save_errno = errno; error("cannot get realpath for %s", filename); errno = save_errno; + perror(""); absolute_filename = xstrdup(filename); } @@ -679,7 +751,7 @@ static void add_ksymoops_symbols(struct obj_file *f, const char *filename, 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, + (int)(2*sizeof(statbuf.st_mtime)), statbuf.st_mtime, version); sym = obj_add_symbol(f, name, -1, ELFW(ST_INFO) (STB_GLOBAL, STT_NOTYPE), @@ -756,14 +828,10 @@ static int process_module_arguments(struct obj_file *f, int argc, char **argv, i 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 */ + if (required || flag_verbose) { + lprintf("Warning: ignoring %s, no such parameter in this module", *argv); + ++warnings; + continue; } } key += 5; @@ -1014,7 +1082,7 @@ static int add_kallsyms(struct obj_file *f, } } if (!*module_kallsyms) - *module_kallsyms = obj_create_alloced_section(f, KALLSYMS_SEC_NAME, 0, 0); + *module_kallsyms = obj_create_alloced_section(f, KALLSYMS_SEC_NAME, 0, 0, 0); /* Size and populate kallsyms */ if (obj_kallsyms(f, &f_kallsyms)) @@ -1046,7 +1114,7 @@ static int add_archdata(struct obj_file *f, } } if (!*sec) - *sec = obj_create_alloced_section(f, ARCHDATA_SEC_NAME, 16, 0); + *sec = obj_create_alloced_section(f, ARCHDATA_SEC_NAME, 16, 0, 0); /* Size and populate archdata */ if (arch_archdata(f, *sec)) @@ -1147,7 +1215,8 @@ static int init_module(const char *m_name, struct obj_file *f, if (ret) { error("init_module: %m"); lprintf("Hint: insmod errors can be caused by incorrect module parameters, " - "including invalid IO or IRQ parameters"); + "including invalid IO or IRQ parameters.\n" + " You may find more information in syslog or the output from dmesg"); } } @@ -1276,6 +1345,7 @@ static int check_module_parameter(struct obj_file *f, char *key, char *value, in * most error conditions. Make these all errors in 2.5. */ lprintf("Warning: %s symbol for parameter %s not found", error_file, key); + ++warnings; return(1); } @@ -1290,6 +1360,7 @@ static int check_module_parameter(struct obj_file *f, char *key, char *value, in if (max < min) { lprintf("Warning: %s parameter %s has max < min!", error_file, key); + ++warnings; return(1); } @@ -1297,6 +1368,7 @@ static int check_module_parameter(struct obj_file *f, char *key, char *value, in case 'c': if (!isdigit(p[1])) { lprintf("%s parameter %s has no size after 'c'!", error_file, key); + ++warnings; return(1); } while (isdigit(p[1])) @@ -1310,9 +1382,11 @@ static int check_module_parameter(struct obj_file *f, char *key, char *value, in break; case '\0': lprintf("%s parameter %s has no format character!", error_file, key); + ++warnings; return(1); default: lprintf("%s parameter %s has unknown format character '%c'", error_file, key, *p); + ++warnings; return(1); } switch (*++p) { @@ -1327,6 +1401,7 @@ static int check_module_parameter(struct obj_file *f, char *key, char *value, in break; default: lprintf("%s parameter %s has unknown format modifier '%c'", error_file, key, *p); + ++warnings; return(1); } return(0); @@ -1374,6 +1449,74 @@ static void check_module_parameters(struct obj_file *f, int *persist_flag) return; } +static void set_tainted(struct obj_file *f, int fd, int kernel_has_tainted, + int noload, int taint, + const char *text1, const char *text2) +{ + char buf[80]; + int oldval; + static int first = 1; + if (fd < 0 && !kernel_has_tainted) + return; /* New modutils on old kernel */ + lprintf("Warning: loading %s will taint the kernel: %s%s", + f->filename, text1, text2); + ++warnings; + if (first) { + lprintf(" See %s for information about tainted modules", TAINT_URL); + first = 0; + } + if (fd >= 0 && !noload) { + read(fd, buf, sizeof(buf)-1); + buf[sizeof(buf)-1] = '\0'; + oldval = strtoul(buf, NULL, 10); + sprintf(buf, "%d\n", oldval | taint); + write(fd, buf, strlen(buf)); + } +} + +/* Check if loading this module will taint the kernel. */ +static void check_tainted_module(struct obj_file *f, int noload) +{ + static const char tainted_file[] = TAINT_FILENAME; + int fd, kernel_has_tainted; + const char *ptr; + + if ((fd = open(tainted_file, O_RDWR)) < 0) { + if (errno == ENOENT) + kernel_has_tainted = 0; + else if (errno == EACCES) + kernel_has_tainted = 1; + else { + perror(tainted_file); + kernel_has_tainted = 0; + } + } + else + kernel_has_tainted = 1; + + switch (obj_gpl_license(f, &ptr)) { + case 0: + break; + case 1: + set_tainted(f, fd, kernel_has_tainted, noload, TAINT_PROPRIETORY_MODULE, "no license", ""); + break; + case 2: + /* The module has a non-GPL license so we pretend that the + * kernel always has a taint flag to get a warning even on + * kernels without the proc flag. + */ + set_tainted(f, fd, 1, noload, TAINT_PROPRIETORY_MODULE, "non-GPL license - ", ptr); + break; + default: + set_tainted(f, fd, 1, noload, TAINT_PROPRIETORY_MODULE, "Unexpected return from obj_gpl_license", ""); + break; + } + + if (flag_force_load) + set_tainted(f, fd, 1, noload, TAINT_FORCED_MODULE, "forced load", ""); + if (fd >= 0) + close(fd); +} /* For common 3264 code, only compile the usage message once, in the 64 bit version */ #if defined(COMMON_3264) && defined(ONLY_32) @@ -1382,7 +1525,7 @@ extern void insmod_usage(void); /* Use the copy in the 64 bit version */ void insmod_usage(void) { fputs("Usage:\n" - "insmod [-fhkLmnpqrsSvVxXyY] [-e persist_name] [-o module_name] [-O blob_name] [-P prefix] module [ symbol=value ... ]\n" + "insmod [-fhkLmnpqrsSvVxXyYN] [-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" @@ -1402,6 +1545,7 @@ void insmod_usage(void) " -X, --export Do export externs (default)\n" " -y, --noksymoops Do not add ksymoops symbols\n" " -Y, --ksymoops Do add ksymoops symbols (default)\n" + " -N, --numeric-only Only check the numeric part of the kernel version\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" @@ -1445,8 +1589,8 @@ int INSMOD_MAIN(int argc, char **argv) {"export", 0, 0, 'X'}, {"noksymoops", 0, 0, 'y'}, {"ksymoops", 0, 0, 'Y'}, - {"persist", 1, 0, 'e'}, + {"numeric-only", 1, 0, 'N'}, {"name", 1, 0, 'o'}, {"blob", 1, 0, 'O'}, {"prefix", 1, 0, 'P'}, @@ -1472,6 +1616,7 @@ int INSMOD_MAIN(int argc, char **argv) int force_kallsyms = 0; int persist_parms = 0; /* does module have persistent parms? */ int i; + int gpl; error_file = "insmod"; @@ -1479,7 +1624,7 @@ int INSMOD_MAIN(int argc, char **argv) errors = optind = 0; /* Process the command line. */ - while ((o = getopt_long(argc, argv, "fhkLmnpqrsSvVxXyYe:o:O:P:R:", + while ((o = getopt_long(argc, argv, "fhkLmnpqrsSvVxXyYNe:o:O:P:R:", &long_opts[0], NULL)) != EOF) switch (o) { case 'f': /* force loading */ @@ -1533,6 +1678,9 @@ int INSMOD_MAIN(int argc, char **argv) case 'Y': /* do define ksymoops symbols */ flag_ksymoops = 1; break; + case 'N': /* only check numeric part of kernel version */ + flag_numeric_only = 1; + break; case 'e': /* persistent data filename */ free(persist_name); @@ -1566,8 +1714,10 @@ int INSMOD_MAIN(int argc, char **argv) (!persistdir || !*persistdir)) { free(persist_name); persist_name = NULL; - if (flag_verbose) + if (flag_verbose) { lprintf("insmod: -e \"\" ignored, no persistdir"); + ++warnings; + } } if (m_name == NULL) { @@ -1624,7 +1774,7 @@ int INSMOD_MAIN(int argc, char **argv) */ set_ncv_prefix(NULL); - for (i = 0; i < n_module_stat; ++i) { + for (i = 0; !noload && 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; @@ -1652,6 +1802,7 @@ int INSMOD_MAIN(int argc, char **argv) "\t%s was compiled for kernel version %s\n" "\twhile this kernel is version %s", filename, m_strversion, k_strversion); + ++warnings; } else { if (!quiet) error("kernel-module version mismatch\n" @@ -1665,7 +1816,13 @@ int INSMOD_MAIN(int argc, char **argv) obj_set_symbol_compare(f, ncv_strcmp, ncv_symbol_hash); /* Let the module know about the kernel symbols. */ - add_kernel_symbols(f); + gpl = obj_gpl_license(f, NULL) == 0; + add_kernel_symbols(f, gpl); + +#ifdef ARCH_ppc64 + if (!ppc64_process_syms (f)) + goto out; +#endif /* Allocate common symbols, symbol tables, and string tables. * @@ -1684,17 +1841,33 @@ int INSMOD_MAIN(int argc, char **argv) goto out; #endif - if (!obj_check_undefineds(f, quiet)) /* DEPMOD, obj_clear_undefineds */ + arch_create_got(f); /* DEPMOD */ + if (!obj_check_undefineds(f, quiet)) { /* DEPMOD, obj_clear_undefineds */ + if (!gpl && !quiet) { + if (gplonly_seen) + error("\n" + "Hint: You are trying to load a module without a GPL compatible license\n" + " and it has unresolved symbols. The module may be trying to access\n" + " GPLONLY symbols but the problem is more likely to be a coding or\n" + " user error. Contact the module supplier for assistance, only they\n" + " can help you.\n"); + else + error("\n" + "Hint: You are trying to load a module without a GPL compatible license\n" + " and it has unresolved symbols. Contact the module supplier for\n" + " assistance, only they can help you.\n"); + } goto out; + } obj_allocate_commons(f); /* DEPMOD */ check_module_parameters(f, &persist_parms); + check_tainted_module(f, noload); 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) { @@ -1842,6 +2015,9 @@ int INSMOD_MAIN(int argc, char **argv) } else { errno = 0; m_addr = create_module(m_name, m_size); +#ifdef ARCH_ppc64 + m_addr |= ppc64_module_base (f); +#endif switch (errno) { case 0: break; @@ -1917,6 +2093,8 @@ int INSMOD_MAIN(int argc, char **argv) delete_module(m_name); goto out; } + if (warnings && !noload) + lprintf("Module %s loaded, with warnings", m_name); exit_status = 0; out: @@ -1941,7 +2119,6 @@ int insmod_main(int argc, char **argv) #endif /* defined(COMMON_3264) && defined(ONLY_64) */ - int insmod_call(char * full_filename, char * params) { int argc = 2; diff --git a/mdk-stage1/insmod-modutils/obj/Makefile b/mdk-stage1/insmod-modutils/obj/Makefile index 34b5df2d9..e45282252 100644 --- a/mdk-stage1/insmod-modutils/obj/Makefile +++ b/mdk-stage1/insmod-modutils/obj/Makefile @@ -23,11 +23,19 @@ INCS = -I./../include DEFS = -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 +ifeq (x86_64, $(ARCH)) +DEFS += -Wno-error +endif +ifeq (ia64, $(ARCH)) +DEFS += -Wno-error +endif + +OBJS = obj_kallsyms.o obj_common.o obj_load.o obj_reloc.o obj_$(ARCH).o \ + obj_gpl_license.o libobj.a: $(OBJS) ar cru $@ $^ ranlib $@ -.c.o: - gcc $(CFLAGS) $(DEFS) $(INCS) $(GLIBC_INCLUDES) -c $< +%.o: %.c + $(DIET) gcc $(CFLAGS) $(DEFS) $(INCS) $(INCLUDES) -c $< diff --git a/mdk-stage1/insmod-modutils/obj/obj_alpha.c b/mdk-stage1/insmod-modutils/obj/obj_alpha.c index 4006b3442..175012716 100644 --- a/mdk-stage1/insmod-modutils/obj/obj_alpha.c +++ b/mdk-stage1/insmod-modutils/obj/obj_alpha.c @@ -19,8 +19,6 @@ 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> @@ -28,6 +26,12 @@ #include <obj.h> #include <util.h> + +/* This relocation got renamed, and the change hasn't propagated yet. */ +#ifndef R_ALPHA_GPREL16 +#define R_ALPHA_GPREL16 R_ALPHA_IMMED_GP_16 +#endif + /*======================================================================*/ struct alpha_got_entry @@ -100,6 +104,7 @@ arch_apply_relocation (struct obj_file *f, unsigned long *lloc = (unsigned long *)(targsec->contents + rel->r_offset); unsigned int *iloc = (unsigned int *)lloc; + unsigned short *sloc = (unsigned short *)lloc; Elf64_Addr dot = targsec->header.sh_addr + rel->r_offset; Elf64_Addr gp = af->got->header.sh_addr + 0x8000; @@ -115,6 +120,30 @@ arch_apply_relocation (struct obj_file *f, *lloc += v; break; + case R_ALPHA_GPREL16: + v -= gp; + if ((Elf64_Sxword)v > 0x7fff + || (Elf64_Sxword)v < -(Elf64_Sxword)0x8000) + ret = obj_reloc_overflow; + *sloc = v; + break; + + case R_ALPHA_GPRELLOW: + /* GPRELLOW does not overflow. Errors are seen in the + corresponding GPRELHIGH. */ + v -= gp; + *sloc = v; + break; + + case R_ALPHA_GPRELHIGH: + v -= gp; + v = ((Elf64_Sxword)v >> 16) + ((v >> 15) & 1); + if ((Elf64_Sxword)v > 0x7fff + || (Elf64_Sxword)v < -(Elf64_Sxword)0x8000) + ret = obj_reloc_overflow; + *sloc = v; + break; + case R_ALPHA_GPREL32: v -= gp; if ((Elf64_Sxword)v > 0x7fffffff @@ -138,7 +167,7 @@ arch_apply_relocation (struct obj_file *f, gotent->reloc_done = 1; } - *iloc = (*iloc & ~0xffff) | ((gotent->offset - 0x8000) & 0xffff); + *sloc = gotent->offset - 0x8000; } break; @@ -233,19 +262,12 @@ arch_create_got (struct obj_file *f) 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); + obj_find_relsym(intsym, f, &af->root, rel, symtab, strtab); for (ent = intsym->got_entries; ent ; ent = ent->next) if (ent->addend == rel->r_addend) @@ -270,9 +292,10 @@ arch_create_got (struct obj_file *f) } /* We always want a .got section so that we always have a GP for - use with GPDISP and GPREL32 relocs. Besides, if the section + use with GPDISP and GPREL 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); + af->got = obj_create_alloced_section(&af->root, ".got", 8, offset, + SHF_WRITE | SHF_ALPHA_GPREL); return 1; } diff --git a/mdk-stage1/insmod-modutils/obj/obj_arm.c b/mdk-stage1/insmod-modutils/obj/obj_arm.c index 7a843f947..78b53700c 100644 --- a/mdk-stage1/insmod-modutils/obj/obj_arm.c +++ b/mdk-stage1/insmod-modutils/obj/obj_arm.c @@ -21,8 +21,6 @@ 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> @@ -201,7 +199,7 @@ arch_create_got (struct obj_file *f) struct obj_section *sec, *syms, *strs; ElfW(Rel) *rel, *relend; ElfW(Sym) *symtab, *extsym; - const char *strtab, *name; + const char *strtab; struct arm_symbol *intsym; struct arm_plt_entry *pe; struct arm_got_entry *ge; @@ -227,11 +225,7 @@ arch_create_got (struct obj_file *f) 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); + obj_find_relsym(intsym, f, f, rel, symtab, strtab); pe = &intsym->pltent; @@ -252,11 +246,7 @@ arch_create_got (struct obj_file *f) 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); + obj_find_relsym(intsym, f, f, rel, symtab, strtab); ge = (struct arm_got_entry *) &intsym->gotent; if (! ge->allocated) @@ -282,14 +272,16 @@ arch_create_got (struct obj_file *f) obj_extend_section(sec, got_offset); else { - sec = obj_create_alloced_section(f, ".got", 8, got_offset); + sec = obj_create_alloced_section(f, ".got", 8, got_offset, + SHF_WRITE); assert(sec); } afile->got = sec; } if (plt_offset) - afile->plt = obj_create_alloced_section(f, ".plt", 8, plt_offset); + afile->plt = obj_create_alloced_section(f, ".plt", 8, plt_offset, + SHF_WRITE); return 1; } diff --git a/mdk-stage1/insmod-modutils/obj/obj_common.c b/mdk-stage1/insmod-modutils/obj/obj_common.c index 2a6606c94..a957ff1be 100644 --- a/mdk-stage1/insmod-modutils/obj/obj_common.c +++ b/mdk-stage1/insmod-modutils/obj/obj_common.c @@ -19,11 +19,10 @@ 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 <alloca.h> #include <obj.h> #include <util.h> @@ -229,6 +228,14 @@ obj_find_section (struct obj_file *f, const char *name) return NULL; } +#if defined (ARCH_alpha) +#define ARCH_SHF_SHORT SHF_ALPHA_GPREL +#elif defined (ARCH_ia64) +#define ARCH_SHF_SHORT SHF_IA_64_SHORT +#else +#define ARCH_SHF_SHORT 0 +#endif + static int obj_load_order_prio(struct obj_section *a) { @@ -237,15 +244,24 @@ obj_load_order_prio(struct obj_section *a) 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 (a->name[0] != '.' + || strlen(a->name) != 10 + || strcmp(a->name + 5, ".init")) + ac |= 64; + if (af & SHF_ALLOC) ac |= 32; + if (af & SHF_EXECINSTR) 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 + if (a->header.sh_type != SHT_NOBITS) ac |= 4; + /* Desired order is + P S AC & 7 + .data 1 0 4 + .got 1 1 3 + .sdata 1 1 1 + .sbss 0 1 1 + .bss 0 0 0 */ + if (strcmp (a->name, ".got") == 0) ac |= 2; + if (af & ARCH_SHF_SHORT) + ac = (ac & ~4) | 1; return ac; } @@ -264,7 +280,8 @@ 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) + unsigned long align, unsigned long size, + unsigned long flags) { int newidx = f->header.e_shnum++; struct obj_section *sec; @@ -274,7 +291,7 @@ obj_create_alloced_section (struct obj_file *f, const char *name, memset(sec, 0, sizeof(*sec)); sec->header.sh_type = SHT_PROGBITS; - sec->header.sh_flags = SHF_WRITE|SHF_ALLOC; + sec->header.sh_flags = flags | SHF_ALLOC; sec->header.sh_size = size; sec->header.sh_addralign = align; sec->name = name; diff --git a/mdk-stage1/insmod-modutils/obj/obj_gpl_license.c b/mdk-stage1/insmod-modutils/obj/obj_gpl_license.c new file mode 100644 index 000000000..366b03e06 --- /dev/null +++ b/mdk-stage1/insmod-modutils/obj/obj_gpl_license.c @@ -0,0 +1,61 @@ +/* Return the type of license for a module. 0 for GPL, 1 for no license, 2 for + non-GPL. The license parameter is set to the license string or NULL. + + 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 <string.h> +#include "obj.h" + +/* This list must match *exactly* the list of allowable licenses in + * linux/include/linux/module.h. Checking for leading "GPL" will not + * work, somebody will use "GPL sucks, this is proprietary". + */ +static const char *gpl_licenses[] = { + "GPL", + "GPL v2", + "GPL and additional rights", + "Dual BSD/GPL", + "Dual MPL/GPL", +}; + +int obj_gpl_license(struct obj_file *f, const char **license) +{ + struct obj_section *sec; + if ((sec = obj_find_section(f, ".modinfo"))) { + const char *value, *ptr, *endptr; + ptr = sec->contents; + endptr = ptr + sec->header.sh_size; + while (ptr < endptr) { + if ((value = strchr(ptr, '=')) && strncmp(ptr, "license", value-ptr) == 0) { + int i; + if (license) + *license = value+1; + for (i = 0; i < sizeof(gpl_licenses)/sizeof(gpl_licenses[0]); ++i) { + if (strcmp(value+1, gpl_licenses[i]) == 0) + return(0); + } + return(2); + } + if (strchr(ptr, '\0')) + ptr = strchr(ptr, '\0') + 1; + else + ptr = endptr; + } + } + return(1); +} diff --git a/mdk-stage1/insmod-modutils/obj/obj_hppa.c b/mdk-stage1/insmod-modutils/obj/obj_hppa.c index 4207e692e..a6f703c5d 100644 --- a/mdk-stage1/insmod-modutils/obj/obj_hppa.c +++ b/mdk-stage1/insmod-modutils/obj/obj_hppa.c @@ -64,36 +64,6 @@ enum hppa_fsel 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) { @@ -383,14 +353,14 @@ hppa_rebuild_insn (insn, value, r_format) 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 + The kernels dp is fixed (at symbol $global$), 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: + All PCREL* 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 + Note, all PCREL* 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. @@ -411,7 +381,8 @@ arch_create_got(struct obj_file *f) /* Create stub section. * XXX set flags, see obj_ia64.c */ - hfile->stub = obj_create_alloced_section(f, ".stub", STUB_SIZE, 0); + hfile->stub = obj_create_alloced_section(f, ".stub", STUB_SIZE, + 0, SHF_WRITE); /* Actually this is a lot like check_relocs() in a BFD backend. We walk all sections and all their relocations and look for ones @@ -446,30 +417,17 @@ arch_create_got(struct obj_file *f) continue; case R_PARISC_PCREL17F: + case R_PARISC_PCREL22F: 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); - } + obj_find_relsym(hsym, f, f, rel, symtab, strtab); local = hsym->root.secidx <= SHN_HIRESERVE; if (need_stub) @@ -529,12 +487,17 @@ arch_apply_relocation(struct obj_file *f, /* Easy. */ break; + case R_PARISC_SEGREL32: + v -= f->baseaddr; + break; + case R_PARISC_DPREL21L: case R_PARISC_DPREL14R: v -= dp; break; case R_PARISC_PCREL17F: + case R_PARISC_PCREL22F: /* Find an import stub. */ assert(hsym->stub != NULL); assert(hfile->stub != NULL); @@ -566,6 +529,8 @@ arch_apply_relocation(struct obj_file *f, case R_PARISC_DIR32: case R_PARISC_PLABEL32: case R_PARISC_PCREL17F: + case R_PARISC_SEGREL32: + case R_PARISC_PCREL22F: fsel = e_fsel; break; @@ -602,6 +567,7 @@ arch_apply_relocation(struct obj_file *f, { case R_PARISC_DIR32: case R_PARISC_PLABEL32: + case R_PARISC_SEGREL32: r_format = 32; break; @@ -619,6 +585,10 @@ arch_apply_relocation(struct obj_file *f, r_format = 14; break; + case R_PARISC_PCREL22F: + r_format = 22; + break; + default: abort(); } @@ -652,13 +622,13 @@ arch_archdata (struct obj_file *f, struct obj_section *sec) int i; hppa_file_t *hfile = (hppa_file_t *)f; - /* Initialise dp to the kernels dp (symbol data_start) + /* Initialise dp to the kernels dp (symbol $global$) */ for (i = 0, s = ksyms; i < nksyms; i++, s++) - if (!strcmp((char *)s->name, "data_start")) + if (!strcmp((char *)s->name, "$global$")) break; if (i >= nksyms) { - error("Cannot initialise dp, 'data_start' not found\n"); + error("Cannot initialise dp, '$global$' not found\n"); return 1; } hfile->dp = s->value; diff --git a/mdk-stage1/insmod-modutils/obj/obj_hppa64.c b/mdk-stage1/insmod-modutils/obj/obj_hppa64.c index fe32911ff..d9f1ada9d 100644 --- a/mdk-stage1/insmod-modutils/obj/obj_hppa64.c +++ b/mdk-stage1/insmod-modutils/obj/obj_hppa64.c @@ -22,8 +22,6 @@ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#ident "$Id$" - #include <string.h> #include <assert.h> #include <stdlib.h> @@ -94,15 +92,15 @@ typedef struct _hppa64_file_t * 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: + * We need a different stub for millicode calls, which doesn't depend on + * or modify dp: * - * 53 61 00 00 ldd 0(dp),r1 - * R_PARISC_LTOFF14R <.got entry offset from dp> + * 20 20 00 00 ldil 0,r1 + * R_PARISC_DIR21L <addr of kernels opd entry> + * 34 21 00 00 ldo 0(r1),r1 + * R_PARISC_DIR14R <addr of kernels opd entry> * 50 21 00 20 ldd 10(r1),r1 - * e8 20 d0 00 bve (r1) - * 08 00 02 40 nop - * + * e8 20 d0 02 bve,n (r1) */ /* NOTE: to keep the code cleaner we make all stubs the same size. @@ -120,10 +118,10 @@ unsigned char hppa64_stub_extern[] = unsigned char hppa64_stub_millicode[] = { - 0x53, 0x61, 0x00, 0x00, + 0x20, 0x20, 0x00, 0x00, + 0x34, 0x21, 0x00, 0x00, 0x50, 0x21, 0x00, 0x20, - 0xe8, 0x20, 0xd0, 0x00, - 0x08, 0x00, 0x02, 0x40, + 0xe8, 0x20, 0xd0, 0x02, }; /*======================================================================*/ @@ -361,6 +359,7 @@ arch_create_got(struct obj_file *f) need_stub = TRUE; break; case R_PARISC_DIR64: + case R_PARISC_SEGREL32: break; case R_PARISC_FPTR64: /* This is a simple OPD entry (only created for local symbols, @@ -372,26 +371,10 @@ arch_create_got(struct obj_file *f) 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); - } + obj_find_relsym(isym, f, f, rel, symtab, strtab); local = isym->root.secidx <= SHN_HIRESERVE; if (need_stub) @@ -574,16 +557,24 @@ arch_apply_relocation(struct obj_file *f, */ unsigned char *stub; - if (!strncmp(isym->root.name, "$$", 2)) + if (!strncmp(isym->root.name, "$$", 2)) { stub = hppa64_stub_millicode; - else + memcpy((Elf64_Addr *)(hfile->stub->contents + se->offset), + stub, SIZEOF_STUB); + v = (Elf64_Addr)isym->root.value; + ret = patch_21l(v, (Elf64_Word *)(hfile->stub->contents + se->offset)); + if (ret == obj_reloc_ok) + ret = patch_14r(v, (Elf64_Word *)(hfile->stub->contents + se->offset + 4)); + } + 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)); } + se->reloc_done = TRUE; + } v = hfile->stub->header.sh_addr + se->offset; } v = v - dot - 8; @@ -597,6 +588,11 @@ arch_apply_relocation(struct obj_file *f, loc[1] = v; } break; + case R_PARISC_SEGREL32: + { + loc[0] = v - f->baseaddr; + } + break; case R_PARISC_FPTR64: { assert(isym != NULL); diff --git a/mdk-stage1/insmod-modutils/obj/obj_i386.c b/mdk-stage1/insmod-modutils/obj/obj_i386.c index 28df3448c..fcbce8e04 100644 --- a/mdk-stage1/insmod-modutils/obj/obj_i386.c +++ b/mdk-stage1/insmod-modutils/obj/obj_i386.c @@ -19,8 +19,6 @@ 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> @@ -183,9 +181,7 @@ arch_create_got (struct obj_file *f) for (; rel < relend; ++rel) { - Elf32_Sym *extsym; struct i386_symbol *intsym; - const char *name; switch (ELF32_R_TYPE(rel->r_info)) { @@ -199,12 +195,7 @@ arch_create_got (struct obj_file *f) 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); + obj_find_relsym(intsym, f, &ifile->root, rel, symtab, strtab); if (!intsym->gotent.offset_done) { @@ -216,7 +207,8 @@ arch_create_got (struct obj_file *f) } if (offset > 0 || gotneeded) - ifile->got = obj_create_alloced_section(&ifile->root, ".got", 4, offset); + ifile->got = obj_create_alloced_section(&ifile->root, ".got", 4, offset, + SHF_WRITE); return 1; } diff --git a/mdk-stage1/insmod-modutils/obj/obj_ia64.c b/mdk-stage1/insmod-modutils/obj/obj_ia64.c index 4f92c5d27..d207a9042 100644 --- a/mdk-stage1/insmod-modutils/obj/obj_ia64.c +++ b/mdk-stage1/insmod-modutils/obj/obj_ia64.c @@ -19,8 +19,6 @@ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#ident "$Id$" - #include <string.h> #include <assert.h> #include <stdlib.h> @@ -255,14 +253,15 @@ obj_ia64_ins_imm64(Elf64_Xword v, Elf64_Addr *bundle, Elf64_Xword slot) { Elf64_Xword ins; - assert(slot == 1); + assert(slot == 2); + ins = obj_ia64_ins_extract_from_bundle(bundle, slot); - ins &= 0xffffffee000101ff; - ins |= ((v & 0x8000000000000000) >> 28) | ((v & 0x0000000000200000)) | + ins &= 0xffffffe000101fff; + ins |= ((v & 0x8000000000000000) >> 27) | ((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)); + obj_ia64_ins_insert_in_bundle(bundle, --slot, ((v & 0x7fffffffffc00000) >> 22)); return obj_reloc_ok; } @@ -295,30 +294,6 @@ obj_ia64_generate_plt(Elf64_Addr v, (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; -} /*======================================================================*/ @@ -457,26 +432,10 @@ arch_create_got(struct obj_file *f) 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); - } + obj_find_relsym(isym, f, f, rel, symtab, strtab); local = isym->root.secidx <= SHN_HIRESERVE; if (need_plt) @@ -545,20 +504,22 @@ arch_create_got(struct obj_file *f) } } - ifile->got = obj_ia64_create_alloced_section(f, ".got", 8, got_offset, - (SHF_ALLOC | SHF_WRITE | SHF_IA_64_SHORT)); + ifile->got = obj_create_alloced_section(f, ".got", 8, got_offset, + 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)); + ifile->opd = obj_create_alloced_section(f, ".opd", 16, opd_offset, + 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)); + ifile->pltt = obj_create_alloced_section(f, ".plt", 16, + plt_text_offset, + SHF_WRITE | SHF_IA_64_SHORT); + ifile->pltd = obj_create_alloced_section(f, ".IA_64.pltoff", 16, + plt_data_offset, + SHF_WRITE | SHF_IA_64_SHORT); assert(ifile->pltt != NULL); assert(ifile->pltd != NULL); } @@ -950,12 +911,8 @@ arch_apply_relocation(struct obj_file *f, 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; + /* Only one segment for modules, see segment_base in arch_archdata */ + v -= f->sections[1]->header.sh_addr; if (r_info == R_IA64_SEGREL32LSB) COPY_32LSB(loc, v); else diff --git a/mdk-stage1/insmod-modutils/obj/obj_kallsyms.c b/mdk-stage1/insmod-modutils/obj/obj_kallsyms.c index 8385fb892..1836141e9 100644 --- a/mdk-stage1/insmod-modutils/obj/obj_kallsyms.c +++ b/mdk-stage1/insmod-modutils/obj/obj_kallsyms.c @@ -17,8 +17,6 @@ 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> @@ -37,7 +35,7 @@ static void append_string (const char *s, char **strings, ElfW(Word) *strings_size, ElfW(Word) *strings_left) { - int l = strlen(s) + 1; + size_t l = strlen(s) + 1; while (l > *strings_left) { *strings = xrealloc(*strings, *strings_size += EXPAND_BY); *strings_left += EXPAND_BY; @@ -54,7 +52,7 @@ append_symbol (const struct kallsyms_symbol *s, struct kallsyms_symbol **symbols, ElfW(Word) *symbols_size, ElfW(Word) *symbols_left) { - int l = sizeof(*s); + size_t l = sizeof(*s); while (l > *symbols_left) { *symbols = xrealloc(*symbols, *symbols_size += EXPAND_BY); *symbols_left += EXPAND_BY; diff --git a/mdk-stage1/insmod-modutils/obj/obj_load.c b/mdk-stage1/insmod-modutils/obj/obj_load.c index 4db20a998..62977acb7 100644 --- a/mdk-stage1/insmod-modutils/obj/obj_load.c +++ b/mdk-stage1/insmod-modutils/obj/obj_load.c @@ -21,8 +21,6 @@ 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> @@ -52,7 +50,7 @@ obj_load (int fp, Elf32_Half e_type, const char *filename) 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); + error("cannot read ELF header from %s", filename); return NULL; } @@ -257,7 +255,7 @@ obj_load (int fp, Elf32_Half e_type, const char *filename) { case SHT_RELM: { - unsigned long nrel, j; + unsigned long nrel, j, nsyms; ElfW(RelM) *rel; struct obj_section *symtab; char *strtab; @@ -273,34 +271,25 @@ obj_load (int fp, Elf32_Half e_type, const char *filename) nrel = sec->header.sh_size / sizeof(ElfW(RelM)); rel = (ElfW(RelM) *) sec->contents; symtab = f->sections[sec->header.sh_link]; + nsyms = symtab->header.sh_size / symtab->header.sh_entsize; 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 + if (symndx >= nsyms) { - /* 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); + error("%s: Bad symbol index: %08lx >= %08lx", + filename, symndx, nsyms); + continue; } + + obj_find_relsym(intsym, f, f, rel, (ElfW(Sym) *)(symtab->contents), strtab); intsym->r_type = ELFW(R_TYPE)(rel->r_info); } } diff --git a/mdk-stage1/insmod-modutils/obj/obj_m68k.c b/mdk-stage1/insmod-modutils/obj/obj_m68k.c index cb485aed7..abc070bca 100644 --- a/mdk-stage1/insmod-modutils/obj/obj_m68k.c +++ b/mdk-stage1/insmod-modutils/obj/obj_m68k.c @@ -19,8 +19,6 @@ 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> diff --git a/mdk-stage1/insmod-modutils/obj/obj_mips.c b/mdk-stage1/insmod-modutils/obj/obj_mips.c index c2315b659..2db0791b6 100644 --- a/mdk-stage1/insmod-modutils/obj/obj_mips.c +++ b/mdk-stage1/insmod-modutils/obj/obj_mips.c @@ -18,8 +18,6 @@ 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> @@ -232,7 +230,25 @@ arch_finalize_section_address(struct obj_file *f, Elf32_Addr base) } int -arch_archdata (struct obj_file *fin, struct obj_section *sec) +arch_archdata (struct obj_file *f, struct obj_section *archdata_sec) { + struct archdata { + unsigned tgt_long __start___dbe_table; + unsigned tgt_long __stop___dbe_table; + } *ad; + struct obj_section *sec; + + if (archdata_sec->contents) + free(archdata_sec->contents); + archdata_sec->header.sh_size = 0; + sec = obj_find_section(f, "__dbe_table"); + if (sec) { + ad = (struct archdata *) (archdata_sec->contents) = xmalloc(sizeof(*ad)); + memset(ad, 0, sizeof(*ad)); + archdata_sec->header.sh_size = sizeof(*ad); + ad->__start___dbe_table = sec->header.sh_addr; + ad->__stop___dbe_table = sec->header.sh_addr + sec->header.sh_size; + } + return 0; } diff --git a/mdk-stage1/insmod-modutils/obj/obj_ppc.c b/mdk-stage1/insmod-modutils/obj/obj_ppc.c index 89bb8e46b..4889454f2 100644 --- a/mdk-stage1/insmod-modutils/obj/obj_ppc.c +++ b/mdk-stage1/insmod-modutils/obj/obj_ppc.c @@ -20,8 +20,6 @@ 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> @@ -180,8 +178,8 @@ arch_create_got (struct obj_file *f) int i, offset; struct obj_section *sec, *syms, *strs; ElfW(Rela) *rel, *relend; - ElfW(Sym) *symtab, *extsym; - const char *strtab, *name; + ElfW(Sym) *symtab; + const char *strtab; struct ppc_symbol *intsym; struct ppc_plt_entry *pe; @@ -203,12 +201,7 @@ arch_create_got (struct obj_file *f) { 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); + obj_find_relsym(intsym, f, f, rel, symtab, strtab); for (pe = intsym->plt_entries; pe != NULL; pe = pe->next) if (pe->addend == rel->r_addend) @@ -226,7 +219,7 @@ arch_create_got (struct obj_file *f) } } - pf->plt = obj_create_alloced_section(f, ".plt", 16, offset); + pf->plt = obj_create_alloced_section(f, ".plt", 16, offset, SHF_WRITE); return 1; } @@ -249,7 +242,25 @@ arch_finalize_section_address(struct obj_file *f, Elf32_Addr base) } int -arch_archdata (struct obj_file *fin, struct obj_section *sec) +arch_archdata (struct obj_file *f, struct obj_section *archdata_sec) { + struct archdata { + unsigned tgt_long __start___ftr_fixup; + unsigned tgt_long __stop___ftr_fixup; + } *ad; + struct obj_section *sec; + + if (archdata_sec->contents) + free(archdata_sec->contents); + archdata_sec->header.sh_size = 0; + sec = obj_find_section(f, "__ftr_fixup"); + if (sec) { + ad = (struct archdata *) (archdata_sec->contents) = xmalloc(sizeof(*ad)); + memset(ad, 0, sizeof(*ad)); + archdata_sec->header.sh_size = sizeof(*ad); + ad->__start___ftr_fixup = sec->header.sh_addr; + ad->__stop___ftr_fixup = sec->header.sh_addr + sec->header.sh_size; + } + return 0; } diff --git a/mdk-stage1/insmod-modutils/obj/obj_reloc.c b/mdk-stage1/insmod-modutils/obj/obj_reloc.c index f5f2de90d..3f2c8aab0 100644 --- a/mdk-stage1/insmod-modutils/obj/obj_reloc.c +++ b/mdk-stage1/insmod-modutils/obj/obj_reloc.c @@ -19,8 +19,6 @@ 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> @@ -48,7 +46,7 @@ obj_string_patch(struct obj_file *f, int secidx, ElfW(Addr) offset, strsec = obj_find_section(f, ".kstrtab"); if (strsec == NULL) { - strsec = obj_create_alloced_section(f, ".kstrtab", 1, len); + strsec = obj_create_alloced_section(f, ".kstrtab", 1, len, 0); p->string_offset = 0; loc = strsec->contents; } @@ -284,6 +282,7 @@ obj_relocate (struct obj_file *f, ElfW(Addr) base) ElfW(RelM) *rel, *relend; ElfW(Sym) *symtab; const char *strtab; + unsigned long nsyms; relsec = f->sections[i]; if (relsec->header.sh_type != SHT_RELM) @@ -293,9 +292,13 @@ obj_relocate (struct obj_file *f, ElfW(Addr) base) targsec = f->sections[relsec->header.sh_info]; strsec = f->sections[symsec->header.sh_link]; + if (!(targsec->header.sh_flags & SHF_ALLOC)) + continue; + rel = (ElfW(RelM) *)relsec->contents; relend = rel + (relsec->header.sh_size / sizeof(ElfW(RelM))); symtab = (ElfW(Sym) *)symsec->contents; + nsyms = symsec->header.sh_size / symsec->header.sh_entsize; strtab = (const char *)strsec->contents; for (; rel < relend; ++rel) @@ -303,7 +306,6 @@ obj_relocate (struct obj_file *f, ElfW(Addr) base) 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. */ @@ -313,33 +315,18 @@ obj_relocate (struct obj_file *f, ElfW(Addr) base) { /* 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 + if (symndx >= nsyms) { - /* 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); + error("Bad symbol index: %08lx >= %08lx", + symndx, nsyms); + continue; } + obj_find_relsym(intsym, f, f, rel, symtab, strtab); 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 @@ -362,17 +349,8 @@ obj_relocate (struct obj_file *f, ElfW(Addr) base) 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)); - } + (long)ELFW(R_TYPE)(rel->r_info), intsym->name); ret = 0; break; } diff --git a/mdk-stage1/insmod-modutils/obj/obj_s390.c b/mdk-stage1/insmod-modutils/obj/obj_s390.c index 3da72e771..a76e28479 100644 --- a/mdk-stage1/insmod-modutils/obj/obj_s390.c +++ b/mdk-stage1/insmod-modutils/obj/obj_s390.c @@ -1,6 +1,10 @@ -/* S/390 specific support for Elf loading and relocation. - Copyright 1996, 1997 Linux International. +/* IBM S/390 31-bit specific support for Elf loading and relocation. + Copyright 2000, 2001 IBM Deutschland Entwicklung GmbH, IBM Corporation. + Contributed by Martin Schwidefsky <schwidefsky@de.ibm.com> + + Derived from obj/obj_i386.c: + Copyright 1996, 1997 Linux International. Contributed by Richard Henderson <rth@tamu.edu> This file is part of the Linux modutils. @@ -19,8 +23,6 @@ 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> @@ -31,22 +33,31 @@ /*======================================================================*/ +struct s390_plt_entry +{ + long offset; + int allocated:1; + int initialized:1; +}; + struct s390_got_entry { - int offset; - unsigned offset_done : 1; + long offset; + unsigned allocated:1; unsigned reloc_done : 1; }; struct s390_file { struct obj_file root; + struct obj_section *plt; struct obj_section *got; }; struct s390_symbol { struct obj_symbol root; + struct s390_plt_entry pltent; struct s390_got_entry gotent; }; @@ -59,6 +70,7 @@ arch_new_file (void) struct s390_file *f; f = xmalloc(sizeof(*f)); f->got = NULL; + f->plt = NULL; return &f->root; } @@ -74,6 +86,7 @@ arch_new_symbol (void) struct s390_symbol *sym; sym = xmalloc(sizeof(*sym)); memset(&sym->gotent, 0, sizeof(sym->gotent)); + memset(&sym->pltent, 0, sizeof(sym->pltent)); return &sym->root; } @@ -95,12 +108,14 @@ arch_apply_relocation (struct obj_file *f, Elf32_Rela *rel, Elf32_Addr v) { - struct s390_file *ifile = (struct s390_file *)f; - struct s390_symbol *isym = (struct s390_symbol *)sym; + struct s390_file *ifile = (struct s390_file *) f; + struct s390_symbol *isym = (struct s390_symbol *) sym; + struct s390_plt_entry *pe; 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; + Elf32_Addr plt = ifile->plt ? ifile->plt->header.sh_addr : 0; enum obj_reloc ret = obj_reloc_ok; @@ -110,12 +125,48 @@ arch_apply_relocation (struct obj_file *f, break; case R_390_32: - *loc += v; + *(unsigned int *) loc += v; + break; + case R_390_16: + *(unsigned short *) loc += v; + break; + case R_390_8: + *(unsigned char *) loc += v; break; - case R_390_PLT32: case R_390_PC32: - *loc += v - dot; + *(unsigned int *) loc += v - dot; + break; + case R_390_PC16DBL: + *(unsigned short *) loc += (v - dot) >> 1; + break; + case R_390_PC16: + *(unsigned short *) loc += v - dot; + break; + + case R_390_PLT32: + case R_390_PLT16DBL: + /* find the plt entry and initialize it. */ + assert(isym != NULL); + pe = (struct s390_plt_entry *) &isym->pltent; + assert(pe->allocated); + if (pe->initialized == 0) { + unsigned int *ip = (unsigned int *)(ifile->plt->contents + pe->offset); + ip[0] = 0x0d105810; /* basr 1,0; lg 1,10(1); br 1 */ + ip[1] = 0x100607f1; + if (ELF32_R_TYPE(rel->r_info) == R_390_PLT16DBL) + ip[2] = v - 2; + else + ip[2] = v; + pe->initialized = 1; + } + + /* Insert relative distance to target. */ + v = plt + pe->offset - dot; + if (ELF32_R_TYPE(rel->r_info) == R_390_PLT32) + *(unsigned int *) loc = (unsigned int) v; + else if (ELF32_R_TYPE(rel->r_info) == R_390_PLT16DBL) + *(unsigned short *) loc = (unsigned short) ((v + 2) >> 1); break; case R_390_GLOB_DAT: @@ -129,17 +180,25 @@ arch_apply_relocation (struct obj_file *f, case R_390_GOTPC: assert(got != 0); - *loc += got - dot; + *(unsigned long *) loc += got - dot; break; + case R_390_GOT12: + case R_390_GOT16: case R_390_GOT32: assert(isym != NULL); + assert(got != 0); if (!isym->gotent.reloc_done) { isym->gotent.reloc_done = 1; *(Elf32_Addr *)(ifile->got->contents + isym->gotent.offset) = v; } - *loc += isym->gotent.offset; + if (ELF32_R_TYPE(rel->r_info) == R_390_GOT12) + *(unsigned short *) loc |= (*(unsigned short *) loc + isym->gotent.offset) & 0xfff; + else if (ELF32_R_TYPE(rel->r_info) == R_390_GOT16) + *(unsigned short *) loc += isym->gotent.offset; + else if (ELF32_R_TYPE(rel->r_info) == R_390_GOT32) + *(unsigned int *) loc += isym->gotent.offset; break; case R_390_GOTOFF: @@ -158,71 +217,98 @@ arch_apply_relocation (struct obj_file *f, int arch_create_got (struct obj_file *f) { - struct s390_file *ifile = (struct s390_file *)f; - int i, n, offset = 0, gotneeded = 0; + struct s390_file *ifile = (struct s390_file *) f; + int i, got_offset = 0, plt_offset = 0, gotneeded = 0; - n = ifile->root.header.e_shnum; - for (i = 0; i < n; ++i) + for (i = 0; i < f->header.e_shnum; ++i) { struct obj_section *relsec, *symsec, *strsec; - Elf32_Rel *rel, *relend; + Elf32_Rela *rel, *relend; Elf32_Sym *symtab; const char *strtab; - relsec = ifile->root.sections[i]; - if (relsec->header.sh_type != SHT_REL) + relsec = f->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]; + symsec = f->sections[relsec->header.sh_link]; + strsec = f->sections[symsec->header.sh_link]; - rel = (Elf32_Rel *)relsec->contents; - relend = rel + (relsec->header.sh_size / sizeof(Elf32_Rel)); + rel = (Elf32_Rela *)relsec->contents; + relend = rel + (relsec->header.sh_size / sizeof(Elf32_Rela)); 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)) - { + struct s390_plt_entry *pe; + struct s390_got_entry *ge; + + switch (ELF32_R_TYPE(rel->r_info)) { + /* These four relocations refer to a plt entry. */ + case R_390_PLT16DBL: + case R_390_PLT32: + obj_find_relsym(intsym, f, f, rel, symtab, strtab); + assert(intsym); + pe = &intsym->pltent; + if (!pe->allocated) { + pe->allocated = 1; + pe->offset = plt_offset; + plt_offset += 12; + } + break; + /* The next three don't need got entries but the address + of the got itself. */ case R_390_GOTPC: case R_390_GOTOFF: gotneeded = 1; - default: - continue; + break; + case R_390_GOT12: + case R_390_GOT16: case R_390_GOT32: - break; + obj_find_relsym(intsym, f, f, rel, symtab, strtab); + assert(intsym); + ge = (struct s390_got_entry *) &intsym->gotent; + if (!ge->allocated) { + ge->allocated = 1; + ge->offset = got_offset; + got_offset += sizeof(void*); } + 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; + default: + break; } } } - if (offset > 0 || gotneeded) - ifile->got = obj_create_alloced_section(&ifile->root, ".got", 4, offset); + if (got_offset > 0 || gotneeded) { + struct obj_section *gotsec; + struct obj_symbol *gotsym; + + gotsec = obj_find_section(f, ".got"); + if (gotsec == NULL) + gotsec = obj_create_alloced_section(f, ".got", 4, got_offset, SHF_WRITE); + else + obj_extend_section(gotsec, got_offset); + gotsym = obj_add_symbol(f, "_GLOBAL_OFFSET_TABLE_", -1, + ELFW(ST_INFO) (STB_LOCAL, STT_OBJECT), + gotsec->idx, 0, 0); + gotsym->secidx = gotsec->idx; /* mark the symbol as defined */ + ifile->got = gotsec; + } + + if (plt_offset > 0) + ifile->plt = obj_create_alloced_section(f, ".plt", 4, plt_offset, + SHF_WRITE); return 1; } int -arch_init_module (struct obj_file *f, struct module *m) +arch_init_module (struct obj_file *f, struct module *mod) { return 1; } @@ -243,3 +329,4 @@ 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 index 1a03c9090..d1eb3da44 100644 --- a/mdk-stage1/insmod-modutils/obj/obj_sparc.c +++ b/mdk-stage1/insmod-modutils/obj/obj_sparc.c @@ -19,8 +19,6 @@ 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> diff --git a/mdk-stage1/insmod-modutils/obj/obj_sparc64.c b/mdk-stage1/insmod-modutils/obj/obj_sparc64.c index 84e8d18a0..f025667f8 100644 --- a/mdk-stage1/insmod-modutils/obj/obj_sparc64.c +++ b/mdk-stage1/insmod-modutils/obj/obj_sparc64.c @@ -19,8 +19,6 @@ 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> diff --git a/mdk-stage1/insmod-modutils/obj/obj_x86_64.c b/mdk-stage1/insmod-modutils/obj/obj_x86_64.c new file mode 100644 index 000000000..56dfeeabd --- /dev/null +++ b/mdk-stage1/insmod-modutils/obj/obj_x86_64.c @@ -0,0 +1,253 @@ +/* x86-64 specific support for Elf loading and relocation. + Copyright 2002 SuSE Linux AG. + + Contributed by Andreas Jaeger <aj@suse.de>. + + 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 x86_64_got_entry +{ + long int offset; + unsigned offset_done : 1; + unsigned reloc_done : 1; +}; + +struct x86_64_file +{ + struct obj_file root; + struct obj_section *got; +}; + +struct x86_64_symbol +{ + struct obj_symbol root; + struct x86_64_got_entry gotent; +}; + + +/*======================================================================*/ + +struct obj_file * +arch_new_file (void) +{ + struct x86_64_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 x86_64_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, + Elf64_Rela *rel, + Elf64_Addr v) +{ + struct x86_64_file *ifile = (struct x86_64_file *)f; + struct x86_64_symbol *isym = (struct x86_64_symbol *)sym; + + Elf64_Addr *loc = (Elf64_Addr *)(targsec->contents + rel->r_offset); + Elf64_Addr dot = targsec->header.sh_addr + rel->r_offset; + Elf64_Addr got = ifile->got ? ifile->got->header.sh_addr : 0; + + enum obj_reloc ret = obj_reloc_ok; + + switch (ELF64_R_TYPE(rel->r_info)) + { + case R_X86_64_NONE: + break; + + case R_X86_64_64: + *loc += v; + break; + + case R_X86_64_32: + *(unsigned int *) loc += v; + break; + + case R_X86_64_32S: + *(signed int *) loc += v; + break; + + case R_X86_64_16: + *(unsigned short *) loc += v; + break; + + case R_X86_64_8: + *(unsigned char *) loc += v; + break; + + case R_X86_64_PC32: + *(unsigned int *) loc += v - dot; + break; + + case R_X86_64_PC16: + *(unsigned short *) loc += v - dot; + break; + + case R_X86_64_PC8: + *(unsigned char *) loc += v - dot; + break; + + case R_X86_64_GLOB_DAT: + case R_X86_64_JUMP_SLOT: + *loc = v; + break; + + case R_X86_64_RELATIVE: + *loc += f->baseaddr; + break; + + case R_X86_64_GOT32: + case R_X86_64_GOTPCREL: + assert(isym != NULL); + if (!isym->gotent.reloc_done) + { + isym->gotent.reloc_done = 1; + *(Elf64_Addr *)(ifile->got->contents + isym->gotent.offset) = v; + } + /* XXX are these really correct? */ + if (ELF64_R_TYPE(rel->r_info) == R_X86_64_GOTPCREL) + *(unsigned int *) loc += v + isym->gotent.offset; + else + *loc += isym->gotent.offset; + break; + + default: + ret = obj_reloc_unhandled; + break; + } + + return ret; +} + +int +arch_create_got (struct obj_file *f) +{ + struct x86_64_file *ifile = (struct x86_64_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; + Elf64_Rela *rel, *relend; + Elf64_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 = (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 x86_64_symbol *intsym; + + switch (ELF64_R_TYPE(rel->r_info)) + { + case R_X86_64_GOTPCREL: + case R_X86_64_GOT32: + gotneeded = 1; + default: + continue; + } + + obj_find_relsym(intsym, f, &ifile->root, rel, symtab, strtab); + + 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", 8, offset, + SHF_WRITE); + + 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 index 763f046f2..dd8107435 100644 --- a/mdk-stage1/insmod-modutils/util/Makefile +++ b/mdk-stage1/insmod-modutils/util/Makefile @@ -13,7 +13,7 @@ top_dir = ../.. include $(top_dir)/Makefile.common -all: libutil.a libutil-STANDALONE.a #libutil-DIET.a +all: libutil.a libutil-STANDALONE.a clean: rm -f *.o *.a @@ -36,7 +36,7 @@ libutil-STANDALONE.a: $(OBJS) logger-standalone.o ranlib $@ logger-standalone.o: logger.c - gcc $(CFLAGS) $(DEFS) $(INCS) $(GLIBC_INCLUDES) -o $@ -D_STANDALONE_ -c logger.c + $(DIET) gcc $(CFLAGS) $(DEFS) $(INCS) $(INCLUDES) -o $@ -D_STANDALONE_ -c logger.c -.c.o: - gcc $(CFLAGS) $(DEFS) $(INCS) $(GLIBC_INCLUDES) -c $< +%.o: %.c + $(DIET) gcc $(CFLAGS) $(DEFS) $(INCS) $(INCLUDES) -c $< diff --git a/mdk-stage1/insmod-modutils/util/alias.h b/mdk-stage1/insmod-modutils/util/alias.h index c925a04f3..7d0c08938 100644 --- a/mdk-stage1/insmod-modutils/util/alias.h +++ b/mdk-stage1/insmod-modutils/util/alias.h @@ -42,6 +42,7 @@ char *tbtype[] = */ char *aliaslist[] = { + "binfmt-0000 off", "binfmt-204 binfmt_aout", "binfmt-263 binfmt_aout", "binfmt-264 binfmt_aout", @@ -75,15 +76,23 @@ char *aliaslist[] = "block-major-34 ide-probe-mod", "block-major-37 ide-tape", "block-major-44 ftl", /* from David Woodhouse <dwmw2@infradead.org> */ + "block-major-46 pcd", + "block-major-47 pf", "block-major-56 ide-probe-mod", "block-major-57 ide-probe-mod", + "block-major-58 lvm-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> */ + "block-major-97 pg", +#if !defined(__s390__) && !defined(__s390x__) "char-major-4 serial", +#else + "char-major-4 off", +#endif "char-major-5 serial", "char-major-6 lp", "char-major-9 st", @@ -102,13 +111,15 @@ char *aliaslist[] = "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-135 rtc", /* /dev/rtc Real time clock */ "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-13 input", + "char-major-13-32 mousedev", "char-major-14 soundcore", "char-major-19 cyclades", "char-major-20 cyclades", @@ -126,9 +137,15 @@ char *aliaslist[] = "char-major-58 esp", "char-major-63 kdebug", "char-major-90 mtdchar", /* from David Woodhouse <dwmw2@infradead.org> */ + "char-major-96 pt", "char-major-99 ppdev", "char-major-107 3dfx", /* from Tigran Aivazian <tigran@sco.COM> */ + "char-major-108 ppp_generic", + "char-major-109 lvm-mod", "char-major-161 ircomm-tty", + "char-major-171 raw1394", + "char-major-195 NVdriver", + "char-major-200 vxspec", "dos msdos", "dummy0 dummy", @@ -139,6 +156,7 @@ char *aliaslist[] = "md-personality-2 raid0", "md-personality-3 raid1", "md-personality-4 raid5", + "md-personality-7 multipath", "net-pf-1 unix", /* PF_UNIX 1 Unix domain sockets */ "net-pf-2 ipv4", /* PF_INET 2 Internet IP Protocol */ @@ -149,29 +167,52 @@ char *aliaslist[] = /* 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 */ + "net-pf-10 off", /* 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", + + /* To be able to attach some dongles */ + "irlan0 irlan", + "irda-dongle-0 tekram", + "irda-dongle-1 esi", + "irda-dongle-2 actisys", + "irda-dongle-3 actisys", + "irda-dongle-4 girbil", + "irda-dongle-5 litelink", + "irda-dongle-6 airport", + "irda-dongle-7 old_belkin", + "plip0 plip", "plip1 plip", + "tunl0 ipip", "cipcb0 cipcb", "cipcb1 cipcb", "cipcb2 cipcb", "cipcb3 cipcb", +#if defined(__s390__) || defined(__s390x__) + "ctc0 ctc", + "ctc1 ctc", + "ctc2 ctc", + "iucv0 netiucv", + "iucv1 netiucv", +#endif "ppp0 ppp", "ppp1 ppp", - "scsi_hostadapter off", /* if not in config file */ "slip0 slip", "slip1 slip", "tty-ldisc-1 slip", - "tty-ldisc-3 ppp", + "tty-ldisc-3 ppp_async", + "tty-ldisc-11 irtty", /* IrDA over a normal serial port, or a serial port compatible IrDA port */ + "tty-ldisc-14 ppp_synctty", + "ppp-compress-18 ppp_mppe", "ppp-compress-21 bsd_comp", "ppp-compress-24 ppp_deflate", "ppp-compress-26 ppp_deflate", + "ppp ppp_async", /* for 2.4 */ #ifndef __sparc__ "parport_lowlevel parport_pc", @@ -179,8 +220,6 @@ char *aliaslist[] = "parport_lowlevel parport_ax", #endif - "tty-ldisc-11 irtty", - "usbdevfs usbcore", NULL /* marks the end of the list! */ @@ -205,6 +244,9 @@ char *optlist[] = */ char *above[] = { + "hid keybdev mousedev", + "usbmouse hid", + "wacom evdev", NULL /* marks the end of the list! */ }; @@ -219,19 +261,43 @@ char *below[] = }; /* + * This is the list of pre-defined "post-install"s, + * used to execute commands after loading modules. + * /etc/modules.conf can add entries but not remove them. + */ +char *post_install[] = +{ + "binfmt_misc /bin/mount -t binfmt_misc none /proc/sys/fs/binfmt_misc > /dev/null 2>&1 || :", + NULL +}; + +/* + * This is the list of pre-defined "pre-remove"s, + * used to execute commands before unloading modules. + * /etc/modules.conf can add entries but not remove them. + */ +char *pre_remove[] = +{ + "binfmt_misc /bin/umount /proc/sys/fs/binfmt_misc > /dev/null 2>&1 || :", + NULL +}; + +/* * 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.description", "modules.generic_string", "modules.pcimap", "modules.isapnpmap", "modules.usbmap", "modules.parportmap", + "modules.ieee1394map", + "modules.pnpbiosmap", "System.map", ".config", "build", /* symlink to source tree */ diff --git a/mdk-stage1/insmod-modutils/util/arch64.c b/mdk-stage1/insmod-modutils/util/arch64.c index 4d5ace223..90886d16b 100644 --- a/mdk-stage1/insmod-modutils/util/arch64.c +++ b/mdk-stage1/insmod-modutils/util/arch64.c @@ -18,8 +18,6 @@ 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> @@ -30,6 +28,16 @@ /* Indicate if the current machine uses 64 bit architecture */ int arch64(void) { - struct utsname u; - return(!uname(&u) && strstr(u.machine, "64")); + struct utsname uts; + char *uname_m; + if (uname(&uts)) + return(0); + if ((uname_m = getenv("UNAME_MACHINE"))) { + int l = strlen(uname_m); + if (l >= sizeof(uts.machine)) + l = sizeof(uts.machine)-1; + memcpy(uts.machine, uname_m, l); + uts.machine[l] = '\0'; + } + return(strstr(uts.machine, "64") != NULL); } diff --git a/mdk-stage1/insmod-modutils/util/config.c b/mdk-stage1/insmod-modutils/util/config.c index a860920f6..7568d955f 100644 --- a/mdk-stage1/insmod-modutils/util/config.c +++ b/mdk-stage1/insmod-modutils/util/config.c @@ -116,6 +116,8 @@ struct gen_files gen_file[] = { {"isapnpmap", NULL, 0}, {"usbmap", NULL, 0}, {"parportmap", NULL, 0}, + {"ieee1394map", NULL, 0}, + {"pnpbiosmap", NULL, 0}, {"dep", NULL, 0}, }; @@ -491,7 +493,7 @@ static int do_read(int all, char *force_ver, char *base_dir, char *conf_file, in int state[MAX_LEVEL + 1]; /* nested "if" */ int level = 0; char buf[3000]; - char tmpline[100]; + char tmpline[PATH_MAX]; char **pathp; char *envpath; char *version; @@ -692,6 +694,20 @@ static int do_read(int all, char *force_ver, char *base_dir, char *conf_file, in if (all && aliaslist[0]) n_aliases = build_list(aliaslist, &aliases, version, 0); + /* + * Build predef postinstalls + */ + if (all && post_install[0]) + for (i=0 ; post_install[i] ; i++ ) + decode_exec(xstrdup(post_install[i]), EXEC_POST_INSTALL); + + /* + * Build predef preremoves + */ + if (all && pre_remove[0]) + for (i=0 ; pre_remove[i] ; i++ ) + decode_exec(xstrdup(pre_remove[i]), EXEC_PRE_REMOVE); + /* Order and priority is now: (MODPATH + modules.conf) || (predefs + modules.conf) */ if ((envpath = getenv("MODPATH")) != NULL && !safemode) { size_t len; @@ -1073,7 +1089,7 @@ static int do_read(int all, char *force_ver, char *base_dir, char *conf_file, in 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); + putenv(xstrdup(env)); one_err = 0; } @@ -1108,7 +1124,7 @@ static int do_read(int all, char *force_ver, char *base_dir, char *conf_file, in /* * prune */ - else if (all && !assgn && strcmp(parm, "prune") == 0) { + else if (!assgn && strcmp(parm, "prune") == 0) { decode_list(&n_prunelist, &prunelist, arg, adding, version, 0); one_err = 0; } @@ -1349,9 +1365,11 @@ static int do_read(int all, char *force_ver, char *base_dir, char *conf_file, in return ret; /* else */ + if (depth == 0) { /* 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; } @@ -1367,7 +1385,12 @@ int config_read(int all, char *force_ver, char *base_dir, char *conf_file) return -1; } + if (access(MODUTILS_MACROS, R_OK) == 0){ + r = do_read(all, force_ver, base_dir, MODUTILS_MACROS, 0); + r = do_read(all, force_ver, "", conf_file, 1); + } else { r = do_read(all, force_ver, base_dir, conf_file, 0); + } if (quick && !r && !need_update (force_ver, base_dir)) exit (0); diff --git a/mdk-stage1/insmod-modutils/util/logger.c b/mdk-stage1/insmod-modutils/util/logger.c index 3b790df5a..4774a0beb 100644 --- a/mdk-stage1/insmod-modutils/util/logger.c +++ b/mdk-stage1/insmod-modutils/util/logger.c @@ -20,8 +20,7 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ -#ident "$Id$" - +#include <limits.h> #include <stdio.h> #include <stdarg.h> #include <stdlib.h> @@ -32,9 +31,10 @@ /*======================================================================*/ +int log; + int errors; const char *error_file; -int log; #define STOREMSG #ifdef STOREMSG @@ -44,29 +44,12 @@ struct cbuf { 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); } +#endif /* STOREMSG */ void setsyslog(const char *program) { @@ -77,13 +60,27 @@ void setsyslog(const char *program) log = 1; } - - #ifdef _STANDALONE_ static int silent; const char *program_name; +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; +} + void error(const char *fmt,...) { va_list args; @@ -91,7 +88,7 @@ void error(const char *fmt,...) if (silent) ; else if (log) { - char buf[1024]; + char buf[2*PATH_MAX]; int n; if (error_file) @@ -124,7 +121,7 @@ void lprintf(const char *fmt,...) if (silent); else if (log) { - char buf[1024]; + char buf[2*PATH_MAX]; va_start(args, fmt); vsnprintf(buf, sizeof(buf), fmt, args); va_end(args); @@ -140,7 +137,6 @@ void lprintf(const char *fmt,...) putchar('\n'); } } - #else /* _STANDALONE_ */ #include "../../log.h" void error(const char *s, ...) @@ -161,3 +157,4 @@ void lprintf(const char *s, ...) va_end(p); } #endif + diff --git a/mdk-stage1/insmod-modutils/util/snap_shot.c b/mdk-stage1/insmod-modutils/util/snap_shot.c index ae0cc7c79..adf54d28e 100644 --- a/mdk-stage1/insmod-modutils/util/snap_shot.c +++ b/mdk-stage1/insmod-modutils/util/snap_shot.c @@ -20,8 +20,6 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ -#ident "$Id$" - #include <errno.h> #include <stdio.h> #include <stdarg.h> @@ -108,6 +106,7 @@ void snap_shot(const char *module_names, int n_module_names) if (ferror(in)) error("unable to read from %s %m", infile[i]); fclose(in); + fflush(out); fclose(out); } } @@ -150,5 +149,6 @@ void snap_shot_log(const char *fmt,...) vfprintf(log, fmt, args); va_end(args); fprintf(log, "\n"); + fflush(log); fclose(log); } diff --git a/mdk-stage1/insmod-modutils/util/sys_cm.c b/mdk-stage1/insmod-modutils/util/sys_cm.c index 851fb709e..d19a5ba4b 100644 --- a/mdk-stage1/insmod-modutils/util/sys_cm.c +++ b/mdk-stage1/insmod-modutils/util/sys_cm.c @@ -18,8 +18,6 @@ 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> diff --git a/mdk-stage1/insmod-modutils/util/sys_dm.c b/mdk-stage1/insmod-modutils/util/sys_dm.c index a166a30f4..611234efa 100644 --- a/mdk-stage1/insmod-modutils/util/sys_dm.c +++ b/mdk-stage1/insmod-modutils/util/sys_dm.c @@ -18,8 +18,6 @@ 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> diff --git a/mdk-stage1/insmod-modutils/util/sys_gks.c b/mdk-stage1/insmod-modutils/util/sys_gks.c index f71772c71..b639fc990 100644 --- a/mdk-stage1/insmod-modutils/util/sys_gks.c +++ b/mdk-stage1/insmod-modutils/util/sys_gks.c @@ -18,8 +18,6 @@ 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> diff --git a/mdk-stage1/insmod-modutils/util/sys_nim.c b/mdk-stage1/insmod-modutils/util/sys_nim.c index bbe42135c..c267ddf10 100644 --- a/mdk-stage1/insmod-modutils/util/sys_nim.c +++ b/mdk-stage1/insmod-modutils/util/sys_nim.c @@ -18,8 +18,6 @@ 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> diff --git a/mdk-stage1/insmod-modutils/util/sys_oim.c b/mdk-stage1/insmod-modutils/util/sys_oim.c index 73ac6be52..b915e36a5 100644 --- a/mdk-stage1/insmod-modutils/util/sys_oim.c +++ b/mdk-stage1/insmod-modutils/util/sys_oim.c @@ -18,8 +18,6 @@ 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> diff --git a/mdk-stage1/insmod-modutils/util/sys_qm.c b/mdk-stage1/insmod-modutils/util/sys_qm.c index 119a219a2..ba478832b 100644 --- a/mdk-stage1/insmod-modutils/util/sys_qm.c +++ b/mdk-stage1/insmod-modutils/util/sys_qm.c @@ -18,8 +18,6 @@ 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> diff --git a/mdk-stage1/insmod-modutils/util/xmalloc.c b/mdk-stage1/insmod-modutils/util/xmalloc.c index 9113d47fe..da0be2953 100644 --- a/mdk-stage1/insmod-modutils/util/xmalloc.c +++ b/mdk-stage1/insmod-modutils/util/xmalloc.c @@ -18,8 +18,6 @@ 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" @@ -29,7 +27,7 @@ void * xmalloc(size_t size) { - void *ptr = malloc(size); + void *ptr = malloc(size ? size : 1); if (!ptr) { error("Out of memory"); diff --git a/mdk-stage1/insmod-modutils/util/xrealloc.c b/mdk-stage1/insmod-modutils/util/xrealloc.c index d287486f7..adc0558f1 100644 --- a/mdk-stage1/insmod-modutils/util/xrealloc.c +++ b/mdk-stage1/insmod-modutils/util/xrealloc.c @@ -18,8 +18,6 @@ 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" diff --git a/mdk-stage1/insmod-modutils/util/xstrcat.c b/mdk-stage1/insmod-modutils/util/xstrcat.c index abb075c83..ed4a2bf20 100644 --- a/mdk-stage1/insmod-modutils/util/xstrcat.c +++ b/mdk-stage1/insmod-modutils/util/xstrcat.c @@ -17,8 +17,6 @@ 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" diff --git a/mdk-stage1/insmod-modutils/util/xstrdup.c b/mdk-stage1/insmod-modutils/util/xstrdup.c index 11b289eb0..46889a094 100644 --- a/mdk-stage1/insmod-modutils/util/xstrdup.c +++ b/mdk-stage1/insmod-modutils/util/xstrdup.c @@ -18,10 +18,8 @@ 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 <stdlib.h> #include <string.h> #include "util.h" diff --git a/mdk-stage1/insmod-modutils/util/xsystem.c b/mdk-stage1/insmod-modutils/util/xsystem.c index edb995268..8ffa490a9 100644 --- a/mdk-stage1/insmod-modutils/util/xsystem.c +++ b/mdk-stage1/insmod-modutils/util/xsystem.c @@ -17,8 +17,6 @@ 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> diff --git a/mdk-stage1/log.c b/mdk-stage1/log.c index 319079fd7..0404ba46b 100644 --- a/mdk-stage1/log.c +++ b/mdk-stage1/log.c @@ -37,6 +37,9 @@ static FILE * logfile = NULL; void vlog_message(const char * s, va_list args) { + va_list args_copy; + va_copy(args_copy, args); + if (logfile) { fprintf(logfile, "* "); vfprintf(logfile, s, args); @@ -45,10 +48,12 @@ void vlog_message(const char * s, va_list args) } if (logtty) { fprintf(logtty, "* "); - vfprintf(logtty, s, args); + vfprintf(logtty, s, args_copy); fprintf(logtty, "\n"); fflush(logtty); } + + va_end(args_copy); } diff --git a/mdk-stage1/mar/Makefile b/mdk-stage1/mar/Makefile index 801785947..0a12e21d8 100644 --- a/mdk-stage1/mar/Makefile +++ b/mdk-stage1/mar/Makefile @@ -25,15 +25,10 @@ include $(top_dir)/Makefile.common TARGETS = libmar.a mar -ifeq (DIETLIBC, $(L)) -TARGETS += libmar-DIET.a -endif - - all: $(TARGETS) clean: - rm -f *.o libmar.a libmar-DIET.a mar + rm -f *.o libmar.a mar mar: mar-frontend.o mar-extract-only-standalone.o @@ -44,15 +39,8 @@ 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 $(CFLAGS) $(GLIBC_INCLUDES) -c mar-extract-only.c - -mar-extract-only-DIET.o: mar-extract-only.c mar-extract-only.h mar.h - gcc $(CFLAGS) $(DIETLIBC_INCLUDES) -o $@ -c mar-extract-only.c + $(DIET) gcc $(CFLAGS) $(INCLUDES) -c mar-extract-only.c mar-frontend.o: mar-frontend.c mar.h mar-extract-only.h gcc $(CFLAGS) $(GLIBC_INCLUDES) -c mar-frontend.c diff --git a/mdk-stage1/minilibc.c b/mdk-stage1/minilibc.c index 73d7deae5..7a7e6c561 100644 --- a/mdk-stage1/minilibc.c +++ b/mdk-stage1/minilibc.c @@ -60,34 +60,92 @@ void _fini (int __status __attribute__ ((unused))) { } -inline int socket(int a, int b, int c) +#ifdef __x86_64__ +/* x86-64 implementation of signal() derived from glibc sources */ + +static inline int sigemptyset(sigset_t *set) { + *set = 0; + return 0; +} + +static inline int sigaddset(sigset_t *set, int sig) { + __asm__("btsq %1,%0" : "=m" (*set) : "Ir" (sig - 1L) : "cc"); + return 0; +} + +#define __NR___rt_sigaction __NR_rt_sigaction +static inline _syscall3(int,__rt_sigaction,int,signum,const void *,act,void *,oldact) +#define __NR___rt_sigreturn __NR_rt_sigreturn +static _syscall1(int,__rt_sigreturn,unsigned long,unused) + +static void restore_rt(void) { + __rt_sigreturn(0); +} + +int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact) { + struct sigaction *newact = (struct sigaction *)act; + if (act) { + newact = __builtin_alloca(sizeof(*newact)); + newact->sa_handler = act->sa_handler; + newact->sa_flags = act->sa_flags | SA_RESTORER; + newact->sa_restorer = &restore_rt; + newact->sa_mask = act->sa_mask; + } + return __rt_sigaction(signum, newact, oldact); +} + +__sighandler_t signal(int signum, __sighandler_t action) { + struct sigaction sa,oa; + sa.sa_handler=action; + sigemptyset(&sa.sa_mask); + sigaddset(&sa.sa_mask,signum); + sa.sa_flags=SA_RESTART; + if (sigaction(signum,&sa,&oa)) + return SIG_ERR; + return oa.sa_handler; +} + +#endif + +#ifdef __NR_socketcall + +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) +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) +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) +int accept(int a, void * addr, void * addr2) { unsigned long args[] = { a, (long) addr, (long) addr2 }; return socketcall(SYS_ACCEPT, args); } +#else + +_syscall3(int,socket,int,domain,int,type,int,protocol) +_syscall3(int,bind,int,sockfd,void *,my_addr,int,addrlen) +_syscall2(int,listen,int,s,int,backlog) +_syscall3(int,accept,int,s,void *,addr,void *,addrlen) + +#endif + void sleep(int secs) { @@ -248,4 +306,3 @@ void printf(char * fmt, ...) } } } - diff --git a/mdk-stage1/minilibc.h b/mdk-stage1/minilibc.h index e0775e3a0..cbcb21f44 100644 --- a/mdk-stage1/minilibc.h +++ b/mdk-stage1/minilibc.h @@ -58,6 +58,9 @@ extern int errno; #include <asm/fcntl.h> #include <asm/signal.h> +#ifndef __NR__newselect +#define __NR__newselect __NR_select +#endif #ifndef MINILIBC_INTERNAL static inline _syscall5(int,mount,const char *,spec,const char *,dir,const char *,type,unsigned long,rwflag,const void *,data); @@ -76,8 +79,17 @@ 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) +#ifdef __x86_64__ +extern __sighandler_t signal(int signum, __sighandler_t handler); +#else static inline _syscall2(int,signal,int,num,void *,len) +#endif +#ifdef __NR_umount static inline _syscall1(int,umount,const char *,dir) +#else +static inline _syscall2(int,umount2,const char *,dir,int,flags) +static inline int umount(const char * dir) { return umount2(dir, 0); } +#endif static inline _syscall1(int,unlink,const char *,fn) static inline _syscall1(int,close,int,fd) static inline _syscall1(int,swapoff,const char *,fn) @@ -112,19 +124,21 @@ 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) +#ifdef __NR_socketcall static inline _syscall2(int,socketcall,int,code,unsigned long *, args) +#endif #define __NR__do_exit __NR_exit -extern inline _syscall1(int,_do_exit,int,exitcode) +static 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); +int socket(int a, int b, int c); +int bind(int a, void * b, int c); +int listen(int a, int b); +int accept(int a, void * addr, void * addr2); void sleep(int secs); diff --git a/mdk-stage1/newt/Makefile b/mdk-stage1/newt/Makefile index 171bcf0cb..b5b3ea8b7 100644 --- a/mdk-stage1/newt/Makefile +++ b/mdk-stage1/newt/Makefile @@ -29,28 +29,14 @@ INCS = -I../slang TARGETS = $(LIBNAME).a -ifeq (DIETLIBC, $(L)) -TARGETS += $(LIBNAME)-DIET.a -endif - all: $(TARGETS) clean: rm -f *.o *.a -OBJS-DIET = $(subst .o,-DIET.o,$(OBJS)) - $(LIBNAME).a: $(OBJS) ar -cru $@ $^ ranlib $@ -$(LIBNAME)-DIET.a: $(OBJS-DIET) - ar -cru $@ $^ - ranlib $@ - $(OBJS): %.o: %.c - gcc $(CFLAGS) $(DEFS) $(INCS) $(GLIBC_INCLUDES) -c $< -o $@ - -$(OBJS-DIET): %-DIET.o: %.c - gcc $(CFLAGS) $(DEFS) $(INCS) $(DIETLIBC_INCLUDES) -c $< -o $@ - + $(DIET) gcc $(CFLAGS) $(DEFS) $(INCS) $(INCLUDES) -c $< -o $@ diff --git a/mdk-stage1/newt/form.c b/mdk-stage1/newt/form.c index 4ad465e38..ad7520e95 100644 --- a/mdk-stage1/newt/form.c +++ b/mdk-stage1/newt/form.c @@ -2,6 +2,7 @@ #include <slang.h> #include <stdarg.h> #include <stdlib.h> +#include <string.h> #include <sys/time.h> #include <sys/types.h> diff --git a/mdk-stage1/rescue-gui.c b/mdk-stage1/rescue-gui.c index 240d7ccba..dbe12cb4a 100644 --- a/mdk-stage1/rescue-gui.c +++ b/mdk-stage1/rescue-gui.c @@ -34,14 +34,24 @@ 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:/usr/X11R6/lib:/mnt/usr/X11R6/lib" +#if defined(__x86_64__) || defined(__ppc64__) + ":/lib64:/usr/lib64:/usr/X11R6/lib64:/mnt/lib64:/mnt/usr/lib64:/mnt/usr/X11R6/lib64" +#endif + , "HOME=/", "TERM=linux", "TERMINFO=/etc/terminfo", NULL }; -void pause(void) { unsigned char t; fflush(stdout); read(0, &t, 1); } +/* 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........ */ @@ -202,13 +212,13 @@ int main(int argc __attribute__ ((unused)), char **argv __attribute__ ((unused)) execve(child_argv[0], child_argv, env); printf("Can't execute binary (%s)\n<press Enter>\n", binary); - pause(); + PAUSE(); return 33; } while (wait4(-1, &wait_status, 0, NULL) != pid) {}; printf("<press Enter to return to Rescue GUI>"); - pause(); + PAUSE(); resume_from_suspend(); if (!WIFEXITED(wait_status) || WEXITSTATUS(wait_status) != 0) { error_message("Program exited abnormally (return code %d).", WEXITSTATUS(wait_status)); diff --git a/mdk-stage1/slang/Makefile b/mdk-stage1/slang/Makefile index 4cd1dc6bb..01700651d 100644 --- a/mdk-stage1/slang/Makefile +++ b/mdk-stage1/slang/Makefile @@ -29,28 +29,14 @@ INCS = TARGETS = $(LIBNAME).a -ifeq (DIETLIBC, $(L)) -TARGETS += $(LIBNAME)-DIET.a -endif - all: $(TARGETS) clean: rm -f *.o *.a -OBJS-DIET = $(subst .o,-DIET.o,$(OBJS)) - $(LIBNAME).a: $(OBJS) ar -cru $@ $^ ranlib $@ -$(LIBNAME)-DIET.a: $(OBJS-DIET) - ar -cru $@ $^ - ranlib $@ - $(OBJS): %.o: %.c - gcc $(CFLAGS) $(DEFS) $(INCS) $(GLIBC_INCLUDES) -c $< -o $@ - -$(OBJS-DIET): %-DIET.o: %.c - gcc $(CFLAGS) $(DEFS) $(INCS) $(DIETLIBC_INCLUDES) -c $< -o $@ - + $(DIET) gcc $(CFLAGS) $(DEFS) $(INCS) $(INCLUDES) -c $< -o $@ diff --git a/mdk-stage1/stage1.h b/mdk-stage1/stage1.h index 8539ff0b0..106481791 100644 --- a/mdk-stage1/stage1.h +++ b/mdk-stage1/stage1.h @@ -41,6 +41,7 @@ extern char * stage2_kickstart; #define MODE_CHANGEDISK (1 << 10) #define MODE_UPDATEMODULES (1 << 11) #define MODE_NOAUTO (1 << 12) +#define MODE_NETAUTO (1 << 13) #define KA_MAX_RETRY 5 #define IS_TESTING (get_param(MODE_TESTING)) @@ -52,6 +53,7 @@ extern char * stage2_kickstart; #define IS_CHANGEDISK (get_param(MODE_CHANGEDISK)) #define IS_UPDATEMODULES (get_param(MODE_UPDATEMODULES)) #define IS_NOAUTO (get_param(MODE_NOAUTO)) +#define IS_NETAUTO (get_param(MODE_NETAUTO)) void fatal_error(char *msg) __attribute__ ((noreturn)); diff --git a/mdk-stage1/stdio-frontend.c b/mdk-stage1/stdio-frontend.c index 3fbed999a..ea26bff14 100644 --- a/mdk-stage1/stdio-frontend.c +++ b/mdk-stage1/stdio-frontend.c @@ -330,7 +330,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, void (*callback_func)(char ** strings) UNUSED) { int j, i = 0; char ** already_answers = NULL; diff --git a/mdk-stage1/tools.c b/mdk-stage1/tools.c index 0df0cd31b..9444ac98e 100644 --- a/mdk-stage1/tools.c +++ b/mdk-stage1/tools.c @@ -91,6 +91,7 @@ void process_cmdline(void) if (!strcmp(name, "updatemodules")) set_param(MODE_UPDATEMODULES); if (!strcmp(name, "rescue")) set_param(MODE_RESCUE); if (!strcmp(name, "noauto")) set_param(MODE_NOAUTO); + if (!strcmp(name, "netauto")) set_param(MODE_NETAUTO); if (!strcmp(name, "special_stage2")) set_param(MODE_SPECIAL_STAGE2); if (!strcmp(name, "automatic")) { set_param(MODE_AUTOMATIC); diff --git a/perl-install/Makefile b/perl-install/Makefile index f96dadcf2..d6a5e2c94 100644 --- a/perl-install/Makefile +++ b/perl-install/Makefile @@ -152,7 +152,11 @@ endif ifeq (i386,$(ARCH)) cp ../tools/i386/busybox $(DEST)/usr/bin endif +ifeq (ia64,$(ARCH)) + ln -sf bash $(DEST)/usr/bin/sh +else ln -sf ash $(DEST)/usr/bin/sh +endif for i in fonts keyboards locales keymaps; do tar xfj `../tools/specific_arch share/$$i.tar.bz2` -C $(DEST); done diff --git a/perl-install/Xconfig/card.pm b/perl-install/Xconfig/card.pm index adf1a26a7..450972560 100644 --- a/perl-install/Xconfig/card.pm +++ b/perl-install/Xconfig/card.pm @@ -9,7 +9,7 @@ use common; use log; -my $force_xf4 = arch() =~ /ppc|ia64/; +my $force_xf4 = arch() =~ /ppc|ia64|x86_64/; my %VideoRams = ( diff --git a/perl-install/any.pm b/perl-install/any.pm index d1994d2c9..bc6f2fe76 100644 --- a/perl-install/any.pm +++ b/perl-install/any.pm @@ -138,6 +138,8 @@ sub setupBootloader { if_(exists $b->{methods}{lilo}, __("LILO with text menu") => sub { $b->{methods}{lilo} = "lilo-menu" }, __("LILO with graphical menu") => sub { $b->{methods}{lilo} = "lilo-graphic" }), + if_(exists $b->{methods}{elilo}, + __("ELILO") => sub { $b->{methods}{elilo} = 1 }), if_(exists $b->{methods}{grub}, #- put lilo if grub is chosen, so that /etc/lilo.conf is generated __("Grub") => sub { $b->{methods}{grub} = 1; @@ -284,13 +286,13 @@ You can add some more or change the existing ones."), my @l; if ($e->{type} eq "image") { @l = ( -{ label => _("Image"), val => \$e->{kernel_or_dev}, list => [ map { s/$prefix//; $_ } glob_("$prefix/boot/vmlinuz*") ], not_edit => 0 }, +{ label => _("Image"), val => \$e->{kernel_or_dev}, list => [ map { s/$prefix//; $_ } glob_( arch() =~ /ia64/ ? "$prefix/boot/efi/mandrake/vmlinuz*" : "$prefix/boot/vmlinuz*" ) ], not_edit => 0 }, { label => _("Root"), val => \$e->{root}, list => [ map { "/dev/$_->{device}" } @$fstab ], not_edit => !$::expert }, { label => _("Append"), val => \$e->{append} }, if_(arch !~ /ppc|ia64/, { label => _("Video mode"), val => \$e->{vga}, list => [ keys %bootloader::vga_modes ], format => sub { $bootloader::vga_modes{$_[0]} }, not_edit => !$::expert }, ), -{ label => _("Initrd"), val => \$e->{initrd}, list => [ map { s/$prefix//; $_ } glob_("$prefix/boot/initrd*") ], not_edit => 0 }, +{ label => _("Initrd"), val => \$e->{initrd}, list => [ map { s/$prefix//; $_ } glob_( arch() =~ /ia64/ ? "$prefix/boot/efi/mandrake/initrd*" : "$prefix/boot/initrd*") ], not_edit => 0 }, { label => _("Read-write"), val => \$e->{'read-write'}, type => 'bool' } ); @l = @l[0..2] unless $::expert; @@ -396,8 +398,8 @@ sub writeandclean_ldsoconf { my ($prefix) = @_; my $file = "$prefix/etc/ld.so.conf"; output $file, - grep { !m|^(/usr)?/lib$| } #- no need to have /lib and /usr/lib in ld.so.conf - uniq cat_($file), "/usr/X11R6/lib\n"; + grep { !m|^(/usr)?/lib(64)?$| } #- no need to have /lib and /usr/lib in ld.so.conf + uniq cat_($file), (if_(arch() =~ /x86_64/, "/usr/X11R6/lib64\n"), "/usr/X11R6/lib\n"); } sub shells { diff --git a/perl-install/bootloader.pm b/perl-install/bootloader.pm index 837908c57..9fd22112e 100644 --- a/perl-install/bootloader.pm +++ b/perl-install/bootloader.pm @@ -185,6 +185,7 @@ sub add_entry { sub add_kernel { my ($lilo, $version, $ext, $root, $v) = @_; + my $boot="/boot"; #- new versions of yaboot don't handle symlinks my $ppcext = $ext; @@ -192,16 +193,20 @@ sub add_kernel { $ext = "-$version"; } + # If itanium architecture store kernel & initrd in /boot/efi/mandrake + if (arch() =~ /ia64/) { + $boot="/boot/efi/mandrake"; + } + log::l("adding vmlinuz$ext as vmlinuz-$version"); - -e "$::prefix/boot/vmlinuz-$version" or log::l("unable to find kernel image $::prefix/boot/vmlinuz-$version"), return; - my $image = "/boot/vmlinuz" . ($ext ne "-$version" && - symlinkf("vmlinuz-$version", "$::prefix/boot/vmlinuz$ext") ? $ext : "-$version"); + -e "$::prefix$boot/vmlinuz-$version" or log::l("unable to find kernel image $::prefix$boot/vmlinuz-$version"), return; + my $image = "$boot/vmlinuz" . ($ext ne "-$version" && symlinkf("vmlinuz-$version", "$::prefix$boot/vmlinuz$ext") ? $ext : "-$version"); - my $initrd = "/boot/initrd-$version.img"; + my $initrd = "$boot/initrd-$version.img"; mkinitrd($version, $initrd) or undef $initrd; if ($initrd && $ext ne "-$version") { - $initrd = "/boot/initrd$ext.img"; - symlinkf("initrd-$version.img", "$::prefix$initrd") or cp_af("$::prefix/boot/initrd-$version.img", "$::prefix$initrd"); + $initrd = "$boot/initrd$ext.img"; + symlinkf("initrd-$version.img", "$::prefix$initrd") or cp_af("$::prefix$boot/initrd-$version.img", "$::prefix$initrd"); } my $label = $ext =~ /-(default)/ ? $1 : ($ext =~ /\d\./ ? sanitize_ver("linux$ext") : "linux$ext"); @@ -275,11 +280,17 @@ sub configure_entry { my ($entry) = @_; if ($entry->{type} eq 'image') { my $specific_version; + my $boot="/boot/"; + + if (arch() =~ /ia64/) { + $boot="/boot/efi/mandrake"; + } + $entry->{kernel_or_dev} =~ /vmlinu.-(.*)/ and $specific_version = $1; readlink("$::prefix/$entry->{kernel_or_dev}") =~ /vmlinu.-(.*)/ and $specific_version = $1; if ($specific_version) { - $entry->{initrd} or $entry->{initrd} = "/boot/initrd-$specific_version.img"; + $entry->{initrd} or $entry->{initrd} = "$boot/initrd-$specific_version.img"; mkinitrd($specific_version, $entry->{initrd}) or undef $entry->{initrd}; } } @@ -296,6 +307,9 @@ sub dev2prompath { #- SPARC only sub get_kernels_and_labels() { my $dir = "$::prefix/boot"; + if ( arch() =~ /ia64/ ) { + $dir = "$::prefix/boot/efi/mandrake"; } + my @l = grep { /^vmlinuz-/ } all($dir); my @kernels = grep { ! -l "$dir/$_" } @l; @@ -409,16 +423,21 @@ sub suggest { enablecdboot => 1, useboot => $boot, xfsroot => $xfsroot, + } : arch() =~ /ia64/ ? + { + default => "linux", + entries => [], + timeout => 5, } : { bootUnsafe => $unsafe, entries => [], timeout => $onmbr && 10, nowarn => 1, - if_(arch() !~ /ia64/, + lba32 => 1, boot => "/dev/" . ($onmbr ? $hds->[0]{device} : fsedit::get_root($fstab, 'boot')->{device}), map => "/boot/map", - ), + install => "/boot/boot.b", }); if (!$lilo->{message} || $lilo->{message} eq "1") { @@ -525,9 +544,10 @@ wait %d seconds for default boot. my %l = ( yaboot => to_bool(arch() =~ /ppc/), silo => to_bool(arch() =~ /sparc/), - lilo => to_bool(arch() !~ /sparc|ppc/) && !isLoopback(fsedit::get_root($fstab)), - grub => to_bool(arch() !~ /sparc|ppc/ && !isRAID(fsedit::get_root($fstab))), - loadlin => to_bool(arch() !~ /sparc|ppc/) && -e "/initrd/loopfs/lnx4win", + elilo => to_bool(arch() =~ /ia64/), + lilo => to_bool(arch() !~ /sparc|ppc|ia64/) && !isLoopback(fsedit::get_root($fstab)), + grub => to_bool(arch() !~ /sparc|ppc|x86_64|ia64/ && !isRAID(fsedit::get_root($fstab))), + loadlin => to_bool(arch() !~ /sparc|ppc|x86_64|ia64/) && -e "/initrd/loopfs/lnx4win", ); unless ($lilo->{methods}) { $lilo->{methods} ||= { map { $_ => 1 } grep { $l{$_} } keys %l }; @@ -799,7 +819,7 @@ sub write_lilo_conf { { local *F; local $\ = "\n"; - my $f = arch() =~ /ia64/ ? "$::prefix/boot/efi/elilo.conf" : "$::prefix/etc/lilo.conf"; + my $f = arch() =~ /ia64/ ? "$::prefix/boot/efi/mandrake/elilo.conf" : "$::prefix/etc/lilo.conf"; open F, ">$f" or die "cannot create lilo config file: $f"; log::l("writing lilo config to $f"); @@ -872,6 +892,88 @@ sub install_lilo { unlink "$::prefix/tmp/.error"; } +sub write_elilo_conf { + my ($lilo, $fstab, $hds) = @_; + my $prefix = $::prefix ; + $lilo->{prompt} = $lilo->{timeout}; + + my $file2fullname = sub { + my ($file) = @_; + $file =~ s|/boot/efi/mandrake/||; + $file + }; + + { + local *F; + local $\ = "\n"; + my $f = "$prefix/boot/efi/mandrake/elilo.conf"; + + open F, ">$f" or die "cannot create lilo config file: $f"; + log::l("writing elilo config to $f"); + + $lilo->{$_} and print F "$_=$lilo->{$_}" foreach qw(default append); + $lilo->{$_} and print F $_ foreach qw(prompt); + print F "timeout=", round(10 * $lilo->{timeout}) if $lilo->{timeout}; + + foreach (@{$lilo->{entries}}) { + print F "$_->{type}=", $file2fullname->($_->{kernel_or_dev}); + my $label = substr($_->{label}, 0, 15); + $label =~ s/\s/_/g; + print F "\tlabel=$label"; + print F "\troot=$_->{root}"; + print F "\tinitrd=", $file2fullname->($_->{initrd}) if $_->{initrd}; + print F "\tappend=\"$_->{append}\"" if $_->{append}; + print F "\tread-only" if !$_->{'read-write'}; + } + } +} + + +sub install_efi_boot_menu { + my ($lilo, $fstab, $hds, $prefix) = @_; + + die "/proc filesystem is not mounted, nvram will not be updated\n" if + ( ! -f "/proc/uptime" ); + + die "/proc/efi/vars not available, nvram will not be updated\n" if + ( ! -d "/proc/efi/vars" ); + + + my $part = fsedit::mntpoint2part "/boot/efi", $fstab; + (my ($bootdisk, $bootpart) = ($1, $2)) = ("/dev/" . $part->{device}) =~ m|(/dev/.+)([0-9]+)|; + # print STDERR "DEBUG: boot-disk = $bootdisk\n"; + # print STDERR "DEBUG: boot-partition = $bootpart\n"; + die "empty bootdisk or bootpart variables" if !($bootdisk) || !($bootpart); + + + my $os_vendor = "Mandrake Linux"; + my $efibootmgr = "/usr/sbin/efibootmgr"; + + die "failed to retrieve current EFI boot entries\n" unless + (open F, "$efibootmgr|"); + while (<F>) { + if (/Boot(\w+).*$os_vendor/) { + die "efibootmgr could not remove entry $1\n" if + (system("$efibootmgr -b $1 -B >/dev/null")); + } + } + close F; + + die "efibootmgr could not add entry for $bootdisk$bootpart\n" if + (system("$efibootmgr -c -d $bootdisk -p $bootpart -w -L \"$os_vendor\"")); +} + +sub install_elilo { + my ($elilo, $fstab, $hds, $prefix) = @_; + write_elilo_conf($elilo, $fstab, $hds, $prefix); + log::l("Installing elilo boot loader..."); + $::testing and return; + install_efi_boot_menu($elilo, $fstab, $hds, $prefix); + unlink "$prefix/tmp/.error"; +} + + + sub dev2bios { my ($hds, $where) = @_; $where =~ s|/dev/||; diff --git a/perl-install/detect_devices.pm b/perl-install/detect_devices.pm index c60e356c2..383844143 100644 --- a/perl-install/detect_devices.pm +++ b/perl-install/detect_devices.pm @@ -478,7 +478,15 @@ sub get_mac_generation() { return "Unknown Generation"; } -sub hasSMP { c::detectSMP() } +sub hasSMP { + # Much simpler if we have APIC/ACPI stuff + foreach (syslog()) { + my $nprocs = (m/(^Processors: (\d+)|(\d+) CPUs avail)/)[1] or next; + return $nprocs > 1 ? 1 : 0; + } + c::detectSMP() +} + sub hasPCMCIA { $::o->{pcmcia} } #- because /proc/pcmcia seems not to be present on 2.4 at least (or use /var/run/stab) #- try to detect a laptop, we assume pcmcia service is an indication of a laptop or diff --git a/perl-install/drakxtools.spec b/perl-install/drakxtools.spec index 5e84c78e8..90002f976 100644 --- a/perl-install/drakxtools.spec +++ b/perl-install/drakxtools.spec @@ -1,7 +1,7 @@ Summary: The drakxtools (XFdrake, diskdrake, keyboarddrake, mousedrake...) Name: drakxtools Version: 1.1.9 -Release: 53mdk +Release: 57mdk Url: http://www.linux-mandrake.com/en/drakx.php3 Source0: %name-%version.tar.bz2 License: GPL @@ -147,7 +147,8 @@ hardware classes. %setup -q %build -%make rpcinfo-flushed ddcprobe serial_probe +%make CFLAGS="$RPM_OPT_FLAGS" rpcinfo-flushed +%make ddcprobe serial_probe %make %install @@ -288,6 +289,20 @@ file /etc/sysconfig/harddrake2/previous_hw | fgrep -q perl && %_datadir/harddrak %config(noreplace) %_sysconfdir/logrotate.d/drakxtools-http %changelog +* Thu May 06 2003 Gwenole Beauchesne <gbeauchesne@mandrakesoft.com> 1.1.9-57mdk +- Revert XFS support on AMD64, not stable enough +- Fix drakboot to display only supported bootloaders + +* Thu Apr 24 2003 Gwenole Beauchesne <gbeauchesne@mandrakesoft.com> 1.1.9-56mdk +- Add XFS support to AMD64 + +* Thu Apr 17 2003 Gwenole Beauchesne <gbeauchesne@mandrakesoft.com> 1.1.9-55mdk +- Fix SMP detection again +- Fix lsnetdrake on x86-64 + +* Mon Apr 14 2003 Gwenole Beauchesne <gbeauchesne@mandrakesoft.com> 1.1.9-54mdk +- Move to R9_0-64bit-branch + * Fri Sep 20 2002 Thierry Vignaud <tvignaud@mandrakesoft.com> 1.1.9-53mdk - remove useless warnings from harddrake diff --git a/perl-install/fs.pm b/perl-install/fs.pm index 7eaf61711..7c68da790 100644 --- a/perl-install/fs.pm +++ b/perl-install/fs.pm @@ -595,7 +595,7 @@ sub real_format_part { format_jfs($dev, @options); } elsif (isDos($part)) { format_dos($dev, @options); - } elsif (isWin($part)) { + } elsif (isWin($part) || isEfi($part)) { format_dos($dev, @options, '-F', 32); } elsif (isThisFs('hfs', $part)) { format_hfs($dev, @options, '-l', "Untitled"); @@ -737,7 +737,12 @@ sub umount { my ($mntpoint) = @_; $mntpoint =~ s|/$||; log::l("calling umount($mntpoint)"); - syscall_('umount', $mntpoint) or die _("error unmounting %s: %s", $mntpoint, "$!"); + + # SYS_umount is not a valid sycall on modern kernels + (arch() =~ /x86_64/ + ? syscall_('umount2', $mntpoint, 0) + : syscall_('umount', $mntpoint) + ) or die _("error unmounting %s: %s", $mntpoint, "$!"); substInFile { $_ = '' if /(^|\s)$mntpoint\s/ } '/etc/mtab'; #- don't care about error, if we can't read, we won't manage to write... (and mess mtab) } diff --git a/perl-install/fsedit.pm b/perl-install/fsedit.pm index 7999415a8..e4f11cac9 100644 --- a/perl-install/fsedit.pm +++ b/perl-install/fsedit.pm @@ -32,7 +32,7 @@ use fs; ); foreach (values %suggestions) { if (arch() =~ /ia64/) { - @$_ = ({ mntpoint => "/boot/efi", size => 50 << 11, type => 0xb, ratio => 1, maxsize => 150 << 11 }, @$_); + @$_ = ({ mntpoint => "/boot/efi", size => 50 << 11, type => 0xef, ratio => 1, maxsize => 150 << 11 }, @$_); } } diff --git a/perl-install/harddrake/data.pm b/perl-install/harddrake/data.pm index 0da8974fa..91927044e 100644 --- a/perl-install/harddrake/data.pm +++ b/perl-install/harddrake/data.pm @@ -12,7 +12,7 @@ my @devices = detect_devices::probeall(1); # Update me each time you handle one more devices class (aka configurator) sub unknown { - grep { ($_->{media_type} !~ /tape|SERIAL_(USB|SMBUS)|Printer|DISPLAY|MULTIMEDIA_(VIDEO|AUDIO|OTHER)|STORAGE_(IDE|SCSI|OTHER)|BRIDGE|NETWORK/) && ($_->{driver} ne 'scanner') && $_->{type} ne 'network' && $_->{driver} !~ /Mouse:USB|/} @devices; + grep { ($_->{media_type} !~ /tape|SERIAL_(USB|SMBUS)|Printer|DISPLAY|MULTIMEDIA_(VIDEO|AUDIO|OTHER)|STORAGE_(IDE|SCSI|OTHER)|BRIDGE|NETWORK/) && ($_->{driver} ne 'scanner') && $_->{type} ne 'network' && $_->{driver} !~ /Mouse:USB/} @devices; } diff --git a/perl-install/install_any.pm b/perl-install/install_any.pm index 04f3279a0..8d838a790 100644 --- a/perl-install/install_any.pm +++ b/perl-install/install_any.pm @@ -246,8 +246,8 @@ sub spawnShell { ioctl(STDIN, c::TIOCSCTTY(), 0) or warn "could not set new controlling tty: $!"; - my $busybox = "/usr/bin/busybox"; - exec { -e $busybox ? $busybox : "/bin/sh" } "/bin/sh" or log::l("exec of /bin/sh failed: $!"); + my ($busybox, $bash) = ("/usr/bin/busybox", "/usr/bin/bash"); + exec { -x $busybox ? $busybox : -x $bash ? $bash : "/bin/sh" } "/bin/sh" or log::l("exec of /bin/sh failed: $!"); } sub getAvailableSpace { @@ -379,7 +379,7 @@ sub setDefaultPackages { $o->{compssUsersChoice}{USB} = 1 if modules::get_probeall("usb-interface"); $o->{compssUsersChoice}{PCMCIA} = 1 if detect_devices::hasPCMCIA(); $o->{compssUsersChoice}{HIGH_SECURITY} = 1 if $o->{security} > 3; - $o->{compssUsersChoice}{BIGMEM} = 1 if !$::oem && (availableRamMB() > 800) && (arch() !~ /ia64/); + $o->{compssUsersChoice}{BIGMEM} = 1 if !$::oem && (availableRamMB() > 800) && (arch() !~ /ia64|x86_64/); $o->{compssUsersChoice}{SMP} = 1 if detect_devices::hasSMP(); $o->{compssUsersChoice}{CDCOM} = 1 if grep { $_->{descr} =~ /commercial/i } values %{$o->{packages}{mediums}}; $o->{compssUsersChoice}{'3D'} = 1 if @@ -776,6 +776,7 @@ sub getAndSaveInstallFloppy { cp_af("$postinstall_rpms/auto_install.img", $where); } else { my $image = cat_("/proc/cmdline") =~ /pcmcia/ ? "pcmcia" : + arch() =~ /ia64|ppc/ ? "all" : #- we only use all.img there ${{ disk => 'hd', cdrom => 'cdrom', ftp => 'network', nfs => 'network', http => 'network' }}{$o->{method}}; $image .= arch() =~ /sparc64/ && "64"; #- for sparc64 there are a specific set of image. getAndSaveFile("images/$image.img", $where) or log::l("failed to write Install Floppy ($image.img) to $where"), return; @@ -1041,11 +1042,23 @@ sub getHds { $o->{fstab} = [ fsedit::get_all_fstab($all_hds) ]; fs::merge_info_from_mtab($o->{fstab}); + #- Search for EFI partitions + my @efi = grep { isEfi($_) && isFat({ type => fsedit::typeOfPart($_->{device}) }) } @{$o->{fstab}}; + log::l("efi parts: ", join ",", map { $_->{device} } @efi) if @efi; + if (@efi == 1) { + $efi[0]{mntpoint} = "/boot/efi"; + } else { + my $v = 0; + foreach (@efi) { + $_->{mntpoint} = $_->{unsafeMntpoint} = "/mnt/efi_" . ($v ? $v+1 : ''); + $v = $v + 1; + } + } + my @win = grep { isFat($_) && isFat({ type => fsedit::typeOfPart($_->{device}) }) } @{$o->{fstab}}; log::l("win parts: ", join ",", map { $_->{device} } @win) if @win; if (@win == 1) { - #- Suggest /boot/efi on ia64. - $win[0]{mntpoint} = arch() =~ /ia64/ ? "/boot/efi" : "/mnt/windows"; + $win[0]{mntpoint} = "/mnt/windows"; } else { my %w; foreach (@win) { my $v = $w{$_->{device_windobe}}++; diff --git a/perl-install/install_gtk.pm b/perl-install/install_gtk.pm index 89517dffb..275419054 100644 --- a/perl-install/install_gtk.pm +++ b/perl-install/install_gtk.pm @@ -7,6 +7,7 @@ use my_gtk qw(:helpers :wrappers); use common; use lang; use devices; +use log; #-##################################################################################### #-INTERN CONSTANT @@ -188,21 +189,18 @@ sub init_sizes() { #------------------------------------------------------------------------------ sub createXconf { - my ($file, $mouse_type, $mouse_dev, $wacom_dev) = @_; + my ($file, $mouse_type, $mouse_dev, $wacom_dev, $Driver) = @_; $mouse_type = 'IMPS/2' if $mouse_type eq 'ExplorerPS/2'; - devices::make("/dev/kbd") if arch() =~ /^sparc/; #- used by Xsun style server. symlinkf(devices::make($mouse_dev), "/dev/mouse"); #- needed for imlib to start on 8-bit depth visual. symlink("/tmp/stage2/etc/imrc", "/etc/imrc"); symlink("/tmp/stage2/etc/im_palette.pal", "etc/im_palette.pal"); -if (arch() =~ /^ia64/) { - require Xconfig::card; - my ($card) = Xconfig::card::probe(); - Xconfig::card::add_to_card__using_Cards($card, $card->{type}) if $card && $card->{type}; - output($file, sprintf(<<'END', $mouse_type, $card->{driver})); +if ($Driver) { + log::l("Mouse type is $mouse_type and Card driver is $Driver"); + output($file, sprintf(<<'END', $mouse_type, $Driver)); Section "Files" FontPath "/usr/X11R6/lib/X11/fonts:unscaled" diff --git a/perl-install/install_steps_gtk.pm b/perl-install/install_steps_gtk.pm index 09ce1dc09..06a4b924c 100644 --- a/perl-install/install_steps_gtk.pm +++ b/perl-install/install_steps_gtk.pm @@ -36,7 +36,6 @@ sub new($$) { unless ($::testing) { if ($ENV{DISPLAY} eq ":0" && !$::live) { my $f = "/tmp/Xconf"; - install_gtk::createXconf($f, @{$o->{mouse}}{"XMOUSETYPE", "device"}, $o->{mouse}{wacom}[0]); devices::make("/dev/kbd"); local (*T1, *T2); @@ -44,14 +43,16 @@ sub new($$) { open T2, ">/dev/tty6"; my $launchX = sub { + my ($server, $Driver) = @_; my $ok = 1; my $xpmac_opts = cat_("/proc/cmdline"); + install_gtk::createXconf($f, @{$o->{mouse}}{"XMOUSETYPE", "device"}, $o->{mouse}{wacom}[0], $Driver); unless (-d "/var/log") { mkdir("/var/log") } local $SIG{CHLD} = sub { $ok = 0 if waitpid(-1, c::WNOHANG()) > 0 }; unless (fork) { - exec $_[0], (arch() =~ /^sparc/ || arch() eq "ppc" ? () : ("-kb")), "-dpms","-s" ,"240", - ($_[0] =~ /Xpmac/ ? $xpmac_opts !~ /ofonly/ ? ("-mode", "17", "-depth", "32") : ("-mach64"):()), - ($_[0] =~ /Xsun/ || $_[0] =~ /Xpmac/ ? ("-fp", "/usr/X11R6/lib/X11/fonts:unscaled") : + exec $server, (arch() =~ /^sparc/ || arch() eq "ppc" ? () : ("-kb")), "-dpms","-s" ,"240", + ($server =~ /Xpmac/ ? $xpmac_opts !~ /ofonly/ ? ("-mode", "17", "-depth", "32") : ("-mach64"):()), + ($server =~ /Xsun/ || $server =~ /Xpmac/ ? ("-fp", "/usr/X11R6/lib/X11/fonts:unscaled") : ("-allowMouseOpenFail", "-xf86config", $f)) or exit 1; } foreach (1..60) { @@ -77,8 +78,10 @@ sub new($$) { if (/Mach64/) { @servers = qw(Mach64) } elsif (/Permedia2/) { @servers = qw(3DLabs) } else { @servers = qw(Xsun24) } - } elsif (arch() =~ /ia64/) { - @servers = 'XFree86'; + } elsif (arch() =~ /ia64|x86_64/) { + require Xconfig::card; + my ($card) = Xconfig::card::probe(); + @servers = map { if_($_, "Driver:$_") } $card && $card->{Driver}, 'fbdev'; } elsif (arch() eq "ppc") { @servers = qw(Xpmac); } @@ -87,6 +90,7 @@ sub new($$) { log::l("Trying with server $_"); my $dir = "/usr/X11R6/bin"; my $prog = /Xsun|Xpmac|XFree86/ ? $_ : "XF86_$_"; + my ($prog, $Driver) = /Driver:(.*)/ ? ('XFree86', $1) : /Xsun|Xpmac|Xnest/ ? $_ : "XF86_$_"; unless (-x "$dir/$prog") { unlink $_ foreach glob_("$dir/X*"); install_any::getAndSaveFile("Mandrake/mdkinst$dir/$prog", "$dir/$prog") or die "failed to get server $prog: $!"; @@ -95,11 +99,11 @@ sub new($$) { if (/FB/) { !$o->{vga16} && $o->{allowFB} or next; - $o->{allowFB} = &$launchX($prog) #- keep in mind FB is used. + $o->{allowFB} = &$launchX($prog, $Driver) #- keep in mind FB is used. and goto OK; } else { $o->{vga16} = 1 if /VGA16/; - &$launchX($prog) and goto OK; + &$launchX($prog, $Driver) and goto OK; } } return undef; diff --git a/perl-install/partition_table.pm b/perl-install/partition_table.pm index c7342f0e7..242c7a662 100644 --- a/perl-install/partition_table.pm +++ b/perl-install/partition_table.pm @@ -6,7 +6,7 @@ use vars qw(@ISA %EXPORT_TAGS @EXPORT_OK @important_types @important_types2 @fie @ISA = qw(Exporter); %EXPORT_TAGS = ( - types => [ qw(type2name type2fs name2type fs2type isExtended isExt2 isThisFs isTrueFS isSwap isDos isWin isFat isSunOS isOtherAvailableFS isPrimary isRawLVM isRawRAID isRAID isLVM isNT isMountableRW isNonMountable isPartOfLVM isPartOfRAID isPartOfLoopback isApplePartMap isLoopback isMounted isBusy isSpecial maybeFormatted isApple isAppleBootstrap) ], + types => [ qw(type2name type2fs name2type fs2type isExtended isExt2 isThisFs isTrueFS isSwap isDos isWin isFat isSunOS isOtherAvailableFS isPrimary isRawLVM isRawRAID isRAID isLVM isNT isMountableRW isNonMountable isPartOfLVM isPartOfRAID isPartOfLoopback isApplePartMap isLoopback isMounted isBusy isSpecial maybeFormatted isApple isAppleBootstrap isEfi) ], ); @EXPORT_OK = map { @$_ } values %EXPORT_TAGS; @@ -19,6 +19,7 @@ use log; @important_types = ('Linux native', 'Linux swap', if_(arch() =~ /i.86/, 'Journalised FS: ext3', 'Journalised FS: ReiserFS', 'Journalised FS: JFS', 'Journalised FS: XFS', 'DOS FAT16', 'FAT32'), if_(arch() =~ /ia64/, 'Journalised FS: ext3', 'Journalised FS: ReiserFS', 'Journalised FS: XFS', 'FAT32'), + if_(arch() =~ /x86_64/, 'Journalised FS: ext3', 'Journalised FS: ReiserFS', 'FAT32'), if_(arch() =~ /ppc/, 'Journalised FS: ext3', 'Journalised FS: ReiserFS', 'Journalised FS: JFS', 'Journalised FS: XFS', 'Apple HFS Partition', 'Apple Bootstrap')); @important_types2 = ('Linux RAID', 'Linux Logical Volume Manager partition'); @@ -46,6 +47,9 @@ if_(arch() =~ /^ppc/, 0x183 => 'Journalised FS: ReiserFS', 0x283 => 'Journalised FS: XFS', 0x483 => 'Journalised FS: ext3', +), if_(arch() =~ /^x86_64/, + 0x183 => 'Journalised FS: ReiserFS', + 0x483 => 'Journalised FS: ext3', ), if_(arch() =~ /^sparc/, 0x1 => 'SunOS boot', 0x2 => 'SunOS root', @@ -199,6 +203,7 @@ arch() !~ /sparc/ ? ( 0x1e => 'vfat', 0x82 => 'swap', 0x83 => 'ext2', + 0xef => 'vfat', 0x183=> 'reiserfs', 0x283=> 'xfs', 0x383=> 'jfs', @@ -226,6 +231,7 @@ sub name2type { /0x(.*)/ ? hex $1 : $types_rev{$_} || $_; } +sub isEfi { arch() =~ /ia64/ && $_[0]{type} == 0xef } sub isWholedisk { arch() =~ /^sparc/ && $_[0]{type} == 5 } sub isExtended { arch() !~ /^sparc/ && ($_[0]{type} == 5 || $_[0]{type} == 0xf || $_[0]{type} == 0x85) } sub isRawLVM { $_[0]{type} == 0x8e } @@ -244,7 +250,7 @@ sub isHiddenMacPart { defined $_[0]{isMap} } sub isThisFs { type2fs($_[1]) eq $_[0] } sub isTrueFS { member(type2fs($_[0]), qw(ext2 reiserfs xfs jfs ext3)) } -sub isOtherAvailableFS { isFat($_[0]) || isSunOS($_[0]) || isThisFs('hfs', $_[0]) || isThisFs('ntfs', $_[0]) } #- other OS that linux can access its filesystem +sub isOtherAvailableFS { isEfi($_[0]) || isFat($_[0]) || isSunOS($_[0]) || isThisFs('hfs', $_[0]) || isThisFs('ntfs', $_[0]) } #- other OS that linux can access its filesystem sub isMountableRW { (isTrueFS($_[0]) || isOtherAvailableFS($_[0])) && !isThisFs('ntfs', $_[0]) } sub isNonMountable { isRawRAID($_[0]) || isRawLVM($_[0]) } diff --git a/perl-install/printerdrake.pm b/perl-install/printerdrake.pm index d94d0886b..29bbfd1f5 100644 --- a/perl-install/printerdrake.pm +++ b/perl-install/printerdrake.pm @@ -13,6 +13,9 @@ use printer; 1; +#- Define library name where plugins and libraries are +my $lib = arch() =~ /x86_64/ ? "lib64" : "lib"; + sub choose_printer_type { my ($printer, $in) = @_; $in->set_help('configurePrinterConnected') if $::isInstall; @@ -1353,7 +1356,7 @@ sub setup_common { /usr/bin/xscanimage /usr/bin/xsane /etc/sane.d/dll.conf - /usr/lib/libsane-hpoj.so.1), + /usr/$lib/libsane-hpoj.so.1), (printer::files_exist ('/usr/bin/gimp') ? '/usr/bin/xsane-gimp' : @@ -2747,7 +2750,7 @@ sub install_spooler { my $w = $in->wait_message(_("Printerdrake"), _("Checking installed software...")); if ((!$::testing) && - (!printer::files_exist((qw(/usr/lib/cups/cgi-bin/printers.cgi + (!printer::files_exist((qw(/usr/$lib/cups/cgi-bin/printers.cgi /sbin/ifconfig /usr/bin/xpp), ($::expert ? @@ -2793,7 +2796,7 @@ sub install_spooler { _("Checking installed software...")); # "lpr" conflicts with "LPRng", remove "LPRng" if ((!$::testing) && - (printer::files_exist((qw(/usr/lib/filters/lpf))))) { + (printer::files_exist((qw(/usr/$lib/filters/lpf))))) { my $w = $in->wait_message(_("Printerdrake"), _("Removing LPRng...")); $in->do_pkgs->remove_nodeps('LPRng'); @@ -2838,7 +2841,7 @@ sub install_spooler { $in->do_pkgs->remove_nodeps('lpr'); } if ((!$::testing) && - (!printer::files_exist((qw(/usr/lib/filters/lpf + (!printer::files_exist((qw(/usr/$lib/filters/lpf /usr/sbin/lpd /sbin/ifconfig /usr/bin/gpr @@ -3002,7 +3005,7 @@ sub main { /usr/bin/scli ), (printer::files_exist("/usr/bin/gimp") ? - "/usr/lib/gimp/1.2/plug-ins/print" : ()) + "/usr/$lib/gimp/1.2/plug-ins/print" : ()) )))) { $in->do_pkgs->install('foomatic','printer-utils','printer-testpages','nmap','scli', if_($in->do_pkgs->is_installed('gimp'), 'gimpprint')); diff --git a/perl-install/proxy.pm b/perl-install/proxy.pm index b01a7b9bf..5239356b2 100644 --- a/perl-install/proxy.pm +++ b/perl-install/proxy.pm @@ -11,7 +11,7 @@ use c; sub main { my ($prefix, $in) = @_; my $proxy_cfg = {}; - my $config_file = "$prefix/usr/lib/wgetrc"; + my $config_file = "$prefix/etc/wgetrc"; # grab current config foreach (cat_($config_file)) { diff --git a/perl-install/share/list b/perl-install/share/list index b3f2b92ad..5ad61fe4e 100644 --- a/perl-install/share/list +++ b/perl-install/share/list @@ -123,8 +123,8 @@ /usr/lib/perl5/vendor_perl/PERL_VERSION/ARCH-linux-thread-multi/Gtk/Gdk/ImlibImage.pm /usr/lib/perl5/vendor_perl/PERL_VERSION/ARCH-linux-thread-multi/auto/Gtk/Gtk.so /usr/lib/perl5/vendor_perl/PERL_VERSION/ARCH-linux-thread-multi/auto/Gtk/Gdk/ImlibImage/ImlibImage.so -/usr/LIB/rpm/rpmrc -/usr/LIB/rpm/macros +/usr/lib/rpm/rpmrc +/usr/lib/rpm/macros /sbin/rescuept /usr/share/ldetect-lst/Cards+ /usr/share/ldetect-lst/MonitorsDB diff --git a/perl-install/share/list.ia64 b/perl-install/share/list.ia64 index 9bbf999cb..aa9bcb8b7 100644 --- a/perl-install/share/list.ia64 +++ b/perl-install/share/list.ia64 @@ -5,7 +5,10 @@ /sbin/mkdosfs /sbin/resize_reiserfs /usr/bin/strace -/var/log/XFree86.0.log +/bin/bash +/bin/vim-minimal +/usr/sbin/parted +/usr/sbin/efibootmgr /usr/X11R6/bin/XFree86 /usr/X11R6/bin/xmodmap /usr/X11R6/lib/modules/ @@ -68,7 +71,6 @@ /usr/X11R6/lib/modules/extensions/libextmod.a /usr/X11R6/lib/modules/extensions/libglx.a /usr/X11R6/lib/modules/extensions/librecord.a -/usr/X11R6/lib/modules/extensions/libxie.a /usr/X11R6/lib/modules/fonts /usr/X11R6/lib/modules/fonts/libbitmap.a /usr/X11R6/lib/modules/fonts/libfreetype.a @@ -116,4 +118,4 @@ /usr/X11R6/lib/modules/linux/libfbdevhw.a /usr/X11R6/lib/modules/v10002d.uc /usr/X11R6/lib/modules/v20002d.uc -/usr/lib/perl5/PERL_VERSION/ARCH-linux/asm/break.ph +/usr/lib/perl5/PERL_VERSION/ARCH-linux-thread-multi/asm/break.ph diff --git a/perl-install/share/list.x86_64 b/perl-install/share/list.x86_64 index 1a9851428..3314d9cc0 100644 --- a/perl-install/share/list.x86_64 +++ b/perl-install/share/list.x86_64 @@ -1,111 +1,133 @@ -/usr/bin/strace -/var/log/XFree86.0.log -/usr/X11R6/bin/XFree86 +/bin/bash +/sbin/mkdosfs +/sbin/mkraid +/sbin/mkreiserfs +/sbin/mkfs.xfs +/sbin/raidstart +/sbin/resize_reiserfs +/usr/lib/perl5/PERL_VERSION/ARCH-linux-thread-multi/asm-i386/unistd.ph +/usr/lib/perl5/PERL_VERSION/ARCH-linux-thread-multi/asm-x86_64/unistd.ph /usr/X11R6/bin/xmodmap -/usr/X11R6/lib/modules/ -/usr/X11R6/lib/modules/codeconv -/usr/X11R6/lib/modules/codeconv/libARABIC.a -/usr/X11R6/lib/modules/codeconv/libARMSCII8.a -/usr/X11R6/lib/modules/codeconv/libBIG5.a -/usr/X11R6/lib/modules/codeconv/libDOSENCODING.a -/usr/X11R6/lib/modules/codeconv/libGB2312.a -/usr/X11R6/lib/modules/codeconv/libGEORGIAN.a -/usr/X11R6/lib/modules/codeconv/libISO8859_1.a -/usr/X11R6/lib/modules/codeconv/libISO8859_10.a -/usr/X11R6/lib/modules/codeconv/libISO8859_11.a -/usr/X11R6/lib/modules/codeconv/libISO8859_14.a -/usr/X11R6/lib/modules/codeconv/libISO8859_15.a -/usr/X11R6/lib/modules/codeconv/libISO8859_2.a -/usr/X11R6/lib/modules/codeconv/libISO8859_3.a -/usr/X11R6/lib/modules/codeconv/libISO8859_4.a -/usr/X11R6/lib/modules/codeconv/libISO8859_5.a -/usr/X11R6/lib/modules/codeconv/libISO8859_6.a -/usr/X11R6/lib/modules/codeconv/libISO8859_7.a -/usr/X11R6/lib/modules/codeconv/libISO8859_8.a -/usr/X11R6/lib/modules/codeconv/libISO8859_9.a -/usr/X11R6/lib/modules/codeconv/libJISX0201.a -/usr/X11R6/lib/modules/codeconv/libJISX0208.a -/usr/X11R6/lib/modules/codeconv/libJISX0212.a -/usr/X11R6/lib/modules/codeconv/libKOI8.a -/usr/X11R6/lib/modules/codeconv/libKSC5601.a -/usr/X11R6/lib/modules/codeconv/libKSCJOHAB.a -/usr/X11R6/lib/modules/codeconv/libMULEENCODING.a -/usr/X11R6/lib/modules/codeconv/libTCVN.a -/usr/X11R6/lib/modules/codeconv/libVISCII.a -/usr/X11R6/lib/modules/dri -/usr/X11R6/lib/modules/dri/gamma_dri.so -/usr/X11R6/lib/modules/dri/i810_dri.so -/usr/X11R6/lib/modules/dri/mga_dri.so -/usr/X11R6/lib/modules/dri/r128_dri.so -/usr/X11R6/lib/modules/dri/sis_dri.so -/usr/X11R6/lib/modules/drivers -/usr/X11R6/lib/modules/drivers/ati_drv.o -/usr/X11R6/lib/modules/drivers/atimisc_drv.o -/usr/X11R6/lib/modules/drivers/fbdev_drv.o -/usr/X11R6/lib/modules/drivers/glint_drv.o -/usr/X11R6/lib/modules/drivers/i740_drv.o -/usr/X11R6/lib/modules/drivers/linux -/usr/X11R6/lib/modules/drivers/linux/v4l_drv.o -/usr/X11R6/lib/modules/drivers/mga_drv.o -/usr/X11R6/lib/modules/drivers/nv_drv.o -/usr/X11R6/lib/modules/drivers/r128_drv.o -/usr/X11R6/lib/modules/drivers/radeon_drv.o -/usr/X11R6/lib/modules/drivers/rendition_drv.o -/usr/X11R6/lib/modules/drivers/s3virge_drv.o -/usr/X11R6/lib/modules/drivers/sis_drv.o -/usr/X11R6/lib/modules/drivers/tdfx_drv.o -/usr/X11R6/lib/modules/drivers/vga_drv.o -/usr/X11R6/lib/modules/extensions -/usr/X11R6/lib/modules/extensions/libGLcore.a -/usr/X11R6/lib/modules/extensions/libdbe.a -/usr/X11R6/lib/modules/extensions/libdri.a -/usr/X11R6/lib/modules/extensions/libextmod.a -/usr/X11R6/lib/modules/extensions/libglx.a -/usr/X11R6/lib/modules/extensions/librecord.a -/usr/X11R6/lib/modules/fonts -/usr/X11R6/lib/modules/fonts/libbitmap.a -/usr/X11R6/lib/modules/fonts/libfreetype.a -/usr/X11R6/lib/modules/fonts/libspeedo.a -/usr/X11R6/lib/modules/fonts/libtype1.a -/usr/X11R6/lib/modules/fonts/libxtt.a -/usr/X11R6/lib/modules/input -/usr/X11R6/lib/modules/input/citron_drv.o -/usr/X11R6/lib/modules/input/digitaledge_drv.o -/usr/X11R6/lib/modules/input/dynapro_drv.o -/usr/X11R6/lib/modules/input/elographics_drv.o -/usr/X11R6/lib/modules/input/microtouch_drv.o -/usr/X11R6/lib/modules/input/mouse_drv.o -/usr/X11R6/lib/modules/input/mutouch_drv.o -/usr/X11R6/lib/modules/input/spaceorb_drv.o -/usr/X11R6/lib/modules/input/summa_drv.o -/usr/X11R6/lib/modules/input/void_drv.o -/usr/X11R6/lib/modules/input/wacom_drv.o -/usr/X11R6/lib/modules/libafb.a -/usr/X11R6/lib/modules/libcfb.a -/usr/X11R6/lib/modules/libcfb16.a -/usr/X11R6/lib/modules/libcfb24.a -/usr/X11R6/lib/modules/libcfb32.a -/usr/X11R6/lib/modules/libddc.a -/usr/X11R6/lib/modules/libfb.a -/usr/X11R6/lib/modules/libi2c.a -/usr/X11R6/lib/modules/libint10.a -/usr/X11R6/lib/modules/libmfb.a -/usr/X11R6/lib/modules/libpcidata.a -/usr/X11R6/lib/modules/librac.a -/usr/X11R6/lib/modules/libramdac.a -/usr/X11R6/lib/modules/libscanpci.a -/usr/X11R6/lib/modules/libshadow.a -/usr/X11R6/lib/modules/libshadowfb.a -/usr/X11R6/lib/modules/libvbe.a -/usr/X11R6/lib/modules/libvgahw.a -/usr/X11R6/lib/modules/libxaa.a -/usr/X11R6/lib/modules/libxf1bpp.a -/usr/X11R6/lib/modules/libxf24_32bpp.a -/usr/X11R6/lib/modules/libxf4bpp.a -/usr/X11R6/lib/modules/libxf8_16bpp.a -/usr/X11R6/lib/modules/libxf8_32bpp.a -/usr/X11R6/lib/modules/linux -/usr/X11R6/lib/modules/linux/libdrm.a -/usr/X11R6/lib/modules/linux/libfbdevhw.a -/usr/X11R6/lib/modules/v10002d.uc -/usr/X11R6/lib/modules/v20002d.uc +/usr/X11R6/bin/XFree86 +/usr/X11R6/lib64/modules/codeconv/libARABIC.a +/usr/X11R6/lib64/modules/codeconv/libARMSCII8.a +/usr/X11R6/lib64/modules/codeconv/libBIG5.a +/usr/X11R6/lib64/modules/codeconv/libBIG5HKSCS.a +/usr/X11R6/lib64/modules/codeconv/libDOSENCODING.a +/usr/X11R6/lib64/modules/codeconv/libGB2312.a +/usr/X11R6/lib64/modules/codeconv/libGBK.a +/usr/X11R6/lib64/modules/codeconv/libGEORGIAN.a +/usr/X11R6/lib64/modules/codeconv/libISO8859_1.a +/usr/X11R6/lib64/modules/codeconv/libISO8859_10.a +/usr/X11R6/lib64/modules/codeconv/libISO8859_11.a +/usr/X11R6/lib64/modules/codeconv/libISO8859_14.a +/usr/X11R6/lib64/modules/codeconv/libISO8859_15.a +/usr/X11R6/lib64/modules/codeconv/libISO8859_2.a +/usr/X11R6/lib64/modules/codeconv/libISO8859_3.a +/usr/X11R6/lib64/modules/codeconv/libISO8859_4.a +/usr/X11R6/lib64/modules/codeconv/libISO8859_5.a +/usr/X11R6/lib64/modules/codeconv/libISO8859_6.a +/usr/X11R6/lib64/modules/codeconv/libISO8859_7.a +/usr/X11R6/lib64/modules/codeconv/libISO8859_8.a +/usr/X11R6/lib64/modules/codeconv/libISO8859_9.a +/usr/X11R6/lib64/modules/codeconv/libJISX0201.a +/usr/X11R6/lib64/modules/codeconv/libJISX0208.a +/usr/X11R6/lib64/modules/codeconv/libJISX0212.a +/usr/X11R6/lib64/modules/codeconv/libKOI8.a +/usr/X11R6/lib64/modules/codeconv/libKSC5601.a +/usr/X11R6/lib64/modules/codeconv/libKSCJOHAB.a +/usr/X11R6/lib64/modules/codeconv/libMULEENCODING.a +/usr/X11R6/lib64/modules/codeconv/libTCVN.a +/usr/X11R6/lib64/modules/codeconv/libVISCII.a +/usr/X11R6/lib64/modules/dri/gamma_dri.so +/usr/X11R6/lib64/modules/dri/i810_dri.so +/usr/X11R6/lib64/modules/dri/mga_dri.so +/usr/X11R6/lib64/modules/dri/r128_dri.so +/usr/X11R6/lib64/modules/dri/radeon_dri.so +/usr/X11R6/lib64/modules/drivers/apm_drv.o +/usr/X11R6/lib64/modules/drivers/ati_drv.o +/usr/X11R6/lib64/modules/drivers/atimisc_drv.o +/usr/X11R6/lib64/modules/drivers/chips_drv.o +/usr/X11R6/lib64/modules/drivers/cirrus_alpine.o +/usr/X11R6/lib64/modules/drivers/cirrus_drv.o +/usr/X11R6/lib64/modules/drivers/cirrus_laguna.o +/usr/X11R6/lib64/modules/drivers/fbdev_drv.o +/usr/X11R6/lib64/modules/drivers/glint_drv.o +/usr/X11R6/lib64/modules/drivers/mga_drv.o +/usr/X11R6/lib64/modules/drivers/neomagic_drv.o +/usr/X11R6/lib64/modules/drivers/nv_drv.o +/usr/X11R6/lib64/modules/drivers/r128_drv.o +/usr/X11R6/lib64/modules/drivers/radeon_drv.o +/usr/X11R6/lib64/modules/drivers/rendition_drv.o +/usr/X11R6/lib64/modules/drivers/s3virge_drv.o +/usr/X11R6/lib64/modules/drivers/savage_drv.o +/usr/X11R6/lib64/modules/drivers/sis_drv.o +/usr/X11R6/lib64/modules/drivers/tdfx_drv.o +/usr/X11R6/lib64/modules/drivers/tga_drv.o +/usr/X11R6/lib64/modules/drivers/trident_drv.o +/usr/X11R6/lib64/modules/drivers/tseng_drv.o +/usr/X11R6/lib64/modules/drivers/vesa_drv.o +/usr/X11R6/lib64/modules/drivers/vga_drv.o +/usr/X11R6/lib64/modules/extensions/libGLcore.a +/usr/X11R6/lib64/modules/extensions/libdbe.a +/usr/X11R6/lib64/modules/extensions/libdri.a +/usr/X11R6/lib64/modules/extensions/libextmod.a +/usr/X11R6/lib64/modules/extensions/libglx.a +/usr/X11R6/lib64/modules/extensions/librecord.a +/usr/X11R6/lib64/modules/extensions/libxtrap.a +/usr/X11R6/lib64/modules/fonts/libbitmap.a +/usr/X11R6/lib64/modules/fonts/libfreetype.a +/usr/X11R6/lib64/modules/fonts/libspeedo.a +/usr/X11R6/lib64/modules/fonts/libtype1.a +/usr/X11R6/lib64/modules/fonts/libxtt.a +/usr/X11R6/lib64/modules/input/acecad_drv.o +/usr/X11R6/lib64/modules/input/calcomp_drv.o +/usr/X11R6/lib64/modules/input/citron_drv.o +/usr/X11R6/lib64/modules/input/digitaledge_drv.o +/usr/X11R6/lib64/modules/input/dmc_drv.o +/usr/X11R6/lib64/modules/input/dynapro_drv.o +/usr/X11R6/lib64/modules/input/elographics_drv.o +/usr/X11R6/lib64/modules/input/hyperpen_drv.o +/usr/X11R6/lib64/modules/input/microtouch_drv.o +/usr/X11R6/lib64/modules/input/mouse_drv.o +/usr/X11R6/lib64/modules/input/mutouch_drv.o +/usr/X11R6/lib64/modules/input/penmount_drv.o +/usr/X11R6/lib64/modules/input/spaceorb_drv.o +/usr/X11R6/lib64/modules/input/summa_drv.o +/usr/X11R6/lib64/modules/input/void_drv.o +/usr/X11R6/lib64/modules/input/wacom_drv.o +/usr/X11R6/lib64/modules/libcfb.a +/usr/X11R6/lib64/modules/libcfb16.a +/usr/X11R6/lib64/modules/libcfb24.a +/usr/X11R6/lib64/modules/libcfb32.a +/usr/X11R6/lib64/modules/libddc.a +/usr/X11R6/lib64/modules/libfb.a +/usr/X11R6/lib64/modules/libi2c.a +/usr/X11R6/lib64/modules/libint10.a +/usr/X11R6/lib64/modules/liblayer.a +/usr/X11R6/lib64/modules/libmfb.a +/usr/X11R6/lib64/modules/libpcidata.a +/usr/X11R6/lib64/modules/librac.a +/usr/X11R6/lib64/modules/libramdac.a +/usr/X11R6/lib64/modules/libscanpci.a +/usr/X11R6/lib64/modules/libshadow.a +/usr/X11R6/lib64/modules/libshadowfb.a +/usr/X11R6/lib64/modules/libvbe.a +/usr/X11R6/lib64/modules/libvgahw.a +/usr/X11R6/lib64/modules/libxaa.a +/usr/X11R6/lib64/modules/libxf1bpp.a +/usr/X11R6/lib64/modules/libxf24_32bpp.a +/usr/X11R6/lib64/modules/libxf4bpp.a +/usr/X11R6/lib64/modules/libxf8_16bpp.a +/usr/X11R6/lib64/modules/libxf8_32bpp.a +/usr/X11R6/lib64/modules/linux/libdrm.a +/usr/X11R6/lib64/modules/linux/libfbdevhw.a +/usr/X11R6/lib64/modules/linux/libint10.a +/usr/X11R6/lib64/modules/multimedia/bt829_drv.o +/usr/X11R6/lib64/modules/multimedia/fi1236_drv.o +/usr/X11R6/lib64/modules/multimedia/msp3430_drv.o +/usr/X11R6/lib64/modules/multimedia/saa7114_drv.o +/usr/X11R6/lib64/modules/multimedia/tda8425_drv.o +/usr/X11R6/lib64/modules/multimedia/tda9850_drv.o +/usr/X11R6/lib64/modules/multimedia/tda9885_drv.o +/usr/X11R6/lib64/modules/multimedia/theatre_drv.o diff --git a/perl-install/standalone/drakboot b/perl-install/standalone/drakboot index ade6207de..f2ed2b921 100755 --- a/perl-install/standalone/drakboot +++ b/perl-install/standalone/drakboot @@ -1,6 +1,7 @@ #!/usr/bin/perl use lib qw(/usr/lib/libDrakX); +use MDK::Common; use standalone; #- warning, standalone must be loaded very first, for 'explanations' @@ -38,7 +39,13 @@ sub lilo_choice { my $bootloader = bootloader::read(); local ($_) = `detectloader`; - $bootloader->{methods} = { lilo => 1, grub => !!/grub/i, if_(arch() =~ /ppc/, yaboot => 1) }; + $bootloader->{methods} = { + if_(arch() =~ /ppc/, yaboot => 1), + if_(arch() =~ /sparc/, silo => 1), + if_(arch() =~ /ia64/, elilo => 1), + if_(arch() =~ /i.86|x86_64/, lilo => 1), + if_(arch() =~ /i.86/, grub => !!/grub/i) + }; my ($all_hds) = fsedit::get_hds(); my $fstab = [ fsedit::get_all_fstab($all_hds) ]; diff --git a/perl-install/steps.pm b/perl-install/steps.pm index ceeac3944..c2c7c7ee7 100644 --- a/perl-install/steps.pm +++ b/perl-install/steps.pm @@ -27,7 +27,7 @@ use common; # summary => [ __("Summary"), 1, 0, '', "installPackages", 'summary' ], # configureServices => [ __("Configure services"), 1, 1, '!$::expert', "installPackages", 'services' ], setupBootloader => [ __("Install bootloader"), 1, 0, '', "installPackages", 'bootloader' ], -if_((arch() !~ /alpha/) && (arch() !~ /ppc/), +if_((arch() !~ /alpha/) && (arch() !~ /ppc/) && (arch() !~ /ia64/), createBootdisk => [ __("Create a bootdisk"), 1, 0, '', "installPackages", 'bootdisk' ], ), configureX => [ __("Configure X"), 1, 1, '', ["formatPartitions", "setupBootloader"], 'X' ], diff --git a/rescue/list b/rescue/list index 90d966f2a..17fd49582 100644 --- a/rescue/list +++ b/rescue/list @@ -110,22 +110,22 @@ /etc/services /bin/rpm /sbin/mkraid -/usr/LIB/rpm/rpmrc -/usr/LIB/rpm/macros -/usr/LIB/rpm/rpmpopt-4.0.4 +/usr/lib/rpm/rpmrc +/usr/lib/rpm/macros +/usr/lib/rpm/rpmpopt-4.0.4 /usr/bin/rpm2cpio /usr/bin/rpmdb -/usr/LIB/rpm/rpmd +/usr/lib/rpm/rpmd /usr/bin/rpme -/usr/LIB/rpm/rpme +/usr/lib/rpm/rpme /usr/bin/rpmi -/usr/LIB/rpm/rpmi +/usr/lib/rpm/rpmi /usr/bin/rpmu -/usr/LIB/rpm/rpmu +/usr/lib/rpm/rpmu /usr/bin/rpmquery -/usr/LIB/rpm/rpmq +/usr/lib/rpm/rpmq /usr/bin/rpmverify -/usr/LIB/rpm/rpmv +/usr/lib/rpm/rpmv /usr/lib/perl5/PERL_VERSION/strict.pm /usr/lib/perl5/PERL_VERSION/vars.pm /usr/lib/perl5/PERL_VERSION/warnings/register.pm diff --git a/rescue/list.ia64 b/rescue/list.ia64 index e200f0a3a..a6244154e 100644 --- a/rescue/list.ia64 +++ b/rescue/list.ia64 @@ -1,8 +1,12 @@ /usr/sbin/ext2resize -/sbin/mkreiserfs -/sbin/reiserfsck /sbin/fsck.xfs /sbin/xfs_repair /sbin/sfdisk /usr/sbin/efibootmgr /usr/lib/perl5/PERL_VERSION/ia64-linux-thread-multi/CORE/libperl.so +/usr/lib/perl5/vendor_perl/PERL_VERSION/packdrake.pm +/sbin/mkreiserfs +/sbin/reiserfsck +/sbin/fsck.xfs +/sbin/xfs_repair + diff --git a/rescue/list.x86_64 b/rescue/list.x86_64 index 0bd5c8b1b..7031c5999 100644 --- a/rescue/list.x86_64 +++ b/rescue/list.x86_64 @@ -1,5 +1,7 @@ /usr/sbin/ext2resize /sbin/mkreiserfs /sbin/reiserfsck +/sbin/fsck.xfs +/sbin/xfs_repair /sbin/sfdisk /usr/lib/perl5/PERL_VERSION/x86_64-linux-thread-multi/CORE/libperl.so diff --git a/tools/Makefile b/tools/Makefile index 244b23bd9..b3a17a636 100644 --- a/tools/Makefile +++ b/tools/Makefile @@ -3,7 +3,7 @@ DEST = $(ROOTDEST)/Mandrake/mdkinst RPMS = $(wildcard $(ROOTDEST)/Mandrake/RPMS/*.rpm) DIRS = ddcprobe serial_probe aewm-drakx BASE = $(ROOTDEST)/Mandrake/base -CFLAGS = -Wall +CFLAGS = -Wall -Os ARCH := $(shell arch | egrep "(x86_64|sparc64|s390x)") ifneq ("x$(ARCH)", "x") diff --git a/tools/aewm-drakx/client.c b/tools/aewm-drakx/client.c index 8db6b2151..905fd4fbc 100644 --- a/tools/aewm-drakx/client.c +++ b/tools/aewm-drakx/client.c @@ -34,7 +34,7 @@ void set_focus_on(Window w) * this property. Does this goof up on 64 bit systems? */ void set_wm_state(Client *c, int state) { - CARD32 data[2]; + long data[2]; data[0] = state; data[1] = None; /* Icon? We don't need no steenking icon. */ diff --git a/tools/aewm-drakx/misc.c b/tools/aewm-drakx/misc.c index 9542c2cc3..fa0523534 100644 --- a/tools/aewm-drakx/misc.c +++ b/tools/aewm-drakx/misc.c @@ -25,6 +25,5 @@ int handle_xerror(Display *dpy, XErrorEvent *e) XGetErrorText(dpy, e->error_code, msg, sizeof msg); err("X error (%#lx): %s", e->resourceid, msg); - if (c) remove_client(c); return 0; } |