summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/rest.c92
1 files changed, 53 insertions, 39 deletions
diff --git a/src/rest.c b/src/rest.c
index a426a0f..985e017 100644
--- a/src/rest.c
+++ b/src/rest.c
@@ -856,22 +856,66 @@ static int og_cmd_session(json_t *element, struct og_msg_params *params)
return og_send_request(OG_METHOD_POST, OG_CMD_SESSION, params, clients);
}
+static int og_json_os_array_get(struct og_dbi *dbi, json_t *array, const char *ip)
+{
+ unsigned int disk, partition;
+ const char *os_name;
+ const char *msglog;
+ dbi_result result;
+ json_t *item;
+
+ result = dbi_conn_queryf(dbi->conn,
+ "SELECT op.numdisk, op.numpar, nom.nombreso "
+ "FROM ordenadores o "
+ "INNER JOIN ordenadores_particiones op "
+ " ON o.idordenador = op.idordenador "
+ "INNER JOIN nombresos nom "
+ " ON op.idnombreso = nom.idnombreso "
+ "WHERE o.ip = '%s'", ip);
+ if (!result) {
+ dbi_conn_error(dbi->conn, &msglog);
+ syslog(LOG_ERR, "failed to query database (%s:%d) %s\n",
+ __func__, __LINE__, msglog);
+ return -1;
+ }
+
+ while (dbi_result_next_row(result)) {
+ item = json_object();
+ if (!item) {
+ dbi_result_free(result);
+ return -1;
+ }
+
+ disk = dbi_result_get_uint(result, "numdisk");
+ partition = dbi_result_get_uint(result, "numpar");
+ os_name = dbi_result_get_string(result, "nombreso");
+
+ json_object_set_new(item, "disk", json_integer(disk));
+ json_object_set_new(item, "partition", json_integer(partition));
+ json_object_set_new(item, "name", json_string(os_name));
+ json_array_append_new(array, item);
+ }
+ dbi_result_free(result);
+
+ return 0;
+}
+
static int og_cmd_get_session(json_t *element, struct og_msg_params *params,
char *buffer_reply)
{
- json_t *value, *root, *array, *item;
- const char *key, *msglog, *os_name;
- unsigned int disk, partition;
+ json_t *value, *root, *array;
struct og_dbi *dbi;
- dbi_result result;
- int err = 0;
+ const char *key;
+ int err = 0, i;
struct og_buffer og_buffer = {
.data = buffer_reply
};
json_object_foreach(element, key, value) {
- if (!strcmp(key, "client"))
+ if (!strcmp(key, "client")) /* alias for backward compatibility */
+ err = og_json_parse_clients(value, params);
+ else if (!strcmp(key, "clients"))
err = og_json_parse_clients(value, params);
else
err = -1;
@@ -890,50 +934,20 @@ static int og_cmd_get_session(json_t *element, struct og_msg_params *params,
return -1;
}
- result = dbi_conn_queryf(dbi->conn,
- "SELECT op.numdisk, op.numpar, nom.nombreso "
- "FROM ordenadores o "
- "INNER JOIN ordenadores_particiones op "
- " ON o.idordenador = op.idordenador "
- "INNER JOIN nombresos nom "
- " ON op.idnombreso = nom.idnombreso "
- "WHERE o.ip = '%s'",
- params->ips_array[0]);
- if (!result) {
- dbi_conn_error(dbi->conn, &msglog);
- syslog(LOG_ERR, "failed to query database (%s:%d) %s\n",
- __func__, __LINE__, msglog);
- og_dbi_close(dbi);
- return -1;
- }
-
array = json_array();
if (!array) {
- dbi_result_free(result);
og_dbi_close(dbi);
return -1;
}
- while (dbi_result_next_row(result)) {
- item = json_object();
- if (!item) {
- dbi_result_free(result);
- og_dbi_close(dbi);
+ for (i = 0; i < params->ips_array_len; i++) {
+ if (og_json_os_array_get(dbi, array, params->ips_array[i]) < 0) {
json_decref(array);
+ og_dbi_close(dbi);
return -1;
}
-
- disk = dbi_result_get_uint(result, "numdisk");
- partition = dbi_result_get_uint(result, "numpar");
- os_name = dbi_result_get_string(result, "nombreso");
-
- json_object_set_new(item, "disk", json_integer(disk));
- json_object_set_new(item, "partition", json_integer(partition));
- json_object_set_new(item, "name", json_string(os_name));
- json_array_append_new(array, item);
}
- dbi_result_free(result);
og_dbi_close(dbi);
root = json_object();