aboutsummaryrefslogtreecommitdiffstats
path: root/ctrl/libhicnctrl/src/api.c
diff options
context:
space:
mode:
Diffstat (limited to 'ctrl/libhicnctrl/src/api.c')
-rw-r--r--ctrl/libhicnctrl/src/api.c45
1 files changed, 32 insertions, 13 deletions
diff --git a/ctrl/libhicnctrl/src/api.c b/ctrl/libhicnctrl/src/api.c
index 5afecf7e6..8540addcf 100644
--- a/ctrl/libhicnctrl/src/api.c
+++ b/ctrl/libhicnctrl/src/api.c
@@ -520,6 +520,8 @@ hc_sock_free(hc_sock_t * s)
} else {
for (unsigned i = 0; i < n; i++) {
hc_sock_request_t * request = request_array[i];
+ if (hc_sock_map_remove(s->map, request->seq, NULL) < 0)
+ ERROR("[hc_sock_process] Error removing request from map");
hc_sock_request_free(request);
}
free(request_array);
@@ -622,6 +624,9 @@ hc_sock_recv(hc_sock_t * s)
return rc;
}
+/*
+ * Returns -99 in case of internal error, -1 in case of API command failure
+ */
int
hc_sock_process(hc_sock_t * s, hc_data_t ** data)
{
@@ -643,11 +648,11 @@ hc_sock_process(hc_sock_t * s, hc_data_t ** data)
hc_sock_request_t * request = NULL;
if (hc_sock_map_get(s->map, msg->hdr.seqNum, &request) < 0) {
ERROR("[hc_sock_process] Error searching for matching request");
- return -1;
+ return -99;
}
if (!request) {
ERROR("[hc_sock_process] No request matching received sequence number");
- return -1;
+ return -99;
}
s->remaining = msg->hdr.length;
@@ -662,12 +667,15 @@ hc_sock_process(hc_sock_t * s, hc_data_t ** data)
assert(!data);
hc_data_set_error(request->data);
s->cur_request = request;
+ err = -1;
break;
case RESPONSE_LIGHT:
assert(data);
if (s->remaining == 0) {
hc_data_set_complete(request->data);
*data = request->data;
+ if (hc_sock_map_remove(s->map, request->seq, NULL) < 0)
+ ERROR("[hc_sock_process] Error removing request from map");
hc_sock_request_free(request);
} else {
/* We only remember it if there is still data to parse */
@@ -676,7 +684,7 @@ hc_sock_process(hc_sock_t * s, hc_data_t ** data)
break;
default:
ERROR("[hc_sock_process] Invalid response received");
- return -1;
+ return -99;
}
available -= sizeof(hc_msg_header_t);
@@ -697,15 +705,15 @@ hc_sock_process(hc_sock_t * s, hc_data_t ** data)
int rc;
rc = hc_data_ensure_available(s->cur_request->data, num_chunks);
if (rc < 0)
- return -1;
+ return -99;
for (int i = 0; i < num_chunks; i++) {
u8 * dst = hc_data_get_next(s->cur_request->data);
if (!dst)
- return -1;
+ return -99;
rc = s->cur_request->parse(s->buf + s->roff + i * s->cur_request->data->in_element_size, dst);
if (rc < 0)
- err = -1; /* FIXME we let the loop complete (?) */
+ err = -99; /* FIXME we let the loop complete (?) */
s->cur_request->data->size++;
}
}
@@ -716,7 +724,7 @@ hc_sock_process(hc_sock_t * s, hc_data_t ** data)
if (s->remaining == 0) {
if (hc_sock_map_remove(s->map, s->cur_request->seq, NULL) < 0) {
ERROR("[hc_sock_process] Error removing request from map");
- return -1;
+ return -99;
}
hc_data_set_complete(s->cur_request->data);
if (data)
@@ -881,9 +889,20 @@ hc_execute_command(hc_sock_t * s, hc_msg_t * msg, size_t msg_len,
*/
if (hc_sock_recv(s) < 0)
continue; //break;
- if (hc_sock_process(s, pdata) < 0) {
- ERROR("[hc_execute_command] Error processing socket results");
- goto ERR_PROCESS;
+ int rc = hc_sock_process(s, pdata);
+ switch(rc) {
+ case 0:
+ break;
+ case -1:
+ ret = rc;
+ break;
+ case -99:
+ ERROR("[hc_execute_command] Error processing socket results");
+ goto ERR_PROCESS;
+ break;
+ default:
+ ERROR("[hc_execute_command] Unexpected return value");
+ goto ERR_PROCESS;
}
}
@@ -899,7 +918,7 @@ ERR_MAP:
ERR_REQUEST:
hc_data_free(data);
ERR_DATA:
- return -1;
+ return -99;
}
/*----------------------------------------------------------------------------*
@@ -1655,7 +1674,7 @@ _hc_connection_set_priority(hc_sock_t * s, const char * conn_id_or_name,
} msg = {
.hdr = {
.messageType = REQUEST_LIGHT,
- .commandID = CONNECTION_SET_ADMIN_STATE,
+ .commandID = CONNECTION_SET_PRIORITY,
.length = 1,
.seqNum = 0,
},
@@ -2302,7 +2321,7 @@ hc_face_delete(hc_sock_t * s, hc_face_t * face)
int rc = hc_face_snprintf(face_s, MAXSZ_HC_FACE, face);
if (rc >= MAXSZ_HC_FACE)
WARN("[hc_face_delete] Unexpected truncation of face string");
- DEBUG("[hc_face_delete] face=%s");
+ DEBUG("[hc_face_delete] face=%s", face_s);
hc_connection_t connection;
if (hc_face_to_connection(face, &connection, false) < 0) {