X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=mount.c;h=58d43696416142914c109b1627ce6306dff6de96;hb=741f2c9898d4f398ddb2f1d8f33e97f0eedd676b;hp=598b650f917822f68c4665c9cc271fd6b2117f90;hpb=8847b9a03afd59a4d4f833be12937b38216799d3;p=oweals%2Fbusybox.git diff --git a/mount.c b/mount.c index 598b650f9..58d436964 100644 --- a/mount.c +++ b/mount.c @@ -43,7 +43,6 @@ * */ -#include "internal.h" #include #include #include @@ -54,22 +53,23 @@ #if defined BB_FEATURE_USE_DEVPS_PATCH #include /* For Erik's nifty devmtab device driver */ #endif - - -#define MS_MGC_VAL 0xc0ed0000 /* Magic number indicatng "new" flags */ -#define MS_RDONLY 1 /* Mount read-only */ -#define MS_NOSUID 2 /* Ignore suid and sgid bits */ -#define MS_NODEV 4 /* Disallow access to device special files */ -#define MS_NOEXEC 8 /* Disallow program execution */ -#define MS_SYNCHRONOUS 16 /* Writes are synced at once */ -#define MS_REMOUNT 32 /* Alter flags of a mounted FS */ -#define MS_MANDLOCK 64 /* Allow mandatory locks on an FS */ -#define S_QUOTA 128 /* Quota initialized for file/directory/symlink */ -#define S_APPEND 256 /* Append-only file */ -#define S_IMMUTABLE 512 /* Immutable file */ -#define MS_NOATIME 1024 /* Do not update access times. */ -#define MS_NODIRATIME 2048 /* Do not update directory access times */ - +#include "busybox.h" + +enum { + MS_MGC_VAL = 0xc0ed0000, /* Magic number indicatng "new" flags */ + MS_RDONLY = 1, /* Mount read-only */ + MS_NOSUID = 2, /* Ignore suid and sgid bits */ + MS_NODEV = 4, /* Disallow access to device special files */ + MS_NOEXEC = 8, /* Disallow program execution */ + MS_SYNCHRONOUS = 16, /* Writes are synced at once */ + MS_REMOUNT = 32, /* Alter flags of a mounted FS */ + MS_MANDLOCK = 64, /* Allow mandatory locks on an FS */ + S_QUOTA = 128, /* Quota initialized for file/directory/symlink */ + S_APPEND = 256, /* Append-only file */ + S_IMMUTABLE = 512, /* Immutable file */ + MS_NOATIME = 1024, /* Do not update access times. */ + MS_NODIRATIME = 2048, /* Do not update directory access times */ +}; #if defined BB_FEATURE_MOUNT_LOOP @@ -84,6 +84,11 @@ extern int mount (__const char *__special_file, __const char *__dir, extern int umount (__const char *__special_file); extern int umount2 (__const char *__special_file, int __flags); +#include +#include +static int sysfs( int option, unsigned int fs_index, char * buf); +_syscall3(int, sysfs, int, option, unsigned int, fs_index, char *, buf); + extern const char mtab_file[]; /* Defined in utility.c */ @@ -128,26 +133,25 @@ do_mount(char *specialfile, char *dir, char *filesystemtype, #if defined BB_FEATURE_MOUNT_LOOP if (use_loop==TRUE) { int loro = flags & MS_RDONLY; - char *lofile = specialfile; + + lofile = specialfile; specialfile = find_unused_loop_device(); if (specialfile == NULL) { - errorMsg("Could not find a spare loop device\n"); - return (FALSE); + error_msg_and_die("Could not find a spare loop device"); } if (set_loop(specialfile, lofile, 0, &loro)) { - errorMsg("Could not setup loop device\n"); - return (FALSE); + error_msg_and_die("Could not setup loop device"); } if (!(flags & MS_RDONLY) && loro) { /* loop is ro, but wanted rw */ - errorMsg("WARNING: loop device is read-only\n"); + error_msg("WARNING: loop device is read-only"); flags &= ~MS_RDONLY; } } #endif status = mount(specialfile, dir, filesystemtype, flags, string_flags); if (errno == EROFS) { - errorMsg("%s is write-protected, mounting read-only\n", specialfile); + error_msg("%s is write-protected, mounting read-only", specialfile); status = mount(specialfile, dir, filesystemtype, flags |= MS_RDONLY, string_flags); } } @@ -173,7 +177,7 @@ do_mount(char *specialfile, char *dir, char *filesystemtype, #endif if (errno == EPERM) { - fatalError("permission denied. Are you root?\n"); + error_msg_and_die("permission denied. Are you root?"); } return (FALSE); @@ -227,90 +231,46 @@ parse_mount_options(char *options, int *flags, char *strflags) } } -int +static int mount_one(char *blockDevice, char *directory, char *filesystemType, unsigned long flags, char *string_flags, int useMtab, int fakeIt, char *mtab_opts, int whineOnErrors) { int status = 0; -#if defined BB_FEATURE_USE_PROCFS - char buf[255]; if (strcmp(filesystemType, "auto") == 0) { - FILE *f = fopen("/proc/filesystems", "r"); - - if (f == NULL) - return (FALSE); - - while (fgets(buf, sizeof(buf), f) != NULL) { - filesystemType = buf; - if (*filesystemType == '\t') { // Not a nodev filesystem - - // Add NULL termination to each line - while (*filesystemType && *filesystemType != '\n') - filesystemType++; - *filesystemType = '\0'; - - filesystemType = buf; - filesystemType++; // hop past tab - + static const char *strings[] = { "tmpfs", "shm", "proc", "ramfs", "devpts", 0 }; + const char** nodevfss; + const int num_of_filesystems = sysfs(3, 0, 0); + char buf[255]; + int i=0; + + filesystemType=buf; + + while(i < num_of_filesystems) { + sysfs(2, i++, filesystemType); + for (nodevfss = strings; *nodevfss; nodevfss++) { + if (!strcmp(filesystemType, *nodevfss)) { + break; + } + } + if (!*nodevfss) { status = do_mount(blockDevice, directory, filesystemType, - flags | MS_MGC_VAL, string_flags, - useMtab, fakeIt, mtab_opts); + flags | MS_MGC_VAL, string_flags, + useMtab, fakeIt, mtab_opts); if (status == TRUE) break; } } - fclose(f); - } else -#endif -#if defined BB_FEATURE_USE_DEVPS_PATCH - if (strcmp(filesystemType, "auto") == 0) { - int fd, i, numfilesystems; - char device[] = "/dev/mtab"; - struct k_fstype *fslist; - - /* open device */ - fd = open(device, O_RDONLY); - if (fd < 0) - fatalError("open failed for `%s': %s\n", device, strerror (errno)); - - /* How many filesystems? We need to know to allocate enough space */ - numfilesystems = ioctl (fd, DEVMTAB_COUNT_FILESYSTEMS); - if (numfilesystems<0) - fatalError("\nDEVMTAB_COUNT_FILESYSTEMS: %s\n", strerror (errno)); - fslist = (struct k_fstype *) xcalloc ( numfilesystems, sizeof(struct k_fstype)); - - /* Grab the list of available filesystems */ - status = ioctl (fd, DEVMTAB_GET_FILESYSTEMS, fslist); - if (status<0) - fatalError("\nDEVMTAB_GET_FILESYSTEMS: %s\n", strerror (errno)); - - /* Walk the list trying to mount filesystems - * that do not claim to be nodev filesystems */ - for( i = 0 ; i < numfilesystems ; i++) { - if (fslist[i].mnt_nodev) - continue; - status = do_mount(blockDevice, directory, fslist[i].mnt_type, - flags | MS_MGC_VAL, string_flags, - useMtab, fakeIt, mtab_opts); - if (status == TRUE) - break; - } - free( fslist); - close(fd); - } else -#endif - { + } else { status = do_mount(blockDevice, directory, filesystemType, - flags | MS_MGC_VAL, string_flags, useMtab, - fakeIt, mtab_opts); + flags | MS_MGC_VAL, string_flags, useMtab, + fakeIt, mtab_opts); } if (status == FALSE) { if (whineOnErrors == TRUE) { - errorMsg("Mounting %s on %s failed: %s\n", - blockDevice, directory, strerror(errno)); + perror_msg("Mounting %s on %s failed", blockDevice, directory); } return (FALSE); } @@ -330,7 +290,7 @@ extern int mount_main(int argc, char **argv) int fakeIt = FALSE; int useMtab = TRUE; int i; - int rc = FALSE; + int rc = EXIT_FAILURE; int fstabmount = FALSE; #if defined BB_FEATURE_USE_DEVPS_PATCH @@ -342,21 +302,21 @@ extern int mount_main(int argc, char **argv) /* open device */ fd = open(device, O_RDONLY); if (fd < 0) - fatalError("open failed for `%s': %s\n", device, strerror (errno)); + perror_msg_and_die("open failed for `%s'", device); /* How many mounted filesystems? We need to know to * allocate enough space for later... */ numfilesystems = ioctl (fd, DEVMTAB_COUNT_MOUNTS); if (numfilesystems<0) - fatalError( "\nDEVMTAB_COUNT_MOUNTS: %s\n", strerror (errno)); + perror_msg_and_die( "\nDEVMTAB_COUNT_MOUNTS"); mntentlist = (struct k_mntent *) xcalloc ( numfilesystems, sizeof(struct k_mntent)); /* Grab the list of mounted filesystems */ if (ioctl (fd, DEVMTAB_GET_MOUNTS, mntentlist)<0) - fatalError( "\nDEVMTAB_GET_MOUNTS: %s\n", strerror (errno)); + perror_msg_and_die( "\nDEVMTAB_GET_MOUNTS"); for( i = 0 ; i < numfilesystems ; i++) { - fprintf( stdout, "%s %s %s %s %d %d\n", mntentlist[i].mnt_fsname, + printf( "%s %s %s %s %d %d\n", mntentlist[i].mnt_fsname, mntentlist[i].mnt_dir, mntentlist[i].mnt_type, mntentlist[i].mnt_opts, mntentlist[i].mnt_freq, mntentlist[i].mnt_passno); @@ -367,7 +327,7 @@ extern int mount_main(int argc, char **argv) free( mntentlist); close(fd); #endif - exit(TRUE); + return EXIT_SUCCESS; } #else if (argc == 1) { @@ -386,9 +346,9 @@ extern int mount_main(int argc, char **argv) } endmntent(mountTable); } else { - perror(mtab_file); + perror_msg_and_die("%s", mtab_file); } - exit(TRUE); + return EXIT_SUCCESS; } #endif @@ -455,7 +415,7 @@ extern int mount_main(int argc, char **argv) fstabmount = TRUE; if (f == NULL) - fatalError( "\nCannot read /etc/fstab: %s\n", strerror (errno)); + perror_msg_and_die( "\nCannot read /etc/fstab"); while ((m = getmntent(f)) != NULL) { if (all == FALSE && directory == NULL && ( @@ -480,26 +440,26 @@ extern int mount_main(int argc, char **argv) device = strdup(m->mnt_fsname); directory = strdup(m->mnt_dir); filesystemType = strdup(m->mnt_type); + string_flags = strdup(string_flags); singlemount: + rc = EXIT_SUCCESS; #ifdef BB_NFSMOUNT if (strchr(device, ':') != NULL) filesystemType = "nfs"; if (strcmp(filesystemType, "nfs") == 0) { - rc = nfsmount (device, directory, &flags, - &extra_opts, &string_flags, 1); - if ( rc != 0) { - fatalError("nfsmount failed: %s\n", strerror(errno)); - rc = FALSE; + if (nfsmount (device, directory, &flags, &extra_opts, + &string_flags, 1)) { + perror_msg("nfsmount failed"); + rc = EXIT_FAILURE; } } #endif - rc = mount_one(device, directory, filesystemType, flags, - string_flags, useMtab, fakeIt, extra_opts, TRUE); + if (!mount_one(device, directory, filesystemType, flags, + string_flags, useMtab, fakeIt, extra_opts, TRUE)) + rc = EXIT_FAILURE; if (all == FALSE) break; - - rc = TRUE; // Always return 0 for 'all' } if (fstabmount == TRUE) endmntent(f); @@ -507,13 +467,11 @@ singlemount: if (all == FALSE && fstabmount == TRUE && directory == NULL) fprintf(stderr, "Can't find %s in /etc/fstab\n", device); - exit(rc); + return rc; } goto singlemount; - exit(FALSE); - goodbye: - usage(mount_usage); + show_usage(); }