]> git.sur5r.net Git - openldap/blobdiff - clients/finger/main.c
Added dnPretty2/dnNormalize2 using preallocated destination berval
[openldap] / clients / finger / main.c
index d9ce474fdb41607b8590ce61fca3c2d9ef1da416..ec2a07460e867722c8c5b70cfc9755292831818a 100644 (file)
@@ -1,3 +1,4 @@
+/* $OpenLDAP$ */
 /*
  * Copyright (c) 1990,1994 Regents of the University of Michigan.
  * All rights reserved.
 #include "portable.h"
 
 #include <stdio.h>
-#include <ctype.h>
-#include <signal.h>
 
+#include <ac/stdlib.h>
+
+#include <ac/ctype.h>
+#include <ac/signal.h>
 #include <ac/socket.h>
 #include <ac/string.h>
 #include <ac/syslog.h>
 #include <ac/unistd.h>
 #include <ac/wait.h>
 
+#ifdef HAVE_SYS_RESOURCE_H
 #include <sys/resource.h>
+#endif
 
-#include "lber.h"
-#include "ldap.h"
-#include "disptmpl.h"
+#include <ldap.h>
+#include <disptmpl.h>
 
-#include "ldapconfig.h"
+#include "ldap_defaults.h"
 
 
 int    dosyslog = 1;
-char   *ldaphost = LDAPHOST;
-int    ldapport = LDAP_PORT;
-char   *base = FINGER_BASE;
+char   *ldaphost = NULL;
+int    ldapport = 0;
+char   *base = NULL;
 int    deref;
 char   *filterfile = FILTERFILE;
 char   *templatefile = TEMPLATEFILE;
 int    rdncount = FINGER_RDNCOUNT;
 
-static do_query();
-static do_search();
-static do_read();
-static print_attr();
+static void do_query(void);
+static void do_search(LDAP *ld, char *buf);
+static void do_read(LDAP *ld, LDAPMessage *e);
 
-static usage( name )
-char   *name;
+static void
+usage( char *name )
 {
-       fprintf( stderr, "usage: %s [-l] [-x ldaphost] [-p ldapport] [-f filterfile] [-t templatefile] [-c rdncount]\r\n", name );
-       exit( 1 );
+       fprintf( stderr, "usage: %s [-l] [-x ldaphost] [-p ldapport] [-b searchbase] [-f filterfile] [-t templatefile] [-c rdncount]\r\n", name );
+       exit( EXIT_FAILURE );
 }
 
-main (argc, argv)
-int    argc;
-char   **argv;
+int
+main( int argc, char **argv )
 {
        int                     i;
        char                    *myname;
-       unsigned long           mypeer = -1;
        struct hostent          *hp;
        struct sockaddr_in      peername;
-       int                     peernamelen;
+       socklen_t               peernamelen;
        int                     interactive = 0;
-       extern char             *optarg;
 
        deref = FINGER_DEREF;
-       while ( (i = getopt( argc, argv, "f:ilp:t:x:p:c:" )) != EOF ) {
+       while ( (i = getopt( argc, argv, "f:ilp:t:x:p:b:c:" )) != EOF ) {
                switch( i ) {
                case 'f':       /* ldap filter file */
                        filterfile = strdup( optarg );
@@ -93,6 +93,10 @@ char **argv;
                        ldapport = atoi( optarg );
                        break;
 
+               case 'b':       /* specify search base */
+                       base = strdup( optarg );
+                       break; 
+
                case 'c':       /* specify number of DN components to show */
                        rdncount = atoi( optarg );
                        break;
@@ -107,9 +111,8 @@ char        **argv;
                if ( getpeername( 0, (struct sockaddr *)&peername,
                    &peernamelen ) != 0 ) {
                        perror( "getpeername" );
-                       exit( 1 );
+                       exit( EXIT_FAILURE );
                }
-               mypeer = (unsigned long) peername.sin_addr.s_addr;
        }
 
 #ifdef FINGER_BANNER
@@ -119,26 +122,29 @@ char      **argv;
        }
 #endif
 
-       if ( (myname = strrchr( argv[0], '/' )) == NULL )
+       if ( (myname = strrchr( argv[0], *LDAP_DIRSEP )) == NULL )
                myname = strdup( argv[0] );
        else
                myname = strdup( myname + 1 );
 
+#ifdef SIGPIPE
+       (void) SIGNAL( SIGPIPE, SIG_IGN );
+#endif
+
        if ( dosyslog ) {
 #ifdef LOG_LOCAL4
                openlog( myname, OPENLOG_OPTIONS, LOG_LOCAL4 );
-#else
+#elif LOG_DEBUG
                openlog( myname, OPENLOG_OPTIONS );
 #endif
        }
 
-       if ( dosyslog && mypeer != -1 ) {
-               struct in_addr  addr;
-
-               hp = gethostbyaddr( (char *) &mypeer, sizeof(mypeer), AF_INET );
-               addr.s_addr = mypeer;
-               syslog( LOG_INFO, "connection from %s (%s)", (hp == NULL) ?
-                   "unknown" : hp->h_name, inet_ntoa( addr ) );
+       if ( dosyslog && !interactive ) {
+               hp = gethostbyaddr( (char *) &peername.sin_addr,
+                                   sizeof(peername.sin_addr), AF_INET );
+               syslog( LOG_INFO, "connection from %s (%s)",
+                       (hp == NULL) ? "unknown" : hp->h_name,
+                       inet_ntoa( peername.sin_addr ) );
        }
 
        do_query();
@@ -146,7 +152,8 @@ char        **argv;
        return( 0 );
 }
 
-static do_query()
+static void
+do_query( void )
 {
        char            buf[256];
        int             len, rc, tblsize;
@@ -154,27 +161,33 @@ static do_query()
        fd_set          readfds;
        LDAP            *ld;
 
-       if ( (ld = ldap_open( ldaphost, ldapport )) == NULL ) {
+       if ( (ld = ldap_init( ldaphost, ldapport )) == NULL ) {
                fprintf( stderr, FINGER_UNAVAILABLE );
-               perror( "ldap_open" );
-               exit( 1 );
+               perror( "ldap_init" );
+               exit( EXIT_FAILURE );
        }
-       ld->ld_sizelimit = FINGER_SIZELIMIT;
-       ld->ld_deref = deref;
 
-       if ( ldap_simple_bind_s( ld, FINGER_BINDDN, FINGER_BIND_CRED )
+       {
+               int limit = FINGER_SIZELIMIT;
+               ldap_set_option(ld, LDAP_OPT_SIZELIMIT, &limit);
+       }
+       ldap_set_option(ld, LDAP_OPT_DEREF, &deref);
+
+       if ( ldap_simple_bind_s( ld, NULL, NULL )
                != LDAP_SUCCESS )
        {
                fprintf( stderr, FINGER_UNAVAILABLE );
                ldap_perror( ld, "ldap_simple_bind_s" );
-               exit( 1 );
+               exit( EXIT_FAILURE );
        }
 
-#ifdef USE_SYSCONF
+#ifdef HAVE_SYSCONF
        tblsize = sysconf( _SC_OPEN_MAX );
-#else /* USE_SYSCONF */
+#elif HAVE_GETDTABLESIZE
        tblsize = getdtablesize();
-#endif /* USE_SYSCONF */
+#else
+       tblsize = FD_SETSIZE;
+#endif
 
 #ifdef FD_SETSIZE
        if (tblsize > FD_SETSIZE) {
@@ -192,11 +205,11 @@ static do_query()
                        perror( "select" );
                else
                        fprintf( stderr, "connection timed out on input\r\n" );
-               exit( 1 );
+               exit( EXIT_FAILURE );
        }
 
        if ( fgets( buf, sizeof(buf), stdin ) == NULL )
-               exit( 1 );
+               exit( EXIT_FAILURE );
 
        len = strlen( buf );
 
@@ -224,7 +237,7 @@ static do_query()
                        p = buf;
                }
 
-               for ( ; *p && isspace( *p ); p++ )
+               for ( ; *p && isspace( (unsigned char) *p ); p++ )
                        ;       /* NULL */
 
                do_search( ld, p );
@@ -232,8 +245,7 @@ static do_query()
 }
 
 static void
-spaces2dots( s )
-    char       *s;
+spaces2dots( char *s )
 {
        for ( ; *s; s++ ) {
                if ( *s == ' ' ) {
@@ -242,52 +254,32 @@ spaces2dots( s )
        }
 }
 
-static do_search( ld, buf )
-LDAP   *ld;
-char   *buf;
+static void
+do_search( LDAP *ld, char *buf )
 {
        char            *dn, *rdn;
        char            **title;
-       int             rc, matches, i, ufn;
+       int             rc = 0, matches = 0, i;
        struct timeval  tv;
-       LDAPFiltInfo    *fi;
+       LDAPFiltDesc    *fd;
+       LDAPFiltInfo    *fi = NULL;
        LDAPMessage     *result, *e;
        static char     *attrs[] = { "cn", "title", "objectClass", "joinable",
 #ifdef FINGER_SORT_ATTR
                                        FINGER_SORT_ATTR,
 #endif
                                        0 };
-       extern int      strcasecmp();
-
-       ufn = 0;
-#ifdef FINGER_UFN
-       if ( strchr( buf, ',' ) != NULL ) {
-               ldap_ufn_setprefix( ld, base );
-               tv.tv_sec = FINGER_TIMEOUT;
-               tv.tv_usec = 0;
-               ldap_ufn_timeout( (void *) &tv );
-
-               if ( (rc = ldap_ufn_search_s( ld, buf, attrs, 0, &result ))
-                   != LDAP_SUCCESS && rc != LDAP_SIZELIMIT_EXCEEDED ) {
-                       fprintf( stderr, FINGER_UNAVAILABLE );
-                       ldap_perror( ld, "ldap_search_st" );
-                       exit( 1 );
-               }
 
-               matches = ldap_count_entries( ld, result );
-               ufn = 1;
-       } else {
-#endif
-               if ( (ld->ld_filtd = ldap_init_getfilter( filterfile ))
+               if ( (fd = ldap_init_getfilter( filterfile ))
                    == NULL ) {
                        fprintf( stderr, "Cannot open filter file (%s)\n",
                            filterfile );
-                       exit( 1 );
+                       exit( EXIT_FAILURE );
                }
 
-               for ( fi = ldap_getfirstfilter( ld->ld_filtd, "finger", buf );
+               for ( fi = ldap_getfirstfilter( fd, "finger", buf );
                    fi != NULL;
-                   fi = ldap_getnextfilter( ld->ld_filtd ) )
+                   fi = ldap_getnextfilter( fd ) )
                {
                        tv.tv_sec = FINGER_TIMEOUT;
                        tv.tv_usec = 0;
@@ -298,7 +290,7 @@ char        *buf;
                        {
                                fprintf( stderr, FINGER_UNAVAILABLE );
                                ldap_perror( ld, "ldap_search_st" );
-                               exit( 1 );
+                               exit( EXIT_FAILURE );
                        }
 
                        if ( (matches = ldap_count_entries( ld, result )) != 0 )
@@ -307,9 +299,6 @@ char        *buf;
                        ldap_msgfree( result );
                        result = NULL;
                }
-#ifdef FINGER_UFN
-       }
-#endif
 
        if ( rc == LDAP_SIZELIMIT_EXCEEDED ) {
                printf( "(Partial results - a size limit was exceeded)\r\n" );
@@ -322,10 +311,10 @@ char      *buf;
                fflush( stdout );
        } else if ( matches < 0 ) {
                fprintf( stderr, "error return from ldap_count_entries\r\n" );
-               exit( 1 );
+               exit( EXIT_FAILURE );
        } else if ( matches <= FINGER_LISTLIMIT ) {
                printf( "%d %s match%s found for \"%s\":\r\n", matches,
-                   ufn ? "UFN" : fi->lfi_desc, matches > 1 ? "es" : "", buf );
+                   fi->lfi_desc, matches > 1 ? "es" : "", buf );
                fflush( stdout );
 
                for ( e = ldap_first_entry( ld, result ); e != NULL; ) {
@@ -337,7 +326,7 @@ char        *buf;
                }
        } else {
                printf( "%d %s matches for \"%s\":\r\n", matches,
-                   ufn ? "UFN" : fi->lfi_desc, buf );
+                   fi->lfi_desc, buf );
                fflush( stdout );
 
 #ifdef FINGER_SORT_ATTR
@@ -369,7 +358,7 @@ char        *buf;
                                cn = ldap_get_values( ld, e, "cn" );
                                for ( i = 0; cn[i] != NULL; i++ ) {
                                        last = strlen( cn[i] ) - 1;
-                                       if ( isdigit( cn[i][last] ) ) {
+                                       if (isdigit((unsigned char) cn[i][last])) {
                                                rdn = strdup( cn[i] );
                                                break;
                                        }
@@ -403,15 +392,14 @@ char      *buf;
 
 
 static int
-entry2textwrite( void *fp, char *buf, int len )
+entry2textwrite( void *fp, char *buf, ber_len_t len )
 {
        return( fwrite( buf, len, 1, (FILE *)fp ) == 0 ? -1 : len );
 }
 
 
-static do_read( ld, e )
-LDAP           *ld;
-LDAPMessage    *e;
+static void
+do_read( LDAP *ld, LDAPMessage *e )
 {
        static struct ldap_disptmpl *tmpllist;
        static char     *defattrs[] = { "mail", NULL };
@@ -424,7 +412,7 @@ LDAPMessage *e;
            defvals, entry2textwrite, (void *)stdout, "\r\n", rdncount,
            LDAP_DISP_OPT_DOSEARCHACTIONS ) != LDAP_SUCCESS ) {
                ldap_perror( ld, "ldap_entry2text_search" );
-               exit( 1 );
+               exit( EXIT_FAILURE );
        }
 
        if ( tmpllist != NULL ) {