Diff for /libaitio/src/aitio.c between versions 1.17.8.4 and 1.18

version 1.17.8.4, 2016/08/10 14:33:23 version 1.18, 2016/08/18 09:06:31
Line 300  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, n = 0;        int d, kq, n = 0;
         register int j, i;          register int j, i;
 #ifndef __linux__  
         int kq;  
         struct kevent req, chg;          struct kevent req, chg;
 #else  
         int in;  
         struct inotify_event evt;  
 #endif  
         char wrk[MAXPATHLEN * 2], str[MAXPATHLEN] = { 0 };          char wrk[MAXPATHLEN * 2], str[MAXPATHLEN] = { 0 };
   
         if (!csDir || !callback)          if (!csDir || !callback)
Line 328  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);
   
 #ifndef __linux__  
         d = open(csDir, O_RDONLY);          d = open(csDir, O_RDONLY);
         if (d == -1) {          if (d == -1) {
                 LOGERR;                  LOGERR;
Line 343  ioWatchDirLoop(const char *csDir, int (*callback)(cons Line 330  ioWatchDirLoop(const char *csDir, int (*callback)(cons
         }          }
   
         EV_SET(&req, d, EVFILT_VNODE, EV_ADD | EV_CLEAR, NOTE_WRITE, 0, 0);          EV_SET(&req, d, EVFILT_VNODE, EV_ADD | EV_CLEAR, NOTE_WRITE, 0, 0);
 #else  
         in = inotify_init();  
         if (in == -1) {  
                 LOGERR;  
                 return -1;  
         }  
   
         d = inotify_add_watch(in, csDir, IN_CREATE | IN_DELETE);  
 #endif  
   
         if ((n = glob(str, GLOB_NOCHECK, NULL, &g[0]))) {          if ((n = glob(str, GLOB_NOCHECK, NULL, &g[0]))) {
                 LOGERR;                  LOGERR;
 #ifndef __linux__  
                 close(kq);                  close(kq);
                 close(d);                  close(d);
 #else  
                 inotify_rm_watch(in, d);  
                 close(in);  
 #endif  
                 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);*/
   
 #ifndef __linux__  
         while (kevent(kq, &req, 1, &chg, 1, NULL) > 0) {          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);*/                  /*ioDEBUG(1, "Event:: req=0x%x -> chg=0x%x data=%x\n", req.fflags, chg.fflags, chg.data);*/
   
Line 428  ioWatchDirLoop(const char *csDir, int (*callback)(cons Line 400  ioWatchDirLoop(const char *csDir, int (*callback)(cons
                         g[0] = g[1];                          g[0] = g[1];
                 }                  }
         }          }
 #endif  
   
         globfree(&g[0]);          globfree(&g[0]);
 #ifndef __linux__  
         close(kq);          close(kq);
         close(d);          close(d);
           return n;
   }
 #else  #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);          inotify_rm_watch(in, d);
         close(in);          close(in);
 #endif  
         return n;          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);
 }  }
   
 /*  /*

Removed from v.1.17.8.4  
changed lines
  Added in v.1.18


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