From 583741ac138fa6983ae8b201b3c51bad9ef2ef05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Fonseca?= Date: Tue, 15 Feb 2005 19:22:50 +0000 Subject: Allow to set helo-name. Allow to send out local mail as remote mail by adding a qualifying domain name. Allow forcing envelope-from and Sender headers. Drop possible admin-added sgid priveleges to be dropped after reading the config. (Bernhard Link) --- main.c | 42 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 37 insertions(+), 5 deletions(-) (limited to 'main.c') diff --git a/main.c b/main.c index d1f47e6..7b9ebc1 100644 --- a/main.c +++ b/main.c @@ -8,6 +8,9 @@ #include #include +#include +#include +#include #include #ifdef HAVE_GETOPT_H #include @@ -20,6 +23,21 @@ #include "rcfile.h" +static void drop_sgids( void ) +{ + gid_t real_gid, effective_gid; + + real_gid = getgid(); + effective_gid = getegid(); + + if( setregid(real_gid,real_gid) != 0 ) + { + fprintf (stderr, "Could not drop setgid: %m!\n"); + exit(EX_DROPPERM); + } +} + + /** Modes of operation. */ typedef enum { ENQUEUE, /**< delivery mode */ @@ -33,16 +51,28 @@ int verbose = 0; FILE *log_fp = NULL; - static void message_send(message_t *message) { int local, remote; + identity_t *identity; + + /* Lookup the identity already here */ + identity = identity_lookup(message->reverse_path); + assert(identity); - local = !list_empty(&message->local_recipients); - remote = !list_empty(&message->remote_recipients); + if( identity->qualifydomain ) + { + local = 0; + remote = 1; + } + else + { + local = !list_empty(&message->local_recipients); + remote = !list_empty(&message->remote_recipients); + } if(remote && !local) - smtp_send(message); + smtp_send(message,identity); else if(!remote && local) { local_init(message); @@ -51,7 +81,7 @@ static void message_send(message_t *message) else { local_init(message); - smtp_send(message); + smtp_send(message,identity); local_flush(message); } @@ -349,6 +379,8 @@ int main (int argc, char **argv) /* Parse the rc file. */ rcfile_parse(rcfile); + drop_sgids(); + message_send(message); identities_cleanup(); -- cgit v1.2.3