1 c9ed5273 2014-11-17 rsc #include <u.h>
2 c9ed5273 2014-11-17 rsc #include <libc.h>
4 c9ed5273 2014-11-17 rsc extern vlong du(char*, Dir*);
5 c9ed5273 2014-11-17 rsc extern vlong k(vlong);
6 c9ed5273 2014-11-17 rsc extern void err(char*);
7 c9ed5273 2014-11-17 rsc extern int warn(char*);
8 c9ed5273 2014-11-17 rsc extern int seen(Dir*);
17 c9ed5273 2014-11-17 rsc char *fmt = "%llud\t%s\n";
18 c9ed5273 2014-11-17 rsc vlong blocksize = 1024LL;
21 c9ed5273 2014-11-17 rsc main(int argc, char *argv[])
24 c9ed5273 2014-11-17 rsc char *s, *ss;
27 c9ed5273 2014-11-17 rsc case 'a': /* all files */
30 c9ed5273 2014-11-17 rsc case 's': /* only top level */
33 c9ed5273 2014-11-17 rsc case 'f': /* ignore errors */
36 c9ed5273 2014-11-17 rsc case 'n': /* all files, number of bytes */
40 c9ed5273 2014-11-17 rsc case 't': /* return modified/accessed time */
43 c9ed5273 2014-11-17 rsc case 'u': /* accessed time */
46 c9ed5273 2014-11-17 rsc case 'q': /* qid */
47 c9ed5273 2014-11-17 rsc fmt = "%.16llux\t%s\n";
50 c9ed5273 2014-11-17 rsc case 'b': /* block size */
53 c9ed5273 2014-11-17 rsc blocksize = strtoul(s, &ss, 0);
55 c9ed5273 2014-11-17 rsc blocksize = 1;
56 c9ed5273 2014-11-17 rsc if(*ss == 'k')
57 c9ed5273 2014-11-17 rsc blocksize *= 1024;
62 c9ed5273 2014-11-17 rsc print(fmt, du(".", dirstat(".")), ".");
64 c9ed5273 2014-11-17 rsc for(i=0; i<argc; i++)
65 c9ed5273 2014-11-17 rsc print(fmt, du(argv[i], dirstat(argv[i])), argv[i]);
70 c9ed5273 2014-11-17 rsc du(char *name, Dir *dir)
72 c9ed5273 2014-11-17 rsc int fd, i, n;
73 c9ed5273 2014-11-17 rsc Dir *buf, *d;
74 c9ed5273 2014-11-17 rsc char file[256];
77 c9ed5273 2014-11-17 rsc if(dir == nil)
78 c9ed5273 2014-11-17 rsc return warn(name);
80 c9ed5273 2014-11-17 rsc fd = open(name, OREAD);
82 c9ed5273 2014-11-17 rsc return warn(name);
84 c9ed5273 2014-11-17 rsc if((dir->qid.type&QTDIR) == 0)
85 c9ed5273 2014-11-17 rsc nk = k(dir->length);
88 c9ed5273 2014-11-17 rsc while((n=dirread(fd, &buf)) > 0) {
90 c9ed5273 2014-11-17 rsc for(i=0; i<n; i++, d++) {
91 c9ed5273 2014-11-17 rsc if((d->qid.type&QTDIR) == 0) {
92 c9ed5273 2014-11-17 rsc t = k(d->length);
95 c9ed5273 2014-11-17 rsc sprint(file, "%s/%s", name, d->name);
97 c9ed5273 2014-11-17 rsc t = d->mtime;
99 c9ed5273 2014-11-17 rsc t = d->atime;
102 c9ed5273 2014-11-17 rsc t = d->qid.path;
103 c9ed5273 2014-11-17 rsc print(fmt, t, file);
107 c9ed5273 2014-11-17 rsc if(strcmp(d->name, ".") == 0 ||
108 c9ed5273 2014-11-17 rsc strcmp(d->name, "..") == 0 ||
111 c9ed5273 2014-11-17 rsc sprint(file, "%s/%s", name, d->name);
112 c9ed5273 2014-11-17 rsc t = du(file, d);
115 c9ed5273 2014-11-17 rsc t = d->mtime;
117 c9ed5273 2014-11-17 rsc t = d->atime;
120 c9ed5273 2014-11-17 rsc t = d->qid.path;
122 c9ed5273 2014-11-17 rsc print(fmt, t, file);
132 c9ed5273 2014-11-17 rsc return dir->atime;
133 c9ed5273 2014-11-17 rsc return dir->mtime;
136 c9ed5273 2014-11-17 rsc return dir->qid.path;
140 c9ed5273 2014-11-17 rsc #define NCACHE 128 /* must be power of two */
141 c9ed5273 2014-11-17 rsc typedef struct Cache Cache;
142 c9ed5273 2014-11-17 rsc struct Cache
147 c9ed5273 2014-11-17 rsc } cache[NCACHE];
150 c9ed5273 2014-11-17 rsc seen(Dir *dir)
156 c9ed5273 2014-11-17 rsc c = &cache[dir->qid.path&(NCACHE-1)];
157 c9ed5273 2014-11-17 rsc dp = c->cache;
158 c9ed5273 2014-11-17 rsc for(i=0; i<c->n; i++, dp++)
159 c9ed5273 2014-11-17 rsc if(dir->qid.path == dp->qid.path &&
160 c9ed5273 2014-11-17 rsc dir->type == dp->type &&
161 c9ed5273 2014-11-17 rsc dir->dev == dp->dev)
163 c9ed5273 2014-11-17 rsc if(c->n == c->max){
164 c9ed5273 2014-11-17 rsc c->cache = realloc(c->cache, (c->max+=20)*sizeof(Dir));
165 c9ed5273 2014-11-17 rsc if(c->cache == 0)
166 c9ed5273 2014-11-17 rsc err("malloc failure");
168 c9ed5273 2014-11-17 rsc c->cache[c->n++] = *dir;
173 c9ed5273 2014-11-17 rsc err(char *s)
175 c9ed5273 2014-11-17 rsc fprint(2, "du: %s: %r\n", s);
180 c9ed5273 2014-11-17 rsc warn(char *s)
182 c9ed5273 2014-11-17 rsc if(fflag == 0)
183 c9ed5273 2014-11-17 rsc fprint(2, "du: %s: %r\n", s);
192 c9ed5273 2014-11-17 rsc n = (n+blocksize-1)/blocksize;
193 c9ed5273 2014-11-17 rsc return n*blocksize/1024LL;