/* Perform name match against the schema. Result is stored in * match_type. */ void cnode_schema_match(struct cnode *schema, char *name, enum match_type *match_type) { switch (schema->type) { case CNODE_TYPE_KEYWORD: keyword_match(name, schema->name, match_type); break; case CNODE_TYPE_WORD: word_match(name, match_type); break; case CNODE_TYPE_IPV4: ipv4_match(name, match_type); break; case CNODE_TYPE_IPV4_PREFIX: ipv4_prefix_match(name, match_type); break; case CNODE_TYPE_IPV6: ipv6_match(name, match_type); break; case CNODE_TYPE_IPV6_PREFIX: ipv6_prefix_match(name, match_type); break; case CNODE_TYPE_MAC: mac_address_match(name, match_type); break; case CNODE_TYPE_RANGE: range_match(name, schema, match_type); break; default: *match_type = NONE_MATCH; break; } }
static int compare_name (int mode, const char *name, const char *uid, size_t uidlen) { int i; const char *s, *se; if (mode == KEYDB_SEARCH_MODE_EXACT) { for (i=0; name[i] && uidlen; i++, uidlen--) if (uid[i] != name[i]) break; if (!uidlen && !name[i]) return 0; /* found */ } else if (mode == KEYDB_SEARCH_MODE_SUBSTR) { if (ascii_memistr( uid, uidlen, name )) return 0; } else if ( mode == KEYDB_SEARCH_MODE_MAIL || mode == KEYDB_SEARCH_MODE_MAILSUB || mode == KEYDB_SEARCH_MODE_MAILEND) { for (i=0, s= uid; i < uidlen && *s != '<'; s++, i++) ; if (i < uidlen) { /* skip opening delim and one char and look for the closing one*/ s++; i++; for (se=s+1, i++; i < uidlen && *se != '>'; se++, i++) ; if (i < uidlen) { i = se - s; if (mode == KEYDB_SEARCH_MODE_MAIL) { if( strlen(name)-2 == i && !ascii_memcasecmp( s, name+1, i) ) return 0; } else if (mode == KEYDB_SEARCH_MODE_MAILSUB) { if( ascii_memistr( s, i, name ) ) return 0; } else { /* email from end */ /* nyi */ } } } } else if (mode == KEYDB_SEARCH_MODE_WORDS) return word_match (uid, uidlen, name); else BUG(); return -1; /* not found */ }