From cc6d8d30ec156f6f247d63253e4a3f12cd8d7edc Mon Sep 17 00:00:00 2001 From: Rob Landley Date: Wed, 8 Feb 2006 20:06:57 +0000 Subject: [PATCH] Fix umount so it works if there's no /etc/mtab or /proc/mounts, make umount -a into a CONFIG_FEATURE (why not?), and zap the now obsolete defconfig file (which was supposed to be part of the previous checkin). --- defconfig | 423 ------------------------------------------- util-linux/Config.in | 7 + util-linux/umount.c | 53 +++--- 3 files changed, 34 insertions(+), 449 deletions(-) delete mode 100644 defconfig diff --git a/defconfig b/defconfig deleted file mode 100644 index 51582d1ae..000000000 --- a/defconfig +++ /dev/null @@ -1,423 +0,0 @@ -# -# Automatically generated make config: don't edit -# -HAVE_DOT_CONFIG=y - -# -# General Configuration -# -# CONFIG_FEATURE_BUFFERS_USE_MALLOC is not set -CONFIG_FEATURE_BUFFERS_GO_ON_STACK=y -# CONFIG_FEATURE_BUFFERS_GO_IN_BSS is not set -CONFIG_FEATURE_VERBOSE_USAGE=y -# CONFIG_FEATURE_INSTALLER is not set -# CONFIG_LOCALE_SUPPORT is not set -# CONFIG_FEATURE_DEVFS is not set -CONFIG_FEATURE_DEVPTS=y -# CONFIG_FEATURE_CLEAN_UP is not set -# CONFIG_FEATURE_SUID is not set -# CONFIG_SELINUX is not set - -# -# Build Options -# -# CONFIG_STATIC is not set -# CONFIG_LFS is not set -# USING_CROSS_COMPILER is not set -EXTRA_CFLAGS_OPTIONS="" - -# -# Installation Options -# -# CONFIG_INSTALL_NO_USR is not set -PREFIX="./_install" - -# -# Archival Utilities -# -# CONFIG_AR is not set -CONFIG_BUNZIP2=y -# CONFIG_CPIO is not set -# CONFIG_DPKG is not set -# CONFIG_DPKG_DEB is not set -CONFIG_GUNZIP=y -# CONFIG_FEATURE_GUNZIP_UNCOMPRESS is not set -CONFIG_GZIP=y -# CONFIG_RPM2CPIO is not set -# CONFIG_RPM is not set -CONFIG_TAR=y -CONFIG_FEATURE_TAR_CREATE=y -CONFIG_FEATURE_TAR_BZIP2=y -# CONFIG_FEATURE_TAR_FROM is not set -CONFIG_FEATURE_TAR_GZIP=y -# CONFIG_FEATURE_TAR_COMPRESS is not set -CONFIG_FEATURE_TAR_OLDGNU_COMPATABILITY=y -CONFIG_FEATURE_TAR_GNU_EXTENSIONS=y -# CONFIG_FEATURE_TAR_LONG_OPTIONS is not set -# CONFIG_UNCOMPRESS is not set -CONFIG_UNZIP=y - -# -# Common options for cpio and tar -# -# CONFIG_FEATURE_UNARCHIVE_TAPE is not set - -# -# Coreutils -# -CONFIG_BASENAME=y -# CONFIG_CAL is not set -CONFIG_CAT=y -CONFIG_CHGRP=y -CONFIG_CHMOD=y -CONFIG_CHOWN=y -CONFIG_CHROOT=y -CONFIG_CMP=y -CONFIG_CP=y -CONFIG_CUT=y -CONFIG_DATE=y -CONFIG_FEATURE_DATE_ISOFMT=y -CONFIG_DD=y -CONFIG_DF=y -CONFIG_DIRNAME=y -# CONFIG_DOS2UNIX is not set -CONFIG_DU=y -CONFIG_FEATURE_DU_DEFALT_BLOCKSIZE_1K=y -CONFIG_ECHO=y -CONFIG_FEATURE_FANCY_ECHO=y -CONFIG_ENV=y -CONFIG_EXPR=y -CONFIG_FALSE=y -# CONFIG_FOLD is not set -CONFIG_HEAD=y -# CONFIG_FEATURE_FANCY_HEAD is not set -# CONFIG_HOSTID is not set -CONFIG_ID=y -CONFIG_INSTALL=y -# CONFIG_LENGTH is not set -CONFIG_LN=y -# CONFIG_LOGNAME is not set -CONFIG_LS=y -CONFIG_FEATURE_LS_FILETYPES=y -CONFIG_FEATURE_LS_FOLLOWLINKS=y -CONFIG_FEATURE_LS_RECURSIVE=y -CONFIG_FEATURE_LS_SORTFILES=y -CONFIG_FEATURE_LS_TIMESTAMPS=y -CONFIG_FEATURE_LS_USERNAME=y -CONFIG_FEATURE_LS_COLOR=y -# CONFIG_MD5SUM is not set -CONFIG_MKDIR=y -# CONFIG_MKFIFO is not set -CONFIG_MKNOD=y -CONFIG_MV=y -# CONFIG_OD is not set -# CONFIG_PRINTF is not set -CONFIG_PWD=y -# CONFIG_REALPATH is not set -CONFIG_RM=y -CONFIG_RMDIR=y -# CONFIG_SEQ is not set -# CONFIG_SHA1SUM is not set -CONFIG_SLEEP=y -# CONFIG_FEATURE_FANCY_SLEEP is not set -CONFIG_SORT=y -CONFIG_FEATURE_SORT_BIG=y -# CONFIG_STTY is not set -CONFIG_SYNC=y -CONFIG_TAIL=y -CONFIG_FEATURE_FANCY_TAIL=y -CONFIG_TEE=y -CONFIG_FEATURE_TEE_USE_BLOCK_IO=y -CONFIG_TEST=y - -# -# test (forced enabled for use with shell) -# -CONFIG_TOUCH=y -CONFIG_TR=y -CONFIG_TRUE=y -CONFIG_TTY=y -CONFIG_UNAME=y -CONFIG_UNIQ=y -CONFIG_USLEEP=y -# CONFIG_UUDECODE is not set -# CONFIG_UUENCODE is not set -# CONFIG_WATCH is not set -CONFIG_WC=y -# CONFIG_WHO is not set -CONFIG_WHOAMI=y -CONFIG_YES=y - -# -# Common options for cp and mv -# -CONFIG_FEATURE_PRESERVE_HARDLINKS=y - -# -# Common options for ls and more -# -CONFIG_FEATURE_AUTOWIDTH=y - -# -# Common options for df, du, ls -# -CONFIG_FEATURE_HUMAN_READABLE=y - -# -# Console Utilities -# -CONFIG_CHVT=y -CONFIG_CLEAR=y -CONFIG_DEALLOCVT=y -# CONFIG_DUMPKMAP is not set -# CONFIG_LOADFONT is not set -# CONFIG_LOADKMAP is not set -CONFIG_OPENVT=y -CONFIG_RESET=y -# CONFIG_SETKEYCODES is not set - -# -# Debian Utilities -# -CONFIG_MKTEMP=y -# CONFIG_PIPE_PROGRESS is not set -CONFIG_READLINK=y -# CONFIG_RUN_PARTS is not set -# CONFIG_START_STOP_DAEMON is not set -CONFIG_WHICH=y - -# -# Editors -# -# CONFIG_AWK is not set -# CONFIG_PATCH is not set -CONFIG_SED=y -CONFIG_VI=y -CONFIG_FEATURE_VI_COLON=y -CONFIG_FEATURE_VI_YANKMARK=y -CONFIG_FEATURE_VI_SEARCH=y -CONFIG_FEATURE_VI_USE_SIGNALS=y -CONFIG_FEATURE_VI_DOT_CMD=y -CONFIG_FEATURE_VI_READONLY=y -CONFIG_FEATURE_VI_SETOPTS=y -CONFIG_FEATURE_VI_SET=y -CONFIG_FEATURE_VI_WIN_RESIZE=y -CONFIG_FEATURE_VI_OPTIMIZE_CURSOR=y - -# -# Finding Utilities -# -CONFIG_FIND=y -CONFIG_FEATURE_FIND_MTIME=y -CONFIG_FEATURE_FIND_PERM=y -CONFIG_FEATURE_FIND_TYPE=y -CONFIG_FEATURE_FIND_XDEV=y -# CONFIG_FEATURE_FIND_NEWER is not set -# CONFIG_FEATURE_FIND_INUM is not set -CONFIG_GREP=y -CONFIG_FEATURE_GREP_EGREP_ALIAS=y -CONFIG_FEATURE_GREP_FGREP_ALIAS=y -CONFIG_FEATURE_GREP_CONTEXT=y -CONFIG_XARGS=y -# CONFIG_FEATURE_XARGS_SUPPORT_CONFIRMATION is not set -CONFIG_FEATURE_XARGS_SUPPORT_QUOTES=y -CONFIG_FEATURE_XARGS_SUPPORT_TERMOPT=y -CONFIG_FEATURE_XARGS_SUPPORT_ZERO_TERM=y - -# -# Init Utilities -# -CONFIG_INIT=y -CONFIG_FEATURE_USE_INITTAB=y -CONFIG_FEATURE_INITRD=y -# CONFIG_FEATURE_INIT_COREDUMPS is not set -CONFIG_FEATURE_EXTRA_QUIET=y -CONFIG_HALT=y -CONFIG_POWEROFF=y -CONFIG_REBOOT=y -# CONFIG_MESG is not set - -# -# Login/Password Management Utilities -# -# CONFIG_USE_BB_PWD_GRP is not set -# CONFIG_ADDGROUP is not set -# CONFIG_DELGROUP is not set -# CONFIG_ADDUSER is not set -# CONFIG_DELUSER is not set -# CONFIG_GETTY is not set -# CONFIG_LOGIN is not set -# CONFIG_PASSWD is not set -# CONFIG_SU is not set -# CONFIG_SULOGIN is not set -# CONFIG_VLOCK is not set - -# -# Miscellaneous Utilities -# -# CONFIG_ADJTIMEX is not set -# CONFIG_CROND is not set -# CONFIG_CRONTAB is not set -# CONFIG_DC is not set -# CONFIG_DEVFSD is not set -# CONFIG_LAST is not set -# CONFIG_HDPARM is not set -# CONFIG_MAKEDEVS is not set -# CONFIG_MT is not set -# CONFIG_RX is not set -CONFIG_STRINGS=y -CONFIG_TIME=y -# CONFIG_WATCHDOG is not set - -# -# Linux Module Utilities -# -# CONFIG_INSMOD is not set -# CONFIG_LSMOD is not set -# CONFIG_MODPROBE is not set -# CONFIG_RMMOD is not set - -# -# Networking Utilities -# -# CONFIG_FEATURE_IPV6 is not set -# CONFIG_ARPING is not set -# CONFIG_FTPGET is not set -# CONFIG_FTPPUT is not set -CONFIG_HOSTNAME=y -# CONFIG_HTTPD is not set -CONFIG_IFCONFIG=y -CONFIG_FEATURE_IFCONFIG_STATUS=y -# CONFIG_FEATURE_IFCONFIG_SLIP is not set -# CONFIG_FEATURE_IFCONFIG_MEMSTART_IOADDR_IRQ is not set -# CONFIG_FEATURE_IFCONFIG_HW is not set -# CONFIG_FEATURE_IFCONFIG_BROADCAST_PLUS is not set -# CONFIG_IFUPDOWN is not set -# CONFIG_INETD is not set -# CONFIG_IP is not set -# CONFIG_IPCALC is not set -# CONFIG_IPADDR is not set -# CONFIG_IPLINK is not set -# CONFIG_IPROUTE is not set -# CONFIG_IPTUNNEL is not set -# CONFIG_NAMEIF is not set -# CONFIG_NC is not set -# CONFIG_NETSTAT is not set -# CONFIG_NSLOOKUP is not set -CONFIG_PING=y -CONFIG_FEATURE_FANCY_PING=y -CONFIG_ROUTE=y -# CONFIG_TELNET is not set -# CONFIG_TELNETD is not set -# CONFIG_TFTP is not set -# CONFIG_TRACEROUTE is not set -# CONFIG_VCONFIG is not set -CONFIG_WGET=y -CONFIG_FEATURE_WGET_STATUSBAR=y -CONFIG_FEATURE_WGET_AUTHENTICATION=y -# CONFIG_FEATURE_WGET_IP6_LITERAL is not set - -# -# udhcp Server/Client -# -# CONFIG_UDHCPD is not set -# CONFIG_UDHCPC is not set - -# -# Process Utilities -# -CONFIG_FREE=y -CONFIG_KILL=y -CONFIG_KILLALL=y -CONFIG_PIDOF=y -CONFIG_PS=y -# CONFIG_RENICE is not set -# CONFIG_TOP is not set -CONFIG_UPTIME=y -# CONFIG_BB_SYSCTL is not set - -# -# Another Bourne-like Shell -# -CONFIG_FEATURE_SH_IS_ASH=y -# CONFIG_FEATURE_SH_IS_HUSH is not set -# CONFIG_FEATURE_SH_IS_LASH is not set -# CONFIG_FEATURE_SH_IS_MSH is not set -# CONFIG_FEATURE_SH_IS_NONE is not set -CONFIG_ASH=y - -# -# Ash Shell Options -# -CONFIG_ASH_JOB_CONTROL=y -CONFIG_ASH_ALIAS=y -CONFIG_ASH_MATH_SUPPORT=y -CONFIG_ASH_MATH_SUPPORT_64=y -# CONFIG_ASH_GETOPTS is not set -# CONFIG_ASH_CMDCMD is not set -# CONFIG_ASH_MAIL is not set -CONFIG_ASH_OPTIMIZE_FOR_SIZE=y -# CONFIG_ASH_RANDOM_SUPPORT is not set -# CONFIG_HUSH is not set -# CONFIG_LASH is not set -# CONFIG_MSH is not set - -# -# Bourne Shell Options -# -# CONFIG_FEATURE_SH_EXTRA_QUIET is not set -# CONFIG_FEATURE_SH_STANDALONE_SHELL is not set -CONFIG_FEATURE_COMMAND_EDITING=y -CONFIG_FEATURE_COMMAND_HISTORY=15 -CONFIG_FEATURE_COMMAND_SAVEHISTORY=y -CONFIG_FEATURE_COMMAND_TAB_COMPLETION=y -# CONFIG_FEATURE_COMMAND_USERNAME_COMPLETION is not set -CONFIG_FEATURE_SH_FANCY_PROMPT=y - -# -# System Logging Utilities -# -CONFIG_SYSLOGD=y -CONFIG_FEATURE_ROTATE_LOGFILE=y -# CONFIG_FEATURE_REMOTE_LOG is not set -# CONFIG_FEATURE_IPC_SYSLOG is not set -CONFIG_KLOGD=y -CONFIG_LOGGER=y - -# -# Linux System Utilities -# -CONFIG_DMESG=y -# CONFIG_FBSET is not set -# CONFIG_FDFLUSH is not set -# CONFIG_FDFORMAT is not set -# CONFIG_FDISK is not set -# CONFIG_FREERAMDISK is not set -# CONFIG_FSCK_MINIX is not set -# CONFIG_MKFS_MINIX is not set -# CONFIG_GETOPT is not set -CONFIG_HEXDUMP=y -# CONFIG_HWCLOCK is not set -# CONFIG_IPCRM is not set -# CONFIG_IPCS is not set -# CONFIG_LOSETUP is not set -# CONFIG_MKSWAP is not set -CONFIG_MORE=y -CONFIG_FEATURE_USE_TERMIOS=y -CONFIG_PIVOT_ROOT=y -# CONFIG_RDATE is not set -CONFIG_SWAPONOFF=y -CONFIG_MOUNT=y -# CONFIG_FEATURE_MOUNT_NFS is not set -CONFIG_UMOUNT=y - -# -# Common options for mount/umount -# -CONFIG_FEATURE_MOUNT_LOOP=y -# CONFIG_FEATURE_MTAB_SUPPORT is not set - -# -# Debugging Options -# -# CONFIG_DEBUG is not set diff --git a/util-linux/Config.in b/util-linux/Config.in index 76e9ff97f..fbcf62476 100644 --- a/util-linux/Config.in +++ b/util-linux/Config.in @@ -393,6 +393,13 @@ config CONFIG_UMOUNT the tool to use. If you enabled the 'mount' utility, you almost certainly also want to enable 'umount'. +config CONFIG_FEATURE_UMOUNT_ALL + bool " umount -a option" + default n + depends on CONFIG_UMOUNT + help + Support -a option to unmount all currently mounted filesystems. + comment "Common options for mount/umount" depends on CONFIG_MOUNT || CONFIG_UMOUNT diff --git a/util-linux/umount.c b/util-linux/umount.c index 14ff41588..8c0558466 100644 --- a/util-linux/umount.c +++ b/util-linux/umount.c @@ -21,15 +21,14 @@ #include #include "busybox.h" -#define OPTION_STRING "flaDnrv" +#define OPTION_STRING "flDnrva" #define OPT_FORCE 1 #define OPT_LAZY 2 -#define OPT_ALL 4 -#define OPT_DONTFREELOOP 8 -#define OPT_NO_MTAB 16 -#define OPT_REMOUNT 32 -/* -v is ignored */ - +#define OPT_DONTFREELOOP 4 +#define OPT_NO_MTAB 8 +#define OPT_REMOUNT 16 +#define OPT_IGNORED 32 // -v is ignored +#define OPT_ALL (ENABLE_FEATURE_UMOUNT_ALL ? 64 : 0) extern int umount_main(int argc, char **argv) { @@ -61,24 +60,25 @@ extern int umount_main(int argc, char **argv) * umounts the most recent entries first. */ m=mtl=0; - if(!(fp = setmntent(bb_path_mtab_file, "r"))) - bb_error_msg_and_die("Cannot open %s", bb_path_mtab_file); - while (getmntent_r(fp,&me,path,sizeof(path))) { - m=xmalloc(sizeof(struct mtab_list)); - m->next=mtl; - m->device=bb_xstrdup(me.mnt_fsname); - m->dir=bb_xstrdup(me.mnt_dir); - mtl=m; - } - endmntent(fp); + if(opt & OPT_ALL) { - /* If we're umounting all, then m points to the start of the list and - * the argument list should be empty (which will match all). */ - if(!(opt & OPT_ALL)) { - m=0; - if(argc <= 0) bb_show_usage(); - } + /* If we're umounting all, then m points to the start of the list and + * the argument list should be empty (which will match all). */ + if(!(fp = setmntent(bb_path_mtab_file, "r"))) + bb_error_msg_and_die("Cannot open %s", bb_path_mtab_file); + while (getmntent_r(fp,&me,path,sizeof(path))) { + m=xmalloc(sizeof(struct mtab_list)); + m->next=mtl; + m->device=bb_xstrdup(me.mnt_fsname); + m->dir=bb_xstrdup(me.mnt_dir); + mtl=m; + } + endmntent(fp); + + /* If we're not mounting all, we need at least one argument. */ + } else if(argc <= 0) bb_show_usage(); + // Loop through everything we're supposed to umount, and do so. for(;;) { int curstat; @@ -92,9 +92,10 @@ extern int umount_main(int argc, char **argv) else { // Get next command line argument (and look it up in mtab list) realpath(*argv++, path); - for(m = mtl; m; m = m->next) - if(!strcmp(path, m->dir) || !strcmp(path, m->device)) - break; + if (ENABLE_FEATURE_MTAB_SUPPORT) + for(m = mtl; m; m = m->next) + if(!strcmp(path, m->dir) || !strcmp(path, m->device)) + break; } // Let's ask the thing nicely to unmount.