Changeset 373 for trunk/src/sh_inotify.c


Ignore:
Timestamp:
Nov 1, 2011, 9:29:51 PM (13 years ago)
Author:
katerina
Message:

Patch for ticket #265 (inotify). Handling of added subdirectories and file list rescan.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/sh_inotify.c

    r372 r373  
    128128  short  type;
    129129  int    class;
     130  int    rdepth;
    130131  unsigned long check_mask;
    131132  char * file;
     
    245246}
    246247
    247 static sh_watch * sh_inotify_create_watch(char * file, int nwatch, int flag)
     248static sh_watch * sh_inotify_create_watch(const char * file, int nwatch, int flag)
    248249{
    249250  sh_watch * this = SH_ALLOC(sizeof(sh_watch));
     
    356357
    357358char * sh_inotify_pop_dormant(sh_watches * watches,
    358                               int * class, unsigned long * check_mask, int * type)
     359                              int * class, unsigned long * check_mask,
     360                              int * type, int * rdepth)
    359361{
    360362  char * popret = NULL;
     
    372374  if (this)
    373375    {
    374       *class = this->watch->class;
    375       *type  = this->watch->type;
     376      *class  = this->watch->class;
     377      *type   = this->watch->type;
     378      *rdepth = this->watch->rdepth;
    376379      *check_mask = this->watch->check_mask;
    377       popret = sh_util_strdup(this->watch->file);
     380      popret  = sh_util_strdup(this->watch->file);
    378381
    379382      watches->dormant_watches = this->next;
     
    472475/* Create an item and put it on the 'dormant' list for later watch creation
    473476 */
    474 int sh_inotify_add_watch_later(char * filename, sh_watches * watches,
     477int sh_inotify_add_watch_later(const char * filename, sh_watches * watches,
    475478                               int * errnum,
    476                                int class, unsigned long check_mask, int type)
     479                               int class, unsigned long check_mask, int type, int rdepth)
    477480{
    478481  sh_watch   * item;
     
    482485  item->class      = class;
    483486  item->type       = (short) type;
     487  item->rdepth     = (short) rdepth;
    484488  item->check_mask = check_mask;
    485489
     
    574578 */
    575579int sh_inotify_add_watch(char * filename, sh_watches * watches, int * errnum,
    576                          int class, unsigned long check_mask, int type)
     580                         int class, unsigned long check_mask, int type, int rdepth)
    577581{
    578582  volatile int retval = 0;
     
    618622          item->class      = class;
    619623          item->type       = type;
     624          item->rdepth     = rdepth;
    620625          item->check_mask = check_mask;
    621626         
     
    646651          ++(watches->count);
    647652        }
     653      else if (type == SH_INOTIFY_DIR) /* watch exists */
     654        {
     655          /* This covers the case that a directory has been added,
     656           * but is watched as file at first because it is also
     657           * specified as file in the config.
     658           */
     659          item = zAVLSearch(watches->list_of_watches, &index);
     660
     661          if (item && item->type == SH_INOTIFY_FILE)
     662            {
     663              item->type = SH_INOTIFY_DIR;
     664            }
     665        }
    648666    }
    649667 retpoint:
     
    655673
    656674char * sh_inotify_search_item(sh_watches * watches, int watch,
    657                               int * class, unsigned long * check_mask, int * type)
     675                              int * class, unsigned long * check_mask,
     676                              int * type, int * rdepth)
    658677{
    659678  sh_watch * item;
     
    673692      *check_mask = item->check_mask;
    674693      *type       = item->type;
     694      *rdepth     = item->rdepth;
    675695      sret = sh_util_strdup(item->file);
    676696    }
     
    710730      if (filename)
    711731        {
    712           if (sh_inotify_add_watch(filename, watches, errnum, 0, 0, SH_INOTIFY_FILE) < 0)
     732          if (sh_inotify_add_watch(filename, watches, errnum,
     733                                   0, 0, SH_INOTIFY_FILE, 0) < 0)
    713734            {
    714735              retry_msleep(waitsec, 0);
     
    841862
    842863int sh_inotify_add_watch(char * filename, sh_watches * watches, int  * errnum,
    843                          int class, unsigned long check_mask)
     864                         int class, unsigned long check_mask, int type, int rdepth)
    844865{
    845866  (void) filename;
     
    847868  (void) class;
    848869  (void) check_mask;
     870  (void) type;
     871  (void) rdepth;
    849872  *errnum = 0;
    850873  return 0;
    851874}
    852875
    853 int sh_inotify_add_watch_later(char * filename, sh_watches * watches,
     876int sh_inotify_add_watch_later(const char * filename, sh_watches * watches,
    854877                               int  * errnum,
    855                                int class, unsigned long check_mask)
     878                               int class, unsigned long check_mask, int type, int rdepth)
    856879{
    857880  (void) filename;
     
    859882  (void) class;
    860883  (void) check_mask;
     884  (void) type;
     885  (void) rdepth;
    861886  *errnum = 0;
    862887  return 0;
     
    876901  char * p;
    877902  int class;
     903  int type;
     904  int rdepth;
    878905  unsigned long check_mask;
    879906  int           nrun = 0;
    880907
    881   sh_watch aw1 = { -1, 0, 1, 1, "a1" };
    882   sh_watch aw2 = { -1, 0, 2, 1, "a2" };
    883   sh_watch aw3 = {  2, 0, 3, 1, "a3" };
    884   sh_watch aw4 = { -1, 0, 4, 1, "a4" };
    885   sh_watch aw5 = {  5, 0, 5, 1, "a5" };
     908  sh_watch aw1 = { -1, 0, 0, 1, 99, 1, "a1" };
     909  sh_watch aw2 = { -1, 0, 0, 2, 99, 1, "a2" };
     910  sh_watch aw3 = {  2, 0, 0, 3, 99, 1, "a3" };
     911  sh_watch aw4 = { -1, 0, 0, 4, 99, 1, "a4" };
     912  sh_watch aw5 = {  5, 0, 0, 5, 99, 1, "a5" };
    886913
    887914  do {
     
    971998    CuAssertIntEquals(tc, count, 5);
    972999   
    973     p = sh_inotify_pop_dormant(&twatch, &class, &check_mask);
     1000    p = sh_inotify_pop_dormant(&twatch, &class, &check_mask, &type, &rdepth);
    9741001    CuAssertStrEquals(tc, p, "a5");
    9751002   
    976     p = sh_inotify_pop_dormant(&twatch, &class, &check_mask);
     1003    p = sh_inotify_pop_dormant(&twatch, &class, &check_mask, &type, &rdepth);
    9771004    CuAssertStrEquals(tc, p, "a3");
    9781005    CuAssertIntEquals(tc, class, 3);
    9791006   
    980     p = sh_inotify_pop_dormant(&twatch, &class, &check_mask);
     1007    p = sh_inotify_pop_dormant(&twatch, &class, &check_mask, &type, &rdepth);
    9811008    CuAssertTrue(tc, NULL == p);
    9821009    CuAssertTrue(tc, NULL == twatch.dormant_watches);
Note: See TracChangeset for help on using the changeset viewer.