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 #include "zbxtypes.h" 24 25 #ifdef _WINDOWS 26 # define ZBX_TCP_WRITE(s, b, bl) ((ssize_t)send((s), (b), (int)(bl), 0)) 27 # define ZBX_TCP_READ(s, b, bl) ((ssize_t)recv((s), (b), (int)(bl), 0)) 28 # define zbx_socket_close(s) if (ZBX_SOCKET_ERROR != (s)) closesocket(s) 29 # define zbx_socket_last_error() WSAGetLastError() 30 # define zbx_bind(s, a, l) (bind((s), (a), (int)(l))) 31 # define zbx_sendto(fd, b, n, f, a, l) (sendto((fd), (b), (int)(n), (f), (a), (l))) 32 33 # define ZBX_PROTO_AGAIN WSAEINTR 34 # define ZBX_PROTO_ERROR SOCKET_ERROR 35 # define ZBX_SOCKET_ERROR INVALID_SOCKET 36 # define ZBX_SOCKET_TO_INT(s) ((int)(s)) 37 #else 38 # define ZBX_TCP_WRITE(s, b, bl) ((ssize_t)write((s), (b), (bl))) 39 # define ZBX_TCP_READ(s, b, bl) ((ssize_t)read((s), (b), (bl))) 40 # define zbx_socket_close(s) if (ZBX_SOCKET_ERROR != (s)) close(s) 41 # define zbx_socket_last_error() errno 42 # define zbx_bind(s, a, l) (bind((s), (a), (l))) 43 # define zbx_sendto(fd, b, n, f, a, l) (sendto((fd), (b), (n), (f), (a), (l))) 44 45 # define ZBX_PROTO_AGAIN EINTR 46 # define ZBX_PROTO_ERROR -1 47 # define ZBX_SOCKET_ERROR -1 48 # define ZBX_SOCKET_TO_INT(s) (s) 49 #endif 50 51 #ifdef _WINDOWS 52 typedef SOCKET ZBX_SOCKET; 53 #else 54 typedef int ZBX_SOCKET; 55 #endif 56 57 #if defined(HAVE_IPV6) 58 # define ZBX_SOCKADDR struct sockaddr_storage 59 #else 60 # define ZBX_SOCKADDR struct sockaddr_in 61 #endif 62 63 typedef enum 64 { 65 ZBX_BUF_TYPE_STAT = 0, 66 ZBX_BUF_TYPE_DYN 67 } 68 zbx_buf_type_t; 69 70 #define ZBX_SOCKET_COUNT 256 71 #define ZBX_STAT_BUF_LEN 2048 72 73 #if defined(HAVE_GNUTLS) || defined(HAVE_OPENSSL) 74 typedef struct zbx_tls_context zbx_tls_context_t; 75 #endif 76 77 typedef struct 78 { 79 ZBX_SOCKET socket; 80 ZBX_SOCKET socket_orig; 81 size_t read_bytes; 82 char *buffer; 83 char *next_line; 84 #if defined(HAVE_GNUTLS) || defined(HAVE_OPENSSL) 85 zbx_tls_context_t *tls_ctx; 86 #endif 87 unsigned int connection_type; /* type of connection actually established: */ 88 /* ZBX_TCP_SEC_UNENCRYPTED, ZBX_TCP_SEC_TLS_PSK or */ 89 /* ZBX_TCP_SEC_TLS_CERT */ 90 int timeout; 91 zbx_buf_type_t buf_type; 92 unsigned char accepted; 93 int num_socks; 94 ZBX_SOCKET sockets[ZBX_SOCKET_COUNT]; 95 char buf_stat[ZBX_STAT_BUF_LEN]; 96 ZBX_SOCKADDR peer_info; /* getpeername() result */ 97 /* Peer host DNS name or IP address for diagnostics (after TCP connection is established). */ 98 /* TLS connection may be shut down at any time and it will not be possible to get peer IP address anymore. */ 99 char peer[MAX_ZBX_DNSNAME_LEN + 1]; 100 int protocol; 101 } 102 zbx_socket_t; 103 104 const char *zbx_socket_strerror(void); 105 106 #ifndef _WINDOWS 107 void zbx_gethost_by_ip(const char *ip, char *host, size_t hostlen); 108 void zbx_getip_by_host(const char *host, char *ip, size_t iplen); 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, const char *tls_arg1, const char *tls_arg2); 113 114 #define ZBX_TCP_PROTOCOL 0x01 115 #define ZBX_TCP_COMPRESS 0x02 116 #define ZBX_TCP_LARGE 0x04 117 118 #define ZBX_TCP_SEC_UNENCRYPTED 1 /* do not use encryption with this socket */ 119 #define ZBX_TCP_SEC_TLS_PSK 2 /* use TLS with pre-shared key (PSK) with this socket */ 120 #define ZBX_TCP_SEC_TLS_CERT 4 /* use TLS with certificate with this socket */ 121 #define ZBX_TCP_SEC_UNENCRYPTED_TXT "unencrypted" 122 #define ZBX_TCP_SEC_TLS_PSK_TXT "psk" 123 #define ZBX_TCP_SEC_TLS_CERT_TXT "cert" 124 125 const char *zbx_tcp_connection_type_name(unsigned int type); 126 127 #define zbx_tcp_send(s, d) zbx_tcp_send_ext((s), (d), strlen(d), 0, ZBX_TCP_PROTOCOL, 0) 128 #define zbx_tcp_send_to(s, d, timeout) zbx_tcp_send_ext((s), (d), strlen(d), 0, ZBX_TCP_PROTOCOL, timeout) 129 #define zbx_tcp_send_bytes_to(s, d, len, timeout) zbx_tcp_send_ext((s), (d), len, 0, ZBX_TCP_PROTOCOL, timeout) 130 #define zbx_tcp_send_raw(s, d) zbx_tcp_send_ext((s), (d), strlen(d), 0, 0, 0) 131 132 int zbx_tcp_send_ext(zbx_socket_t *s, const char *data, size_t len, size_t reserved, unsigned char flags, 133 int timeout); 134 135 void zbx_tcp_close(zbx_socket_t *s); 136 137 #ifdef HAVE_IPV6 138 int get_address_family(const char *addr, int *family, char *error, int max_error_len); 139 #endif 140 141 int zbx_tcp_listen(zbx_socket_t *s, const char *listen_ip, unsigned short listen_port); 142 143 int zbx_tcp_accept(zbx_socket_t *s, unsigned int tls_accept); 144 void zbx_tcp_unaccept(zbx_socket_t *s); 145 146 #define ZBX_TCP_READ_UNTIL_CLOSE 0x01 147 148 #define zbx_tcp_recv(s) SUCCEED_OR_FAIL(zbx_tcp_recv_ext(s, 0, 0)) 149 #define zbx_tcp_recv_large(s) SUCCEED_OR_FAIL(zbx_tcp_recv_ext(s, 0, ZBX_TCP_LARGE)) 150 #define zbx_tcp_recv_to(s, timeout) SUCCEED_OR_FAIL(zbx_tcp_recv_ext(s, timeout, 0)) 151 #define zbx_tcp_recv_raw(s) SUCCEED_OR_FAIL(zbx_tcp_recv_raw_ext(s, 0)) 152 153 ssize_t zbx_tcp_recv_ext(zbx_socket_t *s, int timeout, unsigned char flags); 154 ssize_t zbx_tcp_recv_raw_ext(zbx_socket_t *s, int timeout); 155 const char *zbx_tcp_recv_line(zbx_socket_t *s); 156 157 int zbx_validate_peer_list(const char *peer_list, char **error); 158 int zbx_tcp_check_allowed_peers(const zbx_socket_t *s, const char *peer_list); 159 160 int zbx_udp_connect(zbx_socket_t *s, const char *source_ip, const char *ip, unsigned short port, int timeout); 161 int zbx_udp_send(zbx_socket_t *s, const char *data, size_t data_len, int timeout); 162 int zbx_udp_recv(zbx_socket_t *s, int timeout); 163 void zbx_udp_close(zbx_socket_t *s); 164 165 #define ZBX_DEFAULT_FTP_PORT 21 166 #define ZBX_DEFAULT_SSH_PORT 22 167 #define ZBX_DEFAULT_TELNET_PORT 23 168 #define ZBX_DEFAULT_SMTP_PORT 25 169 #define ZBX_DEFAULT_DNS_PORT 53 170 #define ZBX_DEFAULT_HTTP_PORT 80 171 #define ZBX_DEFAULT_POP_PORT 110 172 #define ZBX_DEFAULT_NNTP_PORT 119 173 #define ZBX_DEFAULT_NTP_PORT 123 174 #define ZBX_DEFAULT_IMAP_PORT 143 175 #define ZBX_DEFAULT_LDAP_PORT 389 176 #define ZBX_DEFAULT_HTTPS_PORT 443 177 #define ZBX_DEFAULT_AGENT_PORT 10050 178 #define ZBX_DEFAULT_SERVER_PORT 10051 179 #define ZBX_DEFAULT_GATEWAY_PORT 10052 180 181 #define ZBX_DEFAULT_AGENT_PORT_STR "10050" 182 #define ZBX_DEFAULT_SERVER_PORT_STR "10051" 183 184 int zbx_send_response_ext(zbx_socket_t *sock, int result, const char *info, const char *version, int protocol, 185 int timeout); 186 187 #define zbx_send_response(sock, result, info, timeout) \ 188 zbx_send_response_ext(sock, result, info, NULL, ZBX_TCP_PROTOCOL, timeout) 189 190 #define zbx_send_response_same(sock, result, info, timeout) \ 191 zbx_send_response_ext(sock, result, info, NULL, sock->protocol, timeout) 192 193 #define zbx_send_proxy_response(sock, result, info, timeout) \ 194 zbx_send_response_ext(sock, result, info, ZABBIX_VERSION, ZBX_TCP_PROTOCOL | ZBX_TCP_COMPRESS, timeout) 195 196 int zbx_recv_response(zbx_socket_t *sock, int timeout, char **error); 197 198 #ifdef HAVE_IPV6 199 # define zbx_getnameinfo(sa, host, hostlen, serv, servlen, flags) \ 200 getnameinfo(sa, AF_INET == (sa)->sa_family ? \ 201 sizeof(struct sockaddr_in) : \ 202 sizeof(struct sockaddr_in6), \ 203 host, hostlen, serv, servlen, flags) 204 #endif 205 206 #ifdef _WINDOWS 207 int zbx_socket_start(char **error); 208 #endif 209 210 #endif 211