[http://d.hatena.ne.jp/flageo/20060501/p1](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](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)すると元に戻るので注意。