*
*/
+#include <limits.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
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}
};
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 {
extern int mount_main(int argc, char **argv)
{
+ struct stat statbuf;
char string_flags_buf[1024] = "";
char *string_flags = string_flags_buf;
char *extra_opts = string_flags_buf;
int flags = 0;
char *filesystemType = "auto";
- char *device = NULL;
- char *directory = NULL;
+ char *device = xmalloc(PATH_MAX);
+ char *directory = xmalloc(PATH_MAX);
int all = FALSE;
int fakeIt = FALSE;
int useMtab = TRUE;
}
}
- if (argv[optind] != NULL) {
- device = argv[optind];
- directory = argv[optind + 1];
- }
-
- if (device == NULL && !all)
+ if (!all && optind == argc)
show_mounts();
- if (all == TRUE || directory == NULL) {
- struct mntent *m;
+ if (optind < argc) {
+ /* if device is a filename get its real path */
+ if (stat(argv[optind], &statbuf) == 0) {
+ realpath(argv[optind], device);
+ } 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) {
+ 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 && directory == NULL && (
+ if (all == FALSE && optind + 1 == argc && (
(strcmp(device, m->mnt_fsname) != 0) &&
(strcmp(device, m->mnt_dir) != 0) ) ) {
continue;
parse_mount_options(m->mnt_opts, &flags, string_flags);
}
- device = strdup(m->mnt_fsname);
- directory = strdup(m->mnt_dir);
+ strcpy(device, m->mnt_fsname);
+ strcpy(directory, m->mnt_dir);
filesystemType = strdup(m->mnt_type);
singlemount:
string_flags = strdup(string_flags);
if (fstabmount == TRUE)
endmntent(f);
- if (all == FALSE && fstabmount == TRUE && directory == NULL)
+ if (all == FALSE && fstabmount == TRUE && m == NULL)
fprintf(stderr, "Can't find %s in /etc/fstab\n", device);
return rc;