/* * 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 CKPOOL_H #define CKPOOL_H #include "config.h" #include "libckpool.h" struct proc_instance; typedef struct proc_instance proc_instance_t; struct ckpool_instance; typedef struct ckpool_instance ckpool_t; struct proc_instance { ckpool_t *ckp; unixsock_t us; char *processname; char *sockname; int pid; int (*process)(proc_instance_t *); }; struct ckpool_instance { /* Main process name */ char *name; /* Directory where sockets are created */ char *socket_dir; /* Filename of config file */ char *config; /* Logging level */ int loglevel; /* Process instance data of parent/child processes */ proc_instance_t main; proc_instance_t generator; proc_instance_t stratifier; proc_instance_t connector; /* Threads of main process */ pthread_t pth_listener; pthread_t pth_watchdog; /* Bitcoind data */ char *btcdurl; char *btcdauth; char *btcdpass; int blockpoll; // How frequently in ms to poll bitcoind for block updates /* Coinbase data */ char *btcaddress; // Address to mine to char *btcsig; // Optional signature to add to coinbase /* Stratum options */ int update_interval; // Seconds between stratum updates char *serverurl; }; ckpool_t *global_ckp; /* Placeholders for when we have more comprehensive logging facilities */ #define LOGMSG(_loglevel, fmt, ...) do { \ if (global_ckp->loglevel >= _loglevel && fmt) { \ struct tm *tm; \ time_t now_t; \ now_t = time(NULL); \ tm = localtime(&now_t); \ fprintf(stderr, "[%d-%02d-%02d %02d:%02d:%02d] ", \ tm->tm_year + 1900, \ tm->tm_mon + 1, \ tm->tm_mday, \ tm->tm_hour, \ tm->tm_min, \ tm->tm_sec); \ fprintf(stderr, fmt, ##__VA_ARGS__); \ fprintf(stderr, "\n"); \ if (_loglevel <= LOG_ERR) \ fprintf(stderr, " with errno %d: %s", errno, strerror(errno)); \ fflush(stderr); \ } \ } while (0) #define LOGEMERG(fmt, ...) LOGMSG(LOG_EMERG, fmt, ##__VA_ARGS__) #define LOGALERT(fmt, ...) LOGMSG(LOG_ALERT, fmt, ##__VA_ARGS__) #define LOGCRIT(fmt, ...) LOGMSG(LOG_CRIT, fmt, ##__VA_ARGS__) #define LOGERR(fmt, ...) LOGMSG(LOG_ERR, fmt, ##__VA_ARGS__) #define LOGWARNING(fmt, ...) LOGMSG(LOG_WARNING, fmt, ##__VA_ARGS__) #define LOGNOTICE(fmt, ...) LOGMSG(LOG_NOTICE, fmt, ##__VA_ARGS__) #define LOGINFO(fmt, ...) LOGMSG(LOG_INFO, fmt, ##__VA_ARGS__) #define LOGDEBUG(fmt, ...) LOGMSG(LOG_DEBUG, fmt, ##__VA_ARGS__) #define IN_FMT_FFL " in %s %s():%d" #define quitfrom(status, _file, _func, _line, fmt, ...) do { \ if (fmt) { \ fprintf(stderr, fmt IN_FMT_FFL, ##__VA_ARGS__, _file, _func, _line); \ fprintf(stderr, "\n"); \ fflush(stderr); \ } \ exit(status); \ } while (0) #define quit(status, fmt, ...) do { \ if (fmt) { \ fprintf(stderr, fmt, ##__VA_ARGS__); \ fprintf(stderr, "\n"); \ fflush(stderr); \ } \ exit(status); \ } while (0) #endif /* CKPOOL_H */