Index: usr.sbin/pkg/pkg.c =================================================================== --- usr.sbin/pkg/pkg.c +++ usr.sbin/pkg/pkg.c @@ -85,6 +85,9 @@ STAILQ_HEAD(fingerprint_list, fingerprint); +static const char *extensions[6] = { ".txz", ".tzst", ".tbz", ".tgz", ".tar", + ".bsd" }; + static int extract_pkg_static(int fd, char *p, int sz) { @@ -831,10 +834,12 @@ bootstrap_pkg(bool force) { int fd_pkg, fd_sig; + unsigned int i; int ret; char url[MAXPATHLEN]; char tmppkg[MAXPATHLEN]; char tmpsig[MAXPATHLEN]; + char packagename[MAXPATHLEN]; const char *packagesite; const char *signature_type; char pkgstatic[MAXPATHLEN]; @@ -860,58 +865,74 @@ if (strncmp(URL_SCHEME_PREFIX, packagesite, strlen(URL_SCHEME_PREFIX)) == 0) packagesite += strlen(URL_SCHEME_PREFIX); - snprintf(url, MAXPATHLEN, "%s/Latest/pkg.txz", packagesite); - snprintf(tmppkg, MAXPATHLEN, "%s/pkg.txz.XXXXXX", - getenv("TMPDIR") ? getenv("TMPDIR") : _PATH_TMP); + for (i = 0; i < nitems(extensions); i++) { + snprintf(packagename, MAXPATHLEN, "pkg%s", extensions[i]); + snprintf( + url, MAXPATHLEN, "%s/Latest/%s", packagesite, packagename); - if ((fd_pkg = fetch_to_fd(url, tmppkg)) == -1) - goto fetchfail; + snprintf(tmppkg, MAXPATHLEN, "%s/%s.XXXXXX", + getenv("TMPDIR") ? getenv("TMPDIR") : _PATH_TMP, + packagename); - if (signature_type != NULL && - strcasecmp(signature_type, "NONE") != 0) { - if (strcasecmp(signature_type, "FINGERPRINTS") == 0) { + if ((fd_pkg = fetch_to_fd(url, tmppkg)) == -1) + continue; - snprintf(tmpsig, MAXPATHLEN, "%s/pkg.txz.sig.XXXXXX", - getenv("TMPDIR") ? getenv("TMPDIR") : _PATH_TMP); - snprintf(url, MAXPATHLEN, "%s/Latest/pkg.txz.sig", - packagesite); + if (signature_type != NULL && + strcasecmp(signature_type, "NONE") != 0) { + if (strcasecmp(signature_type, "FINGERPRINTS") == 0) { + + snprintf(tmpsig, MAXPATHLEN, "%s/%s.sig.XXXXXX", + getenv("TMPDIR") ? getenv("TMPDIR") : + _PATH_TMP, + packagename); + snprintf(url, MAXPATHLEN, "%s/Latest/%s.sig", + packagesite, packagename); + + if ((fd_sig = fetch_to_fd(url, tmpsig)) == -1) { + fprintf(stderr, + "Signature for pkg not " + "available.\n"); + goto fetchfail; + } - if ((fd_sig = fetch_to_fd(url, tmpsig)) == -1) { - fprintf(stderr, "Signature for pkg not " - "available.\n"); - goto fetchfail; - } + if (verify_signature(fd_pkg, fd_sig) == false) + goto cleanup; + } else if (strcasecmp(signature_type, "PUBKEY") == 0) { + + snprintf(tmpsig, MAXPATHLEN, + "%s/%s.pubkeysig.XXXXXX", + getenv("TMPDIR") ? getenv("TMPDIR") : + _PATH_TMP, + packagename); + snprintf(url, MAXPATHLEN, + "%s/Latest/%s.pubkeysig", packagesite, + packagename); + + if ((fd_sig = fetch_to_fd(url, tmpsig)) == -1) { + fprintf(stderr, + "Signature for pkg not " + "available.\n"); + goto fetchfail; + } - if (verify_signature(fd_pkg, fd_sig) == false) + if (verify_pubsignature(fd_pkg, fd_sig) == + false) + goto cleanup; + } else { + warnx("Signature type %s is not supported for " + "bootstrapping.", + signature_type); goto cleanup; - } else if (strcasecmp(signature_type, "PUBKEY") == 0) { - - snprintf(tmpsig, MAXPATHLEN, - "%s/pkg.txz.pubkeysig.XXXXXX", - getenv("TMPDIR") ? getenv("TMPDIR") : _PATH_TMP); - snprintf(url, MAXPATHLEN, "%s/Latest/pkg.txz.pubkeysig", - packagesite); - - if ((fd_sig = fetch_to_fd(url, tmpsig)) == -1) { - fprintf(stderr, "Signature for pkg not " - "available.\n"); - goto fetchfail; } - - if (verify_pubsignature(fd_pkg, fd_sig) == false) - goto cleanup; - } else { - warnx("Signature type %s is not supported for " - "bootstrapping.", signature_type); - goto cleanup; } - } - if ((ret = extract_pkg_static(fd_pkg, pkgstatic, MAXPATHLEN)) == 0) - ret = install_pkg_static(pkgstatic, tmppkg, force); + if ((ret = extract_pkg_static(fd_pkg, pkgstatic, MAXPATHLEN)) == + 0) + ret = install_pkg_static(pkgstatic, tmppkg, force); - goto cleanup; + goto cleanup; + } fetchfail: warnx("Error fetching %s: %s", url, fetchLastErrString);