Annotation of 40BSD/cmd/df.c, revision 1.1.1.1

1.1       root        1: static char *sccsid = "@(#)df.c        4.3 (Berkeley) 10/15/80";
                      2: #include <stdio.h>
                      3: #include <fstab.h>
                      4: #include <sys/param.h>
                      5: #include <sys/filsys.h>
                      6: #include <sys/fblk.h>
                      7: #include <sys/stat.h>
                      8: /*
                      9:  * df
                     10:  */
                     11: 
                     12: #define NFS    20      /* Max number of filesystems */
                     13: 
                     14: struct {
                     15:        char path[32];
                     16:        char spec[32];
                     17: } mtab[NFS];
                     18: char root[32];
                     19: 
                     20: char *mpath();
                     21: 
                     22: daddr_t        blkno   = 1;
                     23: 
                     24: int    lflag;
                     25: int    iflag;
                     26: 
                     27: struct filsys sblock;
                     28: 
                     29: int    fi;
                     30: daddr_t        alloc();
                     31: 
                     32: main(argc, argv)
                     33: char **argv;
                     34: {
                     35:        int i;
                     36:        char buf[128];
                     37: 
                     38:        while (argc >= 1 && argv[1][0]=='-') {
                     39:                switch(argv[1][1]) {
                     40: 
                     41:                case 'l':
                     42:                        lflag++;
                     43:                        break;
                     44: 
                     45:                case 'i':
                     46:                        iflag++;
                     47:                        break;
                     48: 
                     49:                default:
                     50:                        fprintf(stderr, "usage: df [ -il ] [ filsys... ]\n");
                     51:                        exit(0);
                     52:                }
                     53:                argc--, argv++;
                     54:        }
                     55: 
                     56:        if ((i=open("/etc/mtab", 0)) >= 0) {
                     57:                read(i, mtab, sizeof mtab);     /* Probably returns short */
                     58:                close(i);
                     59:        }
                     60:        printf("Filesystem  Mounted on  blocks\t  used\t  free");
                     61:        if (lflag)
                     62:                printf("\thardway");
                     63:        printf("\t%% used");
                     64:        if (iflag)
                     65:                printf("\tiused\tifree\t%%iused");
                     66:        putchar('\n');
                     67:        if(argc <= 1) {
                     68:                struct  fstab   *fsp;
                     69:                if (setfsent() == 0)
                     70:                        perror(FSTAB), exit(1);
                     71:                while( (fsp = getfsent()) != 0){
                     72:                        if (  (strcmp(fsp->fs_type, FSTAB_RW) != 0)
                     73:                            &&(strcmp(fsp->fs_type, FSTAB_RO) != 0) )
                     74:                                continue;
                     75:                        if (root[0] == 0)
                     76:                                strcpy(root, fsp->fs_spec);
                     77:                        dfree(fsp->fs_spec);
                     78:                }
                     79:                endfsent();
                     80:                exit(0);
                     81:        }
                     82: 
                     83:        for(i=1; i<argc; i++) {
                     84:                dfree(argv[i]);
                     85:        }
                     86: }
                     87: 
                     88: dfree(file)
                     89: char *file;
                     90: {
                     91:        daddr_t i;
                     92:        long    blocks;
                     93:        long    free;
                     94:        long    used;
                     95:        long    hardway;
                     96:        char    *mp;
                     97:        struct  stat stbuf;
                     98: 
                     99:        if(stat(file, &stbuf) == 0 && (stbuf.st_mode&S_IFMT) != S_IFCHR
                    100:          && (stbuf.st_mode&S_IFMT) != S_IFBLK) {
                    101:                int mt = open("/etc/mtab", 0), len;
                    102:                char *str = "/dev/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
                    103:                char mtab[32];
                    104:                struct stat mstbuf;
                    105:                while((len = read(mt, mtab, 32)) == 32) {
                    106:                        read(mt, &str[5], 32);
                    107:                        if(stat(str, &mstbuf) == 0 && mstbuf.st_rdev == stbuf.st_dev) {
                    108:                                file = str;
                    109:                                break;
                    110:                        }
                    111:                }
                    112:                close(mt);
                    113:                if(len == 0) {
                    114:                        fprintf(stderr, "%s: mounted on unknown device\n", file);
                    115:                        return;
                    116:                }
                    117:        }
                    118:        fi = open(file, 0);
                    119:        if(fi < 0) {
                    120:                fprintf(stderr,"cannot open %s\n", file);
                    121:                return;
                    122:        }
                    123:        sync();
                    124:        bread(1L, (char *)&sblock, sizeof(sblock));
                    125:        printf("%-12.12s%s", file, mp = mpath(file));
                    126:        if (strlen(mp) < 4)
                    127:                putchar('\t');
                    128: 
                    129:        blocks = (long) sblock.s_fsize - (long)sblock.s_isize;
                    130:        free = sblock.s_tfree;
                    131:        used = blocks - free;
                    132: 
                    133:        printf("\t%6ld", blocks);
                    134:        printf("\t%6ld", used);
                    135:        printf("\t%6ld", free);
                    136:        if (lflag) {
                    137:                hardway = 0;
                    138:                while(alloc())
                    139:                        hardway++;
                    140:                printf("\t%6ld", free=hardway);
                    141:        }
                    142:        printf("\t%5.0f%%", (double) used / (double)blocks * 100.0);
                    143:        if (iflag) {
                    144:                int inodes = (sblock.s_isize - 2) * INOPB;
                    145:                used = inodes - sblock.s_tinode;
                    146:                printf("\t%5ld\t%5ld\t%5.0f%%", used, sblock.s_tinode, (double)used/(double)inodes*100.0);
                    147:        }
                    148:        printf("\n");
                    149:        close(fi);
                    150: }
                    151: 
                    152: daddr_t
                    153: alloc()
                    154: {
                    155:        int i;
                    156:        daddr_t b;
                    157:        struct fblk buf;
                    158: 
                    159:        i = --sblock.s_nfree;
                    160:        if(i<0 || i>=NICFREE) {
                    161:                printf("bad free count, b=%D\n", blkno);
                    162:                return(0);
                    163:        }
                    164:        b = sblock.s_free[i];
                    165:        if(b == 0)
                    166:                return(0);
                    167:        if(b<sblock.s_isize || b>=sblock.s_fsize) {
                    168:                printf("bad free block (%D)\n", b);
                    169:                return(0);
                    170:        }
                    171:        if(sblock.s_nfree <= 0) {
                    172:                bread(b, (char *)&buf, sizeof(buf));
                    173:                blkno = b;
                    174:                sblock.s_nfree = buf.df_nfree;
                    175:                for(i=0; i<NICFREE; i++)
                    176:                        sblock.s_free[i] = buf.df_free[i];
                    177:        }
                    178:        return(b);
                    179: }
                    180: 
                    181: bread(bno, buf, cnt)
                    182: daddr_t bno;
                    183: char *buf;
                    184: {
                    185:        int n;
                    186:        extern errno;
                    187: 
                    188:        lseek(fi, bno<<BSHIFT, 0);
                    189:        if((n=read(fi, buf, cnt)) != cnt) {
                    190:                printf("\nread error bno = %ld\n", bno);
                    191:                printf("count = %d; errno = %d\n", n, errno);
                    192:                exit(0);
                    193:        }
                    194: }
                    195: 
                    196: /*
                    197:  * Given a name like /dev/rrp0h, returns the mounted path, like /usr.
                    198:  */
                    199: char *mpath(file)
                    200: char *file;
                    201: {
                    202:        register int i;
                    203: 
                    204:        if (eq(file, root))
                    205:                return "/";
                    206:        for (i=0; i<NFS; i++)
                    207:                if (eq(file, mtab[i].spec))
                    208:                        return mtab[i].path;
                    209:        return "";
                    210: }
                    211: 
                    212: eq(f1, f2)
                    213: char *f1, *f2;
                    214: {
                    215:        if (strncmp(f1, "/dev/", 5) == 0)
                    216:                f1 += 5;
                    217:        if (strncmp(f2, "/dev/", 5) == 0)
                    218:                f2 += 5;
                    219:        if (strcmp(f1, f2) == 0)
                    220:                return 1;
                    221:        if (*f1 == 'r' && strcmp(f1+1, f2) == 0)
                    222:                return 1;
                    223:        if (*f2 == 'r' && strcmp(f1, f2+1) == 0)
                    224:                return 1;
                    225:        if (*f1 == 'r' && *f2 == 'r' && strcmp(f1+1, f2+1) == 0)
                    226:                return 1;
                    227:        return 0;
                    228: }

unix.superglobalmegacorp.com

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