aboutsummaryrefslogtreecommitdiff
path: root/usr.sbin/pkg
diff options
context:
space:
mode:
authorKyle Evans <kevans@FreeBSD.org>2021-02-18 03:41:53 +0000
committerKyle Evans <kevans@FreeBSD.org>2021-08-26 17:28:38 +0000
commit48ac2697742ed4e0beed3f074af41b7a9e21b662 (patch)
treecd2ef39f24d75b73c3de96a96a68a991034a730d /usr.sbin/pkg
parente70e1b132ee88611b2ea8e849811c73ee600cea9 (diff)
pkg: allow multiple add arguments again
While pkg(7) add only handles a single 'add' argument, pkg-add(8) fully handles multiple arguments. Stop rejecting it, just turn off local-bootstrap mode and proceed to remote bootstrap if we need it. While we're here, check if the first argument to pkg add is even a pkg package. If it's not, also do remote bootstrap instead. Future work could improve this altogether by picking out a pkg package out of many and local bootstrap then pass the rest through to the newly installed pkg. (cherry picked from commit 40b9f924b189ce8fa871db600b4abc99b03c6a65)
Diffstat (limited to 'usr.sbin/pkg')
-rw-r--r--usr.sbin/pkg/pkg.c54
1 files changed, 50 insertions, 4 deletions
diff --git a/usr.sbin/pkg/pkg.c b/usr.sbin/pkg/pkg.c
index 8193dc79a430..1196c78e5cc9 100644
--- a/usr.sbin/pkg/pkg.c
+++ b/usr.sbin/pkg/pkg.c
@@ -1056,6 +1056,40 @@ cleanup:
return (ret);
}
+#define PKG_NAME "pkg"
+#define PKG_DEVEL_NAME PKG_NAME "-devel"
+#define PKG_PKG PKG_NAME "."
+
+static bool
+pkg_is_pkg_pkg(const char *pkg)
+{
+ char *vstart;
+ size_t namelen;
+
+ /*
+ * Chop off the final "-" (version delimiter) and check the name that
+ * precedes it. If we didn't have a version delimiter, it must be the
+ * pkg.$archive short form but we'll check it anyways. pkg-devel short
+ * form will look like a pkg archive with 'devel' version, but that's
+ * OK. We otherwise assumed that non-pkg packages will always have a
+ * version component.
+ */
+ vstart = strrchr(pkg, '-');
+ if (vstart == NULL) {
+ return (strlen(pkg) > sizeof(PKG_PKG) - 1 &&
+ strncmp(pkg, PKG_PKG, sizeof(PKG_PKG) - 1) == 0);
+ }
+
+ namelen = vstart - pkg;
+ if (namelen == sizeof(PKG_NAME) - 1 &&
+ strncmp(pkg, PKG_NAME, sizeof(PKG_NAME) - 1) == 0)
+ return (true);
+ if (namelen == sizeof(PKG_DEVEL_NAME) - 1 &&
+ strncmp(pkg, PKG_DEVEL_NAME, sizeof(PKG_DEVEL_NAME) - 1) == 0)
+ return (true);
+ return (false);
+}
+
int
main(int argc, char *argv[])
{
@@ -1159,13 +1193,25 @@ main(int argc, char *argv[])
fprintf(stderr, args_bootstrap_message);
exit(EXIT_FAILURE);
}
- // For add, we accept exactly one further argument
else if (add_pkg && pkgarg != NULL) {
- fprintf(stderr, args_add_message);
- exit(EXIT_FAILURE);
+ /*
+ * Additional arguments also means it's not a
+ * local bootstrap request.
+ */
+ add_pkg = false;
}
else if (add_pkg) {
- pkgarg = argv[optind-1];
+ /*
+ * If it's not a request for pkg or pkg-devel,
+ * then we must assume they were trying to
+ * install some other local package and we
+ * should try to bootstrap from the repo.
+ */
+ if (!pkg_is_pkg_pkg(argv[optind-1])) {
+ add_pkg = false;
+ } else {
+ pkgarg = argv[optind-1];
+ }
}
break;
default: