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