xref: /netbsd-src/external/bsd/openldap/dist/servers/slapd/back-mdb/dn2entry.c (revision 549b59ed3ccf0d36d3097190a0db27b770f3a839)
1 /*	$NetBSD: dn2entry.c,v 1.3 2021/08/14 16:15:00 christos Exp $	*/
2 
3 /* dn2entry.c - routines to deal with the dn2id / id2entry glue */
4 /* $OpenLDAP$ */
5 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
6  *
7  * Copyright 2000-2021 The OpenLDAP Foundation.
8  * All rights reserved.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted only as authorized by the OpenLDAP
12  * Public License.
13  *
14  * A copy of this license is available in the file LICENSE in the
15  * top-level directory of the distribution or, alternatively, at
16  * <http://www.OpenLDAP.org/license.html>.
17  */
18 
19 #include <sys/cdefs.h>
20 __RCSID("$NetBSD: dn2entry.c,v 1.3 2021/08/14 16:15:00 christos Exp $");
21 
22 #include "portable.h"
23 
24 #include <stdio.h>
25 #include <ac/string.h>
26 
27 #include "back-mdb.h"
28 
29 /*
30  * dn2entry - look up dn in the cache/indexes and return the corresponding
31  * entry. If the requested DN is not found and matched is TRUE, return info
32  * for the closest ancestor of the DN. Otherwise e is NULL.
33  */
34 
35 int
mdb_dn2entry(Operation * op,MDB_txn * tid,MDB_cursor * m2,struct berval * dn,Entry ** e,ID * nsubs,int matched)36 mdb_dn2entry(
37 	Operation *op,
38 	MDB_txn *tid,
39 	MDB_cursor *m2,
40 	struct berval *dn,
41 	Entry **e,
42 	ID *nsubs,
43 	int matched )
44 {
45 	struct mdb_info *mdb = (struct mdb_info *) op->o_bd->be_private;
46 	int rc, rc2;
47 	ID id = NOID;
48 	struct berval mbv, nmbv;
49 	MDB_cursor *mc;
50 
51 	Debug(LDAP_DEBUG_TRACE, "mdb_dn2entry(\"%s\")\n",
52 		dn->bv_val ? dn->bv_val : "" );
53 
54 	*e = NULL;
55 
56 	rc = mdb_dn2id( op, tid, m2, dn, &id, nsubs, &mbv, &nmbv );
57 	if ( rc ) {
58 		if ( matched ) {
59 			rc2 = mdb_cursor_open( tid, mdb->mi_id2entry, &mc );
60 			if ( rc2 == MDB_SUCCESS ) {
61 				rc2 = mdb_id2entry( op, mc, id, e );
62 				mdb_cursor_close( mc );
63 			}
64 		}
65 
66 	} else {
67 		rc = mdb_cursor_open( tid, mdb->mi_id2entry, &mc );
68 		if ( rc == MDB_SUCCESS ) {
69 			rc = mdb_id2entry( op, mc, id, e );
70 			mdb_cursor_close(mc);
71 		}
72 	}
73 	if ( *e ) {
74 		(*e)->e_name = mbv;
75 		if ( rc == MDB_SUCCESS )
76 			ber_dupbv_x( &(*e)->e_nname, dn, op->o_tmpmemctx );
77 		else
78 			ber_dupbv_x( &(*e)->e_nname, &nmbv, op->o_tmpmemctx );
79 	} else {
80 		op->o_tmpfree( mbv.bv_val, op->o_tmpmemctx );
81 	}
82 
83 	return rc;
84 }
85