[PATCH 1/8] IPC: fix building client example after moving start_thread

184 views
Skip to first unread message

Stefano Babic

unread,
Feb 11, 2017, 9:47:08 AM2/11/17
to swup...@googlegroups.com, Stefano Babic
The client example using the ipc library cannot be built
because of missing function.

Duplicate this small function in the library to make it
independent from the rest of code.

Signed-off-by: Stefano Babic <sba...@denx.de>
---
ipc/network_ipc.c | 23 ++++++++++++++++++++++-
1 file changed, 22 insertions(+), 1 deletion(-)

diff --git a/ipc/network_ipc.c b/ipc/network_ipc.c
index 0e511fa..e4df37a 100644
--- a/ipc/network_ipc.c
+++ b/ipc/network_ipc.c
@@ -315,6 +315,27 @@ static void *swupdate_async_thread(void *data)
}

/*
+ * This is duplicated from pctl
+ * to let build the ipc library without
+ * linking pctl code
+ */
+static pthread_t start_ipc_thread(void *(* start_routine) (void *), void *arg)
+{
+ int ret;
+ pthread_t id;
+ pthread_attr_t attr;
+
+ pthread_attr_init(&attr);
+ pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
+
+ ret = pthread_create(&id, &attr, start_routine, arg);
+ if (ret) {
+ exit(1);
+ }
+ return id;
+}
+
+/*
* This is part of the library for an external client.
* Only one running request is accepted
*/
@@ -340,7 +361,7 @@ int swupdate_async_start(writedata wr_func, getstatus status_func,

rq->connfd = connfd;

- async_thread_id = start_thread(swupdate_async_thread, rq);
+ async_thread_id = start_ipc_thread(swupdate_async_thread, rq);

handle++;

--
2.7.4

Stefano Babic

unread,
Feb 11, 2017, 9:47:10 AM2/11/17
to swup...@googlegroups.com, Stefano Babic
Splitting SWUpdate in processes requires to
implement an IPC if they need to communicate
together. First use case is to send back
a feedback to the hawkbit server from an
external process.

SWUpdate will maintain a single socket
to the world. A different message is implemented
and the network daemon routes the messages
to the right SWUpdate's process.

Signed-off-by: Stefano Babic <sba...@denx.de>
---
include/network_ipc.h | 4 +++-
ipc/network_ipc.c | 25 +++++++++++++++++++++++++
2 files changed, 28 insertions(+), 1 deletion(-)

diff --git a/include/network_ipc.h b/include/network_ipc.h
index 1212ac5..b16ad35 100644
--- a/include/network_ipc.h
+++ b/include/network_ipc.h
@@ -33,7 +33,8 @@ typedef enum {
ACK,
NACK,
GET_STATUS,
- POST_UPDATE
+ POST_UPDATE,
+ SWUPDATE_SUBPROCESS,
} msgtype;

typedef union {
@@ -66,6 +67,7 @@ int ipc_send_data(int connfd, char *buf, int size);
void ipc_end(int connfd);
int ipc_get_status(ipc_message *msg);
int ipc_postupdate(ipc_message *msg);
+int ipc_send_cmd(ipc_message *msg);

typedef int (*writedata)(char **buf, int *size);
typedef int (*getstatus)(ipc_message *msg);
diff --git a/ipc/network_ipc.c b/ipc/network_ipc.c
index e4df37a..68e9725 100644
--- a/ipc/network_ipc.c
+++ b/ipc/network_ipc.c
@@ -368,4 +368,29 @@ int swupdate_async_start(writedata wr_func, getstatus status_func,
return handle;
}

+int ipc_send_cmd(ipc_message *msg)
+{
+ int connfd = prepare_ipc();
+ int ret;
+
+ if (connfd < 0) {
+ return -1;
+ }
+
+ /* TODO: Check source type */
+ msg->magic = IPC_MAGIC;
+ msg->type = SWUPDATE_SUBPROCESS;
+ ret = write(connfd, msg, sizeof(*msg));
+ if (ret != sizeof(*msg)) {
+ close(connfd);
+ return -1;
+ }
+ ret = read(connfd, msg, sizeof(*msg));
+ if (ret <= 0) {
+ close(connfd);
+ return -1;
+ }
+ close(connfd);

+ return 0;
+}
--
2.7.4

Stefano Babic

unread,
Feb 11, 2017, 9:47:12 AM2/11/17
to swup...@googlegroups.com, Stefano Babic
The thread check if the IPC message is for another
subprocess and routes it, waiting for an answer.

Just simple CMD / ANSWER messages are supported.

Signed-off-by: Stefano Babic <sba...@denx.de>
---
corelib/network_thread.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 69 insertions(+)

diff --git a/corelib/network_thread.c b/corelib/network_thread.c
index 2225671..14112be 100644
--- a/corelib/network_thread.c
+++ b/corelib/network_thread.c
@@ -41,10 +41,12 @@
#include "network_interface.h"
#include "installer.h"
#include "swupdate.h"
+#include "pctl.h"

#define LISTENQ 1024

#define NUM_CACHED_MESSAGES 100
+#define DEFAULT_INTERNAL_TIMEOUT 60

struct msg_elem {
RECOVERY_STATUS status;
@@ -155,6 +157,9 @@ void *network_thread (void *data)
int nread;
struct msg_elem *notification;
int ret;
+ int pipe;
+ fd_set pipefds;
+ struct timeval tv;

if (!instp) {
TRACE("Fatal error: Network thread aborting...");
@@ -204,6 +209,70 @@ void *network_thread (void *data)
sprintf(msg.data.msg, "Post-update actions failed.");
}
break;
+ case SWUPDATE_SUBPROCESS:
+ /*
+ * this request is not for the installer,
+ * but for one of the subprocesses
+ * forward the request without checking
+ * the payload
+ */
+
+ pipe = pctl_getfd_from_type(msg.data.instmsg.source);
+ if (pipe < 0) {
+ ERROR("Cannot find channel for requested process");
+ msg.type = NACK;
+ break;
+ }
+ TRACE("Received Message for %s",
+ pctl_getname_from_type(msg.data.instmsg.source));
+ if (fcntl(pipe, F_GETFL) < 0 && errno == EBADF) {
+ ERROR("Pipe not available or closed: %d", pipe);
+ msg.type = NACK;
+ break;
+ }
+
+ ret = write(pipe, &msg, sizeof(msg));
+ if (ret != sizeof(msg)) {
+ ERROR("Writing to pipe failed !");
+ msg.type = NACK;
+ break;
+ }
+
+ /*
+ * Do not block forever for an answer
+ * This would block the whole thread
+ * If a message requires more time,
+ * the destination process should sent an
+ * answer back explaining this in the payload
+ */
+ FD_ZERO(&pipefds);
+ FD_SET(pipe, &pipefds);
+ tv.tv_sec = DEFAULT_INTERNAL_TIMEOUT;
+ tv.tv_usec = 0;
+ ret = select(pipe + 1, &pipefds, NULL, NULL, &tv);
+
+ /*
+ * If there is an error or timeout,
+ * send a NACK back
+ */
+ if (ret <= 0 || !FD_ISSET(pipe, &pipefds)) {
+ msg.type = NACK;
+ break;
+ }
+
+ ret = read(pipe, &msg, sizeof(msg));
+ if (ret != sizeof(msg)) {
+ ERROR("Reading from pipe failed !");
+ msg.type = NACK;
+ break;
+ }
+
+ /*
+ * ACK/NACK was inserted by the called SUBPROCESS
+ * It should not be touched here
+ */
+
+ break;
case REQ_INSTALL:
TRACE("Incoming network request: processing...");
if (instp->status == IDLE) {
--
2.7.4

Stefano Babic

unread,
Feb 11, 2017, 9:47:13 AM2/11/17
to swup...@googlegroups.com, Stefano Babic
Add entry point to be called to communicate with
the server, and implements the function in the hawkbit
server.

Signed-off-by: Stefano Babic <sba...@denx.de>
---
include/suricatta/server.h | 3 +++
suricatta/server_hawkbit.c | 13 +++++++++
suricatta/suricatta.c | 67 ++++++++++++++++++++++++++++++++++------------
3 files changed, 66 insertions(+), 17 deletions(-)

diff --git a/include/suricatta/server.h b/include/suricatta/server.h
index 649c054..73bd19e 100644
--- a/include/suricatta/server.h
+++ b/include/suricatta/server.h
@@ -32,6 +32,7 @@ extern server_op_res_t server_send_target_data(void);
extern unsigned int server_get_polling_interval(void);
extern server_op_res_t server_start(const char *cfgfname, int argc, char *argv[]);
extern server_op_res_t server_stop(void);
+extern server_op_res_t server_ipc(int fd);

static struct server_t {
server_op_res_t (*has_pending_action)(int *action_id);
@@ -40,9 +41,11 @@ static struct server_t {
unsigned int (*get_polling_interval)(void);
server_op_res_t (*start)(const char *fname, int argc, char *argv[]);
server_op_res_t (*stop)(void);
+ server_op_res_t (*ipc)(int fd);
} server = {.has_pending_action = &server_has_pending_action,
.install_update = &server_install_update,
.send_target_data = &server_send_target_data,
.get_polling_interval = &server_get_polling_interval,
+ .ipc = &server_ipc,
.start = &server_start,
.stop = &server_stop};
diff --git a/suricatta/server_hawkbit.c b/suricatta/server_hawkbit.c
index 7fa1b72..6327876 100644
--- a/suricatta/server_hawkbit.c
+++ b/suricatta/server_hawkbit.c
@@ -126,6 +126,7 @@ static channel_data_t channel_data_defaults = {.debug = false,
/* Prototypes for "public" functions */
server_op_res_t server_has_pending_action(int *action_id);
server_op_res_t server_stop(void);
+server_op_res_t server_ipc(int fd);
server_op_res_t server_start(char *fname, int argc, char *argv[]);
server_op_res_t server_install_update(void);
server_op_res_t server_send_target_data(void);
@@ -1321,3 +1322,15 @@ server_op_res_t server_stop(void)
(void)channel.close();
return SERVER_OK;
}
+
+server_op_res_t server_ipc(int fd)
+{
+ char buf[4096];
+ int ret;
+
+ ret = read(fd, buf, sizeof(buf));
+
+ printf("%s read %d bytes\n", __func__, ret);
+
+ return SERVER_OK;
+}
diff --git a/suricatta/suricatta.c b/suricatta/suricatta.c
index 7f5001a..8448ec0 100644
--- a/suricatta/suricatta.c
+++ b/suricatta/suricatta.c
@@ -22,35 +22,68 @@
#include <unistd.h>
#include <stdio.h>
#include <util.h>
+#include <sys/select.h>
+#include "pctl.h"
#include "suricatta/suricatta.h"
#include "suricatta/server.h"

int start_suricatta(const char *cfgfname, int argc, char *argv[])
{
int action_id;
+ int retval;
+ fd_set readfds;
+ struct timeval tv;
+ int nsecs;
+ bool ipc_wakeup = false;
+
if (server.start(cfgfname, argc, argv) != SERVER_OK) {
exit(EXIT_FAILURE);
}
+
TRACE("Server initialized, entering suricatta main loop.\n");
while (true) {
- switch (server.has_pending_action(&action_id)) {
- case SERVER_UPDATE_AVAILABLE:
- DEBUG("About to process available update.\n");
- server.install_update();
- break;
- case SERVER_ID_REQUESTED:
- server.send_target_data();
- break;
- case SERVER_EINIT:
- break;
- case SERVER_OK:
- default:
- DEBUG("No pending action to process.\n");
- break;
+ if (ipc_wakeup) {
+ server.ipc(sw_sockfd);
+ nsecs = min((int)tv.tv_sec, server.get_polling_interval());
+ } else {
+ switch (server.has_pending_action(&action_id)) {
+ case SERVER_UPDATE_AVAILABLE:
+ DEBUG("About to process available update.\n");
+ server.install_update();
+ break;
+ case SERVER_ID_REQUESTED:
+ server.send_target_data();
+ break;
+ case SERVER_EINIT:
+ break;
+ case SERVER_OK:
+ default:
+ DEBUG("No pending action to process.\n");
+ break;
+ }
+ nsecs = server.get_polling_interval();
+
}
- DEBUG("Sleeping for %d seconds.\n",
- server.get_polling_interval());
- sleep(server.get_polling_interval());
+ DEBUG("Sleeping for %d seconds.\n", nsecs);
+ /*
+ * Fill in with IPC descriptor
+ * */
+ ipc_wakeup = false;
+ tv.tv_sec = nsecs;
+ tv.tv_usec = 0;
+ FD_ZERO(&readfds);
+ FD_SET(sw_sockfd, &readfds);
+ retval = select(sw_sockfd + 1, &readfds, NULL, NULL, &tv);
+ if (retval < 0)
+ continue;
+ /*
+ * Check IPC communication
+ */
+ if (retval && FD_ISSET(sw_sockfd, &readfds)) {
+ ipc_wakeup = true;
+ TRACE("Waked-up IPC %ld", tv.tv_sec);
+ }
+
TRACE("Suricatta awakened.\n");
}
}
--
2.7.4

Stefano Babic

unread,
Feb 11, 2017, 9:47:14 AM2/11/17
to swup...@googlegroups.com, Stefano Babic
This function is taken from one of common example
using strtok. This is a replacement of
split found in another languages.

Signed-off-by: Stefano Babic <sba...@denx.de>
---
core/util.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++
include/util.h | 1 +
2 files changed, 47 insertions(+)

diff --git a/core/util.c b/core/util.c
index 3497b49..aabacea 100644
--- a/core/util.c
+++ b/core/util.c
@@ -408,3 +408,49 @@ unsigned char *get_aes_ivt(void) {
return NULL;
return aes_key->ivt;
}
+
+char** string_split(char* s, const char d)
+{
+ char** result = 0;
+ size_t count = 0;
+ char* tmp = s;
+ char* last_delim = 0;
+ char delim[2];
+ delim[0] = d;
+ delim[1] = 0;
+
+ /* Count how many elements will be extracted. */
+ while (*tmp)
+ {
+ if (d == *tmp)
+ {
+ count++;
+ last_delim = tmp;
+ }
+ tmp++;
+ }
+
+ /* Add space for trailing token. */
+ count += last_delim < (s + strlen(s) - 1);
+
+ /* Add space for terminating null string so caller
+ knows where the list of returned strings ends. */
+ count++;
+
+ result = malloc(sizeof(char*) * count);
+
+ if (result)
+ {
+ size_t idx = 0;
+ char* token = strtok(s, delim);
+
+ while (token)
+ {
+ *(result + idx++) = strdup(token);
+ token = strtok(0, delim);
+ }
+ *(result + idx) = 0;
+ }
+
+ return result;
+}
diff --git a/include/util.h b/include/util.h
index d6cfa2d..c654026 100644
--- a/include/util.h
+++ b/include/util.h
@@ -148,6 +148,7 @@ void notify_init(void);
int syslog_init(void);

char **splitargs(char *args, int *argc);
+char** string_split(char* a_str, const char a_delim);
void freeargs (char **argv);
int isDirectoryEmpty(const char *dirname);
int get_hw_revision(struct hw_type *hw);
--
2.7.4

Stefano Babic

unread,
Feb 11, 2017, 9:47:15 AM2/11/17
to swup...@googlegroups.com, Stefano Babic
Add IPC to allow external processes to send
messages / command. This patch adds also
a "feedback" command. This is useful
if the verification of the installed image
is not done by SWUpdate, but demanded to
an external process. In this case,
suricatta should be started with "-c 6"
(new state, WAIT) and no communication
is started to the Hawkbit server until
getting the result from the IPC.

Signed-off-by: Stefano Babic <sba...@denx.de>
---
include/suricatta/state.h | 3 +-
suricatta/server_hawkbit.c | 209 +++++++++++++++++++++++++++++++++++----------
suricatta/server_hawkbit.h | 1 +
3 files changed, 167 insertions(+), 46 deletions(-)

diff --git a/include/suricatta/state.h b/include/suricatta/state.h
index 2879dee..d792102 100644
--- a/include/suricatta/state.h
+++ b/include/suricatta/state.h
@@ -35,7 +35,8 @@ typedef enum {
STATE_TESTING = '2',
STATE_FAILED = '3',
STATE_NOT_AVAILABLE = '4',
- STATE_ERROR = '5'
+ STATE_ERROR = '5',
+ STATE_WAIT = '6'
} update_state_t;

server_op_res_t save_state(char *key, update_state_t value);
diff --git a/suricatta/server_hawkbit.c b/suricatta/server_hawkbit.c
index 6327876..cccbef5 100644
--- a/suricatta/server_hawkbit.c
+++ b/suricatta/server_hawkbit.c
@@ -480,6 +480,14 @@ cleanup:

server_op_res_t server_has_pending_action(int *action_id)
{
+
+ /*
+ * First check if initialization was completed or
+ * a feedback should be sent to Hawkbit
+ */
+ if (server_hawkbit.update_state == STATE_WAIT)
+ return SERVER_OK;
+
/*
* if configData was not yet sent,
* send it without asking for deviceInfo
@@ -525,6 +533,52 @@ static update_state_t get_state(void) {
return is_state_valid(state) ? state : STATE_ERROR;
}

+static server_op_res_t handle_feedback(update_state_t state,
+ const char *reply_result,
+ const char *reply_execution,
+ const char *reply_message)
+{
+
+ int action_id;
+ channel_data_t channel_data = channel_data_defaults;
+ server_op_res_t result =
+ server_get_deployment_info(&channel_data, &action_id);
+ switch (result) {
+ case SERVER_OK:
+ case SERVER_ID_REQUESTED:
+ case SERVER_UPDATE_CANCELED:
+ case SERVER_NO_UPDATE_AVAILABLE:
+ TRACE("No active update available, nothing to report to "
+ "server.\n");
+ if ((state != STATE_OK) && (state != STATE_NOT_AVAILABLE)) {
+ WARN("Persistent state=%c but no active update on "
+ "server?!\n",
+ state);
+ }
+ return SERVER_OK;
+ case SERVER_EERR:
+ case SERVER_EBADMSG:
+ case SERVER_EINIT:
+ case SERVER_EACCES:
+ case SERVER_EAGAIN:
+ return result;
+ case SERVER_UPDATE_AVAILABLE:
+ break;
+ }
+
+ TRACE("Reporting Installation progress for ID %d: %s / %s / %s\n",
+ action_id, reply_result, reply_execution, reply_message);
+ if (server_send_deployment_reply(action_id, 0, 0, reply_result,
+ reply_execution,
+ reply_message) != SERVER_OK) {
+ ERROR("Error while reporting installation status to server.\n");
+ return SERVER_EAGAIN;
+ }
+
+ return SERVER_UPDATE_AVAILABLE;
+}
+
+
server_op_res_t server_handle_initial_state(update_state_t stateovrrd)
{
update_state_t state = STATE_OK;
@@ -566,42 +620,11 @@ server_op_res_t server_handle_initial_state(update_state_t stateovrrd)
"report to server.\n");
return SERVER_OK;
}
+ server_op_res_t result;
+ result = handle_feedback(state, reply_result, reply_execution, reply_message);

- int action_id;
- channel_data_t channel_data = channel_data_defaults;
- server_op_res_t result =
- server_get_deployment_info(&channel_data, &action_id);
- switch (result) {
- case SERVER_OK:
- case SERVER_ID_REQUESTED:
- case SERVER_UPDATE_CANCELED:
- case SERVER_NO_UPDATE_AVAILABLE:
- DEBUG("No active update available, nothing to report to "
- "server.\n");
- if ((state != STATE_OK) && (state != STATE_NOT_AVAILABLE)) {
- WARN("Persistent state=%c but no active update on "
- "server?!\n",
- state);
- }
- return SERVER_OK;
- case SERVER_EERR:
- case SERVER_EBADMSG:
- case SERVER_EINIT:
- case SERVER_EACCES:
- case SERVER_EAGAIN:
+ if (result != SERVER_UPDATE_AVAILABLE)
return result;
- case SERVER_UPDATE_AVAILABLE:
- break;
- }
-
- DEBUG("Reporting Installation progress for ID %d: %s / %s / %s\n",
- action_id, reply_result, reply_execution, reply_message);
- if (server_send_deployment_reply(action_id, 0, 0, reply_result,
- reply_execution,
- reply_message) != SERVER_OK) {
- ERROR("Error while reporting installation status to server.\n");
- return SERVER_EAGAIN;
- }

/* NOTE (Re-)setting STATE_KEY=STATE_OK == '0' instead of deleting it
* as it may be required for the switchback/recovery U-Boot logics.
@@ -1230,6 +1253,7 @@ server_op_res_t server_start(char *fname, int argc, char *argv[])
case STATE_INSTALLED:
case STATE_TESTING:
case STATE_FAILED:
+ case STATE_WAIT:
break;
default:
fprintf(
@@ -1303,15 +1327,23 @@ server_op_res_t server_start(char *fname, int argc, char *argv[])
* unavailable. In case of an error, the error is returned to the main
* loop, thereby exiting suricatta. */
server_op_res_t state_handled;
- while ((state_handled = server_handle_initial_state(update_state)) !=
- SERVER_OK) {
- if (state_handled == SERVER_EAGAIN) {
- INFO("Sleeping for %ds until retrying...\n",
- INITIAL_STATUS_REPORT_WAIT_DELAY);
- sleep(INITIAL_STATUS_REPORT_WAIT_DELAY);
- continue;
+ server_hawkbit.update_state = update_state;
+
+ /*
+ * If in WAIT state, the updated was finished
+ * by an external process and we have to wait for it
+ */
+ if (update_state != STATE_WAIT) {
+ while ((state_handled = server_handle_initial_state(update_state)) !=
+ SERVER_OK) {
+ if (state_handled == SERVER_EAGAIN) {
+ INFO("Sleeping for %ds until retrying...\n",
+ INITIAL_STATUS_REPORT_WAIT_DELAY);
+ sleep(INITIAL_STATUS_REPORT_WAIT_DELAY);
+ continue;
+ }
+ return state_handled; /* Report error to main loop, exiting. */
}
- return state_handled; /* Report error to main loop, exiting. */
}

return SERVER_OK;
@@ -1325,12 +1357,99 @@ server_op_res_t server_stop(void)

server_op_res_t server_ipc(int fd)
{
- char buf[4096];
+ ipc_message msg;
int ret;
+ int i;
+ char **s;
+ server_op_res_t result = SERVER_OK;
+ char *cmd;
+ char *state;
+ update_state_t update_state = STATE_NOT_AVAILABLE;
+
+ ret = read(fd, &msg, sizeof(msg));
+ if (ret != sizeof(msg))
+ return SERVER_EERR;
+
+ /*
+ * MAGIC and header is checked by the
+ * network daemon, do not repeat checks
+ * here. Test just payload.
+ */
+ s = string_split(msg.data.instmsg.buf, ',');

- ret = read(fd, buf, sizeof(buf));
+ if (!s) {
+ result = SERVER_EERR;
+ goto server_ipc_end;
+ }
+
+ /*
+ * it accepts a comma separated list of options,
+ * first of them is the command
+ */

- printf("%s read %d bytes\n", __func__, ret);
+ for (i = 0; *(s + i); i++) {
+ switch (i) {
+ case 0:
+ cmd = *s;
+ /* check for command, at the momen just feedback */
+ if (strcmp(cmd, "feedback")) {
+ result = SERVER_EERR;
+ goto server_ipc_end;
+ }
+ break;
+ case 1:
+ state = *(s + i);
+ update_state = (unsigned int)*state;
+ switch (update_state) {
+ case STATE_INSTALLED:
+ case STATE_TESTING:
+ case STATE_FAILED:
+ break;
+
+ default:
+ goto server_ipc_end;
+ }
+ break;
+ }
+ }
+
+ /*
+ * feedback requires arguments, if not found returns an error
+ */
+
+ if (i < 5) {
+ result = SERVER_EERR;
+ goto server_ipc_end;
+ }
+
+ const char *reply_result = *(s + 2);
+ const char *reply_execution = *(s + 3);
+ const char *reply_message = *(s + 4);
+
+ if (handle_feedback(update_state, reply_result, reply_execution,
+ reply_message) != SERVER_UPDATE_AVAILABLE)
+ result = SERVER_EERR;
+ else
+ server_hawkbit.update_state = SERVER_OK;
+
+server_ipc_end:
+ if (result == SERVER_EERR) {
+ msg.type = NACK;
+ } else
+ msg.type = ACK;
+
+ msg.data.instmsg.len = 0;
+
+ if (write(fd, &msg, sizeof(msg)) != sizeof(msg)) {
+ TRACE("IPC ERROR: sending back msg");
+ }
+
+ /* Send ipc back */
+
+ for (i = 0; *(s + i); i++) {
+ free(*(s + i));
+ }
+ free(s);

return SERVER_OK;
}
diff --git a/suricatta/server_hawkbit.h b/suricatta/server_hawkbit.h
index 89ad465..5e727ce 100644
--- a/suricatta/server_hawkbit.h
+++ b/suricatta/server_hawkbit.h
@@ -36,6 +36,7 @@ typedef struct {
struct dictlist configdata;
bool has_to_send_configData;
char *configData_url;
+ update_state_t update_state;
} server_hawkbit_t;

extern server_hawkbit_t server_hawkbit;
--
2.7.4

Stefano Babic

unread,
Feb 11, 2017, 9:47:20 AM2/11/17
to swup...@googlegroups.com, Stefano Babic
This example shows how to send a command to
a SWUpdate Process ,in this case suricatta.
It sends "feedback" to inform the Hawkbit
server about the result of the installation.

Signed-off-by: Stefano Babic <sba...@denx.de>
---
examples/sendtohawkbit/Makefile | 8 ++++
examples/sendtohawkbit/sendcmd | Bin 0 -> 34056 bytes
examples/sendtohawkbit/sendcmd.c | 95 +++++++++++++++++++++++++++++++++++++++
3 files changed, 103 insertions(+)
create mode 100644 examples/sendtohawkbit/Makefile
create mode 100755 examples/sendtohawkbit/sendcmd
create mode 100644 examples/sendtohawkbit/sendcmd.c

diff --git a/examples/sendtohawkbit/Makefile b/examples/sendtohawkbit/Makefile
new file mode 100644
index 0000000..306c4b9
--- /dev/null
+++ b/examples/sendtohawkbit/Makefile
@@ -0,0 +1,8 @@
+
+all: sendcmd
+
+sendcmd: sendcmd.c
+ ${CC} -g -o sendcmd -I../../include sendcmd.c ../../ipc/lib.a -lpthread
+
+clean:
+ @rm -f sendcmd
diff --git a/examples/sendtohawkbit/sendcmd b/examples/sendtohawkbit/sendcmd
new file mode 100755
index 0000000000000000000000000000000000000000..857f775aeb0ce0b5522424b0d73cf6ef4380fff9
GIT binary patch
literal 34056
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
Ye%gPW%XoP3OI7~9sLU2sAJcyS7b83r(f|Me

literal 0
HcmV?d00001

diff --git a/examples/sendtohawkbit/sendcmd.c b/examples/sendtohawkbit/sendcmd.c
new file mode 100644
index 0000000..ef46dab
--- /dev/null
+++ b/examples/sendtohawkbit/sendcmd.c
@@ -0,0 +1,95 @@
+/*
+ * (C) Copyright 2017
+ * Stefano Babic, DENX Software Engineering, sba...@denx.de.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+/*
+ * This is a simple example how to send a command to
+ * a SWUpdate's subprocess. It sends a "feedback"
+ * to the suricatta module and waits for the answer.
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+#include <sys/ioctl.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include "network_ipc.h"
+
+void usage(void) {
+ printf("sendcmd <state> <finished> <execution> <details>\n");
+}
+
+char buf[256];
+int fd;
+int verbose = 1;
+
+/*
+ * Simple example, it does nothing but calling the library
+ */
+int main(int argc, char *argv[]) {
+ int c;
+ const char *fn;
+ int rc, written, i;
+ char *progname;
+ ipc_message msg;
+ size_t size;
+ char *buf;
+
+ if (argc < 3) {
+ usage;
+ exit(1);
+ }
+
+ memset(&msg, 0, sizeof(msg));
+ msg.data.instmsg.source = SOURCE_SURICATTA;
+
+ size = sizeof(msg.data.instmsg.buf);
+ buf = msg.data.instmsg.buf;
+
+ /*
+ * do not check anything, let SWUpdate
+ * doing the checks
+ * An error or a NACK is returned in
+ * case of failure
+ */
+ for (i = 1; i < argc; i++) {
+ if (i == 1) {
+ written = snprintf(buf, size, "%s", argv[i]);
+ } else {
+ written = snprintf(buf, size, ",%s", argv[i]);
+ }
+
+ buf += written;
+ size -= written;
+ }
+ fprintf(stdout, "Sending: '%s'", msg.data.instmsg.buf);
+
+ rc = ipc_send_cmd(&msg);
+
+ fprintf(stdout, " returned %d\n", rc);
+ if (!rc)
+ fprintf(stdout, "Server returns %s\n",
+ (msg.type == ACK) ? "ACK" : "NACK");
+
+ exit(0);
+}
+
--
2.7.4

Mirza Krak

unread,
Feb 11, 2017, 2:47:26 PM2/11/17
to Stefano Babic, swup...@googlegroups.com
On 11 Feb 2017 15:47, "Stefano Babic" <sba...@denx.de> wrote:
This example shows how to send a command to
a SWUpdate Process ,in this case suricatta.
It sends "feedback" to inform the Hawkbit
server about the result of the installation.

Signed-off-by: Stefano Babic <sba...@denx.de>
---
 examples/sendtohawkbit/Makefile  |   8 ++++
 examples/sendtohawkbit/sendcmd   | Bin 0 -> 34056 bytes

Intentional commit of binary file?

Best Regards
Mirza

Stefano Babic

unread,
Feb 11, 2017, 4:05:49 PM2/11/17
to Mirza Krak, Stefano Babic, swup...@googlegroups.com
Hi,

On 11/02/2017 20:47, Mirza Krak wrote:
> On 11 Feb 2017 15:47, "Stefano Babic" <sba...@denx.de
> <mailto:sba...@denx.de>> wrote:
>
> This example shows how to send a command to
> a SWUpdate Process ,in this case suricatta.
> It sends "feedback" to inform the Hawkbit
> server about the result of the installation.
>
> Signed-off-by: Stefano Babic <sba...@denx.de <mailto:sba...@denx.de>>
> ---
> examples/sendtohawkbit/Makefile | 8 ++++
> examples/sendtohawkbit/sendcmd | Bin 0 -> 34056 bytes
>
> Intentional commit of binary file?
>

Ouch ! Of course, not...

Stefano

--
=====================================================================
DENX Software Engineering GmbH, Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sba...@denx.de
=====================================================================

Christian Storm

unread,
Feb 13, 2017, 4:51:59 AM2/13/17
to swup...@googlegroups.com
Hi Stefano,

> Add entry point to be called to communicate with
> the server, and implements the function in the hawkbit
> server.
>
> Signed-off-by: Stefano Babic <sba...@denx.de>
> ---
> include/suricatta/server.h | 3 +++
> suricatta/server_hawkbit.c | 13 +++++++++
> suricatta/suricatta.c | 67 ++++++++++++++++++++++++++++++++++------------
> 3 files changed, 66 insertions(+), 17 deletions(-)
>
> [...]
I get a compile error:

suricatta/suricatta.c: In function ‘start_suricatta’:
suricatta/suricatta.c:46:15: error: ‘sw_sockfd’ undeclared (first use in this function)
server.ipc(sw_sockfd);



Kind regards,
Christian

Stefano Babic

unread,
Feb 13, 2017, 5:15:08 AM2/13/17
to swup...@googlegroups.com, Christian Storm
It looks like that pathch 1/8 is not applied. sockfd is defined extern
in pctl.h and the file is included here.

Best regards,

Christian Storm

unread,
Feb 13, 2017, 5:15:41 AM2/13/17
to swup...@googlegroups.com
Hi Stefano,
Is the function pctl_getfd_from_type() actually defined anywhere or did
I miss some git am? I get linker errors:
corelib/network_thread.c:220: undefined reference to `pctl_getfd_from_type'
corelib/network_thread.c:226: undefined reference to `pctl_getname_from_type'
and found the only references being in corelib/network_thread.c.



Kind regards,
Christian

Stefano Babic

unread,
Feb 13, 2017, 5:23:13 AM2/13/17
to Christian Storm, swup...@googlegroups.com
Something is missing. Let me check. I submit a V2 fixing the binary
introduced in last commit.

Just wait some minutes.

Christian Storm

unread,
Feb 13, 2017, 6:16:02 AM2/13/17
to swup...@googlegroups.com
Hi Stefano,

> >> + pipe = pctl_getfd_from_type(msg.data.instmsg.source);
> >
> > Is the function pctl_getfd_from_type() actually defined anywhere or did
> > I miss some git am? I get linker errors:
> > corelib/network_thread.c:220: undefined reference to `pctl_getfd_from_type'
> > corelib/network_thread.c:226: undefined reference to `pctl_getname_from_type'
> > and found the only references being in corelib/network_thread.c.
> >
>
> Something is missing. Let me check. I submit a V2 fixing the binary
> introduced in last commit.
>
> Just wait some minutes.


Thanks! SWUpdate compiles and links now.


Kind regards,
Christian
Reply all
Reply to author
Forward
0 new messages