Changeset View
Changeset View
Standalone View
Standalone View
usr.sbin/pkg/pkg.c
Show First 20 Lines • Show All 78 Lines • ▼ Show 20 Lines | |||||
struct fingerprint { | struct fingerprint { | ||||
hash_t type; | hash_t type; | ||||
char *name; | char *name; | ||||
char hash[BUFSIZ]; | char hash[BUFSIZ]; | ||||
STAILQ_ENTRY(fingerprint) next; | STAILQ_ENTRY(fingerprint) next; | ||||
}; | }; | ||||
static const char *bootstrap_names [] = { | |||||
"pkg.bsd", | |||||
"pkg.txz", | |||||
NULL | |||||
}; | |||||
STAILQ_HEAD(fingerprint_list, fingerprint); | STAILQ_HEAD(fingerprint_list, fingerprint); | ||||
static int | static int | ||||
extract_pkg_static(int fd, char *p, int sz) | extract_pkg_static(int fd, char *p, int sz) | ||||
{ | { | ||||
struct archive *a; | struct archive *a; | ||||
struct archive_entry *ae; | struct archive_entry *ae; | ||||
char *end; | char *end; | ||||
▲ Show 20 Lines • Show All 736 Lines • ▼ Show 20 Lines | bootstrap_pkg(bool force, const char *fetchOpts) | ||||
int fd_pkg, fd_sig; | int fd_pkg, fd_sig; | ||||
int ret; | int ret; | ||||
char url[MAXPATHLEN]; | char url[MAXPATHLEN]; | ||||
char tmppkg[MAXPATHLEN]; | char tmppkg[MAXPATHLEN]; | ||||
char tmpsig[MAXPATHLEN]; | char tmpsig[MAXPATHLEN]; | ||||
const char *packagesite; | const char *packagesite; | ||||
const char *signature_type; | const char *signature_type; | ||||
char pkgstatic[MAXPATHLEN]; | char pkgstatic[MAXPATHLEN]; | ||||
const char *bootstrap_name; | |||||
fd_sig = -1; | fd_sig = -1; | ||||
ret = -1; | ret = -1; | ||||
if (config_string(PACKAGESITE, &packagesite) != 0) { | if (config_string(PACKAGESITE, &packagesite) != 0) { | ||||
warnx("No PACKAGESITE defined"); | warnx("No PACKAGESITE defined"); | ||||
return (-1); | return (-1); | ||||
} | } | ||||
if (config_string(SIGNATURE_TYPE, &signature_type) != 0) { | if (config_string(SIGNATURE_TYPE, &signature_type) != 0) { | ||||
warnx("Error looking up SIGNATURE_TYPE"); | warnx("Error looking up SIGNATURE_TYPE"); | ||||
return (-1); | return (-1); | ||||
} | } | ||||
printf("Bootstrapping pkg from %s, please wait...\n", packagesite); | printf("Bootstrapping pkg from %s, please wait...\n", packagesite); | ||||
/* Support pkg+http:// for PACKAGESITE which is the new format | /* Support pkg+http:// for PACKAGESITE which is the new format | ||||
in 1.2 to avoid confusion on why http://pkg.FreeBSD.org has | in 1.2 to avoid confusion on why http://pkg.FreeBSD.org has | ||||
no A record. */ | no A record. */ | ||||
if (strncmp(URL_SCHEME_PREFIX, packagesite, | if (strncmp(URL_SCHEME_PREFIX, packagesite, | ||||
strlen(URL_SCHEME_PREFIX)) == 0) | strlen(URL_SCHEME_PREFIX)) == 0) | ||||
packagesite += strlen(URL_SCHEME_PREFIX); | packagesite += strlen(URL_SCHEME_PREFIX); | ||||
snprintf(url, MAXPATHLEN, "%s/Latest/pkg.txz", packagesite); | for (int j = 0; bootstrap_names[j] != NULL; j++) { | ||||
bootstrap_name = bootstrap_names[j]; | |||||
snprintf(tmppkg, MAXPATHLEN, "%s/pkg.txz.XXXXXX", | snprintf(url, MAXPATHLEN, "%s/Latest/%s", packagesite, bootstrap_name); | ||||
getenv("TMPDIR") ? getenv("TMPDIR") : _PATH_TMP); | snprintf(tmppkg, MAXPATHLEN, "%s/%s.XXXXXX", | ||||
getenv("TMPDIR") ? getenv("TMPDIR") : _PATH_TMP, | |||||
if ((fd_pkg = fetch_to_fd(url, tmppkg, fetchOpts)) == -1) | bootstrap_name); | ||||
if ((fd_pkg = fetch_to_fd(url, tmppkg, fetchOpts)) != -1) | |||||
break; | |||||
bootstrap_name = NULL; | |||||
} | |||||
if (bootstrap_name == NULL) | |||||
goto fetchfail; | goto fetchfail; | ||||
if (signature_type != NULL && | if (signature_type != NULL && | ||||
strcasecmp(signature_type, "NONE") != 0) { | strcasecmp(signature_type, "NONE") != 0) { | ||||
if (strcasecmp(signature_type, "FINGERPRINTS") == 0) { | if (strcasecmp(signature_type, "FINGERPRINTS") == 0) { | ||||
snprintf(tmpsig, MAXPATHLEN, "%s/pkg.txz.sig.XXXXXX", | snprintf(tmpsig, MAXPATHLEN, "%s/%s.sig.XXXXXX", | ||||
getenv("TMPDIR") ? getenv("TMPDIR") : _PATH_TMP); | getenv("TMPDIR") ? getenv("TMPDIR") : _PATH_TMP, | ||||
snprintf(url, MAXPATHLEN, "%s/Latest/pkg.txz.sig", | bootstrap_name); | ||||
packagesite); | snprintf(url, MAXPATHLEN, "%s/Latest/%s.sig", | ||||
packagesite, bootstrap_name); | |||||
if ((fd_sig = fetch_to_fd(url, tmpsig, fetchOpts)) == -1) { | if ((fd_sig = fetch_to_fd(url, tmpsig, fetchOpts)) == -1) { | ||||
fprintf(stderr, "Signature for pkg not " | fprintf(stderr, "Signature for pkg not " | ||||
"available.\n"); | "available.\n"); | ||||
goto fetchfail; | goto fetchfail; | ||||
} | } | ||||
if (verify_signature(fd_pkg, fd_sig) == false) | if (verify_signature(fd_pkg, fd_sig) == false) | ||||
goto cleanup; | goto cleanup; | ||||
} else if (strcasecmp(signature_type, "PUBKEY") == 0) { | } else if (strcasecmp(signature_type, "PUBKEY") == 0) { | ||||
snprintf(tmpsig, MAXPATHLEN, | snprintf(tmpsig, MAXPATHLEN, | ||||
"%s/pkg.txz.pubkeysig.XXXXXX", | "%s/%s.pubkeysig.XXXXXX", | ||||
getenv("TMPDIR") ? getenv("TMPDIR") : _PATH_TMP); | getenv("TMPDIR") ? getenv("TMPDIR") : _PATH_TMP, | ||||
snprintf(url, MAXPATHLEN, "%s/Latest/pkg.txz.pubkeysig", | bootstrap_name); | ||||
packagesite); | snprintf(url, MAXPATHLEN, "%s/Latest/%s.pubkeysig", | ||||
packagesite, bootstrap_name); | |||||
if ((fd_sig = fetch_to_fd(url, tmpsig, fetchOpts)) == -1) { | if ((fd_sig = fetch_to_fd(url, tmpsig, fetchOpts)) == -1) { | ||||
fprintf(stderr, "Signature for pkg not " | fprintf(stderr, "Signature for pkg not " | ||||
"available.\n"); | "available.\n"); | ||||
goto fetchfail; | goto fetchfail; | ||||
} | } | ||||
if (verify_pubsignature(fd_pkg, fd_sig) == false) | if (verify_pubsignature(fd_pkg, fd_sig) == false) | ||||
▲ Show 20 Lines • Show All 314 Lines • Show Last 20 Lines |