Diff for /libaitio/src/aitio.c between versions 1.2.2.2 and 1.2.2.3

version 1.2.2.2, 2011/02/10 19:45:07 version 1.2.2.3, 2011/02/10 21:54:23
Line 306  char *ioRegexReplace(const char *csRegex, const char * Line 306  char *ioRegexReplace(const char *csRegex, const char *
         return str;          return str;
 }  }
   
   /*
    * ioVarAst() 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()
   */
   char *
   ioVarAst(const char *csString)
   {
           char *ext, *str, *out = NULL;
           int e[2] = { 0 };
   
           if (!csString)
                   return NULL;
   
           if (!strchr(csString, '{') || !strrchr(csString, '}')) {
                   memset(io_Error, 0, STRSIZ);
                   snprintf(io_Error, STRSIZ, "Error:: Invalid input string format ... "
                                   "must be like {text[:[-]#[:#]]}");
                   io_Errno = EINVAL;
                   return NULL;
           } else {
                   str = strdup(strchr(csString, '{') + 1);
                   *strrchr(str, '}') = 0;
           }
   
           if ((ext = strchr(str, ':'))) {
                   *ext++ = 0;
                   e[0] = strtol(ext, NULL, 0);
                   if ((ext = strchr(ext, ':')))
                           e[1] = strtol(++ext, NULL, 0);
   
                   /* make cut prefix */
                   if (e[0] >= 0)
                           ext = str + e[0];
                   else
                           ext = str + strlen(str) + e[0];
                   /* make cut suffix */
                   if (e[1] > 0)
                           *(ext + e[1]) = 0;
           } else
                   /* ok, clear show */
                   ext = str;
   
           out = strdup(ext);
           free(str);
   
           return out;
   }
   
   
 /*  /*
  * ioMkDir() Function for racursive directory creation and validation   * ioMkDir() Function for racursive directory creation and validation
  * @csDir = Full directory path   * @csDir = Full directory path
Line 354  end: Line 403  end:
         return cx;          return cx;
 }  }
   
   
 /*  /*
 * ioVarAst() Function for evaluate string like asterisk variable "{text[:[-]#[:#]]}" * ioWatchDirLoop() Function for watching changes in directory and fire callback
 * @csString = Input string * @csDir = Full directory path
 * return: NULL error, !=NULL Allocated new string evaluated from input string, must be free() * @callback = Callback if raise event! nOp -1 delete, 0 change/move, 1 create
  * return: -1 error, !=-1 ok, number of total signaled events
 */  */
char *int
ioVarAst(const char *csString)ioWatchDirLoop(const char *csDir, int (*callback)(const char *csName, int nOp))
 {  {
        char *ext, *str, *out = NULL;        glob_t g[2] = {{ 0 }, { 0 }};
        int e[2] = { 0 };        int d, kq, n = 0;
         register int j, i;
         struct kevent req, chg;
         char wrk[MAXPATHLEN * 2], str[MAXPATHLEN] = { 0 };
   
        if (!csString)        if (!csDir || !callback)
                return NULL;                return 0;
   
        if (!strchr(csString, '{') || !strrchr(csString, '}')) {        strlcpy(str, csDir, MAXPATHLEN);
                memset(io_Error, 0, STRSIZ);        strlcat(str, "/*", MAXPATHLEN);
                snprintf(io_Error, STRSIZ, "Error:: Invalid input string format ... "
                                "must be like {text[:[-]#[:#]]}");        kq = kqueue();
                io_Errno = EINVAL;        if (kq == -1) {
                return NULL;                LOGERR;
        } else {                return -1;
                str = strdup(strchr(csString, '{') + 1); 
                *strrchr(str, '}') = 0; 
         }          }
           d = open(csDir, O_RDONLY);
           if (d == -1) {
                   LOGERR;
                   close(kq);
                   return -1;
           }
   
        if ((ext = strchr(str, ':'))) {        EV_SET(&req, d, EVFILT_VNODE, EV_ADD | EV_CLEAR, NOTE_WRITE, 0, NULL);
                *ext++ = 0; 
                e[0] = strtol(ext, NULL, 0); 
                if ((ext = strchr(ext, ':'))) 
                        e[1] = strtol(++ext, NULL, 0); 
   
                /* make cut prefix */        if ((n = glob(str, GLOB_NOCHECK, NULL, &g[0]))) {
                if (e[0] >= 0)                LOGERR;
                        ext = str + e[0];                close(d);
                else                close(kq);
                        ext = str + strlen(str) + e[0];                return -1;
                /* make cut suffix */        } /*else
                if (e[1] > 0)                ioDEBUG(3, "Start files %d in %s\n", g[0].gl_matchc, str);*/
                        *(ext + e[1]) = 0; 
        } else 
                /* ok, clear show */ 
                ext = str; 
   
        out = strdup(ext);        while (kevent(kq, &req, 1, &chg, 1, NULL) > 0) {
        free(str);                /*ioDEBUG(1, "Event:: req=0x%x -> chg=0x%x data=%x\n", req.fflags, chg.fflags, chg.data);*/
   
        return out;                if (!glob(str, GLOB_NOCHECK, NULL, &g[1])) {
                         /*ioDEBUG(3, "Diffs %d <> %d\n", g[0].gl_matchc, g[1].gl_matchc);*/
 
                         if (g[0].gl_matchc != g[1].gl_matchc) {
                                 /* find new items */
                                 for (j = 0; j < g[1].gl_matchc; j++) {
                                         for (i = 0; i < g[0].gl_matchc; i++)
                                                 if (!strcmp(g[0].gl_pathv[i], g[1].gl_pathv[j]))
                                                         break;
                                         if (i == g[0].gl_matchc) {
                                                 if (callback(g[1].gl_pathv[j], 1) < 0)
                                                         break;
                                                 else
                                                         n++;
                                         }
                                 }
                                 /* find del items */
                                 for (j = 0; j < g[0].gl_matchc; j++) {
                                         for (i = 0; i < g[1].gl_matchc; i++)
                                                 if (!strcmp(g[1].gl_pathv[i], g[0].gl_pathv[j]))
                                                         break;
                                         if (i == g[1].gl_matchc) {
                                                 if (callback(g[0].gl_pathv[j], -1) < 0)
                                                         break;
                                                 else
                                                         n++;
                                         }
                                 }
                         } else {
                                 /* find chg from items */
                                 for (j = 0; j < g[0].gl_matchc; j++) {
                                         for (i = 0; i < g[1].gl_matchc; i++)
                                                 if (!strcmp(g[1].gl_pathv[i], g[0].gl_pathv[j]))
                                                         break;
                                         if (i == g[1].gl_matchc) {
                                                 strlcpy(wrk, g[0].gl_pathv[j], sizeof wrk);
                                                 strlcat(wrk, ":", sizeof wrk);
                                         }
                                 }
                                 /* find chg to items */
                                 for (j = 0; j < g[1].gl_matchc; j++) {
                                         for (i = 0; i < g[0].gl_matchc; i++)
                                                 if (!strcmp(g[0].gl_pathv[i], g[1].gl_pathv[j]))
                                                         break;
                                         if (i == g[0].gl_matchc) {
                                                 strlcat(wrk, g[1].gl_pathv[j], sizeof wrk);
                                                 if (callback(wrk, 0) < 0)
                                                         break;
                                                 else
                                                         n++;
                                         }
                                 }
                         }
 
                         globfree(&g[0]);
                         g[0] = g[1];
                 }
         }
 
         globfree(&g[0]);
         close(d);
         close(kq);
         return n;
 }  }

Removed from v.1.2.2.2  
changed lines
  Added in v.1.2.2.3


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