Radish alpha
H
HardenedBSD Package Manager
Radicle
Git (anonymous pull)
Log in to clone via SSH
Deal with NULL values and optional fields.
jlaffaye committed 15 years ago
commit 1a63530b2fcc65fff839c0c0b657ab64c3b6badc
parent 27c0e74a3d192a3cefec3d14fd11d0a9a2b983a1
3 files changed +50 -112
modified libpkg/pkg.c
@@ -29,84 +29,46 @@ pkg_get(struct pkg *pkg, pkg_attr attr)
		return (NULL);
	}

-
	switch (attr) {
-
		case PKG_NAME:
-
			return (sbuf_get(pkg->name));
-
		case PKG_VERSION:
-
			return (sbuf_get(pkg->version));
-
		case PKG_COMMENT:
-
			return (sbuf_get(pkg->comment));
-
		case PKG_ORIGIN:
-
			return (sbuf_get(pkg->origin));
-
		case PKG_DESC:
-
			return (sbuf_get(pkg->desc));
-
		case PKG_MTREE:
-
			return (sbuf_get(pkg->mtree));
-
		case PKG_MESSAGE:
-
			return (sbuf_get(pkg->message));
-
		case PKG_ARCH:
-
			return (sbuf_get(pkg->arch));
-
		case PKG_OSVERSION:
-
			return (sbuf_get(pkg->osversion));
-
		case PKG_MAINTAINER:
-
			return (sbuf_get(pkg->maintainer));
-
		case PKG_WWW:
-
			return (sbuf_get(pkg->www));
-
		case PKG_PREFIX:
-
			return (sbuf_get(pkg->prefix));
+
	if (attr > PKG_NUM_FIELDS) {
+
		ERROR_BAD_ARG("attr");
+
		return (NULL);
	}

-
	return (NULL);
+
	return (sbuf_get(pkg->fields[attr].value));
}

int
pkg_set(struct pkg *pkg, pkg_attr attr, const char *value)
{
+
	struct sbuf **sbuf;
+

	if (pkg == NULL)
		return (ERROR_BAD_ARG("pkg"));

-
	if (value == NULL)
-
		return (ERROR_BAD_ARG("value"));
+
	if (attr > PKG_NUM_FIELDS)
+
		return (ERROR_BAD_ARG("attr"));

-
	switch (attr) {
-
		case PKG_NAME:
-
			return (sbuf_set(&pkg->name, value));
-
		case PKG_VERSION:
-
			return (sbuf_set(&pkg->version, value));
-
		case PKG_COMMENT:
-
			return (sbuf_set(&pkg->comment, value));
-
		case PKG_ORIGIN:
-
			return (sbuf_set(&pkg->origin, value));
-
		case PKG_DESC:
-
			return (sbuf_set(&pkg->desc, value));
-
		case PKG_MTREE:
-
			/* ensure that mtree begins by #mtree so libarchive
-
			 * could handle it */
-

-
			if (STARTS_WITH(value, "#mtree")) {
-
				return (sbuf_set(&pkg->mtree, value));
-
			} else {
-
				sbuf_set(&pkg->mtree, "#mtree\n");
-
				sbuf_cat(pkg->mtree, value);
-
				sbuf_finish(pkg->mtree);
-
				return (EPKG_OK);
-
			}
-
			return (sbuf_set(&pkg->mtree, value));
-
		case PKG_MESSAGE:
-
			return (sbuf_set(&pkg->message, value));
-
		case PKG_ARCH:
-
			return (sbuf_set(&pkg->arch, value));
-
		case PKG_OSVERSION:
-
			return (sbuf_set(&pkg->osversion, value));
-
		case PKG_MAINTAINER:
-
			return (sbuf_set(&pkg->maintainer, value));
-
		case PKG_WWW:
-
			return (sbuf_set(&pkg->www, value));
-
		case PKG_PREFIX:
-
			return (sbuf_set(&pkg->prefix, value));
+
	if (value == NULL) {
+
		if (pkg->fields[attr].optional == 1)
+
			value = "";
+
		else
+
			return (ERROR_BAD_ARG("value"));
	}

-
	return (ERROR_BAD_ARG("attr"));
+
	sbuf = &pkg->fields[attr].value;
+

+
	/*
+
	 * Ensure that mtree begins with `#mtree` so libarchive
+
	 * could handle it
+
	 */
+
	if (attr == PKG_MTREE && !STARTS_WITH(value, "#mtree")) {
+
		sbuf_set(sbuf, "#mtree\n");
+
		sbuf_cat(*sbuf, value);
+
		sbuf_finish(*sbuf);
+
		return (EPKG_OK);
+
	}
+

+
	return (sbuf_set(sbuf, value));
}

int
@@ -328,8 +290,8 @@ pkg_open(const char *path, struct pkg **pkg_p)
		sbuf_finish(dest);													\
	}

-
		COPY_FILE("+DESC", pkg->desc)
-
		COPY_FILE("+MTREE_DIRS", pkg->mtree)
+
		COPY_FILE("+DESC", pkg->fields[PKG_DESC].value)
+
		COPY_FILE("+MTREE_DIRS", pkg->fields[PKG_MTREE].value)

#define COPY_SCRIPT(sname, stype)											\
	if (strcmp(fpath, sname) == 0) {										\
@@ -368,6 +330,9 @@ pkg_new(struct pkg **pkg)
	if ((*pkg = calloc(1, sizeof(struct pkg))) == NULL)
		return(pkg_error_seterrno());

+
	(*pkg)->fields[PKG_MESSAGE].optional = 1;
+
	(*pkg)->fields[PKG_WWW].optional = 1;
+

	return (EPKG_OK);
}

@@ -377,18 +342,8 @@ pkg_reset(struct pkg *pkg)
	if (pkg == NULL)
		return;

-
	sbuf_reset(pkg->origin);
-
	sbuf_reset(pkg->name);
-
	sbuf_reset(pkg->version);
-
	sbuf_reset(pkg->comment);
-
	sbuf_reset(pkg->desc);
-
	sbuf_reset(pkg->mtree);
-
	sbuf_reset(pkg->message);
-
	sbuf_reset(pkg->arch);
-
	sbuf_reset(pkg->osversion);
-
	sbuf_reset(pkg->maintainer);
-
	sbuf_reset(pkg->www);
-
	sbuf_reset(pkg->prefix);
+
	for (int i = 0; i < PKG_NUM_FIELDS; i++)
+
		sbuf_reset(pkg->fields[i].value);

	pkg->flatsize = 0;
	pkg->flags = 0;
@@ -409,18 +364,8 @@ pkg_free(struct pkg *pkg)
	if (pkg == NULL)
		return;

-
	sbuf_free(pkg->name);
-
	sbuf_free(pkg->version);
-
	sbuf_free(pkg->origin);
-
	sbuf_free(pkg->comment);
-
	sbuf_free(pkg->desc);
-
	sbuf_free(pkg->mtree);
-
	sbuf_free(pkg->message);
-
	sbuf_free(pkg->arch);
-
	sbuf_free(pkg->osversion);
-
	sbuf_free(pkg->maintainer);
-
	sbuf_free(pkg->www);
-
	sbuf_free(pkg->prefix);
+
	for (int i = 0; i < PKG_NUM_FIELDS; i++)
+
		sbuf_free(pkg->fields[i].value);

	array_free(&pkg->deps, &pkg_free_void);
	array_free(&pkg->rdeps, &pkg_free_void);
modified libpkg/pkg_delete.c
@@ -63,14 +63,9 @@ pkg_delete(struct pkg *pkg, struct pkgdb *db, int force)
	execs = pkg_execs(pkg);
	prefix = pkg_get(pkg, PKG_PREFIX);

-
	if (rdeps == NULL || files == NULL)
-
		return (pkg_error_set(EPKG_FATAL, "missing deps and files infos"));
-

-
	if (rdeps[0] != NULL && force == 0) {
-
		warnx("%s is required by other packages", pkg_get(pkg, PKG_ORIGIN));
-
		return (pkg_error_set(EPKG_REQUIRED, "%s is required by other"
-
							  "packages", pkg_get(pkg, PKG_NAME)));
-
	}
+
	if (rdeps[0] != NULL && force == 0)
+
		return (pkg_error_set(EPKG_REQUIRED, "this package is required by "
+
							  "other packages"));

	script_cmd = sbuf_new_auto();
	/* execute PRE_DEINSTALL */
@@ -107,6 +102,11 @@ pkg_delete(struct pkg *pkg, struct pkgdb *db, int force)
	while ((ret = archive_read_next_header(a, &ae)) == ARCHIVE_OK)
		array_append(&mtreedirs, strdup(archive_entry_pathname(ae)));

+
	if (ret != ARCHIVE_EOF) {
+
		array_free(&mtreedirs, &free);
+
		return (pkg_error_set(EPKG_FATAL, "%s", archive_error_string(a)));
+
	}
+

	for (i = 0; files[i] != NULL; i++) {
		/* check sha256 */
		if (pkg_file_sha256(files[i])[0] != '\0' &&
modified libpkg/pkg_private.h
@@ -7,20 +7,13 @@

#include "pkg_util.h"

+
#define PKG_NUM_FIELDS 12
+

struct pkg {
-
	struct sbuf *origin;
-
	struct sbuf *name;
-
	struct sbuf *version;
-
	struct sbuf *comment;
-
	struct sbuf *desc;
-
	struct sbuf *mtree;
-
	struct sbuf *message;
-
	struct sbuf *arch;
-
	struct sbuf *osversion;
-
	struct sbuf *maintainer;
-
	struct sbuf *www;
-
	struct sbuf *err;
-
	struct sbuf *prefix;
+
	struct {
+
		struct sbuf *value;
+
		unsigned int optional :1;
+
	} fields[PKG_NUM_FIELDS];
	int64_t flatsize;
	struct array deps;
	struct array rdeps;