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