hack to allow FTP to rebind local addresses
authorSam Leffler <sam@ucbvax.Berkeley.EDU>
Sun, 23 Jan 1983 15:41:29 +0000 (07:41 -0800)
committerSam Leffler <sam@ucbvax.Berkeley.EDU>
Sun, 23 Jan 1983 15:41:29 +0000 (07:41 -0800)
SCCS-vsn: sys/netinet/in_pcb.c 4.40
SCCS-vsn: sys/kern/uipc_socket.c 4.71

usr/src/sys/kern/uipc_socket.c
usr/src/sys/netinet/in_pcb.c

index 99a3503..a0dc797 100644 (file)
@@ -570,11 +570,11 @@ sosetopt(so, level, optname, m)
        switch (optname) {
 
        case SO_DEBUG:
        switch (optname) {
 
        case SO_DEBUG:
-               so->so_options |= SO_DEBUG;
-               break;
-
        case SO_KEEPALIVE:
        case SO_KEEPALIVE:
-               so->so_options |= SO_KEEPALIVE;
+       case SO_DONTROUTE:
+       case SO_USELOOPBACK:
+       case SO_REUSEADDR:
+               so->so_options |= optname;
                break;
 
        case SO_LINGER:
                break;
 
        case SO_LINGER:
@@ -589,14 +589,6 @@ sosetopt(so, level, optname, m)
                so->so_linger = 0;
                break;
 
                so->so_linger = 0;
                break;
 
-       case SO_DONTROUTE:
-               so->so_options |= SO_DONTROUTE;
-               break;
-
-       case SO_USELOOPBACK:
-               so->so_options |= SO_USELOOPBACK;
-               break;
-
        default:
                return (EINVAL);
        }
        default:
                return (EINVAL);
        }
@@ -618,6 +610,7 @@ sogetopt(so, level, optname, m)
        case SO_DEBUG:
        case SO_KEEPALIVE:
        case SO_LINGER:
        case SO_DEBUG:
        case SO_KEEPALIVE:
        case SO_LINGER:
+       case SO_REUSEADDR:
                if ((so->so_options & optname) == 0)
                        return (ENOPROTOOPT);
                if (optname == SO_LINGER && m != NULL) {
                if ((so->so_options & optname) == 0)
                        return (ENOPROTOOPT);
                if (optname == SO_LINGER && m != NULL) {
index df3962d..3bdd1a0 100644 (file)
@@ -68,8 +68,10 @@ in_pcbbind(inp, nam)
                /* GROSS */
                if (aport < IPPORT_RESERVED && u.u_uid != 0)
                        return (EACCES);
                /* GROSS */
                if (aport < IPPORT_RESERVED && u.u_uid != 0)
                        return (EACCES);
-               if ((so->so_proto->pr_flags & PR_CONNREQUIRED) == 0 ||
-                   (so->so_options & SO_ACCEPTCONN) == 0)
+               /* even GROSSER, but this is the Internet */
+               if ((so->so_options & SO_REUSEADDR) == 0 &&
+                   ((so->so_proto->pr_flags & PR_CONNREQUIRED) == 0 ||
+                    (so->so_options & SO_ACCEPTCONN) == 0))
                        wild = INPLOOKUP_WILDCARD;
                if (in_pcblookup(head,
                    zeroin_addr, 0, sin->sin_addr, lport, wild))
                        wild = INPLOOKUP_WILDCARD;
                if (in_pcblookup(head,
                    zeroin_addr, 0, sin->sin_addr, lport, wild))