bool MapContainsSameKeys(const Map *map1, const Map *map2) { assert(map1 != NULL); assert(map2 != NULL); MapIterator i = MapIteratorInit((Map *)map1); MapKeyValue *item; size_t count = 0; while ((item = MapIteratorNext(&i))) { count++; if (!MapHasKey(map2, item->key)) { return false; } } return (count == MapSize(map2)); }
size_t MapSize(const Map *map) { assert(map != NULL); if (IsArrayMap(map)) { return map->arraymap->size; } else { MapIterator i = MapIteratorInit((Map*)map); size_t size = 0; while (MapIteratorNext(&i)) { size++; } return size; } }
Class *ClassTableIteratorNext(ClassTableIterator *iter) { MapKeyValue *keyvalue; while ((keyvalue = MapIteratorNext(&iter->iter)) != NULL) { Class *cls = keyvalue->value; /* Make sure we never store "default" as namespace in the ClassTable, * instead we have always ns==NULL in that case. */ CF_ASSERT_FIX(cls->ns == NULL || strcmp(cls->ns, "default") != 0, (cls->ns = NULL), "Class table contained \"default\" namespace," " should never happen!"); const char *key_ns = cls->ns ? cls->ns : "default"; if (iter->ns && strcmp(key_ns, iter->ns) != 0) { continue; } if (iter->is_soft && !iter->is_soft) { continue; } if (iter->is_hard && !iter->is_hard) { continue; } return cls; } return NULL; }
void *SetIteratorNext(SetIterator *i) { MapKeyValue *kv = MapIteratorNext(i); return kv ? kv->key : NULL; }
bool ScanLastSeenQuality(LastSeenQualityCallback callback, void *ctx) { StringMap *lastseen_db = LoadDatabaseToStringMap(dbid_lastseen); if (!lastseen_db) { return false; } MapIterator it = MapIteratorInit(lastseen_db->impl); MapKeyValue *item; Seq *hostkeys = SeqNew(100, free); while ((item = MapIteratorNext(&it)) != NULL) { char *key = item->key; /* Only look for "keyhost" entries */ if (key[0] != 'k') { continue; } SeqAppend(hostkeys, xstrdup(key + 1)); } for (int i = 0; i < SeqLength(hostkeys); ++i) { const char *hostkey = SeqAt(hostkeys, i); char keyhost_key[CF_BUFSIZE]; snprintf(keyhost_key, CF_BUFSIZE, "k%s", hostkey); char *address = NULL; address = (char*)StringMapGet(lastseen_db, keyhost_key); if (!address) { Log(LOG_LEVEL_ERR, "Failed to read address for key '%s'.", hostkey); continue; } char incoming_key[CF_BUFSIZE]; snprintf(incoming_key, CF_BUFSIZE, "qi%s", hostkey); KeyHostSeen *incoming = NULL; incoming = (KeyHostSeen*)StringMapGet(lastseen_db, incoming_key); if (incoming) { if (!(*callback)(hostkey, address, true, incoming, ctx)) { break; } } char outgoing_key[CF_BUFSIZE]; snprintf(outgoing_key, CF_BUFSIZE, "qo%s", hostkey); KeyHostSeen *outgoing = NULL; outgoing = (KeyHostSeen*)StringMapGet(lastseen_db, outgoing_key); if (outgoing) { if (!(*callback)(hostkey, address, false, outgoing, ctx)) { break; } } } StringMapDestroy(lastseen_db); SeqDestroy(hostkeys); return true; }