/* umount.cc This file is part of Cygwin. This software is a copyrighted work licensed under the terms of the Cygwin license. Please consult the file "CYGWIN_LICENSE" for details. */ #include #include #include #include #include #include #include #include static void remove_all_user_mounts (); static const char *progname; struct option longopts[] = { {"help", no_argument, NULL, 'h' }, {"remove-user-mounts", no_argument, NULL, 'U'}, {"version", no_argument, NULL, 'V'}, {NULL, 0, NULL, 0} }; char opts[] = "hUV"; static void usage (FILE *where = stderr) { fprintf (where, "\ Usage: %s [OPTION] []\n\ \n\ Unmount filesystems\n\ \n\ -h, --help output usage information and exit\n\ -U, --remove-user-mounts remove all user mounts\n\ -V, --version output version information and exit\n\ \n", progname); exit (where == stderr ? 1 : 0); } static void error (const char *path) { fprintf (stderr, "%s: %s: %s\n", progname, path, strerror (errno)); exit (1); } static void print_version () { printf ("umount (cygwin) %d.%d.%d\n" "Unmount filesystem utility\n" "Copyright (C) 1996 - %s Cygwin Authors\n" "This is free software; see the source for copying conditions. There is NO\n" "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n", CYGWIN_VERSION_DLL_MAJOR / 1000, CYGWIN_VERSION_DLL_MAJOR % 1000, CYGWIN_VERSION_DLL_MINOR, strrchr (__DATE__, ' ') + 1); } int main (int argc, char **argv) { int i; int flags = 0; int default_flag = MOUNT_SYSTEM; enum do_what { nada, saw_remove_all_user_mounts } do_what = nada; progname = program_invocation_short_name; if (argc == 1) usage (); while ((i = getopt_long (argc, argv, opts, longopts, NULL)) != EOF) switch (i) { case 'h': usage (stdout); case 'U': if (do_what != nada) usage (); do_what = saw_remove_all_user_mounts; break; case 'V': print_version (); exit (0); default: fprintf (stderr, "Try `%s --help' for more information.\n", progname); exit (1); } switch (do_what) { case saw_remove_all_user_mounts: if (optind != argc) usage (); remove_all_user_mounts (); break; default: if (optind != argc - 1) usage (); if (cygwin_umount (argv[optind], flags | default_flag) != 0) error (argv[optind]); } return 0; } /* remove_all_user_mounts: Unmount all user mounts. */ static void remove_all_user_mounts () { FILE *m = setmntent ("/-not-used-", "r"); struct mntent *p; while ((p = getmntent (m)) != NULL) { /* Remove the mount if it's a user mount. */ if (strncmp (p->mnt_type, "user", 4) == 0 && strstr (p->mnt_opts, "noumount") == NULL) { if (cygwin_umount (p->mnt_dir, 0)) error (p->mnt_dir); /* We've modified the table so we need to start over. */ endmntent (m); m = setmntent ("/-not-used-", "r"); } } endmntent (m); }