From 0bb4c979c68ec8ffeadc3315f26c883f19c98d1e Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Wed, 26 Nov 2014 12:45:24 +0100 Subject: build-sys: create a regular shared libfdisk.so - symbols versioning - SONAME from configure.ac - library version to header file - modify build-sys to compile and install shared lib Signed-off-by: Karel Zak --- Makefile.am | 7 +- configure.ac | 22 +- libfdisk/Makemodule.am | 2 + libfdisk/src/.gitignore | 1 + libfdisk/src/Makemodule.am | 70 ++++-- libfdisk/src/libfdisk.h | 564 -------------------------------------------- libfdisk/src/libfdisk.h.in | 571 +++++++++++++++++++++++++++++++++++++++++++++ libfdisk/src/libfdisk.sym | 232 ++++++++++++++++++ 8 files changed, 879 insertions(+), 590 deletions(-) create mode 100644 libfdisk/src/.gitignore delete mode 100644 libfdisk/src/libfdisk.h create mode 100644 libfdisk/src/libfdisk.h.in create mode 100644 libfdisk/src/libfdisk.sym diff --git a/Makefile.am b/Makefile.am index 122344e80..c7eb19584 100644 --- a/Makefile.am +++ b/Makefile.am @@ -18,14 +18,15 @@ LDADD = $(LTLIBINTL) dist_noinst_DATA = $(dist_man_MANS) # Paths to in-tree libraries (use ul_ prefix to avoid possible collisions) Note -# that blkid.h, libmount.h and libsmartcols.h are generated and stored in build -# dirs. +# that blkid.h, libmount.h, libfdisk.h and libsmartcols.h are generated and +# stored in build dirs. # ul_libblkid_incdir = $(top_builddir)/libblkid/src ul_libmount_incdir = $(top_builddir)/libmount/src ul_libsmartcols_incdir = $(top_builddir)/libsmartcols/src +ul_libfdisk_incdir = $(top_builddir)/libfdisk/src + ul_libuuid_incdir = $(top_srcdir)/libuuid/src -ul_libfdisk_incdir = $(top_srcdir)/libfdisk/src pkgconfigdir = $(usrlib_execdir)/pkgconfig diff --git a/configure.ac b/configure.ac index 6c504b8e1..0966f7bcb 100644 --- a/configure.ac +++ b/configure.ac @@ -53,6 +53,13 @@ LIBSMARTCOLS_LT_MINOR=1 LIBSMARTCOLS_LT_MICRO=0 LIBSMARTCOLS_VERSION_INFO=`expr $LIBSMARTCOLS_LT_MAJOR + $LIBSMARTCOLS_LT_MINOR`:$LIBSMARTCOLS_LT_MICRO:$LIBSMARTCOLS_LT_MINOR +dnl libfdisk version +LIBFDISK_VERSION="$PACKAGE_VERSION_MAJOR.$PACKAGE_VERSION_MINOR.$PACKAGE_VERSION_RELEASE" +LIBFDISK_LT_MAJOR=1 +LIBFDISK_LT_MINOR=1 +LIBFDISK_LT_MICRO=0 +LIBFDISK_VERSION_INFO=`expr $LIBFDISK_LT_MAJOR + $LIBFDISK_LT_MINOR`:$LIBFDISK_LT_MICRO:$LIBFDISK_LT_MINOR + # Check whether exec_prefix=/usr: AS_CASE([$exec_prefix:$prefix], [NONE:NONE | NONE:/usr | /usr:*], @@ -843,11 +850,21 @@ AC_DEFINE_UNQUOTED([LIBSMARTCOLS_VERSION], ["$LIBSMARTCOLS_VERSION"], [libsmartc dnl -dnl libfdisk is enabled at all times if possible +dnl libfdisk dnl -UL_BUILD_INIT([libfdisk], [check]) +AC_ARG_ENABLE([libfdisk], + AS_HELP_STRING([--disable-libfdisk], [do not build libfdisk]), + [], [UL_DEFAULT_ENABLE([libfdisk], [check])] +) +UL_BUILD_INIT([libfdisk]) UL_REQUIRES_BUILD([libfdisk], [libuuid]) AM_CONDITIONAL([BUILD_LIBFDISK], [test "x$build_libfdisk" = xyes]) +AM_CONDITIONAL([BUILD_LIBFDISK_TESTS], [test "x$build_libfdisk" = xyes -a "x$enable_static" = xyes]) + +AC_SUBST([LIBFDISK_VERSION]) +AC_SUBST([LIBFDISK_VERSION_INFO]) +AC_DEFINE_UNQUOTED([LIBFDISK_VERSION], ["$LIBFDISK_VERSION"], [libfdisk version string]) + UL_BUILD_INIT([fdisk], [check]) UL_REQUIRES_BUILD([fdisk], [libfdisk]) @@ -1844,6 +1861,7 @@ libmount/src/libmount.h libsmartcols/docs/Makefile libsmartcols/docs/version.xml libsmartcols/src/libsmartcols.h +libfdisk/src/libfdisk.h po/Makefile.in ]) diff --git a/libfdisk/Makemodule.am b/libfdisk/Makemodule.am index 323a57f6f..6d1803985 100644 --- a/libfdisk/Makemodule.am +++ b/libfdisk/Makemodule.am @@ -2,4 +2,6 @@ if BUILD_LIBFDISK include libfdisk/src/Makemodule.am +EXTRA_DIST += libfdisk/COPYING + endif # BUILD_LIBFDISK diff --git a/libfdisk/src/.gitignore b/libfdisk/src/.gitignore new file mode 100644 index 000000000..7e79b6511 --- /dev/null +++ b/libfdisk/src/.gitignore @@ -0,0 +1 @@ +libfdisk.h diff --git a/libfdisk/src/Makemodule.am b/libfdisk/src/Makemodule.am index e33962bf7..727b6a9b7 100644 --- a/libfdisk/src/Makemodule.am +++ b/libfdisk/src/Makemodule.am @@ -1,13 +1,11 @@ -# -# The libfdisk is used for internal util-linux purpose. The library is not -# distributed as shared library for now. Maybe one day... -# +# libfdisk.h is generated, so it's stored in builddir! +fdiskincdir = $(includedir)/libfdisk +nodist_fdiskinc_HEADERS = $(top_builddir)/libfdisk/src/libfdisk.h -noinst_LTLIBRARIES += libfdisk.la +usrlib_exec_LTLIBRARIES += libfdisk.la libfdisk_la_SOURCES = \ - libfdisk/src/libfdisk.h \ - libfdisk/src/fdiskP.h \ + include/list.h \ \ libfdisk/src/init.c \ libfdisk/src/test.c \ @@ -26,47 +24,55 @@ libfdisk_la_SOURCES = \ libfdisk/src/sgi.c \ libfdisk/src/dos.c \ libfdisk/src/bsd.c \ - libfdisk/src/gpt.c + libfdisk/src/gpt.c \ + $(nodist_fdiskinc_HEADERS) nodist_libfdisk_la_SOURCES = libfdisk/src/fdiskP.h -libfdisk_la_LIBADD = libcommon.la -libfdisk_la_DEPENDENCIES = libcommon.la +libfdisk_la_LIBADD = libcommon.la libuuid.la libfdisk_la_CFLAGS = \ + $(SOLIB_CFLAGS) \ + -I$(ul_libuuid_incdir) \ -I$(ul_libfdisk_incdir) \ -I$(top_srcdir)/libfdisk/src +libfdisk_la_DEPENDENCIES = \ + libcommon.la \ + libuuid.la \ + libfdisk/src/libfdisk.sym \ + libfdisk/src/libfdisk.h.in + +libfdisk_la_LDFLAGS = \ + $(SOLIB_LDFLAGS) \ + -Wl,--version-script=$(top_srcdir)/libfdisk/src/libfdisk.sym \ + -version-info $(LIBFDISK_VERSION_INFO) + if BUILD_LIBBLKID libfdisk_la_LIBADD += libblkid.la libfdisk_la_DEPENDENCIES += libblkid.la libfdisk_la_CFLAGS += -I$(ul_libblkid_incdir) endif -if BUILD_LIBUUID -libfdisk_la_LIBADD += libuuid.la -libfdisk_la_DEPENDENCIES += libuuid.la -libfdisk_la_CFLAGS += -I$(ul_libuuid_incdir) -endif +EXTRA_DIST += \ + libfdisk/src/libfdisk.sym \ + libfdisk/src/libfdisk.h.in +if BUILD_LIBFDISK_TESTS check_PROGRAMS += \ test_fdisk_ask \ test_fdisk_script \ test_fdisk_utils libfdisk_tests_cflags = -DTEST_PROGRAM $(libfdisk_la_CFLAGS) -libfdisk_tests_ldflags = -static -libfdisk_tests_ldadd = libfdisk.la +libfdisk_tests_ldflags = libuuid.la -static +libfdisk_tests_ldadd = libfdisk.la $(UUID_LIBS) if BUILD_LIBBLKID libfdisk_tests_ldflags += libblkid.la endif -if BUILD_LIBUUID -libfdisk_tests_ldflags += libuuid.la -endif - test_fdisk_ask_SOURCES = libfdisk/src/ask.c test_fdisk_ask_CFLAGS = $(libfdisk_tests_cflags) test_fdisk_ask_LDFLAGS = $(libfdisk_tests_ldflags) @@ -81,3 +87,25 @@ test_fdisk_script_SOURCES = libfdisk/src/script.c test_fdisk_script_CFLAGS = $(libfdisk_tests_cflags) test_fdisk_script_LDFLAGS = $(libfdisk_tests_ldflags) test_fdisk_script_LDADD = $(libfdisk_tests_ldadd) + +endif # BUILD_LIBFDISK_TESTS + + +# move lib from $(usrlib_execdir) to $(libdir) if needed +install-exec-hook-libfdisk: + if test "$(usrlib_execdir)" != "$(libdir)" -a -f "$(DESTDIR)$(usrlib_execdir)/libfdisk.so"; then \ + mkdir -p $(DESTDIR)$(libdir); \ + mv $(DESTDIR)$(usrlib_execdir)/libfdisk.so.* $(DESTDIR)$(libdir); \ + so_img_name=$$(readlink $(DESTDIR)$(usrlib_execdir)/libfdisk.so); \ + so_img_rel_target=$$(echo $(usrlib_execdir) | sed 's,\(^/\|\)[^/][^/]*,..,g'); \ + (cd $(DESTDIR)$(usrlib_execdir) && \ + rm -f libfdisk.so && \ + $(LN_S) $$so_img_rel_target$(libdir)/$$so_img_name libfdisk.so); \ + fi + +uninstall-hook-libfdisk: + rm -f $(DESTDIR)$(libdir)/libfdisk.so* + +INSTALL_EXEC_HOOKS += install-exec-hook-libfdisk +UNINSTALL_HOOKS += uninstall-hook-libfdisk + diff --git a/libfdisk/src/libfdisk.h b/libfdisk/src/libfdisk.h deleted file mode 100644 index 1c5d2ebcd..000000000 --- a/libfdisk/src/libfdisk.h +++ /dev/null @@ -1,564 +0,0 @@ -/* - * libfdisk.h - libfdisk API - * - * Copyright (C) 2012 Karel Zak - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#ifndef _LIBFDISK_FDISK_H -#define _LIBFDISK_FDISK_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include -#include -#include - -/** - * fdisk_context: - * - * Basic library handler. - */ -struct fdisk_context; - -/** - * fdisk_label: - * - * Disk label specific driver and setting. - */ -struct fdisk_label; - -/** - * fdisk_parttype: - * - * Partition type. - */ -struct fdisk_parttype; - -/** - * fdisk_partition: - * - * Partition abstraction (and template). - */ -struct fdisk_partition; - -/** - * fdisk_ask: - * - * Ask API handler for dialogs with users. - */ -struct fdisk_ask; - -/** - * fdisk_iter: - * - * Unified iterator. - */ -struct fdisk_iter; - -/** - * fdisk_table: - * - * Container for fdisk_partition objects - */ -struct fdisk_table; - -/** - * fdisk_field - * - * Output field description. - */ -struct fdisk_field; - -/** - * fdisk_script - * - * libraru handler for sfdisk compatible scripts - */ -struct fdisk_script; - -/* TODO: use uint64, the name is too generic */ -typedef unsigned long long sector_t; - -/** - * fdisk_labeltype: - * - * Supported partition table types (labels) - */ -enum fdisk_labeltype { - FDISK_DISKLABEL_DOS = (1 << 1), - FDISK_DISKLABEL_SUN = (1 << 2), - FDISK_DISKLABEL_SGI = (1 << 3), - FDISK_DISKLABEL_BSD = (1 << 4), - FDISK_DISKLABEL_GPT = (1 << 5) -}; - -/** - * fdisk_asktype: - * - * Ask API dialog types - */ -enum fdisk_asktype { - FDISK_ASKTYPE_NONE = 0, - FDISK_ASKTYPE_NUMBER, - FDISK_ASKTYPE_OFFSET, - FDISK_ASKTYPE_WARN, - FDISK_ASKTYPE_WARNX, - FDISK_ASKTYPE_INFO, - FDISK_ASKTYPE_YESNO, - FDISK_ASKTYPE_STRING, - FDISK_ASKTYPE_MENU -}; - -/* init.c */ -extern void fdisk_init_debug(int mask); - -/* context.h */ - -#define FDISK_PLURAL 0 -#define FDISK_SINGULAR 1 - -struct fdisk_context *fdisk_new_context(void); -struct fdisk_context *fdisk_new_nested_context(struct fdisk_context *parent, const char *name); -void fdisk_unref_context(struct fdisk_context *cxt); -void fdisk_ref_context(struct fdisk_context *cxt); - -struct fdisk_context *fdisk_get_parent(struct fdisk_context *cxt); -size_t fdisk_get_npartitions(struct fdisk_context *cxt); - -struct fdisk_label *fdisk_get_label(struct fdisk_context *cxt, const char *name); -int fdisk_next_label(struct fdisk_context *cxt, struct fdisk_label **lb); -size_t fdisk_get_nlabels(struct fdisk_context *cxt); - -int fdisk_has_label(struct fdisk_context *cxt); -int fdisk_is_labeltype(struct fdisk_context *cxt, enum fdisk_labeltype l); -#define fdisk_is_label(c, x) fdisk_is_labeltype(c, FDISK_DISKLABEL_ ## x) - - -int fdisk_assign_device(struct fdisk_context *cxt, - const char *fname, int readonly); -int fdisk_deassign_device(struct fdisk_context *cxt, int nosync); -int fdisk_is_readonly(struct fdisk_context *cxt); - -int fdisk_set_ask(struct fdisk_context *cxt, - int (*ask_cb)(struct fdisk_context *, struct fdisk_ask *, void *), - void *data); - -int fdisk_enable_details(struct fdisk_context *cxt, int enable); -int fdisk_is_details(struct fdisk_context *cxt); - -int fdisk_enable_listonly(struct fdisk_context *cxt, int enable); -int fdisk_is_listonly(struct fdisk_context *cxt); - -int fdisk_set_unit(struct fdisk_context *cxt, const char *str); -const char *fdisk_get_unit(struct fdisk_context *cxt, int n); -int fdisk_use_cylinders(struct fdisk_context *cxt); -unsigned int fdisk_get_units_per_sector(struct fdisk_context *cxt); - -unsigned long fdisk_get_optimal_iosize(struct fdisk_context *cxt); -unsigned long fdisk_get_minimal_iosize(struct fdisk_context *cxt); -unsigned long fdisk_get_physector_size(struct fdisk_context *cxt); -unsigned long fdisk_get_sector_size(struct fdisk_context *cxt); -unsigned long fdisk_get_alignment_offset(struct fdisk_context *cxt); -unsigned long fdisk_get_grain_size(struct fdisk_context *cxt); -sector_t fdisk_get_first_lba(struct fdisk_context *cxt); -sector_t fdisk_set_first_lba(struct fdisk_context *cxt, sector_t lba); -sector_t fdisk_get_last_lba(struct fdisk_context *cxt); -sector_t fdisk_set_last_lba(struct fdisk_context *cxt, sector_t lba); -sector_t fdisk_get_nsectors(struct fdisk_context *cxt); -const char *fdisk_get_devname(struct fdisk_context *cxt); -int fdisk_get_devfd(struct fdisk_context *cxt); - -unsigned int fdisk_get_geom_heads(struct fdisk_context *cxt); -sector_t fdisk_get_geom_sectors(struct fdisk_context *cxt); -sector_t fdisk_get_geom_cylinders(struct fdisk_context *cxt); - - - -/* parttype.c */ -struct fdisk_parttype *fdisk_new_parttype(void); -void fdisk_ref_parttype(struct fdisk_parttype *t); -void fdisk_unref_parttype(struct fdisk_parttype *t); -int fdisk_parttype_set_name(struct fdisk_parttype *t, const char *str); -int fdisk_parttype_set_typestr(struct fdisk_parttype *t, const char *str); -int fdisk_parttype_set_code(struct fdisk_parttype *t, int code); -size_t fdisk_label_get_nparttypes(const struct fdisk_label *lb); -struct fdisk_parttype *fdisk_label_get_parttype(const struct fdisk_label *lb, size_t n); -int fdisk_label_has_code_parttypes(const struct fdisk_label *lb); -struct fdisk_parttype *fdisk_label_get_parttype_from_code( - const struct fdisk_label *lb, - unsigned int code); -struct fdisk_parttype *fdisk_label_get_parttype_from_string( - const struct fdisk_label *lb, - const char *str); -struct fdisk_parttype *fdisk_new_unknown_parttype(unsigned int code, - const char *typestr); -struct fdisk_parttype *fdisk_copy_parttype(const struct fdisk_parttype *type); -struct fdisk_parttype *fdisk_label_parse_parttype( - const struct fdisk_label *lb, - const char *str); -const char *fdisk_parttype_get_string(const struct fdisk_parttype *t); -unsigned int fdisk_parttype_get_code(const struct fdisk_parttype *t); -const char *fdisk_parttype_get_name(const struct fdisk_parttype *t); -int fdisk_parttype_is_unknown(const struct fdisk_parttype *t); - -/* label.c */ - -/** - * fdisk_fieldtype - * - * Types of fdisk_field - */ -enum fdisk_fieldtype { - FDISK_FIELD_NONE = 0, - - /* generic */ - FDISK_FIELD_DEVICE, - FDISK_FIELD_START, - FDISK_FIELD_END, - FDISK_FIELD_SECTORS, - FDISK_FIELD_CYLINDERS, - FDISK_FIELD_SIZE, - FDISK_FIELD_TYPE, - FDISK_FIELD_TYPEID, - - /* label specific */ - FDISK_FIELD_ATTR, - FDISK_FIELD_BOOT, - FDISK_FIELD_BSIZE, - FDISK_FIELD_CPG, - FDISK_FIELD_EADDR, - FDISK_FIELD_FSIZE, - FDISK_FIELD_NAME, - FDISK_FIELD_SADDR, - FDISK_FIELD_UUID, - - FDISK_NFIELDS /* must be last */ -}; - -int fdisk_label_get_type(const struct fdisk_label *lb); -const char *fdisk_label_get_name(const struct fdisk_label *lb); -int fdisk_label_require_geometry(const struct fdisk_label *lb); - - -extern int fdisk_write_disklabel(struct fdisk_context *cxt); -extern int fdisk_verify_disklabel(struct fdisk_context *cxt); -extern int fdisk_create_disklabel(struct fdisk_context *cxt, const char *name); -extern int fdisk_list_disklabel(struct fdisk_context *cxt); -extern int fdisk_locate_disklabel(struct fdisk_context *cxt, int n, const char **name, off_t *offset, size_t *size); - -extern int fdisk_get_disklabel_id(struct fdisk_context *cxt, char **id); -extern int fdisk_set_disklabel_id(struct fdisk_context *cxt); - -extern int fdisk_get_partition(struct fdisk_context *cxt, size_t partno, struct fdisk_partition **pa); -extern int fdisk_set_partition(struct fdisk_context *cxt, size_t partno, struct fdisk_partition *pa); -extern int fdisk_add_partition(struct fdisk_context *cxt, struct fdisk_partition *pa, size_t *partno); -extern int fdisk_delete_partition(struct fdisk_context *cxt, size_t partno); - -extern int fdisk_delete_all_partitions(struct fdisk_context *cxt); - -extern int fdisk_set_partition_type(struct fdisk_context *cxt, size_t partnum, - struct fdisk_parttype *t); - - -extern int fdisk_label_get_fields_ids( - const struct fdisk_label *lb, - struct fdisk_context *cxt, - int **ids, size_t *nids); - -extern const struct fdisk_field *fdisk_label_get_field(const struct fdisk_label *lb, int id); -extern const struct fdisk_field *fdisk_label_get_field_by_name( - const struct fdisk_label *lb, - const char *name); - -extern int fdisk_field_get_id(const struct fdisk_field *fl); -extern const char *fdisk_field_get_name(const struct fdisk_field *fl); -extern double fdisk_field_get_width(const struct fdisk_field *fl); -extern int fdisk_field_is_number(const struct fdisk_field *fl); - - -extern void fdisk_label_set_changed(struct fdisk_label *lb, int changed); -extern int fdisk_label_is_changed(const struct fdisk_label *lb); - -extern void fdisk_label_set_disabled(struct fdisk_label *lb, int disabled); -extern int fdisk_label_is_disabled(const struct fdisk_label *lb); - -extern int fdisk_is_partition_used(struct fdisk_context *cxt, size_t n); - -extern int fdisk_partition_toggle_flag(struct fdisk_context *cxt, size_t partnum, unsigned long flag); - -extern struct fdisk_partition *fdisk_new_partition(void); -extern void fdisk_reset_partition(struct fdisk_partition *pa); -extern void fdisk_ref_partition(struct fdisk_partition *pa); -extern void fdisk_unref_partition(struct fdisk_partition *pa); -extern int fdisk_partition_is_freespace(struct fdisk_partition *pa); - -int fdisk_partition_set_start(struct fdisk_partition *pa, uint64_t off); -int fdisk_partition_unset_start(struct fdisk_partition *pa); -uint64_t fdisk_partition_get_start(struct fdisk_partition *pa); -int fdisk_partition_has_start(struct fdisk_partition *pa); -int fdisk_partition_cmp_start(struct fdisk_partition *a, - struct fdisk_partition *b); -int fdisk_partition_start_follow_default(struct fdisk_partition *pa, int enable); -int fdisk_partition_start_is_default(struct fdisk_partition *pa); - -int fdisk_partition_set_size(struct fdisk_partition *pa, uint64_t sz); -int fdisk_partition_unset_size(struct fdisk_partition *pa); -uint64_t fdisk_partition_get_size(struct fdisk_partition *pa); -int fdisk_partition_has_size(struct fdisk_partition *pa); -int fdisk_partition_size_explicit(struct fdisk_partition *pa, int enable); - -int fdisk_partition_set_partno(struct fdisk_partition *pa, size_t num); -int fdisk_partition_unset_partno(struct fdisk_partition *pa); -size_t fdisk_partition_get_partno(struct fdisk_partition *pa); -int fdisk_partition_has_partno(struct fdisk_partition *pa); -int fdisk_partition_cmp_partno(struct fdisk_partition *a, - struct fdisk_partition *b); -int fdisk_partition_partno_follow_default(struct fdisk_partition *pa, int enable); - - -extern int fdisk_partition_set_type(struct fdisk_partition *pa, struct fdisk_parttype *type); -extern struct fdisk_parttype *fdisk_partition_get_type(struct fdisk_partition *pa); -extern int fdisk_partition_set_name(struct fdisk_partition *pa, const char *name); -extern const char *fdisk_partition_get_name(struct fdisk_partition *pa); -extern int fdisk_partition_set_uuid(struct fdisk_partition *pa, const char *uuid); -extern int fdisk_partition_set_attrs(struct fdisk_partition *pa, const char *attrs); -extern const char *fdisk_partition_get_uuid(struct fdisk_partition *pa); -extern const char *fdisk_partition_get_attrs(struct fdisk_partition *pa); -extern int fdisk_partition_is_nested(struct fdisk_partition *pa); -extern int fdisk_partition_is_container(struct fdisk_partition *pa); -extern int fdisk_partition_get_parent(struct fdisk_partition *pa, size_t *parent); -extern int fdisk_partition_is_used(struct fdisk_partition *pa); -extern int fdisk_partition_is_bootable(struct fdisk_partition *pa); -extern int fdisk_partition_to_string(struct fdisk_partition *pa, - struct fdisk_context *cxt, - int id, char **data); - -int fdisk_partition_next_partno(struct fdisk_partition *pa, - struct fdisk_context *cxt, - size_t *n); - -extern int fdisk_partition_end_follow_default(struct fdisk_partition *pa, int enable); -extern int fdisk_partition_end_is_default(struct fdisk_partition *pa); - -extern int fdisk_reorder_partitions(struct fdisk_context *cxt); - -/* table.c */ -extern struct fdisk_table *fdisk_new_table(void); -extern int fdisk_reset_table(struct fdisk_table *tb); -extern void fdisk_ref_table(struct fdisk_table *tb); -extern void fdisk_unref_table(struct fdisk_table *tb); -extern size_t fdisk_table_get_nents(struct fdisk_table *tb); -extern int fdisk_table_is_empty(struct fdisk_table *tb); -extern int fdisk_table_add_partition(struct fdisk_table *tb, struct fdisk_partition *pa); -extern int fdisk_table_remove_partition(struct fdisk_table *tb, struct fdisk_partition *pa); - -extern int fdisk_get_partitions(struct fdisk_context *cxt, struct fdisk_table **tb); -extern int fdisk_get_freespaces(struct fdisk_context *cxt, struct fdisk_table **tb); - -extern int fdisk_table_wrong_order(struct fdisk_table *tb); -extern int fdisk_table_sort_partitions(struct fdisk_table *tb, - int (*cmp)(struct fdisk_partition *, - struct fdisk_partition *)); - -extern int fdisk_table_next_partition( - struct fdisk_table *tb, - struct fdisk_iter *itr, - struct fdisk_partition **pa); - -extern struct fdisk_partition *fdisk_table_get_partition( - struct fdisk_table *tb, - size_t n); -extern int fdisk_apply_table(struct fdisk_context *cxt, struct fdisk_table *tb); - -/* alignment.c */ -#define FDISK_ALIGN_UP 1 -#define FDISK_ALIGN_DOWN 2 -#define FDISK_ALIGN_NEAREST 3 - -sector_t fdisk_align_lba(struct fdisk_context *cxt, sector_t lba, int direction); -sector_t fdisk_align_lba_in_range(struct fdisk_context *cxt, - sector_t lba, sector_t start, sector_t stop); -int fdisk_lba_is_phy_aligned(struct fdisk_context *cxt, sector_t lba); - -int fdisk_override_geometry(struct fdisk_context *cxt, - unsigned int cylinders, - unsigned int heads, - unsigned int sectors); -int fdisk_save_user_geometry(struct fdisk_context *cxt, - unsigned int cylinders, - unsigned int heads, - unsigned int sectors); -int fdisk_save_user_sector_size(struct fdisk_context *cxt, - unsigned int phy, - unsigned int log); -int fdisk_has_user_device_properties(struct fdisk_context *cxt); -int fdisk_reset_alignment(struct fdisk_context *cxt); -int fdisk_reset_device_properties(struct fdisk_context *cxt); -int fdisk_reread_partition_table(struct fdisk_context *cxt); - -/* iter.c */ -enum { - - FDISK_ITER_FORWARD = 0, - FDISK_ITER_BACKWARD -}; -extern struct fdisk_iter *fdisk_new_iter(int direction); -extern void fdisk_free_iter(struct fdisk_iter *itr); -extern void fdisk_reset_iter(struct fdisk_iter *itr, int direction); -extern int fdisk_iter_get_direction(struct fdisk_iter *itr); - - -/* dos.c */ -#define DOS_FLAG_ACTIVE 1 - -extern int fdisk_dos_move_begin(struct fdisk_context *cxt, size_t i); -extern int fdisk_dos_enable_compatible(struct fdisk_label *lb, int enable); -extern int fdisk_dos_is_compatible(struct fdisk_label *lb); - -/* sun.h */ -extern int fdisk_sun_set_alt_cyl(struct fdisk_context *cxt); -extern int fdisk_sun_set_xcyl(struct fdisk_context *cxt); -extern int fdisk_sun_set_ilfact(struct fdisk_context *cxt); -extern int fdisk_sun_set_rspeed(struct fdisk_context *cxt); -extern int fdisk_sun_set_pcylcount(struct fdisk_context *cxt); - -/* bsd.c */ -extern int fdisk_bsd_edit_disklabel(struct fdisk_context *cxt); -extern int fdisk_bsd_write_bootstrap(struct fdisk_context *cxt); -extern int fdisk_bsd_link_partition(struct fdisk_context *cxt); - -/* sgi.h */ -#define SGI_FLAG_BOOT 1 -#define SGI_FLAG_SWAP 2 -extern int fdisk_sgi_set_bootfile(struct fdisk_context *cxt); -extern int fdisk_sgi_create_info(struct fdisk_context *cxt); - -/* gpt */ - -/* GPT partition attributes */ -enum { - /* System partition (disk partitioning utilities must preserve the - * partition as is) */ - GPT_FLAG_REQUIRED = 1, - - /* EFI firmware should ignore the content of the partition and not try - * to read from it */ - GPT_FLAG_NOBLOCK, - - /* Legacy BIOS bootable */ - GPT_FLAG_LEGACYBOOT, - - /* bites 48-63, Defined and used by the individual partition type. - * - * The flag GPT_FLAG_GUIDSPECIFIC forces libfdisk to ask (by ask API) - * for a bit number. If you want to toggle specific bit and avoid any - * dialog, then use the bit number (in range 48..63). For example: - * - * // start dialog to ask for bit number - * fdisk_partition_toggle_flag(cxt, n, GPT_FLAG_GUIDSPECIFIC); - * - * // toggle bit 60 - * fdisk_partition_toggle_flag(cxt, n, 60); - */ - GPT_FLAG_GUIDSPECIFIC -}; - -extern int fdisk_gpt_is_hybrid(struct fdisk_context *cxt); - - -/* script.c */ -struct fdisk_script *fdisk_new_script(struct fdisk_context *cxt); -struct fdisk_script *fdisk_new_script_from_file(struct fdisk_context *cxt, - const char *filename); -void fdisk_ref_script(struct fdisk_script *dp); -void fdisk_unref_script(struct fdisk_script *dp); - -const char *fdisk_script_get_header(struct fdisk_script *dp, const char *name); -int fdisk_script_set_header(struct fdisk_script *dp, const char *name, const char *data); -struct fdisk_table *fdisk_script_get_table(struct fdisk_script *dp); -int fdisk_script_get_nlines(struct fdisk_script *dp); - -int fdisk_script_read_context(struct fdisk_script *dp, struct fdisk_context *cxt); -int fdisk_script_write_file(struct fdisk_script *dp, FILE *f); -int fdisk_script_read_file(struct fdisk_script *dp, FILE *f); -int fdisk_script_read_line(struct fdisk_script *dp, FILE *f, char *buf, size_t sz); - -int fdisk_set_script(struct fdisk_context *cxt, struct fdisk_script *dp); -struct fdisk_script *fdisk_get_script(struct fdisk_context *cxt); - -int fdisk_apply_script_headers(struct fdisk_context *cxt, struct fdisk_script *dp); -int fdisk_apply_script(struct fdisk_context *cxt, struct fdisk_script *dp); - - -/* ask.c */ -#define fdisk_is_ask(a, x) (fdisk_ask_get_type(a) == FDISK_ASKTYPE_ ## x) - -void fdisk_ref_ask(struct fdisk_ask *ask); -void fdisk_unref_ask(struct fdisk_ask *ask); -const char *fdisk_ask_get_query(struct fdisk_ask *ask); -int fdisk_ask_get_type(struct fdisk_ask *ask); -const char *fdisk_ask_number_get_range(struct fdisk_ask *ask); -uint64_t fdisk_ask_number_get_default(struct fdisk_ask *ask); -uint64_t fdisk_ask_number_get_low(struct fdisk_ask *ask); -uint64_t fdisk_ask_number_get_high(struct fdisk_ask *ask); -uint64_t fdisk_ask_number_get_result(struct fdisk_ask *ask); -int fdisk_ask_number_set_result(struct fdisk_ask *ask, uint64_t result); -uint64_t fdisk_ask_number_get_base(struct fdisk_ask *ask); -uint64_t fdisk_ask_number_get_unit(struct fdisk_ask *ask); -int fdisk_ask_number_set_relative(struct fdisk_ask *ask, int relative); -int fdisk_ask_number_inchars(struct fdisk_ask *ask); -int fdisk_ask_partnum(struct fdisk_context *cxt, size_t *partnum, int wantnew); - -int fdisk_ask_number(struct fdisk_context *cxt, - uintmax_t low, - uintmax_t dflt, - uintmax_t high, - const char *query, - uintmax_t *result); -char *fdisk_ask_string_get_result(struct fdisk_ask *ask); -int fdisk_ask_string_set_result(struct fdisk_ask *ask, char *result); -int fdisk_ask_string(struct fdisk_context *cxt, - const char *query, - char **result); -int fdisk_ask_yesno(struct fdisk_context *cxt, - const char *query, - int *result); -int fdisk_ask_yesno_get_result(struct fdisk_ask *ask); -int fdisk_ask_yesno_set_result(struct fdisk_ask *ask, int result); -int fdisk_ask_menu_get_default(struct fdisk_ask *ask); -int fdisk_ask_menu_set_result(struct fdisk_ask *ask, int key); -int fdisk_ask_menu_get_result(struct fdisk_ask *ask, int *key); -int fdisk_ask_menu_get_item(struct fdisk_ask *ask, size_t idx, int *key, - const char **name, const char **desc); -size_t fdisk_ask_menu_get_nitems(struct fdisk_ask *ask); -int fdisk_ask_print_get_errno(struct fdisk_ask *ask); -const char *fdisk_ask_print_get_mesg(struct fdisk_ask *ask); - -int fdisk_info(struct fdisk_context *cxt, const char *fmt, ...); -int fdisk_warn(struct fdisk_context *cxt, const char *fmt, ...); -int fdisk_warnx(struct fdisk_context *cxt, const char *fmt, ...); - -/* utils.h */ -extern char *fdisk_partname(const char *dev, size_t partno); - -#ifdef __cplusplus -} -#endif - -#endif /* _LIBFDISK_FDISK_H */ diff --git a/libfdisk/src/libfdisk.h.in b/libfdisk/src/libfdisk.h.in new file mode 100644 index 000000000..ae1d03899 --- /dev/null +++ b/libfdisk/src/libfdisk.h.in @@ -0,0 +1,571 @@ +/* + * libfdisk.h - libfdisk API + * + * Copyright (C) 2012-2014 Karel Zak + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#ifndef _LIBFDISK_H +#define _LIBFDISK_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include + +/** + * LIBFDISK_VERSION: + * + * Library version string + */ +#define LIBFDISK_VERSION "@LIBFDISK_VERSION@" + +/** + * fdisk_context: + * + * Basic library handler. + */ +struct fdisk_context; + +/** + * fdisk_label: + * + * Disk label specific driver and setting. + */ +struct fdisk_label; + +/** + * fdisk_parttype: + * + * Partition type. + */ +struct fdisk_parttype; + +/** + * fdisk_partition: + * + * Partition abstraction (and template). + */ +struct fdisk_partition; + +/** + * fdisk_ask: + * + * Ask API handler for dialogs with users. + */ +struct fdisk_ask; + +/** + * fdisk_iter: + * + * Unified iterator. + */ +struct fdisk_iter; + +/** + * fdisk_table: + * + * Container for fdisk_partition objects + */ +struct fdisk_table; + +/** + * fdisk_field + * + * Output field description. + */ +struct fdisk_field; + +/** + * fdisk_script + * + * libraru handler for sfdisk compatible scripts + */ +struct fdisk_script; + +/* TODO: use uint64, the name is too generic */ +typedef unsigned long long sector_t; + +/** + * fdisk_labeltype: + * + * Supported partition table types (labels) + */ +enum fdisk_labeltype { + FDISK_DISKLABEL_DOS = (1 << 1), + FDISK_DISKLABEL_SUN = (1 << 2), + FDISK_DISKLABEL_SGI = (1 << 3), + FDISK_DISKLABEL_BSD = (1 << 4), + FDISK_DISKLABEL_GPT = (1 << 5) +}; + +/** + * fdisk_asktype: + * + * Ask API dialog types + */ +enum fdisk_asktype { + FDISK_ASKTYPE_NONE = 0, + FDISK_ASKTYPE_NUMBER, + FDISK_ASKTYPE_OFFSET, + FDISK_ASKTYPE_WARN, + FDISK_ASKTYPE_WARNX, + FDISK_ASKTYPE_INFO, + FDISK_ASKTYPE_YESNO, + FDISK_ASKTYPE_STRING, + FDISK_ASKTYPE_MENU +}; + +/* init.c */ +extern void fdisk_init_debug(int mask); + +/* context.h */ + +#define FDISK_PLURAL 0 +#define FDISK_SINGULAR 1 + +struct fdisk_context *fdisk_new_context(void); +struct fdisk_context *fdisk_new_nested_context(struct fdisk_context *parent, const char *name); +void fdisk_unref_context(struct fdisk_context *cxt); +void fdisk_ref_context(struct fdisk_context *cxt); + +struct fdisk_context *fdisk_get_parent(struct fdisk_context *cxt); +size_t fdisk_get_npartitions(struct fdisk_context *cxt); + +struct fdisk_label *fdisk_get_label(struct fdisk_context *cxt, const char *name); +int fdisk_next_label(struct fdisk_context *cxt, struct fdisk_label **lb); +size_t fdisk_get_nlabels(struct fdisk_context *cxt); + +int fdisk_has_label(struct fdisk_context *cxt); +int fdisk_is_labeltype(struct fdisk_context *cxt, enum fdisk_labeltype l); +#define fdisk_is_label(c, x) fdisk_is_labeltype(c, FDISK_DISKLABEL_ ## x) + + +int fdisk_assign_device(struct fdisk_context *cxt, + const char *fname, int readonly); +int fdisk_deassign_device(struct fdisk_context *cxt, int nosync); +int fdisk_is_readonly(struct fdisk_context *cxt); + +int fdisk_set_ask(struct fdisk_context *cxt, + int (*ask_cb)(struct fdisk_context *, struct fdisk_ask *, void *), + void *data); + +int fdisk_enable_details(struct fdisk_context *cxt, int enable); +int fdisk_is_details(struct fdisk_context *cxt); + +int fdisk_enable_listonly(struct fdisk_context *cxt, int enable); +int fdisk_is_listonly(struct fdisk_context *cxt); + +int fdisk_set_unit(struct fdisk_context *cxt, const char *str); +const char *fdisk_get_unit(struct fdisk_context *cxt, int n); +int fdisk_use_cylinders(struct fdisk_context *cxt); +unsigned int fdisk_get_units_per_sector(struct fdisk_context *cxt); + +unsigned long fdisk_get_optimal_iosize(struct fdisk_context *cxt); +unsigned long fdisk_get_minimal_iosize(struct fdisk_context *cxt); +unsigned long fdisk_get_physector_size(struct fdisk_context *cxt); +unsigned long fdisk_get_sector_size(struct fdisk_context *cxt); +unsigned long fdisk_get_alignment_offset(struct fdisk_context *cxt); +unsigned long fdisk_get_grain_size(struct fdisk_context *cxt); +sector_t fdisk_get_first_lba(struct fdisk_context *cxt); +sector_t fdisk_set_first_lba(struct fdisk_context *cxt, sector_t lba); +sector_t fdisk_get_last_lba(struct fdisk_context *cxt); +sector_t fdisk_set_last_lba(struct fdisk_context *cxt, sector_t lba); +sector_t fdisk_get_nsectors(struct fdisk_context *cxt); +const char *fdisk_get_devname(struct fdisk_context *cxt); +int fdisk_get_devfd(struct fdisk_context *cxt); + +unsigned int fdisk_get_geom_heads(struct fdisk_context *cxt); +sector_t fdisk_get_geom_sectors(struct fdisk_context *cxt); +sector_t fdisk_get_geom_cylinders(struct fdisk_context *cxt); + + + +/* parttype.c */ +struct fdisk_parttype *fdisk_new_parttype(void); +void fdisk_ref_parttype(struct fdisk_parttype *t); +void fdisk_unref_parttype(struct fdisk_parttype *t); +int fdisk_parttype_set_name(struct fdisk_parttype *t, const char *str); +int fdisk_parttype_set_typestr(struct fdisk_parttype *t, const char *str); +int fdisk_parttype_set_code(struct fdisk_parttype *t, int code); +size_t fdisk_label_get_nparttypes(const struct fdisk_label *lb); +struct fdisk_parttype *fdisk_label_get_parttype(const struct fdisk_label *lb, size_t n); +int fdisk_label_has_code_parttypes(const struct fdisk_label *lb); +struct fdisk_parttype *fdisk_label_get_parttype_from_code( + const struct fdisk_label *lb, + unsigned int code); +struct fdisk_parttype *fdisk_label_get_parttype_from_string( + const struct fdisk_label *lb, + const char *str); +struct fdisk_parttype *fdisk_new_unknown_parttype(unsigned int code, + const char *typestr); +struct fdisk_parttype *fdisk_copy_parttype(const struct fdisk_parttype *type); +struct fdisk_parttype *fdisk_label_parse_parttype( + const struct fdisk_label *lb, + const char *str); +const char *fdisk_parttype_get_string(const struct fdisk_parttype *t); +unsigned int fdisk_parttype_get_code(const struct fdisk_parttype *t); +const char *fdisk_parttype_get_name(const struct fdisk_parttype *t); +int fdisk_parttype_is_unknown(const struct fdisk_parttype *t); + +/* label.c */ + +/** + * fdisk_fieldtype + * + * Types of fdisk_field + */ +enum fdisk_fieldtype { + FDISK_FIELD_NONE = 0, + + /* generic */ + FDISK_FIELD_DEVICE, + FDISK_FIELD_START, + FDISK_FIELD_END, + FDISK_FIELD_SECTORS, + FDISK_FIELD_CYLINDERS, + FDISK_FIELD_SIZE, + FDISK_FIELD_TYPE, + FDISK_FIELD_TYPEID, + + /* label specific */ + FDISK_FIELD_ATTR, + FDISK_FIELD_BOOT, + FDISK_FIELD_BSIZE, + FDISK_FIELD_CPG, + FDISK_FIELD_EADDR, + FDISK_FIELD_FSIZE, + FDISK_FIELD_NAME, + FDISK_FIELD_SADDR, + FDISK_FIELD_UUID, + + FDISK_NFIELDS /* must be last */ +}; + +int fdisk_label_get_type(const struct fdisk_label *lb); +const char *fdisk_label_get_name(const struct fdisk_label *lb); +int fdisk_label_require_geometry(const struct fdisk_label *lb); + + +extern int fdisk_write_disklabel(struct fdisk_context *cxt); +extern int fdisk_verify_disklabel(struct fdisk_context *cxt); +extern int fdisk_create_disklabel(struct fdisk_context *cxt, const char *name); +extern int fdisk_list_disklabel(struct fdisk_context *cxt); +extern int fdisk_locate_disklabel(struct fdisk_context *cxt, int n, const char **name, off_t *offset, size_t *size); + +extern int fdisk_get_disklabel_id(struct fdisk_context *cxt, char **id); +extern int fdisk_set_disklabel_id(struct fdisk_context *cxt); + +extern int fdisk_get_partition(struct fdisk_context *cxt, size_t partno, struct fdisk_partition **pa); +extern int fdisk_set_partition(struct fdisk_context *cxt, size_t partno, struct fdisk_partition *pa); +extern int fdisk_add_partition(struct fdisk_context *cxt, struct fdisk_partition *pa, size_t *partno); +extern int fdisk_delete_partition(struct fdisk_context *cxt, size_t partno); + +extern int fdisk_delete_all_partitions(struct fdisk_context *cxt); + +extern int fdisk_set_partition_type(struct fdisk_context *cxt, size_t partnum, + struct fdisk_parttype *t); + + +extern int fdisk_label_get_fields_ids( + const struct fdisk_label *lb, + struct fdisk_context *cxt, + int **ids, size_t *nids); + +extern const struct fdisk_field *fdisk_label_get_field(const struct fdisk_label *lb, int id); +extern const struct fdisk_field *fdisk_label_get_field_by_name( + const struct fdisk_label *lb, + const char *name); + +extern int fdisk_field_get_id(const struct fdisk_field *fl); +extern const char *fdisk_field_get_name(const struct fdisk_field *fl); +extern double fdisk_field_get_width(const struct fdisk_field *fl); +extern int fdisk_field_is_number(const struct fdisk_field *fl); + + +extern void fdisk_label_set_changed(struct fdisk_label *lb, int changed); +extern int fdisk_label_is_changed(const struct fdisk_label *lb); + +extern void fdisk_label_set_disabled(struct fdisk_label *lb, int disabled); +extern int fdisk_label_is_disabled(const struct fdisk_label *lb); + +extern int fdisk_is_partition_used(struct fdisk_context *cxt, size_t n); + +extern int fdisk_partition_toggle_flag(struct fdisk_context *cxt, size_t partnum, unsigned long flag); + +extern struct fdisk_partition *fdisk_new_partition(void); +extern void fdisk_reset_partition(struct fdisk_partition *pa); +extern void fdisk_ref_partition(struct fdisk_partition *pa); +extern void fdisk_unref_partition(struct fdisk_partition *pa); +extern int fdisk_partition_is_freespace(struct fdisk_partition *pa); + +int fdisk_partition_set_start(struct fdisk_partition *pa, uint64_t off); +int fdisk_partition_unset_start(struct fdisk_partition *pa); +uint64_t fdisk_partition_get_start(struct fdisk_partition *pa); +int fdisk_partition_has_start(struct fdisk_partition *pa); +int fdisk_partition_cmp_start(struct fdisk_partition *a, + struct fdisk_partition *b); +int fdisk_partition_start_follow_default(struct fdisk_partition *pa, int enable); +int fdisk_partition_start_is_default(struct fdisk_partition *pa); + +int fdisk_partition_set_size(struct fdisk_partition *pa, uint64_t sz); +int fdisk_partition_unset_size(struct fdisk_partition *pa); +uint64_t fdisk_partition_get_size(struct fdisk_partition *pa); +int fdisk_partition_has_size(struct fdisk_partition *pa); +int fdisk_partition_size_explicit(struct fdisk_partition *pa, int enable); + +int fdisk_partition_set_partno(struct fdisk_partition *pa, size_t num); +int fdisk_partition_unset_partno(struct fdisk_partition *pa); +size_t fdisk_partition_get_partno(struct fdisk_partition *pa); +int fdisk_partition_has_partno(struct fdisk_partition *pa); +int fdisk_partition_cmp_partno(struct fdisk_partition *a, + struct fdisk_partition *b); +int fdisk_partition_partno_follow_default(struct fdisk_partition *pa, int enable); + + +extern int fdisk_partition_set_type(struct fdisk_partition *pa, struct fdisk_parttype *type); +extern struct fdisk_parttype *fdisk_partition_get_type(struct fdisk_partition *pa); +extern int fdisk_partition_set_name(struct fdisk_partition *pa, const char *name); +extern const char *fdisk_partition_get_name(struct fdisk_partition *pa); +extern int fdisk_partition_set_uuid(struct fdisk_partition *pa, const char *uuid); +extern int fdisk_partition_set_attrs(struct fdisk_partition *pa, const char *attrs); +extern const char *fdisk_partition_get_uuid(struct fdisk_partition *pa); +extern const char *fdisk_partition_get_attrs(struct fdisk_partition *pa); +extern int fdisk_partition_is_nested(struct fdisk_partition *pa); +extern int fdisk_partition_is_container(struct fdisk_partition *pa); +extern int fdisk_partition_get_parent(struct fdisk_partition *pa, size_t *parent); +extern int fdisk_partition_is_used(struct fdisk_partition *pa); +extern int fdisk_partition_is_bootable(struct fdisk_partition *pa); +extern int fdisk_partition_to_string(struct fdisk_partition *pa, + struct fdisk_context *cxt, + int id, char **data); + +int fdisk_partition_next_partno(struct fdisk_partition *pa, + struct fdisk_context *cxt, + size_t *n); + +extern int fdisk_partition_end_follow_default(struct fdisk_partition *pa, int enable); +extern int fdisk_partition_end_is_default(struct fdisk_partition *pa); + +extern int fdisk_reorder_partitions(struct fdisk_context *cxt); + +/* table.c */ +extern struct fdisk_table *fdisk_new_table(void); +extern int fdisk_reset_table(struct fdisk_table *tb); +extern void fdisk_ref_table(struct fdisk_table *tb); +extern void fdisk_unref_table(struct fdisk_table *tb); +extern size_t fdisk_table_get_nents(struct fdisk_table *tb); +extern int fdisk_table_is_empty(struct fdisk_table *tb); +extern int fdisk_table_add_partition(struct fdisk_table *tb, struct fdisk_partition *pa); +extern int fdisk_table_remove_partition(struct fdisk_table *tb, struct fdisk_partition *pa); + +extern int fdisk_get_partitions(struct fdisk_context *cxt, struct fdisk_table **tb); +extern int fdisk_get_freespaces(struct fdisk_context *cxt, struct fdisk_table **tb); + +extern int fdisk_table_wrong_order(struct fdisk_table *tb); +extern int fdisk_table_sort_partitions(struct fdisk_table *tb, + int (*cmp)(struct fdisk_partition *, + struct fdisk_partition *)); + +extern int fdisk_table_next_partition( + struct fdisk_table *tb, + struct fdisk_iter *itr, + struct fdisk_partition **pa); + +extern struct fdisk_partition *fdisk_table_get_partition( + struct fdisk_table *tb, + size_t n); +extern int fdisk_apply_table(struct fdisk_context *cxt, struct fdisk_table *tb); + +/* alignment.c */ +#define FDISK_ALIGN_UP 1 +#define FDISK_ALIGN_DOWN 2 +#define FDISK_ALIGN_NEAREST 3 + +sector_t fdisk_align_lba(struct fdisk_context *cxt, sector_t lba, int direction); +sector_t fdisk_align_lba_in_range(struct fdisk_context *cxt, + sector_t lba, sector_t start, sector_t stop); +int fdisk_lba_is_phy_aligned(struct fdisk_context *cxt, sector_t lba); + +int fdisk_override_geometry(struct fdisk_context *cxt, + unsigned int cylinders, + unsigned int heads, + unsigned int sectors); +int fdisk_save_user_geometry(struct fdisk_context *cxt, + unsigned int cylinders, + unsigned int heads, + unsigned int sectors); +int fdisk_save_user_sector_size(struct fdisk_context *cxt, + unsigned int phy, + unsigned int log); +int fdisk_has_user_device_properties(struct fdisk_context *cxt); +int fdisk_reset_alignment(struct fdisk_context *cxt); +int fdisk_reset_device_properties(struct fdisk_context *cxt); +int fdisk_reread_partition_table(struct fdisk_context *cxt); + +/* iter.c */ +enum { + + FDISK_ITER_FORWARD = 0, + FDISK_ITER_BACKWARD +}; +extern struct fdisk_iter *fdisk_new_iter(int direction); +extern void fdisk_free_iter(struct fdisk_iter *itr); +extern void fdisk_reset_iter(struct fdisk_iter *itr, int direction); +extern int fdisk_iter_get_direction(struct fdisk_iter *itr); + + +/* dos.c */ +#define DOS_FLAG_ACTIVE 1 + +extern int fdisk_dos_move_begin(struct fdisk_context *cxt, size_t i); +extern int fdisk_dos_enable_compatible(struct fdisk_label *lb, int enable); +extern int fdisk_dos_is_compatible(struct fdisk_label *lb); + +/* sun.h */ +extern int fdisk_sun_set_alt_cyl(struct fdisk_context *cxt); +extern int fdisk_sun_set_xcyl(struct fdisk_context *cxt); +extern int fdisk_sun_set_ilfact(struct fdisk_context *cxt); +extern int fdisk_sun_set_rspeed(struct fdisk_context *cxt); +extern int fdisk_sun_set_pcylcount(struct fdisk_context *cxt); + +/* bsd.c */ +extern int fdisk_bsd_edit_disklabel(struct fdisk_context *cxt); +extern int fdisk_bsd_write_bootstrap(struct fdisk_context *cxt); +extern int fdisk_bsd_link_partition(struct fdisk_context *cxt); + +/* sgi.h */ +#define SGI_FLAG_BOOT 1 +#define SGI_FLAG_SWAP 2 +extern int fdisk_sgi_set_bootfile(struct fdisk_context *cxt); +extern int fdisk_sgi_create_info(struct fdisk_context *cxt); + +/* gpt */ + +/* GPT partition attributes */ +enum { + /* System partition (disk partitioning utilities must preserve the + * partition as is) */ + GPT_FLAG_REQUIRED = 1, + + /* EFI firmware should ignore the content of the partition and not try + * to read from it */ + GPT_FLAG_NOBLOCK, + + /* Legacy BIOS bootable */ + GPT_FLAG_LEGACYBOOT, + + /* bites 48-63, Defined and used by the individual partition type. + * + * The flag GPT_FLAG_GUIDSPECIFIC forces libfdisk to ask (by ask API) + * for a bit number. If you want to toggle specific bit and avoid any + * dialog, then use the bit number (in range 48..63). For example: + * + * // start dialog to ask for bit number + * fdisk_partition_toggle_flag(cxt, n, GPT_FLAG_GUIDSPECIFIC); + * + * // toggle bit 60 + * fdisk_partition_toggle_flag(cxt, n, 60); + */ + GPT_FLAG_GUIDSPECIFIC +}; + +extern int fdisk_gpt_is_hybrid(struct fdisk_context *cxt); + + +/* script.c */ +struct fdisk_script *fdisk_new_script(struct fdisk_context *cxt); +struct fdisk_script *fdisk_new_script_from_file(struct fdisk_context *cxt, + const char *filename); +void fdisk_ref_script(struct fdisk_script *dp); +void fdisk_unref_script(struct fdisk_script *dp); + +const char *fdisk_script_get_header(struct fdisk_script *dp, const char *name); +int fdisk_script_set_header(struct fdisk_script *dp, const char *name, const char *data); +struct fdisk_table *fdisk_script_get_table(struct fdisk_script *dp); +int fdisk_script_get_nlines(struct fdisk_script *dp); + +int fdisk_script_read_context(struct fdisk_script *dp, struct fdisk_context *cxt); +int fdisk_script_write_file(struct fdisk_script *dp, FILE *f); +int fdisk_script_read_file(struct fdisk_script *dp, FILE *f); +int fdisk_script_read_line(struct fdisk_script *dp, FILE *f, char *buf, size_t sz); + +int fdisk_set_script(struct fdisk_context *cxt, struct fdisk_script *dp); +struct fdisk_script *fdisk_get_script(struct fdisk_context *cxt); + +int fdisk_apply_script_headers(struct fdisk_context *cxt, struct fdisk_script *dp); +int fdisk_apply_script(struct fdisk_context *cxt, struct fdisk_script *dp); + + +/* ask.c */ +#define fdisk_is_ask(a, x) (fdisk_ask_get_type(a) == FDISK_ASKTYPE_ ## x) + +void fdisk_ref_ask(struct fdisk_ask *ask); +void fdisk_unref_ask(struct fdisk_ask *ask); +const char *fdisk_ask_get_query(struct fdisk_ask *ask); +int fdisk_ask_get_type(struct fdisk_ask *ask); +const char *fdisk_ask_number_get_range(struct fdisk_ask *ask); +uint64_t fdisk_ask_number_get_default(struct fdisk_ask *ask); +uint64_t fdisk_ask_number_get_low(struct fdisk_ask *ask); +uint64_t fdisk_ask_number_get_high(struct fdisk_ask *ask); +uint64_t fdisk_ask_number_get_result(struct fdisk_ask *ask); +int fdisk_ask_number_set_result(struct fdisk_ask *ask, uint64_t result); +uint64_t fdisk_ask_number_get_base(struct fdisk_ask *ask); +uint64_t fdisk_ask_number_get_unit(struct fdisk_ask *ask); +int fdisk_ask_number_set_relative(struct fdisk_ask *ask, int relative); +int fdisk_ask_number_inchars(struct fdisk_ask *ask); +int fdisk_ask_partnum(struct fdisk_context *cxt, size_t *partnum, int wantnew); + +int fdisk_ask_number(struct fdisk_context *cxt, + uintmax_t low, + uintmax_t dflt, + uintmax_t high, + const char *query, + uintmax_t *result); +char *fdisk_ask_string_get_result(struct fdisk_ask *ask); +int fdisk_ask_string_set_result(struct fdisk_ask *ask, char *result); +int fdisk_ask_string(struct fdisk_context *cxt, + const char *query, + char **result); +int fdisk_ask_yesno(struct fdisk_context *cxt, + const char *query, + int *result); +int fdisk_ask_yesno_get_result(struct fdisk_ask *ask); +int fdisk_ask_yesno_set_result(struct fdisk_ask *ask, int result); +int fdisk_ask_menu_get_default(struct fdisk_ask *ask); +int fdisk_ask_menu_set_result(struct fdisk_ask *ask, int key); +int fdisk_ask_menu_get_result(struct fdisk_ask *ask, int *key); +int fdisk_ask_menu_get_item(struct fdisk_ask *ask, size_t idx, int *key, + const char **name, const char **desc); +size_t fdisk_ask_menu_get_nitems(struct fdisk_ask *ask); +int fdisk_ask_print_get_errno(struct fdisk_ask *ask); +const char *fdisk_ask_print_get_mesg(struct fdisk_ask *ask); + +int fdisk_info(struct fdisk_context *cxt, const char *fmt, ...); +int fdisk_warn(struct fdisk_context *cxt, const char *fmt, ...); +int fdisk_warnx(struct fdisk_context *cxt, const char *fmt, ...); + +/* utils.h */ +extern char *fdisk_partname(const char *dev, size_t partno); + +#ifdef __cplusplus +} +#endif + +#endif /* _LIBFDISK_H */ diff --git a/libfdisk/src/libfdisk.sym b/libfdisk/src/libfdisk.sym new file mode 100644 index 000000000..7928322b8 --- /dev/null +++ b/libfdisk/src/libfdisk.sym @@ -0,0 +1,232 @@ +/* + * The symbol versioning ensures that a new application requiring symbol foo; + * can't run with old libblkid.so not providing foo; + * version info can't enforce this since we never change the SONAME. + * + * Copyright (C) 2014 Karel Zak + */ +MOUNT_2.26 { +global: + fdisk_add_partition; + fdisk_align_lba; + fdisk_align_lba_in_range; + fdisk_apply_script; + fdisk_apply_script_headers; + fdisk_apply_table; + fdisk_ask_get_query; + fdisk_ask_get_type; + fdisk_ask_menu_get_default; + fdisk_ask_menu_get_item; + fdisk_ask_menu_get_nitems; + fdisk_ask_menu_get_result; + fdisk_ask_menu_set_result; + fdisk_ask_number; + fdisk_ask_number_get_base; + fdisk_ask_number_get_default; + fdisk_ask_number_get_high; + fdisk_ask_number_get_low; + fdisk_ask_number_get_range; + fdisk_ask_number_get_result; + fdisk_ask_number_get_unit; + fdisk_ask_number_inchars; + fdisk_ask_number_set_relative; + fdisk_ask_number_set_result; + fdisk_ask_partnum; + fdisk_ask_print_get_errno; + fdisk_ask_print_get_mesg; + fdisk_ask_string; + fdisk_ask_string_get_result; + fdisk_ask_string_set_result; + fdisk_ask_yesno; + fdisk_ask_yesno_get_result; + fdisk_ask_yesno_set_result; + fdisk_assign_device; + fdisk_bsd_edit_disklabel; + fdisk_bsd_link_partition; + fdisk_bsd_write_bootstrap; + fdisk_copy_parttype; + fdisk_create_disklabel; + fdisk_deassign_device; + fdisk_delete_all_partitions; + fdisk_delete_partition; + fdisk_dos_enable_compatible; + fdisk_dos_is_compatible; + fdisk_dos_move_begin; + fdisk_enable_details; + fdisk_enable_listonly; + fdisk_field_get_id; + fdisk_field_get_name; + fdisk_field_get_width; + fdisk_field_is_number; + fdisk_free_iter; + fdisk_get_alignment_offset; + fdisk_get_devfd; + fdisk_get_devname; + fdisk_get_disklabel_id; + fdisk_get_first_lba; + fdisk_get_freespaces; + fdisk_get_geom_cylinders; + fdisk_get_geom_heads; + fdisk_get_geom_sectors; + fdisk_get_grain_size; + fdisk_get_label; + fdisk_get_last_lba; + fdisk_get_minimal_iosize; + fdisk_get_nlabels; + fdisk_get_npartitions; + fdisk_get_nsectors; + fdisk_get_optimal_iosize; + fdisk_get_parent; + fdisk_get_partition; + fdisk_get_partitions; + fdisk_get_physector_size; + fdisk_get_script; + fdisk_get_sector_size; + fdisk_get_unit; + fdisk_get_units_per_sector; + fdisk_gpt_is_hybrid; + fdisk_has_label; + fdisk_has_user_device_properties; + fdisk_info; + fdisk_init_debug; + fdisk_is_details; + fdisk_is_labeltype; + fdisk_is_listonly; + fdisk_is_partition_used; + fdisk_is_readonly; + fdisk_iter_get_direction; + fdisk_label_get_field; + fdisk_label_get_field_by_name; + fdisk_label_get_fields_ids; + fdisk_label_get_name; + fdisk_label_get_nparttypes; + fdisk_label_get_parttype; + fdisk_label_get_parttype_from_code; + fdisk_label_get_parttype_from_string; + fdisk_label_get_type; + fdisk_label_has_code_parttypes; + fdisk_label_is_changed; + fdisk_label_is_disabled; + fdisk_label_parse_parttype; + fdisk_label_require_geometry; + fdisk_label_set_changed; + fdisk_label_set_disabled; + fdisk_lba_is_phy_aligned; + fdisk_list_disklabel; + fdisk_locate_disklabel; + fdisk_new_context; + fdisk_new_iter; + fdisk_new_nested_context; + fdisk_new_partition; + fdisk_new_parttype; + fdisk_new_script; + fdisk_new_script_from_file; + fdisk_new_table; + fdisk_new_unknown_parttype; + fdisk_next_label; + fdisk_override_geometry; + fdisk_partition_cmp_partno; + fdisk_partition_cmp_start; + fdisk_partition_end_follow_default; + fdisk_partition_end_is_default; + fdisk_partition_get_attrs; + fdisk_partition_get_name; + fdisk_partition_get_parent; + fdisk_partition_get_partno; + fdisk_partition_get_size; + fdisk_partition_get_start; + fdisk_partition_get_type; + fdisk_partition_get_uuid; + fdisk_partition_has_partno; + fdisk_partition_has_size; + fdisk_partition_has_start; + fdisk_partition_is_bootable; + fdisk_partition_is_container; + fdisk_partition_is_freespace; + fdisk_partition_is_nested; + fdisk_partition_is_used; + fdisk_partition_next_partno; + fdisk_partition_partno_follow_default; + fdisk_partition_set_attrs; + fdisk_partition_set_name; + fdisk_partition_set_partno; + fdisk_partition_set_size; + fdisk_partition_set_start; + fdisk_partition_set_type; + fdisk_partition_set_uuid; + fdisk_partition_size_explicit; + fdisk_partition_start_follow_default; + fdisk_partition_start_is_default; + fdisk_partition_toggle_flag; + fdisk_partition_to_string; + fdisk_partition_unset_partno; + fdisk_partition_unset_size; + fdisk_partition_unset_start; + fdisk_partname; + fdisk_parttype_get_code; + fdisk_parttype_get_name; + fdisk_parttype_get_string; + fdisk_parttype_is_unknown; + fdisk_parttype_set_code; + fdisk_parttype_set_name; + fdisk_parttype_set_typestr; + fdisk_ref_ask; + fdisk_ref_context; + fdisk_ref_partition; + fdisk_ref_parttype; + fdisk_ref_script; + fdisk_ref_table; + fdisk_reorder_partitions; + fdisk_reread_partition_table; + fdisk_reset_alignment; + fdisk_reset_device_properties; + fdisk_reset_iter; + fdisk_reset_partition; + fdisk_reset_table; + fdisk_save_user_geometry; + fdisk_save_user_sector_size; + fdisk_script_get_header; + fdisk_script_get_nlines; + fdisk_script_get_table; + fdisk_script_read_context; + fdisk_script_read_file; + fdisk_script_read_line; + fdisk_script_set_header; + fdisk_script_write_file; + fdisk_set_ask; + fdisk_set_disklabel_id; + fdisk_set_first_lba; + fdisk_set_last_lba; + fdisk_set_partition; + fdisk_set_partition_type; + fdisk_set_script; + fdisk_set_unit; + fdisk_sgi_create_info; + fdisk_sgi_set_bootfile; + fdisk_sun_set_alt_cyl; + fdisk_sun_set_ilfact; + fdisk_sun_set_pcylcount; + fdisk_sun_set_rspeed; + fdisk_sun_set_xcyl; + fdisk_table_add_partition; + fdisk_table_get_nents; + fdisk_table_get_partition; + fdisk_table_is_empty; + fdisk_table_next_partition; + fdisk_table_remove_partition; + fdisk_table_sort_partitions; + fdisk_table_wrong_order; + fdisk_unref_ask; + fdisk_unref_context; + fdisk_unref_partition; + fdisk_unref_parttype; + fdisk_unref_script; + fdisk_unref_table; + fdisk_use_cylinders; + fdisk_verify_disklabel; + fdisk_warn; + fdisk_warnx; + fdisk_write_disklabel; +local: + *; +}; -- cgit v1.2.3-55-g7522