Browse Source

Merge commit 'eaf7ed0' into stratum

Conflicts:
	miner.c
	util.c
Luke Dashjr 13 years ago
parent
commit
327a3db4f2
2 changed files with 37 additions and 5 deletions
  1. 17 1
      miner.c
  2. 20 4
      util.c

+ 17 - 1
miner.c

@@ -5045,6 +5045,9 @@ static bool pool_active(struct pool *pool, bool pinging)
 	struct work *work;
 	enum pool_protocol proto;
 
+	applog(LOG_INFO, "Testing pool %s", pool->rpc_url);
+
+retry_stratum:
 	if (pool->has_stratum) {
 		if ((!pool->stratum_active || pinging) && !initiate_stratum(pool))
 			return false;
@@ -5074,13 +5077,26 @@ tryagain:
 	if (!rpc_req)
 		return false;
 
-	applog(LOG_INFO, "Testing pool %s", pool->rpc_url);
 	pool->probed = false;
 	gettimeofday(&tv_getwork, NULL);
 	val = json_rpc_call(curl, pool->rpc_url, pool->rpc_userpass, rpc_req,
 			true, false, &rolltime, pool, false);
 	gettimeofday(&tv_getwork_reply, NULL);
 
+	/* Detect if a http getwork pool has an X-Stratum header at startup,
+	 * and if so, switch to that in preference to getwork */
+	if (unlikely(!pinging && pool->stratum_url)) {
+		applog(LOG_NOTICE, "Switching pool %d %s to %s", pool->pool_no, pool->rpc_url, pool->stratum_url);
+		pool->has_stratum = true;
+		pool->rpc_url = strdup(pool->stratum_url);
+		extract_sockaddr(pool, pool->stratum_url);
+		initiate_stratum(pool);
+		auth_stratum(pool);
+		curl_easy_cleanup(curl);
+
+		goto  retry_stratum;
+	}
+
 	if (val) {
 		bool rc;
 		json_t *res;

+ 20 - 4
util.c

@@ -64,6 +64,7 @@ struct header_info {
 	char		*lp_path;
 	int		rolltime;
 	char		*reason;
+	char		*stratum_url;
 	bool		hadrolltime;
 	bool		canroll;
 	bool		hadexpire;
@@ -203,6 +204,11 @@ static size_t resp_hdr_cb(void *ptr, size_t size, size_t nmemb, void *user_data)
 		val = NULL;
 	}
 
+	if (!strcasecmp("X-Stratum", key)) {
+		hi->stratum_url = val;
+		val = NULL;
+	}
+
 out:
 	free(key);
 	free(val);
@@ -281,7 +287,7 @@ json_t *json_rpc_call(CURL *curl, const char *url,
 {
 	long timeout = longpoll ? (60 * 60) : 60;
 	struct data_buffer all_data = {NULL, 0, NULL};
-	struct header_info hi = {NULL, 0, NULL, false, false, false};
+	struct header_info hi = {NULL, 0, NULL, NULL, false, false, false};
 	char len_hdr[64], user_agent_hdr[128];
 	char curl_err_str[CURL_ERROR_SIZE];
 	struct curl_slist *headers = NULL;
@@ -414,9 +420,19 @@ json_t *json_rpc_call(CURL *curl, const char *url,
 			pool->hdr_path = hi.lp_path;
 		} else
 			pool->hdr_path = NULL;
-	} else if (hi.lp_path) {
-		free(hi.lp_path);
-		hi.lp_path = NULL;
+		if (hi.stratum_url) {
+			pool->stratum_url = hi.stratum_url;
+			hi.stratum_url = NULL;
+		}
+	} else {
+		if (hi.lp_path) {
+			free(hi.lp_path);
+			hi.lp_path = NULL;
+		}
+		if (hi.stratum_url) {
+			free(hi.stratum_url);
+			hi.stratum_url = NULL;
+		}
 	}
 
 	*rolltime = hi.rolltime;