# 2.11BSD#431 - /usr/src/bin/du.c

##### Functions

    descend           X
    main              X

##### Variables

    aflg              X
    dirp              X
    dot               X
    mlx               X
    name              X
    path              X
    sflg              X

##### Macros

    ML                X
    kb                X

       1: #ifndef lint
       2: static char *sccsid = "@(#)du.c	4.11 (Berkeley) 7/1/83";
       3: #endif
       4:
       5: #include <stdio.h>
       6: #include <sys/param.h>
       7: #include <sys/stat.h>
       8: #include <sys/dir.h>
       9:
      10: char    path[BUFSIZ], name[BUFSIZ];
      11: int aflg;
      12: int sflg;
      13: char    *dot = ".";
      14:
      15: #define ML  1000
      16: struct {
      17:     int dev;
      18:     ino_t   ino;
      19: } ml[ML];
      20: int mlx;
      21:
      22: long    descend();
      23: char    *index(), *rindex(), *strcpy(), *sprintf();
      24:
      25: #define kb(n)   (howmany(dbtob(n), 1024))
      26:
      27: main(argc, argv)
      28:     int argc;
      29:     char **argv;
      30: {
      31:     long blocks = 0;
      32:     register char *np;
      33:     int pid;
      34:
      35:     argc--, argv++;
      36: again:
      37:     if (argc && !strcmp(*argv, "-s")) {
      38:         sflg++;
      39:         argc--, argv++;
      40:         goto again;
      41:     }
      42:     if (argc && !strcmp(*argv, "-a")) {
      43:         aflg++;
      44:         argc--, argv++;
      45:         goto again;
      46:     }
      47:     if (argc == 0) {
      48:         argv = &dot;
      49:         argc = 1;
      50:     }
      51:     do {
      52:         if (argc > 1) {
      53:             pid = fork();
      54:             if (pid == -1) {
      55:                 fprintf(stderr, "No more processes.\n");
      56:                 exit(1);
      57:             }
      58:             if (pid != 0)
      59:                 wait((int *)0);
      60:         }
      61:         if (argc == 1 || pid == 0) {
      62:             (void) strcpy(path, *argv);
      63:             (void) strcpy(name, *argv);
      64:             if (np = rindex(name, '/')) {
      65:                 *np++ = '\0';
      66:                 if (chdir(*name ? name : "/") < 0) {
      67:                     perror(*name ? name : "/");
      68:                     exit(1);
      69:                 }
      70:             } else
      71:                 np = path;
      72:             blocks = descend(path, *np ? np : ".");
      73:             if (sflg)
      74:                 printf("%ld\t%s\n", kb(blocks), path);
      75:             if (argc > 1)
      76:                 exit(1);
      77:         }
      78:         argc--, argv++;
      79:     } while (argc > 0);
      80:     exit(0);
      81: }
      82:
      83: DIR *dirp = NULL;
      84:
      85: long
      86: descend(base, name)
      87:     char *base, *name;
      88: {
      89:     char *ebase0, *ebase;
      90:     struct stat stb;
      91:     int i;
      92:     long blocks = 0;
      93:     long curoff = NULL;
      94:     register struct direct *dp;
      95:
      96:     ebase0 = ebase = index(base, 0);
      97:     if (ebase > base && ebase[-1] == '/')
      98:         ebase--;
      99:     if (lstat(name, &stb) < 0) {
     100:         perror(base);
     101:         *ebase0 = 0;
     102:         return (0);
     103:     }
     104:     if (stb.st_nlink > 1 && (stb.st_mode&S_IFMT) != S_IFDIR) {
     105:         for (i = 0; i <= mlx; i++)
     106:             if (ml[i].ino == stb.st_ino && ml[i].dev == stb.st_dev)
     107:                 return (0);
     108:         if (mlx < ML) {
     109:             ml[mlx].dev = stb.st_dev;
     110:             ml[mlx].ino = stb.st_ino;
     111:             mlx++;
     112:         }
     113:     }
     114:     blocks = stb.st_blocks;
     115:     if ((stb.st_mode&S_IFMT) != S_IFDIR) {
     116:         if (aflg)
     117:             printf("%ld\t%s\n", kb(blocks), base);
     118:         return (blocks);
     119:     }
     120:     if (dirp != NULL)
     121:         closedir(dirp);
     122:     dirp = opendir(name);
     123:     if (dirp == NULL) {
     124:         perror(base);
     125:         *ebase0 = 0;
     126:         return (0);
     127:     }
     128:     if (chdir(name) < 0) {
     129:         perror(base);
     130:         *ebase0 = 0;
     131:         closedir(dirp);
     132:         dirp = NULL;
     133:         return (0);
     134:     }
     135:     while (dp = readdir(dirp)) {
     136:         if (!strcmp(dp->d_name, ".") || !strcmp(dp->d_name, ".."))
     137:             continue;
     138:         (void) sprintf(ebase, "/%s", dp->d_name);
     139:         curoff = telldir(dirp);
     140:         blocks += descend(base, ebase+1);
     141:         *ebase = 0;
     142:         if (dirp == NULL) {
     143:             dirp = opendir(".");
     144:             if (dirp == NULL) {
     145:                 perror(".");
     146:                 return (0);
     147:             }
     148:             seekdir(dirp, curoff);
     149:         }
     150:     }
     151:     closedir(dirp);
     152:     dirp = NULL;
     153:     if (sflg == 0)
     154:         printf("%ld\t%s\n", kb(blocks), base);
     155:     if (chdir("..") < 0) {
     156:         (void) sprintf(index(base, 0), "/..");
     157:         perror(base);
     158:         exit(1);
     159:     }
     160:     *ebase0 = 0;
     161:     return (blocks);
     162: }

#### Defined functions

descend defined in line 85; used 3 times

- in line 22, 72, 140

main defined in line 27; never used

#### Defined variables

aflg defined in line 11; used 2 times

- in line 43, 116

dirp defined in line 83; used 14 times

- in line 120-123(4), 131-152(10)

dot defined in line 13; used 1 times

- in line 48

mlx defined in line 20; used 5 times

- in line 105-111(5)

name defined in line 10; used 11 times

- in line 63-67(6), 86-87(2), 99, 122, 128

path defined in line 10; used 4 times

- in line 62, 71-74(3)

sccsid defined in line 2; never used
sflg defined in line 12; used 3 times

- in line 38, 73, 153

#### Defined macros

ML defined in line 15; used 2 times

- in line 19, 108

kb defined in line 25; used 3 times

- in line 74, 117, 154

Last modified: 1987-02-08 Generated: 2016-12-26 | Generated by src2html V0.67 page hit count: 1592 |