|
|
1.1 ! root 1: static char *sccsid = "@(#)umount.c 4.3 (Berkeley) 10/15/80"; ! 2: #include <stdio.h> ! 3: #include <fstab.h> ! 4: #include <errno.h> ! 5: extern int errno; ! 6: /* ! 7: * umount ! 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: ! 18: main(argc, argv) ! 19: char **argv; ! 20: { ! 21: register struct mtab *mp; ! 22: register char *p1, *p2; ! 23: int mf; ! 24: ! 25: sync(); ! 26: mf = open("/etc/mtab", 0); ! 27: read(mf, (char *)mtab, NMOUNT*2*NAMSIZ); ! 28: if(argc != 2) { ! 29: fprintf(stderr, "usage: umount [filsys] [-a]\n"); ! 30: exit(1); ! 31: } ! 32: if (strcmp(argv[1], "-a") == 0){ ! 33: if (setfsent() == 0) ! 34: perror(FSTAB), exit(1); ! 35: umountall(); ! 36: endfsent(); ! 37: } else { ! 38: int back; ! 39: if (back = umountfs(argv[1])){ ! 40: if (back < 0) ! 41: perror(argv[1]); ! 42: exit(1); ! 43: } ! 44: } ! 45: exit(0); ! 46: } ! 47: /* ! 48: * It is important to unmount the files in ! 49: * reverse! order from the order they were mounted, ! 50: * so that file systems mounted as children to other ! 51: * file systems get removed in the right order. ! 52: */ ! 53: umountall() ! 54: { ! 55: struct fstab fs; ! 56: struct fstab *fsp; ! 57: if ( (fsp = getfsent()) == 0) ! 58: return; ! 59: fs = *fsp; /* save info locally; it is static from getfsent() */ ! 60: umountall(); ! 61: if (strcmp(fs.fs_file, "/") == 0) ! 62: return; ! 63: if (strcmp(fs.fs_type, FSTAB_RW) && ! 64: strcmp(fs.fs_type, FSTAB_RO)) ! 65: return; ! 66: if (umountfs(fs.fs_spec) < 0 ! 67: && errno != EINVAL) /* wasn't mounted, don't babble */ ! 68: fprintf(stdout, "can't unmount %s\n", fs.fs_spec); ! 69: fflush(stdout); ! 70: } ! 71: ! 72: int umountfs(name) ! 73: char *name; ! 74: { ! 75: register char *p1, *p2; ! 76: register struct mtab *mp; ! 77: int mf; ! 78: ! 79: if (umount(name) < 0) ! 80: return(-1); ! 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.