Browse Source

Merge commit 'e6afb01' into bfgminer-3.5.x

Luke Dashjr 11 years ago
parent
commit
06ea0e0577
4 changed files with 25 additions and 0 deletions
  1. 4 0
      api.c
  2. 3 0
      driver-stratum.c
  3. 16 0
      util.c
  4. 2 0
      util.h

+ 4 - 0
api.c

@@ -3866,6 +3866,8 @@ static void mcast()
 
 	mcast_sock = socket(AF_INET, SOCK_DGRAM, 0);
 
+	set_cloexec_socket(*mcastsock, true);
+	
 	int optval = 1;
 	if (SOCKETFAIL(setsockopt(mcast_sock, SOL_SOCKET, SO_REUSEADDR, (void *)(&optval), sizeof(optval)))) {
 		applog(LOG_ERR, "API mcast setsockopt SO_REUSEADDR failed (%s)%s", SOCKERRMSG, MUNAVAILABLE);
@@ -4059,6 +4061,8 @@ void api(int api_thr_id)
 		applog(LOG_ERR, "API1 initialisation failed (%s)%s", SOCKERRMSG, UNAVAILABLE);
 		return;
 	}
+	
+	set_cloexec_socket(*apisock, true);
 
 	memset(&serv, 0, sizeof(serv));
 

+ 3 - 0
driver-stratum.c

@@ -621,6 +621,9 @@ void stratumsrv_change_port()
 	_smm_listener = evconnlistener_new_bind(evbase, stratumlistener, NULL, (
 		LEV_OPT_CLOSE_ON_FREE | LEV_OPT_CLOSE_ON_EXEC | LEV_OPT_REUSEABLE
 	), 0x10, (void*)&sin, sizeof(sin));
+	
+	// NOTE: libevent doesn't seem to implement LEV_OPT_CLOSE_ON_EXEC for Windows, so we must do this ourselves
+	set_cloexec_socket(evconnlistener_get_fd(_smm_listener), true);
 }
 
 static

+ 16 - 0
util.c

@@ -311,6 +311,22 @@ static int keep_sockalive(SOCKETTYPE fd)
 	return ret;
 }
 
+void set_cloexec_socket(SOCKETTYPE sock, const bool cloexec)
+{
+#ifdef WIN32
+	SetHandleInformation(sock, HANDLE_FLAG_INHERIT, cloexec ? 0 : HANDLE_FLAG_INHERIT);
+#elif defined(F_GETFD) && defined(F_SETFD) && defined(O_CLOEXEC)
+	const int curflags = fcntl(sock, F_GETFD);
+	int flags = curflags;
+	if (cloexec)
+		flags |= FD_CLOEXEC;
+	else
+		flags &= ~FD_CLOEXEC;
+	if (flags != curflags)
+		fcntl(sock, F_SETFD, flags);
+#endif
+}
+
 int json_rpc_call_sockopt_cb(void __maybe_unused *userdata, curl_socket_t fd,
 			     curlsocktype __maybe_unused purpose)
 {

+ 2 - 0
util.h

@@ -118,6 +118,8 @@ struct pool;
 enum dev_reason;
 struct cgpu_info;
 
+extern void set_cloexec_socket(SOCKETTYPE, bool cloexec);
+
 extern void json_rpc_call_async(CURL *, const char *url, const char *userpass, const char *rpc_req, bool longpoll, struct pool *pool, bool share, void *priv);
 extern json_t *json_rpc_call_completed(CURL *, int rc, bool probe, int *rolltime, void *out_priv);