diff options
author | Erik Andersen | 2000-03-23 01:09:18 +0000 |
---|---|---|
committer | Erik Andersen | 2000-03-23 01:09:18 +0000 |
commit | 298854f02963bd8e43dfeb7224d88cfeb0c932cb (patch) | |
tree | 7a2fbb55e55f980edddb0d627c3f3e79c8f793b0 | |
parent | ec5bd90916b6e815a36c14ac04d1b78e3e487400 (diff) | |
download | busybox-298854f02963bd8e43dfeb7224d88cfeb0c932cb.zip busybox-298854f02963bd8e43dfeb7224d88cfeb0c932cb.tar.gz |
My latest ramblings.
-Erik
-rw-r--r-- | Changelog | 1 | ||||
-rw-r--r-- | TODO | 338 | ||||
-rw-r--r-- | applets/busybox.c | 196 | ||||
-rw-r--r-- | archival/tar.c | 513 | ||||
-rw-r--r-- | busybox.c | 196 | ||||
-rw-r--r-- | busybox.def.h | 4 | ||||
-rw-r--r-- | console-tools/loadkmap.c | 4 | ||||
-rw-r--r-- | coreutils/date.c | 4 | ||||
-rw-r--r-- | coreutils/dd.c | 24 | ||||
-rw-r--r-- | coreutils/ls.c | 5 | ||||
-rw-r--r-- | coreutils/tee.c | 6 | ||||
-rw-r--r-- | date.c | 4 | ||||
-rw-r--r-- | dd.c | 24 | ||||
-rw-r--r-- | fbset.c | 16 | ||||
-rw-r--r-- | fdflush.c | 4 | ||||
-rw-r--r-- | freeramdisk.c | 4 | ||||
-rw-r--r-- | fsck_minix.c | 6 | ||||
-rw-r--r-- | init.c | 3 | ||||
-rw-r--r-- | init/init.c | 3 | ||||
-rw-r--r-- | internal.h | 8 | ||||
-rw-r--r-- | loadkmap.c | 4 | ||||
-rw-r--r-- | ls.c | 5 | ||||
-rw-r--r-- | mount.c | 4 | ||||
-rw-r--r-- | tar.c | 513 | ||||
-rw-r--r-- | tee.c | 6 | ||||
-rw-r--r-- | umount.c | 4 | ||||
-rw-r--r-- | util-linux/fbset.c | 16 | ||||
-rw-r--r-- | util-linux/fdflush.c | 4 | ||||
-rw-r--r-- | util-linux/freeramdisk.c | 4 | ||||
-rw-r--r-- | util-linux/fsck_minix.c | 6 | ||||
-rw-r--r-- | util-linux/mount.c | 4 | ||||
-rw-r--r-- | util-linux/umount.c | 4 | ||||
-rw-r--r-- | utility.c | 6 |
33 files changed, 1112 insertions, 831 deletions
@@ -55,6 +55,7 @@ * all mallocs now use xmalloc (and so are OOM error safe), and the common error handling saves a few bytes. Thanks to Bob Tinsley <bob@earthrise.demon.co.uk> for the patch. + * Fix "+" parsing bug in date, from "Merle F. McClelland" <mfm@cts.com>. -Erik Andersen @@ -128,3 +128,341 @@ I'll add this to the TODO list, does also... +------------------------------------------------------------------ + + +Date: Fri, 25 Feb 2000 08:23:12 +0000 (GMT) +From: Riley Williams <rhw@MemAlpha.CX> +X-Sender: rhw@moo.cus.org.uk +To: almesber@lrc.di.epfl.ch +Cc: "Albert D. Cahalan" <acahalan@cs.uml.edu>, + Linux Kernel <linux-kernel@vger.rutgers.edu> +Subject: Re: What /proc should contain [was: /proc/driver/microcode] +In-Reply-To: <20000224165245.A29790@lrc.di.epfl.ch> +Message-ID: <Pine.LNX.4.21.0002250806220.8741-100000@moo.cus.org.uk> +Sender: owner-linux-kernel@vger.rutgers.edu +Precedence: bulk + +Hi there. + + >> Nope, most /proc access is does via programs written in C. + + > That varies a lot from file to file. E.g. I haven't seen any + > programs that are specificly designed to read /proc/atm/* yet, + > and I know of only one (fuser) that reads /proc/mounts, + > extracting only partial information (just to pick two examples + > that I'm quite familiar with). + +As a point of reference, here's a slightly tweaked analysis of the +programs on the system I'm reading your mail on. Basically, I ran the +following script... + + Q> #!/bin/bash + Q> function use() { + Q> for Z in $* ; do + Q> strings $Z | grep /proc | sed "s=^=$Z =" + Q> done + Q> } + Q> use /{,s}bin/* /usr/{,s}bin/* | sort -u | tee proc-usage + +...and then went through it removing comments and print format +strings. Replace /proc with /dev and you'd soon have an equivalent +list for that - although I can report that such is MUCH larger... + +There are three programs therein that refer to /proc/mounts ... + + /bin/mount + /bin/umount + /usr/bin/eject + +...and, as you stated, none that refer to /proc/atm on this system. +However, as this is a RedHat Linux 5.0 based system, that's not +necessarily an up to date reference thereto... + +Here's the list anyway... + +/bin/kill /proc/%d/cmdline +/bin/kill /proc/%d/stat + +/bin/mount /proc/devices +/bin/mount /proc/filesystems +/bin/mount /proc/mounts + +/bin/netstat /proc/net +/bin/netstat /proc/net/appletalk +/bin/netstat /proc/net/ax25 +/bin/netstat /proc/net/ax25_route +/bin/netstat /proc/net/dev +/bin/netstat /proc/net/ip_masquerade +/bin/netstat /proc/net/ipx +/bin/netstat /proc/net/ipx_route +/bin/netstat /proc/net/netstat +/bin/netstat /proc/net/nr +/bin/netstat /proc/net/nr_neigh +/bin/netstat /proc/net/nr_nodes +/bin/netstat /proc/net/raw +/bin/netstat /proc/net/route +/bin/netstat /proc/net/rt_cache +/bin/netstat /proc/net/snmp +/bin/netstat /proc/net/tcp +/bin/netstat /proc/net/udp +/bin/netstat /proc/net/unix + +/bin/umount /proc/devices +/bin/umount /proc/mounts + +/sbin/arp /proc/net/appletalk +/sbin/arp /proc/net/arp +/sbin/arp /proc/net/ax25 +/sbin/arp /proc/net/ipx +/sbin/arp /proc/net/nr +/sbin/arp /proc/net/unix + +/sbin/cardctl /proc/devices + +/sbin/cardmgr /proc/devices + +/sbin/fdisk /proc/ide/%s/media +/sbin/fdisk /proc/scsi/scsi + +/sbin/getty /proc/version + +/sbin/ifconfig /proc/net +/sbin/ifconfig /proc/net/appletalk +/sbin/ifconfig /proc/net/ax25 +/sbin/ifconfig /proc/net/dev +/sbin/ifconfig /proc/net/ipx +/sbin/ifconfig /proc/net/nr +/sbin/ifconfig /proc/net/unix + +/sbin/ifup /proc/sys/kernel/modprobe + +/sbin/ipchains /proc/net/ip_fwchains +/sbin/ipchains /proc/net/ip_fwnames +/sbin/ipchains /proc/net/ip_masquerade +/sbin/ipchains /proc/sys/net/ipv4/ip_forward + +/sbin/ipmaddr /proc/net/dev_mcast +/sbin/ipmaddr /proc/net/igmp +/sbin/ipmaddr /proc/net/igmp6 + +/sbin/iptunnel /proc/net/dev + +/sbin/killall5 /proc/%s/cmdline +/sbin/killall5 /proc/%s/exe +/sbin/killall5 /proc/%s/stat +/sbin/killall5 /proc/version + +/sbin/klogd /proc/kmsg + +/sbin/lsmod /proc/modules + +/sbin/modprobe /proc/modules + +/sbin/pidof /proc/%s/cmdline +/sbin/pidof /proc/%s/exe +/sbin/pidof /proc/%s/stat +/sbin/pidof /proc/version + +/sbin/probe /proc/pci + +/sbin/rarp /proc/net/ax25 +/sbin/rarp /proc/net/nr +/sbin/rarp /proc/net/rarp + +/sbin/rmmod /proc/modules + +/sbin/rmmod.static /proc/modules + +/sbin/route /proc/net/appletalk +/sbin/route /proc/net/ax25 +/sbin/route /proc/net/ax25_route +/sbin/route /proc/net/ipx +/sbin/route /proc/net/ipx_route +/sbin/route /proc/net/nr +/sbin/route /proc/net/nr_neigh +/sbin/route /proc/net/nr_nodes +/sbin/route /proc/net/route +/sbin/route /proc/net/rt_cache +/sbin/route /proc/net/unix + +/sbin/scsi_info /proc/scsi +/sbin/scsi_info /proc/scsi/%s +/sbin/scsi_info /proc/scsi/scsi + +/sbin/slattach /proc/net/ax25 +/sbin/slattach /proc/net/nr + +/sbin/swapoff /proc/swaps + +/sbin/swapon /proc/swaps + +/sbin/uugetty /proc/version + +/usr/bin/dig /proc/ +/usr/bin/dig /proc/interrupts +/usr/bin/dig /proc/meminfo +/usr/bin/dig /proc/rtc +/usr/bin/dig /proc/self/status +/usr/bin/dig /proc/stat + +/usr/bin/dnsquery /proc/ +/usr/bin/dnsquery /proc/interrupts +/usr/bin/dnsquery /proc/meminfo +/usr/bin/dnsquery /proc/rtc +/usr/bin/dnsquery /proc/self/status +/usr/bin/dnsquery /proc/stat + +/usr/bin/eject /proc/mounts + +/usr/bin/emacs /proc/loadavg + +/usr/bin/fetchmail /proc/net/dev + +/usr/bin/free /proc/meminfo + +/usr/bin/gmake /proc/loadavg + +/usr/bin/gpm-root /proc/loadavg +/usr/bin/gpm-root /proc/meminfo + +/usr/bin/host /proc/ +/usr/bin/host /proc/interrupts +/usr/bin/host /proc/meminfo +/usr/bin/host /proc/rtc +/usr/bin/host /proc/self/status +/usr/bin/host /proc/stat + +/usr/bin/hoststat /proc/loadavg + +/usr/bin/hwdiag /proc/cpuinfo +/usr/bin/hwdiag /proc/pci +/usr/bin/hwdiag /proc/scsi/scsi +/usr/bin/hwdiag /proc/version + +/usr/bin/lsdev /proc/dma +/usr/bin/lsdev /proc/interrupts +/usr/bin/lsdev /proc/ioports + +/usr/bin/mailq /proc/loadavg + +/usr/bin/make /proc/loadavg + +/usr/bin/mcookie /proc/loadavg +/usr/bin/mcookie /proc/stat + +/usr/bin/newaliases /proc/loadavg + +/usr/bin/nslookup /proc/ +/usr/bin/nslookup /proc/interrupts +/usr/bin/nslookup /proc/meminfo +/usr/bin/nslookup /proc/rtc +/usr/bin/nslookup /proc/self/status +/usr/bin/nslookup /proc/stat + +/usr/bin/nsupdate /proc/ +/usr/bin/nsupdate /proc/interrupts +/usr/bin/nsupdate /proc/meminfo +/usr/bin/nsupdate /proc/rtc +/usr/bin/nsupdate /proc/self/status +/usr/bin/nsupdate /proc/stat + +/usr/bin/pgp /proc/version +/usr/bin/pgpe /proc/version +/usr/bin/pgpk /proc/version +/usr/bin/pgps /proc/version +/usr/bin/pgpv /proc/version + +/usr/bin/procinfo /proc/cmdline +/usr/bin/procinfo /proc/devices +/usr/bin/procinfo /proc/dma +/usr/bin/procinfo /proc/filesystems +/usr/bin/procinfo /proc/interrupts +/usr/bin/procinfo /proc/loadavg +/usr/bin/procinfo /proc/meminfo +/usr/bin/procinfo /proc/modules +/usr/bin/procinfo /proc/stat +/usr/bin/procinfo /proc/uptime +/usr/bin/procinfo /proc/version + +/usr/bin/purgestat /proc/loadavg + +/usr/bin/screen /proc/loadavg + +/usr/bin/strace /proc/%d/stat + +/usr/bin/top /proc/cpuinfo +/usr/bin/top /proc/meminfo +/usr/bin/top /proc/stat + +/usr/bin/vmstat /proc/%s/stat +/usr/bin/vmstat /proc/meminfo +/usr/bin/vmstat /proc/stat + +/usr/sbin/atd /proc/loadavg + +/usr/sbin/dnskeygen /proc/ +/usr/sbin/dnskeygen /proc/interrupts +/usr/sbin/dnskeygen /proc/meminfo +/usr/sbin/dnskeygen /proc/rtc +/usr/sbin/dnskeygen /proc/self/status +/usr/sbin/dnskeygen /proc/stat + +/usr/sbin/fuser /proc/%d/stat +/usr/sbin/fuser /proc/net/%s +/usr/sbin/fuser /proc/net/unix + +/usr/sbin/in.identd /proc/net/tcp + +/usr/sbin/irpd /proc/ +/usr/sbin/irpd /proc/interrupts +/usr/sbin/irpd /proc/meminfo +/usr/sbin/irpd /proc/rtc +/usr/sbin/irpd /proc/self/status +/usr/sbin/irpd /proc/stat + +/usr/sbin/named /proc/ +/usr/sbin/named /proc/interrupts +/usr/sbin/named /proc/meminfo +/usr/sbin/named /proc/rtc +/usr/sbin/named /proc/self/status +/usr/sbin/named /proc/stat + +/usr/sbin/named-xfer /proc/ +/usr/sbin/named-xfer /proc/interrupts +/usr/sbin/named-xfer /proc/meminfo +/usr/sbin/named-xfer /proc/rtc +/usr/sbin/named-xfer /proc/self/status +/usr/sbin/named-xfer /proc/stat + +/usr/sbin/readprofile /proc/profile + +/usr/sbin/rwhod /proc/loadavg +/usr/sbin/rwhod /proc/uptime + +/usr/sbin/sendmail /proc/loadavg + +/usr/sbin/setconsole /proc/openprom/options +/usr/sbin/setconsole /proc/openprom/options/${console}-mode +/usr/sbin/setconsole /proc/openprom/options/input-device +/usr/sbin/setconsole /proc/openprom/options/output-device + +Best wishes from Riley. + + * Copyright (C) 1999, Memory Alpha Systems. + * All rights and wrongs reserved. + ++----------------------------------------------------------------------+ +| There is something frustrating about the quality and speed of Linux | +| development, ie., the quality is too high and the speed is too high, | +| in other words, I can implement this XXXX feature, but I bet someone | +| else has already done so and is just about to release their patch. | ++----------------------------------------------------------------------+ + * http://www.memalpha.cx/Linux/Kernel/ + + +- +To unsubscribe from this list: send the line "unsubscribe linux-kernel" in +the body of a message to majordomo@vger.rutgers.edu +Please read the FAQ at http://www.tux.org/lkml/ + diff --git a/applets/busybox.c b/applets/busybox.c index ee745e7..95fee63 100644 --- a/applets/busybox.c +++ b/applets/busybox.c @@ -32,301 +32,301 @@ void *__libc_stack_end; static const struct Applet applets[] = { -#ifdef BB_BASENAME //usr/bin/basename +#ifdef BB_BASENAME {"basename", basename_main, _BB_DIR_USR_BIN}, #endif -#ifdef BB_BUSYBOX //bin +#ifdef BB_BUSYBOX {"busybox", busybox_main, _BB_DIR_BIN}, #endif -#ifdef BB_BLOCK_DEVICE //sbin +#ifdef BB_BLOCK_DEVICE {"block_device", block_device_main, _BB_DIR_SBIN}, #endif -#ifdef BB_CAT //bin +#ifdef BB_CAT {"cat", cat_main, _BB_DIR_BIN}, #endif -#ifdef BB_CHMOD_CHOWN_CHGRP //bin +#ifdef BB_CHMOD_CHOWN_CHGRP {"chmod", chmod_chown_chgrp_main, _BB_DIR_BIN}, #endif -#ifdef BB_CHMOD_CHOWN_CHGRP //bin +#ifdef BB_CHMOD_CHOWN_CHGRP {"chown", chmod_chown_chgrp_main, _BB_DIR_BIN}, #endif -#ifdef BB_CHMOD_CHOWN_CHGRP //bin +#ifdef BB_CHMOD_CHOWN_CHGRP {"chgrp", chmod_chown_chgrp_main, _BB_DIR_BIN}, #endif -#ifdef BB_CHROOT //sbin +#ifdef BB_CHROOT {"chroot", chroot_main, _BB_DIR_SBIN}, #endif -#ifdef BB_CLEAR //usr/bin +#ifdef BB_CLEAR {"clear", clear_main, _BB_DIR_USR_BIN}, #endif -#ifdef BB_CHVT //usr/bin +#ifdef BB_CHVT {"chvt", chvt_main, _BB_DIR_USR_BIN}, #endif -#ifdef BB_CP_MV //bin +#ifdef BB_CP_MV {"cp", cp_mv_main, _BB_DIR_BIN}, #endif -#ifdef BB_CP_MV //bin +#ifdef BB_CP_MV {"mv", cp_mv_main, _BB_DIR_BIN}, #endif -#ifdef BB_DATE //bin +#ifdef BB_DATE {"date", date_main, _BB_DIR_BIN}, #endif -#ifdef BB_DD //bin +#ifdef BB_DD {"dd", dd_main, _BB_DIR_BIN}, #endif -#ifdef BB_DF //bin +#ifdef BB_DF {"df", df_main, _BB_DIR_BIN}, #endif -#ifdef BB_DIRNAME //usr/bin +#ifdef BB_DIRNAME {"dirname", dirname_main, _BB_DIR_USR_BIN}, #endif -#ifdef BB_DMESG //bin +#ifdef BB_DMESG {"dmesg", dmesg_main, _BB_DIR_BIN}, #endif -#ifdef BB_DU //bin +#ifdef BB_DU {"du", du_main, _BB_DIR_BIN}, #endif -#ifdef BB_DUTMP //usr/sbin +#ifdef BB_DUTMP {"dutmp", dutmp_main, _BB_DIR_USR_SBIN}, #endif -#ifdef BB_ECHO //bin +#ifdef BB_ECHO {"echo", echo_main, _BB_DIR_BIN}, #endif -#ifdef BB_FBSET //usr/sbin +#ifdef BB_FBSET {"fbset", fbset_main, _BB_DIR_USR_SBIN}, #endif -#ifdef BB_FDFLUSH //bin +#ifdef BB_FDFLUSH {"fdflush", fdflush_main, _BB_DIR_BIN}, #endif -#ifdef BB_FIND //usr/bin +#ifdef BB_FIND {"find", find_main, _BB_DIR_USR_BIN}, #endif -#ifdef BB_FREE //usr/bin +#ifdef BB_FREE {"free", free_main, _BB_DIR_USR_BIN}, #endif -#ifdef BB_FREERAMDISK //sbin +#ifdef BB_FREERAMDISK {"freeramdisk", freeramdisk_main, _BB_DIR_SBIN}, #endif -#ifdef BB_DEALLOCVT //usr/bin +#ifdef BB_DEALLOCVT {"deallocvt", deallocvt_main, _BB_DIR_USR_BIN}, #endif -#ifdef BB_FSCK_MINIX //sbin +#ifdef BB_FSCK_MINIX {"fsck.minix", fsck_minix_main, _BB_DIR_SBIN}, #endif -#ifdef BB_MKFS_MINIX //sbin +#ifdef BB_MKFS_MINIX {"mkfs.minix", mkfs_minix_main, _BB_DIR_SBIN}, #endif -#ifdef BB_GREP //bin +#ifdef BB_GREP {"grep", grep_main, _BB_DIR_BIN}, #endif -#ifdef BB_HALT //sbin +#ifdef BB_HALT {"halt", halt_main, _BB_DIR_SBIN}, #endif -#ifdef BB_HEAD //bin +#ifdef BB_HEAD {"head", head_main, _BB_DIR_BIN}, #endif -#ifdef BB_HOSTID //usr/bin +#ifdef BB_HOSTID {"hostid", hostid_main, _BB_DIR_USR_BIN}, #endif -#ifdef BB_HOSTNAME //bin +#ifdef BB_HOSTNAME {"hostname", hostname_main, _BB_DIR_BIN}, #endif -#ifdef BB_INIT //sbin +#ifdef BB_INIT {"init", init_main, _BB_DIR_SBIN}, #endif -#ifdef BB_INSMOD //sbin +#ifdef BB_INSMOD {"insmod", insmod_main, _BB_DIR_SBIN}, #endif #ifdef BB_FEATURE_LINUXRC // {"linuxrc", init_main, _BB_DIR_ROOT}, #endif -#ifdef BB_KILL //bin +#ifdef BB_KILL {"kill", kill_main, _BB_DIR_BIN}, #endif -#ifdef BB_KILLALL //usr/bin +#ifdef BB_KILLALL {"killall", kill_main, _BB_DIR_USR_BIN}, #endif -#ifdef BB_LENGTH //usr/bin +#ifdef BB_LENGTH {"length", length_main, _BB_DIR_USR_BIN}, #endif -#ifdef BB_LN //bin +#ifdef BB_LN {"ln", ln_main, _BB_DIR_BIN}, #endif -#ifdef BB_LOADACM //usr/bin +#ifdef BB_LOADACM {"loadacm", loadacm_main, _BB_DIR_USR_BIN}, #endif -#ifdef BB_LOADFONT //usr/bin +#ifdef BB_LOADFONT {"loadfont", loadfont_main, _BB_DIR_USR_BIN}, #endif -#ifdef BB_LOADKMAP //sbin +#ifdef BB_LOADKMAP {"loadkmap", loadkmap_main, _BB_DIR_SBIN}, #endif -#ifdef BB_LS //bin +#ifdef BB_LS {"ls", ls_main, _BB_DIR_BIN}, #endif -#ifdef BB_LSMOD //sbin +#ifdef BB_LSMOD {"lsmod", lsmod_main, _BB_DIR_SBIN}, #endif -#ifdef BB_MAKEDEVS //sbin +#ifdef BB_MAKEDEVS {"makedevs", makedevs_main, _BB_DIR_SBIN}, #endif -#ifdef BB_MATH //usr/bin +#ifdef BB_MATH {"math", math_main, _BB_DIR_USR_BIN}, #endif -#ifdef BB_MKDIR //bin +#ifdef BB_MKDIR {"mkdir", mkdir_main, _BB_DIR_BIN}, #endif -#ifdef BB_MKFIFO //usr/bin +#ifdef BB_MKFIFO {"mkfifo", mkfifo_main, _BB_DIR_USR_BIN}, #endif -#ifdef BB_MKNOD //bin +#ifdef BB_MKNOD {"mknod", mknod_main, _BB_DIR_BIN}, #endif -#ifdef BB_MKSWAP //sbin +#ifdef BB_MKSWAP {"mkswap", mkswap_main, _BB_DIR_SBIN}, #endif -#ifdef BB_MNC //usr/bin +#ifdef BB_MNC {"mnc", mnc_main, _BB_DIR_USR_BIN}, #endif -#ifdef BB_MORE //bin +#ifdef BB_MORE {"more", more_main, _BB_DIR_BIN}, #endif -#ifdef BB_MOUNT //bin +#ifdef BB_MOUNT {"mount", mount_main, _BB_DIR_BIN}, #endif -#ifdef BB_MT //bin +#ifdef BB_MT {"mt", mt_main, _BB_DIR_BIN}, #endif -#ifdef BB_NSLOOKUP //usr/bin +#ifdef BB_NSLOOKUP {"nslookup", nslookup_main, _BB_DIR_USR_BIN}, #endif -#ifdef BB_PING //bin +#ifdef BB_PING {"ping", ping_main, _BB_DIR_BIN}, #endif -#ifdef BB_POWEROFF //sbin +#ifdef BB_POWEROFF {"poweroff", poweroff_main, _BB_DIR_SBIN}, #endif -#ifdef BB_PRINTF //usr/bin +#ifdef BB_PRINTF {"printf", printf_main, _BB_DIR_USR_BIN}, #endif -#ifdef BB_PS //bin +#ifdef BB_PS {"ps", ps_main, _BB_DIR_BIN}, #endif -#ifdef BB_PWD //bin +#ifdef BB_PWD {"pwd", pwd_main, _BB_DIR_BIN}, #endif -#ifdef BB_REBOOT //sbin +#ifdef BB_REBOOT {"reboot", reboot_main, _BB_DIR_SBIN}, #endif -#ifdef BB_RM //bin +#ifdef BB_RM {"rm", rm_main, _BB_DIR_BIN}, #endif -#ifdef BB_RMDIR //bin +#ifdef BB_RMDIR {"rmdir", rmdir_main, _BB_DIR_BIN}, #endif -#ifdef BB_RMMOD //sbin +#ifdef BB_RMMOD {"rmmod", rmmod_main, _BB_DIR_SBIN}, #endif -#ifdef BB_SED //bin +#ifdef BB_SED {"sed", sed_main, _BB_DIR_BIN}, #endif -#ifdef BB_SH //bin +#ifdef BB_SH {"sh", shell_main, _BB_DIR_BIN}, #endif -#ifdef BB_SFDISK //sbin +#ifdef BB_SFDISK {"fdisk", sfdisk_main, _BB_DIR_SBIN}, -#ifdef BB_SFDISK //sbin +#ifdef BB_SFDISK #endif {"sfdisk", sfdisk_main, _BB_DIR_SBIN}, #endif -#ifdef BB_SLEEP //bin +#ifdef BB_SLEEP {"sleep", sleep_main, _BB_DIR_BIN}, #endif -#ifdef BB_SORT //bin +#ifdef BB_SORT {"sort", sort_main, _BB_DIR_BIN}, #endif -#ifdef BB_SYNC //bin +#ifdef BB_SYNC {"sync", sync_main, _BB_DIR_BIN}, #endif -#ifdef BB_SYSLOGD //sbin +#ifdef BB_SYSLOGD {"syslogd", syslogd_main, _BB_DIR_SBIN}, #endif -#ifdef BB_LOGGER //usr/bin +#ifdef BB_LOGGER {"logger", logger_main, _BB_DIR_USR_BIN}, #endif -#ifdef BB_LOGNAME //usr/bin +#ifdef BB_LOGNAME {"logname", logname_main, _BB_DIR_USR_BIN}, #endif -#ifdef BB_SWAPONOFF //sbin +#ifdef BB_SWAPONOFF {"swapon", swap_on_off_main, _BB_DIR_SBIN}, #endif -#ifdef BB_SWAPONOFF //sbin +#ifdef BB_SWAPONOFF {"swapoff", swap_on_off_main, _BB_DIR_SBIN}, #endif -#ifdef BB_TAIL //usr/bin +#ifdef BB_TAIL {"tail", tail_main, _BB_DIR_USR_BIN}, #endif -#ifdef BB_TAR //bin +#ifdef BB_TAR {"tar", tar_main, _BB_DIR_BIN}, #endif -#ifdef BB_TELNET //usr/bin +#ifdef BB_TELNET {"telnet", telnet_main, _BB_DIR_USR_BIN}, #endif -#ifdef BB_TEST //usr/bin +#ifdef BB_TEST {"[", test_main, _BB_DIR_USR_BIN}, #endif -#ifdef BB_TEST //usr/bin +#ifdef BB_TEST {"test", test_main, _BB_DIR_USR_BIN}, #endif -#ifdef BB_TEE //bin +#ifdef BB_TEE {"tee", tee_main, _BB_DIR_BIN}, #endif -#ifdef BB_TOUCH //usr/bin +#ifdef BB_TOUCH {"touch", touch_main, _BB_DIR_USR_BIN}, #endif -#ifdef BB_TR //usr/bin +#ifdef BB_TR {"tr", tr_main, _BB_DIR_USR_BIN}, #endif -#ifdef BB_TRUE_FALSE //bin +#ifdef BB_TRUE_FALSE {"true", true_main, _BB_DIR_BIN}, #endif -#ifdef BB_TRUE_FALSE //bin +#ifdef BB_TRUE_FALSE {"false", false_main, _BB_DIR_BIN}, #endif -#ifdef BB_TTY //usr/bin +#ifdef BB_TTY {"tty", tty_main, _BB_DIR_USR_BIN}, #endif -#ifdef BB_UMOUNT //bin +#ifdef BB_UMOUNT {"umount", umount_main, _BB_DIR_BIN}, #endif -#ifdef BB_UNAME //bin +#ifdef BB_UNAME {"uname", uname_main, _BB_DIR_BIN}, #endif -#ifdef BB_UPTIME //usr/bin +#ifdef BB_UPTIME {"uptime", uptime_main, _BB_DIR_USR_BIN}, #endif -#ifdef BB_UNIQ //bin +#ifdef BB_UNIQ {"uniq", uniq_main, _BB_DIR_BIN}, #endif -#ifdef BB_UPDATE //sbin +#ifdef BB_UPDATE {"update", update_main, _BB_DIR_SBIN}, #endif -#ifdef BB_WC //usr/bin +#ifdef BB_WC {"wc", wc_main, _BB_DIR_USR_BIN}, #endif -#ifdef BB_WHOAMI //usr/bin +#ifdef BB_WHOAMI {"whoami", whoami_main, _BB_DIR_USR_BIN}, #endif -#ifdef BB_YES //usr/bin +#ifdef BB_YES {"yes", yes_main, _BB_DIR_USR_BIN}, #endif -#ifdef BB_GUNZIP //bin +#ifdef BB_GUNZIP {"zcat", gunzip_main, _BB_DIR_BIN}, #endif -#ifdef BB_GUNZIP //bin +#ifdef BB_GUNZIP {"gunzip", gunzip_main, _BB_DIR_BIN}, #endif -#ifdef BB_GZIP //bin +#ifdef BB_GZIP {"gzip", gzip_main, _BB_DIR_BIN}, #endif {0} diff --git a/archival/tar.c b/archival/tar.c index 8f802de..8f83d04 100644 --- a/archival/tar.c +++ b/archival/tar.c @@ -68,57 +68,84 @@ static const char tar_usage[] = #endif -/* - * Tar file constants. - */ -#define TAR_BLOCK_SIZE 512 -#define TAR_NAME_SIZE 100 +/* Tar file constants */ -/* - * The POSIX (and basic GNU) tar header format. - * This structure is always embedded in a TAR_BLOCK_SIZE sized block - * with zero padding. We only process this information minimally. - */ -typedef struct { - char name[TAR_NAME_SIZE]; - char mode[8]; - char uid[8]; - char gid[8]; - char size[12]; - char mtime[12]; - char checkSum[8]; - char typeFlag; - char linkName[TAR_NAME_SIZE]; - char magic[6]; - char version[2]; - char uname[32]; - char gname[32]; - char devMajor[8]; - char devMinor[8]; - char prefix[155]; -} TarHeader; - -#define TAR_MAGIC "ustar" -#define TAR_VERSION "00" - -#define TAR_TYPE_REGULAR '0' -#define TAR_TYPE_HARD_LINK '1' -#define TAR_TYPE_SOFT_LINK '2' +/* POSIX tar Header Block, from POSIX 1003.1-1990 */ +struct TarHeader +{ + /* byte offset */ + char name[100]; /* 0 */ + char mode[8]; /* 100 */ + char uid[8]; /* 108 */ + char gid[8]; /* 116 */ + char size[12]; /* 124 */ + char mtime[12]; /* 136 */ + char chksum[8]; /* 148 */ + char typeflag; /* 156 */ + char linkname[100]; /* 157 */ + char magic[6]; /* 257 */ + char version[2]; /* 263 */ + char uname[32]; /* 265 */ + char gname[32]; /* 297 */ + char devmajor[8]; /* 329 */ + char devminor[8]; /* 337 */ + char prefix[155]; /* 345 */ + /* padding 500 */ +}; +typedef struct TarHeader TarHeader; + + +/* A few useful constants */ +#define TAR_MAGIC "ustar" /* ustar and a null */ +#define TAR_VERSION "00" /* 00 and no null */ +#define TAR_MAGIC_LEN 6 +#define TAR_VERSION_LEN 2 +#define TAR_NAME_LEN 100 +#define TAR_BLOCK_SIZE 512 + +/* A nice enum with all the possible tar file content types */ +enum TarFileType +{ + REGTYPE = '0', /* regular file */ + REGTYPE0 = '\0', /* regular file (ancient bug compat)*/ + LNKTYPE = '1', /* hard link */ + SYMTYPE = '2', /* symbolic link */ + CHRTYPE = '3', /* character special */ + BLKTYPE = '4', /* block special */ + DIRTYPE = '5', /* directory */ + FIFOTYPE = '6', /* FIFO special */ + CONTTYPE = '7', /* reserved */ +}; +typedef enum TarFileType TarFileType; + +/* This struct ignores magic, non-numeric user name, + * non-numeric group name, and the checksum, since + * these are all ignored by BusyBox tar. */ +struct TarInfo +{ + int tarFd; /* An open file descriptor for reading from the tarball */ + char * name; /* File name */ + mode_t mode; /* Unix mode, including device bits. */ + uid_t uid; /* Numeric UID */ + gid_t gid; /* Numeric GID */ + size_t size; /* Size of file */ + time_t mtime; /* Last-modified time */ + enum TarFileType type; /* Regular, directory, link, etc */ + char * linkname; /* Name for symbolic and hard links */ + dev_t device; /* Special device for mknod() */ +}; +typedef struct TarInfo TarInfo; + +/* Static data */ +static const unsigned long TarChecksumOffset = (const unsigned long)&(((TarHeader *)0)->chksum); /* * Static data. */ -static int listFlag; -static int extractFlag; -static int createFlag; -static int verboseFlag; -static int tostdoutFlag; - static int inHeader; // <- check me static int badHeader; -static int errorFlag; static int skipFileFlag; static int warnedRoot; static int eofFlag; @@ -134,7 +161,6 @@ static time_t mtime; /* * Static data associated with the tar file. */ -static const char *tarName; static int tarFd; static dev_t tarDev; static ino_t tarInode; @@ -143,35 +169,25 @@ static ino_t tarInode; /* * Local procedures to restore files from a tar file. */ -static void readTarFile(int fileCount, char **fileTable); +static int readTarFile(const char* tarName, int extractFlag, int listFlag, + int tostdoutFlag, int verboseFlag); static void readData(const char *cp, int count); static long getOctal(const char *cp, int len); - -static void readHeader(const TarHeader * hp, - - int fileCount, char **fileTable); - +static int parseTarHeader(struct TarHeader *rawHeader, struct TarInfo *header); static int wantFileName(const char *fileName, - - int fileCount, char **fileTable); + int argc, char **argv); #ifdef BB_FEATURE_TAR_CREATE /* * Local procedures to save files into a tar file. */ static void saveFile(const char *fileName, int seeLinks); - static void saveRegularFile(const char *fileName, - const struct stat *statbuf); - static void saveDirectory(const char *fileName, - const struct stat *statbuf); - static void writeHeader(const char *fileName, const struct stat *statbuf); - -static void writeTarFile(int fileCount, char **fileTable); +static void writeTarFile(int argc, char **argv); static void writeTarBlock(const char *buf, int len); static int putOctal(char *cp, int len, long value); @@ -180,7 +196,13 @@ static int putOctal(char *cp, int len, long value); extern int tar_main(int argc, char **argv) { + const char *tarName=NULL; const char *options; + int listFlag = FALSE; + int extractFlag = FALSE; + int createFlag = FALSE; + int verboseFlag = FALSE; + int tostdoutFlag = FALSE; argc--; argv++; @@ -188,21 +210,7 @@ extern int tar_main(int argc, char **argv) if (argc < 1) usage(tar_usage); - - errorFlag = FALSE; - extractFlag = FALSE; - createFlag = FALSE; - listFlag = FALSE; - verboseFlag = FALSE; - tostdoutFlag = FALSE; - tarName = NULL; - tarDev = 0; - tarInode = 0; - tarFd = -1; - - /* - * Parse the options. - */ + /* Parse options */ if (**argv == '-') options = (*argv++) + 1; else @@ -212,13 +220,12 @@ extern int tar_main(int argc, char **argv) for (; *options; options++) { switch (*options) { case 'f': - if (tarName != NULL) { - fprintf(stderr, "Only one 'f' option allowed\n"); - - exit(FALSE); - } + if (tarName != NULL) + fatalError( "Only one 'f' option allowed\n"); tarName = *argv++; + if (tarName == NULL) + fatalError( "Option requires an argument: No file specified\n"); argc--; break; @@ -253,9 +260,8 @@ extern int tar_main(int argc, char **argv) break; default: - fprintf(stderr, "Unknown tar flag '%c'\n" + fatalError( "Unknown tar flag '%c'\n" "Try `tar --help' for more information\n", *options); - exit(FALSE); } } @@ -265,23 +271,22 @@ extern int tar_main(int argc, char **argv) */ if (createFlag == TRUE) { #ifndef BB_FEATURE_TAR_CREATE - fprintf(stderr, - "This version of tar was not compiled with tar creation support.\n"); - exit(FALSE); + fatalError( "This version of tar was not compiled with tar creation support.\n"); #else - writeTarFile(argc, argv); + exit(writeTarFile(argc, argv)); #endif } else { - readTarFile(argc, argv); + exit(readTarFile(tarName, extractFlag, listFlag, tostdoutFlag, verboseFlag)); } - if (errorFlag == TRUE) { - fprintf(stderr, "\n"); - } - exit(!errorFlag); flagError: - fprintf(stderr, "Exactly one of 'c', 'x' or 't' must be specified\n"); - exit(FALSE); + fatalError( "Exactly one of 'c', 'x' or 't' must be specified\n"); +} + +static void +tarExtractRegularFile(TarInfo *header, int extractFlag, int listFlag, int tostdoutFlag, int verboseFlag) +{ + } @@ -289,178 +294,148 @@ extern int tar_main(int argc, char **argv) * Read a tar file and extract or list the specified files within it. * If the list is empty than all files are extracted or listed. */ -static void readTarFile(int fileCount, char **fileTable) +static int readTarFile(const char* tarName, int extractFlag, int listFlag, + int tostdoutFlag, int verboseFlag) { - const char *cp; - int cc; - int inCc; - int blockSize; - char buf[BUF_SIZE]; - - skipFileFlag = FALSE; - badHeader = FALSE; - warnedRoot = FALSE; - eofFlag = FALSE; - inHeader = TRUE; - inCc = 0; - dataCc = 0; - outFd = -1; - blockSize = sizeof(buf); - cp = buf; + int status, tarFd=0; + int errorFlag=FALSE; + TarHeader rawHeader; + TarInfo header; - /* - * Open the tar file for reading. - */ - if ((tarName == NULL) || !strcmp(tarName, "-")) { + /* Open the tar file for reading. */ + if (!strcmp(tarName, "-")) tarFd = fileno(stdin); - } else + else tarFd = open(tarName, O_RDONLY); - if (tarFd < 0) { - perror(tarName); - errorFlag = TRUE; - return; + errorMsg( "Error opening '%s': %s", tarName, strerror(errno)); + return ( FALSE); } - /* - * Read blocks from the file until an end of file header block - * has been seen. (A real end of file from a read is an error.) - */ - while (eofFlag == FALSE) { - /* - * Read the next block of data if necessary. - * This will be a large block if possible, which we will - * then process in the small tar blocks. - */ - if (inCc <= 0) { - cp = buf; - inCc = fullRead(tarFd, buf, blockSize); - - if (inCc < 0) { - perror(tarName); - errorFlag = TRUE; - goto done; - } - - if (inCc == 0) { - fprintf(stderr, - "Unexpected end of file from \"%s\"", tarName); - errorFlag = TRUE; - goto done; + /* Read the tar file */ + while ( (status = fullRead(tarFd, (char*)&rawHeader, TAR_BLOCK_SIZE)) == TAR_BLOCK_SIZE ) { + /* Now see if the header looks ok */ + if ( parseTarHeader(&rawHeader, &header) == FALSE ) { + close( tarFd); + if ( *(header.name) == '\0' ) { + goto endgame; + } else { + errorFlag=TRUE; + errorMsg("Bad tar header, skipping\n"); + continue; } } - - /* - * If we are expecting a header block then examine it. - */ - if (inHeader == TRUE) { - readHeader((const TarHeader *) cp, fileCount, fileTable); - - cp += TAR_BLOCK_SIZE; - inCc -= TAR_BLOCK_SIZE; - - continue; + if ( *(header.name) == '\0' ) + goto endgame; + + /* If we got here, we can be certain we have a legitimate + * header to work with. So work with it. */ + switch ( header.type ) { + case REGTYPE: + case REGTYPE0: + /* If the name ends in a '/' then assume it is + * supposed to be a directory, and fall through */ + if (header.name[strlen(header.name)-1] != '/') { + tarExtractRegularFile(&header, extractFlag, listFlag, tostdoutFlag, verboseFlag); + break; + } +#if 0 + case Directory: + tarExtractDirectory( &header, extractFlag, listFlag, tostdoutFlag, verboseFlag); + break; + case HardLink: + tarExtractHardLink( &header, extractFlag, listFlag, tostdoutFlag, verboseFlag); + break; + case SymbolicLink: + tarExtractSymLink( &header, extractFlag, listFlag, tostdoutFlag, verboseFlag); + break; + case CharacterDevice: + case BlockDevice: + case FIFO: + tarExtractSpecial( &header, extractFlag, listFlag, tostdoutFlag, verboseFlag); + break; +#endif + default: + close( tarFd); + return( FALSE); } - - /* - * We are currently handling the data for a file. - * Process the minimum of the amount of data we have available - * and the amount left to be processed for the file. - */ - cc = inCc; - - if (cc > dataCc) - cc = dataCc; - - readData(cp, cc); - - /* - * If the amount left isn't an exact multiple of the tar block - * size then round it up to the next block boundary since there - * is padding at the end of the file. - */ - if (cc % TAR_BLOCK_SIZE) - cc += TAR_BLOCK_SIZE - (cc % TAR_BLOCK_SIZE); - - cp += cc; - inCc -= cc; } - done: - /* - * Close the tar file if needed. - */ - if ((tarFd >= 0) && (close(tarFd) < 0)) - perror(tarName); - - /* - * Close the output file if needed. - * This is only done here on a previous error and so no - * message is required on errors. - */ - if (tostdoutFlag == FALSE) { - if (outFd >= 0) { - close(outFd); - } + close(tarFd); + if (status > 0) { + /* Bummer - we read a partial header */ + errorMsg( "Error reading '%s': %s", tarName, strerror(errno)); + return ( FALSE); } + else + return( status); + + /* Stuff we do when we know we are done with the file */ +endgame: + close( tarFd); + if ( *(header.name) == '\0' ) { + if (errorFlag==FALSE) + return( TRUE); + } + return( FALSE); } - /* - * Examine the header block that was just read. - * This can specify the information for another file, or it can mark - * the end of the tar file. + * Read an octal value in a field of the specified width, with optional + * spaces on both sides of the number and with an optional null character + * at the end. Returns -1 on an illegal format. */ -static void -readHeader(const TarHeader * hp, int fileCount, char **fileTable) +static long getOctal(const char *cp, int size) { - int checkSum; - int cc; - int hardLink; - int softLink; - int devFileFlag; - unsigned int major; - unsigned int minor; - long size; - struct utimbuf utb; - - /* - * If the block is completely empty, then this is the end of the - * archive file. If the name is null, then just skip this header. - */ - outName = hp->name; - - if (*outName == '\0') { - for (cc = TAR_BLOCK_SIZE; cc > 0; cc--) { - if (*outName++) - return; - } + long val = 0; - eofFlag = TRUE; - - return; + for(;(size > 0) && (*cp == ' '); cp++, size--); + if ((size == 0) || !isOctal(*cp)) + return -1; + for(; (size > 0) && isOctal(*cp); size--) { + val = val * 8 + *cp++ - '0'; } + for (;(size > 0) && (*cp == ' '); cp++, size--); + if ((size > 0) && *cp) + return -1; + return val; +} - /* - * There is another file in the archive to examine. - * Extract the encoded information and check it. - */ - mode = getOctal(hp->mode, sizeof(hp->mode)); - uid = getOctal(hp->uid, sizeof(hp->uid)); - gid = getOctal(hp->gid, sizeof(hp->gid)); - size = getOctal(hp->size, sizeof(hp->size)); - mtime = getOctal(hp->mtime, sizeof(hp->mtime)); - checkSum = getOctal(hp->checkSum, sizeof(hp->checkSum)); - major = getOctal(hp->devMajor, sizeof(hp->devMajor)); - minor = getOctal(hp->devMinor, sizeof(hp->devMinor)); - - if ((mode < 0) || (uid < 0) || (gid < 0) || (size < 0)) { - if (badHeader == FALSE) - fprintf(stderr, "Bad tar header, skipping\n"); - - badHeader = TRUE; +/* Parse the tar header and fill in the nice struct with the details */ +static int +parseTarHeader(struct TarHeader *rawHeader, struct TarInfo *header) +{ + long major, minor, chksum, sum; + + header->name = rawHeader->name; + header->mode = getOctal(rawHeader->mode, sizeof(rawHeader->mode)); + header->uid = getOctal(rawHeader->uid, sizeof(rawHeader->uid)); + header->gid = getOctal(rawHeader->gid, sizeof(rawHeader->gid)); + header->size = getOctal(rawHeader->size, sizeof(rawHeader->size)); + header->mtime = getOctal(rawHeader->mtime, sizeof(rawHeader->mtime)); + chksum = getOctal(rawHeader->chksum, sizeof(rawHeader->chksum)); + header->type = rawHeader->typeflag; + header->linkname = rawHeader->linkname; + header->device = MAJOR(getOctal(rawHeader->devmajor, sizeof(rawHeader->devmajor))) | + MINOR(getOctal(rawHeader->devminor, sizeof(rawHeader->devminor))); + + /* Check the checksum */ + sum = ' ' * sizeof(rawHeader->chksum); + for ( i = TarChecksumOffset; i > 0; i-- ) + sum += *s++; + s += sizeof(h->chksum); + for ( i = (512 - TarChecksumOffset - sizeof(h->chksum)); i > 0; i-- ) + sum += *s++; + if (sum == checksum ) + return ( TRUE); + return( FALSE); +} - return; +#if 0 + if ((header->mode < 0) || (header->uid < 0) || + (header->gid < 0) || (header->size < 0)) { + errorMsg(stderr, "Bad tar header, skipping\n"); + return( FALSE); } badHeader = FALSE; @@ -502,7 +477,7 @@ readHeader(const TarHeader * hp, int fileCount, char **fileTable) * See if we want this file to be restored. * If not, then set up to skip it. */ - if (wantFileName(outName, fileCount, fileTable) == FALSE) { + if (wantFileName(outName, argc, argv) == FALSE) { if (!hardLink && !softLink && (S_ISREG(mode) || S_ISCHR(mode) || S_ISBLK(mode) || S_ISSOCK(mode) || S_ISFIFO(mode))) { @@ -726,7 +701,7 @@ static void readData(const char *cp, int count) * Returns TRUE if the file is selected. */ static int -wantFileName(const char *fileName, int fileCount, char **fileTable) +wantFileName(const char *fileName, int argc, char **argv) { const char *pathName; int fileLength; @@ -735,7 +710,7 @@ wantFileName(const char *fileName, int fileCount, char **fileTable) /* * If there are no files in the list, then the file is wanted. */ - if (fileCount == 0) + if (argc == 0) return TRUE; fileLength = strlen(fileName); @@ -743,8 +718,8 @@ wantFileName(const char *fileName, int fileCount, char **fileTable) /* * Check each of the test paths. */ - while (fileCount-- > 0) { - pathName = *fileTable++; + while (argc-- > 0) { + pathName = *argv++; pathLength = strlen(pathName); @@ -762,43 +737,6 @@ wantFileName(const char *fileName, int fileCount, char **fileTable) return FALSE; } -/* - * Read an octal value in a field of the specified width, with optional - * spaces on both sides of the number and with an optional null character - * at the end. Returns -1 on an illegal format. - */ -static long getOctal(const char *cp, int len) -{ - long val; - - while ((len > 0) && (*cp == ' ')) { - cp++; - len--; - } - - if ((len == 0) || !isOctal(*cp)) - return -1; - - val = 0; - - while ((len > 0) && isOctal(*cp)) { - val = val * 8 + *cp++ - '0'; - len--; - } - - while ((len > 0) && (*cp == ' ')) { - cp++; - len--; - } - - if ((len > 0) && *cp) - return -1; - - return val; -} - - - /* From here to the end of the file is the tar writing stuff. * If you do not have BB_FEATURE_TAR_CREATE defined, this will @@ -809,14 +747,14 @@ static long getOctal(const char *cp, int len) /* * Write a tar file containing the specified files. */ -static void writeTarFile(int fileCount, char **fileTable) +static void writeTarFile(int argc, char **argv) { struct stat statbuf; /* * Make sure there is at least one file specified. */ - if (fileCount <= 0) { + if (argc <= 0) { fprintf(stderr, "No files specified to be saved\n"); errorFlag = TRUE; } @@ -852,8 +790,8 @@ static void writeTarFile(int fileCount, char **fileTable) * Append each file name into the archive file. * Follow symbolic links for these top level file names. */ - while (errorFlag == FALSE && (fileCount-- > 0)) { - saveFile(*fileTable++, FALSE); + while (errorFlag == FALSE && (argc-- > 0)) { + saveFile(*argv++, FALSE); } /* @@ -1284,3 +1222,4 @@ static int putOctal(char *cp, int len, long value) #endif /* END CODE */ +#endif @@ -32,301 +32,301 @@ void *__libc_stack_end; static const struct Applet applets[] = { -#ifdef BB_BASENAME //usr/bin/basename +#ifdef BB_BASENAME {"basename", basename_main, _BB_DIR_USR_BIN}, #endif -#ifdef BB_BUSYBOX //bin +#ifdef BB_BUSYBOX {"busybox", busybox_main, _BB_DIR_BIN}, #endif -#ifdef BB_BLOCK_DEVICE //sbin +#ifdef BB_BLOCK_DEVICE {"block_device", block_device_main, _BB_DIR_SBIN}, #endif -#ifdef BB_CAT //bin +#ifdef BB_CAT {"cat", cat_main, _BB_DIR_BIN}, #endif -#ifdef BB_CHMOD_CHOWN_CHGRP //bin +#ifdef BB_CHMOD_CHOWN_CHGRP {"chmod", chmod_chown_chgrp_main, _BB_DIR_BIN}, #endif -#ifdef BB_CHMOD_CHOWN_CHGRP //bin +#ifdef BB_CHMOD_CHOWN_CHGRP {"chown", chmod_chown_chgrp_main, _BB_DIR_BIN}, #endif -#ifdef BB_CHMOD_CHOWN_CHGRP //bin +#ifdef BB_CHMOD_CHOWN_CHGRP {"chgrp", chmod_chown_chgrp_main, _BB_DIR_BIN}, #endif -#ifdef BB_CHROOT //sbin +#ifdef BB_CHROOT {"chroot", chroot_main, _BB_DIR_SBIN}, #endif -#ifdef BB_CLEAR //usr/bin +#ifdef BB_CLEAR {"clear", clear_main, _BB_DIR_USR_BIN}, #endif -#ifdef BB_CHVT //usr/bin +#ifdef BB_CHVT {"chvt", chvt_main, _BB_DIR_USR_BIN}, #endif -#ifdef BB_CP_MV //bin +#ifdef BB_CP_MV {"cp", cp_mv_main, _BB_DIR_BIN}, #endif -#ifdef BB_CP_MV //bin +#ifdef BB_CP_MV {"mv", cp_mv_main, _BB_DIR_BIN}, #endif -#ifdef BB_DATE //bin +#ifdef BB_DATE {"date", date_main, _BB_DIR_BIN}, #endif -#ifdef BB_DD //bin +#ifdef BB_DD {"dd", dd_main, _BB_DIR_BIN}, #endif -#ifdef BB_DF //bin +#ifdef BB_DF {"df", df_main, _BB_DIR_BIN}, #endif -#ifdef BB_DIRNAME //usr/bin +#ifdef BB_DIRNAME {"dirname", dirname_main, _BB_DIR_USR_BIN}, #endif -#ifdef BB_DMESG //bin +#ifdef BB_DMESG {"dmesg", dmesg_main, _BB_DIR_BIN}, #endif -#ifdef BB_DU //bin +#ifdef BB_DU {"du", du_main, _BB_DIR_BIN}, #endif -#ifdef BB_DUTMP //usr/sbin +#ifdef BB_DUTMP {"dutmp", dutmp_main, _BB_DIR_USR_SBIN}, #endif -#ifdef BB_ECHO //bin +#ifdef BB_ECHO {"echo", echo_main, _BB_DIR_BIN}, #endif -#ifdef BB_FBSET //usr/sbin +#ifdef BB_FBSET {"fbset", fbset_main, _BB_DIR_USR_SBIN}, #endif -#ifdef BB_FDFLUSH //bin +#ifdef BB_FDFLUSH {"fdflush", fdflush_main, _BB_DIR_BIN}, #endif -#ifdef BB_FIND //usr/bin +#ifdef BB_FIND {"find", find_main, _BB_DIR_USR_BIN}, #endif -#ifdef BB_FREE //usr/bin +#ifdef BB_FREE {"free", free_main, _BB_DIR_USR_BIN}, #endif -#ifdef BB_FREERAMDISK //sbin +#ifdef BB_FREERAMDISK {"freeramdisk", freeramdisk_main, _BB_DIR_SBIN}, #endif -#ifdef BB_DEALLOCVT //usr/bin +#ifdef BB_DEALLOCVT {"deallocvt", deallocvt_main, _BB_DIR_USR_BIN}, #endif -#ifdef BB_FSCK_MINIX //sbin +#ifdef BB_FSCK_MINIX {"fsck.minix", fsck_minix_main, _BB_DIR_SBIN}, #endif -#ifdef BB_MKFS_MINIX //sbin +#ifdef BB_MKFS_MINIX {"mkfs.minix", mkfs_minix_main, _BB_DIR_SBIN}, #endif -#ifdef BB_GREP //bin +#ifdef BB_GREP {"grep", grep_main, _BB_DIR_BIN}, #endif -#ifdef BB_HALT //sbin +#ifdef BB_HALT {"halt", halt_main, _BB_DIR_SBIN}, #endif -#ifdef BB_HEAD //bin +#ifdef BB_HEAD {"head", head_main, _BB_DIR_BIN}, #endif -#ifdef BB_HOSTID //usr/bin +#ifdef BB_HOSTID {"hostid", hostid_main, _BB_DIR_USR_BIN}, #endif -#ifdef BB_HOSTNAME //bin +#ifdef BB_HOSTNAME {"hostname", hostname_main, _BB_DIR_BIN}, #endif -#ifdef BB_INIT //sbin +#ifdef BB_INIT {"init", init_main, _BB_DIR_SBIN}, #endif -#ifdef BB_INSMOD //sbin +#ifdef BB_INSMOD {"insmod", insmod_main, _BB_DIR_SBIN}, #endif #ifdef BB_FEATURE_LINUXRC // {"linuxrc", init_main, _BB_DIR_ROOT}, #endif -#ifdef BB_KILL //bin +#ifdef BB_KILL {"kill", kill_main, _BB_DIR_BIN}, #endif -#ifdef BB_KILLALL //usr/bin +#ifdef BB_KILLALL {"killall", kill_main, _BB_DIR_USR_BIN}, #endif -#ifdef BB_LENGTH //usr/bin +#ifdef BB_LENGTH {"length", length_main, _BB_DIR_USR_BIN}, #endif -#ifdef BB_LN //bin +#ifdef BB_LN {"ln", ln_main, _BB_DIR_BIN}, #endif -#ifdef BB_LOADACM //usr/bin +#ifdef BB_LOADACM {"loadacm", loadacm_main, _BB_DIR_USR_BIN}, #endif -#ifdef BB_LOADFONT //usr/bin +#ifdef BB_LOADFONT {"loadfont", loadfont_main, _BB_DIR_USR_BIN}, #endif -#ifdef BB_LOADKMAP //sbin +#ifdef BB_LOADKMAP {"loadkmap", loadkmap_main, _BB_DIR_SBIN}, #endif -#ifdef BB_LS //bin +#ifdef BB_LS {"ls", ls_main, _BB_DIR_BIN}, #endif -#ifdef BB_LSMOD //sbin +#ifdef BB_LSMOD {"lsmod", lsmod_main, _BB_DIR_SBIN}, #endif -#ifdef BB_MAKEDEVS //sbin +#ifdef BB_MAKEDEVS {"makedevs", makedevs_main, _BB_DIR_SBIN}, #endif -#ifdef BB_MATH //usr/bin +#ifdef BB_MATH {"math", math_main, _BB_DIR_USR_BIN}, #endif -#ifdef BB_MKDIR //bin +#ifdef BB_MKDIR {"mkdir", mkdir_main, _BB_DIR_BIN}, #endif -#ifdef BB_MKFIFO //usr/bin +#ifdef BB_MKFIFO {"mkfifo", mkfifo_main, _BB_DIR_USR_BIN}, #endif -#ifdef BB_MKNOD //bin +#ifdef BB_MKNOD {"mknod", mknod_main, _BB_DIR_BIN}, #endif -#ifdef BB_MKSWAP //sbin +#ifdef BB_MKSWAP {"mkswap", mkswap_main, _BB_DIR_SBIN}, #endif -#ifdef BB_MNC //usr/bin +#ifdef BB_MNC {"mnc", mnc_main, _BB_DIR_USR_BIN}, #endif -#ifdef BB_MORE //bin +#ifdef BB_MORE {"more", more_main, _BB_DIR_BIN}, #endif -#ifdef BB_MOUNT //bin +#ifdef BB_MOUNT {"mount", mount_main, _BB_DIR_BIN}, #endif -#ifdef BB_MT //bin +#ifdef BB_MT {"mt", mt_main, _BB_DIR_BIN}, #endif -#ifdef BB_NSLOOKUP //usr/bin +#ifdef BB_NSLOOKUP {"nslookup", nslookup_main, _BB_DIR_USR_BIN}, #endif -#ifdef BB_PING //bin +#ifdef BB_PING {"ping", ping_main, _BB_DIR_BIN}, #endif -#ifdef BB_POWEROFF //sbin +#ifdef BB_POWEROFF {"poweroff", poweroff_main, _BB_DIR_SBIN}, #endif -#ifdef BB_PRINTF //usr/bin +#ifdef BB_PRINTF {"printf", printf_main, _BB_DIR_USR_BIN}, #endif -#ifdef BB_PS //bin +#ifdef BB_PS {"ps", ps_main, _BB_DIR_BIN}, #endif -#ifdef BB_PWD //bin +#ifdef BB_PWD {"pwd", pwd_main, _BB_DIR_BIN}, #endif -#ifdef BB_REBOOT //sbin +#ifdef BB_REBOOT {"reboot", reboot_main, _BB_DIR_SBIN}, #endif -#ifdef BB_RM //bin +#ifdef BB_RM {"rm", rm_main, _BB_DIR_BIN}, #endif -#ifdef BB_RMDIR //bin +#ifdef BB_RMDIR {"rmdir", rmdir_main, _BB_DIR_BIN}, #endif -#ifdef BB_RMMOD //sbin +#ifdef BB_RMMOD {"rmmod", rmmod_main, _BB_DIR_SBIN}, #endif -#ifdef BB_SED //bin +#ifdef BB_SED {"sed", sed_main, _BB_DIR_BIN}, #endif -#ifdef BB_SH //bin +#ifdef BB_SH {"sh", shell_main, _BB_DIR_BIN}, #endif -#ifdef BB_SFDISK //sbin +#ifdef BB_SFDISK {"fdisk", sfdisk_main, _BB_DIR_SBIN}, -#ifdef BB_SFDISK //sbin +#ifdef BB_SFDISK #endif {"sfdisk", sfdisk_main, _BB_DIR_SBIN}, #endif -#ifdef BB_SLEEP //bin +#ifdef BB_SLEEP {"sleep", sleep_main, _BB_DIR_BIN}, #endif -#ifdef BB_SORT //bin +#ifdef BB_SORT {"sort", sort_main, _BB_DIR_BIN}, #endif -#ifdef BB_SYNC //bin +#ifdef BB_SYNC {"sync", sync_main, _BB_DIR_BIN}, #endif -#ifdef BB_SYSLOGD //sbin +#ifdef BB_SYSLOGD {"syslogd", syslogd_main, _BB_DIR_SBIN}, #endif -#ifdef BB_LOGGER //usr/bin +#ifdef BB_LOGGER {"logger", logger_main, _BB_DIR_USR_BIN}, #endif -#ifdef BB_LOGNAME //usr/bin +#ifdef BB_LOGNAME {"logname", logname_main, _BB_DIR_USR_BIN}, #endif -#ifdef BB_SWAPONOFF //sbin +#ifdef BB_SWAPONOFF {"swapon", swap_on_off_main, _BB_DIR_SBIN}, #endif -#ifdef BB_SWAPONOFF //sbin +#ifdef BB_SWAPONOFF {"swapoff", swap_on_off_main, _BB_DIR_SBIN}, #endif -#ifdef BB_TAIL //usr/bin +#ifdef BB_TAIL {"tail", tail_main, _BB_DIR_USR_BIN}, #endif -#ifdef BB_TAR //bin +#ifdef BB_TAR {"tar", tar_main, _BB_DIR_BIN}, #endif -#ifdef BB_TELNET //usr/bin +#ifdef BB_TELNET {"telnet", telnet_main, _BB_DIR_USR_BIN}, #endif -#ifdef BB_TEST //usr/bin +#ifdef BB_TEST {"[", test_main, _BB_DIR_USR_BIN}, #endif -#ifdef BB_TEST //usr/bin +#ifdef BB_TEST {"test", test_main, _BB_DIR_USR_BIN}, #endif -#ifdef BB_TEE //bin +#ifdef BB_TEE {"tee", tee_main, _BB_DIR_BIN}, #endif -#ifdef BB_TOUCH //usr/bin +#ifdef BB_TOUCH {"touch", touch_main, _BB_DIR_USR_BIN}, #endif -#ifdef BB_TR //usr/bin +#ifdef BB_TR {"tr", tr_main, _BB_DIR_USR_BIN}, #endif -#ifdef BB_TRUE_FALSE //bin +#ifdef BB_TRUE_FALSE {"true", true_main, _BB_DIR_BIN}, #endif -#ifdef BB_TRUE_FALSE //bin +#ifdef BB_TRUE_FALSE {"false", false_main, _BB_DIR_BIN}, #endif -#ifdef BB_TTY //usr/bin +#ifdef BB_TTY {"tty", tty_main, _BB_DIR_USR_BIN}, #endif -#ifdef BB_UMOUNT //bin +#ifdef BB_UMOUNT {"umount", umount_main, _BB_DIR_BIN}, #endif -#ifdef BB_UNAME //bin +#ifdef BB_UNAME {"uname", uname_main, _BB_DIR_BIN}, #endif -#ifdef BB_UPTIME //usr/bin +#ifdef BB_UPTIME {"uptime", uptime_main, _BB_DIR_USR_BIN}, #endif -#ifdef BB_UNIQ //bin +#ifdef BB_UNIQ {"uniq", uniq_main, _BB_DIR_BIN}, #endif -#ifdef BB_UPDATE //sbin +#ifdef BB_UPDATE {"update", update_main, _BB_DIR_SBIN}, #endif -#ifdef BB_WC //usr/bin +#ifdef BB_WC {"wc", wc_main, _BB_DIR_USR_BIN}, #endif -#ifdef BB_WHOAMI //usr/bin +#ifdef BB_WHOAMI {"whoami", whoami_main, _BB_DIR_USR_BIN}, #endif -#ifdef BB_YES //usr/bin +#ifdef BB_YES {"yes", yes_main, _BB_DIR_USR_BIN}, #endif -#ifdef BB_GUNZIP //bin +#ifdef BB_GUNZIP {"zcat", gunzip_main, _BB_DIR_BIN}, #endif -#ifdef BB_GUNZIP //bin +#ifdef BB_GUNZIP {"gunzip", gunzip_main, _BB_DIR_BIN}, #endif -#ifdef BB_GZIP //bin +#ifdef BB_GZIP {"gzip", gzip_main, _BB_DIR_BIN}, #endif {0} diff --git a/busybox.def.h b/busybox.def.h index cfafc29..388219a 100644 --- a/busybox.def.h +++ b/busybox.def.h @@ -185,6 +185,10 @@ #define BB_FEATURE_SH_COMMAND_EDITING // // +//Turn on extra fbset options +//#define BB_FEATURE_FBSET_FANCY +// +// // End of Features List // // diff --git a/console-tools/loadkmap.c b/console-tools/loadkmap.c index aa4f6bb..fe533d5 100644 --- a/console-tools/loadkmap.c +++ b/console-tools/loadkmap.c @@ -87,6 +87,8 @@ int loadkmap_main(int argc, char **argv) } } } - close(fd); + /* Don't bother to close files. Exit does that + * automagically, so we can save a few bytes */ + /* close(fd); */ return 0; } diff --git a/coreutils/date.c b/coreutils/date.c index 652db8d..199a894 100644 --- a/coreutils/date.c +++ b/coreutils/date.c @@ -202,8 +202,8 @@ int date_main(int argc, char **argv) usage(date_usage); } } else { - if ((date_fmt == NULL) && (strcmp(*argv, "+") == 0)) - date_fmt = *argv; + if ((date_fmt == NULL) && (**argv == '+')) + date_fmt = *argv + 1; /* Skip over the '+' */ else if (date_str == NULL) { set_time = 1; date_str = *argv; diff --git a/coreutils/dd.c b/coreutils/dd.c index f40dec7..d50cf74 100644 --- a/coreutils/dd.c +++ b/coreutils/dd.c @@ -125,9 +125,12 @@ extern int dd_main(int argc, char **argv) inFd = open(inFile, 0); if (inFd < 0) { - perror(inFile); - free(buf); - exit(FALSE); + /* Note that we are not freeing buf or closing + * files here to save a few bytes. This exits + * here anyways... */ + + /* free(buf); */ + fatalError( inFile); } if (outFile == NULL) @@ -136,10 +139,13 @@ extern int dd_main(int argc, char **argv) outFd = open(outFile, O_WRONLY | O_CREAT | O_TRUNC, 0666); if (outFd < 0) { - perror(outFile); - close(inFd); - free(buf); - exit(FALSE); + /* Note that we are not freeing buf or closing + * files here to save a few bytes. This exits + * here anyways... */ + + /* close(inFd); + free(buf); */ + fatalError( outFile); } lseek(inFd, skipBlocks * blockSize, SEEK_SET); @@ -180,9 +186,13 @@ extern int dd_main(int argc, char **argv) perror(inFile); cleanup: + /* Note that we are not freeing memory or closing + * files here, to save a few bytes. */ +#if 0 close(inFd); close(outFd); free(buf); +#endif printf("%ld+%d records in\n", (long) (intotal / blockSize), (intotal % blockSize) != 0); diff --git a/coreutils/ls.c b/coreutils/ls.c index c2266f5..c4856cb 100644 --- a/coreutils/ls.c +++ b/coreutils/ls.c @@ -70,11 +70,6 @@ #define APPCHAR(mode) ("\0|\0\0/\0\0\0\0\0@\0=\0\0\0" [TYPEINDEX(mode)]) #endif -#ifndef MAJOR -#define MAJOR(dev) (((dev)>>8)&0xff) -#define MINOR(dev) ((dev)&0xff) -#endif - #define FMT_AUTO 0 #define FMT_LONG 1 /* one record per line, extended info */ #define FMT_SINGLE 2 /* one record per line */ diff --git a/coreutils/tee.c b/coreutils/tee.c index a3a1c81..018fe11 100644 --- a/coreutils/tee.c +++ b/coreutils/tee.c @@ -125,8 +125,10 @@ int tee_main(int argc, char **argv) /* clean up */ FL_apply(tee_fclose, 0); - free(FileList); + /* Don't bother to close files Exit does that + * automagically, so we can save a few bytes */ + /* free(FileList); */ exit(0); } -/* $Id: tee.c,v 1.7 2000/03/08 00:14:35 beppu Exp $ */ +/* $Id: tee.c,v 1.8 2000/03/23 01:09:18 erik Exp $ */ @@ -202,8 +202,8 @@ int date_main(int argc, char **argv) usage(date_usage); } } else { - if ((date_fmt == NULL) && (strcmp(*argv, "+") == 0)) - date_fmt = *argv; + if ((date_fmt == NULL) && (**argv == '+')) + date_fmt = *argv + 1; /* Skip over the '+' */ else if (date_str == NULL) { set_time = 1; date_str = *argv; @@ -125,9 +125,12 @@ extern int dd_main(int argc, char **argv) inFd = open(inFile, 0); if (inFd < 0) { - perror(inFile); - free(buf); - exit(FALSE); + /* Note that we are not freeing buf or closing + * files here to save a few bytes. This exits + * here anyways... */ + + /* free(buf); */ + fatalError( inFile); } if (outFile == NULL) @@ -136,10 +139,13 @@ extern int dd_main(int argc, char **argv) outFd = open(outFile, O_WRONLY | O_CREAT | O_TRUNC, 0666); if (outFd < 0) { - perror(outFile); - close(inFd); - free(buf); - exit(FALSE); + /* Note that we are not freeing buf or closing + * files here to save a few bytes. This exits + * here anyways... */ + + /* close(inFd); + free(buf); */ + fatalError( outFile); } lseek(inFd, skipBlocks * blockSize, SEEK_SET); @@ -180,9 +186,13 @@ extern int dd_main(int argc, char **argv) perror(inFile); cleanup: + /* Note that we are not freeing memory or closing + * files here, to save a few bytes. */ +#if 0 close(inFd); close(outFd); free(buf); +#endif printf("%ld+%d records in\n", (long) (intotal / blockSize), (intotal % blockSize) != 0); @@ -62,7 +62,7 @@ #define CMD_ALL 11 #define CMD_INFO 12 -#ifdef BB_FBSET_FANCY +#ifdef BB_FEATURE_FBSET_FANCY #define CMD_XRES 13 #define CMD_YRES 14 #define CMD_VXRES 15 @@ -105,7 +105,7 @@ struct cmdoptions_t { "-vsync", 1, CMD_VSYNC}, { "-laced", 1, CMD_LACED}, { "-double", 1, CMD_DOUBLE}, -#ifdef BB_FBSET_FANCY +#ifdef BB_FEATURE_FBSET_FANCY { "--help", 0, CMD_HELP}, { "-all", 0, CMD_ALL}, { @@ -164,8 +164,7 @@ static int readmode(struct fb_var_screeninfo *base, const char *fn, } } #else - fprintf(stderr, - "W: mode reading was disabled on this copy of fbset; ignoring request\n"); + errorMsg( "mode reading not compiled in\n"); #endif return 0; } @@ -199,7 +198,7 @@ static void showmode(struct fb_var_screeninfo *v) v->vsync_len); } printf("\nmode \"%ux%u-%u\"\n", v->xres, v->yres, (int) (vrate + 0.5)); -#ifdef BB_FBSET_FANCY +#ifdef BB_FEATURE_FBSET_FANCY printf("\t# D: %.3f MHz, H: %.3f kHz, V: %.3f Hz\n", drate / 1e6, hrate / 1e3, vrate); #endif @@ -283,7 +282,7 @@ extern int fbset_main(int argc, char **argv) varset.hsync_len = strtoul(argv[6], 0, 0); varset.vsync_len = strtoul(argv[7], 0, 0); break; -#ifdef BB_FBSET_FANCY +#ifdef BB_FEATURE_FBSET_FANCY case CMD_XRES: varset.xres = strtoul(argv[1], 0, 0); break; @@ -323,7 +322,8 @@ extern int fbset_main(int argc, char **argv) if (ioctl(fh, FBIOPUT_VSCREENINFO, &var)) PERROR("fbset(ioctl)"); showmode(&var); - close(fh); + /* Don't close the file, as exiting will take care of that */ + /* close(fh); */ - return (TRUE); + exit (TRUE); } @@ -44,7 +44,9 @@ extern int fdflush_main(int argc, char **argv) } value = ioctl(fd, FDFLUSH, 0); - close(fd); + /* Don't bother closing. Exit does + * that, so we can save a few bytes */ + /* close(fd); */ if (value) { perror(*argv); diff --git a/freeramdisk.c b/freeramdisk.c index 43d42d4..06937a7 100644 --- a/freeramdisk.c +++ b/freeramdisk.c @@ -55,7 +55,9 @@ freeramdisk_main(int argc, char **argv) if (ioctl(f, BLKFLSBUF) < 0) { fatalError( "freeramdisk: failed ioctl on %s: %s", rname, strerror(errno)); } - close(f); + /* Don't bother closing. Exit does + * that, so we can save a few bytes */ + /* close(f); */ exit(TRUE); } diff --git a/fsck_minix.c b/fsck_minix.c index 47e81ce..aa0a824 100644 --- a/fsck_minix.c +++ b/fsck_minix.c @@ -1242,6 +1242,7 @@ static void alloc_name_list(void) name_list[i] = xmalloc(sizeof(char) * PATH_MAX + 1); } +#if 0 /* execute this atexit() to deallocate name_list[] */ /* piptigger was here */ static void free_name_list(void) @@ -1257,6 +1258,7 @@ static void free_name_list(void) free(name_list); } } +#endif extern int fsck_minix_main(int argc, char **argv) { @@ -1265,7 +1267,9 @@ extern int fsck_minix_main(int argc, char **argv) int retcode = 0; alloc_name_list(); - atexit(free_name_list); + /* Don't bother to free memory. Exit does + * that automagically, so we can save a few bytes */ + //atexit(free_name_list); if (argc && *argv) program_name = *argv; @@ -825,6 +825,9 @@ extern int init_main(int argc, char **argv) reboot(RB_DISABLE_CAD); #endif + /* Figure out what kernel this is running */ + kernelVersion = get_kernel_revision(); + /* Figure out where the default console should be */ console_init(); diff --git a/init/init.c b/init/init.c index de5e2c0..9079165 100644 --- a/init/init.c +++ b/init/init.c @@ -825,6 +825,9 @@ extern int init_main(int argc, char **argv) reboot(RB_DISABLE_CAD); #endif + /* Figure out what kernel this is running */ + kernelVersion = get_kernel_revision(); + /* Figure out where the default console should be */ console_init(); @@ -46,6 +46,12 @@ #define BUF_SIZE 8192 #define EXPAND_ALLOC 1024 + +#ifndef MAJOR +#define MAJOR(dev) (((dev)>>8)&0xff) +#define MINOR(dev) ((dev)&0xff) +#endif + #define isBlank(ch) (((ch) == ' ') || ((ch) == '\t')) #define isDecimal(ch) (((ch) >= '0') && ((ch) <= '9')) #define isOctal(ch) (((ch) >= '0') && ((ch) <= '7')) @@ -201,14 +207,12 @@ extern uid_t my_getpwnam(char *name); extern gid_t my_getgrnam(char *name); extern void my_getpwuid(char* name, uid_t uid); extern void my_getgrgid(char* group, gid_t gid); -extern int get_kernel_revision(); extern int get_console_fd(char* tty_name); extern struct mntent *findMountPoint(const char *name, const char *table); extern void write_mtab(char* blockDevice, char* directory, char* filesystemType, long flags, char* string_flags); extern void erase_mtab(const char * name); extern void mtab_read(void); -extern void mtab_free(void); extern char *mtab_first(void **iter); extern char *mtab_next(void **iter); extern char *mtab_getinfo(const char *match, const char which); @@ -87,6 +87,8 @@ int loadkmap_main(int argc, char **argv) } } } - close(fd); + /* Don't bother to close files. Exit does that + * automagically, so we can save a few bytes */ + /* close(fd); */ return 0; } @@ -70,11 +70,6 @@ #define APPCHAR(mode) ("\0|\0\0/\0\0\0\0\0@\0=\0\0\0" [TYPEINDEX(mode)]) #endif -#ifndef MAJOR -#define MAJOR(dev) (((dev)>>8)&0xff) -#define MINOR(dev) ((dev)&0xff) -#endif - #define FMT_AUTO 0 #define FMT_LONG 1 /* one record per line, extended info */ #define FMT_SINGLE 2 /* one record per line */ @@ -348,8 +348,12 @@ extern int mount_main(int argc, char **argv) mntentlist[i].mnt_opts, mntentlist[i].mnt_freq, mntentlist[i].mnt_passno); } + /* Don't bother to close files or free memory. Exit + * does that automagically, so we can save a few bytes */ +#if 0 free( mntentlist); close(fd); +#endif exit(TRUE); } #else @@ -68,57 +68,84 @@ static const char tar_usage[] = #endif -/* - * Tar file constants. - */ -#define TAR_BLOCK_SIZE 512 -#define TAR_NAME_SIZE 100 +/* Tar file constants */ -/* - * The POSIX (and basic GNU) tar header format. - * This structure is always embedded in a TAR_BLOCK_SIZE sized block - * with zero padding. We only process this information minimally. - */ -typedef struct { - char name[TAR_NAME_SIZE]; - char mode[8]; - char uid[8]; - char gid[8]; - char size[12]; - char mtime[12]; - char checkSum[8]; - char typeFlag; - char linkName[TAR_NAME_SIZE]; - char magic[6]; - char version[2]; - char uname[32]; - char gname[32]; - char devMajor[8]; - char devMinor[8]; - char prefix[155]; -} TarHeader; - -#define TAR_MAGIC "ustar" -#define TAR_VERSION "00" - -#define TAR_TYPE_REGULAR '0' -#define TAR_TYPE_HARD_LINK '1' -#define TAR_TYPE_SOFT_LINK '2' +/* POSIX tar Header Block, from POSIX 1003.1-1990 */ +struct TarHeader +{ + /* byte offset */ + char name[100]; /* 0 */ + char mode[8]; /* 100 */ + char uid[8]; /* 108 */ + char gid[8]; /* 116 */ + char size[12]; /* 124 */ + char mtime[12]; /* 136 */ + char chksum[8]; /* 148 */ + char typeflag; /* 156 */ + char linkname[100]; /* 157 */ + char magic[6]; /* 257 */ + char version[2]; /* 263 */ + char uname[32]; /* 265 */ + char gname[32]; /* 297 */ + char devmajor[8]; /* 329 */ + char devminor[8]; /* 337 */ + char prefix[155]; /* 345 */ + /* padding 500 */ +}; +typedef struct TarHeader TarHeader; + + +/* A few useful constants */ +#define TAR_MAGIC "ustar" /* ustar and a null */ +#define TAR_VERSION "00" /* 00 and no null */ +#define TAR_MAGIC_LEN 6 +#define TAR_VERSION_LEN 2 +#define TAR_NAME_LEN 100 +#define TAR_BLOCK_SIZE 512 + +/* A nice enum with all the possible tar file content types */ +enum TarFileType +{ + REGTYPE = '0', /* regular file */ + REGTYPE0 = '\0', /* regular file (ancient bug compat)*/ + LNKTYPE = '1', /* hard link */ + SYMTYPE = '2', /* symbolic link */ + CHRTYPE = '3', /* character special */ + BLKTYPE = '4', /* block special */ + DIRTYPE = '5', /* directory */ + FIFOTYPE = '6', /* FIFO special */ + CONTTYPE = '7', /* reserved */ +}; +typedef enum TarFileType TarFileType; + +/* This struct ignores magic, non-numeric user name, + * non-numeric group name, and the checksum, since + * these are all ignored by BusyBox tar. */ +struct TarInfo +{ + int tarFd; /* An open file descriptor for reading from the tarball */ + char * name; /* File name */ + mode_t mode; /* Unix mode, including device bits. */ + uid_t uid; /* Numeric UID */ + gid_t gid; /* Numeric GID */ + size_t size; /* Size of file */ + time_t mtime; /* Last-modified time */ + enum TarFileType type; /* Regular, directory, link, etc */ + char * linkname; /* Name for symbolic and hard links */ + dev_t device; /* Special device for mknod() */ +}; +typedef struct TarInfo TarInfo; + +/* Static data */ +static const unsigned long TarChecksumOffset = (const unsigned long)&(((TarHeader *)0)->chksum); /* * Static data. */ -static int listFlag; -static int extractFlag; -static int createFlag; -static int verboseFlag; -static int tostdoutFlag; - static int inHeader; // <- check me static int badHeader; -static int errorFlag; static int skipFileFlag; static int warnedRoot; static int eofFlag; @@ -134,7 +161,6 @@ static time_t mtime; /* * Static data associated with the tar file. */ -static const char *tarName; static int tarFd; static dev_t tarDev; static ino_t tarInode; @@ -143,35 +169,25 @@ static ino_t tarInode; /* * Local procedures to restore files from a tar file. */ -static void readTarFile(int fileCount, char **fileTable); +static int readTarFile(const char* tarName, int extractFlag, int listFlag, + int tostdoutFlag, int verboseFlag); static void readData(const char *cp, int count); static long getOctal(const char *cp, int len); - -static void readHeader(const TarHeader * hp, - - int fileCount, char **fileTable); - +static int parseTarHeader(struct TarHeader *rawHeader, struct TarInfo *header); static int wantFileName(const char *fileName, - - int fileCount, char **fileTable); + int argc, char **argv); #ifdef BB_FEATURE_TAR_CREATE /* * Local procedures to save files into a tar file. */ static void saveFile(const char *fileName, int seeLinks); - static void saveRegularFile(const char *fileName, - const struct stat *statbuf); - static void saveDirectory(const char *fileName, - const struct stat *statbuf); - static void writeHeader(const char *fileName, const struct stat *statbuf); - -static void writeTarFile(int fileCount, char **fileTable); +static void writeTarFile(int argc, char **argv); static void writeTarBlock(const char *buf, int len); static int putOctal(char *cp, int len, long value); @@ -180,7 +196,13 @@ static int putOctal(char *cp, int len, long value); extern int tar_main(int argc, char **argv) { + const char *tarName=NULL; const char *options; + int listFlag = FALSE; + int extractFlag = FALSE; + int createFlag = FALSE; + int verboseFlag = FALSE; + int tostdoutFlag = FALSE; argc--; argv++; @@ -188,21 +210,7 @@ extern int tar_main(int argc, char **argv) if (argc < 1) usage(tar_usage); - - errorFlag = FALSE; - extractFlag = FALSE; - createFlag = FALSE; - listFlag = FALSE; - verboseFlag = FALSE; - tostdoutFlag = FALSE; - tarName = NULL; - tarDev = 0; - tarInode = 0; - tarFd = -1; - - /* - * Parse the options. - */ + /* Parse options */ if (**argv == '-') options = (*argv++) + 1; else @@ -212,13 +220,12 @@ extern int tar_main(int argc, char **argv) for (; *options; options++) { switch (*options) { case 'f': - if (tarName != NULL) { - fprintf(stderr, "Only one 'f' option allowed\n"); - - exit(FALSE); - } + if (tarName != NULL) + fatalError( "Only one 'f' option allowed\n"); tarName = *argv++; + if (tarName == NULL) + fatalError( "Option requires an argument: No file specified\n"); argc--; break; @@ -253,9 +260,8 @@ extern int tar_main(int argc, char **argv) break; default: - fprintf(stderr, "Unknown tar flag '%c'\n" + fatalError( "Unknown tar flag '%c'\n" "Try `tar --help' for more information\n", *options); - exit(FALSE); } } @@ -265,23 +271,22 @@ extern int tar_main(int argc, char **argv) */ if (createFlag == TRUE) { #ifndef BB_FEATURE_TAR_CREATE - fprintf(stderr, - "This version of tar was not compiled with tar creation support.\n"); - exit(FALSE); + fatalError( "This version of tar was not compiled with tar creation support.\n"); #else - writeTarFile(argc, argv); + exit(writeTarFile(argc, argv)); #endif } else { - readTarFile(argc, argv); + exit(readTarFile(tarName, extractFlag, listFlag, tostdoutFlag, verboseFlag)); } - if (errorFlag == TRUE) { - fprintf(stderr, "\n"); - } - exit(!errorFlag); flagError: - fprintf(stderr, "Exactly one of 'c', 'x' or 't' must be specified\n"); - exit(FALSE); + fatalError( "Exactly one of 'c', 'x' or 't' must be specified\n"); +} + +static void +tarExtractRegularFile(TarInfo *header, int extractFlag, int listFlag, int tostdoutFlag, int verboseFlag) +{ + } @@ -289,178 +294,148 @@ extern int tar_main(int argc, char **argv) * Read a tar file and extract or list the specified files within it. * If the list is empty than all files are extracted or listed. */ -static void readTarFile(int fileCount, char **fileTable) +static int readTarFile(const char* tarName, int extractFlag, int listFlag, + int tostdoutFlag, int verboseFlag) { - const char *cp; - int cc; - int inCc; - int blockSize; - char buf[BUF_SIZE]; - - skipFileFlag = FALSE; - badHeader = FALSE; - warnedRoot = FALSE; - eofFlag = FALSE; - inHeader = TRUE; - inCc = 0; - dataCc = 0; - outFd = -1; - blockSize = sizeof(buf); - cp = buf; + int status, tarFd=0; + int errorFlag=FALSE; + TarHeader rawHeader; + TarInfo header; - /* - * Open the tar file for reading. - */ - if ((tarName == NULL) || !strcmp(tarName, "-")) { + /* Open the tar file for reading. */ + if (!strcmp(tarName, "-")) tarFd = fileno(stdin); - } else + else tarFd = open(tarName, O_RDONLY); - if (tarFd < 0) { - perror(tarName); - errorFlag = TRUE; - return; + errorMsg( "Error opening '%s': %s", tarName, strerror(errno)); + return ( FALSE); } - /* - * Read blocks from the file until an end of file header block - * has been seen. (A real end of file from a read is an error.) - */ - while (eofFlag == FALSE) { - /* - * Read the next block of data if necessary. - * This will be a large block if possible, which we will - * then process in the small tar blocks. - */ - if (inCc <= 0) { - cp = buf; - inCc = fullRead(tarFd, buf, blockSize); - - if (inCc < 0) { - perror(tarName); - errorFlag = TRUE; - goto done; - } - - if (inCc == 0) { - fprintf(stderr, - "Unexpected end of file from \"%s\"", tarName); - errorFlag = TRUE; - goto done; + /* Read the tar file */ + while ( (status = fullRead(tarFd, (char*)&rawHeader, TAR_BLOCK_SIZE)) == TAR_BLOCK_SIZE ) { + /* Now see if the header looks ok */ + if ( parseTarHeader(&rawHeader, &header) == FALSE ) { + close( tarFd); + if ( *(header.name) == '\0' ) { + goto endgame; + } else { + errorFlag=TRUE; + errorMsg("Bad tar header, skipping\n"); + continue; } } - - /* - * If we are expecting a header block then examine it. - */ - if (inHeader == TRUE) { - readHeader((const TarHeader *) cp, fileCount, fileTable); - - cp += TAR_BLOCK_SIZE; - inCc -= TAR_BLOCK_SIZE; - - continue; + if ( *(header.name) == '\0' ) + goto endgame; + + /* If we got here, we can be certain we have a legitimate + * header to work with. So work with it. */ + switch ( header.type ) { + case REGTYPE: + case REGTYPE0: + /* If the name ends in a '/' then assume it is + * supposed to be a directory, and fall through */ + if (header.name[strlen(header.name)-1] != '/') { + tarExtractRegularFile(&header, extractFlag, listFlag, tostdoutFlag, verboseFlag); + break; + } +#if 0 + case Directory: + tarExtractDirectory( &header, extractFlag, listFlag, tostdoutFlag, verboseFlag); + break; + case HardLink: + tarExtractHardLink( &header, extractFlag, listFlag, tostdoutFlag, verboseFlag); + break; + case SymbolicLink: + tarExtractSymLink( &header, extractFlag, listFlag, tostdoutFlag, verboseFlag); + break; + case CharacterDevice: + case BlockDevice: + case FIFO: + tarExtractSpecial( &header, extractFlag, listFlag, tostdoutFlag, verboseFlag); + break; +#endif + default: + close( tarFd); + return( FALSE); } - - /* - * We are currently handling the data for a file. - * Process the minimum of the amount of data we have available - * and the amount left to be processed for the file. - */ - cc = inCc; - - if (cc > dataCc) - cc = dataCc; - - readData(cp, cc); - - /* - * If the amount left isn't an exact multiple of the tar block - * size then round it up to the next block boundary since there - * is padding at the end of the file. - */ - if (cc % TAR_BLOCK_SIZE) - cc += TAR_BLOCK_SIZE - (cc % TAR_BLOCK_SIZE); - - cp += cc; - inCc -= cc; } - done: - /* - * Close the tar file if needed. - */ - if ((tarFd >= 0) && (close(tarFd) < 0)) - perror(tarName); - - /* - * Close the output file if needed. - * This is only done here on a previous error and so no - * message is required on errors. - */ - if (tostdoutFlag == FALSE) { - if (outFd >= 0) { - close(outFd); - } + close(tarFd); + if (status > 0) { + /* Bummer - we read a partial header */ + errorMsg( "Error reading '%s': %s", tarName, strerror(errno)); + return ( FALSE); } + else + return( status); + + /* Stuff we do when we know we are done with the file */ +endgame: + close( tarFd); + if ( *(header.name) == '\0' ) { + if (errorFlag==FALSE) + return( TRUE); + } + return( FALSE); } - /* - * Examine the header block that was just read. - * This can specify the information for another file, or it can mark - * the end of the tar file. + * Read an octal value in a field of the specified width, with optional + * spaces on both sides of the number and with an optional null character + * at the end. Returns -1 on an illegal format. */ -static void -readHeader(const TarHeader * hp, int fileCount, char **fileTable) +static long getOctal(const char *cp, int size) { - int checkSum; - int cc; - int hardLink; - int softLink; - int devFileFlag; - unsigned int major; - unsigned int minor; - long size; - struct utimbuf utb; - - /* - * If the block is completely empty, then this is the end of the - * archive file. If the name is null, then just skip this header. - */ - outName = hp->name; - - if (*outName == '\0') { - for (cc = TAR_BLOCK_SIZE; cc > 0; cc--) { - if (*outName++) - return; - } + long val = 0; - eofFlag = TRUE; - - return; + for(;(size > 0) && (*cp == ' '); cp++, size--); + if ((size == 0) || !isOctal(*cp)) + return -1; + for(; (size > 0) && isOctal(*cp); size--) { + val = val * 8 + *cp++ - '0'; } + for (;(size > 0) && (*cp == ' '); cp++, size--); + if ((size > 0) && *cp) + return -1; + return val; +} - /* - * There is another file in the archive to examine. - * Extract the encoded information and check it. - */ - mode = getOctal(hp->mode, sizeof(hp->mode)); - uid = getOctal(hp->uid, sizeof(hp->uid)); - gid = getOctal(hp->gid, sizeof(hp->gid)); - size = getOctal(hp->size, sizeof(hp->size)); - mtime = getOctal(hp->mtime, sizeof(hp->mtime)); - checkSum = getOctal(hp->checkSum, sizeof(hp->checkSum)); - major = getOctal(hp->devMajor, sizeof(hp->devMajor)); - minor = getOctal(hp->devMinor, sizeof(hp->devMinor)); - - if ((mode < 0) || (uid < 0) || (gid < 0) || (size < 0)) { - if (badHeader == FALSE) - fprintf(stderr, "Bad tar header, skipping\n"); - - badHeader = TRUE; +/* Parse the tar header and fill in the nice struct with the details */ +static int +parseTarHeader(struct TarHeader *rawHeader, struct TarInfo *header) +{ + long major, minor, chksum, sum; + + header->name = rawHeader->name; + header->mode = getOctal(rawHeader->mode, sizeof(rawHeader->mode)); + header->uid = getOctal(rawHeader->uid, sizeof(rawHeader->uid)); + header->gid = getOctal(rawHeader->gid, sizeof(rawHeader->gid)); + header->size = getOctal(rawHeader->size, sizeof(rawHeader->size)); + header->mtime = getOctal(rawHeader->mtime, sizeof(rawHeader->mtime)); + chksum = getOctal(rawHeader->chksum, sizeof(rawHeader->chksum)); + header->type = rawHeader->typeflag; + header->linkname = rawHeader->linkname; + header->device = MAJOR(getOctal(rawHeader->devmajor, sizeof(rawHeader->devmajor))) | + MINOR(getOctal(rawHeader->devminor, sizeof(rawHeader->devminor))); + + /* Check the checksum */ + sum = ' ' * sizeof(rawHeader->chksum); + for ( i = TarChecksumOffset; i > 0; i-- ) + sum += *s++; + s += sizeof(h->chksum); + for ( i = (512 - TarChecksumOffset - sizeof(h->chksum)); i > 0; i-- ) + sum += *s++; + if (sum == checksum ) + return ( TRUE); + return( FALSE); +} - return; +#if 0 + if ((header->mode < 0) || (header->uid < 0) || + (header->gid < 0) || (header->size < 0)) { + errorMsg(stderr, "Bad tar header, skipping\n"); + return( FALSE); } badHeader = FALSE; @@ -502,7 +477,7 @@ readHeader(const TarHeader * hp, int fileCount, char **fileTable) * See if we want this file to be restored. * If not, then set up to skip it. */ - if (wantFileName(outName, fileCount, fileTable) == FALSE) { + if (wantFileName(outName, argc, argv) == FALSE) { if (!hardLink && !softLink && (S_ISREG(mode) || S_ISCHR(mode) || S_ISBLK(mode) || S_ISSOCK(mode) || S_ISFIFO(mode))) { @@ -726,7 +701,7 @@ static void readData(const char *cp, int count) * Returns TRUE if the file is selected. */ static int -wantFileName(const char *fileName, int fileCount, char **fileTable) +wantFileName(const char *fileName, int argc, char **argv) { const char *pathName; int fileLength; @@ -735,7 +710,7 @@ wantFileName(const char *fileName, int fileCount, char **fileTable) /* * If there are no files in the list, then the file is wanted. */ - if (fileCount == 0) + if (argc == 0) return TRUE; fileLength = strlen(fileName); @@ -743,8 +718,8 @@ wantFileName(const char *fileName, int fileCount, char **fileTable) /* * Check each of the test paths. */ - while (fileCount-- > 0) { - pathName = *fileTable++; + while (argc-- > 0) { + pathName = *argv++; pathLength = strlen(pathName); @@ -762,43 +737,6 @@ wantFileName(const char *fileName, int fileCount, char **fileTable) return FALSE; } -/* - * Read an octal value in a field of the specified width, with optional - * spaces on both sides of the number and with an optional null character - * at the end. Returns -1 on an illegal format. - */ -static long getOctal(const char *cp, int len) -{ - long val; - - while ((len > 0) && (*cp == ' ')) { - cp++; - len--; - } - - if ((len == 0) || !isOctal(*cp)) - return -1; - - val = 0; - - while ((len > 0) && isOctal(*cp)) { - val = val * 8 + *cp++ - '0'; - len--; - } - - while ((len > 0) && (*cp == ' ')) { - cp++; - len--; - } - - if ((len > 0) && *cp) - return -1; - - return val; -} - - - /* From here to the end of the file is the tar writing stuff. * If you do not have BB_FEATURE_TAR_CREATE defined, this will @@ -809,14 +747,14 @@ static long getOctal(const char *cp, int len) /* * Write a tar file containing the specified files. */ -static void writeTarFile(int fileCount, char **fileTable) +static void writeTarFile(int argc, char **argv) { struct stat statbuf; /* * Make sure there is at least one file specified. */ - if (fileCount <= 0) { + if (argc <= 0) { fprintf(stderr, "No files specified to be saved\n"); errorFlag = TRUE; } @@ -852,8 +790,8 @@ static void writeTarFile(int fileCount, char **fileTable) * Append each file name into the archive file. * Follow symbolic links for these top level file names. */ - while (errorFlag == FALSE && (fileCount-- > 0)) { - saveFile(*fileTable++, FALSE); + while (errorFlag == FALSE && (argc-- > 0)) { + saveFile(*argv++, FALSE); } /* @@ -1284,3 +1222,4 @@ static int putOctal(char *cp, int len, long value) #endif /* END CODE */ +#endif @@ -125,8 +125,10 @@ int tee_main(int argc, char **argv) /* clean up */ FL_apply(tee_fclose, 0); - free(FileList); + /* Don't bother to close files Exit does that + * automagically, so we can save a few bytes */ + /* free(FileList); */ exit(0); } -/* $Id: tee.c,v 1.7 2000/03/08 00:14:35 beppu Exp $ */ +/* $Id: tee.c,v 1.8 2000/03/23 01:09:18 erik Exp $ */ @@ -145,6 +145,9 @@ char *mtab_next(void **iter) return mp; } +/* Don't bother to clean up, since exit() does that + * automagically, so we can save a few bytes */ +#if 0 void mtab_free(void) { struct _mtab_entry_t *this, *next; @@ -160,6 +163,7 @@ void mtab_free(void) this = next; } } +#endif static int do_umount(const char *name, int useMtab) { diff --git a/util-linux/fbset.c b/util-linux/fbset.c index a75e431..7ca4173 100644 --- a/util-linux/fbset.c +++ b/util-linux/fbset.c @@ -62,7 +62,7 @@ #define CMD_ALL 11 #define CMD_INFO 12 -#ifdef BB_FBSET_FANCY +#ifdef BB_FEATURE_FBSET_FANCY #define CMD_XRES 13 #define CMD_YRES 14 #define CMD_VXRES 15 @@ -105,7 +105,7 @@ struct cmdoptions_t { "-vsync", 1, CMD_VSYNC}, { "-laced", 1, CMD_LACED}, { "-double", 1, CMD_DOUBLE}, -#ifdef BB_FBSET_FANCY +#ifdef BB_FEATURE_FBSET_FANCY { "--help", 0, CMD_HELP}, { "-all", 0, CMD_ALL}, { @@ -164,8 +164,7 @@ static int readmode(struct fb_var_screeninfo *base, const char *fn, } } #else - fprintf(stderr, - "W: mode reading was disabled on this copy of fbset; ignoring request\n"); + errorMsg( "mode reading not compiled in\n"); #endif return 0; } @@ -199,7 +198,7 @@ static void showmode(struct fb_var_screeninfo *v) v->vsync_len); } printf("\nmode \"%ux%u-%u\"\n", v->xres, v->yres, (int) (vrate + 0.5)); -#ifdef BB_FBSET_FANCY +#ifdef BB_FEATURE_FBSET_FANCY printf("\t# D: %.3f MHz, H: %.3f kHz, V: %.3f Hz\n", drate / 1e6, hrate / 1e3, vrate); #endif @@ -283,7 +282,7 @@ extern int fbset_main(int argc, char **argv) varset.hsync_len = strtoul(argv[6], 0, 0); varset.vsync_len = strtoul(argv[7], 0, 0); break; -#ifdef BB_FBSET_FANCY +#ifdef BB_FEATURE_FBSET_FANCY case CMD_XRES: varset.xres = strtoul(argv[1], 0, 0); break; @@ -323,7 +322,8 @@ extern int fbset_main(int argc, char **argv) if (ioctl(fh, FBIOPUT_VSCREENINFO, &var)) PERROR("fbset(ioctl)"); showmode(&var); - close(fh); + /* Don't close the file, as exiting will take care of that */ + /* close(fh); */ - return (TRUE); + exit (TRUE); } diff --git a/util-linux/fdflush.c b/util-linux/fdflush.c index 0b154c8..201cea8 100644 --- a/util-linux/fdflush.c +++ b/util-linux/fdflush.c @@ -44,7 +44,9 @@ extern int fdflush_main(int argc, char **argv) } value = ioctl(fd, FDFLUSH, 0); - close(fd); + /* Don't bother closing. Exit does + * that, so we can save a few bytes */ + /* close(fd); */ if (value) { perror(*argv); diff --git a/util-linux/freeramdisk.c b/util-linux/freeramdisk.c index 43d42d4..06937a7 100644 --- a/util-linux/freeramdisk.c +++ b/util-linux/freeramdisk.c @@ -55,7 +55,9 @@ freeramdisk_main(int argc, char **argv) if (ioctl(f, BLKFLSBUF) < 0) { fatalError( "freeramdisk: failed ioctl on %s: %s", rname, strerror(errno)); } - close(f); + /* Don't bother closing. Exit does + * that, so we can save a few bytes */ + /* close(f); */ exit(TRUE); } diff --git a/util-linux/fsck_minix.c b/util-linux/fsck_minix.c index 47e81ce..aa0a824 100644 --- a/util-linux/fsck_minix.c +++ b/util-linux/fsck_minix.c @@ -1242,6 +1242,7 @@ static void alloc_name_list(void) name_list[i] = xmalloc(sizeof(char) * PATH_MAX + 1); } +#if 0 /* execute this atexit() to deallocate name_list[] */ /* piptigger was here */ static void free_name_list(void) @@ -1257,6 +1258,7 @@ static void free_name_list(void) free(name_list); } } +#endif extern int fsck_minix_main(int argc, char **argv) { @@ -1265,7 +1267,9 @@ extern int fsck_minix_main(int argc, char **argv) int retcode = 0; alloc_name_list(); - atexit(free_name_list); + /* Don't bother to free memory. Exit does + * that automagically, so we can save a few bytes */ + //atexit(free_name_list); if (argc && *argv) program_name = *argv; diff --git a/util-linux/mount.c b/util-linux/mount.c index 0389137..30a060f 100644 --- a/util-linux/mount.c +++ b/util-linux/mount.c @@ -348,8 +348,12 @@ extern int mount_main(int argc, char **argv) mntentlist[i].mnt_opts, mntentlist[i].mnt_freq, mntentlist[i].mnt_passno); } + /* Don't bother to close files or free memory. Exit + * does that automagically, so we can save a few bytes */ +#if 0 free( mntentlist); close(fd); +#endif exit(TRUE); } #else diff --git a/util-linux/umount.c b/util-linux/umount.c index c34bf5f..23973fc 100644 --- a/util-linux/umount.c +++ b/util-linux/umount.c @@ -145,6 +145,9 @@ char *mtab_next(void **iter) return mp; } +/* Don't bother to clean up, since exit() does that + * automagically, so we can save a few bytes */ +#if 0 void mtab_free(void) { struct _mtab_entry_t *this, *next; @@ -160,6 +163,7 @@ void mtab_free(void) this = next; } } +#endif static int do_umount(const char *name, int useMtab) { @@ -112,10 +112,10 @@ extern void fatalError(char *s, ...) exit( FALSE); } -#if defined (BB_INIT) || defined (BB_PS) +#if defined BB_INIT /* Returns kernel version encoded as major*65536 + minor*256 + patch, * so, for example, to check if the kernel is greater than 2.2.11: - * if (get_kernel_revision() <= 2*65536+2*256+11) { <stuff> } + * if (get_kernel_revision() <= 2*65536+2*256+11) { <stuff> } */ int get_kernel_revision() { @@ -129,7 +129,7 @@ int get_kernel_revision() sscanf(name.version, "%d.%d.%d", &major, &minor, &patch); return major * 65536 + minor * 256 + patch; } -#endif /* BB_INIT || BB_PS */ +#endif /* BB_INIT */ #if defined (BB_CP_MV) || defined (BB_DU) |