|
|
1.1 ! root 1: /* ! 2: * Unmount a filesystem ! 3: */ ! 4: ! 5: char helpmessage[] = "\ ! 6: \ ! 7: umount -- unmount file system\n\ ! 8: Usage: /etc/umount special\n\ ! 9: The block special file 'special' previously mounted by '/etc/mount'\n\ ! 10: on 'directory' is unmounted and the previous contents of 'directory'\n\ ! 11: are once again accessible.\n\ ! 12: A file system can only be unmounted if all its files are closed.\n\ ! 13: \ ! 14: "; ! 15: ! 16: #include <stdio.h> ! 17: #include <mtab.h> ! 18: #include <mnttab.h> ! 19: #include <errno.h> ! 20: ! 21: char mtabf[] = "/etc/mtab"; ! 22: char mnttabf[] = "/etc/mnttab"; ! 23: ! 24: struct mtab mtab; ! 25: struct mnttab mnttab; ! 26: struct mtab zmtab; ! 27: struct mnttab zmnttab; ! 28: char special[MNAMSIZ]; ! 29: ! 30: main(argc, argv) ! 31: char *argv[]; ! 32: { ! 33: register FILE *fp; ! 34: ! 35: if (argc != 2) ! 36: usage(); ! 37: if (umount(argv[1]) < 0) ! 38: merror(argv[1]); ! 39: if ((fp = fopen(mnttabf, "r+w")) != NULL) { ! 40: mcopy(argv[1], special); ! 41: while (fread(&mnttab, sizeof(mnttab), 1, fp) == 1) ! 42: if (mnttab.mt_dev[0] != '\0' ! 43: && strncmp(mnttab.mt_filsys, special, MNTNSIZ)==0) { ! 44: fseek(fp, (long)(-sizeof(mnttab)), 1); ! 45: if (fwrite(&zmnttab,sizeof(zmnttab),1,fp) != 1) ! 46: merror(mnttabf); ! 47: break; ! 48: } ! 49: } ! 50: if ((fp = fopen(mtabf, "r+w")) != NULL) { ! 51: mcopy(argv[1], special); ! 52: while (fread(&mtab, sizeof(mtab), 1, fp) == 1) ! 53: if (mtab.mt_name[0] != '\0' ! 54: && strncmp(mtab.mt_special, special, MNAMSIZ)==0) { ! 55: fseek(fp, (long)(-sizeof(mtab)), 1); ! 56: if (fwrite(&zmtab, sizeof(zmtab), 1, fp) != 1) ! 57: merror(mtabf); ! 58: break; ! 59: } ! 60: } ! 61: return (0); ! 62: } ! 63: ! 64: usage() ! 65: { ! 66: fprintf(stderr, helpmessage); ! 67: exit (1); ! 68: } ! 69: ! 70: merror(f) ! 71: char *f; ! 72: { ! 73: register int err; ! 74: extern int errno; ! 75: ! 76: err = errno; ! 77: fprintf(stderr, "umount: %r", &f); ! 78: if (err > 0 && err < sys_nerr) ! 79: fprintf(stderr, ": %s\n", sys_errlist[err]); ! 80: else ! 81: fprintf(stderr, ": unrecognized error: %d\n", err); ! 82: exit(1); ! 83: } ! 84: ! 85: /* ! 86: * Copy special pathname (stripped of ! 87: * leading directories) into a fixed ! 88: * size buffer. ! 89: */ ! 90: mcopy(ms, buf) ! 91: char *ms, *buf; ! 92: { ! 93: register char *p1, *p2; ! 94: ! 95: for (p1=p2=ms; *p1 != '\0'; ) ! 96: if (*p1++ == '/') ! 97: p2 = p1; ! 98: p1 = buf; ! 99: while (*p1++ = *p2++) ! 100: ; ! 101: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.