Changeset 6904


Ignore:
Timestamp:
Oct 14, 2008, 6:17:33 PM (13 years ago)
Author:
charles
Message:

(libT) #1327: win32 cannot select() on the file descriptors of pipe()

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/libtransmission/trevent.c

    r6893 r6904  
    2020
    2121#ifdef WIN32
    22  #include <fcntl.h>
    23  #define pipe( f ) _pipe( f, 1000, _O_BINARY )
     22
     23#include <WinSock2.h>
     24 
     25static int
     26pgpipe( int handles[2] )
     27{
     28        SOCKET s;
     29        struct sockaddr_in serv_addr;
     30        int len = sizeof( serv_addr );
     31 
     32        handles[0] = handles[1] = INVALID_SOCKET;
     33 
     34        if ( ( s = socket( AF_INET, SOCK_STREAM, 0 ) ) == INVALID_SOCKET )
     35        {
     36/*              ereport(LOG, (errmsg_internal("pgpipe failed to create socket: %ui", WSAGetLastError()))); */
     37                return -1;
     38        }
     39 
     40        memset( &serv_addr, 0, sizeof( serv_addr ) );
     41        serv_addr.sin_family = AF_INET;
     42        serv_addr.sin_port = htons(0);
     43        serv_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
     44        if (bind(s, (SOCKADDR *) & serv_addr, len) == SOCKET_ERROR)
     45        {
     46/*              ereport(LOG, (errmsg_internal("pgpipe failed to bind: %ui", WSAGetLastError()))); */
     47                closesocket(s);
     48                return -1;
     49        }
     50        if (listen(s, 1) == SOCKET_ERROR)
     51        {
     52/*              ereport(LOG, (errmsg_internal("pgpipe failed to listen: %ui", WSAGetLastError()))); */
     53                closesocket(s);
     54                return -1;
     55        }
     56        if (getsockname(s, (SOCKADDR *) & serv_addr, &len) == SOCKET_ERROR)
     57        {
     58/*              ereport(LOG, (errmsg_internal("pgpipe failed to getsockname: %ui", WSAGetLastError()))); */
     59                closesocket(s);
     60                return -1;
     61        }
     62        if ((handles[1] = socket(PF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
     63        {
     64/*              ereport(LOG, (errmsg_internal("pgpipe failed to create socket 2: %ui", WSAGetLastError()))); */
     65                closesocket(s);
     66                return -1;
     67        }
     68 
     69        if (connect(handles[1], (SOCKADDR *) & serv_addr, len) == SOCKET_ERROR)
     70        {
     71/*              ereport(LOG, (errmsg_internal("pgpipe failed to connect socket: %ui", WSAGetLastError()))); */
     72                closesocket(s);
     73                return -1;
     74        }
     75        if ((handles[0] = accept(s, (SOCKADDR *) & serv_addr, &len)) == INVALID_SOCKET)
     76        {
     77/*              ereport(LOG, (errmsg_internal("pgpipe failed to accept socket: %ui", WSAGetLastError()))); */
     78                closesocket(handles[1]);
     79                handles[1] = INVALID_SOCKET;
     80                closesocket(s);
     81                return -1;
     82        }
     83        closesocket(s);
     84        return 0;
     85}
     86 
     87static int
     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)
     100
    24101#else
    25  #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
     105
     106#include <unistd.h>
    27107
    28108#include <event.h>
     
    84164    do
    85165    {
    86         ret = read( fd, &ch, 1 );
     166        ret = piperead( fd, &ch, 1 );
    87167    }
    88168    while( !eh->die && ret < 0 && errno == EAGAIN );
     
    96176            struct tr_run_data data;
    97177            const size_t       nwant = sizeof( data );
    98             const ssize_t      ngot = read( fd, &data, nwant );
     178            const ssize_t      ngot = piperead( fd, &data, nwant );
    99179            if( !eh->die && ( ngot == (ssize_t)nwant ) )
    100180            {
     
    109189            tr_timer *    timer;
    110190            const size_t  nwant = sizeof( timer );
    111             const ssize_t ngot = read( fd, &timer, nwant );
     191            const ssize_t ngot = piperead( fd, &timer, nwant );
    112192            if( !eh->die && ( ngot == (ssize_t)nwant ) )
    113193            {
     
    269349
    270350        tr_lockLock( lock );
    271         write( fd, &ch, 1 );
    272         write( fd, &timer, sizeof( timer ) );
     351        pipewrite( fd, &ch, 1 );
     352        pipewrite( fd, &timer, sizeof( timer ) );
    273353        tr_lockUnlock( lock );
    274354    }
     
    294374
    295375        tr_lockLock( lock );
    296         write( fd, &ch, 1 );
     376        pipewrite( fd, &ch, 1 );
    297377        data.func = func;
    298378        data.user_data = user_data;
    299         write( fd, &data, sizeof( data ) );
     379        pipewrite( fd, &data, sizeof( data ) );
    300380        tr_lockUnlock( lock );
    301381    }
Note: See TracChangeset for help on using the changeset viewer.