int SMTPHelo(STREAM *S) { int RetVal=0; char *Tempstr=NULL, *Token=NULL; const char *ptr; ptr=LibUsefulGetValue("SMTP:HELO"); if (! StrValid(ptr)) ptr=STREAMGetValue(S,"SMTP:HELO"); if (! StrValid(ptr)) { Token=GetExternalIP(Token); ptr=Token; } Tempstr=MCopyStr(Tempstr, "EHLO ", ptr, "\r\n", NULL); STREAMWriteLine(Tempstr,S); Tempstr=SMTPRead(Tempstr, S); if (*Tempstr == '2') { RetVal |= CAP_EHLO; ptr=GetToken(Tempstr,"\n",&Token,0); while (ptr) { StripTrailingWhitespace(Token); RetVal |= SMTPParseCapabilities(Token); ptr=GetToken(ptr,"\n",&Token,0); } } //Some old server that doesn't support EHLO, switch to HELO else { Tempstr=MCopyStr(Tempstr, "HELO ", ptr, "\r\n", NULL); STREAMWriteLine(Tempstr,S); if (SMTPInteract(Tempstr, S)) RetVal |= CAP_HELO; } DestroyString(Tempstr); DestroyString(Token); return(RetVal); }
int SMTPInteract(const char *Line, STREAM *S) { char *Tempstr=NULL; int result=FALSE; if (StrValid(Line)) STREAMWriteLine(Line, S); STREAMFlush(S); Tempstr=SMTPRead(Tempstr, S); /* syslog(LOG_DEBUG,"mail >> %s",Line); syslog(LOG_DEBUG,"mail << %s",Tempstr); */ if ( StrValid(Tempstr) && ( (*Tempstr=='2') || (*Tempstr=='3') ) ) result=TRUE; DestroyString(Tempstr); return(result); }
KWBoolean SMTPGetLine(SMTPClient *client) { static const char mName[] = "SMTPGetLine"; char *lineBreak; size_t lineLength; KWBoolean bResult = KWTrue; /*--------------------------------------------------------------------*/ /* Handle previously signaled EOF */ /*--------------------------------------------------------------------*/ if (isClientEOF(client) && (client->receive.NetworkUsed == 0)) { printmsg(0, "%s: client %d is out of data (EOF)", mName, getClientSequence(client)); SetDataLine(client, "", 0); setClientMode(client, SM_ABORT); return KWTrue; } /*--------------------------------------------------------------------*/ /* Read more data if we have some and need it, */ /*--------------------------------------------------------------------*/ lineBreak = getLineBreak(&client->receive); if (getClientReady(client) && (lineBreak == NULL)) { if (client->stalledReads) /* Improve response time ... */ client->stalledReads--; SMTPRead(client); lineBreak = getLineBreak(&client->receive); } /*--------------------------------------------------------------------*/ /* If no data available, return immediately */ /*--------------------------------------------------------------------*/ if (lineBreak == NULL) { if (isClientEOF(client)) { static const char quit[] = "quit"; static const size_t quitLength = sizeof quit - 1; if ((client->receive.NetworkUsed == quitLength) && equalni(client->receive.NetworkBuffer, quit, quitLength)) { printmsg(8,"%s: Applying CR/LF after Netscape %s/EOF", mName, quit); SetDataLine(client, client->receive.NetworkBuffer, quitLength); SMTPBurpBuffer(client, client->receive.NetworkUsed); } else { printmsg(0, "%s: Client %d Terminated unexpectedly without QUIT", mName, getClientSequence(client)); SMTPBurpBuffer(client, client->receive.NetworkUsed); /* Abort client immediately */ setClientMode(client, SM_ABORT); return KWTrue; } } else if (client->receive.NetworkUsed < MAX_BUFFER_SIZE) { printmsg(2, "%s: Client %d Input buffer " "(%d bytes) waiting for data.", mName, getClientSequence(client), client->receive.NetworkUsed); /* Sleep client for few secs */ setClientIgnore(client, (time_t) ++client->stalledReads); /* Don't process command yet */ return KWFalse; } /* END if (client->receive.NetworkUsed < MAX_BUFFER_SIZE) */ else { printmsg(0, "%d <<< %.125s", getClientSequence(client), client->receive.NetworkBuffer); printmsg(0, "%s: Client %d Input buffer (%d bytes) full (cannot append more).", mName, getClientSequence(client), client->receive.NetworkUsed); SetDataLine(client, client->receive.NetworkBuffer, client->receive.NetworkUsed); SMTPBurpBuffer(client, client->receive.NetworkUsed); /* Abort client immediately */ setClientMode(client, SM_ABORT); return KWTrue; } /* END else */ } /* END if (lineBreak == NULL) */ lineLength = lineBreak - client->receive.NetworkBuffer; bResult = SetDataLine(client, client->receive.NetworkBuffer, lineLength); SMTPBurpBuffer(client, lineLength + 2); return bResult; } /* END SMTPGetLine */