1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
/*
* partitiontype.c, aeb, 2001-09-10
*
* call: partitiontype device
*
* either exit(1), or exit(0) with a single line of output
* DOS: sector 0 has a DOS signature.
*/
#include <stdio.h>
#include <fcntl.h>
struct aix_label {
unsigned int magic;
/* more ... */
};
#define AIX_LABEL_MAGIC 0xc9c2d4c1
#define AIX_LABEL_MAGIC_SWAPPED 0xc1d4c2c9
struct bsd_label {
unsigned int magic;
unsigned char stuff[128];
unsigned int magic2;
/* more ... */
};
#define BSD_LABEL_MAGIC 0x82564557
struct sgi_label {
unsigned int magic;
/* more ... */
};
#define SGI_LABEL_MAGIC 0x0be5a941
#define SGI_LABEL_MAGIC_SWAPPED 0x41a9e50b
struct sun_label {
unsigned char stuff[508];
unsigned short magic; /* Magic number */
unsigned short csum; /* Label xor'd checksum */
};
#define SUN_LABEL_MAGIC 0xDABE
#define SUN_LABEL_MAGIC_SWAPPED 0xBEDA
int
main(int argc, char **argv) {
int fd, n;
unsigned char buf[1024];
struct aix_label *paix;
struct bsd_label *pbsd;
struct sgi_label *psgi;
struct sun_label *psun;
if (argc != 2) {
fprintf(stderr, "call: %s device\n", argv[0]);
exit(1);
}
fd = open(argv[1], O_RDONLY);
if (fd == -1) {
perror(argv[1]);
fprintf(stderr, "%s: cannot open device %s\n",
argv[0], argv[1]);
exit(1);
}
n = read(fd, buf, sizeof(buf));
if (n != sizeof(buf)) {
if (n == -1)
perror(argv[1]);
fprintf(stderr, "%s: cannot read device %s\n",
argv[0], argv[1]);
exit(1);
}
psun = (struct sun_label *)(&buf);
if (psun->magic == SUN_LABEL_MAGIC ||
psun->magic == SUN_LABEL_MAGIC_SWAPPED) {
unsigned short csum = 0, *p;
int i;
for (p = (unsigned short *)(&buf);
p < (unsigned short *)(&buf[512]); p++)
csum ^= *p;
if (csum == 0) {
printf("SUN\n");
exit(0);
}
}
pbsd = (struct bsd_label *)(&buf[512]);
if (pbsd->magic == BSD_LABEL_MAGIC &&
pbsd->magic2 == BSD_LABEL_MAGIC) {
printf("BSD\n");
exit(0);
}
pbsd = (struct bsd_label *)(&buf[64]);
if (pbsd->magic == BSD_LABEL_MAGIC &&
pbsd->magic2 == BSD_LABEL_MAGIC) {
printf("BSD\n");
exit(0);
}
paix = (struct aix_label *)(&buf);
if (paix->magic == AIX_LABEL_MAGIC ||
paix->magic == AIX_LABEL_MAGIC_SWAPPED) {
printf("AIX\n");
exit(0);
}
psgi = (struct sgi_label *)(&buf);
if (psgi->magic == SGI_LABEL_MAGIC ||
psgi->magic == SGI_LABEL_MAGIC_SWAPPED) {
printf("SGI\n");
exit(0);
}
if (buf[510] == 0x55 && buf[511] == 0xaa) {
printf("DOS\n");
exit(0);
}
#if 0
fprintf(stderr, "%s: do not recognize any label on %s\n",
argv[0], argv[1]);
#endif
exit(1); /* unknown */
}
|