Changeset 21332 for lang/cplusplus/llv8call
- Timestamp:
- 10/14/08 23:42:18 (5 years ago)
- Location:
- lang/cplusplus/llv8call/trunk
- Files:
-
- 1 added
- 3 modified
-
TODO (modified) (1 diff)
-
ext/socket/socket.cc (modified) (5 diffs)
-
lib/org/coderepos/test/tcp.js (modified) (2 diffs)
-
t/100_socket/07_ipv6.js (added)
Legend:
- Unmodified
- Added
- Removed
-
lang/cplusplus/llv8call/trunk/TODO
r21227 r21332 6 6 -- base64.js 7 7 -- etc. 8 - added unix domain socket support9 8 - add socket.* 10 9 - org.coderepos.subprocess module -
lang/cplusplus/llv8call/trunk/ext/socket/socket.cc
r21256 r21332 41 41 typedef union sock_addr { 42 42 struct sockaddr_in in; 43 #if def AF_UNIX43 #if defined(AF_UNIX) 44 44 struct sockaddr_un un; 45 #endif 46 #if defined(AF_INET6) 47 struct sockaddr_in6 in6; 45 48 #endif 46 49 } sock_addr_t; … … 81 84 sockaddr_un * addr_un = (sockaddr_un*)&addr; 82 85 ret->Set(Int32::New(0), String::New(addr_un->sun_path)); 86 } 87 break; 88 #endif 89 #if defined(AF_INET6) 90 case AF_INET6: 91 { 92 char buf[NI_MAXHOST]; 93 if (getnameinfo(&addr, sizeof(sockaddr_in6), buf, sizeof(buf), NULL, 0, NI_NUMERICHOST)) { 94 throw_stderr(__func__); 95 return ret; 96 } 97 sockaddr_in6 * addr_in6 = (sockaddr_in6*)&addr; 98 ret->Set(Int32::New(0), String::New(buf)); 99 ret->Set(Int32::New(1), Int32::New(ntohs(addr_in6->sin6_port))); 83 100 } 84 101 break; … … 104 121 105 122 // TODO: support unix domain socket 106 // TODO: support inet6107 123 static inline void _gen_sockaddr(Handle<Array> &args, int family, sock_addr_t* addr_ret, socklen_t * len) { 108 124 switch (family) { … … 126 142 addr->sun_path[path.length()] = '\0'; 127 143 *len = path.length() + (sizeof(*addr) - sizeof(addr->sun_path)); 144 } 145 break; 146 #endif 147 #if defined(AF_INET6) 148 case AF_INET6: 149 { 150 if (args->Length() != 2) { 151 ThrowException(String::New("invalid args: AF_INET => (host, port)")); 152 return; 153 } 154 String::Utf8Value host(args->Get(Int32::New(0))); 155 int32_t port = args->Get(Int32::New(1))->Int32Value(); 156 157 struct sockaddr_in6 *addr = (struct sockaddr_in6*)addr_ret; 158 memset(addr, 0, sizeof(*addr)); // clear 159 addr->sin6_family = AF_INET6; 160 int pton_ret = inet_pton(AF_INET6, *host, addr->sin6_addr.s6_addr); 161 if (pton_ret == 0) { 162 ThrowException(String::New("invalid ip form")); 163 return; 164 } else if (pton_ret == -1) { 165 ThrowException(String::New("unknown protocol family")); 166 return; 167 } 168 addr->sin6_port = htons((short)port); 169 *len = sizeof(*addr); 128 170 } 129 171 break; … … 538 580 #endif 539 581 BIND_CI("AF_INET", AF_INET); 582 #if defined(AF_INET6) 540 583 BIND_CI("AF_INET6", AF_INET6); 584 #endif 541 585 542 586 // grep '"SOL_' Modules/socketmodule.c|perl -lne 'print "#if defined($1)\n BIND_CI(\"$1\", $1)\n#endif" if /"(SOL_\w+)"/' -
lang/cplusplus/llv8call/trunk/lib/org/coderepos/test/tcp.js
r21210 r21332 41 41 throw "empty port not found"; 42 42 }, 43 "waitPort" : function (port) { 43 "waitPort" : function (port, family) { 44 if (!family) { family = Socket.AF_INET } 44 45 var _check_port = function (port) { 45 var sock = new Socket( );46 var sock = new Socket(family); 46 47 try { 47 sock.connect([ "127.0.0.1", port]);48 sock.connect([family == Socket.AF_INET ? '127.0.0.1' : 'fe80::1%lo0', port]); 48 49 sock.close(); 49 50 return true; … … 62 63 }, 63 64 "testTCP" : function (args) { 65 var family = args['family'] ? args['family'] : Socket.AF_INET; 64 66 var pid = posix.fork(); 65 67 if (pid) { 66 68 // parent 67 Test.TCP.waitPort(args.port );69 Test.TCP.waitPort(args.port, family); 68 70 args.client(args.port); 69 71 } else if (pid == 0) {
![(please configure the [header_logo] section in trac.ini)](/share/chrome/site/your_project_logo.png)