Diff for /libaitio/src/aitio.c between versions 1.7.2.3 and 1.10.6.4

version 1.7.2.3, 2011/11/03 14:22:03 version 1.10.6.4, 2012/05/23 13:53:00
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 47  SUCH DAMAGE. Line 47  SUCH DAMAGE.
   
   
 int io_Debug;  int io_Debug;
   mpool_t *io_mpool;
   
   
   /* Memory management */
   
   void *(*io_malloc)(size_t) = malloc;
   void *(*io_calloc)(size_t, size_t) = calloc;
   void *(*io_realloc)(void*, size_t) = realloc;
   char *(*io_strdup)(const char*) = strdup;
   void (*io_free)(void*) = free;
   
   
 #pragma GCC visibility push(hidden)  #pragma GCC visibility push(hidden)
   
   int use_mm;
   
 int io_Errno;  int io_Errno;
 char io_Error[STRSIZ];  char io_Error[STRSIZ];
   
Line 84  io_SetErr(int eno, char *estr, ...) Line 96  io_SetErr(int eno, char *estr, ...)
         va_end(lst);          va_end(lst);
 }  }
   
   // io_mm_inuse() Check for memory management model
   inline int
   io_mm_inuse()
   {
           return use_mm & IO_MPOOL;
   }
   
   
   // init libaitio routine
   void
   _init()
   {
   #ifdef USE_MPOOL
           ioLibInit(IO_MPOOL, 0);
   #else
           ioLibInit(IO_SYSM, 0);
   #endif
   }
   
   // fini libaitio routine
   void
   _fini()
   {
           ioLibFini();
   }
   
 /*  /*
 * ioPromptRead() Read data from input h[0] with prompt to output h[1] * ioLibInit() - Init libaitio library memory management
  *
  * @mm = memory management (IO_SYSM or IO_MPOOL)
  * @maxmem = memory limit
  * return: -1 error or !=-1 used memory management model
  */
 inline int
 ioLibInit(int mm, u_long maxmem)
 {
         switch (mm) {
                 case IO_MPOOL:  /* mpool */
                         io_mpool = mpool_init(maxmem);
                         if (io_mpool) {
                                 io_malloc = mpool_xmalloc;
                                 io_calloc = mpool_xcalloc;
                                 io_realloc = mpool_xrealloc;
                                 io_strdup = mpool_xstrdup;
                                 io_free = mpool_xfree;
                                 use_mm = mm;
                                 break;
                         } else {
                                 #undef USE_MPOOL
                         }
                 case IO_SYSM:   /* system */
                         io_malloc = malloc;
                         io_calloc = calloc;
                         io_realloc = realloc;
                         io_strdup = strdup;
                         io_free = free;
                         use_mm = mm;
                         break;
                 default:        /* not supported */
                         io_SetErr(EINVAL, "Not supported memory management");
                         return -1;
         }
 
         return use_mm;
 }
 
 /*
  * ioLibFini() - Finish libaitio library memory management
  *
  * return: none
  */
 inline void
 ioLibFini()
 {
         switch (use_mm) {
                 case 1:
                         mpool_destroy(&io_mpool);
 
                         io_malloc = malloc;
                         io_calloc = calloc;
                         io_realloc = realloc;
                         io_strdup = strdup;
                         io_free = free;
                         use_mm = IO_SYSM;
                         break;
         }
 }
 
 
 /*
  * ioPromptRead() - Read data from input h[0] with prompt to output h[1]
  *
  * @h = file handles h[0] = input, h[1] = output, if NULL use stdin, stdout   * @h = file handles h[0] = input, h[1] = output, if NULL use stdin, stdout
  * @csPrompt = Prompt before input, may be NULL   * @csPrompt = Prompt before input, may be NULL
  * @psData = Readed data   * @psData = Readed data
Line 139  ioPromptRead(int *h, const char *csPrompt, char * __re Line 240  ioPromptRead(int *h, const char *csPrompt, char * __re
 }  }
   
 /*  /*
 * ioPromptPassword() Read password from input h[0] with prompt to output h[1] * ioPromptPassword() - Read password from input h[0] with prompt to output h[1]
  *
  * @h = file handles h[0] = input, h[1] = output, if NULL use stdin, stdout   * @h = file handles h[0] = input, h[1] = output, if NULL use stdin, stdout
  * @csPrompt = Prompt before input, may be NULL   * @csPrompt = Prompt before input, may be NULL
  * @psPass = Readed password   * @psPass = Readed password
Line 225  next: Line 327  next:
 }  }
   
 /*  /*
 * ioRegexVerify() Function for verify data match in regex expression * ioRegexVerify() - Function for verify data match in regex expression
  *
  * @csRegex = Regulare expression pattern   * @csRegex = Regulare expression pattern
  * @csData = Data for check and verify   * @csData = Data for check and verify
  * @startPos = Return start positions   * @startPos = Return start positions
Line 246  ioRegexVerify(const char *csRegex, const char *csData, Line 349  ioRegexVerify(const char *csRegex, const char *csData,
   
         if ((ret = regcomp(&re, csRegex, REG_EXTENDED))) {          if ((ret = regcomp(&re, csRegex, REG_EXTENDED))) {
                 regerror(ret, &re, szErr, STRSIZ);                  regerror(ret, &re, szErr, STRSIZ);
                io_SetErr(ret, "Error:: %s\n", szErr);                io_SetErr(ret, "%s", szErr);
                 regfree(&re);                  regfree(&re);
                 return NULL;                  return NULL;
         }          }
Line 264  ioRegexVerify(const char *csRegex, const char *csData, Line 367  ioRegexVerify(const char *csRegex, const char *csData,
   
         if (ret) {          if (ret) {
                 regerror(ret, &re, szErr, STRSIZ);                  regerror(ret, &re, szErr, STRSIZ);
                io_SetErr(ret, "Error:: %s\n", szErr);                io_SetErr(ret, "%s", szErr);
                 pos = NULL;                  pos = NULL;
         }          }
   
Line 273  ioRegexVerify(const char *csRegex, const char *csData, Line 376  ioRegexVerify(const char *csRegex, const char *csData,
 }  }
   
 /*  /*
 * ioRegexGet() Function for get data match in regex expression * ioRegexGet() - Function for get data match in regex expression
  *
  * @csRegex = Regulare expression pattern   * @csRegex = Regulare expression pattern
  * @csData = Data from get   * @csData = Data from get
  * @psString = Returned string if match   * @psString = Returned string if match
Line 303  ioRegexGet(const char *csRegex, const char *csData, ch Line 407  ioRegexGet(const char *csRegex, const char *csData, ch
 }  }
   
 /*  /*
 * ioRegexReplace() Function for replace data match in regex expression with newdata * ioRegexReplace() - Function for replace data match in regex expression with newdata
  *
  * @csRegex = Regulare expression pattern   * @csRegex = Regulare expression pattern
  * @csData = Source data   * @csData = Source data
  * @csNew = Data for replace   * @csNew = Data for replace
 * return: NULL not match or error; !=NULL allocated new string, must be free after use! * return: NULL not match or error; !=NULL allocated new string, must be xfree after use!
 */  */
 char *  char *
 ioRegexReplace(const char *csRegex, const char *csData, const char *csNew)  ioRegexReplace(const char *csRegex, const char *csData, const char *csNew)
Line 323  ioRegexReplace(const char *csRegex, const char *csData Line 428  ioRegexReplace(const char *csRegex, const char *csData
   
         // ___ before match          // ___ before match
         len = sp + 1;          len = sp + 1;
        str = malloc(len);        str = xmalloc(len);
         if (!str) {          if (!str) {
                 LOGERR;                  LOGERR;
                 return NULL;                  return NULL;
Line 332  ioRegexReplace(const char *csRegex, const char *csData Line 437  ioRegexReplace(const char *csRegex, const char *csData
         // * replace match *          // * replace match *
         if (csNew) {          if (csNew) {
                 len += strlen(csNew);                  len += strlen(csNew);
                str = realloc(str, len);                str = xrealloc(str, len);
                 if (!str) {                  if (!str) {
                         LOGERR;                          LOGERR;
                         return NULL;                          return NULL;
Line 341  ioRegexReplace(const char *csRegex, const char *csData Line 446  ioRegexReplace(const char *csRegex, const char *csData
         }          }
         // after match ___          // after match ___
         len += strlen(csData) - ep;          len += strlen(csData) - ep;
        str = realloc(str, len);        str = xrealloc(str, len);
         if (!str) {          if (!str) {
                 LOGERR;                  LOGERR;
                 return NULL;                  return NULL;
Line 352  ioRegexReplace(const char *csRegex, const char *csData Line 457  ioRegexReplace(const char *csRegex, const char *csData
 }  }
   
 /*  /*
 * ioStrAst() Function for evaluate string like asterisk variable "{text[:[-]#[:#]]}" * ioStrAst() - Function for evaluate string like asterisk variable "{text[:[-]#[:#]]}"
  *
  * @csString = Input string   * @csString = Input string
 * return: NULL error, !=NULL Allocated new string evaluated from input string, must be free() * return: NULL error, !=NULL Allocated new string evaluated from input string, must be xfree()
 */  */
 char *  char *
 ioStrAst(const char *csString)  ioStrAst(const char *csString)
Line 367  ioStrAst(const char *csString) Line 473  ioStrAst(const char *csString)
   
         if (!strchr(csString, '{') || !strrchr(csString, '}')) {          if (!strchr(csString, '{') || !strrchr(csString, '}')) {
                 memset(io_Error, 0, STRSIZ);                  memset(io_Error, 0, STRSIZ);
                snprintf(io_Error, STRSIZ, "Error:: Invalid input string format ... "                snprintf(io_Error, STRSIZ, "Invalid input string format ... "
                                 "must be like {text[:[-]#[:#]]}");                                  "must be like {text[:[-]#[:#]]}");
                 io_Errno = EINVAL;                  io_Errno = EINVAL;
                 return NULL;                  return NULL;
Line 395  ioStrAst(const char *csString) Line 501  ioStrAst(const char *csString)
                 ext = str;                  ext = str;
   
         out = strdup(ext);          out = strdup(ext);
        free(str);        xfree(str);
   
         return out;          return out;
 }  }
   
   
 /*  /*
 * ioMkDir() Function for racursive directory creation and validation * ioMkDir() - Function for racursive directory creation and validation
  *
  * @csDir = Full directory path   * @csDir = Full directory path
  * @mode = Mode for directory creation if missing dir   * @mode = Mode for directory creation if missing dir
  * return: -1 error, 0 directory path exist, >0 created missing dirs   * return: -1 error, 0 directory path exist, >0 created missing dirs
Line 444  ioMkDir(const char *csDir, int mode) Line 551  ioMkDir(const char *csDir, int mode)
         }          }
 end:  end:
         chdir(szOld);          chdir(szOld);
        free(str);        xfree(str);
         return cx;          return cx;
 }  }
   
 /*  /*
 * ioWatchDirLoop() Function for watching changes in directory and fire callback * ioWatchDirLoop() - Function for watching changes in directory and fire callback
  *
  * @csDir = Full directory path   * @csDir = Full directory path
  * @callback = Callback if raise event! nOp -1 delete, 0 change/move, 1 create   * @callback = Callback if raise event! nOp -1 delete, 0 change/move, 1 create
  * return: -1 error, !=-1 ok, number of total signaled events   * return: -1 error, !=-1 ok, number of total signaled events
Line 560  ioWatchDirLoop(const char *csDir, int (*callback)(cons Line 668  ioWatchDirLoop(const char *csDir, int (*callback)(cons
 }  }
   
 /*  /*
 * ioCreatePIDFile() Create PID file * ioCreatePIDFile() - Create PID file
  *
  * @csName = PID filename   * @csName = PID filename
  * @ifExists = !=0 if filename exists return error   * @ifExists = !=0 if filename exists return error
  * return: -1 error or 0 ok   * return: -1 error or 0 ok
Line 587  ioCreatePIDFile(const char *csName, int ifExists) Line 696  ioCreatePIDFile(const char *csName, int ifExists)
   
   
 /*  /*
 * ioSendFile() AITNET sendfile() userland implementation, not dependant from OS * ioSendFile() - AITNET sendfile() userland implementation, not dependant from OS
  *
  * @s = socket   * @s = socket
  * @csFile = file for send   * @csFile = file for send
  * @sendLen = bytes to send, if 0 send all data   * @sendLen = bytes to send, if 0 send all data
Line 653  ioSendFile(int s, const char *csFile, size_t sendLen,  Line 763  ioSendFile(int s, const char *csFile, size_t sendLen, 
 }  }
   
 /*  /*
 * ioRecvFile() Receive file from socket, fastest (zero-copy) way * ioRecvFile() - Receive file from socket, fastest (zero-copy) way
  *
  * @s = socket   * @s = socket
  * @csFile = file for receive   * @csFile = file for receive
  * @recvLen = receive bytes   * @recvLen = receive bytes
Line 687  ioRecvFile(int s, const char *csFile, size_t recvLen,  Line 798  ioRecvFile(int s, const char *csFile, size_t recvLen, 
                 unlink(csFile);                  unlink(csFile);
                 return 0;                  return 0;
         }          }
        if (lseek(fd, recvLen - 1, SEEK_SET) == -1) {        if (ftruncate(fd, recvLen) == -1) {
                LOGERR; 
                close(fd); 
                unlink(csFile); 
                return 0; 
        } 
        if (write(fd, "", 1) == -1) { 
                 LOGERR;                  LOGERR;
                 close(fd);                  close(fd);
                 unlink(csFile);                  unlink(csFile);

Removed from v.1.7.2.3  
changed lines
  Added in v.1.10.6.4


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