From: Kurt Zeilenga Date: Wed, 23 Sep 1998 08:13:37 +0000 (+0000) Subject: Use ldap_cdefs.h more. Use bridge.h less. X-Git-Tag: PHP3_TOOL_0_0~18^2~67 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=6949ab31ac7c3e35c1d1c82701550fa3a01e35d4;p=openldap Use ldap_cdefs.h more. Use bridge.h less. --- diff --git a/include/Makefile.in b/include/Makefile.in index a36d6c3bdd..19f3e8620e 100644 --- a/include/Makefile.in +++ b/include/Makefile.in @@ -9,6 +9,7 @@ install-local: FORCE -$(MKDIR) -p $(includedir) $(INSTALL) $(INSTALLFLAGS) -m 644 ldap.h $(includedir) $(INSTALL) $(INSTALLFLAGS) -m 644 lber.h $(includedir) + $(INSTALL) $(INSTALLFLAGS) -m 644 ldap_cdefs.h $(includedir) $(INSTALL) $(INSTALLFLAGS) -m 644 proto-lber.h $(includedir) $(INSTALL) $(INSTALLFLAGS) -m 644 proto-ldap.h $(includedir) $(INSTALL) $(INSTALLFLAGS) -m 644 disptmpl.h $(includedir) diff --git a/include/bridge.h b/include/bridge.h index 0476ba9d16..172fada4fc 100644 --- a/include/bridge.h +++ b/include/bridge.h @@ -12,8 +12,8 @@ /* This file SHOULD go away !!! */ -#ifndef LDAP_BRIDGE -#define LDAP_BRIDGE +#ifndef _LDAP_BRIDGE_H +#define _LDAP_BRIDGE_H /* * portable.h for LDAP -- this is where we define common stuff to make @@ -122,6 +122,7 @@ #endif #endif NOTDEF +#ifndef DISABLE_BRIDGE /* * Are sys_errlist and sys_nerr declared in stdio.h? */ @@ -142,6 +143,7 @@ #define FD_ISSET(n, p) ((p)->fds_bits[(n)/NFDBITS] & (1 << ((n) % NFDBITS))) #define FD_ZERO(p) bzero((char *)(p), sizeof(*(p))) #endif /* FD_SET */ +#endif #if defined( hpux ) && defined( __STDC__ ) /* @@ -209,4 +211,4 @@ extern char *strdup(); #endif /* ultrix || nextstep */ -#endif /* LDAP_BRIDGE */ +#endif /* _LDAP_BRIDGE_H */ diff --git a/include/disptmpl.h b/include/disptmpl.h index c4e06ef2fe..dc39dc39f6 100644 --- a/include/disptmpl.h +++ b/include/disptmpl.h @@ -16,10 +16,9 @@ #ifndef _DISPTMPL_H #define _DISPTMPL_H -#ifdef __cplusplus -extern "C" { -#endif +#include +LDAP_BEGIN_DECL #define LDAP_TEMPLATE_VERSION 1 @@ -221,110 +220,95 @@ struct ldap_disptmpl { #define LDAP_DTMPL_BUFSIZ 8192 -#ifndef NEEDPROTOS +typedef int (*writeptype) LDAP_P(( void *writeparm, char *p, int len )); -typedef int (*writeptype)(); +LDAP_F int +ldap_init_templates LDAP_P(( char *file, struct ldap_disptmpl **tmpllistp )); -int ldap_init_templates(); -int ldap_init_templates_buf(); -void ldap_free_templates(); -struct ldap_disptmpl *ldap_first_disptmpl(); -struct ldap_disptmpl *ldap_next_disptmpl(); -struct ldap_disptmpl *ldap_name2template(); -struct ldap_disptmpl *ldap_oc2template(); -char **ldap_tmplattrs(); -struct ldap_tmplitem *ldap_first_tmplrow(); -struct ldap_tmplitem *ldap_next_tmplrow(); -struct ldap_tmplitem *ldap_first_tmplcol(); -struct ldap_tmplitem *ldap_next_tmplcol(); -int ldap_entry2text_search(); -int ldap_entry2text(); -int ldap_vals2text(); -int ldap_entry2html_search(); -int ldap_entry2html(); -int ldap_vals2html(); +LDAP_F int +ldap_init_templates_buf LDAP_P(( char *buf, + long buflen, + struct ldap_disptmpl **tmpllistp )); -#else /* !NEEDPROTOS */ +LDAP_F void +ldap_free_templates LDAP_P(( struct ldap_disptmpl *tmpllist )); -typedef int (*writeptype)( void *writeparm, char *p, int len ); +LDAP_F struct ldap_disptmpl * +ldap_first_disptmpl LDAP_P(( struct ldap_disptmpl *tmpllist )); -LDAPFUNCDECL int -ldap_init_templates( char *file, struct ldap_disptmpl **tmpllistp ); +LDAP_F struct ldap_disptmpl * +ldap_next_disptmpl LDAP_P(( struct ldap_disptmpl *tmpllist, + struct ldap_disptmpl *tmpl )); -LDAPFUNCDECL int -ldap_init_templates_buf( char *buf, long buflen, - struct ldap_disptmpl **tmpllistp ); +LDAP_F struct ldap_disptmpl * +ldap_name2template LDAP_P(( char *name, + struct ldap_disptmpl *tmpllist )); -LDAPFUNCDECL void -ldap_free_templates( struct ldap_disptmpl *tmpllist ); +LDAP_F struct ldap_disptmpl * +ldap_oc2template LDAP_P(( char **oclist, + struct ldap_disptmpl *tmpllist )); -LDAPFUNCDECL struct ldap_disptmpl * -ldap_first_disptmpl( struct ldap_disptmpl *tmpllist ); +LDAP_F char ** +ldap_tmplattrs LDAP_P(( struct ldap_disptmpl *tmpl, + char **includeattrs, + int exclude, + unsigned long syntaxmask )); -LDAPFUNCDECL struct ldap_disptmpl * -ldap_next_disptmpl( struct ldap_disptmpl *tmpllist, - struct ldap_disptmpl *tmpl ); +LDAP_F struct ldap_tmplitem * +ldap_first_tmplrow LDAP_P(( struct ldap_disptmpl *tmpl )); -LDAPFUNCDECL struct ldap_disptmpl * -ldap_name2template( char *name, struct ldap_disptmpl *tmpllist ); +LDAP_F struct ldap_tmplitem * +ldap_next_tmplrow LDAP_P(( struct ldap_disptmpl *tmpl, + struct ldap_tmplitem *row )); -LDAPFUNCDECL struct ldap_disptmpl * -ldap_oc2template( char **oclist, struct ldap_disptmpl *tmpllist ); +LDAP_F struct ldap_tmplitem * +ldap_first_tmplcol LDAP_P(( struct ldap_disptmpl *tmpl, + struct ldap_tmplitem *row )); -LDAPFUNCDECL char ** -ldap_tmplattrs( struct ldap_disptmpl *tmpl, char **includeattrs, int exclude, - unsigned long syntaxmask ); +LDAP_F struct ldap_tmplitem * +ldap_next_tmplcol LDAP_P(( struct ldap_disptmpl *tmpl, + struct ldap_tmplitem *row, + struct ldap_tmplitem *col )); -LDAPFUNCDECL struct ldap_tmplitem * -ldap_first_tmplrow( struct ldap_disptmpl *tmpl ); - -LDAPFUNCDECL struct ldap_tmplitem * -ldap_next_tmplrow( struct ldap_disptmpl *tmpl, struct ldap_tmplitem *row ); - -LDAPFUNCDECL struct ldap_tmplitem * -ldap_first_tmplcol( struct ldap_disptmpl *tmpl, struct ldap_tmplitem *row ); - -LDAPFUNCDECL struct ldap_tmplitem * -ldap_next_tmplcol( struct ldap_disptmpl *tmpl, struct ldap_tmplitem *row, - struct ldap_tmplitem *col ); - -LDAPFUNCDECL int -ldap_entry2text( LDAP *ld, char *buf, LDAPMessage *entry, +LDAP_F int +ldap_entry2text LDAP_P(( LDAP *ld, + char *buf, LDAPMessage *entry, struct ldap_disptmpl *tmpl, char **defattrs, char ***defvals, writeptype writeproc, void *writeparm, char *eol, int rdncount, - unsigned long opts ); + unsigned long opts )); -LDAPFUNCDECL int -ldap_vals2text( LDAP *ld, char *buf, char **vals, char *label, int labelwidth, +LDAP_F int +ldap_vals2text LDAP_P(( LDAP *ld, + char *buf, char **vals, char *label, int labelwidth, unsigned long syntaxid, writeptype writeproc, void *writeparm, - char *eol, int rdncount ); + char *eol, int rdncount )); -LDAPFUNCDECL int -ldap_entry2text_search( LDAP *ld, char *dn, char *base, LDAPMessage *entry, +LDAP_F int +ldap_entry2text_search LDAP_P(( LDAP *ld, + char *dn, char *base, LDAPMessage *entry, struct ldap_disptmpl *tmpllist, char **defattrs, char ***defvals, writeptype writeproc, void *writeparm, char *eol, int rdncount, - unsigned long opts ); + unsigned long opts )); -LDAPFUNCDECL int -ldap_entry2html( LDAP *ld, char *buf, LDAPMessage *entry, +LDAP_F int +ldap_entry2html LDAP_P(( LDAP *ld, + char *buf, LDAPMessage *entry, struct ldap_disptmpl *tmpl, char **defattrs, char ***defvals, writeptype writeproc, void *writeparm, char *eol, int rdncount, - unsigned long opts, char *urlprefix, char *base ); + unsigned long opts, char *urlprefix, char *base )); -LDAPFUNCDECL int -ldap_vals2html( LDAP *ld, char *buf, char **vals, char *label, int labelwidth, +LDAP_F int +ldap_vals2html LDAP_P(( LDAP *ld, + char *buf, char **vals, char *label, int labelwidth, unsigned long syntaxid, writeptype writeproc, void *writeparm, - char *eol, int rdncount, char *urlprefix ); + char *eol, int rdncount, char *urlprefix )); -LDAPFUNCDECL int -ldap_entry2html_search( LDAP *ld, char *dn, char *base, LDAPMessage *entry, +LDAP_F int +ldap_entry2html_search LDAP_P(( LDAP + *ld, char *dn, char *base, LDAPMessage *entry, struct ldap_disptmpl *tmpllist, char **defattrs, char ***defvals, writeptype writeproc, void *writeparm, char *eol, int rdncount, - unsigned long opts, char *urlprefix ); -#endif /* !NEEDPROTOS */ - + unsigned long opts, char *urlprefix )); -#ifdef __cplusplus -} -#endif +LDAP_END_DECL #endif /* _DISPTMPL_H */ diff --git a/include/srchpref.h b/include/srchpref.h index a1d65cffb0..6b26b06d41 100644 --- a/include/srchpref.h +++ b/include/srchpref.h @@ -17,10 +17,9 @@ #ifndef _SRCHPREF_H #define _SRCHPREF_H -#ifdef __cplusplus -extern "C" { -#endif +#include +LDAP_BEGIN_DECL struct ldap_searchattr { char *sa_attrlabel; @@ -60,7 +59,7 @@ struct ldap_searchobj { #define LDAP_SEARCHOBJ_OPT_INTERNAL 0x00000001 #define LDAP_IS_SEARCHOBJ_OPTION_SET( so, option ) \ - (((so)->so_options & option ) != 0 ) + (((so)->so_options & (option) ) != 0 ) #define LDAP_SEARCHPREF_VERSION_ZERO 0 #define LDAP_SEARCHPREF_VERSION 1 @@ -71,36 +70,26 @@ struct ldap_searchobj { #define LDAP_SEARCHPREF_ERR_FILE 4 -#ifndef NEEDPROTOS -int ldap_init_searchprefs(); -int ldap_init_searchprefs_buf(); -void ldap_free_searchprefs(); -struct ldap_searchobj *ldap_first_searchobj(); -struct ldap_searchobj *ldap_next_searchobj(); +LDAP_F int +ldap_init_searchprefs LDAP_P(( char *file, + struct ldap_searchobj **solistp )); -#else /* !NEEDPROTOS */ +LDAP_F int +ldap_init_searchprefs_buf LDAP_P(( char *buf, + long buflen, + struct ldap_searchobj **solistp )); -LDAPFUNCDECL int -ldap_init_searchprefs( char *file, struct ldap_searchobj **solistp ); +LDAP_F void +ldap_free_searchprefs LDAP_P(( struct ldap_searchobj *solist )); -LDAPFUNCDECL int -ldap_init_searchprefs_buf( char *buf, long buflen, - struct ldap_searchobj **solistp ); +LDAP_F struct ldap_searchobj * +ldap_first_searchobj LDAP_P(( struct ldap_searchobj *solist )); -LDAPFUNCDECL void -ldap_free_searchprefs( struct ldap_searchobj *solist ); +LDAP_F struct ldap_searchobj * +ldap_next_searchobj LDAP_P(( struct ldap_searchobj *sollist, + struct ldap_searchobj *so )); -LDAPFUNCDECL struct ldap_searchobj * -ldap_first_searchobj( struct ldap_searchobj *solist ); -LDAPFUNCDECL struct ldap_searchobj * -ldap_next_searchobj( struct ldap_searchobj *sollist, - struct ldap_searchobj *so ); +LDAP_END_DECL -#endif /* !NEEDPROTOS */ - - -#ifdef __cplusplus -} -#endif #endif /* _SRCHPREF_H */ diff --git a/libraries/liblber/decode.c b/libraries/liblber/decode.c index d16ca53756..6a198599c6 100644 --- a/libraries/liblber/decode.c +++ b/libraries/liblber/decode.c @@ -11,7 +11,7 @@ * is provided ``as is'' without express or implied warranty. */ -#define LDAP_BRIDGE /* disable LDAP_BRIDGE code */ +#define DISABLE_BRIDGE /* disable LDAP_BRIDGE code */ #include "portable.h" #include diff --git a/libraries/liblutil/sha1.c b/libraries/liblutil/sha1.c index 870b23b16a..5f08be0b0b 100644 --- a/libraries/liblutil/sha1.c +++ b/libraries/liblutil/sha1.c @@ -15,9 +15,8 @@ * 34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F */ -#define SHA1HANDSOFF /* Copies data before messing with it. */ -#define LDAP_BRIDGE +#define DISABLE_BRIDGE #include "portable.h" #include @@ -25,6 +24,7 @@ #include "lutil_sha1.h" +#define SHA1HANDSOFF /* Copies data before messing with it. */ #define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits)))) /* diff --git a/servers/slapd/back-ldbm/dbcache.c b/servers/slapd/back-ldbm/dbcache.c index c16c8b160d..78b2eb5024 100644 --- a/servers/slapd/back-ldbm/dbcache.c +++ b/servers/slapd/back-ldbm/dbcache.c @@ -1,22 +1,27 @@ /* ldbmcache.c - maintain a cache of open ldbm files */ +#define DISABLE_BRIDGE /* disable LDAP_BRIDGE code */ +#include "portable.h" + #include -#include -#include +#include +#include + #include #include #include #include #include -#include "portable.h" + #include "slap.h" -#include "ldapconfig.h" #include "back-ldbm.h" +#include "ldapconfig.h" -#ifndef SYSERRLIST_IN_STDIO +#ifndef DECL_SYS_ERRLIST extern int sys_nerr; extern char *sys_errlist[]; #endif + extern time_t currenttime; extern pthread_mutex_t currenttime_mutex; @@ -176,6 +181,9 @@ ldbm_cache_fetch( ) { Datum data; +#ifdef LDBM_USE_DB2 + memset( &data, 0, sizeof( data ) ); +#endif pthread_mutex_lock( &db->dbc_mutex ); #ifdef reentrant_database @@ -216,6 +224,24 @@ ldbm_cache_store( } #endif +#ifdef LDBM_DEBUG + Statslog( LDAP_DEBUG_STATS, + "=> ldbm_cache_store(): key.dptr=%s, key.dsize=%d\n", + key.dptr, key.dsize, 0, 0, 0 ); + + Statslog( LDAP_DEBUG_STATS, + "=> ldbm_cache_store(): key.dptr=0x%08x, data.dptr=0x%0 8x\n", + key.dptr, data.dptr, 0, 0, 0 ); + + Statslog( LDAP_DEBUG_STATS, + "=> ldbm_cache_store(): data.dptr=%s, data.dsize=%d\n", + data.dptr, data.dsize, 0, 0, 0 ); + + Statslog( LDAP_DEBUG_STATS, + "=> ldbm_cache_store(): flags=0x%08x\n", + flags, 0, 0, 0, 0 ); +#endif /* LDBM_DEBUG */ + rc = ldbm_store( db->dbc_db, key, data, flags ); pthread_mutex_unlock( &db->dbc_mutex ); diff --git a/servers/slapd/connection.c b/servers/slapd/connection.c index 5c3ebdf708..c43192cb64 100644 --- a/servers/slapd/connection.c +++ b/servers/slapd/connection.c @@ -1,11 +1,13 @@ +#define DISABLE_BRIDGE +#include "portable.h" + #include -#include -#include +#include +#include #include #include #include #include -#include "portable.h" #include "slap.h" extern Operation *op_add(); @@ -16,7 +18,8 @@ extern long ops_initiated; extern long ops_completed; extern pthread_mutex_t ops_mutex; extern pthread_t listener_tid; -#ifndef SYSERRLIST_IN_STDIO + +#ifndef DECL_SYS_ERRLIST extern int sys_nerr; extern char *sys_errlist[]; #endif @@ -203,6 +206,22 @@ connection_activity( pthread_attr_init( &attr ); pthread_attr_setdetachstate( &attr, PTHREAD_CREATE_DETACHED ); +#ifndef THREAD_MIT_PTHREADS + /* POSIX_THREADS or compatible + * This is a draft 10 or standard pthreads implementation + */ + if ( pthread_create( &arg->co_op->o_tid, &attr, + (void *) connection_operation, (void *) arg ) != 0 ) { + Debug( LDAP_DEBUG_ANY, "pthread_create failed\n", 0, 0, 0 ); + } else { + pthread_mutex_lock( &active_threads_mutex ); + active_threads++; + pthread_mutex_unlock( &active_threads_mutex ); + } +#else /* !THREAD_MIT_PTHREAD */ + /* + * This is a draft 4 or earlier pthreads implementation + */ if ( pthread_create( &arg->co_op->o_tid, attr, (void *) connection_operation, (void *) arg ) != 0 ) { Debug( LDAP_DEBUG_ANY, "pthread_create failed\n", 0, 0, 0 ); @@ -211,5 +230,6 @@ connection_activity( active_threads++; pthread_mutex_unlock( &active_threads_mutex ); } +#endif /* !THREAD_MIT_PTHREAD */ pthread_attr_destroy( &attr ); } diff --git a/servers/slapd/daemon.c b/servers/slapd/daemon.c index 161fb79cf0..42ab6eaa53 100644 --- a/servers/slapd/daemon.c +++ b/servers/slapd/daemon.c @@ -1,9 +1,19 @@ + +/* Revision history + * + * 5-Jun-96 hodges + * Added locking of new_conn_mutex when traversing the c[] array. + */ + +#define DISABLE_BRIDGE /* disable bridge code */ +#include "portable.h" + #include -#include +#include #include #include #include -#include +#include #include #include #include @@ -12,7 +22,6 @@ #include #endif #include "slap.h" -#include "portable.h" #include "ldapconfig.h" #ifdef NEED_FILIO #include @@ -23,12 +32,20 @@ #include #endif /* USE_SYSCONF */ +#ifdef TCP_WRAPPERS +#include + +int allow_severity = LOG_INFO; +int deny_severity = LOG_NOTICE; +#endif /* TCP_WRAPPERS */ + extern Operation *op_add(); -#ifndef SYSERRLIST_IN_STDIO +#ifndef DECL_SYS_ERRLIST extern int sys_nerr; extern char *sys_errlist[]; #endif + extern time_t currenttime; extern pthread_mutex_t currenttime_mutex; extern int active_threads; @@ -48,7 +65,7 @@ static void set_shutdown(); static void do_nothing(); void -daemon( +slapd_daemon( int port ) { @@ -64,10 +81,18 @@ daemon( int on = 1; #ifdef USE_SYSCONF - dtblsize = sysconf( _SC_OPEN_MAX ); + dtblsize = sysconf( _SC_OPEN_MAX ); #else /* USE_SYSCONF */ - dtblsize = getdtablesize(); + dtblsize = getdtablesize(); #endif /* USE_SYSCONF */ + /* + * Add greg@greg.rim.or.jp + */ +#ifdef FD_SETSIZE + if(dtblsize > FD_SETSIZE) { + dtblsize = FD_SETSIZE; + } +#endif /* !FD_SETSIZE */ c = (Connection *) ch_calloc( 1, dtblsize * sizeof(Connection) ); @@ -127,9 +152,19 @@ daemon( } (void) SIGNAL( SIGPIPE, SIG_IGN ); +#ifdef linux + /* + * LinuxThreads are implemented using SIGUSR1/USR2, + * so we'll use SIGSTKFLT and SIGUNUSED + */ + (void) SIGNAL( SIGSTKFLT, (void *) do_nothing ); + (void) SIGNAL( SIGUNUSED, (void *) set_shutdown ); +#else /* !linux */ (void) SIGNAL( SIGUSR1, (void *) do_nothing ); (void) SIGNAL( SIGUSR2, (void *) set_shutdown ); +#endif /* !linux */ (void) SIGNAL( SIGTERM, (void *) set_shutdown ); + (void) SIGNAL( SIGINT, (void *) set_shutdown ); (void) SIGNAL( SIGHUP, (void *) set_shutdown ); Debug( LDAP_DEBUG_ANY, "slapd starting\n", 0, 0, 0 ); @@ -156,6 +191,9 @@ daemon( struct timeval *tvp; int len, pid; + char *client_name; + char *client_addr; + FD_ZERO( &writefds ); FD_ZERO( &readfds ); FD_SET( tcps, &readfds ); @@ -164,6 +202,8 @@ daemon( Debug( LDAP_DEBUG_CONNS, "listening for connections on %d, activity on:", tcps, 0, 0 ); + + pthread_mutex_lock( &new_conn_mutex ); for ( i = 0; i < dtblsize; i++ ) { if ( c[i].c_sb.sb_sd != -1 ) { FD_SET( c[i].c_sb.sb_sd, &readfds ); @@ -176,19 +216,20 @@ daemon( } } Debug( LDAP_DEBUG_CONNS, "\n", 0, 0, 0 ); + pthread_mutex_unlock( &new_conn_mutex ); zero.tv_sec = 0; zero.tv_usec = 0; Debug( LDAP_DEBUG_CONNS, "before select active_threads %d\n", active_threads, 0, 0 ); -#ifdef PTHREAD_PREEMPTIVE +#if defined(PTHREAD_PREEMPTIVE) || defined(NO_THREADS) tvp = NULL; #else tvp = active_threads ? &zero : NULL; #endif pthread_mutex_unlock( &active_threads_mutex ); - switch ( select( dtblsize, &readfds, &writefds, 0, tvp ) ) { + switch ( i = select( dtblsize, &readfds, &writefds, 0, tvp ) ) { case -1: /* failure - try again */ Debug( LDAP_DEBUG_CONNS, "select failed errno %d (%s)\n", @@ -203,7 +244,7 @@ daemon( continue; default: /* something happened - deal with it */ - Debug( LDAP_DEBUG_CONNS, "select activity\n", 0, 0, 0 ); + Debug( LDAP_DEBUG_CONNS, "select activity on %d descriptors\n", i, 0, 0 ); ; /* FALL */ } pthread_mutex_lock( ¤ttime_mutex ); @@ -225,8 +266,9 @@ daemon( } if ( ioctl( ns, FIONBIO, (caddr_t) &on ) == -1 ) { Debug( LDAP_DEBUG_ANY, - "FIONBIO ioctl on %d faled\n", ns, 0, 0 ); + "FIONBIO ioctl on %d failed\n", ns, 0, 0 ); } + c[ns].c_sb.sb_sd = ns; Debug( LDAP_DEBUG_CONNS, "new connection on %d\n", ns, 0, 0 ); @@ -234,43 +276,76 @@ daemon( pthread_mutex_lock( &ops_mutex ); c[ns].c_connid = num_conns++; pthread_mutex_unlock( &ops_mutex ); + len = sizeof(from); + if ( getpeername( ns, (struct sockaddr *) &from, &len ) == 0 ) { - char *s; -#ifdef REVERSE_LOOKUP + char *s; + client_addr = inet_ntoa( from.sin_addr ); + +#if defined(REVERSE_LOOKUP) || defined(TCP_WRAPPERS) hp = gethostbyaddr( (char *) &(from.sin_addr.s_addr), sizeof(from.sin_addr.s_addr), AF_INET ); -#else - hp = NULL; -#endif - Statslog( LDAP_DEBUG_STATS, - "conn=%d fd=%d connection from %s (%s)\n", - c[ns].c_connid, ns, hp == NULL ? "unknown" - : hp->h_name, inet_ntoa( from.sin_addr ), - 0 ); + if(hp) { + client_name = hp->h_name; - if ( c[ns].c_addr != NULL ) { - free( c[ns].c_addr ); - } - c[ns].c_addr = strdup( inet_ntoa( - from.sin_addr ) ); - if ( c[ns].c_domain != NULL ) { - free( c[ns].c_domain ); - } - c[ns].c_domain = strdup( hp == NULL ? "" : - hp->h_name ); - /* normalize the domain */ - for ( s = c[ns].c_domain; *s; s++ ) { - *s = TOLOWER( *s ); + /* normalize the domain */ + for ( s = client_name; *s; s++ ) { + *s = TOLOWER( *s ); + } + + } else { + client_name = NULL; } +#else + client_name = NULL; +#endif + } else { + client_name = NULL;; + client_addr = NULL; + } + +#ifdef TCP_WRAPPERS + if(!hosts_ctl("slapd", client_name, client_addr, + STRING_UNKNOWN)) + { + /* DENY ACCESS */ Statslog( LDAP_DEBUG_STATS, - "conn=%d fd=%d connection from unknown\n", - c[ns].c_connid, ns, 0, 0, 0 ); + "conn=%d fd=%d connection from %s (%s) denied.\n", + c[ns].c_connid, ns, + client_name == NULL ? "unknown" : client_name, + client_addr == NULL ? "unknown" : client_addr, + 0 ); + + close(ns); + pthread_mutex_unlock( &new_conn_mutex ); + continue; + } +#endif /* TCP_WRAPPERS */ + + Statslog( LDAP_DEBUG_STATS, + "conn=%d fd=%d connection from %s (%s) accepted.\n", + c[ns].c_connid, ns, + client_name == NULL ? "unknown" : client_name, + client_addr == NULL ? "unknown" : client_addr, + 0 ); + + if ( c[ns].c_addr != NULL ) { + free( c[ns].c_addr ); } + c[ns].c_addr = strdup( client_addr ); + + if ( c[ns].c_domain != NULL ) { + free( c[ns].c_domain ); + } + + c[ns].c_domain = strdup( client_name == NULL + ? "" : client_name ); + pthread_mutex_lock( &c[ns].c_dnmutex ); if ( c[ns].c_dn != NULL ) { free( c[ns].c_dn ); @@ -349,15 +424,33 @@ set_shutdown() { Debug( LDAP_DEBUG_ANY, "slapd got shutdown signal\n", 0, 0, 0 ); slapd_shutdown = 1; +#ifdef linux + /* + * LinuxThreads are implemented using SIGUSR1/USR2, + * so we'll use SIGSTKFLT and SIGUNUSED + */ + pthread_kill( listener_tid, SIGSTKFLT ); + (void) SIGNAL( SIGUNUSED, (void *) set_shutdown ); +#else /* !linux */ pthread_kill( listener_tid, SIGUSR1 ); (void) SIGNAL( SIGUSR2, (void *) set_shutdown ); +#endif /* !linux */ (void) SIGNAL( SIGTERM, (void *) set_shutdown ); + (void) SIGNAL( SIGINT, (void *) set_shutdown ); (void) SIGNAL( SIGHUP, (void *) set_shutdown ); } static void do_nothing() { - Debug( LDAP_DEBUG_TRACE, "slapd got SIGUSR1\n", 0, 0, 0 ); + Debug( LDAP_DEBUG_TRACE, "slapd got do_nothing signal\n", 0, 0, 0 ); +#ifdef linux + /* + * LinuxThreads are implemented using SIGUSR1/USR2, + * so we'll use SIGSTKFLT and SIGUNUSED + */ + (void) SIGNAL( SIGSTKFLT, (void *) do_nothing ); +#else /* !linux */ (void) SIGNAL( SIGUSR1, (void *) do_nothing ); +#endif /* !linux */ } diff --git a/servers/slapd/result.c b/servers/slapd/result.c index 0ef82a7b3e..bd4dec8fee 100644 --- a/servers/slapd/result.c +++ b/servers/slapd/result.c @@ -1,20 +1,23 @@ /* result.c - routines to send ldap results, errors, and referrals */ +#define DISABLE_BRIDGE +#include "portable.h" + #include -#include -#include +#include +#include #include #include #include #include #include -#include "portable.h" #include "slap.h" -#ifndef SYSERRLIST_IN_STDIO +#ifndef DECL_SYS_ERRLIST extern int sys_nerr; extern char *sys_errlist[]; #endif + extern int active_threads; extern pthread_mutex_t active_threads_mutex; extern pthread_mutex_t new_conn_mutex; @@ -121,7 +124,13 @@ send_ldap_result2( pthread_mutex_lock( &active_threads_mutex ); active_threads--; conn->c_writewaiter = 1; + +#ifdef linux + pthread_kill( listener_tid, SIGSTKFLT ); +#else /* !linux */ pthread_kill( listener_tid, SIGUSR1 ); +#endif /* !linux */ + pthread_cond_wait( &conn->c_wcv, &active_threads_mutex ); pthread_mutex_unlock( &active_threads_mutex ); @@ -192,6 +201,7 @@ send_search_entry( Attribute *a; int i, rc, bytes, sd; struct acl *acl; + char *edn; Debug( LDAP_DEBUG_TRACE, "=> send_search_entry (%s)\n", e->e_dn, 0, 0 ); @@ -202,15 +212,19 @@ send_search_entry( return( 1 ); } + edn = dn_normalize_case( strdup( e->e_dn ) ); + #ifdef COMPAT30 if ( (ber = ber_alloc_t( conn->c_version == 30 ? 0 : LBER_USE_DER )) - == NULLBER ) { + == NULLBER ) #else - if ( (ber = der_alloc()) == NULLBER ) { + if ( (ber = der_alloc()) == NULLBER ) #endif + { Debug( LDAP_DEBUG_ANY, "ber_alloc failed\n", 0, 0, 0 ); send_ldap_result( conn, op, LDAP_OPERATIONS_ERROR, NULL, - "ber_alloc" ); + "ber_alloc" ); + free(edn); return( 1 ); } @@ -220,26 +234,44 @@ send_search_entry( LDAP_RES_SEARCH_ENTRY, e->e_dn ); } else #endif + { rc = ber_printf( ber, "{it{s{", op->o_msgid, - LDAP_RES_SEARCH_ENTRY, e->e_dn ); + LDAP_RES_SEARCH_ENTRY, e->e_dn ); + } if ( rc == -1 ) { Debug( LDAP_DEBUG_ANY, "ber_printf failed\n", 0, 0, 0 ); ber_free( ber, 1 ); send_ldap_result( conn, op, LDAP_OPERATIONS_ERROR, NULL, "ber_printf dn" ); + free(edn); return( 1 ); } for ( a = e->e_attrs; a != NULL; a = a->a_next ) { + regmatch_t matches[MAXREMATCHES]; + if ( attrs != NULL && ! charray_inlist( attrs, a->a_type ) ) { continue; } - acl = acl_get_applicable( be, op, e, a->a_type ); + /* the lastmod attributes are ignored by ACL checking */ + if ( strcasecmp( a->a_type, "modifiersname" ) == 0 || + strcasecmp( a->a_type, "modifytimestamp" ) == 0 || + strcasecmp( a->a_type, "creatorsname" ) == 0 || + strcasecmp( a->a_type, "createtimestamp" ) == 0 ) + { + Debug( LDAP_DEBUG_ACL, "LASTMOD attribute: %s access DEFAULT\n", + a->a_type, 0, 0 ); + acl = NULL; + } else { + acl = acl_get_applicable( be, op, e, a->a_type, edn, + MAXREMATCHES, matches ); + } - if ( ! acl_access_allowed( acl, be, conn, e, NULL, op, - ACL_READ ) ) { + if ( ! acl_access_allowed( acl, be, conn, e, NULL, op, ACL_READ, + edn, matches ) ) + { continue; } @@ -248,14 +280,15 @@ send_search_entry( ber_free( ber, 1 ); send_ldap_result( conn, op, LDAP_OPERATIONS_ERROR, NULL, "ber_printf type" ); + free(edn); return( 1 ); } if ( ! attrsonly ) { for ( i = 0; a->a_vals[i] != NULL; i++ ) { - if ( a->a_syntax & SYNTAX_DN && - ! acl_access_allowed( acl, be, conn, e, - a->a_vals[i], op, ACL_READ ) ) + if ( a->a_syntax & SYNTAX_DN && + ! acl_access_allowed( acl, be, conn, e, a->a_vals[i], op, + ACL_READ, edn, matches) ) { continue; } @@ -270,6 +303,7 @@ send_search_entry( send_ldap_result( conn, op, LDAP_OPERATIONS_ERROR, NULL, "ber_printf value" ); + free(edn); return( 1 ); } } @@ -280,10 +314,13 @@ send_search_entry( ber_free( ber, 1 ); send_ldap_result( conn, op, LDAP_OPERATIONS_ERROR, NULL, "ber_printf type end" ); + free(edn); return( 1 ); } } + free(edn); + #ifdef COMPAT30 if ( conn->c_version == 30 ) { rc = ber_printf( ber, "}}}}" ); diff --git a/servers/slurpd/fm.c b/servers/slurpd/fm.c index 2d36838bb5..04717dd06c 100644 --- a/servers/slurpd/fm.c +++ b/servers/slurpd/fm.c @@ -14,49 +14,36 @@ * fm.c - file management routines. */ +#define DISABLE_BRIDGE +#include "portable.h" + #include -#include -#include +#include +#include #include "slurp.h" #include "globals.h" -extern void do_admin(); - -static void set_shutdown(); -void do_nothing(); /* * Externs */ -#ifdef NEEDPROTOS -extern int file_nonempty( char * ); -extern int acquire_lock(char *, FILE **, FILE ** ); -extern int relinquish_lock(char *, FILE *, FILE * ); -#else /* NEEDPROTOS */ -extern int file_nonempty(); -extern int acquire_lock(); -extern int relinquish_lock(); -#endif /* NEEDPROTOS */ +extern void do_admin LDAP_P((void)); +extern int file_nonempty LDAP_P(( char * )); +extern int acquire_lock LDAP_P((char *, FILE **, FILE ** )); +extern int relinquish_lock LDAP_P((char *, FILE *, FILE * )); /* * Forward references */ -#ifdef NEEDPROTOS -static char *get_record( FILE * ); -static void populate_queue( char *f ); -static void set_shutdown(); -void do_nothing(); -#else /* NEEDPROTOS */ -static char *get_record(); -static void populate_queue(); -static void set_shutdown(); -void do_nothing(); -#endif /* NEEDPROTOS */ - -#ifndef SYSERRLIST_IN_STDIO +static char *get_record LDAP_P(( FILE * )); +static void populate_queue LDAP_P(( char *f )); +static void set_shutdown LDAP_P((void)); +void do_nothing LDAP_P((void)); + +#ifndef DECL_SYS_ERRLIST extern char *sys_errlist[]; -#endif /* SYSERRLIST_IN_STDIO */ +#endif /* DECL_SYS_ERRLIST */ @@ -77,12 +64,20 @@ fm( /* Set up our signal handlers: * SIG{TERM,INT,HUP} causes a shutdown - * SIGUSR1 - does nothing, used to wake up sleeping threads. - * SIGUSR2 - causes slurpd to read its administrative interface file. + * SIG(STKFLT|USR1) - does nothing, used to wake up sleeping threads. + * SIG(UNUSED|USR2) - causes slurpd to read its administrative interface file. * (not yet implemented). */ +#ifdef SIGSTKFLT + (void) SIGNAL( SIGSTKFLT, (void *) do_nothing ); +#else (void) SIGNAL( SIGUSR1, (void *) do_nothing ); +#endif +#ifdef SIGUNUSED + (void) SIGNAL( SIGUNUSED, (void *) do_admin ); +#else (void) SIGNAL( SIGUSR2, (void *) do_admin ); +#endif (void) SIGNAL( SIGTERM, (void *) set_shutdown ); (void) SIGNAL( SIGINT, (void *) set_shutdown ); (void) SIGNAL( SIGHUP, (void *) set_shutdown ); @@ -160,7 +155,11 @@ set_shutdown() int i; sglob->slurpd_shutdown = 1; /* set flag */ +#ifdef SIGSTKFLT + pthread_kill( sglob->fm_tid, SIGSTKFLT ); /* wake up file mgr */ +#else pthread_kill( sglob->fm_tid, SIGUSR1 ); /* wake up file mgr */ +#endif sglob->rq->rq_lock( sglob->rq ); /* lock queue */ pthread_cond_broadcast( &(sglob->rq->rq_more) ); /* wake repl threads */ for ( i = 0; i < sglob->num_replicas; i++ ) { @@ -181,7 +180,11 @@ set_shutdown() void do_nothing() { +#ifdef SIGSTKFLT + (void) SIGNAL( SIGSTKFLT, (void *) do_nothing ); +#else (void) SIGNAL( SIGUSR1, (void *) do_nothing ); +#endif } diff --git a/servers/slurpd/ldap_op.c b/servers/slurpd/ldap_op.c index 08253921cd..c9bdf7e689 100644 --- a/servers/slurpd/ldap_op.c +++ b/servers/slurpd/ldap_op.c @@ -14,43 +14,49 @@ * ldap_op.c - routines to perform LDAP operations */ +#define DISABLE_BRIDGE +#include "portable.h" + #include -#include +#include +#include #include -#include #ifdef KERBEROS +#ifdef KERBEROS_V +#include +#else #include +#endif /* KERBEROS_V */ #endif /* KERBEROS */ #include #include -#include "portable.h" #include "slurp.h" /* Forward references */ -static int get_changetype( char * ); -static struct berval **make_singlevalued_berval( char *, int ); -static int op_ldap_add( Ri *, Re *, char ** ); -static int op_ldap_modify( Ri *, Re *, char ** ); -static int op_ldap_delete( Ri *, Re *, char ** ); -static int op_ldap_modrdn( Ri *, Re *, char ** ); -static LDAPMod *alloc_ldapmod(); -static void free_ldapmod( LDAPMod * ); -static void free_ldmarr( LDAPMod ** ); -static int getmodtype( char * ); -static void dump_ldm_array( LDAPMod ** ); -static char **read_krbnames( Ri * ); -static void upcase( char * ); -static int do_bind( Ri *, int * ); -static int do_unbind( Ri * ); +static int get_changetype LDAP_P(( char * )); +static struct berval **make_singlevalued_berval LDAP_P(( char *, int )); +static int op_ldap_add LDAP_P(( Ri *, Re *, char ** )); +static int op_ldap_modify LDAP_P(( Ri *, Re *, char ** )); +static int op_ldap_delete LDAP_P(( Ri *, Re *, char ** )); +static int op_ldap_modrdn LDAP_P(( Ri *, Re *, char ** )); +static LDAPMod *alloc_ldapmod LDAP_P(()); +static void free_ldapmod LDAP_P(( LDAPMod * )); +static void free_ldmarr LDAP_P(( LDAPMod ** )); +static int getmodtype LDAP_P(( char * )); +static void dump_ldm_array LDAP_P(( LDAPMod ** )); +static char **read_krbnames LDAP_P(( Ri * )); +static void upcase LDAP_P(( char * )); +static int do_bind LDAP_P(( Ri *, int * )); +static int do_unbind LDAP_P(( Ri * )); /* External references */ -#ifndef SYSERRLIST_IN_STDIO +#ifndef DECL_SYS_ERRLIST extern char *sys_errlist[]; -#endif /* SYSERRLIST_IN_STDIO */ +#endif /* DECL_SYS_ERRLIST */ extern char *ch_malloc( unsigned long ); diff --git a/servers/slurpd/re.c b/servers/slurpd/re.c index 4a6dc38237..a712b63a64 100644 --- a/servers/slurpd/re.c +++ b/servers/slurpd/re.c @@ -18,8 +18,11 @@ */ +#define DISABLE_BRIDGE +#include "portable.h" + #include -#include +#include #include #include @@ -28,18 +31,20 @@ #include "globals.h" /* externs */ -extern char *str_getline( char **next ); -extern void ch_free( char *p ); +extern char *str_getline LDAP_P(( char **next )); +extern void ch_free LDAP_P(( char *p )); +#ifndef DECL_SYS_ERRLIST extern char *sys_errlist[]; +#endif /* DECL_SYS_ERRLIST */ /* Forward references */ -static Rh *get_repl_hosts( char *, int *, char ** ); -static int gettype( char * ); -static int getchangetype( char *); -static int Re_parse( Re *re, char *replbuf ); -static void Re_dump( Re *re, FILE *fp ); -static void warn_unknown_replica( char *, int port ); +static Rh *get_repl_hosts LDAP_P(( char *, int *, char ** )); +static int gettype LDAP_P(( char * )); +static int getchangetype LDAP_P(( char * )); +static int Re_parse LDAP_P(( Re *re, char *replbuf )); +static void Re_dump LDAP_P(( Re *re, FILE *fp )); +static void warn_unknown_replica LDAP_P(( char *, int port )); /* Globals, scoped within this file */ static int nur = 0; /* Number of unknown replicas */ @@ -182,7 +187,9 @@ Re_parse( state |= GOT_TIME; break; case T_DN: - re->re_dn = strdup( value ); + re->re_dn = ch_malloc( len + 1 ); + memcpy( re->re_dn, value, len ); + re->re_dn[ len ]='\0'; state |= GOT_DN; break; default: @@ -222,7 +229,9 @@ Re_parse( sizeof( Mi ) * ( nml + 2 )); re->re_mods[ nml ].mi_type = strdup( type ); if ( value != NULL ) { - re->re_mods[ nml ].mi_val = strdup( value ); + re->re_mods[ nml ].mi_val = ch_malloc( len + 1 ); + memcpy( re->re_mods[ nml ].mi_val, value, len ); + re->re_mods[ nml ].mi_val[ len ] = '\0'; re->re_mods[ nml ].mi_len = len; } else { re->re_mods[ nml ].mi_val = NULL; diff --git a/servers/slurpd/reject.c b/servers/slurpd/reject.c index 8ae0dc6363..b87f55145a 100644 --- a/servers/slurpd/reject.c +++ b/servers/slurpd/reject.c @@ -17,6 +17,8 @@ * to a replica LDAP server. */ +#define DISABLE_BRIDGE +#include "portable.h" #include #include @@ -27,9 +29,9 @@ #include "slurp.h" #include "globals.h" -#ifndef SYSERRLIST_IN_STDIO +#ifndef DECL_SYS_ERRLIST extern char *sys_errlist[]; -#endif /* SYSERRLIST_IN_STDIO */ +#endif /* DECL_SYS_ERRLIST */ /* diff --git a/servers/slurpd/replog.c b/servers/slurpd/replog.c index c3a855cffe..5c145a475b 100644 --- a/servers/slurpd/replog.c +++ b/servers/slurpd/replog.c @@ -15,44 +15,37 @@ * replog.c - routines which read and write replication log files. */ +#define DISABLE_BRIDGE +#include "portable.h" + #include #include #include -#include +#include #include #include #include #include #include -#include +#include -#include "portable.h" #include "slurp.h" #include "globals.h" /* * Externs */ -#ifdef NEEDPROTOS -extern FILE *lock_fopen( char *, char *, FILE ** ); -extern char *ch_malloc( unsigned long ); -#else /* NEEDPROTOS */ -extern FILE *lock_fopen(); -extern char *ch_malloc(); -#endif /* NEEDPROTOS */ +extern FILE *lock_fopen LDAP_P(( char *, char *, FILE ** )); +extern char *ch_malloc LDAP_P(( unsigned long )); /* * Forward declarations */ -#ifdef NEEDPROTOS -int file_nonempty( char * ); -#else /* NEEDPROTOS */ -int file_nonempty(); -#endif /* NEEDPROTOS */ +int file_nonempty LDAP_P(( char * )); -#ifndef SYSERRLIST_IN_STDIO +#ifndef DECL_SYS_ERRLIST extern char *sys_errlist[]; #endif @@ -62,8 +55,6 @@ extern char *sys_errlist[]; static int duplicate_replog( char *, char * ); - - /* * Copy the replication log. Returns 0 on success, 1 if a temporary * error occurs, and -1 if a fatal error occurs. diff --git a/servers/slurpd/rq.c b/servers/slurpd/rq.c index 54adb4da1a..74f2d8ca1f 100644 --- a/servers/slurpd/rq.c +++ b/servers/slurpd/rq.c @@ -31,6 +31,9 @@ * */ +#define DISABLE_BRIDGE +#include "portable.h" + #include #include "slurp.h" @@ -38,15 +41,11 @@ /* externs */ -#ifdef NEEDPROTOS -extern void Re_dump( Re *re ); -#else /* NEEDPROTOS */ -extern void Re_dump(); -#endif /* NEEDPROTOS */ - +extern void Re_dump LDAP_P(( Re *re )); +#ifndef DECL_SYS_ERRLIST extern char *sys_errlist[]; - +#endif /* DECL_SYS_ERRLIST */ /* * Lock the replication queue. @@ -60,9 +59,6 @@ Rq_lock( } - - - /* * Unlock the replication queue. */ @@ -89,8 +85,6 @@ Rq_gethead( } - - /* * Return the next item in the queue. Callers should lock the queue before * calling this routine. @@ -108,8 +102,6 @@ Rq_getnext( } - - /* * Delete the item at the head of the list. The queue should be locked * by the caller before calling this routine. @@ -144,8 +136,6 @@ Rq_delhead( } - - /* * Add an entry to the tail of the replication queue. Locking is handled * internally. When items are added to the queue, this routine wakes @@ -209,8 +199,6 @@ Rq_add( } - - /* * Garbage-collect the replication queue. Locking is handled internally. */ @@ -234,7 +222,6 @@ Rq_gc( } - /* * For debugging: dump the contents of the replication queue to a file. * Locking is handled internally. @@ -268,7 +255,6 @@ Rq_dump( } - /* * Write the contents of a replication queue to a file. Returns zero if * successful, -1 if not. Handles queue locking internally. Callers should @@ -317,8 +303,6 @@ Rq_write( } - - /* * Check to see if the private slurpd replication log needs trimming. * The current criteria are: @@ -391,8 +375,6 @@ Rq_getcount( } - - /* * Allocate and initialize an Rq object. */ diff --git a/servers/slurpd/st.c b/servers/slurpd/st.c index 610b295853..79160720ed 100644 --- a/servers/slurpd/st.c +++ b/servers/slurpd/st.c @@ -16,18 +16,19 @@ * writing status information to disk. */ - +#define DISABLE_BRIDGE +#include "portable.h" #include -#include +#include #include #include "slurp.h" #include "globals.h" -#ifndef SYSERRLIST_IN_STDIO +#ifndef DECL_SYS_ERRLIST extern char *sys_errlist[]; -#endif /* SYSERRLIST_IN_STDIO */ +#endif /* DECL_SYS_ERRLIST */ /* * Add information about replica host specified by Ri to list @@ -56,8 +57,7 @@ St_add( pthread_mutex_unlock( &(st->st_mutex )); return NULL; } - st->st_data[ ind ] = ( Stel * ) ch_malloc( st->st_data, - sizeof( Stel )); + st->st_data[ ind ] = ( Stel * ) ch_malloc( sizeof( Stel ) ); if ( st->st_data[ ind ] == NULL ) { pthread_mutex_unlock( &(st->st_mutex )); return NULL;