Diff for /libaitio/src/aitio.c between versions 1.7.2.1 and 1.9

version 1.7.2.1, 2011/11/02 13:13:48 version 1.9, 2012/03/29 01:31:33
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 87  io_SetErr(int eno, char *estr, ...) Line 87  io_SetErr(int eno, char *estr, ...)
   
 /*  /*
  * ioPromptRead() Read data from input h[0] with prompt to output h[1]   * 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 140  ioPromptRead(int *h, const char *csPrompt, char * __re Line 141  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 226  next: Line 228  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 274  ioRegexVerify(const char *csRegex, const char *csData, Line 277  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 304  ioRegexGet(const char *csRegex, const char *csData, ch Line 308  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
Line 352  ioRegexReplace(const char *csRegex, const char *csData Line 357  ioRegexReplace(const char *csRegex, const char *csData
 }  }
   
 /*  /*
 * 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 403  ioVarAst(const char *csString) Line 409  ioVarAst(const char *csString)
   
 /*  /*
  * 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 450  end: Line 457  end:
   
 /*  /*
  * 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 561  ioWatchDirLoop(const char *csDir, int (*callback)(cons Line 569  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 588  ioCreatePIDFile(const char *csName, int ifExists) Line 597  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
  * @offset = start file offset   * @offset = start file offset
    * @sndbuf = SO_SNDBUF value, if 0 use default
  * return: 0 error, >0 ok, sended bytes   * return: 0 error, >0 ok, sended bytes
  */   */
 size_t  size_t
ioSendFile(int s, const char *csFile, size_t sendLen, off_t offset)ioSendFile(int s, const char *csFile, size_t sendLen, off_t offset, int sndbuf)
 {  {
         void *addr;          void *addr;
         int fd;          int fd;
        size_t len;        size_t len = 0;
         register size_t off = 0;
   
         if (!csFile)          if (!csFile)
                 return 0;                  return 0;
   
           if (sndbuf)
                   if (setsockopt(s, SOL_SOCKET, SO_SNDBUF, &sndbuf, sizeof sndbuf) == -1) {
                           LOGERR;
                           return 0;
                   }
   
         fd = open(csFile, O_RDONLY);          fd = open(csFile, O_RDONLY);
         if (fd == -1) {          if (fd == -1) {
                 LOGERR;                  LOGERR;
Line 625  ioSendFile(int s, const char *csFile, size_t sendLen,  Line 643  ioSendFile(int s, const char *csFile, size_t sendLen, 
         } else          } else
                 close(fd);                  close(fd);
   
        len = write(s, addr, sendLen);        while (off < sendLen && (len = write(s, addr + off, sendLen - off)) != -1)
                 off += len;
         if (len == -1) {          if (len == -1) {
                 LOGERR;                  LOGERR;
                 munmap(addr, sendLen);                  munmap(addr, sendLen);
                 return 0;                  return 0;
        }        } else
                 len = off;
   
         if (len != sendLen) {          if (len != sendLen) {
                 io_SetErr(ECANCELED, "Different sizes - request %u bytes, actually sended %u bytes\n",                   io_SetErr(ECANCELED, "Different sizes - request %u bytes, actually sended %u bytes\n", 
Line 644  ioSendFile(int s, const char *csFile, size_t sendLen,  Line 664  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
  * @over = overwrite file if exists with mode like 0644   * @over = overwrite file if exists with mode like 0644
    * @rcvbuf = SO_RCVBUF value, if 0 use default
  * return: 0 error, >0 ok, received bytes   * return: 0 error, >0 ok, received bytes
  */   */
 size_t  size_t
ioRecvFile(int s, const char *csFile, size_t recvLen, int over)ioRecvFile(int s, const char *csFile, size_t recvLen, int over, int rcvbuf)
 {  {
         void *addr;          void *addr;
         int fd;          int fd;
        size_t len;        size_t len = 0;
         register size_t off = 0;
         struct pollfd pfd = { s, POLLIN | POLLPRI, 0 };
   
         if (!csFile || !recvLen)          if (!csFile || !recvLen)
                 return 0;                  return 0;
         if (!over && !access(csFile, F_OK))          if (!over && !access(csFile, F_OK))
                 return 0;                  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);          fd = open(csFile, O_WRONLY | O_CREAT | O_TRUNC, over);
         if (fd == -1) {          if (fd == -1) {
                 LOGERR;                  LOGERR;
Line 689  ioRecvFile(int s, const char *csFile, size_t recvLen,  Line 719  ioRecvFile(int s, const char *csFile, size_t recvLen, 
         } else          } else
                 close(fd);                  close(fd);
   
        len = read(s, addr, recvLen);        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) {          if (len == -1) {
                 LOGERR;                  LOGERR;
                 munmap(addr, recvLen);                  munmap(addr, recvLen);
                 unlink(csFile);                  unlink(csFile);
                 return 0;                  return 0;
        }        } else
                 len = off;
   
         if (len != recvLen)          if (len != recvLen)
                 io_SetErr(EAGAIN, "Different sizes - request %u bytes, actually received %u bytes\n",                   io_SetErr(EAGAIN, "Different sizes - request %u bytes, actually received %u bytes\n", 

Removed from v.1.7.2.1  
changed lines
  Added in v.1.9


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