--- libaitio/src/aitio.c 2014/02/08 22:06:17 1.17 +++ libaitio/src/aitio.c 2016/08/18 09:06:31 1.18 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: aitio.c,v 1.17 2014/02/08 22:06:17 misho Exp $ +* $Id: aitio.c,v 1.18 2016/08/18 09:06:31 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -12,7 +12,7 @@ terms: All of the documentation and software included in the ELWIX and AITNET Releases is copyrighted by ELWIX - Sofia/Bulgaria -Copyright 2004 - 2014 +Copyright 2004 - 2016 by Michael Pounov . All rights reserved. Redistribution and use in source and binary forms, with or without @@ -121,7 +121,11 @@ ioPromptRead(int *h, const char *csPrompt, char * __re memset(szLine, 0, BUFSIZ); if (!fgets(szLine, BUFSIZ, inp)) { clearerr(inp); +#ifdef HAVE_FPURGE fpurge(out); +#else + __fpurge(out); +#endif fflush(out); return 0; } @@ -152,7 +156,11 @@ ioPromptPassword(int *h, const char *csPrompt, char * int ret, ok = 0; FILE *inp, *out; char szLine[2][STRSIZ]; +#ifndef __linux__ struct sgttyb tty_state; +#else + struct termios o; +#endif if (!psPass || !passLen) return -1; @@ -168,6 +176,7 @@ ioPromptPassword(int *h, const char *csPrompt, char * return -1; } +#ifndef __linux__ if (ioctl(fileno(inp), TIOCGETP, &tty_state) == -1) { LOGERR; return -1; @@ -178,6 +187,18 @@ ioPromptPassword(int *h, const char *csPrompt, char * return -1; } } +#else + if (tcgetattr(fileno(inp), &o) == -1) { + LOGERR; + return -1; + } else { + o.c_lflag &= ~ECHO; + if (tcsetattr(fileno(inp), TCSANOW, &o) == -1) { + LOGERR; + return -1; + } + } +#endif while (!ok) { switch ((ret = ioPromptRead(h, (!csPrompt || !*csPrompt) ? "Password:" : csPrompt, @@ -214,11 +235,19 @@ ioPromptPassword(int *h, const char *csPrompt, char * } next: +#ifndef __linux__ tty_state.sg_flags |= ECHO; if (ioctl(fileno(inp), TIOCSETP, &tty_state) == -1) { LOGERR; return -1; } +#else + o.c_lflag |= ECHO; + if (tcsetattr(fileno(inp), TCSANOW, &o) == -1) { + LOGERR; + return -1; + } +#endif return ok; } @@ -271,15 +300,9 @@ end: return cx; } -/* - * 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 - * return: -1 error, !=-1 ok, number of total signaled events -*/ -int -ioWatchDirLoop(const char *csDir, int (*callback)(const char *csName, int nOp)) +#ifndef __linux__ +static int +watchDirLoop(const char *csDir, int (*callback)(const char *csName, int nOp)) { glob_t g[2] = {{ 0 }, { 0 }}; int d, kq, n = 0; @@ -293,15 +316,16 @@ ioWatchDirLoop(const char *csDir, int (*callback)(cons strlcpy(str, csDir, MAXPATHLEN); strlcat(str, "/*", MAXPATHLEN); - kq = kqueue(); - if (kq == -1) { + d = open(csDir, O_RDONLY); + if (d == -1) { LOGERR; return -1; } - d = open(csDir, O_RDONLY); - if (d == -1) { + + kq = kqueue(); + if (kq == -1) { LOGERR; - close(kq); + close(d); return -1; } @@ -309,8 +333,8 @@ ioWatchDirLoop(const char *csDir, int (*callback)(cons if ((n = glob(str, GLOB_NOCHECK, NULL, &g[0]))) { LOGERR; - close(d); close(kq); + close(d); return -1; } /*else ioDEBUG(3, "Start files %d in %s\n", g[0].gl_matchc, str);*/ @@ -378,9 +402,75 @@ ioWatchDirLoop(const char *csDir, int (*callback)(cons } globfree(&g[0]); - close(d); close(kq); + close(d); return n; +} +#else +static int +watchDirLoop(const char *csDir, int (*callback)(const char *csName, int nOp)) +{ + int d, in, rlen, n = 0; + register int i = 0; + struct inotify_event *evt; + char buf[BUFSIZ * (sizeof(struct inotify_event) + 16)]; + + if (!csDir || !callback) + return 0; + + in = inotify_init(); + if (in == -1) { + LOGERR; + return -1; + } + + d = inotify_add_watch(in, csDir, IN_CREATE | IN_DELETE | IN_MOVE); + + while ((rlen = read(in, buf, sizeof buf)) > 0) { + if (i >= rlen) + break; + else + evt = (struct inotify_event*) &buf[i]; + + if (evt->len) { + if (evt->mask & IN_CREATE) { + if (callback(evt->name, 1) < 0) + break; + else + n++; + } else if (evt->mask & IN_DELETE) { + if (callback(evt->name, -1) < 0) + break; + else + n++; + } else if (evt->mask & IN_MOVE) { + if (callback(evt->name, 0) < 0) + break; + else + n++; + } + } + + i += sizeof (struct inotify_event) + evt->len; + } + + inotify_rm_watch(in, d); + close(in); + return n; +} +#endif + +/* + * 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 + * return: -1 error, !=-1 ok, number of total signaled events +*/ +int +ioWatchDirLoop(const char *csDir, int (*callback)(const char *csName, int nOp)) +{ + return watchDirLoop(csDir, callback); } /*