Radish alpha
H
HardenedBSD Package Manager
Radicle
Git (anonymous pull)
Log in to clone via SSH
Dynamically list all options (TODO get the same from plugins)
Baptiste Daroussin committed 13 years ago
commit b356d45503265eda86c483230694c99cdfa36da3
parent 11bbc51848f462a50dfc7fe4c536cc85686886dc
5 files changed +116 -86
modified libpkg/pkg.h
@@ -63,6 +63,7 @@ struct pkg_jobs;
struct pkg_repos;
struct pkg_repos_entry;

+
struct pkg_config;
struct pkg_config_kv;
struct pkg_config_value;

@@ -286,6 +287,14 @@ typedef enum _pkg_stats_t {
	PKG_STATS_REMOTE_REPOS,
} pkg_stats_t;

+
typedef enum {
+
	PKG_CONFIG_STRING=0,
+
	PKG_CONFIG_BOOL,
+
	PKG_CONFIG_KVLIST,
+
	PKG_CONFIG_INTEGER,
+
	PKG_CONFIG_LIST
+
} pkg_config_t;
+

/**
 * Keys for accessing pkg plugin data
 */
@@ -956,6 +965,10 @@ int pkg_config_list(pkg_config_key key, struct pkg_config_value **v);
const char *pkg_config_kv_get(struct pkg_config_kv *kv, pkg_config_kv_t type);
const char *pkg_config_value(struct pkg_config_value *v);
int pkg_config_int64(pkg_config_key key, int64_t *value);
+
int pkg_configs(struct pkg_config **c);
+
int pkg_config_id(struct pkg_config *c);
+
int pkg_config_type(struct pkg_config *c);
+
const char *pkg_config_name(struct pkg_config *c);

/**
 * @todo Document
modified libpkg/pkg_config.c
@@ -55,117 +55,117 @@ static struct pkg_config *config_by_key = NULL;

static struct config_entry c[] = {
	[PKG_CONFIG_REPO] = {
-
		CONF_STRING,
+
		PKG_CONFIG_STRING,
		"PACKAGESITE",
		NULL,
	},
	[PKG_CONFIG_DBDIR] = {
-
		CONF_STRING,
+
		PKG_CONFIG_STRING,
		"PKG_DBDIR",
		"/var/db/pkg",
	},
	[PKG_CONFIG_CACHEDIR] = {
-
		CONF_STRING,
+
		PKG_CONFIG_STRING,
		"PKG_CACHEDIR",
		"/var/cache/pkg",
	},
	[PKG_CONFIG_PORTSDIR] = {
-
		CONF_STRING,
+
		PKG_CONFIG_STRING,
		"PORTSDIR",
		"/usr/ports",
	},
	[PKG_CONFIG_REPOKEY] = {
-
		CONF_STRING,
+
		PKG_CONFIG_STRING,
		"PUBKEY",
		NULL,
	},
	[PKG_CONFIG_MULTIREPOS] = {
-
		CONF_BOOL,
+
		PKG_CONFIG_BOOL,
		"PKG_MULTIREPOS",
		NULL,
	},
	[PKG_CONFIG_HANDLE_RC_SCRIPTS] = {
-
		CONF_BOOL,
+
		PKG_CONFIG_BOOL,
		"HANDLE_RC_SCRIPTS",
		NULL,
	},
	[PKG_CONFIG_ASSUME_ALWAYS_YES] = {
-
		CONF_BOOL,
+
		PKG_CONFIG_BOOL,
		"ASSUME_ALWAYS_YES",
		NULL,
	},
	[PKG_CONFIG_REPOS] = {
-
		CONF_KVLIST,
+
		PKG_CONFIG_KVLIST,
		"REPOS",
		"NULL",
	},
	[PKG_CONFIG_PLIST_KEYWORDS_DIR] = {
-
		CONF_STRING,
+
		PKG_CONFIG_STRING,
		"PLIST_KEYWORDS_DIR",
		NULL,
	},
	[PKG_CONFIG_SYSLOG] = {
-
		CONF_BOOL,
+
		PKG_CONFIG_BOOL,
		"SYSLOG",
		"YES",
	},
	[PKG_CONFIG_SHLIBS] = {
-
		CONF_BOOL,
+
		PKG_CONFIG_BOOL,
		"SHLIBS",
		"NO",
	},
	[PKG_CONFIG_AUTODEPS] = {
-
		CONF_BOOL,
+
		PKG_CONFIG_BOOL,
		"AUTODEPS",
		"NO",
	},
	[PKG_CONFIG_ABI] = {
-
		CONF_STRING,
+
		PKG_CONFIG_STRING,
		"ABI",
		myabi,
	},
	[PKG_CONFIG_DEVELOPER_MODE] = {
-
		CONF_BOOL,
+
		PKG_CONFIG_BOOL,
		"DEVELOPER_MODE",
		"NO",
	},
	[PKG_CONFIG_PORTAUDIT_SITE] = {
-
		CONF_STRING,
+
		PKG_CONFIG_STRING,
		"PORTAUDIT_SITE",
		"http://portaudit.FreeBSD.org/auditfile.tbz",
	},
	[PKG_CONFIG_SRV_MIRROR] = {
-
		CONF_BOOL,
+
		PKG_CONFIG_BOOL,
		"SRV_MIRRORS",
		"YES",
	},
	[PKG_CONFIG_FETCH_RETRY] = {
-
		CONF_INTEGER,
+
		PKG_CONFIG_INTEGER,
		"FETCH_RETRY",
		"3",
	},
	[PKG_CONFIG_PLUGINS_DIR] = {
-
		CONF_STRING,
+
		PKG_CONFIG_STRING,
		"PKG_PLUGINS_DIR",
		PREFIX"/lib/pkg/",
	},
	[PKG_CONFIG_ENABLE_PLUGINS] = {
-
		CONF_BOOL,
+
		PKG_CONFIG_BOOL,
		"PKG_ENABLE_PLUGINS",
		"YES",
	},
	[PKG_CONFIG_PLUGINS] = {
-
		CONF_LIST,
+
		PKG_CONFIG_LIST,
		"PLUGINS",
		"NULL",
	},
	[PKG_CONFIG_DEBUG_SCRIPTS] = {
-
		CONF_BOOL,
+
		PKG_CONFIG_BOOL,
		"DEBUG_SCRIPTS",
		"NO",
	},
	[PKG_CONFIG_PLUGINS_CONF_DIR] = {
-
		CONF_STRING,
+
		PKG_CONFIG_STRING,
		"PLUGINS_CONF_DIR",
		PREFIX"/etc/pkg/",
	},
@@ -257,7 +257,7 @@ pkg_config_parse(yaml_document_t *doc, yaml_node_t *node, struct pkg_config *con
		HASH_FIND(hhkey, conf_by_key, sbuf_data(b), sbuf_len(b), conf);
		if (conf != NULL) {
			switch (conf->type) {
-
			case CONF_STRING:
+
			case PKG_CONFIG_STRING:
				if (val->type != YAML_SCALAR_NODE) {
					pkg_emit_error("Expecting a string for key %s,"
					    " ignoring...", key->data.scalar.value);
@@ -268,7 +268,7 @@ pkg_config_parse(yaml_document_t *doc, yaml_node_t *node, struct pkg_config *con
					conf->string = strdup(val->data.scalar.value);
				}
				break;
-
			case CONF_INTEGER:
+
			case PKG_CONFIG_INTEGER:
				if (val->type != YAML_SCALAR_NODE) {
					pkg_emit_error("Expecting an integer for key %s,"
					    " ignoring...", key->data.scalar.value);
@@ -283,7 +283,7 @@ pkg_config_parse(yaml_document_t *doc, yaml_node_t *node, struct pkg_config *con
					conf->integer = newint;
				}
				break;
-
			case CONF_BOOL:
+
			case PKG_CONFIG_BOOL:
				if (val->type != YAML_SCALAR_NODE) {
					pkg_emit_error("Expecting an integer for key %s,"
					    " ignoring...", key->data.scalar.value);
@@ -301,14 +301,14 @@ pkg_config_parse(yaml_document_t *doc, yaml_node_t *node, struct pkg_config *con
					}
				}
				break;
-
			case CONF_KVLIST:
+
			case PKG_CONFIG_KVLIST:
				if (val->type != YAML_MAPPING_NODE) {
					pkg_emit_error("Expecting a key/value list for key %s,"
					    " ignoring...", key->data.scalar.value);
				}
				parse_config_mapping(doc, val, conf);
				break;
-
			case CONF_LIST:
+
			case PKG_CONFIG_LIST:
				if (val->type != YAML_SEQUENCE_NODE) {
					pkg_emit_error("Expecting a string list for key %s,"
					    " ignoring...", key->data.scalar.value);
@@ -434,7 +434,7 @@ pkg_config_kvlist(pkg_config_key key, struct pkg_config_kv **kv)
	if (conf == NULL)
		return (EPKG_FATAL);

-
	if (conf->type != CONF_KVLIST) {
+
	if (conf->type != PKG_CONFIG_KVLIST) {
		pkg_emit_error("this config entry is not a \"key: value\" list");
		return (EPKG_FATAL);
	}
@@ -464,7 +464,7 @@ pkg_config_list(pkg_config_key key, struct pkg_config_value **v)
	if (conf == NULL)
		return (EPKG_FATAL);

-
	if (conf->type != CONF_LIST) {
+
	if (conf->type != PKG_CONFIG_LIST) {
		pkg_emit_error("this config entry is not a list");
		return (EPKG_FATAL);
	}
@@ -553,7 +553,7 @@ pkg_init(const char *path)
		val = getenv(c[i].key);

		switch (c[i].type) {
-
		case CONF_STRING:
+
		case PKG_CONFIG_STRING:
			if (val != NULL) {
				conf->string = strdup(val);
				conf->fromenv = true;
@@ -563,7 +563,7 @@ pkg_init(const char *path)
			else
				conf->string = NULL;
			break;
-
		case CONF_INTEGER:
+
		case PKG_CONFIG_INTEGER:
			if (val == NULL)
				val = c[i].def;
			else
@@ -575,7 +575,7 @@ pkg_init(const char *path)
				return (EPKG_FATAL);
			}
			break;
-
		case CONF_BOOL:
+
		case PKG_CONFIG_BOOL:
			if (val == NULL)
				val = c[i].def;
			else
@@ -590,10 +590,10 @@ pkg_init(const char *path)
				conf->boolean = false;
			}
			break;
-
		case CONF_KVLIST:
+
		case PKG_CONFIG_KVLIST:
			STAILQ_INIT(&conf->kvlist);
			break;
-
		case CONF_LIST:
+
		case PKG_CONFIG_LIST:
			STAILQ_INIT(&conf->list);
			break;
		}
@@ -649,9 +649,9 @@ pkg_config_free(struct pkg_config *conf)
	if (conf == NULL)
		return;

-
	if (conf->type == CONF_STRING)
+
	if (conf->type == PKG_CONFIG_STRING)
		free(conf->string);
-
	else if (conf->type == CONF_KVLIST) {
+
	else if (conf->type == PKG_CONFIG_KVLIST) {
		while (!STAILQ_EMPTY(&conf->kvlist)) {
			k = STAILQ_FIRST(&conf->kvlist);
			free(k->key);
@@ -659,7 +659,7 @@ pkg_config_free(struct pkg_config *conf)
			STAILQ_REMOVE_HEAD(&conf->kvlist, next);
			free(k);
		}
-
	} else if (conf->type == CONF_LIST) {
+
	} else if (conf->type == PKG_CONFIG_LIST) {
		while (!STAILQ_EMPTY(&conf->kvlist)) {
			v = STAILQ_FIRST(&conf->list);
			free(v->value);
@@ -672,6 +672,30 @@ pkg_config_free(struct pkg_config *conf)
}

int
+
pkg_config_id(struct pkg_config *conf)
+
{
+
	return (conf->id);
+
}
+

+
int
+
pkg_config_type(struct pkg_config *conf)
+
{
+
	return (conf->type);
+
}
+

+
const char *
+
pkg_config_name(struct pkg_config *conf)
+
{
+
	return (conf->key);
+
}
+

+
int
+
pkg_configs(struct pkg_config **conf)
+
{
+
	HASH_NEXT(config, (*conf));
+
}
+

+
int
pkg_shutdown(void)
{
	if (parsed == true) {
modified libpkg/plugins.c
@@ -191,7 +191,7 @@ pkg_plugin_conf_add_string(struct pkg_plugin *p, int id, const char *key, const
	conf = malloc(sizeof(struct pkg_config));
	conf->id = id;
	conf->key = key;
-
	conf->type = CONF_STRING;
+
	conf->type = PKG_CONFIG_STRING;
	conf->fromenv = false;
	val = getenv(key);
	if (val != NULL) {
@@ -231,7 +231,7 @@ pkg_plugin_conf_add_bool(struct pkg_plugin *p, int id, const char *key, bool boo
	conf = malloc(sizeof(struct pkg_config));
	conf->id = id;
	conf->key = key;
-
	conf->type = CONF_STRING;
+
	conf->type = PKG_CONFIG_STRING;
	conf->fromenv = false;
	val = getenv(key);
	if (val != NULL) {
@@ -278,7 +278,7 @@ pkg_plugin_conf_add_integer(struct pkg_plugin *p, int id, const char *key, int64
	conf = malloc(sizeof(struct pkg_config));
	conf->id = id;
	conf->key = key;
-
	conf->type = CONF_STRING;
+
	conf->type = PKG_CONFIG_STRING;
	conf->fromenv = false;
	val = getenv(key);
	if (val != NULL) {
@@ -320,7 +320,7 @@ pkg_plugin_conf_add_kvlist(struct pkg_plugin *p, int id, const char *key)
	conf = malloc(sizeof(struct pkg_config));
	conf->id = id;
	conf->key = key;
-
	conf->type = CONF_KVLIST;
+
	conf->type = PKG_CONFIG_KVLIST;
	STAILQ_INIT(&conf->kvlist);

	HASH_ADD_INT(p->conf, id, conf);
@@ -350,7 +350,7 @@ pkg_plugin_conf_add_list(struct pkg_plugin *p, int id, const char *key)
	conf = malloc(sizeof(struct pkg_config));
	conf->id = id;
	conf->key = key;
-
	conf->type = CONF_LIST;
+
	conf->type = PKG_CONFIG_LIST;
	STAILQ_INIT(&conf->list);

	HASH_ADD_INT(p->conf, id, conf);
@@ -495,7 +495,7 @@ pkg_plugin_conf_kvlist(struct pkg_plugin *p, int key, struct pkg_config_kv **kv)
	if (conf == NULL)
		return (EPKG_FATAL);

-
	if (conf->type != CONF_KVLIST) {
+
	if (conf->type != PKG_CONFIG_KVLIST) {
		pkg_emit_error("this config entry is not a \"key: value\" list");
		return (EPKG_FATAL);
	}
@@ -525,7 +525,7 @@ pkg_plugin_conf_list(struct pkg_plugin *p, int key, struct pkg_config_value **v)
	if (conf == NULL)
		return (EPKG_FATAL);

-
	if (conf->type != CONF_LIST) {
+
	if (conf->type != PKG_CONFIG_LIST) {
		pkg_emit_error("this config entry is not a list");
		return (EPKG_FATAL);
	}
modified libpkg/private/pkg.h
@@ -162,14 +162,6 @@ typedef enum _pkg_job_flags {
	PKG_JOB_FLAGS_DRY_RUN =	(1 << 1),
} pkg_job_flags;

-
enum {
-
	CONF_STRING=0,
-
	CONF_BOOL,
-
	CONF_KVLIST,
-
	CONF_INTEGER,
-
	CONF_LIST
-
};
-

struct pkg_jobs_node {
	struct pkg	*pkg;
	size_t		 nrefs;
modified pkg/main.c
@@ -34,6 +34,7 @@

#include <assert.h>
#include <err.h>
+
#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -205,8 +206,12 @@ main(int argc, char **argv)
	const char *buf = NULL;
	bool b, plugins_enabled = false;
	struct pkg_config_kv *kv = NULL;
+
	struct pkg_config_value *list = NULL;
	struct plugcmd *c;
	struct pkg_plugin *p = NULL;
+
	struct pkg_config *conf = NULL;
+
	const char *configname = NULL;
+
	int64_t integer = 0;

	/* Set stdout unbuffered */
        setvbuf(stdout, NULL, _IONBF, 0);
@@ -293,40 +298,36 @@ main(int argc, char **argv)

	if (version > 1) {
		printf("version: "PKGVERSION""GITHASH"\n");
-
		pkg_config_string(PKG_CONFIG_ABI, &buf);
-
		printf("abi: %s\n", buf);
-
		pkg_config_string(PKG_CONFIG_DBDIR, &buf);
-
		printf("db dir: %s\n", buf);
-
		pkg_config_string(PKG_CONFIG_CACHEDIR, &buf);
-
		printf("cache dir: %s\n", buf);
-
		pkg_config_string(PKG_CONFIG_PORTSDIR, &buf);
-
		printf("ports dir: %s\n", buf);
-
		pkg_config_bool(PKG_CONFIG_SYSLOG, &b);
-
		printf("Log into syslog: %s\n", b ? "yes": "no");
-
		pkg_config_bool(PKG_CONFIG_ASSUME_ALWAYS_YES, &b);
-
		printf("Assume always yes: %s\n", b ? "yes" : "no");
-
		if (version > 2) {
-
			pkg_config_bool(PKG_CONFIG_HANDLE_RC_SCRIPTS, &b);
-
			printf("Handle rc scripts: %s\n", b ? "yes" : "no");
-
			pkg_config_bool(PKG_CONFIG_SHLIBS, &b);
-
			printf("Track shlibs: %s\n", b ? "yes" : "no");
-
			pkg_config_bool(PKG_CONFIG_AUTODEPS, &b);
-
			printf("Automatic dependency tracking: %s\n", b ? "yes": "no");
-
			pkg_config_string(PKG_CONFIG_PLIST_KEYWORDS_DIR, &buf);
-
			printf("Custom keywords directory: %s\n", buf ? buf : "none");
-
			pkg_config_bool(PKG_CONFIG_DEVELOPER_MODE, &b);
-
			printf("Developer mode: %s\n", b ? "yes" : "no");
-
		}
-
		pkg_config_bool(PKG_CONFIG_MULTIREPOS, &b);
-
		if (b) {
-
			printf("Repositories:\n");
-
			while (pkg_config_kvlist(PKG_CONFIG_REPOS, &kv) == EPKG_OK) {
-
				printf("             - %s: %s\n", pkg_config_kv_get(kv, PKG_CONFIG_KV_KEY),
-
				    pkg_config_kv_get(kv, PKG_CONFIG_KV_VALUE));
+
		while (pkg_configs(&conf) == EPKG_OK) {
+
			configname = pkg_config_name(conf);
+
			switch (pkg_config_type(conf)) {
+
			case PKG_CONFIG_STRING:
+
				pkg_config_string(pkg_config_id(conf), &buf);
+
				if (buf == NULL)
+
					buf = "";
+
				printf("%s: %s\n", configname, buf);
+
				break;
+
			case PKG_CONFIG_BOOL:
+
				pkg_config_bool(pkg_config_id(conf), &b);
+
				printf("%s: %s\n", configname, b ? "yes": "no");
+
				break;
+
			case PKG_CONFIG_INTEGER:
+
				pkg_config_int64(pkg_config_id(conf), &integer);
+
				printf("%s: %"PRId64"\n", configname, integer);
+
				break;
+
			case PKG_CONFIG_KVLIST:
+
				printf("%s:\n", configname);
+
				while (pkg_config_kvlist(pkg_config_id(conf), &kv) == EPKG_OK) {
+
					printf("\t- %s: %s\n", pkg_config_kv_get(kv, PKG_CONFIG_KV_KEY),
+
					    pkg_config_kv_get(kv, PKG_CONFIG_KV_VALUE));
+
				}
+
				break;
+
			case PKG_CONFIG_LIST:
+
				printf("%s:\n", configname);
+
				while (pkg_config_list(pkg_config_id(conf), &list) == EPKG_OK) {
+
					printf("\t- %s\n", pkg_config_value(list));
+
				}
			}
-
		} else {
-
			pkg_config_string(PKG_CONFIG_REPO, &buf);
-
			printf("Repository: %s\n", buf ? buf : "none");
		}
		pkg_shutdown();
		pkg_plugins_shutdown();