Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
ingo Voss
OpenLDAP
Commits
bc65d18e
Commit
bc65d18e
authored
Feb 24, 2002
by
Kurt Zeilenga
Browse files
C portability from HEAD
parent
2435a156
Changes
7
Expand all
Hide whitespace changes
Inline
Side-by-side
libraries/libldap/getdn.c
View file @
bc65d18e
This diff is collapsed.
Click to expand it.
libraries/liblunicode/ucstr.c
View file @
bc65d18e
...
...
@@ -12,13 +12,12 @@
#include
<lber.h>
#define malloc(x) ber_memalloc(x)
#define realloc(x,y) ber_memrealloc(x,y)
#define free(x) ber_memfree(x)
#include
<ldap_utf8.h>
#include
<ldap_pvt_uc.h>
#define malloc(x) ber_memalloc(x)
#define realloc(x,y) ber_memrealloc(x,y)
#define free(x) ber_memfree(x)
int
ucstrncmp
(
const
ldap_unicode_t
*
u1
,
...
...
servers/slapd/acl.c
View file @
bc65d18e
This diff is collapsed.
Click to expand it.
servers/slapd/backglue.c
0 → 100644
View file @
bc65d18e
/* backglue.c - backend glue routines */
/* $OpenLDAP$ */
/*
* Copyright 2001-2002 The OpenLDAP Foundation, All Rights Reserved.
* COPYING RESTRICTIONS APPLY, see COPYRIGHT file
*/
/*
* Functions to glue a bunch of other backends into a single tree.
* All of the glued backends must share a common suffix. E.g., you
* can glue o=foo and ou=bar,o=foo but you can't glue o=foo and o=bar.
*
* This uses the backend structures and routines extensively, but is
* not an actual backend of its own. To use it you must add a "subordinate"
* keyword to the configuration of other backends. Subordinates will
* automatically be connected to their parent backend.
*
* The purpose of these functions is to allow you to split a single database
* into pieces (for load balancing purposes, whatever) but still be able
* to treat it as a single database after it's been split. As such, each
* of the glued backends should have identical rootdn and rootpw.
*
* If you need more elaborate configuration, you probably should be using
* back-meta instead.
* -- Howard Chu
*/
#include
"portable.h"
#include
<stdio.h>
#include
<ac/socket.h>
#define SLAPD_TOOLS
#include
"slap.h"
typedef
struct
gluenode
{
BackendDB
*
be
;
struct
berval
pdn
;
}
gluenode
;
typedef
struct
glueinfo
{
BackendDB
*
be
;
int
nodes
;
gluenode
n
[
1
];
}
glueinfo
;
static
int
glueMode
;
static
BackendDB
*
glueBack
;
/* Just like select_backend, but only for our backends */
static
BackendDB
*
glue_back_select
(
BackendDB
*
be
,
const
char
*
dn
)
{
glueinfo
*
gi
=
(
glueinfo
*
)
be
->
be_private
;
struct
berval
bv
;
int
i
;
bv
.
bv_len
=
strlen
(
dn
);
bv
.
bv_val
=
(
char
*
)
dn
;
for
(
i
=
0
;
i
<
gi
->
nodes
;
i
++
)
{
if
(
dnIsSuffix
(
&
bv
,
gi
->
n
[
i
].
be
->
be_nsuffix
[
0
]))
{
return
gi
->
n
[
i
].
be
;
}
}
return
NULL
;
}
/* This function will only be called in tool mode */
static
int
glue_back_open
(
BackendInfo
*
bi
)
{
int
rc
=
0
;
static
int
glueOpened
=
0
;
if
(
glueOpened
)
return
0
;
glueOpened
=
1
;
/* If we were invoked in tool mode, open all the underlying backends */
if
(
slapMode
&
SLAP_TOOL_MODE
)
{
rc
=
backend_startup
(
NULL
);
}
/* other case is impossible */
return
rc
;
}
/* This function will only be called in tool mode */
static
int
glue_back_close
(
BackendInfo
*
bi
)
{
static
int
glueClosed
=
0
;
int
rc
;
if
(
glueClosed
)
return
0
;
glueClosed
=
1
;
if
(
slapMode
&
SLAP_TOOL_MODE
)
{
rc
=
backend_shutdown
(
NULL
);
}
return
rc
;
}
static
int
glue_back_db_open
(
BackendDB
*
be
)
{
glueinfo
*
gi
=
(
glueinfo
*
)
be
->
be_private
;
static
int
glueOpened
=
0
;
int
rc
=
0
;
if
(
glueOpened
)
return
0
;
glueOpened
=
1
;
gi
->
be
->
be_acl
=
be
->
be_acl
;
if
(
gi
->
be
->
bd_info
->
bi_db_open
)
rc
=
gi
->
be
->
bd_info
->
bi_db_open
(
gi
->
be
);
return
rc
;
}
static
int
glue_back_db_close
(
BackendDB
*
be
)
{
glueinfo
*
gi
=
(
glueinfo
*
)
be
->
be_private
;
static
int
glueClosed
=
0
;
if
(
glueClosed
)
return
0
;
glueClosed
=
1
;
/* Close the master */
if
(
gi
->
be
->
bd_info
->
bi_db_close
)
gi
->
be
->
bd_info
->
bi_db_close
(
gi
->
be
);
return
0
;
}
static
int
glue_back_db_destroy
(
BackendDB
*
be
)
{
glueinfo
*
gi
=
(
glueinfo
*
)
be
->
be_private
;
if
(
gi
->
be
->
bd_info
->
bi_db_destroy
)
gi
->
be
->
bd_info
->
bi_db_destroy
(
gi
->
be
);
free
(
gi
->
be
);
free
(
gi
);
return
0
;
}
typedef
struct
glue_state
{
int
err
;
int
nentries
;
int
matchlen
;
char
*
matched
;
int
nrefs
;
BerVarray
refs
;
slap_callback
*
prevcb
;
}
glue_state
;
static
void
glue_back_response
(
Connection
*
conn
,
Operation
*
op
,
ber_tag_t
tag
,
ber_int_t
msgid
,
ber_int_t
err
,
const
char
*
matched
,
const
char
*
text
,
BerVarray
ref
,
const
char
*
resoid
,
struct
berval
*
resdata
,
struct
berval
*
sasldata
,
LDAPControl
**
ctrls
)
{
glue_state
*
gs
=
op
->
o_callback
->
sc_private
;
if
(
err
==
LDAP_SUCCESS
||
gs
->
err
!=
LDAP_SUCCESS
)
gs
->
err
=
err
;
if
(
gs
->
err
==
LDAP_SUCCESS
&&
gs
->
matched
)
{
free
(
gs
->
matched
);
gs
->
matchlen
=
0
;
}
if
(
gs
->
err
!=
LDAP_SUCCESS
&&
matched
)
{
int
len
;
len
=
strlen
(
matched
);
if
(
len
>
gs
->
matchlen
)
{
if
(
gs
->
matched
)
free
(
gs
->
matched
);
gs
->
matched
=
ch_strdup
(
matched
);
gs
->
matchlen
=
len
;
}
}
if
(
ref
)
{
int
i
,
j
,
k
;
BerVarray
new
;
for
(
i
=
0
;
ref
[
i
].
bv_val
;
i
++
);
j
=
gs
->
nrefs
;
if
(
!
j
)
{
new
=
ch_malloc
((
i
+
1
)
*
sizeof
(
struct
berval
));
}
else
{
new
=
ch_realloc
(
gs
->
refs
,
(
j
+
i
+
1
)
*
sizeof
(
struct
berval
));
}
for
(
k
=
0
;
k
<
i
;
j
++
,
k
++
)
{
ber_dupbv
(
&
new
[
j
],
&
ref
[
k
]
);
}
new
[
j
].
bv_val
=
NULL
;
gs
->
nrefs
=
j
;
gs
->
refs
=
new
;
}
}
static
void
glue_back_sresult
(
Connection
*
c
,
Operation
*
op
,
ber_int_t
err
,
const
char
*
matched
,
const
char
*
text
,
BerVarray
refs
,
LDAPControl
**
ctrls
,
int
nentries
)
{
glue_state
*
gs
=
op
->
o_callback
->
sc_private
;
gs
->
nentries
+=
nentries
;
glue_back_response
(
c
,
op
,
0
,
0
,
err
,
matched
,
text
,
refs
,
NULL
,
NULL
,
NULL
,
ctrls
);
}
static
int
glue_back_sendentry
(
BackendDB
*
be
,
Connection
*
c
,
Operation
*
op
,
Entry
*
e
,
AttributeName
*
an
,
int
ao
,
LDAPControl
**
ctrls
)
{
slap_callback
*
tmp
=
op
->
o_callback
;
glue_state
*
gs
=
tmp
->
sc_private
;
int
rc
;
op
->
o_callback
=
gs
->
prevcb
;
if
(
op
->
o_callback
&&
op
->
o_callback
->
sc_sendentry
)
{
rc
=
op
->
o_callback
->
sc_sendentry
(
be
,
c
,
op
,
e
,
an
,
ao
,
ctrls
);
}
else
{
rc
=
send_search_entry
(
be
,
c
,
op
,
e
,
an
,
ao
,
ctrls
);
}
op
->
o_callback
=
tmp
;
return
rc
;
}
static
int
glue_back_search
(
BackendDB
*
b0
,
Connection
*
conn
,
Operation
*
op
,
struct
berval
*
dn
,
struct
berval
*
ndn
,
int
scope
,
int
deref
,
int
slimit
,
int
tlimit
,
Filter
*
filter
,
struct
berval
*
filterstr
,
AttributeName
*
attrs
,
int
attrsonly
)
{
glueinfo
*
gi
=
(
glueinfo
*
)
b0
->
be_private
;
BackendDB
*
be
;
int
i
,
rc
,
t2limit
=
0
,
s2limit
=
0
;
long
stoptime
=
0
;
struct
berval
bv
;
glue_state
gs
=
{
0
};
slap_callback
cb
;
cb
.
sc_response
=
glue_back_response
;
cb
.
sc_sresult
=
glue_back_sresult
;
cb
.
sc_sendentry
=
glue_back_sendentry
;
cb
.
sc_private
=
&
gs
;
gs
.
prevcb
=
op
->
o_callback
;
if
(
tlimit
)
{
stoptime
=
slap_get_time
()
+
tlimit
;
}
switch
(
scope
)
{
case
LDAP_SCOPE_BASE
:
be
=
glue_back_select
(
b0
,
ndn
->
bv_val
);
if
(
be
&&
be
->
be_search
)
{
rc
=
be
->
be_search
(
be
,
conn
,
op
,
dn
,
ndn
,
scope
,
deref
,
slimit
,
tlimit
,
filter
,
filterstr
,
attrs
,
attrsonly
);
}
else
{
rc
=
LDAP_UNWILLING_TO_PERFORM
;
send_ldap_result
(
conn
,
op
,
rc
,
NULL
,
"No search target found"
,
NULL
,
NULL
);
}
return
rc
;
case
LDAP_SCOPE_ONELEVEL
:
case
LDAP_SCOPE_SUBTREE
:
op
->
o_callback
=
&
cb
;
/*
* Execute in reverse order, most general first
*/
for
(
i
=
gi
->
nodes
-
1
;
i
>=
0
;
i
--
)
{
if
(
!
gi
->
n
[
i
].
be
||
!
gi
->
n
[
i
].
be
->
be_search
)
continue
;
if
(
tlimit
)
{
t2limit
=
stoptime
-
slap_get_time
();
if
(
t2limit
<=
0
)
break
;
}
if
(
slimit
)
{
s2limit
=
slimit
-
gs
.
nentries
;
if
(
s2limit
<=
0
)
break
;
}
/*
* check for abandon
*/
ldap_pvt_thread_mutex_lock
(
&
op
->
o_abandonmutex
);
rc
=
op
->
o_abandon
;
ldap_pvt_thread_mutex_unlock
(
&
op
->
o_abandonmutex
);
if
(
rc
)
{
rc
=
0
;
goto
done
;
}
be
=
gi
->
n
[
i
].
be
;
if
(
scope
==
LDAP_SCOPE_ONELEVEL
&&
dn_match
(
&
gi
->
n
[
i
].
pdn
,
ndn
))
{
rc
=
be
->
be_search
(
be
,
conn
,
op
,
be
->
be_suffix
[
0
],
be
->
be_nsuffix
[
0
],
LDAP_SCOPE_BASE
,
deref
,
s2limit
,
t2limit
,
filter
,
filterstr
,
attrs
,
attrsonly
);
}
else
if
(
scope
==
LDAP_SCOPE_SUBTREE
&&
dnIsSuffix
(
be
->
be_nsuffix
[
0
],
ndn
))
{
rc
=
be
->
be_search
(
be
,
conn
,
op
,
be
->
be_suffix
[
0
],
be
->
be_nsuffix
[
0
],
scope
,
deref
,
s2limit
,
t2limit
,
filter
,
filterstr
,
attrs
,
attrsonly
);
}
else
if
(
dnIsSuffix
(
&
bv
,
be
->
be_nsuffix
[
0
]))
{
rc
=
be
->
be_search
(
be
,
conn
,
op
,
dn
,
ndn
,
scope
,
deref
,
s2limit
,
t2limit
,
filter
,
filterstr
,
attrs
,
attrsonly
);
}
}
break
;
}
op
->
o_callback
=
gs
.
prevcb
;
send_search_result
(
conn
,
op
,
gs
.
err
,
gs
.
matched
,
NULL
,
gs
.
refs
,
NULL
,
gs
.
nentries
);
done:
if
(
gs
.
matched
)
free
(
gs
.
matched
);
if
(
gs
.
refs
)
ber_bvarray_free
(
gs
.
refs
);
return
rc
;
}
static
int
glue_back_bind
(
BackendDB
*
b0
,
Connection
*
conn
,
Operation
*
op
,
struct
berval
*
dn
,
struct
berval
*
ndn
,
int
method
,
struct
berval
*
cred
,
struct
berval
*
edn
)
{
BackendDB
*
be
;
int
rc
;
be
=
glue_back_select
(
b0
,
ndn
->
bv_val
);
if
(
be
&&
be
->
be_bind
)
{
conn
->
c_authz_backend
=
be
;
rc
=
be
->
be_bind
(
be
,
conn
,
op
,
dn
,
ndn
,
method
,
cred
,
edn
);
}
else
{
rc
=
LDAP_UNWILLING_TO_PERFORM
;
send_ldap_result
(
conn
,
op
,
rc
,
NULL
,
"No bind target found"
,
NULL
,
NULL
);
}
return
rc
;
}
static
int
glue_back_compare
(
BackendDB
*
b0
,
Connection
*
conn
,
Operation
*
op
,
struct
berval
*
dn
,
struct
berval
*
ndn
,
AttributeAssertion
*
ava
)
{
BackendDB
*
be
;
int
rc
;
be
=
glue_back_select
(
b0
,
ndn
->
bv_val
);
if
(
be
&&
be
->
be_compare
)
{
rc
=
be
->
be_compare
(
be
,
conn
,
op
,
dn
,
ndn
,
ava
);
}
else
{
rc
=
LDAP_UNWILLING_TO_PERFORM
;
send_ldap_result
(
conn
,
op
,
rc
,
NULL
,
"No compare target found"
,
NULL
,
NULL
);
}
return
rc
;
}
static
int
glue_back_modify
(
BackendDB
*
b0
,
Connection
*
conn
,
Operation
*
op
,
struct
berval
*
dn
,
struct
berval
*
ndn
,
Modifications
*
mod
)
{
BackendDB
*
be
;
int
rc
;
be
=
glue_back_select
(
b0
,
ndn
->
bv_val
);
if
(
be
&&
be
->
be_modify
)
{
rc
=
be
->
be_modify
(
be
,
conn
,
op
,
dn
,
ndn
,
mod
);
}
else
{
rc
=
LDAP_UNWILLING_TO_PERFORM
;
send_ldap_result
(
conn
,
op
,
rc
,
NULL
,
"No modify target found"
,
NULL
,
NULL
);
}
return
rc
;
}
static
int
glue_back_modrdn
(
BackendDB
*
b0
,
Connection
*
conn
,
Operation
*
op
,
struct
berval
*
dn
,
struct
berval
*
ndn
,
struct
berval
*
newrdn
,
struct
berval
*
nnewrdn
,
int
del
,
struct
berval
*
newsup
,
struct
berval
*
nnewsup
)
{
BackendDB
*
be
;
int
rc
;
be
=
glue_back_select
(
b0
,
ndn
->
bv_val
);
if
(
be
&&
be
->
be_modrdn
)
{
rc
=
be
->
be_modrdn
(
be
,
conn
,
op
,
dn
,
ndn
,
newrdn
,
nnewrdn
,
del
,
newsup
,
nnewsup
);
}
else
{
rc
=
LDAP_UNWILLING_TO_PERFORM
;
send_ldap_result
(
conn
,
op
,
rc
,
NULL
,
"No modrdn target found"
,
NULL
,
NULL
);
}
return
rc
;
}
static
int
glue_back_add
(
BackendDB
*
b0
,
Connection
*
conn
,
Operation
*
op
,
Entry
*
e
)
{
BackendDB
*
be
;
int
rc
;
be
=
glue_back_select
(
b0
,
e
->
e_ndn
);
if
(
be
&&
be
->
be_add
)
{
rc
=
be
->
be_add
(
be
,
conn
,
op
,
e
);
}
else
{
rc
=
LDAP_UNWILLING_TO_PERFORM
;
send_ldap_result
(
conn
,
op
,
rc
,
NULL
,
"No add target found"
,
NULL
,
NULL
);
}
return
rc
;
}
static
int
glue_back_delete
(
BackendDB
*
b0
,
Connection
*
conn
,
Operation
*
op
,
struct
berval
*
dn
,
struct
berval
*
ndn
)
{
BackendDB
*
be
;
int
rc
;
be
=
glue_back_select
(
b0
,
ndn
->
bv_val
);
if
(
be
&&
be
->
be_delete
)
{
rc
=
be
->
be_delete
(
be
,
conn
,
op
,
dn
,
ndn
);
}
else
{
rc
=
LDAP_UNWILLING_TO_PERFORM
;
send_ldap_result
(
conn
,
op
,
rc
,
NULL
,
"No delete target found"
,
NULL
,
NULL
);
}
return
rc
;
}
static
int
glue_back_release_rw
(
BackendDB
*
b0
,
Connection
*
conn
,
Operation
*
op
,
Entry
*
e
,
int
rw
)
{
BackendDB
*
be
;
int
rc
;
be
=
glue_back_select
(
b0
,
e
->
e_ndn
);
if
(
be
&&
be
->
be_release
)
{
rc
=
be
->
be_release
(
be
,
conn
,
op
,
e
,
rw
);
}
else
{
entry_free
(
e
);
rc
=
0
;
}
return
rc
;
}
static
int
glue_back_group
(
BackendDB
*
b0
,
Connection
*
conn
,
Operation
*
op
,
Entry
*
target
,
struct
berval
*
ndn
,
struct
berval
*
ondn
,
ObjectClass
*
oc
,
AttributeDescription
*
ad
)
{
BackendDB
*
be
;
int
rc
;
be
=
glue_back_select
(
b0
,
ndn
->
bv_val
);
if
(
be
&&
be
->
be_group
)
{
rc
=
be
->
be_group
(
be
,
conn
,
op
,
target
,
ndn
,
ondn
,
oc
,
ad
);
}
else
{
rc
=
LDAP_UNWILLING_TO_PERFORM
;
}
return
rc
;
}
static
int
glue_back_attribute
(
BackendDB
*
b0
,
Connection
*