void *user_data;
};
-#define MAX_BUF_SIZE 1024
-
static GList *g_tmonitor_client_head;
static GMutex g_mutex;
static int handle_resource_attr(int request, int id, int resource_id, u_int64_t attr_mask)
{
- char buffer[MAX_BUF_SIZE + 1];
+ char buffer[GENERIC_BUFF_MAX + 1];
int buffer_len;
int response_req;
int ret;
}
/* wait for response */
- buffer_len = recv(id, buffer, MAX_BUF_SIZE, 0);
+ buffer_len = recv(id, buffer, GENERIC_BUFF_MAX, 0);
if (buffer_len <= 0) {
_E("[libpass] socket disconnected");
return -EIO;
EXPORT
int tmonitor_get_resource_count(int id, int resource_type)
{
- char buffer[MAX_BUF_SIZE + 1];
+ char buffer[GENERIC_BUFF_MAX + 1];
int buffer_len;
int response_req;
int ret;
}
/* wait for response */
- buffer_len = recv(id, buffer, MAX_BUF_SIZE, 0);
+ buffer_len = recv(id, buffer, GENERIC_BUFF_MAX, 0);
if (buffer_len <= 0) {
_E("[libpass] socket disconnected");
return -EIO;
EXPORT
int tmonitor_create_resource(int id, int resource_type)
{
- char buffer[MAX_BUF_SIZE + 1];
+ char buffer[GENERIC_BUFF_MAX + 1];
int buffer_len;
int response_req;
int ret;
}
/* wait for response */
- buffer_len = recv(id, buffer, MAX_BUF_SIZE, 0);
+ buffer_len = recv(id, buffer, GENERIC_BUFF_MAX, 0);
if (buffer_len <= 0) {
_E("[libpass] socket disconnected");
return -EIO;
EXPORT
int tmonitor_delete_resource(int id, int resource_id)
{
- char buffer[MAX_BUF_SIZE + 1];
+ char buffer[GENERIC_BUFF_MAX + 1];
int buffer_len;
int response_req;
int ret;
}
/* wait for response */
- buffer_len = recv(id, buffer, MAX_BUF_SIZE, 0);
+ buffer_len = recv(id, buffer, GENERIC_BUFF_MAX, 0);
if (buffer_len <= 0) {
_E("[libpass] socket disconnected");
return -EIO;
EXPORT
int tmonitor_set_resource_ctrl(int id, int resource_id, u_int64_t ctrl_id, int value)
{
- char buffer[MAX_BUF_SIZE + 1];
+ char buffer[GENERIC_BUFF_MAX + 1];
int buffer_len;
int response_req;
int ret;
}
/* wait for response */
- buffer_len = recv(id, buffer, MAX_BUF_SIZE, 0);
+ buffer_len = recv(id, buffer, GENERIC_BUFF_MAX, 0);
if (buffer_len <= 0) {
_E("[libpass] socket disconnected");
return -EIO;
EXPORT
bool tmonitor_is_resource_attr_supported(int id, int resource_id, u_int64_t attr_id)
{
- char buffer[MAX_BUF_SIZE + 1];
+ char buffer[GENERIC_BUFF_MAX + 1];
int buffer_len;
int response_req;
int ret;
}
/* wait for response */
- buffer_len = recv(id, buffer, MAX_BUF_SIZE, 0);
+ buffer_len = recv(id, buffer, GENERIC_BUFF_MAX, 0);
if (buffer_len <= 0) {
_E("[libpass] socket disconnected");
return -EIO;
EXPORT
int tmonitor_update(int id)
{
- char buffer[MAX_BUF_SIZE + 1];
+ char buffer[GENERIC_BUFF_MAX + 1];
int buffer_len;
int response_req;
int ret;
}
/* wait for response */
- buffer_len = recv(id, buffer, MAX_BUF_SIZE, 0);
+ buffer_len = recv(id, buffer, GENERIC_BUFF_MAX, 0);
if (buffer_len <= 0) {
_E("[libpass] socket disconnected");
return -EIO;
EXPORT
int tmonitor_update_resource(int id, int resource_id)
{
- char buffer[MAX_BUF_SIZE + 1];
+ char buffer[GENERIC_BUFF_MAX + 1];
int buffer_len;
int response_req;
int ret;
}
/* wait for response */
- buffer_len = recv(id, buffer, MAX_BUF_SIZE, 0);
+ buffer_len = recv(id, buffer, GENERIC_BUFF_MAX, 0);
if (buffer_len <= 0) {
_E("[libpass] socket disconnected");
return -EIO;
EXPORT
int tmonitor_get_value_int(int id, int resource_id, u_int64_t attr_id, int32_t *value)
{
- char buffer[MAX_BUF_SIZE + 1];
+ char buffer[GENERIC_BUFF_MAX + 1];
int buffer_len;
int response_req;
int ret;
}
/* wait for response */
- buffer_len = recv(id, buffer, MAX_BUF_SIZE, 0);
+ buffer_len = recv(id, buffer, GENERIC_BUFF_MAX, 0);
if (buffer_len <= 0) {
_E("[libpass] socket disconnected");
return -EIO;
EXPORT
int tmonitor_get_value_int64(int id, int resource_id, u_int64_t attr_id, int64_t *value)
{
- char buffer[MAX_BUF_SIZE + 1];
+ char buffer[GENERIC_BUFF_MAX + 1];
int buffer_len;
int response_req;
int ret;
}
/* wait for response */
- buffer_len = recv(id, buffer, MAX_BUF_SIZE, 0);
+ buffer_len = recv(id, buffer, GENERIC_BUFF_MAX, 0);
if (buffer_len <= 0) {
_E("[libpass] socket disconnected");
return -EIO;
EXPORT
int tmonitor_get_value_uint(int id, int resource_id, u_int64_t attr_id, u_int32_t *value)
{
- char buffer[MAX_BUF_SIZE + 1];
+ char buffer[GENERIC_BUFF_MAX + 1];
int buffer_len;
int response_req;
int ret;
}
/* wait for response */
- buffer_len = recv(id, buffer, MAX_BUF_SIZE, 0);
+ buffer_len = recv(id, buffer, GENERIC_BUFF_MAX, 0);
if (buffer_len <= 0) {
_E("[libpass] socket disconnected");
return -EIO;
EXPORT
int tmonitor_get_value_uint64(int id, int resource_id, u_int64_t attr_id, u_int64_t *value)
{
- char buffer[MAX_BUF_SIZE + 1];
+ char buffer[GENERIC_BUFF_MAX + 1];
int buffer_len;
int response_req;
int ret;
}
/* wait for response */
- buffer_len = recv(id, buffer, MAX_BUF_SIZE, 0);
+ buffer_len = recv(id, buffer, GENERIC_BUFF_MAX, 0);
if (buffer_len <= 0) {
_E("[libpass] socket disconnected");
return -EIO;
EXPORT
int tmonitor_get_value_double(int id, int resource_id, u_int64_t attr_id, double *value)
{
- char buffer[MAX_BUF_SIZE + 1];
+ char buffer[GENERIC_BUFF_MAX + 1];
int buffer_len;
int response_req;
int ret;
}
/* wait for response */
- buffer_len = recv(id, buffer, MAX_BUF_SIZE, 0);
+ buffer_len = recv(id, buffer, GENERIC_BUFF_MAX, 0);
if (buffer_len <= 0) {
_E("[libpass] socket disconnected");
return -EIO;
EXPORT
int tmonitor_get_value_string(int id, int resource_id, u_int64_t attr_id, char *value)
{
- char buffer[MAX_BUF_SIZE + 1];
+ char buffer[GENERIC_BUFF_MAX + 1];
int buffer_len;
int response_req;
int ret;
}
/* wait for response */
- buffer_len = recv(id, buffer, MAX_BUF_SIZE, 0);
+ buffer_len = recv(id, buffer, GENERIC_BUFF_MAX, 0);
if (buffer_len <= 0) {
_E("[libpass] socket disconnected");
return -EIO;
static int
tmonitor_get_array(int id, int res_id, u_int64_t attr_id, int data_type, void **array, int *length)
{
- char buffer[MAX_BUF_SIZE + 1];
- char _array_str[MAX_BUF_SIZE];
- char *array_item, *array_str = _array_str;
+ char *array_item, *array_str, *buffer;
int array_len, array_type;
int buffer_len;
int response_req;
int ret, i;
- buffer_len = sprintf(buffer, "%d:%d:%"PRIu64,
+ buffer = malloc(ARRAY_BUFF_MAX + 1);
+ if (!buffer)
+ return -ENOMEM;
+
+ array_str = malloc(ARRAY_BUFF_MAX);
+ if (!array_str) {
+ free(buffer);
+ return -ENOMEM;
+ }
+
+ buffer_len = snprintf(buffer, ARRAY_BUFF_MAX, "%d:%d:%"PRIu64,
REQUEST_GET_VALUE_ARRAY, res_id, attr_id);
if (send(id, buffer, buffer_len, 0) < 0) {
_E("[libpass] error occurred while sending buffer");
- return -EIO;
+ ret = -EIO;
+ goto out_free;
}
/* wait for response */
- buffer_len = recv(id, buffer, MAX_BUF_SIZE, 0);
+ buffer_len = recv(id, buffer, ARRAY_BUFF_MAX, 0);
if (buffer_len <= 0) {
_E("[libpass] socket disconnected");
- return -EIO;
+ ret = -EIO;
+ goto out_free;
}
-
buffer[buffer_len] = '\0';
+
if (sscanf(buffer, "%d:%d|%d|%[^:]:%d", &response_req,
- &array_type, &array_len, array_str, &ret) < 5)
- return -EINVAL;
+ &array_type, &array_len, array_str, &ret) < 5) {
+ ret = -EINVAL;
+ goto out_free;
+ }
if (response_req != REQUEST_GET_VALUE_ARRAY) {
_E("[libpass] wrong response");
- return -EINVAL;
+ ret = -EINVAL;
+ goto out_free;
}
if (data_type != array_type) {
_E("[libpass] wrong data type");
- return -EINVAL;
+ ret = -EINVAL;
+ goto out_free;
}
switch (array_type) {
{
int32_t *new_array = malloc(array_len * sizeof(int32_t));
- if (!new_array)
- return -ENOMEM;
+ if (!new_array) {
+ ret = -ENOMEM;
+ goto out_free;
+ }
for (i = 0; (array_item = strsep(&array_str, ",")) != NULL; i++)
new_array[i] = strtol(array_item, NULL, 10);
{
int64_t *new_array = malloc(array_len * sizeof(int64_t));
- if (!new_array)
- return -ENOMEM;
+ if (!new_array) {
+ ret = -ENOMEM;
+ goto out_free;
+ }
for (i = 0; (array_item = strsep(&array_str, ",")) != NULL; i++)
new_array[i] = strtoll(array_item, NULL, 10);
{
u_int32_t *new_array = malloc(array_len * sizeof(u_int32_t));
- if (!new_array)
- return -ENOMEM;
+ if (!new_array) {
+ ret = -ENOMEM;
+ goto out_free;
+ }
for (i = 0; (array_item = strsep(&array_str, ",")) != NULL; i++)
new_array[i] = strtoul(array_item, NULL, 10);
{
u_int64_t *new_array = malloc(array_len * sizeof(u_int64_t));
- if (!new_array)
- return -ENOMEM;
+ if (!new_array) {
+ ret = -ENOMEM;
+ goto out_free;
+ }
for (i = 0; (array_item = strsep(&array_str, ",")) != NULL; i++)
new_array[i] = strtoull(array_item, NULL, 10);
{
double *new_array = malloc(array_len * sizeof(double));
- if (!new_array)
- return -ENOMEM;
+ if (!new_array) {
+ ret = -ENOMEM;
+ goto out_free;
+ }
for (i = 0; (array_item = strsep(&array_str, ",")) != NULL; i++)
new_array[i] = strtod(array_item, NULL);
{
char **new_array = calloc(array_len, sizeof(char *));
- if (!new_array)
- return -ENOMEM;
+ if (!new_array) {
+ ret = -ENOMEM;
+ goto out_free;
+ }
for (i = 0; (array_item = strsep(&array_str, ",")) != NULL; i++) {
char *new_item = g_strdup(array_item);
for (int j = i - 1; j >= 0; j--)
free(new_array[j]);
free(new_array);
- return -ENOMEM;
+ ret = -ENOMEM;
+ goto out_free;
}
new_array[i] = new_item;
}
default:
_E("[libpass] not supported array data type");
- return -EINVAL;
+ ret = -EINVAL;
}
+out_free:
+ free(buffer);
+ free(array_str);
+
return ret;
}
_E("failed to add response"); \
} \
-static void handle_request(struct request_client *client, char *buffer)
+static int handle_request(struct request_client *client, char *request)
{
- char _response[REQUEST_BUFFER_MAX];
- char *response = _response;
- char *args;
- int request_type;
- int ret;
- int buffer_len = REQUEST_BUFFER_MAX;
+ char *response, *response_entry, *args;
+ int request_type, buffer_len, ret;
char err_buf[BUFF_MAX];
- request_type = split_request_type_and_args(buffer, &args);
+ request_type = split_request_type_and_args(request, &args);
+
+ if (request_type == REQUEST_GET_VALUE_ARRAY)
+ buffer_len = ARRAY_BUFF_MAX + 1;
+ else
+ buffer_len = GENERIC_BUFF_MAX + 1;
+
+ response_entry = response = malloc(buffer_len);
+ if (!response_entry)
+ return -ENOMEM;
/**
* Format of response
}
ADD_RESPONSE(response, buffer_len, "%d", ret);
- if (send(client->socket_fd, _response, strlen(_response), 0) < 0) {
+ if (send(client->socket_fd, response_entry, strlen(response_entry), 0) < 0) {
strerror_r(errno, err_buf, BUFF_MAX);
_E("Failed to send respones, errno: %d, error: %s", errno, err_buf);
}
+
+ free(response_entry);
+
+ return 0;
}
static GList *g_request_client_head;
static int request_handler_func(void *data, void **result)
{
- char buffer[REQUEST_BUFFER_MAX + 1];
+ char request[GENERIC_BUFF_MAX + 1];
struct request_client *client = (struct request_client *)data;
- int len;
+ int len, ret;
char err_buf[BUFF_MAX];
_D("Start worker thread for client-%d", client->socket_fd);
while (1) {
- len = recv(client->socket_fd, buffer, REQUEST_BUFFER_MAX, 0);
- if (len == 0) {
- _D("Client-%d is disconnected", client->socket_fd);
- goto out;
- }
+ len = recv(client->socket_fd, request, GENERIC_BUFF_MAX, 0);
+ if (len == 0)
+ break;
if (len < 0) {
strerror_r(errno, err_buf, BUFF_MAX);
_E("Error occurs while receiving request: errno: %d, error: %s",
errno, err_buf);
- goto out;
+ break;
}
- buffer[len] = '\0';
- handle_request(client, buffer);
+ request[len] = '\0';
+ ret = handle_request(client, request);
+ if (ret < 0)
+ break;
}
-out:
+
+ _D("Client-%d is disconnected", client->socket_fd);
g_hash_table_destroy(client->resource_table);
close(client->socket_fd);
destroy_request_client(client);