Date: Mon, 29 Jan 2001 21:35:28 -0800 From: Marcel Moolenaar <marcel@cup.hp.com> To: Martin Blapp <mb@imp.ch> Cc: freebsd-emulation@FreeBSD.ORG Subject: Re: [PATCH] Staroffice Network Problem solved Message-ID: <3A7652A0.BF5F7DB8@cup.hp.com> References: <Pine.BSF.4.21.0101210304100.8609-100000@levais.imp.ch>
next in thread | previous in thread | raw e-mail | index | archive | help
Martin Blapp wrote:
>
> Can you review this and commit it to STABLE and CURRENT ? This
> unbreaks the staroffice network code. :-))))
>
> --- linux_socket.c Sat Jan 20 20:54:47 2001
> +++ linux_socket.c.new Sun Jan 21 02:59:44 2001
> @@ -454,7 +454,7 @@
> return (error);
>
> p->p_retval[0] = stat;
> - return (0);
> + return (EISCONN);
> }
> }
This code is executes when the native connect(2) returns EISCONN. Can
you test the following patch. It removes the special handling when
connect(2) returns EISCONN.
Index: linux_socket.c
===================================================================
RCS file: /home/ncvs/src/sys/compat/linux/linux_socket.c,v
retrieving revision 1.25
diff -u -r1.25 linux_socket.c
--- linux_socket.c 2000/12/19 00:24:25 1.25
+++ linux_socket.c 2001/01/30 05:30:56
@@ -404,61 +404,7 @@
bsd_args.s = linux_args.s;
bsd_args.name = (caddr_t)linux_args.name;
bsd_args.namelen = linux_args.namelen;
- error = connect(p, &bsd_args);
- if (error == EISCONN) {
- /*
- * Linux doesn't return EISCONN the first time it
occurs,
- * when on a non-blocking socket. Instead it returns the
- * error getsockopt(SOL_SOCKET, SO_ERROR) would return
on BSD.
- */
- struct fcntl_args /* {
- int fd;
- int cmd;
- int arg;
- } */ bsd_fcntl_args;
- struct getsockopt_args /* {
- int s;
- int level;
- int name;
- caddr_t val;
- int *avalsize;
- } */ bsd_getsockopt_args;
- void *status, *statusl;
- int stat, statl = sizeof stat;
- caddr_t sg;
-
- /* Check for non-blocking */
- bsd_fcntl_args.fd = linux_args.s;
- bsd_fcntl_args.cmd = F_GETFL;
- bsd_fcntl_args.arg = 0;
- error = fcntl(p, &bsd_fcntl_args);
- if (error == 0 && (p->p_retval[0] & O_NONBLOCK)) {
- sg = stackgap_init();
- status = stackgap_alloc(&sg, sizeof stat);
- statusl = stackgap_alloc(&sg, sizeof statusl);
-
- if ((error = copyout(&statl, statusl, sizeof
statl)))
- return (error);
-
- bsd_getsockopt_args.s = linux_args.s;
- bsd_getsockopt_args.level = SOL_SOCKET;
- bsd_getsockopt_args.name = SO_ERROR;
- bsd_getsockopt_args.val = status;
- bsd_getsockopt_args.avalsize = statusl;
-
- error = getsockopt(p, &bsd_getsockopt_args);
- if (error)
- return (error);
-
- if ((error = copyin(status, &stat, sizeof
stat)))
- return (error);
-
- p->p_retval[0] = stat;
- return (0);
- }
- }
-
- return (error);
+ return (connect(p, &bsd_args));
}
#ifndef __alpha__
--
Marcel Moolenaar
mail: marcel@cup.hp.com / marcel@FreeBSD.org
tel: (408) 447-4222
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-emulation" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?3A7652A0.BF5F7DB8>
