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)すると元に戻るので注意。