diff options
Diffstat (limited to 'lib/pb-protocol')
-rw-r--r-- | lib/pb-protocol/pb-protocol.c | 177 | ||||
-rw-r--r-- | lib/pb-protocol/pb-protocol.h | 17 |
2 files changed, 101 insertions, 93 deletions
diff --git a/lib/pb-protocol/pb-protocol.c b/lib/pb-protocol/pb-protocol.c index c6d8f63..ded35eb 100644 --- a/lib/pb-protocol/pb-protocol.c +++ b/lib/pb-protocol/pb-protocol.c @@ -161,26 +161,23 @@ static int optional_strlen(const char *str) int pb_protocol_device_len(const struct device *dev) { - struct boot_option *opt; - int len; - - len = 4 + optional_strlen(dev->id) + + return 4 + optional_strlen(dev->id) + 4 + optional_strlen(dev->name) + 4 + optional_strlen(dev->description) + - 4 + optional_strlen(dev->icon_file) + - 4; + 4 + optional_strlen(dev->icon_file); +} - list_for_each_entry(&dev->boot_options, opt, list) { - len += 4 + optional_strlen(opt->id) + - 4 + optional_strlen(opt->name) + - 4 + optional_strlen(opt->description) + - 4 + optional_strlen(opt->icon_file) + - 4 + optional_strlen(opt->boot_image_file) + - 4 + optional_strlen(opt->initrd_file) + - 4 + optional_strlen(opt->boot_args); - } +int pb_protocol_boot_option_len(const struct boot_option *opt) +{ - return len; + return 4 + optional_strlen(opt->device_id) + + 4 + optional_strlen(opt->id) + + 4 + optional_strlen(opt->name) + + 4 + optional_strlen(opt->description) + + 4 + optional_strlen(opt->icon_file) + + 4 + optional_strlen(opt->boot_image_file) + + 4 + optional_strlen(opt->initrd_file) + + 4 + optional_strlen(opt->boot_args); } int pb_protocol_boot_len(const struct boot_command *boot) @@ -191,39 +188,35 @@ int pb_protocol_boot_len(const struct boot_command *boot) 4 + optional_strlen(boot->boot_args); } -int pb_protocol_serialise_device(const struct device *dev, char *buf, int buf_len) +int pb_protocol_serialise_device(const struct device *dev, + char *buf, int buf_len) { - struct boot_option *opt; - uint32_t n; - char *pos; - - pos = buf; + char *pos = buf; - /* construct payload into buffer */ pos += pb_protocol_serialise_string(pos, dev->id); pos += pb_protocol_serialise_string(pos, dev->name); pos += pb_protocol_serialise_string(pos, dev->description); pos += pb_protocol_serialise_string(pos, dev->icon_file); - /* write option count */ - n = 0; + assert(pos <= buf + buf_len); + (void)buf_len; - list_for_each_entry(&dev->boot_options, opt, list) - n++; + return 0; +} - *(uint32_t *)pos = __cpu_to_be32(n); - pos += sizeof(uint32_t); +int pb_protocol_serialise_boot_option(const struct boot_option *opt, + char *buf, int buf_len) +{ + char *pos = buf; - /* write each option */ - list_for_each_entry(&dev->boot_options, opt, list) { - pos += pb_protocol_serialise_string(pos, opt->id); - pos += pb_protocol_serialise_string(pos, opt->name); - pos += pb_protocol_serialise_string(pos, opt->description); - pos += pb_protocol_serialise_string(pos, opt->icon_file); - pos += pb_protocol_serialise_string(pos, opt->boot_image_file); - pos += pb_protocol_serialise_string(pos, opt->initrd_file); - pos += pb_protocol_serialise_string(pos, opt->boot_args); - } + pos += pb_protocol_serialise_string(pos, opt->device_id); + pos += pb_protocol_serialise_string(pos, opt->id); + pos += pb_protocol_serialise_string(pos, opt->name); + pos += pb_protocol_serialise_string(pos, opt->description); + pos += pb_protocol_serialise_string(pos, opt->icon_file); + pos += pb_protocol_serialise_string(pos, opt->boot_image_file); + pos += pb_protocol_serialise_string(pos, opt->initrd_file); + pos += pb_protocol_serialise_string(pos, opt->boot_args); assert(pos <= buf + buf_len); (void)buf_len; @@ -341,89 +334,95 @@ struct pb_protocol_message *pb_protocol_read_message(void *ctx, int fd) int pb_protocol_deserialise_device(struct device *dev, const struct pb_protocol_message *message) { - const char *pos; - int i, n_options; unsigned int len; + const char *pos; + int rc = -1; len = message->payload_len; pos = message->payload; if (read_string(dev, &pos, &len, &dev->id)) - goto out_err; + goto out; if (read_string(dev, &pos, &len, &dev->name)) - goto out_err; + goto out; if (read_string(dev, &pos, &len, &dev->description)) - goto out_err; + goto out; if (read_string(dev, &pos, &len, &dev->icon_file)) - goto out_err; + goto out; - n_options = __be32_to_cpu(*(uint32_t *)pos); - pos += sizeof(uint32_t); + rc = 0; - dev->n_options = n_options; - - list_init(&dev->boot_options); - - for (i = 0; i < n_options; i++) { - struct boot_option *opt; - - opt = talloc(dev, struct boot_option); - - if (read_string(opt, &pos, &len, &opt->id)) - goto out_err; - if (read_string(opt, &pos, &len, &opt->name)) - goto out_err; - if (read_string(opt, &pos, &len, - &opt->description)) - goto out_err; - if (read_string(opt, &pos, &len, - &opt->icon_file)) - goto out_err; - if (read_string(opt, &pos, &len, - &opt->boot_image_file)) - goto out_err; - if (read_string(opt, &pos, &len, - &opt->initrd_file)) - goto out_err; - if (read_string(opt, &pos, &len, - &opt->boot_args)) - goto out_err; - - list_add(&dev->boot_options, &opt->list); - } +out: + return rc; +} - return 0; +int pb_protocol_deserialise_boot_option(struct boot_option *opt, + const struct pb_protocol_message *message) +{ + unsigned int len; + const char *pos; + int rc = -1; -out_err: - return -1; + len = message->payload_len; + pos = message->payload; + + if (read_string(opt, &pos, &len, &opt->device_id)) + goto out; + + if (read_string(opt, &pos, &len, &opt->id)) + goto out; + + if (read_string(opt, &pos, &len, &opt->name)) + goto out; + + if (read_string(opt, &pos, &len, &opt->description)) + goto out; + + if (read_string(opt, &pos, &len, &opt->icon_file)) + goto out; + + if (read_string(opt, &pos, &len, &opt->boot_image_file)) + goto out; + + if (read_string(opt, &pos, &len, &opt->initrd_file)) + goto out; + + if (read_string(opt, &pos, &len, &opt->boot_args)) + goto out; + + rc = 0; + +out: + return rc; } int pb_protocol_deserialise_boot_command(struct boot_command *cmd, const struct pb_protocol_message *message) { - const char *pos; unsigned int len; + const char *pos; + int rc = -1; len = message->payload_len; pos = message->payload; if (read_string(cmd, &pos, &len, &cmd->option_id)) - goto out_err; + goto out; if (read_string(cmd, &pos, &len, &cmd->boot_image_file)) - goto out_err; + goto out; if (read_string(cmd, &pos, &len, &cmd->initrd_file)) - goto out_err; + goto out; if (read_string(cmd, &pos, &len, &cmd->boot_args)) - goto out_err; + goto out; - return 0; + rc = 0; -out_err: - return -1; +out: + return rc; } diff --git a/lib/pb-protocol/pb-protocol.h b/lib/pb-protocol/pb-protocol.h index de2ae7c..35e96f0 100644 --- a/lib/pb-protocol/pb-protocol.h +++ b/lib/pb-protocol/pb-protocol.h @@ -12,9 +12,11 @@ #define PB_PROTOCOL_MAX_PAYLOAD_SIZE (64 * 1024) enum pb_protocol_action { - PB_PROTOCOL_ACTION_ADD = 0x1, - PB_PROTOCOL_ACTION_REMOVE = 0x2, - PB_PROTOCOL_ACTION_BOOT = 0x3, + PB_PROTOCOL_ACTION_DEVICE_ADD = 0x1, + PB_PROTOCOL_ACTION_BOOT_OPTION_ADD = 0x2, + PB_PROTOCOL_ACTION_DEVICE_REMOVE = 0x3, +/* PB_PROTOCOL_ACTION_BOOT_OPTION_REMOVE = 0x4, */ + PB_PROTOCOL_ACTION_BOOT = 0x5, }; struct pb_protocol_message { @@ -26,6 +28,7 @@ struct pb_protocol_message { void pb_protocol_dump_device(const struct device *dev, const char *text, FILE *stream); 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_device_cmp(const struct device *a, const struct device *b); @@ -36,7 +39,10 @@ int pb_protocol_serialise_string(char *pos, const char *str); char *pb_protocol_deserialise_string(void *ctx, const struct pb_protocol_message *message); -int pb_protocol_serialise_device(const struct device *dev, char *buf, int buf_len); +int pb_protocol_serialise_device(const struct device *dev, + char *buf, int buf_len); +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); @@ -50,6 +56,9 @@ struct pb_protocol_message *pb_protocol_read_message(void *ctx, int fd); int pb_protocol_deserialise_device(struct device *dev, const struct pb_protocol_message *message); +int pb_protocol_deserialise_boot_option(struct boot_option *opt, + const struct pb_protocol_message *message); + int pb_protocol_deserialise_boot_command(struct boot_command *cmd, const struct pb_protocol_message *message); |