diff options
Diffstat (limited to 'com32/chain/partiter.h')
-rw-r--r-- | com32/chain/partiter.h | 85 |
1 files changed, 51 insertions, 34 deletions
diff --git a/com32/chain/partiter.h b/com32/chain/partiter.h index 7deeb534..13dec848 100644 --- a/com32/chain/partiter.h +++ b/com32/chain/partiter.h @@ -1,8 +1,9 @@ /* ----------------------------------------------------------------------- * * - * Copyright 2003-2010 H. Peter Anvin - All Rights Reserved - * Copyright 2010 Michal Soltys + * Copyright 2003-2009 H. Peter Anvin - All Rights Reserved + * Copyright 2009-2010 Intel Corporation; author: H. Peter Anvin * Copyright 2010 Shao Miller + * Copyright 2010-2012 Michal Soltys * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation @@ -33,24 +34,26 @@ * Provides disk / partition iteration. */ -#ifndef _COM32_CHAIN_PARTITER_H -#define _COM32_CHAIN_PARTITER_H +#ifndef COM32_CHAIN_PARTITER_H +#define COM32_CHAIN_PARTITER_H #include <stdint.h> #include <syslinux/disk.h> -#define PI_ERRLOAD 3 -#define PI_INSANE 2 -#define PI_DONE 1 -#define PI_OK 0 +/* status */ + +enum {PI_OK, PI_DONE, PI_INSANE, PI_ERRLOAD}; + +/* flags */ + +enum {PIF_STEPALL = 1, PIF_RELAX = 2, PIF_PREFMBR = 4}; struct itertype; struct part_iter; struct itertype { - int (*ctor)(struct part_iter *, va_list *); void (*dtor)(struct part_iter *); - struct part_iter *(*next) (struct part_iter *); + int (*next)(struct part_iter *); }; #define PI_GPTLABSIZE ((int)sizeof(((struct disk_gpt_part_entry *)0)->name)) @@ -59,29 +62,29 @@ struct part_iter { const struct itertype *type; char *data; char *record; - uint64_t start_lba; + uint64_t abs_lba; uint64_t length; - int index; - int rawindex; + int index0; /* including holes, from -1 (disk, then parts from 0) */ + int index; /* excluding holes, from 0 (disk, then parts from 1), -1 means hole, if PIF_STEPALL is set */ + int flags; /* flags, see #defines above */ + int status; /* current status, see enums above */ struct disk_info di; - int stepall; - int status; - /* internal */ - int index0; - union _sub { - struct _dos { - uint32_t disk_sig; - uint32_t nebr_lba; - uint32_t cebr_lba; - /* internal */ - uint32_t ebr_start; - uint32_t ebr_size; - uint32_t bebr_start; - uint32_t bebr_size; - int bebr_index0; - int skipcnt; + union { + struct { + uint32_t disk_sig; /* 32bit disk signature as stored in MBR */ + + uint32_t bebr_lba; /* absolute lba of base extended partition */ + uint32_t bebr_siz; /* size of base extended partition */ + + uint32_t cebr_lba; /* absolute lba of curr ext. partition */ + uint32_t cebr_siz; /* size of curr ext. partition */ + uint32_t nebr_lba; /* absolute lba of next ext. partition */ + uint32_t nebr_siz; /* size of next ext. partition */ + + int bebr_index0; /* index of (0-3) of base ext. part., -1 if not present in MBR */ + int logskipcnt; /* how many logical holes were skipped */ } dos; - struct _gpt { + struct { struct guid disk_guid; struct guid part_guid; char part_label[PI_GPTLABSIZE/2+1]; @@ -90,17 +93,31 @@ struct part_iter { uint64_t ufirst; uint64_t ulast; } gpt; - } sub; + }; }; extern const struct itertype * const typedos; extern const struct itertype * const typegpt; extern const struct itertype * const typeraw; -struct part_iter *pi_begin(const struct disk_info *, int stepall); -struct part_iter *pi_new(const struct itertype *, ...); +struct part_iter *pi_begin(const struct disk_info *, int flags); void pi_del(struct part_iter **); -int pi_next(struct part_iter **); + +static inline int pi_errored(struct part_iter *iter) +{ + return iter->status > PI_DONE; +} + +/* inline virtuals */ +static inline int pi_next(struct part_iter *iter) +{ + return iter->type->next(iter); +} + +static inline void pi_dtor(struct part_iter *iter) +{ + iter->type->dtor(iter); +} #endif |