int zbx_tcp_send_ext(zbx_sock_t *s, const char *data, unsigned char flags, int timeout) { zbx_uint64_t len64; ssize_t i = 0, written = 0; int ret = SUCCEED; ZBX_TCP_START(); if (0 != timeout) zbx_tcp_timeout_set(s, timeout); if( flags & ZBX_TCP_NEW_PROTOCOL ) { /* Write header */ if( ZBX_TCP_ERROR == ZBX_TCP_WRITE(s->socket, ZBX_TCP_HEADER, ZBX_TCP_HEADER_LEN)) { zbx_set_tcp_strerror("ZBX_TCP_WRITE() failed [%s]", strerror_from_system(zbx_sock_last_error())); ret = FAIL; goto cleanup; } len64 = (zbx_uint64_t)strlen(data); len64 = zbx_htole_uint64(len64); /* Write data length */ if( ZBX_TCP_ERROR == ZBX_TCP_WRITE(s->socket, (char *) &len64, sizeof(len64)) ) { zbx_set_tcp_strerror("ZBX_TCP_WRITE() failed [%s]", strerror_from_system(zbx_sock_last_error())); ret = FAIL; goto cleanup; } } while(written < (ssize_t)strlen(data)) { if( ZBX_TCP_ERROR == (i = ZBX_TCP_WRITE(s->socket, data+written,(int)(strlen(data)-written))) ) { zbx_set_tcp_strerror("ZBX_TCP_WRITE() failed [%s]", strerror_from_system(zbx_sock_last_error())); ret = FAIL; goto cleanup; } written += i; } cleanup: if (0 != timeout) zbx_tcp_timeout_cleanup(s); return ret; }
static ssize_t telnet_socket_write(ZBX_SOCKET socket_fd, const void *buf, size_t count) { const char *__function_name = "telnet_socket_write"; ssize_t rc; int error; zabbix_log(LOG_LEVEL_DEBUG, "In %s()", __function_name); while (ZBX_TCP_ERROR == (rc = ZBX_TCP_WRITE(socket_fd, buf, count))) { error = zbx_sock_last_error(); /* zabbix_log() resets the error code */ zabbix_log(LOG_LEVEL_DEBUG, "%s() rc:%d errno:%d error:[%s]", __function_name, rc, error, strerror_from_system(error)); #ifdef _WINDOWS if (WSAEWOULDBLOCK == error) #else if (EAGAIN == error) #endif { telnet_waitsocket(socket_fd, WAIT_WRITE); continue; } break; } zabbix_log(LOG_LEVEL_DEBUG, "End of %s():%d", __function_name, rc); return rc; }