summaryrefslogtreecommitdiff
path: root/fdisk/partitiontype.c
diff options
context:
space:
mode:
authorKarel Zak <kzak@redhat.com>2006-12-07 00:25:49 +0100
committerKarel Zak <kzak@redhat.com>2006-12-07 00:25:49 +0100
commite8f2641919de90b488ce3788a7795b88311750b5 (patch)
tree68f3732da38ff1b21ec49780d7c830250329fec9 /fdisk/partitiontype.c
parent364cda4857f7dd5e2b4e2eb7583a2eaa279ef4ed (diff)
downloadutil-linux-old-e8f2641919de90b488ce3788a7795b88311750b5.tar.gz
Imported from util-linux-2.11m tarball.
Diffstat (limited to 'fdisk/partitiontype.c')
-rw-r--r--fdisk/partitiontype.c129
1 files changed, 129 insertions, 0 deletions
diff --git a/fdisk/partitiontype.c b/fdisk/partitiontype.c
new file mode 100644
index 00000000..5649c72a
--- /dev/null
+++ b/fdisk/partitiontype.c
@@ -0,0 +1,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 */
+}
+