diff --git a/cgminer.c b/cgminer.c index c08cfe14..37eeda18 100644 --- a/cgminer.c +++ b/cgminer.c @@ -4163,24 +4163,28 @@ static void *stratum_thread(void *userdata) * every minute so if we fail to receive any for 2 minutes we * assume the connection has been dropped and treat this pool * as dead */ - if (select(pool->sock + 1, &rd, NULL, NULL, &timeout) < 1) { + select(pool->sock + 1, &rd, NULL, NULL, &timeout); + s = recv_line(pool); + if (!s) { applog(LOG_INFO, "Stratum connection to pool %d interrupted", pool->pool_no); pool->getfail_occasions++; total_go++; + pool->stratum_active = false; + if (initiate_stratum(pool) && auth_stratum(pool)) + continue; + pool_died(pool); while (!initiate_stratum(pool) || !auth_stratum(pool)) { if (pool->removed) goto out; - sleep(5); + sleep(30); } applog(LOG_INFO, "Stratum connection to pool %d resumed", pool->pool_no); pool_resus(pool); continue; } - s = recv_line(pool); - if (unlikely(!s)) - continue; + if (!parse_method(pool, s) && !parse_stratum_response(s)) applog(LOG_INFO, "Unknown stratum msg: %s", s); free(s); diff --git a/util.c b/util.c index d39d1038..6d6409bc 100644 --- a/util.c +++ b/util.c @@ -1103,6 +1103,9 @@ bool parse_method(struct pool *pool, char *s) bool ret = false; char *buf; + if (!s) + goto out; + val = JSON_LOADS(s, &err); if (!val) { applog(LOG_INFO, "JSON decode failed(%d): %s", err.line, err.text); @@ -1166,7 +1169,7 @@ bool auth_stratum(struct pool *pool) sret = recv_line(pool); if (!parse_method(pool, sret)) { clear_sock(pool); - applog(LOG_WARNING, "Failed to parse stratum buffer"); + applog(LOG_INFO, "Failed to parse stratum buffer"); free(sret); return ret; }