Con Kolivas
11 years ago
5 changed files with 126 additions and 3 deletions
@ -0,0 +1,98 @@
|
||||
/*
|
||||
* Copyright 2014 Con Kolivas |
||||
* |
||||
* This program is free software; you can redistribute it and/or modify it |
||||
* under the terms of the GNU General Public License as published by the Free |
||||
* Software Foundation; either version 3 of the License, or (at your option) |
||||
* any later version. See COPYING for more details. |
||||
*/ |
||||
|
||||
#include "config.h" |
||||
|
||||
#include <sys/socket.h> |
||||
#include <string.h> |
||||
#include <unistd.h> |
||||
|
||||
#include "ckpool.h" |
||||
#include "libckpool.h" |
||||
#include "bitcoin.h" |
||||
|
||||
static void update_base(ckpool_t *ckp) |
||||
{ |
||||
char *path = ckp->generator.us.path, *buf; |
||||
int genfd; |
||||
|
||||
genfd = open_unix_client(ckp->generator.us.path); |
||||
if (genfd < 0) { |
||||
LOGWARNING("Failed to open generator socket %s", path); |
||||
return; |
||||
} |
||||
send_unix_msg(genfd, "getbase"); |
||||
buf = recv_unix_msg(genfd); |
||||
/* Do something with this buffer here */ |
||||
dealloc(buf); |
||||
} |
||||
|
||||
static int strat_loop(ckpool_t *ckp, proc_instance_t *pi) |
||||
{ |
||||
int sockd, ret = 0, selret; |
||||
unixsock_t *us = &pi->us; |
||||
char *buf = NULL; |
||||
fd_set readfds; |
||||
tv_t timeout; |
||||
|
||||
reset: |
||||
timeout.tv_sec = 60; |
||||
retry: |
||||
FD_ZERO(&readfds); |
||||
FD_SET(us->sockd, &readfds); |
||||
selret = select(us->sockd + 1, &readfds, NULL, NULL, &timeout); |
||||
if (selret < 0) { |
||||
if (interrupted()) |
||||
goto retry; |
||||
LOGERR("Select failed in strat_loop"); |
||||
ret = 1; |
||||
goto out; |
||||
} |
||||
if (!selret) { |
||||
LOGDEBUG("60s elapsed in strat_loop, updating gbt base"); |
||||
update_base(ckp); |
||||
goto reset; |
||||
} |
||||
sockd = accept(us->sockd, NULL, NULL); |
||||
if (sockd < 0) { |
||||
if (interrupted()) |
||||
goto retry; |
||||
LOGERR("Failed to accept on stratifier socket"); |
||||
ret = 1; |
||||
goto out; |
||||
} |
||||
|
||||
dealloc(buf); |
||||
buf = recv_unix_msg(sockd); |
||||
if (!buf) { |
||||
LOGWARNING("Failed to get message in strat_loop"); |
||||
close(sockd); |
||||
goto retry; |
||||
} |
||||
LOGDEBUG("Stratifier received request: %s", buf); |
||||
if (!strncasecmp(buf, "shutdown", 8)) |
||||
goto out; |
||||
if (!strncasecmp(buf, "update", 6)) { |
||||
update_base(ckp); |
||||
goto reset; |
||||
} |
||||
|
||||
out: |
||||
dealloc(buf); |
||||
return ret; |
||||
} |
||||
|
||||
int stratifier(proc_instance_t *pi) |
||||
{ |
||||
ckpool_t *ckp = pi->ckp; |
||||
int ret = 0; |
||||
|
||||
strat_loop(ckp, pi); |
||||
return ret; |
||||
} |
@ -0,0 +1,15 @@
|
||||
/*
|
||||
* Copyright 2014 Con Kolivas |
||||
* |
||||
* This program is free software; you can redistribute it and/or modify it |
||||
* under the terms of the GNU General Public License as published by the Free |
||||
* Software Foundation; either version 3 of the License, or (at your option) |
||||
* any later version. See COPYING for more details. |
||||
*/ |
||||
|
||||
#ifndef STRATIFIER_H |
||||
#define STRATIFIER_H |
||||
|
||||
int stratifier(proc_instance_t *pi); |
||||
|
||||
#endif /* STRATIFIER_H */ |
Loading…
Reference in new issue