home *** CD-ROM | disk | FTP | other *** search
/ ftp.ee.lbl.gov / 2014.05.ftp.ee.lbl.gov.tar / ftp.ee.lbl.gov / acld-1.11.tar.gz / acld-1.11.tar / acld-1.11 / io.c < prev    next >
C/C++ Source or Header  |  2010-09-16  |  5KB  |  187 lines

  1. /*
  2.  * Copyright (c) 2004, 2006, 2008, 2009, 2010
  3.  *    The Regents of the University of California.  All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that: (1) source code distributions
  7.  * retain the above copyright notice and this paragraph in its entirety, (2)
  8.  * distributions including binary code include the above copyright notice and
  9.  * this paragraph in its entirety in the documentation or other materials
  10.  * provided with the distribution, and (3) all advertising materials mentioning
  11.  * features or use of this software display the following acknowledgement:
  12.  * ``This product includes software developed by the University of California,
  13.  * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
  14.  * the University nor the names of its contributors may be used to endorse
  15.  * or promote products derived from this software without specific prior
  16.  * written permission.
  17.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
  18.  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  19.  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  20.  */
  21.  
  22. #ifndef lint
  23. static const char rcsid[] =
  24.     "@(#) $Id: io.c 692 2010-09-16 05:17:44Z leres $ (LBL)";
  25. #endif
  26.  
  27. #include <sys/types.h>
  28. #include <sys/time.h>
  29.  
  30. #include <stdio.h>
  31. #include <stdlib.h>
  32. #include <string.h>
  33. #include <syslog.h>
  34. #include <unistd.h>
  35.  
  36. #include "acld.h"
  37.  
  38. /* Locals */
  39. static const char crnl[] = "\r\n";
  40.  
  41. /* Appends formatted and cr/nl to iobuf; assures EOS termination */
  42. void
  43. ioappendfmt(struct iobuf *ip, const char *fmt, ...)
  44. {
  45.     va_list ap;
  46.  
  47.     /* Make sure we have room for current, new and EOS */
  48.     DYNARRAY(ip->buf, ip->len + strlen(fmt) + sizeof(crnl),
  49.         &ip->size, sizeof(*ip->buf), 128, 1024, "ioappendfmt");
  50.     va_start(ap, fmt);
  51.     ip->len += vsnprintf(ip->buf + ip->len, ip->size - ip->len, fmt, ap);
  52.     va_end(ap);
  53.     strcpy(ip->buf + ip->len, crnl);
  54.     ip->len += sizeof(crnl) - 1;
  55. }
  56.  
  57. /* Appends string and cr/nl to iobuf; assures EOS termination */
  58. void
  59. ioappendline(struct iobuf *ip, const char *buf, size_t len)
  60. {
  61.  
  62.     /* Make sure we have room for current, new and EOS */
  63.     DYNARRAY(ip->buf, ip->len + len + sizeof(crnl),
  64.         &ip->size, sizeof(*ip->buf), 128, 1024, "ioappendline");
  65.     strcpy(ip->buf + ip->len, buf);
  66.     ip->len += len;
  67.     strcpy(ip->buf + ip->len, crnl);
  68.     ip->len += sizeof(crnl) - 1;
  69. }
  70.  
  71. /* Appends formatted and cr/nl to iobuf; assures EOS termination */
  72. void
  73. ioappendvfmt(struct iobuf *ip, const char *fmt, va_list ap)
  74. {
  75.  
  76.     /* Make sure we have room for current, new and EOS */
  77.     DYNARRAY(ip->buf, ip->len + strlen(fmt) + sizeof(crnl),
  78.         &ip->size, sizeof(*ip->buf), 128, 1024, "ioappendfmt");
  79.     ip->len += vsnprintf(ip->buf + ip->len, ip->size - ip->len, fmt, ap);
  80.     strcpy(ip->buf + ip->len, crnl);
  81.     ip->len += sizeof(crnl) - 1;
  82. }
  83.  
  84. void
  85. iofree(struct iobuf *ip)
  86. {
  87.  
  88.     /* If size is zero, buf wasn't dynamically allocated */
  89.     if (ip->buf != NULL && ip->size > 0) {
  90.         free(ip->buf);
  91.         ip->buf = NULL;
  92.         ip->size = 0;
  93.     }
  94.     ip->len = 0;
  95. }
  96.  
  97. /* Return a line (newline terminated) or partial line (zero terminated) */
  98. char *
  99. iogetstr(struct iobuf *ip)
  100. {
  101.     char *cp;
  102.     size_t size;
  103.     static char *buf = NULL;
  104.  
  105.     if (buf != NULL) {
  106.         free(buf);
  107.         buf = NULL;
  108.     }
  109.     if (ip->len == 0)
  110.         return (NULL);
  111.  
  112.     for (cp = ip->buf; *cp != '\n' && *cp != '\0'; ++cp)
  113.         continue;
  114.  
  115.     size = cp - ip->buf + 1;
  116.     buf = new(size + 1, sizeof(*buf), "iogetstr buf");
  117.     strncpy(buf, ip->buf, size);
  118.     buf[size] = '\0';
  119.     if (*cp == '\0')
  120.         ip->len = 0;
  121.     else {
  122.         memmove(ip->buf, ip->buf + size, ip->len - size + 1);
  123.         ip->len -= size;
  124.     }
  125.     ip->buf[ip->len] = '\0';
  126.     return (buf);
  127. }
  128.  
  129. /* Return true if there's a newline in the buffer */
  130. int
  131. iohaveline(struct iobuf *ip)
  132. {
  133.     int n;
  134.     char *cp;
  135.  
  136.     for (n = ip->len, cp = ip->buf; n > 0; --n, ++cp)
  137.         if (*cp == '\n')
  138.             return (1);
  139.     return (0);
  140. }
  141.  
  142. /* Read from a socket and to an iobuf */
  143. int
  144. ioread(int fd, struct iobuf *ip)
  145. {
  146.     ssize_t cc;
  147.  
  148.     DYNARRAY(ip->buf, ip->len, &ip->size,
  149.         sizeof(*ip->buf), 8192, 8192, "ioread buf");
  150.  
  151.     cc = read(fd, ip->buf + ip->len, ip->size - ip->len - 1);
  152.     if (cc < 0)
  153.         return (cc);
  154.  
  155.     ip->len += cc;
  156.     ip->buf[ip->len] = '\0';
  157.     return (ip->len);
  158. }
  159.  
  160. /* Write from an iobuf to a socket */
  161. int
  162. iowrite(int fd, struct iobuf *ip)
  163. {
  164.     ssize_t cc;
  165.  
  166.     cc = write(fd, ip->buf, ip->len);
  167.     if (cc < 0) {
  168.         /* Bummer */
  169.         ip->len = 0;
  170.         return (cc);
  171.     }
  172.     if (cc > ip->len) {
  173.         lg(LOG_ERR, "iowrite: cc > ip-len, %d > %d (Can't happen?)\n",
  174.             (int)cc, (int)ip->len);
  175.         cc = ip->len;
  176.     }
  177.     if (cc == ip->len) {
  178.         ip->len = 0;
  179.         return (cc);
  180.     }
  181.  
  182.     /* Move leftover chars on over */
  183.     memmove(ip->buf, ip->buf + cc, ip->len - cc);
  184.     ip->len -= cc;
  185.     return (cc);
  186. }
  187.