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

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

E-mail: