Page MenuHomeFreeBSD

D28524.id83503.diff
No OneTemporary

D28524.id83503.diff

Index: usr.sbin/pkg/config.h
===================================================================
--- usr.sbin/pkg/config.h
+++ usr.sbin/pkg/config.h
@@ -58,7 +58,7 @@
CONFFILE_REPO,
} pkg_conf_file_t;
-int config_init(void);
+int config_init(const char *);
void config_finish(void);
int config_string(pkg_config_key, const char **);
int config_bool(pkg_config_key, bool *);
Index: usr.sbin/pkg/config.c
===================================================================
--- usr.sbin/pkg/config.c
+++ usr.sbin/pkg/config.c
@@ -322,7 +322,7 @@
* etc...
*/
static void
-parse_repo_file(ucl_object_t *obj)
+parse_repo_file(ucl_object_t *obj, const char *requested_repo)
{
ucl_object_iter_t it = NULL;
const ucl_object_t *cur;
@@ -337,13 +337,17 @@
if (cur->type != UCL_OBJECT)
continue;
+ if (requested_repo != NULL && strcmp(requested_repo, key) != 0)
+ continue;
+
config_parse(cur, CONFFILE_REPO);
}
}
static int
-read_conf_file(const char *confpath, pkg_conf_file_t conftype)
+read_conf_file(const char *confpath, const char *requested_conf,
+ pkg_conf_file_t conftype)
{
struct ucl_parser *p;
ucl_object_t *obj = NULL;
@@ -367,7 +371,7 @@
if (conftype == CONFFILE_PKG)
config_parse(obj, conftype);
else if (conftype == CONFFILE_REPO)
- parse_repo_file(obj);
+ parse_repo_file(obj, requested_conf);
}
ucl_object_unref(obj);
@@ -377,7 +381,7 @@
}
static int
-load_repositories(const char *repodir)
+load_repositories(const char *repodir, const char *requested_repo)
{
struct dirent *ent;
DIR *d;
@@ -401,8 +405,10 @@
repodir,
repodir[strlen(repodir) - 1] == '/' ? "" : "/",
ent->d_name);
- if (access(path, F_OK) == 0 &&
- read_conf_file(path, CONFFILE_REPO)) {
+ if (access(path, F_OK) != 0)
+ continue;
+ if (read_conf_file(path, requested_repo,
+ CONFFILE_REPO)) {
ret = 1;
goto cleanup;
}
@@ -416,7 +422,7 @@
}
int
-config_init(void)
+config_init(const char *requested_repo)
{
char *val;
int i;
@@ -457,7 +463,7 @@
localbase = getlocalbase();
snprintf(confpath, sizeof(confpath), "%s/etc/pkg.conf", localbase);
- if (access(confpath, F_OK) == 0 && read_conf_file(confpath,
+ if (access(confpath, F_OK) == 0 && read_conf_file(confpath, NULL,
CONFFILE_PKG))
goto finalize;
@@ -475,7 +481,7 @@
}
STAILQ_FOREACH(cv, c[REPOS_DIR].list, next)
- if (load_repositories(cv->value))
+ if (load_repositories(cv->value, requested_repo))
goto finalize;
finalize:
Index: usr.sbin/pkg/pkg.7
===================================================================
--- usr.sbin/pkg/pkg.7
+++ usr.sbin/pkg/pkg.7
@@ -24,7 +24,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd December 31, 2020
+.Dd February 7, 2021
.Dt PKG 7
.Os
.Sh NAME
@@ -36,6 +36,7 @@
.Nm
add
.Op Fl f
+.Op Fl r Ar reponame
.Op Fl y
.Ao Pa pkg.txz Ac
.Nm
@@ -44,6 +45,7 @@
.Op Fl 4 | Fl 6
bootstrap
.Op Fl f
+.Op Fl r Ar reponame
.Op Fl y
.Sh DESCRIPTION
.Nm
@@ -68,7 +70,7 @@
installed, and then have the original command forwarded to it.
If already installed, the command requested will be forwarded to the real
.Xr pkg 8 .
-.It Nm Li add Oo Fl f Oc Oo Fl y Oc Ao Pa pkg.txz Ac
+.It Nm Li add Oo Fl f Oc Oo Fl r Ar reponame Oc Oo Fl y Oc Ao Pa pkg.txz Ac
Install
.Xr pkg 8
from a local package instead of fetching from remote.
@@ -83,13 +85,19 @@
.Fl y
flag is specified, no confirmation will be asked when bootstrapping
.Xr pkg 8 .
+.Pp
+If a
+.Ar reponame
+has been specified, then the signature configuration for that repository will be
+used.
.It Nm Fl N
Do not bootstrap, just determine if
.Xr pkg 8
is actually installed or not.
Returns 0 and the number of packages installed
if it is, otherwise 1.
-.It Nm Oo Fl 4 | Fl 6 Oc Li bootstrap Oo Fl f Oc Oo Fl y Oc
+.It Nm Oo Fl 4 | Fl 6 Oc Li bootstrap Oo Fl f Oc \
+Oo Fl r Ar reponame Oc Oo Fl y Oc
Attempt to bootstrap and do not forward anything to
.Xr pkg 8
after it is installed.
@@ -110,14 +118,30 @@
.Fl y
flag is specified, no confirmation will be asked when bootstrapping
.Xr pkg 8 .
+.Pp
+If a
+.Ar reponame
+has been specified, then the configuration for that repository will be used.
.El
.Sh CONFIGURATION
Configuration varies in whether it is in a repository configuration file
or the global configuration file.
+The default repository configuration for
+.Fx
+is stored in
+.Pa /etc/pkg/FreeBSD.conf ,
+and additional repository configuration files will be searched for in
+.Ev REPOS_DIR ,
+or
+.Pa /usr/local/etc/pkg/repos
+if it is unset.
.Pp
-Repository configuration can be stored in
-.Pa /etc/pkg/FreeBSD.conf
-in the following format:
+For bootstrapping,
+.Nm
+will process all repositories that it finds and use the last enabled repository
+by default.
+.Pp
+Repository configuration is stored in the following format:
.Bd -literal -offset indent
FreeBSD: {
url: "pkg+http://pkg.FreeBSD.org/${ABI}/latest",
@@ -127,6 +151,7 @@
enabled: yes
}
.Ed
+.Pp
.Bl -tag -width signature_type -compact
.It url
Refer to
Index: usr.sbin/pkg/pkg.c
===================================================================
--- usr.sbin/pkg/pkg.c
+++ usr.sbin/pkg/pkg.c
@@ -1045,7 +1045,7 @@
main(int argc, char *argv[])
{
char pkgpath[MAXPATHLEN];
- const char *pkgarg;
+ const char *pkgarg, *repo_name;
bool activation_test, add_pkg, bootstrap_only, force, yes;
signed char ch;
const char *fetchOpts;
@@ -1058,6 +1058,7 @@
fetchOpts = "";
force = false;
pkgarg = NULL;
+ repo_name = NULL;
yes = false;
struct option longopts[] = {
@@ -1070,7 +1071,7 @@
snprintf(pkgpath, MAXPATHLEN, "%s/sbin/pkg", getlocalbase());
- while ((ch = getopt_long(argc, argv, "-:fyN46", longopts, NULL)) != -1) {
+ while ((ch = getopt_long(argc, argv, "-:fr::yN46", longopts, NULL)) != -1) {
switch (ch) {
case 'f':
force = true;
@@ -1087,6 +1088,46 @@
case '6':
fetchOpts = "6";
break;
+ case 'r':
+ /*
+ * The repository can only be specified for an explicit
+ * bootstrap request at this time, so that we don't
+ * confuse the user if they're trying to use a verb that
+ * has some other conflicting meaning but we need to
+ * bootstrap.
+ *
+ * For that reason, we specify that -r has an optional
+ * argument above and process the next index ourselves.
+ * This is mostly significant because getopt(3) will
+ * otherwise eat the next argument, which could be
+ * something we need to try and make sense of.
+ *
+ * At worst this gets us false positives that we ignore
+ * in other contexts, and we have to do a little fudging
+ * in order to support separating -r from the reponame
+ * with a space since it's not actually optional in
+ * the bootstrap/add sense.
+ */
+ if (add_pkg || bootstrap_only) {
+ if (optarg != NULL) {
+ repo_name = optarg;
+ } else if (optind < argc) {
+ repo_name = argv[optind];
+ }
+
+ if (repo_name == NULL || *repo_name == '\0') {
+ fprintf(stderr,
+ "Must specify a repository with -r!\n");
+ exit(EXIT_FAILURE);
+ }
+
+ if (optarg == NULL) {
+ /* Advance past repo name. */
+ optreset = 1;
+ optind++;
+ }
+ }
+ break;
case 1:
// Non-option arguments, first one is the command
if (command == NULL) {
@@ -1126,7 +1167,7 @@
if (activation_test)
errx(EXIT_FAILURE, "pkg is not installed");
- config_init();
+ config_init(repo_name);
if (add_pkg) {
if (pkgarg == NULL) {

File Metadata

Mime Type
text/plain
Expires
Fri, Nov 8, 7:32 PM (19 h, 57 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
14541382
Default Alt Text
D28524.id83503.diff (7 KB)

Event Timeline