]> git.sur5r.net Git - openldap/blobdiff - clients/mail500/main.c
Update copyright notices
[openldap] / clients / mail500 / main.c
index ef0e90006a1b17a8ba51c75c06201db7873e2387..cbe5bb80372f1ce7343e6af71f9ef0deae4b17b7 100644 (file)
@@ -1,3 +1,4 @@
+/* $OpenLDAP$ */
 /*
  * Copyright (c) 1990 Regents of the University of Michigan.
  * All rights reserved.
@@ -8,31 +9,37 @@
  * may not be used to endorse or promote products derived from this
  * software without specific prior written permission. This software
  * is provided ``as is'' without express or implied warranty.
+ *
+ * Copyright 1998-2000 The OpenLDAP Foundation
+ * COPYING RESTRICTIONS APPLY.  See COPYRIGHT File in top level directory
+ * of this package for details.
  */
 
 #include "portable.h"
 
 #include <stdio.h>
-#include <stdlib.h>
-#include <ctype.h>
 
+#include <ac/stdlib.h>
+
+#include <ac/ctype.h>
+#include <ac/param.h>
+#include <ac/signal.h>
 #include <ac/string.h>
+#include <ac/sysexits.h>
 #include <ac/syslog.h>
 #include <ac/time.h>
+#include <ac/unistd.h>
 #include <ac/wait.h>
 
-#ifdef HAVE_SYS_PARAM_H
-#include <sys/param.h>
-#endif
+#include <sys/stat.h>
 
+#ifdef HAVE_SYS_RESOURCE_H
 #include <sys/resource.h>
+#endif
 
-#include <sysexits.h>
-
-#include "lber.h"
-#include "ldap.h"
+#include <ldap.h>
 
-#include "ldapconfig.h"
+#include "ldap_defaults.h"
 
 #ifndef MAIL500_BOUNCEFROM
 #define MAIL500_BOUNCEFROM "<>"
@@ -76,7 +83,7 @@ typedef struct errs {
 #define        E_NOOWNER               11
 #define E_GROUPUNKNOWN         12
        char            *e_addr;
-       union {
+       union e_union_u {
                char            *e_u_loop;
                LDAPMessage     *e_u_msg;
        } e_union;
@@ -100,20 +107,20 @@ typedef struct baseinfo {
                                /* (up to three of them) */
 } Base;
 
-Base   base[] = 
-       { "ou=People, o=University of Michigan, c=US",
+Base   base[] = {
+       {"ou=People, dc=example, dc=com",
                0, USER,
-               "uid=%s", "cn=%s", NULL,
-         "ou=System Groups, ou=Groups, o=University of Michigan, c=US",
+               {"uid=%s", "cn=%s", NULL}},
+       {"ou=System Groups, ou=Groups, dc=example, dc=com",
                1, 0xff,
-               "(&(cn=%s)(associatedDomain=%h))", NULL, NULL,
-         "ou=User Groups, ou=Groups, o=University of Michigan, c=US",
+               {"(&(cn=%s)(associatedDomain=%h))", NULL, NULL}},
+       {"ou=User Groups, ou=Groups, dc=example, dc=com",
                1, 0xff,
-               "(&(cn=%s)(associatedDomain=%h))", NULL, NULL,
-         NULL
-       };
+               {"(&(cn=%s)(associatedDomain=%h))", NULL, NULL}},
+       {NULL}
+};
 
-char   *sendmailargs[] = { MAIL500_SENDMAIL, "-oMrX.500", "-odi", "-oi", "-f", NULL, NULL };
+char   *sendmailargs[] = { MAIL500_SENDMAIL, "-oMrLDAP", "-odi", "-oi", "-f", NULL, NULL };
 
 static char    *attrs[] = { "objectClass", "title", "postaladdress",
                        "telephoneNumber", "mail", "description", "owner",
@@ -122,27 +129,32 @@ static char       *attrs[] = { "objectClass", "title", "postaladdress",
                        "moderator", "onVacation", "uid",
                        "suppressNoEmailError", NULL };
 
-static do_address();
-static do_group();
-static do_group_members();
-static send_message();
-static send_errors();
-static do_noemail();
-static do_ambiguous();
-static add_to();
-static isgroup();
-static add_error();
-static add_group();
-static unbind_and_exit();
-static group_loop();
-static send_group();
-static has_attributes();
-static char **get_attributes_mail_dn();
-static char *canonical();
-
-main (argc, argv)
-int    argc;
-char   **argv;
+static void do_address( char *name, char ***to, int *nto, Group **togroups, int *ngroups, Error **err, int *nerr, int type );
+static int  do_group( LDAPMessage *e, char *dn, char ***to, int *nto, Group **togroups, int *ngroups, Error **err, int *nerr );
+static void do_group_members( LDAPMessage *e, char *dn, char ***to, int *nto, Group **togroups, int *ngroups, Error **err, int *nerr );
+static void send_message( char **to );
+static void send_errors( Error *err, int nerr );
+static void do_noemail( FILE *fp, Error *err, int namelen );
+static void do_ambiguous( FILE *fp, Error *err, int namelen );
+static void add_to( char ***list, int *nlist, char **new );
+static int  isgroup( LDAPMessage *e );
+static void add_error( Error **err, int *nerr, int code, char *addr, LDAPMessage *msg );
+static void add_group( char *dn, Group **list, int *nlist );
+static void unbind_and_exit( int rc );
+static int  group_loop( char *dn );
+static void send_group( Group *group, int ngroup );
+static int  has_attributes( LDAPMessage *e, char *attr1, char *attr2 );
+static char **get_attributes_mail_dn( LDAPMessage *e, char *attr1, char *attr2 );
+static char *canonical( char *s );
+static int  connect_to_x500( void );
+
+static void do_group_errors( LDAPMessage *e, char *dn, char ***to, int *nto, Error **err, int *nerr );
+static void do_group_request( LDAPMessage *e, char *dn, char ***to, int *nto, Error **err, int *nerr );
+static void do_group_owner( LDAPMessage *e, char *dn, char ***to, int *nto, Error **err, int *nerr );
+static void add_member( char *gdn, char *dn, char ***to, int *nto, Group **togroups, int *ngroups, Error **err, int *nerr, char **suppress );
+
+int
+main ( int argc, char **argv )
 {
        char            *myname;
        char            **tolist;
@@ -150,18 +162,19 @@ char      **argv;
        Group           *togroups;
        int             numto, ngroups, numerr, nargs;
        int             i, j;
-       FILE            *fp;
-       extern int      optind, errno;
-       extern char     *optarg;
 
-       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
+
 #ifdef LOG_MAIL
        openlog( myname, OPENLOG_OPTIONS, LOG_MAIL );
-#else
+#elif LOG_DEBUG
        openlog( myname, OPENLOG_OPTIONS );
 #endif
 
@@ -286,7 +299,7 @@ char        **argv;
         */
 
        if ( numerr > 0 && numto > nargs || ngroups > 0 ) {
-               int     fd;
+               FILE    *fp;
                char    buf[BUFSIZ];
 
                umask( 077 );
@@ -343,12 +356,13 @@ char      **argv;
        return( EX_OK );
 }
 
-connect_to_x500()
+static int
+connect_to_x500( void )
 {
        int opt;
 
-       if ( (ld = ldap_open( ldaphost, LDAP_PORT )) == NULL ) {
-               syslog( LOG_ALERT, "ldap_open failed" );
+       if ( (ld = ldap_init( ldaphost, 0 )) == NULL ) {
+               syslog( LOG_ALERT, "ldap_init failed" );
                return( -1 );
        }
 
@@ -365,10 +379,8 @@ connect_to_x500()
        return( 0 );
 }
 
-static
-mailcmp( a, b )
-    char       *a;
-    char       *b;
+static int
+mailcmp( char *a, char *b )
 {
        int     i;
 
@@ -391,16 +403,17 @@ mailcmp( a, b )
        return( 0 );
 }
 
-static
-do_address( name, to, nto, togroups, ngroups, err, nerr, type )
-    char       *name;
-    char       ***to;
-    int                *nto;
-    Group      **togroups;
-    int                *ngroups;
-    Error      **err;
-    int                *nerr;
-    int                type;
+static void
+do_address(
+       char    *name,
+       char    ***to,
+       int     *nto,
+       Group   **togroups,
+       int     *ngroups,
+       Error   **err,
+       int     *nerr,
+       int     type
+)
 {
        int             rc, b, f, match;
        LDAPMessage     *e, *res;
@@ -503,9 +516,9 @@ do_address( name, to, nto, togroups, ngroups, err, nerr, type )
        /* no matches - bounce with user unknown */
        if ( match == 0 ) {
                if ( type == USER ) {
-                       add_error( err, nerr, E_USERUNKNOWN, name, NULLMSG );
+                       add_error( err, nerr, E_USERUNKNOWN, name, NULL );
                } else {
-                       add_error( err, nerr, E_GROUPUNKNOWN, name, NULLMSG );
+                       add_error( err, nerr, E_GROUPUNKNOWN, name, NULL );
                }
                return;
        }
@@ -692,20 +705,19 @@ do_address( name, to, nto, togroups, ngroups, err, nerr, type )
                ldap_value_free( uid );
        }
        free( dn );
-
-       return;
 }
 
-static
-do_group( e, dn, to, nto, togroups, ngroups, err, nerr )
-    LDAPMessage        *e;
-    char       *dn;
-    char       ***to;
-    int                *nto;
-    Group      **togroups;
-    int                *ngroups;
-    Error      **err;
-    int                *nerr;
+static int
+do_group(
+       LDAPMessage *e,
+       char    *dn,
+       char    ***to,
+       int     *nto,
+       Group   **togroups,
+       int     *ngroups,
+       Error   **err,
+       int     *nerr
+)
 {
        int     i;
        char    **moderator;
@@ -763,16 +775,17 @@ do_group( e, dn, to, nto, togroups, ngroups, err, nerr )
 }
 
 /* ARGSUSED */
-static
-do_group_members( e, dn, to, nto, togroups, ngroups, err, nerr )
-    LDAPMessage        *e;
-    char       *dn;
-    char       ***to;
-    int                *nto;
-    Group      **togroups;
-    int                *ngroups;
-    Error      **err;
-    int                *nerr;
+static void
+do_group_members(
+       LDAPMessage *e,
+       char    *dn,
+       char    ***to,
+       int     *nto,
+       Group   **togroups,
+       int     *ngroups,
+       Error   **err,
+       int     *nerr
+)
 {
        int             i, rc, anymembers;
        char            *ndn;
@@ -825,7 +838,7 @@ do_group_members( e, dn, to, nto, togroups, ngroups, err, nerr )
                if ( strcasecmp( joinable[0], "FALSE" ) == 0 ) {
                        if ( ! anymembers ) {
                                add_error( err, nerr, E_NOMEMBERS, dn,
-                                   NULLMSG );
+                                   NULL );
                        }
 
                        ldap_value_free( joinable );
@@ -892,7 +905,7 @@ do_group_members( e, dn, to, nto, togroups, ngroups, err, nerr )
                                        ndn = ldap_get_dn( ld, ee );
 
                                        add_error( err, nerr,
-                                           E_JOINMEMBERNOEMAIL, ndn, NULLMSG );
+                                           E_JOINMEMBERNOEMAIL, ndn, NULL );
 
                                        free( ndn );
                                }
@@ -905,26 +918,26 @@ do_group_members( e, dn, to, nto, togroups, ngroups, err, nerr )
        }
 
        if ( ! anymembers ) {
-               add_error( err, nerr, E_NOMEMBERS, dn, NULLMSG );
+               add_error( err, nerr, E_NOMEMBERS, dn, NULL );
        }
-
-       return;
 }
 
-add_member( gdn, dn, to, nto, togroups, ngroups, err, nerr, suppress )
-    char       *gdn;
-    char       *dn;
-    char       ***to;
-    int                *nto;
-    Group      **togroups;
-    int                *ngroups;
-    Error      **err;
-    int                *nerr;
-    char       **suppress;
+static void
+add_member(
+       char    *gdn,
+       char    *dn,
+       char    ***to,
+       int     *nto,
+       Group   **togroups,
+       int     *ngroups,
+       Error   **err,
+       int     *nerr,
+       char    **suppress
+)
 {
        char            *ndn;
        char            **mail;
-       int             i, rc;
+       int             rc;
        LDAPMessage     *res, *e;
        struct timeval  timeout;
 
@@ -933,7 +946,7 @@ add_member( gdn, dn, to, nto, togroups, ngroups, err, nerr, suppress )
        if ( (rc = ldap_search_st( ld, dn, LDAP_SCOPE_BASE, "(objectclass=*)",
            attrs, 0, &timeout, &res )) != LDAP_SUCCESS ) {
                if ( rc == LDAP_NO_SUCH_OBJECT ) {
-                       add_error( err, nerr, E_BADMEMBER, dn, NULLMSG );
+                       add_error( err, nerr, E_BADMEMBER, dn, NULL );
 
                        return;
                } else {
@@ -972,22 +985,22 @@ add_member( gdn, dn, to, nto, togroups, ngroups, err, nerr, suppress )
        } else {
                if ( suppress == NULL || strcasecmp( suppress[0], "FALSE" )
                    == 0 ) {
-                       add_error( err, nerr, E_MEMBERNOEMAIL, ndn, NULLMSG );
+                       add_error( err, nerr, E_MEMBERNOEMAIL, ndn, NULL );
                }
        }
 
        free( ndn );
-
-       return;
 }
 
-do_group_request( e, dn, to, nto, err, nerr )
-    LDAPMessage        *e;
-    char       *dn;
-    char       ***to;
-    int                *nto;
-    Error      **err;
-    int                *nerr;
+static void
+do_group_request(
+       LDAPMessage *e,
+       char    *dn,
+       char    ***to,
+       int     *nto,
+       Error   **err,
+       int     *nerr
+)
 {
        char            **requeststo;
 
@@ -997,19 +1010,19 @@ do_group_request( e, dn, to, nto, err, nerr )
 
                ldap_value_free( requeststo );
        } else {
-               add_error( err, nerr, E_NOREQUEST, dn, NULLMSG );
+               add_error( err, nerr, E_NOREQUEST, dn, NULL );
        }
-
-       return;
 }
 
-do_group_errors( e, dn, to, nto, err, nerr )
-    LDAPMessage        *e;
-    char       *dn;
-    char       ***to;
-    int                *nto;
-    Error      **err;
-    int                *nerr;
+static void
+do_group_errors(
+       LDAPMessage *e,
+       char    *dn,
+       char    ***to,
+       int     *nto,
+       Error   **err,
+       int     *nerr
+)
 {
        char            **errorsto;
 
@@ -1019,19 +1032,19 @@ do_group_errors( e, dn, to, nto, err, nerr )
 
                ldap_value_free( errorsto );
        } else {
-               add_error( err, nerr, E_NOERRORS, dn, NULLMSG );
+               add_error( err, nerr, E_NOERRORS, dn, NULL );
        }
-
-       return;
 }
 
-do_group_owner( e, dn, to, nto, err, nerr )
-    LDAPMessage        *e;
-    char       *dn;
-    char       ***to;
-    int                *nto;
-    Error      **err;
-    int                *nerr;
+static void
+do_group_owner(
+       LDAPMessage *e,
+       char    *dn,
+       char    ***to,
+       int     *nto,
+       Error   **err,
+       int     *nerr
+)
 {
        char            **owner;
 
@@ -1039,14 +1052,12 @@ do_group_owner( e, dn, to, nto, err, nerr )
                add_to( to, nto, owner );
                ldap_value_free( owner );
        } else {
-               add_error( err, nerr, E_NOOWNER, dn, NULLMSG );
+               add_error( err, nerr, E_NOOWNER, dn, NULL );
        }
-       return;
 }
 
-static
-send_message( to )
-    char       **to;
+static void
+send_message( char **to )
 {
        int     pid;
 #ifndef HAVE_WAITPID
@@ -1067,7 +1078,7 @@ send_message( to )
        }
 
        /* parent */
-       if ( pid = fork() ) {
+       if ( (pid = fork()) != 0 ) {
 #ifdef HAVE_WAITPID
                waitpid( pid, (int *) NULL, 0 );
 #else
@@ -1084,10 +1095,8 @@ send_message( to )
        }
 }
 
-static
-send_group( group, ngroup )
-    Group      *group;
-    int                ngroup;
+static void
+send_group( Group *group, int ngroup )
 {
        int     i, pid;
        char    **argv;
@@ -1127,7 +1136,7 @@ send_group( group, ngroup )
                }
 
                /* parent */
-               if ( pid = fork() ) {
+               if ( (pid = fork()) != 0 ) {
 #ifdef HAVE_WAITPID
                        waitpid( pid, (int *) NULL, 0 );
 #else
@@ -1142,14 +1151,10 @@ send_group( group, ngroup )
                        exit( EX_TEMPFAIL );
                }
        }
-
-       return;
 }
 
-static
-send_errors( err, nerr )
-    Error      *err;
-    int                nerr;
+static void
+send_errors( Error *err, int nerr )
 {
        int     pid, i, namelen;
        FILE    *fp;
@@ -1190,7 +1195,7 @@ send_errors( err, nerr )
                exit( EX_TEMPFAIL );
        }
 
-       if ( pid = fork() ) {
+       if ( (pid = fork()) != 0 ) {
                if ( (fp = fdopen( fd[1], "w" )) == NULL ) {
                        syslog( LOG_ALERT, "cannot fdopen pipe" );
                        exit( EX_TEMPFAIL );
@@ -1293,15 +1298,10 @@ send_errors( err, nerr )
 
                exit( EX_TEMPFAIL );
        }
-
-       return;
 }
 
-static
-do_noemail( fp, err, namelen )
-    FILE       *fp;
-    Error      *err;
-    int                namelen;
+static void
+do_noemail( FILE *fp, Error *err, int namelen )
 {
        int             i, last;
        char            *dn, *rdn;
@@ -1321,7 +1321,7 @@ do_noemail( fp, err, namelen )
                    != NULL ) {
                        for ( i = 0; vals[i]; i++ ) {
                                last = strlen( vals[i] ) - 1;
-                               if ( isdigit( vals[i][last] ) ) {
+                               if ( isdigit((unsigned char) vals[i][last]) ) {
                                        rdn = strdup( vals[i] );
                                        break;
                                }
@@ -1359,7 +1359,7 @@ do_noemail( fp, err, namelen )
                for ( i = 0; vals[0][i] != '\0'; i++ ) {
                        if ( vals[0][i] == '$' ) {
                                fprintf( fp, "\n%*s  ", namelen, " " );
-                               while ( isspace( vals[0][i+1] ) )
+                               while ( isspace((unsigned char) vals[0][i+1]) )
                                        i++;
                        } else {
                                fprintf( fp, "%c", vals[0][i] );
@@ -1385,11 +1385,8 @@ do_noemail( fp, err, namelen )
 }
 
 /* ARGSUSED */
-static
-do_ambiguous( fp, err, namelen )
-    FILE       *fp;
-    Error      *err;
-    int                namelen;
+static void
+do_ambiguous( FILE *fp, Error *err, int namelen )
 {
        int             i, last;
        char            *dn, *rdn;
@@ -1411,7 +1408,7 @@ do_ambiguous( fp, err, namelen )
                        if ( (vals = ldap_get_values( ld, e, "cn" )) != NULL ) {
                                for ( i = 0; vals[i]; i++ ) {
                                        last = strlen( vals[i] ) - 1;
-                                       if ( isdigit( vals[i][last] ) ) {
+                                       if (isdigit((unsigned char) vals[i][last])) {
                                                rdn = strdup( vals[i] );
                                                break;
                                        }
@@ -1440,9 +1437,8 @@ do_ambiguous( fp, err, namelen )
        }
 }
 
-static
-count_values( list )
-    char       **list;
+static int
+count_values( char **list )
 {
        int     i;
 
@@ -1452,11 +1448,8 @@ count_values( list )
        return( i );
 }
 
-static
-add_to( list, nlist, new )
-    char       ***list;
-    int                *nlist;
-    char       **new;
+static void
+add_to( char ***list, int *nlist, char **new )
 {
        int     i, nnew, oldnlist;
 
@@ -1475,13 +1468,10 @@ add_to( list, nlist, new )
        for ( i = 0; i < nnew; i++ )
                (*list)[i + oldnlist] = strdup( new[i] );
        (*list)[*nlist] = NULL;
-
-       return;
 }
 
-static
-isgroup( e )
-    LDAPMessage        *e;
+static int
+isgroup( LDAPMessage *e )
 {
        int     i;
        char    **oclist;
@@ -1499,13 +1489,8 @@ isgroup( e )
        return( 0 );
 }
 
-static
-add_error( err, nerr, code, addr, msg )
-    Error      **err;
-    int                *nerr;
-    int                code;
-    char       *addr;
-    LDAPMessage        *msg;
+static void
+add_error( Error **err, int *nerr, int code, char *addr, LDAPMessage *msg )
 {
        if ( *nerr == 0 ) {
                *err = (Error *) malloc( sizeof(Error) );
@@ -1517,15 +1502,10 @@ add_error( err, nerr, code, addr, msg )
        (*err)[*nerr].e_addr = strdup( addr );
        (*err)[*nerr].e_msg = msg;
        (*nerr)++;
-
-       return;
 }
 
-static
-add_group( dn, list, nlist )
-    char       *dn;
-    Group      **list;
-    int                *nlist;
+static void
+add_group( char *dn, Group **list, int *nlist )
 {
        int     i, namelen;
        char    **ufn;
@@ -1568,13 +1548,10 @@ add_group( dn, list, nlist )
        (*nlist)++;
 
        ldap_value_free( ufn );
-
-       return;
 }
 
-static
-unbind_and_exit( rc )
-    int        rc;
+static void
+unbind_and_exit( int rc )
 {
        int     i;
 
@@ -1585,8 +1562,7 @@ unbind_and_exit( rc )
 }
 
 static char *
-canonical( s )
-    char       *s;
+canonical( char *s )
 {
        char    *saves = s;
 
@@ -1598,9 +1574,8 @@ canonical( s )
        return( saves );
 }
 
-static
-group_loop( dn )
-    char       *dn;
+static int
+group_loop( char *dn )
 {
        int             i;
        static char     **groups;
@@ -1622,11 +1597,8 @@ group_loop( dn )
        return( 0 );
 }
 
-static
-has_attributes( e, attr1, attr2 )
-    LDAPMessage        *e;
-    char       *attr1;
-    char       *attr2;
+static int
+has_attributes( LDAPMessage *e, char *attr1, char *attr2 )
 {
        char    **attr;
 
@@ -1644,13 +1616,14 @@ has_attributes( e, attr1, attr2 )
 }
 
 static char **
-get_attributes_mail_dn( e, attr1, attr2 )
-    LDAPMessage        *e;
-    char       *attr1;
-    char       *attr2;         /* this one is dn-valued */
+get_attributes_mail_dn(
+    LDAPMessage *e,
+    char *attr1,
+    char *attr2                        /* this one is dn-valued */
+)
 {
        LDAPMessage     *ee, *res;
-       char            **vals, **dnlist, **mail, **grname, **graddr;
+       char            **vals, **dnlist, **mail, **grname;
         char            *dn;
        int             nto = 0, i, rc;
        struct timeval  timeout;