From 5a5782156582bc57cb5462d74abe11f4cf415eb9 Mon Sep 17 00:00:00 2001 From: Rob Landley Date: Fri, 17 Mar 2006 03:30:05 +0000 Subject: [PATCH] Bug fix: umount wasn't detaching loop devices unless mtab support was enabled. Made some whitespace cleanups while I was there. --- util-linux/umount.c | 73 +++++++++++++++++++++++---------------------- 1 file changed, 38 insertions(+), 35 deletions(-) diff --git a/util-linux/umount.c b/util-linux/umount.c index 71ddbd4ed..7efb636db 100644 --- a/util-linux/umount.c +++ b/util-linux/umount.c @@ -21,7 +21,7 @@ #include #include "busybox.h" -#define OPTION_STRING "flDnrva" +#define OPTION_STRING "flDnrvad" #define OPT_FORCE 1 #define OPT_LAZY 2 #define OPT_DONTFREELOOP 4 @@ -36,7 +36,7 @@ int umount_main(int argc, char **argv) char path[2*PATH_MAX]; struct mntent me; FILE *fp; - int status=EXIT_SUCCESS; + int status = EXIT_SUCCESS; unsigned long opt; struct mtab_list { char *dir; @@ -46,7 +46,7 @@ int umount_main(int argc, char **argv) /* Parse any options */ - opt = bb_getopt_ulflags (argc, argv, OPTION_STRING); + opt = bb_getopt_ulflags(argc, argv, OPTION_STRING); argc -= optind; argv += optind; @@ -59,52 +59,55 @@ int umount_main(int argc, char **argv) * entry. Notice that this also naturally reverses the list so that -a * umounts the most recent entries first. */ - m=mtl=0; - if(opt & OPT_ALL) { + m = mtl = 0; - /* If we're umounting all, then m points to the start of the list and - * the argument list should be empty (which will match all). */ + /* If we're umounting all, then m points to the start of the list and + * the argument list should be empty (which will match all). */ - if(!(fp = setmntent(bb_path_mtab_file, "r"))) + if (!(fp = setmntent(bb_path_mtab_file, "r"))) { + if (opt & OPT_ALL) bb_error_msg_and_die("Cannot open %s", bb_path_mtab_file); - while (getmntent_r(fp,&me,path,sizeof(path))) { - m=xmalloc(sizeof(struct mtab_list)); - m->next=mtl; - m->device=bb_xstrdup(me.mnt_fsname); - m->dir=bb_xstrdup(me.mnt_dir); - mtl=m; - } - endmntent(fp); + } else while (getmntent_r(fp,&me,path,sizeof(path))) { + m = xmalloc(sizeof(struct mtab_list)); + m->next = mtl; + m->device = bb_xstrdup(me.mnt_fsname); + m->dir = bb_xstrdup(me.mnt_dir); + mtl = m; + } + endmntent(fp); /* If we're not mounting all, we need at least one argument. */ - } else if(argc <= 0) bb_show_usage(); + if (!(opt & OPT_ALL)) { + m = 0; + if (!argc) bb_show_usage(); + } + + // Loop through everything we're supposed to umount, and do so. - for(;;) { + for (;;) { int curstat; // Do we already know what to umount this time through the loop? - if(m) safe_strncpy(path,m->dir,PATH_MAX); + if (m) safe_strncpy(path, m->dir, PATH_MAX); // For umount -a, end of mtab means time to exit. - else if(opt & OPT_ALL) break; + else if (opt & OPT_ALL) break; // Get next command line argument (and look it up in mtab list) - else if(!argc--) break; + else if (!argc--) break; else { - // Get next command line argument (and look it up in mtab list) realpath(*argv++, path); - if (ENABLE_FEATURE_MTAB_SUPPORT) - for(m = mtl; m; m = m->next) - if(!strcmp(path, m->dir) || !strcmp(path, m->device)) - break; + for (m = mtl; m; m = m->next) + if (!strcmp(path, m->dir) || !strcmp(path, m->device)) + break; } // Let's ask the thing nicely to unmount. curstat = umount(path); // Force the unmount, if necessary. - if(curstat && doForce) { + if (curstat && doForce) { curstat = umount2(path, doForce); - if(curstat) + if (curstat) bb_error_msg_and_die("forced umount of %s failed!", path); } @@ -117,10 +120,10 @@ int umount_main(int argc, char **argv) /* De-allocate the loop device. This ioctl should be ignored on any * non-loop block devices. */ - if(ENABLE_FEATURE_MOUNT_LOOP && !(opt & OPT_DONTFREELOOP) && m) + if (ENABLE_FEATURE_MOUNT_LOOP && !(opt & OPT_DONTFREELOOP) && m) del_loop(m->device); - if(curstat) { + if (curstat) { /* Yes, the ENABLE is redundant here, but the optimizer for ARM * can't do simple constant propagation in local variables... */ if(ENABLE_FEATURE_MTAB_SUPPORT && !(opt & OPT_NO_MTAB) && m) @@ -129,16 +132,16 @@ int umount_main(int argc, char **argv) bb_perror_msg("Couldn't umount %s", path); } // Find next matching mtab entry for -a or umount /dev - while(m && (m = m->next)) - if((opt & OPT_ALL) || !strcmp(path,m->device)) + while (m && (m = m->next)) + if ((opt & OPT_ALL) || !strcmp(path,m->device)) break; } // Free mtab list if necessary - if(ENABLE_FEATURE_CLEAN_UP) { - while(mtl) { - m=mtl->next; + if (ENABLE_FEATURE_CLEAN_UP) { + while (mtl) { + m = mtl->next; free(mtl->device); free(mtl->dir); free(mtl);