More stuff.

This commit is contained in:
Eric Andersen 1999-11-04 21:18:07 +00:00
parent 3ae0c78962
commit d0246fb72b
10 changed files with 247 additions and 71 deletions

View File

@ -4,12 +4,15 @@
* Fixed mkdir -m option so that it works. * Fixed mkdir -m option so that it works.
* kill segfaulted w/o any arguments. Now it doesn't do that. * kill segfaulted w/o any arguments. Now it doesn't do that.
* kill wasn't properly accepting signal names. It does now. * kill wasn't properly accepting signal names. It does now.
* Added new apps chvt and deallocvt * Added new apps chvt and deallocvt (I should probably add open)
* Major adjustment of init.c. Code is now readable IMHO, * Major rewrite of init.c. Code is now readable by mere mortals IMHO.
and much more solid.
* Wrote sed -- weighs only 1.8k (5.8k with full regular expressions!). * Wrote sed -- weighs only 1.8k (5.8k with full regular expressions!).
* Fixed a stupid seg-fault in sync * Fixed a stupid seg-fault in sync
* Fixed mount -- mount -a always mounted rw despite /etc/fstab ro entries. * Fixed mount -- mount -a failed to parse and apply mount options
* Added BB_MTAB, allowing (at the cost of ~1.5k and the need for a rw /etc)
folks to use a real /etc/mtab file instead of a symlink to /proc/mounts.
mount, and umount will add/remove entries and df will now use /etc/mtab
if BB_MTAB is defined.
-Erik Andersen -Erik Andersen

View File

@ -38,6 +38,7 @@
#define BB_MORE #define BB_MORE
#define BB_MOUNT #define BB_MOUNT
//#define BB_MT //#define BB_MT
#define BB_MTAB
#define BB_MV #define BB_MV
//#define BB_PRINTF //#define BB_PRINTF
#define BB_PS #define BB_PS

View File

@ -31,6 +31,7 @@
static const char df_usage[] = "df [filesystem ...]\n" static const char df_usage[] = "df [filesystem ...]\n"
"\n" "\tPrint the filesystem space used and space available.\n"; "\n" "\tPrint the filesystem space used and space available.\n";
extern const char mtab_file[]; /* Defined in utility.c */
static int df(char *device, const char *mountPoint) static int df(char *device, const char *mountPoint)
{ {
@ -113,7 +114,7 @@ extern int df_main(int argc, char **argv)
int status; int status;
while (argc > 1) { while (argc > 1) {
if ((mountEntry = findMountPoint(argv[1], "/proc/mounts")) == if ((mountEntry = findMountPoint(argv[1], mtab_file)) ==
0) { 0) {
fprintf(stderr, "%s: can't find mount point.\n", argv[1]); fprintf(stderr, "%s: can't find mount point.\n", argv[1]);
return 1; return 1;
@ -129,9 +130,9 @@ extern int df_main(int argc, char **argv)
FILE *mountTable; FILE *mountTable;
struct mntent *mountEntry; struct mntent *mountEntry;
mountTable = setmntent("/proc/mounts", "r"); mountTable = setmntent(mtab_file, "r");
if (mountTable == 0) { if (mountTable == 0) {
perror("/proc/mounts"); perror(mtab_file);
exit(FALSE); exit(FALSE);
} }

7
df.c
View File

@ -31,6 +31,7 @@
static const char df_usage[] = "df [filesystem ...]\n" static const char df_usage[] = "df [filesystem ...]\n"
"\n" "\tPrint the filesystem space used and space available.\n"; "\n" "\tPrint the filesystem space used and space available.\n";
extern const char mtab_file[]; /* Defined in utility.c */
static int df(char *device, const char *mountPoint) static int df(char *device, const char *mountPoint)
{ {
@ -113,7 +114,7 @@ extern int df_main(int argc, char **argv)
int status; int status;
while (argc > 1) { while (argc > 1) {
if ((mountEntry = findMountPoint(argv[1], "/proc/mounts")) == if ((mountEntry = findMountPoint(argv[1], mtab_file)) ==
0) { 0) {
fprintf(stderr, "%s: can't find mount point.\n", argv[1]); fprintf(stderr, "%s: can't find mount point.\n", argv[1]);
return 1; return 1;
@ -129,9 +130,9 @@ extern int df_main(int argc, char **argv)
FILE *mountTable; FILE *mountTable;
struct mntent *mountEntry; struct mntent *mountEntry;
mountTable = setmntent("/proc/mounts", "r"); mountTable = setmntent(mtab_file, "r");
if (mountTable == 0) { if (mountTable == 0) {
perror("/proc/mounts"); perror(mtab_file);
exit(FALSE); exit(FALSE);
} }

View File

@ -47,7 +47,6 @@
#define isWildCard(ch) (((ch) == '*') || ((ch) == '?') || ((ch) == '[')) #define isWildCard(ch) (((ch) == '*') || ((ch) == '?') || ((ch) == '['))
struct Applet { struct Applet {
const char* name; const char* name;
int (*main)(int argc, char** argv); int (*main)(int argc, char** argv);
@ -147,6 +146,10 @@ extern void my_getgrgid(char* group, gid_t gid);
extern int get_kernel_revision(); extern int get_kernel_revision();
extern int get_console_fd(char* tty_name); extern int get_console_fd(char* tty_name);
extern void write_mtab(char* blockDevice, char* directory,
char* filesystemType, long flags, char* string_flags);
extern void erase_mtab(const char * name);
#if defined (BB_FSCK_MINIX) || defined (BB_MKFS_MINIX) #if defined (BB_FSCK_MINIX) || defined (BB_MKFS_MINIX)

71
mount.c
View File

@ -41,11 +41,17 @@
#include <ctype.h> #include <ctype.h>
#include <fstab.h> #include <fstab.h>
extern const char mtab_file[]; /* Defined in utility.c */
static const char mount_usage[] = "Usage:\tmount [flags]\n" static const char mount_usage[] = "Usage:\tmount [flags]\n"
"\tmount [flags] device directory [-o options,more-options]\n" "\tmount [flags] device directory [-o options,more-options]\n"
"\n" "\n"
"Flags:\n" "Flags:\n"
"\t-a:\tMount all file systems in fstab.\n" "\t-a:\tMount all file systems in fstab.\n"
#ifdef BB_MTAB
"\t-f:\t\"Fake\" mount. Add entry to mount table but don't mount it.\n"
"\t-n:\tDon't write a mount table entry.\n"
#endif
"\t-o option:\tOne of many filesystem options, listed below.\n" "\t-o option:\tOne of many filesystem options, listed below.\n"
"\t-r:\tMount the filesystem read-only.\n" "\t-r:\tMount the filesystem read-only.\n"
"\t-t filesystem-type:\tSpecify the filesystem type.\n" "\t-t filesystem-type:\tSpecify the filesystem type.\n"
@ -62,6 +68,7 @@ static const char mount_usage[] = "Usage:\tmount [flags]\n"
"There are EVEN MORE flags that are specific to each filesystem.\n" "There are EVEN MORE flags that are specific to each filesystem.\n"
"You'll have to see the written documentation for those.\n"; "You'll have to see the written documentation for those.\n";
struct mount_options { struct mount_options {
const char *name; const char *name;
unsigned long and; unsigned long and;
@ -84,6 +91,29 @@ static const struct mount_options mount_options[] = {
{0, 0, 0} {0, 0, 0}
}; };
#if ! defined BB_MTAB
#define do_mount(specialfile, dir, filesystemtype, flags, string_flags, useMtab, fakeIt) \
mount(specialfile, dir, filesystemtype, flags, string_flags)
#else
static int
do_mount(char* specialfile, char* dir, char* filesystemtype,
long flags, void* string_flags, int useMtab, int fakeIt)
{
int status=0;
if (fakeIt==FALSE)
status=mount(specialfile, dir, filesystemtype, flags, string_flags);
if ( status == 0 ) {
if ( useMtab==TRUE )
write_mtab(specialfile, dir, filesystemtype, flags, string_flags);
return 0;
}
else
return( status);
}
#endif
/* Seperate standard mount options from the nonstandard string options */ /* Seperate standard mount options from the nonstandard string options */
static void static void
@ -126,9 +156,8 @@ parse_mount_options ( char *options, unsigned long *flags, char *strflags)
} }
int int
mount_one ( mount_one(char *blockDevice, char *directory, char *filesystemType,
char *blockDevice, char *directory, char *filesystemType, unsigned long flags, char *string_flags, int useMtab, int fakeIt)
unsigned long flags, char *string_flags)
{ {
int status = 0; int status = 0;
@ -152,16 +181,16 @@ mount_one (
filesystemType = buf; filesystemType = buf;
filesystemType++; // hop past tab filesystemType++; // hop past tab
status = mount (blockDevice, directory, filesystemType, status = do_mount (blockDevice, directory, filesystemType,
flags | MS_MGC_VAL, string_flags); flags | MS_MGC_VAL, string_flags, useMtab, fakeIt);
if (status == 0) if (status == 0)
break; break;
} }
} }
fclose (f); fclose (f);
} else { } else {
status = mount (blockDevice, directory, filesystemType, status = do_mount (blockDevice, directory, filesystemType,
flags | MS_MGC_VAL, string_flags); flags | MS_MGC_VAL, string_flags, useMtab, fakeIt);
} }
if (status) { if (status) {
@ -180,15 +209,17 @@ extern int mount_main (int argc, char **argv)
char *device = NULL; char *device = NULL;
char *directory = NULL; char *directory = NULL;
struct stat statBuf; struct stat statBuf;
int all = 0; int all = FALSE;
int fakeIt = FALSE;
int useMtab = TRUE;
int i; int i;
if (stat("/etc/fstab", &statBuf) < 0) if (stat("/etc/fstab", &statBuf) < 0)
fprintf(stderr, "/etc/fstab file missing -- Please install one.\n\n"); fprintf(stderr, "/etc/fstab file missing -- Please install one.\n\n");
if (argc == 1) { if (argc == 1) {
FILE *mountTable; FILE *mountTable = setmntent (mtab_file, "r");
if ((mountTable = setmntent ("/proc/mounts", "r"))) { if (mountTable) {
struct mntent *m; struct mntent *m;
while ((m = getmntent (mountTable)) != 0) { while ((m = getmntent (mountTable)) != 0) {
struct fstab* fstabItem; struct fstab* fstabItem;
@ -203,6 +234,8 @@ extern int mount_main (int argc, char **argv)
m->mnt_type, m->mnt_opts); m->mnt_type, m->mnt_opts);
} }
endmntent (mountTable); endmntent (mountTable);
} else {
perror(mtab_file);
} }
exit( TRUE); exit( TRUE);
} }
@ -241,6 +274,14 @@ extern int mount_main (int argc, char **argv)
case 'a': case 'a':
all = TRUE; all = TRUE;
break; break;
#ifdef BB_MTAB
case 'f':
fakeIt = TRUE;
break;
case 'n':
useMtab = FALSE;
break;
#endif
case 'v': case 'v':
case 'h': case 'h':
case '-': case '-':
@ -263,7 +304,6 @@ extern int mount_main (int argc, char **argv)
} }
if (all == TRUE) { if (all == TRUE) {
long newFlags;
struct mntent *m; struct mntent *m;
FILE *f = setmntent ("/etc/fstab", "r"); FILE *f = setmntent ("/etc/fstab", "r");
@ -279,17 +319,18 @@ extern int mount_main (int argc, char **argv)
(!strstr (m->mnt_type, "swap")) && (!strstr (m->mnt_type, "swap")) &&
(!strstr (m->mnt_type, "nfs"))) (!strstr (m->mnt_type, "nfs")))
{ {
newFlags = flags; flags = 0;
*string_flags = '\0'; *string_flags = '\0';
parse_mount_options(m->mnt_opts, &newFlags, string_flags); parse_mount_options(m->mnt_opts, &flags, string_flags);
mount_one (m->mnt_fsname, m->mnt_dir, m->mnt_type, newFlags, string_flags); mount_one (m->mnt_fsname, m->mnt_dir, m->mnt_type,
flags, string_flags, useMtab, fakeIt);
} }
} }
endmntent (f); endmntent (f);
} else { } else {
if (device && directory) { if (device && directory) {
exit (mount_one (device, directory, filesystemType, exit (mount_one (device, directory, filesystemType,
flags, string_flags)); flags, string_flags, useMtab, fakeIt));
} else { } else {
fprintf (stderr, "%s\n", mount_usage); fprintf (stderr, "%s\n", mount_usage);
exit( FALSE); exit( FALSE);

View File

@ -29,24 +29,54 @@
#include <errno.h> #include <errno.h>
static const char umount_usage[] = static const char umount_usage[] =
"Usage: umount filesystem\n" "Usage: umount [flags] filesystem|directory\n"
" or: umount directory\n" "Optional Flags:\n"
" or: umount -a" "\t-a:\tUnmount all file systems"
"to unmount all mounted file systems.\n"; #ifdef BB_MTAB
" in /etc/mtab\n\t-n:\tDon't erase /etc/mtab entries\n"
#else
"\n"
#endif
;
static int useMtab = TRUE;
static int umountAll = FALSE;
extern const char mtab_file[]; /* Defined in utility.c */
#if ! defined BB_MTAB
#define do_umount( blockDevice, useMtab) umount( blockDevice)
#else
static int
do_umount(const char* name, int useMtab)
{
int status = umount(name);
if ( status == 0 ) {
if ( useMtab==TRUE )
erase_mtab(name);
return 0;
}
else
return( status);
}
#endif
static int static int
umount_all() umount_all(int useMtab)
{ {
int status; int status;
struct mntent *m; struct mntent *m;
FILE *mountTable; FILE *mountTable;
if ((mountTable = setmntent ("/proc/mounts", "r"))) { if ((mountTable = setmntent (mtab_file, "r"))) {
while ((m = getmntent (mountTable)) != 0) { while ((m = getmntent (mountTable)) != 0) {
char *blockDevice = m->mnt_fsname; char *blockDevice = m->mnt_fsname;
#if ! defined BB_MTAB
if (strcmp (blockDevice, "/dev/root") == 0) if (strcmp (blockDevice, "/dev/root") == 0)
blockDevice = (getfsfile ("/"))->fs_spec; blockDevice = (getfsfile ("/"))->fs_spec;
status=umount (m->mnt_dir); #endif
status=do_umount (m->mnt_dir, useMtab);
if (status!=0) { if (status!=0) {
/* Don't bother retrying the umount on busy devices */ /* Don't bother retrying the umount on busy devices */
if (errno==EBUSY) { if (errno==EBUSY) {
@ -56,7 +86,7 @@ umount_all()
printf ("Trying to umount %s failed: %s\n", printf ("Trying to umount %s failed: %s\n",
m->mnt_dir, strerror(errno)); m->mnt_dir, strerror(errno));
printf ("Instead trying to umount %s\n", blockDevice); printf ("Instead trying to umount %s\n", blockDevice);
status=umount (blockDevice); status=do_umount (blockDevice, useMtab);
if (status!=0) { if (status!=0) {
printf ("Couldn't umount %s on %s (type %s): %s\n", printf ("Couldn't umount %s on %s (type %s): %s\n",
blockDevice, m->mnt_dir, m->mnt_type, strerror(errno)); blockDevice, m->mnt_dir, m->mnt_type, strerror(errno));
@ -69,26 +99,34 @@ umount_all()
} }
extern int extern int
umount_main(int argc, char * * argv) umount_main(int argc, char** argv)
{ {
if (argc < 2) { if (argc < 2) {
usage( umount_usage); usage( umount_usage);
} }
argc--;
argv++;
/* Parse any options */ /* Parse any options */
while (**argv == '-') { while (argc-- > 0 && **(++argv) == '-') {
while (*++(*argv)) switch (**argv) { while (*++(*argv)) switch (**argv) {
case 'a': case 'a':
exit ( umount_all() ); umountAll = TRUE;
break; break;
#ifdef BB_MTAB
case 'n':
useMtab = FALSE;
break;
#endif
default: default:
usage( umount_usage); usage( umount_usage);
} }
} }
if ( umount(*argv) == 0 )
if(umountAll) {
exit(umount_all(useMtab));
}
if ( do_umount(*argv,useMtab) == 0 )
exit (TRUE); exit (TRUE);
else { else {
perror("umount"); perror("umount");

View File

@ -41,11 +41,17 @@
#include <ctype.h> #include <ctype.h>
#include <fstab.h> #include <fstab.h>
extern const char mtab_file[]; /* Defined in utility.c */
static const char mount_usage[] = "Usage:\tmount [flags]\n" static const char mount_usage[] = "Usage:\tmount [flags]\n"
"\tmount [flags] device directory [-o options,more-options]\n" "\tmount [flags] device directory [-o options,more-options]\n"
"\n" "\n"
"Flags:\n" "Flags:\n"
"\t-a:\tMount all file systems in fstab.\n" "\t-a:\tMount all file systems in fstab.\n"
#ifdef BB_MTAB
"\t-f:\t\"Fake\" mount. Add entry to mount table but don't mount it.\n"
"\t-n:\tDon't write a mount table entry.\n"
#endif
"\t-o option:\tOne of many filesystem options, listed below.\n" "\t-o option:\tOne of many filesystem options, listed below.\n"
"\t-r:\tMount the filesystem read-only.\n" "\t-r:\tMount the filesystem read-only.\n"
"\t-t filesystem-type:\tSpecify the filesystem type.\n" "\t-t filesystem-type:\tSpecify the filesystem type.\n"
@ -62,6 +68,7 @@ static const char mount_usage[] = "Usage:\tmount [flags]\n"
"There are EVEN MORE flags that are specific to each filesystem.\n" "There are EVEN MORE flags that are specific to each filesystem.\n"
"You'll have to see the written documentation for those.\n"; "You'll have to see the written documentation for those.\n";
struct mount_options { struct mount_options {
const char *name; const char *name;
unsigned long and; unsigned long and;
@ -84,6 +91,29 @@ static const struct mount_options mount_options[] = {
{0, 0, 0} {0, 0, 0}
}; };
#if ! defined BB_MTAB
#define do_mount(specialfile, dir, filesystemtype, flags, string_flags, useMtab, fakeIt) \
mount(specialfile, dir, filesystemtype, flags, string_flags)
#else
static int
do_mount(char* specialfile, char* dir, char* filesystemtype,
long flags, void* string_flags, int useMtab, int fakeIt)
{
int status=0;
if (fakeIt==FALSE)
status=mount(specialfile, dir, filesystemtype, flags, string_flags);
if ( status == 0 ) {
if ( useMtab==TRUE )
write_mtab(specialfile, dir, filesystemtype, flags, string_flags);
return 0;
}
else
return( status);
}
#endif
/* Seperate standard mount options from the nonstandard string options */ /* Seperate standard mount options from the nonstandard string options */
static void static void
@ -126,9 +156,8 @@ parse_mount_options ( char *options, unsigned long *flags, char *strflags)
} }
int int
mount_one ( mount_one(char *blockDevice, char *directory, char *filesystemType,
char *blockDevice, char *directory, char *filesystemType, unsigned long flags, char *string_flags, int useMtab, int fakeIt)
unsigned long flags, char *string_flags)
{ {
int status = 0; int status = 0;
@ -152,16 +181,16 @@ mount_one (
filesystemType = buf; filesystemType = buf;
filesystemType++; // hop past tab filesystemType++; // hop past tab
status = mount (blockDevice, directory, filesystemType, status = do_mount (blockDevice, directory, filesystemType,
flags | MS_MGC_VAL, string_flags); flags | MS_MGC_VAL, string_flags, useMtab, fakeIt);
if (status == 0) if (status == 0)
break; break;
} }
} }
fclose (f); fclose (f);
} else { } else {
status = mount (blockDevice, directory, filesystemType, status = do_mount (blockDevice, directory, filesystemType,
flags | MS_MGC_VAL, string_flags); flags | MS_MGC_VAL, string_flags, useMtab, fakeIt);
} }
if (status) { if (status) {
@ -180,15 +209,17 @@ extern int mount_main (int argc, char **argv)
char *device = NULL; char *device = NULL;
char *directory = NULL; char *directory = NULL;
struct stat statBuf; struct stat statBuf;
int all = 0; int all = FALSE;
int fakeIt = FALSE;
int useMtab = TRUE;
int i; int i;
if (stat("/etc/fstab", &statBuf) < 0) if (stat("/etc/fstab", &statBuf) < 0)
fprintf(stderr, "/etc/fstab file missing -- Please install one.\n\n"); fprintf(stderr, "/etc/fstab file missing -- Please install one.\n\n");
if (argc == 1) { if (argc == 1) {
FILE *mountTable; FILE *mountTable = setmntent (mtab_file, "r");
if ((mountTable = setmntent ("/proc/mounts", "r"))) { if (mountTable) {
struct mntent *m; struct mntent *m;
while ((m = getmntent (mountTable)) != 0) { while ((m = getmntent (mountTable)) != 0) {
struct fstab* fstabItem; struct fstab* fstabItem;
@ -203,6 +234,8 @@ extern int mount_main (int argc, char **argv)
m->mnt_type, m->mnt_opts); m->mnt_type, m->mnt_opts);
} }
endmntent (mountTable); endmntent (mountTable);
} else {
perror(mtab_file);
} }
exit( TRUE); exit( TRUE);
} }
@ -241,6 +274,14 @@ extern int mount_main (int argc, char **argv)
case 'a': case 'a':
all = TRUE; all = TRUE;
break; break;
#ifdef BB_MTAB
case 'f':
fakeIt = TRUE;
break;
case 'n':
useMtab = FALSE;
break;
#endif
case 'v': case 'v':
case 'h': case 'h':
case '-': case '-':
@ -263,7 +304,6 @@ extern int mount_main (int argc, char **argv)
} }
if (all == TRUE) { if (all == TRUE) {
long newFlags;
struct mntent *m; struct mntent *m;
FILE *f = setmntent ("/etc/fstab", "r"); FILE *f = setmntent ("/etc/fstab", "r");
@ -279,17 +319,18 @@ extern int mount_main (int argc, char **argv)
(!strstr (m->mnt_type, "swap")) && (!strstr (m->mnt_type, "swap")) &&
(!strstr (m->mnt_type, "nfs"))) (!strstr (m->mnt_type, "nfs")))
{ {
newFlags = flags; flags = 0;
*string_flags = '\0'; *string_flags = '\0';
parse_mount_options(m->mnt_opts, &newFlags, string_flags); parse_mount_options(m->mnt_opts, &flags, string_flags);
mount_one (m->mnt_fsname, m->mnt_dir, m->mnt_type, newFlags, string_flags); mount_one (m->mnt_fsname, m->mnt_dir, m->mnt_type,
flags, string_flags, useMtab, fakeIt);
} }
} }
endmntent (f); endmntent (f);
} else { } else {
if (device && directory) { if (device && directory) {
exit (mount_one (device, directory, filesystemType, exit (mount_one (device, directory, filesystemType,
flags, string_flags)); flags, string_flags, useMtab, fakeIt));
} else { } else {
fprintf (stderr, "%s\n", mount_usage); fprintf (stderr, "%s\n", mount_usage);
exit( FALSE); exit( FALSE);

View File

@ -29,24 +29,54 @@
#include <errno.h> #include <errno.h>
static const char umount_usage[] = static const char umount_usage[] =
"Usage: umount filesystem\n" "Usage: umount [flags] filesystem|directory\n"
" or: umount directory\n" "Optional Flags:\n"
" or: umount -a" "\t-a:\tUnmount all file systems"
"to unmount all mounted file systems.\n"; #ifdef BB_MTAB
" in /etc/mtab\n\t-n:\tDon't erase /etc/mtab entries\n"
#else
"\n"
#endif
;
static int useMtab = TRUE;
static int umountAll = FALSE;
extern const char mtab_file[]; /* Defined in utility.c */
#if ! defined BB_MTAB
#define do_umount( blockDevice, useMtab) umount( blockDevice)
#else
static int
do_umount(const char* name, int useMtab)
{
int status = umount(name);
if ( status == 0 ) {
if ( useMtab==TRUE )
erase_mtab(name);
return 0;
}
else
return( status);
}
#endif
static int static int
umount_all() umount_all(int useMtab)
{ {
int status; int status;
struct mntent *m; struct mntent *m;
FILE *mountTable; FILE *mountTable;
if ((mountTable = setmntent ("/proc/mounts", "r"))) { if ((mountTable = setmntent (mtab_file, "r"))) {
while ((m = getmntent (mountTable)) != 0) { while ((m = getmntent (mountTable)) != 0) {
char *blockDevice = m->mnt_fsname; char *blockDevice = m->mnt_fsname;
#if ! defined BB_MTAB
if (strcmp (blockDevice, "/dev/root") == 0) if (strcmp (blockDevice, "/dev/root") == 0)
blockDevice = (getfsfile ("/"))->fs_spec; blockDevice = (getfsfile ("/"))->fs_spec;
status=umount (m->mnt_dir); #endif
status=do_umount (m->mnt_dir, useMtab);
if (status!=0) { if (status!=0) {
/* Don't bother retrying the umount on busy devices */ /* Don't bother retrying the umount on busy devices */
if (errno==EBUSY) { if (errno==EBUSY) {
@ -56,7 +86,7 @@ umount_all()
printf ("Trying to umount %s failed: %s\n", printf ("Trying to umount %s failed: %s\n",
m->mnt_dir, strerror(errno)); m->mnt_dir, strerror(errno));
printf ("Instead trying to umount %s\n", blockDevice); printf ("Instead trying to umount %s\n", blockDevice);
status=umount (blockDevice); status=do_umount (blockDevice, useMtab);
if (status!=0) { if (status!=0) {
printf ("Couldn't umount %s on %s (type %s): %s\n", printf ("Couldn't umount %s on %s (type %s): %s\n",
blockDevice, m->mnt_dir, m->mnt_type, strerror(errno)); blockDevice, m->mnt_dir, m->mnt_type, strerror(errno));
@ -69,26 +99,34 @@ umount_all()
} }
extern int extern int
umount_main(int argc, char * * argv) umount_main(int argc, char** argv)
{ {
if (argc < 2) { if (argc < 2) {
usage( umount_usage); usage( umount_usage);
} }
argc--;
argv++;
/* Parse any options */ /* Parse any options */
while (**argv == '-') { while (argc-- > 0 && **(++argv) == '-') {
while (*++(*argv)) switch (**argv) { while (*++(*argv)) switch (**argv) {
case 'a': case 'a':
exit ( umount_all() ); umountAll = TRUE;
break; break;
#ifdef BB_MTAB
case 'n':
useMtab = FALSE;
break;
#endif
default: default:
usage( umount_usage); usage( umount_usage);
} }
} }
if ( umount(*argv) == 0 )
if(umountAll) {
exit(umount_all(useMtab));
}
if ( do_umount(*argv,useMtab) == 0 )
exit (TRUE); exit (TRUE);
else { else {
perror("umount"); perror("umount");

View File

@ -36,6 +36,15 @@
#include <unistd.h> #include <unistd.h>
#include <ctype.h> #include <ctype.h>
#ifdef BB_MTAB
const char mtab_file[] = "/etc/mtab";
#else
#if defined BB_MOUNT || defined BB_UMOUNT || defined BB_DF
const char mtab_file[] = "/proc/mounts";
#endif
#endif
/* volatile so gcc knows this is the enod of the line */ /* volatile so gcc knows this is the enod of the line */
volatile void usage(const char *usage) volatile void usage(const char *usage)
{ {