blob: 0ee44a0bab32a640140e5e5bce3048bed93c3aa6 [file] [log] [blame] [raw]
/*
* 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>
#include <stdlib.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 */
}