bwrap: Split out a "base" constructor

The bwrap code has some "opinionated" setup around e.g. /etc and
such that I'd like to centralize even more.  However, the dracut
case of taking the host's `/etc` is the unusual standout.  Let's
split out a base constructor.

Prep for https://github.com/projectatomic/rpm-ostree/issues/1329

Closes: #1333
Approved by: jlebon
This commit is contained in:
Colin Walters 2018-04-10 11:42:46 -04:00 committed by Atomic Bot
parent 4be214a978
commit e38c64c330
3 changed files with 40 additions and 19 deletions

View File

@ -201,12 +201,8 @@ running_in_nspawn (void)
} }
RpmOstreeBwrap * RpmOstreeBwrap *
rpmostree_bwrap_new (int rootfs_fd, rpmostree_bwrap_new_base (int rootfs_fd, GError **error)
RpmOstreeBwrapMutability mutable,
GError **error,
...)
{ {
va_list args;
g_autoptr(RpmOstreeBwrap) ret = g_new0 (RpmOstreeBwrap, 1); g_autoptr(RpmOstreeBwrap) ret = g_new0 (RpmOstreeBwrap, 1);
static const char *usr_links[] = {"lib", "lib32", "lib64", "bin", "sbin"}; static const char *usr_links[] = {"lib", "lib32", "lib64", "bin", "sbin"};
@ -301,6 +297,20 @@ rpmostree_bwrap_new (int rootfs_fd,
rpmostree_bwrap_append_bwrap_argv (ret, "--symlink", srcpath, destpath, NULL); rpmostree_bwrap_append_bwrap_argv (ret, "--symlink", srcpath, destpath, NULL);
} }
return g_steal_pointer (&ret);
}
RpmOstreeBwrap *
rpmostree_bwrap_new (int rootfs_fd,
RpmOstreeBwrapMutability mutable,
GError **error,
...)
{
g_autoptr(RpmOstreeBwrap) ret = rpmostree_bwrap_new_base (rootfs_fd, error);
if (!ret)
return FALSE;
va_list args;
switch (mutable) switch (mutable)
{ {
case RPMOSTREE_BWRAP_IMMUTABLE: case RPMOSTREE_BWRAP_IMMUTABLE:
@ -315,12 +325,11 @@ rpmostree_bwrap_new (int rootfs_fd,
break; break;
} }
{ const char *arg; const char *arg;
va_start (args, error); va_start (args, error);
while ((arg = va_arg (args, char *))) while ((arg = va_arg (args, char *)))
g_ptr_array_add (ret->argv, g_strdup (arg)); g_ptr_array_add (ret->argv, g_strdup (arg));
va_end (args); va_end (args);
}
return g_steal_pointer (&ret); return g_steal_pointer (&ret);
} }

View File

@ -38,6 +38,8 @@ G_DEFINE_AUTOPTR_CLEANUP_FUNC(RpmOstreeBwrap, rpmostree_bwrap_unref)
/* TODO - move this utility elsewhere */ /* TODO - move this utility elsewhere */
void rpmostree_ptrarray_append_strdup (GPtrArray *argv_array, ...) G_GNUC_NULL_TERMINATED; void rpmostree_ptrarray_append_strdup (GPtrArray *argv_array, ...) G_GNUC_NULL_TERMINATED;
RpmOstreeBwrap *rpmostree_bwrap_new_base (int rootfs, GError **error);
RpmOstreeBwrap *rpmostree_bwrap_new (int rootfs, RpmOstreeBwrap *rpmostree_bwrap_new (int rootfs,
RpmOstreeBwrapMutability mutable, RpmOstreeBwrapMutability mutable,
GError **error, GError **error,

View File

@ -437,15 +437,25 @@ rpmostree_run_dracut (int rootfs_dfd,
* config files. Otherwise, we use the usr/etc defaults. * config files. Otherwise, we use the usr/etc defaults.
*/ */
if (rebuild_from_initramfs) if (rebuild_from_initramfs)
bwrap = rpmostree_bwrap_new (rootfs_dfd, RPMOSTREE_BWRAP_IMMUTABLE, error, {
"--ro-bind", "/etc", "/etc", bwrap = rpmostree_bwrap_new_base (rootfs_dfd, error);
NULL);
else
bwrap = rpmostree_bwrap_new (rootfs_dfd, RPMOSTREE_BWRAP_IMMUTABLE, error,
"--ro-bind", "usr/etc", "/etc",
NULL);
if (!bwrap) if (!bwrap)
return FALSE; return FALSE;
rpmostree_bwrap_append_bwrap_argv (bwrap,
"--ro-bind", "/etc", "/etc",
"--ro-bind", "usr", "/usr",
NULL);
}
else
{
bwrap = rpmostree_bwrap_new_base (rootfs_dfd, error);
if (!bwrap)
return FALSE;
rpmostree_bwrap_append_bwrap_argv (bwrap,
"--ro-bind", "usr/etc", "/etc",
"--ro-bind", "usr", "/usr",
NULL);
}
if (dracut_host_tmpdir) if (dracut_host_tmpdir)
rpmostree_bwrap_append_bwrap_argv (bwrap, "--bind", dracut_host_tmpdir->path, "/tmp/dracut", NULL); rpmostree_bwrap_append_bwrap_argv (bwrap, "--bind", dracut_host_tmpdir->path, "/tmp/dracut", NULL);