summaryrefslogtreecommitdiffstats
path: root/usr.sbin/pkg/pkg.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr.sbin/pkg/pkg.c')
-rw-r--r--usr.sbin/pkg/pkg.c48
1 files changed, 40 insertions, 8 deletions
diff --git a/usr.sbin/pkg/pkg.c b/usr.sbin/pkg/pkg.c
index 8dc7bcf..061008c 100644
--- a/usr.sbin/pkg/pkg.c
+++ b/usr.sbin/pkg/pkg.c
@@ -48,9 +48,10 @@ __FBSDID("$FreeBSD$");
#include <unistd.h>
#include "elf_tables.h"
+#include "dns_utils.h"
#define _LOCALBASE "/usr/local"
-#define _PKGS_URL "http://pkgbeta.FreeBSD.org"
+#define _PKGS_URL "http://pkg.FreeBSD.org"
static const char *
elf_corres_to_string(struct _elf_corres *m, int e)
@@ -281,16 +282,20 @@ install_pkg_static(char *path, char *pkgpath)
static int
bootstrap_pkg(void)
{
+ struct url *u;
FILE *remote;
FILE *config;
char *site;
+ struct dns_srvinfo *mirrors, *current;
+ /* To store _https._tcp. + hostname + \0 */
+ char zone[MAXHOSTNAMELEN + 13];
char url[MAXPATHLEN];
char conf[MAXPATHLEN];
char abi[BUFSIZ];
char tmppkg[MAXPATHLEN];
char buf[10240];
char pkgstatic[MAXPATHLEN];
- int fd, retry, ret;
+ int fd, retry, ret, max_retry;
struct url_stat st;
off_t done, r;
time_t now;
@@ -298,9 +303,11 @@ bootstrap_pkg(void)
done = 0;
last = 0;
+ max_retry = 3;
ret = -1;
remote = NULL;
config = NULL;
+ current = mirrors = NULL;
printf("Bootstrapping pkg please wait\n");
@@ -324,12 +331,37 @@ bootstrap_pkg(void)
return (-1);
}
- retry = 3;
- do {
- remote = fetchXGetURL(url, &st, "");
- if (remote == NULL)
- sleep(1);
- } while (remote == NULL && retry-- > 0);
+ retry = max_retry;
+
+ u = fetchParseURL(url);
+ while (remote == NULL) {
+ if (retry == max_retry) {
+ if (strcmp(u->scheme, "file") != 0) {
+ snprintf(zone, sizeof(zone),
+ "_%s._tcp.%s", u->scheme, u->host);
+ printf("%s\n", zone);
+ mirrors = dns_getsrvinfo(zone);
+ current = mirrors;
+ }
+ }
+
+ if (mirrors != NULL)
+ strlcpy(u->host, current->host, sizeof(u->host));
+
+ remote = fetchXGet(u, &st, "");
+ if (remote == NULL) {
+ --retry;
+ if (retry <= 0)
+ goto fetchfail;
+ if (mirrors == NULL) {
+ sleep(1);
+ } else {
+ current = current->next;
+ if (current == NULL)
+ current = mirrors;
+ }
+ }
+ }
if (remote == NULL)
goto fetchfail;
OpenPOWER on IntegriCloud