From 931e7f8f2bd62c12420f5603271aa260e1da94c5 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 29/38] EPEL 5: Revert "daemon: Remove e2prog hack (only needed for RHEL 5)."
This reverts commit 163e030ee13644ad9efe1e078aff47b879657333.
---
daemon/daemon.h | 2 +
daemon/ext2.c | 117 +++++++++++++++++++++++++++++++++++++++++++++++-------
daemon/labels.c | 6 ++-
daemon/mkfs.c | 8 +++-
4 files changed, 114 insertions(+), 19 deletions(-)
diff --git a/daemon/daemon.h b/daemon/daemon.h
index a7371ea..ec0fa3d 100644
--- a/daemon/daemon.h
+++ b/daemon/daemon.h
@@ -185,6 +185,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 e4548d6..72694f4 100644
--- a/daemon/ext2.c
+++ b/daemon/ext2.c
@@ -38,6 +38,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 +72,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);
return NULL;
@@ -131,7 +161,11 @@ do_set_e2uuid (const char *device, const char *uuid)
int r;
CLEANUP_FREE char *err = NULL;
- 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);
return -1;
@@ -152,6 +186,10 @@ if_not_mounted_run_e2fsck (const char *device)
{
CLEANUP_FREE char *err = NULL;
int r, mounted;
+ char prog[] = "e2fsck";
+
+ if (e2prog (prog) == -1)
+ return -1;
mounted = is_device_mounted (device);
if (mounted == -1)
@@ -160,7 +198,7 @@ if_not_mounted_run_e2fsck (const char *device)
if (!mounted) {
r = commandf (NULL, &err,
COMMAND_FLAG_FOLD_STDOUT_ON_STDERR,
- str_e2fsck, "-fy", device, NULL);
+ prog, "-fy", device, NULL);
if (r == -1) {
reply_with_error ("%s", err);
return -1;
@@ -176,10 +214,14 @@ do_resize2fs (const char *device)
CLEANUP_FREE char *err = NULL;
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);
return -1;
@@ -194,6 +236,10 @@ do_resize2fs_size (const char *device, int64_t size)
CLEANUP_FREE char *err = NULL;
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.
@@ -211,7 +257,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);
return -1;
@@ -226,10 +272,14 @@ do_resize2fs_M (const char *device)
CLEANUP_FREE char *err = NULL;
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);
return -1;
@@ -248,6 +298,10 @@ do_e2fsck (const char *device,
CLEANUP_FREE char *err = NULL;
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))
@@ -260,7 +314,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)
@@ -303,13 +357,17 @@ do_mke2journal (int blocksize, const char *device)
CLEANUP_FREE char *err = NULL;
int r;
+ char prog[] = "mke2fs";
+ if (e2prog (prog) == -1)
+ return -1;
+
char blocksize_s[32];
snprintf (blocksize_s, sizeof blocksize_s, "%d", blocksize);
wipe_device_before_mkfs (device);
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);
@@ -325,6 +383,10 @@ do_mke2journal_L (int blocksize, const char *label, const char *device)
CLEANUP_FREE char *err = NULL;
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);
@@ -337,7 +399,7 @@ do_mke2journal_L (int blocksize, const char *label, const char *device)
wipe_device_before_mkfs (device);
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) {
@@ -354,13 +416,17 @@ do_mke2journal_U (int blocksize, const char *uuid, const char *device)
CLEANUP_FREE char *err = NULL;
int r;
+ char prog[] = "mke2fs";
+ if (e2prog (prog) == -1)
+ return -1;
+
char blocksize_s[32];
snprintf (blocksize_s, sizeof blocksize_s, "%d", blocksize);
wipe_device_before_mkfs (device);
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) {
@@ -378,6 +444,10 @@ do_mke2fs_J (const char *fstype, int blocksize, const char *device,
CLEANUP_FREE char *err = NULL;
int r;
+ char prog[] = "mke2fs";
+ if (e2prog (prog) == -1)
+ return -1;
+
char blocksize_s[32];
snprintf (blocksize_s, sizeof blocksize_s, "%d", blocksize);
@@ -388,7 +458,7 @@ do_mke2fs_J (const char *fstype, int blocksize, const char *device,
wipe_device_before_mkfs (device);
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);
@@ -405,6 +475,10 @@ do_mke2fs_JL (const char *fstype, int blocksize, const char *device,
CLEANUP_FREE char *err = NULL;
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);
@@ -421,7 +495,7 @@ do_mke2fs_JL (const char *fstype, int blocksize, const char *device,
wipe_device_before_mkfs (device);
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);
@@ -438,6 +512,10 @@ do_mke2fs_JU (const char *fstype, int blocksize, const char *device,
CLEANUP_FREE char *err = NULL;
int r;
+ char prog[] = "mke2fs";
+ if (e2prog (prog) == -1)
+ return -1;
+
char blocksize_s[32];
snprintf (blocksize_s, sizeof blocksize_s, "%d", blocksize);
@@ -448,7 +526,7 @@ do_mke2fs_JU (const char *fstype, int blocksize, const char *device,
wipe_device_before_mkfs (device);
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);
@@ -476,6 +554,7 @@ do_tune2fs (const char *device, /* only required parameter */
size_t i = 0;
int r;
CLEANUP_FREE char *err = NULL;
+ char prog[] = "tune2fs";
char maxmountcount_s[64];
char mountcount_s[64];
char group_s[64];
@@ -484,7 +563,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)
@@ -592,7 +674,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);
return -1;
}
@@ -836,7 +918,10 @@ do_mke2fs (const char *device, /* 0 */
char maxonlineresize_s[74];
size_t i = 0;
- ADD_ARG (argv, i, str_mke2fs);
+ char prog[] = "mke2fs";
+ if (e2prog (prog) == -1)
+ return -1;
+ ADD_ARG (argv, i, prog);
if (optargs_bitmask & GUESTFS_MKE2FS_BLOCKSIZE_BITMASK) {
if (blocksize < 0) {
diff --git a/daemon/labels.c b/daemon/labels.c
index 2fda354..9f08a07 100644
--- a/daemon/labels.c
+++ b/daemon/labels.c
@@ -36,13 +36,17 @@ e2label (const char *device, const char *label)
int r;
CLEANUP_FREE char *err = NULL;
+ 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);
return -1;
diff --git a/daemon/mkfs.c b/daemon/mkfs.c
index ff0f2fc..88dea8b 100644
--- a/daemon/mkfs.c
+++ b/daemon/mkfs.c
@@ -45,6 +45,7 @@ do_mkfs (const char *fstype, const char *device, int blocksize,
char sectorsize_str[32];
int r;
CLEANUP_FREE char *err = NULL;
+ char mke2fs[] = "mke2fs";
int extfs = 0;
if (STREQ (fstype, "ext2") || STREQ (fstype, "ext3") ||
@@ -55,8 +56,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