Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Store digest format in meta file.
Vsevolod Stakhov committed 11 years ago
commit c5b4e142d561aa3cf7235ae1855b556cfd9c90c1
parent 820426c
3 files changed +31 -11
modified libpkg/pkg_checksum.c
@@ -56,21 +56,25 @@ static void pkg_checksum_encode_hex(unsigned char *in, size_t inlen,
				char *out, size_t outlen);

static const struct _pkg_cksum_type {
+
	const char *name;
	size_t hlen;
	pkg_checksum_hash_func hfunc;
	pkg_checksum_encode_func encfunc;
} checksum_types[] = {
	[PKG_HASH_TYPE_SHA256_BASE32] = {
+
		"sha256_base32",
		PKG_CHECKSUM_SHA256_LEN,
		pkg_checksum_hash_sha256,
		pkg_checksum_encode_base32
	},
	[PKG_HASH_TYPE_SHA256_HEX] = {
+
		"sha256_hex",
		PKG_CHECKSUM_SHA256_LEN,
		pkg_checksum_hash_sha256,
		pkg_checksum_encode_hex
	},
	[PKG_HASH_TYPE_UNKNOWN] = {
+
		NULL,
		-1,
		NULL,
		NULL
@@ -339,3 +343,15 @@ pkg_checksum_encode_hex(unsigned char *in, size_t inlen,

	out[inlen * 2] = '\0';
}
+

+
pkg_checksum_type_t
+
pkg_checksum_type_from_string(const char *name)
+
{
+
	int i;
+
	for (i = 0; i < PKG_HASH_TYPE_UNKNOWN; i ++) {
+
		if (strcasecmp(name, checksum_types[i].name) == 0)
+
			return (i);
+
	}
+

+
	return (PKG_HASH_TYPE_UNKNOWN);
+
}
modified libpkg/pkg_repo_meta.c
@@ -35,7 +35,7 @@ static ucl_object_t *repo_meta_schema_v1 = NULL;
static void
pkg_repo_meta_set_default(struct pkg_repo_meta *meta)
{
-
	meta->digest_format = strdup("sha256");
+
	meta->digest_format = PKG_HASH_TYPE_SHA256_BASE32;
	meta->packing_format = TXZ;

	/* Not use conflicts for now */
@@ -59,7 +59,6 @@ pkg_repo_meta_free(struct pkg_repo_meta *meta)
		free(meta->manifests);
		free(meta->digests);
		free(meta->fulldb);
-
		free(meta->digest_format);
		free(meta->maintainer);
		free(meta->source);
		free(meta->source_identifier);
@@ -86,7 +85,7 @@ pkg_repo_meta_open_schema_v1()
			"maintainer = {type = string};\n"
			"source = {type = string};\n"
			"packing_format = {enum = [txz, tbz, tgz]};\n"
-
			"digest_format = {enum = [sha256]};\n"
+
			"digest_format = {enum = [sha256_base32, sha256_hex]};\n"
			"digests = {type = string};\n"
			"manifests = {type = string};\n"
			"conflicts = {type = string};\n"
@@ -174,7 +173,6 @@ pkg_repo_meta_parse(ucl_object_t *top, struct pkg_repo_meta **target, int versio

	META_EXTRACT_STRING(maintainer);
	META_EXTRACT_STRING(source);
-
	META_EXTRACT_STRING(digest_format);

	META_EXTRACT_STRING(conflicts);
	META_EXTRACT_STRING(digests);
@@ -198,6 +196,11 @@ pkg_repo_meta_parse(ucl_object_t *top, struct pkg_repo_meta **target, int versio
		meta->packing_format = packing_format_from_string(ucl_object_tostring(obj));
	}

+
	obj = ucl_object_find_key(top, "digest_format");
+
	if (obj != NULL && obj->type == UCL_STRING) {
+
		meta->digest_format = pkg_checksum_type_from_string(ucl_object_tostring(obj));
+
	}
+

	obj = ucl_object_find_key(top, "cert");
	while ((cur = ucl_iterate_object(obj, &iter, false)) != NULL) {
		cert = pkg_repo_meta_parse_cert(cur);
modified libpkg/private/pkg.h
@@ -274,13 +274,19 @@ struct pkg_repo_meta_key {
	UT_hash_handle hh;
};

+
typedef enum pkg_checksum_type_e {
+
	PKG_HASH_TYPE_SHA256_BASE32 = 0,
+
	PKG_HASH_TYPE_SHA256_HEX,
+
	PKG_HASH_TYPE_UNKNOWN
+
} pkg_checksum_type_t;
+

struct pkg_repo_meta {

	char *maintainer;
	char *source;

	pkg_formats packing_format;
-
	char *digest_format; /* TODO: should be enumeration */
+
	pkg_checksum_type_t digest_format;

	char *digests;
	char *manifests;
@@ -538,12 +544,6 @@ bool ucl_object_emit_sbuf(const ucl_object_t *obj, enum ucl_emitter emit_type,
bool ucl_object_emit_file(const ucl_object_t *obj, enum ucl_emitter emit_type,
    FILE *);

-
typedef enum pkg_checksum_type_e {
-
	PKG_HASH_TYPE_SHA256_BASE32 = 0,
-
	PKG_HASH_TYPE_SHA256_HEX,
-
	PKG_HASH_TYPE_UNKNOWN
-
} pkg_checksum_type_t;
-

/* Hash is in format <version>:<typeid>:<hexhash> */
#define PKG_CHECKSUM_SHA256_LEN (SHA256_DIGEST_LENGTH * 2 + 10)
#define PKG_CHECKSUM_CUR_VERSION 1
@@ -553,5 +553,6 @@ int pkg_checksum_generate(struct pkg *pkg, char *dest, size_t destlen,

bool pkg_checksum_is_valid(const char *cksum, size_t clen);
pkg_checksum_type_t pkg_checksum_get_type(const char *cksum, size_t clen);
+
pkg_checksum_type_t pkg_checksum_type_from_string(const char *name);

#endif