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