Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Merge branch 'master' of github.com:freebsd/pkg
Matthew Seaman committed 11 years ago
commit b215e9be805269567aedc5162d1dab174f690b98
parent 6913430
2 files changed +30 -6
modified libpkg/pkg_repo.c
@@ -113,14 +113,14 @@ pkg_repo_cached_name(struct pkg *pkg, char *dest, size_t destlen)
int
pkg_repo_fetch_package(struct pkg *pkg)
{
-
	char dest[MAXPATHLEN];
+
	char dest[MAXPATHLEN], link_dest[MAXPATHLEN];
	char url[MAXPATHLEN];
	int fetched = 0;
	char cksum[SHA256_DIGEST_LENGTH * 2 +1];
	int64_t pkgsize;
	struct stat st;
	char *path = NULL;
-
	const char *packagesite = NULL;
+
	const char *packagesite = NULL, *dest_fname = NULL, *ext = NULL;

	int retcode = EPKG_OK;
	const char *reponame, *name, *version, *sum;
@@ -206,6 +206,16 @@ pkg_repo_fetch_package(struct pkg *pkg)
	cleanup:
	if (retcode != EPKG_OK)
		unlink(dest);
+
	else {
+
		/* Create symlink from full pkgname */
+
		ext = strrchr(dest, '.');
+
		pkg_snprintf(link_dest, sizeof(link_dest), "%S/%n-%v%S",
+
		    path, pkg, pkg, ext ? ext : "");
+
		if ((dest_fname = strrchr(dest, '/')) != NULL)
+
			++dest_fname;
+
		if (symlink(dest_fname, link_dest))
+
			pkg_emit_errno("symlink", link_dest);
+
	}

	return (retcode);
}
modified src/clean.c
@@ -164,8 +164,9 @@ exec_clean(int argc, char **argv)
	FTS		*fts = NULL;
	FTSENT		*ent = NULL;
	struct dl_head	dl = STAILQ_HEAD_INITIALIZER(dl);
-
	const char	*cachedir, *sum;
-
	char		*paths[2], csum[PKG_FILE_CKSUM_CHARS + 1];
+
	const char	*cachedir, *sum, *name;
+
	char		*paths[2], csum[PKG_FILE_CKSUM_CHARS + 1],
+
			link_buf[MAXPATHLEN];
	bool		 all = false;
	bool		 dry_run = false;
	bool		 yes, sumloaded = false;
@@ -173,6 +174,7 @@ exec_clean(int argc, char **argv)
	int		 ret;
	int		 ch;
	size_t		 total = 0, slen;
+
	ssize_t		 link_len;
	char		 size[7];
	struct pkg_manifest_key *keys = NULL;

@@ -246,7 +248,7 @@ exec_clean(int argc, char **argv)

	pkg_manifest_keys_new(&keys);
	while ((ent = fts_read(fts)) != NULL) {
-
		if (ent->fts_info != FTS_F)
+
		if (ent->fts_info != FTS_F && ent->fts_info != FTS_SL)
			continue;

		if (all) {
@@ -267,8 +269,20 @@ exec_clean(int argc, char **argv)
			}
		}

+
		if (ent->fts_info == FTS_SL) {
+
			/* Dereference the symlink and check it for being
+
			 * recognized checksum file, or delete the symlink
+
			 * later. */
+
			if ((link_len = readlink(ent->fts_name, link_buf,
+
			    sizeof(link_buf))) == -1)
+
				continue;
+
			link_buf[link_len] = '\0';
+
			name = link_buf;
+
		} else
+
			name = ent->fts_name;
+

		s = NULL;
-
		if (extract_filename_sum(ent->fts_name, csum))
+
		if (extract_filename_sum(name, csum))
			HASH_FIND_STR(sumlist, csum, s);
		if (s == NULL) {
			ret = add_to_dellist(&dl, ent->fts_path);