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