Annotation of parser3/src/lib/smtp/comms.C, revision 1.3
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.3 ! paf 8: static const char * const IDENT_COMMS_C="$Date: 2004/02/11 15:33:15 $";
1.1 paf 9:
10: #include "smtp.h"
11:
12: // ---------------------------------------------------------------------------
13: int SMTP::
14: IsAddressARawIpaddress(const char* string)
15: {
16: while( *string )
17: {
18: if( !isdigit(*string) )
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: {
1.3 ! paf 105: int _not = 0;
1.1 paf 106:
107: if( INVALID_SOCKET == (*the_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP/*был 0, вложенно не работал*/)) )
108: {
109: return WSAESOCKTNOSUPPORT;
110: }
111:
1.3 ! paf 112: setsockopt(*the_socket, SOL_SOCKET, SO_DONTLINGER, (char *)&_not, sizeof(_not));
1.1 paf 113:
114: return 0;
115: }
116:
117: //---------------------------------------------------------------------------
118: int SMTP::
119: GetConnection(SOCKET the_socket, struct sockaddr_in *sa_in)
120: {
121:
1.3 ! paf 122: if( connect(the_socket,
1.1 paf 123: (struct sockaddr *)sa_in,
1.3 ! paf 124: sizeof(struct sockaddr_in)<0 )
1.1 paf 125: )
126: {
1.3 ! paf 127: int retval = 0;
1.1 paf 128: switch( (retval = WSAGetLastError()) )
129: {
130: case WSAEWOULDBLOCK:
131: break;
132:
133: case WSAECONNREFUSED:
134: return WSAECONNREFUSED;
135:
136: default:
137: //wsprintf(message, "unexpected error %d from winsock\n", retval);
138: //ShowError(message);
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: {
1.3 ! paf 150: #ifdef FIONBIO
1.1 paf 151: unsigned long ioctl_blocking = 1;
152: ioctlsocket(soc, FIONBIO, &ioctl_blocking);
1.3 ! paf 153: #endif
1.1 paf 154:
155: FD_ZERO(fds);
156: FD_SET(soc, fds);
157:
158: timeout->tv_sec = 30;
159: timeout->tv_usec = 0;
160: }
161:
162: //---------------------------------------------------------------------------
E-mail: