#ext/net/test.scm の中の以下の部分なんですけども:
#;; We need runtime check to see if ipv6 is really available.
(when (and-let* ([ (run-simple-server `(list (make-server-socket
(make <sockaddr-in6>
:host :any :port ,*inet-port*)
:reuse-addr? #t))) ]
[sock (get-ipv6-sock)])
(socket-close sock)
#t)
#get-ipv6-sockがfailするときにrun-simple-serverで上げたサーバの片付けってどうなってるんでしょう。
#test getsockname/getpeername, expects #t ==> ERROR: GOT #<<system-error> "bind failed to #<sockaddr inet \"127.0.0.1:6726\">: Address already in use">
#でエラーになるのはここで上げてるプロセスが居残ってるせいだと思うのですが
#vmubuntu:maru% ps ax | grep gosh [~/var/tmp/Gauche/ext/net]
5362 pts/5 S 0:00 ../../src/gosh -ftest ./testserv.o
5366 pts/5 S+ 0:00 grep gosh
#他の人のところでは問題ないのかしら。
#(when (and-let* ( で囲まれてるipv6のテストがスキップされているのは期待通りなんですけど。
#run-simple-serverのコードおもしろいな。その場でスクリプト書いてそれを読むgoshを起動しているのか。
#failした場合ってguardで捕まってそのままmainを抜けるからサーバはexitするはずなんだけど、残ってるのは不思議だなあ。
#そうなんですよね。testserv.o見てみたら特に何かを待ってるような形ではないので君は何をしているんだ?って疑問に思ってるところです。手が空いたらもうちょっと詳しく見てみます。
#(gdb) bt
#0 0x00007f0485db8003 in __select_nocancel () at ../sysdeps/unix/syscall-template.S:82
#1 0x00007f04861bdd90 in select_int (rfds=0x18093f0, wfds=0x0, efds=0x0, timeout=0xb) at system.c:2077
#2 0x00007f04862165bd in libsyssys_select (SCM_FP=0x16ca140, SCM_ARGCNT=5, data_=<optimized out>) at libsys.scm:1272
#3 0x00007f0486164bf2 in run_loop () at ./vmcall.c:186
#4 0x00007f048616d485 in user_eval_inner (program=<optimized out>, codevec=<optimized out>) at vm.c:1416
#5 0x00007f048616e243 in apply_rec (proc=<optimized out>, nargs=<optimized out>, vm=<optimized out>) at vm.c:1511
#6 0x00000000004023be in main (argc=<optimized out>, argv=<optimized out>) at main.c:565
(gdb)
#src/system.c の select_int で待ってますね。
#selectで待ってるということはソケット作成に成功してる?
#このときのtestsrv.oの内容は"udp server socket"のテストのものです:
#vmubuntu:maru% cat testserv.o [~/var/tmp/Gauche/ext/net]
(use gauche.net)(use srfi-13)(define (main args) (let ((sock (make-socket PF_INET SOCK_DGRAM)) (addr (make <sockaddr-in> :host :any :port 6726))) (socket-setsockopt sock SOL_SOCKET SO_REUSEADDR 1) (socket-bind sock addr) (newline) (flush) (receive (msg from) (socket-recvfrom sock 1024) (socket-sendto sock (string-upcase msg) from)) (socket-close sock) (sys-exit 33)))%
#違うかな
#あぁ違うか。順番としてはudp server socketが後だから上書きされちゃうかな
#テスト削ろう
#../../src/gosh -ftest test.scm を実行して
#test socket w/ port error handling, expects #<error> ==> ok
test socket w/ port error handling, expects #<error> ==> ok
test getsockname/getpeername, expects #t ==> ERROR: GOT #<<system-error> "bind failed to #<sockaddr inet \"127.0.0.1:6726\">: Address already in use">
failed.
discrepancies found. Errors are:
test getsockname/getpeername: expects #t => got #<<system-error> "bind failed to #<sockaddr inet \"127.0.0.1:6726\">: Address already in use">
#最後にこのメッセージで終わるように削った状態のときのtestserv.oの内容はrun-simple-serverで書いているものですね。この状態のgoshにアタッチしよう
#(gdb) bt
#0 0x00007f5d6b0df003 in __select_nocancel () at ../sysdeps/unix/syscall-template.S:82
#1 0x00007f5d6b4e4d90 in select_int (rfds=0x9373f0, wfds=0x0, efds=0x0, timeout=0xb) at system.c:2077
#2 0x00007f5d6b53d5bd in libsyssys_select (SCM_FP=0x809140, SCM_ARGCNT=5, data_=<optimized out>) at libsys.scm:1272
#3 0x00007f5d6b48bbf2 in run_loop () at ./vmcall.c:186
#4 0x00007f5d6b494485 in user_eval_inner (program=<optimized out>, codevec=<optimized out>) at vm.c:1416
#5 0x00007f5d6b495243 in apply_rec (proc=<optimized out>, nargs=<optimized out>, vm=<optimized out>) at vm.c:1511
#6 0x00000000004023be in main (argc=<optimized out>, argv=<optimized out>) at main.c:565
#selectですね。ipv6のソケット作れちゃうってこと?
#ちょっと席外します。また後ほど。
#ipv6生かすとext/netは勿論のこと全テスト完走するのを改めて確認、と。v6殺して再起動してこよ。
#(make-server-socket
(make <sockaddr-in6> :host :any :port 6726)
:reuse-addr? #t)
#本来ならここでエラーになって欲しい気がするんですけど正しい姿はどうあるべきなんでしょうか
#ちなみに
#vmubuntu:maru% netstat -na | grep 6726 [~]
tcp6 0 0 :::6726 :::* LISTEN
vmubuntu:maru% ip a [~]
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:50:56:3b:53:58 brd ff:ff:ff:ff:ff:ff
inet 172.16.218.129/24 brd 172.16.218.255 scope global eth0
#こんな感じになってまして、v6有効になってるネットワークインターフェース存在しないのにv6でLISTENしてるsocketが存在するような状態になってるぽいです。
#Ubuntu 12.04 LTS x86_64がおかしいような気がしないでもない...