Code

branches/apcups/src/apcups.c:
authorocto <octo>
Sat, 20 May 2006 08:51:13 +0000 (08:51 +0000)
committerocto <octo>
Sat, 20 May 2006 08:51:13 +0000 (08:51 +0000)
  Restored changes made to the trunk.

src/apcups.c

index fb2583e63a50b332bf4ef1eb19892b1b6e87a926..2ddce12d484493b5acae68358667e05a3f3619cb 100644 (file)
 #include "plugin.h" /* plugin_register, plugin_submit */
 #include "configfile.h" /* cf_register */
 
-/* FIXME: Check defines before including anything! */
-#include <stdarg.h>
-#include <unistd.h>
-#include <string.h>
-#include <strings.h>
-#include <signal.h>
-#include <ctype.h>
-#include <syslog.h>
-#include <limits.h>
+#if HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#if HAVE_SYS_SOCKET_H
+# include <sys/socket.h>
+#endif
+#if HAVE_NETDB_H
+# include <netdb.h>
+#endif
+#if HAVE_NETINET_IN_H
+# include <netinet/in.h>
+#endif
+#if HAVE_ARPA_INET_H
+# include <arpa/inet.h> /* inet_addr */
+#endif
+
+#if 0
 #include <pwd.h>
-#include <time.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <setjmp.h>
-#include <termios.h>
-#include <netdb.h>
-#include <sys/ioctl.h>
-#include <sys/ipc.h>
-#include <sys/sem.h>
-#include <sys/shm.h>
-#include <sys/socket.h>
-#include <sys/types.h>
-#include <sys/time.h>
-#include <time.h>
-#include <sys/wait.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
+#include <setjmp.h> /* FIXME: Is this really neccessary? */
+#include <termios.h> /* FIXME: Is this really neccessary? */
+#include <sys/ioctl.h> /* FIXME: Is this really neccessary? */
+#include <sys/ipc.h> /* FIXME: Is this really neccessary? */
+#include <sys/sem.h> /* FIXME: Is this really neccessary? */
+#include <sys/shm.h> /* FIXME: Is this really neccessary? */
+#endif
 
 #define NISPORT 3551
 #define _(String) (String)
 #define N_(String) (String)
 #define MAXSTRING               256
-<<<<<<< .mine
-=======
-#define Error_abort0(fmd) generic_error_out(__FILE__, __LINE__, fmd)
->>>>>>> .r733
 #define MODULE_NAME "apcups"
 
-
-/* Prototypes */
-<<<<<<< .mine
-=======
-static void generic_error_out(const char *, int , const char *, ...);
->>>>>>> .r733
-
 /* Default values for contacting daemon */
 static char *host = "localhost";
 static int port = NISPORT;
 
-static struct sockaddr_in tcp_serv_addr;  /* socket information */
-static int net_errno = 0;                 /* error number -- not yet implemented */
-static char *net_errmsg = NULL;           /* pointer to error message */
-static char net_errbuf[256];              /* error message buffer for messages */
-
-<<<<<<< .mine
-struct sockaddr_in tcp_serv_addr;  /* socket information */
-int net_errno = 0;                 /* error number -- not yet implemented */
-char *net_errmsg = NULL;           /* pointer to error message */
-char net_errbuf[256];              /* error message buffer for messages */
+static struct sockaddr_in tcp_serv_addr; /* socket information */
+static char *net_errmsg = NULL; /* pointer to error message */
+static char  net_errbuf[256];   /* error message buffer for messages */
 
-void (*error_cleanup) (void) = NULL;
-
-=======
->>>>>>> .r733
 /* 
  * The following are only if not compiled to test the module with its own main.
 */
@@ -157,18 +133,6 @@ static int config_keys_num = 2;
 
 #endif /* ifndef APCMAIN */
 
-<<<<<<< .mine
-struct apc_detail_s {
-  int connected;
-  float linev;
-  float loadpct;
-  float bcharge;
-  float timeleft;
-  float outputv;
-  float itemp;
-  float battv;
-  float linefreq;
-=======
 struct apc_detail_s
 {
        float linev;
@@ -179,112 +143,11 @@ struct apc_detail_s
        float itemp;
        float battv;
        float linefreq;
->>>>>>> .r733
 };
 
 #define BIG_BUF 4096
 
-<<<<<<< .mine
-
-#define BIG_BUF 5000
-
-/* Implement snprintf */
-int asnprintf(char *str, size_t size, const char *fmt, ...)
-{
-#ifdef HAVE_VSNPRINTF
-   va_list arg_ptr;
-   int len;
-
-   va_start(arg_ptr, fmt);
-   len = vsnprintf(str, size, fmt, arg_ptr);
-   va_end(arg_ptr);
-
-   str[size - 1] = 0;
-   return len;
-
-#else
-
-   va_list arg_ptr;
-   int len;
-   char *buf;
-
-   buf = (char *)malloc(BIG_BUF);
-
-   va_start(arg_ptr, fmt);
-   len = vsprintf(buf, fmt, arg_ptr);
-   va_end(arg_ptr);
-
-   if (len >= BIG_BUF){
-     syslog(LOG_ERR, "apcups: asnprintf(): Buffer overflow");
-     return(0);
-   }
-
-   memcpy(str, buf, size);
-   str[size - 1] = 0;
-
-   free(buf);
-   return len;
-#endif
-}
-
-/* Implement vsnprintf() */
-int avsnprintf(char *str, size_t size, const char *format, va_list ap)
-{
-#ifdef HAVE_VSNPRINTF
-   int len;
-
-   len = vsnprintf(str, size, format, ap);
-   str[size - 1] = 0;
-
-   return len;
-
-#else
-
-   int len;
-   char *buf;
-
-   buf = (char *)malloc(BIG_BUF);
-
-   len = vsprintf(buf, format, ap);
-   if (len >= BIG_BUF){
-     syslog(LOG_ERR, "apcups: avsnprintf(): Buffer overflow");
-     return(0);
-   }
-
-  memcpy(str, buf, size);
-   str[size - 1] = 0;
-
-   free(buf);
-   return len;
-#endif
-}
-
-=======
->>>>>>> .r733
-/*
-<<<<<<< .mine
-=======
- * Subroutine normally called by macro error_abort() to print
- * FATAL ERROR message and supplied error message
- */
-static void generic_error_out(const char *file, int line, const char *fmt, ...)
-{
-       char buf[256];
-       va_list arg_ptr;
-       int i;
-
-       snprintf(buf, sizeof(buf), _("FATAL ERROR in %s at line %d\n"), file, line);
-       i = strlen(buf);
-       va_start(arg_ptr, fmt);
-       vsnprintf((char *)&buf[i], sizeof(buf) - i, (char *)fmt, arg_ptr);
-       va_end(arg_ptr);
-       fprintf(stdout, "%s", buf);
-
-       exit(1);
-}
-
 /*
->>>>>>> .r733
  * Read nbytes from the network.
  * It is possible that the total bytes require in several
  * read requests
@@ -301,7 +164,6 @@ static int read_nbytes(int fd, char *ptr, int nbytes)
                } while (nread == -1 && (errno == EINTR || errno == EAGAIN));
 
                if (nread <= 0) {
-                       net_errno = errno;
                        return (nread);           /* error, or EOF */
                }
 
@@ -316,24 +178,31 @@ static int read_nbytes(int fd, char *ptr, int nbytes)
  * Write nbytes to the network.
  * It may require several writes.
  */
-static int write_nbytes(int fd, char *ptr, int nbytes)
+static int write_nbytes(int fd, void *buf, int buflen)
 {
-       int nleft, nwritten;
+       int nleft;
+       int nwritten;
+       char *ptr;
 
-       nleft = nbytes;
-       while (nleft > 0) {
+       ptr = (char *) buf;
+
+       nleft = buflen;
+       while (nleft > 0)
+       {
                nwritten = write(fd, ptr, nleft);
 
-               if (nwritten <= 0) {
-                       net_errno = errno;
-                       return (nwritten);        /* error */
+               if (nwritten <= 0)
+               {
+                       syslog (LOG_ERR, "Writing to socket failed: %s", strerror (errno));
+                       return (nwritten);
                }
 
                nleft -= nwritten;
                ptr += nwritten;
        }
 
-       return (nbytes - nleft);
+       /* If we get here, (nleft <= 0) is true */
+       return (buflen);
 }
 
 /* Close the network connection */
@@ -342,7 +211,7 @@ static void net_close (int sockfd)
        short pktsiz = 0;
 
        /* send EOF sentinel */
-       write_nbytes(sockfd, (char *) &pktsiz, sizeof(short));
+       write_nbytes (sockfd, &pktsiz, sizeof (short));
        close (sockfd);
 }
 
@@ -457,56 +326,33 @@ static int net_recv(int sockfd, char *buff, int maxlen)
  * Send a message over the network. The send consists of
  * two network packets. The first is sends a short containing
  * the length of the data packet which follows.
- * Returns number of bytes sent
- * Returns -1 on error
+ * Returns zero on success
+ * Returns non-zero on error
  */
-static int net_send(int sockfd, char *buff, int len)
+static int net_send (int sockfd, char *buff, int len)
 {
        int rc;
-       short pktsiz;
+       short packet_size;
 
        /* send short containing size of data packet */
-       pktsiz = htons((short)len);
-       rc = write_nbytes(sockfd, (char *)&pktsiz, sizeof(short));
-       if (rc != sizeof(short)) {
-               net_errmsg = "net_send: write_nbytes error of length prefix\n";
-               return -1;
-       }
+       packet_size = htons ((short) len);
+
+       rc = write_nbytes(sockfd, &packet_size, sizeof (packet_size));
+       if (rc != sizeof(packet_size))
+               return (-1);
 
        /* send data packet */
-       rc = write_nbytes(sockfd, buff, len);
-       if (rc != len) {
-               net_errmsg = "net_send: write_nbytes error\n";
-               return -1;
-       }
+       rc = write_nbytes (sockfd, buff, len);
+       if (rc != len)
+               return (-1);
 
-       return rc;
+       return (0);
 }
 
-
 /* Get and print status from apcupsd NIS server */
-static int do_pthreads_status(char *host, int port, struct apc_detail_s *apcups_detail)
+static int do_pthreads_status (char *host, int port,
+               struct apc_detail_s *apcups_detail)
 {
-<<<<<<< .mine
-  int sockfd, n;
-  char recvline[MAXSTRING + 1];
-  char *tokptr;
-
-  if ((sockfd = net_open(host, NULL, port)) < 0){
-    syslog(LOG_ERR, "apcups: Cannot open connection: %s",
-          net_errmsg);
-    net_errmsg = NULL;
-    return;
-  }
-  
-  net_send(sockfd, "status", 6);
-  
-  while ((n = net_recv(sockfd, recvline, sizeof(recvline))) > 0) {
-    recvline[n] = 0;
-#ifdef APCMAIN
-    fputs(recvline, stdout);
-#endif /* ifdef APCMAIN */
-=======
        int     sockfd;
        int     n;
        char    recvline[MAXSTRING + 1];
@@ -518,93 +364,14 @@ static int do_pthreads_status(char *host, int port, struct apc_detail_s *apcups_
 #else
 # define PRINT_VALUE(name, val) /**/
 #endif
->>>>>>> .r733
 
-<<<<<<< .mine
-    tokptr = strtok(recvline,":");
-    while(tokptr != NULL) {
-      /* Look for Limit_Add */
-      if(strncmp("LINEV",tokptr,5) == 0) { 
-#ifdef APCMAIN
-       fprintf(stdout,"  Found LINEV.\n");
-#endif /* ifdef APCMAIN */
-       tokptr = strtok(NULL," \t");
-       if(tokptr == NULL) continue;
-       apcups_detail->linev = atof (tokptr);
-      }else if(strncmp("BATTV",tokptr,5) == 0) { 
-#ifdef APCMAIN
-       fprintf(stdout,"  Found BATTV.\n");
-#endif /* ifdef APCMAIN */
-       tokptr = strtok(NULL," \t");
-       if(tokptr == NULL) continue;
-       apcups_detail->battv = atof (tokptr);
-      }else if(strncmp("ITEMP",tokptr,5) == 0) { 
-#ifdef APCMAIN
-       fprintf(stdout,"  Found ITEMP.\n");
-#endif /* ifdef APCMAIN */
-       tokptr = strtok(NULL," \t");
-       if(tokptr == NULL) continue;
-       apcups_detail->itemp = atof (tokptr);
-      }else if(strncmp("LOADPCT",tokptr,7) == 0) { 
-#ifdef APCMAIN
-       fprintf(stdout,"  Found LOADPCT.\n");
-#endif /* ifdef APCMAIN */
-       tokptr = strtok(NULL," \t");
-       if(tokptr == NULL) continue;
-       apcups_detail->loadpct = atof (tokptr);
-      }else if(strncmp("BCHARGE",tokptr,7) == 0) { 
-#ifdef APCMAIN
-       fprintf(stdout,"  Found BCHARGE.\n");
-#endif /* ifdef APCMAIN */
-       tokptr = strtok(NULL," \t");
-       if(tokptr == NULL) continue;
-       apcups_detail->bcharge = atof (tokptr);
-      }else if(strncmp("OUTPUTV",tokptr,7) == 0) { 
-#ifdef APCMAIN
-       fprintf(stdout,"  Found OUTPUTV.\n");
-#endif /* ifdef APCMAIN */
-       tokptr = strtok(NULL," \t");
-       if(tokptr == NULL) continue;
-       apcups_detail->outputv = atof (tokptr);
-      }else if(strncmp("LINEFREQ",tokptr,8) == 0) { 
-#ifdef APCMAIN
-       fprintf(stdout,"  Found LINEFREQ.\n");
-#endif /* ifdef APCMAIN */
-       tokptr = strtok(NULL," \t");
-       if(tokptr == NULL) continue;
-       apcups_detail->linefreq = atof (tokptr);
-      }else if(strncmp("TIMELEFT",tokptr,8) == 0) { 
-#ifdef APCMAIN
-       fprintf(stdout,"  Found TIMELEFT.\n");
-#endif /* ifdef APCMAIN */
-       tokptr = strtok(NULL," \t");
-       if(tokptr == NULL) continue;
-       apcups_detail->timeleft = atof (tokptr);
-      } /* */
-      tokptr = strtok(NULL,":");
-    }
-  }
-=======
        /* TODO: Keep the socket open, if possible */
        if ((sockfd = net_open (host, NULL, port)) < 0)
        {
                syslog (LOG_ERR, "apcups plugin: Connecting to the apcupsd failed.");
                return (-1);
        }
->>>>>>> .r733
 
-<<<<<<< .mine
-  if (n < 0) {
-    syslog(LOG_ERR, "apcups: Error recieving data: %s",
-          net_errmsg);
-    net_errmsg = NULL;
-    return;
-  }
-  /* signal that we did in fact connect. */
-  apcups_detail->connected = 1;
-  
-  net_close(sockfd);
-=======
        net_send (sockfd, "status", 6);
 
        while ((n = net_recv (sockfd, recvline, sizeof (recvline))) > 0)
@@ -649,13 +416,15 @@ static int do_pthreads_status(char *host, int port, struct apc_detail_s *apcups_
                } /* while (tokptr != NULL) */
        }
 
-       if (n < 0)
-               Error_abort0(net_errmsg);
+       net_close (sockfd);
 
-       net_close(sockfd);
+       if (n < 0)
+       {
+               syslog (LOG_WARNING, "apcups plugin: Error reading from socket");
+               return (-1);
+       }
 
        return (0);
->>>>>>> .r733
 }
 
 #ifdef APCMAIN
@@ -664,23 +433,12 @@ int main(int argc, char **argv)
        /* we are not really going to use this */
        struct apc_detail_s apcups_detail;
 
-<<<<<<< .mine
-  openlog("apcups",LOG_PID | LOG_NDELAY | LOG_LOCAL1);
-
-  if (!*host || strcmp(host, "0.0.0.0") == 0)
-    host = "localhost";
-  
-  do_pthreads_status(host, port, &apcups_detail);
-  
-  return 0;
-=======
        if (!*host || strcmp(host, "0.0.0.0") == 0)
                host = "localhost";
 
        do_pthreads_status(host, port, &apcups_detail);
 
        return 0;
->>>>>>> .r733
 }
 #else
 static void apcups_init (void)
@@ -813,6 +571,7 @@ static void apc_freq_submit (char *host,
 static void apcups_read (void)
 {
   struct apc_detail_s apcups_detail;
+  int status;
        
   apcups_detail.linev = 0.0;
   apcups_detail.loadpct = 0.0;
@@ -822,19 +581,19 @@ static void apcups_read (void)
   apcups_detail.itemp = 0.0;
   apcups_detail.battv = 0.0;
   apcups_detail.linefreq = 0.0;
-  apcups_detail.connected = 0;
 
   
   if (!*host || strcmp(host, "0.0.0.0") == 0)
     host = "localhost";
   
-  do_pthreads_status(host, port, &apcups_detail);
+  status = do_pthreads_status(host, port, &apcups_detail);
  
   /*
    * if we did not connect then do not bother submitting
    * zeros. We want rrd files to have NAN.
   */
-  if(!apcups_detail.connected) return;
+  if (status != 0)
+         return;
 
   apcups_submit (host, &apcups_detail);
   apc_bvolt_submit (host, &apcups_detail);