aboutsummaryrefslogtreecommitdiff
path: root/cpu-miner.c
diff options
context:
space:
mode:
authorJeff Garzik <jeff@garzik.org>2010-11-25 04:03:59 -0500
committerJeff Garzik <jgarzik@redhat.com>2010-11-25 04:03:59 -0500
commit945be82ea15854bd6ecb24e04f6157b9c2c2b040 (patch)
tree20c571f9d2d89f8fab36e34479bedbe65d4b2246 /cpu-miner.c
parent822cf2cc450b1bd643d1362c6d6f4950b24ddf76 (diff)
Move utility routines to util.c.
Diffstat (limited to 'cpu-miner.c')
-rw-r--r--cpu-miner.c189
1 files changed, 5 insertions, 184 deletions
diff --git a/cpu-miner.c b/cpu-miner.c
index 7685fdb..2c8149e 100644
--- a/cpu-miner.c
+++ b/cpu-miner.c
@@ -1,3 +1,4 @@
+
/*
* Copyright 2010 Jeff Garzik
*
@@ -20,7 +21,7 @@
#include <pthread.h>
#include <argp.h>
#include <jansson.h>
-#include <curl/curl.h>
+#include "miner.h"
#define PROGRAM_NAME "minerd"
#define DEF_RPC_URL "http://127.0.0.1:8332/"
@@ -34,7 +35,7 @@ enum {
};
static bool opt_debug;
-static bool opt_protocol;
+bool opt_protocol = false;
static bool program_running = true;
static const bool opt_time = true;
static int opt_n_threads = 1;
@@ -71,16 +72,6 @@ static error_t parse_opt (int key, char *arg, struct argp_state *state);
static const struct argp argp = { options, parse_opt, NULL, doc };
-struct data_buffer {
- void *buf;
- size_t len;
-};
-
-struct upload_buffer {
- const void *buf;
- size_t len;
-};
-
struct work {
unsigned char data[128];
unsigned char hash1[64];
@@ -90,176 +81,6 @@ struct work {
unsigned char hash[32];
};
-static void databuf_free(struct data_buffer *db)
-{
- if (!db)
- return;
-
- free(db->buf);
-
- memset(db, 0, sizeof(*db));
-}
-
-static size_t all_data_cb(const void *ptr, size_t size, size_t nmemb,
- void *user_data)
-{
- struct data_buffer *db = user_data;
- size_t len = size * nmemb;
- size_t oldlen, newlen;
- void *newmem;
- static const unsigned char zero;
-
- oldlen = db->len;
- newlen = oldlen + len;
-
- newmem = realloc(db->buf, newlen + 1);
- if (!newmem)
- return 0;
-
- db->buf = newmem;
- db->len = newlen;
- memcpy(db->buf + oldlen, ptr, len);
- memcpy(db->buf + newlen, &zero, 1); /* null terminate */
-
- return len;
-}
-
-static size_t upload_data_cb(void *ptr, size_t size, size_t nmemb,
- void *user_data)
-{
- struct upload_buffer *ub = user_data;
- int len = size * nmemb;
-
- if (len > ub->len)
- len = ub->len;
-
- if (len) {
- memcpy(ptr, ub->buf, len);
- ub->buf += len;
- ub->len -= len;
- }
-
- return len;
-}
-
-static json_t *json_rpc_call(const char *url, const char *rpc_req)
-{
- CURL *curl;
- json_t *val;
- int rc;
- struct data_buffer all_data = { };
- struct upload_buffer upload_data;
- json_error_t err = { };
- struct curl_slist *headers = NULL;
- char len_hdr[64];
-
- curl = curl_easy_init();
- if (!curl)
- return NULL;
-
- if (opt_protocol)
- curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
- curl_easy_setopt(curl, CURLOPT_URL, url);
- curl_easy_setopt(curl, CURLOPT_ENCODING, "");
- curl_easy_setopt(curl, CURLOPT_FAILONERROR, 1);
- curl_easy_setopt(curl, CURLOPT_TCP_NODELAY, 1);
- curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, all_data_cb);
- curl_easy_setopt(curl, CURLOPT_WRITEDATA, &all_data);
- curl_easy_setopt(curl, CURLOPT_READFUNCTION, upload_data_cb);
- curl_easy_setopt(curl, CURLOPT_READDATA, &upload_data);
- if (userpass) {
- curl_easy_setopt(curl, CURLOPT_USERPWD, userpass);
- curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
- }
- curl_easy_setopt(curl, CURLOPT_POST, 1);
-
- if (opt_protocol)
- printf("JSON protocol request:\n%s\n", rpc_req);
-
- upload_data.buf = rpc_req;
- upload_data.len = strlen(rpc_req);
- sprintf(len_hdr, "Content-Length: %lu",
- (unsigned long) upload_data.len);
-
- headers = curl_slist_append(headers,
- "Content-type: application/json");
- headers = curl_slist_append(headers, len_hdr);
- headers = curl_slist_append(headers, "Expect:"); /* disable Expect hdr*/
-
- curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
-
- rc = curl_easy_perform(curl);
- if (rc)
- goto err_out;
-
- val = json_loads(all_data.buf, &err);
- if (!val) {
- fprintf(stderr, "JSON failed(%d): %s\n", err.line, err.text);
- goto err_out;
- }
-
- if (opt_protocol) {
- char *s = json_dumps(val, JSON_INDENT(3));
- printf("JSON protocol response:\n%s\n", s);
- free(s);
- }
-
- databuf_free(&all_data);
- curl_slist_free_all(headers);
- curl_easy_cleanup(curl);
- return val;
-
-err_out:
- databuf_free(&all_data);
- curl_slist_free_all(headers);
- curl_easy_cleanup(curl);
- return NULL;
-}
-
-static char *bin2hex(unsigned char *p, size_t len)
-{
- int i;
- char *s = malloc((len * 2) + 1);
- if (!s)
- return NULL;
-
- for (i = 0; i < len; i++)
- sprintf(s + (i * 2), "%02x", (unsigned int) p[i]);
-
- return s;
-}
-
-static bool hex2bin(unsigned char *p, const char *hexstr, size_t len)
-{
- while (*hexstr && len) {
- char hex_byte[3];
- unsigned int v;
-
- if (!hexstr[1]) {
- fprintf(stderr, "hex2bin str truncated\n");
- return false;
- }
-
- hex_byte[0] = hexstr[0];
- hex_byte[1] = hexstr[1];
- hex_byte[2] = 0;
-
- if (sscanf(hex_byte, "%x", &v) != 1) {
- fprintf(stderr, "hex2bin sscanf '%s' failed\n",
- hex_byte);
- return false;
- }
-
- *p = (unsigned char) v;
-
- p++;
- hexstr += 2;
- len--;
- }
-
- return (len == 0 && *hexstr == 0) ? true : false;
-}
-
static bool jobj_binary(const json_t *obj, const char *key,
void *buf, size_t buflen)
{
@@ -401,7 +222,7 @@ static void submit_work(struct work *work)
fprintf(stderr, "DBG: sending RPC call:\n%s", s);
/* issue JSON-RPC request */
- val = json_rpc_call(rpc_url, s);
+ val = json_rpc_call(rpc_url, userpass, s);
if (!val) {
fprintf(stderr, "submit_work json_rpc_call failed\n");
goto out;
@@ -430,7 +251,7 @@ static void *miner_thread(void *dummy)
bool rc;
/* obtain new work from bitcoin */
- val = json_rpc_call(rpc_url, rpc_req);
+ val = json_rpc_call(rpc_url, userpass, rpc_req);
if (!val) {
fprintf(stderr, "json_rpc_call failed\n");
return NULL;