From: Jeremy Kerr Date: Wed, 1 May 2013 01:18:44 +0000 (+0800) Subject: protocol: Add boot_status (de-)serialisation functions X-Git-Tag: v1.0.0~673 X-Git-Url: http://git.ozlabs.org/?p=petitboot;a=commitdiff_plain;h=6b87c9c7776796c766e3dcbdb32f5d292f7125d5;ds=sidebyside protocol: Add boot_status (de-)serialisation functions Add code to the pb-protocol layer to serialise and deserialise boot_status messages. Signed-off-by: Jeremy Kerr --- diff --git a/lib/pb-protocol/pb-protocol.c b/lib/pb-protocol/pb-protocol.c index ded35eb..2792bf8 100644 --- a/lib/pb-protocol/pb-protocol.c +++ b/lib/pb-protocol/pb-protocol.c @@ -188,6 +188,14 @@ int pb_protocol_boot_len(const struct boot_command *boot) 4 + optional_strlen(boot->boot_args); } +int pb_protocol_boot_status_len(const struct boot_status *status) +{ + return 4 + + 4 + optional_strlen(status->message) + + 4 + optional_strlen(status->detail) + + 4; +} + int pb_protocol_serialise_device(const struct device *dev, char *buf, int buf_len) { @@ -240,6 +248,26 @@ int pb_protocol_serialise_boot_command(const struct boot_command *boot, return 0; } +int pb_protocol_serialise_boot_status(const struct boot_status *status, + char *buf, int buf_len) +{ + char *pos = buf; + + *(uint32_t *)pos = __cpu_to_be32(status->type); + pos += sizeof(uint32_t); + + pos += pb_protocol_serialise_string(pos, status->message); + pos += pb_protocol_serialise_string(pos, status->detail); + + *(uint32_t *)pos = __cpu_to_be32(status->type); + pos += sizeof(uint32_t); + + assert(pos <= buf + buf_len); + (void)buf_len; + + return 0; +} + int pb_protocol_write_message(int fd, struct pb_protocol_message *message) { int total_len, rc; @@ -426,3 +454,53 @@ int pb_protocol_deserialise_boot_command(struct boot_command *cmd, out: return rc; } + +int pb_protocol_deserialise_boot_status(struct boot_status *status, + const struct pb_protocol_message *message) +{ + unsigned int len; + const char *pos; + int rc = -1; + + len = message->payload_len; + pos = message->payload; + + /* first up, the type enum... */ + if (len < sizeof(uint32_t)) + goto out; + + status->type = __be32_to_cpu(*(uint32_t *)(pos)); + + switch (status->type) { + case BOOT_STATUS_ERROR: + case BOOT_STATUS_INFO: + break; + default: + goto out; + } + + pos += sizeof(uint32_t); + len -= sizeof(uint32_t); + + /* message and detail strings */ + if (read_string(status, &pos, &len, &status->message)) + goto out; + + if (read_string(status, &pos, &len, &status->detail)) + goto out; + + /* and finally, progress */ + if (len < sizeof(uint32_t)) + goto out; + + status->progress = __be32_to_cpu(*(uint32_t *)(pos)); + + /* clamp to 100% */ + if (status->progress > 100) + status->progress = 100; + + rc = 0; + +out: + return rc; +} diff --git a/lib/pb-protocol/pb-protocol.h b/lib/pb-protocol/pb-protocol.h index 4451700..0390f66 100644 --- a/lib/pb-protocol/pb-protocol.h +++ b/lib/pb-protocol/pb-protocol.h @@ -31,6 +31,7 @@ void pb_protocol_dump_device(const struct device *dev, const char *text, int pb_protocol_device_len(const struct device *dev); int pb_protocol_boot_option_len(const struct boot_option *opt); int pb_protocol_boot_len(const struct boot_command *boot); +int pb_protocol_boot_status_len(const struct boot_status *status); int pb_protocol_device_cmp(const struct device *a, const struct device *b); int pb_protocol_boot_option_cmp(const struct boot_option *a, @@ -46,6 +47,8 @@ int pb_protocol_serialise_boot_option(const struct boot_option *opt, char *buf, int buf_len); int pb_protocol_serialise_boot_command(const struct boot_command *boot, char *buf, int buf_len); +int pb_protocol_serialise_boot_status(const struct boot_status *status, + char *buf, int buf_len); int pb_protocol_write_message(int fd, struct pb_protocol_message *message); @@ -63,4 +66,7 @@ int pb_protocol_deserialise_boot_option(struct boot_option *opt, int pb_protocol_deserialise_boot_command(struct boot_command *cmd, const struct pb_protocol_message *message); +int pb_protocol_deserialise_boot_status(struct boot_status *status, + const struct pb_protocol_message *message); + #endif /* _PB_PROTOCOL_H */