static PRStatus PR_CALLBACK SocketBind(PRFileDesc *fd, const PRNetAddr *addr) { PRInt32 result; const PRNetAddr *addrp = addr; #if defined(_PR_INET6) PRNetAddr addrCopy; #endif PR_ASSERT(IsValidNetAddr(addr) == PR_TRUE); #ifdef XP_UNIX if (addr->raw.family == AF_UNIX) { /* Disallow relative pathnames */ if (addr->local.path[0] != '/') { PR_SetError(PR_INVALID_ARGUMENT_ERROR, 0); return PR_FAILURE; } } #endif /* XP_UNIX */ #if defined(_PR_INET6) if (addr->raw.family == PR_AF_INET6) { addrCopy = *addr; addrCopy.raw.family = AF_INET6; addrp = &addrCopy; } #endif result = _PR_MD_BIND(fd, addrp, PR_NETADDR_SIZE(addr)); if (result < 0) { return PR_FAILURE; } return PR_SUCCESS; }
static PRStatus PR_CALLBACK SocketBind(PRFileDesc *fd, const PRNetAddr *addr) { PRInt32 result; int one = 1; #if defined(_PR_INET6) PR_ASSERT(addr->raw.family == AF_INET || addr->raw.family == AF_INET6); #else PR_ASSERT(addr->raw.family == AF_INET); #endif #ifdef HAVE_SOCKET_REUSEADDR if ( setsockopt (fd->secret->md.osfd, (int)SOL_SOCKET, SO_REUSEADDR, (const void *)&one, sizeof(one) ) < 0) { return PR_FAILURE; } #endif result = _PR_MD_BIND(fd, addr, PR_NETADDR_SIZE(addr)); if (result < 0) { return PR_FAILURE; } return PR_SUCCESS; }