X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fldapd%2Fmain.c;h=5e91ec6ea31fea8159093d4234c6986ada064e71;hb=c9eacbdc6407b65b395c13e1e93e8fe25bbbf041;hp=f5f421e512b35f1d77bfc803e1386f8283fa4710;hpb=2a869f5a99f537b246ba8640502e2a86117cb6e8;p=openldap diff --git a/servers/ldapd/main.c b/servers/ldapd/main.c index f5f421e512..5e91ec6ea3 100644 --- a/servers/ldapd/main.c +++ b/servers/ldapd/main.c @@ -29,12 +29,18 @@ #include #include +#ifdef LDAP_PROCTITLE +#include +#endif + #include #include #include "lber.h" +#include "../../libraries/liblber/lber-int.h" /* get struct sockbuf */ #include "ldap.h" #include "common.h" +#include "lutil.h" /* Get lutil_detach() */ #ifdef HAVE_TCPD #include @@ -43,12 +49,11 @@ int allow_severity = LOG_INFO; int deny_severity = LOG_NOTICE; #endif /* TCP_WRAPPERS */ -void log_and_exit(); -static set_socket(); -static do_queries(); -static RETSIGTYPE wait4child(); +static int set_socket( int port, int udp ); +static void do_queries( int clientsock, int udp ); +static RETSIGTYPE wait4child( int sig ); #ifdef LDAP_CONNECTIONLESS -static udp_init(); +static int udp_init( int port, int createsocket ); #endif #ifdef LDAP_DEBUG @@ -77,10 +82,8 @@ char *kerberos_keyfile; int dtblsize; int RunFromInetd = 0; -extern char Versionstr[]; - -static usage( name ) -char *name; +static void +usage( char *name ) { fprintf( stderr, "usage: %s [-d debuglvl] [-p port] [-l] [-c dsa] [-r referraltimeout]", name ); #ifdef LDAP_CONNECTIONLESS @@ -95,9 +98,8 @@ char *name; fprintf( stderr, "\n" ); } -main (argc, argv) -int argc; -char **argv; +int +main( int argc, char **argv ) { int tcps, ns; #ifdef LDAP_CONNECTIONLESS @@ -112,14 +114,9 @@ char **argv; int len; int dsapargc; char **dsapargv; - RETSIGTYPE wait4child(); -#ifndef NOSETPROCTITLE +#ifdef LDAP_PROCTITLE char title[80]; - extern char **Argv; - extern int Argc; #endif - extern char *optarg; - extern int optind; #ifdef VMS /* Pick up socket from inetd-type server on VMS */ @@ -157,7 +154,7 @@ char **argv; #ifdef LDAP_DEBUG ldap_debug = atoi( optarg ); if ( ldap_debug & LDAP_DEBUG_PACKETS ) - lber_debug = ldap_debug; + lber_int_debug = ldap_debug; #else fprintf( stderr, "Not compiled with -DLDAP_DEBUG!\n" ); #endif @@ -243,7 +240,7 @@ char **argv; } #endif /* FD_SETSIZE */ -#ifndef NOSETPROCTITLE +#if defined(LDAP_PROCTITLE) && !defined( HAVE_SETPROCTITLE ) /* for setproctitle */ Argv = argv; Argc = argc; @@ -260,14 +257,18 @@ char **argv; * that have exited */ if (!RunFromInetd) { -#ifndef NOSETPROCTITLE +#ifdef LDAP_PROCTITLE setproctitle( "initializing" ); #endif #ifndef VMS - (void) detach(); -#endif - (void) SIGNAL( SIGCHLD, (void *) wait4child ); - (void) SIGNAL( SIGINT, (void *) log_and_exit ); +# ifdef LDAP_DEBUG + lutil_detach( ldap_debug, 1 ); +# else + lutil_detach( 0, 1 ); +# endif +#endif + (void) SIGNAL( SIGCHLD, wait4child ); + (void) SIGNAL( SIGINT, log_and_exit ); } /* @@ -299,7 +300,7 @@ char **argv; (void) get_syntaxes(); if (RunFromInetd) { len = sizeof( socktype ); - getsockopt( ns, SOL_SOCKET, SO_TYPE, &socktype, &len ); + getsockopt( ns, SOL_SOCKET, SO_TYPE, (char *)&socktype, &len ); if ( socktype == SOCK_DGRAM ) { #ifdef LDAP_CONNECTIONLESS Debug( LDAP_DEBUG_ARGS, @@ -330,7 +331,7 @@ char **argv; inet_ntoa( from.sin_addr ) ); } -#ifndef NOSETPROCTITLE +#ifdef LDAP_PROCTITLE sprintf( title, "%s %d\n", hp == NULL ? inet_ntoa( from.sin_addr ) : hp->h_name, myport ); setproctitle( title ); @@ -355,7 +356,7 @@ char **argv; * if we are doing CLDAP as well, handle those requests on the fly */ -#ifndef NOSETPROCTITLE +#ifdef LDAP_PROCTITLE #ifdef LDAP_CONNECTIONLESS sprintf( title, "listening %s/%s %d", do_tcp ? "tcp" : "", do_udp ? "udp" : "", myport ); @@ -436,12 +437,12 @@ char **argv; #ifdef VMS /* This is for debug on terminal on VMS */ close( tcps ); -#ifndef NOSETPROCTITLE +#ifdef LDAP_PROCTITLE setproctitle( hp == NULL ? inet_ntoa( from.sin_addr ) : hp->h_name ); #endif gettimeofday( &conn_start_tv, (struct timezone *) NULL ); - (void) SIGNAL( SIGPIPE, (void *) log_and_exit ); + (void) SIGNAL( SIGPIPE, log_and_exit ); do_queries( ns, 0 ); /* NOT REACHED */ @@ -450,14 +451,14 @@ char **argv; switch( pid = fork() ) { case 0: /* child */ close( tcps ); -#ifndef NOSETPROCTITLE +#ifdef LDAP_PROCTITLE sprintf( title, "%s (%d)\n", hp == NULL ? inet_ntoa( from.sin_addr ) : hp->h_name, myport ); setproctitle( title ); #endif gettimeofday( &conn_start_tv, (struct timezone *) NULL ); - (void) SIGNAL( SIGPIPE, (void *) log_and_exit ); + (void) SIGNAL( SIGPIPE, log_and_exit ); do_queries( ns, 0 ); break; @@ -482,14 +483,14 @@ char **argv; /* NOT REACHED */ } -static +static void do_queries( int clientsock, int udp /* is this a UDP (CLDAP) request? */ ) { fd_set readfds; - int rc, i; + int rc; struct timeval timeout; Sockbuf sb; #ifdef LDAP_CONNECTIONLESS @@ -514,23 +515,14 @@ do_queries( conn_init(); } - (void) memset( (void *) &sb, '\0', sizeof( sb ) ); - sb.sb_sd = clientsock; - sb.sb_naddr = ( udp ) ? 1 : 0; -#ifdef LDAP_CONNECTIONLESS - sb.sb_addrs = (void **)saddrlist; - sb.sb_fromaddr = &faddr; - sb.sb_useaddr = saddrlist[ 0 ] = &saddr; -#endif - sb.sb_ber.ber_buf = NULL; - sb.sb_ber.ber_ptr = NULL; - sb.sb_ber.ber_end = NULL; - + lber_pvt_sb_init( &sb ); + lber_pvt_sb_set_desc( &sb, clientsock ); + lber_pvt_sb_set_io( &sb, (udp) ? &lber_pvt_sb_io_udp : + &lber_pvt_sb_io_tcp, NULL ); timeout.tv_sec = idletime; timeout.tv_usec = 0; for ( ;; ) { struct conn *dsaconn; - extern struct conn *conns; FD_ZERO( &readfds ); FD_SET( clientsock, &readfds ); @@ -538,6 +530,7 @@ do_queries( #ifdef LDAP_DEBUG if ( ldap_debug & LDAP_DEBUG_CONNS ) { + int i; Debug( LDAP_DEBUG_CONNS, "FDLIST:", 0, 0, 0 ); for ( i = 0; i < dtblsize; i++ ) { if ( FD_ISSET( i, &readfds ) ) { @@ -554,7 +547,7 @@ do_queries( * already waiting for us on the client sock. */ - if ( sb.sb_ber.ber_ptr >= sb.sb_ber.ber_end ) { + if ( ! lber_pvt_sb_data_ready( &sb ) ) { if ( (rc = select( dtblsize, &readfds, 0, 0, udp ? 0 : &timeout )) < 1 ) { #ifdef LDAP_DEBUG @@ -580,7 +573,7 @@ do_queries( } } - if ( sb.sb_ber.ber_ptr < sb.sb_ber.ber_end || + if ( lber_pvt_sb_data_ready( &sb ) || FD_ISSET( clientsock, &readfds ) ) { client_request( &sb, conns, udp ); } else { @@ -596,7 +589,8 @@ do_queries( /* NOT REACHED */ } -static set_socket( +static int +set_socket( int port, int udp /* UDP port? */ ) @@ -641,7 +635,8 @@ static set_socket( return( s ); } -static RETSIGTYPE wait4child() +static RETSIGTYPE +wait4child( int sig ) { #ifndef HAVE_WAITPID WAITSTATUSTYPE status; @@ -650,18 +645,18 @@ static RETSIGTYPE wait4child() Debug( LDAP_DEBUG_TRACE, "parent: catching child status\n", 0, 0, 0 ); #ifdef HAVE_WAITPID - while( waitpid( (pid_t) -1, NULL, WAIT_FLAGS ) > 0 ) + while( waitpid( (pid_t) -1, (int *) NULL, WAIT_FLAGS ) > 0 ) ; /* NULL */ #else - while ( wait3( &status, WAIT_FLAGS, 0 ) > 0 ) + while ( wait4( (pid_t) -1, &status, WAIT_FLAGS, 0 ) > 0 ) ; /* NULL */ #endif - (void) SIGNAL( SIGCHLD, (void *) wait4child ); + (void) SIGNAL( SIGCHLD, wait4child ); } -void +RETSIGTYPE log_and_exit( int exitcode ) { struct timeval tv; @@ -689,9 +684,6 @@ udp_init( { int s, bound; char *matched; - extern char *dsa_address; - extern struct PSAPaddr *psap_cpy(); - extern struct conn *conns; if ( createsocket ) s = set_socket( port, 1 );