|
|
1.1 root 1: #include "stdio.h"
2: #include "sys/param.h"
3: #include "sys/stat.h"
4: #include "ndir.h"
5: #include "ftw.h"
6:
7: enum Params {Maxpathlen=1024, Nlinks=600};
8: char flags[128]; /* -a, -s */
9: char buf[Maxpathlen];
10: unsigned long totlen, dirlen[Maxpathlen];
11: struct {
12: int ino, dev;
13: } ml[Nlinks];
14: int nlink, follow, level;
15: extern int errno;
16:
17: main(argc, argv)
18: char **argv;
19: { extern char *optarg;
20: extern int optind;
21: int c;
22:
23: while((c = getopt(argc, argv, "as")) != -1)
24: switch(c) {
25: default:
26: fprintf(stderr, "usage: %s [-a] [-s] [files]\n", argv[0]);
27: exit(1);
28: case 'a': case 's':
29: flags[c]++;
30: break;
31: }
32: if(optind >= argc) {
33: doit(".");
34: if(flags['s'])
35: printf("%d\t%s\n", totlen, argv[optind]);
36: }
37: else
38: for(; optind < argc; optind++) {
39: follow = 1;
40: doit(argv[optind]);
41: if(flags['s'])
42: printf("%d\t%s\n", totlen, argv[optind]);
43: totlen = 0;
44: }
45: exit(0);
46: }
47:
48: fn(name, stb, code, s)
49: char *name;
50: struct stat *stb;
51: struct FTW *s;
52: { int n;
53: if(follow) {
54: follow = 0;
55: if(code == FTW_SL) {
56: s->quit = FTW_FOLLOW;
57: return(0);
58: }
59: }
60: switch(code) {
61: case FTW_D:
62: dirlen[++level] = 0;
63: case FTW_SL:
64: case FTW_F: /* stupid size semantics (BSIZE not networked) */
65: common:
66: if(seenit(stb))
67: return(0);
68: n = ((stb->st_size + BSIZE(stb->st_dev)-1) >> BSHIFT(stb->st_dev))
69: * (BSIZE(stb->st_dev)/1024);
70: totlen += n;
71: dirlen[level] += n;
72: if(flags['a'])
73: printf("%d\t%s%s\n", n, name, code==FTW_D? "/": "");
74: break;
75: case FTW_DP:
76: if(!flags['s']) {
77: printf("%d\t%s\n", dirlen[level], name);
78: fflush(stdout); /* bogus new stdio */
79: }
80: dirlen[level-1] += dirlen[level];
81: level--;
82: break;
83: case FTW_DNR:
84: perror(name);
85: goto common;
86: case FTW_NS:
87: case FTW_NSL:
88: perror(name);
89: }
90: return(0);
91: }
92:
93: doit(s)
94: char *s;
95: {
96: level = 0;
97: ftw(s, fn, 100);
98: }
99:
100: seenit(s)
101: struct stat *s;
102: { int i;
103: if(s->st_nlink == 1 || (s->st_mode & S_IFMT) != S_IFREG)
104: return(0);
105: for(i = 0; i < nlink; i++)
106: if(ml[i].ino == s->st_ino && ml[i].dev == s->st_dev)
107: return(1);
108: if(i < Nlinks) {
109: ml[i].ino = s->st_ino;
110: ml[i].dev = s->st_dev;
111: nlink++;
112: }
113: return(0);
114: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.