Annotation of 43BSDTahoe/bin/df.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1980 Regents of the University of California.
                      3:  * All rights reserved.  The Berkeley software License Agreement
                      4:  * specifies the terms and conditions for redistribution.
                      5:  */
                      6: 
                      7: #ifndef lint
                      8: char copyright[] =
                      9: "@(#) Copyright (c) 1980 Regents of the University of California.\n\
                     10:  All rights reserved.\n";
                     11: #endif /* not lint */
                     12: 
                     13: #ifndef lint
                     14: static char sccsid[] = "@(#)df.c       5.3 (Berkeley) 1/10/88";
                     15: #endif /* not lint */
                     16: 
                     17: #include <sys/param.h>
                     18: #include <sys/fs.h>
                     19: #include <sys/stat.h>
                     20: #include <errno.h>
                     21: 
                     22: #include <stdio.h>
                     23: #include <fstab.h>
                     24: #include <mtab.h>
                     25: 
                     26: /*
                     27:  * df
                     28:  */
                     29: struct mtab mtab[NMOUNT];
                     30: char   root[32];
                     31: char   *mpath();
                     32: 
                     33: int    iflag;
                     34: 
                     35: union {
                     36:        struct fs iu_fs;
                     37:        char dummy[SBSIZE];
                     38: } sb;
                     39: #define sblock sb.iu_fs
                     40: 
                     41: int    fi;
                     42: daddr_t        alloc();
                     43: char   *strcpy();
                     44: 
                     45: main(argc, argv)
                     46:        int argc;
                     47:        char **argv;
                     48: {
                     49:        int i;
                     50: 
                     51:        while (argc > 1 && argv[1][0]=='-') {
                     52:                switch (argv[1][1]) {
                     53: 
                     54:                case 'i':
                     55:                        iflag++;
                     56:                        break;
                     57: 
                     58:                default:
                     59:                        fprintf(stderr, "usage: df [ -i ] [ filsys... ]\n");
                     60:                        exit(0);
                     61:                }
                     62:                argc--, argv++;
                     63:        }
                     64:        i = open("/etc/mtab", 0);
                     65:        if (i >= 0) {
                     66:                (void) read(i, (char *)mtab, sizeof (mtab));
                     67:                (void) close(i);
                     68:        }
                     69:        sync();
                     70:        printf("Filesystem    kbytes    used   avail capacity");
                     71:        if (iflag)
                     72:                printf(" iused   ifree  %%iused");
                     73:        printf("  Mounted on\n");
                     74:        if (argc <= 1) {
                     75:                struct fstab *fsp;
                     76: 
                     77:                if (setfsent() == 0)
                     78:                        perror(FSTAB), exit(1);
                     79:                while (fsp = getfsent()) {
                     80:                        if (strcmp(fsp->fs_type, FSTAB_RW) &&
                     81:                            strcmp(fsp->fs_type, FSTAB_RO) &&
                     82:                            strcmp(fsp->fs_type, FSTAB_RQ))
                     83:                                continue;
                     84:                        if (root[0] == 0)
                     85:                                (void) strcpy(root, fsp->fs_spec);
                     86:                        dfree(fsp->fs_spec, 1);
                     87:                }
                     88:                (void)endfsent();
                     89:                exit(0);
                     90:        }
                     91:        for (i=1; i<argc; i++)
                     92:                dfree(argv[i], 0);
                     93: }
                     94: 
                     95: dfree(file, infsent)
                     96:        char *file;
                     97:        int infsent;
                     98: {
                     99:        long totalblks, availblks, avail, free, used;
                    100:        struct stat stbuf;
                    101:        struct fstab *fsp;
                    102: 
                    103:        if (stat(file, &stbuf) == 0 &&
                    104:            (stbuf.st_mode&S_IFMT) != S_IFCHR &&
                    105:            (stbuf.st_mode&S_IFMT) != S_IFBLK) {
                    106:                if (infsent) {
                    107:                        fprintf(stderr, "%s: screwy /etc/fstab entry\n", file);
                    108:                        return;
                    109:                }
                    110:                (void)setfsent();
                    111:                while (fsp = getfsent()) {
                    112:                        struct stat stb;
                    113: 
                    114:                        if (stat(fsp->fs_spec, &stb) == 0 &&
                    115:                            stb.st_rdev == stbuf.st_dev) {
                    116:                                file = fsp->fs_spec;
                    117:                                (void)endfsent();
                    118:                                goto found;
                    119:                        }
                    120:                }
                    121:                (void)endfsent();
                    122:                fprintf(stderr, "%s: mounted on unknown device\n", file);
                    123:                return;
                    124:        }
                    125: found:
                    126:        fi = open(file, 0);
                    127:        if (fi < 0) {
                    128:                perror(file);
                    129:                return;
                    130:        }
                    131:        if (bread((long)SBOFF, (char *)&sblock, SBSIZE) == 0) {
                    132:                (void) close(fi);
                    133:                return;
                    134:        }
                    135:        printf("%-12.12s", file);
                    136:        totalblks = sblock.fs_dsize;
                    137:        free = sblock.fs_cstotal.cs_nbfree * sblock.fs_frag +
                    138:            sblock.fs_cstotal.cs_nffree;
                    139:        used = totalblks - free;
                    140:        availblks = totalblks * (100 - sblock.fs_minfree) / 100;
                    141:        avail = availblks > used ? availblks - used : 0;
                    142:        printf("%8d%8d%8d", totalblks * sblock.fs_fsize / 1024,
                    143:            used * sblock.fs_fsize / 1024, avail * sblock.fs_fsize / 1024);
                    144:        printf("%6.0f%%",
                    145:            availblks == 0 ? 0.0 : (double) used / (double) availblks * 100.0);
                    146:        if (iflag) {
                    147:                int inodes = sblock.fs_ncg * sblock.fs_ipg;
                    148:                used = inodes - sblock.fs_cstotal.cs_nifree;
                    149:                printf("%8ld%8ld%6.0f%% ", used, sblock.fs_cstotal.cs_nifree,
                    150:                    inodes == 0 ? 0.0 : (double)used / (double)inodes * 100.0);
                    151:        } else 
                    152:                printf("  ");
                    153:        printf("  %s\n", mpath(file));
                    154:        (void) close(fi);
                    155: }
                    156: 
                    157: long lseek();
                    158: 
                    159: bread(off, buf, cnt)
                    160:        long off;
                    161:        char *buf;
                    162: {
                    163:        int n;
                    164:        extern errno;
                    165: 
                    166:        (void) lseek(fi, off, 0);
                    167:        if ((n=read(fi, buf, cnt)) != cnt) {
                    168:                /* probably a dismounted disk if errno == EIO */
                    169:                if (errno != EIO) {
                    170:                        printf("\nread error off = %ld\n", off);
                    171:                        printf("count = %d; errno = %d\n", n, errno);
                    172:                }
                    173:                return (0);
                    174:        }
                    175:        return (1);
                    176: }
                    177: 
                    178: /*
                    179:  * Given a name like /dev/rrp0h, returns the mounted path, like /usr.
                    180:  */
                    181: char *
                    182: mpath(file)
                    183:        char *file;
                    184: {
                    185:        register struct mtab *mp;
                    186: 
                    187:        if (eq(file, root))
                    188:                return ("/");
                    189:        for (mp = mtab; mp < mtab + NMOUNT; mp++)
                    190:                if (eq(file, mp->m_dname))
                    191:                        return (mp->m_path);
                    192:        return "";
                    193: }
                    194: 
                    195: eq(f1, f2)
                    196:        char *f1, *f2;
                    197: {
                    198: 
                    199:        if (strncmp(f1, "/dev/", 5) == 0)
                    200:                f1 += 5;
                    201:        if (strncmp(f2, "/dev/", 5) == 0)
                    202:                f2 += 5;
                    203:        if (!strcmp(f1, f2))
                    204:                return (1);
                    205:        if (*f1 == 'r' && !strcmp(f1+1, f2))
                    206:                return (1);
                    207:        if (*f2 == 'r' && !strcmp(f1, f2+1))
                    208:                return (1);
                    209:        if (*f1 == 'r' && *f2 == 'r' && strcmp(f1+1, f2+1) == 0)
                    210:                return (1);
                    211:        return (0);
                    212: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.