1: /* 2: * Copyright (c) 1980 Regents of the University of California. 3: * All rights reserved. The Berkeley software License Agreement 4: * specifies the terms and conditions for redistribution. 5: */ 6: 7: #ifndef lint 8: char copyright[] = 9: "@(#) Copyright (c) 1980 Regents of the University of California.\n\ 10: All rights reserved.\n"; 11: #endif not lint 12: 13: #ifndef lint 14: static char sccsid[] = "@(#)mount.c 5.2 (Berkeley) 11/21/85"; 15: #endif not lint 16: 17: /* 18: * mount 19: */ 20: #include <sys/param.h> 21: 22: #include <stdio.h> 23: #include <fstab.h> 24: #include <mtab.h> 25: #include <errno.h> 26: 27: #define DNMAX (sizeof (mtab[0].m_dname) - 1) 28: #define PNMAX (sizeof (mtab[0].m_path) - 1) 29: 30: struct mtab mtab[NMOUNT]; 31: 32: int all; 33: int ro; 34: int fake; 35: int verbose; 36: char *index(), *rindex(); 37: 38: main(argc, argv) 39: int argc; 40: char **argv; 41: { 42: register struct mtab *mp; 43: register char *np; 44: int mf; 45: char *type = FSTAB_RW; 46: 47: mf = open("/etc/mtab", 0); 48: read(mf, (char *)mtab, sizeof (mtab)); 49: if (argc == 1) { 50: for (mp = mtab; mp < &mtab[NMOUNT]; mp++) 51: if (mp->m_path[0] != '\0') 52: prmtab(mp); 53: exit(0); 54: } 55: top: 56: if (argc > 1) { 57: if (!strcmp(argv[1], "-a")) { 58: all++; 59: argc--, argv++; 60: goto top; 61: } 62: if (!strcmp(argv[1], "-r")) { 63: type = FSTAB_RO; 64: argc--, argv++; 65: goto top; 66: } 67: if (!strcmp(argv[1], "-f")) { 68: fake++; 69: argc--, argv++; 70: goto top; 71: } 72: if (!strcmp(argv[1], "-v")) { 73: verbose++; 74: argc--, argv++; 75: goto top; 76: } 77: } 78: if (all) { 79: struct fstab *fsp; 80: 81: if (argc > 1) 82: goto argcnt; 83: close(2); dup(1); 84: if (setfsent() == 0) 85: perror(FSTAB), exit(1); 86: while ((fsp = getfsent()) != 0) { 87: if (strcmp(fsp->fs_file, "/") == 0) 88: continue; 89: if (strcmp(fsp->fs_type, FSTAB_RO) && 90: strcmp(fsp->fs_type, FSTAB_RW) && 91: strcmp(fsp->fs_type, FSTAB_RQ)) 92: continue; 93: mountfs(fsp->fs_spec, fsp->fs_file, fsp->fs_type); 94: } 95: exit(0); 96: } 97: if (argc == 2) { 98: struct fstab *fs; 99: 100: if (setfsent() == 0) 101: perror(FSTAB), exit(1); 102: fs = getfsfile(argv[1]); 103: if (fs == NULL) 104: goto argcnt; 105: if (strcmp(fs->fs_type, FSTAB_RO) && 106: strcmp(fs->fs_type, FSTAB_RW) && 107: strcmp(fs->fs_type, FSTAB_RQ)) 108: goto argcnt; 109: mountfs(fs->fs_spec, fs->fs_file, fs->fs_type); 110: exit(0); 111: } 112: if (argc != 3) { 113: argcnt: 114: fprintf(stderr, 115: "usage: mount [ -a ] [ -r ] [ -f ] [ -v ] [ special dir ] [ dir ]\n"); 116: exit(1); 117: } 118: mountfs(argv[1], argv[2], type); 119: } 120: 121: prmtab(mp) 122: register struct mtab *mp; 123: { 124: 125: printf("%s on %s", mp->m_dname, mp->m_path); 126: if (strcmp(mp->m_type, FSTAB_RO) == 0) 127: printf("\t(read-only)"); 128: if (strcmp(mp->m_type, FSTAB_RQ) == 0) 129: printf("\t(with quotas)"); 130: putchar('\n'); 131: } 132: 133: mountfs(spec, name, type) 134: char *spec, *name, *type; 135: { 136: register char *np; 137: register struct mtab *mp; 138: int mf; 139: 140: if (!fake) { 141: if (mount(spec, name, strcmp(type, FSTAB_RO) == 0) < 0) { 142: extern int errno; 143: char *cp; 144: 145: fprintf(stderr, "%s on ", spec); 146: switch (errno) { 147: 148: case EMFILE: 149: cp = "Mount table full"; 150: break; 151: 152: case EINVAL: 153: cp = "Bogus super block"; 154: break; 155: 156: default: 157: perror(name); 158: return; 159: } 160: fprintf(stderr, "%s: %s\n", name, cp); 161: return; 162: } 163: /* we don't do quotas.... */ 164: if (strcmp(type, FSTAB_RQ) == 0) 165: type = FSTAB_RW; 166: } 167: np = index(spec, '\0'); 168: while (*--np == '/') 169: *np = '\0'; 170: np = rindex(spec, '/'); 171: if (np) { 172: *np++ = '\0'; 173: spec = np; 174: } 175: for (mp = mtab; mp < &mtab[NMOUNT]; mp++) 176: if (strcmp(mp->m_dname, spec) == 0) 177: goto replace; 178: for (mp = mtab; mp < &mtab[NMOUNT]; mp++) 179: if (mp->m_path[0] == '\0') 180: goto replace; 181: return; 182: replace: 183: strncpy(mp->m_dname, spec, DNMAX); 184: mp->m_dname[DNMAX] = '\0'; 185: strncpy(mp->m_path, name, PNMAX); 186: mp->m_path[PNMAX] = '\0'; 187: strcpy(mp->m_type, type); 188: if (verbose) 189: prmtab(mp); 190: mp = mtab + NMOUNT - 1; 191: while (mp > mtab && mp->m_path[0] == '\0') 192: --mp; 193: mf = creat("/etc/mtab", 0644); 194: write(mf, (char *)mtab, (mp - mtab + 1) * sizeof (struct mtab)); 195: close(mf); 196: return; 197: }