From: Simon Glass <simon.glass@canonical.com>
Extract the pxe_menu allocation and initialisation from parse_pxefile()
into a new pxe_menu_init() function. This provides symmetry with
pxe_menu_uninit() and allows callers to create a menu structure without
going through the full parsing flow.
Co-developed-by: Claude Opus 4.5 <noreply@anthropic.com>
Signed-off-by: Simon Glass <simon.glass@canonical.com>
---
boot/pxe_utils.c | 20 +++++++++++++++-----
include/pxe_utils.h | 11 +++++++++--
2 files changed, 24 insertions(+), 7 deletions(-)
@@ -900,6 +900,20 @@ static int label_boot(struct pxe_context *ctx, struct pxe_label *label)
return 1;
}
+struct pxe_menu *pxe_menu_init(void)
+{
+ struct pxe_menu *cfg;
+
+ cfg = malloc(sizeof(struct pxe_menu));
+ if (!cfg)
+ return NULL;
+
+ memset(cfg, '\0', sizeof(struct pxe_menu));
+ INIT_LIST_HEAD(&cfg->labels);
+
+ return cfg;
+}
+
void pxe_menu_uninit(struct pxe_menu *cfg)
{
struct list_head *pos, *n;
@@ -924,14 +938,10 @@ struct pxe_menu *parse_pxefile(struct pxe_context *ctx, unsigned long menucfg)
char *buf;
int r;
- cfg = malloc(sizeof(struct pxe_menu));
+ cfg = pxe_menu_init();
if (!cfg)
return NULL;
- memset(cfg, 0, sizeof(struct pxe_menu));
-
- INIT_LIST_HEAD(&cfg->labels);
-
buf = map_sysmem(menucfg, 0);
r = parse_pxefile_top(ctx, buf, menucfg, cfg, 1);
@@ -179,11 +179,18 @@ struct pxe_context {
};
/**
- * pxe_menu_uninit() - Destroy an allocated pxe structure
+ * pxe_menu_init() - Allocate and initialise a pxe_menu structure
+ *
+ * Return: Allocated structure, or NULL on failure
+ */
+struct pxe_menu *pxe_menu_init(void);
+
+/**
+ * pxe_menu_uninit() - Free a pxe_menu structure
*
* Free the memory used by a pxe_menu and its labels
*
- * @cfg: Config to destroy, previous returned from parse_pxefile()
+ * @cfg: Config to free, previously returned from pxe_menu_init()
*/
void pxe_menu_uninit(struct pxe_menu *cfg);