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

version 1.5, 2011/04/20 22:56:32 version 1.7.2.3, 2011/11/03 14:22:03
Line 58  char io_Error[STRSIZ]; Line 58  char io_Error[STRSIZ];
   
   
 // io_GetErrno() Get error code of last operation  // io_GetErrno() Get error code of last operation
inline int io_GetErrno()inline int
 io_GetErrno()
 {  {
         return io_Errno;          return io_Errno;
 }  }
   
 // io_GetError() Get error text of last operation  // io_GetError() Get error text of last operation
inline const char *io_GetError()inline const char *
 io_GetError()
 {  {
         return io_Error;          return io_Error;
 }  }
   
 // io_SetErr() Set error to variables for internal use!!!  // io_SetErr() Set error to variables for internal use!!!
inline void io_SetErr(int eno, char *estr, ...)inline void
 io_SetErr(int eno, char *estr, ...)
 {  {
         va_list lst;          va_list lst;
   
Line 90  inline void io_SetErr(int eno, char *estr, ...) Line 93  inline void io_SetErr(int eno, char *estr, ...)
  * @dataLen = Length of data   * @dataLen = Length of data
  * return: 0 EOF; -1 error:: can`t read; >0 count of readed chars   * return: 0 EOF; -1 error:: can`t read; >0 count of readed chars
 */  */
int ioPromptRead(int *h, const char *csPrompt, char * __restrict psData, int dataLen)int
 ioPromptRead(int *h, const char *csPrompt, char * __restrict psData, int dataLen)
 {  {
         int ok = 0;          int ok = 0;
         FILE *inp, *out;          FILE *inp, *out;
Line 143  int ioPromptRead(int *h, const char *csPrompt, char *  Line 147  int ioPromptRead(int *h, const char *csPrompt, char * 
  * @confirm = Confirm password, 0 - get password, !=0 Ask for confirmation   * @confirm = Confirm password, 0 - get password, !=0 Ask for confirmation
  * return: 0 EOF; -1 error:: can`t read; >0 count of readed chars   * return: 0 EOF; -1 error:: can`t read; >0 count of readed chars
 */  */
int ioPromptPassword(int *h, const char *csPrompt, char * __restrict psPass, int passLen, int confirm)int
 ioPromptPassword(int *h, const char *csPrompt, char * __restrict psPass, int passLen, int confirm)
 {  {
         int ret, ok = 0;          int ret, ok = 0;
         FILE *inp, *out;          FILE *inp, *out;
Line 227  next: Line 232  next:
  * @endPos = Return end positions   * @endPos = Return end positions
  * return: NULL not match or error; !=NULL begin of matched data   * return: NULL not match or error; !=NULL begin of matched data
 */  */
const char *ioRegexVerify(const char *csRegex, const char *csData, int *startPos, int *endPos)const char *
 ioRegexVerify(const char *csRegex, const char *csData, int *startPos, int *endPos)
 {  {
         regex_t re;          regex_t re;
         regmatch_t match;          regmatch_t match;
Line 274  const char *ioRegexVerify(const char *csRegex, const c Line 280  const char *ioRegexVerify(const char *csRegex, const c
  * @strLen = Length of string   * @strLen = Length of string
  * return: 0 not match; >0 count of returned chars   * return: 0 not match; >0 count of returned chars
 */  */
int ioRegexGet(const char *csRegex, const char *csData, char * __restrict psString, int strLen)int
 ioRegexGet(const char *csRegex, const char *csData, char * __restrict psString, int strLen)
 {  {
         int sp, ep, len;          int sp, ep, len;
         const char *str;          const char *str;
Line 302  int ioRegexGet(const char *csRegex, const char *csData Line 309  int ioRegexGet(const char *csRegex, const char *csData
  * @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 free after use!
 */  */
char *ioRegexReplace(const char *csRegex, const char *csData, const char *csNew)char *
 ioRegexReplace(const char *csRegex, const char *csData, const char *csNew)
 {  {
         int sp, ep, len;          int sp, ep, len;
         char *str = NULL;          char *str = NULL;
Line 344  char *ioRegexReplace(const char *csRegex, const char * Line 352  char *ioRegexReplace(const char *csRegex, const char *
 }  }
   
 /*  /*
 * ioVarAst() 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 free()
 */  */
 char *  char *
ioVarAst(const char *csString)ioStrAst(const char *csString)
 {  {
         char *ext, *str, *out = NULL;          char *ext, *str, *out = NULL;
         int e[2] = { 0 };          int e[2] = { 0 };
Line 549  ioWatchDirLoop(const char *csDir, int (*callback)(cons Line 557  ioWatchDirLoop(const char *csDir, int (*callback)(cons
         close(d);          close(d);
         close(kq);          close(kq);
         return n;          return n;
   }
   
   /*
    * ioCreatePIDFile() Create PID file
    * @csName = PID filename
    * @ifExists = !=0 if filename exists return error
    * return: -1 error or 0 ok
    */
   inline int
   ioCreatePIDFile(const char *csName, int ifExists)
   {
           int fd;
           char str[STRSIZ] = { 0 };
   
           if (!csName)
                   return -1;
   
           fd = open(csName, O_WRONLY | O_CREAT | (ifExists ? O_EXCL : 0), 0644);
           if (fd == -1) {
                   LOGERR;
                   return -1;
           }
           snprintf(str, sizeof str, "%d", getpid());
           write(fd, str, strlen(str));
           close(fd);
           return 0;
   }
   
   
   /*
    * ioSendFile() AITNET sendfile() userland implementation, not dependant from OS
    * @s = socket
    * @csFile = file for send
    * @sendLen = bytes to send, if 0 send all data
    * @offset = start file offset
    * @sndbuf = SO_SNDBUF value, if 0 use default
    * return: 0 error, >0 ok, sended bytes
    */
   size_t
   ioSendFile(int s, const char *csFile, size_t sendLen, off_t offset, int sndbuf)
   {
           void *addr;
           int fd;
           size_t len = 0;
           register size_t off = 0;
   
           if (!csFile)
                   return 0;
   
           if (sndbuf)
                   if (setsockopt(s, SOL_SOCKET, SO_SNDBUF, &sndbuf, sizeof sndbuf) == -1) {
                           LOGERR;
                           return 0;
                   }
   
           fd = open(csFile, O_RDONLY);
           if (fd == -1) {
                   LOGERR;
                   return 0;
           }
           if (!sendLen) {
                   sendLen = lseek(fd, 0, SEEK_END);
                   if (sendLen == -1) {
                           LOGERR;
                           close(fd);
                           return 0;
                   }
           }
           addr = mmap(NULL, sendLen, PROT_READ, MAP_SHARED, fd, offset);
           if (addr == MAP_FAILED) {
                   LOGERR;
                   close(fd);
                   return 0;
           } else
                   close(fd);
   
           while (off < sendLen && (len = write(s, addr + off, sendLen - off)) != -1)
                   off += len;
           if (len == -1) {
                   LOGERR;
                   munmap(addr, sendLen);
                   return 0;
           } else
                   len = off;
   
           if (len != sendLen) {
                   io_SetErr(ECANCELED, "Different sizes - request %u bytes, actually sended %u bytes\n", 
                                   sendLen, len);
                   len ^= len;
           }
   
           munmap(addr, sendLen);
           return len;
   }
   
   /*
    * ioRecvFile() Receive file from socket, fastest (zero-copy) way
    * @s = socket
    * @csFile = file for receive
    * @recvLen = receive bytes
    * @over = overwrite file if exists with mode like 0644
    * @rcvbuf = SO_RCVBUF value, if 0 use default
    * return: 0 error, >0 ok, received bytes
    */
   size_t
   ioRecvFile(int s, const char *csFile, size_t recvLen, int over, int rcvbuf)
   {
           void *addr;
           int fd;
           size_t len = 0;
           register size_t off = 0;
           struct pollfd pfd = { s, POLLIN | POLLPRI, 0 };
   
           if (!csFile || !recvLen)
                   return 0;
           if (!over && !access(csFile, F_OK))
                   return 0;
   
           if (rcvbuf)
                   if (setsockopt(s, SOL_SOCKET, SO_RCVBUF, &rcvbuf, sizeof rcvbuf) == -1) {
                           LOGERR;
                           return 0;
                   }
   
           fd = open(csFile, O_WRONLY | O_CREAT | O_TRUNC, over);
           if (fd == -1) {
                   LOGERR;
                   unlink(csFile);
                   return 0;
           }
           if (lseek(fd, recvLen - 1, SEEK_SET) == -1) {
                   LOGERR;
                   close(fd);
                   unlink(csFile);
                   return 0;
           }
           if (write(fd, "", 1) == -1) {
                   LOGERR;
                   close(fd);
                   unlink(csFile);
                   return 0;
           }
           addr = mmap(NULL, recvLen, PROT_WRITE, MAP_SHARED, fd, 0);
           if (addr == MAP_FAILED) {
                   LOGERR;
                   close(fd);
                   unlink(csFile);
                   return 0;
           } else
                   close(fd);
   
           while (off < recvLen && poll(&pfd, 1, RECV_TIMEOUT) != -1)
                   while (off < recvLen && (len = read(s, addr + off, recvLen - off)) != -1)
                           off += len;
           if (len == -1) {
                   LOGERR;
                   munmap(addr, recvLen);
                   unlink(csFile);
                   return 0;
           } else
                   len = off;
   
           if (len != recvLen)
                   io_SetErr(EAGAIN, "Different sizes - request %u bytes, actually received %u bytes\n", 
                                   recvLen, len);
   
           munmap(addr, recvLen);
           return len;
 }  }

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


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