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