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

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

E-mail: