| version 1.18.2.5, 2012/05/23 14:06:08 | version 1.22.2.11, 2012/07/31 13:37:51 | 
| Line 49  SUCH DAMAGE. | Line 49  SUCH DAMAGE. | 
 |  |  | 
 | #define COMPAT_43TTY | #define COMPAT_43TTY | 
 |  |  | 
 | #include <atree.h> |  | 
 | #include <ampool.h> |  | 
 | #include <assert.h> | #include <assert.h> | 
 | #include <openssl/evp.h> | #include <openssl/evp.h> | 
 | #include <openssl/aes.h> | #include <openssl/aes.h> | 
| Line 60  SUCH DAMAGE. | Line 58  SUCH DAMAGE. | 
 | #include <sys/un.h> | #include <sys/un.h> | 
 | #include <net/if_dl.h> | #include <net/if_dl.h> | 
 | #include <netinet/in.h> | #include <netinet/in.h> | 
 |  | #include <atree.h> | 
 |  | #include <ampool.h> | 
 |  |  | 
 |  |  | 
 |  | #ifndef STRSIZ | 
 |  | #define STRSIZ          256 | 
 |  | #endif | 
 |  |  | 
 |  | #ifndef be16toh | 
 |  | #define be16toh         betoh16 | 
 |  | #endif | 
 |  | #ifndef be32toh | 
 |  | #define be32toh         betoh32 | 
 |  | #endif | 
 |  | #ifndef be64toh | 
 |  | #define be64toh         betoh64 | 
 |  | #endif | 
 |  | #ifndef le16toh | 
 |  | #define le16toh         letoh16 | 
 |  | #endif | 
 |  | #ifndef le32toh | 
 |  | #define le32toh         letoh32 | 
 |  | #endif | 
 |  | #ifndef le64toh | 
 |  | #define le64toh         letoh64 | 
 |  | #endif | 
 |  |  | 
 | #define IO_SYSM         0 | #define IO_SYSM         0 | 
 | #define IO_MPOOL        1 | #define IO_MPOOL        1 | 
 |  |  | 
| Line 96  typedef enum { | Line 119  typedef enum { | 
 |  |  | 
 | typedef struct { | typedef struct { | 
 | uint8_t         val_type; | uint8_t         val_type; | 
| uint8_t         val_pad; | union { | 
|  | struct { | 
|  | uint8_t val_in:1; | 
|  | uint8_t val_be:1; | 
|  | uint8_t val_le:1; | 
|  | uint8_t val_pad:5; | 
|  | }; | 
|  | uint8_t         val_opt; | 
|  | }; | 
 | uint16_t        val_key; | uint16_t        val_key; | 
 | uint32_t        val_len; | uint32_t        val_len; | 
 | union { | union { | 
| Line 118  typedef struct { | Line 149  typedef struct { | 
 | int64_t         i64; | int64_t         i64; | 
 | } val; | } val; | 
 | uint8_t         val_data[0]; | uint8_t         val_data[0]; | 
| } __packed ait_val_t; | } __packed ait_val_t;   /* sizeof 16 bytes */ | 
 |  |  | 
 | #define AIT_TYPE(_vl)                   ((ait_type_t) (_vl)->val_type) | #define AIT_TYPE(_vl)                   ((ait_type_t) (_vl)->val_type) | 
 | #define AIT_LEN(_vl)                    (_vl)->val_len | #define AIT_LEN(_vl)                    (_vl)->val_len | 
 | #define AIT_KEY(_vl)                    (_vl)->val_key | #define AIT_KEY(_vl)                    (_vl)->val_key | 
 | #define AIT_RAW(_vl)                    (_vl)->val.net | #define AIT_RAW(_vl)                    (_vl)->val.net | 
 | #define AIT_ADDR(_vl)                   (_vl)->val.ptr | #define AIT_ADDR(_vl)                   (_vl)->val.ptr | 
 |  | #define AIT_IN(_vl)                     (_vl)->val_in | 
 |  | #define AIT_BE(_vl)                     (_vl)->val_be | 
 |  | #define AIT_LE(_vl)                     (_vl)->val_le | 
 | #define AIT_BLOB_CHUNKS(_vl, _n)        (AIT_LEN((_vl)) / _n + (AIT_LEN((_vl)) % _n) ? 1 : 0) | #define AIT_BLOB_CHUNKS(_vl, _n)        (AIT_LEN((_vl)) / _n + (AIT_LEN((_vl)) % _n) ? 1 : 0) | 
 | #define AIT_ISEMPTY(_vl)                (AIT_TYPE((_vl)) == empty) | #define AIT_ISEMPTY(_vl)                (AIT_TYPE((_vl)) == empty) | 
 |  |  | 
| Line 156  typedef struct { | Line 190  typedef struct { | 
 | (_vl) = __val; \ | (_vl) = __val; \ | 
 | } while (0); | } while (0); | 
 | #define AIT_SET_PTR(_vl, _p, _len)      do { ait_val_t *__val = (_vl); assert(__val); \ | #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_type = ptr; __val->val.ptr = _p; \ | 
| __val->val.ptr = _p; } while (0) | AIT_LEN(__val) = _len; } while (0) | 
 | #define AIT_RE_BUF(_vl, _len)           do { ait_val_t *__val = (_vl); assert(__val); \ | #define AIT_RE_BUF(_vl, _len)           do { ait_val_t *__val = (_vl); assert(__val); \ | 
 | void *__ptr = io_realloc(AIT_GET_BUF(__val), _len); \ | void *__ptr = io_realloc(AIT_GET_BUF(__val), _len); \ | 
 | if (__ptr) { \ | if (__ptr) { \ | 
| Line 179  typedef struct { | Line 213  typedef struct { | 
 | memset(__val->val.buffer, 0, _len); \ | memset(__val->val.buffer, 0, _len); \ | 
 | } } while (0) | } } while (0) | 
 | #define AIT_SET_STR(_vl, _v)            do { ait_val_t *__val = (_vl); assert(__val); \ | #define AIT_SET_STR(_vl, _v)            do { ait_val_t *__val = (_vl); assert(__val); \ | 
| __val->val.string = (int8_t*) io_strdup((_v)); \ | __val->val_type = string; \ | 
| if (__val->val.string) { \ | if ((_v)) { \ | 
| __val->val_type = string; \ | __val->val.string = (int8_t*) io_strdup((_v)); \ | 
 | AIT_LEN(__val) = strlen((_v)) + 1; \ | AIT_LEN(__val) = strlen((_v)) + 1; \ | 
| } } while (0) | } else { \ | 
|  | __val->val.string = NULL; \ | 
|  | AIT_LEN(__val) = 0; \ | 
|  | } \ | 
|  | } while (0) | 
|  | #define AIT_SET_STRSIZ(_vl, _len)       do { ait_val_t *__val = (_vl); assert(__val); \ | 
|  | __val->val.string = (int8_t*) io_malloc(_len); \ | 
|  | if (__val->val.string) { \ | 
|  | __val->val_type = string; AIT_LEN(__val) = _len; \ | 
|  | memset(__val->val.string, 0, _len); \ | 
|  | } \ | 
|  | } while (0) | 
 | #define AIT_SET_STRCAT(_vl, _v)         do { ait_val_t *__val = (_vl); assert(__val); \ | #define AIT_SET_STRCAT(_vl, _v)         do { ait_val_t *__val = (_vl); assert(__val); \ | 
 | assert(AIT_TYPE(__val) == string); \ | assert(AIT_TYPE(__val) == string); \ | 
 |  | if (!__val->val.string) \ | 
 |  | AIT_LEN(__val) = 1; \ | 
 | void *__p = io_realloc(__val->val.string, \ | void *__p = io_realloc(__val->val.string, \ | 
 | AIT_LEN(__val) + strlen((_v))); \ | AIT_LEN(__val) + strlen((_v))); \ | 
 | if (__p) { \ | if (__p) { \ | 
 | __val->val.string = __p; \ |  | 
 | AIT_LEN(__val) += strlen((_v)); \ | AIT_LEN(__val) += strlen((_v)); \ | 
 |  | if (!__val->val.string) \ | 
 |  | memset(__p, 0, AIT_LEN(__val)); \ | 
 |  | __val->val.string = __p; \ | 
 | strlcat((char*) __val->val.string, (_v), \ | strlcat((char*) __val->val.string, (_v), \ | 
 | AIT_LEN(__val)); \ | AIT_LEN(__val)); \ | 
 |  | } else \ | 
 |  | if (!__val->val.string) \ | 
 |  | AIT_LEN(__val) = 0; \ | 
 |  | } while (0) | 
 |  | #define AIT_SET_STRCPY(_vl, _v)         do { ait_val_t *__val = (_vl); assert(__val); \ | 
 |  | assert(AIT_TYPE(__val) == string); \ | 
 |  | void *__p = io_realloc(__val->val.string, \ | 
 |  | strlen((_v)) + 1); \ | 
 |  | if (__p) { \ | 
 |  | __val->val.string = __p; \ | 
 |  | AIT_LEN(__val) = strlen((_v)) + 1; \ | 
 |  | strlcpy((char*) __val->val.string, (_v), \ | 
 |  | AIT_LEN(__val)); \ | 
 | } } while (0) | } } while (0) | 
 |  | #define AIT_SET_STRLCPY(_vl, _v, _len)  do { ait_val_t *__val = (_vl); assert(__val); \ | 
 |  | assert(AIT_TYPE(__val) == string); \ | 
 |  | void *__p = io_realloc(__val->val.string, _len); \ | 
 |  | if (__p) { \ | 
 |  | __val->val.string = __p; AIT_LEN(__val) = _len; \ | 
 |  | strlcpy((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); \ | #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_type = blob; __val->val.blob = _n; \ | 
| __val->val.blob = _n; } while (0) | AIT_LEN(__val) = _len; } while (0) | 
 | #define AIT_SET_BLOB2(_vl, _bv)         do { ait_val_t *__val = (_vl); assert(__val); assert((_bv)); \ | #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_type = blob; AIT_LEN(__val) = \ | 
|  | (_bv)->blob_len; \ | 
 | __val->val.blob = (_bv)->blob_var; } while (0) | __val->val.blob = (_bv)->blob_var; } while (0) | 
 | #define AIT_NEW_BLOB(_vl, _len)         AIT_SET_BLOB((_vl), 0, _len) | #define AIT_NEW_BLOB(_vl, _len)         AIT_SET_BLOB((_vl), 0, _len) | 
 |  |  | 
| Line 236  typedef struct { | Line 307  typedef struct { | 
 | #define AIT_COPY_VAL(_vl, _v)           do { memcpy((_vl), (_v), sizeof(ait_val_t)); \ | #define AIT_COPY_VAL(_vl, _v)           do { memcpy((_vl), (_v), sizeof(ait_val_t)); \ | 
 | switch (AIT_TYPE((_vl))) { \ | switch (AIT_TYPE((_vl))) { \ | 
 | case buffer: \ | case buffer: \ | 
| AIT_SET_BUF((_vl), AIT_GET_BUF((_v)), AIT_LEN((_v))); \ | AIT_SET_BUF((_vl), \ | 
|  | AIT_GET_BUF((_v)), \ | 
|  | AIT_LEN((_v))); \ | 
 | break; \ | break; \ | 
 | case string: \ | case string: \ | 
| AIT_SET_STR((_vl), AIT_GET_STR((_v))); \ | AIT_SET_STR((_vl), \ | 
|  | AIT_GET_STR((_v))); \ | 
 | break; \ | break; \ | 
 | default: \ | default: \ | 
 | break; \ | break; \ | 
| Line 247  typedef struct { | Line 321  typedef struct { | 
 | } while (0) | } while (0) | 
 | #define AIT_COPY_VAL2(_vl, _v)          do { AIT_COPY_VAL((_vl), (_v)); \ | #define AIT_COPY_VAL2(_vl, _v)          do { AIT_COPY_VAL((_vl), (_v)); \ | 
 | if (AIT_TYPE((_vl)) == data) \ | if (AIT_TYPE((_vl)) == data) \ | 
| AIT_SET_DATA((_vl), AIT_GET_DATA((_v)), AIT_LEN((_v))); \ | AIT_SET_DATA((_vl), AIT_GET_DATA((_v)), \ | 
|  | AIT_LEN((_v))); \ | 
 | } while (0) | } while (0) | 
 |  |  | 
 | #define AIT_INIT_VAL(_vl)               (memset((_vl), 0, sizeof(ait_val_t))) | #define AIT_INIT_VAL(_vl)               (memset((_vl), 0, sizeof(ait_val_t))) | 
 |  | #define AIT_INIT_VAL2(_vl, _t)          do { \ | 
 |  | AIT_INIT_VAL((_vl)); \ | 
 |  | (_vl)->val_type = _t; \ | 
 |  | } while (0) | 
 | /* if attribute zeroCopy is set not execute io_free() */ | /* if attribute zeroCopy is set not execute io_free() */ | 
 | #define AIT_FREE_VAL(_vl)               do { ait_val_t *__val = (_vl); assert(__val); \ | #define AIT_FREE_VAL(_vl)               do { ait_val_t *__val = (_vl); assert(__val); \ | 
 | switch (AIT_TYPE(__val)) { \ | switch (AIT_TYPE(__val)) { \ | 
 | case buffer: \ | case buffer: \ | 
| if (__val->val.buffer) { \ | if (!__val->val_in && \ | 
|  | __val->val.buffer) \ | 
 | io_free(__val->val.buffer); \ | io_free(__val->val.buffer); \ | 
| __val->val.buffer = NULL; \ | __val->val.buffer = NULL; \ | 
| } \ |  | 
 | break; \ | break; \ | 
 | case string: \ | case string: \ | 
| if (__val->val.string) { \ | if (!__val->val_in && \ | 
|  | __val->val.string) \ | 
 | io_free(__val->val.string); \ | io_free(__val->val.string); \ | 
| __val->val.string = NULL; \ | __val->val.string = NULL; \ | 
| } \ |  | 
 | break; \ | break; \ | 
 | default: \ | default: \ | 
 | break; \ | break; \ | 
 | } \ | } \ | 
 | __val->val_type = empty; \ | __val->val_type = empty; \ | 
 |  | __val->val_opt ^= __val->val_opt; \ | 
 | AIT_LEN(__val) = 0; \ | AIT_LEN(__val) = 0; \ | 
 |  | AIT_KEY(__val) = 0; \ | 
 | } while (0) | } while (0) | 
 |  | #define AIT_ZERO_VAL(_vl)               do { ait_val_t *__val = (_vl); assert(__val); \ | 
 |  | switch (AIT_TYPE(__val)) { \ | 
 |  | case buffer: \ | 
 |  | case string: \ | 
 |  | if (__val->val.buffer) \ | 
 |  | memset(__val->val.buffer, 0, \ | 
 |  | AIT_LEN(__val)); \ | 
 |  | break; \ | 
 |  | default: \ | 
 |  | __val->val.net = 0LL; \ | 
 |  | break; \ | 
 |  | } \ | 
 |  | AIT_KEY(__val) = 0; \ | 
 |  | } while (0) | 
 |  | #define AIT_ZERO_VAL2(_vl)              do { assert((_vl)); \ | 
 |  | if (AIT_TYPE((_vl)) == data) \ | 
 |  | memset((_vl)->val_data, 0, AIT_LEN((_vl))); \ | 
 |  | } while (0) | 
 |  |  | 
 | struct io_ether_addr { | struct io_ether_addr { | 
 | u_int8_t ether_addr_octet[6]; | u_int8_t ether_addr_octet[6]; | 
| Line 286  typedef union { | Line 385  typedef union { | 
 | struct sockaddr_in6     sin6; | struct sockaddr_in6     sin6; | 
 | struct sockaddr_dl      sdl; | struct sockaddr_dl      sdl; | 
 | } io_sockaddr_t; | } io_sockaddr_t; | 
 |  | #define IO_SOCKADDR_INIT        { .ss = { 0 } } | 
 |  |  | 
 |  |  | 
 | #define io_align(x, a)          (((x) + (a)) & ~(a)) | #define io_align(x, a)          (((x) + (a)) & ~(a)) | 
| Line 374  io_sockaddr_t *io_gethostbyname(const char *psHost, un | Line 474  io_sockaddr_t *io_gethostbyname(const char *psHost, un | 
 | * @vars = Variable array | * @vars = Variable array | 
 | * return: -1 error, 0 nothing done or >0 size of marshaled data | * return: -1 error, 0 nothing done or >0 size of marshaled data | 
 | */ | */ | 
| int io_vars2buffer(unsigned char *buf, int buflen, array_t *vars); | inline int io_vars2buffer(unsigned char * __restrict buf, int buflen, | 
|  | array_t * __restrict vars); | 
 | /* | /* | 
 | * io_buffer2vars() - De-marshaling data from buffer to array with variables | * io_buffer2vars() - De-marshaling data from buffer to array with variables | 
 | * | * | 
| Line 385  int io_vars2buffer(unsigned char *buf, int buflen, arr | Line 486  int io_vars2buffer(unsigned char *buf, int buflen, arr | 
 | *DON'T MODIFY OR DESTROY BUFFER*. =0 call io_arrayFree() before io_arrayDestroy() | *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() | * 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); | inline array_t *io_buffer2vars(unsigned char * __restrict buf, int buflen, int vnum, int zcpy); | 
 | /* | /* | 
 | * io_vars2map() - Marshaling data from array with variables to memory map | * io_vars2map() - Marshaling data from array with variables to memory map | 
 | * | * | 
| Line 394  array_t *io_buffer2vars(unsigned char *buf, int buflen | Line 495  array_t *io_buffer2vars(unsigned char *buf, int buflen | 
 | * @vars = Variable array | * @vars = Variable array | 
 | * return: -1 error, 0 nothing done or >0 size of marshaled data | * return: -1 error, 0 nothing done or >0 size of marshaled data | 
 | */ | */ | 
| int io_vars2map(unsigned char *buf, int buflen, array_t *vars); | inline int io_vars2map(unsigned char * __restrict buf, int buflen, | 
|  | array_t * __restrict vars); | 
 | /* | /* | 
 | * io_map2vars() - De-marshaling data from memory map to array with variables | * io_map2vars() - De-marshaling data from memory map to array with variables | 
 | * | * | 
| Line 405  int io_vars2map(unsigned char *buf, int buflen, array_ | Line 507  int io_vars2map(unsigned char *buf, int buflen, array_ | 
 | *DON'T MODIFY OR DESTROY BUFFER*. =0 call io_arrayFree() before io_arrayDestroy() | *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() | * 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); | inline array_t *io_map2vars(unsigned char * __restrict buf, int buflen, int vnum, int zcpy); | 
 |  |  | 
 | /* | /* | 
 | * io_allocVar() - Allocate memory for variable | * io_allocVar() - Allocate memory for variable | 
| Line 450  inline void io_freeVars(array_t ** __restrict vars); | Line 552  inline void io_freeVars(array_t ** __restrict vars); | 
 | */ | */ | 
 | inline ait_val_t *io_getVars(array_t ** __restrict vars, int n); | inline ait_val_t *io_getVars(array_t ** __restrict vars, int n); | 
 | /* | /* | 
| * io_sortVars() - Sorting array with variables | * io_sortVarsByKey() - Sorting array with variables by key | 
 | * | * | 
 | * @vars = Variable array | * @vars = Variable array | 
| * @order = Sort order. If =0 ascend ot !=0 descend | * @order = Sort order. If =0 ascend or !=0 descend | 
| * @cmp = Compare function for sorting. If =NULL compare by key |  | 
 | * return: none | * return: none | 
 | */ | */ | 
| inline void io_sortVars(array_t * __restrict vars, int order, | inline void io_sortVarsByKey(array_t * __restrict vars, int order); | 
|  | /* | 
|  | * io_sortVarsByVal() - Sorting array with variables by value | 
|  | * | 
|  | * @vars = Variable array | 
|  | * @order = Sort order. If =0 ascend or !=0 descend | 
|  | * @cmp = Custom compare function for sorting. If =NULL compare by value | 
|  | * return: none | 
|  | */ | 
|  | inline void io_sortVarsByVal(array_t * __restrict vars, int order, | 
 | int (*cmp)(const void*, const void*)); | int (*cmp)(const void*, const void*)); | 
 | /* | /* | 
 | * io_findKeyVars() - Find variable by key from array | * io_findKeyVars() - Find variable by key from array | 
| Line 751  int io_arrayMake(char * __restrict psArgs, int nargs, | Line 861  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_MakeAV2() Parse and make attribute/value pair over input string | 
 |  | * | 
 |  | * @csArgs = Input argument line, will be modified! | 
 |  | * @csDelim = Delimiter for separate | 
 |  | * @psAttr = Output Attribute | 
 |  | * @psValue = Output Value, if ==NULL this element not present value or not wanted for return | 
 |  | * return: 0 error format; -1 error:: can`t read; >0 ok, number of readed items | 
 |  | */ | 
 |  | int io_MakeAV2(char * __restrict psArgs, const char *csDelim, | 
 |  | char ** __restrict psAttr, char ** __restrict psValue); | 
 |  |  | 
 | /* | /* | 
 | * io_sarrInit() - Create and initialize dynamic split-order array | * io_sarrInit() - Create and initialize dynamic split-order array |