#include "smtpd_mock.h"
char* strsub (char *instr, unsigned start, unsigned end)
{
unsigned n = end - start;
char * outstr = (char *)malloc(n+1);
//bzero(outstr,n+1);
strncpy (outstr, instr + start, n);
outstr[n] = 0;
return outstr;
}
int setnonblocking(int sockfd)
{
if (fcntl(sockfd, F_SETFL, fcntl(sockfd, F_GETFD, 0)|O_NONBLOCK) == -1)
{
return -1;
}
return 0;
}
void smtp_echo(void* data)
{
int socket = *(int*)data;
char ebuf[128],buffer[BUFFER_SIZE];
int length = 0, z;
regex_t reg;
regmatch_t pm[10];
const size_t nmatch = 10;
const char * split = "/r/n";
char * pline, * cmd;
z = regcomp (®, smtp_cmd_format, REG_EXTENDED);
if (z != 0){
regerror (z,®, ebuf, sizeof (ebuf));
fprintf (stderr, "%s: regcomp()/n", ebuf);
return;
}
{
while (1) {
bzero(buffer,BUFFER_SIZE);
length = recv(socket,buffer,BUFFER_SIZE,0);
if (length == -1) {
if(errno == EAGAIN){
break;
}
syslog(LOG_ERR,"recv - %m");
break;
}
syslog(LOG_DEBUG,"%s",buffer);
pline = strtok (buffer,split);
while(pline!=NULL) {
syslog(LOG_DEBUG,"%s/n",pline);
if (0==(strcasecmp(pline, "."))){
smtp_cmd("HELO");
continue;
}
z = regexec (®, pline, nmatch, pm, 0);
if (z == REG_NOMATCH)
{
// do nothing;
}
else if (z != 0)
{
regerror (z,®, ebuf, sizeof (ebuf));
fprintf (stderr, "%s: regexec('%s')/n", ebuf, pline);
return ;
}
if(pm[1].rm_so != -1)
{
cmd = strsub (pline, pm[1].rm_so, pm[1].rm_eo);
syslog(LOG_NOTICE,"cmd => %s/n", cmd);
if(pm[2].rm_so != -1)
{
syslog(LOG_NOTICE,"other content => %s/n", strsub (pline, pm[2].rm_so, pm[2].rm_eo));
}
smtp_cmd(cmd,socket);
}
pline = strtok(NULL,split);
}
if(length < BUFFER_SIZE)
break;
}
}
regfree (®);
return;
}
void smtp_cmd(char * cmd,int socket)
{
char buffer[BUFFER_SIZE];
bzero(buffer, BUFFER_SIZE);