diff --git a/api.c b/api.c index 361375a2..f8171e0a 100644 --- a/api.c +++ b/api.c @@ -2101,6 +2101,7 @@ exitsama: static void addpool(__maybe_unused SOCKETTYPE c, char *param, bool isjson, __maybe_unused char group) { char *url, *user, *pass; + struct pool *pool; char *ptr; if (param == NULL || *param == '\0') { @@ -2117,7 +2118,9 @@ static void addpool(__maybe_unused SOCKETTYPE c, char *param, bool isjson, __may return; } - add_pool_details(true, url, user, pass); + pool = add_pool(); + detect_stratum(pool, url); + add_pool_details(pool, true, url, user, pass); ptr = escape_string(url, isjson); strcpy(io_buffer, message(MSG_ADDPOOL, 0, ptr, isjson)); diff --git a/cgminer.c b/cgminer.c index 63412c14..85574acf 100644 --- a/cgminer.c +++ b/cgminer.c @@ -403,7 +403,7 @@ static void sharelog(const char*disposition, const struct work*work) } /* Return value is ignored if not called from add_pool_details */ -static struct pool *add_pool(void) +struct pool *add_pool(void) { struct pool *pool; @@ -543,6 +543,25 @@ static char *set_rr(enum pool_strategy *strategy) return NULL; } +/* Detect that url is for a stratum protocol either via the presence of + * stratum+tcp or by detecting a stratum server response */ +bool detect_stratum(struct pool *pool, char *url) +{ + bool stratum; + + if (!extract_sockaddr(pool, url)) + return false; + + stratum = initiate_stratum(pool); + + if (!strncasecmp(url, "stratum+tcp://", 14) || stratum) { + pool->has_stratum = true; + return true; + } + + return false; +} + static char *set_url(char *arg) { struct pool *pool; @@ -554,10 +573,8 @@ static char *set_url(char *arg) arg = get_proxy(arg, pool); - if (!extract_sockaddr(pool, arg)) - return "Failed to extract address from parsed url"; - - initiate_stratum(pool); + if (detect_stratum(pool, arg)) + return NULL; opt_set_charp(arg, &pool->rpc_url); if (strncmp(arg, "http://", 7) && @@ -5160,12 +5177,8 @@ char *curses_input(const char *query) } #endif -void add_pool_details(bool live, char *url, char *user, char *pass) +void add_pool_details(struct pool *pool, bool live, char *url, char *user, char *pass) { - struct pool *pool; - - pool = add_pool(); - url = get_proxy(url, pool); pool->rpc_url = url; @@ -5187,6 +5200,7 @@ void add_pool_details(bool live, char *url, char *user, char *pass) static bool input_pool(bool live) { char *url = NULL, *user = NULL, *pass = NULL; + struct pool *pool; bool ret = false; immedok(logwin, true); @@ -5196,7 +5210,18 @@ static bool input_pool(bool live) if (!url) goto out; - if (strncmp(url, "http://", 7) && + user = curses_input("Username"); + if (!user) + goto out; + + pass = curses_input("Password"); + if (!pass) + goto out; + + pool = add_pool(); + + if (!detect_stratum(pool, url) && + strncmp(url, "http://", 7) && strncmp(url, "https://", 8)) { char *httpinput; @@ -5209,15 +5234,7 @@ static bool input_pool(bool live) url = httpinput; } - user = curses_input("Username"); - if (!user) - goto out; - - pass = curses_input("Password"); - if (!pass) - goto out; - - add_pool_details(live, url, user, pass); + add_pool_details(pool, live, url, user, pass); ret = true; out: immedok(logwin, false); diff --git a/miner.h b/miner.h index f1a284e7..1fb71811 100644 --- a/miner.h +++ b/miner.h @@ -646,7 +646,9 @@ extern void api(int thr_id); extern struct pool *current_pool(void); extern int enabled_pools; -extern void add_pool_details(bool live, char *url, char *user, char *pass); +extern bool detect_stratum(struct pool *pool, char *url); +extern struct pool *add_pool(void); +extern void add_pool_details(struct pool *pool, bool live, char *url, char *user, char *pass); #define MAX_GPUDEVICES 16 @@ -818,6 +820,8 @@ struct pool { char *subscription; char *nonce1; int nonce2; + bool has_stratum; + bool stratum_active; }; #define GETWORK_MODE_TESTPOOL 'T' diff --git a/util.c b/util.c index c5d0f765..ae2063d2 100644 --- a/util.c +++ b/util.c @@ -972,9 +972,13 @@ out: CLOSESOCKET(pool->sock); if (val) json_decref(val); - } else if (opt_protocol) - applog(LOG_DEBUG, "Pool %d confirmed mining.notify with subscription %s extranonce1 %s extranonce2 %d", - pool->pool_no, pool->subscription, pool->nonce1, pool->nonce2); + } else { + pool->stratum_active = true; + if (opt_protocol) { + applog(LOG_DEBUG, "Pool %d confirmed mining.notify with subscription %s extranonce1 %s extranonce2 %d", + pool->pool_no, pool->subscription, pool->nonce1, pool->nonce2); + } + } return ret; }