From 913e120262878fa61b8848d43b71000e553ab659 Mon Sep 17 00:00:00 2001 From: Con Kolivas Date: Tue, 19 Jul 2011 12:29:33 +1000 Subject: [PATCH] Test for rolltime and save it correctly when testing for longpoll. --- main.c | 51 ++++++++++++++++++++++++++------------------------- miner.h | 3 +-- util.c | 11 ++++++----- 3 files changed, 33 insertions(+), 32 deletions(-) diff --git a/main.c b/main.c index aa6bd435..096915db 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, false, pool); + val = json_rpc_call(curl, pool->rpc_url, pool->rpc_userpass, s, 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, false, pool); + want_longpoll, 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, pool); + false, true, pool); if (likely(val)) { /* Keep track of who ordered a restart_threads to make * sure it's only done once per new block */ @@ -2294,7 +2294,6 @@ int main (int argc, char *argv[]) struct thr_info *thr; char name[256]; struct tm tm; - struct pool *pool; /* This dangerous functions tramples random dynamically allocated * variables so do it before anything at all */ @@ -2374,9 +2373,6 @@ int main (int argc, char *argv[]) return 1; } - set_current_pool(pools); - pool = current_pool(); - if (total_devices) { if (total_devices > nDevs) { applog(LOG_ERR, "More devices specified than exist"); @@ -2407,26 +2403,31 @@ int main (int argc, char *argv[]) logstart = cpucursor + (opt_n_threads ? num_processors : 0) + 1; logcursor = logstart + 1; - if (!pool->rpc_userpass) { - if (!pool->rpc_user || !pool->rpc_pass) { - applog(LOG_ERR, "No login credentials supplied"); - return 1; - } - pool->rpc_userpass = malloc(strlen(pool->rpc_user) + strlen(pool->rpc_pass) + 2); - if (!pool->rpc_userpass) - return 1; - sprintf(pool->rpc_userpass, "%s:%s", pool->rpc_user, pool->rpc_pass); - } else { - pool->rpc_user = malloc(strlen(pool->rpc_userpass)); - if (!pool->rpc_user) - return 1; - strcpy(pool->rpc_user, pool->rpc_userpass); - pool->rpc_user = strtok(pool->rpc_user, ":"); - if (!pool->rpc_user) { - applog(LOG_ERR, "Failed to find colon delimiter in userpass"); - return 1; + for (i = 0; i < total_pools; i++) { + struct pool *pool = &pools[i]; + + if (!pool->rpc_userpass) { + if (!pool->rpc_user || !pool->rpc_pass) { + applog(LOG_ERR, "No login credentials supplied for pool %u %s", i, pool->rpc_url); + return 1; + } + pool->rpc_userpass = malloc(strlen(pool->rpc_user) + strlen(pool->rpc_pass) + 2); + if (!pool->rpc_userpass) + return 1; + sprintf(pool->rpc_userpass, "%s:%s", pool->rpc_user, pool->rpc_pass); + } else { + pool->rpc_user = malloc(strlen(pool->rpc_userpass)); + if (!pool->rpc_user) + return 1; + strcpy(pool->rpc_user, pool->rpc_userpass); + pool->rpc_user = strtok(pool->rpc_user, ":"); + if (!pool->rpc_user) { + applog(LOG_ERR, "Failed to find colon delimiter in userpass"); + return 1; + } } } + set_current_pool(pools); #ifdef HAVE_SYSLOG_H if (use_syslog) diff --git a/miner.h b/miner.h index 4d0ef1d4..1442be05 100644 --- a/miner.h +++ b/miner.h @@ -182,8 +182,7 @@ 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, bool, - struct pool *pool); + const char *rpc_req, 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); diff --git a/util.c b/util.c index 9d4b854a..cabcfa75 100644 --- a/util.c +++ b/util.c @@ -68,6 +68,7 @@ struct upload_buffer { struct header_info { char *lp_path; + bool has_rolltime; }; struct tq_ent { @@ -186,8 +187,7 @@ 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, - struct pool *pool) +static size_t resp_hdr_cb(void *ptr, size_t size, size_t nmemb, void *user_data) { struct header_info *hi = user_data; size_t remlen, slen, ptrlen = size * nmemb; @@ -228,7 +228,7 @@ static size_t resp_hdr_cb(void *ptr, size_t size, size_t nmemb, void *user_data, if (!strcasecmp("X-Roll-Ntime", key)) { applog(LOG_INFO, "X-Roll-Ntime found"); - pool->has_rolltime = true; + hi->has_rolltime = true; } if (!strcasecmp("X-Long-Polling", key)) { @@ -247,7 +247,7 @@ 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 getroll, struct pool *pool) + struct pool *pool) { json_t *val, *err_val, *res_val; int rc; @@ -278,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 || getroll) { + if (lp_scanning) { curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, resp_hdr_cb); curl_easy_setopt(curl, CURLOPT_HEADERDATA, &hi); } @@ -329,6 +329,7 @@ json_t *json_rpc_call(CURL *curl, const char *url, tq_push(thr_info[longpoll_thr_id].q, hi.lp_path); } else free(hi.lp_path); + pool->has_rolltime = hi.has_rolltime; } hi.lp_path = NULL;