/* * 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 #include #include 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 */ }