aboutsummaryrefslogtreecommitdiffstats
path: root/smtp.c
diff options
context:
space:
mode:
authorEric S. Raymond <esr@thyrsus.com>1996-11-16 16:38:34 +0000
committerEric S. Raymond <esr@thyrsus.com>1996-11-16 16:38:34 +0000
commitd29f00801f0c468640792ca5888c4f7b16f94254 (patch)
treeed7917d15bad1ba0477cbf2d4abdac29749577a2 /smtp.c
parenta147a777842e22c5ef0ca1ca86cfe61f952056a4 (diff)
downloadfetchmail-d29f00801f0c468640792ca5888c4f7b16f94254.tar.gz
fetchmail-d29f00801f0c468640792ca5888c4f7b16f94254.tar.bz2
fetchmail-d29f00801f0c468640792ca5888c4f7b16f94254.zip
Include Cameron McPherson's patch for handling multi-line SMTP responses.
svn path=/trunk/; revision=545
Diffstat (limited to 'smtp.c')
-rw-r--r--smtp.c56
1 files changed, 26 insertions, 30 deletions
diff --git a/smtp.c b/smtp.c
index cab2ef6c..77ced235 100644
--- a/smtp.c
+++ b/smtp.c
@@ -26,7 +26,7 @@ int SMTP_helo(FILE *sockfp,char *host)
SockPrintf(sockfp,"HELO %s\r\n", host);
if (outlevel == O_VERBOSE)
fprintf(stderr, "SMTP> HELO %s\n", host);
- ok = SMTP_ok(sockfp,NULL);
+ ok = SMTP_ok(sockfp);
return ok;
}
@@ -38,7 +38,7 @@ int SMTP_from(FILE *sockfp, char *from)
SockPrintf(sockfp,"MAIL FROM:<%s>\r\n", from);
if (outlevel == O_VERBOSE)
fprintf(stderr, "SMTP> MAIL FROM:<%s>\n", from);
- ok = SMTP_ok(sockfp,NULL);
+ ok = SMTP_ok(sockfp);
return ok;
}
@@ -50,7 +50,7 @@ int SMTP_rcpt(FILE *sockfp, char *to)
SockPrintf(sockfp,"RCPT TO:<%s>\r\n", to);
if (outlevel == O_VERBOSE)
fprintf(stderr, "SMTP> RCPT TO:<%s>\n", to);
- ok = SMTP_ok(sockfp,NULL);
+ ok = SMTP_ok(sockfp);
return ok;
}
@@ -62,7 +62,7 @@ int SMTP_data(FILE *sockfp)
SockPrintf(sockfp,"DATA\r\n");
if (outlevel == O_VERBOSE)
fprintf(stderr, "SMTP> DATA\n");
- ok = SMTP_ok(sockfp,NULL);
+ ok = SMTP_ok(sockfp);
return ok;
}
@@ -74,7 +74,7 @@ int SMTP_quit(FILE *sockfp)
SockPrintf(sockfp,"QUIT\r\n");
if (outlevel == O_VERBOSE)
fprintf(stderr, "SMTP> QUIT\n");
- ok = SMTP_ok(sockfp,NULL);
+ ok = SMTP_ok(sockfp);
return ok;
}
@@ -86,7 +86,7 @@ int SMTP_eom(FILE *sockfp)
SockPrintf(sockfp,".\r\n");
if (outlevel == O_VERBOSE)
fprintf(stderr, "SMTP>. (EOM)\n");
- ok = SMTP_ok(sockfp,NULL);
+ ok = SMTP_ok(sockfp);
return ok;
}
@@ -98,33 +98,29 @@ void SMTP_rset(FILE *sockfp)
fprintf(stderr, "SMTP> RSET\n");
}
-static int SMTP_check(FILE *sockfp,char *argbuf)
+
+static int SMTP_check(FILE *sockfp)
/* returns status of SMTP connection */
{
- int ok;
- char buf[SMTPBUFSIZE];
+ int n;
+ char buf[SMTPBUFSIZE];
- if ((ok = SockGets(buf, sizeof(buf)-1, sockfp)) > 0) {
- buf[ok] = '\0';
- if (outlevel == O_VERBOSE)
- fprintf(stderr, "SMTP< %s\n", buf);
- if (argbuf)
- strcpy(argbuf,buf);
- if (buf[0] == '1' || buf[0] == '2' || buf[0] == '3')
- ok = SM_OK;
- else
- ok = SM_ERROR;
- }
- else
- {
- if (outlevel == O_VERBOSE)
- fprintf(stderr, "SMTP< (read failed)\n");
- ok = SM_UNRECOVERABLE;
- }
- return (ok);
+ while ((n = SockGets(buf, sizeof(buf)-1, sockfp)) > 0)
+ {
+ if (n < 4)
+ return SM_ERROR;
+ buf[n] = '\0';
+ if (outlevel == O_VERBOSE)
+ fprintf(stderr, "SMTP< %s\n", buf);
+ if ((buf[0] == '1' || buf[0] == '2' || buf[0] == '3') && buf[3] == ' ')
+ return SM_OK;
+ else if (buf[3] != '-')
+ return SM_ERROR;
+ }
+ return SM_UNRECOVERABLE;
}
-int SMTP_ok(FILE *sockfp,char *argbuf)
+int SMTP_ok(FILE *sockfp)
/* accepts SMTP response, returns status of SMTP connection */
{
int ok;
@@ -138,11 +134,11 @@ int SMTP_ok(FILE *sockfp,char *argbuf)
*/
- ok = SMTP_check(sockfp,argbuf);
+ ok = SMTP_check(sockfp);
if (ok == SM_ERROR) /* if we got an error, */
{
SMTP_rset(sockfp);
- ok = SMTP_check(sockfp,argbuf); /* how does it look now ? */
+ ok = SMTP_check(sockfp); /* how does it look now ? */
if (ok == SM_OK)
ok = SM_ERROR; /* It's just a simple error, for*/
/* the current message */