svn commit: r257145 - in head: etc etc/pkg usr.sbin/pkg
Bryan Drewery
bdrewery at FreeBSD.org
Sat Oct 26 03:31:06 UTC 2013
Author: bdrewery (ports committer)
Date: Sat Oct 26 03:31:05 2013
New Revision: 257145
URL: http://svnweb.freebsd.org/changeset/base/257145
Log:
Add support for reading configuration files from /etc/pkg.
For now only /etc/pkg/FreeBSD.conf is supported. Its style is:
Repo: {
URL: "...",
MIRROR_TYPE: "...",
...
}
The configuration will be read from /usr/local/etc/pkg.conf if exists,
otherwise /etc/pkg/FreeBSD.conf
Approved by: bapt
MFC after: 2 days
Added:
head/etc/pkg/
head/etc/pkg/FreeBSD.conf (contents, props changed)
head/etc/pkg/Makefile (contents, props changed)
Modified:
head/etc/Makefile
head/usr.sbin/pkg/config.c
head/usr.sbin/pkg/config.h
Modified: head/etc/Makefile
==============================================================================
--- head/etc/Makefile Sat Oct 26 03:22:57 2013 (r257144)
+++ head/etc/Makefile Sat Oct 26 03:31:05 2013 (r257145)
@@ -225,6 +225,9 @@ distribution:
${_+_}cd ${.CURDIR}/devd; ${MAKE} install
${_+_}cd ${.CURDIR}/gss; ${MAKE} install
${_+_}cd ${.CURDIR}/periodic; ${MAKE} install
+.if ${MK_PKGBOOTSTRAP} != "no"
+ ${_+_}cd ${.CURDIR}/pkg; ${MAKE} install
+.endif
${_+_}cd ${.CURDIR}/rc.d; ${MAKE} install
${_+_}cd ${.CURDIR}/../gnu/usr.bin/send-pr; ${MAKE} etc-gnats-freefall
${_+_}cd ${.CURDIR}/../share/termcap; ${MAKE} etc-termcap
Added: head/etc/pkg/FreeBSD.conf
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ head/etc/pkg/FreeBSD.conf Sat Oct 26 03:31:05 2013 (r257145)
@@ -0,0 +1,6 @@
+# $FreeBSD$
+FreeBSD: {
+ url: "pkg+http://pkg.freebsd.org/${ABI}/latest",
+ mirror_type: "srv",
+ enabled: "yes"
+}
Added: head/etc/pkg/Makefile
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ head/etc/pkg/Makefile Sat Oct 26 03:31:05 2013 (r257145)
@@ -0,0 +1,10 @@
+# $FreeBSD$
+
+NO_OBJ=
+
+FILES= FreeBSD.conf
+
+FILESDIR= /etc/pkg
+FILESMODE= 644
+
+.include <bsd.prog.mk>
Modified: head/usr.sbin/pkg/config.c
==============================================================================
--- head/usr.sbin/pkg/config.c Sat Oct 26 03:22:57 2013 (r257144)
+++ head/usr.sbin/pkg/config.c Sat Oct 26 03:31:05 2013 (r257145)
@@ -460,7 +460,7 @@ subst_packagesite(const char *abi)
}
static void
-config_parse(yaml_document_t *doc, yaml_node_t *node)
+config_parse(yaml_document_t *doc, yaml_node_t *node, pkg_conf_file_t conftype)
{
yaml_node_pair_t *pair;
yaml_node_t *key, *val;
@@ -495,15 +495,33 @@ config_parse(yaml_document_t *doc, yaml_
}
sbuf_clear(buf);
- for (j = 0; j < strlen(key->data.scalar.value); ++j)
- sbuf_putc(buf, toupper(key->data.scalar.value[j]));
- sbuf_finish(buf);
+ if (conftype == CONFFILE_PKG) {
+ for (j = 0; j < strlen(key->data.scalar.value); ++j)
+ sbuf_putc(buf,
+ toupper(key->data.scalar.value[j]));
+ sbuf_finish(buf);
+ } else if (conftype == CONFFILE_REPO) {
+ /* The CONFFILE_REPO type is more restrictive. Only
+ parse known elements. */
+ if (strcasecmp(key->data.scalar.value, "url") == 0)
+ sbuf_cpy(buf, "PACKAGESITE");
+ else if (strcasecmp(key->data.scalar.value,
+ "mirror_type") == 0)
+ sbuf_cpy(buf, "MIRROR_TYPE");
+ else { /* Skip unknown entries for future use. */
+ ++pair;
+ continue;
+ }
+ sbuf_finish(buf);
+ }
+
for (i = 0; i < CONFIG_SIZE; i++) {
if (strcmp(sbuf_data(buf), c[i].key) == 0)
break;
}
+ /* Silently skip unknown keys to be future compatible. */
if (i == CONFIG_SIZE) {
++pair;
continue;
@@ -522,36 +540,53 @@ config_parse(yaml_document_t *doc, yaml_
sbuf_delete(buf);
}
-int
-config_init(void)
+/*-
+ * Parse new repo style configs in style:
+ * Name:
+ * URL:
+ * MIRROR_TYPE:
+ * etc...
+ */
+static void
+parse_repo_file(yaml_document_t *doc, yaml_node_t *node)
{
- FILE *fp;
- yaml_parser_t parser;
- yaml_document_t doc;
- yaml_node_t *node;
- const char *val;
- int i;
- const char *localbase;
- char confpath[MAXPATHLEN];
- char abi[BUFSIZ];
+ yaml_node_pair_t *pair;
- for (i = 0; i < CONFIG_SIZE; i++) {
- val = getenv(c[i].key);
- if (val != NULL) {
- c[i].val = val;
- c[i].envset = true;
+ pair = node->data.mapping.pairs.start;
+ while (pair < node->data.mapping.pairs.top) {
+ yaml_node_t *key = yaml_document_get_node(doc, pair->key);
+ yaml_node_t *val = yaml_document_get_node(doc, pair->value);
+
+ if (key->data.scalar.length <= 0) {
+ ++pair;
+ continue;
}
+
+ if (val->type != YAML_MAPPING_NODE) {
+ ++pair;
+ continue;
+ }
+
+ config_parse(doc, val, CONFFILE_REPO);
+ ++pair;
}
+}
- localbase = getenv("LOCALBASE") ? getenv("LOCALBASE") : _LOCALBASE;
- snprintf(confpath, sizeof(confpath), "%s/etc/pkg.conf", localbase);
+
+static int
+read_conf_file(const char *confpath, pkg_conf_file_t conftype)
+{
+ FILE *fp;
+ yaml_parser_t parser;
+ yaml_document_t doc;
+ yaml_node_t *node;
if ((fp = fopen(confpath, "r")) == NULL) {
if (errno != ENOENT)
err(EXIT_FAILURE, "Unable to open configuration "
"file %s", confpath);
/* no configuration present */
- goto finalize;
+ return (1);
}
yaml_parser_initialize(&parser);
@@ -560,20 +595,52 @@ config_init(void)
node = yaml_document_get_root_node(&doc);
- if (node != NULL) {
- if (node->type != YAML_MAPPING_NODE)
- warnx("Invalid configuration format, ignoring the "
- "configuration file");
- else
- config_parse(&doc, node);
- } else {
+ if (node == NULL || node->type != YAML_MAPPING_NODE)
warnx("Invalid configuration format, ignoring the "
- "configuration file");
+ "configuration file %s", confpath);
+ else {
+ if (conftype == CONFFILE_PKG)
+ config_parse(&doc, node, conftype);
+ else if (conftype == CONFFILE_REPO)
+ parse_repo_file(&doc, node);
}
yaml_document_delete(&doc);
yaml_parser_delete(&parser);
+ return (0);
+}
+
+int
+config_init(void)
+{
+ const char *val;
+ int i;
+ const char *localbase;
+ char confpath[MAXPATHLEN];
+ char abi[BUFSIZ];
+
+ for (i = 0; i < CONFIG_SIZE; i++) {
+ val = getenv(c[i].key);
+ if (val != NULL) {
+ c[i].val = val;
+ c[i].envset = true;
+ }
+ }
+
+ localbase = getenv("LOCALBASE") ? getenv("LOCALBASE") : _LOCALBASE;
+ snprintf(confpath, sizeof(confpath), "%s/etc/pkg.conf",
+ localbase);
+
+ if (access(confpath, F_OK) == 0 && read_conf_file(confpath,
+ CONFFILE_PKG))
+ goto finalize;
+
+ snprintf(confpath, sizeof(confpath), "/etc/pkg/FreeBSD.conf");
+ if (access(confpath, F_OK) == 0 && read_conf_file(confpath,
+ CONFFILE_REPO))
+ goto finalize;
+
finalize:
if (c[ABI].val == NULL && c[ABI].value == NULL) {
if (pkg_get_myabi(abi, BUFSIZ) != 0)
Modified: head/usr.sbin/pkg/config.h
==============================================================================
--- head/usr.sbin/pkg/config.h Sat Oct 26 03:22:57 2013 (r257144)
+++ head/usr.sbin/pkg/config.h Sat Oct 26 03:31:05 2013 (r257145)
@@ -45,6 +45,11 @@ typedef enum {
PKG_CONFIG_BOOL,
} pkg_config_t;
+typedef enum {
+ CONFFILE_PKG=0,
+ CONFFILE_REPO,
+} pkg_conf_file_t;
+
int config_init(void);
void config_finish(void);
int config_string(pkg_config_key, const char **);
More information about the svn-src-all
mailing list