|
|
1.1 ! root 1: #ifndef lint ! 2: static char *sccsid = "@(#)mount.c 4.10 (Berkeley) 5/28/83"; ! 3: #endif ! 4: ! 5: /* ! 6: * mount ! 7: */ ! 8: #include <sys/param.h> ! 9: ! 10: #include <stdio.h> ! 11: #include <fstab.h> ! 12: #include <mtab.h> ! 13: ! 14: #define DNMAX (sizeof (mtab[0].m_dname) - 1) ! 15: #define PNMAX (sizeof (mtab[0].m_path) - 1) ! 16: ! 17: struct mtab mtab[NMOUNT]; ! 18: ! 19: int all; ! 20: int ro; ! 21: int fake; ! 22: int verbose; ! 23: char *index(), *rindex(); ! 24: ! 25: main(argc, argv) ! 26: int argc; ! 27: char **argv; ! 28: { ! 29: register struct mtab *mp; ! 30: register char *np; ! 31: int mf; ! 32: char *type = FSTAB_RW; ! 33: ! 34: mf = open("/etc/mtab", 0); ! 35: read(mf, (char *)mtab, sizeof (mtab)); ! 36: if (argc == 1) { ! 37: for (mp = mtab; mp < &mtab[NMOUNT]; mp++) ! 38: if (mp->m_path[0] != '\0') ! 39: prmtab(mp); ! 40: exit(0); ! 41: } ! 42: top: ! 43: if (argc > 1) { ! 44: if (!strcmp(argv[1], "-a")) { ! 45: all++; ! 46: argc--, argv++; ! 47: goto top; ! 48: } ! 49: if (!strcmp(argv[1], "-r")) { ! 50: type = FSTAB_RO; ! 51: argc--, argv++; ! 52: goto top; ! 53: } ! 54: if (!strcmp(argv[1], "-f")) { ! 55: fake++; ! 56: argc--, argv++; ! 57: goto top; ! 58: } ! 59: if (!strcmp(argv[1], "-v")) { ! 60: verbose++; ! 61: argc--, argv++; ! 62: goto top; ! 63: } ! 64: } ! 65: if (all) { ! 66: struct fstab *fsp; ! 67: ! 68: if (argc > 1) ! 69: goto argcnt; ! 70: close(2); dup(1); ! 71: if (setfsent() == 0) ! 72: perror(FSTAB), exit(1); ! 73: while ((fsp = getfsent()) != 0) { ! 74: if (strcmp(fsp->fs_file, "/") == 0) ! 75: continue; ! 76: if (strcmp(fsp->fs_type, FSTAB_RO) && ! 77: strcmp(fsp->fs_type, FSTAB_RW) && ! 78: strcmp(fsp->fs_type, FSTAB_RQ)) ! 79: continue; ! 80: mountfs(fsp->fs_spec, fsp->fs_file, fsp->fs_type); ! 81: } ! 82: exit(0); ! 83: } ! 84: if (argc == 2) { ! 85: struct fstab *fs; ! 86: ! 87: if (setfsent() == 0) ! 88: perror(FSTAB), exit(1); ! 89: fs = getfsfile(argv[1]); ! 90: if (fs == NULL) ! 91: goto argcnt; ! 92: mountfs(fs->fs_spec, fs->fs_file, type); ! 93: exit(0); ! 94: } ! 95: if (argc != 3) { ! 96: argcnt: ! 97: fprintf(stderr, ! 98: "usage: mount [ -a ] [ -r ] [ -f ] [ -v ] [ special dir ] [ dir ]\n"); ! 99: exit(1); ! 100: } ! 101: mountfs(argv[1], argv[2], type); ! 102: } ! 103: ! 104: prmtab(mp) ! 105: register struct mtab *mp; ! 106: { ! 107: ! 108: printf("%s on %s", mp->m_dname, mp->m_path); ! 109: if (strcmp(mp->m_type, FSTAB_RO) == 0) ! 110: printf("\t(read-only)"); ! 111: if (strcmp(mp->m_type, FSTAB_RQ) == 0) ! 112: printf("\t(with quotas)"); ! 113: putchar('\n'); ! 114: } ! 115: ! 116: mountfs(spec, name, type) ! 117: char *spec, *name, *type; ! 118: { ! 119: register char *np; ! 120: register struct mtab *mp; ! 121: int mf; ! 122: ! 123: if (!fake) { ! 124: if (mount(spec, name, strcmp(type, FSTAB_RO) == 0) < 0) { ! 125: fprintf(stderr, "%s on ", spec); ! 126: perror(name); ! 127: return; ! 128: } ! 129: /* we don't do quotas.... */ ! 130: if (strcmp(type, FSTAB_RQ) == 0) ! 131: type = FSTAB_RW; ! 132: } ! 133: np = index(spec, '\0'); ! 134: while (*--np == '/') ! 135: *np = '\0'; ! 136: np = rindex(spec, '/'); ! 137: if (np) { ! 138: *np++ = '\0'; ! 139: spec = np; ! 140: } ! 141: for (mp = mtab; mp < &mtab[NMOUNT]; mp++) ! 142: if (strcmp(mp->m_dname, spec) == 0) ! 143: goto replace; ! 144: for (mp = mtab; mp < &mtab[NMOUNT]; mp++) ! 145: if (mp->m_path[0] == '\0') ! 146: goto replace; ! 147: return; ! 148: replace: ! 149: strncpy(mp->m_dname, spec, DNMAX); ! 150: mp->m_dname[DNMAX] = '\0'; ! 151: strncpy(mp->m_path, name, PNMAX); ! 152: mp->m_path[PNMAX] = '\0'; ! 153: strcpy(mp->m_type, type); ! 154: if (verbose) ! 155: prmtab(mp); ! 156: mp = mtab + NMOUNT - 1; ! 157: while (mp > mtab && mp->m_path[0] == '\0') ! 158: --mp; ! 159: mf = creat("/etc/mtab", 0644); ! 160: write(mf, (char *)mtab, (mp - mtab + 1) * sizeof (struct mtab)); ! 161: close(mf); ! 162: return; ! 163: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.