postprocess: Port a bit more to new style

Was looking at this file to change how we do kernels, and noticed these two were
straightforward ports.

Closes: #909
Approved by: jlebon
This commit is contained in:
Colin Walters 2017-08-05 15:36:08 -04:00 committed by Atomic Bot
parent 787c880b64
commit 39e36db741

View File

@ -964,16 +964,14 @@ rename_if_exists (int dfd,
const char *to,
GError **error)
{
gboolean ret = FALSE;
struct stat stbuf;
const char *errmsg = glnx_strjoina ("renaming ", from);
GLNX_AUTO_PREFIX_ERROR (errmsg, error);
if (fstatat (dfd, from, &stbuf, 0) < 0)
{
if (errno != ENOENT)
{
glnx_set_error_from_errno (error);
goto out;
}
return glnx_throw_errno_prefix (error, "fstatat(%s)", from);
}
else
{
@ -983,23 +981,14 @@ rename_if_exists (int dfd,
if (errno == EEXIST)
{
if (unlinkat (dfd, from, AT_REMOVEDIR) < 0)
{
glnx_set_error_from_errno (error);
goto out;
}
return glnx_throw_errno_prefix (error, "rmdirat(%s)", from);
}
else
{
glnx_set_error_from_errno (error);
goto out;
}
return glnx_throw_errno_prefix (error, "renameat(%s)", to);
}
}
ret = TRUE;
out:
g_prefix_error (error, "Renaming %s -> %s: ", from, to);
return ret;
return TRUE;
}
gboolean
@ -1247,16 +1236,11 @@ rpmostree_treefile_postprocessing (int rootfs_fd,
GCancellable *cancellable,
GError **error)
{
gboolean ret = FALSE;
guint i, len;
JsonArray *units = NULL;
JsonArray *remove = NULL;
const char *default_target = NULL;
const char *postprocess_script = NULL;
if (json_object_has_member (treefile, "units"))
units = json_object_get_array_member (treefile, "units");
guint len;
if (units)
len = json_array_get_length (units);
else
@ -1267,76 +1251,67 @@ rpmostree_treefile_postprocessing (int rootfs_fd,
if (!glnx_shutil_mkdir_p_at (rootfs_fd, "etc/systemd/system/multi-user.target.wants", 0755,
cancellable, error))
goto out;
return FALSE;
if (!glnx_opendirat (rootfs_fd, "etc/systemd/system/multi-user.target.wants", TRUE,
&multiuser_wants_dfd, error))
goto out;
return FALSE;
for (i = 0; i < len; i++)
for (guint i = 0; i < len; i++)
{
const char *unitname = _rpmostree_jsonutil_array_require_string_element (units, i, error);
g_autofree char *symlink_target = NULL;
struct stat stbuf;
if (!unitname)
goto out;
return FALSE;
symlink_target = g_strconcat ("/usr/lib/systemd/system/", unitname, NULL);
if (fstatat (multiuser_wants_dfd, unitname, &stbuf, AT_SYMLINK_NOFOLLOW) < 0)
{
if (errno != ENOENT)
{
glnx_set_error_from_errno (error);
goto out;
}
return glnx_throw_errno_prefix (error, "fstatat(%s)", unitname);
}
else
continue;
g_print ("Adding %s to multi-user.target.wants\n", unitname);
if (symlinkat (symlink_target, multiuser_wants_dfd, unitname) < 0)
{
glnx_set_error_from_errno (error);
goto out;
}
return glnx_throw_errno_prefix (error, "symlinkat(%s)", unitname);
}
}
{
const guint8 *buf;
gsize len;
if (!glnx_shutil_mkdir_p_at (rootfs_fd, "usr/share/rpm-ostree", 0755, cancellable, error))
return FALSE;
if (!glnx_shutil_mkdir_p_at (rootfs_fd, "usr/share/rpm-ostree", 0755, cancellable, error))
goto out;
{ gsize len;
const guint8 *buf = g_bytes_get_data (serialized_treefile, &len);
buf = g_bytes_get_data (serialized_treefile, &len);
if (!glnx_file_replace_contents_at (rootfs_fd, "usr/share/rpm-ostree/treefile.json",
buf, len, GLNX_FILE_REPLACE_NODATASYNC,
cancellable, error))
goto out;
return FALSE;
}
const char *default_target = NULL;
if (!_rpmostree_jsonutil_object_get_optional_string_member (treefile, "default_target",
&default_target, error))
goto out;
return FALSE;
if (default_target != NULL)
{
g_autofree char *dest_default_target_path =
g_strconcat ("/usr/lib/systemd/system/", default_target, NULL);
(void) unlinkat (rootfs_fd, "etc/systemd/system/default.target", 0);
if (symlinkat (dest_default_target_path, rootfs_fd, "etc/systemd/system/default.target") < 0)
{
glnx_set_error_from_errno (error);
goto out;
}
static const char default_target_path[] = "etc/systemd/system/default.target";
(void) unlinkat (rootfs_fd, default_target_path, 0);
if (symlinkat (dest_default_target_path, rootfs_fd, default_target_path) < 0)
return glnx_throw_errno_prefix (error, "symlinkat(%s)", default_target_path);
}
JsonArray *remove = NULL;
if (json_object_has_member (treefile, "remove-files"))
{
remove = json_object_get_array_member (treefile, "remove-files");
@ -1344,25 +1319,21 @@ rpmostree_treefile_postprocessing (int rootfs_fd,
}
else
len = 0;
for (i = 0; i < len; i++)
for (guint i = 0; i < len; i++)
{
const char *val = _rpmostree_jsonutil_array_require_string_element (remove, i, error);
if (!val)
return FALSE;
if (g_path_is_absolute (val))
{
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
"'remove' elements must be relative");
goto out;
}
g_assert (val[0] != '/');
return glnx_throw (error, "'remove' elements must be relative");
g_assert_cmpint (val[0], !=, '/');
g_assert (strstr (val, "..") == NULL);
g_print ("Deleting: %s\n", val);
if (!glnx_shutil_rm_rf_at (rootfs_fd, val, cancellable, error))
goto out;
return FALSE;
}
/* This works around a potential issue with libsolv if we go down the
@ -1377,33 +1348,26 @@ rpmostree_treefile_postprocessing (int rootfs_fd,
* compatibility reasons using tmpfiles.
* */
if (!glnx_shutil_rm_rf_at (rootfs_fd, "var/lib/rpm", cancellable, error))
goto out;
return FALSE;
if (symlinkat ("../../usr/share/rpm", rootfs_fd, "var/lib/rpm") < 0)
{
glnx_set_error_from_errno (error);
goto out;
}
return glnx_throw_errno_prefix (error, "symlinkat(%s)", "var/lib/rpm");
if (json_object_has_member (treefile, "remove-from-packages"))
{
g_autoptr(RpmOstreeRefSack) refsack = NULL;
guint i;
remove = json_object_get_array_member (treefile, "remove-from-packages");
len = json_array_get_length (remove);
if (!rpmostree_get_pkglist_for_root (rootfs_fd, ".", &refsack, NULL,
cancellable, error))
{
g_prefix_error (error, "Reading package set: ");
goto out;
}
return glnx_prefix_error (error, "Reading package set");
for (i = 0; i < len; i++)
for (guint i = 0; i < len; i++)
{
JsonArray *elt = json_array_get_array_element (remove, i);
if (!handle_remove_files_from_package (rootfs_fd, refsack, elt, cancellable, error))
goto out;
return FALSE;
}
}
@ -1414,7 +1378,7 @@ rpmostree_treefile_postprocessing (int rootfs_fd,
"mutate-os-release",
&base_version,
error))
goto out;
return FALSE;
if (base_version != NULL && next_version == NULL)
{
@ -1422,10 +1386,6 @@ rpmostree_treefile_postprocessing (int rootfs_fd,
}
else if (base_version != NULL)
{
g_autofree char *contents = NULL;
g_autofree char *new_contents = NULL;
const char *path = NULL;
/* let's try to find the first non-symlink */
const char *os_release[] = {
"etc/os-release",
@ -1434,19 +1394,15 @@ rpmostree_treefile_postprocessing (int rootfs_fd,
};
/* fallback on just overwriting etc/os-release */
path = os_release[0];
const char *path = os_release[0];
for (guint i = 0; i < G_N_ELEMENTS (os_release); i++)
{
struct stat stbuf;
if (TEMP_FAILURE_RETRY (fstatat (rootfs_fd, os_release[i], &stbuf,
AT_SYMLINK_NOFOLLOW)) != 0)
{
glnx_set_prefix_error_from_errno (error, "fstatat(%s)",
os_release[i]);
goto out;
}
if (!glnx_fstatat (rootfs_fd, os_release[i], &stbuf,
AT_SYMLINK_NOFOLLOW, error))
return FALSE;
if (S_ISREG (stbuf.st_mode))
{
@ -1457,26 +1413,27 @@ rpmostree_treefile_postprocessing (int rootfs_fd,
g_print ("Mutating /%s\n", path);
contents = glnx_file_get_contents_utf8_at (rootfs_fd, path, NULL,
cancellable, error);
g_autofree char *contents = glnx_file_get_contents_utf8_at (rootfs_fd, path, NULL,
cancellable, error);
if (contents == NULL)
goto out;
return FALSE;
new_contents = mutate_os_release (contents, base_version,
next_version, error);
g_autofree char *new_contents = mutate_os_release (contents, base_version,
next_version, error);
if (new_contents == NULL)
goto out;
return FALSE;
if (!glnx_file_replace_contents_at (rootfs_fd, path,
(guint8*)new_contents, -1, 0,
cancellable, error))
goto out;
return FALSE;
}
}
const char *postprocess_script = NULL;
if (!_rpmostree_jsonutil_object_get_optional_string_member (treefile, "postprocess-script",
&postprocess_script, error))
goto out;
return FALSE;
if (postprocess_script)
{
@ -1495,25 +1452,20 @@ rpmostree_treefile_postprocessing (int rootfs_fd,
/* Note we need to make binpath *not* absolute here */
if (!glnx_file_copy_at (AT_FDCWD, src, NULL, rootfs_fd, binpath + 1,
GLNX_FILE_COPY_NOXATTRS, cancellable, error))
goto out;
return FALSE;
g_print ("Executing postprocessing script '%s'\n", bn);
{
char *child_argv[] = { binpath, NULL };
if (!run_bwrap_mutably (rootfs_fd, binpath, child_argv, error))
{
g_prefix_error (error, "While executing postprocessing script '%s': ", bn);
goto out;
}
return glnx_prefix_error (error, "While executing postprocessing script '%s'", bn);
}
g_print ("Finished postprocessing script '%s'\n", bn);
}
ret = TRUE;
out:
return ret;
return TRUE;
}
/**