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