Hi,

Thomas Moestl and I tried to fix linux_connect. Most of this patch
is from Thomas Moestl. I did only a little part of it and testing.

Staroffice5.2 has been broken about one year now, and it needs
a fix with the same behaviour to work correctly with FreeBSD.

This patch should be rewritten so it can be comitted to CURRENT
and (IMPORTANT) to STABLE before 4.3 is out.

--- src/sys/sys/socket.h.orig   Wed Feb 28 01:02:42 2001
+++ src/sys/sys/socket.h        Wed Feb 28 01:02:10 2001
@@ -79,6 +79,7 @@
 #define        SO_REUSEPORT    0x0200          /* allow local address & port reuse */
 #define        SO_TIMESTAMP    0x0400          /* timestamp received dgram traffic */
 #define        SO_ACCEPTFILTER 0x1000          /* there is an accept filter */
+#define SO_KNBCONN     0x2000          /* kluge bit for linuxulator connect */
 
 /*
  * Additional options, not kept in so_options.
--- src/sys/compat/linux/linux_socket.c.orig    Wed Feb 28 00:58:00 2001
+++ src/sys/compat/linux/linux_socket.c Wed Feb 28 01:00:51 2001
@@ -41,6 +41,8 @@
 #include <sys/sysproto.h>
 #include <sys/fcntl.h>
 #include <sys/socket.h>
+#include <sys/socketvar.h>
+#include <sys/file.h>
 #include <sys/uio.h>
 
 #include <netinet/in.h>
@@ -424,8 +426,9 @@
                        int *avalsize;
                } */ bsd_getsockopt_args;
                void *status, *statusl;
-               int stat, statl = sizeof stat;
+               int stat, iconn, statl = sizeof stat;
                caddr_t sg;
+               struct file *fp;
 
                /* Check for non-blocking */
                bsd_fcntl_args.fd = linux_args.s;
@@ -453,9 +456,27 @@
                        if ((error = copyin(status, &stat, sizeof stat)))
                                return (error);
 
+                       /*
+                        * Ugly kluge: some applications depend on 0 being
+                        * returned only the first time. Therefore, we set
+                        * the (otherwise invisible) SO_KNBCONN flag.
+                        * If it is set, return EISCONN.
+                        */
+                       error = holdsock(p->p_fd, linux_args.s, &fp);
+                       if (error)
+                               return (error);
+                       iconn = ((struct socket *)fp->f_data)->so_options &
+                           SO_KNBCONN;
+                       ((struct socket *)fp->f_data)->so_options |= SO_KNBCONN;
+                       fdrop(fp, p);
+
+                       if (iconn)
+                       return (EISCONN);
+
                        p->p_retval[0] = stat;
                        return (0);
-               }
+               } else
+                       return (EISCONN);
        }
 
        return (error);

Martin

Martin Blapp, [EMAIL PROTECTED]
------------------------------------------------
Improware AG, UNIX solution and service provider
Zurlindenstrasse 29, 4133 Pratteln, Switzerland
Phone: +41 79 370 26 05, Fax: +41 61 826 93 01
------------------------------------------------



To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-current" in the body of the message

Reply via email to