summaryrefslogtreecommitdiff
path: root/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'main.c')
-rw-r--r--main.c42
1 files changed, 37 insertions, 5 deletions
diff --git a/main.c b/main.c
index d1f47e6..7b9ebc1 100644
--- a/main.c
+++ b/main.c
@@ -8,6 +8,9 @@
#include <stdio.h>
#include <stdlib.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <assert.h>
#include <string.h>
#ifdef HAVE_GETOPT_H
#include <getopt.h>
@@ -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();