Ticket #518: socket5.patch

File socket5.patch, 3.9 KB (added by bacek, 13 years ago)

Better patch

  • examples/io/httpd.pir

    diff --git a/examples/io/httpd.pir b/examples/io/httpd.pir
    index 3970d37..2def929 100644
    a b  
    9393 
    9494.include "stat.pasm" 
    9595.include 'except_types.pasm' 
     96.include 'socket.pasm' 
    9697 
    9798.sub main :main 
    9899    .local pmc listener, work, fp 
     
    112113 
    113114    # TODO provide sys/socket constants 
    114115    listener = new 'Socket' 
    115     listener.'socket'(2, 1, 6)  # PF_INET, SOCK_STREAM, tcp 
     116    listener.'socket'(.PIO_PF_INET, .PIO_SOCK_STREAM, .PIO_PROTO_TCP)   # PF_INET, SOCK_STREAM, tcp 
    116117    unless listener goto ERR_NO_SOCKET 
    117118 
    118119    # Pack a sockaddr_in structure with IP and port 
  • include/parrot/io.h

    diff --git a/include/parrot/io.h b/include/parrot/io.h
    index 54fcaaf..03facfb 100644
    a b  
    905905#define PIOCTL_LINEBUF             1 
    906906#define PIOCTL_BLKBUF              2 
    907907 
     908/* 
     909 * Enum definition of constants for Socket.socket. 
     910 * Happens to be same for corresponding values on Linux. Other implementations 
     911 * of socket API may have to map this values to system specific. 
     912 */ 
    908913 
     914/* &gen_from_enum(socket.pasm) */ 
     915typedef enum { 
     916    PIO_PF_LOCAL    = 0, 
     917    PIO_PF_UNIX     = 1, 
     918    PIO_PF_INET     = 2, 
     919    PIO_PF_INET6    = 3, 
     920    PIO_PF_MAX      = 4     /* last elem */ 
     921} Socket_Protocol_Family; 
     922 
     923typedef enum { 
     924    PIO_SOCK_STREAM     = 1, 
     925    PIO_SOCK_DGRAM      = 2, 
     926    PIO_SOCK_RAW        = 3, 
     927    PIO_SOCK_RDM        = 4, 
     928    PIO_SOCK_SEQPACKET  = 5, 
     929    PIO_SOCK_PACKET     = 10, 
     930} Socket_Socket_Type; 
     931 
     932typedef enum { 
     933    PIO_PROTO_TCP   = 6, 
     934    PIO_PROTO_UDP   = 17, 
     935} Socket_Protocol; 
     936/* &end_gen */ 
    909937 
    910938#endif /* PARROT_IO_H_GUARD */ 
    911939 
  • src/io/socket_unix.c

    diff --git a/src/io/socket_unix.c b/src/io/socket_unix.c
    index 59f021f..b444e0c 100644
    a b  
    114114#  if PARROT_NET_DEVEL 
    115115 
    116116/* 
     117 * Mappping between PIO_PF_* constants and system-specific PF_* constants. 
     118 * 
     119 * Uses -1 for unsupported protocols. 
     120 */ 
     121 
     122static int pio_pf[PIO_PF_MAX+1] = { 
     123    PF_LOCAL,   /* PIO_PF_LOCAL */ 
     124    PF_UNIX,    /* PIO_PF_UNIX */ 
     125    PF_INET,    /* PIO_PF_INET */ 
     126    PF_INET6,   /* PIO_PF_INET6 */ 
     127}; 
     128 
     129/* 
    117130 
    118131=item C<INTVAL Parrot_io_socket_unix> 
    119132 
     
    131144{ 
    132145    ASSERT_ARGS(Parrot_io_socket_unix) 
    133146    int i = 1; 
     147    /* convert Parrot's family to system family */ 
     148    if (fam < 0 || fam >= PIO_PF_MAX) 
     149        return -1; 
     150    fam = pio_pf[fam]; 
     151    if (fam < 0) 
     152        return -1; 
     153 
    134154    const int sock = socket(fam, type, proto); 
    135155    if (sock >= 0) { 
    136156        setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &i, sizeof (i)); 
  • src/io/socket_win32.c

    diff --git a/src/io/socket_win32.c b/src/io/socket_win32.c
    index 6b1b13a..d93b7f3 100644
    a b  
    6060                PARROT_SOCKET((p))->remote)) 
    6161 
    6262/* 
     63 * Mappping between PIO_PF_* constants and system-specific PF_* constants. 
     64 * 
     65 * Uses -1 for unsupported protocols. 
     66 */ 
     67 
     68static int pio_pf[PIO_PF_MAX+1] = { 
     69    PF_LOCAL,   /* PIO_PF_LOCAL */ 
     70    PF_UNIX,    /* PIO_PF_UNIX */ 
     71    PF_INET,    /* PIO_PF_INET */ 
     72    PF_INET6,   /* PIO_PF_INET6 */ 
     73}; 
     74 
     75/* 
    6376 
    6477=item C<INTVAL Parrot_io_socket_win32> 
    6578 
     
    7790{ 
    7891    ASSERT_ARGS(Parrot_io_socket_win32) 
    7992    int i = 1; 
     93    /* convert Parrot's family to system family */ 
     94    if (fam < 0 || fam >= PIO_PF_MAX) 
     95        return -1; 
     96    fam = pio_pf[fam]; 
     97    if (fam < 0) 
     98        return -1; 
     99 
    80100    const int sock = socket(fam, type, proto); 
    81101    if (sock >= 0) { 
    82102        setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (const char*)&i, sizeof (i));