zero link count table increased 50 => 500; corrupted directories now pfatal.
[unix-history] / usr / src / sbin / umount / umount.c
CommitLineData
e2d561ad 1static char *sccsid = "@(#)umount.c 4.6 (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
13struct mtab {
14 char file[NAMSIZ];
15 char spec[NAMSIZ];
16} mtab[NMOUNT];
17
15de4e1e
BJ
18char *rindex();
19int vflag, all, errs;
20
cfbe3c25 21main(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));
33again:
e2d561ad 34 if (argc > 0 && !strcmp(*argv, "-v")) {
15de4e1e
BJ
35 vflag++;
36 argc--, argv++;
37 goto again;
38 }
e2d561ad 39 if (argc > 0 && !strcmp(*argv, "-a")) {
15de4e1e
BJ
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
62umountall()
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
80struct mtab zeromtab;
81
82umountfs(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}