sctrls, cctrls, timelimit, sizelimit, &msgid );
if( rc != LDAP_SUCCESS ) {
- fprintf( stderr, "ldapsearch: ldap_search_ext: %s (%d)",
+ fprintf( stderr, "ldapsearch: ldap_search_ext: %s (%d)\n",
ldap_err2string( rc ), rc );
return( rc );
}
if( !ldif ) {
write_ldif( LDIF_PUT_VALUE, "ref", refs[i], strlen(refs[i]) );
} else {
- fprintf( stderr, "Referral: %s", refs[i] );
+ fprintf( stderr, "Referral: %s\n", refs[i] );
}
}
# define sys_errlist ((char **)0)
#elif DECL_SYS_ERRLIST
/* have sys_errlist but need declaration */
- LDAP_LIBC_V (int) sys_nerr;
- LDAP_LIBC_V (char) *sys_errlist[];
+ LDAP_LIBC_V(int) sys_nerr;
+ LDAP_LIBC_V(char) *sys_errlist[];
#endif
-#ifdef HAVE_STRERROR
-#define STRERROR(err) strerror(err)
+#undef _AC_ERRNO_UNKNOWN
+#define _AC_ERRNO_UNKNOWN "unknown error"
+
+#ifdef HAVE_SYS_ERRLIST
+ /* this is thread safe */
+# define STRERROR(e) ( (e) > -1 && (e) < sys_nerr \
+ ? sys_errlist[(e)] : _AC_ERRNO_UNKNOWN )
+
+#elif defined( HAVE_STRERROR )
+ /* this may not be thread safe */
+ /* and, yes, some implementations of strerror may return NULL */
+# define STRERROR(e) ( strerror(e) \
+ ? strerror(e) : _AC_ERRNO_UNKNOWN )
+
#else
-#define STRERROR(err) \
- ((err) > -1 && (err) < sys_nerr ? sys_errlist[(err)] : "unknown")
+ /* this is thread safe */
+# define STRERROR(e) ( _AC_ERRNO_UNKNOWN )
#endif
#endif /* _AC_ERRNO_H */
if ( ret < 0 ) {
ber_log_printf( LDAP_DEBUG_PACKETS, sbiod->sbiod_sb->sb_debug,
"%sread: want=%ld error=%s\n", (char *)sbiod->sbiod_pvt,
- (long)len, strerror( errno ) );
+ (long)len, STRERROR( errno ) );
}
else {
ber_log_printf( LDAP_DEBUG_PACKETS, sbiod->sbiod_sb->sb_debug,
ber_log_printf( LDAP_DEBUG_PACKETS, sbiod->sbiod_sb->sb_debug,
"%swrite: want=%ld error=%s\n",
(char *)sbiod->sbiod_pvt, (long)len,
- strerror( errno ) );
+ STRERROR( errno ) );
}
else {
ber_log_printf( LDAP_DEBUG_PACKETS, sbiod->sbiod_sb->sb_debug,
"ldap_is_socket_ready: errror on socket %d: errno: %d (%s)\n", \
s, \
errno, \
- strerror(errno) ); \
+ STRERROR(errno) ); \
} while( 0 )
/*
return(0);
}
+int
+ldap_pvt_thread_pool_maxthreads ( ldap_pvt_thread_pool_t *tpool, int max_threads )
+{
+ return(0);
+}
+
int
ldap_pvt_thread_pool_backload (
ldap_pvt_thread_pool_t *pool )
if ( err ) {
char error[BUFSIZ];
- if ( err < 0 ) {
- sprintf( error, "%ld\n", (long) err );
- } else {
- sprintf( error, "%s\n", strerror( err ));
- }
+ sprintf( error, "%s (%d)\n", STRERROR( err ), err );
+
#ifdef LDAP_SYSLOG
syslog( LOG_INFO,
"ldbm_initialize(): FATAL error in db_appinit() : %s\n",
{
char error[BUFSIZ];
- if ( err < 0 ) {
- sprintf( error, "%ld\n", (long) err );
- } else {
- sprintf( error, "%s\n", strerror( err ));
- }
+ sprintf( error, "%s (%d)\n", STRERROR( err ), err );
+
#ifdef LDAP_SYSLOG
syslog( LOG_INFO,
"ldbm_initialize(): FATAL error in db_appinit() : %s\n",
{
char error[BUFSIZ];
- if ( err < 0 ) {
- sprintf( error, "%ld\n", (long) err );
- } else {
- sprintf( error, "%s\n", strerror( err ));
- }
+ sprintf( error, "%s (%d)\n", STRERROR( err ), err );
+
(void)ret->close(ret, 0);
return NULL;
}
{
char error[BUFSIZ];
- if ( err < 0 ) {
- sprintf( error, "%ld\n", (long) err );
- } else {
- sprintf( error, "%s\n", strerror( err ));
- }
+ sprintf( error, "%s (%d)\n", STRERROR( err ), err );
+
(void)ret->close(ret, 0);
return NULL;
}
{
char error[BUFSIZ];
- if ( rc < 0 ) {
- sprintf( error, "%ld\n", (long) rc );
- } else {
- sprintf( error, "%s\n", strerror( rc ));
- }
+ sprintf( error, "%s (%d)\n", STRERROR( rc ), rc );
}
- rc = (-1) * rc;
+ rc = (-1) * rc;
#elif DB_VERSION_MAJOR >= 2
rc = (*ldbm->put)( ldbm, NULL, &key, &data, flags & ~LDBM_SYNC );
.backend: $(@PLAT@_IMPLIB) FORCE
@for i in back-*; do \
- if [ -d $$i ]; then \
+ if [ -d $$i -a -f $$i/Makefile ]; then \
echo " "; echo " cd $$i; $(MAKE) $(MFLAGS) all"; \
( cd $$i; $(MAKE) $(MFLAGS) all ); \
if test $$? != 0 ; then exit 1; fi ; \
depend-local-srv: FORCE
@for i in back-* shell-backends tools; do \
- if [ -d $$i ]; then \
+ if [ -d $$i -a -f $$i/Makefile ]; then \
echo; echo " cd $$i; $(MAKE) $(MFLAGS) depend"; \
( cd $$i; $(MAKE) $(MFLAGS) depend ); \
if test $$? != 0 ; then exit 1; fi ; \
clean-local-srv: FORCE
@for i in back-* shell-backends tools; do \
- if [ -d $$i ]; then \
+ if [ -d $$i -a -f $$i/Makefile ]; then \
echo; echo " cd $$i; $(MAKE) $(MFLAGS) clean"; \
( cd $$i; $(MAKE) $(MFLAGS) clean ); \
if test $$? != 0 ; then exit 1; fi ; \
veryclean-local-srv: FORCE
@for i in back-* shell-backends tools; do \
- if [ -d $$i ]; then \
+ if [ -d $$i -a -f $$i/Makefile ]; then \
echo; echo " cd $$i; $(MAKE) $(MFLAGS) clean"; \
( cd $$i; $(MAKE) $(MFLAGS) veryclean ); \
fi; \
slapd$(EXEEXT) $(DESTDIR)$(libexecdir)
@if [ ! -z "$(SLAPD_MODULES)" ]; then \
for i in back-* shell-backends tools; do \
- if [ -d $$i ]; then \
+ if [ -d $$i -a -f $$i/Makefile ]; then \
echo; echo " cd $$i; $(MAKE) $(MFLAGS) install"; \
( cd $$i; $(MAKE) $(MFLAGS) install ); \
if test $$? != 0 ; then exit 1; fi ; \
if ((ndn = ch_strdup(name)) != NULL) {
if (dn_normalize(ndn) != NULL) {
- char *text;
+ const char *text;
AttributeDescription *desc = NULL;
- if (slap_str2ad(attr, &desc, &text) == 0) {
+ if (slap_str2ad(attr, &desc, &text) == LDAP_SUCCESS) {
backend_attribute(cp->be, NULL /*cp->conn*/,
NULL /*cp->op*/, cp->e,
ndn, desc, &bvals);
char *subjdn;
char *setat;
struct berval **bvals;
- char *text;
+ const char *text;
AttributeDescription *desc = NULL;
/* format of string is "entry/setAttrName" */
}
if ( setat != NULL ) {
if ( dn_normalize(subjdn) != NULL
- && slap_str2ad(setat, &desc, &text) == 0 )
+ && slap_str2ad(setat, &desc, &text) == LDAP_SUCCESS )
{
backend_attribute(be, NULL, NULL, e,
subjdn, desc, &bvals);
ldap_pvt_thread_mutex_lock( &conn->c_mutex );
if ( conn->c_sasl_bind_mech != NULL ) {
+ /* SASL bind is in progress */
+#ifdef HAVE_CYRUS_SASL
+ assert( conn->c_sasl_bind_context != NULL );
+#endif
+
if((strcmp(conn->c_sasl_bind_mech, mech) != 0)) {
- /* mechanism changed, cancel in progress bind */
+ /* mechanism changed */
#ifdef HAVE_CYRUS_SASL
+ /* dispose of context */
sasl_dispose(&conn->c_sasl_bind_context);
conn->c_sasl_bind_context = NULL;
#endif
}
+
free( conn->c_sasl_bind_mech );
conn->c_sasl_bind_mech = NULL;
#ifdef LDAP_DEBUG
-#ifdef HAVE_CYRUS_SASL
} else {
+ /* SASL bind is NOT in progress */
+ assert( conn->c_sasl_bind_mech == NULL );
+#ifdef HAVE_CYRUS_SASL
assert( conn->c_sasl_bind_context == NULL );
#endif
#endif
#ifdef HAVE_CYRUS_SASL
} else {
- assert( conn->c_sasl_bind_context != NULL );
+ assert( conn->c_sasl_bind_context == NULL );
#endif
}
}
cleanup:
+ if( rc != LDAP_SASL_BIND_IN_PROGRESS ) {
+ ldap_pvt_thread_mutex_lock( &conn->c_mutex );
+
+ /* dispose of mech */
+ free( conn->c_sasl_bind_mech );
+ conn->c_sasl_bind_mech = NULL;
+
+#ifdef HAVE_CYRUS_SASL
+ if( conn->c_sasl_bind_context != NULL ) {
+ /* dispose of context */
+ sasl_dispose(&conn->c_sasl_bind_context);
+ conn->c_sasl_bind_context = NULL;
+ }
+#endif
+
+ ldap_pvt_thread_mutex_unlock( &conn->c_mutex );
+ }
+
if( dn != NULL ) {
free( dn );
}
slap_sasl_mutex_unlock,
slap_sasl_mutex_dispose );
+ /* server name should be configurable */
rc = sasl_server_init( NULL, "slapd" );
if( rc != SASL_OK ) {
#ifndef SLAPD_IGNORE_RFC2829
{
+ /* security flags should be configurable */
sasl_security_properties_t secprops;
memset(&secprops, '\0', sizeof(secprops));
secprops.security_flags = SASL_SEC_NOPLAINTEXT | SASL_SEC_NOANONYMOUS;
callbacks, SASL_SECURITY_LAYER, &conn->c_sasl_bind_context );
if( sc != SASL_OK ) {
- send_ldap_result( conn, op, rc = LDAP_AUTH_METHOD_NOT_SUPPORTED,
- NULL, NULL, NULL, NULL );
+ send_ldap_result( conn, op, rc = slap_sasl_err2ldap( sc ),
+ NULL, "could not create new SASL context", NULL, NULL );
+
} else {
unsigned reslen;
conn->c_authmech = ch_strdup( mech );
- sc = sasl_server_start( conn->c_sasl_bind_context, conn->c_authmech,
+ sc = sasl_server_start( conn->c_sasl_bind_context,
+ conn->c_authmech,
cred->bv_val, cred->bv_len,
(char **)&response.bv_val, &reslen, &errstr );
NULL, errstr, NULL, NULL );
}
}
+
} else {
unsigned reslen;
- sc = sasl_server_step( conn->c_sasl_bind_context, cred->bv_val, cred->bv_len,
+ sc = sasl_server_step( conn->c_sasl_bind_context,
+ cred->bv_val, cred->bv_len,
(char **)&response.bv_val, &reslen, &errstr );
response.bv_len = reslen;
if ( sc == SASL_OK ) {
char *authzid;
- if ( ( sc = sasl_getprop( conn->c_sasl_bind_context, SASL_USERNAME,
- (void **)&authzid ) ) != SASL_OK ) {
+ sc = sasl_getprop( conn->c_sasl_bind_context, SASL_USERNAME,
+ (void **)&authzid );
+
+ if ( sc != SASL_OK ) {
send_ldap_result( conn, op, rc = slap_sasl_err2ldap( sc ),
- NULL, NULL, NULL, NULL );
+ NULL, "no SASL username", NULL, NULL );
} else {
- Debug(LDAP_DEBUG_TRACE, "<== sasl_bind: username=%s\n",
+ Debug(LDAP_DEBUG_TRACE, "sasl_bind: username=%s\n",
authzid, 0, 0);
- if( strncasecmp( authzid, "anonymous", sizeof("anonyous")-1 ) &&
+ if( !strncasecmp( authzid, "anonymous", sizeof("anonyous")-1 ) &&
( ( authzid[sizeof("anonymous")] == '\0' ) ||
- ( authzid[sizeof("anonymous")] == '@' ) ) )
+ ( authzid[sizeof("anonymous")] == '@' ) ) )
{
+ Debug(LDAP_DEBUG_TRACE, "<== sasl_bind: anonymous\n",
+ 0, 0, 0);
+
+ } else {
*edn = ch_malloc( sizeof( "authzid=" ) + strlen( authzid ) );
strcpy( *edn, "authzid=" );
strcat( *edn, authzid );
+
+ Debug(LDAP_DEBUG_TRACE, "<== sasl_bind: authzdn: \"%s\"\n",
+ *edn, 0, 0);
}
- send_ldap_result( conn, op, rc = LDAP_SUCCESS,
- NULL, NULL, NULL, NULL );
+ send_ldap_sasl( conn, op, rc = LDAP_SUCCESS,
+ NULL, NULL, NULL, NULL, &response );
}
} else if ( sc == SASL_CONTINUE ) {