svn commit: r334333 - in head/ports-mgmt/pkg: . files
Bryan Drewery
bdrewery at FreeBSD.org
Tue Nov 19 17:30:15 UTC 2013
Author: bdrewery
Date: Tue Nov 19 17:30:14 2013
New Revision: 334333
URL: http://svnweb.freebsd.org/changeset/ports/334333
Log:
- Update to 1.1.4_10 ahead of 1.2 update with critical fixes
Changes:
* When using SRV mirrors, order the mirrors by the advertised
priority and weight. This should fix 'pkg update' using mirror
A while 'pkg upgrade' and 'pkg fetch' end up using mirrors
A, B and C, resulting in checksum errors due to not all mirrors
being updated at the same time.
* Add support for 'pkg+http://' URL scheme and deprecate
'http://' when using SRV mirroring. This is only a cosmetic change
that encourages users to not try loading the PACKAGESITE into
a browser to view it.
Discussed with: bapt
With hat: portmgr
Obtained from: upstream git
Added:
head/ports-mgmt/pkg/files/patch-libpkg__dns_utils.c (contents, props changed)
head/ports-mgmt/pkg/files/patch-libpkg__fetch.c (contents, props changed)
head/ports-mgmt/pkg/files/patch-libpkg__private__utils.h (contents, props changed)
Modified:
head/ports-mgmt/pkg/Makefile
Modified: head/ports-mgmt/pkg/Makefile
==============================================================================
--- head/ports-mgmt/pkg/Makefile Tue Nov 19 17:13:22 2013 (r334332)
+++ head/ports-mgmt/pkg/Makefile Tue Nov 19 17:30:14 2013 (r334333)
@@ -2,7 +2,7 @@
PORTNAME= pkg
DISTVERSION= 1.1.4
-PORTREVISION= 9
+PORTREVISION= 10
CATEGORIES= ports-mgmt
MASTER_SITES= http://files.etoilebsd.net/pkg/ \
http://mirror.shatow.net/freebsd/${PORTNAME}/ \
Added: head/ports-mgmt/pkg/files/patch-libpkg__dns_utils.c
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ head/ports-mgmt/pkg/files/patch-libpkg__dns_utils.c Tue Nov 19 17:30:14 2013 (r334333)
@@ -0,0 +1,108 @@
+--- ./libpkg/dns_utils.c.orig 2013-07-06 05:48:19.000000000 -0500
++++ ./libpkg/dns_utils.c 2013-11-19 11:13:45.349130754 -0600
+@@ -40,6 +40,65 @@
+ unsigned char buf[1024];
+ } query_t;
+
++static int
++srv_priority_cmp(const void *a, const void *b)
++{
++ const struct dns_srvinfo *da, *db;
++
++ da = *(struct dns_srvinfo * const *)a;
++ db = *(struct dns_srvinfo * const *)b;
++
++ return ((da->priority > db->priority) - (da->priority < db->priority));
++}
++
++static int
++srv_final_cmp(const void *a, const void *b)
++{
++ const struct dns_srvinfo *da, *db;
++ int res;
++
++ da = *(struct dns_srvinfo * const *)a;
++ db = *(struct dns_srvinfo * const *)b;
++
++ res = ((da->priority > db->priority) - (da->priority < db->priority));
++ if (res == 0)
++ res = ((db->finalweight > da->finalweight) - (db->finalweight < da->finalweight));
++
++ return (res);
++}
++
++static void
++compute_weight(struct dns_srvinfo **d, int first, int last)
++{
++ int i, j;
++ int totalweight = 0;
++ int *chosen;
++
++ for (i = 0; i <= last; i++)
++ totalweight += d[i]->weight;
++
++ if (totalweight == 0)
++ return;
++
++ chosen = malloc(sizeof(int) * (last - first + 1));
++
++ for (i = 0; i <= last; i++) {
++ for (;;) {
++ chosen[i] = random() % (d[i]->weight * 100 / totalweight);
++ for (j = 0; j < i; j++) {
++ if (chosen[i] == chosen[j])
++ break;
++ }
++ if (j == i) {
++ d[i]->finalweight = chosen[i];
++ break;
++ }
++ }
++ }
++
++ free(chosen);
++}
++
+ struct dns_srvinfo *
+ dns_getsrvinfo(const char *zone)
+ {
+@@ -49,6 +108,7 @@
+ struct dns_srvinfo **res, *first;
+ unsigned char *end, *p;
+ unsigned int type, class, ttl, priority, weight, port;
++ int f, l;
+
+ if ((len = res_query(zone, C_IN, T_SRV, q.buf, sizeof(q.buf))) == -1 ||
+ len < (int)sizeof(HEADER))
+@@ -120,12 +180,31 @@
+ res[n]->weight = weight;
+ res[n]->port = port;
+ res[n]->next = NULL;
++ res[n]->finalweight = 0;
+ strlcpy(res[n]->host, host, MAXHOSTNAMELEN);
+
+ p += len;
+ n++;
+ }
+
++ /* order by priority */
++ qsort(res, n, sizeof(res[0]), srv_priority_cmp);
++
++ priority = 0;
++ f = 0;
++ l = 0;
++ for (i = 0; i < n; i++) {
++ if (res[i]->priority != priority) {
++ if (f != l)
++ compute_weight(res, f, l);
++ f = i;
++ priority = res[i]->priority;
++ }
++ l = i;
++ }
++
++ qsort(res, n, sizeof(res[0]), srv_final_cmp);
++
+ for (i = 0; i < n - 1; i++)
+ res[i]->next = res[i + 1];
+
Added: head/ports-mgmt/pkg/files/patch-libpkg__fetch.c
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ head/ports-mgmt/pkg/files/patch-libpkg__fetch.c Tue Nov 19 17:30:14 2013 (r334333)
@@ -0,0 +1,88 @@
+--- ./libpkg/fetch.c.orig 2013-07-06 05:48:19.000000000 -0500
++++ ./libpkg/fetch.c 2013-11-19 11:13:45.352130038 -0600
+@@ -179,6 +179,8 @@
+ return (EPKG_FATAL);
+ }
+
++#define URL_SCHEME_PREFIX "pkg+"
++
+ int
+ pkg_fetch_file_to_fd(struct pkg_repo *repo, const char *url, int dest, time_t *t)
+ {
+@@ -204,6 +206,7 @@
+ int kq = -1, flags = 0;
+ struct kevent e, ev;
+ struct timespec ts;
++ bool pkg_url_scheme = false;
+
+ if (pkg_config_int64(PKG_CONFIG_FETCH_RETRY, &max_retry) == EPKG_FATAL)
+ max_retry = 3;
+@@ -215,6 +218,34 @@
+
+ retry = max_retry;
+
++ /* A URL of the form http://host.example.com/ where
++ * host.example.com does not resolve as a simple A record is
++ * not valid according to RFC 2616 Section 3.2.2. Our usage
++ * with SRV records is incorrect. However it is encoded into
++ * /usr/sbin/pkg in various releases so we can't just drop it.
++ *
++ * Instead, introduce new pkg+http://, pkg+https://,
++ * pkg+ssh://, pkg+ftp://, pkg+file:// to support the
++ * SRV-style server discovery, and also to allow eg. Firefox
++ * to run pkg-related stuff given a pkg+foo:// URL.
++ *
++ * Warn if using plain http://, https:// etc with SRV
++ */
++
++ if (strncmp(URL_SCHEME_PREFIX, url, strlen(URL_SCHEME_PREFIX)) == 0) {
++ if (repo->mirror_type != SRV) {
++ pkg_emit_error("packagesite URL error for %s -- "
++ URL_SCHEME_PREFIX
++ ":// implies SRV mirror type", url);
++
++ /* Too early for there to be anything to cleanup */
++ return(EPKG_FATAL);
++ }
++
++ url += strlen(URL_SCHEME_PREFIX);
++ pkg_url_scheme = true;
++ }
++
+ u = fetchParseURL(url);
+ if (t != NULL)
+ u->ims_time = *t;
+@@ -253,6 +284,12 @@
+ if (repo != NULL && repo->mirror_type == SRV &&
+ (strncmp(u->scheme, "http", 4) == 0
+ || strcmp(u->scheme, "ftp") == 0)) {
++
++ if (!pkg_url_scheme)
++ pkg_emit_notice(
++ "Warning: use of %s:// URL scheme with SRV records is deprecated: "
++ "switch to pkg+%s://", u->scheme, u->scheme);
++
+ snprintf(zone, sizeof(zone),
+ "_%s._tcp.%s", u->scheme, u->host);
+ if (repo->srv == NULL)
+@@ -268,8 +305,10 @@
+ }
+ }
+
+- if (repo != NULL && repo->mirror_type == SRV && repo->srv != NULL)
++ if (repo != NULL && repo->mirror_type == SRV && repo->srv != NULL) {
+ strlcpy(u->host, srv_current->host, sizeof(u->host));
++ u->port = srv_current->port;
++ }
+ else if (repo != NULL && repo->mirror_type == HTTP && repo->http != NULL) {
+ strlcpy(u->scheme, http_current->url->scheme, sizeof(u->scheme));
+ strlcpy(u->host, http_current->url->host, sizeof(u->host));
+@@ -366,7 +405,7 @@
+
+ cleanup:
+
+- if (strcmp(u->scheme, "ssh") != 0) {
++ if (u != NULL && strcmp(u->scheme, "ssh") != 0) {
+ if (remote != NULL)
+ fclose(remote);
+ } else {
Added: head/ports-mgmt/pkg/files/patch-libpkg__private__utils.h
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ head/ports-mgmt/pkg/files/patch-libpkg__private__utils.h Tue Nov 19 17:30:14 2013 (r334333)
@@ -0,0 +1,10 @@
+--- ./libpkg/private/utils.h.orig 2013-07-06 05:48:19.000000000 -0500
++++ ./libpkg/private/utils.h 2013-11-19 11:13:45.354131958 -0600
+@@ -60,6 +60,7 @@
+ unsigned int priority;
+ unsigned int weight;
+ unsigned int port;
++ unsigned int finalweight;
+ char host[MAXHOSTNAMELEN];
+ struct dns_srvinfo *next;
+ };
More information about the svn-ports-all
mailing list