API make the main socket non-static
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
diff --git a/api.c b/api.c
index 2f169ed..d9a1b35 100644
--- a/api.c
+++ b/api.c
@@ -125,7 +125,6 @@ char *WSAErrorMsg(void) {
return &(WSAbuf[0]);
}
#endif
-static SOCKETTYPE sock = INVSOCK;
static const char *UNAVAILABLE = " - API will not be available";
static const char *INVAPIGROUPS = "Invalid --api-groups parameter";
@@ -3649,12 +3648,14 @@ static void tidyup(__maybe_unused void *arg)
{
mutex_lock(&quit_restart_lock);
+ SOCKETTYPE *apisock = (SOCKETTYPE *)arg;
+
bye = true;
- if (sock != INVSOCK) {
- shutdown(sock, SHUT_RDWR);
- CLOSESOCKET(sock);
- sock = INVSOCK;
+ if (*apisock != INVSOCK) {
+ shutdown(*apisock, SHUT_RDWR);
+ CLOSESOCKET(*apisock);
+ *apisock = INVSOCK;
}
if (ipaccess != NULL) {
@@ -3971,6 +3972,11 @@ void api(int api_thr_id)
bool did;
int i;
+ SOCKETTYPE *apisock;
+
+ apisock = malloc(sizeof(*apisock));
+ *apisock = INVSOCK;
+
if (!opt_api_listen) {
applog(LOG_DEBUG, "API not running%s", UNAVAILABLE);
return;
@@ -3980,7 +3986,7 @@ void api(int api_thr_id)
mutex_init(&quit_restart_lock);
- pthread_cleanup_push(tidyup, NULL);
+ pthread_cleanup_push(tidyup, (void *)apisock);
my_thr_id = api_thr_id;
setup_groups();
@@ -3998,8 +4004,8 @@ void api(int api_thr_id)
* to ensure curl has already called WSAStartup() in windows */
nmsleep(opt_log_interval*1000);
- sock = socket(AF_INET, SOCK_STREAM, 0);
- if (sock == INVSOCK) {
+ *apisock = socket(AF_INET, SOCK_STREAM, 0);
+ if (*apisock == INVSOCK) {
applog(LOG_ERR, "API1 initialisation failed (%s)%s", SOCKERRMSG, UNAVAILABLE);
return;
}
@@ -4024,7 +4030,7 @@ void api(int api_thr_id)
// another program has it open - which is what we want
int optval = 1;
// If it doesn't work, we don't really care - just show a debug message
- if (SOCKETFAIL(setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (void *)(&optval), sizeof(optval))))
+ if (SOCKETFAIL(setsockopt(*apisock, SOL_SOCKET, SO_REUSEADDR, (void *)(&optval), sizeof(optval))))
applog(LOG_DEBUG, "API setsockopt SO_REUSEADDR failed (ignored): %s", SOCKERRMSG);
#else
// On windows a 2nd program can bind to a port>1024 already in use unless
@@ -4036,7 +4042,7 @@ void api(int api_thr_id)
bound = 0;
bindstart = time(NULL);
while (bound == 0) {
- if (SOCKETFAIL(bind(sock, (struct sockaddr *)(&serv), sizeof(serv)))) {
+ if (SOCKETFAIL(bind(*apisock, (struct sockaddr *)(&serv), sizeof(serv)))) {
binderror = SOCKERRMSG;
if ((time(NULL) - bindstart) > 61)
break;
@@ -4053,9 +4059,9 @@ void api(int api_thr_id)
return;
}
- if (SOCKETFAIL(listen(sock, QUEUE))) {
+ if (SOCKETFAIL(listen(*apisock, QUEUE))) {
applog(LOG_ERR, "API3 initialisation failed (%s)%s", SOCKERRMSG, UNAVAILABLE);
- CLOSESOCKET(sock);
+ CLOSESOCKET(*apisock);
return;
}
@@ -4070,7 +4076,7 @@ void api(int api_thr_id)
while (!bye) {
clisiz = sizeof(cli);
- if (SOCKETFAIL(c = accept(sock, (struct sockaddr *)(&cli), &clisiz))) {
+ if (SOCKETFAIL(c = accept(*apisock, (struct sockaddr *)(&cli), &clisiz))) {
applog(LOG_ERR, "API failed (%s)%s", SOCKERRMSG, UNAVAILABLE);
goto die;
}