diff options
Diffstat (limited to 'libparted/libparted.c')
-rw-r--r-- | libparted/libparted.c | 345 |
1 files changed, 345 insertions, 0 deletions
diff --git a/libparted/libparted.c b/libparted/libparted.c new file mode 100644 index 0000000..c3c8ab4 --- /dev/null +++ b/libparted/libparted.c @@ -0,0 +1,345 @@ +/* + libparted - a library for manipulating disk partitions + Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program 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 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 St, Fifth Floor, Boston, MA 02110-1301, USA +*/ + +#include "config.h" + +#include <parted/parted.h> +#include <parted/debug.h> + +#ifdef linux +# include <parted/linux.h> +#elif defined(__BEOS__) +# include <parted/beos.h> +#else +# include <parted/gnu.h> +#endif + +#include <string.h> +#include <stdlib.h> + +#if ENABLE_NLS +# include <locale.h> +# include <libintl.h> +# define _(String) dgettext (PACKAGE, String) +#else +# define _(String) (String) +#endif /* ENABLE_NLS */ + +const PedArchitecture* ped_architecture; + +/* ped_malloc() debugging. Stick the address and size of memory blocks that + * weren't ped_free()d in here, and an exception will be thrown when it is + * allocated. That way, you can find out what, exactly, the allocated thing + * is, and where it is created. + */ +typedef struct +{ + void* pointer; + size_t size; +} pointer_size_type; + +#ifdef DEBUG +static pointer_size_type dodgy_malloc_list[] = { + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0} +}; + +static int dodgy_memory_active[100]; +#endif /* DEBUG */ + +int +ped_set_architecture (const PedArchitecture* arch) +{ + PED_ASSERT (ped_device_get_next (NULL) == NULL, return 0); + + ped_architecture = arch; + return 1; +} + +extern void ped_disk_aix_init (); +extern void ped_disk_bsd_init (); +extern void ped_disk_dvh_init (); +extern void ped_disk_gpt_init (); +extern void ped_disk_loop_init (); +extern void ped_disk_mac_init (); +extern void ped_disk_msdos_init (); +extern void ped_disk_pc98_init (); +extern void ped_disk_sun_init (); +extern void ped_disk_amiga_init (); +extern void ped_disk_dasd_init (); + +static void +init_disk_types () +{ + ped_disk_loop_init (); /* must be last in the probe list */ + +#if defined(__s390__) || defined(__s390x__) + ped_disk_dasd_init(); +#endif + + ped_disk_sun_init (); +#ifdef ENABLE_PC98 + ped_disk_pc98_init (); +#endif + ped_disk_msdos_init (); + ped_disk_mac_init (); + ped_disk_gpt_init (); + ped_disk_dvh_init (); + ped_disk_bsd_init (); + ped_disk_amiga_init (); + ped_disk_aix_init (); +} + +#ifdef ENABLE_FS +extern void ped_file_system_amiga_init (void); +extern void ped_file_system_xfs_init (void); +extern void ped_file_system_ufs_init (void); +extern void ped_file_system_reiserfs_init (void); +extern void ped_file_system_ntfs_init (void); +extern void ped_file_system_linux_swap_init (void); +extern void ped_file_system_jfs_init (void); +extern void ped_file_system_hfs_init (void); +extern void ped_file_system_fat_init (void); +extern void ped_file_system_ext2_init (void); + +static void +init_file_system_types () +{ + ped_file_system_amiga_init (); + ped_file_system_xfs_init (); + ped_file_system_ufs_init (); + ped_file_system_reiserfs_init (); + ped_file_system_ntfs_init (); + ped_file_system_linux_swap_init (); + ped_file_system_jfs_init (); + ped_file_system_hfs_init (); + ped_file_system_fat_init (); + ped_file_system_ext2_init (); +} +#endif /* ENABLE_FS */ + +extern void ped_disk_aix_done (); +extern void ped_disk_bsd_done (); +extern void ped_disk_dvh_done (); +extern void ped_disk_gpt_done (); +extern void ped_disk_loop_done (); +extern void ped_disk_mac_done (); +extern void ped_disk_msdos_done (); +extern void ped_disk_pc98_done (); +extern void ped_disk_sun_done (); +extern void ped_disk_amiga_done (); +extern void ped_disk_dasd_done (); + +static void +done_disk_types () +{ +#if defined(__s390__) || (__s390x__) + ped_disk_dasd_done (); +#endif + ped_disk_sun_done (); +#ifdef ENABLE_PC98 + ped_disk_pc98_done (); +#endif + ped_disk_msdos_done (); + ped_disk_mac_done (); + ped_disk_loop_done (); + ped_disk_gpt_done (); + ped_disk_dvh_done (); + ped_disk_bsd_done (); + ped_disk_amiga_done (); + ped_disk_aix_done (); +} + +static void _init() __attribute__ ((constructor)); + +static void +_init() +{ +#ifdef ENABLE_NLS + bindtextdomain (PACKAGE, LOCALEDIR); +#endif + + init_disk_types (); + +#ifdef ENABLE_FS + init_file_system_types (); +#endif + + /* FIXME: a better way of doing this? */ +#ifdef linux + ped_set_architecture (&ped_linux_arch); +#elif defined(__BEOS__) + ped_set_architecture (&ped_beos_arch); +#else + ped_set_architecture (&ped_gnu_arch); +#endif + +#ifdef DEBUG + memset (dodgy_memory_active, 0, sizeof (dodgy_memory_active)); +#endif +} + +#ifdef ENABLE_FS +extern void ped_file_system_ext2_done (void); +extern void ped_file_system_fat_done (void); +extern void ped_file_system_hfs_done (void); +extern void ped_file_system_jfs_done (void); +extern void ped_file_system_linux_swap_done (void); +extern void ped_file_system_ntfs_done (void); +extern void ped_file_system_reiserfs_done (void); +extern void ped_file_system_ufs_done (void); +extern void ped_file_system_xfs_done (void); +extern void ped_file_system_amiga_done (void); + +static void +done_file_system_types () +{ + ped_file_system_ext2_done (); + ped_file_system_fat_done (); + ped_file_system_hfs_done (); + ped_file_system_jfs_done (); + ped_file_system_linux_swap_done (); + ped_file_system_ntfs_done (); + ped_file_system_reiserfs_done (); + ped_file_system_ufs_done (); + ped_file_system_xfs_done (); + ped_file_system_amiga_done (); +} +#endif /* ENABLE_FS */ + +static void _done() __attribute__ ((destructor)); + +static void +_done() +{ + ped_device_free_all (); + + done_disk_types (); + +#ifdef ENABLE_FS + done_file_system_types (); +#endif +} + +const char* +ped_get_version () +{ + return VERSION; +} + +#ifdef DEBUG +static void +_check_dodgy_pointer (const void* ptr, size_t size, int is_malloc) +{ + int i; + + for (i=0; dodgy_malloc_list[i].pointer; i++) { + if (dodgy_malloc_list[i].pointer != ptr) + continue; + if (is_malloc && dodgy_malloc_list[i].size != size) + continue; + if (!is_malloc && !dodgy_memory_active[i]) + continue; + + + if (is_malloc) { + ped_exception_throw ( + PED_EXCEPTION_INFORMATION, + PED_EXCEPTION_OK, + "Dodgy malloc(%x) == %p occurred (active==%d)", + size, ptr, dodgy_memory_active[i]); + dodgy_memory_active[i]++; + } else { + ped_exception_throw ( + PED_EXCEPTION_INFORMATION, + PED_EXCEPTION_OK, + "Dodgy free(%p) occurred (active==%d)", + ptr, dodgy_memory_active[i]); + dodgy_memory_active[i]--; + } + + return; + } +} +#endif /* DEBUG */ + +void* +ped_malloc (size_t size) +{ + void* mem; + + mem = (void*) malloc (size); + if (!mem) { + ped_exception_throw (PED_EXCEPTION_FATAL, PED_EXCEPTION_CANCEL, + _("Out of memory.")); + return NULL; + } + +#ifdef DEBUG + memset (mem, 0xff, size); + _check_dodgy_pointer (mem, size, 1); +#endif + + return mem; +} + +int +ped_realloc (void** old, size_t size) +{ + void* mem; + + mem = (void*) realloc (*old, size); + if (!mem) { + ped_exception_throw (PED_EXCEPTION_FATAL, PED_EXCEPTION_CANCEL, + _("Out of memory.")); + return 0; + } + *old = mem; + return 1; +} + + +void* ped_calloc (size_t size) +{ + void* buf = ped_malloc (size); + + memset (buf, 0, size); + + return buf; +} + + +void +ped_free (void* ptr) +{ +#ifdef DEBUG + _check_dodgy_pointer (ptr, 0, 0); +#endif + + free (ptr); +} + |