Radish alpha
H
HardenedBSD Package Manager
Radicle
Git (anonymous pull)
Log in to clone via SSH
branch exec and script to struct pkg, create getters/setters, parse from pkg_register
Baptiste Daroussin committed 15 years ago
commit af962977546e1ca79baeb9de2dba828e8a366de8
parent 418c10bb3552645f5b444ae94f5167a0af6a2e96
6 files changed +212 -1
modified libpkg/pkg.c
@@ -77,6 +77,18 @@ pkg_set_from_file(struct pkg *pkg, pkg_attr attr, const char *path)
	return (ret);
}

+
struct pkg_script **
+
pkg_scripts(struct pkg *pkg)
+
{
+
	return ((struct pkg_script **)pkg->scripts.data);
+
}
+

+
struct pkg_exec **
+
pkg_execs(struct pkg *pkg)
+
{
+
	return (struct pkg_exec **) pkg->exec.data;
+
}
+

struct pkg **
pkg_deps(struct pkg *pkg)
{
@@ -229,6 +241,8 @@ pkg_reset(struct pkg *pkg)
	array_reset(&pkg->rdeps, &pkg_free_void);
	array_reset(&pkg->conflicts, &pkg_conflict_free_void);
	array_reset(&pkg->files, &free);
+
	array_reset(&pkg->scripts, &pkg_script_free_void);
+
	array_reset(&pkg->exec, &pkg_exec_free_void);
}

void
@@ -249,6 +263,8 @@ pkg_free(struct pkg *pkg)
	array_free(&pkg->rdeps, &pkg_free_void);
	array_free(&pkg->conflicts, &pkg_conflict_free_void);
	array_free(&pkg->files, &free);
+
	array_free(&pkg->scripts, &pkg_script_free_void);
+
	array_free(&pkg->exec, &pkg_exec_free_void);

	free(pkg);
}
@@ -261,6 +277,76 @@ pkg_free_void(void *p)
}

int
+
pkg_addscript(struct pkg *pkg, const char *path)
+
{
+
	struct pkg_script *script;
+
	char *filename;
+
	char *raw_script;
+

+
	if (path == NULL)
+
		return (-1);
+

+
	if (file_to_buffer(path, &raw_script) <= 0)
+
		return (-1);
+

+
	sbuf_set(&script->data, raw_script);
+

+
	filename = strrchr(path, '/');
+
	filename[0] = '\0';
+

+
	if (strcmp(filename, "pkg-pre-install") == 0) {
+
		script->type = PKG_SCRIPT_PRE_INSTALL;
+
	} else if (strcmp(filename, "pkg-post-install") == 0) {
+
		script->type = PKG_SCRIPT_POST_INSTALL;
+
	} else if (strcmp(filename, "pkg-install") == 0) {
+
		script->type = PKG_SCRIPT_INSTALL;
+
	} else if (strcmp(filename, "pkg-pre-deinstall") == 0) {
+
		script->type = PKG_SCRIPT_PRE_DEINSTALL;
+
	} else if (strcmp(filename, "pkg-post-deinstall") == 0) {
+
		script->type = PKG_SCRIPT_POST_DEINSTALL;
+
	} else if (strcmp(filename, "pkg-deinstall") == 0) {
+
		script->type = PKG_SCRIPT_DEINSTALL;
+
	} else if (strcmp(filename, "pkg-pre-upgrade") == 0) {
+
		script->type = PKG_SCRIPT_PRE_UPGRADE;
+
	} else if (strcmp(filename, "pkg-post-upgrade") == 0) {
+
		script->type = PKG_SCRIPT_POST_UPGRADE;
+
	} else if (strcmp(filename, "pkg-upgrade") == 0) {
+
		script->type = PKG_SCRIPT_UPGRADE;
+
	} else {
+
		/* unknown script */
+
		return (-1);
+
	}
+

+
	array_init(&pkg->scripts, 6);
+
	array_append(&pkg->scripts, script);
+

+
	return (0);
+

+
}
+

+
int
+
pkg_addexec(struct pkg *pkg, const char *cmd, pkg_exec_t type)
+
{
+
	struct pkg_exec *exec;
+

+
	if (cmd == NULL)
+
		return (-1);
+

+
	if (strlen(cmd) == 0)
+
		return (-1);
+

+
	pkg_exec_new(&exec);
+

+
	sbuf_set(&exec->cmd, cmd);
+
	exec->type = type;
+

+
	array_init(&pkg->exec, 5);
+
	array_append(&pkg->exec, exec);
+

+
	return (0);
+
}
+

+
int
pkg_adddep(struct pkg *pkg, const char *name, const char *origin, const char *version)
{
	struct pkg *dep;
modified libpkg/pkg.h
@@ -63,6 +63,8 @@ struct pkg ** pkg_deps(struct pkg *);
struct pkg ** pkg_rdeps(struct pkg *);
struct pkg_file ** pkg_files(struct pkg *);
struct pkg_conflict ** pkg_conflicts(struct pkg *);
+
struct pkg_script ** pkg_scripts(struct pkg *);
+
struct pkg_exec ** pkg_execs(struct pkg *);
int pkg_resolvdeps(struct pkg *, struct pkgdb *db);

/* pkg setters */
@@ -71,6 +73,8 @@ int pkg_set_from_file(struct pkg *, pkg_attr, const char *);
int pkg_adddep(struct pkg *, const char *, const char *, const char *);
int pkg_addfile(struct pkg *, const char *, const char *);
int pkg_addconflict(struct pkg *, const char *);
+
int pkg_addexec(struct pkg *, const char *, pkg_exec_t);
+
int pkg_addscript(struct pkg *, const char *);

/* pkg_manifest */
int pkg_parse_manifest(struct pkg *, char *);
@@ -141,5 +145,6 @@ int pkg_version_cmp(const char *, const char *);
int ports_parse_plist(struct pkg *, char *, const char *);
int ports_parse_depends(struct pkg *, char *);
int ports_parse_conflicts(struct pkg *, char *);
+
int ports_parse_scripts(struct pkg *, char *);

#endif
added libpkg/pkg_exec.c
@@ -0,0 +1,92 @@
+
#include <stdlib.h>
+
#include <err.h>
+

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

+
const char *
+
pkg_script_data(struct pkg_script *s)
+
{
+
	return (sbuf_get(s->data));
+
}
+

+
pkg_script_t
+
pkg_script_type(struct pkg_script *s)
+
{
+
	return (s->type);
+
}
+

+
int
+
pkg_script_new(struct pkg_script **script)
+
{
+
	if ((*script = calloc(1, sizeof(struct pkg_script))) == NULL)
+
		err(EXIT_FAILURE, "calloc()");
+

+
	return (0);
+
}
+

+
void
+
pkg_script_reset(struct pkg_script *script)
+
{
+
	sbuf_reset(script->data);
+
}
+

+
void
+
pkg_script_free(struct pkg_script *script)
+
{
+
	if (script == NULL)
+
		return;
+

+
	sbuf_free(script->data);
+
	free(script);
+
}
+

+
void
+
pkg_script_free_void(void *s)
+
{
+
	if (s != NULL)
+
		pkg_script_free((struct pkg_script *)s);
+
}
+
const char *
+
pkg_exec_cmd(struct pkg_exec *exec)
+
{
+
	return (sbuf_get(exec->cmd));
+
}
+

+
pkg_exec_t
+
pkg_exec_type(struct pkg_exec *exec)
+
{
+
	return (exec->type);
+
}
+

+
int
+
pkg_exec_new(struct pkg_exec **exec)
+
{
+
	if ((*exec = calloc(1, sizeof(struct pkg_exec))) == NULL)
+
		err(EXIT_FAILURE, "calloc()");
+

+
	return (0);
+
}
+

+
void
+
pkg_exec_reset(struct pkg_exec *exec)
+
{
+
	sbuf_reset(exec->cmd);
+
}
+

+
void
+
pkg_exec_free(struct pkg_exec *exec)
+
{
+
	if (exec == NULL)
+
		return;
+

+
	sbuf_free(exec->cmd);
+
	free(exec);
+
}
+

+
void
+
pkg_exec_free_void(void *e)
+
{
+
	if (e != NULL)
+
		pkg_exec_free((struct pkg_exec *)e);
+
}
modified libpkg/pkg_ports.c
@@ -140,3 +140,27 @@ ports_parse_conflicts(struct pkg *pkg, char *conflicts)

	return (0);
}
+

+
int
+
ports_parse_scripts(struct pkg *pkg, char *scripts)
+
{
+
	int nbel, i;
+
	char *script_p;
+
	size_t next;
+

+
	if (scripts == NULL)
+
		return (-1);
+

+
	nbel = split_chr(scripts, ' ');
+
	script_p = scripts;
+

+
	next = strlen(script_p);
+
	for (i = 0; i <= nbel; i++) {
+
		pkg_addscript(pkg, script_p);
+

+
		script_p += next + 1;
+
		next = strlen(script_p);
+
	}
+

+
	return (0);
+
}
modified libpkg/pkg_private.h
@@ -19,6 +19,8 @@ struct pkg {
	struct array rdeps;
	struct array conflicts;
	struct array files;
+
	struct array scripts;
+
	struct array exec;
	pkg_t type;
};

@@ -42,5 +44,7 @@ struct pkg_file {
};

void pkg_conflict_free_void(void *);
+
void pkg_script_free_void(void *);
+
void pkg_exec_free_void(void *);

#endif
modified pkg/register.c
@@ -32,7 +32,7 @@ exec_register(int argc, char **argv)
	int ret = 0;

	pkg_new(&pkg);
-
	while ((ch = getopt(argc, argv, "vc:d:f:p:P:m:o:C:n:M:")) != -1) {
+
	while ((ch = getopt(argc, argv, "vc:d:f:p:P:m:o:C:n:M:s:")) != -1) {
		switch (ch) {
			case 'v':
				/* IGNORE */