From a08dc0ca895e6a46c33ace6a021fbb76a60a0e4e Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Mon, 4 Feb 2013 17:46:30 +0100 Subject: [PATCH] libblkid: move sun PT definition to include/ Signed-off-by: Karel Zak --- include/Makemodule.am | 3 +- include/pt-sun.h | 72 +++++++++++++++++++++++++++++++++++ libblkid/src/partitions/sun.c | 69 +-------------------------------- 3 files changed, 76 insertions(+), 68 deletions(-) create mode 100644 include/pt-sun.h diff --git a/include/Makemodule.am b/include/Makemodule.am index 358a351e1..0c1656d2d 100644 --- a/include/Makemodule.am +++ b/include/Makemodule.am @@ -44,4 +44,5 @@ dist_noinst_HEADERS += \ include/wholedisk.h \ include/widechar.h \ include/xalloc.h \ - include/xgetpass.h + include/xgetpass.h \ + include/pt-sun.h diff --git a/include/pt-sun.h b/include/pt-sun.h new file mode 100644 index 000000000..5528dd3ee --- /dev/null +++ b/include/pt-sun.h @@ -0,0 +1,72 @@ +#ifndef UTIL_LINUX_PT_SUN_H +#define UTIL_LINUX_PT_SUN_H + +#include + +/* Supported VTOC setting */ +#define SUN_VTOC_SANITY 0x600DDEEE /* magic number */ +#define SUN_VTOC_VERSION 1 + +#define SUN_MAXPARTITIONS 8 + +/* Partition IDs */ +#define SUN_TAG_WHOLEDISK 0x05 + +struct sun_disklabel { + unsigned char info[128]; /* Informative text string */ + + struct sun_vtoc { + uint32_t version; /* version */ + char volume[8]; /* volume name */ + uint16_t nparts; /* num of partitions */ + + struct sun_info { /* partition information */ + uint16_t id; /* tag */ + uint16_t flags; + } __attribute__ ((packed)) infos[8]; + + uint16_t padding; /* padding */ + uint32_t bootinfo[3]; /* info needed by mboot */ + uint32_t sanity; /* magic number */ + uint32_t reserved[10]; /* padding */ + uint32_t timestamp[8]; /* partition timestamp */ + } __attribute__ ((packed)) vtoc; + + uint32_t write_reinstruct; /* sectors to skip, writes */ + uint32_t read_reinstruct; /* sectors to skip, reads */ + unsigned char spare[148]; /* padding */ + uint16_t rspeed; /* disk rotational speed */ + uint16_t pcylcount; /* physical cylinder count */ + uint16_t sparecyl; /* extra sects per cylinder */ + uint16_t obs1; + uint16_t obs2; + uint16_t ilfact; /* interleave factor */ + uint16_t ncyl; /* data cylinder count */ + uint16_t nacyl; /* alt. cylinder count */ + uint16_t ntrks; /* tracks per cylinder <---- */ + uint16_t nsect; /* sectors per track <---- */ + uint16_t obs3; + uint16_t obs4; + + struct sun_partition { /* partitions */ + uint32_t start_cylinder; + uint32_t num_sectors; + } __attribute__ ((packed)) partitions[8]; + + uint16_t magic; /* magic number */ + uint16_t csum; /* label xor'd checksum */ +} __attribute__ ((packed)); + + +static inline uint16_t sun_pt_checksum(struct sun_disklabel *label) +{ + uint16_t *ptr = ((uint16_t *) (label + 1)) - 1; + uint16_t sum; + + for (sum = 0; ptr >= ((uint16_t *) label);) + sum ^= *ptr--; + + return sum; +} + +#endif /* UTIL_LINUX_PT_SUN_H */ diff --git a/libblkid/src/partitions/sun.c b/libblkid/src/partitions/sun.c index f151f46ae..f1b839258 100644 --- a/libblkid/src/partitions/sun.c +++ b/libblkid/src/partitions/sun.c @@ -12,74 +12,9 @@ #include #include +#include "pt-sun.h" #include "partitions.h" -/* Supported VTOC setting */ -#define SUN_VTOC_SANITY 0x600DDEEE /* magic number */ -#define SUN_VTOC_VERSION 1 - -#define SUN_MAXPARTITIONS 8 - -/* Partition IDs */ -#define SUN_TAG_WHOLEDISK 0x05 - -struct sun_disklabel { - unsigned char info[128]; /* Informative text string */ - - struct sun_vtoc { - uint32_t version; /* version */ - char volume[8]; /* volume name */ - uint16_t nparts; /* num of partitions */ - - struct sun_info { /* partition information */ - uint16_t id; /* tag */ - uint16_t flags; - } __attribute__ ((packed)) infos[8]; - - uint16_t padding; /* padding */ - uint32_t bootinfo[3]; /* info needed by mboot */ - uint32_t sanity; /* magic number */ - uint32_t reserved[10]; /* padding */ - uint32_t timestamp[8]; /* partition timestamp */ - } __attribute__ ((packed)) vtoc; - - uint32_t write_reinstruct; /* sectors to skip, writes */ - uint32_t read_reinstruct; /* sectors to skip, reads */ - unsigned char spare[148]; /* padding */ - uint16_t rspeed; /* disk rotational speed */ - uint16_t pcylcount; /* physical cylinder count */ - uint16_t sparecyl; /* extra sects per cylinder */ - uint16_t obs1; - uint16_t obs2; - uint16_t ilfact; /* interleave factor */ - uint16_t ncyl; /* data cylinder count */ - uint16_t nacyl; /* alt. cylinder count */ - uint16_t ntrks; /* tracks per cylinder <---- */ - uint16_t nsect; /* sectors per track <---- */ - uint16_t obs3; - uint16_t obs4; - - struct sun_partition { /* partitions */ - uint32_t start_cylinder; - uint32_t num_sectors; - } __attribute__ ((packed)) partitions[8]; - - uint16_t magic; /* magic number */ - uint16_t csum; /* label xor'd checksum */ -} __attribute__ ((packed)); - - -uint16_t count_checksum(struct sun_disklabel *label) -{ - uint16_t *ptr = ((uint16_t *) (label + 1)) - 1; - uint16_t sum; - - for (sum = 0; ptr >= ((uint16_t *) label);) - sum ^= *ptr--; - - return sum; -} - static int probe_sun_pt(blkid_probe pr, const struct blkid_idmag *mag __attribute__((__unused__))) { @@ -95,7 +30,7 @@ static int probe_sun_pt(blkid_probe pr, if (!l) goto nothing; - if (count_checksum(l)) { + if (sun_pt_checksum(l)) { DBG(DEBUG_LOWPROBE, printf( "detected corrupted sun disk label -- ignore\n")); goto nothing;