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 *)¬, 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: