Commit 0ce3df10d25c2b4a1110f6627d33862ab0af68d3

Con Kolivas 2011-07-19T11:45:58

Store whether each server supports X-Roll-Ntime or not.

diff --git a/main.c b/main.c
index e846acd..aa6bd43 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 332aef6..4d0ef1d 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 c412433..9d4b854 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);
 	}