From afca1dba5eeb989c231a22df26e48f0967387547 Mon Sep 17 00:00:00 2001 From: Richard Jones Date: Mon, 27 Apr 2009 13:41:30 +0100 Subject: [PATCH 1/1] Functions for getting and setting the ext2 UUID and label. --- daemon/tune2fs.c | 119 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/generator.ml | 49 +++++++++++++++++++++++ 2 files changed, 168 insertions(+) diff --git a/daemon/tune2fs.c b/daemon/tune2fs.c index 742a7d9..99c12f0 100644 --- a/daemon/tune2fs.c +++ b/daemon/tune2fs.c @@ -115,3 +115,122 @@ do_tune2fs_l (const char *device) return ret; } + +int +do_set_e2label (const char *device, const char *label) +{ + int r; + char *err; + + r = command (NULL, &err, "/sbin/e2label", device, label, NULL); + if (r == -1) { + reply_with_error ("e2label: %s", err); + free (err); + return -1; + } + + free (err); + return 0; +} + +char * +do_get_e2label (const char *device) +{ + int r, len; + char *out, *err; + + r = command (&out, &err, "/sbin/e2label", device, NULL); + if (r == -1) { + reply_with_error ("e2label: %s", err); + free (out); + free (err); + return NULL; + } + + free (err); + + /* Remove any trailing \n from the label. */ + len = strlen (out); + if (len > 0 && out[len-1] == '\n') + out[len-1] = '\0'; + + return out; /* caller frees */ +} + +int +do_set_e2uuid (const char *device, const char *uuid) +{ + int r; + char *err; + + r = command (NULL, &err, "/sbin/tune2fs", "-U", uuid, device, NULL); + if (r == -1) { + reply_with_error ("tune2fs -U: %s", err); + free (err); + return -1; + } + + free (err); + return 0; +} + +char * +do_get_e2uuid (const char *device) +{ + int r; + char *out, *err, *p, *q; + + /* It's not so straightforward to get the volume UUID. We have + * to use tune2fs -l and then look for a particular string in + * the output. + */ + + r = command (&out, &err, "/sbin/tune2fs", "-l", device, NULL); + if (r == -1) { + reply_with_error ("tune2fs -l: %s", err); + free (out); + free (err); + return NULL; + } + + free (err); + + /* Look for /\nFilesystem UUID:\s+/ in the output. */ + p = strstr (out, "\nFilesystem UUID:"); + if (p == NULL) { + reply_with_error ("no Filesystem UUID in the output of tune2fs -l"); + free (out); + return NULL; + } + + p += 17; + while (*p && isspace (*p)) + p++; + if (!*p) { + reply_with_error ("malformed Filesystem UUID in the output of tune2fs -l"); + free (out); + return NULL; + } + + /* Now 'p' hopefully points to the start of the UUID. */ + q = p; + while (*q && (isxdigit (*q) || *q == '-')) + q++; + if (!*q) { + reply_with_error ("malformed Filesystem UUID in the output of tune2fs -l"); + free (out); + return NULL; + } + + *q = '\0'; + + p = strdup (p); + if (!p) { + reply_with_perror ("strdup"); + free (out); + return NULL; + } + + free (out); + return p; /* caller frees */ +} diff --git a/src/generator.ml b/src/generator.ml index 5e2b4d4..a709376 100755 --- a/src/generator.ml +++ b/src/generator.ml @@ -1565,6 +1565,55 @@ The implementation uses the C command which refuses to wipe physical volumes that contain any volume groups, so you have to remove those first."); + ("set_e2label", (RErr, [String "device"; String "label"]), 80, [], + [InitBasicFS, TestOutput ( + [["set_e2label"; "/dev/sda1"; "testlabel"]; + ["get_e2label"; "/dev/sda1"]], "testlabel")], + "set the ext2/3/4 filesystem label", + "\ +This sets the ext2/3/4 filesystem label of the filesystem on +C to C