Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Add a pkg_checksum_generate_fileat function
Baptiste Daroussin committed 10 years ago
commit 11d73454afeda08a5a938be4af41bd1b7fab1c6c
parent 3f45e50
2 files changed +29 -0
modified libpkg/pkg_checksum.c
@@ -787,3 +787,30 @@ pkg_checksum_generate_file(const char *path, pkg_checksum_type_t type)

	return (cksum);
}
+

+
char *
+
pkg_checksum_generate_fileat(int rootfd, const char *path,
+
    pkg_checksum_type_t type)
+
{
+
	struct stat st;
+
	unsigned char *sum;
+
	char *cksum;
+

+
	if (fstatat(rootfd, path, &st, AT_SYMLINK_NOFOLLOW) == -1) {
+
		pkg_emit_errno("pkg_checksum_generate_file", "lstat");
+
		return (NULL);
+
	}
+

+
	if (S_ISLNK(st.st_mode))
+
		sum = pkg_checksum_symlinkat(rootfd, path, NULL, type);
+
	else
+
		sum = pkg_checksum_fileat(rootfd, path, type);
+

+
	if (sum == NULL)
+
		return (NULL);
+

+
	asprintf(&cksum, "%d%c%s", type, PKG_CKSUM_SEPARATOR, sum);
+
	free(sum);
+

+
	return (cksum);
+
}
modified libpkg/private/pkg.h
@@ -648,6 +648,8 @@ const char* pkg_checksum_type_to_string(pkg_checksum_type_t type);
size_t pkg_checksum_type_size(pkg_checksum_type_t type);
int pkg_checksum_calculate(struct pkg *pkg, struct pkgdb *db);
char *pkg_checksum_generate_file(const char *path, pkg_checksum_type_t type);
+
char *pkg_checksum_generate_fileat(int fd, const char *path,
+
    pkg_checksum_type_t type);

int pkg_add_upgrade(struct pkgdb *db, const char *path, unsigned flags,
    struct pkg_manifest_key *keys, const char *location,