From: Karel Zak Date: Fri, 30 Nov 2012 15:39:57 +0000 (+0100) Subject: libfdisk: add parttype code X-Git-Tag: v2.23-rc1~167 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a5fe1b3f1d136b943fb73ab3b9a9c889c642dbfb;p=thirdparty%2Futil-linux.git libfdisk: add parttype code Signed-off-by: Karel Zak --- diff --git a/fdisks/fdisk.h b/fdisks/fdisk.h index efc9969b68..82313c91e8 100644 --- a/fdisks/fdisk.h +++ b/fdisks/fdisk.h @@ -95,16 +95,6 @@ extern struct fdisk_parttype *fdisk_get_partition_type(struct fdisk_context *cxt extern int fdisk_set_partition_type(struct fdisk_context *cxt, int partnum, struct fdisk_parttype *t); -extern size_t fdisk_get_nparttypes(struct fdisk_context *cxt); -extern struct fdisk_parttype *fdisk_get_parttype_from_code(struct fdisk_context *cxt, - unsigned int code); -extern struct fdisk_parttype *fdisk_get_parttype_from_string(struct fdisk_context *cxt, - const char *str); -extern struct fdisk_parttype *fdisk_parse_parttype(struct fdisk_context *cxt, const char *str); - -extern struct fdisk_parttype *fdisk_new_unknown_parttype(unsigned int type, const char *typestr); -extern void fdisk_free_parttype(struct fdisk_parttype *type); - extern sector_t fdisk_topology_get_first_lba(struct fdisk_context *cxt); extern unsigned long fdisk_topology_get_grain(struct fdisk_context *cxt); diff --git a/fdisks/utils.c b/fdisks/utils.c index d1ea819594..9588311fc9 100644 --- a/fdisks/utils.c +++ b/fdisks/utils.c @@ -646,211 +646,5 @@ void fdisk_free_context(struct fdisk_context *cxt) free(cxt); } -/** - * fdisk_get_nparttypes: - * @cxt: fdisk context - * - * Returns: number of partition types supported by the current label - */ -size_t fdisk_get_nparttypes(struct fdisk_context *cxt) -{ - if (!cxt || !cxt->label) - return 0; - - return cxt->label->nparttypes; -} - -/** - * fdisk_get_parttype_from_code: - * @cxt: fdisk context - * @code: code to search for - * - * Search in lable-specific table of supported partition types by code. - * - * Returns partition type or NULL upon failure or invalid @code. - */ -struct fdisk_parttype *fdisk_get_parttype_from_code( - struct fdisk_context *cxt, - unsigned int code) -{ - size_t i; - - if (!fdisk_get_nparttypes(cxt)) - return NULL; - - for (i = 0; i < cxt->label->nparttypes; i++) - if (cxt->label->parttypes[i].type == code) - return &cxt->label->parttypes[i]; - - return NULL; -} - -/** - * fdisk_get_parttype_from_string: - * @cxt: fdisk context - * @str: string to search for - * - * Search in lable-specific table of supported partition types by typestr. - * - * Returns partition type or NULL upon failure or invalid @str. - */ -struct fdisk_parttype *fdisk_get_parttype_from_string( - struct fdisk_context *cxt, - const char *str) -{ - size_t i; - - if (!fdisk_get_nparttypes(cxt)) - return NULL; - - for (i = 0; i < cxt->label->nparttypes; i++) - if (cxt->label->parttypes[i].typestr - &&strcasecmp(cxt->label->parttypes[i].typestr, str) == 0) - return &cxt->label->parttypes[i]; - - return NULL; -} - -/** - * fdisk_new_unknown_parttype: - * @type: type as number - * @typestr: type as string - - * Allocates new 'unknown' partition type. Use fdisk_free_parttype() to - * deallocate. - * - * Returns newly allocated partition type, or NULL upon failure. - */ -struct fdisk_parttype *fdisk_new_unknown_parttype(unsigned int type, - const char *typestr) -{ - struct fdisk_parttype *t; - - t = calloc(1, sizeof(*t)); - if (!t) - return NULL; - - if (typestr) { - t->typestr = strdup(typestr); - if (!t->typestr) { - free(t); - return NULL; - } - } - t->name = _("unknown"); - t->type = type; - t->flags |= FDISK_PARTTYPE_UNKNOWN | FDISK_PARTTYPE_ALLOCATED; - - DBG(LABEL, dbgprint("allocated new unknown type [%p]", t)); - return t; -} - -/** - * fdisk_parse_parttype: - * @cxt: fdisk context - * @str: string to parse from - * - * Returns pointer to static table of the partition types, or newly allocated - * partition type for unknown types. It's safe to call fdisk_free_parttype() - * for all results. - */ -struct fdisk_parttype *fdisk_parse_parttype( - struct fdisk_context *cxt, - const char *str) -{ - struct fdisk_parttype *types, *ret; - unsigned int code = 0; - char *typestr = NULL, *end = NULL; - - if (!fdisk_get_nparttypes(cxt)) - return NULL; - - DBG(LABEL, dbgprint("parsing '%s' partition type", str)); - - types = cxt->label->parttypes; - if (types[0].typestr == NULL && isxdigit(*str)) { - - errno = 0; - code = strtol(str, &end, 16); - - if (errno || *end != '\0') { - DBG(LABEL, dbgprint("parsing failed: %m")); - return NULL; - } - ret = fdisk_get_parttype_from_code(cxt, code); - if (ret) - goto done; - } else { - int i; - - /* maybe specified by type string (e.g. UUID) */ - ret = fdisk_get_parttype_from_string(cxt, str); - if (ret) - goto done; - - /* maybe specified by order number */ - errno = 0; - i = strtol(str, &end, 0); - if (errno == 0 && *end == '\0' && i > 0 - && i - 1 < (int) fdisk_get_nparttypes(cxt)) { - ret = &types[i - 1]; - goto done; - } - } - - ret = fdisk_new_unknown_parttype(code, typestr); -done: - DBG(LABEL, dbgprint("returns '%s' partition type", ret->name)); - return ret; -} - -/** - * fdisk_free_parttype: - * @t: new type - * - * Free the @type. - */ -void fdisk_free_parttype(struct fdisk_parttype *t) -{ - if (t && (t->flags & FDISK_PARTTYPE_ALLOCATED)) { - DBG(LABEL, dbgprint("freeing %p partition type", t)); - free(t->typestr); - free(t); - } -} - -/** - * fdisk_get_partition_type: - * @cxt: fdisk context - * @partnum: partition number - * - * Returns partition type or NULL upon failure. - */ -struct fdisk_parttype *fdisk_get_partition_type(struct fdisk_context *cxt, int partnum) -{ - if (!cxt || !cxt->label || !cxt->label->part_get_type) - return NULL; - - DBG(LABEL, dbgprint("partition: %d: get type", partnum)); - return cxt->label->part_get_type(cxt, partnum); -} - -/** - * fdisk_set_partition_type: - * @cxt: fdisk context - * @partnum: partition number - * @t: new type - * - * Returns 0 on success, < 0 on error. - */ -int fdisk_set_partition_type(struct fdisk_context *cxt, int partnum, - struct fdisk_parttype *t) -{ - if (!cxt || !cxt->label || !cxt->label->part_set_type) - return -EINVAL; - - DBG(LABEL, dbgprint("partition: %d: set type", partnum)); - return cxt->label->part_set_type(cxt, partnum, t); -} diff --git a/libfdisk/src/Makemodule.am b/libfdisk/src/Makemodule.am index 4b2d0e7f14..66cbe872c9 100644 --- a/libfdisk/src/Makemodule.am +++ b/libfdisk/src/Makemodule.am @@ -8,7 +8,8 @@ noinst_LTLIBRARIES += libfdisk.la libfdisk_la_SOURCES = \ libfdisk/src/libfdisk.h \ \ - libfdisk/src/init.c + libfdisk/src/init.c \ + libfdisk/src/parttype.c nodist_libfdisk_la_SOURCES = libfdisk/src/fdiskP.h diff --git a/libfdisk/src/libfdisk.h b/libfdisk/src/libfdisk.h index fcb69b76d1..33187fe5a2 100644 --- a/libfdisk/src/libfdisk.h +++ b/libfdisk/src/libfdisk.h @@ -25,9 +25,23 @@ extern "C" { #endif +struct fdisk_context; +struct fdisk_parttype; + /* init.c */ extern void fdisk_init_debug(int mask); +/* parttype.c */ +extern struct fdisk_parttype *fdisk_get_parttype_from_code(struct fdisk_context *cxt, + unsigned int code); +extern struct fdisk_parttype *fdisk_get_parttype_from_string(struct fdisk_context *cxt, + const char *str); +extern struct fdisk_parttype *fdisk_parse_parttype(struct fdisk_context *cxt, const char *str); + +extern struct fdisk_parttype *fdisk_new_unknown_parttype(unsigned int type, const char *typestr); +extern void fdisk_free_parttype(struct fdisk_parttype *type); +extern size_t fdisk_get_nparttypes(struct fdisk_context *cxt); + #ifdef __cplusplus } #endif diff --git a/libfdisk/src/parttype.c b/libfdisk/src/parttype.c new file mode 100644 index 0000000000..1d9f4e8027 --- /dev/null +++ b/libfdisk/src/parttype.c @@ -0,0 +1,214 @@ + +#include + +#include "nls.h" + +#include "fdiskP.h" + +/** + * fdisk_get_parttype_from_code: + * @cxt: fdisk context + * @code: code to search for + * + * Search in lable-specific table of supported partition types by code. + * + * Returns partition type or NULL upon failure or invalid @code. + */ +struct fdisk_parttype *fdisk_get_parttype_from_code( + struct fdisk_context *cxt, + unsigned int code) +{ + size_t i; + + if (!fdisk_get_nparttypes(cxt)) + return NULL; + + for (i = 0; i < cxt->label->nparttypes; i++) + if (cxt->label->parttypes[i].type == code) + return &cxt->label->parttypes[i]; + + return NULL; +} + +/** + * fdisk_get_parttype_from_string: + * @cxt: fdisk context + * @str: string to search for + * + * Search in lable-specific table of supported partition types by typestr. + * + * Returns partition type or NULL upon failure or invalid @str. + */ +struct fdisk_parttype *fdisk_get_parttype_from_string( + struct fdisk_context *cxt, + const char *str) +{ + size_t i; + + if (!fdisk_get_nparttypes(cxt)) + return NULL; + + for (i = 0; i < cxt->label->nparttypes; i++) + if (cxt->label->parttypes[i].typestr + &&strcasecmp(cxt->label->parttypes[i].typestr, str) == 0) + return &cxt->label->parttypes[i]; + + return NULL; +} + +/** + * fdisk_new_unknown_parttype: + * @type: type as number + * @typestr: type as string + + * Allocates new 'unknown' partition type. Use fdisk_free_parttype() to + * deallocate. + * + * Returns newly allocated partition type, or NULL upon failure. + */ +struct fdisk_parttype *fdisk_new_unknown_parttype(unsigned int type, + const char *typestr) +{ + struct fdisk_parttype *t; + + t = calloc(1, sizeof(*t)); + if (!t) + return NULL; + + if (typestr) { + t->typestr = strdup(typestr); + if (!t->typestr) { + free(t); + return NULL; + } + } + t->name = _("unknown"); + t->type = type; + t->flags |= FDISK_PARTTYPE_UNKNOWN | FDISK_PARTTYPE_ALLOCATED; + + DBG(LABEL, dbgprint("allocated new unknown type [%p]", t)); + return t; +} + +/** + * fdisk_parse_parttype: + * @cxt: fdisk context + * @str: string to parse from + * + * Returns pointer to static table of the partition types, or newly allocated + * partition type for unknown types. It's safe to call fdisk_free_parttype() + * for all results. + */ +struct fdisk_parttype *fdisk_parse_parttype( + struct fdisk_context *cxt, + const char *str) +{ + struct fdisk_parttype *types, *ret; + unsigned int code = 0; + char *typestr = NULL, *end = NULL; + + if (!fdisk_get_nparttypes(cxt)) + return NULL; + + DBG(LABEL, dbgprint("parsing '%s' partition type", str)); + + types = cxt->label->parttypes; + + if (types[0].typestr == NULL && isxdigit(*str)) { + + errno = 0; + code = strtol(str, &end, 16); + + if (errno || *end != '\0') { + DBG(LABEL, dbgprint("parsing failed: %m")); + return NULL; + } + ret = fdisk_get_parttype_from_code(cxt, code); + if (ret) + goto done; + } else { + int i; + + /* maybe specified by type string (e.g. UUID) */ + ret = fdisk_get_parttype_from_string(cxt, str); + if (ret) + goto done; + + /* maybe specified by order number */ + errno = 0; + i = strtol(str, &end, 0); + if (errno == 0 && *end == '\0' && i > 0 + && i - 1 < (int) fdisk_get_nparttypes(cxt)) { + ret = &types[i - 1]; + goto done; + } + } + + ret = fdisk_new_unknown_parttype(code, typestr); +done: + DBG(LABEL, dbgprint("returns '%s' partition type", ret->name)); + return ret; +} + +/** + * fdisk_free_parttype: + * @t: new type + * + * Free the @type. + */ +void fdisk_free_parttype(struct fdisk_parttype *t) +{ + if (t && (t->flags & FDISK_PARTTYPE_ALLOCATED)) { + DBG(LABEL, dbgprint("freeing %p partition type", t)); + free(t->typestr); + free(t); + } +} + +/** + * fdisk_get_partition_type: + * @cxt: fdisk context + * @partnum: partition number + * + * Returns partition type or NULL upon failure. + */ +struct fdisk_parttype *fdisk_get_partition_type(struct fdisk_context *cxt, int partnum) +{ + if (!cxt || !cxt->label || !cxt->label->part_get_type) + return NULL; + + DBG(LABEL, dbgprint("partition: %d: get type", partnum)); + return cxt->label->part_get_type(cxt, partnum); +} + +/** + * fdisk_set_partition_type: + * @cxt: fdisk context + * @partnum: partition number + * @t: new type + * + * Returns 0 on success, < 0 on error. + */ +int fdisk_set_partition_type(struct fdisk_context *cxt, int partnum, + struct fdisk_parttype *t) +{ + if (!cxt || !cxt->label || !cxt->label->part_set_type) + return -EINVAL; + + DBG(LABEL, dbgprint("partition: %d: set type", partnum)); + return cxt->label->part_set_type(cxt, partnum, t); +} + +/** + * fdisk_get_nparttypes: + * @cxt: fdisk context + * + * Returns: number of partition types supported by the current label + */ +size_t fdisk_get_nparttypes(struct fdisk_context *cxt) +{ + if (!cxt || !cxt->label) + return 0; + + return cxt->label->nparttypes; +}