|
|
1.1 root 1: static char *sccsid = "@(#)quot.c 4.1 (Berkeley) 10/1/80";
2: /*
3: * Disk usage by user
4: */
5:
6: char *dargv[] = {
7: "/dev/rrp3",
8: 0
9: };
10:
11: #include <stdio.h>
12: #include <ctype.h>
13: #include <pwd.h>
14: #include <sys/param.h>
15: #include <sys/ino.h>
16: #include <sys/inode.h>
17: #include <sys/filsys.h>
18:
19: #define ITABSZ 256
20: #define ISIZ (BSIZE/sizeof(struct dinode))
21: #define NUID 1000
22: struct filsys sblock;
23: struct dinode itab[ITABSZ];
24: struct du
25: {
26: long blocks;
27: long nfiles;
28: int uid;
29: char *name;
30: } du[NUID];
31: #define TSIZE 500
32: int sizes[TSIZE];
33: long overflow;
34:
35: int nflg;
36: int fflg;
37: int cflg;
38:
39: int fi;
40: unsigned ino;
41: unsigned nfiles;
42:
43: struct passwd *getpwent();
44: char *malloc();
45: char *copy();
46:
47: main(argc, argv)
48: char **argv;
49: {
50: register int n;
51: register struct passwd *lp;
52: register char **p;
53:
54: for(n=0; n<NUID; n++)
55: du[n].uid = n;
56: while((lp=getpwent()) != 0) {
57: n = lp->pw_uid;
58: if (n>NUID)
59: continue;
60: if(du[n].name)
61: continue;
62: du[n].name = copy(lp->pw_name);
63: }
64: if (argc == 1) {
65: for (p = dargv; *p;) {
66: check(*p++);
67: report();
68: }
69: return(0);
70: }
71: while (--argc) {
72: argv++;
73: if (argv[0][0]=='-') {
74: if (argv[0][1]=='n')
75: nflg++;
76: else if (argv[0][1]=='f')
77: fflg++;
78: else if (argv[0][1]=='c')
79: cflg++;
80: } else {
81: check(*argv);
82: report();
83: }
84: }
85: return(0);
86: }
87:
88: check(file)
89: char *file;
90: {
91: register unsigned i, j;
92: register c;
93:
94: fi = open(file, 0);
95: if (fi < 0) {
96: printf("cannot open %s\n", file);
97: return;
98: }
99: printf("%s:\n", file);
100: sync();
101: bread(1, (char *)&sblock, sizeof sblock);
102: nfiles = (sblock.s_isize-2)*(BSIZE/sizeof(struct dinode));
103: ino = 0;
104: if (nflg) {
105: if (isdigit(c = getchar()))
106: ungetc(c, stdin);
107: else while (c!='\n' && c != EOF)
108: c = getchar();
109: }
110: for(i=2; ino<nfiles; i += ITABSZ/ISIZ) {
111: bread(i, (char *)itab, sizeof itab);
112: for (j=0; j<ITABSZ && ino<nfiles; j++) {
113: ino++;
114: acct(&itab[j]);
115: }
116: }
117: }
118:
119: acct(ip)
120: register struct dinode *ip;
121: {
122: register n;
123: register char *np;
124: static fino;
125:
126: if ((ip->di_mode&IFMT) == 0)
127: return;
128: if (cflg) {
129: if ((ip->di_mode&IFMT)!=IFDIR && (ip->di_mode&IFMT)!=IFREG)
130: return;
131: n = (ip->di_size+BSIZE-1)/BSIZE;
132: if (n >= TSIZE) {
133: overflow += n;
134: n = TSIZE-1;
135: }
136: sizes[n]++;
137: return;
138: }
139: if (ip->di_uid >= NUID)
140: return;
141: du[ip->di_uid].blocks += (ip->di_size+BSIZE-1)/BSIZE;
142: du[ip->di_uid].nfiles++;
143: if (nflg) {
144: tryagain:
145: if (fino==0)
146: if (scanf("%d", &fino)<=0)
147: return;
148: if (fino > ino)
149: return;
150: if (fino<ino) {
151: while ((n=getchar())!='\n' && n!=EOF)
152: ;
153: fino = 0;
154: goto tryagain;
155: }
156: if (np = du[ip->di_uid].name)
157: printf("%.7s ", np);
158: else
159: printf("%d ", ip->di_uid);
160: while ((n = getchar())==' ' || n=='\t')
161: ;
162: putchar(n);
163: while (n!=EOF && n!='\n') {
164: n = getchar();
165: putchar(n);
166: }
167: fino = 0;
168: }
169: }
170:
171: bread(bno, buf, cnt)
172: unsigned bno;
173: char *buf;
174: {
175:
176: lseek(fi, (long)bno*BSIZE, 0);
177: if (read(fi, buf, cnt) != cnt) {
178: printf("read error %u\n", bno);
179: exit(1);
180: }
181: }
182:
183: qcmp(p1, p2)
184: register struct du *p1, *p2;
185: {
186: if (p1->blocks > p2->blocks)
187: return(-1);
188: if (p1->blocks < p2->blocks)
189: return(1);
190: return(strcmp(p1->name, p2->name));
191: }
192:
193: report()
194: {
195: register i;
196:
197: if (nflg)
198: return;
199: if (cflg) {
200: long t = 0;
201: for (i=0; i<TSIZE-1; i++)
202: if (sizes[i]) {
203: t += i*sizes[i];
204: printf("%d %d %D\n", i, sizes[i], t);
205: }
206: printf("%d %d %D\n", TSIZE-1, sizes[TSIZE-1], overflow+t);
207: return;
208: }
209: qsort(du, NUID, sizeof(du[0]), qcmp);
210: for (i=0; i<NUID; i++) {
211: if (du[i].blocks==0)
212: return;
213: printf("%5D\t", du[i].blocks);
214: if (fflg)
215: printf("%5D\t", du[i].nfiles);
216: if (du[i].name)
217: printf("%s\n", du[i].name);
218: else
219: printf("#%d\n", du[i].uid);
220: }
221: }
222:
223: char *
224: copy(s)
225: char *s;
226: {
227: register char *p;
228: register n;
229:
230: for(n=0; s[n]; n++)
231: ;
232: p = malloc((unsigned)n+1);
233: for(n=0; p[n] = s[n]; n++)
234: ;
235: return(p);
236: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.