1 static char *sccsid = "@(#)mount.c 4.7 (Berkeley) 03/31/82"; 2 #include <stdio.h> 3 #include <fstab.h> 4 5 /* 6 * mount 7 */ 8 9 #define NMOUNT 16 10 #define NAMSIZ 32 11 12 struct mtab { 13 char file[NAMSIZ]; 14 char spec[NAMSIZ]; 15 } mtab[NMOUNT]; 16 17 int all; 18 int ro; 19 int fake; 20 int verbose; 21 22 main(argc, argv) 23 int argc; 24 char **argv; 25 { 26 register struct mtab *mp; 27 register char *np; 28 int mf; 29 30 mf = open("/etc/mtab", 0); 31 read(mf, (char *)mtab, NMOUNT*2*NAMSIZ); 32 if (argc==1) { 33 for (mp = mtab; mp < &mtab[NMOUNT]; mp++) 34 if (mp->file[0]) 35 printf("%s on %s\n", mp->spec, mp->file); 36 exit(0); 37 } 38 top: 39 if (argc > 1) { 40 if (!strcmp(argv[1], "-a")) { 41 all++; 42 argc--, argv++; 43 goto top; 44 } 45 if (!strcmp(argv[1], "-r")) { 46 ro++; 47 argc--, argv++; 48 goto top; 49 } 50 if (!strcmp(argv[1], "-f")) { 51 fake++; 52 argc--, argv++; 53 goto top; 54 } 55 if (!strcmp(argv[1], "-v")) { 56 verbose++; 57 argc--, argv++; 58 goto top; 59 } 60 } 61 if (all) { 62 struct fstab *fsp; 63 64 if (argc > 1) 65 goto argcnt; 66 close(2); dup(1); 67 if (setfsent() == 0) 68 perror(FSTAB), exit(1); 69 while ( (fsp = getfsent()) != 0) { 70 if (strcmp(fsp->fs_file, "/") == 0) 71 continue; 72 ro = !strcmp(fsp->fs_type, FSTAB_RO); 73 if (ro==0 && strcmp(fsp->fs_type, FSTAB_RW)) 74 continue; 75 mountfs(fsp->fs_spec, fsp->fs_file, ro); 76 } 77 exit(0); 78 } 79 if (argc < 2 || argc > 3) { 80 argcnt: 81 fprintf(stderr, 82 "usage: mount [ -a ] [ -r ] [ -f ] [ -v ] [ special dir ]\n"); 83 exit(1); 84 } 85 mountfs(argv[1], argv[2], ro); 86 } 87 88 mountfs(spec, name, ro) 89 char *spec, *name; 90 { 91 register char *np; 92 register struct mtab *mp; 93 int mf; 94 95 if (fake==0) { 96 if (mount(spec, name, ro) < 0) { 97 fprintf(stderr, "%s on ", spec); 98 perror(name); 99 return; 100 } 101 } 102 if (verbose) 103 fprintf(stderr, "%s on %s%s\n", spec, name, 104 ro ? " read only" : ""); 105 np = spec; 106 while (*np++) 107 ; 108 np--; 109 while (*--np == '/') 110 *np = '\0'; 111 while (np > spec && *--np != '/') 112 ; 113 if (*np == '/') 114 np++; 115 spec = np; 116 for (mp = mtab; mp < &mtab[NMOUNT]; mp++) 117 if (!strcmp(mp->spec, spec)) 118 goto replace; 119 for (mp = mtab; mp < &mtab[NMOUNT]; mp++) 120 if (mp->file[0] == 0) 121 goto replace; 122 return; 123 replace: 124 for (np = mp->spec; np < &mp->spec[NAMSIZ-1];) 125 if ((*np++ = *spec++) == 0) 126 spec--; 127 for (np = mp->file; np < &mp->file[NAMSIZ-1];) 128 if ((*np++ = *name++) == 0) 129 name--; 130 mp = &mtab[NMOUNT]; 131 while ((--mp)->file[0] == 0); 132 mf = creat("/etc/mtab", 0644); 133 write(mf, (char *)mtab, (mp-mtab+1)*2*NAMSIZ); 134 close(mf); 135 return; 136 } 137