Annotation of parser3/src/lib/smtp/comms.C, revision 1.1
1.1 ! paf 1: /** @file
! 2: Parser: SMTP sender impl.
! 3:
! 4: Copyright (c) 2001-2003 ArtLebedev Group (http://www.artlebedev.com)
! 5: Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru)
! 6: */
! 7:
! 8: static const char * const IDENT_COMMS_C="$Date: 2003/11/20 16:34:24 $";
! 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 *)¬, 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: