diff options
Diffstat (limited to 'extras/volume_id')
-rw-r--r-- | extras/volume_id/volume_id/Makefile.inc | 4 | ||||
-rw-r--r-- | extras/volume_id/volume_id/hpfs.c | 2 | ||||
-rw-r--r-- | extras/volume_id/volume_id/minix.c | 97 | ||||
-rw-r--r-- | extras/volume_id/volume_id/minix.h | 26 | ||||
-rw-r--r-- | extras/volume_id/volume_id/volume_id.c | 4 | ||||
-rw-r--r-- | extras/volume_id/volume_id/volume_id.h | 2 |
6 files changed, 132 insertions, 3 deletions
diff --git a/extras/volume_id/volume_id/Makefile.inc b/extras/volume_id/volume_id/Makefile.inc index 9cadec20cc..68d80d689c 100644 --- a/extras/volume_id/volume_id/Makefile.inc +++ b/extras/volume_id/volume_id/Makefile.inc @@ -19,6 +19,7 @@ VOLUME_ID_OBJS= \ $(VOLUME_ID_BASE)/hpfs.o \ $(VOLUME_ID_BASE)/romfs.o \ $(VOLUME_ID_BASE)/sysv.o \ + $(VOLUME_ID_BASE)/minix.o \ $(VOLUME_ID_BASE)/dasd.o \ $(VOLUME_ID_BASE)/luks.o \ $(VOLUME_ID_BASE)/volume_id.o \ @@ -42,8 +43,9 @@ VOLUME_ID_HEADERS= \ $(VOLUME_ID_BASE)/ufs.h \ $(VOLUME_ID_BASE)/xfs.h \ $(VOLUME_ID_BASE)/cramfs.h \ - $(VOLUME_ID_BASE)/sysv.h \ $(VOLUME_ID_BASE)/romfs.h \ + $(VOLUME_ID_BASE)/sysv.h \ + $(VOLUME_ID_BASE)/minix.h \ $(VOLUME_ID_BASE)/dasd.h \ $(VOLUME_ID_BASE)/luks.h \ $(VOLUME_ID_BASE)/volume_id.h \ diff --git a/extras/volume_id/volume_id/hpfs.c b/extras/volume_id/volume_id/hpfs.c index a8daea7892..3aa95fa839 100644 --- a/extras/volume_id/volume_id/hpfs.c +++ b/extras/volume_id/volume_id/hpfs.c @@ -58,7 +58,7 @@ int volume_id_probe_hpfs(struct volume_id *id, __u64 off) return -1; if (memcmp(hs->magic, "\x49\xe8\x95\xf9", 4) == 0) { - snprintf(id->type_version, VOLUME_ID_FORMAT_SIZE-1, "%u", hs->version); + sprintf(id->type_version, "%u", hs->version); volume_id_set_usage(id, VOLUME_ID_FILESYSTEM); id->type = "hpfs"; diff --git a/extras/volume_id/volume_id/minix.c b/extras/volume_id/volume_id/minix.c new file mode 100644 index 0000000000..d9c9ea8ca9 --- /dev/null +++ b/extras/volume_id/volume_id/minix.c @@ -0,0 +1,97 @@ +/* + * volume_id - reads filesystem label and uuid + * + * Copyright (C) 2005 Kay Sievers <kay.sievers@vrfy.org> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#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 <asm/types.h> + +#include "volume_id.h" +#include "logging.h" +#include "util.h" +#include "minix.h" + +struct minix_super_block +{ + __u16 s_ninodes; + __u16 s_nzones; + __u16 s_imap_blocks; + __u16 s_zmap_blocks; + __u16 s_firstdatazone; + __u16 s_log_zone_size; + __u32 s_max_size; + __u16 s_magic; + __u16 s_state; + __u32 s_zones; +} __attribute__((__packed__)); + +#define MINIX_SUPERBLOCK_OFFSET 0x400 + +int volume_id_probe_minix(struct volume_id *id, __u64 off) +{ + struct minix_super_block *ms; + + dbg("probing at offset %llu", off); + + ms = (struct minix_super_block *) volume_id_get_buffer(id, off + MINIX_SUPERBLOCK_OFFSET, 0x200); + if (ms == NULL) + return -1; + + if (le16_to_cpu(ms->s_magic) == 0x137f) { + strcpy(id->type_version, "1"); + goto found; + } + + if (le16_to_cpu(ms->s_magic) == 0x1387) { + strcpy(id->type_version, "1"); + goto found; + } + + if (le16_to_cpu(ms->s_magic) == 0x2468) { + strcpy(id->type_version, "2"); + goto found; + } + + if (le16_to_cpu(ms->s_magic) == 0x2478) { + strcpy(id->type_version, "2"); + goto found; + } + + goto exit; + +found: + volume_id_set_usage(id, VOLUME_ID_FILESYSTEM); + id->type = "minix"; + return 0; + +exit: + return -1; +} diff --git a/extras/volume_id/volume_id/minix.h b/extras/volume_id/volume_id/minix.h new file mode 100644 index 0000000000..7a9d97ada2 --- /dev/null +++ b/extras/volume_id/volume_id/minix.h @@ -0,0 +1,26 @@ +/* + * volume_id - reads filesystem label and uuid + * + * Copyright (C) 2005 Kay Sievers <kay.sievers@vrfy.org> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef _VOLUME_ID_MINIX_ +#define _VOLUME_ID_MINIX_ + +extern int volume_id_probe_minix(struct volume_id *id, __u64 off); + +#endif diff --git a/extras/volume_id/volume_id/volume_id.c b/extras/volume_id/volume_id/volume_id.c index 7a08be89d9..22d30ee741 100644 --- a/extras/volume_id/volume_id/volume_id.c +++ b/extras/volume_id/volume_id/volume_id.c @@ -60,6 +60,7 @@ #include "hpfs.h" #include "romfs.h" #include "sysv.h" +#include "minix.h" #include "mac.h" #include "msdos.h" @@ -136,6 +137,9 @@ int volume_id_probe_all(struct volume_id *id, unsigned long long off, unsigned l if (volume_id_probe_sysv(id, off) == 0) goto exit; + if (volume_id_probe_minix(id, off) == 0) + goto exit; + return -1; exit: diff --git a/extras/volume_id/volume_id/volume_id.h b/extras/volume_id/volume_id/volume_id.h index 22bb3ea487..6719c1aa31 100644 --- a/extras/volume_id/volume_id/volume_id.h +++ b/extras/volume_id/volume_id/volume_id.h @@ -21,7 +21,7 @@ #ifndef _VOLUME_ID_H_ #define _VOLUME_ID_H_ -#define VOLUME_ID_VERSION 38 +#define VOLUME_ID_VERSION 39 #define VOLUME_ID_LABEL_SIZE 64 #define VOLUME_ID_UUID_SIZE 36 |