@@ -137,7 +137,7 @@ static int ctrl_connect(lua_State *L) {
return 2;
}
- int connfd = ipc_inst_start_ext(SOURCE_LOCAL, 0, NULL, false);
+ int connfd = ipc_inst_start_ext(SOURCE_LOCAL, NULL, 0);
if (connfd < 0) {
lua_pop(L, 1);
lua_pushnil(L);
@@ -1037,11 +1037,14 @@ channel_op_res_t channel_get_file(channel_t *this, void *data)
goto cleanup_header;
}
+ struct swupdate_request req;
+ swupdate_prepare_req(&req);
+ req.dry_run = channel_data->dry_run;
+ req.len = channel_data->info == NULL ? 0 : strlen(channel_data->info);
+ req.info = channel_data->info;
for (int retries = 3; retries >= 0; retries--) {
file_handle = ipc_inst_start_ext(channel_data->source,
- channel_data->info == NULL ? 0 : strlen(channel_data->info),
- channel_data->info,
- channel_data->dry_run);
+ &req, sizeof(struct swupdate_request));
if (file_handle > 0)
break;
sleep(1);
@@ -11,6 +11,7 @@
#include <stdlib.h>
#include <stdbool.h>
+#include <string.h>
#include "swupdate_status.h"
#ifdef __cplusplus
@@ -34,7 +35,8 @@ typedef enum {
SWUPDATE_SUBPROCESS,
REQ_INSTALL_DRYRUN,
SET_AES_KEY,
- SET_UPDATE_STATE /* set bootloader ustate */
+ SET_UPDATE_STATE, /* set bootloader ustate */
+ REQ_INSTALL_EXT
} msgtype;
/*
@@ -77,9 +79,24 @@ typedef struct {
msgdata data;
} ipc_message;
+#define SWUPDATE_API_VERSION 0x1
+/*
+ * Install structure to be filled before calling
+ * ipc and async functions
+ */
+struct swupdate_request {
+ unsigned int apiversion;
+ int type;
+ bool dry_run;
+ size_t len;
+ const char *info;
+ char *software_set;
+ char *running_mode;
+};
+
char *get_ctrl_socket(void);
int ipc_inst_start(void);
-int ipc_inst_start_ext(sourcetype source, size_t len, const char *info, bool dry_run);
+int ipc_inst_start_ext(sourcetype source, void *priv, ssize_t size);
int ipc_send_data(int connfd, char *buf, int size);
void ipc_end(int connfd);
int ipc_get_status(ipc_message *msg);
@@ -91,9 +108,11 @@ typedef int (*writedata)(char **buf, int *size);
typedef int (*getstatus)(ipc_message *msg);
typedef int (*terminated)(RECOVERY_STATUS status);
int ipc_wait_for_complete(getstatus callback);
+void swupdate_prepare_req(struct swupdate_request *req);
int swupdate_image_write(char *buf, int size);
int swupdate_async_start(writedata wr_func, getstatus status_func,
- terminated end_func, bool dry_run);
+ terminated end_func,
+ void *priv, ssize_t size);
int swupdate_set_aes(char *key, char *ivt);
#ifdef __cplusplus
@@ -108,7 +108,7 @@ static pthread_t start_ipc_thread(void *(* start_routine) (void *), void *arg)
* Only one running request is accepted
*/
int swupdate_async_start(writedata wr_func, getstatus status_func,
- terminated end_func, bool dry_run)
+ terminated end_func, void *priv, ssize_t size)
{
struct async_lib *rq;
int connfd;
@@ -122,7 +122,7 @@ int swupdate_async_start(writedata wr_func, getstatus status_func,
rq->get = status_func;
rq->end = end_func;
- connfd = ipc_inst_start_ext(SOURCE_UNKNOWN, 0, NULL, dry_run);
+ connfd = ipc_inst_start_ext(SOURCE_UNKNOWN, priv, size);
if (connfd < 0)
return connfd;
@@ -171,3 +171,11 @@ int swupdate_set_aes(char *key, char *ivt)
return ipc_send_cmd(&msg);
}
+
+void swupdate_prepare_req(struct swupdate_request *req) {
+ if (!req)
+ return;
+ memset(req, 0, sizeof(struct swupdate_request));
+ req->apiversion = SWUPDATE_API_VERSION;
+ return;
+}
@@ -11,6 +11,7 @@
#include <string.h>
#include <strings.h>
#include <unistd.h>
+#include <errno.h>
#include <sys/socket.h>
#include <sys/select.h>
#include <sys/un.h>
@@ -175,12 +176,24 @@ int ipc_get_status_timeout(ipc_message *msg, unsigned int timeout_ms)
return ret;
}
-int ipc_inst_start_ext(sourcetype source, size_t len, const char *buf, bool dry_run)
+int ipc_inst_start_ext(sourcetype source, void *priv, ssize_t size)
{
int connfd;
ipc_message msg;
ssize_t ret;
-
+ bool dry_run = false;
+ struct swupdate_request *req = NULL;
+ size_t len = 0;
+ const char *buf = NULL;
+
+ if (priv) {
+ if (size != sizeof(struct swupdate_request))
+ return -EINVAL;
+ req = (struct swupdate_request *)priv;
+ dry_run = req->dry_run;
+ len = req->len;
+ buf = req->info;
+ }
connfd = prepare_ipc();
if (connfd < 0)
return -1;
@@ -233,7 +246,7 @@ int ipc_inst_start_ext(sourcetype source, size_t len, const char *buf, bool dry_
*/
int ipc_inst_start(void)
{
- return ipc_inst_start_ext(SOURCE_UNKNOWN, 0, NULL, false);
+ return ipc_inst_start_ext(SOURCE_UNKNOWN, NULL, 0);
}
/*
@@ -288,7 +288,11 @@ static void upload_handler(struct mg_connection *nc, int ev, void *p)
break;
}
- fus->fd = ipc_inst_start_ext(SOURCE_WEBSERVER, strlen(mp->file_name), mp->file_name, false);
+ struct swupdate_request req;
+ swupdate_prepare_req(&req);
+ req.len = strlen(mp->file_name);
+ req.info = mp->file_name;
+ fus->fd = ipc_inst_start_ext(SOURCE_WEBSERVER, &req, sizeof(req));
if (fus->fd < 0) {
mg_http_send_error(nc, 500, "Failed to queue command");
free(fus);
@@ -129,8 +129,11 @@ static int send_file(const char* filename) {
/* May be set non-zero by end() function on failure */
end_status = EXIT_SUCCESS;
+ struct swupdate_request req;
+ swupdate_prepare_req(&req);
+ req.dry_run = dry_run;
rc = swupdate_async_start(readimage, printstatus,
- end, dry_run);
+ end, &req, sizeof(req));
/* return if we've hit an error scenario */
if (rc < 0) {
Drop most parameters and move them (info) inside a generic request structure. Signed-off-by: Stefano Babic <sbabic@denx.de> --- bindings/lua_swupdate.c | 2 +- corelib/channel_curl.c | 9 ++++++--- include/network_ipc.h | 25 ++++++++++++++++++++++--- ipc/network_ipc-if.c | 12 ++++++++++-- ipc/network_ipc.c | 19 ++++++++++++++++--- mongoose/mongoose_interface.c | 6 +++++- tools/swupdate-client.c | 5 ++++- 7 files changed, 64 insertions(+), 14 deletions(-)