Browse Source

Version 2.0.8w (windows changes)

nfactor-troky
Kano 13 years ago
parent
commit
45068ced82
  1. 17
      api-example.php
  2. 123
      api.c
  3. 2
      configure.ac
  4. 242
      inet_ntop.h
  5. 262
      inet_pton.h
  6. 4
      miner.h

17
api-example.php

@ -11,7 +11,7 @@ function getsock($addr, $port) @@ -11,7 +11,7 @@ function getsock($addr, $port)
$error = socket_strerror(socket_last_error());
$msg = "socket create(TCP) failed";
echo "ERR: $msg '$error'\n";
return NULL;
return null;
}
$res = socket_connect($socket, $addr, $port);
@ -21,7 +21,7 @@ function getsock($addr, $port) @@ -21,7 +21,7 @@ function getsock($addr, $port)
$msg = "socket connect($addr,$port) failed";
echo "ERR: $msg '$error'\n";
socket_close($socket);
return NULL;
return null;
}
return $socket;
}
@ -105,16 +105,11 @@ function request($cmd) @@ -105,16 +105,11 @@ function request($cmd)
return null;
}
#
$r = request('apiversion');
echo print_r($r, true)."\n";
#
$r = request('dev');
echo print_r($r, true)."\n";
#
$r = request('pool');
echo print_r($r, true)."\n";
#
if (isset($argv) and count($argv) > 1)
$r = request($argv[1]);
else
$r = request('summary');
#
echo print_r($r, true)."\n";
#
?>

123
api.c

@ -23,12 +23,34 @@ @@ -23,12 +23,34 @@
#if defined(unix)
#include <errno.h>
#endif
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define SOCKETTYPE int
#define BINDERROR < 0
#define LISTENERROR BINDERROR
#define ACCEPTERROR BINDERROR
#define INVSOCK -1
#define CLOSESOCKET close
#endif
#ifdef WIN32
#include <winsock2.h>
#include "inet_ntop.h"
#include "inet_pton.h"
#define SOCKETTYPE SOCKET
#define BINDERROR == SOCKET_ERROR
#define LISTENERROR BINDERROR
#define ACCEPTERROR BINDERROR
#define INVSOCK INVALID_SOCKET
#define CLOSESOCKET closesocket
#ifndef SHUT_RDWR
#define SHUT_RDWR SD_BOTH
#endif
#endif
// Big enough for largest API request
// though a PC with 100s of CPUs may exceed the size ...
// Current code assumes it can socket send this size also
@ -39,6 +61,7 @@ @@ -39,6 +61,7 @@
static char *io_buffer = NULL;
static char *msg_buffer = NULL;
static SOCKETTYPE sock = INVSOCK;
static const char *UNAVAILABLE = " - API will not be available";
@ -65,6 +88,8 @@ static const char *SEPARATORSTR = "|"; @@ -65,6 +88,8 @@ static const char *SEPARATORSTR = "|";
#define MSG_GPUDEV 17
#define MSG_CPUDEV 18
#define MSG_INVCPU 19
#define MSG_NUMGPU 20
#define MSG_NUMCPU 21
enum code_severity {
SEVERITY_ERR,
@ -109,10 +134,12 @@ struct CODES { @@ -109,10 +134,12 @@ struct CODES {
{ SEVERITY_SUCC, MSG_GPUDEV, PARAM_GPU, "GPU%d" },
{ SEVERITY_SUCC, MSG_CPUDEV, PARAM_CPU, "CPU%d" },
{ SEVERITY_ERR, MSG_INVCPU, PARAM_CPUMAX, "Invalid CPU id %d - range is 0 - %d" },
{ SEVERITY_SUCC, MSG_NUMGPU, PARAM_NONE, "GPU count" },
{ SEVERITY_SUCC, MSG_NUMCPU, PARAM_NONE, "CPU count" },
{ SEVERITY_FAIL }
};
static const char *APIVERSION = "0.2";
static const char *APIVERSION = "0.3";
static const char *DEAD = "DEAD";
static const char *SICK = "SICK";
static const char *NOSTART = "NOSTART";
@ -204,7 +231,6 @@ void gpustatus(int gpu) @@ -204,7 +231,6 @@ void gpustatus(int gpu)
char *status;
float gt;
int gf, gp;
int i;
if (gpu >= 0 && gpu < nDevs) {
struct cgpu_info *cgpu = &gpus[gpu];
@ -273,7 +299,7 @@ void devstatus(char *params) @@ -273,7 +299,7 @@ void devstatus(char *params)
{
int i;
if (nDevs == 0 && num_processors == 0) {
if (nDevs == 0 && opt_n_threads == 0) {
strcpy(io_buffer, message(MSG_NODEVS, 0));
return;
}
@ -386,12 +412,16 @@ void summary(char *params) @@ -386,12 +412,16 @@ void summary(char *params)
{
double utility, mhs;
char *algo = (char *)(algo_names[opt_algo]);
if (algo == NULL)
algo = "(null)";
utility = total_accepted / ( total_secs ? total_secs : 1 ) * 60;
mhs = total_mhashes_done / total_secs;
sprintf(io_buffer, "%sSUMMARY=all,EL=%.0lf,ALGO=%s,MHS=%.2lf,SOL=%d,Q=%d,A=%d,R=%d,HW=%d,U=%.2lf,DW=%d,ST=%d,GF=%d,LW=%d,RO=%d,BC=%d%c",
sprintf(io_buffer, "%sSUMMARY=all,EL=%.0f,ALGO=%s,MHS=%.2f,SOL=%d,Q=%d,A=%d,R=%d,HW=%d,U=%.2f,DW=%d,ST=%d,GF=%d,LW=%u,RO=%u,BC=%u%c",
message(MSG_SUMM, 0),
total_secs, algo_names[opt_algo], mhs, found_blocks,
total_secs, algo, mhs, found_blocks,
total_getworks, total_accepted, total_rejected,
hw_errors, utility, total_discarded, total_stale,
total_go, local_work, total_ro, new_blocks, SEPARATOR);
@ -498,6 +528,28 @@ void gpurestart(char *params) @@ -498,6 +528,28 @@ void gpurestart(char *params)
strcpy(io_buffer, message(MSG_GPUREI, id));
}
void gpucount(char *params)
{
char buf[BUFSIZ];
strcpy(io_buffer, message(MSG_NUMGPU, 0));
sprintf(buf, "GPUS,COUNT=%d|", nDevs);
strcat(io_buffer, buf);
}
void cpucount(char *params)
{
char buf[BUFSIZ];
strcpy(io_buffer, message(MSG_NUMCPU, 0));
sprintf(buf, "CPUS,COUNT=%d|", opt_n_threads > 0 ? num_processors : 0);
strcat(io_buffer, buf);
}
void doquit(char *params)
{
*io_buffer = '\0';
@ -518,23 +570,47 @@ struct CMDS { @@ -518,23 +570,47 @@ struct CMDS {
{ "gpurestart", gpurestart },
{ "gpu", gpudev },
{ "cpu", cpudev },
{ "gpucount", gpucount },
{ "cpucount", cpucount },
{ "quit", doquit },
{ NULL }
};
void send_result(int c)
void send_result(SOCKETTYPE c)
{
int n;
// ignore failure - it's closed immediately anyway
n = write(c, io_buffer, strlen(io_buffer)+1);
n = send(c, io_buffer, strlen(io_buffer)+1, 0);
}
void tidyup()
{
bye = 1;
if (sock != INVSOCK) {
shutdown(sock, SHUT_RDWR);
CLOSESOCKET(sock);
sock = INVSOCK;
}
if (msg_buffer != NULL) {
free(msg_buffer);
msg_buffer = NULL;
}
if (io_buffer != NULL) {
free(io_buffer);
io_buffer = NULL;
}
}
void api(void)
{
char buf[BUFSIZ];
const char *localaddr = "127.0.0.1";
int c, sock, n, bound;
SOCKETTYPE c;
int n, bound;
char connectaddr[32];
char *binderror;
time_t bindstart;
@ -543,12 +619,12 @@ void api(void) @@ -543,12 +619,12 @@ void api(void)
struct sockaddr_in cli;
socklen_t clisiz;
char *params;
bool portok;
bool addrok;
bool did;
int i;
sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0) {
if (sock == INVSOCK) {
applog(LOG_ERR, "API1 initialisation failed (%s)%s", strerror(errno), UNAVAILABLE);
return;
}
@ -570,7 +646,7 @@ void api(void) @@ -570,7 +646,7 @@ void api(void)
bound = 0;
bindstart = time(NULL);
while (bound == 0) {
if (bind(sock, (struct sockaddr *)(&serv), sizeof(serv)) < 0) {
if (bind(sock, (struct sockaddr *)(&serv), sizeof(serv)) BINDERROR) {
binderror = strerror(errno);
if ((time(NULL) - bindstart) > 61)
break;
@ -588,9 +664,9 @@ void api(void) @@ -588,9 +664,9 @@ void api(void)
return;
}
if (listen(sock, QUEUE) < 0) {
if (listen(sock, QUEUE) LISTENERROR) {
applog(LOG_ERR, "API3 initialisation failed (%s)%s", strerror(errno), UNAVAILABLE);
close(sock);
CLOSESOCKET(sock);
return;
}
@ -606,20 +682,20 @@ void api(void) @@ -606,20 +682,20 @@ void api(void)
while (bye == 0) {
clisiz = sizeof(cli);
if ((c = accept(sock, (struct sockaddr *)(&cli), &clisiz)) < 0) {
if ((c = accept(sock, (struct sockaddr *)(&cli), &clisiz)) ACCEPTERROR) {
applog(LOG_ERR, "API failed (%s)%s", strerror(errno), UNAVAILABLE);
goto die;
}
if (opt_api_listen)
portok = true;
addrok = true;
else {
inet_ntop(AF_INET, &(cli.sin_addr), &(connectaddr[0]), sizeof(connectaddr)-1);
portok = (strcmp(connectaddr, localaddr) == 0);
addrok = (strcmp(connectaddr, localaddr) == 0);
}
if (portok) {
n = read(c, &buf[0], BUFSIZ-1);
if (addrok) {
n = recv(c, &buf[0], BUFSIZ-1, 0);
if (n >= 0) {
did = false;
buf[n] = '\0';
@ -643,11 +719,8 @@ void api(void) @@ -643,11 +719,8 @@ void api(void)
}
}
}
close(c);
CLOSESOCKET(c);
}
die:
free(msg_buffer);
free(io_buffer);
close(sock);
tidyup();
}

2
configure.ac

@ -2,7 +2,7 @@ @@ -2,7 +2,7 @@
##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##
m4_define([v_maj], [2])
m4_define([v_min], [0])
m4_define([v_mic], [8])
m4_define([v_mic], [8w])
##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##
m4_define([v_ver], [v_maj.v_min.v_mic])
m4_define([lt_rev], m4_eval(v_maj + v_min))

242
inet_ntop.h

@ -0,0 +1,242 @@ @@ -0,0 +1,242 @@
/* inet_ntop.c -- convert IPv4 and IPv6 addresses from binary to text form
Copyright (C) 2005, 2006 Free Software Foundation, Inc.
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 2, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software Foundation,
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
/*
* Copyright (c) 1996-1999 by Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
* ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
* CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
* SOFTWARE.
*/
/*
#include <config.h>
*/
/* Specification. */
/*
#include "inet_ntop.h"
#include <stdio.h>
#include <string.h>
#include <errno.h>
*/
#ifndef EAFNOSUPPORT
# define EAFNOSUPPORT EINVAL
#endif
#define NS_IN6ADDRSZ 16
#define NS_INT16SZ 2
/*
* WARNING: Don't even consider trying to compile this on a system where
* sizeof(int) < 4. sizeof(int) > 4 is fine; all the world's not a VAX.
*/
typedef int verify_int_size[2 * sizeof (int) - 7];
static const char *inet_ntop4 (const unsigned char *src, char *dst, socklen_t size);
#if HAVE_IPV6
static const char *inet_ntop6 (const unsigned char *src, char *dst, socklen_t size);
#endif
/* char *
* inet_ntop(af, src, dst, size)
* convert a network format address to presentation format.
* return:
* pointer to presentation format address (`dst'), or NULL (see errno).
* author:
* Paul Vixie, 1996.
*/
const char *
inet_ntop (int af, const void *restrict src,
char *restrict dst, socklen_t cnt)
{
switch (af)
{
#if HAVE_IPV4
case AF_INET:
return (inet_ntop4 (src, dst, cnt));
#endif
#if HAVE_IPV6
case AF_INET6:
return (inet_ntop6 (src, dst, cnt));
#endif
default:
errno = EAFNOSUPPORT;
return (NULL);
}
/* NOTREACHED */
}
/* const char *
* inet_ntop4(src, dst, size)
* format an IPv4 address
* return:
* `dst' (as a const)
* notes:
* (1) uses no statics
* (2) takes a u_char* not an in_addr as input
* author:
* Paul Vixie, 1996.
*/
static const char *
inet_ntop4 (const unsigned char *src, char *dst, socklen_t size)
{
char tmp[sizeof "255.255.255.255"];
int len;
len = sprintf (tmp, "%u.%u.%u.%u", src[0], src[1], src[2], src[3]);
if (len < 0)
return NULL;
if (len > size)
{
errno = ENOSPC;
return NULL;
}
return strcpy (dst, tmp);
}
#if HAVE_IPV6
/* const char *
* inet_ntop6(src, dst, size)
* convert IPv6 binary address into presentation (printable) format
* author:
* Paul Vixie, 1996.
*/
static const char *
inet_ntop6 (const unsigned char *src, char *dst, socklen_t size)
{
/*
* Note that int32_t and int16_t need only be "at least" large enough
* to contain a value of the specified size. On some systems, like
* Crays, there is no such thing as an integer variable with 16 bits.
* Keep this in mind if you think this function should have been coded
* to use pointer overlays. All the world's not a VAX.
*/
char tmp[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255"], *tp;
struct
{
int base, len;
} best, cur;
unsigned int words[NS_IN6ADDRSZ / NS_INT16SZ];
int i;
/*
* Preprocess:
* Copy the input (bytewise) array into a wordwise array.
* Find the longest run of 0x00's in src[] for :: shorthanding.
*/
memset (words, '\0', sizeof words);
for (i = 0; i < NS_IN6ADDRSZ; i += 2)
words[i / 2] = (src[i] << 8) | src[i + 1];
best.base = -1;
cur.base = -1;
for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++)
{
if (words[i] == 0)
{
if (cur.base == -1)
cur.base = i, cur.len = 1;
else
cur.len++;
}
else
{
if (cur.base != -1)
{
if (best.base == -1 || cur.len > best.len)
best = cur;
cur.base = -1;
}
}
}
if (cur.base != -1)
{
if (best.base == -1 || cur.len > best.len)
best = cur;
}
if (best.base != -1 && best.len < 2)
best.base = -1;
/*
* Format the result.
*/
tp = tmp;
for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++)
{
/* Are we inside the best run of 0x00's? */
if (best.base != -1 && i >= best.base && i < (best.base + best.len))
{
if (i == best.base)
*tp++ = ':';
continue;
}
/* Are we following an initial run of 0x00s or any real hex? */
if (i != 0)
*tp++ = ':';
/* Is this address an encapsulated IPv4? */
if (i == 6 && best.base == 0 &&
(best.len == 6 || (best.len == 5 && words[5] == 0xffff)))
{
if (!inet_ntop4 (src + 12, tp, sizeof tmp - (tp - tmp)))
return (NULL);
tp += strlen (tp);
break;
}
{
int len = sprintf (tp, "%x", words[i]);
if (len < 0)
return NULL;
tp += len;
}
}
/* Was it a trailing run of 0x00's? */
if (best.base != -1 && (best.base + best.len) ==
(NS_IN6ADDRSZ / NS_INT16SZ))
*tp++ = ':';
*tp++ = '\0';
/*
* Check for overflow, copy, and we're done.
*/
if ((socklen_t) (tp - tmp) > size)
{
errno = ENOSPC;
return NULL;
}
return strcpy (dst, tmp);
}
#endif

262
inet_pton.h

@ -0,0 +1,262 @@ @@ -0,0 +1,262 @@
/* inet_pton.c -- convert IPv4 and IPv6 addresses from text to binary form
Copyright (C) 2006 Free Software Foundation, Inc.
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 2, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software Foundation,
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
/*
* Copyright (c) 1996,1999 by Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
* ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
* CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
* SOFTWARE.
*/
/*
#include <config.h>
*/
/* Specification. */
/*
#include "inet_pton.h"
#include <ctype.h>
#include <string.h>
#include <errno.h>
*/
#ifndef EAFNOSUPPORT
# define EAFNOSUPPORT EINVAL
#endif
#define NS_INADDRSZ 4
#define NS_IN6ADDRSZ 16
#define NS_INT16SZ 2
/*
* WARNING: Don't even consider trying to compile this on a system where
* sizeof(int) < 4. sizeof(int) > 4 is fine; all the world's not a VAX.
*/
static int inet_pton4 (const char *src, unsigned char *dst);
#if HAVE_IPV6
static int inet_pton6 (const char *src, unsigned char *dst);
#endif
/* int
* inet_pton(af, src, dst)
* convert from presentation format (which usually means ASCII printable)
* to network format (which is usually some kind of binary format).
* return:
* 1 if the address was valid for the specified address family
* 0 if the address wasn't valid (`dst' is untouched in this case)
* -1 if some other error occurred (`dst' is untouched in this case, too)
* author:
* Paul Vixie, 1996.
*/
int
inet_pton (int af, const char *restrict src, void *restrict dst)
{
switch (af)
{
case AF_INET:
return (inet_pton4 (src, dst));
#if HAVE_IPV6
case AF_INET6:
return (inet_pton6 (src, dst));
#endif
default:
errno = EAFNOSUPPORT;
return (-1);
}
/* NOTREACHED */
}
/* int
* inet_pton4(src, dst)
* like inet_aton() but without all the hexadecimal, octal (with the
* exception of 0) and shorthand.
* return:
* 1 if `src' is a valid dotted quad, else 0.
* notice:
* does not touch `dst' unless it's returning 1.
* author:
* Paul Vixie, 1996.
*/
static int
inet_pton4 (const char *restrict src, unsigned char *restrict dst)
{
int saw_digit, octets, ch;
unsigned char tmp[NS_INADDRSZ], *tp;
saw_digit = 0;
octets = 0;
*(tp = tmp) = 0;
while ((ch = *src++) != '\0')
{
if (ch >= '0' && ch <= '9')
{
unsigned new = *tp * 10 + (ch - '0');
if (saw_digit && *tp == 0)
return (0);
if (new > 255)
return (0);
*tp = new;
if (!saw_digit)
{
if (++octets > 4)
return (0);
saw_digit = 1;
}
}
else if (ch == '.' && saw_digit)
{
if (octets == 4)
return (0);
*++tp = 0;
saw_digit = 0;
}
else
return (0);
}
if (octets < 4)
return (0);
memcpy (dst, tmp, NS_INADDRSZ);
return (1);
}
#if HAVE_IPV6
/* int
* inet_pton6(src, dst)
* convert presentation level address to network order binary form.
* return:
* 1 if `src' is a valid [RFC1884 2.2] address, else 0.
* notice:
* (1) does not touch `dst' unless it's returning 1.
* (2) :: in a full address is silently ignored.
* credit:
* inspired by Mark Andrews.
* author:
* Paul Vixie, 1996.
*/
static int
inet_pton6 (const char *restrict src, unsigned char *restrict dst)
{
static const char xdigits[] = "0123456789abcdef";
unsigned char tmp[NS_IN6ADDRSZ], *tp, *endp, *colonp;
const char *curtok;
int ch, saw_xdigit;
unsigned val;
tp = memset (tmp, '\0', NS_IN6ADDRSZ);
endp = tp + NS_IN6ADDRSZ;
colonp = NULL;
/* Leading :: requires some special handling. */
if (*src == ':')
if (*++src != ':')
return (0);
curtok = src;
saw_xdigit = 0;
val = 0;
while ((ch = tolower (*src++)) != '\0')
{
const char *pch;
pch = strchr (xdigits, ch);
if (pch != NULL)
{
val <<= 4;
val |= (pch - xdigits);
if (val > 0xffff)
return (0);
saw_xdigit = 1;
continue;
}
if (ch == ':')
{
curtok = src;
if (!saw_xdigit)
{
if (colonp)
return (0);
colonp = tp;
continue;
}
else if (*src == '\0')
{
return (0);
}
if (tp + NS_INT16SZ > endp)
return (0);
*tp++ = (u_char) (val >> 8) & 0xff;
*tp++ = (u_char) val & 0xff;
saw_xdigit = 0;
val = 0;
continue;
}
if (ch == '.' && ((tp + NS_INADDRSZ) <= endp) &&
inet_pton4 (curtok, tp) > 0)
{
tp += NS_INADDRSZ;
saw_xdigit = 0;
break; /* '\0' was seen by inet_pton4(). */
}
return (0);
}
if (saw_xdigit)
{
if (tp + NS_INT16SZ > endp)
return (0);
*tp++ = (u_char) (val >> 8) & 0xff;
*tp++ = (u_char) val & 0xff;
}
if (colonp != NULL)
{
/*
* Since some memmove()'s erroneously fail to handle
* overlapping regions, we'll do the shift by hand.
*/
const int n = tp - colonp;
int i;
if (tp == endp)
return (0);
for (i = 1; i <= n; i++)
{
endp[-i] = colonp[n - i];
colonp[n - i] = 0;
}
tp = endp;
}
if (tp != endp)
return (0);
memcpy (dst, tmp, NS_IN6ADDRSZ);
return (1);
}
#endif

4
miner.h

@ -413,6 +413,10 @@ extern void kill_work(void); @@ -413,6 +413,10 @@ extern void kill_work(void);
extern void reinit_device(struct cgpu_info *cgpu);
extern float gpu_temp(int gpu);
extern int gpu_fanspeed(int gpu);
extern int gpu_fanpercent(int gpu);
extern void api(void);

Loading…
Cancel
Save