1 /*
2 ** Zabbix
3 ** Copyright (C) 2001-2021 Zabbix SIA
4 **
5 ** This program is free software; you can redistribute it and/or modify
6 ** it under the terms of the GNU General Public License as published by
7 ** the Free Software Foundation; either version 2 of the License, or
8 ** (at your option) any later version.
9 **
10 ** This program is distributed in the hope that it will be useful,
11 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
12 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 ** GNU General Public License for more details.
14 **
15 ** You should have received a copy of the GNU General Public License
16 ** along with this program; if not, write to the Free Software
17 ** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
18 **/
19 
20 #ifndef ZABBIX_COMMS_H
21 #define ZABBIX_COMMS_H
22 
23 #ifdef _WINDOWS
24 #	if defined(__INT_MAX__) && __INT_MAX__ == 2147483647
25 typedef int	ssize_t;
26 #	else
27 typedef long	ssize_t;
28 #	endif
29 #endif
30 
31 #ifdef _WINDOWS
32 #	define ZBX_TCP_WRITE(s, b, bl)	((ssize_t)send((s), (b), (bl), 0))
33 #	define ZBX_TCP_READ(s, b, bl)	((ssize_t)recv((s), (b), (bl), 0))
34 #	define zbx_socket_close(s)	if (ZBX_SOCKET_ERROR != (s)) closesocket(s)
35 #	define zbx_socket_last_error()	WSAGetLastError()
36 
37 #	define ZBX_PROTO_AGAIN		WSAEINTR
38 #	define ZBX_PROTO_ERROR		SOCKET_ERROR
39 #	define ZBX_SOCKET_ERROR		INVALID_SOCKET
40 #	define ZBX_SOCKET_TO_INT(s)	((int)(s))
41 #else
42 #	define ZBX_TCP_WRITE(s, b, bl)	((ssize_t)write((s), (b), (bl)))
43 #	define ZBX_TCP_READ(s, b, bl)	((ssize_t)read((s), (b), (bl)))
44 #	define zbx_socket_close(s)	if (ZBX_SOCKET_ERROR != (s)) close(s)
45 #	define zbx_socket_last_error()	errno
46 
47 #	define ZBX_PROTO_AGAIN		EINTR
48 #	define ZBX_PROTO_ERROR		-1
49 #	define ZBX_SOCKET_ERROR		-1
50 #	define ZBX_SOCKET_TO_INT(s)	(s)
51 #endif
52 
53 #ifdef _WINDOWS
54 typedef SOCKET	ZBX_SOCKET;
55 #else
56 typedef int	ZBX_SOCKET;
57 #endif
58 
59 #if defined(HAVE_IPV6)
60 #	define ZBX_SOCKADDR struct sockaddr_storage
61 #else
62 #	define ZBX_SOCKADDR struct sockaddr_in
63 #endif
64 
65 typedef enum
66 {
67 	ZBX_BUF_TYPE_STAT = 0,
68 	ZBX_BUF_TYPE_DYN
69 }
70 zbx_buf_type_t;
71 
72 #define ZBX_SOCKET_COUNT	256
73 #define ZBX_STAT_BUF_LEN	2048
74 
75 #if defined(HAVE_POLARSSL) || defined(HAVE_GNUTLS) || defined(HAVE_OPENSSL)
76 typedef struct zbx_tls_context	zbx_tls_context_t;
77 #endif
78 
79 typedef struct
80 {
81 	ZBX_SOCKET			socket;
82 	ZBX_SOCKET			socket_orig;
83 	size_t				read_bytes;
84 	char				*buffer;
85 	char				*next_line;
86 #if defined(HAVE_POLARSSL) || defined(HAVE_GNUTLS) || defined(HAVE_OPENSSL)
87 	zbx_tls_context_t		*tls_ctx;
88 #endif
89 	unsigned int 			connection_type;	/* type of connection actually established: */
90 								/* ZBX_TCP_SEC_UNENCRYPTED, ZBX_TCP_SEC_TLS_PSK or */
91 								/* ZBX_TCP_SEC_TLS_CERT */
92 	int				timeout;
93 	zbx_buf_type_t			buf_type;
94 	unsigned char			accepted;
95 	int				num_socks;
96 	ZBX_SOCKET			sockets[ZBX_SOCKET_COUNT];
97 	char				buf_stat[ZBX_STAT_BUF_LEN];
98 	ZBX_SOCKADDR			peer_info;		/* getpeername() result */
99 	/* Peer host DNS name or IP address for diagnostics (after TCP connection is established). */
100 	/* TLS connection may be shut down at any time and it will not be possible to get peer IP address anymore. */
101 	char				peer[MAX_ZBX_DNSNAME_LEN + 1];
102 }
103 zbx_socket_t;
104 
105 const char	*zbx_socket_strerror(void);
106 
107 #ifndef _WINDOWS
108 void	zbx_gethost_by_ip(const char *ip, char *host, size_t hostlen);
109 #endif
110 
111 int	zbx_tcp_connect(zbx_socket_t *s, const char *source_ip, const char *ip, unsigned short port, int timeout,
112 		unsigned int tls_connect, char *tls_arg1, char *tls_arg2);
113 
114 #define ZBX_TCP_PROTOCOL	0x01
115 
116 #define ZBX_TCP_SEC_UNENCRYPTED		1		/* do not use encryption with this socket */
117 #define ZBX_TCP_SEC_TLS_PSK		2		/* use TLS with pre-shared key (PSK) with this socket */
118 #define ZBX_TCP_SEC_TLS_CERT		4		/* use TLS with certificate with this socket */
119 #define ZBX_TCP_SEC_UNENCRYPTED_TXT	"unencrypted"
120 #define ZBX_TCP_SEC_TLS_PSK_TXT		"psk"
121 #define ZBX_TCP_SEC_TLS_CERT_TXT	"cert"
122 
123 const char	*zbx_tcp_connection_type_name(unsigned int type);
124 
125 #define zbx_tcp_send(s, d)				zbx_tcp_send_ext((s), (d), strlen(d), ZBX_TCP_PROTOCOL, 0)
126 #define zbx_tcp_send_to(s, d, timeout)			zbx_tcp_send_ext((s), (d), strlen(d), ZBX_TCP_PROTOCOL, timeout)
127 #define zbx_tcp_send_bytes_to(s, d, len, timeout)	zbx_tcp_send_ext((s), (d), len, ZBX_TCP_PROTOCOL, timeout)
128 #define zbx_tcp_send_raw(s, d)				zbx_tcp_send_ext((s), (d), strlen(d), 0, 0)
129 
130 int	zbx_tcp_send_ext(zbx_socket_t *s, const char *data, size_t len, unsigned char flags, int timeout);
131 
132 void	zbx_tcp_close(zbx_socket_t *s);
133 
134 #ifdef HAVE_IPV6
135 int	get_address_family(const char *addr, int *family, char *error, int max_error_len);
136 #endif
137 
138 int	zbx_tcp_listen(zbx_socket_t *s, const char *listen_ip, unsigned short listen_port);
139 
140 int	zbx_tcp_accept(zbx_socket_t *s, unsigned int tls_accept);
141 void	zbx_tcp_unaccept(zbx_socket_t *s);
142 
143 #define ZBX_TCP_READ_UNTIL_CLOSE 0x01
144 
145 #define	zbx_tcp_recv(s) 		SUCCEED_OR_FAIL(zbx_tcp_recv_ext(s, 0, 0))
146 #define	zbx_tcp_recv_to(s, timeout) 	SUCCEED_OR_FAIL(zbx_tcp_recv_ext(s, 0, timeout))
147 
148 ssize_t		zbx_tcp_recv_ext(zbx_socket_t *s, unsigned char flags, int timeout);
149 const char	*zbx_tcp_recv_line(zbx_socket_t *s);
150 
151 int	zbx_tcp_check_security(zbx_socket_t *s, const char *ip_list, int allow_if_empty);
152 
153 int	zbx_udp_connect(zbx_socket_t *s, const char *source_ip, const char *ip, unsigned short port, int timeout);
154 int	zbx_udp_send(zbx_socket_t *s, const char *data, size_t data_len, int timeout);
155 int	zbx_udp_recv(zbx_socket_t *s, int timeout);
156 void	zbx_udp_close(zbx_socket_t *s);
157 
158 #define ZBX_DEFAULT_FTP_PORT		21
159 #define ZBX_DEFAULT_SSH_PORT		22
160 #define ZBX_DEFAULT_TELNET_PORT		23
161 #define ZBX_DEFAULT_SMTP_PORT		25
162 #define ZBX_DEFAULT_DNS_PORT		53
163 #define ZBX_DEFAULT_HTTP_PORT		80
164 #define ZBX_DEFAULT_POP_PORT		110
165 #define ZBX_DEFAULT_NNTP_PORT		119
166 #define ZBX_DEFAULT_NTP_PORT		123
167 #define ZBX_DEFAULT_IMAP_PORT		143
168 #define ZBX_DEFAULT_LDAP_PORT		389
169 #define ZBX_DEFAULT_HTTPS_PORT		443
170 #define ZBX_DEFAULT_AGENT_PORT		10050
171 #define ZBX_DEFAULT_SERVER_PORT		10051
172 #define ZBX_DEFAULT_GATEWAY_PORT	10052
173 
174 #define ZBX_DEFAULT_AGENT_PORT_STR	"10050"
175 #define ZBX_DEFAULT_SERVER_PORT_STR	"10051"
176 
177 int	zbx_send_response_ext(zbx_socket_t *sock, int result, const char *info, int protocol, int timeout);
178 
179 #define zbx_send_response(sock, result, info, timeout) \
180 		zbx_send_response_ext(sock, result, info, ZBX_TCP_PROTOCOL, timeout)
181 
182 #define zbx_send_response_raw(sock, result, info, timeout) \
183 		zbx_send_response_ext(sock, result, info, 0, timeout)
184 
185 int	zbx_recv_response(zbx_socket_t *sock, int timeout, char **error);
186 
187 #ifdef HAVE_IPV6
188 #	define zbx_getnameinfo(sa, host, hostlen, serv, servlen, flags)		\
189 			getnameinfo(sa, AF_INET == (sa)->sa_family ?		\
190 					sizeof(struct sockaddr_in) :		\
191 					sizeof(struct sockaddr_in6),		\
192 					host, hostlen, serv, servlen, flags)
193 #endif
194 
195 #endif
196