* Mini mount implementation for busybox
*
* Copyright (C) 1995, 1996 by Bruce Perens <bruce@pixar.com>.
+ * Copyright (C) 1999-2002 by Erik Andersen <andersee@debian.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
#include <mntent.h>
#include <ctype.h>
#include "busybox.h"
-#if defined BB_FEATURE_USE_DEVPS_PATCH
+#if defined CONFIG_FEATURE_USE_DEVPS_PATCH
# include <linux/devmtab.h> /* For Erik's nifty devmtab device driver */
#endif
};
-#if defined BB_FEATURE_MOUNT_LOOP
+#if defined CONFIG_FEATURE_MOUNT_LOOP
#include <fcntl.h>
#include <sys/ioctl.h>
static int use_loop = FALSE;
{"async", ~MS_SYNCHRONOUS, 0},
{"atime", ~0, ~MS_NOATIME},
{"defaults", ~0, 0},
+ {"noauto", ~0, 0},
{"dev", ~MS_NODEV, 0},
{"diratime", ~0, ~MS_NODIRATIME},
{"exec", ~MS_NOEXEC, 0},
char *mtab_opts, int mount_all)
{
int status = 0;
-#if defined BB_FEATURE_MOUNT_LOOP
+#if defined CONFIG_FEATURE_MOUNT_LOOP
char *lofile = NULL;
#endif
- if (fakeIt == FALSE)
+ if (! fakeIt)
{
-#if defined BB_FEATURE_MOUNT_LOOP
+#if defined CONFIG_FEATURE_MOUNT_LOOP
if (use_loop==TRUE) {
int loro = flags & MS_RDONLY;
/* If the mount was sucessful, do anything needed, then return TRUE */
if (status == 0 || fakeIt==TRUE) {
-#if defined BB_FEATURE_MTAB_SUPPORT
- if (useMtab == TRUE) {
+#if defined CONFIG_FEATURE_MTAB_SUPPORT
+ if (useMtab) {
erase_mtab(specialfile); // Clean any stale entries
write_mtab(specialfile, dir, filesystemtype, flags, mtab_opts);
}
}
/* Bummer. mount failed. Clean up */
-#if defined BB_FEATURE_MOUNT_LOOP
+#if defined CONFIG_FEATURE_MOUNT_LOOP
if (lofile != NULL) {
del_loop(specialfile);
}
}
f++;
}
-#if defined BB_FEATURE_MOUNT_LOOP
- if (gotone == FALSE && !strcasecmp("loop", options)) { /* loop device support */
+#if defined CONFIG_FEATURE_MOUNT_LOOP
+ if (! gotone && !strcasecmp("loop", options)) { /* loop device support */
use_loop = TRUE;
gotone = TRUE;
}
#endif
- if (*strflags && strflags != '\0' && gotone == FALSE) {
+ if (*strflags && strflags != '\0' && ! gotone) {
char *temp = strflags;
temp += strlen(strflags);
*temp++ = ',';
*temp++ = '\0';
}
- if (gotone == FALSE)
+ if (! gotone)
strcat(strflags, options);
if (comma) {
*comma = ',';
}
}
-extern 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 mount_all)
{
int status = 0;
+#if defined CONFIG_FEATURE_USE_DEVPS_PATCH
if (strcmp(filesystemType, "auto") == 0) {
- static const char *noauto_array[] = { "tmpfs", "shm", "proc", "ramfs", "devpts", "devfs", 0 };
+ static const char *noauto_array[] = { "tmpfs", "shm", "proc", "ramfs", "devpts", "devfs", "usbdevfs", 0 };
const char **noauto_fstype;
const int num_of_filesystems = sysfs(3, 0, 0);
char buf[255];
status = do_mount(blockDevice, directory, filesystemType,
flags | MS_MGC_VAL, string_flags,
useMtab, fakeIt, mtab_opts, mount_all);
- if (status == TRUE)
+ if (status)
break;
}
}
- } else {
+ }
+#else
+ if (strcmp(filesystemType, "auto") == 0) {
+ char buf[255];
+ FILE *f = xfopen("/proc/filesystems", "r");
+
+ 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
+
+ status = do_mount(blockDevice, directory, filesystemType,
+ flags | MS_MGC_VAL, string_flags,
+ useMtab, fakeIt, mtab_opts, mount_all);
+ if (status)
+ break;
+ }
+ }
+ fclose(f);
+ }
+#endif
+ else {
status = do_mount(blockDevice, directory, filesystemType,
flags | MS_MGC_VAL, string_flags, useMtab,
fakeIt, mtab_opts, mount_all);
}
- if (status == FALSE) {
- if (whineOnErrors == TRUE) {
+ if (! status) {
+ if (whineOnErrors) {
perror_msg("Mounting %s on %s failed", blockDevice, directory);
}
return (FALSE);
return (TRUE);
}
-void show_mounts()
+void show_mounts(void)
{
-#if defined BB_FEATURE_USE_DEVPS_PATCH
+#if defined CONFIG_FEATURE_USE_DEVPS_PATCH
int fd, i, numfilesystems;
char device[] = "/dev/mtab";
struct k_mntent *mntentlist;
mntentlist[i].mnt_opts, mntentlist[i].mnt_freq,
mntentlist[i].mnt_passno);
}
-#ifdef BB_FEATURE_CLEAN_UP
+#ifdef CONFIG_FEATURE_CLEAN_UP
/* Don't bother to close files or free memory. Exit
* does that automagically, so we can save a few bytes */
free( mntentlist);
}
printf("%s on %s type %s (%s)\n", blockDevice, m->mnt_dir,
m->mnt_type, m->mnt_opts);
-#ifdef BB_FEATURE_CLEAN_UP
+#ifdef CONFIG_FEATURE_CLEAN_UP
if(blockDevice != m->mnt_fsname)
free(blockDevice);
#endif
case 'f':
fakeIt = TRUE;
break;
-#ifdef BB_FEATURE_MTAB_SUPPORT
+#ifdef CONFIG_FEATURE_MTAB_SUPPORT
case 'n':
useMtab = FALSE;
break;
if (optind < argc) {
/* if device is a filename get its real path */
if (stat(argv[optind], &statbuf) == 0) {
- realpath(argv[optind], device);
+ char *tmp = simplify_path(argv[optind]);
+ safe_strncpy(device, tmp, PATH_MAX);
} else {
safe_strncpy(device, argv[optind], PATH_MAX);
}
}
- if (optind + 1 < argc) {
- if (realpath(argv[optind + 1], directory) == NULL) {
- perror_msg_and_die("%s", directory);
- }
- }
-
- if (all == TRUE || optind + 1 == argc) {
+ if (optind + 1 < argc)
+ directory = simplify_path(argv[optind + 1]);
+
+ if (all || optind + 1 == argc) {
struct mntent *m = NULL;
FILE *f = setmntent("/etc/fstab", "r");
fstabmount = TRUE;
perror_msg_and_die( "\nCannot read /etc/fstab");
while ((m = getmntent(f)) != NULL) {
- if (all == FALSE && optind + 1 == argc && (
+ if (! all && optind + 1 == argc && (
(strcmp(device, m->mnt_fsname) != 0) &&
(strcmp(device, m->mnt_dir) != 0) ) ) {
continue;
}
- if (all == TRUE && ( // If we're mounting 'all'
+ if (all && ( // If we're mounting 'all'
(strstr(m->mnt_opts, "noauto")) || // and the file system isn't noauto,
(strstr(m->mnt_type, "swap")) || // and isn't swap or nfs, then mount it
(strstr(m->mnt_type, "nfs")) ) ) {
continue;
}
- if (all == TRUE || flags == 0) { // Allow single mount to override fstab flags
+ if (all || flags == 0) { // Allow single mount to override fstab flags
flags = 0;
+ string_flags = string_flags_buf;
*string_flags = '\0';
parse_mount_options(m->mnt_opts, &flags, string_flags);
}
strcpy(device, m->mnt_fsname);
strcpy(directory, m->mnt_dir);
- filesystemType = strdup(m->mnt_type);
+ filesystemType = xstrdup(m->mnt_type);
singlemount:
- string_flags = strdup(string_flags);
+ string_flags = xstrdup(string_flags);
rc = EXIT_SUCCESS;
-#ifdef BB_NFSMOUNT
- if (strchr(device, ':') != NULL)
+#ifdef CONFIG_NFSMOUNT
+ if (strchr(device, ':') != NULL) {
filesystemType = "nfs";
- if (strcmp(filesystemType, "nfs") == 0) {
if (nfsmount (device, directory, &flags, &extra_opts,
&string_flags, 1)) {
perror_msg("nfsmount failed");
string_flags, useMtab, fakeIt, extra_opts, TRUE, all))
rc = EXIT_FAILURE;
- if (all == FALSE)
+ if (! all)
break;
}
- if (fstabmount == TRUE)
+ if (fstabmount)
endmntent(f);
- if (all == FALSE && fstabmount == TRUE && m == NULL)
+ if (! all && fstabmount && m == NULL)
fprintf(stderr, "Can't find %s in /etc/fstab\n", device);
return rc;