Enable inc(1) to read from stdin
authorm@mmmmarascio.xyz <m@mmmmarascio.xyz>
Mon, 1 Aug 2016 09:25:57 +0000 (11:25 +0200)
committermarkus schnalke <meillo@marmaro.de>
Mon, 1 Aug 2016 09:25:57 +0000 (11:25 +0200)
The -file switch handles the argument "-" special and reads
from stdin in this case.

man/inc.man1
test/tests/inc/test-read-stdin [new file with mode: 0644]
uip/inc.c

index 817c1bd..ed586c1 100644 (file)
@@ -124,6 +124,13 @@ By using the
 switch, one can direct
 .B inc
 to incorporate messages from a file other than the user's maildrop.
+In particular, if
+.I name
+is
+.RI ` - '
+then
+.B inc
+will read messages from standard input.
 Note that the named file will NOT be zeroed, unless the
 .B \-truncate
 switch is given.
diff --git a/test/tests/inc/test-read-stdin b/test/tests/inc/test-read-stdin
new file mode 100644 (file)
index 0000000..d771d32
--- /dev/null
@@ -0,0 +1,66 @@
+#!/bin/sh
+##########################################################
+# Test incorporating mail from stdin with `inc -file -`. #
+##########################################################
+. "$MH_TEST_COMMON"
+
+# Test empty stdin from a pipe.
+runandcheck "printf '' |inc -file -" <<!
+Incorporating new mail into inbox...
+
+inc: no messages incorporated, continuing...
+!
+
+# Test empty stdin from redirected regular file.
+cd "$MMH_TEST_DIR"
+f=mbox
+runandcheck "printf '' >$f && inc -file - <$f" <<!
+Incorporating new mail into inbox...
+
+inc: no messages incorporated, continuing...
+!
+rm "$f"
+unset f
+
+# Test empty stdin from character device.
+runandcheck "inc -file - </dev/null" <<!
+Incorporating new mail into inbox...
+
+inc: no messages incorporated, continuing...
+!
+
+# Test nonempty pipe.
+runandcheck "packf +inbox |inc -file -" <<!
+Incorporating new mail into inbox...
+
+  11+ 2006-09-29 00:00  Test1              Testing message 1
+  12  2006-09-29 00:00  Test2              Testing message 2
+  13  2006-09-29 00:00  Test3              Testing message 3
+  14  2006-09-29 00:00  Test4              Testing message 4
+  15  2006-09-29 00:00  Test5              Testing message 5
+  16  2006-09-29 00:00  Test6              Testing message 6
+  17  2006-09-29 00:00  Test7              Testing message 7
+  18  2006-09-29 00:00  Test8              Testing message 8
+  19  2006-09-29 00:00  Test9              Testing message 9
+  20  2006-09-29 00:00  Test10             Testing message 10
+!
+
+# Test nonempty redirected stdin.
+cd "$MMH_TEST_DIR"
+f=mbox
+runandcheck "packf +inbox 1-10 >$f && inc -file - <$f" <<!
+Incorporating new mail into inbox...
+
+  21+ 2006-09-29 00:00  Test1              Testing message 1
+  22  2006-09-29 00:00  Test2              Testing message 2
+  23  2006-09-29 00:00  Test3              Testing message 3
+  24  2006-09-29 00:00  Test4              Testing message 4
+  25  2006-09-29 00:00  Test5              Testing message 5
+  26  2006-09-29 00:00  Test6              Testing message 6
+  27  2006-09-29 00:00  Test7              Testing message 7
+  28  2006-09-29 00:00  Test8              Testing message 8
+  29  2006-09-29 00:00  Test9              Testing message 9
+  30  2006-09-29 00:00  Test10             Testing message 10
+!
+rm "$f"
+unset f
index 0cb2a5e..c0f272e 100644 (file)
--- a/uip/inc.c
+++ b/uip/inc.c
@@ -225,10 +225,10 @@ main(int argc, char **argv)
                                continue;
 
                        case FILESW:
-                               if (!(cp = *argp++) || *cp == '-')
+                               if (!(cp = *argp++))
                                        adios(EX_USAGE, NULL, "missing argument to %s",
                                                        argp[-2]);
-                               from = mh_xstrdup(expanddir(cp));
+                               from = (strcmp(cp, "-")==0) ? "-" : mh_xstrdup(expanddir(cp));
 
                                /*
                                ** If the truncate file is in default state,
@@ -277,26 +277,28 @@ main(int argc, char **argv)
        /* guarantee dropping group priveleges; we might not have done so earlier */
        DROPGROUPPRIVS();
 
-       /*
-       ** We will get the mail from a file
-       ** (typically the standard maildrop)
-       */
-       if (from)
-               newmail = from;
-       else if ((newmail = getenv("MAILDROP")) && *newmail)
-               newmail = toabsdir(newmail);
-       else if ((newmail = context_find("maildrop")) && *newmail)
-               newmail = toabsdir(newmail);
-       else {
-               newmail = concat(mailspool, "/", getusername(), NULL);
-       }
-       if (stat(newmail, &s1) == NOTOK || s1.st_size == 0)
-               adios(EX_DATAERR, NULL, "no mail to incorporate");
+       if (from && strcmp(from, "-")==0) {
+               /* We'll read mail from stdin. */
+               newmail = NULL;
+       } else {
+               /* We'll read mail from a file. */
+               if (from)
+                       newmail = from;
+               else if ((newmail = getenv("MAILDROP")) && *newmail)
+                       newmail = toabsdir(newmail);
+               else if ((newmail = context_find("maildrop")) && *newmail)
+                       newmail = toabsdir(newmail);
+               else {
+                       newmail = concat(mailspool, "/", getusername(), NULL);
+               }
+               if (stat(newmail, &s1) == NOTOK || s1.st_size == 0)
+                       adios(EX_DATAERR, NULL, "no mail to incorporate");
 
-       if ((cp = strdup(newmail)) == NULL)
-               adios(EX_OSERR, NULL, "error allocating memory to copy newmail");
+               if ((cp = strdup(newmail)) == NULL)
+                       adios(EX_OSERR, NULL, "error allocating memory to copy newmail");
 
-       newmail = cp;
+               newmail = cp;
+       }
 
        if (!folder)
                folder = getdeffol();
@@ -313,7 +315,10 @@ main(int argc, char **argv)
        if (!(mp = folder_read(folder)))
                adios(EX_IOERR, NULL, "unable to read folder %s", folder);
 
-       if (access(newmail, W_OK) != NOTOK) {
+       if (!newmail) {
+               trnflag = 0;
+               in = stdin;
+       } else if (access(newmail, W_OK) != NOTOK) {
                locked++;
                if (trnflag) {
                        SIGNAL(SIGHUP, SIG_IGN);
@@ -480,7 +485,7 @@ giveup:;
                        else
                                admonish(newmail, "error zero'ing");
                }
-       } else if (noisy) {
+       } else if (noisy && newmail) {
                printf("%s not zero'd\n", newmail);
        }