Diff for /libaitio/src/Attic/tools.c between versions 1.8.2.1 and 1.20

version 1.8.2.1, 2012/03/10 15:37:09 version 1.20, 2012/12/19 11:03:04
Line 12  terms: Line 12  terms:
 All of the documentation and software included in the ELWIX and AITNET  All of the documentation and software included in the ELWIX and AITNET
 Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org>  Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org>
   
Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
         by Michael Pounov <misho@elwix.org>.  All rights reserved.          by Michael Pounov <misho@elwix.org>.  All rights reserved.
   
 Redistribution and use in source and binary forms, with or without  Redistribution and use in source and binary forms, with or without
Line 48  SUCH DAMAGE. Line 48  SUCH DAMAGE.
   
   
 /*  /*
 * io_LTrimStr() Remove left whitespaces from text string * io_LTrimStr() - Remove left whitespaces from text string
  *
  * @psLine = Text string   * @psLine = Text string
  * return: 0 nothing to do; !=0 Removed bytes   * return: 0 nothing to do; !=0 Removed bytes
 */  */
 inline int  inline int
io_LTrimStr(u_char * __restrict psLine)io_LTrimStr(char * __restrict psLine)
 {  {
         int pos = 0;          int pos = 0;
        u_char *s;        char *s;
   
         if (!psLine || !*psLine)          if (!psLine || !*psLine)
                 return 0;                  return 0;
   
        for (s = psLine; isspace(*s); s++);        for (s = psLine; isspace((u_char) *s); s++);
         pos = s - psLine;          pos = s - psLine;
   
        memmove(psLine, s, (strlen((char*) psLine) - pos) + 1);        memmove(psLine, s, (strlen(psLine) - pos) + 1);
         return pos;          return pos;
 }  }
   
 /*  /*
 * io_RTrimStr() Remove right whitespaces from text string * io_RTrimStr() - Remove right whitespaces from text string
  *
  * @psLine = Text string   * @psLine = Text string
  * return: 0 nothing to do; !=0 Removed bytes   * return: 0 nothing to do; !=0 Removed bytes
 */  */
 inline int  inline int
io_RTrimStr(u_char * __restrict psLine)io_RTrimStr(char * __restrict psLine)
 {  {
        u_char *t, *pos;        char *t, *pos;
   
         if (!psLine || !*psLine)          if (!psLine || !*psLine)
                 return 0;                  return 0;
   
        pos = psLine + strlen((char*) psLine);        pos = psLine + strlen(psLine);
        for (t = pos - 1; t > psLine && isspace(*t); t--);        for (t = pos - 1; t > psLine && isspace((u_char) *t); t--);
         *++t = 0;          *++t = 0;
   
         return pos - t;          return pos - t;
 }  }
   
 /*  /*
 * io_TrimStr() Remove left and right whitespaces from text string * io_TrimStr() - Remove left and right whitespaces from text string
  *
  * @psLine = Text string   * @psLine = Text string
  * return: 0 nothing to do; !=0 Removed bytes   * return: 0 nothing to do; !=0 Removed bytes
 */  */
 inline int  inline int
io_TrimStr(u_char * __restrict psLine)io_TrimStr(char * __restrict psLine)
 {  {
         int ret = 0;          int ret = 0;
   
Line 105  io_TrimStr(u_char * __restrict psLine) Line 108  io_TrimStr(u_char * __restrict psLine)
 }  }
   
 /*  /*
 * io_UnquotStr() Remove quots from input text string  * io_UnquotStr() - Remove quots from input text string 
  *
  * @psLine = Text string   * @psLine = Text string
  * return: 0 nothing to do; 1 successful unquoted string   * return: 0 nothing to do; 1 successful unquoted string
 */  */
 inline int  inline int
io_UnquotStr(u_char * __restrict psLine)io_UnquotStr(char * __restrict psLine)
 {  {
         char *pos, *str = NULL;          char *pos, *str = NULL;
         int flg;          int flg;
Line 118  io_UnquotStr(u_char * __restrict psLine) Line 122  io_UnquotStr(u_char * __restrict psLine)
         if (!psLine)          if (!psLine)
                 return 0;                  return 0;
   
        switch (*psLine) {        if (*psLine == '"' || *psLine == '\'') {
                case '`':                str = io_strdup(psLine + 1);
                case '"':                for (pos = str, flg = 0; *pos; flg = ('\\' == *pos), pos++) {
                case '\'':                        if (!flg && *pos == *psLine) {
                        str = strdup((char*) psLine + 1);                                *pos = 0;
                        for (pos = str, flg = 0; *pos; flg = ('\\' == *pos), pos++) {                                strlcpy(psLine, str, strlen(psLine) + 1);
                                if (!flg && *pos == *psLine) {                                break;
                                        *pos = 0; 
                                        strlcpy((char*) psLine, str, strlen((char*) psLine) + 1); 
                                        break; 
                                } 
                         }                          }
                        free(str);                }
                        return 1;                io_free(str);
                 return 1;
         }          }
   
         return 0;          return 0;
 }  }
   
 /*  /*
 * io_Ch2Hex() Convert from Char string to Hex string * io_Ch2Hex() - Convert from Char string to Hex string
  *
  * @psLine = Text string   * @psLine = Text string
  * @lineLen = Length of Text string   * @lineLen = Length of Text string
 * return: NULL nothing to do or error; !=0 Allocated new converted data without term\0 (must be free) * return: NULL nothing to do or error; !=0 Allocated new converted data without term\0 (must be io_free)
 */  */
 inline u_char *  inline u_char *
 io_Ch2Hex(u_char *psLine, int lineLen)  io_Ch2Hex(u_char *psLine, int lineLen)
Line 153  io_Ch2Hex(u_char *psLine, int lineLen) Line 155  io_Ch2Hex(u_char *psLine, int lineLen)
         if (!psLine || !*psLine || !lineLen)          if (!psLine || !*psLine || !lineLen)
                 return NULL;                  return NULL;
   
        str = malloc(lineLen / 2);        str = io_malloc(lineLen / 2);
         if (!str) {          if (!str) {
                 LOGERR;                  LOGERR;
                 return NULL;                  return NULL;
Line 170  io_Ch2Hex(u_char *psLine, int lineLen) Line 172  io_Ch2Hex(u_char *psLine, int lineLen)
   
   
 /*  /*
 * io_Hex2Ch() Convert from Hex string to Char string * io_Hex2Ch() - Convert from Hex string to Char string
  *
  * @psLine = Text string   * @psLine = Text string
  * @lineLen = Length of Text string   * @lineLen = Length of Text string
 * return: NULL nothing to do or error; !=0 Allocated new converted string(must be free) * return: NULL nothing to do or error; !=0 Allocated new converted string(must be io_free)
 */  */
 inline char *  inline char *
 io_Hex2Ch(u_char *psLine, int lineLen)  io_Hex2Ch(u_char *psLine, int lineLen)
Line 184  io_Hex2Ch(u_char *psLine, int lineLen) Line 187  io_Hex2Ch(u_char *psLine, int lineLen)
         if (!psLine || !*psLine || !lineLen)          if (!psLine || !*psLine || !lineLen)
                 return NULL;                  return NULL;
   
        str = malloc(lineLen * 2 + 1);        str = io_malloc(lineLen * 2 + 1);
         if (!str) {          if (!str) {
                 LOGERR;                  LOGERR;
                 return NULL;                  return NULL;
Line 201  io_Hex2Ch(u_char *psLine, int lineLen) Line 204  io_Hex2Ch(u_char *psLine, int lineLen)
 }  }
   
 /*  /*
 * io_CopyEnv() Copy environment to new environment array; * io_CopyEnv() - Copy environment to new environment array;
  *
  * @oldenv = Environment array   * @oldenv = Environment array
 * return: NULL error; !=NULL Allocated new environment array(must be free) * return: NULL error; !=NULL Allocated new environment array(must be io_free)
 */  */
 char **  char **
 io_CopyEnv(const char **oldenv)  io_CopyEnv(const char **oldenv)
Line 222  io_CopyEnv(const char **oldenv) Line 226  io_CopyEnv(const char **oldenv)
                         num++;                          num++;
   
         /* create and copy new environment */          /* create and copy new environment */
        newenv = calloc(num + 1, sizeof(char*));        newenv = io_calloc(num + 1, sizeof(char*));
         if (!newenv) {          if (!newenv) {
                 LOGERR;                  LOGERR;
                 return NULL;                  return NULL;
Line 231  io_CopyEnv(const char **oldenv) Line 235  io_CopyEnv(const char **oldenv)
   
         for (i = 0; oldenv[i]; i++)          for (i = 0; oldenv[i]; i++)
                 if (*strchr(oldenv[i], '=')) {                  if (*strchr(oldenv[i], '=')) {
                        *el = strdup(oldenv[i]);                        *el = io_strdup(oldenv[i]);
                         el++;                          el++;
                 }                  }
         *el = NULL;          *el = NULL;
Line 240  io_CopyEnv(const char **oldenv) Line 244  io_CopyEnv(const char **oldenv)
 }  }
   
 /*  /*
 * io_ExecArgs() Build exec arguments from other array * io_ExecArgs() - Build exec arguments from other array
  *
  * @psProg = Program name for execute   * @psProg = Program name for execute
  * @oldarg = Arguments array   * @oldarg = Arguments array
 * return: NULL error; !=NULL Allocated execution array(must be free) * return: NULL error; !=NULL Allocated execution array(must be io_free)
 */  */
 char **  char **
 io_ExecArgs(const char *psProg, const char **oldarg)  io_ExecArgs(const char *psProg, const char **oldarg)
Line 260  io_ExecArgs(const char *psProg, const char **oldarg) Line 265  io_ExecArgs(const char *psProg, const char **oldarg)
         for (num = 0; oldarg[num]; num++);          for (num = 0; oldarg[num]; num++);
   
         /* create and copy new arguments */          /* create and copy new arguments */
        newarg = calloc(num + 2, sizeof(char*));        newarg = io_calloc(num + 2, sizeof(char*));
         if (!newarg) {          if (!newarg) {
                 LOGERR;                  LOGERR;
                 return NULL;                  return NULL;
         } else          } else
                 el = newarg;                  el = newarg;
   
        *el = strdup(psProg);        *el = io_strdup(psProg);
         el++;          el++;
   
         for (i = 0; oldarg[i]; i++, el++)          for (i = 0; oldarg[i]; i++, el++)
                *el = strdup(oldarg[i]);                *el = io_strdup(oldarg[i]);
         *el = NULL;          *el = NULL;
   
         return newarg;          return newarg;
 }  }
   
 /*  /*
 * io_FreeNullTerm() Free dynamic allocated null terminated array with strings * io_FreeNullTerm() - Free dynamic allocated null terminated array with strings
  *
  * @arr = Pointer to array for free   * @arr = Pointer to array for free
  * return: none   * return: none
 */  */
Line 290  io_FreeNullTerm(char *** __restrict arr) Line 296  io_FreeNullTerm(char *** __restrict arr)
         if (arr && *arr) {          if (arr && *arr) {
                 a = *arr;                  a = *arr;
                 while (a && *a)                  while (a && *a)
                        free(*a++);                        io_free(*a++);
                free(*arr);                io_free(*arr);
                 *arr = NULL;                  *arr = NULL;
         }          }
 }  }
   
 /*  /*
    * io_argsNum() Parse and calculate number of arguments
    *
    * @csArgs = Input arguments line
    * @csDelim = Delimiter(s) for separate
    * return: 0 error format; -1 error:: can`t read; >0 ok, number of items
    */
   inline int
   io_argsNum(const char *csArgs, const char *csDelim)
   {
           register int res;
           char *pos;
   
           assert(csArgs);
           assert(csDelim);
           if (!csArgs || !csDelim)
                   return -1;
   
           for (res = 1, pos = (char*) csArgs; (pos = strpbrk(pos, csDelim)); res++, pos++);
           return res;
   }
   
   /*
    * io_MakeAV() Parse and make attribute/value pair
    *
    * @csArgs = Input argument line
    * @csDelim = Delimiter for separate
    * @psAttr = Output Attribute
    * @attrLen = Size of attribute array
    * @psValue = Output Value, if ==NULL this element not present value or not wanted for return
    * @valLen = Size of value array
    * return: 0 error format; -1 error:: can`t read; >0 ok, number of readed items
   */
   int
   io_MakeAV(const char * __restrict csArgs, const char *csDelim, 
                   char * __restrict psAttr, int attrLen, char * __restrict psValue, int valLen)
   {
           register int ret = 0;
           char *pos, *psBuf;
   
           if (!csArgs || !csDelim || !psAttr || !attrLen)
                   return -1;
           if (psValue && !valLen)
                   return -1;
           else
                   memset(psValue, 0, valLen);
           psBuf = io_strdup(csArgs);
           if (!psBuf) {
                   LOGERR;
                   return -1;
           }
   
           pos = strpbrk(psBuf, csDelim);
           if (pos)
                   *pos++ = 0;
           ret++;
           strlcpy(psAttr, psBuf, attrLen);
   
           if (pos && *pos) {
                   ret++;
                   if (psValue)
                           strlcpy(psValue, pos, valLen);
           }
   
           io_free(psBuf);
           return ret;
   }
   
   /*
    * io_MakeAV2() Parse and make attribute/value pair over input string
    *
    * @csArgs = Input argument line, will be modified!
    * @csDelim = Delimiter for separate
    * @psAttr = Output Attribute
    * @psValue = Output Value, if ==NULL this element not present value or not wanted for return
    * return: 0 error format; -1 error:: can`t read; >0 ok, number of readed items
   */
   int
   io_MakeAV2(char * __restrict psArgs, const char *csDelim, 
                   char ** __restrict psAttr, char ** __restrict psValue)
   {
           register int ret = 0;
           char *pos;
   
           if (!psArgs || !csDelim)
                   return -1;
   
           pos = strpbrk(psArgs, csDelim);
           if (pos) {
                   *pos++ = 0;
                   ret++;
                   if (psAttr)
                           *psAttr = psArgs;
           } else
                   return 0;
   
           if (psValue) {
                   if (pos && *pos) {
                           ret++;
                           *psValue = pos;
                   } else
                           *psValue = NULL;
           }
   
           return ret;
   }
   
   /*
  * io_Path2File() - Parse and make path/filename pair   * io_Path2File() - Parse and make path/filename pair
  *   *
  * @csArgs = Input argument line   * @csArgs = Input argument line
Line 317  io_Path2File(const char * __restrict csArgs, char * __ Line 430  io_Path2File(const char * __restrict csArgs, char * __
         if (psPath && !pathLen)          if (psPath && !pathLen)
                 return -1;                  return -1;
   
        psBuf = strdup(csArgs);        psBuf = io_strdup(csArgs);
         if (!psBuf) {          if (!psBuf) {
                 LOGERR;                  LOGERR;
                 return -1;                  return -1;
Line 327  io_Path2File(const char * __restrict csArgs, char * __ Line 440  io_Path2File(const char * __restrict csArgs, char * __
         if (!pos) {          if (!pos) {
                 strlcpy(psFile, psBuf, fileLen);                  strlcpy(psFile, psBuf, fileLen);
   
                free(psBuf);                io_free(psBuf);
                 return 1;                  return 1;
         } else          } else
                 *pos++ = 0;                  *pos++ = 0;
Line 336  io_Path2File(const char * __restrict csArgs, char * __ Line 449  io_Path2File(const char * __restrict csArgs, char * __
         if (psPath)          if (psPath)
                 strlcpy(psPath, psBuf, pathLen);                  strlcpy(psPath, psBuf, pathLen);
   
        free(psBuf);        io_free(psBuf);
         return 2;          return 2;
 }  }
   
 /*  /*
 * io_ether_ntoa() Convert ethernet address to string * io_ether_ntoa() - Convert ethernet address to string
  *
  * @n = ethernet address structure, like struct ether_addr   * @n = ethernet address structure, like struct ether_addr
  * @a = string   * @a = string
  * @len = string length   * @len = string length
Line 364  io_ether_ntoa(const struct io_ether_addr *n, char * __ Line 478  io_ether_ntoa(const struct io_ether_addr *n, char * __
 }  }
   
 /*  /*
 * io_ether_aton() Convert string to ethernet address * io_ether_aton() - Convert string to ethernet address
  *
  * @a = string   * @a = string
  * @e = ethernet address structure, like struct ether_addr   * @e = ethernet address structure, like struct ether_addr
  * return: NULL error or !=NULL ethernet address structure   * return: NULL error or !=NULL ethernet address structure
Line 393  io_ether_aton(const char *a, struct io_ether_addr *e) Line 508  io_ether_aton(const char *a, struct io_ether_addr *e)
 }  }
   
 /*  /*
 * io_n2port() Extract port from network structure * io_n2port() - Extract port from network structure
  *
  * @addr = Address   * @addr = Address
  * return: 0 not supported family type or port number   * return: 0 not supported family type or port number
  */   */
Line 411  io_n2port(io_sockaddr_t * __restrict addr) Line 527  io_n2port(io_sockaddr_t * __restrict addr)
                 case AF_INET6:                  case AF_INET6:
                         return ntohs(addr->sin6.sin6_port);                          return ntohs(addr->sin6.sin6_port);
                 default:                  default:
                         io_SetErr(ESOCKTNOSUPPORT, "Unsuported address family %d",   
                                         addr->sa.sa_family);  
                         break;                          break;
         }          }
   
Line 420  io_n2port(io_sockaddr_t * __restrict addr) Line 534  io_n2port(io_sockaddr_t * __restrict addr)
 }  }
   
 /*  /*
 * io_n2addr() Extract address from network structure * io_n2addr() - Extract address from network structure
  *
  * @addr = Address   * @addr = Address
  * @val = Value for store string address   * @val = Value for store string address
  * return: NULL error or !=NULL string address from val   * return: NULL error or !=NULL string address from val
Line 434  io_n2addr(io_sockaddr_t * __restrict addr, ait_val_t * Line 549  io_n2addr(io_sockaddr_t * __restrict addr, ait_val_t *
         if (!addr || !val)          if (!addr || !val)
                 return ret;                  return ret;
   
           AIT_INIT_VAL(val);
         switch (addr->sa.sa_family) {          switch (addr->sa.sa_family) {
                 case AF_INET:                  case AF_INET:
                         if (!inet_ntop(AF_INET, &addr->sin.sin_addr, str, INET_ADDRSTRLEN)) {                          if (!inet_ntop(AF_INET, &addr->sin.sin_addr, str, INET_ADDRSTRLEN)) {
Line 449  io_n2addr(io_sockaddr_t * __restrict addr, ait_val_t * Line 565  io_n2addr(io_sockaddr_t * __restrict addr, ait_val_t *
                         } else                          } else
                                 ret = str;                                  ret = str;
                         break;                          break;
                   case AF_LOCAL:
                           ret = addr->sun.sun_path;
                           break;
                 default:                  default:
                         io_SetErr(EPROTONOSUPPORT, "Unsuported address family %d",                           io_SetErr(EPROTONOSUPPORT, "Unsuported address family %d", 
                                         addr->sa.sa_family);                                          addr->sa.sa_family);
                         return ret;                          return ret;
         }          }
   
         if (!AIT_ISEMPTY(val))  
                 AIT_FREE_VAL(val);  
         AIT_SET_STR(val, ret);          AIT_SET_STR(val, ret);
         return (const char*) AIT_GET_STR(val);          return (const char*) AIT_GET_STR(val);
 }  }
   
 /*  /*
 * io_gethostbyname() Get host and port and make network structure * io_gethostbyname() - Get host and port and make network structure
  *
  * @psHost = Hostname   * @psHost = Hostname
  * @port = Port   * @port = Port
  * @addr = Network address structure   * @addr = Network address structure
Line 471  io_n2addr(io_sockaddr_t * __restrict addr, ait_val_t * Line 589  io_n2addr(io_sockaddr_t * __restrict addr, ait_val_t *
 io_sockaddr_t *  io_sockaddr_t *
 io_gethostbyname(const char *psHost, u_short port, io_sockaddr_t * __restrict addr)  io_gethostbyname(const char *psHost, u_short port, io_sockaddr_t * __restrict addr)
 {  {
        struct hostent *host;        struct hostent *host = NULL;
   
         if (!psHost || !addr)          if (!psHost || !addr)
                 return NULL;                  return NULL;
   
        /* resolver */        if (*psHost != '/') {
        if (!addr->sa.sa_family)                /* resolver */
                host = gethostbyname(psHost);                if (!addr->sa.sa_family)
        else                        host = gethostbyname(psHost);
                host = gethostbyname2(psHost, addr->sa.sa_family);                else
        if (!host) {                        host = gethostbyname2(psHost, addr->sa.sa_family);
                io_SetErr(EINVAL, "Resolver #%d - %s", h_errno, hstrerror(h_errno));                if (!host) {
                return NULL;                        io_SetErr(EINVAL, "Resolver #%d - %s", h_errno, hstrerror(h_errno));
                         return NULL;
                 } else {
                         memset(addr, 0, sizeof(io_sockaddr_t));
                         addr->sa.sa_family = host->h_addrtype;
                 }
         } else {
                 memset(addr, 0, sizeof(io_sockaddr_t));
                 addr->sa.sa_family = AF_LOCAL;
         }          }
                   
   
        memset(addr, 0, sizeof(io_sockaddr_t));        switch (addr->sa.sa_family) {
        switch (host->h_addrtype) { 
                 case AF_INET:                  case AF_INET:
                         addr->sin.sin_len = sizeof(struct sockaddr_in);                          addr->sin.sin_len = sizeof(struct sockaddr_in);
                         addr->sin.sin_family = AF_INET;                          addr->sin.sin_family = AF_INET;
Line 500  io_gethostbyname(const char *psHost, u_short port, io_ Line 626  io_gethostbyname(const char *psHost, u_short port, io_
                         addr->sin6.sin6_port = htons(port);                          addr->sin6.sin6_port = htons(port);
                         memcpy(&addr->sin6.sin6_addr, host->h_addr, sizeof addr->sin6.sin6_addr);                          memcpy(&addr->sin6.sin6_addr, host->h_addr, sizeof addr->sin6.sin6_addr);
                         return addr;                          return addr;
                   case AF_LOCAL:
                           addr->sun.sun_len = sizeof(struct sockaddr_un);
                           addr->sun.sun_family = AF_LOCAL;
                           memset(addr->sun.sun_path, 0, sizeof addr->sun.sun_path);
                           snprintf(addr->sun.sun_path, sizeof addr->sun.sun_path, "%s-%hu", psHost, port);
                           return addr;
                 default:                  default:
                        io_SetErr(EPROTONOSUPPORT, "Unsuported address family %d",                         io_SetErr(EPROTONOSUPPORT, "Unsuported address family %d", addr->sa.sa_family);
                                        host->h_addrtype); 
                         break;                          break;
         }          }
   
         return NULL;          return NULL;
   }
   
   /*
    * io_addrcmp() - Compare network addresses
    *
    * @a = 1st address
    * @b = 2nd address
    * @p = compare and ports, if family is AF_INET or AF_INET6
    * return: 0 is equal or !=0 is different
    */
   int
   io_addrcmp(io_sockaddr_t * __restrict a, io_sockaddr_t * __restrict b, int p)
   {
           if (a && b && a->sa.sa_family == b->sa.sa_family)
                   switch (a->sa.sa_family) {
                           case AF_LOCAL:
                                   return strcmp(a->sun.sun_path, b->sun.sun_path);
                           case AF_INET:
                                   if (p && (a->sin.sin_port - b->sin.sin_port))
                                           return (int) !!(a->sin.sin_port - b->sin.sin_port);
                                   else
                                           return memcmp(&a->sin.sin_addr, &b->sin.sin_addr, 
                                                           sizeof a->sin.sin_addr);
                           case AF_INET6:
                                   if (p && (a->sin6.sin6_port - b->sin6.sin6_port))
                                           return (int) !!(a->sin6.sin6_port - b->sin6.sin6_port);
                                   else
                                           return memcmp(&a->sin6.sin6_addr, &b->sin6.sin6_addr, 
                                                           sizeof a->sin6.sin6_addr);
                           case AF_LINK:
                                   return memcmp(&a->sdl.sdl_data, &b->sdl.sdl_data, 
                                                   sizeof a->sdl.sdl_data);
                   }
   
           return (int) !!(a - b);
   }
   
   /*
    * io_usleep() - usleep() replacement for ELWIX
    *
    * @usec = microseconds for sleep
    * return: -1 interrupted by signal or 0 ok
    */
   inline int
   io_usleep(u_int usec)
   {
           struct timeval tv = { (time_t) (usec / 1000000), (long) (usec % 1000000) };
   
           return select(0, NULL, NULL, NULL, &tv);
   }
   
   /*
    * io_AV2Path() - Attribute/Value pair store to file
    *
    * @csPath = Directory
    * @csAttr = Attribute
    * @csVal = Value
    * @update = Update if a/v exists
    * @perm = File permissions, if =0 set default perm=0600
    * return: -1 error or >-1 written bytes
    */
   int
   io_AV2Path(const char *csPath, const char *csAttr, const char *csVal, 
                   int update, int perm)
   {
           int fd, wlen = 0;
           char szFile[MAXPATHLEN];
   
           if (!csAttr)
                   return -1;
           else
                   memset(szFile, 0, sizeof szFile);
           snprintf(szFile, sizeof szFile, "%s/%s.av", csPath ? csPath : ".", csAttr);
   
           wlen = O_CREAT | O_WRONLY;
           if (!update)
                   wlen |= O_EXCL;
           fd = open(szFile, wlen, perm ? perm : 0600);
           if (fd == -1) {
                   LOGERR;
                   return -1;
           } else
                   wlen ^= wlen;
   
           if (csVal)
                   if ((wlen = write(fd, csVal, strlen(csVal))) == -1) {
                           LOGERR;
                           close(fd);
                           unlink(szFile);
                           return -1;
                   }
   
           close(fd);
           return wlen;
   }
   
   /*
    * io_Path2AV() - Get stored Attribute/Value
    *
    * @csPath = Directory
    * @csAttr = Attribute
    * @psVal = Value
    * @valLen = Value length
    * @del = Delete a/v pair after read
    * return: -1 error or >-1 readed bytes
    */
   int
   io_Path2AV(const char *csPath, const char *csAttr, char *psVal, int valLen, int del)
   {
           int fd, rlen = 0;
           char szFile[MAXPATHLEN];
   
           if (!csAttr)
                   return -1;
           else
                   memset(szFile, 0, sizeof szFile);
           snprintf(szFile, sizeof szFile, "%s/%s.av", csPath ? csPath : ".", csAttr);
   
           if (psVal && valLen) {
                   fd = open(szFile, O_RDONLY);
                   if (fd == -1) {
                           LOGERR;
                           return -1;
                   } else
                           rlen ^= rlen;
   
                   memset(psVal, 0, valLen);
                   rlen = read(fd, psVal, valLen - 1);
                   if (rlen == -1) {
                           LOGERR;
                           close(fd);
                           return -1;
                   }
   
                   close(fd);
           }
   
           if (del)
                   unlink(szFile);
           return rlen;
 }  }

Removed from v.1.8.2.1  
changed lines
  Added in v.1.20


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>