My latest ramblings.

-Erik
This commit is contained in:
Erik Andersen 2000-03-23 01:09:18 +00:00
parent ec5bd90916
commit 298854f029
33 changed files with 1106 additions and 825 deletions

View File

@ -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

338
TODO
View File

@ -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/

View File

@ -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}

View File

@ -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;
/* 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;
#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'
/* 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];
int status, tarFd=0;
int errorFlag=FALSE;
TarHeader rawHeader;
TarInfo header;
skipFileFlag = FALSE;
badHeader = FALSE;
warnedRoot = FALSE;
eofFlag = FALSE;
inHeader = TRUE;
inCc = 0;
dataCc = 0;
outFd = -1;
blockSize = sizeof(buf);
cp = buf;
/*
* 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 ( *(header.name) == '\0' )
goto endgame;
/*
* 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;
}
/*
* 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);
/* 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);
}
}
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;
long val = 0;
/*
* 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;
}
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));
/* 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;
if ((mode < 0) || (uid < 0) || (gid < 0) || (size < 0)) {
if (badHeader == FALSE)
fprintf(stderr, "Bad tar header, skipping\n");
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)));
badHeader = TRUE;
/* 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

196
busybox.c
View File

@ -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}

View File

@ -185,6 +185,10 @@
#define BB_FEATURE_SH_COMMAND_EDITING
//
//
//Turn on extra fbset options
//#define BB_FEATURE_FBSET_FANCY
//
//
// End of Features List
//
//

View File

@ -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;
}

View File

@ -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;

View File

@ -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);

View File

@ -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 */

View File

@ -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 $ */

4
date.c
View File

@ -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;

24
dd.c
View File

@ -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);

16
fbset.c
View File

@ -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);
}

View File

@ -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);

View File

@ -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);
}

View File

@ -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;

3
init.c
View File

@ -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();

View File

@ -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();

View File

@ -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);

View File

@ -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;
}

5
ls.c
View File

@ -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 */

View File

@ -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

507
tar.c
View File

@ -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;
/* 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;
#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'
/* 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];
int status, tarFd=0;
int errorFlag=FALSE;
TarHeader rawHeader;
TarInfo header;
skipFileFlag = FALSE;
badHeader = FALSE;
warnedRoot = FALSE;
eofFlag = FALSE;
inHeader = TRUE;
inCc = 0;
dataCc = 0;
outFd = -1;
blockSize = sizeof(buf);
cp = buf;
/*
* 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 ( *(header.name) == '\0' )
goto endgame;
/*
* 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;
}
/*
* 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);
/* 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);
}
}
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;
long val = 0;
/*
* 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;
}
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));
/* 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;
if ((mode < 0) || (uid < 0) || (gid < 0) || (size < 0)) {
if (badHeader == FALSE)
fprintf(stderr, "Bad tar header, skipping\n");
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)));
badHeader = TRUE;
/* 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

6
tee.c
View File

@ -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 $ */

View File

@ -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)
{

View File

@ -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);
}

View File

@ -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);

View File

@ -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);
}

View File

@ -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;

View File

@ -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

View File

@ -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)
{

View File

@ -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)