Create parse_stratum function that hands off stratum parameters to other functions to manage pool stratum work struct variables. Implement mining difficulty setting.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
diff --git a/util.c b/util.c
index 25e9a93..09c351b 100644
--- a/util.c
+++ b/util.c
@@ -922,9 +922,86 @@ out:
return sret;
}
+static bool parse_notify(struct pool *pool, json_t *val)
+{
+ return true;
+}
+
+static bool parse_diff(struct pool *pool, json_t *val)
+{
+ int diff;
+
+ diff = json_integer_value(json_array_get(val, 0));
+ if (diff < 1)
+ return false;
+
+ mutex_lock(&pool->pool_lock);
+ pool->swork.diff = diff;
+ mutex_unlock(&pool->pool_lock);
+
+ applog(LOG_DEBUG, "Pool %d difficulty set to %d", pool->pool_no, diff);
+
+ return true;
+}
+
+static bool parse_stratum(struct pool *pool, char *s)
+{
+ json_t *val = NULL, *method, *err_val, *params;
+ json_error_t err;
+ bool ret = false;
+ char *buf;
+
+ val = JSON_LOADS(s, &err);
+ if (!val) {
+ applog(LOG_INFO, "JSON decode failed(%d): %s", err.line, err.text);
+ goto out;
+ }
+
+ method = json_object_get(val, "method");
+ err_val = json_object_get(val, "error");
+ params = json_object_get(val, "params");
+
+ if (!method || json_is_null(method) ||
+ (err_val && !json_is_null(err_val))) {
+ char *ss;
+
+ if (err_val)
+ ss = json_dumps(err_val, JSON_INDENT(3));
+ else
+ ss = strdup("(unknown reason)");
+
+ applog(LOG_INFO, "JSON-RPC decode failed: %s", ss);
+
+ free(ss);
+
+ goto out;
+ }
+
+ buf = (char *)json_string_value(method);
+ if (!buf)
+ goto out;
+
+ if (!strncasecmp(buf, "mining.notify", 13) && parse_notify(pool, params)) {
+ ret = true;
+ goto out;
+ }
+
+ if (!strncasecmp(buf, "mining.set_difficulty", 21) && parse_diff(pool, params)) {
+ ret = true;
+ goto out;
+ }
+
+out:
+ if (!ret) {
+ if (val)
+ json_decref(val);
+ }
+ return ret;
+}
+
bool auth_stratum(struct pool *pool)
{
- json_t *val = NULL, *res_val, *err_val, *notify_val;
+ json_t *val = NULL, *res_val, *err_val;
char *s, *buf, *sret = NULL;
json_error_t err;
bool ret = false;
@@ -935,6 +1012,7 @@ bool auth_stratum(struct pool *pool)
while (sock_full(pool->sock, false)) {
sret = recv_line(pool->sock);
+ parse_stratum(pool, sret);
free(sret);
}
@@ -986,7 +1064,7 @@ bool initiate_stratum(struct pool *pool)
val = JSON_LOADS(sret, &err);
free(sret);
if (!val) {
- applog(LOG_DEBUG, "JSON decode failed(%d): %s", err.line, err.text);
+ applog(LOG_INFO, "JSON decode failed(%d): %s", err.line, err.text);
goto out;
}
@@ -1002,7 +1080,7 @@ bool initiate_stratum(struct pool *pool)
else
ss = strdup("(unknown reason)");
- applog(LOG_INFO, "JSON-RPC call failed: %s", ss);
+ applog(LOG_INFO, "JSON-RPC decode failed: %s", ss);
free(ss);