Commit f6f43500c075bce5c897664e53bd5dac812319bd

Con Kolivas 2012-09-27T09:06:56

Detect stratum in common place when adding urls, and use a bool to tell us when it's active.

diff --git a/api.c b/api.c
index 361375a..f8171e0 100644
--- a/api.c
+++ b/api.c
@@ -2101,6 +2101,7 @@ exitsama:
 static void addpool(__maybe_unused SOCKETTYPE c, char *param, bool isjson, __maybe_unused char group)
 {
 	char *url, *user, *pass;
+	struct pool *pool;
 	char *ptr;
 
 	if (param == NULL || *param == '\0') {
@@ -2117,7 +2118,9 @@ static void addpool(__maybe_unused SOCKETTYPE c, char *param, bool isjson, __may
 		return;
 	}
 
-	add_pool_details(true, url, user, pass);
+	pool = add_pool();
+	detect_stratum(pool, url);
+	add_pool_details(pool, true, url, user, pass);
 
 	ptr = escape_string(url, isjson);
 	strcpy(io_buffer, message(MSG_ADDPOOL, 0, ptr, isjson));
diff --git a/cgminer.c b/cgminer.c
index 63412c1..85574ac 100644
--- a/cgminer.c
+++ b/cgminer.c
@@ -403,7 +403,7 @@ static void sharelog(const char*disposition, const struct work*work)
 }
 
 /* Return value is ignored if not called from add_pool_details */
-static struct pool *add_pool(void)
+struct pool *add_pool(void)
 {
 	struct pool *pool;
 
@@ -543,6 +543,25 @@ static char *set_rr(enum pool_strategy *strategy)
 	return NULL;
 }
 
+/* Detect that url is for a stratum protocol either via the presence of
+ * stratum+tcp or by detecting a stratum server response */
+bool detect_stratum(struct pool *pool, char *url)
+{
+	bool stratum;
+
+	if (!extract_sockaddr(pool, url))
+		return false;
+
+	stratum = initiate_stratum(pool);
+
+	if (!strncasecmp(url, "stratum+tcp://", 14) || stratum) {
+		pool->has_stratum = true;
+		return true;
+	}
+
+	return false;
+}
+
 static char *set_url(char *arg)
 {
 	struct pool *pool;
@@ -554,10 +573,8 @@ static char *set_url(char *arg)
 
 	arg = get_proxy(arg, pool);
 
-	if (!extract_sockaddr(pool, arg))
-		return "Failed to extract address from parsed url";
-
-	initiate_stratum(pool);
+	if (detect_stratum(pool, arg))
+		return NULL;
 
 	opt_set_charp(arg, &pool->rpc_url);
 	if (strncmp(arg, "http://", 7) &&
@@ -5160,12 +5177,8 @@ char *curses_input(const char *query)
 }
 #endif
 
-void add_pool_details(bool live, char *url, char *user, char *pass)
+void add_pool_details(struct pool *pool, bool live, char *url, char *user, char *pass)
 {
-	struct pool *pool;
-
-	pool = add_pool();
-
 	url = get_proxy(url, pool);
 
 	pool->rpc_url = url;
@@ -5187,6 +5200,7 @@ void add_pool_details(bool live, char *url, char *user, char *pass)
 static bool input_pool(bool live)
 {
 	char *url = NULL, *user = NULL, *pass = NULL;
+	struct pool *pool;
 	bool ret = false;
 
 	immedok(logwin, true);
@@ -5196,7 +5210,18 @@ static bool input_pool(bool live)
 	if (!url)
 		goto out;
 
-	if (strncmp(url, "http://", 7) &&
+	user = curses_input("Username");
+	if (!user)
+		goto out;
+
+	pass = curses_input("Password");
+	if (!pass)
+		goto out;
+
+	pool = add_pool();
+
+	if (!detect_stratum(pool, url) &&
+	    strncmp(url, "http://", 7) &&
 	    strncmp(url, "https://", 8)) {
 		char *httpinput;
 
@@ -5209,15 +5234,7 @@ static bool input_pool(bool live)
 		url = httpinput;
 	}
 
-	user = curses_input("Username");
-	if (!user)
-		goto out;
-
-	pass = curses_input("Password");
-	if (!pass)
-		goto out;
-
-	add_pool_details(live, url, user, pass);
+	add_pool_details(pool, live, url, user, pass);
 	ret = true;
 out:
 	immedok(logwin, false);
diff --git a/miner.h b/miner.h
index f1a284e..1fb7181 100644
--- a/miner.h
+++ b/miner.h
@@ -646,7 +646,9 @@ extern void api(int thr_id);
 
 extern struct pool *current_pool(void);
 extern int enabled_pools;
-extern void add_pool_details(bool live, char *url, char *user, char *pass);
+extern bool detect_stratum(struct pool *pool, char *url);
+extern struct pool *add_pool(void);
+extern void add_pool_details(struct pool *pool, bool live, char *url, char *user, char *pass);
 
 #define MAX_GPUDEVICES 16
 
@@ -818,6 +820,8 @@ struct pool {
 	char *subscription;
 	char *nonce1;
 	int nonce2;
+	bool has_stratum;
+	bool stratum_active;
 };
 
 #define GETWORK_MODE_TESTPOOL 'T'
diff --git a/util.c b/util.c
index c5d0f76..ae2063d 100644
--- a/util.c
+++ b/util.c
@@ -972,9 +972,13 @@ out:
 		CLOSESOCKET(pool->sock);
 		if (val)
 			json_decref(val);
-	} else if (opt_protocol)
-		applog(LOG_DEBUG, "Pool %d confirmed mining.notify with subscription %s extranonce1 %s extranonce2 %d",
-		       pool->pool_no, pool->subscription, pool->nonce1, pool->nonce2);
+	} else {
+		pool->stratum_active = true;
+		if (opt_protocol) {
+			applog(LOG_DEBUG, "Pool %d confirmed mining.notify with subscription %s extranonce1 %s extranonce2 %d",
+			       pool->pool_no, pool->subscription, pool->nonce1, pool->nonce2);
+		}
+	}
 
 	return ret;
 }