S_IMMUTABLE = 512, /* Immutable file */
MS_NOATIME = 1024, /* Do not update access times. */
MS_NODIRATIME = 2048, /* Do not update directory access times */
+ MS_BIND = 4096, /* Use the new linux 2.4.x "mount --bind" feature */
};
{"rw", ~MS_RDONLY, 0},
{"suid", ~MS_NOSUID, 0},
{"sync", ~0, MS_SYNCHRONOUS},
+ {"bind", ~0, MS_BIND},
{0, 0, 0}
};
static int
do_mount(char *specialfile, char *dir, char *filesystemtype,
long flags, void *string_flags, int useMtab, int fakeIt,
- char *mtab_opts)
+ char *mtab_opts, int mount_all)
{
int status = 0;
#if defined BB_FEATURE_MOUNT_LOOP
}
if (!(flags & MS_RDONLY) && loro) { /* loop is ro, but wanted rw */
error_msg("WARNING: loop device is read-only");
- flags &= ~MS_RDONLY;
+ flags |= MS_RDONLY;
}
}
#endif
status = mount(specialfile, dir, filesystemtype, flags, string_flags);
- if (errno == EROFS) {
+ if (status < 0 && errno == EROFS) {
error_msg("%s is write-protected, mounting read-only", specialfile);
status = mount(specialfile, dir, filesystemtype, flags |= MS_RDONLY, string_flags);
}
+ /* Don't whine about already mounted filesystems when mounting all. */
+ if (status < 0 && errno == EBUSY && mount_all)
+ return TRUE;
}
}
}
-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)
+ char *mtab_opts, int whineOnErrors, int mount_all)
{
int status = 0;
if (!*noauto_fstype) {
status = do_mount(blockDevice, directory, filesystemType,
flags | MS_MGC_VAL, string_flags,
- useMtab, fakeIt, mtab_opts);
+ useMtab, fakeIt, mtab_opts, mount_all);
if (status == TRUE)
break;
}
} else {
status = do_mount(blockDevice, directory, filesystemType,
flags | MS_MGC_VAL, string_flags, useMtab,
- fakeIt, mtab_opts);
+ fakeIt, mtab_opts, mount_all);
}
if (status == FALSE) {
while ((m = getmntent(mountTable)) != 0) {
char *blockDevice = m->mnt_fsname;
if (strcmp(blockDevice, "/dev/root") == 0) {
- find_real_root_device_name( blockDevice);
+ blockDevice = find_real_root_device_name(blockDevice);
}
printf("%s on %s type %s (%s)\n", blockDevice, m->mnt_dir,
m->mnt_type, m->mnt_opts);
+#ifdef BB_FEATURE_CLEAN_UP
+ if(blockDevice != m->mnt_fsname)
+ free(blockDevice);
+#endif
}
endmntent(mountTable);
} else {
if (optind < argc) {
/* if device is a filename get its real path */
- if ((strchr(argv[optind], ':') == NULL) &&
- (stat(argv[optind], &statbuf) == 0)) {
+ if (stat(argv[optind], &statbuf) == 0) {
realpath(argv[optind], device);
} else {
safe_strncpy(device, argv[optind], PATH_MAX);
}
#endif
if (!mount_one(device, directory, filesystemType, flags,
- string_flags, useMtab, fakeIt, extra_opts, TRUE))
+ string_flags, useMtab, fakeIt, extra_opts, TRUE, all))
rc = EXIT_FAILURE;
if (all == FALSE)