From b74c67c0f3cbf35744b15e7f9fe5756853a339c1 Mon Sep 17 00:00:00 2001
From: deuce <>
Date: Wed, 3 Nov 2004 03:24:39 +0000
Subject: [PATCH] Move LOG_* into xpdev/gen_defs.h Add retry_bind() function
 (exteded bind() function that will retry a number of times)

---
 src/sbbs3/sbbsdefs.h | 16 ----------------
 src/xpdev/gen_defs.h | 16 ++++++++++++++++
 src/xpdev/sockwrap.c | 32 +++++++++++++++++++++++++++++++-
 src/xpdev/sockwrap.h |  1 +
 4 files changed, 48 insertions(+), 17 deletions(-)

diff --git a/src/sbbs3/sbbsdefs.h b/src/sbbs3/sbbsdefs.h
index c0375988ff..6373dd1e8e 100644
--- a/src/sbbs3/sbbsdefs.h
+++ b/src/sbbs3/sbbsdefs.h
@@ -796,22 +796,6 @@ enum {							/* Values of mode for userlist function     */
 								
 #define BO_OPENFILE 0			/* Backout types */
 
-#if defined(__unix__)
-	#include <syslog.h>
-#else
-	/*
-	 * log priorities (copied from BSD syslog.h)
-	 */
-	#define LOG_EMERG       0       /* system is unusable */
-	#define LOG_ALERT       1       /* action must be taken immediately */
-	#define LOG_CRIT        2       /* critical conditions */
-	#define LOG_ERR         3       /* error conditions */
-	#define LOG_WARNING     4       /* warning conditions */
-	#define LOG_NOTICE      5       /* normal but significant condition */
-	#define LOG_INFO        6       /* informational */
-	#define LOG_DEBUG       7       /* debug-level messages */
-#endif
-
 /**********/
 /* Macros */
 /**********/
diff --git a/src/xpdev/gen_defs.h b/src/xpdev/gen_defs.h
index f8b5534f08..5c67b83cc4 100644
--- a/src/xpdev/gen_defs.h
+++ b/src/xpdev/gen_defs.h
@@ -279,5 +279,21 @@ typedef struct {
 /********************************/
 #define COUNT_LIST_ITEMS(list,i)	{ i=0; if(list!=NULL) while(list[i]!=NULL) i++; }
 
+#if defined(__unix__)
+	#include <syslog.h>
+#else
+	/*
+	 * log priorities (copied from BSD syslog.h)
+	 */
+	#define LOG_EMERG       0       /* system is unusable */
+	#define LOG_ALERT       1       /* action must be taken immediately */
+	#define LOG_CRIT        2       /* critical conditions */
+	#define LOG_ERR         3       /* error conditions */
+	#define LOG_WARNING     4       /* warning conditions */
+	#define LOG_NOTICE      5       /* normal but significant condition */
+	#define LOG_INFO        6       /* informational */
+	#define LOG_DEBUG       7       /* debug-level messages */
+#endif
+
 
 #endif /* Don't add anything after this #endif statement */
diff --git a/src/xpdev/sockwrap.c b/src/xpdev/sockwrap.c
index fa904b4f6c..7719c1ef8c 100644
--- a/src/xpdev/sockwrap.c
+++ b/src/xpdev/sockwrap.c
@@ -42,7 +42,7 @@
 #include <string.h>
 
 #include "genwrap.h"	/* SLEEP */
-#include "gen_defs.h"	/* BOOL */
+#include "gen_defs.h"	/* BOOL/LOG_WARNING */
 #include "sockwrap.h"	/* sendsocket */
 #include "filewrap.h"	/* filelength */
 
@@ -230,3 +230,33 @@ BOOL socket_check(SOCKET sock, BOOL* rd_p, BOOL* wr_p, DWORD timeout)
 
 	return(FALSE);
 }
+
+int retry_bind(SOCKET s, const struct sockaddr *addr, socklen_t addrlen, int retries, int wait_secs, int *(lprintf)(int level, char *fmt, ...))
+{
+	int		result=-1;
+	int		i;
+
+	for(i=0;i<=retries;i++) {
+		result = bind(s,addr,addrlen);
+		if(result != 0) {
+			if(lprintf!=NULL) {
+				if(addr->sa_family==AF_INET) {
+					lprintf(LOG_WARNING,"%04d !WARNING %d (%d) error binding socket to port %d"
+						,s, result, ERROR_VALUE,((SOCKADDR_IN *)(addr))->sin_port);
+				}
+				else {
+					lprintf(LOG_WARNING,"%04d !WARNING %d (%d) error binding socket"
+						,s, result, ERROR_VALUE);
+				}
+			}
+			if(i<retries) {
+				if(lprintf!=NULL)
+					lprintf(LOG_WARNING,"%04d Will retry in %d seconds",s ,wait_secs);
+				SLEEP(wait_secs*1000);
+			}
+		}
+		else
+			break;
+	}
+	return(result);
+}
diff --git a/src/xpdev/sockwrap.h b/src/xpdev/sockwrap.h
index eaf86a37d3..c375a92ade 100644
--- a/src/xpdev/sockwrap.h
+++ b/src/xpdev/sockwrap.h
@@ -155,6 +155,7 @@ extern "C" {
 int		sendfilesocket(int sock, int file, long *offset, long count);
 int		recvfilesocket(int sock, int file, long *offset, long count);
 BOOL	socket_check(SOCKET sock, BOOL* rd_p, BOOL* wr_p, DWORD timeout);
+int 	retry_bind(SOCKET s, const struct sockaddr *addr, socklen_t addrlen, int retries, int wait_secs, int *(lprintf)(int level, char *fmt, ...));
 
 #ifdef __cplusplus
 }
-- 
GitLab