1: static char *sccsid = "@(#)umount.c	4.3 (Berkeley) 10/15/80";
   2: #include <stdio.h>
   3: #include <fstab.h>
   4: /*
   5:  * umount
   6:  */
   7: 
   8: #define NMOUNT  16
   9: #define NAMSIZ  32
  10: 
  11: struct mtab {
  12:     char    file[NAMSIZ];
  13:     char    spec[NAMSIZ];
  14: } mtab[NMOUNT];
  15: 
  16: main(argc, argv)
  17: char **argv;
  18: {
  19:     register struct mtab *mp;
  20:     register char *p1, *p2;
  21:     int mf;
  22: 
  23:     sync();
  24:     mf = open("/etc/mtab", 0);
  25:     read(mf, (char *)mtab, NMOUNT*2*NAMSIZ);
  26:     if(argc != 2) {
  27:         printf("arg count\n");
  28:         return(1);
  29:     }
  30:     if (strcmp(argv[1], "-a") == 0){
  31:         if (setfsent() == 0)
  32:             perror(FSTAB), exit(1);
  33:         umountall();
  34:         endfsent();
  35:     } else {
  36:         int back;
  37:         if (back = umountfs(argv[1])){
  38:             if (back < 0)
  39:                 perror("umount");
  40:             exit(1);
  41:         }
  42:     }
  43:     exit(0);
  44: }
  45: /*
  46:  *	It is important to unmount the files in
  47:  *	reverse! order from the order they were mounted,
  48:  *	so that file systems mounted as children to other
  49:  *	file systems get removed in the right order.
  50:  */
  51: umountall()
  52: {
  53:     struct  fstab   fs;
  54:     struct  fstab   *fsp;
  55:     if ( (fsp = getfsent()) == 0)
  56:         return;
  57:     fs = *fsp;  /* save info locally; it is static from getfsent() */
  58:     umountall();
  59:     if (strcmp(fs.fs_file, "/") == 0)
  60:         return;
  61:     if (strcmp(fs.fs_type, FSTAB_RW) &&
  62:         strcmp(fs.fs_type, FSTAB_RO))
  63:         return;
  64:     if (umountfs(fs.fs_spec) < 0)
  65:         fprintf(stdout, "Unmount of special file %s FAILED\n", fs.fs_spec);
  66:     else
  67:         fprintf(stdout, "Unmounted special file %s\n", fs.fs_spec);
  68:     fflush(stdout);
  69: }
  70: 
  71: int umountfs(name)
  72:     char    *name;
  73: {
  74:     register    char    *p1, *p2;
  75:     register    struct  mtab    *mp;
  76:     int mf;
  77: 
  78:     if (umount(name) < 0) {
  79:         return(-1);
  80:     }
  81:     p1 = name;
  82:     while(*p1++)
  83:         ;
  84:     p1--;
  85:     while(*--p1 == '/')
  86:         *p1 = '\0';
  87:     while(p1 > name && *--p1 != '/')
  88:         ;
  89:     if(*p1 == '/')
  90:         p1++;
  91:     name = p1;
  92:     for (mp = mtab; mp < &mtab[NMOUNT]; mp++) {
  93:         p1 = name;
  94:         p2 = &mp->spec[0];
  95:         while (*p1++ == *p2)
  96:             if (*p2++ == 0) {
  97:                 for (p1 = mp->file; p1 < &mp->file[NAMSIZ*2];)
  98:                     *p1++ = 0;
  99:                 mp = &mtab[NMOUNT];
 100:                 while ((--mp)->file[0] == 0);
 101:                 mf = creat("/etc/mtab", 0644);
 102:                 write(mf, (char *)mtab, (mp-mtab+1)*2*NAMSIZ);
 103:                 return(0);
 104:             }
 105:     }
 106:     printf("%s not in mount table\n", name);
 107:     return(1);
 108: }

Defined functions

main defined in line 16; never used
umountall defined in line 51; used 2 times
umountfs defined in line 71; used 2 times

Defined variables

mtab defined in line 14; used 6 times
sccsid defined in line 1; never used

Defined struct's

mtab defined in line 11; used 4 times
  • in line 19(2), 75(2)

Defined macros

NAMSIZ defined in line 9; used 5 times
NMOUNT defined in line 8; used 4 times
Last modified: 1982-10-08
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 715
Valid CSS Valid XHTML 1.0 Strict