From pgsql-interfaces-owner+M1688@postgresql.org Tue Jun 5 17:37:13 2001 Reply-To: From: Jeff Johnson To: Subject: [INTERFACES] libpq socket problem on Win32 Date: Thu, 31 May 2001 15:56:18 -0400 Message-ID: X-Priority: 3 (Normal) X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook CWS, Build 9.0.2416 (9.0.2910.0) Importance: Normal X-MimeOLE: Produced By Microsoft MimeOLE V5.50.4133.2400 Precedence: bulk Sender: pgsql-interfaces-owner@postgresql.org Content-Length: 2088 I found a problem in libpq.dll when trying to send large SQL statements to postgres 7.1.x on FreeBSD 4.3 from Windows 2000. The same SQL worked fine when sent from FreeBSD. At first I thought it was something to do with an 8k limit on text fields but it's just low level socket code trying to deal with large packets that breaks on Win32. It looks like recv on Win32 returns ENOENT instead of EAGAIN for some reason. I avoid C as much as possible and low level socket stuff so this is all new to me. I hacked libpq\fe-misc.c to handle ENOENT the same way it handles EAGAIN and everything works now. I got the clue from searching deja.com for "ENOENT EAGAIN recv". The first article describes a similar problem. I don't know if my code is the correct fix. Who should I send it to? Thanks, Jeff > -----Original Message----- > From: pygresql-admin@vex.net > [mailto:pygresql-admin@vex.net]On Behalf Of > Daryl Tester > Sent: Thursday, May 31, 2001 9:56 AM > To: pygresql@vex.net > Subject: Re: [PyGreSQL] limit on size of text fields? > > > Jeff Johnson wrote: > > Netscape just crashed and ate my last reply, so this one will > be brief ... > > > Why does the same script run fine when run from FreeBSD also using > > pygresql? > > No idea. > > > Postgres claims it > > has virtually no limits and 8k seems kinda small for a text field > > limit. > > This is on 6.5 - I've no idea what you're running - > > dt=> create table test ( t text); > CREATE > insert into test values ('xxxxxxxxxxxxxxxxxx'); -- x * 8200 > ERROR: Tuple is too big: size 8236 > EOF > > According to the FAQ on PostgreSQL's website, 7.1 and greater > supports unlimited row size. Which version are you running? > > Regards, > Daryl Tester > > _______________________________________________ > PyGreSQL mailing list > PyGreSQL@vex.net > http://www.vex.net/mailman/listinfo/pygresql > ---------------------------(end of broadcast)--------------------------- TIP 2: you can get off all lists at once with the unregister command (send "unregister YourEmailAddressHere" to majordomo@postgresql.org) From pgsql-docs-owner+M804@postgresql.org Tue Jun 5 17:28:56 2001 Reply-To: From: Jeff Johnson To: , Subject: [DOCS] libpq sockets on win32 Date: Mon, 4 Jun 2001 12:42:12 -0400 Message-ID: X-Priority: 3 (Normal) X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook CWS, Build 9.0.2416 (9.0.2910.0) In-Reply-To: X-MimeOLE: Produced By Microsoft MimeOLE V5.50.4133.2400 Importance: Normal Precedence: bulk Sender: pgsql-docs-owner@postgresql.org Content-Length: 894 I found that sending more than 16k of data in a SQL statement caused a problem. I was using PyGreSQL but narrowed the error down to "\postgresql-7.1.2\src\interfaces\libpq\fe-misc.c" pqReadData() and pqFlush(). After some poking around, it looked like recv was setting errno to ENOENT for some reason. I figured out why today. Win32 sockets don't set errno at all. ENOENT was just left in errno from some earlier call. This article describes the problem and work around. http://msdn.microsoft.com/library/psdk/winsock/ovrvw3_26ia.htm I haven't done much C coding in a few years and don't want to break other code by blindly doing: #define errno WSAGetLastError Does anyone that knows this code want to take a crack at it? Thanks, Jeff ---------------------------(end of broadcast)--------------------------- TIP 1: subscribe and unsubscribe commands go to majordomo@postgresql.org From pgsql-interfaces-owner+M1662@postgresql.org Mon Jun 4 13:19:31 2001 Reply-To: From: Jeff Johnson To: , Subject: [INTERFACES] libpq sockets on win32 Date: Mon, 4 Jun 2001 12:42:12 -0400 Message-ID: X-Priority: 3 (Normal) X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook CWS, Build 9.0.2416 (9.0.2910.0) In-Reply-To: X-MimeOLE: Produced By Microsoft MimeOLE V5.50.4133.2400 Importance: Normal Precedence: bulk Sender: pgsql-interfaces-owner@postgresql.org Content-Length: 859 I found that sending more than 16k of data in a SQL statement caused a problem. I was using PyGreSQL but narrowed the error down to "\postgresql-7.1.2\src\interfaces\libpq\fe-misc.c" pqReadData() and pqFlush(). After some poking around, it looked like recv was setting errno to ENOENT for some reason. I figured out why today. Win32 sockets don't set errno at all. ENOENT was just left in errno from some earlier call. This article describes the problem and work around. http://msdn.microsoft.com/library/psdk/winsock/ovrvw3_26ia.htm I haven't done much C coding in a few years and don't want to break other code by blindly doing: #define errno WSAGetLastError Does anyone that knows this code want to take a crack at it? Thanks, Jeff ---------------------------(end of broadcast)--------------------------- TIP 4: Don't 'kill -9' the postmaster From pgsql-interfaces-owner+M1665@postgresql.org Mon Jun 4 15:00:58 2001 Reply-To: From: Jeff Johnson To: 'Bruce Momjian' , cc: , Subject: RE: [INTERFACES] libpq sockets on win32 Date: Mon, 4 Jun 2001 14:01:52 -0400 Message-ID: X-Priority: 3 (Normal) X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook CWS, Build 9.0.2416 (9.0.2910.0) In-Reply-To: X-MimeOLE: Produced By Microsoft MimeOLE V5.50.4133.2400 Importance: Normal Precedence: bulk Sender: pgsql-interfaces-owner@postgresql.org Content-Length: 517 > > This article describes the problem and work around. > > http://msdn.microsoft.com/library/psdk/winsock/ovrvw3_26ia.htm > > I can't read that web site under Netscape. > > If I could read it, I think I could fix it. Please send it in some > readable format. > I chopped the content out and stuck it into a basic HTML file and attached it. Thanks for taking a look, Jeff [ Attachment, skipping... ] ---------------------------(end of broadcast)--------------------------- TIP 4: Don't 'kill -9' the postmaster From jeff@jeffjohnson.net Mon Jun 4 14:08:25 2001 Reply-To: From: Jeff Johnson To: 'Bruce Momjian' , cc: , Subject: RE: [INTERFACES] libpq sockets on win32 Date: Mon, 4 Jun 2001 14:01:52 -0400 Message-ID: X-Priority: 3 (Normal) X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook CWS, Build 9.0.2416 (9.0.2910.0) In-Reply-To: X-MimeOLE: Produced By Microsoft MimeOLE V5.50.4133.2400 Importance: Normal Content-Length: 404 > > This article describes the problem and work around. > > http://msdn.microsoft.com/library/psdk/winsock/ovrvw3_26ia.htm > > I can't read that web site under Netscape. > > If I could read it, I think I could fix it. Please send it in some > readable format. > I chopped the content out and stuck it into a basic HTML file and attached it. Thanks for taking a look, Jeff [ Attachment, skipping... ] From pgsql-interfaces-owner+M1664@postgresql.org Mon Jun 4 14:49:18 2001 From: Bruce Momjian Message-ID: <200106041822.f54IMjY29512@candle.pha.pa.us> Subject: Re: [INTERFACES] libpq sockets on win32 In-Reply-To: from Jeff Johnson at Jun 4, 2001 02:01:52 pm To: jeff@jeffjohnson.net Date: Mon, 4 Jun 2001 14:22:45 -0400 (EDT) cc: pgsql-interfaces@postgresql.org, pgsql-docs@postgresql.org X-Mailer: ELM [version 2.4ME+ PL90 (25)] Precedence: bulk Sender: pgsql-interfaces-owner@postgresql.org Content-Length: 2326 Can you try this patch and let me know if it helps? It is a different approach. This was the only place I saw errno checked for a non-predefined value. One other solution may be to use the #define only in the libpq C files that need it. What really stinks is that the errno define is only useful for socket errno settings. I do see a use in fe-connect.c: #ifndef WIN32 if (errno == EINPROGRESS || errno == 0) #else if (WSAGetLastError() == WSAEINPROGRESS) #endif I hate to litter this through the whole source. I wonder if we have to bracket the errno checkes with #define/#undef. Can you try that with the fix described on the web page. The above would convert to: #ifdef WIN32 #define errno WSAGetLastError #endif if (errno == EINPROGRESS || errno == 0) #ifdef WIN32 #undef errno #endif Maybe make these into their own macros somehow. > > > This article describes the problem and work around. > > > http://msdn.microsoft.com/library/psdk/winsock/ovrvw3_26ia.htm > > > > I can't read that web site under Netscape. > > > > If I could read it, I think I could fix it. Please send it in some > > readable format. > > > > I chopped the content out and stuck it into a basic HTML file and > attached it. > > Thanks for taking a look, > Jeff [ Attachment, skipping... ] -- Bruce Momjian | http://candle.pha.pa.us pgman@candle.pha.pa.us | (610) 853-3000 + If your life is a hard drive, | 830 Blythe Avenue + Christ can be your backup. | Drexel Hill, Pennsylvania 19026 Index: src/interfaces/libpq/fe-misc.c =================================================================== RCS file: /home/projects/pgsql/cvsroot/pgsql/src/interfaces/libpq/fe-misc.c,v retrieving revision 1.49 diff -c -r1.49 fe-misc.c *** src/interfaces/libpq/fe-misc.c 2001/05/28 15:29:51 1.49 --- src/interfaces/libpq/fe-misc.c 2001/06/04 17:52:40 *************** *** 614,619 **** --- 614,623 ---- int sent; + #ifdef WIN32 + errno = 0; /* Win32 doesn't set this, needs reset */ + #endif + #ifdef USE_SSL if (conn->ssl) sent = SSL_write(conn->ssl, ptr, len); ---------------------------(end of broadcast)--------------------------- TIP 6: Have you searched our list archives? http://www.postgresql.org/search.mpl From pgsql-interfaces-owner+M1667@postgresql.org Mon Jun 4 15:09:54 2001 Date: Mon, 4 Jun 2001 20:24:23 +0200 (CEST) From: Peter Eisentraut To: Jeff Johnson cc: Subject: Re: [INTERFACES] libpq sockets on win32 In-Reply-To: Message-ID: X-Sender: 520083510237-0001@t-dialin.net Precedence: bulk Sender: pgsql-interfaces-owner@postgresql.org Content-Length: 831 Jeff Johnson writes: > After some poking around, it looked like recv was setting errno to > ENOENT for some reason. I figured out why today. Win32 sockets don't > set errno at all. ENOENT was just left in errno from some earlier > call. There are already a few (wrong) attempts to cover this situation in fe-connect.c, but it looks like a bunch of #ifdef's are needed. > I haven't done much C coding in a few years and don't want to break > other code by blindly doing: > > #define errno WSAGetLastError Probably rather #ifndef WIN32 normal code; #else windows code; #endif -- Peter Eisentraut peter_e@gmx.net http://funkturm.homeip.net/~peter ---------------------------(end of broadcast)--------------------------- TIP 5: Have you checked our extensive FAQ? http://www.postgresql.org/users-lounge/docs/faq.html From tgl@sss.pgh.pa.us Mon Jun 4 14:29:46 2001 To: Bruce Momjian cc: jeff@jeffjohnson.net, pgsql-interfaces@postgresql.org, pgsql-docs@postgresql.org Subject: Re: [INTERFACES] libpq sockets on win32 In-Reply-To: <200106041753.f54HrrU27542@candle.pha.pa.us> References: <200106041753.f54HrrU27542@candle.pha.pa.us> Comments: In-reply-to Bruce Momjian message dated "Mon, 04 Jun 2001 13:53:53 -0400" Date: Mon, 04 Jun 2001 14:29:38 -0400 Message-ID: <6675.991679378@sss.pgh.pa.us> From: Tom Lane Content-Length: 683 Bruce Momjian writes: >> This article describes the problem and work around. >> http://msdn.microsoft.com/library/psdk/winsock/ovrvw3_26ia.htm > I can't read that web site under Netscape. Comes up fine for me (maybe you need to turn off Javascript?) However, the advice on it seems to be written by someone who does not know the difference between a variable and a function :-(. Read with a large grain of salt. We already have a couple of #ifdef'd usages of WSAGetLastError() in libpq, but it's quite unclear which other references to errno might need to be changed. A blanket replacement of errno would certainly break things. regards, tom lane From pgsql-interfaces-owner+M1666@postgresql.org Mon Jun 4 15:04:34 2001 To: Bruce Momjian cc: jeff@jeffjohnson.net, pgsql-interfaces@postgresql.org, pgsql-docs@postgresql.org Subject: Re: [INTERFACES] libpq sockets on win32 In-Reply-To: <200106041753.f54HrrU27542@candle.pha.pa.us> References: <200106041753.f54HrrU27542@candle.pha.pa.us> Comments: In-reply-to Bruce Momjian message dated "Mon, 04 Jun 2001 13:53:53 -0400" Date: Mon, 04 Jun 2001 14:29:38 -0400 Message-ID: <6675.991679378@sss.pgh.pa.us> From: Tom Lane Precedence: bulk Sender: pgsql-interfaces-owner@postgresql.org Content-Length: 854 Bruce Momjian writes: >> This article describes the problem and work around. >> http://msdn.microsoft.com/library/psdk/winsock/ovrvw3_26ia.htm > I can't read that web site under Netscape. Comes up fine for me (maybe you need to turn off Javascript?) However, the advice on it seems to be written by someone who does not know the difference between a variable and a function :-(. Read with a large grain of salt. We already have a couple of #ifdef'd usages of WSAGetLastError() in libpq, but it's quite unclear which other references to errno might need to be changed. A blanket replacement of errno would certainly break things. regards, tom lane ---------------------------(end of broadcast)--------------------------- TIP 5: Have you checked our extensive FAQ? http://www.postgresql.org/users-lounge/docs/faq.html From pgsql-interfaces-owner+M1668@postgresql.org Mon Jun 4 15:09:47 2001 From: Bruce Momjian Message-ID: <200106041832.f54IWHD00108@candle.pha.pa.us> Subject: Re: [INTERFACES] libpq sockets on win32 In-Reply-To: <6675.991679378@sss.pgh.pa.us> from Tom Lane at Jun 4, 2001 02:29:38 pm To: Tom Lane Date: Mon, 4 Jun 2001 14:32:17 -0400 (EDT) cc: jeff@jeffjohnson.net, pgsql-interfaces@postgresql.org, pgsql-docs@postgresql.org X-Mailer: ELM [version 2.4ME+ PL90 (25)] Precedence: bulk Sender: pgsql-interfaces-owner@postgresql.org Content-Length: 1323 > Bruce Momjian writes: > >> This article describes the problem and work around. > >> http://msdn.microsoft.com/library/psdk/winsock/ovrvw3_26ia.htm > > > I can't read that web site under Netscape. > > Comes up fine for me (maybe you need to turn off Javascript?) Thanks, that fixed it. > However, the advice on it seems to be written by someone who does not > know the difference between a variable and a function :-(. Read with > a large grain of salt. > > We already have a couple of #ifdef'd usages of WSAGetLastError() in > libpq, but it's quite unclear which other references to errno might > need to be changed. A blanket replacement of errno would certainly > break things. That's why I recommended brackets of #define/#undef around tests of socket errno's. -- Bruce Momjian | http://candle.pha.pa.us pgman@candle.pha.pa.us | (610) 853-3000 + If your life is a hard drive, | 830 Blythe Avenue + Christ can be your backup. | Drexel Hill, Pennsylvania 19026 ---------------------------(end of broadcast)--------------------------- TIP 3: if posting/reading through Usenet, please send an appropriate subscribe-nomail command to majordomo@postgresql.org so that your message can get through to the mailing list cleanly From jeff@jeffjohnson.net Mon Jun 4 15:09:40 2001 Reply-To: From: Jeff Johnson To: 'Bruce Momjian' , cc: , Subject: RE: [INTERFACES] libpq sockets on win32 Date: Mon, 4 Jun 2001 15:03:35 -0400 Message-ID: X-Priority: 3 (Normal) X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook CWS, Build 9.0.2416 (9.0.2910.0) In-Reply-To: X-MimeOLE: Produced By Microsoft MimeOLE V5.50.4133.2400 Importance: Normal Content-Length: 1605 Bruce Momjian wrote: > Can you try this patch and let me know if it helps? It is a different > approach. This was the only place I saw errno checked for a > non-predefined value. Setting errno = 0 doesn't help, the error handling code is entered when recv returns -1, then even if errno == 0, it'll bomb out. > I hate to litter this through the whole source. I wonder if > we have to > bracket the errno checkes with #define/#undef. Can you try that with > the fix described on the web page. The above would convert to: > > #ifdef WIN32 > #define errno WSAGetLastError > #endif > if (errno == EINPROGRESS || errno == 0) > #ifdef WIN32 > #undef errno > #endif > > Maybe make these into their own macros somehow. Even when I was a C programmer I never did much more than simple defines with the pre-compiler so I'll leave this to those that know how :) As Tom Lane points out in another post, the "define errno WSAGetLastError" seems to confuse a variable with a function. I was surprised that such a thing could work. I'm happy to hear that it doesn't. What about something like this: #ifdef WIN32 #define s_errno WSAGetLastError() #else #define s_errno errno #endif /* for socket functions, check s_errno */ if (s_errno == EINPROGRESS || s_errno == 0) ... /* for non-socket functions, check errno as usual */ if (errno == ENOENT) ... Then replace only errno with s_errno when it is used with socket code. I'm not sure if strerror would work with all the errors returned by WSAGetLastError(). The Win32 SDK says to use FormatMessage(a ton of stuff here). Regards, Jeff From pgsql-interfaces-owner+M1669@postgresql.org Mon Jun 4 15:36:36 2001 Reply-To: From: Jeff Johnson To: 'Bruce Momjian' , cc: , Subject: RE: [INTERFACES] libpq sockets on win32 Date: Mon, 4 Jun 2001 15:03:35 -0400 Message-ID: X-Priority: 3 (Normal) X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook CWS, Build 9.0.2416 (9.0.2910.0) In-Reply-To: X-MimeOLE: Produced By Microsoft MimeOLE V5.50.4133.2400 Importance: Normal Precedence: bulk Sender: pgsql-interfaces-owner@postgresql.org Content-Length: 1761 Bruce Momjian wrote: > Can you try this patch and let me know if it helps? It is a different > approach. This was the only place I saw errno checked for a > non-predefined value. Setting errno = 0 doesn't help, the error handling code is entered when recv returns -1, then even if errno == 0, it'll bomb out. > I hate to litter this through the whole source. I wonder if > we have to > bracket the errno checkes with #define/#undef. Can you try that with > the fix described on the web page. The above would convert to: > > #ifdef WIN32 > #define errno WSAGetLastError > #endif > if (errno == EINPROGRESS || errno == 0) > #ifdef WIN32 > #undef errno > #endif > > Maybe make these into their own macros somehow. Even when I was a C programmer I never did much more than simple defines with the pre-compiler so I'll leave this to those that know how :) As Tom Lane points out in another post, the "define errno WSAGetLastError" seems to confuse a variable with a function. I was surprised that such a thing could work. I'm happy to hear that it doesn't. What about something like this: #ifdef WIN32 #define s_errno WSAGetLastError() #else #define s_errno errno #endif /* for socket functions, check s_errno */ if (s_errno == EINPROGRESS || s_errno == 0) ... /* for non-socket functions, check errno as usual */ if (errno == ENOENT) ... Then replace only errno with s_errno when it is used with socket code. I'm not sure if strerror would work with all the errors returned by WSAGetLastError(). The Win32 SDK says to use FormatMessage(a ton of stuff here). Regards, Jeff ---------------------------(end of broadcast)--------------------------- TIP 6: Have you searched our list archives? http://www.postgresql.org/search.mpl From pgsql-interfaces-owner+M1670@postgresql.org Mon Jun 4 16:01:48 2001 From: Bruce Momjian Message-ID: <200106041921.f54JLns03333@candle.pha.pa.us> Subject: Re: [INTERFACES] libpq sockets on win32 In-Reply-To: from Jeff Johnson at Jun 4, 2001 03:03:35 pm To: jeff@jeffjohnson.net Date: Mon, 4 Jun 2001 15:21:49 -0400 (EDT) cc: pgsql-interfaces@postgresql.org, pgsql-docs@postgresql.org X-Mailer: ELM [version 2.4ME+ PL90 (25)] Precedence: bulk Sender: pgsql-interfaces-owner@postgresql.org Content-Length: 12086 > As Tom Lane points out in another post, the "define errno > WSAGetLastError" seems to confuse a variable with a function. I was > surprised that such a thing could work. I'm happy to hear that it > doesn't. > > What about something like this: > > #ifdef WIN32 > #define s_errno WSAGetLastError() > #else > #define s_errno errno > #endif > > /* for socket functions, check s_errno */ > if (s_errno == EINPROGRESS || s_errno == 0) > ... > > /* for non-socket functions, check errno as usual */ > if (errno == ENOENT) > ... I have done exactly that. I assume fcntl(), ioctl(), select() use errno even if used on a socket, while getsockopt(), setsockopt(), socket(), connect(), getsockname(), send(), recv() use WSAGetLastError. Is this list correct? The patch is attached. Please let me know so I can finalize it and apply it. -- Bruce Momjian | http://candle.pha.pa.us pgman@candle.pha.pa.us | (610) 853-3000 + If your life is a hard drive, | 830 Blythe Avenue + Christ can be your backup. | Drexel Hill, Pennsylvania 19026 Index: src/interfaces/libpq/fe-connect.c =================================================================== RCS file: /home/projects/pgsql/cvsroot/pgsql/src/interfaces/libpq/fe-connect.c,v retrieving revision 1.164 diff -c -r1.164 fe-connect.c *** src/interfaces/libpq/fe-connect.c 2001/03/31 23:14:37 1.164 --- src/interfaces/libpq/fe-connect.c 2001/06/04 19:18:14 *************** *** 735,741 **** { printfPQExpBuffer(&conn->errorMessage, "connectNoDelay() -- setsockopt failed: errno=%d\n%s\n", ! errno, strerror(errno)); #ifdef WIN32 printf("Winsock error: %i\n", WSAGetLastError()); #endif --- 735,741 ---- { printfPQExpBuffer(&conn->errorMessage, "connectNoDelay() -- setsockopt failed: errno=%d\n%s\n", ! sockerrno, strerror(sockerrno)); #ifdef WIN32 printf("Winsock error: %i\n", WSAGetLastError()); #endif *************** *** 890,896 **** printfPQExpBuffer(&conn->errorMessage, "connectDBStart() -- " "socket() failed: errno=%d\n%s\n", ! errno, strerror(errno)); goto connect_errReturn; } --- 890,896 ---- printfPQExpBuffer(&conn->errorMessage, "connectDBStart() -- " "socket() failed: errno=%d\n%s\n", ! sockerrno, strerror(sockerrno)); goto connect_errReturn; } *************** *** 934,944 **** */ if (connect(conn->sock, &conn->raddr.sa, conn->raddr_len) < 0) { ! #ifndef WIN32 ! if (errno == EINPROGRESS || errno == 0) ! #else ! if (WSAGetLastError() == WSAEINPROGRESS) ! #endif { /* --- 934,940 ---- */ if (connect(conn->sock, &conn->raddr.sa, conn->raddr_len) < 0) { ! if (sockerrno == EINPROGRESS || sockerrno == 0) { /* *************** *** 950,956 **** else { /* Something's gone wrong */ ! connectFailureMessage(conn, "connectDBStart()", errno); goto connect_errReturn; } } --- 946,952 ---- else { /* Something's gone wrong */ ! connectFailureMessage(conn, "connectDBStart()", sockerrno); goto connect_errReturn; } } *************** *** 970,983 **** { printfPQExpBuffer(&conn->errorMessage, "connectDB() -- couldn't send SSL negotiation packet: errno=%d\n%s\n", ! errno, strerror(errno)); goto connect_errReturn; } /* Now receive the postmasters response */ if (recv(conn->sock, &SSLok, 1, 0) != 1) { printfPQExpBuffer(&conn->errorMessage, "PQconnectDB() -- couldn't read postmaster response: errno=%d\n%s\n", ! errno, strerror(errno)); goto connect_errReturn; } if (SSLok == 'S') --- 966,979 ---- { printfPQExpBuffer(&conn->errorMessage, "connectDB() -- couldn't send SSL negotiation packet: errno=%d\n%s\n", ! sockerrno, strerror(sockerrno)); goto connect_errReturn; } /* Now receive the postmasters response */ if (recv(conn->sock, &SSLok, 1, 0) != 1) { printfPQExpBuffer(&conn->errorMessage, "PQconnectDB() -- couldn't read postmaster response: errno=%d\n%s\n", ! sockerrno, strerror(sockerrno)); goto connect_errReturn; } if (SSLok == 'S') *************** *** 1233,1239 **** printfPQExpBuffer(&conn->errorMessage, "PQconnectPoll() -- getsockopt() failed: " "errno=%d\n%s\n", ! errno, strerror(errno)); goto error_return; } else if (optval != 0) --- 1229,1235 ---- printfPQExpBuffer(&conn->errorMessage, "PQconnectPoll() -- getsockopt() failed: " "errno=%d\n%s\n", ! sockerrno, strerror(sockerrno)); goto error_return; } else if (optval != 0) *************** *** 1255,1261 **** printfPQExpBuffer(&conn->errorMessage, "PQconnectPoll() -- getsockname() failed: " "errno=%d\n%s\n", ! errno, strerror(errno)); goto error_return; } --- 1251,1257 ---- printfPQExpBuffer(&conn->errorMessage, "PQconnectPoll() -- getsockname() failed: " "errno=%d\n%s\n", ! sockerrno, strerror(sockerrno)); goto error_return; } *************** *** 1296,1302 **** "PQconnectPoll() -- " "couldn't send startup packet: " "errno=%d\n%s\n", ! errno, strerror(errno)); goto error_return; } --- 1292,1298 ---- "PQconnectPoll() -- " "couldn't send startup packet: " "errno=%d\n%s\n", ! sockerrno, strerror(sockerrno)); goto error_return; } *************** *** 2110,2116 **** --- 2106,2114 ---- int PQrequestCancel(PGconn *conn) { + #ifndef WIN32 int save_errno = errno; + #endif int tmpsock = -1; struct { *************** *** 2127,2133 **** --- 2125,2133 ---- strcpy(conn->errorMessage.data, "PQrequestCancel() -- connection is not open\n"); conn->errorMessage.len = strlen(conn->errorMessage.data); + #ifndef WIN32 errno = save_errno; + #endif return FALSE; } *************** *** 2173,2183 **** close(tmpsock); #endif errno = save_errno; return TRUE; cancel_errReturn: ! strcat(conn->errorMessage.data, strerror(errno)); strcat(conn->errorMessage.data, "\n"); conn->errorMessage.len = strlen(conn->errorMessage.data); if (tmpsock >= 0) --- 2173,2185 ---- close(tmpsock); #endif + #ifndef WIN32 errno = save_errno; + #endif return TRUE; cancel_errReturn: ! strcat(conn->errorMessage.data, strerror(sockerrno)); strcat(conn->errorMessage.data, "\n"); conn->errorMessage.len = strlen(conn->errorMessage.data); if (tmpsock >= 0) *************** *** 2188,2194 **** --- 2190,2198 ---- close(tmpsock); #endif } + #ifndef WIN32 errno = save_errno; + #endif return FALSE; } Index: src/interfaces/libpq/fe-misc.c =================================================================== RCS file: /home/projects/pgsql/cvsroot/pgsql/src/interfaces/libpq/fe-misc.c,v retrieving revision 1.49 diff -c -r1.49 fe-misc.c *** src/interfaces/libpq/fe-misc.c 2001/05/28 15:29:51 1.49 --- src/interfaces/libpq/fe-misc.c 2001/06/04 19:18:20 *************** *** 447,471 **** conn->inBufSize - conn->inEnd, 0); if (nread < 0) { ! if (errno == EINTR) goto tryAgain; /* Some systems return EAGAIN/EWOULDBLOCK for no data */ #ifdef EAGAIN ! if (errno == EAGAIN) return someread; #endif #if defined(EWOULDBLOCK) && (!defined(EAGAIN) || (EWOULDBLOCK != EAGAIN)) ! if (errno == EWOULDBLOCK) return someread; #endif /* We might get ECONNRESET here if using TCP and backend died */ #ifdef ECONNRESET ! if (errno == ECONNRESET) goto definitelyFailed; #endif printfPQExpBuffer(&conn->errorMessage, "pqReadData() -- read() failed: errno=%d\n%s\n", ! errno, strerror(errno)); return -1; } if (nread > 0) --- 447,471 ---- conn->inBufSize - conn->inEnd, 0); if (nread < 0) { ! if (sockerrno == EINTR) goto tryAgain; /* Some systems return EAGAIN/EWOULDBLOCK for no data */ #ifdef EAGAIN ! if (sockerrno == EAGAIN) return someread; #endif #if defined(EWOULDBLOCK) && (!defined(EAGAIN) || (EWOULDBLOCK != EAGAIN)) ! if (sockerrno == EWOULDBLOCK) return someread; #endif /* We might get ECONNRESET here if using TCP and backend died */ #ifdef ECONNRESET ! if (sockerrno == ECONNRESET) goto definitelyFailed; #endif printfPQExpBuffer(&conn->errorMessage, "pqReadData() -- read() failed: errno=%d\n%s\n", ! sockerrno, strerror(sockerrno)); return -1; } if (nread > 0) *************** *** 533,557 **** conn->inBufSize - conn->inEnd, 0); if (nread < 0) { ! if (errno == EINTR) goto tryAgain2; /* Some systems return EAGAIN/EWOULDBLOCK for no data */ #ifdef EAGAIN ! if (errno == EAGAIN) return 0; #endif #if defined(EWOULDBLOCK) && (!defined(EAGAIN) || (EWOULDBLOCK != EAGAIN)) ! if (errno == EWOULDBLOCK) return 0; #endif /* We might get ECONNRESET here if using TCP and backend died */ #ifdef ECONNRESET ! if (errno == ECONNRESET) goto definitelyFailed; #endif printfPQExpBuffer(&conn->errorMessage, "pqReadData() -- read() failed: errno=%d\n%s\n", ! errno, strerror(errno)); return -1; } if (nread > 0) --- 533,557 ---- conn->inBufSize - conn->inEnd, 0); if (nread < 0) { ! if (sockerrno == EINTR) goto tryAgain2; /* Some systems return EAGAIN/EWOULDBLOCK for no data */ #ifdef EAGAIN ! if (sockerrno == EAGAIN) return 0; #endif #if defined(EWOULDBLOCK) && (!defined(EAGAIN) || (EWOULDBLOCK != EAGAIN)) ! if (sockerrno == EWOULDBLOCK) return 0; #endif /* We might get ECONNRESET here if using TCP and backend died */ #ifdef ECONNRESET ! if (sockerrno == ECONNRESET) goto definitelyFailed; #endif printfPQExpBuffer(&conn->errorMessage, "pqReadData() -- read() failed: errno=%d\n%s\n", ! sockerrno, strerror(sockerrno)); return -1; } if (nread > 0) *************** *** 633,639 **** * EPIPE or ECONNRESET, assume we've lost the backend * connection permanently. */ ! switch (errno) { #ifdef EAGAIN case EAGAIN: --- 633,639 ---- * EPIPE or ECONNRESET, assume we've lost the backend * connection permanently. */ ! switch (sockerrno) { #ifdef EAGAIN case EAGAIN: *************** *** 668,674 **** default: printfPQExpBuffer(&conn->errorMessage, "pqFlush() -- couldn't send data: errno=%d\n%s\n", ! errno, strerror(errno)); /* We don't assume it's a fatal error... */ return EOF; } --- 668,674 ---- default: printfPQExpBuffer(&conn->errorMessage, "pqFlush() -- couldn't send data: errno=%d\n%s\n", ! sockerrno, strerror(sockerrno)); /* We don't assume it's a fatal error... */ return EOF; } Index: src/interfaces/libpq/libpq-int.h =================================================================== RCS file: /home/projects/pgsql/cvsroot/pgsql/src/interfaces/libpq/libpq-int.h,v retrieving revision 1.33 diff -c -r1.33 libpq-int.h *** src/interfaces/libpq/libpq-int.h 2001/03/22 04:01:27 1.33 --- src/interfaces/libpq/libpq-int.h 2001/06/04 19:18:23 *************** *** 34,39 **** --- 34,45 ---- #include #endif + #ifndef WIN32 + #define sockerrno errno + #else + #define sockerrno WSAGetLastError + #endif + /* libpq supports this version of the frontend/backend protocol. * * NB: we used to use PG_PROTOCOL_LATEST from the backend pqcomm.h file, ---------------------------(end of broadcast)--------------------------- TIP 2: you can get off all lists at once with the unregister command (send "unregister YourEmailAddressHere" to majordomo@postgresql.org) From jeff@jeffjohnson.net Mon Jun 4 15:54:55 2001 Reply-To: From: Jeff Johnson To: 'Bruce Momjian' , cc: , Subject: RE: [INTERFACES] libpq sockets on win32 Date: Mon, 4 Jun 2001 15:48:50 -0400 Message-ID: X-Priority: 3 (Normal) X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook CWS, Build 9.0.2416 (9.0.2910.0) In-Reply-To: X-MimeOLE: Produced By Microsoft MimeOLE V5.50.4133.2400 Importance: Normal Content-Length: 2120 > I have done exactly that. I assume fcntl(), ioctl(), > select() use errno > even if used on a socket, while getsockopt(), setsockopt(), socket(), > connect(), getsockname(), send(), recv() use WSAGetLastError. Is this > list correct? I don't know enough about such things. > > The patch is attached. Please let me know so I can finalize it and > apply it. Couple of changes required to compile on Win32: Change: #define sockerrno WSAGetLastError To: #define sockerrno WSAGetLastError() This has to go back into fe-connect.c, EINPROGRESS isn't defined in Win32 for some reason.. #ifndef WIN32 if (errno == EINPROGRESS || errno == 0) #else if (WSAGetLastError() == WSAEINPROGRESS) #endif I tested it out but I'm getting this error when sending a large SQL statement (>16k). File "WebKit\Application.py", line 340, in dispatchRequest self.handleGoodURL(transaction) File "WebKit\Application.py", line 457, in handleGoodURL self.respond(transaction) File "WebKit\Application.py", line 569, in respond transaction.respond() File "H:\webware\Webware\WebKit\Transaction.py", line 93, in respond self._servlet.respond(self) File "H:\webware\Webware\WebKit\HTTPServlet.py", line 38, in respond method(self, trans) File "H:\webware\Webware\WebKit\Page.py", line 34, in respondToGet self._respond(transaction) File "H:\webware\Webware\WebKit\Page.py", line 67, in _respond self.writeHTML() File "H:\webware\Webware\WebKit\Page.py", line 129, in writeHTML self.writeBody() File "H:\webware\Webware\WebKit\Page.py", line 186, in writeBody self.writeBodyParts() File "/EA\www\SitePage.py", line 305, in writeBodyParts self.writeContent() File "\EA\www\MyTest.py", line 9, in writeContent self.transferRecords() File "\EA\www\MyTest.py", line 45, in transferRecords cu.execute(sql) File "c:\python20\pgdb.py", line 189, in execute self.executemany(operation, (params,)) File "c:\python20\pgdb.py", line 204, in executemany rows = self.__source.execute(sql) ValueError: pqReadData() -- read() failed: errno=10035 Unknown error From pgsql-interfaces-owner+M1671@postgresql.org Mon Jun 4 16:08:04 2001 Reply-To: From: Jeff Johnson To: 'Bruce Momjian' , cc: , Subject: RE: [INTERFACES] libpq sockets on win32 Date: Mon, 4 Jun 2001 15:48:50 -0400 Message-ID: X-Priority: 3 (Normal) X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook CWS, Build 9.0.2416 (9.0.2910.0) In-Reply-To: X-MimeOLE: Produced By Microsoft MimeOLE V5.50.4133.2400 Importance: Normal Precedence: bulk Sender: pgsql-interfaces-owner@postgresql.org Content-Length: 2381 > I have done exactly that. I assume fcntl(), ioctl(), > select() use errno > even if used on a socket, while getsockopt(), setsockopt(), socket(), > connect(), getsockname(), send(), recv() use WSAGetLastError. Is this > list correct? I don't know enough about such things. > > The patch is attached. Please let me know so I can finalize it and > apply it. Couple of changes required to compile on Win32: Change: #define sockerrno WSAGetLastError To: #define sockerrno WSAGetLastError() This has to go back into fe-connect.c, EINPROGRESS isn't defined in Win32 for some reason.. #ifndef WIN32 if (errno == EINPROGRESS || errno == 0) #else if (WSAGetLastError() == WSAEINPROGRESS) #endif I tested it out but I'm getting this error when sending a large SQL statement (>16k). File "WebKit\Application.py", line 340, in dispatchRequest self.handleGoodURL(transaction) File "WebKit\Application.py", line 457, in handleGoodURL self.respond(transaction) File "WebKit\Application.py", line 569, in respond transaction.respond() File "H:\webware\Webware\WebKit\Transaction.py", line 93, in respond self._servlet.respond(self) File "H:\webware\Webware\WebKit\HTTPServlet.py", line 38, in respond method(self, trans) File "H:\webware\Webware\WebKit\Page.py", line 34, in respondToGet self._respond(transaction) File "H:\webware\Webware\WebKit\Page.py", line 67, in _respond self.writeHTML() File "H:\webware\Webware\WebKit\Page.py", line 129, in writeHTML self.writeBody() File "H:\webware\Webware\WebKit\Page.py", line 186, in writeBody self.writeBodyParts() File "/EA\www\SitePage.py", line 305, in writeBodyParts self.writeContent() File "\EA\www\MyTest.py", line 9, in writeContent self.transferRecords() File "\EA\www\MyTest.py", line 45, in transferRecords cu.execute(sql) File "c:\python20\pgdb.py", line 189, in execute self.executemany(operation, (params,)) File "c:\python20\pgdb.py", line 204, in executemany rows = self.__source.execute(sql) ValueError: pqReadData() -- read() failed: errno=10035 Unknown error ---------------------------(end of broadcast)--------------------------- TIP 3: if posting/reading through Usenet, please send an appropriate subscribe-nomail command to majordomo@postgresql.org so that your message can get through to the mailing list cleanly From pgsql-interfaces-owner+M1673@postgresql.org Mon Jun 4 17:09:06 2001 Reply-To: From: Jeff Johnson To: 'Bruce Momjian' , cc: , Subject: RE: [INTERFACES] libpq sockets on win32 Date: Mon, 4 Jun 2001 16:25:05 -0400 Message-ID: X-Priority: 3 (Normal) X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook CWS, Build 9.0.2416 (9.0.2910.0) In-Reply-To: X-MimeOLE: Produced By Microsoft MimeOLE V5.50.4133.2400 Importance: Normal Precedence: bulk Sender: pgsql-interfaces-owner@postgresql.org Content-Length: 2697 I found this in WinSock.h ... it might shed some light on the problem. #define WSABASEERR 10000 [snip] /* * Windows Sockets definitions of regular Berkeley error constants */ #define WSAEWOULDBLOCK (WSABASEERR+35) #define WSAEINPROGRESS (WSABASEERR+36) > -----Original Message----- > From: Bruce Momjian [mailto:pgman@candle.pha.pa.us] > Sent: Monday, June 04, 2001 4:02 PM > To: jeff@jeffjohnson.net > Cc: pgsql-interfaces@postgresql.org; pgsql-docs@postgresql.org > Subject: Re: [INTERFACES] libpq sockets on win32 > > > > > I have done exactly that. I assume fcntl(), ioctl(), > > > select() use errno > > > even if used on a socket, while getsockopt(), setsockopt(), > > socket(), > > > connect(), getsockname(), send(), recv() use WSAGetLastError. Is > > this > > > list correct? > > > > I don't know enough about such things. > > The web page wasn't clear about that. > > > > > > > The patch is attached. Please let me know so I can > finalize it and > > > apply it. > > > > Couple of changes required to compile on Win32: > > > > Change: > > #define sockerrno WSAGetLastError > > To: > > #define sockerrno WSAGetLastError() > > > > OK. > > > > > This has to go back into fe-connect.c, EINPROGRESS isn't defined in > > Win32 for some reason.. > > #ifndef WIN32 > > if (errno == EINPROGRESS || errno == 0) > > #else > > if (WSAGetLastError() == WSAEINPROGRESS) > > #endif > > > > OK. Not sure why it wasn't defined, but, oh well. > > > > > > > I tested it out but I'm getting this error when sending a large SQL > > statement (>16k). > > cu.execute(sql) > > File "c:\python20\pgdb.py", line 189, in execute > > self.executemany(operation, (params,)) > > File "c:\python20\pgdb.py", line 204, in executemany > > rows = self.__source.execute(sql) > > ValueError: pqReadData() -- read() failed: errno=10035 > > Unknown error > > That errno is very high, 10035. If I take a look at my sys/errno.h on > BSD/OS, I see: > > #define EAGAIN 35 /* Resource temporarily > unavailable */ > > so my guess is that WSAGetLastError() returns errno plus 10,000. What > value does your include file set for EAGAIN, 10035 or 35. If > it is 35, > the following patch may work. It has all your suggested fixes. > > -- > Bruce Momjian | http://candle.pha.pa.us > pgman@candle.pha.pa.us | (610) 853-3000 > + If your life is a hard drive, | 830 Blythe Avenue > + Christ can be your backup. | Drexel Hill, > Pennsylvania 19026 > ---------------------------(end of broadcast)--------------------------- TIP 1: subscribe and unsubscribe commands go to majordomo@postgresql.org From jeff@jeffjohnson.net Mon Jun 4 16:31:10 2001 Reply-To: From: Jeff Johnson To: 'Bruce Momjian' , cc: , Subject: RE: [INTERFACES] libpq sockets on win32 Date: Mon, 4 Jun 2001 16:25:05 -0400 Message-ID: X-Priority: 3 (Normal) X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook CWS, Build 9.0.2416 (9.0.2910.0) In-Reply-To: X-MimeOLE: Produced By Microsoft MimeOLE V5.50.4133.2400 Importance: Normal Content-Length: 2550 I found this in WinSock.h ... it might shed some light on the problem. #define WSABASEERR 10000 [snip] /* * Windows Sockets definitions of regular Berkeley error constants */ #define WSAEWOULDBLOCK (WSABASEERR+35) #define WSAEINPROGRESS (WSABASEERR+36) > -----Original Message----- > From: Bruce Momjian [mailto:pgman@candle.pha.pa.us] > Sent: Monday, June 04, 2001 4:02 PM > To: jeff@jeffjohnson.net > Cc: pgsql-interfaces@postgresql.org; pgsql-docs@postgresql.org > Subject: Re: [INTERFACES] libpq sockets on win32 > > > > > I have done exactly that. I assume fcntl(), ioctl(), > > > select() use errno > > > even if used on a socket, while getsockopt(), setsockopt(), > > socket(), > > > connect(), getsockname(), send(), recv() use WSAGetLastError. Is > > this > > > list correct? > > > > I don't know enough about such things. > > The web page wasn't clear about that. > > > > > > > The patch is attached. Please let me know so I can > finalize it and > > > apply it. > > > > Couple of changes required to compile on Win32: > > > > Change: > > #define sockerrno WSAGetLastError > > To: > > #define sockerrno WSAGetLastError() > > > > OK. > > > > > This has to go back into fe-connect.c, EINPROGRESS isn't defined in > > Win32 for some reason.. > > #ifndef WIN32 > > if (errno == EINPROGRESS || errno == 0) > > #else > > if (WSAGetLastError() == WSAEINPROGRESS) > > #endif > > > > OK. Not sure why it wasn't defined, but, oh well. > > > > > > > I tested it out but I'm getting this error when sending a large SQL > > statement (>16k). > > cu.execute(sql) > > File "c:\python20\pgdb.py", line 189, in execute > > self.executemany(operation, (params,)) > > File "c:\python20\pgdb.py", line 204, in executemany > > rows = self.__source.execute(sql) > > ValueError: pqReadData() -- read() failed: errno=10035 > > Unknown error > > That errno is very high, 10035. If I take a look at my sys/errno.h on > BSD/OS, I see: > > #define EAGAIN 35 /* Resource temporarily > unavailable */ > > so my guess is that WSAGetLastError() returns errno plus 10,000. What > value does your include file set for EAGAIN, 10035 or 35. If > it is 35, > the following patch may work. It has all your suggested fixes. > > -- > Bruce Momjian | http://candle.pha.pa.us > pgman@candle.pha.pa.us | (610) 853-3000 > + If your life is a hard drive, | 830 Blythe Avenue > + Christ can be your backup. | Drexel Hill, > Pennsylvania 19026 > From pgsql-interfaces-owner+M1674@postgresql.org Mon Jun 4 17:13:00 2001 From: Bruce Momjian Message-ID: <200106042035.f54KZ8409367@candle.pha.pa.us> Subject: Re: [INTERFACES] libpq sockets on win32 In-Reply-To: from Jeff Johnson at Jun 4, 2001 04:25:05 pm To: jeff@jeffjohnson.net Date: Mon, 4 Jun 2001 16:35:08 -0400 (EDT) cc: pgsql-interfaces@postgresql.org, pgsql-docs@postgresql.org X-Mailer: ELM [version 2.4ME+ PL90 (25)] Precedence: bulk Sender: pgsql-interfaces-owner@postgresql.org Content-Length: 933 > I found this in WinSock.h ... it might shed some light on the problem. > > > #define WSABASEERR 10000 > [snip] > > /* > * Windows Sockets definitions of regular Berkeley error constants > */ > #define WSAEWOULDBLOCK (WSABASEERR+35) > #define WSAEINPROGRESS (WSABASEERR+36) > I modified the patch to use WSABASEERR rather than 10000. Do your includes define EAGAIN and stuff like that? Whare are those values? If they are the same as WSAEAGAIN, then my patch should work. -- Bruce Momjian | http://candle.pha.pa.us pgman@candle.pha.pa.us | (610) 853-3000 + If your life is a hard drive, | 830 Blythe Avenue + Christ can be your backup. | Drexel Hill, Pennsylvania 19026 ---------------------------(end of broadcast)--------------------------- TIP 6: Have you searched our list archives? http://www.postgresql.org/search.mpl From jeff@jeffjohnson.net Mon Jun 4 17:17:27 2001 Reply-To: From: Jeff Johnson To: 'Bruce Momjian' Subject: RE: [INTERFACES] libpq sockets on win32 Date: Mon, 4 Jun 2001 17:11:23 -0400 Message-ID: X-Priority: 3 (Normal) X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook CWS, Build 9.0.2416 (9.0.2910.0) In-Reply-To: X-MimeOLE: Produced By Microsoft MimeOLE V5.50.4133.2400 Importance: Normal Content-Length: 863 > > I found this in WinSock.h ... it might shed some light on > the problem. > > > > > > #define WSABASEERR 10000 > > [snip] > > > > /* > > * Windows Sockets definitions of regular Berkeley error constants > > */ > > #define WSAEWOULDBLOCK (WSABASEERR+35) > > #define WSAEINPROGRESS (WSABASEERR+36) > > > > I modified the patch to use WSABASEERR rather than 10000. > > Do your includes define EAGAIN and stuff like that? Whare are those > values? If they are the same as WSAEAGAIN, then my patch should work. >From what I've seen, it looks like EAGAIN and EWOULDBLOCK represent the same thing but on different OSs. On my win32 machine, there is no definition for WSAEAGAIN, I think it uses WSAEWOULDBLOCK instead. EAGAIN is defined as 11 so the sockerror - 1000 solution isn't going to work here but it was a good try :) From pgsql-docs-owner+M803@postgresql.org Mon Jun 4 17:29:10 2001 From: Bruce Momjian Message-ID: <200106042035.f54KZ8409367@candle.pha.pa.us> Subject: [DOCS] Re: [INTERFACES] libpq sockets on win32 In-Reply-To: from Jeff Johnson at Jun 4, 2001 04:25:05 pm To: jeff@jeffjohnson.net Date: Mon, 4 Jun 2001 16:35:08 -0400 (EDT) cc: pgsql-interfaces@postgresql.org, pgsql-docs@postgresql.org X-Mailer: ELM [version 2.4ME+ PL90 (25)] Precedence: bulk Sender: pgsql-docs-owner@postgresql.org Content-Length: 924 > I found this in WinSock.h ... it might shed some light on the problem. > > > #define WSABASEERR 10000 > [snip] > > /* > * Windows Sockets definitions of regular Berkeley error constants > */ > #define WSAEWOULDBLOCK (WSABASEERR+35) > #define WSAEINPROGRESS (WSABASEERR+36) > I modified the patch to use WSABASEERR rather than 10000. Do your includes define EAGAIN and stuff like that? Whare are those values? If they are the same as WSAEAGAIN, then my patch should work. -- Bruce Momjian | http://candle.pha.pa.us pgman@candle.pha.pa.us | (610) 853-3000 + If your life is a hard drive, | 830 Blythe Avenue + Christ can be your backup. | Drexel Hill, Pennsylvania 19026 ---------------------------(end of broadcast)--------------------------- TIP 1: subscribe and unsubscribe commands go to majordomo@postgresql.org From mha@sollentuna.net Tue Jun 5 10:47:26 2001 X-MimeOLE: Produced By Microsoft Exchange V6.0.4418.65 Content-Class: urn:content-classes:message Subject: RE: [DOCS] Re: [INTERFACES] libpq sockets on win32 Date: Tue, 5 Jun 2001 16:47:02 +0200 Message-ID: <81124B76C0CF364EBAC6CD213ABEDEF701AA0D@ARGON.edu.sollentuna.se> X-MS-Has-Attach: X-MS-TNEF-Correlator: Thread-Topic: [DOCS] Re: [INTERFACES] libpq sockets on win32 Thread-Index: AcDtMv+ZlEOBPSGzQV6B/+jItK6tQAAmmDSg From: Magnus Hagander To: Bruce Momjian , cc: X-MIME-Autoconverted: from quoted-printable to 8bit by candle.pha.pa.us id f55ElOc09621 Content-Length: 1074 > > > I have done exactly that. I assume fcntl(), ioctl(), > > > select() use errno > > > even if used on a socket, while getsockopt(), setsockopt(), > > socket(), > > > connect(), getsockname(), send(), recv() use WSAGetLastError. Is > > this > > > list correct? > > > > I don't know enough about such things. > > The web page wasn't clear about that. No, that list is not correct. 1) select() can *only* be used on a socket in Windows, and it puts its error info in WSAGetLastError(). 2) ioctl() should *not* be used on sockets. Instead, ioctlsocket() shuold be used. ioctlsocket() puts its error info in WSAGetLastError(). (http://msdn.microsoft.com/library/psdk/winsock/ovrvw3_98mq.htm). (loads fine in my Netscape, doesn't look all that good, but definitly readable) 3) fcntl() should *not* be used on sockets. ioctlsocket() again. Generaelly, all functions dealing with sockets use WSAGetLastError(). And sockets and file descriptors are *not* necessarily interchangable on Win32. Note - this is Win32, *not* cygwin. Cygwin maps to errno, AFAIK. //Magnus From pgsql-interfaces-owner+M1682@postgresql.org Tue Jun 5 12:11:11 2001 X-MimeOLE: Produced By Microsoft Exchange V6.0.4418.65 Content-Class: urn:content-classes:message Subject: RE: [DOCS] Re: [INTERFACES] libpq sockets on win32 Date: Tue, 5 Jun 2001 16:47:02 +0200 Message-ID: <81124B76C0CF364EBAC6CD213ABEDEF701AA0D@ARGON.edu.sollentuna.se> X-MS-Has-Attach: X-MS-TNEF-Correlator: Thread-Topic: [DOCS] Re: [INTERFACES] libpq sockets on win32 Thread-Index: AcDtMv+ZlEOBPSGzQV6B/+jItK6tQAAmmDSg From: Magnus Hagander To: Bruce Momjian , cc: X-MIME-Autoconverted: from quoted-printable to 8bit by postgresql.org id f55ElTE38246 Precedence: bulk Sender: pgsql-interfaces-owner@postgresql.org Content-Length: 1186 > > > I have done exactly that. I assume fcntl(), ioctl(), > > > select() use errno > > > even if used on a socket, while getsockopt(), setsockopt(), > > socket(), > > > connect(), getsockname(), send(), recv() use WSAGetLastError. Is > > this > > > list correct? > > > > I don't know enough about such things. > > The web page wasn't clear about that. No, that list is not correct. 1) select() can *only* be used on a socket in Windows, and it puts its error info in WSAGetLastError(). 2) ioctl() should *not* be used on sockets. Instead, ioctlsocket() shuold be used. ioctlsocket() puts its error info in WSAGetLastError(). (http://msdn.microsoft.com/library/psdk/winsock/ovrvw3_98mq.htm). (loads fine in my Netscape, doesn't look all that good, but definitly readable) 3) fcntl() should *not* be used on sockets. ioctlsocket() again. Generaelly, all functions dealing with sockets use WSAGetLastError(). And sockets and file descriptors are *not* necessarily interchangable on Win32. Note - this is Win32, *not* cygwin. Cygwin maps to errno, AFAIK. //Magnus ---------------------------(end of broadcast)--------------------------- TIP 4: Don't 'kill -9' the postmaster