diff options
Diffstat (limited to 'util-linux')
-rw-r--r-- | util-linux/mount.c | 230 |
1 files changed, 120 insertions, 110 deletions
diff --git a/util-linux/mount.c b/util-linux/mount.c index df6b3a822..873d27eb5 100644 --- a/util-linux/mount.c +++ b/util-linux/mount.c | |||
@@ -54,24 +54,24 @@ | |||
54 | #include <ctype.h> | 54 | #include <ctype.h> |
55 | #include "busybox.h" | 55 | #include "busybox.h" |
56 | #if defined CONFIG_FEATURE_USE_DEVPS_PATCH | 56 | #if defined CONFIG_FEATURE_USE_DEVPS_PATCH |
57 | # include <linux/devmtab.h> /* For Erik's nifty devmtab device driver */ | 57 | # include <linux/devmtab.h> /* For Erik's nifty devmtab device driver */ |
58 | #endif | 58 | #endif |
59 | 59 | ||
60 | enum { | 60 | enum { |
61 | MS_MGC_VAL = 0xc0ed0000, /* Magic number indicatng "new" flags */ | 61 | MS_MGC_VAL = 0xc0ed0000, /* Magic number indicatng "new" flags */ |
62 | MS_RDONLY = 1, /* Mount read-only */ | 62 | MS_RDONLY = 1, /* Mount read-only */ |
63 | MS_NOSUID = 2, /* Ignore suid and sgid bits */ | 63 | MS_NOSUID = 2, /* Ignore suid and sgid bits */ |
64 | MS_NODEV = 4, /* Disallow access to device special files */ | 64 | MS_NODEV = 4, /* Disallow access to device special files */ |
65 | MS_NOEXEC = 8, /* Disallow program execution */ | 65 | MS_NOEXEC = 8, /* Disallow program execution */ |
66 | MS_SYNCHRONOUS = 16, /* Writes are synced at once */ | 66 | MS_SYNCHRONOUS = 16, /* Writes are synced at once */ |
67 | MS_REMOUNT = 32, /* Alter flags of a mounted FS */ | 67 | MS_REMOUNT = 32, /* Alter flags of a mounted FS */ |
68 | MS_MANDLOCK = 64, /* Allow mandatory locks on an FS */ | 68 | MS_MANDLOCK = 64, /* Allow mandatory locks on an FS */ |
69 | S_QUOTA = 128, /* Quota initialized for file/directory/symlink */ | 69 | S_QUOTA = 128, /* Quota initialized for file/directory/symlink */ |
70 | S_APPEND = 256, /* Append-only file */ | 70 | S_APPEND = 256, /* Append-only file */ |
71 | S_IMMUTABLE = 512, /* Immutable file */ | 71 | S_IMMUTABLE = 512, /* Immutable file */ |
72 | MS_NOATIME = 1024, /* Do not update access times. */ | 72 | MS_NOATIME = 1024, /* Do not update access times. */ |
73 | MS_NODIRATIME = 2048, /* Do not update directory access times */ | 73 | MS_NODIRATIME = 2048, /* Do not update directory access times */ |
74 | MS_BIND = 4096, /* Use the new linux 2.4.x "mount --bind" feature */ | 74 | MS_BIND = 4096, /* Use the new linux 2.4.x "mount --bind" feature */ |
75 | }; | 75 | }; |
76 | 76 | ||
77 | 77 | ||
@@ -81,13 +81,13 @@ enum { | |||
81 | static int use_loop = FALSE; | 81 | static int use_loop = FALSE; |
82 | #endif | 82 | #endif |
83 | 83 | ||
84 | extern int mount (__const char *__special_file, __const char *__dir, | 84 | extern int mount(__const char *__special_file, __const char *__dir, |
85 | __const char *__fstype, unsigned long int __rwflag, | 85 | __const char *__fstype, unsigned long int __rwflag, |
86 | __const void *__data); | 86 | __const void *__data); |
87 | extern int umount (__const char *__special_file); | 87 | extern int umount(__const char *__special_file); |
88 | extern int umount2 (__const char *__special_file, int __flags); | 88 | extern int umount2(__const char *__special_file, int __flags); |
89 | 89 | ||
90 | extern int sysfs( int option, unsigned int fs_index, char * buf); | 90 | extern int sysfs(int option, unsigned int fs_index, char *buf); |
91 | 91 | ||
92 | extern const char mtab_file[]; /* Defined in utility.c */ | 92 | extern const char mtab_file[]; /* Defined in utility.c */ |
93 | 93 | ||
@@ -125,16 +125,16 @@ do_mount(char *specialfile, char *dir, char *filesystemtype, | |||
125 | char *mtab_opts, int mount_all) | 125 | char *mtab_opts, int mount_all) |
126 | { | 126 | { |
127 | int status = 0; | 127 | int status = 0; |
128 | |||
128 | #if defined CONFIG_FEATURE_MOUNT_LOOP | 129 | #if defined CONFIG_FEATURE_MOUNT_LOOP |
129 | char *lofile = NULL; | 130 | char *lofile = NULL; |
130 | #endif | 131 | #endif |
131 | 132 | ||
132 | if (! fakeIt) | 133 | if (!fakeIt) { |
133 | { | ||
134 | #if defined CONFIG_FEATURE_MOUNT_LOOP | 134 | #if defined CONFIG_FEATURE_MOUNT_LOOP |
135 | if (use_loop==TRUE) { | 135 | if (use_loop == TRUE) { |
136 | int loro = flags & MS_RDONLY; | 136 | int loro = flags & MS_RDONLY; |
137 | 137 | ||
138 | lofile = specialfile; | 138 | lofile = specialfile; |
139 | 139 | ||
140 | specialfile = find_unused_loop_device(); | 140 | specialfile = find_unused_loop_device(); |
@@ -152,8 +152,10 @@ do_mount(char *specialfile, char *dir, char *filesystemtype, | |||
152 | #endif | 152 | #endif |
153 | status = mount(specialfile, dir, filesystemtype, flags, string_flags); | 153 | status = mount(specialfile, dir, filesystemtype, flags, string_flags); |
154 | if (status < 0 && errno == EROFS) { | 154 | if (status < 0 && errno == EROFS) { |
155 | error_msg("%s is write-protected, mounting read-only", specialfile); | 155 | error_msg("%s is write-protected, mounting read-only", |
156 | status = mount(specialfile, dir, filesystemtype, flags |= MS_RDONLY, string_flags); | 156 | specialfile); |
157 | status = mount(specialfile, dir, filesystemtype, flags |= | ||
158 | MS_RDONLY, string_flags); | ||
157 | } | 159 | } |
158 | /* Don't whine about already mounted filesystems when mounting all. */ | 160 | /* Don't whine about already mounted filesystems when mounting all. */ |
159 | if (status < 0 && errno == EBUSY && mount_all) | 161 | if (status < 0 && errno == EBUSY && mount_all) |
@@ -162,11 +164,11 @@ do_mount(char *specialfile, char *dir, char *filesystemtype, | |||
162 | 164 | ||
163 | 165 | ||
164 | /* If the mount was sucessful, do anything needed, then return TRUE */ | 166 | /* If the mount was sucessful, do anything needed, then return TRUE */ |
165 | if (status == 0 || fakeIt==TRUE) { | 167 | if (status == 0 || fakeIt == TRUE) { |
166 | 168 | ||
167 | #if defined CONFIG_FEATURE_MTAB_SUPPORT | 169 | #if defined CONFIG_FEATURE_MTAB_SUPPORT |
168 | if (useMtab) { | 170 | if (useMtab) { |
169 | erase_mtab(specialfile); // Clean any stale entries | 171 | erase_mtab(specialfile); /* Clean any stale entries */ |
170 | write_mtab(specialfile, dir, filesystemtype, flags, mtab_opts); | 172 | write_mtab(specialfile, dir, filesystemtype, flags, mtab_opts); |
171 | } | 173 | } |
172 | #endif | 174 | #endif |
@@ -190,13 +192,12 @@ do_mount(char *specialfile, char *dir, char *filesystemtype, | |||
190 | 192 | ||
191 | static void paste_str(char **s1, const char *s2) | 193 | static void paste_str(char **s1, const char *s2) |
192 | { | 194 | { |
193 | *s1 = xrealloc(*s1, strlen(*s1)+strlen(s2)+1); | 195 | *s1 = xrealloc(*s1, strlen(*s1) + strlen(s2) + 1); |
194 | strcat(*s1, s2); | 196 | strcat(*s1, s2); |
195 | } | 197 | } |
196 | 198 | ||
197 | /* Seperate standard mount options from the nonstandard string options */ | 199 | /* Seperate standard mount options from the nonstandard string options */ |
198 | static void | 200 | static void parse_mount_options(char *options, int *flags, char **strflags) |
199 | parse_mount_options(char *options, int *flags, char **strflags) | ||
200 | { | 201 | { |
201 | while (options) { | 202 | while (options) { |
202 | int gotone = FALSE; | 203 | int gotone = FALSE; |
@@ -217,13 +218,13 @@ parse_mount_options(char *options, int *flags, char **strflags) | |||
217 | f++; | 218 | f++; |
218 | } | 219 | } |
219 | #if defined CONFIG_FEATURE_MOUNT_LOOP | 220 | #if defined CONFIG_FEATURE_MOUNT_LOOP |
220 | if (!strcasecmp("loop", options)) { /* loop device support */ | 221 | if (!strcasecmp("loop", options)) { /* loop device support */ |
221 | use_loop = TRUE; | 222 | use_loop = TRUE; |
222 | gotone = TRUE; | 223 | gotone = TRUE; |
223 | } | 224 | } |
224 | #endif | 225 | #endif |
225 | if (! gotone) { | 226 | if (!gotone) { |
226 | if (**strflags) /* have previous parsed options */ | 227 | if (**strflags) /* have previous parsed options */ |
227 | paste_str(strflags, ","); | 228 | paste_str(strflags, ","); |
228 | paste_str(strflags, options); | 229 | paste_str(strflags, options); |
229 | } | 230 | } |
@@ -245,81 +246,85 @@ mount_one(char *blockDevice, char *directory, char *filesystemType, | |||
245 | 246 | ||
246 | #if defined CONFIG_FEATURE_USE_DEVPS_PATCH | 247 | #if defined CONFIG_FEATURE_USE_DEVPS_PATCH |
247 | if (strcmp(filesystemType, "auto") == 0) { | 248 | if (strcmp(filesystemType, "auto") == 0) { |
248 | static const char *noauto_array[] = { "tmpfs", "shm", "proc", "ramfs", "devpts", "devfs", "usbdevfs", 0 }; | 249 | static const char *noauto_array[] = |
250 | { "tmpfs", "shm", "proc", "ramfs", "devpts", "devfs", "usbdevfs", | ||
251 | 0 }; | ||
249 | const char **noauto_fstype; | 252 | const char **noauto_fstype; |
250 | const int num_of_filesystems = sysfs(3, 0, 0); | 253 | const int num_of_filesystems = sysfs(3, 0, 0); |
251 | char buf[255]; | 254 | char buf[255]; |
252 | int i=0; | 255 | int i = 0; |
253 | 256 | ||
254 | filesystemType=buf; | 257 | filesystemType = buf; |
255 | 258 | ||
256 | while(i < num_of_filesystems) { | 259 | while (i < num_of_filesystems) { |
257 | sysfs(2, i++, filesystemType); | 260 | sysfs(2, i++, filesystemType); |
258 | for (noauto_fstype = noauto_array; *noauto_fstype; noauto_fstype++) { | 261 | for (noauto_fstype = noauto_array; *noauto_fstype; |
262 | noauto_fstype++) { | ||
259 | if (!strcmp(filesystemType, *noauto_fstype)) { | 263 | if (!strcmp(filesystemType, *noauto_fstype)) { |
260 | break; | 264 | break; |
261 | } | 265 | } |
262 | } | 266 | } |
263 | if (!*noauto_fstype) { | 267 | if (!*noauto_fstype) { |
264 | status = do_mount(blockDevice, directory, filesystemType, | 268 | status = do_mount(blockDevice, directory, filesystemType, |
265 | flags | MS_MGC_VAL, string_flags, | 269 | flags | MS_MGC_VAL, string_flags, |
266 | useMtab, fakeIt, mtab_opts, mount_all); | 270 | useMtab, fakeIt, mtab_opts, mount_all); |
267 | if (status) | 271 | if (status) |
268 | break; | 272 | break; |
269 | } | 273 | } |
270 | } | 274 | } |
271 | } | 275 | } |
272 | #else | 276 | #else |
273 | if (strcmp(filesystemType, "auto") == 0) { | 277 | if (strcmp(filesystemType, "auto") == 0) { |
274 | char buf[255]; | 278 | char buf[255]; |
275 | FILE *f; | 279 | FILE *f; |
276 | int read_proc = 0; | 280 | int read_proc = 0; |
277 | 281 | ||
278 | f = fopen ( "/etc/filesystems", "r" ); | 282 | f = fopen("/etc/filesystems", "r"); |
279 | 283 | ||
280 | if ( f ) { | 284 | if (f) { |
281 | while ( fgets ( buf, sizeof( buf ), f )) { | 285 | while (fgets(buf, sizeof(buf), f)) { |
282 | if ( *buf == '*' ) | 286 | if (*buf == '*') |
283 | read_proc = 1; | 287 | read_proc = 1; |
284 | else if ( *buf == '#' ) | 288 | else if (*buf == '#') |
285 | continue; | 289 | continue; |
286 | else { | 290 | else { |
287 | filesystemType = buf; | 291 | filesystemType = buf; |
288 | 292 | ||
289 | // Add NULL termination to each line | 293 | /* Add NULL termination to each line */ |
290 | while (*filesystemType && !isspace ( *filesystemType )) | 294 | while (*filesystemType && !isspace(*filesystemType)) |
291 | filesystemType++; | 295 | filesystemType++; |
292 | *filesystemType = '\0'; | 296 | *filesystemType = '\0'; |
293 | 297 | ||
294 | filesystemType = buf; | 298 | filesystemType = buf; |
295 | 299 | ||
296 | if ( xstrlen ( filesystemType )) { | 300 | if (xstrlen(filesystemType)) { |
297 | status = do_mount(blockDevice, directory, filesystemType, | 301 | status = |
298 | flags | MS_MGC_VAL, string_flags, | 302 | do_mount(blockDevice, directory, filesystemType, |
299 | useMtab, fakeIt, mtab_opts, mount_all); | 303 | flags | MS_MGC_VAL, string_flags, |
304 | useMtab, fakeIt, mtab_opts, mount_all); | ||
300 | if (status) | 305 | if (status) |
301 | break; | 306 | break; |
302 | } | 307 | } |
303 | 308 | ||
304 | } | 309 | } |
305 | } | 310 | } |
306 | fclose ( f ); | 311 | fclose(f); |
307 | } | 312 | } |
308 | 313 | ||
309 | if (( !f || read_proc ) && !status ) { | 314 | if ((!f || read_proc) && !status) { |
310 | f = xfopen("/proc/filesystems", "r"); | 315 | f = xfopen("/proc/filesystems", "r"); |
311 | 316 | ||
312 | while (fgets(buf, sizeof(buf), f) != NULL) { | 317 | while (fgets(buf, sizeof(buf), f) != NULL) { |
313 | filesystemType = buf; | 318 | filesystemType = buf; |
314 | if (*filesystemType == '\t') { // Not a nodev filesystem | 319 | if (*filesystemType == '\t') { /* Not a nodev filesystem */ |
315 | 320 | ||
316 | // Add NULL termination to each line | 321 | /* Add NULL termination to each line */ |
317 | while (*filesystemType && *filesystemType != '\n') | 322 | while (*filesystemType && *filesystemType != '\n') |
318 | filesystemType++; | 323 | filesystemType++; |
319 | *filesystemType = '\0'; | 324 | *filesystemType = '\0'; |
320 | 325 | ||
321 | filesystemType = buf; | 326 | filesystemType = buf; |
322 | filesystemType++; // hop past tab | 327 | filesystemType++; /* hop past tab */ |
323 | 328 | ||
324 | status = do_mount(blockDevice, directory, filesystemType, | 329 | status = do_mount(blockDevice, directory, filesystemType, |
325 | flags | MS_MGC_VAL, string_flags, | 330 | flags | MS_MGC_VAL, string_flags, |
@@ -334,11 +339,11 @@ mount_one(char *blockDevice, char *directory, char *filesystemType, | |||
334 | #endif | 339 | #endif |
335 | else { | 340 | else { |
336 | status = do_mount(blockDevice, directory, filesystemType, | 341 | status = do_mount(blockDevice, directory, filesystemType, |
337 | flags | MS_MGC_VAL, string_flags, useMtab, | 342 | flags | MS_MGC_VAL, string_flags, useMtab, |
338 | fakeIt, mtab_opts, mount_all); | 343 | fakeIt, mtab_opts, mount_all); |
339 | } | 344 | } |
340 | 345 | ||
341 | if (! status) { | 346 | if (!status) { |
342 | if (whineOnErrors) { | 347 | if (whineOnErrors) { |
343 | perror_msg("Mounting %s on %s failed", blockDevice, directory); | 348 | perror_msg("Mounting %s on %s failed", blockDevice, directory); |
344 | } | 349 | } |
@@ -354,34 +359,35 @@ static void show_mounts(char *onlytype) | |||
354 | char device[] = "/dev/mtab"; | 359 | char device[] = "/dev/mtab"; |
355 | struct k_mntent *mntentlist; | 360 | struct k_mntent *mntentlist; |
356 | 361 | ||
357 | /* open device */ | 362 | /* open device */ |
358 | fd = open(device, O_RDONLY); | 363 | fd = open(device, O_RDONLY); |
359 | if (fd < 0) | 364 | if (fd < 0) |
360 | perror_msg_and_die("open failed for `%s'", device); | 365 | perror_msg_and_die("open failed for `%s'", device); |
361 | 366 | ||
362 | /* How many mounted filesystems? We need to know to | 367 | /* How many mounted filesystems? We need to know to |
363 | * allocate enough space for later... */ | 368 | * allocate enough space for later... */ |
364 | numfilesystems = ioctl (fd, DEVMTAB_COUNT_MOUNTS); | 369 | numfilesystems = ioctl(fd, DEVMTAB_COUNT_MOUNTS); |
365 | if (numfilesystems<0) | 370 | if (numfilesystems < 0) |
366 | perror_msg_and_die( "\nDEVMTAB_COUNT_MOUNTS"); | 371 | perror_msg_and_die("\nDEVMTAB_COUNT_MOUNTS"); |
367 | mntentlist = (struct k_mntent *) xcalloc ( numfilesystems, sizeof(struct k_mntent)); | 372 | mntentlist = |
368 | 373 | (struct k_mntent *) xcalloc(numfilesystems, sizeof(struct k_mntent)); | |
374 | |||
369 | /* Grab the list of mounted filesystems */ | 375 | /* Grab the list of mounted filesystems */ |
370 | if (ioctl (fd, DEVMTAB_GET_MOUNTS, mntentlist)<0) | 376 | if (ioctl(fd, DEVMTAB_GET_MOUNTS, mntentlist) < 0) |
371 | perror_msg_and_die( "\nDEVMTAB_GET_MOUNTS"); | 377 | perror_msg_and_die("\nDEVMTAB_GET_MOUNTS"); |
372 | 378 | ||
373 | for( i = 0 ; i < numfilesystems ; i++) { | 379 | for (i = 0; i < numfilesystems; i++) { |
374 | if ( !onlytype || ( strcmp ( mntentlist[i].mnt_type, onlytype ) == 0 )) { | 380 | if (!onlytype || (strcmp(mntentlist[i].mnt_type, onlytype) == 0)) { |
375 | printf( "%s %s %s %s %d %d\n", mntentlist[i].mnt_fsname, | 381 | printf("%s %s %s %s %d %d\n", mntentlist[i].mnt_fsname, |
376 | mntentlist[i].mnt_dir, mntentlist[i].mnt_type, | 382 | mntentlist[i].mnt_dir, mntentlist[i].mnt_type, |
377 | mntentlist[i].mnt_opts, mntentlist[i].mnt_freq, | 383 | mntentlist[i].mnt_opts, mntentlist[i].mnt_freq, |
378 | mntentlist[i].mnt_passno); | 384 | mntentlist[i].mnt_passno); |
379 | } | 385 | } |
380 | } | 386 | } |
381 | #ifdef CONFIG_FEATURE_CLEAN_UP | 387 | #ifdef CONFIG_FEATURE_CLEAN_UP |
382 | /* Don't bother to close files or free memory. Exit | 388 | /* Don't bother to close files or free memory. Exit |
383 | * does that automagically, so we can save a few bytes */ | 389 | * does that automagically, so we can save a few bytes */ |
384 | free( mntentlist); | 390 | free(mntentlist); |
385 | close(fd); | 391 | close(fd); |
386 | #endif | 392 | #endif |
387 | exit(EXIT_SUCCESS); | 393 | exit(EXIT_SUCCESS); |
@@ -393,15 +399,16 @@ static void show_mounts(char *onlytype) | |||
393 | 399 | ||
394 | while ((m = getmntent(mountTable)) != 0) { | 400 | while ((m = getmntent(mountTable)) != 0) { |
395 | char *blockDevice = m->mnt_fsname; | 401 | char *blockDevice = m->mnt_fsname; |
402 | |||
396 | if (strcmp(blockDevice, "/dev/root") == 0) { | 403 | if (strcmp(blockDevice, "/dev/root") == 0) { |
397 | blockDevice = find_real_root_device_name(blockDevice); | 404 | blockDevice = find_real_root_device_name(blockDevice); |
398 | } | 405 | } |
399 | if ( !onlytype || ( strcmp ( m-> mnt_type, onlytype ) == 0 )) { | 406 | if (!onlytype || (strcmp(m->mnt_type, onlytype) == 0)) { |
400 | printf("%s on %s type %s (%s)\n", blockDevice, m->mnt_dir, | 407 | printf("%s on %s type %s (%s)\n", blockDevice, m->mnt_dir, |
401 | m->mnt_type, m->mnt_opts); | 408 | m->mnt_type, m->mnt_opts); |
402 | } | 409 | } |
403 | #ifdef CONFIG_FEATURE_CLEAN_UP | 410 | #ifdef CONFIG_FEATURE_CLEAN_UP |
404 | if(blockDevice != m->mnt_fsname) | 411 | if (blockDevice != m->mnt_fsname) |
405 | free(blockDevice); | 412 | free(blockDevice); |
406 | #endif | 413 | #endif |
407 | } | 414 | } |
@@ -459,7 +466,7 @@ extern int mount_main(int argc, char **argv) | |||
459 | break; | 466 | break; |
460 | #endif | 467 | #endif |
461 | case 'v': | 468 | case 'v': |
462 | break; /* ignore -v */ | 469 | break; /* ignore -v */ |
463 | } | 470 | } |
464 | } | 471 | } |
465 | 472 | ||
@@ -470,6 +477,7 @@ extern int mount_main(int argc, char **argv) | |||
470 | /* if device is a filename get its real path */ | 477 | /* if device is a filename get its real path */ |
471 | if (stat(argv[optind], &statbuf) == 0) { | 478 | if (stat(argv[optind], &statbuf) == 0) { |
472 | char *tmp = simplify_path(argv[optind]); | 479 | char *tmp = simplify_path(argv[optind]); |
480 | |||
473 | safe_strncpy(device, tmp, PATH_MAX); | 481 | safe_strncpy(device, tmp, PATH_MAX); |
474 | } else { | 482 | } else { |
475 | safe_strncpy(device, argv[optind], PATH_MAX); | 483 | safe_strncpy(device, argv[optind], PATH_MAX); |
@@ -483,59 +491,61 @@ extern int mount_main(int argc, char **argv) | |||
483 | f = setmntent("/etc/fstab", "r"); | 491 | f = setmntent("/etc/fstab", "r"); |
484 | 492 | ||
485 | if (f == NULL) | 493 | if (f == NULL) |
486 | perror_msg_and_die( "\nCannot read /etc/fstab"); | 494 | perror_msg_and_die("\nCannot read /etc/fstab"); |
487 | 495 | ||
488 | while ((m = getmntent(f)) != NULL) { | 496 | while ((m = getmntent(f)) != NULL) { |
489 | if (! all && optind + 1 == argc && ( | 497 | if (!all && optind + 1 == argc && ((strcmp(device, m->mnt_fsname) |
490 | (strcmp(device, m->mnt_fsname) != 0) && | 498 | != 0) |
491 | (strcmp(device, m->mnt_dir) != 0) ) ) { | 499 | && (strcmp(device, m->mnt_dir) |
500 | != 0))) { | ||
492 | continue; | 501 | continue; |
493 | } | 502 | } |
494 | 503 | ||
495 | if (all && ( // If we're mounting 'all' | 504 | if (all && ( /* If we're mounting 'all' */ |
496 | (strstr(m->mnt_opts, "noauto")) || // and the file system isn't noauto, | 505 | (strstr(m->mnt_opts, "noauto")) || /* and the file system isn't noauto, */ |
497 | (strstr(m->mnt_type, "swap")) || // and isn't swap or nfs, then mount it | 506 | (strstr(m->mnt_type, "swap")) || /* and isn't swap or nfs, then mount it */ |
498 | (strstr(m->mnt_type, "nfs")) ) ) { | 507 | (strstr(m->mnt_type, "nfs")))) { |
499 | continue; | 508 | continue; |
500 | } | 509 | } |
501 | 510 | ||
502 | if (all || flags == 0) { // Allow single mount to override fstab flags | 511 | if (all || flags == 0) { /* Allow single mount to override fstab flags */ |
503 | flags = 0; | 512 | flags = 0; |
504 | string_flags[0] = 0; | 513 | string_flags[0] = 0; |
505 | parse_mount_options(m->mnt_opts, &flags, &string_flags); | 514 | parse_mount_options(m->mnt_opts, &flags, &string_flags); |
506 | } | 515 | } |
507 | 516 | ||
508 | strcpy(device, m->mnt_fsname); | 517 | strcpy(device, m->mnt_fsname); |
509 | strcpy(directory, m->mnt_dir); | 518 | strcpy(directory, m->mnt_dir); |
510 | filesystemType = xstrdup(m->mnt_type); | 519 | filesystemType = xstrdup(m->mnt_type); |
511 | singlemount: | 520 | singlemount: |
512 | extra_opts = string_flags; | 521 | extra_opts = string_flags; |
513 | rc = EXIT_SUCCESS; | 522 | rc = EXIT_SUCCESS; |
514 | #ifdef CONFIG_NFSMOUNT | 523 | #ifdef CONFIG_NFSMOUNT |
515 | if (strchr(device, ':') != NULL) { | 524 | if (strchr(device, ':') != NULL) { |
516 | filesystemType = "nfs"; | 525 | filesystemType = "nfs"; |
517 | if (nfsmount (device, directory, &flags, &extra_opts, | 526 | if (nfsmount(device, directory, &flags, &extra_opts, |
518 | &string_flags, 1)) { | 527 | &string_flags, 1)) { |
519 | perror_msg("nfsmount failed"); | 528 | perror_msg("nfsmount failed"); |
520 | rc = EXIT_FAILURE; | 529 | rc = EXIT_FAILURE; |
521 | } | 530 | } |
522 | } | 531 | } |
523 | #endif | 532 | #endif |
524 | if (!mount_one(device, directory, filesystemType, flags, | 533 | if (!mount_one(device, directory, filesystemType, flags, |
525 | string_flags, useMtab, fakeIt, extra_opts, TRUE, all)) | 534 | string_flags, useMtab, fakeIt, extra_opts, TRUE, |
535 | all)) | ||
526 | rc = EXIT_FAILURE; | 536 | rc = EXIT_FAILURE; |
527 | 537 | ||
528 | if (! all) | 538 | if (!all) |
529 | break; | 539 | break; |
530 | } | 540 | } |
531 | if (f) | 541 | if (f) |
532 | endmntent(f); | 542 | endmntent(f); |
533 | 543 | ||
534 | if (! all && f && m == NULL) | 544 | if (!all && f && m == NULL) |
535 | fprintf(stderr, "Can't find %s in /etc/fstab\n", device); | 545 | fprintf(stderr, "Can't find %s in /etc/fstab\n", device); |
536 | 546 | ||
537 | return rc; | 547 | return rc; |
538 | } | 548 | } |
539 | 549 | ||
540 | goto singlemount; | 550 | goto singlemount; |
541 | } | 551 | } |