chiark / gitweb /
vol_id: add NetWare volume detection
authorKay Sievers <kay.sievers@suse.de>
Tue, 9 May 2006 06:46:07 +0000 (08:46 +0200)
committerKay Sievers <kay.sievers@suse.de>
Tue, 9 May 2006 06:46:07 +0000 (08:46 +0200)
extras/volume_id/lib/Makefile
extras/volume_id/lib/exported_symbols
extras/volume_id/lib/libvolume_id.h
extras/volume_id/lib/netware.c [new file with mode: 0644]
extras/volume_id/lib/volume_id.c

index 03c9315..e3c3f5d 100644 (file)
@@ -47,6 +47,7 @@ OBJS=                         \
        ocfs.o                  \
        vxfs.o                  \
        squashfs.o              \
        ocfs.o                  \
        vxfs.o                  \
        squashfs.o              \
+       netware.o               \
        volume_id.o             \
        util.o
 
        volume_id.o             \
        util.o
 
index b1ff3cc..df5f9f0 100644 (file)
@@ -26,6 +26,7 @@
        volume_id_probe_vxfs;
        volume_id_probe_xfs;
        volume_id_probe_squashfs;
        volume_id_probe_vxfs;
        volume_id_probe_xfs;
        volume_id_probe_squashfs;
+       volume_id_probe_netware;
 
        volume_id_probe_linux_raid;
        volume_id_probe_lvm1;
 
        volume_id_probe_linux_raid;
        volume_id_probe_lvm1;
index 06b1baa..d6c5536 100644 (file)
@@ -88,6 +88,7 @@ extern int volume_id_probe_ufs(struct volume_id *id, uint64_t off);
 extern int volume_id_probe_vxfs(struct volume_id *id, uint64_t off);
 extern int volume_id_probe_xfs(struct volume_id *id, uint64_t off);
 extern int volume_id_probe_squashfs(struct volume_id *id, uint64_t off);
 extern int volume_id_probe_vxfs(struct volume_id *id, uint64_t off);
 extern int volume_id_probe_xfs(struct volume_id *id, uint64_t off);
 extern int volume_id_probe_squashfs(struct volume_id *id, uint64_t off);
+extern int volume_id_probe_netware(struct volume_id *id, uint64_t off);
 
 /* special formats */
 extern int volume_id_probe_linux_swap(struct volume_id *id, uint64_t off);
 
 /* special formats */
 extern int volume_id_probe_linux_swap(struct volume_id *id, uint64_t off);
diff --git a/extras/volume_id/lib/netware.c b/extras/volume_id/lib/netware.c
new file mode 100644 (file)
index 0000000..49afe21
--- /dev/null
@@ -0,0 +1,63 @@
+/*
+ * volume_id - reads filesystem label and uuid
+ *
+ * Copyright (C) 2006 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 "libvolume_id.h"
+#include "util.h"
+
+#define NW_SUPERBLOCK_OFFSET                   0x1000
+
+struct netware_super_block {
+       uint8_t         SBH_Signature[4];
+       uint16_t        SBH_VersionMajor;
+       uint16_t        SBH_VersionMinor;
+       uint16_t        SBH_VersionMediaMajor;
+       uint16_t        SBH_VersionMediaMinor;
+       uint32_t        SBH_ItemsMoved;
+       uint8_t         SBH_InternalID[16];
+} PACKED;
+
+int volume_id_probe_netware(struct volume_id *id, uint64_t off)
+{
+       struct netware_super_block *nw;
+
+       info("probing at offset 0x%llx", (unsigned long long) off);
+
+       nw = (struct netware_super_block *) volume_id_get_buffer(id, off + NW_SUPERBLOCK_OFFSET, 0x200);
+       if (nw == NULL)
+               return -1;
+
+       if (memcmp(nw->SBH_Signature, "SPB5", 4) != 0)
+               return -1;
+
+       volume_id_set_uuid(id, nw->SBH_InternalID, UUID_DCE);
+
+       snprintf(id->type_version, sizeof(id->type_version)-1, "%u.%02u",
+                le16_to_cpu(nw->SBH_VersionMediaMajor), le16_to_cpu(nw->SBH_VersionMediaMinor));
+
+       volume_id_set_usage(id, VOLUME_ID_FILESYSTEM);
+       id->type = "nss";
+
+       return 0;
+}
index 33fd890..472ea24 100644 (file)
@@ -163,6 +163,9 @@ int volume_id_probe_filesystem(struct volume_id *id, uint64_t off, uint64_t size
        if (volume_id_probe_squashfs(id, off) == 0)
                goto found;
 
        if (volume_id_probe_squashfs(id, off) == 0)
                goto found;
 
+       if (volume_id_probe_netware(id, off) == 0)
+               goto found;
+
        return -1;
 
 found:
        return -1;
 
 found: