Radish alpha
H
HardenedBSD Package Manager
Radicle
Git (anonymous pull)
Log in to clone via SSH
Do not expose pkg_extract, instead create a pkg_add function that will take care of the whole installation process, scripts/exec included and registration included.
Baptiste Daroussin committed 15 years ago
commit f594279239f293e911c05fd8e196864466750dd7
parent 7f8a290c896867df2284c8f0a9f3bd48deea122a
7 files changed +181 -7
modified libpkg/Makefile
@@ -8,6 +8,7 @@ SHLIB_MAJOR= 0

SRCS=		pkg.c \
		pkgdb.c \
+
		pkg_add.c \
		pkg_create.c \
		pkg_conflict.c \
		pkg_delete.c \
modified libpkg/pkg.c
@@ -257,6 +257,7 @@ pkg_open(const char *path, struct pkg **pkg_p, int query_flags)

	pkg = *pkg_p;
	pkg->type = PKG_FILE;
+
	pkg->path = path;

	if (archive_read_open_filename(a, path, 4096) != ARCHIVE_OK)
		goto error;
@@ -376,6 +377,8 @@ pkg_new(struct pkg **pkg)
	if ((*pkg = calloc(1, sizeof(struct pkg))) == NULL)
		err(EXIT_FAILURE, "calloc()");

+
	(*pkg)->path = NULL;
+

	return (EPKG_OK);
}

modified libpkg/pkg.h
@@ -138,6 +138,7 @@ typedef enum {
	EPKG_NOT_ORIGIN,
	EPKG_NOT_NAME,
	EPKG_ERROR_MTREE,
+
	EPKG_BAD_PACKAGE,
} pkg_error_t;

/**
@@ -233,10 +234,9 @@ int pkg_resolvdeps(struct pkg *, struct pkgdb *db);
int pkg_analyse_files(struct pkgdb *, struct pkg *);

/**
-
 * Extract an archive.
-
 * @todo This should call pkg_register()
+
 * add a new package this will check if upgrade is needed
 */
-
int pkg_extract(const char *filename);
+
int pkg_add(struct pkgdb *, struct pkg *);

/**
 * Generic setter for simple attributes.
added libpkg/pkg_add.c
@@ -0,0 +1,116 @@
+
#include <archive.h>
+
#include <archive_entry.h>
+
#include <stdlib.h>
+

+
#include "pkg.h"
+
#include "pkg_private.h"
+

+
#define EXTRACT_ARCHIVE_FLAGS  (ARCHIVE_EXTRACT_OWNER |ARCHIVE_EXTRACT_PERM| \
+
		ARCHIVE_EXTRACT_TIME  |ARCHIVE_EXTRACT_ACL | \
+
		ARCHIVE_EXTRACT_FFLAGS|ARCHIVE_EXTRACT_XATTR)
+

+
static int
+
pkg_extract(const char *path)
+
{
+
	struct archive *a;
+
	struct archive_entry *ae;
+

+
	int ret;
+

+
	a = archive_read_new();
+
	archive_read_support_compression_all(a);
+
	archive_read_support_format_tar(a);
+

+
	if (archive_read_open_filename(a, path, 4096) != ARCHIVE_OK) {
+
		archive_read_finish(a);
+
		return (-1);
+
	}
+

+
	while ((ret = archive_read_next_header(a, &ae)) == ARCHIVE_OK) {
+
		if (archive_entry_pathname(ae)[0] == '+') {
+
			archive_read_data_skip(a);
+
		} else {
+
			archive_read_extract(a, ae, EXTRACT_ARCHIVE_FLAGS);
+
		}
+
	}
+

+
	/* this should never happen */
+
	if (ret != ARCHIVE_EOF)
+
		return (EPKG_ERROR_ARCHIVE);
+

+
	archive_read_finish(a);
+

+
	return (EPKG_OK);
+
}
+

+
int
+
pkg_add(struct pkgdb *db, struct pkg *pkg)
+
{
+
	struct pkg_exec **execs;
+
	struct pkg_script **scripts;
+
	struct sbuf *script_cmd;
+
	int i;
+

+
	if (pkg_type(pkg) != PKG_FILE || pkg->path == NULL)
+
		return (EPKG_BAD_PACKAGE);
+

+
	script_cmd = sbuf_new_auto();
+

+
	/* execute pre-install scripts */
+
	if ((scripts = pkg_scripts(pkg)) != NULL)
+
		for (i= 0; scripts[i] != NULL; i++) {
+
			switch (pkg_script_type(scripts[i])) {
+
				case PKG_SCRIPT_INSTALL:
+
					sbuf_reset(script_cmd);
+
					sbuf_printf(script_cmd, "set -- %s-%s INSTALL\n%s", pkg_get(pkg, PKG_NAME), pkg_get(pkg, PKG_VERSION), pkg_script_data(scripts[i]));
+
					sbuf_finish(script_cmd);
+
					system(sbuf_data(script_cmd));
+
					break;
+
				case PKG_SCRIPT_PRE_INSTALL:
+
					sbuf_reset(script_cmd);
+
					sbuf_printf(script_cmd, "set -- %s-%s\n%s", pkg_get(pkg, PKG_NAME), pkg_get(pkg, PKG_VERSION), pkg_script_data(scripts[i]));
+
					sbuf_finish(script_cmd);
+
					system(sbuf_data(script_cmd));
+
					break;
+
				default:
+
					/* just ignore */
+
					break;
+
			}
+
		}
+

+
	if (pkg_extract(pkg->path) != EPKG_OK)
+
		return (EPKG_ERROR_ARCHIVE);
+

+
	/* execute post install scripts */
+
	if (scripts != NULL)
+
		for (i= 0; scripts[i] != NULL; i++) {
+
			switch (pkg_script_type(scripts[i])) {
+
				case PKG_SCRIPT_INSTALL:
+
					sbuf_reset(script_cmd);
+
					sbuf_printf(script_cmd, "set -- %s-%s POST-INSTALL\n%s", pkg_get(pkg, PKG_NAME), pkg_get(pkg, PKG_VERSION), pkg_script_data(scripts[i]));
+
					sbuf_finish(script_cmd);
+
					system(sbuf_data(script_cmd));
+
					break;
+
				case PKG_SCRIPT_POST_INSTALL:
+
					sbuf_reset(script_cmd);
+
					sbuf_printf(script_cmd, "set -- %s-%s\n%s", pkg_get(pkg, PKG_NAME), pkg_get(pkg, PKG_VERSION), pkg_script_data(scripts[i]));
+
					sbuf_finish(script_cmd);
+
					system(sbuf_data(script_cmd));
+
					break;
+
				default:
+
					/* just ignore */
+
					break;
+
			}
+
		}
+

+
	sbuf_free(script_cmd);
+

+
	/* execute @exec */
+
	if ((execs = pkg_execs(pkg)) != NULL)
+
		for (i = 0; execs[i] != NULL; i++)
+
			if (pkg_exec_type(execs[i]) == PKG_EXEC)
+
				system(pkg_exec_cmd(execs[i]));
+

+

+
	return (pkgdb_register_pkg(db, pkg));
+
}
modified libpkg/pkg_delete.c
@@ -26,6 +26,8 @@ pkg_delete(struct pkg *pkg, struct pkgdb *db, int force)
{
	struct pkg **rdeps;
	struct pkg_file **files;
+
	struct pkg_exec **execs;
+
	struct pkg_script **scripts;
	char sha256[65];
	const char *mtree = NULL;
	struct archive *a;
@@ -33,7 +35,8 @@ pkg_delete(struct pkg *pkg, struct pkgdb *db, int force)
	struct array mtreedirs;
	const char *prefix;
	char *path, *end, *fullpath;
-
	int ret;
+
	struct sbuf *script_cmd;
+
	int ret, i;

	if (pkg == NULL || db == NULL)
		return (-1);
@@ -50,6 +53,28 @@ pkg_delete(struct pkg *pkg, struct pkgdb *db, int force)
		return (-1); /* TODO: special return code */
	}

+
	script_cmd = sbuf_new_auto();
+
	/* execute PRE_DEINSTALL */
+
	if ((scripts = pkg_scripts(pkg)) != NULL)
+
		for (i = 0; scripts[i] != NULL; i++) {
+
			switch (pkg_script_type(scripts[i])) {
+
				case PKG_SCRIPT_DEINSTALL:
+
					sbuf_reset(script_cmd);
+
					sbuf_printf(script_cmd, "set -- %s-%s DEINSTALL\n%s", pkg_get(pkg, PKG_NAME), pkg_get(pkg, PKG_VERSION), pkg_script_data(scripts[i]));
+
					sbuf_finish(script_cmd);
+
					system(sbuf_data(script_cmd));
+
					break;
+
				case PKG_SCRIPT_PRE_DEINSTALL:
+
					sbuf_reset(script_cmd);
+
					sbuf_printf(script_cmd, "set -- %s-%s\n%s", pkg_get(pkg, PKG_NAME), pkg_get(pkg, PKG_VERSION), pkg_script_data(scripts[i]));
+
					sbuf_finish(script_cmd);
+
					system(sbuf_data(script_cmd));
+
					break;
+
				default:
+
					/* just ignore */
+
					break;
+
			}
+
		}
	a = archive_read_new();
	archive_read_support_compression_none(a);
	archive_read_support_format_mtree(a);
@@ -64,7 +89,7 @@ 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)));

-
	for (int i = 0; files[i] != NULL; i++) {
+
	for (i = 0; files[i] != NULL; i++) {
		/* check sha256 */
		if (pkg_file_sha256(files[i])[0] != '\0' &&
			(SHA256_File(pkg_file_path(files[i]), sha256) == NULL ||
@@ -96,5 +121,34 @@ pkg_delete(struct pkg *pkg, struct pkgdb *db, int force)
	}
	array_free(&mtreedirs, &free);

+
	if (scripts != NULL)
+
		for (i = 0; scripts[i] != NULL; i++) {
+
			switch (pkg_script_type(scripts[i])) {
+
				case PKG_SCRIPT_DEINSTALL:
+
					sbuf_reset(script_cmd);
+
					sbuf_printf(script_cmd, "set -- %s-%s POST-DEINSTALL\n%s", pkg_get(pkg, PKG_NAME), pkg_get(pkg, PKG_VERSION), pkg_script_data(scripts[i]));
+
					sbuf_finish(script_cmd);
+
					system(sbuf_data(script_cmd));
+
					break;
+
				case PKG_SCRIPT_POST_DEINSTALL:
+
					sbuf_reset(script_cmd);
+
					sbuf_printf(script_cmd, "set -- %s-%s\n%s", pkg_get(pkg, PKG_NAME), pkg_get(pkg, PKG_VERSION), pkg_script_data(scripts[i]));
+
					sbuf_finish(script_cmd);
+
					system(sbuf_data(script_cmd));
+
					break;
+
				default:
+
					/* just ignore */
+
					break;
+
			}
+
		}
+

+
	sbuf_free(script_cmd);
+

+
	/* run the @unexec */
+
	if ((execs = pkg_execs(pkg)) != NULL)
+
		for (i = 0; execs[i] != NULL; i++)
+
			if (pkg_exec_type(execs[i]) == PKG_UNEXEC)
+
				system(pkg_exec_cmd(execs[i]));
+

	return (pkgdb_unregister_pkg(db, pkg_get(pkg, PKG_ORIGIN)));
}
modified libpkg/pkg_private.h
@@ -28,6 +28,7 @@ struct pkg {
	struct array scripts;
	struct array exec;
	struct array options;
+
	const char *path;
	pkg_t type;
};

modified pkg/add.c
@@ -72,8 +72,7 @@ exec_add(int argc, char **argv)
	if (ret != 0)
		return (ret);

-
	pkg_extract(argv[1]);
-
	pkgdb_register_pkg(db, pkg);
+
	pkg_add(db, pkg);

	pkgdb_close(db);
	pkg_free(pkg);