quot.c revision 1.7 1 1.1 ws /*
2 1.1 ws * Copyright (C) 1991, 1994 Wolfgang Solfrank.
3 1.1 ws * Copyright (C) 1991, 1994 TooLs GmbH.
4 1.1 ws * All rights reserved.
5 1.1 ws *
6 1.1 ws * Redistribution and use in source and binary forms, with or without
7 1.1 ws * modification, are permitted provided that the following conditions
8 1.1 ws * are met:
9 1.1 ws * 1. Redistributions of source code must retain the above copyright
10 1.1 ws * notice, this list of conditions and the following disclaimer.
11 1.1 ws * 2. Redistributions in binary form must reproduce the above copyright
12 1.1 ws * notice, this list of conditions and the following disclaimer in the
13 1.1 ws * documentation and/or other materials provided with the distribution.
14 1.1 ws * 3. All advertising materials mentioning features or use of this software
15 1.1 ws * must display the following acknowledgement:
16 1.1 ws * This product includes software developed by TooLs GmbH.
17 1.1 ws * 4. The name of TooLs GmbH may not be used to endorse or promote products
18 1.1 ws * derived from this software without specific prior written permission.
19 1.1 ws *
20 1.1 ws * THIS SOFTWARE IS PROVIDED BY TOOLS GMBH ``AS IS'' AND ANY EXPRESS OR
21 1.1 ws * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
22 1.1 ws * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
23 1.1 ws * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 1.1 ws * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25 1.1 ws * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
26 1.1 ws * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
27 1.1 ws * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
28 1.1 ws * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
29 1.1 ws * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 1.1 ws */
31 1.2 cgd
32 1.2 cgd #ifndef lint
33 1.7 jtc static char rcsid[] = "$Id: quot.c,v 1.7 1995/11/28 19:43:42 jtc Exp $";
34 1.2 cgd #endif /* not lint */
35 1.2 cgd
36 1.4 cgd #include <sys/param.h>
37 1.4 cgd #include <sys/mount.h>
38 1.4 cgd #include <sys/time.h>
39 1.5 cgd #include <ufs/ffs/fs.h>
40 1.5 cgd #include <ufs/ufs/quota.h>
41 1.5 cgd #include <ufs/ufs/inode.h>
42 1.4 cgd
43 1.1 ws #include <stdio.h>
44 1.1 ws #include <stdlib.h>
45 1.1 ws #include <string.h>
46 1.1 ws #include <errno.h>
47 1.1 ws #include <pwd.h>
48 1.1 ws
49 1.1 ws /* some flags of what to do: */
50 1.1 ws static char estimate;
51 1.1 ws static char count;
52 1.1 ws static char unused;
53 1.1 ws static int (*func)();
54 1.1 ws static long blocksize;
55 1.1 ws static char *header;
56 1.1 ws static int headerlen;
57 1.1 ws
58 1.2 cgd /*
59 1.2 cgd * Original BSD quot doesn't round to number of frags/blocks,
60 1.2 cgd * doesn't account for indirection blocks and gets it totally
61 1.2 cgd * wrong if the size is a multiple of the blocksize.
62 1.2 cgd * The new code always counts the number of 512 byte blocks
63 1.2 cgd * instead of the number of kilobytes and converts them to
64 1.2 cgd * kByte when done (on request).
65 1.2 cgd */
66 1.1 ws #ifdef COMPAT
67 1.1 ws #define SIZE(n) (n)
68 1.1 ws #else
69 1.1 ws #define SIZE(n) (((n) * 512 + blocksize - 1)/blocksize)
70 1.1 ws #endif
71 1.1 ws
72 1.1 ws #define INOCNT(fs) ((fs)->fs_ipg)
73 1.1 ws #define INOSZ(fs) (sizeof(struct dinode) * INOCNT(fs))
74 1.1 ws
75 1.1 ws static struct dinode *get_inode(fd,super,ino)
76 1.1 ws struct fs *super;
77 1.1 ws ino_t ino;
78 1.1 ws {
79 1.1 ws static struct dinode *ip;
80 1.1 ws static ino_t last;
81 1.1 ws
82 1.1 ws if (fd < 0) { /* flush cache */
83 1.1 ws if (ip) {
84 1.1 ws free(ip);
85 1.1 ws ip = 0;
86 1.1 ws }
87 1.1 ws return 0;
88 1.1 ws }
89 1.1 ws
90 1.1 ws if (!ip || ino < last || ino >= last + INOCNT(super)) {
91 1.1 ws if (!ip
92 1.1 ws && !(ip = (struct dinode *)malloc(INOSZ(super)))) {
93 1.1 ws perror("allocate inodes");
94 1.1 ws exit(1);
95 1.1 ws }
96 1.1 ws last = (ino / INOCNT(super)) * INOCNT(super);
97 1.6 cgd if (lseek(fd,ino_to_fsba(super,last) << super->fs_fshift,0) < 0
98 1.1 ws || read(fd,ip,INOSZ(super)) != INOSZ(super)) {
99 1.1 ws perror("read inodes");
100 1.1 ws exit(1);
101 1.1 ws }
102 1.1 ws }
103 1.1 ws
104 1.1 ws return ip + ino % INOCNT(super);
105 1.1 ws }
106 1.1 ws
107 1.1 ws #ifdef COMPAT
108 1.1 ws #define actualblocks(super,ip) ((ip)->di_blocks/2)
109 1.1 ws #else
110 1.1 ws #define actualblocks(super,ip) ((ip)->di_blocks)
111 1.1 ws #endif
112 1.1 ws
113 1.1 ws static virtualblocks(super,ip)
114 1.1 ws struct fs *super;
115 1.1 ws struct dinode *ip;
116 1.1 ws {
117 1.1 ws register off_t nblk, sz;
118 1.1 ws
119 1.1 ws sz = ip->di_size;
120 1.1 ws #ifdef COMPAT
121 1.1 ws if (lblkno(super,sz) >= NDADDR) {
122 1.1 ws nblk = blkroundup(super,sz);
123 1.1 ws if (sz == nblk)
124 1.1 ws nblk += super->fs_bsize;
125 1.1 ws }
126 1.1 ws
127 1.1 ws return sz / 1024;
128 1.1 ws
129 1.1 ws #else /* COMPAT */
130 1.1 ws
131 1.1 ws if (lblkno(super,sz) >= NDADDR) {
132 1.1 ws nblk = blkroundup(super,sz);
133 1.1 ws sz = lblkno(super,nblk);
134 1.1 ws sz = (sz - NDADDR + NINDIR(super) - 1) / NINDIR(super);
135 1.1 ws while (sz > 0) {
136 1.1 ws nblk += sz * super->fs_bsize;
137 1.1 ws /* sz - 1 rounded up */
138 1.1 ws sz = (sz - 1 + NINDIR(super) - 1) / NINDIR(super);
139 1.1 ws }
140 1.1 ws } else
141 1.1 ws nblk = fragroundup(super,sz);
142 1.1 ws
143 1.1 ws return nblk / 512;
144 1.1 ws #endif /* COMPAT */
145 1.1 ws }
146 1.1 ws
147 1.1 ws static isfree(ip)
148 1.1 ws struct dinode *ip;
149 1.1 ws {
150 1.1 ws #ifdef COMPAT
151 1.1 ws return (ip->di_mode&IFMT) == 0;
152 1.1 ws #else /* COMPAT */
153 1.1 ws
154 1.1 ws switch (ip->di_mode&IFMT) {
155 1.1 ws case IFIFO:
156 1.1 ws case IFLNK: /* should check FASTSYMLINK? */
157 1.1 ws case IFDIR:
158 1.1 ws case IFREG:
159 1.1 ws return 0;
160 1.1 ws default:
161 1.1 ws return 1;
162 1.1 ws }
163 1.1 ws #endif
164 1.1 ws }
165 1.1 ws
166 1.1 ws static struct user {
167 1.1 ws uid_t uid;
168 1.1 ws char *name;
169 1.1 ws daddr_t space;
170 1.1 ws long count;
171 1.1 ws daddr_t spc30;
172 1.1 ws daddr_t spc60;
173 1.1 ws daddr_t spc90;
174 1.1 ws } *users;
175 1.1 ws static int nusers;
176 1.1 ws
177 1.1 ws static inituser()
178 1.1 ws {
179 1.1 ws register i;
180 1.1 ws register struct user *usr;
181 1.1 ws
182 1.1 ws if (!nusers) {
183 1.1 ws nusers = 8;
184 1.2 cgd if (!(users =
185 1.2 cgd (struct user *)calloc(nusers,sizeof(struct user)))) {
186 1.1 ws perror("allocate users");
187 1.1 ws exit(1);
188 1.1 ws }
189 1.1 ws } else {
190 1.1 ws for (usr = users, i = nusers; --i >= 0; usr++) {
191 1.1 ws usr->space = usr->spc30 = usr->spc60 = usr->spc90 = 0;
192 1.1 ws usr->count = 0;
193 1.1 ws }
194 1.1 ws }
195 1.1 ws }
196 1.1 ws
197 1.1 ws static usrrehash()
198 1.1 ws {
199 1.1 ws register i;
200 1.1 ws register struct user *usr, *usrn;
201 1.1 ws struct user *svusr;
202 1.1 ws
203 1.1 ws svusr = users;
204 1.1 ws nusers <<= 1;
205 1.1 ws if (!(users = (struct user *)calloc(nusers,sizeof(struct user)))) {
206 1.1 ws perror("allocate users");
207 1.1 ws exit(1);
208 1.1 ws }
209 1.1 ws for (usr = svusr, i = nusers >> 1; --i >= 0; usr++) {
210 1.2 cgd for (usrn = users + (usr->uid&(nusers - 1)); usrn->name;
211 1.2 cgd usrn--) {
212 1.1 ws if (usrn <= users)
213 1.1 ws usrn = users + nusers;
214 1.1 ws }
215 1.1 ws *usrn = *usr;
216 1.1 ws }
217 1.1 ws }
218 1.1 ws
219 1.1 ws static struct user *user(uid)
220 1.1 ws uid_t uid;
221 1.1 ws {
222 1.1 ws register struct user *usr;
223 1.1 ws register i;
224 1.1 ws struct passwd *pwd;
225 1.1 ws
226 1.1 ws while (1) {
227 1.2 cgd for (usr = users + (uid&(nusers - 1)), i = nusers; --i >= 0;
228 1.2 cgd usr--) {
229 1.1 ws if (!usr->name) {
230 1.1 ws usr->uid = uid;
231 1.1 ws
232 1.1 ws if (!(pwd = getpwuid(uid))) {
233 1.1 ws if (usr->name = (char *)malloc(7))
234 1.1 ws sprintf(usr->name,"#%d",uid);
235 1.1 ws } else {
236 1.2 cgd if (usr->name = (char *)
237 1.2 cgd malloc(strlen(pwd->pw_name) + 1))
238 1.1 ws strcpy(usr->name,pwd->pw_name);
239 1.1 ws }
240 1.1 ws if (!usr->name) {
241 1.1 ws perror("allocate users");
242 1.1 ws exit(1);
243 1.1 ws }
244 1.1 ws
245 1.1 ws return usr;
246 1.1 ws
247 1.1 ws } else if (usr->uid == uid)
248 1.1 ws return usr;
249 1.1 ws
250 1.1 ws if (usr <= users)
251 1.1 ws usr = users + nusers;
252 1.1 ws }
253 1.1 ws usrrehash();
254 1.1 ws }
255 1.1 ws }
256 1.1 ws
257 1.1 ws static cmpusers(u1,u2)
258 1.1 ws struct user *u1, *u2;
259 1.1 ws {
260 1.1 ws return u2->space - u1->space;
261 1.1 ws }
262 1.2 cgd
263 1.2 cgd #define sortusers(users) (qsort((users),nusers,sizeof(struct user), \
264 1.2 cgd cmpusers))
265 1.1 ws
266 1.1 ws static uses(uid,blks,act)
267 1.1 ws uid_t uid;
268 1.1 ws daddr_t blks;
269 1.1 ws time_t act;
270 1.1 ws {
271 1.1 ws static time_t today;
272 1.1 ws register struct user *usr;
273 1.1 ws
274 1.1 ws if (!today)
275 1.1 ws time(&today);
276 1.1 ws
277 1.1 ws usr = user(uid);
278 1.1 ws usr->count++;
279 1.1 ws usr->space += blks;
280 1.1 ws
281 1.1 ws if (today - act > 90L * 24L * 60L * 60L)
282 1.1 ws usr->spc90 += blks;
283 1.1 ws if (today - act > 60L * 24L * 60L * 60L)
284 1.1 ws usr->spc60 += blks;
285 1.1 ws if (today - act > 30L * 24L * 60L * 60L)
286 1.1 ws usr->spc30 += blks;
287 1.1 ws }
288 1.1 ws
289 1.1 ws #ifdef COMPAT
290 1.1 ws #define FSZCNT 500
291 1.1 ws #else
292 1.1 ws #define FSZCNT 512
293 1.1 ws #endif
294 1.1 ws struct fsizes {
295 1.1 ws struct fsizes *fsz_next;
296 1.1 ws daddr_t fsz_first, fsz_last;
297 1.1 ws ino_t fsz_count[FSZCNT];
298 1.1 ws daddr_t fsz_sz[FSZCNT];
299 1.1 ws } *fsizes;
300 1.1 ws
301 1.1 ws static initfsizes()
302 1.1 ws {
303 1.1 ws register struct fsizes *fp;
304 1.1 ws register i;
305 1.1 ws
306 1.1 ws for (fp = fsizes; fp; fp = fp->fsz_next) {
307 1.1 ws for (i = FSZCNT; --i >= 0;) {
308 1.1 ws fp->fsz_count[i] = 0;
309 1.1 ws fp->fsz_sz[i] = 0;
310 1.1 ws }
311 1.1 ws }
312 1.1 ws }
313 1.1 ws
314 1.1 ws static dofsizes(fd,super,name)
315 1.1 ws struct fs *super;
316 1.1 ws char *name;
317 1.1 ws {
318 1.1 ws ino_t inode, maxino;
319 1.1 ws struct dinode *ip;
320 1.1 ws daddr_t sz, ksz;
321 1.1 ws struct fsizes *fp, **fsp;
322 1.1 ws register i;
323 1.1 ws
324 1.1 ws maxino = super->fs_ncg * super->fs_ipg - 1;
325 1.1 ws #ifdef COMPAT
326 1.1 ws if (!(fsizes = (struct fsizes *)malloc(sizeof(struct fsizes)))) {
327 1.1 ws perror("alloc fsize structure");
328 1.1 ws exit(1);
329 1.1 ws }
330 1.1 ws #endif /* COMPAT */
331 1.1 ws for (inode = 0; inode < maxino; inode++) {
332 1.1 ws errno = 0;
333 1.1 ws if ((ip = get_inode(fd,super,inode))
334 1.1 ws #ifdef COMPAT
335 1.1 ws && ((ip->di_mode&IFMT) == IFREG
336 1.1 ws || (ip->di_mode&IFMT) == IFDIR)
337 1.1 ws #else /* COMPAT */
338 1.1 ws && !isfree(ip)
339 1.1 ws #endif /* COMPAT */
340 1.1 ws ) {
341 1.2 cgd sz = estimate ? virtualblocks(super,ip) :
342 1.2 cgd actualblocks(super,ip);
343 1.1 ws #ifdef COMPAT
344 1.1 ws if (sz >= FSZCNT) {
345 1.1 ws fsizes->fsz_count[FSZCNT-1]++;
346 1.1 ws fsizes->fsz_sz[FSZCNT-1] += sz;
347 1.1 ws } else {
348 1.1 ws fsizes->fsz_count[sz]++;
349 1.1 ws fsizes->fsz_sz[sz] += sz;
350 1.1 ws }
351 1.1 ws #else /* COMPAT */
352 1.1 ws ksz = SIZE(sz);
353 1.1 ws for (fsp = &fsizes; fp = *fsp; fsp = &fp->fsz_next) {
354 1.1 ws if (ksz < fp->fsz_last)
355 1.1 ws break;
356 1.1 ws }
357 1.1 ws if (!fp || ksz < fp->fsz_first) {
358 1.2 cgd if (!(fp = (struct fsizes *)
359 1.2 cgd malloc(sizeof(struct fsizes)))) {
360 1.1 ws perror("alloc fsize structure");
361 1.1 ws exit(1);
362 1.1 ws }
363 1.1 ws fp->fsz_next = *fsp;
364 1.1 ws *fsp = fp;
365 1.1 ws fp->fsz_first = (ksz / FSZCNT) * FSZCNT;
366 1.1 ws fp->fsz_last = fp->fsz_first + FSZCNT;
367 1.1 ws for (i = FSZCNT; --i >= 0;) {
368 1.1 ws fp->fsz_count[i] = 0;
369 1.1 ws fp->fsz_sz[i] = 0;
370 1.1 ws }
371 1.1 ws }
372 1.1 ws fp->fsz_count[ksz % FSZCNT]++;
373 1.1 ws fp->fsz_sz[ksz % FSZCNT] += sz;
374 1.1 ws #endif /* COMPAT */
375 1.1 ws } else if (errno) {
376 1.1 ws perror(name);
377 1.1 ws exit(1);
378 1.1 ws }
379 1.1 ws }
380 1.1 ws sz = 0;
381 1.1 ws for (fp = fsizes; fp; fp = fp->fsz_next) {
382 1.1 ws for (i = 0; i < FSZCNT; i++) {
383 1.1 ws if (fp->fsz_count[i])
384 1.1 ws printf("%d\t%d\t%d\n",fp->fsz_first + i,
385 1.2 cgd fp->fsz_count[i],
386 1.2 cgd SIZE(sz += fp->fsz_sz[i]));
387 1.1 ws }
388 1.1 ws }
389 1.1 ws }
390 1.1 ws
391 1.1 ws static douser(fd,super,name)
392 1.1 ws struct fs *super;
393 1.1 ws char *name;
394 1.1 ws {
395 1.1 ws ino_t inode, maxino;
396 1.1 ws struct user *usr, *usrs;
397 1.1 ws struct dinode *ip;
398 1.1 ws register n;
399 1.1 ws
400 1.1 ws maxino = super->fs_ncg * super->fs_ipg - 1;
401 1.1 ws for (inode = 0; inode < maxino; inode++) {
402 1.1 ws errno = 0;
403 1.1 ws if ((ip = get_inode(fd,super,inode))
404 1.1 ws && !isfree(ip))
405 1.1 ws uses(ip->di_uid,
406 1.2 cgd estimate ? virtualblocks(super,ip) :
407 1.2 cgd actualblocks(super,ip),
408 1.2 cgd ip->di_atime);
409 1.1 ws else if (errno) {
410 1.1 ws perror(name);
411 1.1 ws exit(1);
412 1.1 ws }
413 1.1 ws }
414 1.1 ws if (!(usrs = (struct user *)malloc(nusers * sizeof(struct user)))) {
415 1.1 ws perror("allocate users");
416 1.1 ws exit(1);
417 1.1 ws }
418 1.1 ws bcopy(users,usrs,nusers * sizeof(struct user));
419 1.1 ws sortusers(usrs);
420 1.1 ws for (usr = usrs, n = nusers; --n >= 0 && usr->count; usr++) {
421 1.1 ws printf("%5d",SIZE(usr->space));
422 1.1 ws if (count)
423 1.1 ws printf("\t%5d",usr->count);
424 1.1 ws printf("\t%-8s",usr->name);
425 1.1 ws if (unused)
426 1.1 ws printf("\t%5d\t%5d\t%5d",
427 1.1 ws SIZE(usr->spc30),
428 1.1 ws SIZE(usr->spc60),
429 1.1 ws SIZE(usr->spc90));
430 1.1 ws printf("\n");
431 1.1 ws }
432 1.1 ws free(usrs);
433 1.1 ws }
434 1.1 ws
435 1.1 ws static donames(fd,super,name)
436 1.1 ws struct fs *super;
437 1.1 ws char *name;
438 1.1 ws {
439 1.1 ws int c;
440 1.1 ws ino_t inode, inode1;
441 1.1 ws ino_t maxino;
442 1.1 ws struct dinode *ip;
443 1.1 ws
444 1.1 ws maxino = super->fs_ncg * super->fs_ipg - 1;
445 1.1 ws /* first skip the name of the filesystem */
446 1.1 ws while ((c = getchar()) != EOF && (c < '0' || c > '9'))
447 1.1 ws while ((c = getchar()) != EOF && c != '\n');
448 1.1 ws ungetc(c,stdin);
449 1.1 ws inode1 = -1;
450 1.1 ws while (scanf("%d",&inode) == 1) {
451 1.1 ws if (inode < 0 || inode > maxino) {
452 1.1 ws fprintf(stderr,"illegal inode %d\n",inode);
453 1.1 ws return;
454 1.1 ws }
455 1.1 ws errno = 0;
456 1.1 ws if ((ip = get_inode(fd,super,inode))
457 1.1 ws && !isfree(ip)) {
458 1.1 ws printf("%s\t",user(ip->di_uid)->name);
459 1.1 ws /* now skip whitespace */
460 1.1 ws while ((c = getchar()) == ' ' || c == '\t');
461 1.1 ws /* and print out the remainder of the input line */
462 1.1 ws while (c != EOF && c != '\n') {
463 1.1 ws putchar(c);
464 1.1 ws c = getchar();
465 1.1 ws }
466 1.1 ws putchar('\n');
467 1.1 ws inode1 = inode;
468 1.1 ws } else {
469 1.1 ws if (errno) {
470 1.1 ws perror(name);
471 1.1 ws exit(1);
472 1.1 ws }
473 1.1 ws /* skip this line */
474 1.1 ws while ((c = getchar()) != EOF && c != '\n');
475 1.1 ws }
476 1.1 ws if (c == EOF)
477 1.1 ws break;
478 1.1 ws }
479 1.1 ws }
480 1.1 ws
481 1.1 ws static usage()
482 1.1 ws {
483 1.1 ws #ifdef COMPAT
484 1.1 ws fprintf(stderr,"Usage: quot [-nfcvha] [filesystem ...]\n");
485 1.1 ws #else /* COMPAT */
486 1.1 ws fprintf(stderr,"Usage: quot [ -acfhknv ] [ filesystem ... ]\n");
487 1.1 ws #endif /* COMPAT */
488 1.1 ws exit(1);
489 1.1 ws }
490 1.1 ws
491 1.1 ws static char superblock[SBSIZE];
492 1.1 ws
493 1.1 ws quot(name,mp)
494 1.1 ws char *name, *mp;
495 1.1 ws {
496 1.1 ws int fd;
497 1.1 ws
498 1.1 ws get_inode(-1); /* flush cache */
499 1.1 ws inituser();
500 1.1 ws initfsizes();
501 1.1 ws if ((fd = open(name,0)) < 0
502 1.1 ws || lseek(fd,SBOFF,0) != SBOFF
503 1.1 ws || read(fd,superblock,SBSIZE) != SBSIZE) {
504 1.1 ws perror(name);
505 1.1 ws close(fd);
506 1.1 ws return;
507 1.1 ws }
508 1.1 ws if (((struct fs *)superblock)->fs_magic != FS_MAGIC) {
509 1.1 ws fprintf(stderr,"%s: not a BSD filesystem\n",name);
510 1.1 ws close(fd);
511 1.1 ws return;
512 1.1 ws }
513 1.1 ws printf("%s:",name);
514 1.1 ws if (mp)
515 1.1 ws printf(" (%s)",mp);
516 1.1 ws putchar('\n');
517 1.1 ws (*func)(fd,superblock,name);
518 1.1 ws close(fd);
519 1.1 ws }
520 1.1 ws
521 1.1 ws int main(argc,argv)
522 1.1 ws char **argv;
523 1.1 ws {
524 1.1 ws int fd;
525 1.1 ws char all = 0;
526 1.1 ws FILE *fp;
527 1.1 ws struct statfs *mp;
528 1.1 ws char dev[MNAMELEN + 1];
529 1.1 ws char *nm;
530 1.1 ws int cnt;
531 1.1 ws
532 1.1 ws func = douser;
533 1.1 ws #ifndef COMPAT
534 1.1 ws header = getbsize(&headerlen,&blocksize);
535 1.1 ws #endif
536 1.1 ws while (--argc > 0 && **++argv == '-') {
537 1.1 ws while (*++*argv) {
538 1.1 ws switch (**argv) {
539 1.1 ws case 'n':
540 1.1 ws func = donames;
541 1.1 ws break;
542 1.1 ws case 'c':
543 1.1 ws func = dofsizes;
544 1.1 ws break;
545 1.1 ws case 'a':
546 1.1 ws all = 1;
547 1.1 ws break;
548 1.1 ws case 'f':
549 1.1 ws count = 1;
550 1.1 ws break;
551 1.1 ws case 'h':
552 1.1 ws estimate = 1;
553 1.1 ws break;
554 1.1 ws #ifndef COMPAT
555 1.1 ws case 'k':
556 1.1 ws blocksize = 1024;
557 1.1 ws break;
558 1.1 ws #endif /* COMPAT */
559 1.1 ws case 'v':
560 1.1 ws unused = 1;
561 1.1 ws break;
562 1.1 ws default:
563 1.1 ws usage();
564 1.1 ws }
565 1.1 ws }
566 1.1 ws }
567 1.1 ws if (all) {
568 1.1 ws cnt = getmntinfo(&mp,MNT_NOWAIT);
569 1.1 ws for (; --cnt >= 0; mp++) {
570 1.7 jtc if (!strncmp(mp->f_fstypename, MOUNT_FFS, MFSNAMELEN)) {
571 1.1 ws if (nm = strrchr(mp->f_mntfromname,'/')) {
572 1.1 ws sprintf(dev,"/dev/r%s",nm + 1);
573 1.1 ws nm = dev;
574 1.1 ws } else
575 1.1 ws nm = mp->f_mntfromname;
576 1.1 ws quot(nm,mp->f_mntonname);
577 1.1 ws }
578 1.1 ws }
579 1.1 ws }
580 1.1 ws while (--argc >= 0)
581 1.1 ws quot(*argv++,0);
582 1.1 ws return 0;
583 1.1 ws }
584