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"))