Annotation of parser3/src/classes/smtp/comms.C, revision 1.1

1.1     ! paf         1: /** @file
        !             2:        Parser: SMTP sender impl.
        !             3: 
        !             4:        Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com)
        !             5: 
        !             6:        Author: Alexander Petrosyan <paf@design.ru> (http://design.ru/paf)
        !             7: 
        !             8:        $Id: mail.C,v 1.3 2001/04/07 12:13:13 paf Exp $
        !             9: */
        !            10: 
        !            11: #include <winsock.h>
        !            12: 
        !            13: #include "smtp.h"
        !            14: 
        !            15: // ---------------------------------------------------------------------------
        !            16: 
        !            17: // ---------------------------------------------------------------------------
        !            18: void SMTP:: 
        !            19: ShowError(char * message)
        !            20: {
        !            21:     OutputDebugString (message);
        !            22: }
        !            23: 
        !            24: // ---------------------------------------------------------------------------
        !            25: int SMTP:: 
        !            26: IsAddressARawIpaddress(char * string)
        !            27: {
        !            28:     while( *string ) 
        !            29:     {
        !            30:         if( !isdigit(*string) ) 
        !            31:         {
        !            32:             return 0;
        !            33:         }
        !            34:         string++;
        !            35:     }
        !            36:     return 1;
        !            37: }
        !            38: 
        !            39: //---------------------------------------------------------------------------
        !            40: int SMTP:: 
        !            41: ResolveService(char* service, int *our_port)
        !            42: {
        !            43:     struct servent FAR  *serventry = NULL;
        !            44:     int                 retval = 0;
        !            45: 
        !            46:     if( IsAddressARawIpaddress(service) ) 
        !            47:     {
        !            48:         char * tail;
        !            49: 
        !            50:         *our_port = (int)strtol(service, &tail, 10);
        !            51:         
        !            52:         if( tail == service ) 
        !            53:         {
        !            54:             return WSAEPROTONOSUPPORT;
        !            55:         } 
        !            56:         else 
        !            57:         {
        !            58:             *our_port = htons(*our_port);
        !            59:         }
        !            60:     } 
        !            61:     else 
        !            62:     {
        !            63:         serventry = getservbyname(service, (LPSTR)"tcp");
        !            64:     
        !            65:         if( serventry )
        !            66:             *our_port = serventry->s_port;
        !            67:         else 
        !            68:         {
        !            69:             retval = WSAGetLastError();
        !            70:             if( (retval == WSANO_DATA) || (retval == WSANO_RECOVERY) ) 
        !            71:             {
        !            72:                 return WSAEPROTONOSUPPORT;
        !            73:             } 
        !            74:             else 
        !            75:             {
        !            76:                    return (retval - 5000);
        !            77:             }
        !            78:         }
        !            79:     }
        !            80: 
        !            81:     return 0;
        !            82: }
        !            83: 
        !            84: //---------------------------------------------------------------------------
        !            85: int SMTP:: 
        !            86: ResolveHostname(char* hostname, struct sockaddr_in *sa_in)
        !            87: {
        !            88:     struct hostent FAR *hostentry = NULL;
        !            89:     unsigned long          ip_address;
        !            90: 
        !            91:     if( (ip_address = inet_addr(hostname)) != INADDR_NONE ) 
        !            92:     {
        !            93:         sa_in->sin_addr.s_addr = ip_address;
        !            94:     }
        !            95:     else 
        !            96:     {
        !            97:         if( (hostentry = gethostbyname(hostname)) == NULL ) 
        !            98:         {
        !            99:             return WSAHOST_NOT_FOUND;
        !           100:         }
        !           101: 
        !           102:         sa_in->sin_addr.s_addr = *(long far *)hostentry->h_addr;
        !           103:     }
        !           104: 
        !           105:     return 0;
        !           106: }
        !           107: 
        !           108: //---------------------------------------------------------------------------
        !           109: int SMTP:: 
        !           110: GetAndSetTheSocket(SOCKET *the_socket)
        !           111: {
        !           112:     int not = 0;
        !           113: 
        !           114:     if( INVALID_SOCKET == (*the_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP/*был 0, вложенно не работал*/)) )
        !           115:     {
        !           116:                //return h_errno;
        !           117:                return WSAESOCKTNOSUPPORT;
        !           118:     }
        !           119: 
        !           120:     setsockopt(*the_socket, SOL_SOCKET, SO_DONTLINGER, (char *)&not, sizeof(not));
        !           121: 
        !           122:     return 0;
        !           123: }
        !           124: 
        !           125: //---------------------------------------------------------------------------
        !           126: int SMTP:: 
        !           127: GetConnection(SOCKET the_socket, struct sockaddr_in *sa_in)
        !           128: {
        !           129:     int     retval = 0;
        !           130:     char    message[512];
        !           131: 
        !           132:     if( SOCKET_ERROR == connect(the_socket,
        !           133:                                            (struct sockaddr *)sa_in,
        !           134:                                            sizeof(struct sockaddr_in) )
        !           135:       ) 
        !           136:     {
        !           137:         switch( (retval = WSAGetLastError()) )
        !           138:         {
        !           139:             case WSAEWOULDBLOCK:
        !           140:                 break;
        !           141: 
        !           142:             case WSAECONNREFUSED:
        !           143:                 return WSAECONNREFUSED;
        !           144: 
        !           145:             default:
        !           146:                 wsprintf(message, "unexpected error %d from winsock\n", retval);
        !           147:                 ShowError(message);
        !           148:                 return WSAHOST_NOT_FOUND;
        !           149:         }
        !           150:     }
        !           151: 
        !           152:     return 0;
        !           153: }
        !           154: 
        !           155: //---------------------------------------------------------------------------
        !           156: void SMTP:: 
        !           157: MiscSocketSetup(SOCKET soc, fd_set *fds, struct timeval *timeout)
        !           158: {
        !           159:     unsigned long   ioctl_blocking = 1;
        !           160: 
        !           161:     ioctlsocket(soc, FIONBIO, &ioctl_blocking);
        !           162: 
        !           163:     FD_ZERO(fds);
        !           164:     FD_SET(soc, fds);
        !           165: 
        !           166:     timeout->tv_sec = 30;
        !           167:     timeout->tv_usec = 0;
        !           168: }
        !           169: 
        !           170: //---------------------------------------------------------------------------

E-mail: