📄 umount.cc
字号:
/* umount.cc Copyright 1996, 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.This file is part of Cygwin.This software is a copyrighted work licensed under the terms of theCygwin license. Please consult the file "CYGWIN_LICENSE" fordetails. */#include <stdio.h>#include <string.h>#include <sys/mount.h>#include <mntent.h>#include <stdlib.h>#include <errno.h>#include <getopt.h>static void remove_all_mounts ();static void remove_all_user_mounts ();static void remove_all_system_mounts ();static void remove_cygdrive_prefix (int flags);static const char version[] = "$Revision: 1.10 $";static const char *progname;struct option longopts[] ={ {"help", no_argument, NULL, 'h' }, {"remove-all-mounts", no_argument, NULL, 'A'}, {"remove-cygdrive-prefix", no_argument, NULL, 'c'}, {"remove-system-mounts", no_argument, NULL, 'S'}, {"remove-user-mounts", no_argument, NULL, 'U'}, {"system", no_argument, NULL, 's'}, {"user", no_argument, NULL, 'u'}, {"version", no_argument, NULL, 'v'}, {NULL, 0, NULL, 0}};char opts[] = "AchsSuUv";static voidusage (FILE *where = stderr){ fprintf (where, "\Usage: %s [OPTION] [<posixpath>]\n\ -A, --remove-all-mounts remove all mounts\n\ -c, --remove-cygdrive-prefix remove cygdrive prefix\n\ -h, --help output usage information and exit\n\ -s, --system remove system mount (default)\n\ -S, --remove-system-mounts remove all system mounts\n\ -u, --user remove user mount\n\ -U, --remove-user-mounts remove all user mounts\n\ -v, --version output version information and exit\n\", progname); exit (where == stderr ? 1 : 0);}static voiderror (const char *path){ fprintf (stderr, "%s: %s: %s\n", progname, path, strerror (errno)); exit (1);}static voidprint_version (){ const char *v = strchr (version, ':'); int len; if (!v) { v = "?"; len = 1; } else { v += 2; len = strchr (v, ' ') - v; } printf ("\%s (cygwin) %.*s\n\Filesystem Utility\n\Copyright 1996, 1998, 1999, 2000, 2001, 2002\n\Compiled on %s\n\", progname, len, v, __DATE__);}intmain (int argc, char **argv){ int i; int flags = 0; int default_flag = MOUNT_SYSTEM; enum do_what { nada, saw_remove_all_mounts, saw_remove_cygdrive_prefix, saw_remove_all_system_mounts, saw_remove_all_user_mounts } do_what = nada; progname = strrchr (argv[0], '/'); if (progname == NULL) progname = strrchr (argv[0], '\\'); if (progname == NULL) progname = argv[0]; else progname++; if (argc == 1) usage (); while ((i = getopt_long (argc, argv, opts, longopts, NULL)) != EOF) switch (i) { case 'A': if (do_what != nada) usage (); do_what = saw_remove_all_mounts; break; case 'c': if (do_what != nada) usage (); do_what = saw_remove_cygdrive_prefix; break; case 'h': usage (stdout); case 's': flags |= MOUNT_SYSTEM; break; case 'S': if (do_what != nada) usage (); do_what = saw_remove_all_system_mounts; break; case 'u': flags &= ~MOUNT_SYSTEM; default_flag = 0; break; case 'U': if (do_what != nada) usage (); do_what = saw_remove_all_user_mounts; break; case 'v': print_version (); exit (0); default: usage (); } switch (do_what) { case saw_remove_all_mounts: if (optind != argc) usage (); remove_all_mounts (); break; case saw_remove_cygdrive_prefix: if (optind != argc) usage (); remove_cygdrive_prefix (flags | default_flag); break; case saw_remove_all_system_mounts: if (optind != argc) usage (); remove_all_system_mounts (); break; 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_mounts: Unmount all mounts. */static voidremove_all_mounts (){ remove_all_user_mounts (); remove_all_system_mounts ();}/* remove_all_user_mounts: Unmount all user mounts. */static voidremove_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);}/* remove_all_system_mounts: Unmount all system mounts. */static voidremove_all_system_mounts (){ FILE *m = setmntent ("/-not-used-", "r"); struct mntent *p; while ((p = getmntent (m)) != NULL) { /* Remove the mount if it's a system mount. */ if (strncmp (p->mnt_type, "system", 6) == 0 && strstr (p->mnt_opts, "noumount") == NULL) { if (cygwin_umount (p->mnt_dir, MOUNT_SYSTEM)) error (p->mnt_dir); /* We've modified the table so we need to start over. */ endmntent (m); m = setmntent ("/-not-used-", "r"); } } endmntent (m);}/* remove_cygdrive_prefix: Remove cygdrive user or system path prefix. */static voidremove_cygdrive_prefix (int flags){ int res = cygwin_umount (NULL, flags | MOUNT_CYGDRIVE); if (res) error ("remove_cygdrive_prefix"); exit (0);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -