|
|
1.1 paf 1: /** @file
2: Parser: SMTP sender impl.
3:
4: Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com)
1.4 ! parser 5: Author: Alexander Petrosyan <paf@design.ru> (http://design.ru/paf)
1.1 paf 6:
1.4 ! parser 7: $Id: $
1.1 paf 8: */
9:
10: #include <winsock.h>
11:
12: #include "smtp.h"
13:
14: // ---------------------------------------------------------------------------
15: int SMTP::
1.2 paf 16: IsAddressARawIpaddress(const char * string)
1.1 paf 17: {
18: while( *string )
19: {
20: if( !isdigit(*string) )
21: {
22: return 0;
23: }
24: string++;
25: }
26: return 1;
27: }
28:
29: //---------------------------------------------------------------------------
30: int SMTP::
1.2 paf 31: ResolveService(const char* service, int *our_port)
1.1 paf 32: {
33: struct servent FAR *serventry = NULL;
34: int retval = 0;
35:
36: if( IsAddressARawIpaddress(service) )
37: {
38: char * tail;
39:
40: *our_port = (int)strtol(service, &tail, 10);
41:
42: if( tail == service )
43: {
44: return WSAEPROTONOSUPPORT;
45: }
46: else
47: {
48: *our_port = htons(*our_port);
49: }
50: }
51: else
52: {
53: serventry = getservbyname(service, (LPSTR)"tcp");
54:
55: if( serventry )
56: *our_port = serventry->s_port;
57: else
58: {
59: retval = WSAGetLastError();
60: if( (retval == WSANO_DATA) || (retval == WSANO_RECOVERY) )
61: {
62: return WSAEPROTONOSUPPORT;
63: }
64: else
65: {
66: return (retval - 5000);
67: }
68: }
69: }
70:
71: return 0;
72: }
73:
74: //---------------------------------------------------------------------------
75: int SMTP::
1.2 paf 76: ResolveHostname(const char* hostname, struct sockaddr_in *sa_in)
1.1 paf 77: {
78: struct hostent FAR *hostentry = NULL;
79: unsigned long ip_address;
80:
81: if( (ip_address = inet_addr(hostname)) != INADDR_NONE )
82: {
83: sa_in->sin_addr.s_addr = ip_address;
84: }
85: else
86: {
87: if( (hostentry = gethostbyname(hostname)) == NULL )
88: {
89: return WSAHOST_NOT_FOUND;
90: }
91:
92: sa_in->sin_addr.s_addr = *(long far *)hostentry->h_addr;
93: }
94:
95: return 0;
96: }
97:
98: //---------------------------------------------------------------------------
99: int SMTP::
100: GetAndSetTheSocket(SOCKET *the_socket)
101: {
102: int not = 0;
103:
104: if( INVALID_SOCKET == (*the_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP/*был 0, вложенно не работал*/)) )
105: {
106: //return h_errno;
107: return WSAESOCKTNOSUPPORT;
108: }
109:
110: setsockopt(*the_socket, SOL_SOCKET, SO_DONTLINGER, (char *)¬, sizeof(not));
111:
112: return 0;
113: }
114:
115: //---------------------------------------------------------------------------
116: int SMTP::
117: GetConnection(SOCKET the_socket, struct sockaddr_in *sa_in)
118: {
119: int retval = 0;
1.2 paf 120: //char message[512];
1.1 paf 121:
122: if( SOCKET_ERROR == connect(the_socket,
123: (struct sockaddr *)sa_in,
124: sizeof(struct sockaddr_in) )
125: )
126: {
127: switch( (retval = WSAGetLastError()) )
128: {
129: case WSAEWOULDBLOCK:
130: break;
131:
132: case WSAECONNREFUSED:
133: return WSAECONNREFUSED;
134:
135: default:
1.2 paf 136: //wsprintf(message, "unexpected error %d from winsock\n", retval);
137: //ShowError(message);
1.1 paf 138: return WSAHOST_NOT_FOUND;
139: }
140: }
141:
142: return 0;
143: }
144:
145: //---------------------------------------------------------------------------
146: void SMTP::
147: MiscSocketSetup(SOCKET soc, fd_set *fds, struct timeval *timeout)
148: {
149: unsigned long ioctl_blocking = 1;
150:
151: ioctlsocket(soc, FIONBIO, &ioctl_blocking);
152:
153: FD_ZERO(fds);
154: FD_SET(soc, fds);
155:
156: timeout->tv_sec = 30;
157: timeout->tv_usec = 0;
158: }
159:
160: //---------------------------------------------------------------------------