stone 2.3c epoll 版 (つまり -DUSE_EPOLL をつけてコンパイル) において、 proxy 機能にバグを見つけた。 stone を http proxy として使用して、 同じセッション内で異なるホスト (IP アドレスが異なる) へ アクセスすると接続できずにタイムアウトする。 ブラウザで「再読み込み」操作を行なえば、 ブラウザが新規セッションを張るので接続できるようになる。
stone.c 2.2.4.7 にて修正済み。 同一セッションにて異なるホストへ接続しようとしたとき、 stone は旧ソケットをクローズして新しいソケットをオープンするのだが、 このとき EPOLL_CTL_ADD するのを忘れていた。 select 版では新ソケットで FD_SET するので問題はない。
なお、epoll 版は Linux カーネルおよび glibc にて epoll がサポートされていることが必要。 現在使われている Linux ディストリビューションの大半 (?) は、 いまだ EPOLLONESHOT をサポートしていないので、 epoll 版を make することはできず、 次のようなエラーになる:
% make linux-ssl make TARGET=linux ssl_stone LIBS="-ldl" make[1]: Entering directory `stone' make FLAGS="-DUSE_POP -DUSE_SSL -I/usr/local/ssl/include " LIBS="-ldl -L/usr/local/ssl/lib -lssl -lcrypto" linux make[2]: Entering directory `stone' make FLAGS="-Wall -DCPP='\"/usr/bin/cpp -traditional\"' -DPTHREAD -DUNIX_DAEMON -DPRCTL -DSO_ORIGINAL_DST=80 -DUSE_EPOLL -DUSE_POP -DUSE_SSL -I/usr/local/ssl/include " LIBS="-lpthread -ldl -L/usr/local/ssl/lib -lssl -lcrypto" stone make[3]: Entering directory `stone' cc -Wall -DCPP='"/usr/bin/cpp -traditional"' -DPTHREAD -DUNIX_DAEMON -DPRCTL -DSO_ORIGINAL_DST=80 -DUSE_EPOLL -DUSE_POP -DUSE_SSL -I/usr/local/ssl/include -o stone stone.c -lpthread -ldl -L/usr/local/ssl/lib -lssl -lcrypto stone.c: In function `healthCheck': stone.c:1687: error: `EPOLLONESHOT' undeclared (first use in this function) stone.c:1687: error: (Each undeclared identifier is reported only once stone.c:1687: error: for each function it appears in.) stone.c: In function `asyncConn': stone.c:3517: error: `EPOLLONESHOT' undeclared (first use in this function) stone.c: In function `getident': stone.c:3703: error: `EPOLLONESHOT' undeclared (first use in this function) stone.c: In function `proxyCommon': stone.c:5054: error: `EPOLLONESHOT' undeclared (first use in this function) stone.c: In function `proto2fdset': stone.c:5699: error: `EPOLLONESHOT' undeclared (first use in this function) stone.c: In function `doAcceptConnect': stone.c:6277: error: `EPOLLONESHOT' undeclared (first use in this function) stone.c: In function `asyncClose': stone.c:6350: error: `EPOLLONESHOT' undeclared (first use in this function) make[3]: *** [stone] Error 1 make[3]: Leaving directory `stone' make[2]: *** [linux] Error 2 make[2]: Leaving directory `stone' make[1]: *** [ssl_stone] Error 2 make[1]: Leaving directory `stone' make: *** [linux-ssl] Error 2
このようなエラーが出る場合は、 Makefile にて 「-DUSE_EPOLL」 を削除して make することにより、 select 版を作成できる。
% diff -u Makefile.org Makefile --- Makefile.org Tue Nov 28 13:52:54 2006 +++ Makefile Tue Nov 28 13:52:09 2006 @@ -95,7 +95,7 @@ $(MAKE) FLAGS="-DNT_SERVICE $(FLAGS) $(POP_FLAGS) $(SSL_FLAGS)" LIBS="$(LIBS) $(SSL_LIBS) $(SVC_LIBS) -ladvapi32 -luser32 -lgdi32 -lshell32 -lkernel32" $(TARGET) linux: - $(MAKE) FLAGS="-Wall -DCPP='\"/usr/bin/cpp -traditional\"' -DPTHREAD -DUNIX_DAEMON -DPRCTL -DSO_ORIGINAL_DST=80 -DUSE_EPOLL $(FLAGS)" LIBS="-lpthread $(LIBS)" stone + $(MAKE) FLAGS="-Wall -DCPP='\"/usr/bin/cpp -traditional\"' -DPTHREAD -DUNIX_DAEMON -DPRCTL -DSO_ORIGINAL_DST=80 $(FLAGS)" LIBS="-lpthread $(LIBS)" stone linux-pop: $(MAKE) TARGET=linux pop_stone
このようなパッチを Makefile にあてた後、make すればよい。
% make linux-ssl make TARGET=linux ssl_stone LIBS="-ldl" make[1]: Entering directory `stone' make FLAGS="-DUSE_POP -DUSE_SSL -I/usr/local/ssl/include " LIBS="-ldl -L/usr/local/ssl/lib -lssl -lcrypto" linux make[2]: Entering directory `stone' make FLAGS="-Wall -DCPP='\"/usr/bin/cpp -traditional\"' -DPTHREAD -DUNIX_DAEMON -DPRCTL -DSO_ORIGINAL_DST=80 -DUSE_POP -DUSE_SSL -I/usr/local/ssl/include " LIBS="-lpthread -ldl -L/usr/local/ssl/lib -lssl -lcrypto" stone make[3]: Entering directory `stone' cc -Wall -DCPP='"/usr/bin/cpp -traditional"' -DPTHREAD -DUNIX_DAEMON -DPRCTL -DSO_ORIGINAL_DST=80 -DUSE_POP -DUSE_SSL -I/usr/local/ssl/include -o stone stone.c -lpthread -ldl -L/usr/local/ssl/lib -lssl -lcrypto make[3]: Leaving directory `stone' make[2]: Leaving directory `stone' make[1]: Leaving directory `stone'