summaryrefslogtreecommitdiffstats
path: root/mount/mount_by_label.c
diff options
context:
space:
mode:
Diffstat (limited to 'mount/mount_by_label.c')
-rw-r--r--mount/mount_by_label.c108
1 files changed, 1 insertions, 107 deletions
diff --git a/mount/mount_by_label.c b/mount/mount_by_label.c
index 10c916672..e2afcf018 100644
--- a/mount/mount_by_label.c
+++ b/mount/mount_by_label.c
@@ -29,6 +29,7 @@
#include <dirent.h>
#include "sundries.h" /* for xstrdup */
#include "linux_fs.h"
+#include "get_label_uuid.h"
#include "mount_by_label.h"
#include "nls.h"
@@ -45,113 +46,6 @@ static struct uuidCache_s {
char *device;
} *uuidCache = NULL;
-/*
- * See whether this device has (the magic of) a RAID superblock at the end.
- * If so, it probably is, or has been, part of a RAID array.
- *
- * For the moment this test is switched off - it causes problems.
- * "Checking for a disk label should only be done on the full raid,
- * not on the disks that form the raid array. This test causes a lot of
- * problems when run on my striped promise fasttrak 100 array."
- */
-static int
-is_raid_partition(int fd) {
-#if 0
- struct mdp_super_block mdsb;
- int n;
-
- /* hardcode 4096 here in various places, because that's
- what it's defined to be. Note that even if we used
- the actual kernel headers, sizeof(mdp_super_t) is
- slightly larger in the 2.2 kernel on 64-bit archs,
- so using that wouldn't work. */
- lseek(fd, -4096, SEEK_END); /* Ignore possible error
- about return value overflow */
- n = 4096;
- if (sizeof(mdsb) < n)
- n = sizeof(mdsb);
- if (read(fd, &mdsb, n) != n)
- return 1; /* error */
- return (mdsbmagic(mdsb) == MD_SB_MAGIC);
-#else
- return 0;
-#endif
-}
-
-/* for now, only ext2, ext3, xfs, ocfs are supported */
-static int
-get_label_uuid(const char *device, char **label, char *uuid) {
- int fd;
- int rv = 1;
- size_t namesize;
- struct ext2_super_block e2sb;
- struct xfs_super_block xfsb;
- struct jfs_super_block jfssb;
- struct ocfs_volume_header ovh; /* Oracle */
- struct ocfs_volume_label olbl;
-
- fd = open(device, O_RDONLY);
- if (fd < 0)
- return rv;
-
- /* If there is a RAID partition, or an error, ignore this partition */
- if (is_raid_partition(fd)) {
- close(fd);
- return rv;
- }
-
- if (lseek(fd, 1024, SEEK_SET) == 1024
- && read(fd, (char *) &e2sb, sizeof(e2sb)) == sizeof(e2sb)
- && (ext2magic(e2sb) == EXT2_SUPER_MAGIC)) {
- memcpy(uuid, e2sb.s_uuid, sizeof(e2sb.s_uuid));
- namesize = sizeof(e2sb.s_volume_name);
- if ((*label = calloc(namesize + 1, 1)) != NULL)
- memcpy(*label, e2sb.s_volume_name, namesize);
- rv = 0;
- }
- else if (lseek(fd, 0, SEEK_SET) == 0
- && read(fd, (char *) &xfsb, sizeof(xfsb)) == sizeof(xfsb)
- && (strncmp(xfsb.s_magic, XFS_SUPER_MAGIC, 4) == 0)) {
- memcpy(uuid, xfsb.s_uuid, sizeof(xfsb.s_uuid));
- namesize = sizeof(xfsb.s_fname);
- if ((*label = calloc(namesize + 1, 1)) != NULL)
- memcpy(*label, xfsb.s_fname, namesize);
- rv = 0;
- }
- else if (lseek(fd, 0, SEEK_SET) == 0
- && read(fd, (char *) &ovh, sizeof(ovh)) == sizeof(ovh)
- && (strncmp(ovh.signature, OCFS_MAGIC, sizeof(OCFS_MAGIC)) == 0)
- && (lseek(fd, 512, SEEK_SET) == 512)
- && read(fd, (char *) &olbl, sizeof(olbl)) == sizeof(olbl)) {
- uuid[0] = '\0';
- namesize = ocfslabellen(olbl);
- if ((*label = calloc(namesize + 1, 1)) != NULL)
- memcpy(*label, olbl.label, namesize);
- rv = 0;
- }
- else if (lseek(fd, JFS_SUPER1_OFF, SEEK_SET) == JFS_SUPER1_OFF
- && read(fd, (char *) &jfssb, sizeof(jfssb)) == sizeof(jfssb)
- && (strncmp(jfssb.s_magic, JFS_MAGIC, 4) == 0)) {
- if (assemble4le(jfssb.s_version) == 1) {
- /* old (OS/2 compatible) jfs filesystems don't
- have UUIDs and only have a very small label. */
- memset(uuid, 0, 16);
- namesize = sizeof(jfssb.s_fpack);
- if ((*label = calloc(namesize + 1, 1)) != NULL)
- memcpy(*label, jfssb.s_fpack, namesize);
- } else {
- memcpy(uuid, jfssb.s_uuid, sizeof(jfssb.s_uuid));
- namesize = sizeof(jfssb.s_label);
- if ((*label = calloc(namesize + 1, 1)) != NULL)
- memcpy(*label, jfssb.s_label, namesize);
- }
- rv = 0;
- }
-
- close(fd);
- return rv;
-}
-
static void
uuidcache_addentry(char *device, char *label, char *uuid) {
struct uuidCache_s *last;