/* * uktrix partition parsing code * * Copyright (C) 2010 Karel Zak * * This file may be redistributed under the terms of the * GNU Lesser General Public License. * */ #include #include #include #include #include "partitions.h" #define ULTRIX_MAXPARTITIONS 8 #define ULTRIX_MAGIC 0x032957 #define ULTRIX_MAGIC_STR "\x02\x29\x57" /* sector with partition table */ #define ULTRIX_SECTOR ((16384 - sizeof(struct ultrix_disklabel)) >> 9) /* position of partition table within ULTRIX_SECTOR */ #define ULTRIX_OFFSET (512 - sizeof(struct ultrix_disklabel)) struct ultrix_disklabel { int32_t pt_magic; /* magic no. indicating part. info exits */ int32_t pt_valid; /* set by driver if pt is current */ struct pt_info { int32_t pi_nblocks; /* no. of sectors */ uint32_t pi_blkoff; /* block offset for start */ } pt_part[ULTRIX_MAXPARTITIONS]; } __attribute__((packed)); static int probe_ultrix_pt(blkid_probe pr, const struct blkid_idmag *mag __attribute__((__unused__))) { unsigned char *data; struct ultrix_disklabel *l; blkid_parttable tab = NULL; blkid_partlist ls; int i; data = blkid_probe_get_sector(pr, ULTRIX_SECTOR); if (!data) { if (errno) return -errno; goto nothing; } l = (struct ultrix_disklabel *) (data + ULTRIX_OFFSET); if (l->pt_magic != ULTRIX_MAGIC || l->pt_valid != 1) goto nothing; if (blkid_probe_set_magic(pr, (ULTRIX_SECTOR << 9) + ULTRIX_OFFSET, sizeof(ULTRIX_MAGIC_STR) - 1, (unsigned char *) ULTRIX_MAGIC_STR)) goto err; if (blkid_partitions_need_typeonly(pr)) /* caller does not ask for details about partitions */ return BLKID_PROBE_OK; ls = blkid_probe_get_partlist(pr); if (!ls) goto nothing; tab = blkid_partlist_new_parttable(ls, "ultrix", 0); if (!tab) goto err; for (i = 0; i < ULTRIX_MAXPARTITIONS; i++) { if (!l->pt_part[i].pi_nblocks) blkid_partlist_increment_partno(ls); else { if (!blkid_partlist_add_partition(ls, tab, l->pt_part[i].pi_blkoff, l->pt_part[i].pi_nblocks)) goto err; } } return BLKID_PROBE_OK; nothing: return BLKID_PROBE_NONE; err: return -ENOMEM; } const struct blkid_idinfo ultrix_pt_idinfo = { .name = "ultrix", .probefunc = probe_ultrix_pt, .magics = BLKID_NONE_MAGIC };