From 0c8735c0b818d2f70a4dd09defff86e190b5ea0c Mon Sep 17 00:00:00 2001 From: rswindell <> Date: Fri, 23 Aug 2002 07:30:09 +0000 Subject: [PATCH] Deuce's mod to use SO_REUSEPORT on FreeBSD build and use port number 0 if seteuid failed. --- src/sbbs3/services.c | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/src/sbbs3/services.c b/src/sbbs3/services.c index 927060ad89..302502ae69 100644 --- a/src/sbbs3/services.c +++ b/src/sbbs3/services.c @@ -1127,6 +1127,15 @@ void DLLCALL services_thread(void* arg) close_socket(socket); continue; } + #ifdef __FreeBSD__ + if(setsockopt(socket,SOL_SOCKET,SO_REUSEPORT + ,(char*)&optval,sizeof(optval))!=0) { + lprintf("%04d !ERROR %d setting %s socket option" + ,socket, ERROR_VALUE, service[i].protocol); + close_socket(socket); + continue; + } + #endif } memset(&addr, 0, sizeof(addr)); @@ -1281,15 +1290,25 @@ void DLLCALL services_thread(void* arg) close_socket(client_socket); continue; } - + #ifdef __FreeBSD__ + if(setsockopt(client_socket,SOL_SOCKET,SO_REUSEPORT + ,(char*)&optval,sizeof(optval))!=0) { + FREE_AND_NULL(udp_buf); + lprintf("%04d %s !ERROR %d setting socket option" + ,client_socket, service[i].protocol, ERROR_VALUE); + close_socket(client_socket); + continue; + } + #endif memset(&addr, 0, sizeof(addr)); addr.sin_addr.s_addr = htonl(startup->interface_addr); addr.sin_family = AF_INET; addr.sin_port = htons(service[i].port); - if(startup->seteuid!=NULL) - startup->seteuid(FALSE); + if(startup->seteuid!=NULL && !startup->seteuid(FALSE)) + addr.sin_port=0; + result=bind(client_socket, (struct sockaddr *) &addr, sizeof(addr)); if(startup->seteuid!=NULL) startup->seteuid(TRUE); -- GitLab