Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
openldap
OpenLDAP
Commits
57ba4cac
Commit
57ba4cac
authored
Feb 26, 2004
by
Howard Chu
Browse files
Merged slap tools with main slapd binary; installs symlinks.
tools directory is now obsolete.
parent
0c70dda2
Changes
8
Hide whitespace changes
Inline
Side-by-side
servers/slapd/Makefile.in
View file @
57ba4cac
...
...
@@ -13,11 +13,12 @@
## top-level directory of the distribution or, alternatively, at
## <http://www.OpenLDAP.org/license.html>.
PROGRAMS
=
slapd
SLAPTOOLS
=
slapadd slapcat slapindex slapppasswd
PROGRAMS
=
slapd
$(SLAPTOOLS)
XPROGRAMS
=
sslapd libbackends.a .backend liboverlays.a
XSRCS
=
version.c
SUBDIRS
=
back-
*
shell-backends slapi overlays
tools
SUBDIRS
=
back-
*
shell-backends slapi overlays
NT_SRCS
=
nt_svc.c
NT_OBJS
=
nt_svc.o ../../libraries/liblutil/slapdmsg.res
...
...
@@ -34,6 +35,7 @@ SRCS = main.c globals.c config.c daemon.c \
oidm.c starttls.c index.c sets.c referral.c root_dse.c
\
sasl.c module.c mra.c mods.c sl_malloc.c limits.c
\
backglue.c operational.c matchedValues.c cancel.c syncrepl.c
\
slapadd.c slapcat.c slapcommon.c slapindex.c slappasswd.c
\
backover.c ctxcsn.c ldapsync.c sessionlog.c
$
(
@PLAT@_SRCS
)
OBJS
=
main.o globals.o config.o daemon.o
\
...
...
@@ -48,6 +50,7 @@ OBJS = main.o globals.o config.o daemon.o \
oidm.o starttls.o index.o sets.o referral.o root_dse.o
\
sasl.o module.o mra.o mods.o sl_malloc.o limits.o
\
backglue.o operational.o matchedValues.o cancel.o syncrepl.o
\
slapadd.o slapcat.o slapcommon.o slapindex.o slappasswd.o
\
backover.o ctxcsn.o ldapsync.o sessionlog.o
$
(
@PLAT@_OBJS
)
LDAP_INCDIR
=
../../include
-I
$(srcdir)
/slapi
...
...
@@ -250,13 +253,14 @@ libslapi.a: slapi/.libs/libslapi.a
slapd
:
$(SLAPD_DEPENDS) @LIBSLAPI@
$(LTLINK)
-o
$@
$(SLAPD_OBJECTS)
$(LIBS)
\
$(WRAP_LIBS)
rm
-f
$(SLAPTOOLS)
for
i
in
$(SLAPTOOLS)
;
do
\
$(LN_S)
slapd
$$
i
;
done
sslapd
:
version.o
$(LTLINK)
-static
-o
$@
$(OBJS)
version.o
$(LIBS)
$(WRAP_LIBS)
tools $(SLAPD_DYNAMIC_BACKENDS)
:
slapd
cd
$@
;
$(MAKE)
$(MFLAGS)
all
@
touch
$@
#
# In Windows, dynamic backends have to be built after slapd. For this
...
...
@@ -354,7 +358,7 @@ install-slapd: FORCE
fi
;
\
done
all-cffiles
:
slapd $(SLAPD_DYNAMIC_BACKENDS)
tools
all-cffiles
:
slapd $(SLAPD_DYNAMIC_BACKENDS)
@
if
test
$(PLAT)
=
NT
;
then
\
sysconfdir
=
`
cygpath
-w
$(sysconfdir)
|
\
$(SED)
-e
's/\\\\/\\\\\\\\\\\\\\\\/g'
`
;
\
...
...
@@ -406,6 +410,8 @@ install-conf: FORCE
fi
install-tools
:
FORCE
@
-
$(MKDIR)
$(DESTDIR)$(sbindir)
(
cd
tools
;
$(MAKE)
$(MFLAGS)
install
)
-
$(MKDIR)
$(DESTDIR)$(sbindir)
cd
$(DESTDIR)$(sbindir)
;
rm
-f
$(SLAPTOOLS)
;
\
for
i
in
$(SLAPTOOLS)
;
do
\
$(LN_S)
$(DESTDIR)$(libexecdir)
/slapd
$$
i
;
done
servers/slapd/main.c
View file @
57ba4cac
...
...
@@ -64,6 +64,20 @@ static struct sockaddr_in bind_addr;
#define MAIN_RETURN(x) return(x)
#endif
typedef
int
(
MainFunc
)
LDAP_P
((
int
argc
,
char
*
argv
[]
));
extern
MainFunc
slapadd
,
slapcat
,
slapindex
,
slappasswd
;
static
struct
{
char
*
name
;
MainFunc
*
func
;
}
tools
[]
=
{
{
"slapadd"
,
slapadd
},
{
"slapcat"
,
slapcat
},
{
"slapindex"
,
slapindex
},
{
"slappasswd"
,
slappasswd
},
{
NULL
,
NULL
}
};
/*
* when more than one slapd is running on one machine, each one might have
* it's own LOCAL for syslogging and must have its own pid/args files
...
...
@@ -113,6 +127,7 @@ usage( char *name )
fprintf
(
stderr
,
"
\t
-4
\t\t
IPv4 only
\n
"
"
\t
-6
\t\t
IPv6 only
\n
"
"
\t
-T (a|c|i|p)
\t
Run in Tool mode
\n
"
"
\t
-c cookie
\t
Sync cookie of consumer
\n
"
"
\t
-d level
\t
Debug level"
"
\n
"
"
\t
-f filename
\t
Configuration file
\n
"
...
...
@@ -164,7 +179,7 @@ int main( int argc, char **argv )
#else
char
*
configfile
=
SLAPD_DEFAULT_CONFIGFILE
;
#endif
char
*
serverName
=
NULL
;
char
*
serverName
;
int
serverMode
=
SLAP_SERVER_MODE
;
struct
berval
cookie
=
{
0
,
NULL
};
...
...
@@ -180,6 +195,17 @@ int main( int argc, char **argv )
sl_mem_init
();
serverName
=
lutil_progname
(
"slapd"
,
argc
,
argv
);
if
(
strcmp
(
serverName
,
"slapd"
)
)
{
for
(
i
=
0
;
tools
[
i
].
name
;
i
++
)
{
if
(
!
strcmp
(
serverName
,
tools
[
i
].
name
)
)
{
rc
=
tools
[
i
].
func
(
argc
,
argv
);
MAIN_RETURN
(
rc
);
}
}
}
#ifdef HAVE_NT_SERVICE_MANAGER
{
int
*
i
;
...
...
@@ -188,7 +214,6 @@ int main( int argc, char **argv )
char
*
regService
=
NULL
;
if
(
is_NT_Service
)
{
serverName
=
argv
[
0
];
lutil_CommenceStartupProcessing
(
serverName
,
slap_sig_shutdown
);
if
(
strcmp
(
serverName
,
SERVICE_NAME
)
)
regService
=
serverName
;
...
...
@@ -241,7 +266,7 @@ int main( int argc, char **argv )
#endif
while
(
(
i
=
getopt
(
argc
,
argv
,
"c:d:f:h:s:n:t:V"
"c:d:f:h:s:n:t:
T:
V"
#if LDAP_PF_INET6
"46"
#endif
...
...
@@ -341,7 +366,6 @@ int main( int argc, char **argv )
#endif
/* SETUID && GETUID */
case
'n'
:
/* NT service name */
if
(
serverName
!=
NULL
)
free
(
serverName
);
serverName
=
ch_strdup
(
optarg
);
break
;
...
...
@@ -352,6 +376,14 @@ int main( int argc, char **argv )
version
++
;
break
;
case
'T'
:
for
(
i
=
0
;
tools
[
i
].
name
;
i
++
)
{
if
(
optarg
[
0
]
==
tools
[
i
].
name
[
4
]
)
{
rc
=
tools
[
i
].
func
(
argc
,
argv
);
MAIN_RETURN
(
rc
);
}
}
/* FALLTHRU */
default:
usage
(
argv
[
0
]
);
rc
=
1
;
...
...
@@ -374,14 +406,6 @@ int main( int argc, char **argv )
if
(
version
>
1
)
goto
stop
;
}
if
(
serverName
==
NULL
)
{
if
(
(
serverName
=
strrchr
(
argv
[
0
],
*
LDAP_DIRSEP
))
==
NULL
)
{
serverName
=
argv
[
0
];
}
else
{
serverName
=
serverName
+
1
;
}
}
{
char
*
logName
;
#ifdef HAVE_EBCDIC
...
...
servers/slapd/slapadd.c
0 → 100644
View file @
57ba4cac
/* $OpenLDAP$ */
/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
*
* Copyright 1998-2004 The OpenLDAP Foundation.
* Portions Copyright 1998-2003 Kurt D. Zeilenga.
* Portions Copyright 2003 IBM Corporation.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted only as authorized by the OpenLDAP
* Public License.
*
* A copy of this license is available in file LICENSE in the
* top-level directory of the distribution or, alternatively, at
* <http://www.OpenLDAP.org/license.html>.
*/
/* ACKNOWLEDGEMENTS:
* This work was initially developed by Kurt Zeilenga for inclusion
* in OpenLDAP Software. Additional signficant contributors include
* Jong Hyuk Choi
* Pierangelo Masarati
*/
#include
"portable.h"
#include
<stdio.h>
#include
<ac/stdlib.h>
#include
<ac/ctype.h>
#include
<ac/string.h>
#include
<ac/socket.h>
#include
<ac/unistd.h>
#include
<lber.h>
#include
<ldif.h>
#include
<lutil.h>
#include
"slapcommon.h"
static
char
csnbuf
[
LDAP_LUTIL_CSNSTR_BUFSIZE
];
static
const
struct
berval
slap_syncrepl_bvc
=
BER_BVC
(
"syncreplxxx"
);
static
const
struct
berval
slap_syncrepl_cn_bvc
=
BER_BVC
(
"cn=syncreplxxx"
);
static
struct
berval
slap_syncrepl_bv
=
BER_BVNULL
;
static
struct
berval
slap_syncrepl_cn_bv
=
BER_BVNULL
;
struct
subentryinfo
{
struct
berval
cn
;
struct
berval
ndn
;
struct
berval
rdn
;
struct
berval
cookie
;
LDAP_SLIST_ENTRY
(
subentryinfo
)
sei_next
;
};
int
slapadd
(
int
argc
,
char
**
argv
)
{
char
*
buf
=
NULL
;
int
lineno
;
int
lmax
;
int
rc
=
EXIT_SUCCESS
;
const
char
*
text
;
char
textbuf
[
SLAP_TEXT_BUFLEN
]
=
{
'\0'
};
size_t
textlen
=
sizeof
textbuf
;
const
char
*
progname
=
"slapadd"
;
struct
berval
csn
;
struct
berval
maxcsn
=
{
0
,
NULL
};
struct
berval
ldifcsn
=
{
0
,
NULL
};
int
match
;
int
provider_subentry
=
0
;
struct
subentryinfo
*
sei
;
LDAP_SLIST_HEAD
(
consumer_subentry_slist
,
subentryinfo
)
consumer_subentry
;
Attribute
*
attr
;
Entry
*
ctxcsn_e
;
ID
ctxcsn_id
;
struct
berval
ctxcsn_ndn
=
{
0
,
NULL
};
int
ret
;
struct
berval
bvtext
;
int
i
;
#ifdef NEW_LOGGING
lutil_log_initialize
(
argc
,
argv
);
#endif
slap_tool_init
(
progname
,
SLAPADD
,
argc
,
argv
);
LDAP_SLIST_INIT
(
&
consumer_subentry
);
if
(
!
be
->
be_entry_open
||
!
be
->
be_entry_close
||
!
be
->
be_entry_put
)
{
fprintf
(
stderr
,
"%s: database doesn't support necessary operations.
\n
"
,
progname
);
exit
(
EXIT_FAILURE
);
}
lmax
=
0
;
lineno
=
0
;
if
(
be
->
be_entry_open
(
be
,
1
)
!=
0
)
{
fprintf
(
stderr
,
"%s: could not open database.
\n
"
,
progname
);
exit
(
EXIT_FAILURE
);
}
while
(
ldif_read_record
(
ldiffp
,
&
lineno
,
&
buf
,
&
lmax
)
)
{
Entry
*
e
=
str2entry
(
buf
);
/*
* Initialize text buffer
*/
bvtext
.
bv_len
=
textlen
;
bvtext
.
bv_val
=
textbuf
;
bvtext
.
bv_val
[
0
]
=
'\0'
;
if
(
e
==
NULL
)
{
fprintf
(
stderr
,
"%s: could not parse entry (line=%d)
\n
"
,
progname
,
lineno
);
rc
=
EXIT_FAILURE
;
if
(
continuemode
)
continue
;
break
;
}
/* make sure the DN is not empty */
if
(
!
e
->
e_nname
.
bv_len
)
{
fprintf
(
stderr
,
"%s: empty dn=
\"
%s
\"
(line=%d)
\n
"
,
progname
,
e
->
e_dn
,
lineno
);
rc
=
EXIT_FAILURE
;
entry_free
(
e
);
if
(
continuemode
)
continue
;
break
;
}
/* check backend */
if
(
select_backend
(
&
e
->
e_nname
,
is_entry_referral
(
e
),
nosubordinates
)
!=
be
)
{
fprintf
(
stderr
,
"%s: line %d: "
"database (%s) not configured to hold
\"
%s
\"\n
"
,
progname
,
lineno
,
be
?
be
->
be_suffix
[
0
].
bv_val
:
"<none>"
,
e
->
e_dn
);
fprintf
(
stderr
,
"%s: line %d: "
"database (%s) not configured to hold
\"
%s
\"\n
"
,
progname
,
lineno
,
be
?
be
->
be_nsuffix
[
0
].
bv_val
:
"<none>"
,
e
->
e_ndn
);
rc
=
EXIT_FAILURE
;
entry_free
(
e
);
if
(
continuemode
)
continue
;
break
;
}
if
(
global_schemacheck
)
{
Attribute
*
sc
=
attr_find
(
e
->
e_attrs
,
slap_schema
.
si_ad_structuralObjectClass
);
Attribute
*
oc
=
attr_find
(
e
->
e_attrs
,
slap_schema
.
si_ad_objectClass
);
if
(
oc
==
NULL
)
{
fprintf
(
stderr
,
"%s: dn=
\"
%s
\"
(line=%d): %s
\n
"
,
progname
,
e
->
e_dn
,
lineno
,
"no objectClass attribute"
);
rc
=
EXIT_FAILURE
;
entry_free
(
e
);
if
(
continuemode
)
continue
;
break
;
}
if
(
sc
==
NULL
)
{
struct
berval
vals
[
2
];
rc
=
structural_class
(
oc
->
a_vals
,
vals
,
NULL
,
&
text
,
textbuf
,
textlen
);
if
(
rc
!=
LDAP_SUCCESS
)
{
fprintf
(
stderr
,
"%s: dn=
\"
%s
\"
(line=%d): (%d) %s
\n
"
,
progname
,
e
->
e_dn
,
lineno
,
rc
,
text
);
rc
=
EXIT_FAILURE
;
entry_free
(
e
);
if
(
continuemode
)
continue
;
break
;
}
vals
[
1
].
bv_len
=
0
;
vals
[
1
].
bv_val
=
NULL
;
attr_merge
(
e
,
slap_schema
.
si_ad_structuralObjectClass
,
vals
,
NULL
/* FIXME */
);
}
/* check schema */
rc
=
entry_schema_check
(
be
,
e
,
NULL
,
&
text
,
textbuf
,
textlen
);
if
(
rc
!=
LDAP_SUCCESS
)
{
fprintf
(
stderr
,
"%s: dn=
\"
%s
\"
(line=%d): (%d) %s
\n
"
,
progname
,
e
->
e_dn
,
lineno
,
rc
,
text
);
rc
=
EXIT_FAILURE
;
entry_free
(
e
);
if
(
continuemode
)
continue
;
break
;
}
}
if
(
SLAP_LASTMOD
(
be
)
)
{
struct
tm
*
ltm
;
time_t
now
=
slap_get_time
();
char
uuidbuf
[
LDAP_LUTIL_UUIDSTR_BUFSIZE
];
struct
berval
vals
[
2
];
struct
berval
name
,
timestamp
;
struct
berval
nvals
[
2
];
struct
berval
nname
;
char
timebuf
[
LDAP_LUTIL_GENTIME_BUFSIZE
];
vals
[
1
].
bv_len
=
0
;
vals
[
1
].
bv_val
=
NULL
;
nvals
[
1
].
bv_len
=
0
;
nvals
[
1
].
bv_val
=
NULL
;
ltm
=
gmtime
(
&
now
);
lutil_gentime
(
timebuf
,
sizeof
(
timebuf
),
ltm
);
csn
.
bv_len
=
lutil_csnstr
(
csnbuf
,
sizeof
(
csnbuf
),
0
,
0
);
csn
.
bv_val
=
csnbuf
;
timestamp
.
bv_val
=
timebuf
;
timestamp
.
bv_len
=
strlen
(
timebuf
);
if
(
be
->
be_rootndn
.
bv_len
==
0
)
{
name
.
bv_val
=
SLAPD_ANONYMOUS
;
name
.
bv_len
=
sizeof
(
SLAPD_ANONYMOUS
)
-
1
;
nname
.
bv_val
=
SLAPD_ANONYMOUS
;
nname
.
bv_len
=
sizeof
(
SLAPD_ANONYMOUS
)
-
1
;
}
else
{
name
=
be
->
be_rootdn
;
nname
=
be
->
be_rootndn
;
}
if
(
attr_find
(
e
->
e_attrs
,
slap_schema
.
si_ad_entryUUID
)
==
NULL
)
{
vals
[
0
].
bv_len
=
lutil_uuidstr
(
uuidbuf
,
sizeof
(
uuidbuf
)
);
vals
[
0
].
bv_val
=
uuidbuf
;
attr_merge_normalize_one
(
e
,
slap_schema
.
si_ad_entryUUID
,
vals
,
NULL
);
}
if
(
attr_find
(
e
->
e_attrs
,
slap_schema
.
si_ad_creatorsName
)
==
NULL
)
{
vals
[
0
]
=
name
;
nvals
[
0
]
=
nname
;
attr_merge
(
e
,
slap_schema
.
si_ad_creatorsName
,
vals
,
nvals
);
}
if
(
attr_find
(
e
->
e_attrs
,
slap_schema
.
si_ad_modifiersName
)
==
NULL
)
{
vals
[
0
]
=
name
;
nvals
[
0
]
=
nname
;
attr_merge
(
e
,
slap_schema
.
si_ad_modifiersName
,
vals
,
nvals
);
}
if
(
attr_find
(
e
->
e_attrs
,
slap_schema
.
si_ad_createTimestamp
)
==
NULL
)
{
vals
[
0
]
=
timestamp
;
attr_merge
(
e
,
slap_schema
.
si_ad_createTimestamp
,
vals
,
NULL
);
}
if
(
attr_find
(
e
->
e_attrs
,
slap_schema
.
si_ad_modifyTimestamp
)
==
NULL
)
{
vals
[
0
]
=
timestamp
;
attr_merge
(
e
,
slap_schema
.
si_ad_modifyTimestamp
,
vals
,
NULL
);
}
if
(
attr_find
(
e
->
e_attrs
,
slap_schema
.
si_ad_entryCSN
)
==
NULL
)
{
vals
[
0
]
=
csn
;
attr_merge
(
e
,
slap_schema
.
si_ad_entryCSN
,
vals
,
NULL
);
}
if
(
!
is_entry_syncProviderSubentry
(
e
)
&&
!
is_entry_syncConsumerSubentry
(
e
)
&&
update_ctxcsn
!=
SLAP_TOOL_CTXCSN_KEEP
)
{
attr
=
attr_find
(
e
->
e_attrs
,
slap_schema
.
si_ad_entryCSN
);
if
(
maxcsn
.
bv_len
!=
0
)
{
value_match
(
&
match
,
slap_schema
.
si_ad_entryCSN
,
slap_schema
.
si_ad_entryCSN
->
ad_type
->
sat_ordering
,
SLAP_MR_VALUE_OF_ATTRIBUTE_SYNTAX
,
&
maxcsn
,
&
attr
->
a_nvals
[
0
],
&
text
);
}
else
{
match
=
-
1
;
}
if
(
match
<
0
)
{
if
(
maxcsn
.
bv_val
)
ch_free
(
maxcsn
.
bv_val
);
ber_dupbv
(
&
maxcsn
,
&
attr
->
a_nvals
[
0
]
);
}
}
}
if
(
update_ctxcsn
==
SLAP_TOOL_CTXCSN_KEEP
)
{
if
(
is_entry_syncProviderSubentry
(
e
))
{
if
(
!
LDAP_SLIST_EMPTY
(
&
consumer_subentry
))
{
fprintf
(
stderr
,
"%s: consumer and provider subentries "
"are both present
\n
"
,
progname
);
rc
=
EXIT_FAILURE
;
entry_free
(
e
);
sei
=
LDAP_SLIST_FIRST
(
&
consumer_subentry
);
while
(
sei
)
{
ch_free
(
sei
->
cn
.
bv_val
);
ch_free
(
sei
->
ndn
.
bv_val
);
ch_free
(
sei
->
rdn
.
bv_val
);
ch_free
(
sei
->
cookie
.
bv_val
);
LDAP_SLIST_REMOVE_HEAD
(
&
consumer_subentry
,
sei_next
);
ch_free
(
sei
);
sei
=
LDAP_SLIST_FIRST
(
&
consumer_subentry
);
}
break
;
}
if
(
provider_subentry
)
{
fprintf
(
stderr
,
"%s: multiple provider subentries are "
"present : add -w flag to refresh
\n
"
,
progname
);
rc
=
EXIT_FAILURE
;
entry_free
(
e
);
break
;
}
attr
=
attr_find
(
e
->
e_attrs
,
slap_schema
.
si_ad_contextCSN
);
if
(
attr
==
NULL
)
{
entry_free
(
e
);
continue
;
}
provider_subentry
=
1
;
ber_dupbv
(
&
maxcsn
,
&
attr
->
a_nvals
[
0
]
);
}
else
if
(
is_entry_syncConsumerSubentry
(
e
))
{
if
(
provider_subentry
)
{
fprintf
(
stderr
,
"%s: consumer and provider subentries "
"are both present
\n
"
,
progname
);
rc
=
EXIT_FAILURE
;
entry_free
(
e
);
break
;
}
attr
=
attr_find
(
e
->
e_attrs
,
slap_schema
.
si_ad_cn
);
if
(
attr
==
NULL
)
{
entry_free
(
e
);
continue
;
}
if
(
!
LDAP_SLIST_EMPTY
(
&
consumer_subentry
))
{
LDAP_SLIST_FOREACH
(
sei
,
&
consumer_subentry
,
sei_next
)
{
value_match
(
&
match
,
slap_schema
.
si_ad_cn
,
slap_schema
.
si_ad_cn
->
ad_type
->
sat_equality
,
SLAP_MR_VALUE_OF_ATTRIBUTE_SYNTAX
,
&
sei
->
cn
,
&
attr
->
a_nvals
[
0
],
&
text
);
}
if
(
!
match
)
{
fprintf
(
stderr
,
"%s: multiple consumer subentries "
"have the same id : add -w flag to refresh
\n
"
,
progname
);
rc
=
EXIT_FAILURE
;
entry_free
(
e
);
sei
=
LDAP_SLIST_FIRST
(
&
consumer_subentry
);
while
(
sei
)
{
ch_free
(
sei
->
cn
.
bv_val
);
ch_free
(
sei
->
ndn
.
bv_val
);
ch_free
(
sei
->
rdn
.
bv_val
);
ch_free
(
sei
->
cookie
.
bv_val
);
LDAP_SLIST_REMOVE_HEAD
(
&
consumer_subentry
,
sei_next
);
ch_free
(
sei
);
sei
=
LDAP_SLIST_FIRST
(
&
consumer_subentry
);
}
break
;
}
}
sei
=
ch_calloc
(
1
,
sizeof
(
struct
subentryinfo
));
ber_dupbv
(
&
sei
->
cn
,
&
attr
->
a_nvals
[
0
]
);
ber_dupbv
(
&
sei
->
ndn
,
&
e
->
e_nname
);
dnExtractRdn
(
&
sei
->
ndn
,
&
sei
->
rdn
,
NULL
);
attr
=
attr_find
(
e
->
e_attrs
,
slap_schema
.
si_ad_syncreplCookie
);
if
(
attr
==
NULL
)
{
ch_free
(
sei
->
cn
.
bv_val
);
ch_free
(
sei
->
ndn
.
bv_val
);
ch_free
(
sei
->
rdn
.
bv_val
);
ch_free
(
sei
->
cookie
.
bv_val
);
ch_free
(
sei
);
entry_free
(
e
);
continue
;
}
ber_dupbv
(
&
sei
->
cookie
,
&
attr
->
a_nvals
[
0
]
);
LDAP_SLIST_INSERT_HEAD
(
&
consumer_subentry
,
sei
,
sei_next
);
}
}
if
(
!
is_entry_syncProviderSubentry
(
e
)
&&
!
is_entry_syncConsumerSubentry
(
e
))
{
if
(
!
dryrun
)
{
ID
id
=
be
->
be_entry_put
(
be
,
e
,
&
bvtext
);
if
(
id
==
NOID
)
{
fprintf
(
stderr
,
"%s: could not add entry dn=
\"
%s
\"
"
"(line=%d): %s
\n
"
,
progname
,
e
->
e_dn
,
lineno
,
bvtext
.
bv_val
);
rc
=
EXIT_FAILURE
;
entry_free
(
e
);
if
(
continuemode
)
continue
;
break
;
}
if
(
verbose
)
{
fprintf
(
stderr
,
"added:
\"
%s
\"
(%08lx)
\n
"
,
e
->
e_dn
,
(
long
)
id
);
}
}
else
{
if
(
verbose
)
{
fprintf
(
stderr
,
"(dry) added:
\"
%s
\"\n
"
,
e
->
e_dn
);
}
}
}
entry_free
(
e
);
}
bvtext
.
bv_len
=
textlen
;
bvtext
.
bv_val
=
textbuf
;
bvtext
.
bv_val
[
0
]
=
'\0'
;
if
(
!
LDAP_SLIST_EMPTY
(
&
consumer_subentry
))
{
maxcsn
.
bv_len
=
0
;
maxcsn
.
bv_val
=
NULL
;
LDAP_SLIST_FOREACH
(
sei
,
&
consumer_subentry
,
sei_next
)
{
if
(
maxcsn
.
bv_len
!=
0
)
{
value_match
(
&
match
,
slap_schema
.
si_ad_syncreplCookie
,
slap_schema
.
si_ad_syncreplCookie
->
ad_type
->
sat_ordering
,
SLAP_MR_VALUE_OF_ATTRIBUTE_SYNTAX
,
&
maxcsn
,
&
sei
->
cookie
,
&
text
);
}
else
{
match
=
-
1
;
}
if
(
match
<
0
)
{
if
(
maxcsn
.
bv_val
)