1: static char *sccsid = "@(#)umount.c 4.3 (Berkeley) 10/15/80";
2: #include <stdio.h>
3: #include <fstab.h>
4: /*
5: * umount
6: */
7:
8: #define NMOUNT 16
9: #define NAMSIZ 32
10:
11: struct mtab {
12: char file[NAMSIZ];
13: char spec[NAMSIZ];
14: } mtab[NMOUNT];
15:
16: main(argc, argv)
17: char **argv;
18: {
19: register struct mtab *mp;
20: register char *p1, *p2;
21: int mf;
22:
23: sync();
24: mf = open("/etc/mtab", 0);
25: read(mf, (char *)mtab, NMOUNT*2*NAMSIZ);
26: if(argc != 2) {
27: printf("arg count\n");
28: return(1);
29: }
30: if (strcmp(argv[1], "-a") == 0){
31: if (setfsent() == 0)
32: perror(FSTAB), exit(1);
33: umountall();
34: endfsent();
35: } else {
36: int back;
37: if (back = umountfs(argv[1])){
38: if (back < 0)
39: perror("umount");
40: exit(1);
41: }
42: }
43: exit(0);
44: }
45: /*
46: * It is important to unmount the files in
47: * reverse! order from the order they were mounted,
48: * so that file systems mounted as children to other
49: * file systems get removed in the right order.
50: */
51: umountall()
52: {
53: struct fstab fs;
54: struct fstab *fsp;
55: if ( (fsp = getfsent()) == 0)
56: return;
57: fs = *fsp; /* save info locally; it is static from getfsent() */
58: umountall();
59: if (strcmp(fs.fs_file, "/") == 0)
60: return;
61: if (strcmp(fs.fs_type, FSTAB_RW) &&
62: strcmp(fs.fs_type, FSTAB_RO))
63: return;
64: if (umountfs(fs.fs_spec) < 0)
65: fprintf(stdout, "Unmount of special file %s FAILED\n", fs.fs_spec);
66: else
67: fprintf(stdout, "Unmounted special file %s\n", fs.fs_spec);
68: fflush(stdout);
69: }
70:
71: int umountfs(name)
72: char *name;
73: {
74: register char *p1, *p2;
75: register struct mtab *mp;
76: int mf;
77:
78: if (umount(name) < 0) {
79: return(-1);
80: }
81: p1 = name;
82: while(*p1++)
83: ;
84: p1--;
85: while(*--p1 == '/')
86: *p1 = '\0';
87: while(p1 > name && *--p1 != '/')
88: ;
89: if(*p1 == '/')
90: p1++;
91: name = p1;
92: for (mp = mtab; mp < &mtab[NMOUNT]; mp++) {
93: p1 = name;
94: p2 = &mp->spec[0];
95: while (*p1++ == *p2)
96: if (*p2++ == 0) {
97: for (p1 = mp->file; p1 < &mp->file[NAMSIZ*2];)
98: *p1++ = 0;
99: mp = &mtab[NMOUNT];
100: while ((--mp)->file[0] == 0);
101: mf = creat("/etc/mtab", 0644);
102: write(mf, (char *)mtab, (mp-mtab+1)*2*NAMSIZ);
103: return(0);
104: }
105: }
106: printf("%s not in mount table\n", name);
107: return(1);
108: }
Defined functions
main
defined in line
16;
never used
Defined variables
mtab
defined in line
14; used 6 times
sccsid
defined in line
1;
never used
Defined struct's
mtab
defined in line
11; used 4 times
Defined macros
NAMSIZ
defined in line
9; used 5 times
NMOUNT
defined in line
8; used 4 times