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