From: Katsuyuki Komatsu Date: 2000-04-12T22:17:58+09:00 Subject: [ruby-dev:9566] [PATCH] closesocket() vs. close() 小松です。 BeOS 5でも、ファイル/ソケットディスクリプタの統合はなかった みたいですね。 ということで、長い間ローカルパッチで対応していましたが、 BeOSとmswin32でソケットをクローズするのにclose()を使っている ところをclosesocket()を使うようにするパッチです。 あと、mswin32でファイルハンドルのクローズにfree()を使っている ところをmyfdclose()に変更しました。 Wed Apr 12 22:09:41 2000 Katsuyuki Komatsu * ext/socket/extconf.rb: add have_func("closesocket") on BeOS and mswin32. * ext/socket/getaddrinfo.c: add HAVE_CLOSESOCKET check. * ext/socket/socket.c: add HAVE_CLOSESOCKET check. Don't use free() to close a file handle on mswin32. diff -ru2p ruby-1.4.4.dist/ext/socket/extconf.rb ruby-1.4.4/ext/socket/extconf.rb --- ruby-1.4.4.dist/ext/socket/extconf.rb Thu Mar 2 12:51:48 2000 +++ ruby-1.4.4/ext/socket/extconf.rb Wed Apr 12 22:09:41 2000 @@ -7,4 +7,5 @@ when /mswin32/ test_func = "WSACleanup" have_library("wsock32", "WSACleanup") + have_func("closesocket") when /cygwin/ # $LDFLAGS << " -L/usr/lib" if File.directory?("/usr/lib") @@ -15,4 +16,5 @@ when /beos/ test_func = "socket" have_library("net", "socket") + have_func("closesocket") when /i386-os2_emx/ test_func = "socket" diff -ru2p ruby-1.4.4.dist/ext/socket/getaddrinfo.c ruby-1.4.4/ext/socket/getaddrinfo.c --- ruby-1.4.4.dist/ext/socket/getaddrinfo.c Thu Mar 23 13:14:26 2000 +++ ruby-1.4.4/ext/socket/getaddrinfo.c Wed Apr 12 22:09:41 2000 @@ -422,5 +422,9 @@ getaddrinfo(hostname, servname, hints, r if (s < 0) continue; +#if defined(HAVE_CLOSESOCKET) + closesocket(s); +#else close(s); +#endif if (pai->ai_flags & AI_PASSIVE) { diff -ru2p ruby-1.4.4.dist/ext/socket/socket.c ruby-1.4.4/ext/socket/socket.c --- ruby-1.4.4.dist/ext/socket/socket.c Wed Mar 8 15:25:19 2000 +++ ruby-1.4.4/ext/socket/socket.c Wed Apr 12 22:09:41 2000 @@ -186,5 +186,5 @@ bsock_close_read(sock) fptr->mode &= ~FMODE_READABLE; #ifdef NT - free(fptr->f); + myfdclose(fptr->f); #else fclose(fptr->f); @@ -210,5 +210,5 @@ bsock_close_write(sock) fptr->mode &= ~FMODE_WRITABLE; #ifdef NT - free(fptr->f2); + myfdclose(fptr->f2); #else fclose(fptr->f2); @@ -763,5 +763,9 @@ open_inet(class, h, serv, type) if (status < 0) { +#if defined(HAVE_CLOSESOCKET) + closesocket(fd); +#else close(fd); +#endif fd = -1; continue; @@ -771,5 +775,9 @@ open_inet(class, h, serv, type) if (status < 0) { if (fd >= 0) +#if defined(HAVE_CLOSESOCKET) + closesocket(fd); +#else close(fd); +#endif freeaddrinfo(res0); rb_sys_fail(syscall); @@ -1034,5 +1042,9 @@ open_unix(class, path, server) if (status < 0) { +#if defined(HAVE_CLOSESOCKET) + closesocket(fd); +#else close(fd); +#endif rb_sys_fail(sockaddr.sun_path); } -- 小松克行 / Katsuyuki Komatsu