Show
Ignore:
Timestamp:
10/13/08 19:23:00 (5 years ago)
Author:
tokuhirom
Message:

r27679@skinny (orig r21241): tokuhirom | 2008-10-13 18:04:20 +0900
unix socket support(work in progress)

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

Legend:

Unmodified
Added
Removed
  • lang/cplusplus/llv8call/trunk/ext/include/llv8-macros.h

    r21211 r21246  
    5555#define ARG_obj(v,i) v8::Local<v8::Object> v=args[i]->ToObject(); 
    5656#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)]) 
    5764#define END return v8::ThrowException(v8::String::New("Don't reach here... this function doesn't return value.")); } 
    5865  
  • lang/cplusplus/llv8call/trunk/ext/socket/socket.cc

    r21238 r21246  
    3333#  include <netinet/in.h> 
    3434#  include <arpa/inet.h> 
     35#  include <sys/un.h> 
    3536#  include <unistd.h> 
    3637#  include <sys/param.h> 
    3738#  include <netdb.h> 
    3839#endif 
     40 
     41typedef union sock_addr { 
     42    struct sockaddr_in in; 
     43#ifdef AF_UNIX 
     44    struct sockaddr_un un; 
     45#endif 
     46} sock_addr_t; 
    3947 
    4048/** DESCRIPTION: 
     
    6876    Handle<Array> ret = Array::New(2); 
    6977    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 
    7086    case AF_INET: 
    7187        { 
     
    89105// TODO: support unix domain socket 
    90106// TODO: support inet6 
    91 static inline void _gen_sockaddr(Handle<Array> &args, int family, struct sockaddr* addr_ret, socklen_t * len) { 
     107static inline void _gen_sockaddr(Handle<Array> &args, int family, sock_addr_t* addr_ret, socklen_t * len) { 
    92108    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 
    93129    case AF_INET: 
    94130        { 
    95131            if (args->Length() != 2) { 
    96                 ThrowException(String::New("invalid args: (host, port)")); 
     132                ThrowException(String::New("invalid args: AF_INET => (host, port)")); 
    97133                return; 
    98134            } 
     
    159195FUNCTION(_bind) 
    160196    EXTERNAL_SOCKET(); 
    161     struct sockaddr addr; 
     197    sock_addr_t addr; 
    162198    socklen_t len; 
    163199    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); 
    165202    _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) { 
    167206        return Undefined(); 
    168207    } else { 
     
    216255FUNCTION(_connect) 
    217256    EXTERNAL_SOCKET(); 
    218     struct sockaddr addr; 
     257    sock_addr_t addr; 
    219258    socklen_t len; 
    220259    int family = args.This()->Get(String::New("family"))->Int32Value(); 
    221     Handle<Array> addrsrc = Handle<Array>::Cast(args[0]); 
     260    ARG_array(addrsrc, 0); 
    222261    _gen_sockaddr(addrsrc, family, &addr, &len); 
    223     if (connect(sock, &addr, len) == 0) { 
     262    if (connect(sock, (sockaddr*)&addr, len) == 0) { 
    224263        return Undefined(); 
    225264    } else { 
     
    307346        addrsrc = Handle<Array>::Cast(args[1]); 
    308347    } 
    309     struct sockaddr addr; 
     348    sock_addr_t addr; 
    310349    socklen_t len; 
    311350    int family = args.This()->Get(String::New("family"))->Int32Value(); 
    312351    _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); 
    314353    if (size >= 0) { 
    315354        return Int32::New(size); 
     
    393432        BIND_CI("SOCK_SEQPACKET", SOCK_SEQPACKET); 
    394433 
     434#if defined(AF_UNIX) 
    395435        BIND_CI("AF_UNIX",        AF_UNIX); 
     436#endif 
    396437        BIND_CI("AF_INET",        AF_INET); 
    397438        BIND_CI("AF_INET6",       AF_INET6);