+#include <assert.h>
#include <string.h>
#include <stdint.h>
#include <asm/byteorder.h>
* 4-byte len, id
*/
+/* Deep copy a boot_option.
+*/
+struct boot_option *boot_option_copy(void* ctx, const struct boot_option *opt)
+{
+ struct boot_option *new = talloc(ctx, struct boot_option);
+
+ if (new) {
+ new->id = talloc_strdup(new, opt->id);
+ new->name = talloc_strdup(new, opt->name);
+ new->description = talloc_strdup(new, opt->description);
+ new->icon_file = talloc_strdup(new, opt->icon_file);
+ new->boot_image_file = talloc_strdup(new, opt->boot_image_file);
+ new->initrd_file = talloc_strdup(new, opt->initrd_file);
+ new->boot_args = talloc_strdup(new, opt->boot_args);
+ memset(&new->list, 0, sizeof(new->list));
+ }
+
+ return new;
+}
/* Write a string into the buffer, starting at pos.
*
* @param[out] str Pointer to resuling string
* @return zero on success, non-zero on failure
*/
-static int read_string(void *ctx, char **pos, int *len, char **str)
+static int read_string(void *ctx, const char **pos, unsigned int *len,
+ char **str)
{
uint32_t str_len, read_len;
}
char *pb_protocol_deserialise_string(void *ctx,
- struct pb_protocol_message *message)
+ const struct pb_protocol_message *message)
{
- char *buf, *str;
- int len;
+ const char *buf;
+ char *str;
+ unsigned int len;
len = message->payload_len;
buf = message->payload;
return strlen(str);
}
-int pb_protocol_device_len(struct device *dev)
+int pb_protocol_device_len(const struct device *dev)
{
struct boot_option *opt;
int len;
return len;
}
-int pb_protocol_serialise_device(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;
pos += pb_protocol_serialise_string(pos, opt->boot_args);
}
+ assert(pos <= buf + buf_len);
+
return 0;
}
struct pb_protocol_message *pb_protocol_read_message(void *ctx, int fd)
{
struct pb_protocol_message *message, m;
- int rc, len;
+ int rc;
+ unsigned int len;
/* use the stack for the initial 8-byte read */
struct device *pb_protocol_deserialise_device(void *ctx,
- struct pb_protocol_message *message)
+ const struct pb_protocol_message *message)
{
struct device *dev;
- char *pos;
- int i, n_options, len;
+ const char *pos;
+ int i, n_options;
+ unsigned int len;
len = message->payload_len;
pos = message->payload;