summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthew Booth <mbooth@redhat.com>2011-11-23 14:00:55 +0000
committerRichard W.M. Jones <rjones@redhat.com>2011-11-24 21:06:46 +0000
commitfd0dfead3088da242e1654095cbb6f37383be843 (patch)
tree9b71dfafb1cf26ab3b25b2c4d38fab1c6dcb9d06
parentb04a30131ee8de99f289eb27fe538560197d4de0 (diff)
downloadlibguestfs-fd0dfead3088da242e1654095cbb6f37383be843.tar.gz
libguestfs-fd0dfead3088da242e1654095cbb6f37383be843.tar.xz
libguestfs-fd0dfead3088da242e1654095cbb6f37383be843.zip
NFC: Allow multiple config files in inspect_with_augeas in inspect_fs_unix.c
This change is in support of the addition of MD support to fstab inspection. (cherry picked from commit 373dca7d12a8741e116205b4a3ac67a7d82cc782)
-rw-r--r--src/inspect_fs_unix.c78
1 files changed, 59 insertions, 19 deletions
diff --git a/src/inspect_fs_unix.c b/src/inspect_fs_unix.c
index 51dfa673..3046e026 100644
--- a/src/inspect_fs_unix.c
+++ b/src/inspect_fs_unix.c
@@ -143,7 +143,7 @@ static int check_fstab (guestfs_h *g, struct inspect_fs *fs);
static int add_fstab_entry (guestfs_h *g, struct inspect_fs *fs,
const char *spec, const char *mp);
static char *resolve_fstab_device (guestfs_h *g, const char *spec);
-static int inspect_with_augeas (guestfs_h *g, struct inspect_fs *fs, const char *filename, int (*f) (guestfs_h *, struct inspect_fs *));
+static int inspect_with_augeas (guestfs_h *g, struct inspect_fs *fs, const char **configfiles, int (*f) (guestfs_h *, struct inspect_fs *));
/* Set fs->product_name to the first line of the release file. */
static int
@@ -446,7 +446,8 @@ guestfs___check_linux_root (guestfs_h *g, struct inspect_fs *fs)
* which filesystems are used by the operating system and how they
* are mounted.
*/
- if (inspect_with_augeas (g, fs, "/etc/fstab", check_fstab) == -1)
+ const char *configfiles[] = { "/etc/fstab", NULL };
+ if (inspect_with_augeas (g, fs, configfiles, check_fstab) == -1)
return -1;
/* Determine hostname. */
@@ -479,7 +480,8 @@ guestfs___check_freebsd_root (guestfs_h *g, struct inspect_fs *fs)
check_architecture (g, fs);
/* We already know /etc/fstab exists because it's part of the test above. */
- if (inspect_with_augeas (g, fs, "/etc/fstab", check_fstab) == -1)
+ const char *configfiles[] = { "/etc/fstab", NULL };
+ if (inspect_with_augeas (g, fs, configfiles, check_fstab) == -1)
return -1;
/* Determine hostname. */
@@ -520,7 +522,8 @@ guestfs___check_netbsd_root (guestfs_h *g, struct inspect_fs *fs)
check_architecture (g, fs);
/* We already know /etc/fstab exists because it's part of the test above. */
- if (inspect_with_augeas (g, fs, "/etc/fstab", check_fstab) == -1)
+ const char *configfiles[] = { "/etc/fstab", NULL };
+ if (inspect_with_augeas (g, fs, configfiles, check_fstab) == -1)
return -1;
/* Determine hostname. */
@@ -583,7 +586,8 @@ check_hostname_unix (guestfs_h *g, struct inspect_fs *fs)
return -1;
}
else if (guestfs_is_file (g, "/etc/sysconfig/network")) {
- if (inspect_with_augeas (g, fs, "/etc/sysconfig/network",
+ const char *configfiles[] = { "/etc/sysconfig/network", NULL };
+ if (inspect_with_augeas (g, fs, configfiles,
check_hostname_redhat) == -1)
return -1;
}
@@ -941,18 +945,23 @@ resolve_fstab_device (guestfs_h *g, const char *spec)
* Augeas is closed.
*/
static int
-inspect_with_augeas (guestfs_h *g, struct inspect_fs *fs, const char *filename,
+inspect_with_augeas (guestfs_h *g, struct inspect_fs *fs,
+ const char **configfiles,
int (*f) (guestfs_h *, struct inspect_fs *))
{
- /* Security: Refuse to do this if filename is too large. */
- int64_t size = guestfs_filesize (g, filename);
- if (size == -1)
- /* guestfs_filesize failed and has already set error in handle */
- return -1;
- if (size > MAX_AUGEAS_FILE_SIZE) {
- error (g, _("size of %s is unreasonably large (%" PRIi64 " bytes)"),
- filename, size);
- return -1;
+ /* Security: Refuse to do this if a config file is too large. */
+ for (const char **i = configfiles; *i != NULL; i++) {
+ if (guestfs_exists(g, *i) == 0) continue;
+
+ int64_t size = guestfs_filesize (g, *i);
+ if (size == -1)
+ /* guestfs_filesize failed and has already set error in handle */
+ return -1;
+ if (size > MAX_AUGEAS_FILE_SIZE) {
+ error (g, _("size of %s is unreasonably large (%" PRIi64 " bytes)"),
+ *i, size);
+ return -1;
+ }
}
/* If !feature_available (g, "augeas") then the next call will fail.
@@ -965,11 +974,42 @@ inspect_with_augeas (guestfs_h *g, struct inspect_fs *fs, const char *filename,
int r = -1;
/* Tell Augeas to only load one file (thanks Raphaƫl Pinson). */
- char buf[strlen (filename) + 64];
- snprintf (buf, strlen (filename) + 64, "/augeas/load//incl[. != \"%s\"]",
- filename);
- if (guestfs_aug_rm (g, buf) == -1)
+#define AUGEAS_LOAD "/augeas/load//incl[. != \""
+#define AUGEAS_LOAD_LEN (strlen(AUGEAS_LOAD))
+ size_t conflen = strlen(configfiles[0]);
+ size_t buflen = AUGEAS_LOAD_LEN + conflen + 1 /* Closing " */;
+ char *buf = safe_malloc(g, buflen + 2 /* Closing ] + null terminator */);
+
+ memcpy(buf, AUGEAS_LOAD, AUGEAS_LOAD_LEN);
+ memcpy(buf + AUGEAS_LOAD_LEN, configfiles[0], conflen);
+ buf[buflen - 1] = '"';
+#undef AUGEAS_LOAD_LEN
+#undef AUGEAS_LOAD
+
+#define EXCL " and . != \""
+#define EXCL_LEN (strlen(EXCL))
+ for (const char **i = &configfiles[1]; *i != NULL; i++) {
+ size_t orig_buflen = buflen;
+ conflen = strlen(*i);
+ buflen += EXCL_LEN + conflen + 1 /* Closing " */;
+ buf = safe_realloc(g, buf, buflen + 2 /* Closing ] + null terminator */);
+ char *s = buf + orig_buflen;
+
+ memcpy(s, EXCL, EXCL_LEN);
+ memcpy(s + EXCL_LEN, *i, conflen);
+ buf[buflen - 1] = '"';
+ }
+#undef EXCL_LEN
+#undef EXCL
+
+ buf[buflen] = ']';
+ buf[buflen + 1] = '\0';
+
+ if (guestfs_aug_rm (g, buf) == -1) {
+ free(buf);
goto out;
+ }
+ free(buf);
if (guestfs_aug_load (g) == -1)
goto out;