diff --git a/main.c b/main.c index e846acd5..aa6bd435 100644 --- a/main.c +++ b/main.c @@ -775,7 +775,7 @@ static bool submit_upstream_work(const struct work *work) applog(LOG_DEBUG, "DBG: sending RPC call: %s", s); /* issue JSON-RPC request */ - val = json_rpc_call(curl, pool->rpc_url, pool->rpc_userpass, s, false, false); + val = json_rpc_call(curl, pool->rpc_url, pool->rpc_userpass, s, false, false, false, pool); if (unlikely(!val)) { applog(LOG_INFO, "submit_upstream_work json_rpc_call failed"); if (!pool_tset(pool, &pool->submit_fail)) { @@ -847,7 +847,7 @@ static bool get_upstream_work(struct work *work) } val = json_rpc_call(curl, pool->rpc_url, pool->rpc_userpass, rpc_req, - want_longpoll, false); + want_longpoll, false, false, pool); if (unlikely(!val)) { applog(LOG_DEBUG, "Failed json_rpc_call in get_upstream_work"); goto out; @@ -2031,7 +2031,7 @@ next_path: gettimeofday(&start, NULL); val = json_rpc_call(curl, lp_url, pool->rpc_userpass, rpc_req, - false, true); + false, true, false, pool); if (likely(val)) { /* Keep track of who ordered a restart_threads to make * sure it's only done once per new block */ diff --git a/miner.h b/miner.h index 332aef61..4d0ef1d4 100644 --- a/miner.h +++ b/miner.h @@ -175,12 +175,15 @@ static inline void swap256(void *dest_p, const void *src_p) dest[7] = src[0]; } +struct pool; + extern bool opt_debug; extern bool opt_protocol; extern bool opt_log_output; extern const uint32_t sha256_init_state[]; extern json_t *json_rpc_call(CURL *curl, const char *url, const char *userpass, - const char *rpc_req, bool, bool); + const char *rpc_req, bool, bool, bool, + struct pool *pool); extern char *bin2hex(const unsigned char *p, size_t len); extern bool hex2bin(unsigned char *p, const char *hexstr, size_t len); @@ -267,6 +270,7 @@ struct pool { bool submit_fail; bool localgen; bool idlenet; + bool has_rolltime; unsigned int getwork_requested; unsigned int stale_shares; unsigned int discarded_work; diff --git a/util.c b/util.c index c4124330..9d4b854a 100644 --- a/util.c +++ b/util.c @@ -186,7 +186,8 @@ static size_t upload_data_cb(void *ptr, size_t size, size_t nmemb, return len; } -static size_t resp_hdr_cb(void *ptr, size_t size, size_t nmemb, void *user_data) +static size_t resp_hdr_cb(void *ptr, size_t size, size_t nmemb, void *user_data, + struct pool *pool) { struct header_info *hi = user_data; size_t remlen, slen, ptrlen = size * nmemb; @@ -225,6 +226,11 @@ static size_t resp_hdr_cb(void *ptr, size_t size, size_t nmemb, void *user_data) if (opt_protocol) applog(LOG_DEBUG, "HTTP hdr(%s): %s", key, val); + if (!strcasecmp("X-Roll-Ntime", key)) { + applog(LOG_INFO, "X-Roll-Ntime found"); + pool->has_rolltime = true; + } + if (!strcasecmp("X-Long-Polling", key)) { hi->lp_path = val; /* steal memory reference */ val = NULL; @@ -240,7 +246,8 @@ static bool comms_error = false; json_t *json_rpc_call(CURL *curl, const char *url, const char *userpass, const char *rpc_req, - bool longpoll_scan, bool longpoll) + bool longpoll_scan, bool longpoll, + bool getroll, struct pool *pool) { json_t *val, *err_val, *res_val; int rc; @@ -271,7 +278,7 @@ json_t *json_rpc_call(CURL *curl, const char *url, curl_easy_setopt(curl, CURLOPT_READDATA, &upload_data); curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, curl_err_str); curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); - if (lp_scanning) { + if (lp_scanning || getroll) { curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, resp_hdr_cb); curl_easy_setopt(curl, CURLOPT_HEADERDATA, &hi); }