diff options
-rw-r--r-- | extras/volume_id/README | 28 | ||||
-rw-r--r-- | extras/volume_id/libvolume_id/Makefile | 2 | ||||
-rw-r--r-- | extras/volume_id/libvolume_id/mac.c | 133 | ||||
-rw-r--r-- | extras/volume_id/libvolume_id/msdos.c | 203 | ||||
-rw-r--r-- | extras/volume_id/libvolume_id/volume_id.h | 6 |
5 files changed, 14 insertions, 358 deletions
diff --git a/extras/volume_id/README b/extras/volume_id/README index 974a5016d9..640a9e47ac 100644 --- a/extras/volume_id/README +++ b/extras/volume_id/README @@ -36,6 +36,7 @@ sysv * * - * luks * - * - hpfs * - - - romfs * +squashfs * minix * highpoint * isw_raid * @@ -44,29 +45,26 @@ nvidia_raid * promise_raid * silicon_raid * via_raid * -mac partitons * -msdos partitions * -The following rule will create a symlink named with the label string: - KERNEL=="[hs]d*", PROGRAM=="/sbin/vol_id -l %N", SYMLINK+="%c" - If no label is found vol_id exits with nonzero and the rule will be ignored. To give it a try, you may call it on the commandline: - [root@pim udev.kay]# extras/volume_id/vol_id /dev/hda3 - T:ext3 - L:Music Store - N:Music_Store - U:d2da42b5-bbd9-44eb-a72c-cc4542fcb71e + $ extras/volume_id/vol_id --export /dev/sda6 + ID_FS_USAGE=filesystem + ID_FS_TYPE=ext3 + ID_FS_VERSION=1.0 + ID_FS_UUID=3e999973-00c9-4917-9442-b7633bd95b9e + ID_FS_LABEL=devel + ID_FS_LABEL_SAFE=devel - [root@pim udev.kay]# extras/volume_id/vol_id -l /dev/hda3 - Music_Store + $ extras/volume_id/vol_id -l /dev/sda6 + devel - [root@pim udev.kay]# extras/volume_id/vol_id -t /dev/hda3 - swap + $ extras/volume_id/vol_id -t /dev/sda6 + ext3 Any comment/questions/concerns to me: -Kay Sievers <kay.sievers@vrfy.org> + Kay Sievers <kay.sievers@vrfy.org> diff --git a/extras/volume_id/libvolume_id/Makefile b/extras/volume_id/libvolume_id/Makefile index 2a86e931a4..a5f9c1a825 100644 --- a/extras/volume_id/libvolume_id/Makefile +++ b/extras/volume_id/libvolume_id/Makefile @@ -23,8 +23,6 @@ OBJS= \ linux_raid.o \ linux_swap.o \ lvm.o \ - mac.o \ - msdos.o \ ntfs.o \ reiserfs.o \ udf.o \ diff --git a/extras/volume_id/libvolume_id/mac.c b/extras/volume_id/libvolume_id/mac.c deleted file mode 100644 index 78ef9fc803..0000000000 --- a/extras/volume_id/libvolume_id/mac.c +++ /dev/null @@ -1,133 +0,0 @@ -/* - * volume_id - reads filesystem label and uuid - * - * Copyright (C) 2004 Kay Sievers <kay.sievers@vrfy.org> - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation version 2 of the License. - */ - -#ifndef _GNU_SOURCE -#define _GNU_SOURCE 1 -#endif - -#ifdef HAVE_CONFIG_H -# include <config.h> -#endif - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <string.h> -#include <errno.h> -#include <ctype.h> - -#include "volume_id.h" -#include "logging.h" -#include "util.h" - -struct mac_driver_desc { - uint8_t signature[2]; - uint16_t block_size; - uint32_t block_count; -} PACKED; - -struct mac_partition { - uint8_t signature[2]; - uint16_t res1; - uint32_t map_count; - uint32_t start_block; - uint32_t block_count; - uint8_t name[32]; - uint8_t type[32]; -} PACKED; - -int volume_id_probe_mac_partition_map(struct volume_id *id, uint64_t off) -{ - const uint8_t *buf; - struct mac_driver_desc *driver; - struct mac_partition *part; - - dbg("probing at offset 0x%llx", (unsigned long long) off); - - buf = volume_id_get_buffer(id, off, 0x200); - if (buf == NULL) - return -1; - - part = (struct mac_partition *) buf; - if ((memcmp(part->signature, "PM", 2) == 0) && - (memcmp(part->type, "Apple_partition_map", 19) == 0)) { - /* linux creates an own subdevice for the map - * just return the type if the drive header is missing */ - volume_id_set_usage(id, VOLUME_ID_PARTITIONTABLE); - id->type = "mac_partition_map"; - return 0; - } - - driver = (struct mac_driver_desc *) buf; - if (memcmp(driver->signature, "ER", 2) == 0) { - /* we are on a main device, like a CD - * just try to probe the first partition from the map */ - unsigned int bsize = be16_to_cpu(driver->block_size); - int part_count; - int i; - - /* get first entry of partition table */ - buf = volume_id_get_buffer(id, off + bsize, 0x200); - if (buf == NULL) - return -1; - - part = (struct mac_partition *) buf; - if (memcmp(part->signature, "PM", 2) != 0) - return -1; - - part_count = be32_to_cpu(part->map_count); - dbg("expecting %d partition entries", part_count); - if (part_count < 1 || part_count > 256) - return -1; - - if (id->partitions != NULL) - free(id->partitions); - id->partitions = malloc(part_count * sizeof(struct volume_id_partition)); - if (id->partitions == NULL) - return -1; - memset(id->partitions, 0x00, part_count * sizeof(struct volume_id_partition)); - - id->partition_count = part_count; - - for (i = 0; i < part_count; i++) { - uint64_t poff; - uint64_t plen; - - buf = volume_id_get_buffer(id, off + ((i+1) * bsize), 0x200); - if (buf == NULL) - return -1; - - part = (struct mac_partition *) buf; - if (memcmp(part->signature, "PM", 2) != 0) - return -1; - - poff = be32_to_cpu(part->start_block) * bsize; - plen = be32_to_cpu(part->block_count) * bsize; - dbg("found '%s' partition entry at 0x%llx, len 0x%llx", - part->type, (unsigned long long) poff, (unsigned long long) plen); - - id->partitions[i].off = poff; - id->partitions[i].len = plen; - - if (memcmp(part->type, "Apple_Free", 10) == 0) { - volume_id_set_usage_part(&id->partitions[i], VOLUME_ID_UNUSED); - } else if (memcmp(part->type, "Apple_partition_map", 19) == 0) { - volume_id_set_usage_part(&id->partitions[i], VOLUME_ID_PARTITIONTABLE); - } else { - volume_id_set_usage_part(&id->partitions[i], VOLUME_ID_UNPROBED); - } - } - volume_id_set_usage(id, VOLUME_ID_PARTITIONTABLE); - id->type = "mac_partition_map"; - return 0; - } - - return -1; -} diff --git a/extras/volume_id/libvolume_id/msdos.c b/extras/volume_id/libvolume_id/msdos.c deleted file mode 100644 index ca3801a8db..0000000000 --- a/extras/volume_id/libvolume_id/msdos.c +++ /dev/null @@ -1,203 +0,0 @@ -/* - * volume_id - reads filesystem label and uuid - * - * Copyright (C) 2004 Kay Sievers <kay.sievers@vrfy.org> - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation version 2 of the License. - */ - -#ifndef _GNU_SOURCE -#define _GNU_SOURCE 1 -#endif - -#ifdef HAVE_CONFIG_H -# include <config.h> -#endif - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <string.h> -#include <errno.h> -#include <ctype.h> - -#include "volume_id.h" -#include "logging.h" -#include "util.h" - -struct msdos_partition_entry { - uint8_t boot_ind; - uint8_t head; - uint8_t sector; - uint8_t cyl; - uint8_t sys_ind; - uint8_t end_head; - uint8_t end_sector; - uint8_t end_cyl; - uint32_t start_sect; - uint32_t nr_sects; -} PACKED; - -#define MSDOS_MAGIC "\x55\xaa" -#define MSDOS_PARTTABLE_OFFSET 0x1be -#define MSDOS_SIG_OFF 0x1fe -#define BSIZE 0x200 -#define DOS_EXTENDED_PARTITION 0x05 -#define LINUX_EXTENDED_PARTITION 0x85 -#define WIN98_EXTENDED_PARTITION 0x0f -#define LINUX_RAID_PARTITION 0xfd -#define is_extended(type) \ - (type == DOS_EXTENDED_PARTITION || \ - type == WIN98_EXTENDED_PARTITION || \ - type == LINUX_EXTENDED_PARTITION) -#define is_raid(type) \ - (type == LINUX_RAID_PARTITION) - -int volume_id_probe_msdos_part_table(struct volume_id *id, uint64_t off) -{ - const uint8_t *buf; - int i; - uint64_t poff; - uint64_t plen; - uint64_t extended = 0; - uint64_t current; - uint64_t next; - int limit; - int empty = 1; - struct msdos_partition_entry *part; - struct volume_id_partition *p; - - dbg("probing at offset 0x%llx", (unsigned long long) off); - - buf = volume_id_get_buffer(id, off, 0x200); - if (buf == NULL) - return -1; - - if (memcmp(&buf[MSDOS_SIG_OFF], MSDOS_MAGIC, 2) != 0) - return -1; - - /* check flags on all entries for a valid partition table */ - part = (struct msdos_partition_entry*) &buf[MSDOS_PARTTABLE_OFFSET]; - for (i = 0; i < 4; i++) { - if (part[i].boot_ind != 0 && - part[i].boot_ind != 0x80) - return -1; - - if (le32_to_cpu(part[i].nr_sects) != 0) - empty = 0; - } - if (empty == 1) - return -1; - - if (id->partitions != NULL) - free(id->partitions); - id->partitions = malloc(VOLUME_ID_PARTITIONS_MAX * - sizeof(struct volume_id_partition)); - if (id->partitions == NULL) - return -1; - memset(id->partitions, 0x00, - VOLUME_ID_PARTITIONS_MAX * sizeof(struct volume_id_partition)); - - for (i = 0; i < 4; i++) { - poff = (uint64_t) le32_to_cpu(part[i].start_sect) * BSIZE; - plen = (uint64_t) le32_to_cpu(part[i].nr_sects) * BSIZE; - - if (plen == 0) - continue; - - p = &id->partitions[i]; - - p->partition_type_raw = part[i].sys_ind; - - if (is_extended(part[i].sys_ind)) { - dbg("found extended partition at 0x%llx", (unsigned long long) poff); - volume_id_set_usage_part(p, VOLUME_ID_PARTITIONTABLE); - p->type = "msdos_extended_partition"; - if (extended == 0) - extended = off + poff; - } else { - dbg("found 0x%x data partition at 0x%llx, len 0x%llx", - part[i].sys_ind, (unsigned long long) poff, (unsigned long long) plen); - - if (is_raid(part[i].sys_ind)) - volume_id_set_usage_part(p, VOLUME_ID_RAID); - else - volume_id_set_usage_part(p, VOLUME_ID_UNPROBED); - } - - p->off = off + poff; - p->len = plen; - id->partition_count = i+1; - } - - next = extended; - current = extended; - limit = 50; - - /* follow extended partition chain and add data partitions */ - while (next != 0) { - if (limit-- == 0) { - dbg("extended chain limit reached"); - break; - } - - buf = volume_id_get_buffer(id, current, 0x200); - if (buf == NULL) - break; - - part = (struct msdos_partition_entry*) &buf[MSDOS_PARTTABLE_OFFSET]; - - if (memcmp(&buf[MSDOS_SIG_OFF], MSDOS_MAGIC, 2) != 0) - break; - - next = 0; - - for (i = 0; i < 4; i++) { - poff = (uint64_t) le32_to_cpu(part[i].start_sect) * BSIZE; - plen = (uint64_t) le32_to_cpu(part[i].nr_sects) * BSIZE; - - if (plen == 0) - continue; - - if (is_extended(part[i].sys_ind)) { - dbg("found extended partition at 0x%llx", (unsigned long long) poff); - if (next == 0) - next = extended + poff; - } else { - dbg("found 0x%x data partition at 0x%llx, len 0x%llx", - part[i].sys_ind, (unsigned long long) poff, (unsigned long long) plen); - - /* we always start at the 5th entry */ - while (id->partition_count < 4) - volume_id_set_usage_part(&id->partitions[id->partition_count++], VOLUME_ID_UNUSED); - - p = &id->partitions[id->partition_count]; - - if (is_raid(part[i].sys_ind)) - volume_id_set_usage_part(p, VOLUME_ID_RAID); - else - volume_id_set_usage_part(p, VOLUME_ID_UNPROBED); - - p->off = current + poff; - p->len = plen; - id->partition_count++; - - p->partition_type_raw = part[i].sys_ind; - - if (id->partition_count >= VOLUME_ID_PARTITIONS_MAX) { - dbg("too many partitions"); - next = 0; - } - } - } - - current = next; - } - - volume_id_set_usage(id, VOLUME_ID_PARTITIONTABLE); - id->type = "msdos_partition_table"; - - return 0; -} diff --git a/extras/volume_id/libvolume_id/volume_id.h b/extras/volume_id/libvolume_id/volume_id.h index 15f1ac01f8..d370bae6c8 100644 --- a/extras/volume_id/libvolume_id/volume_id.h +++ b/extras/volume_id/libvolume_id/volume_id.h @@ -14,7 +14,7 @@ #include <stdint.h> #include <stddef.h> -#define VOLUME_ID_VERSION 59 +#define VOLUME_ID_VERSION 60 #ifndef PACKED #define PACKED __attribute__((packed)) @@ -117,8 +117,4 @@ extern int volume_id_probe_promise_fasttrack_raid(struct volume_id *id, uint64_t extern int volume_id_probe_silicon_medley_raid(struct volume_id *id, uint64_t off, uint64_t size); extern int volume_id_probe_via_raid(struct volume_id *id, uint64_t off, uint64_t size); -/* partition tables */ -extern int volume_id_probe_msdos_part_table(struct volume_id *id, uint64_t off); -extern int volume_id_probe_mac_partition_map(struct volume_id *id, uint64_t off); - #endif |