--- libaitio/inc/aitio.h 2011/08/31 13:23:25 1.11.2.9 +++ libaitio/inc/aitio.h 2011/10/07 10:41:11 1.11.2.25 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: aitio.h,v 1.11.2.9 2011/08/31 13:23:25 misho Exp $ +* $Id: aitio.h,v 1.11.2.25 2011/10/07 10:41:11 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -47,8 +47,13 @@ SUCH DAMAGE. #define __AITIO_H +#define COMPAT_43TTY + #include #include +#include +#include +#include #define VACUUM_LEFT 1 @@ -160,7 +165,7 @@ typedef struct { __val->val_type = buffer; AIT_LEN(__val) = _len; \ memcpy(__val->val.buffer, (_v), _len); \ } } 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); assert((_v)); \ __val->val.string = (int8_t*) strdup((_v)); \ if (__val->val.string) { \ __val->val_type = string; \ @@ -172,6 +177,7 @@ typedef struct { #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; \ @@ -251,6 +257,24 @@ int io_vals2buffer(unsigned char *buf, int buflen, arr * return: =NULL error, !=NULL allocated variable array, after use must free with io_arrayDestroy() */ array_t *io_buffer2vals(unsigned char *buf, int buflen, int vnum, int zcpy); +/* + * io_vals2map() 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_vals2map(u_char *buf, int buflen, array_t *vars); +/* + * io_map2vals() 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_map2vals(u_char *buf, int buflen, int vnum, int zcpy); /* * ioPromptRead() Read data from input h[0] with prompt to output h[1] @@ -425,7 +449,7 @@ int io_arrayGrow(array_t * __restrict arr, int newNumI */ 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_arrayZero(_arr) (assert((_arr)), memset((_arr)->arr_data, 0, \ io_arraySize((_arr)) * sizeof(void*))) @@ -518,7 +542,7 @@ int io_sarrGrow(sarr_t * __restrict arr, int newNumIte * return: -1 error, >-1 freed segments */ inline int io_sarrVacuum(sarr_t * __restrict arr); -#define io_sarrSize(_arr) (assert((_arr)), (_arr)->sarr_num) +#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 @@ -730,6 +754,98 @@ int ioCipher(unsigned char *pInput, int inLen, unsigne */ int io_Blowfish(unsigned char *pInput, int inLen, unsigned char **ppOutput, 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); #endif