summary |
tags |
clone url |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
84b4028)
this version seems to work correctly if there are no errors, but any
error sends it into strange places.
SCCS-vsn: usr.sbin/sendmail/src/usersmtp.c 3.2
# include <wellknown.h>
# include <sysexits.h>
# include <stdio.h>
# include <useful.h>
# include <wellknown.h>
# include <sysexits.h>
# include <stdio.h>
# include <useful.h>
-static char SccsId[] = "@(#)usersmtp.c 3.1 %G%";
+static char SccsId[] = "@(#)usersmtp.c 3.2 %G%";
/*
** TCP -- TCP/Ethernet/ARPAnet mailer
/*
** TCP -- TCP/Ethernet/ARPAnet mailer
char *MailCommand = "/usr/lib/sendmail";
char *MailUser = "network";
char *MailCommand = "/usr/lib/sendmail";
char *MailUser = "network";
-char *MailPassword = NULL;
-FILE *MailFile;
+char *MailPassword = "mailhack";
+FILE *InConnection;
+FILE *OutConnection;
main(argc, argv)
int argc;
char **argv;
{
main(argc, argv)
int argc;
char **argv;
{
- extern FILE *openconnection();
+ while (argc > 1 && argv[1][0] == '-')
+ {
+ register char *p = *++argv;
+
+ argc--;
+ switch (p[1])
+ {
+ case 'v':
+ Verbose = TRUE;
+ break;
+
+ case 'd':
+ Debug = TRUE;
+ break;
+ }
+ }
+
+ {
+ if (Debug)
+ printf("Usage\n");
- MailFile = openconnection(argv[2]);
- if (MailFile == NULL)
+ if (openconnection(argv[2]) < 0)
exit(EX_TEMPFAIL);
stat = runsmtp(argv[1], &argv[3]);
exit(EX_TEMPFAIL);
stat = runsmtp(argv[1], &argv[3]);
+ if (Debug)
+ printf("Finishing with stat %d\n", stat);
+
openconnection(host)
char *host;
{
char cmdbuf[100];
openconnection(host)
char *host;
{
char cmdbuf[100];
- extern FILE *rexec();
- register FILE *f;
/* create the command name */
/* create the command name */
- sprintf(cmdbuf, "%s -p", MailCommand);
+ sprintf(cmdbuf, "%s -as%s%s", MailCommand,
+ Verbose ? " -v" : "",
+ Debug ? " -d" : "");
- /* create connection (we hope) */
- f = rexec(&host, SHELLSERVER, cmdbuf, &MailUser, NULL);
+ if (Debug)
+ printf("Creating connection to \"%s\" on %s\n", cmdbuf, host);
+ /* create connection (we hope) */
+ fd = rexec(&host, SHELLSERVER, cmdbuf, MailUser, MailPassword);
+ if (fd < 0)
+ return (-1);
+ InConnection = fdopen(fd, "r");
+ OutConnection = fdopen(fd, "w");
+ if (InConnection == NULL || OutConnection == NULL)
+ return (-1);
+
+ if (Debug)
+ printf("Connection open to %s\n", host);
+
+ return (0);
}
\f/*
** RUNSMTP -- run the SMTP protocol over connection.
}
\f/*
** RUNSMTP -- run the SMTP protocol over connection.
** Parameters:
** fr -- from person.
** tolist -- list of recipients.
** Parameters:
** fr -- from person.
** tolist -- list of recipients.
-** mf -- mail connection file.
** Sends the mail via SMTP.
*/
** Sends the mail via SMTP.
*/
{
register int r;
register char **t;
char buf[MAXLINE];
/* get greeting message */
{
register int r;
register char **t;
char buf[MAXLINE];
/* get greeting message */
if (r / 100 != 2)
return (EX_TEMPFAIL);
/* send the mail command */
if (r / 100 != 2)
return (EX_TEMPFAIL);
/* send the mail command */
- fprintf(mf, "MAIL From:<%s>\r\n", fr);
- r = reply(mf);
+ message("MAIL From:<%s>\r\n", fr);
+ r = reply();
if (r != 250)
return (EX_SOFTWARE);
/* send the recipients */
for (t = tolist; *t != NULL; t++)
{
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);
+ message("MRCP To:<%s>\r\n", *t);
+ r = reply();
if (r != 250)
return (EX_NOUSER);
}
/* send the data */
if (r != 250)
return (EX_NOUSER);
}
/* send the data */
- fprintf(mf, "DATA\r\n");
- r = reply(mf);
+ message("DATA\r\n");
+ r = reply();
if (r != 354)
return (EX_SOFTWARE);
while (fgets(buf, sizeof buf, stdin) != NULL)
if (r != 354)
return (EX_SOFTWARE);
while (fgets(buf, sizeof buf, stdin) != NULL)
if (p != NULL)
*p = '\0';
if (buf[0] == '.')
if (p != NULL)
*p = '\0';
if (buf[0] == '.')
- fprintf(mf, ".");
- fprintf(mf, "%s\r\n", buf);
+ message(".");
+ message("%s\r\n", buf);
- fprintf(mf, ".\r\n");
- r = reply(mf);
+ message(".\r\n");
+ r = reply();
if (r != 250)
return (EX_SOFTWARE);
/* force delivery */
if (r != 250)
return (EX_SOFTWARE);
/* force delivery */
- fprintf(mf, "DOIT\r\n");
- r = reply(mf);
+ message("DOIT\r\n");
+ r = reply();
if (r != 250)
return (EX_TEMPFAIL);
if (r != 250)
return (EX_TEMPFAIL);
- fprintf(mf, "QUIT\r\n");
- r = reply(mf);
+ message("QUIT\r\n");
+ r = reply();
if (r != 221)
return (EX_SOFTWARE);
if (r != 221)
return (EX_SOFTWARE);
** REPLY -- read arpanet reply
**
** Parameters:
** REPLY -- read arpanet reply
**
** Parameters:
**
** Returns:
** reply code it reads.
**
** Returns:
** reply code it reads.
** flushes the mail file.
*/
** flushes the mail file.
*/
+ fflush(OutConnection);
+
+ if (Debug)
+ printf("reply\n");
/* read the input line */
for (;;)
/* read the input line */
for (;;)
char buf[MAXLINE];
register int r;
char buf[MAXLINE];
register int r;
- if (fgets(buf, sizeof buf, mf) == NULL)
+ if (fgets(buf, sizeof buf, InConnection) == NULL)
return (-1);
if (Verbose)
fputs(buf, stdout);
return (-1);
if (Verbose)
fputs(buf, stdout);
+ if (buf[3] == '-' || !isdigit(buf[0]))
continue;
r = atoi(buf);
if (r < 100)
continue;
r = atoi(buf);
if (r < 100)
+\f/*
+** MESSAGE -- send message to server
+**
+** Parameters:
+** f -- format
+** a, b, c -- parameters
+**
+** Returns:
+** none.
+**
+** Side Effects:
+** writes message to OutChannel.
+*/
+
+message(f, a, b, c)
+ char *f;
+{
+ char buf[100];
+
+ sprintf(buf, f, a, b, c);
+ if (Debug)
+ fputs(buf, stdout);
+ fputs(buf, OutConnection);
+}