|
|
1.1 root 1: #ifndef lint
2: static char *sccsid = "@(#)umount.c 4.8 (Berkeley) 5/28/83";
3: #endif
4:
5: /*
6: * umount
7: */
8: #include <sys/param.h>
9:
10: #include <stdio.h>
11: #include <fstab.h>
12: #include <mtab.h>
13:
14: struct mtab mtab[NMOUNT];
15:
16: char *rindex();
17: int vflag, all, errs;
18:
19: main(argc, argv)
20: int argc;
21: char **argv;
22: {
23: register struct mtab *mp;
24: register char *p1, *p2;
25: int mf;
26:
27: argc--, argv++;
28: sync();
29: mf = open("/etc/mtab", 0);
30: read(mf, (char *)mtab, sizeof (mtab));
31: again:
32: if (argc > 0 && !strcmp(*argv, "-v")) {
33: vflag++;
34: argc--, argv++;
35: goto again;
36: }
37: if (argc > 0 && !strcmp(*argv, "-a")) {
38: all++;
39: argc--, argv++;
40: goto again;
41: }
42: if (argc == 0 && !all) {
43: fprintf(stderr, "Usage: umount [ -a ] [ -v ] [ dev ... ]\n");
44: exit(1);
45: }
46: if (all) {
47: if (setfsent() == 0)
48: perror(FSTAB), exit(1);
49: umountall();
50: exit(0);
51: }
52: while (argc > 0) {
53: if (umountfs(*argv++) == 0)
54: errs++;
55: argc--;
56: }
57: exit(errs);
58: }
59:
60: umountall()
61: {
62: struct fstab *fs, *allocfsent();
63:
64: if ((fs = getfsent()) == 0)
65: return;
66: fs = allocfsent(fs);
67: umountall();
68: if (strcmp(fs->fs_file, "/") == 0) {
69: freefsent(fs);
70: return;
71: }
72: if (strcmp(fs->fs_type, FSTAB_RW) &&
73: strcmp(fs->fs_type, FSTAB_RO) &&
74: strcmp(fs->fs_type, FSTAB_RQ)) {
75: freefsent(fs);
76: return;
77: }
78: if (umountfs(fs->fs_spec) < 0)
79: perror(fs->fs_spec);
80: freefsent(fs);
81: }
82:
83: struct fstab *
84: allocfsent(fs)
85: register struct fstab *fs;
86: {
87: register struct fstab *new;
88: register char *cp;
89: char *malloc();
90:
91: new = (struct fstab *)malloc(sizeof (*fs));
92: cp = malloc(strlen(fs->fs_file) + 1);
93: strcpy(cp, fs->fs_file);
94: new->fs_file = cp;
95: cp = malloc(strlen(fs->fs_type) + 1);
96: strcpy(cp, fs->fs_type);
97: new->fs_type = cp;
98: cp = malloc(strlen(fs->fs_spec) + 1);
99: strcpy(cp, fs->fs_spec);
100: new->fs_spec = cp;
101: new->fs_passno = fs->fs_passno;
102: new->fs_freq = fs->fs_freq;
103: return (new);
104: }
105:
106: freefsent(fs)
107: register struct fstab *fs;
108: {
109:
110: if (fs->fs_file)
111: free(fs->fs_file);
112: if (fs->fs_spec)
113: free(fs->fs_spec);
114: if (fs->fs_type)
115: free(fs->fs_type);
116: free((char *)fs);
117: }
118:
119: struct mtab zeromtab;
120:
121: umountfs(name)
122: char *name;
123: {
124: register char *p1, *p2;
125: register struct mtab *mp;
126: int mf;
127: struct fstab *fs;
128:
129: fs = getfsfile(name);
130: if (fs != NULL)
131: name = fs->fs_spec;
132: if (umount(name) < 0) {
133: perror(name);
134: return (0);
135: }
136: if (vflag)
137: fprintf(stderr, "%s: Unmounted\n", name);
138: while ((p1 = rindex(name, '/')) && p1[1] == 0)
139: *p1 = 0;
140: if (p1)
141: name = p1 + 1;
142: for (mp = mtab; mp < &mtab[NMOUNT]; mp++) {
143: if (strncmp(mp->m_dname, name, sizeof (mp->m_dname)))
144: continue;
145: *mp = zeromtab;
146: for (mp = &mtab[NMOUNT]; mp >= mtab; mp--)
147: if (mp->m_path[0])
148: break;
149: mp++;
150: mf = creat("/etc/mtab", 0644);
151: write(mf, (char *)mtab, (mp-mtab) * sizeof (struct mtab));
152: return (1);
153: }
154: fprintf(stderr, "%s: Not mounted\n", name);
155: return (0);
156: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.