switch (optname) {
case SO_DEBUG:
- so->so_options |= SO_DEBUG;
- break;
-
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:
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);
}
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) {
/* 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))