xref: /netbsd-src/external/bsd/openldap/dist/servers/slapd/index.c (revision 549b59ed3ccf0d36d3097190a0db27b770f3a839)
1*549b59edSchristos /*	$NetBSD: index.c,v 1.3 2021/08/14 16:14:58 christos Exp $	*/
24e6df137Slukem 
32de962bdSlukem /* index.c - index utilities */
4d11b170bStron /* $OpenLDAP$ */
52de962bdSlukem /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
62de962bdSlukem  *
7*549b59edSchristos  * Copyright 1998-2021 The OpenLDAP Foundation.
82de962bdSlukem  * All rights reserved.
92de962bdSlukem  *
102de962bdSlukem  * Redistribution and use in source and binary forms, with or without
112de962bdSlukem  * modification, are permitted only as authorized by the OpenLDAP
122de962bdSlukem  * Public License.
132de962bdSlukem  *
142de962bdSlukem  * A copy of this license is available in the file LICENSE in the
152de962bdSlukem  * top-level directory of the distribution or, alternatively, at
162de962bdSlukem  * <http://www.OpenLDAP.org/license.html>.
172de962bdSlukem  */
182de962bdSlukem 
19376af7d7Schristos #include <sys/cdefs.h>
20*549b59edSchristos __RCSID("$NetBSD: index.c,v 1.3 2021/08/14 16:14:58 christos Exp $");
21376af7d7Schristos 
222de962bdSlukem #include "portable.h"
232de962bdSlukem 
242de962bdSlukem #include <stdio.h>
252de962bdSlukem #include <ac/string.h>
262de962bdSlukem #include <lutil.h>
272de962bdSlukem 
282de962bdSlukem #include "slap.h"
292de962bdSlukem 
302de962bdSlukem static slap_verbmasks idxstr[] = {
312de962bdSlukem 	{ BER_BVC("pres"), SLAP_INDEX_PRESENT },
322de962bdSlukem 	{ BER_BVC("eq"), SLAP_INDEX_EQUALITY },
332de962bdSlukem 	{ BER_BVC("approx"), SLAP_INDEX_APPROX },
342de962bdSlukem 	{ BER_BVC("subinitial"), SLAP_INDEX_SUBSTR_INITIAL },
352de962bdSlukem 	{ BER_BVC("subany"), SLAP_INDEX_SUBSTR_ANY },
362de962bdSlukem 	{ BER_BVC("subfinal"), SLAP_INDEX_SUBSTR_FINAL },
372de962bdSlukem 	{ BER_BVC("sub"), SLAP_INDEX_SUBSTR_DEFAULT },
382de962bdSlukem 	{ BER_BVC("substr"), 0 },
392de962bdSlukem 	{ BER_BVC("notags"), SLAP_INDEX_NOTAGS },
402de962bdSlukem 	{ BER_BVC("nolang"), 0 },	/* backwards compat */
412de962bdSlukem 	{ BER_BVC("nosubtypes"), SLAP_INDEX_NOSUBTYPES },
422de962bdSlukem 	{ BER_BVNULL, 0 }
432de962bdSlukem };
442de962bdSlukem 
452de962bdSlukem 
slap_str2index(const char * str,slap_mask_t * idx)462de962bdSlukem int slap_str2index( const char *str, slap_mask_t *idx )
472de962bdSlukem {
482de962bdSlukem 	int i;
492de962bdSlukem 
502de962bdSlukem 	i = verb_to_mask( str, idxstr );
512de962bdSlukem 	if ( BER_BVISNULL(&idxstr[i].word) ) return LDAP_OTHER;
522de962bdSlukem 	while ( !idxstr[i].mask ) i--;
532de962bdSlukem 	*idx = idxstr[i].mask;
542de962bdSlukem 
552de962bdSlukem 
562de962bdSlukem 	return LDAP_SUCCESS;
572de962bdSlukem }
582de962bdSlukem 
slap_index2bvlen(slap_mask_t idx,struct berval * bv)592de962bdSlukem void slap_index2bvlen( slap_mask_t idx, struct berval *bv )
602de962bdSlukem {
612de962bdSlukem 	int i;
622de962bdSlukem 
632de962bdSlukem 	bv->bv_len = 0;
642de962bdSlukem 
652de962bdSlukem 	for ( i=0; !BER_BVISNULL( &idxstr[i].word ); i++ ) {
662de962bdSlukem 		if ( !idxstr[i].mask ) continue;
672de962bdSlukem 		if ( IS_SLAP_INDEX( idx, idxstr[i].mask )) {
682de962bdSlukem 			if ( (idxstr[i].mask & SLAP_INDEX_SUBSTR) &&
692de962bdSlukem 				((idx & SLAP_INDEX_SUBSTR_DEFAULT) != idxstr[i].mask))
702de962bdSlukem 				continue;
712de962bdSlukem 			if ( bv->bv_len ) bv->bv_len++;
722de962bdSlukem 			bv->bv_len += idxstr[i].word.bv_len;
732de962bdSlukem 		}
742de962bdSlukem 	}
752de962bdSlukem }
762de962bdSlukem 
772de962bdSlukem /* caller must provide buffer space, after calling index2bvlen */
slap_index2bv(slap_mask_t idx,struct berval * bv)782de962bdSlukem void slap_index2bv( slap_mask_t idx, struct berval *bv )
792de962bdSlukem {
802de962bdSlukem 	int i;
812de962bdSlukem 	char *ptr;
822de962bdSlukem 
832de962bdSlukem 	if ( !bv->bv_len ) return;
842de962bdSlukem 
852de962bdSlukem 	ptr = bv->bv_val;
862de962bdSlukem 	for ( i=0; !BER_BVISNULL( &idxstr[i].word ); i++ ) {
872de962bdSlukem 		if ( !idxstr[i].mask ) continue;
882de962bdSlukem 		if ( IS_SLAP_INDEX( idx, idxstr[i].mask )) {
892de962bdSlukem 			if ( (idxstr[i].mask & SLAP_INDEX_SUBSTR) &&
902de962bdSlukem 				((idx & SLAP_INDEX_SUBSTR_DEFAULT) != idxstr[i].mask))
912de962bdSlukem 				continue;
922de962bdSlukem 			if ( ptr != bv->bv_val ) *ptr++ = ',';
932de962bdSlukem 			ptr = lutil_strcopy( ptr, idxstr[i].word.bv_val );
942de962bdSlukem 		}
952de962bdSlukem 	}
962de962bdSlukem }
97