00001 
00008 #ifdef CPLUSPLUS
00009     #undef CPLUSPLUS
00010 #endif
00011 
00012 
00013 #include "smtp_tool.h"
00014 #include "mime_tool.h"
00015 
00016 
00022 char*  get_smtp_rcpt(char* mesg)
00023 {
00024     char* pp;
00025     char* pt;
00026     char* pc;
00027     char* pa = NULL;
00028 
00029     pp = awk(mesg, ':', 1);
00030     pc = pack_char(pp, ' ');
00031     freeNull(pp);
00032     if (pc==NULL) return NULL;
00033 
00034     if (!strcasecmp("RCPT TO", pc)) {
00035         pp = (char*)malloc(strlen((const char*)mesg)+1);
00036         pt = strstr(mesg, ":");
00037         if (pp==NULL || pt==NULL) {
00038             freeNull(pc);
00039             freeNull(pp);
00040             return NULL;
00041         }
00042         memset(pp, 0, strlen((const char*)mesg)+1);
00043         memcpy(pp, pt, strlen((const char*)pt));
00044 
00045         pa = get_smtp_mailbox(pp);
00046         freeNull(pp);
00047     }
00048 
00049     freeNull(pc);
00050     return pa;
00051 }
00052     
00053 
00054 
00063 char*   get_smtp_mailbox(char* mesg)
00064 {
00065     int i, j, k, l;
00066     char* mb;
00067 
00068     i = strlen((const char*)mesg);
00069     mb = (char*)malloc(i+1);
00070     if (mb==NULL) return NULL;
00071     memset(mb, 0, i+1);
00072 
00073     i--;
00074     while(i>=0) {
00075         if (mesg[i]!=' ' && mesg[i]!='>' && mesg[i]!=CHAR_CR && mesg[i]!=CHAR_LF) break;    
00076         i--;
00077     }
00078     l = i;
00079 
00080     while(i>=0) {
00081         if (mesg[i]==':' || mesg[i]=='<' || mesg[i]==' ') break;    
00082         i--;
00083     }
00084     k = i + 1;
00085 
00086     for (i=k, j=0; i<=l; i++) mb[j++] = mesg[i];
00087 
00088     return mb;
00089 }
00090 
00091 
00092 
00098 int   is_smtp_onecommand(char* mesg, char* com)
00099 {
00100     int   ret = FALSE;
00101     char* pp;
00102     char* pc;
00103 
00104     pp = pack_char(mesg, ' ');
00105     pc = awk(pp, ' ', 1);
00106     freeNull(pp);
00107     if (pc==NULL) return FALSE;
00108 
00109     if (!strncasecmp(com, pc, strlen((const char*)com))) ret = TRUE;
00110 
00111     freeNull(pc);
00112     return ret;
00113 }
00114     
00115 
00116 
00124 int  smtp_check_dot(char* mesg) 
00125 {
00126     static int preDot = OFF;
00127     char* p = mesg;
00128 
00129     if (preDot==ON) {                               
00130         if (!strncmp(".\r\n", mesg, 3)) {
00131             preDot  = OFF;
00132             return TRUE;
00133         }
00134         preDot = OFF;
00135     }
00136 
00137     while(*p!='\0') {
00138         if (!strncmp("\r\n", p, 2)) {               
00139             if (p[2]=='\0') {                       
00140                 preDot = ON;
00141                 return FALSE;
00142             }
00143             else if (!strncmp("\r\n.\r\n", p, 5)) { 
00144                 preDot = OFF;
00145                 return TRUE;
00146             }
00147         }
00148         p++;
00149     }
00150 
00151     return FALSE;
00152 }
00153 
00154