Пример #1
0
u32 mai_save_file(struct sk_buff* skb,cam_session_context_2_t* sc, u8* start, u32 len,u32 protocol_id)
{
    u32 err_id = ERROR_SUCCESS;
    mpsa_ac_result_s* mail_ac_search_result = mail_get_ac_result_data();
    u32 mail_search_result_count = mail_get_ac_result_num();
    u64 sessionid   = 0;
    u32 end_offset  = 0;
    u32 end_ac_len  = 0;
    u32 length      = 0;
    u32 index       = 0;
	(void)skb;

    err_id = cam_get_logic_id_2(sc, e_mail_keyid_session_id_index, &sessionid);
    if(ERROR_SUCCESS != err_id)
    {
        MAIL_DEBUG(MAIL_DEBUG_SWITCH, "cam_get_logic_id_2 in mai_save_file\n");
        return err_id;
    }
   
    err_id = cam_get_content_len_and_ac_res_slice(mail_ac_search_result, mail_search_result_count, &index, 
                                                AC_SIGNATURE_MAIL_END, &end_offset, &end_ac_len);
    if(ERROR_SUCCESS != err_id)
    {
        length = len;
    }
    else
    {   
        if (end_offset <= end_ac_len)
        {
            return ERROR_SUCCESS;
        }
        length = end_offset - end_ac_len;
        MAIL_DEBUG(MAIL_DEBUG_SWITCH, "else length in mai_save_file = %d\n",length);
    }
    if(0 != length)
    {
        err_id = cam_send_data_2(sc, sessionid, protocol_id, CAM_TYPE_MIDDLE, (char*)start, length,NULL);
    }
   
    return err_id;
}
Пример #2
0
u32 mail_audit_process(struct sk_buff * skb,cam_session_context_2_t* sc,u8* start,u32 len)
{
    u32 err_id = ERROR_SUCCESS;
    u32 i;
    mpsa_ac_result_s* ac_result;
    u32 is_save = cam_check_save_file_flag(skb);
    u32 result_count;
    u32 protocol_id;
	u64 sessionid = 0;
    u32 log_type = CAM_LOG_TYPE_CONTENT;
    u32 data_type = CAM_TYPE_END;
	spam_priv_s *spam_priv = NULL;
    
    ac_result = mail_get_ac_result_data();
    result_count = mail_get_ac_result_num();

    protocol_id = dcdm_get_top_proto();
	
    MAIL_DEBUG(MAIL_DEBUG_SWITCH,"mail_audit_processs sc->flag=%d,sc->client_ip=%d\n",sc->flag,sc->client_ip);

    if(sc->flag == MAIL_PASSWORD)
    {
        if(sc->item[e_mail_keyid_passwd_index] == NULL && skb_get_dse_dir(skb) == DSESSION_DIR_CLIENT)
        {
            cam_process_item_common_2(sc, start, len, e_mail_keyid_passwd_index, e_cam_mail_password_id, CAM_ITEM_NOT_KEEP, 0);    
        }
        sc->flag = MAIL_END;
        goto err_list;
    }
    else if(sc->flag == MAIL_START && CAM_SAVE_FILE_YES == is_save)
    {
		if( protocol_id != DCDM_PROTOCOL_SMTP_ID || skb_get_dse_dir(skb) != DSESSION_DIR_SERVER )
		{
			err_id = mai_save_file(skb, sc, start, len,protocol_id);
			if(err_id != ERROR_SUCCESS)
			{
			   goto err_list;
			}
		}
    }
    
    for(i=0;i<result_count;i++)
    {
        switch(ac_result[i].id)
        {
            case AC_SIGNATURE_MAIL_PASSWORD_START:
                if(sc->item[e_mail_keyid_passwd_index] == NULL && skb_get_dse_dir(skb) == DSESSION_DIR_SERVER)
                {
                    sc->flag = MAIL_PASSWORD;
                }
                break;
            case AC_SIGNATURE_SMTP_DATA:
            case AC_SIGNATURE_POP3_RETR:
                if((skb_get_dse_dir(skb) == DSESSION_DIR_CLIENT) && sc->flag == MAIL_END)
                {
                    MAIL_DEBUG(MAIL_DEBUG_SWITCH,"AC_SIGNATURE_SMTP_DATA\n");
                    if(CAM_SAVE_FILE_YES == is_save)
                    {
                        err_id = mail_create_file(skb,sc,start,protocol_id);
                        
                        if(err_id != ERROR_SUCCESS)
                        {
                           MAIL_DEBUG(MAIL_DEBUG_SWITCH,"mail_create_file\n");
                           goto err_list;
                        }
                    }
                    sc->flag = MAIL_START;
                }
                break;
            case AC_SIGNATURE_SMTP_REV:
                if((skb_get_dse_dir(skb) == DSESSION_DIR_CLIENT) && sc->flag == MAIL_END)
                {
                    MAIL_DEBUG(MAIL_DEBUG_SWITCH,"AC_SIGNATURE_SMTP_REV\n");
                    if(len <= (u32)(ac_result[i].end) + 2)
                    {
                        goto err_list;
                    }
                    err_id = smtp_save_rev_item(sc,start,len,(u32)(ac_result[i].end)); 
                    if(err_id != ERROR_SUCCESS)
                    {
                       goto err_list;
                    }
                    if(sc->item[e_mail_keyid_username_index] != NULL)
                    {
                        if((sc->item[e_mail_keyid_username_index]->len + (len - (u32)(ac_result[i].end)-2)) < MAIL_RCPT_MAX_LEN)
                        {
                            err_id = cam_add_item_data(sc->item[e_mail_keyid_username_index], start + (u32)(ac_result[i].end), (len - (u32)(ac_result[i].end)-2),0);
                            if(err_id != ERROR_SUCCESS)
                            {
                               goto err_list;
                            }
                        }
                    }
                    err_id = cam_process_item_common_2(sc, start + (u32)(ac_result[i].end), (len - (u32)(ac_result[i].end)-2), e_mail_keyid_username_index, e_cam_mail_rcpt_to, CAM_ITEM_NOT_KEEP, CAM_ITEM_COMPLETE);
                    if(err_id != ERROR_SUCCESS)
                    {
                       goto err_list;
                    }
                    
                }
                break;
            case AC_SIGNATURE_MAIL_END:
                if(sc->flag == MAIL_START)
                {
                     spam_priv = dse_priv_info_get(g_spam_policy_handle, skb_get_dse(skb));
                     if(spam_priv != NULL && SPAM_CHECK_FLAG(spam_priv->total_flag, SPAM_BLOCK_DELAY_AUDIT))
                     {
                         log_type = CAM_LOG_TYPE_WAIT_AUDIT;
                         data_type = CAM_TYPE_DELAY;
                     }
                     MAIL_DEBUG(MAIL_DEBUG_SWITCH,"AC_SIGNATURE_MAIL_END\n");
					 if(sc->client_ip != e_app_filter_block || log_type == CAM_LOG_TYPE_WAIT_AUDIT)
					 {
	                     err_id = mai_send_log(sc,protocol_id,log_type);
	                     if(err_id != ERROR_SUCCESS)
	                     {
	                        MAIL_DEBUG(MAIL_DEBUG_SWITCH,"mai_send_log\n");
	                        goto err_list;
	                     }
					 }
					 err_id = cam_get_logic_id_2(sc, e_mail_keyid_session_id_index, &sessionid);
					 if(ERROR_SUCCESS != err_id)
					 {
					     MAIL_DEBUG(MAIL_DEBUG_SWITCH, "cam_get_logic_id_2 in mai_save_file\n");
				  	     return err_id;
				 	 }
                     if(CAM_SAVE_FILE_YES == is_save)
                     {
                         err_id = cam_send_data_2(sc, sessionid, protocol_id, data_type, NULL, 0, NULL);
                     }
                     sc->flag = MAIL_END;
                 }
                break;
            default:
                break;
        }
    }
    err_list:
    return err_id;    
}
Пример #3
0
/* OS_Sendmail v0.1: 2005/03/18
 */
int OS_Sendmail(MailConfig *mail, struct tm *p)
{
    int socket,i=0;
    char *msg;
    char snd_msg[128];
    char additional_to[512];

    MailNode *mailmsg;

    additional_to[0] = '\0';
    
    /* If there is no sms message, we attempt to get from the
     * email list.
     */
    mailmsg = OS_PopLastMail();

    if(mailmsg == NULL)
    {
        merror("%s: No email to be sent. Inconsistent state.",ARGV0);
    }
    

    /* Connecting to the smtp server */	
    socket = OS_ConnectTCP(SMTP_DEFAULT_PORT, mail->smtpserver);
    if(socket < 0)
    {
        return(socket);
    }


    /* Receiving the banner */
    msg = OS_RecvTCP(socket, OS_SIZE_1024);
    if((msg == NULL)||(!OS_Match(VALIDBANNER, msg)))
    {
        merror(BANNER_ERROR);
        if(msg)
            free(msg);
        close(socket);
        return(OS_INVALID);	
    }
    MAIL_DEBUG("DEBUG: Received banner: '%s' %s", msg, "");
    free(msg);



    /* Sending HELO message */
    OS_SendTCP(socket,HELOMSG);
    msg = OS_RecvTCP(socket, OS_SIZE_1024);
    if((msg == NULL)||(!OS_Match(VALIDMAIL, msg)))
    {
        if(msg)
        {
            /* Ugly fix warning :) */
            /* In some cases (with virus scans in the middle)
             * we may get two banners. Check for that in here.
             */
            if(OS_Match(VALIDBANNER, msg))
            {
                free(msg);

                /* Try again */
                msg = OS_RecvTCP(socket, OS_SIZE_1024);
                if((msg == NULL)||(!OS_Match(VALIDMAIL, msg)))
                {
                    merror("%s:%s",HELO_ERROR,msg!= NULL?msg:"null");
                    if(msg)
                        free(msg);
                    close(socket);
                    return(OS_INVALID);    
                }
            }
            else
            {
                merror("%s:%s",HELO_ERROR,msg);
                free(msg);
                close(socket);
                return(OS_INVALID);
            }
        }
        else
        {
            merror("%s:%s",HELO_ERROR,"null");
            close(socket);
            return(OS_INVALID);
        }
    }

    MAIL_DEBUG("DEBUG: Sent '%s', received: '%s'", HELOMSG, msg);
    free(msg);	


    /* Building "Mail from" msg */
    memset(snd_msg,'\0',128);
    snprintf(snd_msg,127, MAILFROM, mail->from);
    OS_SendTCP(socket, snd_msg);
    msg = OS_RecvTCP(socket, OS_SIZE_1024);
    if((msg == NULL)||(!OS_Match(VALIDMAIL, msg)))
    {
        merror(FROM_ERROR);
        if(msg)
            free(msg);
        close(socket);
        return(OS_INVALID);	
    }
    MAIL_DEBUG("DEBUG: Sent '%s', received: '%s'", snd_msg, msg);
    free(msg);	


    /* Building "RCPT TO" msg */
    while(1)
    {
        if(mail->to[i] == NULL)
        {
            if(i == 0)
            {
                merror(INTERNAL_ERROR);
                close(socket);
                return(OS_INVALID);
            }
            break;
        }
        memset(snd_msg,'\0',128);
        snprintf(snd_msg,127,RCPTTO, mail->to[i++]);
        OS_SendTCP(socket,snd_msg);
        msg = OS_RecvTCP(socket, OS_SIZE_1024);
        if((msg == NULL)||(!OS_Match(VALIDMAIL, msg)))
        {
            merror(TO_ERROR, mail->to[i -1]);
            if(msg)
                free(msg);
            close(socket);
            return(OS_INVALID);	
        }
        MAIL_DEBUG("DEBUG: Sent '%s', received: '%s'", snd_msg, msg);
        free(msg);
    }


    /* Additional RCPT to */
    if(mail->gran_to)
    {
        i = 0;
        while(mail->gran_to[i] != NULL)
        {
            if(mail->gran_set[i] != FULL_FORMAT)
            {
                i++;
                continue;
            }

            memset(snd_msg,'\0',128);
            snprintf(snd_msg,127,RCPTTO, mail->gran_to[i]);
            OS_SendTCP(socket,snd_msg);
            msg = OS_RecvTCP(socket, OS_SIZE_1024);
            if((msg == NULL)||(!OS_Match(VALIDMAIL, msg)))
            {
                merror(TO_ERROR, mail->gran_to[i]);
                if(msg)
                    free(msg);

                i++;
                continue;    
            }
            
            MAIL_DEBUG("DEBUG: Sent '%s', received: '%s'", snd_msg, msg);
            free(msg);
            i++;
            continue;
        }
    }


    /* Sending the "DATA" msg */
    OS_SendTCP(socket,DATAMSG);
    msg = OS_RecvTCP(socket, OS_SIZE_1024);
    if((msg == NULL)||(!OS_Match(VALIDDATA, msg)))
    {
        merror(DATA_ERROR);
        if(msg)
            free(msg);
        close(socket);
        return(OS_INVALID);	
    }
    MAIL_DEBUG("DEBUG: Sent '%s', received: '%s'", DATAMSG, msg);
    free(msg);


    /* Building "From" and "To" in the e-mail header */
    memset(snd_msg,'\0',128);
    snprintf(snd_msg,127, TO, mail->to[0]);
    OS_SendTCP(socket, snd_msg);

    memset(snd_msg,'\0',128);
    snprintf(snd_msg,127, FROM, mail->from);
    OS_SendTCP(socket, snd_msg);


    /* Adding CCs */
    if(mail->to[1])
    {
        i = 1;
        while(1)
        {
            if(mail->to[i] == NULL)
            {
                break;
            }
            
            memset(snd_msg,'\0',128);
            snprintf(snd_msg,127, TO, mail->to[i]);
            OS_SendTCP(socket,snd_msg);

            i++;
        }
    }


    /* More CCs - from granular options */
    if(mail->gran_to)
    {
        i = 0;
        while(mail->gran_to[i] != NULL)
        {
            if(mail->gran_set[i] != FULL_FORMAT)
            {
                i++;
                continue;
            }

            memset(snd_msg,'\0',128);
            snprintf(snd_msg,127, TO, mail->gran_to[i]);
            OS_SendTCP(socket, snd_msg);
            i++;
            continue;
        }
    }


    /* Sending date */
    memset(snd_msg,'\0',128);


    /* Solaris doesn't have the "%z", so we set the timezone to 0. */
    #ifdef SOLARIS
    strftime(snd_msg, 127, "Date: %a, %d %b %Y %T -0000\r\n",p);
    #else
    strftime(snd_msg, 127, "Date: %a, %d %b %Y %T %z\r\n",p);
    #endif
                            
    OS_SendTCP(socket,snd_msg);


    /* Sending subject */
    memset(snd_msg,'\0',128);


    /* Checking if global subject is available */
    if((_g_subject_level != 0) && (_g_subject[0] != '\0'))
    {
        snprintf(snd_msg, 127, SUBJECT, _g_subject);	

        /* Clearing global values */
        _g_subject[0] = '\0';
        _g_subject_level = 0;
    }
    else
    {
        snprintf(snd_msg, 127, SUBJECT, mailmsg->mail->subject);
    }
    OS_SendTCP(socket,snd_msg);



    /* Sending body */

    /* Sending multiple emails together if we have to */
    do
    {
        OS_SendTCP(socket, mailmsg->mail->body);
        mailmsg = OS_PopLastMail();
    }while(mailmsg);


    /* Sending end of data \r\n.\r\n */
    OS_SendTCP(socket,ENDDATA);	
    msg = OS_RecvTCP(socket, OS_SIZE_1024);
    if(mail->strict_checking && ((msg == NULL)||(!OS_Match(VALIDMAIL, msg))))
    {
        merror(END_DATA_ERROR);
        if(msg)
            free(msg);
        close(socket);
        return(OS_INVALID);	
    }
    /* Checking msg in here, since it may be null */
    if(msg)
        free(msg);


    /* quitting and closing socket */
    OS_SendTCP(socket,QUITMSG);
    msg = OS_RecvTCP(socket, OS_SIZE_1024);

    if(msg)
        free(msg);

    memset(snd_msg,'\0',128);	


    /* Returning 0 (success) */
    close(socket);

    return(0);
}
Пример #4
0
/* OS_Sendsms.
 */
int OS_Sendsms(MailConfig *mail, struct tm *p, MailMsg *sms_msg)
{
    int socket, i = 0, final_to_sz;
    char *msg;
    char snd_msg[128];
    char final_to[512];


    /* Connecting to the smtp server */	
    socket = OS_ConnectTCP(SMTP_DEFAULT_PORT, mail->smtpserver);
    if(socket < 0)
    {
        return(socket);
    }


    /* Receiving the banner */
    msg = OS_RecvTCP(socket, OS_SIZE_1024);
    if((msg == NULL)||(!OS_Match(VALIDBANNER, msg)))
    {
        merror(BANNER_ERROR);
        if(msg)
            free(msg);
        close(socket);
        return(OS_INVALID);	
    }
    MAIL_DEBUG("DEBUG: Received banner: '%s' %s", msg, "");
    free(msg);



    /* Sending HELO message */
    OS_SendTCP(socket,HELOMSG);
    msg = OS_RecvTCP(socket, OS_SIZE_1024);
    if((msg == NULL)||(!OS_Match(VALIDMAIL, msg)))
    {
        if(msg)
        {
            /* Ugly fix warning :) */
            /* In some cases (with virus scans in the middle)
             * we may get two banners. Check for that in here.
             */
            if(OS_Match(VALIDBANNER, msg))
            {
                free(msg);

                /* Try again */
                msg = OS_RecvTCP(socket, OS_SIZE_1024);
                if((msg == NULL)||(!OS_Match(VALIDMAIL, msg)))
                {
                    merror("%s:%s",HELO_ERROR,msg!= NULL?msg:"null");
                    if(msg)
                        free(msg);
                    close(socket);
                    return(OS_INVALID);    
                }
            }
            else
            {
                merror("%s:%s",HELO_ERROR,msg);
                free(msg);
                close(socket);
                return(OS_INVALID);
            }
        }
        else
        {
            merror("%s:%s",HELO_ERROR,"null");
            close(socket);
            return(OS_INVALID);
        }
    }

    MAIL_DEBUG("DEBUG: Sent '%s', received: '%s'", HELOMSG, msg);
    free(msg);	


    /* Building "Mail from" msg */
    memset(snd_msg,'\0',128);
    snprintf(snd_msg,127, MAILFROM, mail->from);
    OS_SendTCP(socket, snd_msg);
    msg = OS_RecvTCP(socket, OS_SIZE_1024);
    if((msg == NULL)||(!OS_Match(VALIDMAIL, msg)))
    {
        merror(FROM_ERROR);
        if(msg)
            free(msg);
        close(socket);
        return(OS_INVALID);	
    }
    MAIL_DEBUG("DEBUG: Sent '%s', received: '%s'", snd_msg, msg);
    free(msg);	


    /* Additional RCPT to */
    final_to[0] = '\0';
    final_to_sz = sizeof(final_to) -2;
    
    if(mail->gran_to)
    {
        i = 0;
        while(mail->gran_to[i] != NULL)
        {
            if(mail->gran_set[i] != SMS_FORMAT)
            {
                i++;
                continue;
            }

            memset(snd_msg,'\0',128);
            snprintf(snd_msg,127, RCPTTO, mail->gran_to[i]);
            OS_SendTCP(socket, snd_msg);
            msg = OS_RecvTCP(socket, OS_SIZE_1024);
            if((msg == NULL)||(!OS_Match(VALIDMAIL, msg)))
            {
                merror(TO_ERROR, mail->gran_to[i]);
                if(msg)
                    free(msg);
                close(socket);
                return(OS_INVALID);
            }
            MAIL_DEBUG("DEBUG: Sent '%s', received: '%s'", snd_msg, msg);
            free(msg);


            /* Creating header for to */
            memset(snd_msg,'\0',128);
            snprintf(snd_msg,127, TO, mail->gran_to[i]);
            strncat(final_to, snd_msg, final_to_sz);
            final_to_sz -= strlen(snd_msg) +2;
            
            i++;
            continue;
        }
    }


    /* Sending the "DATA" msg */
    OS_SendTCP(socket,DATAMSG);
    msg = OS_RecvTCP(socket, OS_SIZE_1024);
    if((msg == NULL)||(!OS_Match(VALIDDATA, msg)))
    {
        merror(DATA_ERROR);
        if(msg)
            free(msg);
        close(socket);
        return(OS_INVALID);	
    }
    MAIL_DEBUG("DEBUG: Sent '%s', received: '%s'", DATAMSG, msg);
    free(msg);


    /* Building "From" and "To" in the e-mail header */
    OS_SendTCP(socket, final_to);


    memset(snd_msg,'\0',128);
    snprintf(snd_msg,127, FROM, mail->from);
    OS_SendTCP(socket, snd_msg);


    /* Sending date */
    memset(snd_msg,'\0',128);
    

    /* Solaris doesn't have the "%z", so we set the timezone to 0. */
    #ifdef SOLARIS
    strftime(snd_msg, 127, "Date: %a, %d %b %Y %T -0000\r\n",p);
    #else
    strftime(snd_msg, 127, "Date: %a, %d %b %Y %T %z\r\n",p);
    #endif
    
    OS_SendTCP(socket,snd_msg);


    /* Sending subject */
    memset(snd_msg,'\0',128);
    snprintf(snd_msg, 127, SUBJECT, sms_msg->subject);
    OS_SendTCP(socket,snd_msg);



    /* Sending body */
    OS_SendTCP(socket, sms_msg->body);


    /* Sending end of data \r\n.\r\n */
    OS_SendTCP(socket,ENDDATA);	
    msg = OS_RecvTCP(socket, OS_SIZE_1024);
    if(mail->strict_checking && ((msg == NULL)||(!OS_Match(VALIDMAIL, msg))))
    {
        merror(END_DATA_ERROR);
        if(msg)
            free(msg);
        close(socket);
        return(OS_INVALID);	
    }
    /* Checking msg in here, since it may be null */
    if(msg)
        free(msg);


    /* quitting and closing socket */
    OS_SendTCP(socket,QUITMSG);
    msg = OS_RecvTCP(socket, OS_SIZE_1024);

    if(msg)
        free(msg);

    memset(snd_msg,'\0',128);	


    /* Returning 0 (success) */
    close(socket);

    return(0);
}
Пример #5
0
/* OS_SendCustomEmail
 */
int OS_SendCustomEmail(char **to, char *subject, char *smtpserver, char *from, FILE *fp, struct tm *p)
{
    int socket,i = 0;
    char *msg;

    char snd_msg[128];
    char buffer[2049];

    buffer[2048] = '\0';


    /* Connecting to the smtp server */	
    socket = OS_ConnectTCP(SMTP_DEFAULT_PORT, smtpserver, 0);
    if(socket < 0)
    {
        return(socket);
    }


    /* Receiving the banner */
    msg = OS_RecvTCP(socket, OS_SIZE_1024);
    if((msg == NULL)||(!OS_Match(VALIDBANNER, msg)))
    {
        merror(BANNER_ERROR);
        if(msg)
            free(msg);
        close(socket);
        return(OS_INVALID);	
    }
    MAIL_DEBUG("DEBUG: Received banner: '%s' %s", msg, "");
    free(msg);



    /* Sending HELO message */
    OS_SendTCP(socket,HELOMSG);
    msg = OS_RecvTCP(socket, OS_SIZE_1024);
    if((msg == NULL)||(!OS_Match(VALIDMAIL, msg)))
    {
        if(msg)
        {
            /* Ugly fix warning :) */
            /* In some cases (with virus scans in the middle)
             * we may get two banners. Check for that in here.
             */
            if(OS_Match(VALIDBANNER, msg))
            {
                free(msg);

                /* Try again */
                msg = OS_RecvTCP(socket, OS_SIZE_1024);
                if((msg == NULL)||(!OS_Match(VALIDMAIL, msg)))
                {
                    merror("%s:%s",HELO_ERROR,msg!= NULL?msg:"null");
                    if(msg)
                        free(msg);
                    close(socket);
                    return(OS_INVALID);
                }
            }
            else
            {
                merror("%s:%s",HELO_ERROR,msg);
                free(msg);
                close(socket);
                return(OS_INVALID);
            }
        }
        else
        {
            merror("%s:%s",HELO_ERROR,"null");
            close(socket);
            return(OS_INVALID);
        }
    }

    MAIL_DEBUG("DEBUG: Sent '%s', received: '%s'", HELOMSG, msg);
    free(msg);	


    /* Building "Mail from" msg */
    memset(snd_msg,'\0',128);
    snprintf(snd_msg,127, MAILFROM, from);
    OS_SendTCP(socket, snd_msg);
    msg = OS_RecvTCP(socket, OS_SIZE_1024);
    if((msg == NULL)||(!OS_Match(VALIDMAIL, msg)))
    {
        merror(FROM_ERROR);
        if(msg)
            free(msg);
        close(socket);
        return(OS_INVALID);	
    }
    MAIL_DEBUG("DEBUG: Sent '%s', received: '%s'", snd_msg, msg);
    free(msg);	


    /* Building "RCPT TO" msg */
    while(to[i])
    {
        memset(snd_msg,'\0',128);
        snprintf(snd_msg,127,RCPTTO, to[i]);
        OS_SendTCP(socket,snd_msg);
        msg = OS_RecvTCP(socket, OS_SIZE_1024);
        if((msg == NULL)||(!OS_Match(VALIDMAIL, msg)))
        {
            merror(TO_ERROR, to[i]);
            if(msg)
                free(msg);
            close(socket);
            return(OS_INVALID);	
        }
        MAIL_DEBUG("DEBUG: Sent '%s', received: '%s'", snd_msg, msg);
        free(msg);

        i++;
    }


    /* Sending the "DATA" msg */
    OS_SendTCP(socket,DATAMSG);
    msg = OS_RecvTCP(socket, OS_SIZE_1024);
    if((msg == NULL)||(!OS_Match(VALIDDATA, msg)))
    {
        merror(DATA_ERROR);
        if(msg)
            free(msg);
        close(socket);
        return(OS_INVALID);	
    }
    MAIL_DEBUG("DEBUG: Sent '%s', received: '%s'", DATAMSG, msg);
    free(msg);


    /* Building "From" and "To" in the e-mail header */
    memset(snd_msg,'\0',128);
    snprintf(snd_msg,127, TO, to[0]);
    OS_SendTCP(socket, snd_msg);

    memset(snd_msg,'\0',128);
    snprintf(snd_msg,127, FROM, from);
    OS_SendTCP(socket, snd_msg);


    /* Adding CCs */
    if(to[1])
    {
        i = 1;
        while(1)
        {
            if(to[i] == NULL)
            {
                break;
            }

            memset(snd_msg,'\0',128);
            snprintf(snd_msg,127, TO, to[i]);
            OS_SendTCP(socket,snd_msg);

            i++;
        }
    }


    /* Sending date */
    memset(snd_msg,'\0',128);


    /* Solaris doesn't have the "%z", so we set the timezone to 0. */
    #ifdef SOLARIS
    strftime(snd_msg, 127, "Date: %a, %d %b %Y %T -0000\r\n",p);
    #else
    strftime(snd_msg, 127, "Date: %a, %d %b %Y %T %z\r\n",p);
    #endif

    OS_SendTCP(socket,snd_msg);


    /* Sending subject */
    memset(snd_msg, '\0', 128);
    snprintf(snd_msg, 127, SUBJECT, subject);

    OS_SendTCP(socket, snd_msg);

    OS_SendTCP(socket,ENDHEADER);


     /* Sending body */
     fseek(fp, 0, SEEK_SET);
     while(fgets(buffer, 2048, fp) != NULL)
     {
         OS_SendTCP(socket,buffer);
     }


    /* Sending end of data \r\n.\r\n */
    OS_SendTCP(socket,ENDDATA);	
    msg = OS_RecvTCP(socket, OS_SIZE_1024);


    /* Checking msg in here, since it may be null */
    if(msg)
        free(msg);


    /* quitting and closing socket */
    OS_SendTCP(socket,QUITMSG);
    msg = OS_RecvTCP(socket, OS_SIZE_1024);

    if(msg)
        free(msg);

    memset(snd_msg,'\0',128);	


    /* Returning 0 (success) */
    close(socket);

    return(0);
}