--- libaitio/src/aitio.c 2012/03/27 21:37:56 1.8.6.1 +++ libaitio/src/aitio.c 2012/11/15 23:23:54 1.13 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: aitio.c,v 1.8.6.1 2012/03/27 21:37:56 misho Exp $ +* $Id: aitio.c,v 1.13 2012/11/15 23:23:54 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -47,10 +47,22 @@ SUCH DAMAGE. int io_Debug; +mpool_t *io_mpool; +/* Memory management */ + +void *(*io_malloc)(size_t) = malloc; +void *(*io_calloc)(size_t, size_t) = calloc; +void *(*io_realloc)(void*, size_t) = realloc; +char *(*io_strdup)(const char*) = strdup; +void (*io_free)(void*) = free; + + #pragma GCC visibility push(hidden) +int use_mm; + int io_Errno; char io_Error[STRSIZ]; @@ -84,10 +96,94 @@ io_SetErr(int eno, char *estr, ...) va_end(lst); } +// io_mm_inuse() Check for memory management model +inline int +io_mm_inuse() +{ + return use_mm & IO_MPOOL; +} + +// init libaitio routine +__attribute__((constructor)) void +_io_init() +{ + ioLibInit(IO_MPOOL, 0); +} + +// fini libaitio routine +__attribute__((destructor)) void +_io_fini() +{ + ioLibFini(); +} + /* - * ioPromptRead() Read data from input h[0] with prompt to output h[1] + * ioLibInit() - Init libaitio library memory management * + * @mm = memory management (IO_SYSM or IO_MPOOL) + * @maxmem = memory limit + * return: -1 error or !=-1 used memory management model + */ +inline int +ioLibInit(int mm, u_long maxmem) +{ + switch (mm) { + case IO_MPOOL: /* mpool */ + io_mpool = mpool_init(maxmem); + if (io_mpool) { + io_malloc = mpool_xmalloc; + io_calloc = mpool_xcalloc; + io_realloc = mpool_xrealloc; + io_strdup = mpool_xstrdup; + io_free = mpool_xfree; + use_mm = mm; + break; + } else { + #undef USE_MPOOL + } + case IO_SYSM: /* system */ + io_malloc = malloc; + io_calloc = calloc; + io_realloc = realloc; + io_strdup = strdup; + io_free = free; + use_mm = mm; + break; + default: /* not supported */ + io_SetErr(EINVAL, "Not supported memory management"); + return -1; + } + + return use_mm; +} + +/* + * ioLibFini() - Finish libaitio library memory management + * + * return: none + */ +inline void +ioLibFini() +{ + switch (use_mm) { + case IO_MPOOL: + io_malloc = malloc; + io_calloc = calloc; + io_realloc = realloc; + io_strdup = strdup; + io_free = free; + use_mm = IO_SYSM; + + mpool_destroy(&io_mpool); + break; + } +} + + +/* + * 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 * @csPrompt = Prompt before input, may be NULL * @psData = Readed data @@ -140,7 +236,7 @@ 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 * @csPrompt = Prompt before input, may be NULL @@ -227,7 +323,7 @@ next: } /* - * ioRegexVerify() Function for verify data match in regex expression + * ioRegexVerify() - Function for verify data match in regex expression * * @csRegex = Regulare expression pattern * @csData = Data for check and verify @@ -249,7 +345,7 @@ ioRegexVerify(const char *csRegex, const char *csData, if ((ret = regcomp(&re, csRegex, REG_EXTENDED))) { regerror(ret, &re, szErr, STRSIZ); - io_SetErr(ret, "Error:: %s\n", szErr); + io_SetErr(ret, "%s", szErr); regfree(&re); return NULL; } @@ -267,7 +363,7 @@ ioRegexVerify(const char *csRegex, const char *csData, if (ret) { regerror(ret, &re, szErr, STRSIZ); - io_SetErr(ret, "Error:: %s\n", szErr); + io_SetErr(ret, "%s", szErr); pos = NULL; } @@ -276,7 +372,7 @@ 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 * @csData = Data from get @@ -307,12 +403,12 @@ 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 * @csData = Source data * @csNew = Data for replace - * return: NULL not match or error; !=NULL allocated new string, must be free after use! + * return: NULL not match or error; !=NULL allocated new string, must be io_free after use! */ char * ioRegexReplace(const char *csRegex, const char *csData, const char *csNew) @@ -328,7 +424,7 @@ ioRegexReplace(const char *csRegex, const char *csData // ___ before match len = sp + 1; - str = malloc(len); + str = io_malloc(len); if (!str) { LOGERR; return NULL; @@ -337,7 +433,7 @@ ioRegexReplace(const char *csRegex, const char *csData // * replace match * if (csNew) { len += strlen(csNew); - str = realloc(str, len); + str = io_realloc(str, len); if (!str) { LOGERR; return NULL; @@ -346,7 +442,7 @@ ioRegexReplace(const char *csRegex, const char *csData } // after match ___ len += strlen(csData) - ep; - str = realloc(str, len); + str = io_realloc(str, len); if (!str) { LOGERR; return NULL; @@ -357,10 +453,10 @@ ioRegexReplace(const char *csRegex, const char *csData } /* - * ioStrAst() Function for evaluate string like asterisk variable "{text[:[-]#[:#]]}" + * ioStrAst() - Function for evaluate string like asterisk variable "{text[:[-]#[:#]]}" * * @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 io_free() */ char * ioStrAst(const char *csString) @@ -373,12 +469,12 @@ ioStrAst(const char *csString) if (!strchr(csString, '{') || !strrchr(csString, '}')) { memset(io_Error, 0, STRSIZ); - snprintf(io_Error, STRSIZ, "Error:: Invalid input string format ... " + snprintf(io_Error, STRSIZ, "Invalid input string format ... " "must be like {text[:[-]#[:#]]}"); io_Errno = EINVAL; return NULL; } else { - str = strdup(strchr(csString, '{') + 1); + str = io_strdup(strchr(csString, '{') + 1); *strrchr(str, '}') = 0; } @@ -400,15 +496,15 @@ ioStrAst(const char *csString) /* ok, clear show */ ext = str; - out = strdup(ext); - free(str); + out = io_strdup(ext); + io_free(str); return out; } /* - * ioMkDir() Function for racursive directory creation and validation + * ioMkDir() - Function for racursive directory creation and validation * * @csDir = Full directory path * @mode = Mode for directory creation if missing dir @@ -423,7 +519,7 @@ ioMkDir(const char *csDir, int mode) if (!csDir) return cx; - str = strdup(csDir); + str = io_strdup(csDir); if (!str) { LOGERR; return cx; @@ -451,12 +547,12 @@ ioMkDir(const char *csDir, int mode) } end: chdir(szOld); - free(str); + io_free(str); return cx; } /* - * ioWatchDirLoop() Function for watching changes in directory and fire callback + * ioWatchDirLoop() - Function for watching changes in directory and fire callback * * @csDir = Full directory path * @callback = Callback if raise event! nOp -1 delete, 0 change/move, 1 create @@ -568,7 +664,7 @@ ioWatchDirLoop(const char *csDir, int (*callback)(cons } /* - * ioCreatePIDFile() Create PID file + * ioCreatePIDFile() - Create PID file * * @csName = PID filename * @ifExists = !=0 if filename exists return error @@ -596,7 +692,7 @@ 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 * @csFile = file for send @@ -663,7 +759,7 @@ 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 * @csFile = file for receive @@ -698,13 +794,7 @@ ioRecvFile(int s, const char *csFile, size_t recvLen, unlink(csFile); return 0; } - if (lseek(fd, recvLen - 1, SEEK_SET) == -1) { - LOGERR; - close(fd); - unlink(csFile); - return 0; - } - if (write(fd, "", 1) == -1) { + if (ftruncate(fd, recvLen) == -1) { LOGERR; close(fd); unlink(csFile);