176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <stdlib.h>
276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <syslinux/linux.h>
376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <syslinux/loadfile.h>
476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct setup_data *setup_data_init(void)
676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    struct setup_data *setup_data;
876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    setup_data = zalloc(sizeof(*setup_data));
1076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    if (!setup_data)
1176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	return NULL;
1276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    setup_data->prev = setup_data->next = setup_data;
1476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    return setup_data;
1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanint setup_data_add(struct setup_data *head, uint32_t type,
1876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		   const void *data, size_t data_len)
1976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	struct setup_data *setup_data;
2176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
2276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	setup_data = zalloc(sizeof(*setup_data));
2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	if (!setup_data)
2476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    return -1;
2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
2676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	setup_data->data     = data;
2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	setup_data->hdr.len  = data_len;
2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	setup_data->hdr.type = type;
2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	setup_data->prev     = head->prev;
3076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	setup_data->next     = head;
3176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	head->prev->next     = setup_data;
3276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	head->prev           = setup_data;
3376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
3476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	return 0;
3576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
3676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
3776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanint setup_data_load(struct setup_data *head, uint32_t type,
3876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		    const char *filename)
3976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
4076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	void *data;
4176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	size_t len;
4276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
4376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	if (loadfile(filename, &data, &len))
4476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		return -1;
4576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
4676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	return setup_data_add(head, type, data, len);
4776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
48