Changeset 21246 for lang/cplusplus/llv8call
- Timestamp:
- 10/13/08 19:23:00 (5 years ago)
- Location:
- lang/cplusplus/llv8call/trunk
- Files:
-
- 1 added
- 2 modified
-
ext/include/llv8-macros.h (modified) (1 diff)
-
ext/socket/socket.cc (modified) (7 diffs)
-
t/100_socket/05_unix_socket.js (added)
Legend:
- Unmodified
- Added
- Removed
-
lang/cplusplus/llv8call/trunk/ext/include/llv8-macros.h
r21211 r21246 55 55 #define ARG_obj(v,i) v8::Local<v8::Object> v=args[i]->ToObject(); 56 56 #define ARG_bool(v,i) bool v=args[(i)]->BooleanValue(); 57 #define ARG_array(name, c) \ 58 if (!args[(c)]->IsArray()) { \ 59 std::ostringstream __k7_e; \ 60 __k7_e << "Exception: argument error." << __func__ << " expects array for argument " << c << "."; \ 61 return ThrowException(String::New(__k7_e.str().c_str())); \ 62 } \ 63 Handle<Array> name = Handle<Array>::Cast(args[(c)]) 57 64 #define END return v8::ThrowException(v8::String::New("Don't reach here... this function doesn't return value.")); } 58 65 -
lang/cplusplus/llv8call/trunk/ext/socket/socket.cc
r21238 r21246 33 33 # include <netinet/in.h> 34 34 # include <arpa/inet.h> 35 # include <sys/un.h> 35 36 # include <unistd.h> 36 37 # include <sys/param.h> 37 38 # include <netdb.h> 38 39 #endif 40 41 typedef union sock_addr { 42 struct sockaddr_in in; 43 #ifdef AF_UNIX 44 struct sockaddr_un un; 45 #endif 46 } sock_addr_t; 39 47 40 48 /** DESCRIPTION: … … 68 76 Handle<Array> ret = Array::New(2); 69 77 switch (addr.sa_family) { 78 #if defined(AF_UNIX) 79 case AF_UNIX: 80 { 81 sockaddr_un * addr_un = (sockaddr_un*)&addr; 82 ret->Set(Int32::New(0), String::New(addr_un->sun_path)); 83 } 84 break; 85 #endif 70 86 case AF_INET: 71 87 { … … 89 105 // TODO: support unix domain socket 90 106 // TODO: support inet6 91 static inline void _gen_sockaddr(Handle<Array> &args, int family, s truct sockaddr* addr_ret, socklen_t * len) {107 static inline void _gen_sockaddr(Handle<Array> &args, int family, sock_addr_t* addr_ret, socklen_t * len) { 92 108 switch (family) { 109 #if defined(AF_UNIX) 110 case AF_UNIX: 111 { 112 puts("AF_UNIX"); 113 if (args->Length() != 1) { 114 ThrowException(String::New("invalid args: AF_UNIX => (socket file)")); 115 return; 116 } 117 struct sockaddr_un *addr = (struct sockaddr_un*)addr_ret; 118 memset(addr, 0, sizeof(sockaddr_un)); // clear 119 120 String::Utf8Value path(args->Get(Int32::New(0))); 121 addr->sun_family = AF_UNIX; 122 puts(*path); 123 strncpy(addr->sun_path, *path, 104); 124 puts(addr->sun_path); 125 *len = sizeof(sockaddr_un); 126 } 127 break; 128 #endif 93 129 case AF_INET: 94 130 { 95 131 if (args->Length() != 2) { 96 ThrowException(String::New("invalid args: (host, port)"));132 ThrowException(String::New("invalid args: AF_INET => (host, port)")); 97 133 return; 98 134 } … … 159 195 FUNCTION(_bind) 160 196 EXTERNAL_SOCKET(); 161 s truct sockaddraddr;197 sock_addr_t addr; 162 198 socklen_t len; 163 199 int family = args.This()->Get(String::New("family"))->Int32Value(); 164 Handle<Array> addrsrc = Handle<Array>::Cast(args[0]); 200 ARG_array(addrsrc, 0); 201 printf("BIND: %d\n", sock); 165 202 _gen_sockaddr(addrsrc, family, &addr, &len); 166 if (bind(sock, &addr, len) == 0) { 203 printf("BIND: %d\n", sock); 204 printf("HEY: %d, %d, %d, %s\n", addr.un.sun_family, AF_UNIX, AF_INET, addr.un.sun_path); 205 if (bind(sock, (sockaddr*)&addr, len) == 0) { 167 206 return Undefined(); 168 207 } else { … … 216 255 FUNCTION(_connect) 217 256 EXTERNAL_SOCKET(); 218 s truct sockaddraddr;257 sock_addr_t addr; 219 258 socklen_t len; 220 259 int family = args.This()->Get(String::New("family"))->Int32Value(); 221 Handle<Array> addrsrc = Handle<Array>::Cast(args[0]);260 ARG_array(addrsrc, 0); 222 261 _gen_sockaddr(addrsrc, family, &addr, &len); 223 if (connect(sock, &addr, len) == 0) {262 if (connect(sock, (sockaddr*)&addr, len) == 0) { 224 263 return Undefined(); 225 264 } else { … … 307 346 addrsrc = Handle<Array>::Cast(args[1]); 308 347 } 309 s truct sockaddraddr;348 sock_addr_t addr; 310 349 socklen_t len; 311 350 int family = args.This()->Get(String::New("family"))->Int32Value(); 312 351 _gen_sockaddr(addrsrc, family, &addr, &len); 313 ssize_t size = sendto(sock, *str, str.length(), _flags, &addr, len);352 ssize_t size = sendto(sock, *str, str.length(), _flags, (sockaddr*)&addr, len); 314 353 if (size >= 0) { 315 354 return Int32::New(size); … … 393 432 BIND_CI("SOCK_SEQPACKET", SOCK_SEQPACKET); 394 433 434 #if defined(AF_UNIX) 395 435 BIND_CI("AF_UNIX", AF_UNIX); 436 #endif 396 437 BIND_CI("AF_INET", AF_INET); 397 438 BIND_CI("AF_INET6", AF_INET6);
![(please configure the [header_logo] section in trac.ini)](/share/chrome/site/your_project_logo.png)