Browse Source

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

Con Kolivas 13 years ago
parent
commit
f6f43500c0
4 changed files with 53 additions and 25 deletions
  1. 4 1
      api.c
  2. 37 20
      cgminer.c
  3. 5 1
      miner.h
  4. 7 3
      util.c

+ 4 - 1
api.c

@@ -2101,6 +2101,7 @@ exitsama:
 static void addpool(__maybe_unused SOCKETTYPE c, char *param, bool isjson, __maybe_unused char group)
 static void addpool(__maybe_unused SOCKETTYPE c, char *param, bool isjson, __maybe_unused char group)
 {
 {
 	char *url, *user, *pass;
 	char *url, *user, *pass;
+	struct pool *pool;
 	char *ptr;
 	char *ptr;
 
 
 	if (param == NULL || *param == '\0') {
 	if (param == NULL || *param == '\0') {
@@ -2117,7 +2118,9 @@ static void addpool(__maybe_unused SOCKETTYPE c, char *param, bool isjson, __may
 		return;
 		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);
 	ptr = escape_string(url, isjson);
 	strcpy(io_buffer, message(MSG_ADDPOOL, 0, ptr, isjson));
 	strcpy(io_buffer, message(MSG_ADDPOOL, 0, ptr, isjson));

+ 37 - 20
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 */
 /* 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;
 	struct pool *pool;
 
 
@@ -543,6 +543,25 @@ static char *set_rr(enum pool_strategy *strategy)
 	return NULL;
 	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)
 static char *set_url(char *arg)
 {
 {
 	struct pool *pool;
 	struct pool *pool;
@@ -554,10 +573,8 @@ static char *set_url(char *arg)
 
 
 	arg = get_proxy(arg, pool);
 	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);
 	opt_set_charp(arg, &pool->rpc_url);
 	if (strncmp(arg, "http://", 7) &&
 	if (strncmp(arg, "http://", 7) &&
@@ -5160,12 +5177,8 @@ char *curses_input(const char *query)
 }
 }
 #endif
 #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);
 	url = get_proxy(url, pool);
 
 
 	pool->rpc_url = url;
 	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)
 static bool input_pool(bool live)
 {
 {
 	char *url = NULL, *user = NULL, *pass = NULL;
 	char *url = NULL, *user = NULL, *pass = NULL;
+	struct pool *pool;
 	bool ret = false;
 	bool ret = false;
 
 
 	immedok(logwin, true);
 	immedok(logwin, true);
@@ -5196,7 +5210,18 @@ static bool input_pool(bool live)
 	if (!url)
 	if (!url)
 		goto out;
 		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)) {
 	    strncmp(url, "https://", 8)) {
 		char *httpinput;
 		char *httpinput;
 
 
@@ -5209,15 +5234,7 @@ static bool input_pool(bool live)
 		url = httpinput;
 		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;
 	ret = true;
 out:
 out:
 	immedok(logwin, false);
 	immedok(logwin, false);

+ 5 - 1
miner.h

@@ -646,7 +646,9 @@ extern void api(int thr_id);
 
 
 extern struct pool *current_pool(void);
 extern struct pool *current_pool(void);
 extern int enabled_pools;
 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
 #define MAX_GPUDEVICES 16
 
 
@@ -818,6 +820,8 @@ struct pool {
 	char *subscription;
 	char *subscription;
 	char *nonce1;
 	char *nonce1;
 	int nonce2;
 	int nonce2;
+	bool has_stratum;
+	bool stratum_active;
 };
 };
 
 
 #define GETWORK_MODE_TESTPOOL 'T'
 #define GETWORK_MODE_TESTPOOL 'T'

+ 7 - 3
util.c

@@ -972,9 +972,13 @@ out:
 		CLOSESOCKET(pool->sock);
 		CLOSESOCKET(pool->sock);
 		if (val)
 		if (val)
 			json_decref(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;
 	return ret;
 }
 }