psss / rpms / libguestfs

Forked from rpms/libguestfs 5 years ago
Clone
Blob Blame History Raw
From 382825b54551d09fb38bba03c1a0adf7ecf50937 Mon Sep 17 00:00:00 2001
From: Richard W.M. Jones <rjones@redhat.com>
Date: Fri, 31 Aug 2012 13:48:18 +0100
Subject: [PATCH 27/29] EPEL 5: Revert "daemon: Remove e2prog hack (only needed for RHEL 5)."

This reverts commit 163e030ee13644ad9efe1e078aff47b879657333.
---
 daemon/daemon.h |    2 +
 daemon/ext2.c   |  113 +++++++++++++++++++++++++++++++++++++++++++++++-------
 daemon/labels.c |    6 ++-
 daemon/mkfs.c   |    8 +++-
 4 files changed, 111 insertions(+), 18 deletions(-)

diff --git a/daemon/daemon.h b/daemon/daemon.h
index a483208..1734e40 100644
--- a/daemon/daemon.h
+++ b/daemon/daemon.h
@@ -174,6 +174,8 @@ extern int filesystem_available (const char *filesystem);
 extern int sync_disks (void);
 
 /*-- in ext2.c --*/
+extern int e2prog (char *name); /* Massive hack for RHEL 5. */
+
 /* Confirmed this is true up to ext4 from the Linux sources. */
 #define EXT2_LABEL_MAX 16
 
diff --git a/daemon/ext2.c b/daemon/ext2.c
index 40b36d2..d4ebf90 100644
--- a/daemon/ext2.c
+++ b/daemon/ext2.c
@@ -31,6 +31,7 @@
 
 #define MAX_ARGS 64
 
+
 GUESTFSD_EXT_CMD(str_tune2fs, tune2fs);
 GUESTFSD_EXT_CMD(str_e2fsck, e2fsck);
 GUESTFSD_EXT_CMD(str_resize2fs, resize2fs);
@@ -38,6 +39,32 @@ GUESTFSD_EXT_CMD(str_mke2fs, mke2fs);
 GUESTFSD_EXT_CMD(str_lsattr, lsattr);
 GUESTFSD_EXT_CMD(str_chattr, chattr);
 
+/* Choose which tools like mke2fs to use.  For RHEL 5 (only) there
+ * is a special set of tools which support ext2/3/4.  eg. On RHEL 5,
+ * mke2fs only supports ext2/3, but mke4fs supports ext2/3/4.
+ *
+ * We specify e4fsprogs in the package list to ensure it is loaded
+ * if it exists.
+ */
+int
+e2prog (char *name)
+{
+  char *p = strstr (name, "e2");
+  if (!p) return 0;
+  p++;
+
+  *p = '4';
+  if (prog_exists (name))
+    return 0;
+
+  *p = '2';
+  if (prog_exists (name))
+    return 0;
+
+  reply_with_error ("cannot find required program %s", name);
+  return -1;
+}
+
 char **
 do_tune2fs_l (const char *device)
 {
@@ -46,7 +73,11 @@ do_tune2fs_l (const char *device)
   char *p, *pend, *colon;
   DECLARE_STRINGSBUF (ret);
 
-  r = command (&out, &err, str_tune2fs, "-l", device, NULL);
+  char prog[] = "tune2fs";
+  if (e2prog (prog) == -1)
+    return NULL;
+
+  r = command (&out, &err, prog, "-l", device, NULL);
   if (r == -1) {
     reply_with_error ("%s", err);
     free (err);
@@ -142,7 +173,11 @@ do_set_e2uuid (const char *device, const char *uuid)
   int r;
   char *err;
 
-  r = command (NULL, &err, str_tune2fs, "-U", uuid, device, NULL);
+  char prog[] = "tune2fs";
+  if (e2prog (prog) == -1)
+    return -1;
+
+  r = command (NULL, &err, prog, "-U", uuid, device, NULL);
   if (r == -1) {
     reply_with_error ("%s", err);
     free (err);
@@ -165,13 +200,17 @@ if_not_mounted_run_e2fsck (const char *device)
 {
   char *err;
   int r, mounted;
+  char prog[] = "e2fsck";
+
+  if (e2prog (prog) == -1)
+    return -1;
 
   mounted = is_device_mounted (device);
   if (mounted == -1)
     return -1;
 
   if (!mounted) {
-    r = command (NULL, &err, str_e2fsck, "-fy", device, NULL);
+    r = command (NULL, &err, prog, "-fy", device, NULL);
     if (r == -1) {
       reply_with_error ("%s", err);
       free (err);
@@ -189,10 +228,14 @@ do_resize2fs (const char *device)
   char *err;
   int r;
 
+  char prog[] = "resize2fs";
+  if (e2prog (prog) == -1)
+    return -1;
+
   if (if_not_mounted_run_e2fsck (device) == -1)
     return -1;
 
-  r = command (NULL, &err, str_resize2fs, device, NULL);
+  r = command (NULL, &err, prog, device, NULL);
   if (r == -1) {
     reply_with_error ("%s", err);
     free (err);
@@ -209,6 +252,10 @@ do_resize2fs_size (const char *device, int64_t size)
   char *err;
   int r;
 
+  char prog[] = "resize2fs";
+  if (e2prog (prog) == -1)
+    return -1;
+
   /* resize2fs itself may impose additional limits.  Since we are
    * going to use the 'K' suffix however we can only work with whole
    * kilobytes.
@@ -226,7 +273,7 @@ do_resize2fs_size (const char *device, int64_t size)
   char buf[32];
   snprintf (buf, sizeof buf, "%" PRIi64 "K", size);
 
-  r = command (NULL, &err, str_resize2fs, device, buf, NULL);
+  r = command (NULL, &err, prog, device, buf, NULL);
   if (r == -1) {
     reply_with_error ("%s", err);
     free (err);
@@ -243,10 +290,14 @@ do_resize2fs_M (const char *device)
   char *err;
   int r;
 
+  char prog[] = "resize2fs";
+  if (e2prog (prog) == -1)
+    return -1;
+
   if (if_not_mounted_run_e2fsck (device) == -1)
     return -1;
 
-  r = command (NULL, &err, str_resize2fs, "-M", device, NULL);
+  r = command (NULL, &err, prog, "-M", device, NULL);
   if (r == -1) {
     reply_with_error ("%s", err);
     free (err);
@@ -267,6 +318,10 @@ do_e2fsck (const char *device,
   char *err;
   size_t i = 0;
   int r;
+  char prog[] = "e2fsck";
+
+  if (e2prog (prog) == -1)
+    return -1;
 
   /* Default if not selected. */
   if (!(optargs_bitmask & GUESTFS_E2FSCK_CORRECT_BITMASK))
@@ -279,7 +334,7 @@ do_e2fsck (const char *device,
     return -1;
   }
 
-  ADD_ARG (argv, i, str_e2fsck);
+  ADD_ARG (argv, i, prog);
   ADD_ARG (argv, i, "-f");
 
   if (correct)
@@ -322,11 +377,15 @@ do_mke2journal (int blocksize, const char *device)
   char *err;
   int r;
 
+  char prog[] = "mke2fs";
+  if (e2prog (prog) == -1)
+    return -1;
+
   char blocksize_s[32];
   snprintf (blocksize_s, sizeof blocksize_s, "%d", blocksize);
 
   r = command (NULL, &err,
-               str_mke2fs, "-F", "-O", "journal_dev", "-b", blocksize_s,
+               prog, "-F", "-O", "journal_dev", "-b", blocksize_s,
                device, NULL);
   if (r == -1) {
     reply_with_error ("%s", err);
@@ -344,6 +403,10 @@ do_mke2journal_L (int blocksize, const char *label, const char *device)
   char *err;
   int r;
 
+  char prog[] = "mke2fs";
+  if (e2prog (prog) == -1)
+    return -1;
+
   if (strlen (label) > EXT2_LABEL_MAX) {
     reply_with_error ("%s: ext2 labels are limited to %d bytes",
                       label, EXT2_LABEL_MAX);
@@ -354,7 +417,7 @@ do_mke2journal_L (int blocksize, const char *label, const char *device)
   snprintf (blocksize_s, sizeof blocksize_s, "%d", blocksize);
 
   r = command (NULL, &err,
-               str_mke2fs, "-F", "-O", "journal_dev", "-b", blocksize_s,
+               prog, "-F", "-O", "journal_dev", "-b", blocksize_s,
                "-L", label,
                device, NULL);
   if (r == -1) {
@@ -373,11 +436,15 @@ do_mke2journal_U (int blocksize, const char *uuid, const char *device)
   char *err;
   int r;
 
+  char prog[] = "mke2fs";
+  if (e2prog (prog) == -1)
+    return -1;
+
   char blocksize_s[32];
   snprintf (blocksize_s, sizeof blocksize_s, "%d", blocksize);
 
   r = command (NULL, &err,
-               str_mke2fs, "-F", "-O", "journal_dev", "-b", blocksize_s,
+               prog, "-F", "-O", "journal_dev", "-b", blocksize_s,
                "-U", uuid,
                device, NULL);
   if (r == -1) {
@@ -397,6 +464,10 @@ do_mke2fs_J (const char *fstype, int blocksize, const char *device,
   char *err;
   int r;
 
+  char prog[] = "mke2fs";
+  if (e2prog (prog) == -1)
+    return -1;
+
   char blocksize_s[32];
   snprintf (blocksize_s, sizeof blocksize_s, "%d", blocksize);
 
@@ -405,7 +476,7 @@ do_mke2fs_J (const char *fstype, int blocksize, const char *device,
   snprintf (jdev, len+32, "device=%s", journal);
 
   r = command (NULL, &err,
-               str_mke2fs, "-F", "-t", fstype, "-J", jdev, "-b", blocksize_s,
+               prog, "-F", "-t", fstype, "-J", jdev, "-b", blocksize_s,
                device, NULL);
   if (r == -1) {
     reply_with_error ("%s", err);
@@ -424,6 +495,10 @@ do_mke2fs_JL (const char *fstype, int blocksize, const char *device,
   char *err;
   int r;
 
+  char prog[] = "mke2fs";
+  if (e2prog (prog) == -1)
+    return -1;
+
   if (strlen (label) > EXT2_LABEL_MAX) {
     reply_with_error ("%s: ext2 labels are limited to %d bytes",
                       label, EXT2_LABEL_MAX);
@@ -438,7 +513,7 @@ do_mke2fs_JL (const char *fstype, int blocksize, const char *device,
   snprintf (jdev, len+32, "device=LABEL=%s", label);
 
   r = command (NULL, &err,
-               str_mke2fs, "-F", "-t", fstype, "-J", jdev, "-b", blocksize_s,
+               prog, "-F", "-t", fstype, "-J", jdev, "-b", blocksize_s,
                device, NULL);
   if (r == -1) {
     reply_with_error ("%s", err);
@@ -457,6 +532,10 @@ do_mke2fs_JU (const char *fstype, int blocksize, const char *device,
   char *err;
   int r;
 
+  char prog[] = "mke2fs";
+  if (e2prog (prog) == -1)
+    return -1;
+
   char blocksize_s[32];
   snprintf (blocksize_s, sizeof blocksize_s, "%d", blocksize);
 
@@ -465,7 +544,7 @@ do_mke2fs_JU (const char *fstype, int blocksize, const char *device,
   snprintf (jdev, len+32, "device=UUID=%s", uuid);
 
   r = command (NULL, &err,
-               str_mke2fs, "-F", "-t", fstype, "-J", jdev, "-b", blocksize_s,
+               prog, "-F", "-t", fstype, "-J", jdev, "-b", blocksize_s,
                device, NULL);
   if (r == -1) {
     reply_with_error ("%s", err);
@@ -495,6 +574,7 @@ do_tune2fs (const char *device, /* only required parameter */
   size_t i = 0;
   int r;
   char *err;
+  char prog[] = "tune2fs";
   char maxmountcount_s[64];
   char mountcount_s[64];
   char group_s[64];
@@ -503,7 +583,10 @@ do_tune2fs (const char *device, /* only required parameter */
   char reservedblockscount_s[64];
   char user_s[64];
 
-  ADD_ARG (argv, i, str_tune2fs);
+  if (e2prog (prog) == -1)
+    return -1;
+
+  ADD_ARG (argv, i, prog);
 
   if (optargs_bitmask & GUESTFS_TUNE2FS_FORCE_BITMASK) {
     if (force)
@@ -611,7 +694,7 @@ do_tune2fs (const char *device, /* only required parameter */
 
   r = commandv (NULL, &err, argv);
   if (r == -1) {
-    reply_with_error ("%s: %s", device, err);
+    reply_with_error ("%s: %s: %s", prog, device, err);
     free (err);
     return -1;
   }
diff --git a/daemon/labels.c b/daemon/labels.c
index ead6b46..347cc07 100644
--- a/daemon/labels.c
+++ b/daemon/labels.c
@@ -36,13 +36,17 @@ e2label (const char *device, const char *label)
   int r;
   char *err;
 
+  char prog[] = "e2label";
+  if (e2prog (prog) == -1)
+    return -1;
+
   if (strlen (label) > EXT2_LABEL_MAX) {
     reply_with_error ("%s: ext2 labels are limited to %d bytes",
                       label, EXT2_LABEL_MAX);
     return -1;
   }
 
-  r = command (NULL, &err, str_e2label, device, label, NULL);
+  r = command (NULL, &err, prog, device, label, NULL);
   if (r == -1) {
     reply_with_error ("%s", err);
     free (err);
diff --git a/daemon/mkfs.c b/daemon/mkfs.c
index 241d346..c8c47b6 100644
--- a/daemon/mkfs.c
+++ b/daemon/mkfs.c
@@ -46,6 +46,7 @@ do_mkfs (const char *fstype, const char *device, int blocksize,
   char sectorsize_str[32];
   int r;
   char *err;
+  char mke2fs[] = "mke2fs";
   int extfs = 0;
 
   if (STREQ (fstype, "ext2") || STREQ (fstype, "ext3") ||
@@ -56,8 +57,11 @@ do_mkfs (const char *fstype, const char *device, int blocksize,
    * the mkfs program "eats" some options, in particular the -F
    * option.
    */
-  if (extfs)
-    ADD_ARG (argv, i, str_mke2fs);
+  if (extfs) {
+    if (e2prog (mke2fs) == -1)
+      return -1;
+    ADD_ARG (argv, i, mke2fs);
+  }
   else
     ADD_ARG (argv, i, str_mkfs);
 
-- 
1.7.4.1