mirror of
https://github.com/GOSTSec/sgminer
synced 2025-02-05 19:44:21 +00:00
API no longer ignore send() status
This commit is contained in:
parent
1eca0476f1
commit
efb2403a38
57
api.c
57
api.c
@ -3616,8 +3616,7 @@ static void checkcommand(struct io_data *io_data, __maybe_unused SOCKETTYPE c, c
|
|||||||
static void send_result(struct io_data *io_data, SOCKETTYPE c, bool isjson)
|
static void send_result(struct io_data *io_data, SOCKETTYPE c, bool isjson)
|
||||||
{
|
{
|
||||||
char buf[SOCKBUFSIZ + sizeof(JSON_CLOSE) + sizeof(JSON_END)];
|
char buf[SOCKBUFSIZ + sizeof(JSON_CLOSE) + sizeof(JSON_END)];
|
||||||
int len;
|
int count, res, tosend, len, n;
|
||||||
int n;
|
|
||||||
|
|
||||||
strcpy(buf, io_data->ptr);
|
strcpy(buf, io_data->ptr);
|
||||||
|
|
||||||
@ -3632,16 +3631,48 @@ static void send_result(struct io_data *io_data, SOCKETTYPE c, bool isjson)
|
|||||||
}
|
}
|
||||||
|
|
||||||
len = strlen(buf);
|
len = strlen(buf);
|
||||||
|
tosend = len+1;
|
||||||
|
|
||||||
applog(LOG_DEBUG, "API: send reply: (%d) '%.10s%s'", len+1, buf, len > 10 ? "..." : BLANK);
|
applog(LOG_DEBUG, "API: send reply: (%d) '%.10s%s'", tosend, buf, len > 10 ? "..." : BLANK);
|
||||||
|
|
||||||
// ignore failure - it's closed immediately anyway
|
count = 0;
|
||||||
n = send(c, buf, len+1, 0);
|
while (count++ < 5 && tosend > 0) {
|
||||||
|
// allow 50ms per attempt
|
||||||
|
struct timeval timeout = {0, 50000};
|
||||||
|
fd_set wd;
|
||||||
|
|
||||||
if (SOCKETFAIL(n))
|
FD_ZERO(&wd);
|
||||||
applog(LOG_WARNING, "API: send failed: %s", SOCKERRMSG);
|
FD_SET(c, &wd);
|
||||||
else
|
if ((res = select(c + 1, NULL, &wd, NULL, &timeout)) < 1) {
|
||||||
applog(LOG_DEBUG, "API: sent %d", n);
|
applog(LOG_WARNING, "API: send select failed (%d)", res);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
n = send(c, buf, tosend, 0);
|
||||||
|
|
||||||
|
if (SOCKETFAIL(n)) {
|
||||||
|
if (errno == EAGAIN || errno == EWOULDBLOCK)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
applog(LOG_WARNING, "API: send (%d) failed: %s", tosend, SOCKERRMSG);
|
||||||
|
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
if (count <= 1) {
|
||||||
|
if (n == tosend)
|
||||||
|
applog(LOG_DEBUG, "API: sent all of %d first go", tosend);
|
||||||
|
else
|
||||||
|
applog(LOG_DEBUG, "API: sent %d of %d first go", n, tosend);
|
||||||
|
} else {
|
||||||
|
if (n == tosend)
|
||||||
|
applog(LOG_DEBUG, "API: sent all of remaining %d (count=%d)", tosend, count);
|
||||||
|
else
|
||||||
|
applog(LOG_DEBUG, "API: sent %d of remaining %d (count=%d)", n, tosend, count);
|
||||||
|
}
|
||||||
|
|
||||||
|
tosend -= n;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void tidyup(__maybe_unused void *arg)
|
static void tidyup(__maybe_unused void *arg)
|
||||||
@ -4066,18 +4097,18 @@ void api(int api_thr_id)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (opt_api_allow)
|
if (opt_api_allow)
|
||||||
applog(LOG_WARNING, "API running in IP access mode on port %d", port);
|
applog(LOG_WARNING, "API running in IP access mode on port %d (%d)", port, *apisock);
|
||||||
else {
|
else {
|
||||||
if (opt_api_network)
|
if (opt_api_network)
|
||||||
applog(LOG_WARNING, "API running in UNRESTRICTED read access mode on port %d", port);
|
applog(LOG_WARNING, "API running in UNRESTRICTED read access mode on port %d (%d)", port, *apisock);
|
||||||
else
|
else
|
||||||
applog(LOG_WARNING, "API running in local read access mode on port %d", port);
|
applog(LOG_WARNING, "API running in local read access mode on port %d (%d)", port, *apisock);
|
||||||
}
|
}
|
||||||
|
|
||||||
while (!bye) {
|
while (!bye) {
|
||||||
clisiz = sizeof(cli);
|
clisiz = sizeof(cli);
|
||||||
if (SOCKETFAIL(c = accept(*apisock, (struct sockaddr *)(&cli), &clisiz))) {
|
if (SOCKETFAIL(c = accept(*apisock, (struct sockaddr *)(&cli), &clisiz))) {
|
||||||
applog(LOG_ERR, "API failed (%s)%s", SOCKERRMSG, UNAVAILABLE);
|
applog(LOG_ERR, "API failed (%s)%s (%d)", SOCKERRMSG, UNAVAILABLE, *apisock);
|
||||||
goto die;
|
goto die;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user