~vcs-imports/mammoth-replicator/trunk

« back to all changes in this revision

Viewing changes to src/port/pipe.c

  • Committer: alvherre
  • Date: 2005-12-16 21:24:52 UTC
  • Revision ID: svn-v4:db760fc0-0f08-0410-9d63-cc6633f64896:trunk:1
Initial import of the REL8_0_3 sources from the Pgsql CVS repository.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*-------------------------------------------------------------------------
 
2
 *
 
3
 * pipe.c
 
4
 *        pipe()
 
5
 *
 
6
 * Copyright (c) 1996-2005, PostgreSQL Global Development Group
 
7
 *
 
8
 *      This is a replacement version of pipe for Win32 which allows
 
9
 *      returned handles to be used in select(). Note that read/write calls
 
10
 *      must be replaced with recv/send.
 
11
 *
 
12
 * IDENTIFICATION
 
13
 *        $PostgreSQL: pgsql/src/port/pipe.c,v 1.10 2004-12-31 22:03:53 pgsql Exp $
 
14
 *
 
15
 *-------------------------------------------------------------------------
 
16
 */
 
17
 
 
18
#include "postgres.h"
 
19
 
 
20
#ifdef WIN32
 
21
int
 
22
pgpipe(int handles[2])
 
23
{
 
24
        SOCKET          s;
 
25
        struct sockaddr_in serv_addr;
 
26
        int                     len = sizeof(serv_addr);
 
27
 
 
28
        handles[0] = handles[1] = INVALID_SOCKET;
 
29
 
 
30
        if ((s = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
 
31
        {
 
32
                ereport(LOG, (errmsg_internal("pgpipe failed to create socket: %ui", WSAGetLastError())));
 
33
                return -1;
 
34
        }
 
35
 
 
36
        memset((void *) &serv_addr, 0, sizeof(serv_addr));
 
37
        serv_addr.sin_family = AF_INET;
 
38
        serv_addr.sin_port = htons(0);
 
39
        serv_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
 
40
        if (bind(s, (SOCKADDR *) & serv_addr, len) == SOCKET_ERROR)
 
41
        {
 
42
                ereport(LOG, (errmsg_internal("pgpipe failed to bind: %ui", WSAGetLastError())));
 
43
                closesocket(s);
 
44
                return -1;
 
45
        }
 
46
        if (listen(s, 1) == SOCKET_ERROR)
 
47
        {
 
48
                ereport(LOG, (errmsg_internal("pgpipe failed to listen: %ui", WSAGetLastError())));
 
49
                closesocket(s);
 
50
                return -1;
 
51
        }
 
52
        if (getsockname(s, (SOCKADDR *) & serv_addr, &len) == SOCKET_ERROR)
 
53
        {
 
54
                ereport(LOG, (errmsg_internal("pgpipe failed to getsockname: %ui", WSAGetLastError())));
 
55
                closesocket(s);
 
56
                return -1;
 
57
        }
 
58
        if ((handles[1] = socket(PF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
 
59
        {
 
60
                ereport(LOG, (errmsg_internal("pgpipe failed to create socket 2: %ui", WSAGetLastError())));
 
61
                closesocket(s);
 
62
                return -1;
 
63
        }
 
64
 
 
65
        if (connect(handles[1], (SOCKADDR *) & serv_addr, len) == SOCKET_ERROR)
 
66
        {
 
67
                ereport(LOG, (errmsg_internal("pgpipe failed to connect socket: %ui", WSAGetLastError())));
 
68
                closesocket(s);
 
69
                return -1;
 
70
        }
 
71
        if ((handles[0] = accept(s, (SOCKADDR *) & serv_addr, &len)) == INVALID_SOCKET)
 
72
        {
 
73
                ereport(LOG, (errmsg_internal("pgpipe failed to accept socket: %ui", WSAGetLastError())));
 
74
                closesocket(handles[1]);
 
75
                handles[1] = INVALID_SOCKET;
 
76
                closesocket(s);
 
77
                return -1;
 
78
        }
 
79
        closesocket(s);
 
80
        return 0;
 
81
}
 
82
 
 
83
 
 
84
int
 
85
piperead(int s, char *buf, int len)
 
86
{
 
87
        int                     ret = recv(s, buf, len, 0);
 
88
 
 
89
        if (ret < 0 && WSAGetLastError() == WSAECONNRESET)
 
90
                /* EOF on the pipe! (win32 socket based implementation) */
 
91
                ret = 0;
 
92
        return ret;
 
93
}
 
94
 
 
95
#endif