Date: Thu, 15 Aug 2002 16:23:37 -0400 From: "Kevin B. Hendricks" <kevin.hendricks@sympatico.ca> To: dev@porting.openoffice.org, Martin Blapp <mb@imp.ch> Cc: <openoffice@freebsd.org> Subject: Re: [porting-dev] FreeBSD and webdav problems Message-ID: <200208151623.37127.kevin.hendricks@sympatico.ca> In-Reply-To: <20020815171253.Y17516-100000@levais.imp.ch> References: <20020815171253.Y17516-100000@levais.imp.ch>
next in thread | previous in thread | raw e-mail | index | archive | help
Hi,
The question I have here is why this socket is set to be non-blocking. Is
this something port specific for FreeBSD? Where is the f cntl done on the
socket fd that makes it non-blocking?
If not non-blocking, then connect should block and wait and not return
EINPROGRESS.
I can not find any code that sets things up to be non-blocking (perhaps
that is a default under FreeBSD?) or I missed it someplace.
Kevin
On August 15, 2002 11:22, Martin Blapp wrote:
> Hi all,
>
> I see some strange behaviour here with webdav. A connection
> does loop here: external/neon/rtufiles/socket.c
>
> nsocket *sock_connect(const struct in_addr addr,
> unsigned short int portnum)
> {
> struct sockaddr_in sa;
> int fd;
>
> /* Create the socket */
> fd = socket(AF_INET, SOCK_STREAM, 0);
> if (fd < 0)
> return NULL;
> /* Connect the nsocket */
> sa.sin_family = AF_INET;
> sa.sin_port = htons(portnum); /* host -> net byte orders */
> sa.sin_addr = addr;
> if (connect(fd, (struct sockaddr *)&sa, sizeof(struct sockaddr_in))
> < 0) { (void) NEON_CLOSE(fd);
> return NULL;
> }
> /* Success - return the nsocket */
> return create_sock(fd);
> }
>
> Breakpoint 1, sock_connect (addr={s_addr = 80}, portnum=80) at
> socket.c:703 703 fd = socket(AF_INET, SOCK_STREAM, 0);
> (gdb) c
> Continuing.
>
> Breakpoint 4, 0x28bc0d4d in connect () from /usr/lib/libc_r.so.4
> (gdb) c
> Continuing.
>
> Breakpoint 3, sock_close (sock=0x81db870) at socket.c:872
> 872 ret = NEON_CLOSE(sock->fd);
> (gdb) c
> Continuing.
>
> Breakpoint 1, sock_connect (addr={s_addr = 80}, portnum=80) at
> socket.c:703 703 fd = socket(AF_INET, SOCK_STREAM, 0);
> (gdb) c
> Continuing.
>
> Breakpoint 4, 0x28bc0d4d in connect () from /usr/lib/libc_r.so.4
>
> (gdb) p errno
> $11 = 36
>
> connect() returns EINPROGRESS.
>
> [EINPROGRESS] The socket is non-blocking and the connection cannot
> be completed immediately. It is possible to
> select(2) for completion by selecting the socket for writing.
>
> This is not handled by the webdav code and so we get into
> and endless loop.
>
> How does this work on other platforms ?
>
> Martin
>
> Martin Blapp, <mb@imp.ch> <mbr@FreeBSD.org>
> ------------------------------------------------------------------
> ImproWare AG, UNIXSP & ISP, Zurlindenstrasse 29, 4133 Pratteln, CH
> Phone: +41 061 826 93 00: +41 61 826 93 01
> PGP: <finger -l mbr@freebsd.org>
> PGP Fingerprint: B434 53FC C87C FE7B 0A18 B84C 8686 EF22 D300 551E
> ------------------------------------------------------------------
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@porting.openoffice.org
> For additional commands, e-mail: dev-help@porting.openoffice.org
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-openoffice" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200208151623.37127.kevin.hendricks>
