close <div id="moderation_required">Attachments you submit will be routed for moderation. If you have an account, please <a href="/login">log in</a> first.</div>

Ticket #1327: win32-select-on-pipe.patch

File win32-select-on-pipe.patch, 4.4 KB (added by lubomir.marinov, 8 years ago)

Provides a pipe() implementation on Win32 which uses socket()

  • \transmission-1.34\libtransmission\trevent.c

    old new  
    1919#include <signal.h>
    2020
    2121#ifdef WIN32
    22   #include <fcntl.h>
    23   #define pipe(f) _pipe(f, 1000, _O_BINARY)
     22#include <Winsock2.h>
     23
     24int
     25pgpipe(int handles[2])
     26{
     27        SOCKET          s;
     28        struct sockaddr_in serv_addr;
     29        int                     len = sizeof(serv_addr);
     30
     31        handles[0] = handles[1] = INVALID_SOCKET;
     32
     33        if ((s = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
     34        {
     35/*              ereport(LOG, (errmsg_internal("pgpipe failed to create socket: %ui", WSAGetLastError()))); */
     36                return -1;
     37        }
     38
     39        memset((void *) &serv_addr, 0, sizeof(serv_addr));
     40        serv_addr.sin_family = AF_INET;
     41        serv_addr.sin_port = htons(0);
     42        serv_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
     43        if (bind(s, (SOCKADDR *) & serv_addr, len) == SOCKET_ERROR)
     44        {
     45/*              ereport(LOG, (errmsg_internal("pgpipe failed to bind: %ui", WSAGetLastError()))); */
     46                closesocket(s);
     47                return -1;
     48        }
     49        if (listen(s, 1) == SOCKET_ERROR)
     50        {
     51/*              ereport(LOG, (errmsg_internal("pgpipe failed to listen: %ui", WSAGetLastError()))); */
     52                closesocket(s);
     53                return -1;
     54        }
     55        if (getsockname(s, (SOCKADDR *) & serv_addr, &len) == SOCKET_ERROR)
     56        {
     57/*              ereport(LOG, (errmsg_internal("pgpipe failed to getsockname: %ui", WSAGetLastError()))); */
     58                closesocket(s);
     59                return -1;
     60        }
     61        if ((handles[1] = socket(PF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
     62        {
     63/*              ereport(LOG, (errmsg_internal("pgpipe failed to create socket 2: %ui", WSAGetLastError()))); */
     64                closesocket(s);
     65                return -1;
     66        }
     67
     68        if (connect(handles[1], (SOCKADDR *) & serv_addr, len) == SOCKET_ERROR)
     69        {
     70/*              ereport(LOG, (errmsg_internal("pgpipe failed to connect socket: %ui", WSAGetLastError()))); */
     71                closesocket(s);
     72                return -1;
     73        }
     74        if ((handles[0] = accept(s, (SOCKADDR *) & serv_addr, &len)) == INVALID_SOCKET)
     75        {
     76/*              ereport(LOG, (errmsg_internal("pgpipe failed to accept socket: %ui", WSAGetLastError()))); */
     77                closesocket(handles[1]);
     78                handles[1] = INVALID_SOCKET;
     79                closesocket(s);
     80                return -1;
     81        }
     82        closesocket(s);
     83        return 0;
     84}
     85
     86
     87int
     88piperead(int s, char *buf, int len)
     89{
     90        int                     ret = recv(s, buf, len, 0);
     91
     92        if (ret < 0 && WSAGetLastError() == WSAECONNRESET)
     93                /* EOF on the pipe! (win32 socket based implementation) */
     94                ret = 0;
     95        return ret;
     96}
     97
     98#define pipe(a) pgpipe(a)
     99#define pipewrite(a,b,c) send(a,b,c,0)
    24100#else
    25   #include <unistd.h>
     101#include <unistd.h>
     102#define piperead(a,b,c) read(a,b,c)
     103#define pipewrite(a,b,c) write(a,b,c)
    26104#endif
    27105
    28106#include <event.h>
     
    79157    /* read the command type */
    80158    ch = '\0';
    81159    do {
    82         ret = read( fd, &ch, 1 );
     160        ret = piperead( fd, &ch, 1 );
    83161    } while( !eh->die && ret<0 && errno==EAGAIN );
    84162    dbgmsg( "command is [%c], ret is %d, errno is %d", ch, ret, (int)errno );
    85163
     
    89167        {
    90168            struct tr_run_data data;
    91169            const size_t nwant = sizeof( data );
    92             const ssize_t ngot = read( fd, &data, nwant );
     170            const ssize_t ngot = piperead( fd, &data, nwant );
    93171            if( !eh->die && ( ngot == (ssize_t)nwant ) ) {
    94172                dbgmsg( "invoking function in libevent thread" );
    95173                (data.func)( data.user_data );
     
    100178        {
    101179            tr_timer * timer;
    102180            const size_t nwant = sizeof( timer );
    103             const ssize_t ngot = read( fd, &timer, nwant );
     181            const ssize_t ngot = piperead( fd, &timer, nwant );
    104182            if( !eh->die && ( ngot == (ssize_t)nwant ) ) {
    105183                dbgmsg( "adding timer in libevent thread" );
    106184                evtimer_add( &timer->event, &timer->tv );
     
    251329        tr_lock * lock = handle->events->lock;
    252330
    253331        tr_lockLock( lock );
    254         write( fd, &ch, 1 );
    255         write( fd, &timer, sizeof(timer) );
     332        pipewrite( fd, &ch, 1 );
     333        pipewrite( fd, &timer, sizeof(timer) );
    256334        tr_lockUnlock( lock );
    257335    }
    258336
     
    276354        struct tr_run_data data;
    277355
    278356        tr_lockLock( lock );
    279         write( fd, &ch, 1 );
     357        pipewrite( fd, &ch, 1 );
    280358        data.func = func;
    281359        data.user_data = user_data;
    282         write( fd, &data, sizeof(data) );
     360        pipewrite( fd, &data, sizeof(data) );
    283361        tr_lockUnlock( lock );
    284362    }
    285363}