Diff for /libaitio/inc/aitio.h between versions 1.8 and 1.18

version 1.8, 2011/04/20 22:56:32 version 1.18, 2012/05/19 00:00:12
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.
 #define __AITIO_H  #define __AITIO_H
   
   
   #define COMPAT_43TTY
   
 #include <assert.h>  #include <assert.h>
 #include <openssl/evp.h>  #include <openssl/evp.h>
   #include <openssl/aes.h>
   #include <sys/tty.h>
   #include <sys/ioctl_compat.h>
   #include <sys/socket.h>
   #include <sys/un.h>
   #include <net/if_dl.h>
   #include <netinet/in.h>
   
   
 #define VACUUM_LEFT     1  #define VACUUM_LEFT     1
 #define VACUUM_BETWEEN  2  #define VACUUM_BETWEEN  2
   
   /* AIT arrays */
   
   typedef void ** sarr_seg_t;
   typedef struct _tagSplitArray {
           int             sarr_num;
           int             sarr_seg;
           int             sarr_siz;
           sarr_seg_t      *sarr_data;
   } sarr_t;
   
 typedef struct _tagArray {  typedef struct _tagArray {
           int     arr_last;
         int     arr_num;          int     arr_num;
         void    **arr_data;          void    **arr_data;
 } array_t;  } array_t;
   
typedef struct _tagURLItem {/* AIT RPC variables and managment */
        int     vallen; 
        char    *value; 
} url_Item_t; 
   
struct tagIOURL {typedef enum {
        unsigned char    url_line[BUFSIZ];        empty, ptr, data,               /* empty -> variable is not set; ptr -> void*; data -> data after struct  */
         buffer, string, blob,           /* buffer -> uint8_t*; string -> int8_t*; blob -> uint32_t blobID(+socket); */
         f32, f64,                       /* float -> f32; double -> f64 */
         u8, u16, u32, u64,              /* unsigned integers ... */
         i8, i16, i32, i64,              /* integers ... */
 } ait_type_t;
   
        url_Item_t      url_tech;typedef struct {
        url_Item_t      url_user;        uint8_t         val_type;
        url_Item_t      url_pass;        uint8_t         val_pad;
        url_Item_t      url_host;        uint16_t        val_key;
        url_Item_t      url_port;        uint32_t        val_len;
        url_Item_t      url_path;        union {
        url_Item_t      url_args;                uint64_t        net;
   
        char            *url_reserved;                void            *ptr;
};                uint8_t         *buffer;
                 int8_t          *string;
                 uint32_t        blob;
                 float           f32;
                 double          f64;
                 uint8_t         u8;
                 uint16_t        u16;
                 uint32_t        u32;
                 uint64_t        u64;
                 int8_t          i8;
                 int16_t         i16;
                 int32_t         i32;
                 int64_t         i64;
         } val;
         uint8_t         val_data[0];
 } __packed ait_val_t;
   
struct tagReqXML {#define AIT_TYPE(_vl)                   ((ait_type_t) (_vl)->val_type)
        unsigned char   xml_line[BUFSIZ];#define AIT_LEN(_vl)                    (_vl)->val_len
 #define AIT_KEY(_vl)                    (_vl)->val_key
 #define AIT_RAW(_vl)                    (_vl)->val.net
 #define AIT_ADDR(_vl)                   (_vl)->val.ptr
 #define AIT_BLOB_CHUNKS(_vl, _n)        (AIT_LEN((_vl)) / _n + (AIT_LEN((_vl)) % _n) ? 1 : 0)
 #define AIT_ISEMPTY(_vl)                (AIT_TYPE((_vl)) == empty)
   
        url_Item_t      xml_namespace;#define AIT_GET_LIKE(_vl, _type)        ((_type) AIT_ADDR((_vl)))
        union {
                url_Item_t      container;#define AIT_GET_PTR(_vl)                (assert(AIT_TYPE((_vl)) == ptr), (_vl)->val.ptr)
                url_Item_t      path;#define AIT_GET_DATA(_vl)               (assert(AIT_TYPE((_vl)) == data), (_vl)->val_data)
        }               xml_node;#define AIT_GET_BUF(_vl)                (assert(AIT_TYPE((_vl)) == buffer), (_vl)->val.buffer)
        url_Item_t      xml_data;#define AIT_GET_STR(_vl)                (assert(AIT_TYPE((_vl)) == string), (char*) (_vl)->val.string)
        url_Item_t      xml_attribute;#define AIT_GET_BLOB(_vl)               (assert(AIT_TYPE((_vl)) == blob), (_vl)->val.blob)
        url_Item_t      xml_value;#define AIT_GET_U8(_vl)                 (assert(AIT_TYPE((_vl)) == u8), (_vl)->val.u8)
 #define AIT_GET_U16(_vl)                (assert(AIT_TYPE((_vl)) == u16), (_vl)->val.u16)
 #define AIT_GET_U32(_vl)                (assert(AIT_TYPE((_vl)) == u32), (_vl)->val.u32)
 #define AIT_GET_U64(_vl)                (assert(AIT_TYPE((_vl)) == u64), (_vl)->val.u64)
 #define AIT_GET_I8(_vl)                 (assert(AIT_TYPE((_vl)) == i8), (_vl)->val.i8)
 #define AIT_GET_I16(_vl)                (assert(AIT_TYPE((_vl)) == i16), (_vl)->val.i16)
 #define AIT_GET_I32(_vl)                (assert(AIT_TYPE((_vl)) == i32), (_vl)->val.i32)
 #define AIT_GET_I64(_vl)                (assert(AIT_TYPE((_vl)) == i64), (_vl)->val.i64)
 #define AIT_GET_F32(_vl)                (assert(AIT_TYPE((_vl)) == f32), (_vl)->val.f32)
 #define AIT_GET_F64(_vl)                (assert(AIT_TYPE((_vl)) == f64), (_vl)->val.f64)
 
 #define AIT_SET_DATA(_vl, _p, _len)     do { ait_val_t *__val = (_vl); \
                                                 __val = realloc(__val, sizeof(ait_val_t) + _len); \
                                                 if (__val) { \
                                                         __val->val_type = data; AIT_LEN(__val) = _len; \
                                                         if ((_p)) \
                                                                 memcpy(__val->val_data, (_p), _len); \
                                                 } \
                                                 (_vl) = __val; \
                                         } while (0);
 #define AIT_SET_PTR(_vl, _p, _len)      do { ait_val_t *__val = (_vl); assert(__val); \
                                                 __val->val_type = ptr; AIT_LEN(__val) = _len; \
                                                 __val->val.ptr = _p; } while (0)
 #define AIT_RE_BUF(_vl, _len)           do { ait_val_t *__val = (_vl); assert(__val); \
                                                 void *__ptr = realloc(AIT_GET_BUF(__val), _len); \
                                                 if (__ptr) { \
                                                         __val->val.buffer = __ptr; AIT_LEN(__val) = _len; \
                                                 } } while (0)
 #define AIT_SET_BUF2(_vl, _c, _len)     do { ait_val_t *__val = (_vl); assert(__val); \
                                                 __val->val.buffer = malloc(_len); \
                                                 if (__val->val.buffer) { \
                                                         __val->val_type = buffer; AIT_LEN(__val) = _len; \
                                                         memset(__val->val.buffer, _c, _len); \
                                                 } } while (0)
 #define AIT_SET_BUF(_vl, _v, _len)      do { ait_val_t *__val = (_vl); assert(__val); \
                                                 __val->val.buffer = malloc(_len); \
                                                 if (__val->val.buffer) { \
                                                         __val->val_type = buffer; AIT_LEN(__val) = _len; \
                                                         if ((_v)) \
                                                                 memcpy(__val->val.buffer, (_v), _len); \
                                                         else \
                                                                 memset(__val->val.buffer, 0, _len); \
                                                 } } while (0)
 #define AIT_SET_STR(_vl, _v)            do { ait_val_t *__val = (_vl); assert(__val && (_v)); \
                                                 __val->val.string = (int8_t*) strdup((_v)); \
                                                 if (__val->val.string) { \
                                                         __val->val_type = string; \
                                                         AIT_LEN(__val) = strlen((_v)) + 1; \
                                                 } } while (0)
 #define AIT_SET_STRCAT(_vl, _v)         do { ait_val_t *__val = (_vl); assert(__val); \
                                                 assert(AIT_TYPE(__val) == string); \
                                                 void *__p = realloc(__val->val.string, \
                                                                 AIT_LEN(__val) + strlen((_v))); \
                                                 if (__p) { \
                                                         __val->val.string = __p; \
                                                         AIT_LEN(__val) += strlen((_v)); \
                                                         strlcat((char*) __val->val.string, (_v), \
                                                                         AIT_LEN(__val)); \
                                                 } } while (0)
 #define AIT_SET_BLOB(_vl, _n, _len)     do { ait_val_t *__val = (_vl); assert(__val); \
                                                 __val->val_type = blob; AIT_LEN(__val) = _len; \
                                                 __val->val.blob = _n; } while (0)
 #define AIT_SET_BLOB2(_vl, _bv)         do { ait_val_t *__val = (_vl); assert(__val); assert((_bv)); \
                                                 __val->val_type = blob; AIT_LEN(__val) = (_bv)->blob_len; \
                                                 __val->val.blob = (_bv)->blob_var; } while (0)
 #define AIT_NEW_BLOB(_vl, _len)         AIT_SET_BLOB((_vl), 0, _len)
 
 #define AIT_SET_U8(_vl, _n)             do { ait_val_t *__val = (_vl); assert(__val); \
                                                 __val->val_type = u8; __val->val.u8 = _n; \
                                                 AIT_LEN(__val) = sizeof(uint8_t); } while (0)
 #define AIT_SET_U16(_vl, _n)            do { ait_val_t *__val = (_vl); assert(__val); \
                                                 __val->val_type = u16; __val->val.u16 = _n; \
                                                 AIT_LEN(__val) = sizeof(uint16_t); } while (0)
 #define AIT_SET_U32(_vl, _n)            do { ait_val_t *__val = (_vl); assert(__val); \
                                                 __val->val_type = u32; __val->val.u32 = _n; \
                                                 AIT_LEN(__val) = sizeof(uint32_t); } while (0)
 #define AIT_SET_U64(_vl, _n)            do { ait_val_t *__val = (_vl); assert(__val); \
                                                 __val->val_type = u64; __val->val.u64 = _n; \
                                                 AIT_LEN(__val) = sizeof(uint64_t); } while (0)
 #define AIT_SET_I8(_vl, _n)             do { ait_val_t *__val = (_vl); assert(__val); \
                                                 __val->val_type = i8; __val->val.i8 = _n; \
                                                 AIT_LEN(__val) = sizeof(int8_t); } while (0)
 #define AIT_SET_I16(_vl, _n)            do { ait_val_t *__val = (_vl); assert(__val); \
                                                 __val->val_type = i16; __val->val.i16 = _n; \
                                                 AIT_LEN(__val) = sizeof(int16_t); } while (0)
 #define AIT_SET_I32(_vl, _n)            do { ait_val_t *__val = (_vl); assert(__val); \
                                                 __val->val_type = i32; __val->val.i32 = _n; \
                                                 AIT_LEN(__val) = sizeof(int32_t); } while (0)
 #define AIT_SET_I64(_vl, _n)            do { ait_val_t *__val = (_vl); assert(__val); \
                                                 __val->val_type = i64; __val->val.i64 = _n; \
                                                 AIT_LEN(__val) = sizeof(int64_t); } while (0)
 #define AIT_SET_F32(_vl, _n)            do { ait_val_t *__val = (_vl); assert(__val); \
                                                 __val->val_type = f32; __val->val.f32 = _n; \
                                                 AIT_LEN(__val) = sizeof(float); } while (0)
 #define AIT_SET_F64(_vl, _n)            do { ait_val_t *__val = (_vl); assert(__val); \
                                                 __val->val_type = f64; __val->val.f64 = _n; \
                                                 AIT_LEN(__val) = sizeof(double); } while (0)
 
 #define AIT_COPY_VAL(_vl, _v)           do { memcpy((_vl), (_v), sizeof(ait_val_t)); \
                                                 switch (AIT_TYPE((_vl))) { \
                                                         case buffer: \
                                                                 AIT_SET_BUF((_vl), AIT_GET_BUF((_v)), AIT_LEN((_v))); \
                                                                 break; \
                                                         case string: \
                                                                 AIT_SET_STR((_vl), AIT_GET_STR((_v))); \
                                                                 break; \
                                                         default: \
                                                                 break; \
                                                 } \
                                         } while (0)
 #define AIT_COPY_VAL2(_vl, _v)          do { AIT_COPY_VAL((_vl), (_v)); \
                                                 if (AIT_TYPE((_vl)) == data) \
                                                         AIT_SET_DATA((_vl), AIT_GET_DATA((_v)), AIT_LEN((_v))); \
                                         } while (0)
 
 #define AIT_INIT_VAL(_vl)               (memset((_vl), 0, sizeof(ait_val_t)))
                                         /* if attribute zeroCopy is set not execute free() */
 #define AIT_FREE_VAL(_vl)               do { ait_val_t *__val = (_vl); assert(__val); \
                                                 switch (AIT_TYPE(__val)) { \
                                                         case buffer: \
                                                                 if (__val->val.buffer) { \
                                                                         free(__val->val.buffer); \
                                                                         __val->val.buffer = NULL; \
                                                                 } \
                                                                 break; \
                                                         case string: \
                                                                 if (__val->val.string) { \
                                                                         free(__val->val.string); \
                                                                         __val->val.string = NULL; \
                                                                 } \
                                                                 break; \
                                                         default: \
                                                                 break; \
                                                 } \
                                                 __val->val_type = empty; \
                                                 AIT_LEN(__val) = 0; \
                                         } while (0)
 
 struct io_ether_addr {
         u_int8_t ether_addr_octet[6];
 };  };
   typedef struct io_ether_addr io_ether_addr_t;
   
   typedef union {
           struct sockaddr_storage ss;
           struct sockaddr         sa;
           struct sockaddr_un      sun;
           struct sockaddr_in      sin;
           struct sockaddr_in6     sin6;
           struct sockaddr_dl      sdl;
   } io_sockaddr_t;
   
   
   #define io_align(x, a)          (((x) + (a)) & ~(a))
   
   
 // io_GetErrno() Get error code of last operation  // io_GetErrno() Get error code of last operation
 inline int io_GetErrno();  inline int io_GetErrno();
 // io_GetError() Get error text of last operation  // io_GetError() Get error text of last operation
Line 100  inline const char *io_GetError(); Line 293  inline const char *io_GetError();
   
   
 /*  /*
 * ioPromptRead() Read data from input h[0] with prompt to output h[1] * io_ether_ntoa() - Convert ethernet address to string
  *
  * @n = ethernet address structure, like struct ether_addr
  * @a = string
  * @len = string length
  * return: NULL error or !=NULL string a
  */
 inline char *io_ether_ntoa(const struct io_ether_addr *n, char * __restrict a, int len);
 /*
  * io_ether_aton() - Convert string to ethernet address
  *
  * @a = string
  * @e = ethernet address structure, like struct ether_addr
  * return: NULL error or !=NULL ethernet address structure
  */
 inline struct io_ether_addr *io_ether_aton(const char *a, struct io_ether_addr *e);
 /*
  * io_n2port() - Extract port from network structure
  *
  * @addr = Address
  * return: 0 not supported family type or port number
  */
 inline u_short io_n2port(io_sockaddr_t * __restrict addr);
 /*
  * io_n2addr() - Extract address from network structure
  *
  * @addr = Address
  * @val = Value for store string address
  * return: NULL error or !=NULL string address from val
  */
 const char *io_n2addr(io_sockaddr_t * __restrict addr, ait_val_t * __restrict val);
 /*
  * io_gethostbyname() - Get host and port and make network structure
  *
  * @psHost = Hostname
  * @port = Port
  * @addr = Network address structure
  * return: NULL error or !=NULL network structure
  */
 io_sockaddr_t *io_gethostbyname(const char *psHost, unsigned short port, 
                 io_sockaddr_t * __restrict addr);
 
 /*
  * io_vars2buffer() - Marshaling data from array with variables to buffer
  *
  * @buf = Buffer
  * @buflen = Size of buffer
  * @vars = Variable array
  * return: -1 error, 0 nothing done or >0 size of marshaled data
  */
 int io_vars2buffer(unsigned char *buf, int buflen, array_t *vars);
 /*
  * io_buffer2vars() - De-marshaling data from buffer to array with variables
  *
  * @buf = Buffer
  * @buflen = Size of buffer
  * @vnum = Number of variables into buffer
  * @zcpy = Zero-copy for variables, if !=0 don't use io_arrayFree() for free variables and 
                 *DON'T MODIFY OR DESTROY BUFFER*. =0 call io_arrayFree() before io_arrayDestroy()
  * return: =NULL error, !=NULL allocated variable array, after use must free with io_arrayDestroy()
  */
 array_t *io_buffer2vars(unsigned char *buf, int buflen, int vnum, int zcpy);
 /*
  * io_vars2map() - Marshaling data from array with variables to memory map
  *
  * @buf = Buffer
  * @buflen = Size of buffer
  * @vars = Variable array
  * return: -1 error, 0 nothing done or >0 size of marshaled data
  */
 int io_vars2map(unsigned char *buf, int buflen, array_t *vars);
 /*
  * io_map2vars() - De-marshaling data from memory map to array with variables
  *
  * @buf = Buffer
  * @buflen = Size of buffer
  * @vnum = Number of variables into buffer
  * @zcpy = Zero-copy for variables, if !=0 don't use io_arrayFree() for free variables and 
                 *DON'T MODIFY OR DESTROY BUFFER*. =0 call io_arrayFree() before io_arrayDestroy()
  * return: =NULL error, !=NULL allocated variable array, after use must free with io_arrayDestroy()
  */
 array_t *io_map2vars(unsigned char *buf, int buflen, int vnum, int zcpy);
 
 /*
  * io_allocVar() - Allocate memory for variable
  *
  * return: NULL error or new variable, after use free variable with io_freeVar()
  */
 inline ait_val_t *io_allocVar(void);
 /*
  * io_freeVar() - Free allocated memory for variable
  *
  * @val = Variable
  * return: none
  */
 inline void io_freeVar(ait_val_t ** __restrict val);
 /*
  * io_allocVars() - Allocate ait_val_t array
  *
  * @varnum = Number of variables
  * return: =NULL error or !=NULL allocated array
  */
 inline array_t *io_allocVars(int varnum);
 /*
  * io_clrVars() - Clear ait_val_t elements from array
  *
  * @vars = Variable array
  * return: -1 error or size of array
  */
 inline int io_clrVars(array_t * __restrict vars);
 /*
  * io_freeVars() - Free ait_val_t array
  *
  * @vars = Variable array
  * return: none
  */
 inline void io_freeVars(array_t ** __restrict vars);
 /*
  * io_getVars() - Get ait_val_t element from array and if not exists allocate it
  *
  * @vars = Variable array
  * @n = index of variable into array
  * return: NULL error or !=NULL ait_val_t element
  */
 inline ait_val_t *io_getVars(array_t ** __restrict vars, int n);
 /*
  * io_sortVars() - Sorting array with variables
  *
  * @vars = Variable array
  * @order = Sort order. If =0 ascend ot !=0 descend
  * @cmp = Compare function for sorting. If =NULL compare by key
  * return: none
  */
 inline void io_sortVars(array_t * __restrict vars, int order, 
                 int (*cmp)(const void*, const void*));
 /*
  * io_findKeyVars() - Find variable by key from array
  *
  * @vars = Variables
  * @key = Search key
  * return: NULL error or not found, !=NULL valid element
  */
 ait_val_t *io_findKeyVars(array_t * __restrict vars, u_short key);
 
 
 /*
  * 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 109  inline const char *io_GetError(); Line 449  inline const char *io_GetError();
 */  */
 int ioPromptRead(int *h, const char *csPrompt, char * __restrict psData, int dataLen);  int ioPromptRead(int *h, const char *csPrompt, char * __restrict psData, int dataLen);
 /*  /*
 * 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 120  int ioPromptRead(int *h, const char *csPrompt, char *  Line 461  int ioPromptRead(int *h, const char *csPrompt, char * 
 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);
   
 /*  /*
 * 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 129  int ioPromptPassword(int *h, const char *csPrompt, cha Line 471  int ioPromptPassword(int *h, const char *csPrompt, cha
 */  */
 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);
 /*  /*
 * 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 138  const char *ioRegexVerify(const char *csRegex, const c Line 481  const char *ioRegexVerify(const char *csRegex, const c
 */  */
 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);
 /*  /*
 * 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 147  int ioRegexGet(const char *csRegex, const char *csData Line 491  int ioRegexGet(const char *csRegex, const char *csData
 char *ioRegexReplace(const char *csRegex, const char *csData, const char *csNew);  char *ioRegexReplace(const char *csRegex, const char *csData, const char *csNew);
   
 /*  /*
 * 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 *ioVarAst(const char *csString);char *ioStrAst(const char *csString);
   
 /*  /*
 * io_Path2File() Parse and make path/filename pair * io_UnquotStr() - Remove quots from input text string 
 * @csArgs = Input argument line *
 * @psPath = Output Path, if ==NULL path not returned 
 * @pathLen = Size of path array 
 * @psFile = Output File 
 * @fileLen = Size of file array 
 * return: 0 error format; -1 error:: can`t read; >0 ok, number of readed items 
*/ 
inline int io_Path2File(const char * __restrict csArgs, char * __restrict psPath, int pathLen,  
                char * __restrict psFile, int fileLen); 
 
/* 
 * 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 io_UnquotStr(unsigned char * __restrict psLine);inline int io_UnquotStr(char * __restrict psLine);
 /*  /*
 * 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 io_LTrimStr(unsigned char * __restrict psLine);inline int io_LTrimStr(char * __restrict psLine);
 /*  /*
 * 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 io_RTrimStr(unsigned char * __restrict psLine);inline int io_RTrimStr(char * __restrict psLine);
 /*  /*
 * 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 io_TrimStr(unsigned char * __restrict psLine);inline int io_TrimStr(char * __restrict psLine);
 /*  /*
 * 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 free)
 */  */
 inline unsigned char *io_Ch2Hex(unsigned char *psLine, int lineLen);  inline unsigned char *io_Ch2Hex(unsigned 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 free)
Line 205  inline unsigned char *io_Ch2Hex(unsigned char *psLine, Line 544  inline unsigned char *io_Ch2Hex(unsigned char *psLine,
 inline char *io_Hex2Ch(unsigned char *psLine, int lineLen);  inline char *io_Hex2Ch(unsigned char *psLine, int lineLen);
   
 /*  /*
    * io_Path2File() - Parse and make path/filename pair
    *
    * @csArgs = Input argument line
    * @psPath = Output Path, if ==NULL path not returned
    * @pathLen = Size of path array
    * @psFile = Output File
    * @fileLen = Size of file array
    * return: 0 error format; -1 error:: can`t read; >0 ok, number of readed items
    */
   inline int
   io_Path2File(const char * __restrict csArgs, char * __restrict psPath, 
                   int pathLen, char * __restrict psFile, int fileLen);
   
   /*
  * io_arrayInit() - Create and initialize dynamic array   * io_arrayInit() - Create and initialize dynamic array
    *
  * @numItems = Number of Items   * @numItems = Number of Items
  * return: NULL error, != NULL allocated memory for array   * return: NULL error, != NULL allocated memory for array
  */   */
 inline array_t *io_arrayInit(int numItems);  inline array_t *io_arrayInit(int numItems);
 /*  /*
 * io_arrayDestroy() - Free all data in dynamic array and Destroy dynamic array * io_arrayDestroy() - Free and destroy dynamic array
  *
  * @parr = Array   * @parr = Array
  * return: none   * return: none
  */   */
 inline void io_arrayDestroy(array_t ** __restrict parr);  inline void io_arrayDestroy(array_t ** __restrict parr);
 /*  /*
 * io_arrayFree() - Free all data in dynamic array * io_arrayFree() - Free all data in dynamic array items
  *      (WARNING! If assign static array dont use this!!!)   *      (WARNING! If assign static array dont use this!!!)
    *
  * @arr = Array   * @arr = Array
  * return: none   * return: none
  */   */
 inline void io_arrayFree(array_t * __restrict arr);  inline void io_arrayFree(array_t * __restrict arr);
 /*  /*
    * io_arrayFrom() - Create and fill array from array with pointers
    *
    * @pargv = Array with pointers
    * @argc = Number of Items, if 0 walk through argv and stop when reach NULL item
    * return: NULL error, != NULL allocated new array
    */
   inline array_t *io_arrayFrom(const char *** __restrict pargv, int argc);
   /*
    * io_arrayTo() - Create and fill array with pointers from dynamic array
    *
    * @arr = Array
    * return: NULL error, != NULL allocated memory for array, NULL terminated
    */
   inline char **io_arrayTo(array_t * __restrict arr);
   /*
  * io_arrayLen() - Get last used element in dynamic array (array Length)   * io_arrayLen() - Get last used element in dynamic array (array Length)
    *
  * @arr = Array   * @arr = Array
 * return: -1 error, 0 empty or >0 position of last used element * return: -1 empty or >-1 position of last used element
  */   */
 inline int io_arrayLen(array_t * __restrict arr);  inline int io_arrayLen(array_t * __restrict arr);
 /*  /*
    * io_arrayConcat() Concat source array to destination array
    *
    * @dest = Destination array
    * @src = Source array
    * return: -1 error; >0 new count of destination array
    */
   int io_arrayConcat(array_t * __restrict dest, array_t * __restrict src);
   /*
    * io_arrayCopy() Copy source array to destination array
    *
    * @dest = Destination array, after use free with io_arrayDestroy()
    * @src = Source array
    * return: -1 error; >0 count of destination array
    */
   int io_arrayCopy(array_t ** __restrict dest, array_t * __restrict src);
   /*
  * io_arrayGrow() - Grow/Shrink dynamic array, Use with care when it shrink!!!   * io_arrayGrow() - Grow/Shrink dynamic array, Use with care when it shrink!!!
    *
  * @arr = Array   * @arr = Array
  * @newNumItems = Number of Items   * @newNumItems = Number of Items
    * @freeShrink = Free elements before shrink array
  * return: -1 error, 0 ok   * return: -1 error, 0 ok
  */   */
int io_arrayGrow(array_t * __restrict arr, int newNumItems);int io_arrayGrow(array_t * __restrict arr, int newNumItems, int freeShrink);
 /*  /*
  * io_arrayVacuum() - Vacuum dynamic array, empty elements will be deleted   * io_arrayVacuum() - Vacuum dynamic array, empty elements will be deleted
    *
  * @arr = Array   * @arr = Array
  * @fromWhere = 1 begin, 2 ALL empty elements   * @fromWhere = 1 begin, 2 ALL empty elements
  * return: -1 error, 0 ok   * return: -1 error, 0 ok
  */   */
 int io_arrayVacuum(array_t * __restrict arr, int fromWhere);  int io_arrayVacuum(array_t * __restrict arr, int fromWhere);
   
#define io_arraySize(_arr)              ((assert(_arr)), _arr->arr_num)#define io_arraySize(_arr)              ((_arr) ? (_arr)->arr_num : 0)
 #define io_arrayLast(_arr)              (io_arraySize((_arr)) ? (_arr)->arr_last : -1)
 #define io_arrayZero(_arr)              (assert((_arr)), memset((_arr)->arr_data, 0, \
                                                 io_arraySize((_arr)) * sizeof(void*)))
   
#define io_arrayGet(_arr, _d, _type)        ((assert(_arr && _arr->arr_num > _d)), \#define io_arrayGet2(_arr, _d)          (assert((_arr) && (_arr)->arr_num > _d), ((_arr)->arr_data + _d))
                                                ((_type) *(_arr->arr_data + _d)))#define io_arrayGet(_arr, _d)                (assert((_arr) && (_arr)->arr_num > _d), (_arr)->arr_data[_d])
 #define io_array(_arr, _d, _type)       (assert((_arr) && (_arr)->arr_num > _d), \
                                                 ((_type) (_arr)->arr_data[_d]))
 #define io_arraySet(_arr, _d, _ptr)     do { \  #define io_arraySet(_arr, _d, _ptr)     do { \
                                                assert(_arr && _arr->arr_num > _d); \                                                assert((_arr) && (_arr)->arr_num > _d); \
                                                *(_arr->arr_data + _d) = (void*) _ptr; \                                                if ((_arr)->arr_last < _d) \
                                                         (_arr)->arr_last = _d; \
                                                 (_arr)->arr_data[_d] = (void*) (_ptr); \
                                         } while (0)                                          } while (0)
   #define io_arrayDel(_arr, _d, _fri)     do { \
                                                   assert((_arr) && (_arr)->arr_num > _d); \
                                                   if (_fri && (_arr)->arr_data[_d]) \
                                                           free((_arr)->arr_data[_d]); \
                                                   (_arr)->arr_data[_d] = NULL; \
                                           } while (0)
   
 /*  /*
    * io_arrayElem() - Always GET/PUT element into dynamic array, if not enough elements grow array
    *
    * @arr = Array
    * @n = Position
    * @data = Element, if set NULL GET element at position or !=NULL PUT element at position
    * return: -1 error or !=-1 return element at position
    */
   inline void *io_arrayElem(array_t * __restrict arr, int n, void *data);
   /*
  * io_arrayPush() - Push element into dynamic array like stack manner, place at first empty position   * io_arrayPush() - Push element into dynamic array like stack manner, place at first empty position
    *
  * @arr = Array   * @arr = Array
  * @data = Element, if set NULL return only first empty position   * @data = Element, if set NULL return only first empty position
    * @mayGrow = Array may to grow, if not enough room for new element
  * return: -1 not found empty position, array is full!, >-1 return position of stored element into array   * return: -1 not found empty position, array is full!, >-1 return position of stored element into array
  */   */
inline int io_arrayPush(array_t * __restrict arr, void **data);inline int io_arrayPush(array_t * __restrict arr, void **data, int mayGrow);
 /*  /*
  * io_arrayPop() - Pop element from dynamic array like stack manner, last used position   * io_arrayPop() - Pop element from dynamic array like stack manner, last used position
    *
  * @arr = Array   * @arr = Array
 * @data = Element, if set NULL return only first empty position * @data = Element, if set NULL return only last used position
  * @delAfter = Delete after Pop element, !=0 delete element from array after return data   * @delAfter = Delete after Pop element, !=0 delete element from array after return data
  * return: -1 not found used position, array is empty!, >-1 return element position   * return: -1 not found used position, array is empty!, >-1 return element position
  */   */
 inline int io_arrayPop(array_t * __restrict arr, void ** __restrict data, int delAfter);  inline int io_arrayPop(array_t * __restrict arr, void ** __restrict data, int delAfter);
   
 /*  /*
 * io_argsNum() Parse and calculate number of arguments * io_argsNum() - Parse and calculate number of arguments
  *
  * @csArgs = Input arguments line   * @csArgs = Input arguments line
  * @csDelim = Delimiter(s) for separate   * @csDelim = Delimiter(s) for separate
  * return: 0 error format; -1 error:: can`t read; >0 ok, number of items   * return: 0 error format; -1 error:: can`t read; >0 ok, number of items
Line 278  inline int io_arrayPop(array_t * __restrict arr, void  Line 695  inline int io_arrayPop(array_t * __restrict arr, void 
 inline int io_argsNum(const char *csArgs, const char *csDelim);  inline int io_argsNum(const char *csArgs, const char *csDelim);
   
 /*  /*
 * io_arrayMake() Parse and make array from arguments ... (input string will be modified!!!  * io_arrayMake() - Parse and make array from arguments ... (input string will be modified!!! 
  *      and output array must be free with io_arrayDestroy() after use!)   *      and output array must be free with io_arrayDestroy() after use!)
    *
  * @psArgs = Input arguments line, after execute string is modified!!!   * @psArgs = Input arguments line, after execute string is modified!!!
  * @nargs = Maximum requested count of arguments from input string psArgs, if 0 all psArgs   * @nargs = Maximum requested count of arguments from input string psArgs, if 0 all psArgs
  * @csDelim = Delimiter(s) for separate   * @csDelim = Delimiter(s) for separate
Line 290  int io_arrayMake(char * __restrict psArgs, int nargs,  Line 708  int io_arrayMake(char * __restrict psArgs, int nargs, 
                 array_t ** __restrict parr);                  array_t ** __restrict parr);
   
 /*  /*
 * io_MakeAV() Parse and make attribute/value pair * io_MakeAV() - Parse and make attribute/value pair
  *
  * @csArgs = Input argument line   * @csArgs = Input argument line
  * @csDelim = Delimiter for separate   * @csDelim = Delimiter for separate
  * @psAttr = Output Attribute   * @psAttr = Output Attribute
Line 302  int io_arrayMake(char * __restrict psArgs, int nargs,  Line 721  int io_arrayMake(char * __restrict psArgs, int nargs, 
 int io_MakeAV(const char * __restrict csArgs, const char *csDelim,   int io_MakeAV(const char * __restrict csArgs, const char *csDelim, 
                 char * __restrict psAttr, int attrLen, char * __restrict psValue, int valLen);                  char * __restrict psAttr, int attrLen, char * __restrict psValue, int valLen);
   
   /*
    * io_sarrInit() - Create and initialize dynamic split-order array
    *
    * @numItems = Number of Items
    * @segLen = Length of segment
    * return: NULL error, != NULL allocated memory for array
    */
   inline sarr_t *io_sarrInit(int numItems, int segLen);
   /*
    * io_sarrDestroy() - Free all data in dynamic split-order array and Destroy array
    *
    * @parr = Array
    * return: none
    */
   inline void io_sarrDestroy(sarr_t ** __restrict parr);
   /*
    * io_sarrGrow() - Grow/Shrink dynamic split-order array, Use with care when it shrink!!!
    *
    * @arr = Array
    * @newNumItems = Number of Items
    * return: -1 error, 0 ok
    */
   int io_sarrGrow(sarr_t * __restrict arr, int newNumItems);
   /*
    * io_sarrVacuum() - Vacuum dynamic split-order array, empty segments will be freed
    *
    * @arr = Array
    * return: -1 error, >-1 freed segments
    */
   inline int io_sarrVacuum(sarr_t * __restrict arr);
   #define io_sarrSize(_arr)               ((_arr) ? (_arr)->sarr_num : 0)
   #define io_sarrSeg(_arr)                (assert((_arr)), (_arr)->sarr_seg)
   /*
    * io_sarrCopy() Copy source split array to destination split array
    *
    * @dest = Destination split array, after use free with io_sarrDestroy()
    * @src = Source split array
    * return: -1 error; >0 count of destination split array
    */
   int io_sarrCopy(sarr_t ** __restrict dest, sarr_t * __restrict src);
   /*
    * io_sarrGet() - Get element from dynamic split-order array
    *
    * @arr = Array
    * @idx = Index (warning 1st element is at position 1)
    * return: NULL not found, !=NULL element
    */
   inline void *io_sarrGet(sarr_t * __restrict arr, unsigned int idx);
   /*
    * io_sarrGet2() - Always get element from dynamic split-order array
    *      Function automatic grow array. Good use for Hash tables! 
    *
    * @arr = Array
    * @idx = Index (warning 1st element is at position 1)
    * return: NULL not found, !=NULL element
    */
   void *io_sarrGet2(sarr_t * __restrict arr, unsigned int idx);
   /*
    * io_sarrSet() - Set element to dynamic split-order array
    *
    * @arr = Array
    * @idx = Index (warning 1st element is at position 1)
    * @data = Value
    * return: NULL error or empty, !=NULL old value in element
    */
   inline void *io_sarrSet(sarr_t * __restrict arr, unsigned int idx, void *data);
   #define io_sarrDel(_arr, _idx)          io_sarrSet((_arr), _idx, NULL)
   #define io_sarr(_arr, _idx, _type)      (_type)io_sarrGet((_arr), _idx)
   /*
    * io_sarr2array() - Convert from split-order array to dynamic array
    *
    * @sa = split array
    * @sarrFree = after convert split array !=0 will be destroyed sarray
    * return: NULL error or != NULL new array
    */
   array_t *io_sarr2array(sarr_t ** __restrict sa, int sarrFree);
   /*
    * io_array2sarr() - Convert from dynamic array to split-order array
    *
    * @a = array
    * @segLen = Length of segment
    * @arrFree = after convert array !=0 will be destroyed
    * return: NULL error or != NULL new sarr
    */
   sarr_t *io_array2sarr(array_t ** __restrict a, int segLen, int arrFree);
   
 /*  /*
 * ioURLGet() Parse and get data from input URL * io_CopyEnv() - Copy environment to new environment array;
 * @csURL = Input URL line *
 * @url = Output parsed URL * @oldenv = Environment array
 * return: 0 error format not find tech:// and return URL like path;  * return: NULL error; !=NULL Allocated new environment array(must be free)
                -1 error:: can`t read; >0 ok, up bits for known elements 
 */  */
int ioURLGet(const char *csURL, struct tagIOURL *url);char **io_CopyEnv(const char **oldenv);
 /*  /*
 * ioURLGetValue() Get value from parsed URL * io_ExecArgs() - Build exec arguments from other array
 * @url = Input parsed URL *
 * @csAttr = Attribute for search * @psProg = Program name for execute
 * @psValue = Return value of attribute, if ==NULL only check for existence of attribute * @oldarg = Arguments array
 * @valLen = Size of psValue array * return: NULL error; !=NULL Allocated execution array(must be free)
 * return: 0 error attribute not find; -1 error:: can`t read; >0 ok, find at position 
 */  */
int ioURLGetValue(struct tagIOURL *url, const char *csAttr, char * __restrict psValue, int valLen);char **io_ExecArgs(const char *psProg, const char **oldarg);
 /*  /*
 * ioURLGetFile() Get file from parsed URL * io_FreeNullTerm() - Free dynamic allocated null terminated array with strings
 * @url = Input parsed URL *
 * @psValue = Return filename, if not specified file in url path, replace with / * @arr = Pointer to array for free
 * @valLen = Size of psValue array * return: none
 * return: -1 error:: can`t read; 0 ok 
 */  */
int ioURLGetFile(struct tagIOURL *url, char * __restrict psValue, int valLen);inline void io_FreeNullTerm(char *** __restrict arr);
   
   
 /*  /*
 * ioXMLGet() Parse and get data from input XML request string [ns:]container[|attribute[=value]][?data] * ioMkDir() - Function for racursive directory creation and validation
 * @csXML = Input XML request line *
 * @xml = Output parsed XML request 
 * return: 0 error format incorrect, -1 error:: can`t read; >0 ok readed elements bits 
*/ 
int ioXMLGet(const char *csXML, struct tagReqXML *xml); 
 
 
/* 
 * 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 348  int ioXMLGet(const char *csXML, struct tagReqXML *xml) Line 840  int ioXMLGet(const char *csXML, struct tagReqXML *xml)
 int ioMkDir(const char *csDir, int mode);  int ioMkDir(const char *csDir, int mode);
   
 /*  /*
 * 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 357  int ioWatchDirLoop(const char *csDir, int (*callback)( Line 850  int ioWatchDirLoop(const char *csDir, int (*callback)(
   
   
 /*  /*
 * io_rread() Raw VFS read function * io_rread() - Raw VFS read function
  *
  * @fd = File handle   * @fd = File handle
  * @buf = Read buffer   * @buf = Read buffer
  * @nbytes = Read buffer size   * @nbytes = Read buffer size
Line 367  int ioWatchDirLoop(const char *csDir, int (*callback)( Line 861  int ioWatchDirLoop(const char *csDir, int (*callback)(
  */   */
 inline int io_rread(int fd, void * __restrict buf, size_t nbytes, off_t offset, int update);  inline int io_rread(int fd, void * __restrict buf, size_t nbytes, off_t offset, int update);
 /*  /*
 * io_rwrite() Raw VFS write function * io_rwrite() - Raw VFS write function
  *
  * @fd = File handle   * @fd = File handle
  * @buf = Write buffer   * @buf = Write buffer
  * @nbytes = Write bytes from buffer   * @nbytes = Write bytes from buffer
Line 385  inline int io_rwrite(int fd, void * __restrict buf, si Line 880  inline int io_rwrite(int fd, void * __restrict buf, si
 /* Debug helper macros */  /* Debug helper macros */
 extern int io_Debug;  extern int io_Debug;
   
#define io_initDebug(x)         io_Debug = (x);#define io_enableDEBUG          int io_Debug
#define io_addDebug           io_Debug++#define io_initDebug(x)         (io_Debug = (x))
 #define io_incDebug           (io_Debug++)
 #define io_decDebug             (io_Debug--)
 
 /* Debug macros */
 #define ioVERBOSE(x)            if ((x) <= io_Debug)
 #define ioTRACE(x)              if ((x) <= io_Debug) \
                                            syslog(LOG_DEBUG, "I'm in %s(%d)", __func__, __LINE__)
 #define ioDEBUG(x, fmt, ...)    do { \  #define ioDEBUG(x, fmt, ...)    do { \
                                         assert((fmt)); \                                          assert((fmt)); \
                                         char str[STRSIZ] = { 0 }; \                                          char str[STRSIZ] = { 0 }; \
                                        snprintf(str, STRSIZ, (fmt), ##__VA_ARGS__); \                                        snprintf(str, sizeof str, (fmt), ##__VA_ARGS__); \
                                         if ((x) <= io_Debug) \                                          if ((x) <= io_Debug) \
                                                syslog(LOG_DEBUG, "ioDebug(%d):%s(%d): %s\n", \                                                syslog(LOG_DEBUG, "Debug(%d):%s(%d): %s\n", \
                                                                 (x), __func__, __LINE__, str); \                                                                  (x), __func__, __LINE__, str); \
                                 } while (0)                                  } while (0)
   
   /* Logger macro */
   #define ioLOGGER(x, fmt, ...)   do { \
                                           assert((fmt)); \
                                           char str[STRSIZ] = { 0 }; \
                                           snprintf(str, sizeof str, (fmt), ##__VA_ARGS__); \
                                           syslog((x), "Logger:%s(%d): %s\n", \
                                                                   __func__, __LINE__, str); \
                                   } while (0)
   
   /* Error state macros */
 #define ioERROR(x, fmt, ...)    do { \  #define ioERROR(x, fmt, ...)    do { \
                                         assert((fmt)); \                                          assert((fmt)); \
                                         char str[STRSIZ] = { 0 }; \                                          char str[STRSIZ] = { 0 }; \
                                        snprintf(str, STRSIZ, (fmt), ##__VA_ARGS__); \                                        snprintf(str, sizeof str, (fmt), ##__VA_ARGS__); \
                                        syslog(LOG_ERR, "ioError():%s(%d): #%d - %s\n", \                                        syslog(LOG_ERR, "Error:%s(%d): #%d - %s\n", \
                                                          __func__, __LINE__, (x), str); \                                                           __func__, __LINE__, (x), str); \
                                 } while (0)                                  } while (0)
#define io_sysERROR(x)            do { \#define ioSYSERR(x)            do { \
                                         if (x > 0 || errno) \                                          if (x > 0 || errno) \
                                                syslog(LOG_ERR, "ioError(sys):%s(%d): #%d - %s\n", \                                                syslog(LOG_ERR, "Error(sys):%s(%d): #%d - %s\n", \
                                                                 __func__, __LINE__, x > 0 ? x : errno, \                                                                  __func__, __LINE__, x > 0 ? x : errno, \
                                                                 strerror(x > 0 ? x : errno)); \                                                                  strerror(x > 0 ? x : errno)); \
                                 } while (0)                                  } while (0)
#define io_aitERROR(ait)  do { \#define ioLIBERR(ait)          do { \
                                         if (ait##_GetErrno()) \                                          if (ait##_GetErrno()) \
                                                syslog(LOG_ERR, "ioError(ait):%s(%d): #%d - %s\n", \                                                syslog(LOG_ERR, "Error(lib):%s(%d): #%d - %s\n", \
                                                                 __func__, __LINE__, ait##_GetErrno(), \                                                                  __func__, __LINE__, ait##_GetErrno(), \
                                                                 ait##_GetError()); \                                                                  ait##_GetError()); \
                                 } while (0)                                  } while (0)
Line 420  extern int io_Debug; Line 932  extern int io_Debug;
 /* Crypto framework */  /* Crypto framework */
   
 /*  /*
 * ioCipher() Cipher wrapper for all supported crypto algorythms * ioCipher() - Cipher wrapper for all supported crypto algorythms
  *
  * @pInput = input buffer   * @pInput = input buffer
  * @inLen = input buffer len   * @inLen = input buffer len
  * @ppOutput = output allocated buffe, must be free after use   * @ppOutput = output allocated buffe, must be free after use
Line 434  int ioCipher(unsigned char *pInput, int inLen, unsigne Line 947  int ioCipher(unsigned char *pInput, int inLen, unsigne
                 unsigned char *pKey, unsigned char *pIV, int nMode);                  unsigned char *pKey, unsigned char *pIV, int nMode);
   
 /*  /*
 * io_Blowfish() Blowfish cipher algorythm, work with ASCII hex strings * io_Blowfish() - Blowfish cipher algorythm, work with ASCII hex strings
  *
  * @pInput = input buffer   * @pInput = input buffer
  * @inLen = input buffer len   * @inLen = input buffer len
  * @ppOutput = output allocated buffe, must be free after use   * @ppOutput = output allocated buffe, must be free after use
Line 445  int ioCipher(unsigned char *pInput, int inLen, unsigne Line 959  int ioCipher(unsigned char *pInput, int inLen, unsigne
 */  */
 int io_Blowfish(unsigned char *pInput, int inLen, unsigned char **ppOutput,   int io_Blowfish(unsigned char *pInput, int inLen, unsigned char **ppOutput, 
                 unsigned char *pKey, unsigned char *pIV, int nMode);                  unsigned char *pKey, unsigned char *pIV, int nMode);
   /*
    * io_ctr_AES() - Encrypt/Decrypt stream cipher CTR_AES
    *
    * @pInput = Input buffer with ASCII
    * @inLen = Input buffer data length
    * @ppOutput = Output buffer with cipher data, must be free after use
    * @pKey = Key
    * @IV = IVector/Nonce/Counter, Warning: IV must be variable, because we write there!!!
    * return: -1 error or >-1 how many cipher blocks proceeded
    */
   int io_ctr_AES(unsigned char *pInput, int inLen, unsigned char **ppOutput, 
                   unsigned char *pKey, unsigned char IV[AES_BLOCK_SIZE]);
   
   
   /*
    * ioAllocPTY() - Allocate new PTY and TTY
    *
    * @ptyfd = master fd, pty
    * @ttyfd = slave fd, tty
    * @name = tty device name if not null
    * @namesiz = name length, must be above 63 bytes.
    * @term = termios for terminal
    * @winz = winsize for terminal
    * return: -1 error or 0 ok
    */
   inline int ioAllocPTY(int *ptyfd, int *ttyfd, char * __restrict name, int namesiz, 
                   struct termios * __restrict term, struct winsize * __restrict winz);
   /*
    * ioFreePTY() - Release PTY and TTY device
    *
    * @ptyfd = master fd, pty (==-1 skip closing pty)
    * @ttyname = tty filename
    * return: none
    */
   inline void ioFreePTY(int ptyfd, const char *ttyname);
   /*
    * ioChgWinPTY() - Change window size of PTY
    *
    * @ptyfd = master fd, pty
    * @row = row
    * @col = col
    * @xpxl = x pixels
    * @ypxl = y pixels
    * return: -1 error or 0 ok
    */
   inline int ioChgWinPTY(int ptyfd, unsigned short row, unsigned short col, 
                   unsigned short xpxl, unsigned short ypxl);
   /*
    * ioSetOwnerTTY() - Set owner to TTY
    *
    * @ttyname = tty filename
    * @UID = uid
    * @GID = gid
    * return: -1 error or 0 ok
    */
   int ioSetOwnerTTY(const char *ttyname, uid_t UID, gid_t GID);
   /*
    * ioSetSidTTY() - Makes the process's controlling TTY and sets it to sane modes.
    *
    * @ttyfd = slave fd, tty
    * @ttyname = tty filename
    * return: -1 error or 0 ok
    */
   int ioSetSidTTY(int *ttyfd, const char *ttyname);
   /*
    * ioSetRAWMode() - Enter into RAW mode
    *
    * @fd = tty fd
    * @otio = saved old termios for later restore if !=NULL
    * return: -1 error or 0 ok
    */
   inline int ioSetRAWMode(int fd, struct termios *otio);
   /*
    * ioRestoreMode() - Restore termios to tty fd
    *
    * @fd = tty fd
    * @tio = termios structure for restore
    * return: -1 error or 0 ok
    */
   inline int ioRestoreMode(int fd, struct termios tio);
   /*
    * ioForkPTY() - Fork new process with session leader and new TTY
    *
    * @ptyfd = master fd, pty
    * @name = tty device name if not null
    * @namesiz = name length, must be above 63 bytes.
    * @term = termios for terminal
    * @winz = winsize for terminal
    * @otio = old termios structure for restore
    * return: -1 error, 0 child process or >0 parent: pid of child
    */
   pid_t ioForkPTY(int *ptyfd, char * __restrict name, int namesiz, struct termios * __restrict term, 
                   struct winsize * __restrict winz, struct termios * __restrict otio);
   
   /*
    * 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);
   
   /*
    * 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);
   /*
    * 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);
   
   
   /* Buffered file access over memory block */
   
   /*
    * io_fmemopen() - File buffered stream operations over memory block
    *
    * @base = Base address of memory block, if =NULL Infinit length(auto-grow)
    * @basesize = Size of memory block
    * return: NULL error or !=NULL Opened file resource
    */
   FILE *io_fmemopen(void ** __restrict base, off_t basesize);
   /*
    * io_fmapopen() - File buffered stream operations over MMAP block
    *
    * @csFile = Filename for MMAP, if =NULL private MMAP block
    * @mode = File open mode
    * @perm = If file not exists will be created with this access permissions
    * @prot = MMAP protection
    * @flags = MMAP mode flags
    * @offset = Map from file offset, if csFile==NULL then this is size of MMAP private block
    * return: NULL error or !=NULL Opened file resource
    */
   FILE *io_fmapopen(const char *csFile, int mode, int perm, int prot, int flags, off_t offset);
   /*
    * io_fd2buf() - Convert open file handle to buffered file I/O
    *
    * @fd = File handle
    * @mode = Permissions for new buffered file I/O
    * return: NULL error or open buffered file
    */
   inline FILE *io_fd2buf(int fd, const char *mode);
   /*
    * io_dumbFile() - Create empry or dumb file with fixed size
    *
    * @csFile = Filename for create
    * @mode = File access permissions
    * @size = File size
    * return: -1 error or open file handle
    */
   int io_dumbFile(const char *csFile, int mode, off_t size);
   
   
 #endif  #endif

Removed from v.1.8  
changed lines
  Added in v.1.18


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