]>
Commit | Line | Data |
---|---|---|
1fd5e000 CF |
1 | /* umount.cc |
2 | ||
1fd5e000 CF |
3 | This file is part of Cygwin. |
4 | ||
5 | This software is a copyrighted work licensed under the terms of the | |
6 | Cygwin license. Please consult the file "CYGWIN_LICENSE" for | |
7 | details. */ | |
8 | ||
9 | #include <stdio.h> | |
10 | #include <string.h> | |
11 | #include <sys/mount.h> | |
12 | #include <mntent.h> | |
b6e259b1 | 13 | #include <stdlib.h> |
9500a3db | 14 | #include <errno.h> |
be61cf4d | 15 | #include <getopt.h> |
92b499ac | 16 | #include <cygwin/version.h> |
1fd5e000 | 17 | |
1fd5e000 | 18 | static void remove_all_user_mounts (); |
1fd5e000 CF |
19 | |
20 | static const char *progname; | |
21 | ||
be61cf4d CF |
22 | struct option longopts[] = |
23 | { | |
9f425256 | 24 | {"help", no_argument, NULL, 'h' }, |
be61cf4d | 25 | {"remove-user-mounts", no_argument, NULL, 'U'}, |
92b499ac | 26 | {"version", no_argument, NULL, 'V'}, |
be61cf4d CF |
27 | {NULL, 0, NULL, 0} |
28 | }; | |
29 | ||
92b499ac | 30 | char opts[] = "hUV"; |
be61cf4d | 31 | |
e7fca6f8 | 32 | static void __attribute__ ((__noreturn__)) |
e6cd2312 | 33 | usage (FILE *where = stderr) |
1fd5e000 | 34 | { |
e6cd2312 CF |
35 | fprintf (where, "\ |
36 | Usage: %s [OPTION] [<posixpath>]\n\ | |
92b499ac | 37 | \n\ |
aa275fe0 JDF |
38 | Unmount filesystems\n\ |
39 | \n\ | |
e6cd2312 | 40 | -h, --help output usage information and exit\n\ |
be61cf4d | 41 | -U, --remove-user-mounts remove all user mounts\n\ |
92b499ac CV |
42 | -V, --version output version information and exit\n\ |
43 | \n", progname); | |
e6cd2312 | 44 | exit (where == stderr ? 1 : 0); |
1fd5e000 CF |
45 | } |
46 | ||
9500a3db | 47 | static void |
959e1bac | 48 | error (const char *path) |
9500a3db CV |
49 | { |
50 | fprintf (stderr, "%s: %s: %s\n", progname, path, strerror (errno)); | |
51 | exit (1); | |
52 | } | |
53 | ||
e6cd2312 CF |
54 | static void |
55 | print_version () | |
56 | { | |
92b499ac | 57 | printf ("umount (cygwin) %d.%d.%d\n" |
1b23b30b | 58 | "Unmount filesystem utility\n" |
6e623e93 | 59 | "Copyright (C) 1996 - %s Cygwin Authors\n" |
1b23b30b | 60 | "This is free software; see the source for copying conditions. There is NO\n" |
92b499ac | 61 | "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n", |
1b23b30b CF |
62 | CYGWIN_VERSION_DLL_MAJOR / 1000, |
63 | CYGWIN_VERSION_DLL_MAJOR % 1000, | |
64 | CYGWIN_VERSION_DLL_MINOR, | |
65 | strrchr (__DATE__, ' ') + 1); | |
e6cd2312 CF |
66 | } |
67 | ||
1fd5e000 CF |
68 | int |
69 | main (int argc, char **argv) | |
70 | { | |
71 | int i; | |
72 | int flags = 0; | |
48897dfe | 73 | int default_flag = MOUNT_SYSTEM; |
be61cf4d CF |
74 | enum do_what |
75 | { | |
76 | nada, | |
be61cf4d CF |
77 | saw_remove_all_user_mounts |
78 | } do_what = nada; | |
1fd5e000 | 79 | |
92b499ac | 80 | progname = program_invocation_short_name; |
e6cd2312 | 81 | |
1fd5e000 CF |
82 | if (argc == 1) |
83 | usage (); | |
84 | ||
be61cf4d CF |
85 | while ((i = getopt_long (argc, argv, opts, longopts, NULL)) != EOF) |
86 | switch (i) | |
87 | { | |
e6cd2312 CF |
88 | case 'h': |
89 | usage (stdout); | |
be61cf4d CF |
90 | case 'U': |
91 | if (do_what != nada) | |
92 | usage (); | |
93 | do_what = saw_remove_all_user_mounts; | |
94 | break; | |
92b499ac | 95 | case 'V': |
e6cd2312 CF |
96 | print_version (); |
97 | exit (0); | |
be61cf4d | 98 | default: |
92b499ac CV |
99 | fprintf (stderr, "Try `%s --help' for more information.\n", progname); |
100 | exit (1); | |
be61cf4d | 101 | } |
1fd5e000 | 102 | |
be61cf4d CF |
103 | switch (do_what) |
104 | { | |
be61cf4d CF |
105 | case saw_remove_all_user_mounts: |
106 | if (optind != argc) | |
1fd5e000 | 107 | usage (); |
be61cf4d CF |
108 | remove_all_user_mounts (); |
109 | break; | |
110 | default: | |
111 | if (optind != argc - 1) | |
112 | usage (); | |
48897dfe | 113 | if (cygwin_umount (argv[optind], flags | default_flag) != 0) |
be61cf4d | 114 | error (argv[optind]); |
1fd5e000 CF |
115 | } |
116 | ||
1fd5e000 CF |
117 | return 0; |
118 | } | |
119 | ||
1fd5e000 CF |
120 | /* remove_all_user_mounts: Unmount all user mounts. */ |
121 | static void | |
122 | remove_all_user_mounts () | |
123 | { | |
124 | FILE *m = setmntent ("/-not-used-", "r"); | |
125 | struct mntent *p; | |
1fd5e000 CF |
126 | |
127 | while ((p = getmntent (m)) != NULL) | |
128 | { | |
129 | /* Remove the mount if it's a user mount. */ | |
12a9c874 CF |
130 | if (strncmp (p->mnt_type, "user", 4) == 0 && |
131 | strstr (p->mnt_opts, "noumount") == NULL) | |
1fd5e000 | 132 | { |
9500a3db CV |
133 | if (cygwin_umount (p->mnt_dir, 0)) |
134 | error (p->mnt_dir); | |
1fd5e000 CF |
135 | |
136 | /* We've modified the table so we need to start over. */ | |
137 | endmntent (m); | |
138 | m = setmntent ("/-not-used-", "r"); | |
139 | } | |
140 | } | |
141 | ||
142 | endmntent (m); | |
143 | } |