|
|
1.1 root 1: /*
2: * dosdrives.c
3: * 12/5/90
4: * Display MS-DOS drive information.
5: */
6:
7: #include <stdio.h>
8: #include <sys/fdisk.h>
9:
10: extern long lseek();
11:
12: /* Globals. */
13: char buf[512];
14: char buf2[512];
15: char *devp;
16: char devname[10];
17: int drive;
18: int fd;
19: int pass;
20:
21: /*
22: * List of partition tables to search.
23: * This must be updated as new devices are added to the system.
24: */
25: char *devices[] = {
26: "/dev/at0x", "/dev/at1x",
27: "/dev/sd0x", "/dev/sd1x", "/dev/sd2x", "/dev/sd3x",
28: "/dev/sd4x", "/dev/sd5x", "/dev/sd6x"
29: };
30: #define DEVMAX (sizeof(devices)/sizeof(devices[0]))
31:
32: void checkdev();
33: void fatal();
34:
35: main(argc, argv) int argc; char *argv[];
36: {
37: register int dev;
38:
39: printf("A:\nB:\n");
40: drive = 2;
41: for (pass = 1; pass <= 2; pass++) {
42: for (dev = 0; dev < DEVMAX; dev++) {
43: devp = devices[dev];
44: if ((fd = open(devp, 0)) < 0)
45: continue;
46: checkdev();
47: close(fd);
48: }
49: }
50: exit(0);
51: }
52:
53: void
54: checkdev()
55: {
56: register int i, j, sys;
57: FDISK_S *fdp1, *fdp2;
58: HDISK_S *hdp, *hdp2;
59: long partseek1, partseek2;
60:
61: /* Read the partition table. */
62: if (read(fd, buf, sizeof(buf)) != sizeof(buf))
63: fatal("read1 failed on \"%s\"", devp);
64: hdp = buf;
65: if (hdp->hd_sig != HDSIG)
66: return; /* no signature, ignore */
67: for (i = 0; i < NPARTN; i++) {
68: sys = (hdp->hd_partn[i]).p_sys;
69: if (sys != SYS_DOS_12
70: && sys != SYS_DOS_16
71: && sys != SYS_DOS_XP
72: && sys != SYS_DOS_LARGE)
73: continue; /* not a DOS partition */
74: strcpy(devname, devp);
75: devname[strlen(devname)-1] = 'a' + i;
76: if (pass == 1 && sys != SYS_DOS_XP) {
77: /* Count non-extended partitions on pass 1. */
78: printf("%c: %s\n", 'A'+drive, devname);
79: ++drive;
80: continue;
81: } else if (pass == 2 && sys == SYS_DOS_XP) {
82: /* Count extended partitions on pass 2. */
83: fdp2 = &(hdp->hd_partn[i]);
84: partseek1 = fdp2->p_base * 512; /* base of first */
85: partseek2 = 0L; /* offset from first */
86: for (j = 1; ; j++) {
87: if (lseek(fd, partseek1+partseek2, 0) == -1L)
88: fatal("lseek failed");
89: /* Read the extended DOS drive partition table. */
90: if (read(fd, buf2, sizeof(buf2)) != sizeof(buf2))
91: fatal("read2 failed on \"%s\" at %lx",
92: devp, partseek1+partseek2);
93: hdp2 = buf2;
94: fdp1 = &(hdp2->hd_partn[0]);
95: fdp2 = &(hdp2->hd_partn[1]);
96: printf("%c: %s %d\n", 'A'+drive, devname, j);
97: ++drive;
98: if (fdp2->p_sys != SYS_DOS_XP)
99: break; /* done */
100: partseek2 = fdp2->p_base * 512;
101: }
102: }
103: }
104: }
105:
106: void
107: fatal(s) char *s;
108: {
109: fprintf(stderr, "dosdrives: %r\n", &s);
110: exit(1);
111: }
112:
113: /* end of dosdrives.c */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.