示例#1
0
void mtev_skiplist_add_index(mtev_skiplist *sl,
                             mtev_skiplist_comparator_t comp,
                             mtev_skiplist_comparator_t compk) {
  mtev_skiplist_node *m = NULL;
  mtev_skiplist *ni;
  int icount=0;
  mtev_skiplist_find(sl->index, (void *)comp, &m);
  if(m) return; /* Index already there! */
  ni = (mtev_skiplist *)malloc(sizeof(mtev_skiplist));
  mtev_skiplisti_init(ni);
  mtev_skiplist_set_compare(ni, comp, compk);
  /* Build the new index... This can be expensive! */
  m = mtev_skiplist_insert(sl->index, ni);
  while(m->prev) m=m->prev, icount++;
  for(m=mtev_skiplist_getlist(sl); m; mtev_skiplist_next(sl, &m)) {
    int j=icount-1;
    mtev_skiplist_node *nsln;
    nsln = mtev_skiplist_insert(ni, m->data);
    /* skip from main index down list */
    while(j>0) m=m->nextindex, j--;
    /* insert this node in the indexlist after m */
    nsln->nextindex = m->nextindex;
    if(m->nextindex) m->nextindex->previndex = nsln;
    nsln->previndex = m;
    m->nextindex = nsln;
  } 
}
示例#2
0
int noit_check_resolver_fetch(const char *target, char *buff, int len,
                              uint8_t prefer_family) {
  int i, rv;
  uint8_t progression[2];
  dns_cache_node *n;
  void *vnode;

  buff[0] = '\0';
  if(!target) return -1;
  progression[0] = prefer_family;
  progression[1] = (prefer_family == AF_INET) ? AF_INET6 : AF_INET;

  if(mtev_hash_retrieve(&etc_hosts_cache, target, strlen(target), &vnode)) {
    static_host_node *node = vnode;
    for(i=0; i<2; i++) {
      switch(progression[i]) {
        case AF_INET:
          if(node->has_ip4) {
            inet_ntop(AF_INET, &node->ip4, buff, len);
            return 1;
          }
          break;
        case AF_INET6:
          if(node->has_ip6) {
            inet_ntop(AF_INET6, &node->ip6, buff, len);
            return 1;
          }
          break;
      }
    }
  }

  rv = -1;
  DCLOCK();
  n = mtev_skiplist_find(&nc_dns_cache, target, NULL);
  if(n != NULL) {
    if(n->last_updated == 0) goto leave; /* not resolved yet */
    rv = n->ip4_cnt + n->ip6_cnt;
    for(i=0; i<2; i++) {
      switch(progression[i]) {
        case AF_INET:
          if(n->ip4_cnt > 0) {
            inet_ntop(AF_INET, &n->ip4[0], buff, len);
            goto leave;
          }
          break;
        case AF_INET6:
          if(n->ip6_cnt > 0) {
            inet_ntop(AF_INET6, &n->ip6[0], buff, len);
            goto leave;
          }
          break;
      }
    }
  }
 leave:
  DCUNLOCK();
  return rv;
}
示例#3
0
static void fetch_and_kill_by_check(int64_t check_no) {
  struct proc_state *ps;
  ps = mtev_skiplist_find(&active_procs, &check_no, NULL);
  if(ps) {
    ps->cancelled = 1;
    kill(ps->pid, SIGKILL);
  }
}
示例#4
0
static int
noit_console_manip_dns_cache(mtev_console_closure_t ncct,
                             int argc, char **argv,
                             mtev_console_state_t *dstate,
                             void *closure) {
  int i;
  if(argc == 0) {
    nc_printf(ncct, "dns_cache what?\n");
    return 0;
  }
  DCLOCK();
  if(closure == NULL) {
    /* adding */
    for(i=0;i<argc;i++) {
      dns_cache_node *n;
      n = mtev_skiplist_find(&nc_dns_cache, argv[i], NULL);
      if(NULL != n) {
        nc_printf(ncct, " == Already in system ==\n");
        nc_print_dns_cache_node(ncct, argv[i], n);
      }
      else {
        nc_printf(ncct, "%s submitted.\n", argv[i]);
        noit_check_resolver_remind_internal(argv[i], mtev_false);
      }
    }
  }
  else {
    for(i=0;i<argc;i++) {
      dns_cache_node *n;
      n = mtev_skiplist_find(&nc_dns_cache, argv[i], NULL);
      if(NULL != n) {
        if(n->lookup_inflight_v4 || n->lookup_inflight_v6)
          nc_printf(ncct, "%s is currently resolving and cannot be removed.\n");
        else {
          mtev_skiplist_remove(&nc_dns_cache, argv[i], dns_cache_node_free);
          nc_printf(ncct, "%s removed.\n", argv[i]);
        }
      }
      else nc_printf(ncct, "%s not in system.\n", argv[i]);
    }
  }
  DCUNLOCK();
  return 0;
}
示例#5
0
int mtev_skiplist_remove_compare(mtev_skiplist *sli,
                                 const void *data,
                                 mtev_freefunc_t myfree,
                                 mtev_skiplist_comparator_t comp) {
  mtev_skiplist_node *m;
  mtev_skiplist *sl;
  if(comp==sli->comparek || !sli->index) {
    sl = sli;
  } else {
    mtev_skiplist_find(sli->index, (void *)comp, &m);
    mtevAssert(m);
    sl= (mtev_skiplist *) m->data;
  }
  mtev_skiplisti_find_compare(sl, data, &m, NULL, NULL, sl->comparek);
  if(!m) return 0;
  while(m->previndex) m=m->previndex;
  return mtev_skiplisti_remove(m->sl, m, myfree);
}
示例#6
0
static void
noit_check_resolver_remind_internal(const char *target,
                                    mtev_boolean needs_lock) {
  dns_cache_node *n;
  if(!target) return;
  if(needs_lock) DCLOCK();
  n = mtev_skiplist_find(&nc_dns_cache, target, NULL);
  if(n != NULL) {
    n->last_needed = time(NULL);
    if(needs_lock) DCUNLOCK();
    return; 
  }
  n = calloc(1, sizeof(*n));
  n->target = strdup(target);
  n->last_needed = time(NULL);
  mtev_skiplist_insert(&nc_dns_cache, n);
  if(needs_lock) DCUNLOCK();
}
示例#7
0
void *mtev_skiplist_find_neighbors_compare(mtev_skiplist *sli,
                                           const void *data,
                                           mtev_skiplist_node **iter,
                                           mtev_skiplist_node **prev,
                                           mtev_skiplist_node **next,
                                           mtev_skiplist_comparator_t comp) {
  mtev_skiplist_node *m = NULL;
  mtev_skiplist *sl;
  if(iter) *iter = NULL;
  if(prev) *prev = NULL;
  if(next) *next = NULL;
  if(comp==sli->compare || !sli->index) {
    sl = sli;
  } else {
    mtev_skiplist_find(sli->index, (void *)comp, &m);
    mtevAssert(m);
    sl= (mtev_skiplist *) m->data;
  }
  mtev_skiplisti_find_compare(sl, data, iter, prev, next, sl->comparek);
  return (iter && *iter)?((*iter)->data):NULL;
}
示例#8
0
static int
noit_console_show_dns_cache(mtev_console_closure_t ncct,
                            int argc, char **argv,
                            mtev_console_state_t *dstate,
                            void *closure) {
  int i;

  DCLOCK();
  if(argc == 0) {
    mtev_skiplist_node *sn;
    for(sn = mtev_skiplist_getlist(&nc_dns_cache); sn;
        mtev_skiplist_next(&nc_dns_cache, &sn)) {
      dns_cache_node *n = (dns_cache_node *)sn->data;
      nc_print_dns_cache_node(ncct, n->target, n);
    }
  }
  for(i=0;i<argc;i++) {
    dns_cache_node *n;
    n = mtev_skiplist_find(&nc_dns_cache, argv[i], NULL);
    nc_print_dns_cache_node(ncct, argv[i], n);
  }
  DCUNLOCK();
  return 0;
}