Exemple #1
0
/* 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 */
}