Commit | Line | Data |
---|---|---|
e2f5cb95 | 1 | static char *sccsid = "@(#)umount.c 4.5 (Berkeley) %G%"; |
15de4e1e | 2 | |
cfbe3c25 BJ |
3 | #include <stdio.h> |
4 | #include <fstab.h> | |
15de4e1e | 5 | |
cfbe3c25 | 6 | /* |
f0861f40 | 7 | * umount |
cfbe3c25 BJ |
8 | */ |
9 | ||
10 | #define NMOUNT 16 | |
11 | #define NAMSIZ 32 | |
12 | ||
13 | struct mtab { | |
14 | char file[NAMSIZ]; | |
15 | char spec[NAMSIZ]; | |
16 | } mtab[NMOUNT]; | |
17 | ||
15de4e1e BJ |
18 | char *rindex(); |
19 | int vflag, all, errs; | |
20 | ||
cfbe3c25 | 21 | main(argc, argv) |
15de4e1e BJ |
22 | int argc; |
23 | char **argv; | |
cfbe3c25 BJ |
24 | { |
25 | register struct mtab *mp; | |
26 | register char *p1, *p2; | |
27 | int mf; | |
28 | ||
15de4e1e | 29 | argc--, argv++; |
cfbe3c25 BJ |
30 | sync(); |
31 | mf = open("/etc/mtab", 0); | |
15de4e1e BJ |
32 | read(mf, (char *)mtab, sizeof (mtab)); |
33 | again: | |
34 | if (!strcmp(*argv, "-v")) { | |
35 | vflag++; | |
36 | argc--, argv++; | |
37 | goto again; | |
38 | } | |
39 | if (!strcmp(*argv, "-a")) { | |
40 | all++; | |
41 | argc--, argv++; | |
42 | goto again; | |
cfbe3c25 | 43 | } |
15de4e1e BJ |
44 | if (argc == 0 && !all) { |
45 | fprintf(stderr, "Usage: umount [ -a ] [ -v ] [ dev ... ]\n"); | |
46 | exit(1); | |
47 | } | |
48 | if (all) { | |
83dfa04a BJ |
49 | if (setfsent() == 0) |
50 | perror(FSTAB), exit(1); | |
51 | umountall(); | |
15de4e1e BJ |
52 | exit(0); |
53 | } | |
54 | while (argc > 0) { | |
55 | if (umountfs(*argv++) == 0) | |
56 | errs++; | |
57 | argc--; | |
cfbe3c25 | 58 | } |
15de4e1e | 59 | exit(errs); |
cfbe3c25 | 60 | } |
15de4e1e | 61 | |
83dfa04a BJ |
62 | umountall() |
63 | { | |
15de4e1e BJ |
64 | struct fstab fs, *fsp; |
65 | ||
66 | if ((fsp = getfsent()) == 0) | |
83dfa04a BJ |
67 | return; |
68 | fs = *fsp; /* save info locally; it is static from getfsent() */ | |
69 | umountall(); | |
70 | if (strcmp(fs.fs_file, "/") == 0) | |
71 | return; | |
15de4e1e | 72 | if (strcmp(fs.fs_type, FSTAB_RW) && strcmp(fs.fs_type, FSTAB_RO)) |
83dfa04a | 73 | return; |
15de4e1e BJ |
74 | if (umountfs(fs.fs_spec) < 0) { |
75 | perror(fs.fs_spec); | |
76 | return; | |
77 | } | |
83dfa04a | 78 | } |
cfbe3c25 | 79 | |
15de4e1e BJ |
80 | struct mtab zeromtab; |
81 | ||
82 | umountfs(name) | |
83 | char *name; | |
cfbe3c25 | 84 | { |
15de4e1e BJ |
85 | register char *p1, *p2; |
86 | register struct mtab *mp; | |
87 | int mf; | |
cfbe3c25 | 88 | |
e2f5cb95 | 89 | if (unmount(name) < 0) { |
15de4e1e BJ |
90 | perror(name); |
91 | return (0); | |
cfbe3c25 | 92 | } |
15de4e1e BJ |
93 | if (vflag) |
94 | fprintf(stderr, "%s: Unmounted\n", name); | |
95 | while ((p1 = rindex(name, '/')) && p1[1] == 0) | |
96 | *p1 = 0; | |
97 | if (p1) | |
98 | name = p1 + 1; | |
cfbe3c25 | 99 | for (mp = mtab; mp < &mtab[NMOUNT]; mp++) { |
15de4e1e BJ |
100 | if (strncmp(mp->spec, name, sizeof (mp->spec))) |
101 | continue; | |
102 | *mp = zeromtab; | |
103 | for (mp = &mtab[NMOUNT]; mp >= mtab; mp--) | |
104 | if (mp->file[0]) | |
105 | break; | |
106 | mp++; | |
107 | mf = creat("/etc/mtab", 0644); | |
108 | write(mf, (char *)mtab, (mp-mtab) * sizeof (struct mtab)); | |
109 | return (1); | |
cfbe3c25 | 110 | } |
15de4e1e BJ |
111 | fprintf(stderr, "%s: Not mounted\n", name); |
112 | return (0); | |
cfbe3c25 | 113 | } |