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