Changeset 21249

Show
Ignore:
Timestamp:
10/13/08 20:42:16 (5 years ago)
Author:
tokuhirom
Message:

added socketpair supporrt

Location:
lang/cplusplus/llv8call/trunk
Files:
1 added
1 modified

Legend:

Unmodified
Added
Removed
  • lang/cplusplus/llv8call/trunk/ext/socket/socket.cc

    r21248 r21249  
    160160FUNCTION(_open) 
    161161    // USAGE: new Socket(Socket.AF_INET, Socket.SOCK_STREAM) 
    162     if (args.Length() == 2 && args[0]->IsExternal()) { 
     162    if (args.Length() == 5 && args[0]->IsExternal()) { 
    163163        args.This()->SetInternalField(0, args[1]); 
    164164        args.This()->Set(String::New("family"), args[2]); 
     
    240240    int newsock = accept(sock, &addr, &len); 
    241241    if (newsock >= 0) { 
    242         Handle<Value> argv[2]; 
    243         argv[0] = External::New(&len); 
     242        Handle<Value> argv[5]; 
     243        argv[0] = External::New(&len); // dummy field 
    244244        argv[1] = Int32::New(newsock); 
    245245        argv[2] = args.This()->Get(String::New("family")); 
    246246        argv[3] = args.This()->Get(String::New("type")); 
    247247        argv[4] = args.This()->Get(String::New("proto")); 
    248         return Handle<Function>::Cast( socket_namespace()->Get(String::New("Socket")) )->NewInstance(2, argv); 
     248        return Handle<Function>::Cast( socket_namespace()->Get(String::New("Socket")) )->NewInstance(5, argv); 
    249249    } else { 
    250250        return throw_stderr("accept error: "); 
     
    422422END 
    423423 
     424FUNCTION(_socketpair) 
     425    // @prototype socket.socketpair([family[, type[, proto]]]) 
     426    ARG_BETWEEN(0, 3); 
     427    ARG_int(family, 0); 
     428    ARG_int(type,   1); 
     429    ARG_int(protocol,  2); 
     430 
     431    if (args.Length() < 1) { 
     432#if defined(AF_UNIX) 
     433        family = AF_UNIX; 
     434#else 
     435        family = AF_INET; 
     436#endif 
     437    } 
     438    if (args.Length() < 2) { 
     439        type = SOCK_STREAM; 
     440    } 
     441    if (args.Length() < 3) { 
     442        protocol = 0; 
     443    } 
     444 
     445    int socket_vector[2]; 
     446    if (socketpair(family, type, protocol, socket_vector) == 0) { 
     447        Handle<Array> ret = Array::New(2); 
     448        for (int i=0; i<2; i++) { 
     449            Handle<Value> argv[5]; 
     450            argv[0] = External::New((void*)&family); // dummy field 
     451            argv[1] = Int32::New(socket_vector[i]); 
     452            argv[2] = Int32::New(family); 
     453            argv[3] = Int32::New(type); 
     454            argv[4] = Int32::New(protocol); 
     455            Handle<Object> obj = Handle<Function>::Cast( socket_namespace()->Get(String::New("Socket")) )->NewInstance(5, argv); 
     456            ret->Set(Int32::New(i), obj); 
     457        } 
     458        return ret; 
     459    } else { 
     460        return throw_stderr("inet_aton"); 
     461    } 
     462END 
     463 
    424464MODULE() 
    425465    { 
     
    441481        BIND_CM("inet_aton",      _inet_aton); 
    442482        BIND_CM("inet_ntoa",      _inet_ntoa); 
     483        BIND_CM("socketpair",     _socketpair); 
    443484 
    444485        BIND_IM("bind",           _bind);