// Register new peer. static int peermgtNew(struct s_peermgt *mgt, const struct s_nodeid *nodeid, const struct s_peeraddr *addr) { int tnow = utilGetTime(); int peerid = mapAddReturnID(&mgt->map, nodeid->id, &tnow); if(!(peerid < 0)) { mgt->data[peerid].state = peermgt_STATE_AUTHED; mgt->data[peerid].remoteaddr = *addr; mgt->data[peerid].conntime = tnow; mgt->data[peerid].lastrecv = tnow; mgt->data[peerid].lastsend = tnow; mgt->data[peerid].lastpeerinfo = tnow; seqInit(&mgt->data[peerid].seq, cryptoRand64()); mgt->data[peerid].remoteflags = 0; return peerid; } return -1; }
// Update NodeDB entry. static void nodedbUpdate(struct s_nodedb *db, struct s_nodeid *nodeid, struct s_peeraddr *addr, const int update_lastseen, const int update_lastconnect, const int update_lastconntry) { int tnow = utilGetClock(); struct s_map *addrset; struct s_map *newaddrset; struct s_nodedb_addrdata *addrdata; struct s_nodedb_addrdata addrdata_new; if(db != NULL && nodeid != NULL && addr != NULL) { addrset = mapGet(db->addrdb, nodeid->id); if(addrset == NULL) { newaddrset = mapGetValueByID(db->addrdb, mapAddReturnID(db->addrdb, nodeid->id, NULL)); if(newaddrset != NULL) { if(mapMemInit(newaddrset, mapMemSize(db->num_peeraddrs, peeraddr_SIZE, sizeof(struct s_nodedb_addrdata)), db->num_peeraddrs, peeraddr_SIZE, sizeof(struct s_nodedb_addrdata))) { mapEnableReplaceOld(newaddrset); addrset = newaddrset; } } } if(addrset != NULL) { addrdata_new.lastseen = 0; addrdata_new.lastconnect = 0; addrdata_new.lastconntry = 0; addrdata_new.lastseen_t = 0; addrdata_new.lastconnect_t = 0; addrdata_new.lastconntry_t = 0; if((addrdata = mapGet(addrset, addr->addr)) != NULL) { addrdata_new = *addrdata; } if(update_lastseen > 0) { addrdata_new.lastseen = 1; addrdata_new.lastseen_t = tnow; } if(update_lastconnect > 0) { addrdata_new.lastconnect = 1; addrdata_new.lastconnect_t = tnow; } if(update_lastconntry > 0) { addrdata_new.lastconntry = 1; addrdata_new.lastconntry_t = tnow; } mapSet(addrset, addr->addr, &addrdata_new); } } }