X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=mount.c;h=5b6ec1e71ff64c834e8858878f84dfe42666eb0c;hb=4949faf4b2090ca23c2aeb34535fdbe57754913a;hp=b571e5035c658a3edd2ad20c8a271a02ab77451c;hpb=dd19c6990496023fe23fefef8f1798740f7d39c6;p=oweals%2Fbusybox.git diff --git a/mount.c b/mount.c index b571e5035..5b6ec1e71 100644 --- a/mount.c +++ b/mount.c @@ -43,7 +43,6 @@ * */ -#include "busybox.h" #include #include #include @@ -54,6 +53,7 @@ #if defined BB_FEATURE_USE_DEVPS_PATCH #include /* For Erik's nifty devmtab device driver */ #endif +#include "busybox.h" enum { MS_MGC_VAL = 0xc0ed0000, /* Magic number indicatng "new" flags */ @@ -84,6 +84,7 @@ 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); +extern int sysfs( int option, unsigned int fs_index, char * buf); extern const char mtab_file[]; /* Defined in utility.c */ @@ -128,7 +129,8 @@ 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) { @@ -154,7 +156,7 @@ do_mount(char *specialfile, char *dir, char *filesystemtype, /* If the mount was sucessful, do anything needed, then return TRUE */ if (status == 0 || fakeIt==TRUE) { -#if defined BB_MTAB +#if defined BB_FEATURE_MTAB_SUPPORT if (useMtab == TRUE) { erase_mtab(specialfile); // Clean any stale entries write_mtab(specialfile, dir, filesystemtype, flags, mtab_opts); @@ -225,84 +227,41 @@ parse_mount_options(char *options, int *flags, char *strflags) } } -int +extern 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 *noauto_array[] = { "tmpfs", "shm", "proc", "ramfs", "devpts", "devfs", 0 }; + const char **noauto_fstype; + 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 (noauto_fstype = noauto_array; *noauto_fstype; noauto_fstype++) { + if (!strcmp(filesystemType, *noauto_fstype)) { + break; + } + } + if (!*noauto_fstype) { 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) - perror_msg_and_die("open failed for `%s'", device); - - /* How many filesystems? We need to know to allocate enough space */ - numfilesystems = ioctl (fd, DEVMTAB_COUNT_FILESYSTEMS); - if (numfilesystems<0) - perror_msg_and_die("\nDEVMTAB_COUNT_FILESYSTEMS"); - 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) - perror_msg_and_die("\nDEVMTAB_GET_FILESYSTEMS"); - - /* 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) { @@ -422,7 +381,7 @@ extern int mount_main(int argc, char **argv) case 'f': fakeIt = TRUE; break; -#ifdef BB_MTAB +#ifdef BB_FEATURE_MTAB_SUPPORT case 'n': useMtab = FALSE; break; @@ -478,15 +437,15 @@ extern int mount_main(int argc, char **argv) directory = strdup(m->mnt_dir); filesystemType = strdup(m->mnt_type); singlemount: + string_flags = strdup(string_flags); 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) { - perror_msg_and_die("nfsmount failed"); + if (nfsmount (device, directory, &flags, &extra_opts, + &string_flags, 1)) { + perror_msg("nfsmount failed"); rc = EXIT_FAILURE; } } @@ -504,11 +463,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; goodbye: - usage(mount_usage); + show_usage(); }