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: }

Defined functions

main defined in line 38; never used
mountfs defined in line 133; used 3 times
prmtab defined in line 121; used 2 times

Defined variables

all defined in line 32; used 2 times
copyright defined in line 8; never used
fake defined in line 34; used 2 times
mtab defined in line 30; used 14 times
ro defined in line 33; never used
sccsid defined in line 14; never used
verbose defined in line 35; used 2 times

Defined macros

DNMAX defined in line 27; used 2 times
PNMAX defined in line 28; used 2 times
Last modified: 1985-11-22
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 1360
Valid CSS Valid XHTML 1.0 Strict