Diff for /libaitio/src/aitio.c between versions 1.13.8.2 and 1.17.8.5

version 1.13.8.2, 2013/01/17 12:56:22 version 1.17.8.5, 2016/08/10 15:18:23
Line 12  terms: Line 12  terms:
 All of the documentation and software included in the ELWIX and AITNET  All of the documentation and software included in the ELWIX and AITNET
 Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org>  Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org>
   
Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013Copyright 2004 - 2016
         by Michael Pounov <misho@elwix.org>.  All rights reserved.          by Michael Pounov <misho@elwix.org>.  All rights reserved.
   
 Redistribution and use in source and binary forms, with or without  Redistribution and use in source and binary forms, with or without
Line 55  char io_Error[STRSIZ]; Line 55  char io_Error[STRSIZ];
   
   
 // io_GetErrno() Get error code of last operation  // io_GetErrno() Get error code of last operation
inline intint
 io_GetErrno()  io_GetErrno()
 {  {
         return io_Errno;          return io_Errno;
 }  }
   
 // io_GetError() Get error text of last operation  // io_GetError() Get error text of last operation
inline const char *const char *
 io_GetError()  io_GetError()
 {  {
         return io_Error;          return io_Error;
 }  }
   
 // io_SetErr() Set error to variables for internal use!!!  // io_SetErr() Set error to variables for internal use!!!
inline voidvoid
 io_SetErr(int eno, char *estr, ...)  io_SetErr(int eno, char *estr, ...)
 {  {
         va_list lst;          va_list lst;
Line 121  ioPromptRead(int *h, const char *csPrompt, char * __re Line 121  ioPromptRead(int *h, const char *csPrompt, char * __re
                 memset(szLine, 0, BUFSIZ);                  memset(szLine, 0, BUFSIZ);
                 if (!fgets(szLine, BUFSIZ, inp)) {                  if (!fgets(szLine, BUFSIZ, inp)) {
                         clearerr(inp);                          clearerr(inp);
   #ifdef HAVE_FPURGE
                         fpurge(out);                          fpurge(out);
   #else
                           __fpurge(out);
   #endif
                         fflush(out);                          fflush(out);
                         return 0;                          return 0;
                 }                  }
Line 152  ioPromptPassword(int *h, const char *csPrompt, char *  Line 156  ioPromptPassword(int *h, const char *csPrompt, char * 
         int ret, ok = 0;          int ret, ok = 0;
         FILE *inp, *out;          FILE *inp, *out;
         char szLine[2][STRSIZ];          char szLine[2][STRSIZ];
   #ifndef __linux__
         struct sgttyb tty_state;          struct sgttyb tty_state;
   #else
           struct termios o;
   #endif
   
         if (!psPass || !passLen)          if (!psPass || !passLen)
                 return -1;                  return -1;
Line 168  ioPromptPassword(int *h, const char *csPrompt, char *  Line 176  ioPromptPassword(int *h, const char *csPrompt, char * 
                 return -1;                  return -1;
         }          }
   
   #ifndef __linux__
         if (ioctl(fileno(inp), TIOCGETP, &tty_state) == -1) {          if (ioctl(fileno(inp), TIOCGETP, &tty_state) == -1) {
                 LOGERR;                  LOGERR;
                 return -1;                  return -1;
Line 178  ioPromptPassword(int *h, const char *csPrompt, char *  Line 187  ioPromptPassword(int *h, const char *csPrompt, char * 
                         return -1;                          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) {          while (!ok) {
                 switch ((ret = ioPromptRead(h, (!csPrompt || !*csPrompt) ? "Password:" : csPrompt,                   switch ((ret = ioPromptRead(h, (!csPrompt || !*csPrompt) ? "Password:" : csPrompt, 
Line 214  ioPromptPassword(int *h, const char *csPrompt, char *  Line 235  ioPromptPassword(int *h, const char *csPrompt, char * 
         }          }
   
 next:  next:
   #ifndef __linux__
         tty_state.sg_flags |= ECHO;          tty_state.sg_flags |= ECHO;
         if (ioctl(fileno(inp), TIOCSETP, &tty_state) == -1) {          if (ioctl(fileno(inp), TIOCSETP, &tty_state) == -1) {
                 LOGERR;                  LOGERR;
                 return -1;                  return -1;
         }          }
   #else
           o.c_lflag |= ECHO;
           if (tcsetattr(fileno(inp), TCSANOW, &o) == -1) {
                   LOGERR;
                   return -1;
           }
   #endif
   
         return ok;          return ok;
 }  }
Line 271  end: Line 300  end:
         return cx;          return cx;
 }  }
   
/*#ifndef __linux__
 * ioWatchDirLoop() - Function for watching changes in directory and fire callbackstatic int
 *watchDirLoop(const char *csDir, int (*callback)(const char *csName, int nOp))
 * @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)) 
 {  {
         glob_t g[2] = {{ 0 }, { 0 }};          glob_t g[2] = {{ 0 }, { 0 }};
         int d, kq, n = 0;          int d, kq, n = 0;
Line 293  ioWatchDirLoop(const char *csDir, int (*callback)(cons Line 316  ioWatchDirLoop(const char *csDir, int (*callback)(cons
         strlcpy(str, csDir, MAXPATHLEN);          strlcpy(str, csDir, MAXPATHLEN);
         strlcat(str, "/*", MAXPATHLEN);          strlcat(str, "/*", MAXPATHLEN);
   
        kq = kqueue();        d = open(csDir, O_RDONLY);
        if (kq == -1) {        if (d == -1) {
                 LOGERR;                  LOGERR;
                 return -1;                  return -1;
         }          }
        d = open(csDir, O_RDONLY);
        if (d == -1) {        kq = kqueue();
         if (kq == -1) {
                 LOGERR;                  LOGERR;
                close(kq);                close(d);
                 return -1;                  return -1;
         }          }
   
Line 309  ioWatchDirLoop(const char *csDir, int (*callback)(cons Line 333  ioWatchDirLoop(const char *csDir, int (*callback)(cons
   
         if ((n = glob(str, GLOB_NOCHECK, NULL, &g[0]))) {          if ((n = glob(str, GLOB_NOCHECK, NULL, &g[0]))) {
                 LOGERR;                  LOGERR;
                 close(d);  
                 close(kq);                  close(kq);
                   close(d);
                 return -1;                  return -1;
         } /*else          } /*else
                 ioDEBUG(3, "Start files %d in %s\n", g[0].gl_matchc, str);*/                  ioDEBUG(3, "Start files %d in %s\n", g[0].gl_matchc, str);*/
Line 378  ioWatchDirLoop(const char *csDir, int (*callback)(cons Line 402  ioWatchDirLoop(const char *csDir, int (*callback)(cons
         }          }
   
         globfree(&g[0]);          globfree(&g[0]);
         close(d);  
         close(kq);          close(kq);
           close(d);
         return n;          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);
   }
   
   /*
  * ioCreatePIDFile() - Create PID file   * ioCreatePIDFile() - Create PID file
  *   *
  * @csName = PID filename   * @csName = PID filename
  * @ifExists = !=0 if filename exists return error   * @ifExists = !=0 if filename exists return error
  * return: -1 error or 0 ok   * return: -1 error or 0 ok
  */   */
inline intint
 ioCreatePIDFile(const char *csName, int ifExists)  ioCreatePIDFile(const char *csName, int ifExists)
 {  {
         int fd;          int fd;
Line 546  ioRecvFile(int s, const char *csFile, size_t recvLen,  Line 636  ioRecvFile(int s, const char *csFile, size_t recvLen, 
   
         munmap(addr, recvLen);          munmap(addr, recvLen);
         return len;          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;
 }  }

Removed from v.1.13.8.2  
changed lines
  Added in v.1.17.8.5


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>