]> git.sur5r.net Git - openldap/blob - servers/slapd/back-ldap/pbind.c
1cc50d70c0d532457ac23ba64732aad7a8b051a7
[openldap] / servers / slapd / back-ldap / pbind.c
1 /* pbind.c - passthru Bind overlay */
2 /* $OpenLDAP$ */
3 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
4  *
5  * Copyright 2003-2017 The OpenLDAP Foundation.
6  * Portions Copyright 2003-2010 Howard Chu.
7  * All rights reserved.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted only as authorized by the OpenLDAP
11  * Public License.
12  *
13  * A copy of this license is available in the file LICENSE in the
14  * top-level directory of the distribution or, alternatively, at
15  * <http://www.OpenLDAP.org/license.html>.
16  */
17 /* ACKNOWLEDGEMENTS:
18  * This work was initially developed by the Howard Chu for inclusion
19  * in OpenLDAP Software.
20  */
21
22 #include "portable.h"
23
24 #include <stdio.h>
25
26 #include <ac/string.h>
27 #include <ac/socket.h>
28
29 #include "lutil.h"
30 #include "slap.h"
31 #include "back-ldap.h"
32 #include "config.h"
33
34 static BackendInfo      *lback;
35
36 static slap_overinst ldappbind;
37
38 static int
39 ldap_pbind_bind(
40         Operation       *op,
41         SlapReply       *rs )
42 {
43         slap_overinst   *on = (slap_overinst *) op->o_bd->bd_info;
44         void *private = op->o_bd->be_private;
45         void *bi = op->o_bd->bd_info;
46         int rc;
47
48         op->o_bd->bd_info = lback;
49         op->o_bd->be_private = on->on_bi.bi_private;
50         rc = lback->bi_op_bind( op, rs );
51         op->o_bd->be_private = private;
52         op->o_bd->bd_info = bi;
53
54         return rc;
55 }
56
57 static int
58 ldap_pbind_db_init(
59         BackendDB *be,
60         ConfigReply *cr )
61 {
62         slap_overinst   *on = (slap_overinst *)be->bd_info;
63         ConfigOCs       *be_cf_ocs = be->be_cf_ocs;
64         void            *private = be->be_private;
65         int rc;
66
67         if ( lback == NULL ) {
68                 lback = backend_info( "ldap" );
69
70                 if ( lback == NULL ) {
71                         return 1;
72                 }
73         }
74
75         rc = lback->bi_db_init( be, cr );
76         on->on_bi.bi_private = be->be_private;
77         be->be_cf_ocs = be_cf_ocs;
78         be->be_private = private;
79
80         return rc;
81 }
82
83 static int
84 ldap_pbind_db_open(
85         BackendDB       *be,
86         ConfigReply     *cr )
87 {
88         slap_overinst   *on = (slap_overinst *) be->bd_info;
89         void    *private = be->be_private;
90         int             rc;
91         int             monitoring;
92
93     be->be_private = on->on_bi.bi_private;
94         monitoring = ( SLAP_DBFLAGS( be ) & SLAP_DBFLAG_MONITORING );
95         SLAP_DBFLAGS( be ) &= ~SLAP_DBFLAG_MONITORING;
96         rc = lback->bi_db_open( be, cr );
97         SLAP_DBFLAGS( be ) |= monitoring;
98         be->be_private = private;
99
100         return rc;
101 }
102
103 static int
104 ldap_pbind_db_close(
105         BackendDB       *be,
106         ConfigReply     *cr )
107 {
108         slap_overinst   *on = (slap_overinst *) be->bd_info;
109         void    *private = be->be_private;
110         int             rc;
111
112     be->be_private = on->on_bi.bi_private;
113         rc = lback->bi_db_close( be, cr );
114         be->be_private = private;
115
116         return rc;
117 }
118
119 static int
120 ldap_pbind_db_destroy(
121         BackendDB       *be,
122         ConfigReply     *cr )
123 {
124         slap_overinst   *on = (slap_overinst *) be->bd_info;
125         void    *private = be->be_private;
126         int             rc;
127
128     be->be_private = on->on_bi.bi_private;
129         rc = lback->bi_db_close( be, cr );
130         on->on_bi.bi_private = be->be_private;
131         be->be_private = private;
132
133         return rc;
134 }
135
136 static int
137 ldap_pbind_connection_destroy(
138         BackendDB *be,
139         Connection *conn
140 )
141 {
142         slap_overinst   *on = (slap_overinst *) be->bd_info;
143         void                    *private = be->be_private;
144         int                             rc;
145
146         be->be_private = on->on_bi.bi_private;
147         rc = lback->bi_connection_destroy( be, conn );
148         be->be_private = private;
149
150         return rc;
151 }
152
153 int
154 pbind_initialize( void )
155 {
156         int rc;
157
158         ldappbind.on_bi.bi_type = "pbind";
159         ldappbind.on_bi.bi_db_init = ldap_pbind_db_init;
160         ldappbind.on_bi.bi_db_open = ldap_pbind_db_open;
161         ldappbind.on_bi.bi_db_close = ldap_pbind_db_close;
162         ldappbind.on_bi.bi_db_destroy = ldap_pbind_db_destroy;
163
164         ldappbind.on_bi.bi_op_bind = ldap_pbind_bind;
165         ldappbind.on_bi.bi_connection_destroy = ldap_pbind_connection_destroy;
166
167         rc = ldap_pbind_init_cf( &ldappbind.on_bi );
168         if ( rc ) {
169                 return rc;
170         }
171
172         return overlay_register( &ldappbind );
173 }