BSD 4_3 development
authorCSRG <csrg@ucbvax.Berkeley.EDU>
Thu, 9 Jan 1986 13:41:55 +0000 (05:41 -0800)
committerCSRG <csrg@ucbvax.Berkeley.EDU>
Thu, 9 Jan 1986 13:41:55 +0000 (05:41 -0800)
Work on file usr/contrib/mh/uip/send.c

Synthesized-from: CSRG/cd1/4.3

usr/contrib/mh/uip/send.c [new file with mode: 0644]

diff --git a/usr/contrib/mh/uip/send.c b/usr/contrib/mh/uip/send.c
new file mode 100644 (file)
index 0000000..da486f7
--- /dev/null
@@ -0,0 +1,412 @@
+/* send.c - send a composed message */
+
+#include "../h/mh.h"
+#include <stdio.h>
+#include <signal.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+/* \f */
+
+static struct swit switches[] = {
+#define        ALIASW  0
+    "alias aliasfile", 0,
+
+#define        DEBUGSW 1
+    "debug", -5,
+
+#define        DRAFTSW 2
+    "draft", 0,
+
+#define        DFOLDSW 3
+    "draftfolder +folder", 6,
+#define        DMSGSW  4
+    "draftmessage msg", 6,
+#define        NDFLDSW 5
+    "nodraftfolder", 0,
+
+#define        ENCRSW  6
+    "encrypt",
+#ifndef        TMA
+       -7,
+#else  TMA
+       0,
+#endif TMA
+#define        NENCRSW 7
+    "noencrypt",
+#ifndef        TMA
+       -9,
+#else  TMA
+       0,
+#endif TMA
+
+#define        FILTSW  8
+    "filter filterfile", 0,
+#define        NFILTSW 9
+    "nofilter", 0,
+
+#define        FRMTSW  10
+    "format", 0,
+#define        NFRMTSW 11
+    "noformat", 0,
+
+#define        FORWSW  12
+    "forward", 0,
+#define        NFORWSW 13
+    "noforward", 0,
+
+#define        MSGDSW  14
+    "msgid", 0,
+#define        NMSGDSW 15
+    "nomsgid", 0,
+
+#define        PUSHSW  16
+    "push", 0,
+#define        NPUSHSW 17
+    "nopush", 0,
+
+#define        UNIQSW  18
+    "unique", -6,
+#define        NUNIQSW 19
+    "nounique", -8,
+
+#define        VERBSW  20
+    "verbose", 0,
+#define        NVERBSW 21
+    "noverbose", 0,
+
+#define        WATCSW  22
+    "watch", 0,
+#define        NWATCSW 23
+    "nowatch", 0,
+
+#define        WIDTHSW 24
+    "width columns", 0,
+
+#define        HELPSW  25
+    "help", 4,
+
+#define        MAILSW  26
+    "mail", -4,
+#define        SAMLSW  27
+    "saml", -4,
+#define        SENDSW  28
+    "send", -4,
+#define        SOMLSW  29
+    "soml", -4,
+
+#define        CLIESW  30
+    "client host", -6,
+#define        SERVSW  31
+    "server host", -6,
+#define        SNOOPSW 32
+    "snoop", -5,
+
+    NULL, NULL
+};
+
+static struct swit anyl[] = {
+#define        NOSW    0
+    "no", 0,
+#define        YESW    1
+    "yes", 0,
+#define        LISTDSW 2
+    "list", 0,
+
+    NULL, NULL
+};
+
+/* \f */
+
+extern int debugsw;            /* from sendsbr.c */
+extern int forwsw;
+extern int inplace;
+extern int pushsw;
+extern int unique;
+
+extern char *altmsg;           /*  .. */
+extern char *annotext;
+extern char *distfile;
+
+/* \f */
+
+/* ARGSUSED */
+
+main (argc, argv)
+int     argc;
+char   *argv[];
+{
+    int     msgp = 0,
+           distsw = 0,
+            vecp = 1,
+            isdf = 0,
+            msgnum,
+            status;
+    char   *cp,
+           *dfolder = NULL,
+           *maildir,
+            buf[100],
+          **ap,
+          **argp,
+           *arguments[MAXARGS],
+           *msgs[MAXARGS],
+           *vec[MAXARGS];
+    struct msgs *mp;
+    struct stat st;
+#ifdef UCI
+    FILE   *fp;
+#endif UCI
+
+    invo_name = r1bindex (argv[0], '/');
+    if ((cp = m_find (invo_name)) != NULL) {
+       ap = brkstring (cp = getcpy (cp), " ", "\n");
+       ap = copyip (ap, arguments);
+    }
+    else
+       ap = arguments;
+    (void) copyip (argv + 1, ap);
+    argp = arguments;
+
+    vec[vecp++] = "-library";
+    vec[vecp++] = getcpy (m_maildir (""));
+
+/* \f */
+
+    while (cp = *argp++) {
+       if (*cp == '-')
+           switch (smatch (++cp, switches)) {
+               case AMBIGSW: 
+                   ambigsw (cp, switches);
+                   done (1);
+               case UNKWNSW: 
+                   adios (NULLCP, "-%s unknown\n", cp);
+               case HELPSW: 
+                   (void) sprintf (buf, "%s [file] [switches]", invo_name);
+                   help (buf, switches);
+                   done (1);   /* thanks, phyl */
+
+               case DRAFTSW: 
+                   msgs[msgp++] = draft;
+                   continue;
+
+               case DFOLDSW: 
+                   if (dfolder)
+                       adios (NULLCP, "only one draft folder at a time!");
+                   if (!(cp = *argp++) || *cp == '-')
+                       adios (NULLCP, "missing argument to %s", argp[-2]);
+                   dfolder = path (*cp == '+' || *cp == '@' ? cp + 1 : cp,
+                           *cp != '@' ? TFOLDER : TSUBCWF);
+                   continue;
+               case DMSGSW: 
+                   if (!(cp = *argp++) || *cp == '-')
+                       adios (NULLCP, "missing argument to %s", argp[-2]);
+                   msgs[msgp++] = cp;
+                   continue;
+               case NDFLDSW: 
+                   dfolder = NULL;
+                   isdf = NOTOK;
+                   continue;
+
+               case PUSHSW: 
+                   pushsw++;
+                   continue;
+               case NPUSHSW: 
+                   pushsw = 0;
+                   continue;
+
+               case UNIQSW: 
+                   unique++;
+                   continue;
+               case NUNIQSW: 
+                   unique = 0;
+                   continue;
+
+               case FORWSW:
+                   forwsw++;
+                   continue;
+               case NFORWSW:
+                   forwsw = 0;
+                   continue;
+
+               case DEBUGSW: 
+                   debugsw++;  /* fall */
+               case NFILTSW: 
+               case FRMTSW: 
+               case NFRMTSW: 
+               case MSGDSW: 
+               case NMSGDSW: 
+               case VERBSW: 
+               case NVERBSW: 
+               case WATCSW: 
+               case NWATCSW: 
+               case MAILSW: 
+               case SAMLSW: 
+               case SENDSW: 
+               case SOMLSW: 
+               case ENCRSW:
+               case NENCRSW:
+               case SNOOPSW: 
+                   vec[vecp++] = --cp;
+                   continue;
+
+               case ALIASW: 
+               case FILTSW: 
+               case WIDTHSW: 
+               case CLIESW: 
+               case SERVSW: 
+                   vec[vecp++] = --cp;
+                   if (!(cp = *argp++) || *cp == '-')
+                       adios (NULLCP, "missing argument to %s", argp[-2]);
+                   vec[vecp++] = cp;
+                   continue;
+           }
+       else
+           msgs[msgp++] = cp;
+    }
+
+/* \f */
+
+    if (dfolder == NULL) {
+       if (msgp == 0) {
+#ifdef WHATNOW
+           if ((cp = getenv ("mhdraft")) && *cp) {
+               msgs[msgp++] = cp;
+               goto go_to_it;
+           }
+#endif WHATNOW
+           msgs[msgp++] = getcpy (m_draft (NULLCP, NULLCP, 1, &isdf));
+           if (stat (msgs[0], &st) == NOTOK)
+               adios (msgs[0], "unable to stat draft file");
+           cp = concat ("Use \"", msgs[0], "\"? ", NULLCP);
+           for (status = LISTDSW; status != YESW;) {
+               if (!(argp = getans (cp, anyl)))
+                   done (1);
+               switch (status = smatch (*argp, anyl)) {
+                   case NOSW: 
+                       done (0);
+                   case YESW: 
+                       break;
+                   case LISTDSW: 
+                       (void) showfile (++argp, msgs[0]);
+                       break;
+                   default:
+                       advise (NULLCP, "say what?");
+                       break;
+               }
+           }
+       }
+       else
+           for (msgnum = 0; msgnum < msgp; msgnum++)
+               msgs[msgnum] = getcpy (m_maildir (msgs[msgnum]));
+    }
+    else {
+       if (!m_find ("path"))
+           free (path ("./", TFOLDER));
+
+       if (!msgp)
+           msgs[msgp++] = "cur";
+       maildir = m_maildir (dfolder);
+
+       if (chdir (maildir) == NOTOK)
+           adios (maildir, "unable to change directory to");
+       if (!(mp = m_gmsg (dfolder)))
+           adios (NULLCP, "unable to read folder %s", dfolder);
+       if (mp -> hghmsg == 0)
+           adios (NULLCP, "no messages in %s", dfolder);
+
+       for (msgnum = 0; msgnum < msgp; msgnum++)
+           if (!m_convert (mp, msgs[msgnum]))
+               done (1);
+       m_setseq (mp);
+
+       for (msgp = 0, msgnum = mp -> lowsel; msgnum <= mp -> hghsel; msgnum++)
+           if (mp -> msgstats[msgnum] & SELECTED) {
+               msgs[msgp++] = getcpy (m_name (msgnum));
+#ifdef notdef
+               mp -> msgstats[msgnum] |= DELETED;
+#endif notdef
+               mp -> msgstats[msgnum] &= ~EXISTS;
+           }
+       mp -> msgflags |= SEQMOD;
+
+       m_sync (mp);
+    }
+#ifdef WHATNOW
+go_to_it: ;
+#endif WHATNOW
+
+/* \f */
+
+#ifdef TMA
+    if ((cp = getenv ("KDS")) == NULL || *cp == NULL)
+       if ((cp = m_find ("kdsproc")) && *cp)
+           (void) putenv ("KDS", cp);
+    if ((cp = getenv ("TMADB")) == NULL || *cp == NULL)
+       if ((cp = m_find ("tmadb")) && *cp)
+           (void) putenv ("TMADB", m_maildir (cp));
+#endif TMA
+
+    if ((cp = getenv ("SIGNATURE")) == NULL || *cp == NULL)
+       if ((cp = m_find ("signature")) && *cp)
+           (void) putenv ("SIGNATURE", cp);
+#ifdef UCI
+       else {
+           (void) sprintf (buf, "%s/.signature", mypath);
+           if ((fp = fopen (buf, "r")) != NULL
+               && fgets (buf, sizeof buf, fp) != NULL) {
+                   (void) fclose (fp);
+                   if (cp = index (buf, '\n'))
+                       *cp = NULL;
+                   (void) putenv ("SIGNATURE", buf);
+           }
+       }
+#endif UCI
+
+    for (msgnum = 0; msgnum < msgp; msgnum++)
+       if (stat (msgs[msgnum], &st) == NOTOK)
+           adios (msgs[msgnum], "unable to stat draft file");
+
+    if ((annotext = getenv ("mhannotate")) == NULL || *annotext == NULL)
+       annotext = NULL;
+    if (annotext
+           && ((altmsg = getenv ("mhaltmsg")) == NULL || *altmsg == NULL))
+       altmsg = NULL;
+    if (annotext && ((cp = getenv ("mhinplace")) != NULL && *cp != NULL))
+       inplace = atoi (cp);
+
+    if ((cp = getenv ("mhdist"))
+           && *cp
+           && (distsw = atoi (cp))
+           && altmsg) {
+       vec[vecp++] = "-dist";
+       distfile = getcpy (m_scratch (altmsg, invo_name));
+       if (link (altmsg, distfile) == NOTOK)
+           adios (distfile, "unable to link %s to", altmsg);
+    }
+    else
+       distfile = NULL;
+
+    if (altmsg == NULL || stat (altmsg, &st) == NOTOK)
+       st.st_mtime = 0, st.st_dev = 0, st.st_ino = 0;
+    if (pushsw)
+       push ();
+
+    status = 0;
+    vec[0] = r1bindex (postproc, '/');
+    closefds (3);
+
+    for (msgnum = 0; msgnum < msgp; msgnum++)
+       switch (sendsbr (vec, vecp, msgs[msgnum], &st)) {
+           case DONE: 
+               done (++status);
+
+           case NOTOK: 
+               status++;       /* fall */
+           case OK:
+               break;
+       }
+
+    m_update ();
+
+    done (status);
+}