commit:     2b91248cfb513dce06368c4485c55fd6746ee642
Author:     Fabian Groffen <grobian <AT> gentoo <DOT> org>
AuthorDate: Sun Dec 29 13:25:21 2019 +0000
Commit:     Fabian Groffen <grobian <AT> gentoo <DOT> org>
CommitDate: Sun Dec 29 13:25:21 2019 +0000
URL:        https://gitweb.gentoo.org/proj/portage-utils.git/commit/?id=2b91248c

libq/tree: remove tree_pkg_vdb_openat as public function

convert the only consumer of tree_pkg_vdb_openat to
tree_pkg_vdb_fopenat, such that we can transparently provide this
functionality for  binpkgs (via xpak).

Signed-off-by: Fabian Groffen <grobian <AT> gentoo.org>

 libq/tree.c |  2 +-
 libq/tree.h |  1 -
 qcheck.c    | 30 +++++++++++++-----------------
 3 files changed, 14 insertions(+), 19 deletions(-)

diff --git a/libq/tree.c b/libq/tree.c
index cc8cf3e..f0c8ddb 100644
--- a/libq/tree.c
+++ b/libq/tree.c
@@ -474,7 +474,7 @@ tree_next_pkg(tree_cat_ctx *cat_ctx)
        return ret;
 }
 
-int
+static int
 tree_pkg_vdb_openat(
                tree_pkg_ctx *pkg_ctx,
                const char *file,

diff --git a/libq/tree.h b/libq/tree.h
index d769b7b..aacfb14 100644
--- a/libq/tree.h
+++ b/libq/tree.h
@@ -123,7 +123,6 @@ void tree_close_cat(tree_cat_ctx *cat_ctx);
 int tree_filter_pkg(const struct dirent *de);
 tree_pkg_ctx *tree_open_pkg(tree_cat_ctx *cat_ctx, const char *name);
 tree_pkg_ctx *tree_next_pkg(tree_cat_ctx *cat_ctx);
-int tree_pkg_vdb_openat(tree_pkg_ctx *pkg_ctx, const char *file, int flags, 
mode_t mode);
 FILE *tree_pkg_vdb_fopenat(tree_pkg_ctx *pkg_ctx, const char *file,
        int flags, mode_t mode, const char *fmode);
 #define tree_pkg_vdb_fopenat_ro(pkg_ctx, file) \

diff --git a/qcheck.c b/qcheck.c
index f77a501..ab4356b 100644
--- a/qcheck.c
+++ b/qcheck.c
@@ -72,7 +72,6 @@ struct qcheck_opt_state {
 static int
 qcheck_process_contents(tree_pkg_ctx *pkg_ctx, struct qcheck_opt_state *state)
 {
-       int fd_contents;
        FILE *fp_contents, *fp_contents_update;
        size_t num_files, num_files_ok, num_files_unknown, num_files_ignored;
        char *buffer, *line;
@@ -85,18 +84,9 @@ qcheck_process_contents(tree_pkg_ctx *pkg_ctx, struct 
qcheck_opt_state *state)
        fp_contents_update = NULL;
 
        /* Open contents */
-       fd_contents = tree_pkg_vdb_openat(pkg_ctx, "CONTENTS",
-                       O_RDONLY | O_CLOEXEC, 0);
-       if (fd_contents == -1)
+       fp_contents = tree_pkg_vdb_fopenat_ro(pkg_ctx, "CONTENTS");
+       if ((fp_contents = tree_pkg_vdb_fopenat_ro(pkg_ctx, "CONTENTS")) == 
NULL)
                return EXIT_SUCCESS;
-       if (fstat(fd_contents, &cst)) {
-               close(fd_contents);
-               return EXIT_SUCCESS;
-       }
-       if ((fp_contents = fdopen(fd_contents, "r")) == NULL) {
-               close(fd_contents);
-               return EXIT_SUCCESS;
-       }
 
        /* Open contents_update, if needed */
        atom = tree_get_atom(pkg_ctx, false);
@@ -322,11 +312,17 @@ qcheck_process_contents(tree_pkg_ctx *pkg_ctx, struct 
qcheck_opt_state *state)
        }
 
        if (state->qc_update) {
-               if (fchown(fd_contents, cst.st_uid, cst.st_gid)) {
-                       /* meh */;
-               }
-               if (fchmod(fd_contents, cst.st_mode)) {
-                       /* meh */;
+               int fd_contents = fileno(fp_contents);
+               int fd_update = fileno(fp_contents_update);
+
+               /* copy original ownership and mode */
+               if (fstat(fd_contents, &cst) == 0) {
+                       if (fchown(fd_update, cst.st_uid, cst.st_gid)) {
+                               /* meh */;
+                       }
+                       if (fchmod(fd_update, cst.st_mode)) {
+                               /* meh */;
+                       }
                }
                fclose(fp_contents_update);
                if (renameat(pkg_ctx->fd, "CONTENTS~", pkg_ctx->fd, "CONTENTS"))

Reply via email to