diff options
author | Colin Walters <walters@verbum.org> | 2015-03-04 21:33:25 -0500 |
---|---|---|
committer | Colin Walters <walters@verbum.org> | 2015-03-09 14:29:14 -0400 |
commit | 68ce55420211698d14065c20891a517102db3016 (patch) | |
tree | 0e2745b7bd2dc3d156b6e49b6726341deb64dabf | |
parent | a5ffaca9d7d3fdb815e2f8e19032d0868c64c708 (diff) | |
download | ostree-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.c | 31 | ||||
-rw-r--r-- | src/libostree/ostree-bootconfig-parser.h | 6 | ||||
-rw-r--r-- | src/libostree/ostree-sysroot.c | 55 |
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; } |