diff options
| -rw-r--r-- | src/ipcpd/normal/dht.c | 38 | 
1 files changed, 31 insertions, 7 deletions
| diff --git a/src/ipcpd/normal/dht.c b/src/ipcpd/normal/dht.c index 836a0c53..221248aa 100644 --- a/src/ipcpd/normal/dht.c +++ b/src/ipcpd/normal/dht.c @@ -2223,6 +2223,20 @@ int dht_bootstrap(struct dht * dht,          return -1;  } +static struct ref_entry * ref_entry_get(struct dht *    dht, +                                        const uint8_t * key) +{ +        struct list_head * p; + +        list_for_each(p, &dht->refs) { +                struct ref_entry * r = list_entry(p, struct ref_entry, next); +                if (!memcmp(key, r->key, dht-> b) ) +                        return r; +        } + +        return NULL; +} +  int dht_reg(struct dht *    dht,              const uint8_t * key)  { @@ -2237,11 +2251,19 @@ int dht_reg(struct dht *    dht,          if (dht_get_state(dht) != DHT_RUNNING)                  return -1; +        pthread_rwlock_wrlock(&dht->lock); + +        if (ref_entry_get(dht, key) != NULL) { +                log_dbg("Name already registered."); +                pthread_rwlock_unlock(&dht->lock); +                return 0; +        } +          e = ref_entry_create(dht, key); -        if (e == NULL) +        if (e == NULL) { +                pthread_rwlock_unlock(&dht->lock);                  return -ENOMEM; - -        pthread_rwlock_wrlock(&dht->lock); +        }          list_add(&e->next, &dht->refs); @@ -2305,7 +2327,7 @@ uint64_t dht_query(struct dht *    dht,          pthread_rwlock_unlock(&dht->lock); -        if (addrs[0] != 0 && addrs[0] != dht->addr) +        if (addrs[0] != 0)                  return addrs[0];          lu = kad_lookup(dht, key, KAD_FIND_VALUE); @@ -2477,10 +2499,11 @@ static void * dht_handle_sdu(void * o)                          break;                  } -                if (msg->code != KAD_JOIN && -                    dht_get_state(dht) == DHT_RUNNING) { +                if (msg->code != KAD_JOIN) {                          pthread_rwlock_wrlock(&dht->lock); -                        if (dht_update_bucket(dht, msg->s_id.data, addr)) +                        if ((dht->state == DHT_JOINING || +                             dht->state == DHT_RUNNING) && +                            dht_update_bucket(dht, msg->s_id.data, addr)                                  log_warn("Failed to update bucket.");                          pthread_rwlock_unlock(&dht->lock);                  } @@ -2606,6 +2629,7 @@ static void * join_thr(void * o)          while (kad_join(info->dht, info->addr)) {                  if (retr++ == KAD_JOIN_RETR) {                          dht_set_state(info->dht, DHT_INIT); +                        log_warn("DHT enrollment attempt failed.");                          goto finish;                  } | 
