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

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

E-mail: