Browse Source

api: various fixes

- prefer calloc to zero memory
- bind: keep the normal network read access with -b 0.0.0.0 like previous versions
- help: keep the write mode commands hidden in read-only mode
- close the socket on refused api calls to prevent client hangs
- small other changes
pull/2/head
Tanguy Pruvot 8 years ago
parent
commit
c44be3f81d
  1. 67
      api.cpp
  2. 16
      ccminer.cpp

67
api.cpp

@ -83,7 +83,7 @@ static struct IP4ACCESS *ipaccess = NULL;
#define SOCK_REC_BUFSZ 1024 #define SOCK_REC_BUFSZ 1024
#define QUEUE 10 #define QUEUE 10
//#define ALLIP4 "0.0.0.0" #define ALLIP4 "0.0.0.0"
static const char *localaddr = "127.0.0.1"; static const char *localaddr = "127.0.0.1";
static const char *UNAVAILABLE = " - API will not be available"; static const char *UNAVAILABLE = " - API will not be available";
static const char *MUNAVAILABLE = " - API multicast listener will not be available"; static const char *MUNAVAILABLE = " - API multicast listener will not be available";
@ -503,8 +503,10 @@ static char *gethelp(char *params)
{ {
*buffer = '\0'; *buffer = '\0';
char * p = buffer; char * p = buffer;
for (int i = 0; i < CMDMAX-1; i++) for (int i = 0; i < CMDMAX-1; i++) {
p += sprintf(p, "%s\n", cmds[i].name); bool displayed = !cmds[i].iswritemode || opt_api_allow;
if (displayed) p += sprintf(p, "%s\n", cmds[i].name);
}
sprintf(p, "|"); sprintf(p, "|");
return buffer; return buffer;
} }
@ -673,15 +675,14 @@ static int websocket_handshake(SOCKETTYPE c, char *result, char *clientkey)
static void setup_groups() static void setup_groups()
{ {
const char *api_groups = opt_api_groups ? opt_api_groups : ""; const char *api_groups = opt_api_groups ? opt_api_groups : "";
char *buf, *ptr, *next, *colon; char *buf, *cmd, *ptr, *next, *colon;
char commands[512] = { 0 };
char cmdbuf[128] = { 0 };
char group; char group;
char commands[512]; bool addstar;
char cmdbuf[100];
char *cmd;
bool addstar, did;
int i; int i;
buf = (char *)malloc(strlen(api_groups) + 1); buf = (char *)calloc(1, strlen(api_groups) + 1);
if (unlikely(!buf)) if (unlikely(!buf))
proper_exit(1); //, "Failed to malloc ipgroups buf"); proper_exit(1); //, "Failed to malloc ipgroups buf");
@ -731,8 +732,8 @@ static void setup_groups()
if (strcmp(ptr, "*") == 0) if (strcmp(ptr, "*") == 0)
addstar = true; addstar = true;
else { else {
did = false; bool did = false;
for (i = 0; cmds[i].name != NULL; i++) { for (i = 0; i < CMDMAX-1; i++) {
if (strcasecmp(ptr, cmds[i].name) == 0) { if (strcasecmp(ptr, cmds[i].name) == 0) {
did = true; did = true;
break; break;
@ -757,7 +758,7 @@ static void setup_groups()
// * = allow all non-iswritemode commands // * = allow all non-iswritemode commands
if (addstar) { if (addstar) {
for (i = 0; cmds[i].name != NULL; i++) { for (i = 0; i < CMDMAX-1; i++) {
if (cmds[i].iswritemode == false) { if (cmds[i].iswritemode == false) {
// skip duplicates // skip duplicates
sprintf(cmdbuf, "|%s|", cmds[i].name); sprintf(cmdbuf, "|%s|", cmds[i].name);
@ -771,7 +772,7 @@ static void setup_groups()
} }
} }
ptr = apigroups[GROUPOFFSET(group)].commands = (char *)malloc(strlen(commands) + 1); ptr = apigroups[GROUPOFFSET(group)].commands = (char *)calloc(1, strlen(commands) + 1);
if (unlikely(!ptr)) if (unlikely(!ptr))
proper_exit(1); //, "Failed to malloc group commands buf"); proper_exit(1); //, "Failed to malloc group commands buf");
@ -782,7 +783,7 @@ static void setup_groups()
cmd = &(commands[0]); cmd = &(commands[0]);
*(cmd++) = '|'; *(cmd++) = '|';
*cmd = '\0'; *cmd = '\0';
for (i = 0; cmds[i].name != NULL; i++) { for (i = 0; i < CMDMAX-1; i++) {
if (cmds[i].iswritemode == false) { if (cmds[i].iswritemode == false) {
strcpy(cmd, cmds[i].name); strcpy(cmd, cmds[i].name);
cmd += strlen(cmds[i].name); cmd += strlen(cmds[i].name);
@ -791,7 +792,7 @@ static void setup_groups()
} }
} }
ptr = apigroups[GROUPOFFSET(NOPRIVGROUP)].commands = (char *)malloc(strlen(commands) + 1); ptr = apigroups[GROUPOFFSET(NOPRIVGROUP)].commands = (char *)calloc(1, strlen(commands) + 1);
if (unlikely(!ptr)) if (unlikely(!ptr))
proper_exit(1); //, "Failed to malloc noprivgroup commands buf"); proper_exit(1); //, "Failed to malloc noprivgroup commands buf");
@ -857,7 +858,7 @@ static void setup_ipaccess()
ipaccess[ips].group = group; ipaccess[ips].group = group;
if (strcmp(ptr, ALLIPS) == 0) if (strcmp(ptr, ALLIPS) == 0 || strcmp(ptr, ALLIP4) == 0)
ipaccess[ips].ip = ipaccess[ips].mask = 0; ipaccess[ips].ip = ipaccess[ips].mask = 0;
else else
{ {
@ -920,6 +921,8 @@ static bool check_connect(struct sockaddr_in *cli, char **connectaddr, char *gro
} }
} }
} }
else if (strcmp(opt_api_bind, ALLIP4) == 0)
addrok = true;
else else
addrok = (strcmp(*connectaddr, localaddr) == 0); addrok = (strcmp(*connectaddr, localaddr) == 0);
@ -995,13 +998,13 @@ static void mcast()
} }
expect_code_len = sizeof(expect) + strlen(opt_api_mcast_code); expect_code_len = sizeof(expect) + strlen(opt_api_mcast_code);
expect_code = (char *)malloc(expect_code_len + 1); expect_code = (char *)calloc(1, expect_code_len + 1);
if (!expect_code) if (!expect_code)
proper_exit(1); //, "Failed to malloc mcast expect_code"); proper_exit(1); //, "Failed to malloc mcast expect_code");
snprintf(expect_code, expect_code_len + 1, "%s%s-", expect, opt_api_mcast_code); snprintf(expect_code, expect_code_len + 1, "%s%s-", expect, opt_api_mcast_code);
count = 0; count = 0;
while (80085) { while (42) {
sleep(1); sleep(1);
count++; count++;
@ -1016,8 +1019,9 @@ static void mcast()
addrok = check_connect(&came_from, &connectaddr, &group); addrok = check_connect(&came_from, &connectaddr, &group);
applog(LOG_DEBUG, "API mcast from %s - %s", applog(LOG_DEBUG, "API mcast from %s - %s",
connectaddr, addrok ? "Accepted" : "Ignored"); connectaddr, addrok ? "Accepted" : "Ignored");
if (!addrok) if (!addrok) {
continue; continue;
}
buf[rep] = '\0'; buf[rep] = '\0';
if (rep > 0 && buf[rep - 1] == '\n') if (rep > 0 && buf[rep - 1] == '\n')
@ -1044,14 +1048,12 @@ static void mcast()
snprintf(replybuf, sizeof(replybuf), snprintf(replybuf, sizeof(replybuf),
"ccm-%s-%d-%s", opt_api_mcast_code, opt_api_port, opt_api_mcast_des); "ccm-%s-%d-%s", opt_api_mcast_code, opt_api_port, opt_api_mcast_des);
rep = sendto(reply_sock, replybuf, strlen(replybuf) + 1, rep = sendto(reply_sock, replybuf, (int) strlen(replybuf) + 1,
0, (struct sockaddr *)(&came_from), 0, (struct sockaddr *)(&came_from), (int) sizeof(came_from));
sizeof(came_from));
if (SOCKETFAIL(rep)) { if (SOCKETFAIL(rep)) {
applog(LOG_DEBUG, "API mcast send reply failed (%s) (%d)", applog(LOG_DEBUG, "API mcast send reply failed (%s) (%d)",
strerror(errno), (int)reply_sock); strerror(errno), (int)reply_sock);
} } else {
else {
applog(LOG_DEBUG, "API mcast send reply (%s) succeeded (%d) (%d)", applog(LOG_DEBUG, "API mcast send reply (%s) succeeded (%d) (%d)",
replybuf, (int)rep, (int)reply_sock); replybuf, (int)rep, (int)reply_sock);
} }
@ -1064,7 +1066,6 @@ static void mcast()
} }
die: die:
CLOSESOCKET(mcast_sock); CLOSESOCKET(mcast_sock);
} }
@ -1211,14 +1212,12 @@ static void api()
return; return;
} }
if (opt_api_allow) if (opt_api_allow && strcmp(opt_api_bind, "127.0.0.1") == 0)
applog(LOG_WARNING, "API running in IP access mode on port %d (%d)", port, (int)*apisock); applog(LOG_WARNING, "API open locally in full access mode on port %d", opt_api_port);
else { else if (opt_api_allow)
if (strcmp(opt_api_bind, "127.0.0.1")) applog(LOG_WARNING, "API open in full access mode to %s on port %d", opt_api_allow, opt_api_port);
applog(LOG_WARNING, "API running in UNRESTRICTED read access mode on port %d (%d)", port, (int)*apisock); else if (strcmp(opt_api_bind, "127.0.0.1") != 0)
else applog(LOG_INFO, "API open to the network in read-only mode on port %d", opt_api_port);
applog(LOG_WARNING, "API running in local read access mode on port %d (%d)", port, (int)*apisock);
}
if (opt_api_mcast) if (opt_api_mcast)
mcast_init(); mcast_init();
@ -1309,8 +1308,8 @@ static void api()
break; break;
} }
} }
CLOSESOCKET(c);
} }
CLOSESOCKET(c);
} }
} }

16
ccminer.cpp

@ -324,7 +324,8 @@ Options:\n\
--cpu-affinity set process affinity to cpu core(s), mask 0x3 for cores 0 and 1\n\ --cpu-affinity set process affinity to cpu core(s), mask 0x3 for cores 0 and 1\n\
--cpu-priority set process priority (default: 3) 0 idle, 2 normal to 5 highest\n\ --cpu-priority set process priority (default: 3) 0 idle, 2 normal to 5 highest\n\
-b, --api-bind=port IP:port for the miner API (default: 127.0.0.1:4068), 0 disabled\n\ -b, --api-bind=port IP:port for the miner API (default: 127.0.0.1:4068), 0 disabled\n\
--api-remote Allow remote control, like pool switching\n\ --api-remote Allow remote control, like pool switching, imply --api-allow=0/0\n\
--api-allow=... IP/mask of the allowed api client(s), 0/0 for all\n\
--max-temp=N Only mine if gpu temp is less than specified value\n\ --max-temp=N Only mine if gpu temp is less than specified value\n\
--max-rate=N[KMG] Only mine if net hashrate is less than specified value\n\ --max-rate=N[KMG] Only mine if net hashrate is less than specified value\n\
--max-diff=N Only mine if net difficulty is less than specified value\n\ --max-diff=N Only mine if net difficulty is less than specified value\n\
@ -593,6 +594,11 @@ void proper_exit(int reason)
#endif #endif
free(opt_syslog_pfx); free(opt_syslog_pfx);
free(opt_api_bind); free(opt_api_bind);
if (opt_api_allow) free(opt_api_allow);
if (opt_api_groups) free(opt_api_groups);
free(opt_api_mcast_addr);
free(opt_api_mcast_code);
free(opt_api_mcast_des);
//free(work_restart); //free(work_restart);
//free(thr_info); //free(thr_info);
exit(reason); exit(reason);
@ -3005,14 +3011,18 @@ void parse_arg(int key, char *arg)
} }
break; break;
case 1030: /* --api-remote */ case 1030: /* --api-remote */
if (opt_api_allow) free(opt_api_allow);
opt_api_allow = strdup("0/0"); opt_api_allow = strdup("0/0");
break; break;
case 1031: /* --api-allow */ case 1031: /* --api-allow */
free(opt_api_allow); // --api-allow 0/0 means opened to all, so assume -b 0.0.0.0
if (!strcmp(arg, "0/0") && !strcmp(opt_api_bind, "127.0.0.1"))
parse_arg('b', (char*)"0.0.0.0");
if (opt_api_allow) free(opt_api_allow);
opt_api_allow = strdup(arg); opt_api_allow = strdup(arg);
break; break;
case 1032: /* --api-groups */ case 1032: /* --api-groups */
free(opt_api_groups); if (opt_api_groups) free(opt_api_groups);
opt_api_groups = strdup(arg); opt_api_groups = strdup(arg);
break; break;
case 1033: /* --api-mcast */ case 1033: /* --api-mcast */

Loading…
Cancel
Save