]> git.ipfire.org Git - people/ms/dma.git/blobdiff - dma.c
newaliases: provide command alias
[people/ms/dma.git] / dma.c
diff --git a/dma.c b/dma.c
index bb5fa198f18adc6c039a80097aa9ebcdd35369c5..25af9b0569f7bfe4467c7a1ecda53d1f60f2249d 100644 (file)
--- a/dma.c
+++ b/dma.c
@@ -95,25 +95,31 @@ sighup_handler(int signo)
 static char *
 set_from(struct queue *queue, const char *osender)
 {
+       const char *addr;
        char *sender;
 
        if (osender) {
-               sender = strdup(osender);
-               if (sender == NULL)
-                       return (NULL);
+               addr = osender;
        } else if (getenv("EMAIL") != NULL) {
-               sender = strdup(getenv("EMAIL"));
-               if (sender == NULL)
-                       return (NULL);
+               addr = getenv("EMAIL");
        } else {
-               const char *from_user = username;
+               if (config.masquerade_user)
+                       addr = config.masquerade_user;
+               else
+                       addr = username;
+       }
+
+       if (!strchr(addr, '@')) {
                const char *from_host = hostname();
 
-               if (config.masquerade_user)
-                       from_user = config.masquerade_user;
                if (config.masquerade_host)
                        from_host = config.masquerade_host;
-               if (asprintf(&sender, "%s@%s", from_user, from_host) <= 0)
+
+               if (asprintf(&sender, "%s@%s", addr, from_host) <= 0)
+                       return (NULL);
+       } else {
+               sender = strdup(addr);
+               if (sender == NULL)
                        return (NULL);
        }
 
@@ -423,9 +429,14 @@ main(int argc, char **argv)
        if (geteuid() == 0 || getuid() == 0) {
                struct passwd *pw;
 
+               errno = 0;
                pw = getpwnam(DMA_ROOT_USER);
-               if (pw == NULL)
-                       err(1, "cannot drop root privileges");
+               if (pw == NULL) {
+                       if (errno == 0)
+                               errx(1, "user '%s' not found", DMA_ROOT_USER);
+                       else
+                               err(1, "cannot drop root privileges");
+               }
 
                if (setuid(pw->pw_uid) != 0)
                        err(1, "cannot drop root privileges");
@@ -446,6 +457,13 @@ main(int argc, char **argv)
                if (argc != 0)
                        errx(1, "invalid arguments");
                goto skipopts;
+       } else if (strcmp(argv[0], "newaliases") == 0) {
+               logident_base = "dma";
+               setlogident(NULL);
+
+               if (read_aliases() != 0)
+                       errx(1, "could not parse aliases file `%s'", config.aliases);
+               exit(0);
        }
 
        opterr = 0;
@@ -569,13 +587,13 @@ skipopts:
        }
 
        if (read_aliases() != 0)
-               errlog(1, "can not read aliases file `%s'", config.aliases);
+               errlog(1, "could not parse aliases file `%s'", config.aliases);
 
        if ((sender = set_from(&queue, sender)) == NULL)
                errlog(1, NULL);
 
        if (newspoolf(&queue) != 0)
-               errlog(1, "can not create temp file");
+               errlog(1, "can not create temp file in `%s'", config.spooldir);
 
        setlogident("%s", queue.id);