date and time created 81/10/31 10:11:38 by eric
authorEric Allman <eric@ucbvax.Berkeley.EDU>
Sun, 1 Nov 1981 02:11:38 +0000 (18:11 -0800)
committerEric Allman <eric@ucbvax.Berkeley.EDU>
Sun, 1 Nov 1981 02:11:38 +0000 (18:11 -0800)
SCCS-vsn: usr.sbin/sendmail/src/usersmtp.c 3.1

usr/src/usr.sbin/sendmail/src/usersmtp.c [new file with mode: 0644]

diff --git a/usr/src/usr.sbin/sendmail/src/usersmtp.c b/usr/src/usr.sbin/sendmail/src/usersmtp.c
new file mode 100644 (file)
index 0000000..ef621eb
--- /dev/null
@@ -0,0 +1,183 @@
+# include <wellknown.h>
+# include <sysexits.h>
+# include <stdio.h>
+# include <useful.h>
+
+static char    SccsId[] =      "@(#)usersmtp.c 3.1     %G%";
+
+/*
+**  TCP -- TCP/Ethernet/ARPAnet mailer
+**
+**     This arranges to send a message over the TCP connection.
+*/
+
+# define MAXLINE       200
+
+char   *MailCommand =  "/usr/lib/sendmail";
+char   *MailUser =     "network";
+char   *MailPassword = NULL;
+FILE   *MailFile;
+bool   Verbose;
+
+main(argc, argv)
+       int argc;
+       char **argv;
+{
+       extern FILE *openconnection();
+       register int stat;
+
+       if (argc < 4)
+               exit(EX_USAGE);
+
+       MailFile = openconnection(argv[2]);
+       if (MailFile == NULL)
+               exit(EX_TEMPFAIL);
+
+       stat = runsmtp(argv[1], &argv[3]);
+
+       exit(stat);
+}
+\f/*
+**  OPENCONNECTION -- open connection to SMTP socket
+**
+**     Parameters:
+**             none.
+**
+**     Returns:
+**             file pointer of connection.
+**             NULL on error.
+**
+**     Side Effects:
+**             none.
+*/
+
+FILE *
+openconnection(host)
+       char *host;
+{
+       char cmdbuf[100];
+       extern FILE *rexec();
+       register FILE *f;
+
+       /* create the command name */
+       sprintf(cmdbuf, "%s -p", MailCommand);
+
+       /* create connection (we hope) */
+       f = rexec(&host, SHELLSERVER, cmdbuf, &MailUser, NULL);
+
+       return (f);
+}
+\f/*
+**  RUNSMTP -- run the SMTP protocol over connection.
+**
+**     Parameters:
+**             fr -- from person.
+**             tolist -- list of recipients.
+**             mf -- mail connection file.
+**
+**     Returns:
+**             none.
+**
+**     Side Effects:
+**             Sends the mail via SMTP.
+*/
+
+runsmtp(fr, tolist, mf)
+       char *fr;
+       char **tolist;
+       FILE *mf;
+{
+       register int r;
+       register char **t;
+       char buf[MAXLINE];
+
+       /* get greeting message */
+       r = reply(mf);
+       if (r / 100 != 2)
+               return (EX_TEMPFAIL);
+
+       /* send the mail command */
+       fprintf(mf, "MAIL From:<%s>\r\n", fr);
+       r = reply(mf);
+       if (r != 250)
+               return (EX_SOFTWARE);
+
+       /* send the recipients */
+       for (t = tolist; *t != NULL; t++)
+       {
+               fprintf(mf, "MRCP To:<%s>\r\n", *t);
+               r = reply(mf);
+               if (r != 250)
+                       return (EX_NOUSER);
+       }
+
+       /* send the data */
+       fprintf(mf, "DATA\r\n");
+       r = reply(mf);
+       if (r != 354)
+               return (EX_SOFTWARE);
+       while (fgets(buf, sizeof buf, stdin) != NULL)
+       {
+               /* change trailing newline to crlf */
+               register char *p = index(buf, '\n');
+
+               if (p != NULL)
+                       *p = '\0';
+               if (buf[0] == '.')
+                       fprintf(mf, ".");
+               fprintf(mf, "%s\r\n", buf);
+       }
+       fprintf(mf, ".\r\n");
+       r = reply(mf);
+       if (r != 250)
+               return (EX_SOFTWARE);
+
+       /* force delivery */
+       fprintf(mf, "DOIT\r\n");
+       r = reply(mf);
+       if (r != 250)
+               return (EX_TEMPFAIL);
+
+       fprintf(mf, "QUIT\r\n");
+       r = reply(mf);
+       if (r != 221)
+               return (EX_SOFTWARE);
+
+       return (EX_OK);
+}
+\f/*
+**  REPLY -- read arpanet reply
+**
+**     Parameters:
+**             mf -- mail file.
+**
+**     Returns:
+**             reply code it reads.
+**
+**     Side Effects:
+**             flushes the mail file.
+*/
+
+reply(mf)
+       FILE *mf;
+{
+       fflush(mf);
+
+       /* read the input line */
+       for (;;)
+       {
+               char buf[MAXLINE];
+               register int r;
+
+               if (fgets(buf, sizeof buf, mf) == NULL)
+                       return (-1);
+               if (Verbose)
+                       fputs(buf, stdout);
+               if (buf[3] == '-')
+                       continue;
+               r = atoi(buf);
+               if (r < 100)
+                       continue;
+               return (r);
+       }
+}