Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
repo: refactoring of pkg_repo_fetch_remote_extract_fd
Baptiste Daroussin committed 2 years ago
commit 4d3acea67dd7306d10ae1aba632cf20885a97e80
parent ec8db30
3 files changed +38 -31
modified libpkg/pkg_repo.c
@@ -681,56 +681,55 @@ out:
}

int
-
pkg_repo_fetch_remote_extract_fd(struct pkg_repo *repo, time_t *t, int *rc, size_t *sz)
+
pkg_repo_fetch_remote_extract_fd(struct pkg_repo *repo, struct pkg_repo_content *prc)
{
-
	int fd, dest_fd;
+
	int fd;
	const char *tmpdir;
	char tmp[MAXPATHLEN];
	struct stat st;
+
	int rc = EPKG_OK;

-
	fd = pkg_repo_fetch_remote_tmp(repo, repo->meta->manifests, "pkg", t, rc, false);
+
	fd = pkg_repo_fetch_remote_tmp(repo, repo->meta->manifests, "pkg", &prc->mtime, &rc, false);
	if (fd == -1) {
-
		if (*rc == EPKG_UPTODATE)
-
			return (-1);
-
		fd = pkg_repo_fetch_remote_tmp(repo, repo->meta->manifests,
-
		    packing_format_to_string(repo->meta->packing_format), t, rc, false);
+
		if (rc == EPKG_UPTODATE)
+
			return (rc);
+
		prc->manifest_fd = pkg_repo_fetch_remote_tmp(repo, repo->meta->manifests,
+
		    packing_format_to_string(repo->meta->packing_format), &prc->mtime, &rc, false);
	}
	if (fd == -1)
-
		return (-1);
+
		return (EPKG_FATAL);

	tmpdir = getenv("TMPDIR");
	if (tmpdir == NULL)
		tmpdir = "/tmp";
	snprintf(tmp, sizeof(tmp), "%s/%s.XXXXXX", tmpdir, repo->meta->manifests);

-
	dest_fd = mkstemp(tmp);
-
	if (dest_fd == -1) {
+
	prc->manifest_fd = mkstemp(tmp);
+
	if (prc->manifest_fd == -1) {
		pkg_emit_error("Could not create temporary file %s, "
				"aborting update.\n", tmp);
		close(fd);
-
		*rc = EPKG_FATAL;
-
		return (-1);
+
		return (EPKG_FATAL);
	}

	(void)unlink(tmp);
-
	if (pkg_repo_archive_extract_check_archive(fd, repo->meta->manifests, repo, dest_fd)
+
	if (pkg_repo_archive_extract_check_archive(fd, repo->meta->manifests, repo, prc->manifest_fd)
			!= EPKG_OK) {
-
		*rc = EPKG_FATAL;
-
		close(dest_fd);
+
		close(prc->manifest_fd);
		close(fd);
-
		return (-1);
+
		return (EPKG_FATAL);
	}

	/* Thus removing archived file as well */
	close(fd);
-
	if (fstat(dest_fd, &st) == -1) {
-
		close(dest_fd);
-
		return (-1);
+
	if (fstat(prc->manifest_fd, &st) == -1) {
+
		close(prc->manifest_fd);
+
		return (EPKG_FATAL);
	}

-
	*sz = st.st_size;
+
	prc->manifest_len = st.st_size;

-
	return (dest_fd);
+
	return (EPKG_OK);
}

struct pkg_repo_check_cbdata {
modified libpkg/private/pkg.h
@@ -183,6 +183,12 @@ struct pkg_ctx {

extern struct pkg_ctx ctx;

+
struct pkg_repo_content {
+
	time_t mtime;
+
	int manifest_fd;
+
	size_t manifest_len;
+
};
+

struct pkg_repo_it;
struct pkg_repo;
struct url;
@@ -626,8 +632,7 @@ int pkg_fetch_file_to_fd(struct pkg_repo *repo, int dest, struct fetch_item *,
    bool silent);
int pkg_repo_fetch_package(struct pkg *pkg);
int pkg_repo_mirror_package(struct pkg *pkg, const char *destdir);
-
int pkg_repo_fetch_remote_extract_fd(struct pkg_repo *repo, time_t *t, int *rc,
-
    size_t *sz);
+
int pkg_repo_fetch_remote_extract_fd(struct pkg_repo *repo, struct pkg_repo_content *);
int pkg_repo_meta_dump_fd(struct pkg_repo_meta *target, const int fd);
int pkg_repo_fetch_meta(struct pkg_repo *repo, time_t *t);

modified libpkg/repo/binary/update.c
@@ -461,14 +461,13 @@ pkg_repo_binary_update_proceed(const char *name, struct pkg_repo *repo,
	sqlite3 *sqlite = NULL;
	int cnt = 0;
	time_t local_t;
-
	size_t len = 0;
	bool in_trans = false;
	char *path = NULL;
	FILE *f = NULL;
-
	int fd;
	char *line = NULL;
	size_t linecap = 0;
	ssize_t linelen, totallen = 0;
+
	struct pkg_repo_content prc;

	pkg_debug(1, "Pkgrepo, begin update of '%s'", name);

@@ -484,13 +483,17 @@ pkg_repo_binary_update_proceed(const char *name, struct pkg_repo *repo,

	/* Fetch packagesite */
	local_t = *mtime;
-
	fd = pkg_repo_fetch_remote_extract_fd(repo, &local_t, &rc, &len);
-
	if (fd == -1)
+
	prc.manifest_fd = -1;
+
	prc.mtime = *mtime;
+
	prc.manifest_len = 0;
+

+
	rc = pkg_repo_fetch_remote_extract_fd(repo, &prc);
+
	if (rc != EPKG_OK)
		goto cleanup;
-
	f = fdopen(fd, "r");
+
	f = fdopen(prc.manifest_fd, "r");
	rewind(f);

-
	*mtime = local_t;
+
	*mtime = prc.mtime;
	/*fconflicts = repo_fetch_remote_extract_tmp(repo,
			repo_conflicts_archive, "txz", &local_t,
			&rc, repo_conflicts_file);*/
@@ -529,13 +532,13 @@ pkg_repo_binary_update_proceed(const char *name, struct pkg_repo *repo,
		cnt++;
		totallen += linelen;
		if ((cnt % 10 ) == 0)
-
			cancel = pkg_emit_progress_tick(totallen, len);
+
			cancel = pkg_emit_progress_tick(totallen, prc.manifest_len);
		rc = pkg_repo_binary_add_from_manifest(line, sqlite, linelen,
		    &pkg, repo);
		if (rc != EPKG_OK || cancel != 0)
			break;
	}
-
	pkg_emit_progress_tick(len, len);
+
	pkg_emit_progress_tick(prc.manifest_len, prc.manifest_len);

	if (rc == EPKG_OK)
		pkg_emit_incremental_update(repo->name, cnt);