summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorColin Walters <walters@verbum.org>2015-03-04 21:33:25 -0500
committerColin Walters <walters@verbum.org>2015-03-09 14:29:14 -0400
commit68ce55420211698d14065c20891a517102db3016 (patch)
tree0e2745b7bd2dc3d156b6e49b6726341deb64dabf
parenta5ffaca9d7d3fdb815e2f8e19032d0868c64c708 (diff)
downloadostree-68ce55420211698d14065c20891a517102db3016.tar.gz
sysroot: Read the bootloader configuration with fd-relative API
Another piece of the conversion.
-rw-r--r--src/libostree/ostree-bootconfig-parser.c31
-rw-r--r--src/libostree/ostree-bootconfig-parser.h6
-rw-r--r--src/libostree/ostree-sysroot.c55
3 files changed, 61 insertions, 31 deletions
diff --git a/src/libostree/ostree-bootconfig-parser.c b/src/libostree/ostree-bootconfig-parser.c
index ae817989..5cad20fa 100644
--- a/src/libostree/ostree-bootconfig-parser.c
+++ b/src/libostree/ostree-bootconfig-parser.c
@@ -62,11 +62,22 @@ ostree_bootconfig_parser_clone (OstreeBootconfigParser *self)
return parser;
}
+/**
+ * ostree_bootconfig_parser_parse_at:
+ * @self: Parser
+ * @dfd: Directory fd
+ * @path: File path
+ * @cancellable: Cancellable
+ * @error: Error
+ *
+ * Initialize a bootconfig from the given file.
+ */
gboolean
-ostree_bootconfig_parser_parse (OstreeBootconfigParser *self,
- GFile *path,
- GCancellable *cancellable,
- GError **error)
+ostree_bootconfig_parser_parse_at (OstreeBootconfigParser *self,
+ int dfd,
+ const char *path,
+ GCancellable *cancellable,
+ GError **error)
{
gboolean ret = FALSE;
gs_free char *contents = NULL;
@@ -75,7 +86,7 @@ ostree_bootconfig_parser_parse (OstreeBootconfigParser *self,
g_return_val_if_fail (!self->parsed, FALSE);
- contents = gs_file_load_contents_utf8 (path, cancellable, error);
+ contents = glnx_file_get_contents_utf8_at (dfd, path, NULL, cancellable, error);
if (!contents)
goto out;
@@ -111,6 +122,16 @@ ostree_bootconfig_parser_parse (OstreeBootconfigParser *self,
return ret;
}
+gboolean
+ostree_bootconfig_parser_parse (OstreeBootconfigParser *self,
+ GFile *path,
+ GCancellable *cancellable,
+ GError **error)
+{
+ return ostree_bootconfig_parser_parse_at (self, AT_FDCWD, gs_file_get_path_cached (path),
+ cancellable, error);
+}
+
void
ostree_bootconfig_parser_set (OstreeBootconfigParser *self,
const char *key,
diff --git a/src/libostree/ostree-bootconfig-parser.h b/src/libostree/ostree-bootconfig-parser.h
index 7d1cffbb..7ff22350 100644
--- a/src/libostree/ostree-bootconfig-parser.h
+++ b/src/libostree/ostree-bootconfig-parser.h
@@ -41,6 +41,12 @@ gboolean ostree_bootconfig_parser_parse (OstreeBootconfigParser *self,
GCancellable *cancellable,
GError **error);
+gboolean ostree_bootconfig_parser_parse_at (OstreeBootconfigParser *self,
+ int dfd,
+ const char *path,
+ GCancellable *cancellable,
+ GError **error);
+
gboolean ostree_bootconfig_parser_write (OstreeBootconfigParser *self,
GFile *output,
GCancellable *cancellable,
diff --git a/src/libostree/ostree-sysroot.c b/src/libostree/ostree-sysroot.c
index 0fd7b544..d65a80eb 100644
--- a/src/libostree/ostree-sysroot.c
+++ b/src/libostree/ostree-sysroot.c
@@ -360,54 +360,57 @@ _ostree_sysroot_read_boot_loader_configs (OstreeSysroot *self,
GError **error)
{
gboolean ret = FALSE;
- gs_unref_object GFileEnumerator *dir_enum = NULL;
- gs_unref_object GFile *loader_entries_dir = NULL;
+ int fd; /* Temporary owned by iterator */
+ g_autofree char *entries_path = g_strdup_printf ("boot/loader.%d/entries", bootversion);
gs_unref_ptrarray GPtrArray *ret_loader_configs = NULL;
- GError *temp_error = NULL;
+ g_auto(GLnxDirFdIterator) dfd_iter = { 0, };
+
+ if (!ensure_sysroot_fd (self, error))
+ goto out;
- loader_entries_dir = ot_gfile_resolve_path_printf (self->path, "boot/loader.%d/entries",
- bootversion);
ret_loader_configs = g_ptr_array_new_with_free_func ((GDestroyNotify)g_object_unref);
- dir_enum = g_file_enumerate_children (loader_entries_dir, OSTREE_GIO_FAST_QUERYINFO,
- 0, NULL, &temp_error);
- if (!dir_enum)
+ fd = glnx_opendirat_with_errno (self->sysroot_fd, entries_path, TRUE);
+ if (fd == -1)
{
- if (g_error_matches (temp_error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND))
- {
- g_clear_error (&temp_error);
- goto done;
- }
+ if (errno == ENOENT)
+ goto done;
else
{
- g_propagate_error (error, temp_error);
+ glnx_set_error_from_errno (error);
goto out;
}
}
+ if (!glnx_dirfd_iterator_init_take_fd (fd, &dfd_iter, error))
+ goto out;
+
while (TRUE)
{
- GFileInfo *file_info;
- GFile *child;
- const char *name;
+ struct dirent *dent;
+ struct stat stbuf;
- if (!gs_file_enumerator_iterate (dir_enum, &file_info, &child,
- cancellable, error))
+ if (!glnx_dirfd_iterator_next_dent (&dfd_iter, &dent, cancellable, error))
goto out;
- if (file_info == NULL)
+
+ if (dent == NULL)
break;
- name = g_file_info_get_name (file_info);
+ if (fstatat (dfd_iter.fd, dent->d_name, &stbuf, 0) != 0)
+ {
+ glnx_set_error_from_errno (error);
+ goto out;
+ }
- if (g_str_has_prefix (name, "ostree-") &&
- g_str_has_suffix (name, ".conf") &&
- g_file_info_get_file_type (file_info) == G_FILE_TYPE_REGULAR)
+ if (g_str_has_prefix (dent->d_name, "ostree-") &&
+ g_str_has_suffix (dent->d_name, ".conf") &&
+ S_ISREG (stbuf.st_mode))
{
gs_unref_object OstreeBootconfigParser *config = ostree_bootconfig_parser_new ();
- if (!ostree_bootconfig_parser_parse (config, child, cancellable, error))
+ if (!ostree_bootconfig_parser_parse_at (config, dfd_iter.fd, dent->d_name, cancellable, error))
{
- g_prefix_error (error, "Parsing %s: ", gs_file_get_path_cached (child));
+ g_prefix_error (error, "Parsing %s: ", dent->d_name);
goto out;
}