|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.