Browse Source

Version 2.0.8w (windows changes)

Kano 14 years ago
parent
commit
45068ced82
6 changed files with 614 additions and 38 deletions
  1. 6 11
      api-example.php
  2. 99 26
      api.c
  3. 1 1
      configure.ac
  4. 242 0
      inet_ntop.h
  5. 262 0
      inet_pton.h
  6. 4 0
      miner.h

+ 6 - 11
api-example.php

@@ -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)
 	$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)
  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');
 #
-$r = request('summary');
 echo print_r($r, true)."\n";
 #
 ?>

+ 99 - 26
api.c

@@ -23,11 +23,33 @@
 
 #if defined(unix)
 	#include <errno.h>
+	#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
 
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
+#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 ...
@@ -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 = "|";
 #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 {
  { 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)
 	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)
 {
 	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)
 {
 	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)
 	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 {
 	{ "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)
 	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)
 	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)
 		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)
 
 	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)
 				}
 			}
 		}
-		close(c);
+		CLOSESOCKET(c);
 	}
 die:
-	free(msg_buffer);
-	free(io_buffer);
-
-	close(sock);
+	tidyup();
 }

+ 1 - 1
configure.ac

@@ -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 - 0
inet_ntop.h

@@ -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 - 0
inet_pton.h

@@ -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 - 0
miner.h

@@ -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);