#include "ipmi_protocol.h"
#include "zbxserialize.h"
#include "zbxexpression.h"
zbx_uint32_t zbx_ipmi_serialize_request(unsigned char **data, zbx_uint64_t hostid, zbx_uint64_t objectid,
const char *addr, unsigned short port, signed char authtype, unsigned char privilege,
const char *username, const char *password, const char *sensor, int command, const char *key)
zbx_uint32_t data_len, addr_len, username_len, password_len, sensor_len, key_len;
addr_len = strlen(addr) + 1;
user = zbx_strdup(NULL, username);
pwd = zbx_strdup(NULL, password);
zbx_substitute_simple_macros_unmasked(NULL, NULL, NULL, NULL, &hostid, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
&user, ZBX_MACRO_TYPE_COMMON, NULL, 0);
zbx_substitute_simple_macros_unmasked(NULL, NULL, NULL, NULL, &hostid, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
&pwd, ZBX_MACRO_TYPE_COMMON, NULL, 0);
username_len = strlen(user) + 1;
password_len = strlen(pwd) + 1;
sensor_len = strlen(sensor) + 1;
key_len = NULL != key ? strlen(key) + 1 : 0;
data_len = sizeof(zbx_uint64_t) + sizeof(short) + sizeof(char) * 2 + addr_len + username_len + password_len +
sensor_len + key_len + sizeof(zbx_uint32_t) * 5 + sizeof(int);
*data = (unsigned char *)zbx_malloc(NULL, data_len);
ptr += zbx_serialize_uint64(ptr, objectid);
ptr += zbx_serialize_str(ptr, addr, addr_len);
ptr += zbx_serialize_short(ptr, port);
ptr += zbx_serialize_char(ptr, authtype);
ptr += zbx_serialize_char(ptr, privilege);
ptr += zbx_serialize_str(ptr, user, username_len);
ptr += zbx_serialize_str(ptr, pwd, password_len);
ptr += zbx_serialize_str(ptr, sensor, sensor_len);
ptr += zbx_serialize_int(ptr, command);
(void)zbx_serialize_str(ptr, key, key_len);