portsnap, freebsd-updateにuser:password@proxy形式のHTTP_PROXYを読ませるには。(phttpgetを改造)


http://d.hatena.ne.jp/flageo/20060501/p1
でも書いたけど、phttpget、つまりはportsnap, freebsd-updateはhttp://user:password@proxy.server.com:8080形式の環境変数HTTP_PROXYを読んでくれない。
そこでportsnap, freebsd-updateを実行するときにはHTTP_PROXY, HTTP_PROXY_AUTHに付け替える必要があるわけだが、これが面倒くさい。
というわけで、phttpget自体を改造する。

ネタはhttp://www.freebsd.org/cgi/query-pr.cgi?pr=129431

$ uname -r
8.2-RELEASE-p3
$ grep FBSDID ./phttpget.c
__FBSDID("$FreeBSD: src/usr.sbin/portsnap/phttpget/phttpget.c,v 1.14.2.1.6.1 2010/12/21 17:09:25 kensmith Exp $");


以上の/usr/src/usr.sbin/portsnap/phttpget/phttpget.cに対して以下のような修正を。

$ diff -u phttpget.c.orig phttpget.c
--- phttpget.c.orig     2012-04-05 10:58:52.000000000 +0900
+++ phttpget.c  2012-04-05 11:04:25.000000000 +0900
@@ -44,7 +44,7 @@
 #include <sysexits.h>
 #include <unistd.h>

-static const char *    env_HTTP_PROXY;
+static char *          env_HTTP_PROXY;
 static char *          env_HTTP_PROXY_AUTH;
 static const char *    env_HTTP_USER_AGENT;
 static char *          env_HTTP_TIMEOUT;
@@ -136,6 +136,11 @@
                p = strchr(env_HTTP_PROXY, '/');
                if (p != NULL)
                        *p = 0;
+               if (strchr(env_HTTP_PROXY, '@')) {
+                       proxy_auth_user = strsep(&env_HTTP_PROXY, ":");
+                       proxy_auth_pass = strsep(&env_HTTP_PROXY, "@");
+                       p = strchr(env_HTTP_PROXY, '@');
+               }
                p = strchr(env_HTTP_PROXY, ':');
                if (p != NULL) {
                        *p = 0;

あとは/usr/src/usr.sbin/portsnap/phttpget/でmakeして、できたphttpgetを/usr/libexec配下にコピーすればOK。
当然ながらOSの更新(freebsd-updateやmake buildworld install)すると元に戻るので注意。