diff --git a/src/shared/mgmt.c b/src/shared/mgmt.c
index e576990..8d4e038 100644
--- a/src/shared/mgmt.c
+++ b/src/shared/mgmt.c
mgmt->writer_active = false;
}
-static bool can_write_data(struct io *io, void *user_data)
+static bool send_request(struct mgmt *mgmt, struct mgmt_request *request)
{
- struct mgmt *mgmt = user_data;
- struct mgmt_request *request;
struct iovec iov;
ssize_t ret;
- bool can_write;
-
- request = queue_pop_head(mgmt->reply_queue);
- if (!request) {
- /* only reply commands can jump the queue */
- if (!queue_isempty(mgmt->pending_list))
- return false;
-
- request = queue_pop_head(mgmt->request_queue);
- if (!request)
- return false;
-
- can_write = false;
- } else {
- /* allow multiple replies to jump the queue */
- can_write = !queue_isempty(mgmt->reply_queue);
- }
iov.iov_base = request->buf;
iov.iov_len = request->len;
- ret = io_send(io, &iov, 1);
+ ret = io_send(mgmt->io, &iov, 1);
if (ret < 0) {
util_debug(mgmt->debug_callback, mgmt->debug_data,
"write failed: %s", strerror(-ret));
request->callback(MGMT_STATUS_FAILED, 0, NULL,
request->user_data);
destroy_request(request);
- return true;
+ return false;
}
util_debug(mgmt->debug_callback, mgmt->debug_data,
queue_push_tail(mgmt->pending_list, request);
+ return true;
+}
+
+static bool can_write_data(struct io *io, void *user_data)
+{
+ struct mgmt *mgmt = user_data;
+ struct mgmt_request *request;
+ bool can_write;
+
+ request = queue_pop_head(mgmt->reply_queue);
+ if (!request) {
+ /* only reply commands can jump the queue */
+ if (!queue_isempty(mgmt->pending_list))
+ return false;
+
+ request = queue_pop_head(mgmt->request_queue);
+ if (!request)
+ return false;
+
+ can_write = false;
+ } else {
+ /* allow multiple replies to jump the queue */
+ can_write = !queue_isempty(mgmt->reply_queue);
+ }
+
+ if (!send_request(mgmt, request))
+ return true;
+
return can_write;
}
return request->id;
}
+unsigned int mgmt_send_nowait(struct mgmt *mgmt, uint16_t opcode, uint16_t index,
+ uint16_t length, const void *param,
+ mgmt_request_func_t callback,
+ void *user_data, mgmt_destroy_func_t destroy)
+{
+ struct mgmt_request *request;
+
+ if (!mgmt)
+ return 0;
+
+ request = create_request(opcode, index, length, param,
+ callback, user_data, destroy);
+ if (!request)
+ return 0;
+
+ if (mgmt->next_request_id < 1)
+ mgmt->next_request_id = 1;
+
+ request->id = mgmt->next_request_id++;
+
+ if (!send_request(mgmt, request))
+ return 0;
+
+ return request->id;
+}
+
unsigned int mgmt_reply(struct mgmt *mgmt, uint16_t opcode, uint16_t index,
uint16_t length, const void *param,
mgmt_request_func_t callback,
diff --git a/src/shared/mgmt.h b/src/shared/mgmt.h
index 49c8c99..b57eefc 100644
--- a/src/shared/mgmt.h
+++ b/src/shared/mgmt.h
uint16_t length, const void *param,
mgmt_request_func_t callback,
void *user_data, mgmt_destroy_func_t destroy);
+unsigned int mgmt_send_nowait(struct mgmt *mgmt, uint16_t opcode, uint16_t index,
+ uint16_t length, const void *param,
+ mgmt_request_func_t callback,
+ void *user_data, mgmt_destroy_func_t destroy);
unsigned int mgmt_reply(struct mgmt *mgmt, uint16_t opcode, uint16_t index,
uint16_t length, const void *param,
mgmt_request_func_t callback,