+/* $OpenLDAP$ */
/*
* main.c: for rcpt500 (X.500 email query responder)
*
#include "portable.h"
#include <stdio.h>
-#include <stdlib.h>
-#include <ctype.h>
-#include <ac/syslog.h>
-#include <ac/string.h>
+#include <ac/stdlib.h>
+#include <ac/ctype.h>
+#include <ac/signal.h>
+#include <ac/string.h>
+#include <ac/syslog.h>
+#include <ac/unistd.h>
-#include "ldapconfig.h"
+#include "ldap_defaults.h"
#include "rcpt500.h"
int dosyslog = 0;
int sizelimit = RCPT500_SIZELIMIT;
int rdncount = RCPT500_RDNCOUNT;
int ldapport = 0;
-char *ldaphost = LDAPHOST;
-char *searchbase = RCPT500_BASE;
-char *dapuser = RCPT500_BINDDN;
+char *ldaphost = NULL;
+char *searchbase = NULL;
+char *dapuser = NULL;
char *filterfile = FILTERFILE;
char *templatefile = TEMPLATEFILE;
-char reply[ MAXSIZE * RCPT500_LISTLIMIT ];
-
+static char reply[ MAXSIZE * RCPT500_LISTLIMIT ];
/*
* functions
*/
-int read_msg();
-char *read_hdr();
-int send_reply();
+static int read_msg(FILE *fp, struct msginfo *msgp);
+static char *read_hdr(FILE *fp, int off, char *buf, int MAXSIZEe, char **ln_p);
+static int send_reply(struct msginfo *msgp, char *body);
+static int find_command(char *text, char **argp);
/*
* main is invoked by sendmail via the alias file
* the entire incoming message gets piped to our standard input
*/
-main( argc, argv )
- int argc;
- char **argv;
+int
+main( int argc, char **argv )
{
char *prog, *usage = "%s [-l] [-U] [-h ldaphost] [-p ldapport] [-b searchbase] [-a] [-z sizelimit] [-u dapuser] [-f filterfile] [-t templatefile] [-c rdncount]\n";
struct msginfo msg;
int c, errflg;
- char *replytext;
-
- extern int optind;
- extern char *optarg;
*reply = '\0';
}
if ( errflg || optind < argc ) {
fprintf( stderr, usage, prog );
- exit( 1 );
+ exit( EXIT_FAILURE );
}
+#ifdef SIGPIPE
+ (void) SIGNAL( SIGPIPE, SIG_IGN );
+#endif
+
if ( dosyslog ) {
/*
* if syslogging requested, initialize
*/
#ifdef LOG_DAEMON
openlog( prog, OPENLOG_OPTIONS, LOG_DAEMON );
-#else
+#elif LOG_DEBUG
openlog( prog, OPENLOG_OPTIONS );
#endif
}
if ( dosyslog ) {
syslog( LOG_INFO, "processing command \"%s %s\" from %s",
( msg.msg_command < 0 ) ? "Unknown" :
- cmds[ msg.msg_command ].cmd_text,
+ rcpt_cmds[ msg.msg_command ].cmd_text,
( msg.msg_arg == NULL ) ? "" : msg.msg_arg, msg.msg_replyto );
}
/*
sprintf( reply, "Your request was interpreted as: %s %s\n\n",
- cmds[ msg.msg_command ].cmd_text, msg.msg_arg );
+ rcpt_cmds[ msg.msg_command ].cmd_text, msg.msg_arg );
*/
- (*cmds[ msg.msg_command ].cmd_handler)( &msg, reply );
+ (*rcpt_cmds[ msg.msg_command ].cmd_handler)( &msg, reply );
if ( send_reply( &msg, reply ) < 0 ) {
if ( dosyslog ) {
}
-int
-read_msg( fp, msgp )
- FILE *fp;
- struct msginfo *msgp;
+static int
+read_msg( FILE *fp, struct msginfo *msgp )
{
char buf[ MAXSIZE ], *line;
int command = -1;
}
-char *
-read_hdr( fp, offset, buf, MAXSIZEe, linep )
- FILE *fp;
- int offset;
- char *buf;
- int MAXSIZEe;
- char **linep;
+static char *
+read_hdr( FILE *fp, int offset, char *buf, int MAXSIZEe, char **linep )
{
char *hdr;
- for ( hdr = buf + offset; isspace( *hdr ); ++hdr ) {
+ for ( hdr = buf + offset; isspace( (unsigned char) *hdr ); ++hdr ) {
;
}
if (( hdr = strdup( hdr )) == NULL ) {
if ( dosyslog ) {
syslog( LOG_ERR, "strdup: %m" );
}
- exit( 1 );
+ exit( EXIT_FAILURE );
}
while ( 1 ) {
*linep = fgets( buf, MAXSIZE, fp );
buf[ strlen( buf ) - 1 ] = '\0'; /* remove trailing newline */
- if ( *linep == NULL || !isspace( **linep )) {
+ if ( *linep == NULL || !isspace( (unsigned char) **linep )) {
break;
}
if (( hdr = realloc( hdr, strlen( hdr ) +
if ( dosyslog ) {
syslog( LOG_ERR, "realloc: %m" );
}
- exit( 1 );
+ exit( EXIT_FAILURE );
}
strcat( hdr, "\n" );
strcat( hdr, *linep );
}
-int
-send_reply( msgp, body )
- struct msginfo *msgp;
- char *body;
+static int
+send_reply( struct msginfo *msgp, char *body )
{
char buf[ MAXSIZE ];
FILE *cmdpipe;
}
-int
-find_command( text, argp )
- char *text;
- char **argp;
+static int
+find_command( char *text, char **argp )
{
int i;
char *s, *p;
p = text;
for ( s = argbuf; *p != '\0'; ++p ) {
- *s++ = tolower( *p );
+ *s++ = TOLOWER( (unsigned char) *p );
}
*s = '\0';
- for ( i = 0; cmds[ i ].cmd_text != NULL; ++i ) {
- if (( s = strstr( argbuf, cmds[ i ].cmd_text )) != NULL
- && isspace( *(s + strlen( cmds[ i ].cmd_text )))) {
- strcpy( argbuf, text + (s - argbuf) + strlen( cmds[ i ].cmd_text ));
+ for ( i = 0; rcpt_cmds[ i ].cmd_text != NULL; ++i ) {
+ if (( s = strstr( argbuf, rcpt_cmds[ i ].cmd_text )) != NULL
+ && isspace( (unsigned char) s[ strlen( rcpt_cmds[ i ].cmd_text ) ] )) {
+ strcpy( argbuf, text + (s - argbuf) + strlen( rcpt_cmds[ i ].cmd_text ));
*argp = argbuf;
- while ( isspace( **argp )) {
+ while ( isspace( (unsigned char) **argp )) {
++(*argp);
}
return( i );