--- libaitio/src/aitio.c 2013/05/26 20:17:22 1.14.4.1 +++ libaitio/src/aitio.c 2016/08/10 14:19:50 1.17.8.3 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: aitio.c,v 1.14.4.1 2013/05/26 20:17:22 misho Exp $ +* $Id: aitio.c,v 1.17.8.3 2016/08/10 14:19:50 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, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 +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; } @@ -282,9 +311,12 @@ int ioWatchDirLoop(const char *csDir, int (*callback)(const char *csName, int nOp)) { glob_t g[2] = {{ 0 }, { 0 }}; - int d, kq, n = 0; + int d, n = 0; register int j, i; +#ifndef __linux__ + int kq; struct kevent req, chg; +#endif char wrk[MAXPATHLEN * 2], str[MAXPATHLEN] = { 0 }; if (!csDir || !callback) @@ -293,28 +325,34 @@ 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) { + +#ifndef __linux__ + kq = kqueue(); + if (kq == -1) { LOGERR; - close(kq); + close(d); return -1; } EV_SET(&req, d, EVFILT_VNODE, EV_ADD | EV_CLEAR, NOTE_WRITE, 0, 0); +#endif if ((n = glob(str, GLOB_NOCHECK, NULL, &g[0]))) { LOGERR; close(d); +#ifndef __linux__ close(kq); +#endif return -1; } /*else ioDEBUG(3, "Start files %d in %s\n", g[0].gl_matchc, str);*/ +#ifndef __linux__ while (kevent(kq, &req, 1, &chg, 1, NULL) > 0) { /*ioDEBUG(1, "Event:: req=0x%x -> chg=0x%x data=%x\n", req.fflags, chg.fflags, chg.data);*/ @@ -376,10 +414,13 @@ ioWatchDirLoop(const char *csDir, int (*callback)(cons g[0] = g[1]; } } +#endif globfree(&g[0]); - close(d); +#ifndef __linux__ close(kq); +#endif + close(d); return n; } @@ -546,4 +587,37 @@ ioRecvFile(int s, const char *csFile, size_t recvLen, munmap(addr, recvLen); return len; +} + +/* + * ioRealFileName() - Get real file name + * + * @fname = filename + * return: =NULL error or !=NULL real filename, should be free with e_free() + */ +char * +ioRealFileName(const char *fname) +{ + char *str = NULL; + struct stat sb; + + if (!fname) + return NULL; + + str = e_malloc(MAXPATHLEN); + if (!str) { + io_SetErr(elwix_GetErrno(), "%s", elwix_GetError()); + return NULL; + } else + memset(str, 0, MAXPATHLEN); + if (readlink(fname, str, MAXPATHLEN) == -1) { + if (stat(fname, &sb) == -1) { + LOGERR; + e_free(str); + return NULL; + } else + strlcpy(str, fname, MAXPATHLEN); + } + + return str; }