parted: revamp 1.8.8 recipe
authorOtavio Salvador <otavio@ossystems.com.br>
Tue, 10 Feb 2009 17:25:11 +0000 (15:25 -0200)
committerOtavio Salvador <otavio@ossystems.com.br>
Tue, 10 Feb 2009 20:51:58 +0000 (18:51 -0200)
It now uses a macro to define _llseek if it is not available and sync
it against current stable branch making it more suitable to be used in
scripts and like.

Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
packages/parted/files/parted-1.8.x.patch [new file with mode: 0644]
packages/parted/files/syscalls.h [deleted file]
packages/parted/files/syscalls.patch [deleted file]
packages/parted/files/use_llseek_syscall.patch [new file with mode: 0644]
packages/parted/parted_1.8.8.bb

diff --git a/packages/parted/files/parted-1.8.x.patch b/packages/parted/files/parted-1.8.x.patch
new file mode 100644 (file)
index 0000000..167a0fb
--- /dev/null
@@ -0,0 +1,1492 @@
+diff --git a/configure.ac b/configure.ac
+index f1284a0..9f0971b 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -5,7 +5,7 @@ dnl
+ dnl This file may be modified and/or distributed without restriction.
+ AC_PREREQ(2.61)
+-AC_INIT([GNU parted],[1.8.8],[bug-parted@gnu.org])
++AC_INIT([GNU parted],[1.8.9],[bug-parted@gnu.org])
+ AC_CONFIG_SRCDIR(include/parted/parted.h)
+@@ -24,7 +24,7 @@ dnl function signatures changed),
+ dnl set PED_BINARY_AGE _and_ PED_INTERFACE_AGE to 0.
+ PED_MAJOR_VERSION=1
+ PED_MINOR_VERSION=8
+-PED_MICRO_VERSION=8
++PED_MICRO_VERSION=9
+ PED_INTERFACE_AGE=0
+ PED_BINARY_AGE=0
+ PED_VERSION_SUFFIX=
+@@ -471,14 +471,7 @@ AC_CHECK_HEADER([execinfo.h], [
+       ])
+ ])
+-dnl Checks for #defines.
+-AC_COMPILE_IFELSE([
+-      AC_LANG_PROGRAM([[
+-      #if defined __s390__ || defined __s390x__
+-      #  message s390 defined
+-      #endif
+-      ]])], [compile_for_s390="no"], [compile_for_s390="yes"])
+-AM_CONDITIONAL([COMPILE_FOR_S390], [test "$compile_for_s390" = "yes"])
++AM_CONDITIONAL([COMPILE_FOR_S390], [test "$host_cpu" = s390 || test "$host_cpu" = s390x])
+ dnl check for "check", unit testing library/header
+ PKG_CHECK_MODULES([CHECK], [check >= 0.9.3], have_check=yes, have_check=no)
+diff --git a/doc/C/parted.8 b/doc/C/parted.8
+index 7040402..fdf3d04 100644
+--- a/doc/C/parted.8
++++ b/doc/C/parted.8
+@@ -124,6 +124,18 @@ and a human-friendly form for output).
+ .B version
+ Display version information and a copyright message.
+ .RE
++.SH KNOWN ISSUES
++ext3 filesystem resizing does not currently work, please use
++.BR resize2fs (8)
++instead.
++
++Resizing partitions with an ext3 filesystem will not generally work because
++of the above issue.  Use
++.BR resize2fs (8)
++to resize the filesystem and resize the partition manually using
++.BR fdisk (8)
++or a similar tool.  For LVM situations, you will need to use the LVM commands
++to resize the LVM elements.
+ .SH REPORTING BUGS
+ Report bugs to <bug-parted@gnu.org>
+ .SH SEE ALSO
+diff --git a/doc/parted.texi b/doc/parted.texi
+index 139ea77..86ec076 100644
+--- a/doc/parted.texi
++++ b/doc/parted.texi
+@@ -14,7 +14,7 @@ resizing, checking and copy partitions and file systems on them.
+ @ifnottex @c texi2pdf don't understand copying and insertcopying ???
+ @c modifications must also be done in the titlepage
+ @copying
+-Copyright @copyright{} 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
++Copyright @copyright{} 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
+ Free Software Foundation, Inc.
+ Permission is granted to copy, distribute and/or modify this document
+@@ -63,7 +63,7 @@ Free Documentation License''.
+ @c WTF doesn't texi2html include the titlepage?
+ @ifhtml
+-@insertcopying 
++@insertcopying
+ @end ifhtml
+ This document describes the use of GNU Parted, a program for creating,
+@@ -257,7 +257,7 @@ $ @kbd{make}
+ However, there are a few options for @command{configure}:
+ @table @code
+-@item --without-readline              
++@item --without-readline
+ turns off use of readline.  This is useful for making rescue disks,
+ etc., where few libraries are available.
+@@ -275,12 +275,12 @@ you don't need the flexibility.
+ @item --disable-fs
+ disable all file system support
+-@item --disable-nls                   
++@item --disable-nls
+ turns off native language support.  This is useful for use with old
+ versions of glibc, or a trimmed down version of glibc suitable for
+ rescue disks.
+-@item --disable-shared                
++@item --disable-shared
+ turns off shared libraries.  This may be necessary for use with old
+ versions of GNU libc, if you get a compile error about a ``spilled
+ register''.  Also useful for boot/rescue disks.
+@@ -301,7 +301,7 @@ disable writing (for debugging)
+ @node Static binaries
+ @section Using static binaries of GNU Parted
+-@cindex static binary 
++@cindex static binary
+ @cindex unsupported platforms
+ @cindex resizing root device
+@@ -320,7 +320,7 @@ of the latest GNU Parted version is available, which you can use thus:
+ @subsection Creating the Parted disk
+ @enumerate
+-@item Boot your system 
++@item Boot your system
+ @item Download @file{parted-static-VERSION.tgz} from @uref{ftp://ftp.gnu.org/gnu/parted/static}
+ @item Unpack the tarball, resulting in a file called ``parted.static".
+@@ -329,7 +329,7 @@ of the latest GNU Parted version is available, which you can use thus:
+ @item Do a low-level format on it (on GNU/Linux this can be achieved with
+       the tool ``fdformat" from the ``util-linux" package.
+-      This is basically a sanity check because floppy disks often 
++      This is basically a sanity check because floppy disks often
+       contain bad blocks.
+ @item Create a file system. Example:
+@@ -359,7 +359,7 @@ $ @kbd{umount /mnt/floppy}
+ @subsection Using the Parted disk
+ @enumerate
+-@item Choose a rescue disk that suits you. 
++@item Choose a rescue disk that suits you.
+ @item Boot off your rescue disk.  Mount the disk you copied Parted onto.
+@@ -383,7 +383,7 @@ $ @kbd{umount /mnt/floppy}
+ @end menu
+ @node Partitioning
+-@section Introduction to Partitioning 
++@section Introduction to Partitioning
+ @cindex partitioning overview
+ Unfortunately, partitioning your disk is rather complicated.  This is
+@@ -566,7 +566,7 @@ Supported file systems:
+ (provided the destination partition is larger than the source partition)
+ @item fat16, fat32
+-@item linux-swap      
++@item linux-swap
+ (equivalent to mkswap on destination partition)
+ @item reiserfs (if libreiserfs is installed)
+@@ -918,7 +918,7 @@ partitions can be resized only so long as the new extended partition
+ completely contains all logical partitions.
+ Note that Parted can manipulate partitions whether or not they have been
+-defragmented, so you do not need to defragmenting the disk before
++defragmented, so you do not need to defragment the disk before
+ using Parted.
+ Supported file systems:
+@@ -1031,7 +1031,7 @@ Microsoft operating systems.
+ @item raid
+ (MS-DOS) - this flag can be enabled to tell linux the partition is a
+-software RAID partition. 
++software RAID partition.
+ @item LVM
+ (MS-DOS) - this flag can be enabled to tell linux the partition is a
+@@ -1109,59 +1109,59 @@ specified after an input number.  Input numbers can be followed by
+ an unit (without any space or other character between them), in
+ which case this unit apply instead of the default unit for this
+ particular number, but CHS and cylinder units are not supported as
+-a suffix.  If no suffix is given, then the default unit is assumed. 
++a suffix.  If no suffix is given, then the default unit is assumed.
+ Parted will compute sensible ranges for the locations you specify
+ (e.g. a range of +/- 500 MB when you specify the location in ``G'')
+ and will select the nearest location in this range from the one you
+ wrote that satisfies constraints from both the operation, the
+ filesystem being worked on, the disk label, other partitions and so
+ on.  Use the sector unit ``s'' to specify exact locations (if they
+-do not satisfy all onstraints, Parted will ask you for the nearest 
++do not satisfy all onstraints, Parted will ask you for the nearest
+ solution).  Note that negative numbers count back from the end of
+-the disk, with ``-1s'' pointing to the end of the disk.  
++the disk, with ``-1s'' pointing to the end of the disk.
+ Example:
+ @example
+ @group
+-(parted) unit compact                                                     
+-(parted) print                                                            
++(parted) unit compact
++(parted) print
+ Disk geometry for /dev/hda: 0kB - 123GB
+ Disk label type: msdos
+ Number  Start   End     Size    Type      File system  Flags
+ 1       32kB    1078MB  1077MB  primary   reiserfs     boot
+-2       1078MB  2155MB  1078MB  primary   linux-swap   
+-3       2155MB  123GB   121GB   extended               
+-5       2155MB  7452MB  5297MB  logical   reiserfs     
++2       1078MB  2155MB  1078MB  primary   linux-swap
++3       2155MB  123GB   121GB   extended
++5       2155MB  7452MB  5297MB  logical   reiserfs
+ @end group
+ @group
+-(parted) unit chs print                                                   
++(parted) unit chs print
+ Disk geometry for /dev/hda: 0,0,0 - 14946,225,62
+ BIOS cylinder,head,sector geometry: 14946,255,63.  Each cylinder
+ is 8225kB.
+ Disk label type: msdos
+ Number  Start       End         Type      File system  Flags
+ 1       0,1,0       130,254,62  primary   reiserfs     boot
+-2       131,0,0     261,254,62  primary   linux-swap   
+-3       262,0,0     14945,254,62 extended               
+-5       262,2,0     905,254,62  logical   reiserfs     
++2       131,0,0     261,254,62  primary   linux-swap
++3       262,0,0     14945,254,62 extended
++5       262,2,0     905,254,62  logical   reiserfs
+ @end group
+ @group
+-(parted) unit mb print                                                    
++(parted) unit mb print
+ Disk geometry for /dev/hda: 0MB - 122942MB
+ Disk label type: msdos
+ Number  Start   End     Size    Type      File system  Flags
+ 1       0MB     1078MB  1077MB  primary   reiserfs     boot
+-2       1078MB  2155MB  1078MB  primary   linux-swap   
+-3       2155MB  122935MB 120780MB extended               
+-5       2155MB  7452MB  5297MB  logical   reiserfs     
++2       1078MB  2155MB  1078MB  primary   linux-swap
++3       2155MB  122935MB 120780MB extended
++5       2155MB  7452MB  5297MB  logical   reiserfs
+ @end group
+ @end example
+ @end deffn
+ @node Related information
+-@chapter Related information 
++@chapter Related information
+ @cindex further reading
+ @cindex related documentation
+diff --git a/include/parted/constraint.h b/include/parted/constraint.h
+index 7a39602..6496926 100644
+--- a/include/parted/constraint.h
++++ b/include/parted/constraint.h
+@@ -22,6 +22,7 @@
+ typedef struct _PedConstraint PedConstraint;
+ #include <parted/device.h>
++#include <parted/geom.h>
+ #include <parted/natmath.h>
+ struct _PedConstraint {
+diff --git a/include/parted/device.h b/include/parted/device.h
+index cf32dba..e669688 100644
+--- a/include/parted/device.h
++++ b/include/parted/device.h
+@@ -26,6 +26,7 @@
+ #ifndef PED_DEVICE_H_INCLUDED
+ #define PED_DEVICE_H_INCLUDED
++#include <parted/constraint.h>
+ #include <parted/timer.h>
+ /** We can address 2^63 sectors */
+@@ -45,9 +46,7 @@ typedef enum {
+         PED_DEVICE_DASD         = 9,
+         PED_DEVICE_VIODASD      = 10,
+         PED_DEVICE_SX8          = 11,
+-#ifdef ENABLE_DEVICE_MAPPER
+         PED_DEVICE_DM           = 12,
+-#endif
+         PED_DEVICE_XVD          = 13
+ } PedDeviceType;
+diff --git a/include/parted/disk.h b/include/parted/disk.h
+index b82ea0f..1b0133d 100644
+--- a/include/parted/disk.h
++++ b/include/parted/disk.h
+@@ -1,6 +1,6 @@
+ /*
+     libparted - a library for manipulating disk partitions
+-    Copyright (C) 1999, 2000, 2001, 2002, 2007 Free Software Foundation, Inc.
++    Copyright (C) 1999, 2000, 2001, 2002, 2007, 2008 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
+@@ -52,10 +52,11 @@ enum _PedPartitionFlag {
+         PED_PARTITION_HPSERVICE=8,
+         PED_PARTITION_PALO=9,
+         PED_PARTITION_PREP=10,
+-        PED_PARTITION_MSFT_RESERVED=11
++        PED_PARTITION_MSFT_RESERVED=11,
++        PED_PARTITION_BIOS_GRUB=12
+ };
+ #define PED_PARTITION_FIRST_FLAG        PED_PARTITION_BOOT
+-#define PED_PARTITION_LAST_FLAG         PED_PARTITION_MSFT_RESERVED
++#define PED_PARTITION_LAST_FLAG         PED_PARTITION_BIOS_GRUB
+ enum _PedDiskTypeFeature {
+         PED_DISK_TYPE_EXTENDED=1,       /**< supports extended partitions */
+diff --git a/include/parted/linux.h b/include/parted/linux.h
+index 52d28be..05a2f0e 100644
+--- a/include/parted/linux.h
++++ b/include/parted/linux.h
+@@ -22,7 +22,7 @@
+ #include <parted/parted.h>
+ #include <parted/device.h>
+-#if defined __s390__ || defined __s390x__
++#if defined(__s390__) || defined(__s390x__)
+ #  include <parted/fdasd.h>
+ #endif
+diff --git a/include/parted/natmath.h b/include/parted/natmath.h
+index 32a6e28..e387833 100644
+--- a/include/parted/natmath.h
++++ b/include/parted/natmath.h
+@@ -30,6 +30,7 @@
+ typedef struct _PedAlignment  PedAlignment;
+ #include <parted/disk.h>
++#include <parted/device.h>
+ #define PED_MIN(a, b) ( ((a)<(b)) ? (a) : (b) )
+ #define PED_MAX(a, b) ( ((a)>(b)) ? (a) : (b) )
+diff --git a/libparted/arch/linux.c b/libparted/arch/linux.c
+index 462ab92..9876956 100644
+--- a/libparted/arch/linux.c
++++ b/libparted/arch/linux.c
+@@ -64,7 +64,7 @@
+ #define HDIO_GETGEO             0x0301  /* get device geometry */
+ #define HDIO_GET_IDENTITY       0x030d  /* get IDE identification info */
+-#if defined(O_DIRECT) && (!defined(__s390__) || !defined(__s390x__))
++#if defined(O_DIRECT) && !(defined(__s390__) || defined(__s390x__))
+ #define RD_MODE (O_RDONLY | O_DIRECT)
+ #define WR_MODE (O_WRONLY | O_DIRECT)
+ #define RW_MODE (O_RDWR | O_DIRECT)
+@@ -986,7 +986,7 @@ error:
+ }
+ static int
+-init_dasd (PedDevice* dev, char* model_name)
++init_dasd (PedDevice* dev, const char* model_name)
+ {
+         struct stat             dev_stat;
+         struct hd_geometry      geo;
+@@ -1042,7 +1042,7 @@ error:
+ }
+ static int
+-init_generic (PedDevice* dev, char* model_name)
++init_generic (PedDevice* dev, const char* model_name)
+ {
+         struct stat             dev_stat;
+         PedExceptionOption      ex_status;
+diff --git a/libparted/cs/natmath.c b/libparted/cs/natmath.c
+index b8b4a95..fd376cd 100644
+--- a/libparted/cs/natmath.c
++++ b/libparted/cs/natmath.c
+@@ -74,16 +74,16 @@ ped_round_down_to (PedSector sector, PedSector grain_size)
+       return sector - abs_mod (sector, grain_size);
+ }
+-inline PedSector
++PedSector
+ ped_div_round_up (PedSector numerator, PedSector divisor)
+ {
+-                return (numerator + divisor - 1) / divisor;
++      return (numerator + divisor - 1) / divisor;
+ }
+-inline PedSector
++PedSector
+ ped_div_round_to_nearest (PedSector numerator, PedSector divisor)
+ {
+-                return (numerator + divisor/2) / divisor;
++      return (numerator + divisor/2) / divisor;
+ }
+ /* Rounds a number up to the closest number that is a multiple of
+diff --git a/libparted/disk.c b/libparted/disk.c
+index 1582f26..c465d40 100644
+--- a/libparted/disk.c
++++ b/libparted/disk.c
+@@ -224,23 +224,24 @@ static int
+ _add_duplicate_part (PedDisk* disk, PedPartition* old_part)
+ {
+       PedPartition*   new_part;
+-      PedConstraint*  constraint_exact;
++      int ret;
+       new_part = disk->type->ops->partition_duplicate (old_part);
+       if (!new_part)
+               goto error;
+       new_part->disk = disk;
+-      constraint_exact = ped_constraint_exact (&new_part->geom);
+-      if (!constraint_exact)
++      _disk_push_update_mode (disk);
++      ret = _disk_raw_add (disk, new_part);
++      _disk_pop_update_mode (disk);
++      if (!ret)
+               goto error_destroy_new_part;
+-      if (!ped_disk_add_partition (disk, new_part, constraint_exact))
+-                      goto error_destroy_constraint_exact;
+-      ped_constraint_destroy (constraint_exact);
++#ifdef DEBUG
++      if (!_disk_check_sanity (disk))
++              goto error_destroy_new_part;
++#endif
+       return 1;
+-error_destroy_constraint_exact:
+-      ped_constraint_destroy (constraint_exact);
+ error_destroy_new_part:
+       ped_partition_destroy (new_part);
+ error:
+@@ -2161,6 +2162,8 @@ ped_partition_flag_get_name (PedPartitionFlag flag)
+       switch (flag) {
+       case PED_PARTITION_BOOT:
+               return N_("boot");
++      case PED_PARTITION_BIOS_GRUB:
++              return N_("bios_grub");
+       case PED_PARTITION_ROOT:
+               return N_("root");
+       case PED_PARTITION_SWAP:
+diff --git a/libparted/exception.c b/libparted/exception.c
+index 0940d65..230a9b7 100644
+--- a/libparted/exception.c
++++ b/libparted/exception.c
+@@ -1,6 +1,6 @@
+ /*
+     libparted - a library for manipulating disk partitions
+-    Copyright (C) 1999, 2000, 2007 Free Software Foundation, Inc.
++    Copyright (C) 1999, 2000, 2007-2008 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
+@@ -73,7 +73,7 @@ static PedExceptionHandler*  ex_handler = default_handler;
+ static PedException*          ex = NULL;
+ static int                    ex_fetch_count = 0;
+-static char*  type_strings [] = {
++static const char *const type_strings [] = {
+       N_("Information"),
+       N_("Warning"),
+       N_("Error"),
+@@ -82,7 +82,7 @@ static char* type_strings [] = {
+       N_("No Implementation")
+ };
+-static char*  option_strings [] = {
++static const char *const option_strings [] = {
+       N_("Fix"),
+       N_("Yes"),
+       N_("No"),
+@@ -98,7 +98,7 @@ static char* option_strings [] = {
+ char*
+ ped_exception_get_type_string (PedExceptionType ex_type)
+ {
+-      return type_strings [ex_type - 1];
++      return (char *) type_strings [ex_type - 1];
+ }
+ /* FIXME: move this out to the prospective math.c */
+@@ -121,7 +121,7 @@ ped_log2 (int n)
+ char*
+ ped_exception_get_option_string (PedExceptionOption ex_opt)
+ {
+-      return option_strings [ped_log2 (ex_opt)];
++      return (char *) option_strings [ped_log2 (ex_opt)];
+ }
+ static PedExceptionOption
+@@ -243,8 +243,8 @@ ped_exception_throw (PedExceptionType ex_type,
+       ex->type = ex_type;
+       ex->options = ex_opts;
+-      while (1) {
+-                      ex->message = (char*) malloc (size);
++      while (message) {
++                      ex->message = (char*) malloc (size * sizeof (char));
+                       if (!ex->message)
+                                       goto no_memory;
+@@ -256,6 +256,7 @@ ped_exception_throw (PedExceptionType ex_type,
+                                       break;
+                       size += 10;
++                      ped_free (ex->message);
+       }
+       return do_throw ();
+diff --git a/libparted/fs/ext2/ext2.c b/libparted/fs/ext2/ext2.c
+index 618fca9..79fc6f6 100644
+--- a/libparted/fs/ext2/ext2.c
++++ b/libparted/fs/ext2/ext2.c
+@@ -727,7 +727,10 @@ struct ext2_fs *ext2_open(struct ext2_dev_handle *handle, int state)
+                           EXT2_FEATURE_RO_COMPAT_LARGE_FILE)))
+       {
+               ped_exception_throw (PED_EXCEPTION_ERROR, PED_EXCEPTION_CANCEL,
+-                   _("File system has an incompatible feature enabled."));
++                   _("File system has an incompatible feature enabled.  "
++                     "Compatible features are has_journal, dir_index, "
++                     "filetype, sparse_super and large_file.  "
++                     "Use tune2fs or debugfs to remove features."));
+               goto error_free_fs;
+       }
+diff --git a/libparted/fs/ext2/ext2_block_relocator.c b/libparted/fs/ext2/ext2_block_relocator.c
+index b75a4c5..60f3d50 100644
+--- a/libparted/fs/ext2/ext2_block_relocator.c
++++ b/libparted/fs/ext2/ext2_block_relocator.c
+@@ -691,10 +691,11 @@ static int ext2_block_relocator_flush(struct ext2_fs *fs, struct ext2_block_relo
+               {
+                       /* FIXXXME gross hack */
+                       fprintf(stderr, "relocating %s blocks",
+-                              ((char *[4]){"direct",
+-                                                   "singly indirect",
+-                                                   "doubly indirect",
+-                                                   "triply indirect"})[i]);
++                              ((const char *const [4])
++                               {"direct",
++                                "singly indirect",
++                                "doubly indirect",
++                                "triply indirect"})[i]);
+                       fflush(stderr);
+               }
+diff --git a/libparted/fs/ext2/ext2_mkfs.c b/libparted/fs/ext2/ext2_mkfs.c
+index 19931dd..b1a8ce3 100644
+--- a/libparted/fs/ext2/ext2_mkfs.c
++++ b/libparted/fs/ext2/ext2_mkfs.c
+@@ -1,6 +1,6 @@
+ /*
+     ext2_mkfs.c -- ext2 fs creator
+-    Copyright (C) 1999, 2000, 2001, 2007 Free Software Foundation, Inc.
++    Copyright (C) 1999, 2000, 2001, 2007-2008 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
+@@ -263,7 +263,7 @@ error:
+ /* returns the offset into the buffer of the start of the next dir entry */
+ static int _set_dirent(void* buf, int offset, int block_size, int is_last,
+-                     uint32_t inode, char* name, int file_type)
++                     uint32_t inode, const char* name, int file_type)
+ {
+       struct ext2_dir_entry_2 *dirent = (void*) (((char*)buf) + offset);
+       int name_len = strlen(name);
+diff --git a/libparted/fs/fat/resize.c b/libparted/fs/fat/resize.c
+index 7386948..5f24ec2 100644
+--- a/libparted/fs/fat/resize.c
++++ b/libparted/fs/fat/resize.c
+@@ -1,6 +1,6 @@
+ /*
+     libparted
+-    Copyright (C) 1998, 1999, 2000, 2007 Free Software Foundation, Inc.
++    Copyright (C) 1998, 1999, 2000, 2007-2008 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
+@@ -481,8 +481,8 @@ ask_type (PedFileSystem* fs, int fat16_ok, int fat32_ok, FatType* out_fat_type)
+ {
+       FatSpecific*            fs_info = FAT_SPECIFIC (fs);
+       PedExceptionOption      status;
+-      char*                   fat16_msg;
+-      char*                   fat32_msg;
++      const char*             fat16_msg;
++      const char*             fat32_msg;
+       if (fs_info->fat_type == FAT_TYPE_FAT16)
+               fat16_msg = _("If you leave your file system as FAT16, "
+diff --git a/libparted/fs/fat/traverse.c b/libparted/fs/fat/traverse.c
+index 3d2e2b5..4ef2044 100644
+--- a/libparted/fs/fat/traverse.c
++++ b/libparted/fs/fat/traverse.c
+@@ -120,7 +120,7 @@ fat_traverse_mark_dirty (FatTraverseInfo* trav_info)
+ FatTraverseInfo*
+ fat_traverse_begin (PedFileSystem* fs, FatCluster start_cluster,
+-                  char* dir_name)
++                  const char* dir_name)
+ {
+       FatSpecific*            fs_info = FAT_SPECIFIC (fs);
+       FatTraverseInfo*        trav_info;
+diff --git a/libparted/fs/fat/traverse.h b/libparted/fs/fat/traverse.h
+index 21e4c27..afb24a5 100644
+--- a/libparted/fs/fat/traverse.h
++++ b/libparted/fs/fat/traverse.h
+@@ -42,7 +42,8 @@ extern int fat_traverse_entries_per_buffer (FatTraverseInfo* trav_info);
+ /* starts traversal at an arbitary cluster.  if start_cluster==0, then uses
+    root directory */
+ extern FatTraverseInfo* fat_traverse_begin (PedFileSystem* fs,
+-                                   FatCluster start_cluster, char* dir_name);
++                                          FatCluster start_cluster,
++                                          const char* dir_name);
+ extern int fat_traverse_complete (FatTraverseInfo* trav_info);
+diff --git a/libparted/labels/bsd.c b/libparted/labels/bsd.c
+index f25353b..ee9aba0 100644
+--- a/libparted/labels/bsd.c
++++ b/libparted/labels/bsd.c
+@@ -108,6 +108,9 @@ typedef struct {
+ typedef struct {
+       uint8_t         type;
++      int                     boot;
++      int                     raid;
++      int                     lvm;
+ } BSDPartitionData;
+ static PedDiskType bsd_disk_type;
+@@ -394,6 +397,9 @@ bsd_partition_new (const PedDisk* disk, PedPartitionType part_type,
+               if (!bsd_data)
+                       goto error_free_part;
+               bsd_data->type = 0;
++              bsd_data->boot = 0;
++              bsd_data->raid = 0;
++              bsd_data->lvm  = 0;
+       } else {
+               part->disk_specific = NULL;
+       }
+@@ -423,6 +429,9 @@ bsd_partition_duplicate (const PedPartition* part)
+       old_bsd_data = (BSDPartitionData*) part->disk_specific;
+       new_bsd_data = (BSDPartitionData*) new_part->disk_specific;
+       new_bsd_data->type = old_bsd_data->type;
++      new_bsd_data->boot = old_bsd_data->boot;
++      new_bsd_data->raid = old_bsd_data->raid;
++      new_bsd_data->lvm = old_bsd_data->lvm;
+       return new_part;
+ }
+@@ -456,14 +465,60 @@ bsd_partition_set_system (PedPartition* part, const PedFileSystemType* fs_type)
+ static int
+ bsd_partition_set_flag (PedPartition* part, PedPartitionFlag flag, int state)
+ {
+-      /* no flags for bsd */
++      PedDisk*                        disk;
++//    PedPartition*           walk; // since -Werror, this unused variable would break build
++      BSDPartitionData*       bsd_data;
++
++      PED_ASSERT (part != NULL, return 0);
++      PED_ASSERT (part->disk_specific != NULL, return 0);
++      PED_ASSERT (part->disk != NULL, return 0);
++
++      bsd_data = part->disk_specific;
++      disk = part->disk;
++
++      switch (flag) {
++              case PED_PARTITION_BOOT:
++                      bsd_data->boot = state;
++                      return 1;
++              case PED_PARTITION_RAID:
++                      if (state) {
++                              bsd_data->lvm = 0;
++                      }
++                      bsd_data->raid = state;
++                      return 1;
++              case PED_PARTITION_LVM:
++                      if (state) {
++                              bsd_data->raid = 0;
++                      }
++                      bsd_data->lvm = state;
++              default:
++                      ;
++      }
+       return 0;
+ }
+ static int
+ bsd_partition_get_flag (const PedPartition* part, PedPartitionFlag flag)
+ {
+-      /* no flags for bsd */
++      BSDPartitionData*               bsd_data;
++
++      PED_ASSERT (part != NULL, return 0);
++      PED_ASSERT (part->disk_specific != NULL, return 0);
++
++      bsd_data = part->disk_specific;
++      switch (flag) {
++              case PED_PARTITION_BOOT:
++                      return bsd_data->boot;
++
++              case PED_PARTITION_RAID:
++                      return bsd_data->raid;
++
++              case PED_PARTITION_LVM:
++                      return bsd_data->lvm;
++
++              default:
++                      ;
++      }
+       return 0;
+ }
+@@ -471,7 +526,14 @@ static int
+ bsd_partition_is_flag_available (const PedPartition* part,
+                                PedPartitionFlag flag)
+ {
+-      /* no flags for bsd */
++      switch (flag) {
++              case PED_PARTITION_BOOT:
++              case PED_PARTITION_RAID:
++              case PED_PARTITION_LVM:
++                      return 1;
++              default:
++                      ;
++      }
+       return 0;
+ }
+diff --git a/libparted/labels/dos.c b/libparted/labels/dos.c
+index c686658..641257c 100644
+--- a/libparted/labels/dos.c
++++ b/libparted/labels/dos.c
+@@ -190,14 +190,16 @@ msdos_probe (const PedDevice *dev)
+       if (PED_LE16_TO_CPU (part_table->magic) != MSDOS_MAGIC)
+               goto probe_fail;
+-      /* if this is a FAT fs, fail here.  Note that the Smart Boot Manager
+-       * Loader (SBML) signature indicates a partition table, not a file
+-       * system.
++      /* If this is a FAT fs, fail here.  Checking for the FAT signature
++       * has some false positives; instead, do what the Linux kernel does
++       * and ensure that each partition has a boot indicator that is
++       * either 0 or 0x80.
+        */
+-      if ((!strncmp (part_table->boot_code + 0x36, "FAT", 3)
+-          && strncmp (part_table->boot_code + 0x40, "SBML", 4) != 0)
+-          || !strncmp (part_table->boot_code + 0x52, "FAT", 3))
+-              goto probe_fail;
++      for (i = 0; i < 4; i++) {
++              if (part_table->partitions[i].boot_ind != 0
++                  && part_table->partitions[i].boot_ind != 0x80)
++                      goto probe_fail;
++      }
+       /* If this is a GPT disk, fail here */
+       for (i = 0; i < 4; i++) {
+diff --git a/libparted/labels/fdasd.c b/libparted/labels/fdasd.c
+index e4ecf52..7adf12f 100644
+--- a/libparted/labels/fdasd.c
++++ b/libparted/labels/fdasd.c
+@@ -149,7 +149,7 @@ fdasd_error (fdasd_anchor_t *anc, enum fdasd_failure why, char * str)
+               case device_verification_failed:
+                       sprintf(error, "fdasd: %s -- %s\n",
+                               _("Device verification failed"),
+-                              _("The specified device is not a valid DASD device"));,
++                              _("The specified device is not a valid DASD device"));
+                       break;
+               default: 
+                       sprintf(error, "fdasd: %s: %s\n", _("Fatal error"), str);
+diff --git a/libparted/labels/gpt.c b/libparted/labels/gpt.c
+index 4dc4f10..cb90d11 100644
+--- a/libparted/labels/gpt.c
++++ b/libparted/labels/gpt.c
+@@ -4,7 +4,7 @@
+     original version by Matt Domsch <Matt_Domsch@dell.com>
+     Disclaimed into the Public Domain
+-    Portions Copyright (C) 2001, 2002, 2003, 2005, 2006, 2007
++    Portions Copyright (C) 2001, 2002, 2003, 2005, 2006, 2007, 2008
+         Free Software Foundation, Inc.
+     EFI GUID Partition Table handling
+@@ -86,6 +86,10 @@ typedef struct {
+     ((efi_guid_t) { PED_CPU_TO_LE32 (0xC12A7328), PED_CPU_TO_LE16 (0xF81F), \
+                   PED_CPU_TO_LE16 (0x11d2), 0xBA, 0x4B, \
+                   { 0x00, 0xA0, 0xC9, 0x3E, 0xC9, 0x3B }})
++#define PARTITION_BIOS_GRUB_GUID \
++    ((efi_guid_t) { PED_CPU_TO_LE32 (0x21686148), PED_CPU_TO_LE16 (0x6449), \
++                  PED_CPU_TO_LE16 (0x6E6f), 0x74, 0x4E, \
++                  { 0x65, 0x65, 0x64, 0x45, 0x46, 0x49 }})
+ #define LEGACY_MBR_PARTITION_GUID \
+     ((efi_guid_t) { PED_CPU_TO_LE32 (0x024DEE41), PED_CPU_TO_LE16 (0x33E7), \
+                   PED_CPU_TO_LE16 (0x11d3, 0x9D, 0x69, \
+@@ -245,6 +249,7 @@ typedef struct _GPTPartitionData {
+       int             lvm;
+       int             raid;
+       int             boot;
++      int             bios_grub;
+       int             hp_service;
+         int             hidden;
+         int             msftres;
+@@ -753,13 +758,16 @@ _parse_part_entry (PedDisk* disk, GuidPartitionEntry_t* pte)
+         
+         gpt_part_data->lvm = gpt_part_data->raid 
+                 = gpt_part_data->boot = gpt_part_data->hp_service
+-                = gpt_part_data->hidden = gpt_part_data->msftres = 0;
++                = gpt_part_data->hidden = gpt_part_data->msftres
++                = gpt_part_data->bios_grub = 0;
+         if (pte->Attributes.RequiredToFunction & 0x1)
+                 gpt_part_data->hidden = 1;
+        
+       if (!guid_cmp (gpt_part_data->type, PARTITION_SYSTEM_GUID))
+               gpt_part_data->boot = 1;
++      else if (!guid_cmp (gpt_part_data->type, PARTITION_BIOS_GRUB_GUID))
++              gpt_part_data->bios_grub = 1;
+       else if (!guid_cmp (gpt_part_data->type, PARTITION_RAID_GUID))
+               gpt_part_data->raid = 1;
+       else if (!guid_cmp (gpt_part_data->type, PARTITION_LVM_GUID))
+@@ -1130,6 +1138,7 @@ gpt_partition_new (const PedDisk* disk,
+       gpt_part_data->lvm = 0;
+       gpt_part_data->raid = 0;
+       gpt_part_data->boot = 0;
++      gpt_part_data->bios_grub = 0;
+       gpt_part_data->hp_service = 0;
+         gpt_part_data->hidden = 0;
+         gpt_part_data->msftres = 0;
+@@ -1208,6 +1217,10 @@ gpt_partition_set_system (PedPartition* part, const PedFileSystemType* fs_type)
+               gpt_part_data->type = PARTITION_SYSTEM_GUID;
+               return 1;
+       }
++      if (gpt_part_data->bios_grub) {
++              gpt_part_data->type = PARTITION_BIOS_GRUB_GUID;
++              return 1;
++      }
+       if (gpt_part_data->hp_service) {
+               gpt_part_data->type = PARTITION_HPSERVICE_GUID;
+               return 1;
+@@ -1306,6 +1319,16 @@ gpt_partition_set_flag(PedPartition *part,
+               if (state)
+                         gpt_part_data->raid 
+                                 = gpt_part_data->lvm
++                                = gpt_part_data->bios_grub
++                                = gpt_part_data->hp_service
++                                = gpt_part_data->msftres = 0;
++              return gpt_partition_set_system (part, part->fs_type);
++      case PED_PARTITION_BIOS_GRUB:
++              gpt_part_data->bios_grub = state;
++              if (state)
++                        gpt_part_data->raid 
++                                = gpt_part_data->lvm
++                                = gpt_part_data->boot
+                                 = gpt_part_data->hp_service
+                                 = gpt_part_data->msftres = 0;
+               return gpt_partition_set_system (part, part->fs_type);
+@@ -1314,6 +1337,7 @@ gpt_partition_set_flag(PedPartition *part,
+               if (state)
+                         gpt_part_data->boot
+                                 = gpt_part_data->lvm
++                                = gpt_part_data->bios_grub
+                                 = gpt_part_data->hp_service
+                                 = gpt_part_data->msftres = 0;
+               return gpt_partition_set_system (part, part->fs_type);
+@@ -1322,6 +1346,7 @@ gpt_partition_set_flag(PedPartition *part,
+               if (state)
+                         gpt_part_data->boot
+                                 = gpt_part_data->raid
++                                = gpt_part_data->bios_grub
+                                 = gpt_part_data->hp_service
+                                 = gpt_part_data->msftres = 0;
+               return gpt_partition_set_system (part, part->fs_type);
+@@ -1331,6 +1356,7 @@ gpt_partition_set_flag(PedPartition *part,
+                         gpt_part_data->boot
+                                 = gpt_part_data->raid
+                                 = gpt_part_data->lvm
++                                = gpt_part_data->bios_grub
+                                 = gpt_part_data->msftres = 0;
+               return gpt_partition_set_system (part, part->fs_type);
+         case PED_PARTITION_MSFT_RESERVED:
+@@ -1339,6 +1365,7 @@ gpt_partition_set_flag(PedPartition *part,
+                         gpt_part_data->boot
+                                 = gpt_part_data->raid
+                                 = gpt_part_data->lvm
++                                = gpt_part_data->bios_grub
+                                 = gpt_part_data->hp_service = 0;
+                 return gpt_partition_set_system (part, part->fs_type);
+         case PED_PARTITION_HIDDEN:
+@@ -1367,6 +1394,8 @@ gpt_partition_get_flag(const PedPartition *part, PedPartitionFlag flag)
+               return gpt_part_data->lvm;
+       case PED_PARTITION_BOOT:
+               return gpt_part_data->boot;
++      case PED_PARTITION_BIOS_GRUB:
++              return gpt_part_data->bios_grub;
+       case PED_PARTITION_HPSERVICE:
+               return gpt_part_data->hp_service;
+         case PED_PARTITION_MSFT_RESERVED:
+@@ -1390,6 +1419,7 @@ gpt_partition_is_flag_available(const PedPartition * part,
+       case PED_PARTITION_RAID:
+       case PED_PARTITION_LVM:
+       case PED_PARTITION_BOOT:
++      case PED_PARTITION_BIOS_GRUB:
+       case PED_PARTITION_HPSERVICE:
+         case PED_PARTITION_MSFT_RESERVED:
+         case PED_PARTITION_HIDDEN:        
+diff --git a/libparted/labels/mac.c b/libparted/labels/mac.c
+index f014194..538e0c0 100644
+--- a/libparted/labels/mac.c
++++ b/libparted/labels/mac.c
+@@ -1,6 +1,6 @@
+ /*
+     libparted - a library for manipulating disk partitions
+-    Copyright (C) 2000, 2002, 2004, 2007 Free Software Foundation, Inc.
++    Copyright (C) 2000, 2002, 2004, 2007-2008 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
+@@ -376,19 +376,19 @@ mac_clobber (PedDevice* dev)
+ #endif /* !DISCOVER_ONLY */
+ static int
+-_rawpart_cmp_type (MacRawPartition* raw_part, char* type)
++_rawpart_cmp_type (const MacRawPartition* raw_part, const char* type)
+ {
+       return strncasecmp (raw_part->type, type, 32) == 0;
+ }
+ static int
+-_rawpart_cmp_name (MacRawPartition* raw_part, char* name)
++_rawpart_cmp_name (const MacRawPartition* raw_part, const char* name)
+ {
+       return strncasecmp (raw_part->name, name, 32) == 0;
+ }
+ static int
+-_rawpart_is_partition_map (MacRawPartition* raw_part)
++_rawpart_is_partition_map (const MacRawPartition* raw_part)
+ {
+       return _rawpart_cmp_type (raw_part, "Apple_partition_map");
+ }
+@@ -408,7 +408,7 @@ strncasestr (const char* haystack, const char* needle, int n)
+ }
+ static int
+-_rawpart_is_boot (MacRawPartition* raw_part)
++_rawpart_is_boot (const MacRawPartition* raw_part)
+ {
+       if (!strcasecmp(raw_part->type, "Apple_Bootstrap"))
+               return 1;
+@@ -420,7 +420,7 @@ _rawpart_is_boot (MacRawPartition* raw_part)
+ }
+ static int
+-_rawpart_is_driver (MacRawPartition* raw_part)
++_rawpart_is_driver (const MacRawPartition* raw_part)
+ {
+       if (strncmp (raw_part->type, "Apple_", 6) != 0)
+               return 0;
+@@ -430,7 +430,7 @@ _rawpart_is_driver (MacRawPartition* raw_part)
+ }
+ static int
+-_rawpart_has_driver (MacRawPartition* raw_part, MacDiskData* mac_disk_data)
++_rawpart_has_driver (const MacRawPartition* raw_part, MacDiskData* mac_disk_data)
+ {
+       MacDeviceDriver *driverlist;
+       uint16_t i, bsz;
+diff --git a/libparted/tests/Makefile.am b/libparted/tests/Makefile.am
+index 12ad29f..d526207 100644
+--- a/libparted/tests/Makefile.am
++++ b/libparted/tests/Makefile.am
+@@ -3,13 +3,17 @@
+ #
+ # This file may be modified and/or distributed without restriction.
+-TESTS = t1000-label.sh
++TESTS = t1000-label.sh t2000-disk.sh
+ EXTRA_DIST = $(TESTS)
+-bin_PROGRAMS     = label
++bin_PROGRAMS     = label disk
+ label_CFLAGS    = $(CHECK_CFLAGS) -I$(top_srcdir)/include
+ label_LDADD     = $(CHECK_LIBS) $(top_builddir)/libparted/libparted.la
+ label_SOURCES   = common.h common.c label.c
++disk_CFLAGS    = $(CHECK_CFLAGS) -I$(top_srcdir)/include
++disk_LDADD     = $(CHECK_LIBS) $(top_builddir)/libparted/libparted.la
++disk_SOURCES   = common.h common.c disk.c
++
+ MAINTAINERCLEANFILES = Makefile.in
+ CLEANFILES = init.sh
+diff --git a/libparted/tests/disk.c b/libparted/tests/disk.c
+new file mode 100644
+index 0000000..295ec05
+--- /dev/null
++++ b/libparted/tests/disk.c
+@@ -0,0 +1,111 @@
++#include <config.h>
++#include <unistd.h>
++
++#include <check.h>
++
++#include <parted/parted.h>
++
++#include "common.h"
++
++static char* temporary_disk;
++
++static void
++create_disk (void)
++{
++        temporary_disk = _create_disk (20);
++        fail_if (temporary_disk == NULL, "Failed to create temporary disk");
++}
++
++static void
++destroy_disk (void)
++{
++        unlink (temporary_disk);
++        free (temporary_disk);
++}
++
++/* TEST: Create a disklabel on a simple disk image */
++START_TEST (test_duplicate)
++{
++        PedDevice* dev = ped_device_get (temporary_disk);
++        if (dev == NULL)
++                return;
++
++        PedDiskType* type;
++        PedDisk* disk;
++        PedDisk* disk_dup;
++        PedPartition *part;
++        PedPartition *part_dup;
++        PedConstraint *constraint;
++
++        int part_num[] = {1, 5, 6, 0};
++
++        disk = _create_disk_label (dev, ped_disk_type_get ("msdos"));
++
++        constraint = ped_constraint_any (dev);
++
++        /* Primary partition from 16,4kB to 15MB */
++        part = ped_partition_new (disk, PED_PARTITION_EXTENDED,
++                                  NULL,
++                                  32, 29311);
++        ped_disk_add_partition (disk, part, constraint);
++
++        /* Logical partition from 10MB to 15MB */
++        part = ped_partition_new (disk, PED_PARTITION_LOGICAL,
++                                  ped_file_system_type_get ("ext2"),
++                                  19584, 29311);
++        ped_disk_add_partition (disk, part, constraint);
++
++        /* Logical partition from 16,4kB to 4981kB */
++        part = ped_partition_new (disk, PED_PARTITION_LOGICAL,
++                                  ped_file_system_type_get ("ext2"),
++                                  32, 9727);
++        ped_disk_add_partition (disk, part, constraint);
++
++        ped_disk_commit (disk);
++
++        ped_constraint_destroy (constraint);
++
++        disk_dup = ped_disk_duplicate (disk);
++
++        /* Checks if both partitions match */
++        for (int *i = part_num; *i != 0; i++) {
++                part = ped_disk_get_partition (disk, *i);
++                part_dup = ped_disk_get_partition (disk_dup, *i);
++
++                fail_if (part->geom.start != part_dup->geom.start ||
++                         part->geom.end != part_dup->geom.end,
++                         "Duplicated partition %d doesn't match. "
++                         "Details are start: %d/%d end: %d/%d\n",
++                         *i, part->geom.start, part_dup->geom.start,
++                         part->geom.end, part_dup->geom.end);
++        }
++
++        ped_disk_destroy (disk);
++        ped_device_destroy (dev);
++}
++END_TEST
++
++int
++main (void)
++{
++        int number_failed;
++        Suite* suite = suite_create ("Disk");
++        TCase* tcase_duplicate = tcase_create ("Duplicate");
++
++        /* Fail when an exception is raised */
++        ped_exception_set_handler (_test_exception_handler);
++
++        tcase_add_checked_fixture (tcase_duplicate, create_disk, destroy_disk);
++        tcase_add_test (tcase_duplicate, test_duplicate);
++        /* Disable timeout for this test */
++        tcase_set_timeout (tcase_duplicate, 0);
++        suite_add_tcase (suite, tcase_duplicate);
++
++        SRunner* srunner = srunner_create (suite);
++        srunner_run_all (srunner, CK_VERBOSE);
++
++        number_failed = srunner_ntests_failed (srunner);
++        srunner_free (srunner);
++
++        return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
++}
+diff --git a/libparted/tests/t2000-disk.sh b/libparted/tests/t2000-disk.sh
+new file mode 100755
+index 0000000..7a85b98
+--- /dev/null
++++ b/libparted/tests/t2000-disk.sh
+@@ -0,0 +1,27 @@
++#!/bin/sh
++
++# Copyright (C) 2007 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 3 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, see <http://www.gnu.org/licenses/>.
++
++test_description='run the disk unit tests in a directory supporting O_DIRECT'
++# This wrapper around the ./label binary is used to find a directory
++# in which one can open a file with the O_DIRECT flag.
++
++. ./init.sh
++
++test_expect_success \
++    'run the actual tests' 'disk'
++
++test_done
+diff --git a/parted/parted.c b/parted/parted.c
+index 6a606ae..2afc2c1 100644
+--- a/parted/parted.c
++++ b/parted/parted.c
+@@ -79,7 +79,7 @@ typedef struct {
+         time_t  predicted_time_left;
+ } TimerContext;
+-static struct option    options[] = {
++static const struct option const options[] = {
+         /* name, has-arg, string-return-val, char-return-val */
+         {"help",        0, NULL, 'h'},
+         {"list",        0, NULL, 'l'},
+@@ -90,7 +90,7 @@ static struct option    options[] = {
+         {NULL,          0, NULL, 0}
+ };
+-static char*    options_help [][2] = {
++static const char *const options_help [][2] = {
+         {"help",        N_("displays this help message")},
+         {"list",        N_("lists partition layout on all block devices")},
+         {"machine",     N_("displays machine parseable output")},
+@@ -107,26 +107,26 @@ int     opt_machine_mode = 0;
+ int     disk_is_modified = 0;
+ int     is_toggle_mode = 0;
+-static char* number_msg = N_(
++static const char* number_msg = N_(
+ "NUMBER is the partition number used by Linux.  On MS-DOS disk labels, the "
+ "primary partitions number from 1 to 4, logical partitions from 5 onwards.\n");
+-static char* label_type_msg_start = N_("LABEL-TYPE is one of: ");
+-static char* flag_msg_start =   N_("FLAG is one of: ");
+-static char* unit_msg_start =   N_("UNIT is one of: ");
+-static char* part_type_msg =    N_("PART-TYPE is one of: primary, logical, "
++static const char* label_type_msg_start = N_("LABEL-TYPE is one of: ");
++static const char* flag_msg_start =   N_("FLAG is one of: ");
++static const char* unit_msg_start =   N_("UNIT is one of: ");
++static const char* part_type_msg =    N_("PART-TYPE is one of: primary, logical, "
+                                    "extended\n");
+-static char* fs_type_msg_start = N_("FS-TYPE is one of: ");
+-static char* start_end_msg =    N_("START and END are disk locations, such as "
++static const char* fs_type_msg_start = N_("FS-TYPE is one of: ");
++static const char* start_end_msg =    N_("START and END are disk locations, such as "
+                 "4GB or 10%.  Negative values count from the end of the disk.  "
+                 "For example, -1s specifies exactly the last sector.\n");
+-static char* state_msg =        N_("STATE is one of: on, off\n");
+-static char* device_msg =       N_("DEVICE is usually /dev/hda or /dev/sda\n");
+-static char* name_msg =         N_("NAME is any word you want\n");
+-static char* resize_msg_start = N_("The partition must have one of the "
++static const char* state_msg =        N_("STATE is one of: on, off\n");
++static const char* device_msg =       N_("DEVICE is usually /dev/hda or /dev/sda\n");
++static const char* name_msg =         N_("NAME is any word you want\n");
++static const char* resize_msg_start = N_("The partition must have one of the "
+                                    "following FS-TYPEs: ");
+-static char* copyright_msg = N_(
++static const char* copyright_msg = N_(
+ "Copyright (C) 1998 - 2006 Free Software Foundation, Inc.\n"
+ "This program is free software, covered by the GNU General Public License.\n"
+ "\n"
+@@ -1226,7 +1226,7 @@ partition_print (PedPartition* part)
+         putchar ('\n');
+         flags = partition_print_flags (part);
+-     
++
+         printf (_("Minor: %d\n"), part->num);
+         printf (_("Flags: %s\n"), flags);
+         printf (_("File System: %s\n"), fs->type->name);
+@@ -1264,15 +1264,17 @@ do_print (PedDevice** dev)
+         int             has_free_arg = 0;
+         int             has_list_arg = 0;
+         int             has_num_arg = 0;
+-        char*           transport[13] = {"unknown", "scsi", "ide", "dac960",
+-                                         "cpqarray", "file", "ataraid", "i2o",
+-                                         "ubd", "dasd", "viodasd", "sx8", "dm"};
++        const char *const transport[14] = {"unknown", "scsi", "ide", "dac960",
++                                         "cpqarray", "file", "ataraid", "i2o",
++                                         "ubd", "dasd", "viodasd", "sx8", "dm",
++                                         "xvd"};
+         char*           peek_word;
+         char*           start;
+         char*           end;
+         char*           size;
+         const char*     name;
+         char*           tmp;
++        char*           flags;
+         wchar_t*        table_rendered;
+         disk = ped_disk_new (*dev);
+@@ -1472,7 +1474,9 @@ do_print (PedDevice** dev)
+                                     str_list_append (row, name);
+                             }
+-                            str_list_append (row, partition_print_flags (part));
++                            flags = partition_print_flags (part);
++                            str_list_append (row, flags);
++                            ped_free (flags);
+                     } else {
+                             if (has_extended)
+                                     str_list_append (row, "");
+@@ -1485,6 +1489,10 @@ do_print (PedDevice** dev)
+                     //PED_ASSERT (row.cols == caption.cols)
+                     table_add_row_from_strlist (table, row);
+                     str_list_destroy (row);
++                    ped_free (tmp);
++                    ped_free (start);
++                    ped_free (end);
++                    ped_free (size);
+             }
+             table_rendered = table_render (table); 
+diff --git a/parted/ui.c b/parted/ui.c
+index a53643f..f854a54 100644
+--- a/parted/ui.c
++++ b/parted/ui.c
+@@ -154,17 +154,17 @@ struct siginfo_t {
+ #  define ILL_BADSTK (INTMAX - 8)
+ #endif
+-char* prog_name = "GNU Parted " VERSION "\n";
++const char* prog_name = "GNU Parted " VERSION "\n";
+-static char* banner_msg = N_(
++static const char* banner_msg = N_(
+ "Welcome to GNU Parted! Type 'help' to view a list of commands.\n");
+-static char* usage_msg = N_(
++static const char* usage_msg = N_(
+ "Usage: parted [OPTION]... [DEVICE [COMMAND [PARAMETERS]...]...]\n"
+ "Apply COMMANDs with PARAMETERS to DEVICE.  If no COMMAND(s) are given, "
+ "run in\ninteractive mode.\n");
+-static char* bug_msg = N_(
++static const char* bug_msg = N_(
+ "\n\nYou found a bug in GNU Parted! Here's what you have to do:\n\n"
+ "Don't panic! The bug has most likely not affected any of your data.\n"
+ "Help us to fix this bug by doing the following:\n\n"
+@@ -218,7 +218,7 @@ screen_width ()
+ /* HACK: don't specify termcap separately - it'll annoy the users. */
+ #ifdef HAVE_LIBREADLINE
+-        width = tgetnum ("co");
++        width = tgetnum ((char *) "co");
+ #endif
+         if (width <= 0)
+@@ -569,7 +569,9 @@ _readline (const char* prompt, const StrList* possibilities)
+                         fputs (line, stdout);
+                         fflush (stdout);
+ #endif
+-                        line [strlen (line) - 1] = 0;    /* kill trailing CR */
++                        /* kill trailing NL */
++                        if (strlen (line))
++                                line [strlen (line) - 1] = 0;
+                 } else {
+                         free (line);
+                         line = NULL;
+diff --git a/parted/ui.h b/parted/ui.h
+index f5cf760..77bb194 100644
+--- a/parted/ui.h
++++ b/parted/ui.h
+@@ -1,6 +1,6 @@
+ /*
+     parted - a frontend to libparted
+-    Copyright (C) 1999, 2000, 2001, 2007 Free Software Foundation, Inc.
++    Copyright (C) 1999, 2000, 2001, 2007-2008 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
+@@ -21,7 +21,7 @@
+ #include "strlist.h"
+-extern char*  prog_name;
++extern const char *prog_name;
+ extern int init_ui ();
+ extern int non_interactive_mode (PedDevice** dev, Command* cmd_list[],
+diff --git a/tests/Makefile.am b/tests/Makefile.am
+index 0a42a8d..3a694fe 100644
+--- a/tests/Makefile.am
++++ b/tests/Makefile.am
+@@ -5,8 +5,10 @@ TESTS = \
+   t1100-busy-label.sh \
+   t1500-small-ext2.sh \
+   t2000-mkfs.sh \
++  t2200-dos-label-recog.sh \
+   t3000-constraints.sh \
+-  t3100-resize-ext2-partion.sh
++  t3100-resize-ext2-partion.sh \
++  t5000-tags.sh
+ EXTRA_DIST = \
+   $(TESTS) test-lib.sh mkdtemp
+diff --git a/tests/t2200-dos-label-recog.sh b/tests/t2200-dos-label-recog.sh
+new file mode 100755
+index 0000000..d5d2670
+--- /dev/null
++++ b/tests/t2200-dos-label-recog.sh
+@@ -0,0 +1,61 @@
++#!/bin/sh
++
++# Copyright (C) 2008 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 3 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, see <http://www.gnu.org/licenses/>.
++
++test_description='improved MSDOS partition-table recognition'
++
++. ./init.sh
++
++######################################################################
++# With vestiges of a preceding FAT file system boot sector in the MBR,
++# parted 1.8.8.1.29 and earlier would fail to recognize a DOS
++# partition table.
++######################################################################
++N=100k
++dev=loop-file
++test_expect_success \
++    'create a file to simulate the underlying device' \
++    'dd if=/dev/null of=$dev bs=1 seek=$N 2> /dev/null'
++
++test_expect_success \
++    'label the test disk' \
++    'parted -s $dev mklabel msdos > out 2>&1'
++test_expect_success 'expect no output' '$compare out /dev/null'
++
++test_expect_success \
++    'create two partition' \
++    '
++    parted -s $dev mkpart primary  1s 40s > out 2>&1 &&
++    parted -s $dev mkpart primary 41s 80s > out 2>&1
++
++    '
++test_expect_success 'expect no output' '$compare out /dev/null'
++
++test_expect_success \
++    'write "FAT" where it would cause trouble' \
++    'printf FAT|dd bs=1c seek=82 count=3 of=$dev conv=notrunc'
++
++test_expect_success \
++    'print the partition table' \
++    '
++    parted -m -s $dev unit s p > out &&
++    tail -2 out > k && mv k out &&
++    printf "1:1s:40s:40s:::;\n2:41s:80s:40s:::;\n" > exp
++
++    '
++test_expect_success 'expect two partitions' '$compare out exp'
++
++test_done
+diff --git a/tests/t5000-tags.sh b/tests/t5000-tags.sh
+new file mode 100755
+index 0000000..dab48ae
+--- /dev/null
++++ b/tests/t5000-tags.sh
+@@ -0,0 +1,81 @@
++#!/bin/sh
++
++# Copyright (C) 2007,2008 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 3 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, see <http://www.gnu.org/licenses/>.
++
++test_description="test bios_grub flag in gpt labels"
++
++. ./init.sh
++
++dev=loop-file
++
++test_expect_success \
++    "setup: create zeroed device" \
++    '{ dd if=/dev/zero bs=1024 count=64; } > $dev'
++
++test_expect_success \
++    'create gpt label' \
++    'parted -s $dev mklabel gpt >out 2>&1'
++
++test_expect_success \
++    'add a partition' \
++    'parted -s $dev mkpart primary 0 1 >>out 2>&1'
++
++test_expect_success \
++    'print the table (before manual modification)' \
++    'parted -s $dev print >>out 2>&1'
++
++# Using bios_boot_magic='\x48\x61' looks nicer, but isn't portable.
++# dash's builtin printf doesn't recognize such \xHH hexadecimal escapes.
++bios_boot_magic='\110\141\150\41\111\144\157\156\164\116\145\145\144\105\106\111'
++
++printf "$bios_boot_magic" | dd of=$dev bs=1024 seek=1 conv=notrunc
++
++test_expect_success \
++    'print the table (after manual modification)' \
++    'parted -s $dev print >>out 2>&1'
++
++pwd=`pwd`
++
++fail=0
++{
++  cat <<EOF
++Model:  (file)
++Disk .../$dev: 65.5kB
++Sector size (logical/physical): 512B/512B
++Partition Table: gpt
++
++Number  Start   End     Size    File system  Name     Flags
++ 1      17.4kB  48.6kB  31.2kB               primary       
++
++Model:  (file)
++Disk .../$dev: 65.5kB
++Sector size (logical/physical): 512B/512B
++Partition Table: gpt
++
++Number  Start   End     Size    File system  Name     Flags    
++ 1      17.4kB  48.6kB  31.2kB               primary  bios_grub
++
++EOF
++} > exp || fail=1
++
++test_expect_success \
++    'prepare actual and expected output' \
++    'test $fail = 0 &&
++     mv out o2 && sed "s,^Disk .*/$dev:,Disk .../$dev:," o2 > out'
++
++test_expect_success 'check for expected output' '$compare out exp'
++
++test_done
diff --git a/packages/parted/files/syscalls.h b/packages/parted/files/syscalls.h
deleted file mode 100644 (file)
index 9278704..0000000
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- *  linux/include/asm-arm/unistd.h
- *
- *  Copyright (C) 2001-2005 Russell King
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Please forward _all_ changes to this file to rmk@arm.linux.org.uk,
- * no matter what the change is.  Thanks!
- */
-#ifndef __ASM_ARM_UNISTD_H2
-#define __ASM_ARM_UNISTD_H2
-
-
-#define __sys2(x) #x
-#define __sys1(x) __sys2(x)
-
-#ifndef __syscall
-#if defined(__thumb__) || defined(__ARM_EABI__)
-#define __SYS_REG(name) register long __sysreg __asm__("r7") = __NR_##name;
-#define __SYS_REG_LIST(regs...) "r" (__sysreg) , ##regs
-#define __syscall(name) "swi\t0"
-#else
-#define __SYS_REG(name)
-#define __SYS_REG_LIST(regs...) regs
-#define __syscall(name) "swi\t" __sys1(__NR_##name) ""
-#endif
-#endif
-
-#define __syscall_return(type, res)                                    \
-do {                                                                   \
-       if ((unsigned long)(res) >= (unsigned long)(-129)) {            \
-               errno = -(res);                                         \
-               res = -1;                                               \
-       }                                                               \
-       return (type) (res);                                            \
-} while (0)
-
-#define _syscall0(type,name)                                           \
-type name(void) {                                                      \
-  __SYS_REG(name)                                                      \
-  register long __res_r0 __asm__("r0");                                        \
-  long __res;                                                          \
-  __asm__ __volatile__ (                                               \
-  __syscall(name)                                                      \
-       : "=r" (__res_r0)                                               \
-       : __SYS_REG_LIST() );                                           \
-  __res = __res_r0;                                                    \
-  __syscall_return(type,__res);                                                \
-}
-
-#define _syscall1(type,name,type1,arg1)                                \
-type name(type1 arg1) {                                                \
-  __SYS_REG(name)                                                      \
-  register long __r0 __asm__("r0") = (long)arg1;                       \
-  register long __res_r0 __asm__("r0");                                        \
-  long __res;                                                          \
-  __asm__ __volatile__ (                                               \
-  __syscall(name)                                                      \
-       : "=r" (__res_r0)                                               \
-       : __SYS_REG_LIST( "0" (__r0) ) );                               \
-  __res = __res_r0;                                                    \
-  __syscall_return(type,__res);                                                \
-}
-
-#define _syscall2(type,name,type1,arg1,type2,arg2)                     \
-type name(type1 arg1,type2 arg2) {                                     \
-  __SYS_REG(name)                                                      \
-  register long __r0 __asm__("r0") = (long)arg1;                       \
-  register long __r1 __asm__("r1") = (long)arg2;                       \
-  register long __res_r0 __asm__("r0");                                        \
-  long __res;                                                          \
-  __asm__ __volatile__ (                                               \
-  __syscall(name)                                                      \
-       : "=r" (__res_r0)                                               \
-       : __SYS_REG_LIST( "0" (__r0), "r" (__r1) ) );                   \
-  __res = __res_r0;                                                    \
-  __syscall_return(type,__res);                                                \
-}
-
-
-#define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3)          \
-type name(type1 arg1,type2 arg2,type3 arg3) {                          \
-  __SYS_REG(name)                                                      \
-  register long __r0 __asm__("r0") = (long)arg1;                       \
-  register long __r1 __asm__("r1") = (long)arg2;                       \
-  register long __r2 __asm__("r2") = (long)arg3;                       \
-  register long __res_r0 __asm__("r0");                                        \
-  long __res;                                                          \
-  __asm__ __volatile__ (                                               \
-  __syscall(name)                                                      \
-       : "=r" (__res_r0)                                               \
-       : __SYS_REG_LIST( "0" (__r0), "r" (__r1), "r" (__r2) ) );       \
-  __res = __res_r0;                                                    \
-  __syscall_return(type,__res);                                                \
-}
-
-
-#define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4)\
-type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4) {            \
-  __SYS_REG(name)                                                      \
-  register long __r0 __asm__("r0") = (long)arg1;                       \
-  register long __r1 __asm__("r1") = (long)arg2;                       \
-  register long __r2 __asm__("r2") = (long)arg3;                       \
-  register long __r3 __asm__("r3") = (long)arg4;                       \
-  register long __res_r0 __asm__("r0");                                        \
-  long __res;                                                          \
-  __asm__ __volatile__ (                                               \
-  __syscall(name)                                                      \
-       : "=r" (__res_r0)                                               \
-       : __SYS_REG_LIST( "0" (__r0), "r" (__r1), "r" (__r2), "r" (__r3) ) ); \
-  __res = __res_r0;                                                    \
-  __syscall_return(type,__res);                                                \
-}
-  
-
-#define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,type5,arg5)    \
-type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5) {        \
-  __SYS_REG(name)                                                      \
-  register long __r0 __asm__("r0") = (long)arg1;                       \
-  register long __r1 __asm__("r1") = (long)arg2;                       \
-  register long __r2 __asm__("r2") = (long)arg3;                       \
-  register long __r3 __asm__("r3") = (long)arg4;                       \
-  register long __r4 __asm__("r4") = (long)arg5;                       \
-  register long __res_r0 __asm__("r0");                                        \
-  long __res;                                                          \
-  __asm__ __volatile__ (                                               \
-  __syscall(name)                                                      \
-       : "=r" (__res_r0)                                               \
-       : __SYS_REG_LIST( "0" (__r0), "r" (__r1), "r" (__r2),           \
-                         "r" (__r3), "r" (__r4) ) );                   \
-  __res = __res_r0;                                                    \
-  __syscall_return(type,__res);                                                \
-}
-
-#define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,type5,arg5,type6,arg6) \
-type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5, type6 arg6) {    \
-  __SYS_REG(name)                                                      \
-  register long __r0 __asm__("r0") = (long)arg1;                       \
-  register long __r1 __asm__("r1") = (long)arg2;                       \
-  register long __r2 __asm__("r2") = (long)arg3;                       \
-  register long __r3 __asm__("r3") = (long)arg4;                       \
-  register long __r4 __asm__("r4") = (long)arg5;                       \
-  register long __r5 __asm__("r5") = (long)arg6;                       \
-  register long __res_r0 __asm__("r0");                                        \
-  long __res;                                                          \
-  __asm__ __volatile__ (                                               \
-  __syscall(name)                                                      \
-       : "=r" (__res_r0)                                               \
-       : __SYS_REG_LIST( "0" (__r0), "r" (__r1), "r" (__r2),           \
-                         "r" (__r3), "r" (__r4), "r" (__r5) ) );       \
-  __res = __res_r0;                                                    \
-  __syscall_return(type,__res);                                                \
-}
-
-/*
- * "Conditional" syscalls
- *
- * What we want is __attribute__((weak,alias("sys_ni_syscall"))),
- * but it doesn't work on all toolchains, so we just do it by hand
- */
-#define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall")
-
-#endif /* __ASM_ARM_UNISTD_H2 */
diff --git a/packages/parted/files/syscalls.patch b/packages/parted/files/syscalls.patch
deleted file mode 100644 (file)
index be9b91c..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
---- parted-1.8.7/libparted/arch/linux.c.org    2007-05-09 23:40:13.000000000 +0300
-+++ parted-1.8.7/libparted/arch/linux.c        2007-07-10 18:20:27.000000000 +0300
-@@ -32,6 +32,7 @@
- #include <stdio.h>
- #include <syscall.h>
- #include <unistd.h>
-+#include "syscalls.h"
- #include <dirent.h>
- #include <sys/ioctl.h>
- #include <sys/stat.h>
diff --git a/packages/parted/files/use_llseek_syscall.patch b/packages/parted/files/use_llseek_syscall.patch
new file mode 100644 (file)
index 0000000..ce30563
--- /dev/null
@@ -0,0 +1,28 @@
+--- a/libparted/arch/linux.c~  2009-02-06 17:22:22.000000000 -0200
++++ a/libparted/arch/linux.c   2009-02-06 17:39:28.000000000 -0200
+@@ -53,6 +53,11 @@
+ #define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))
++#ifndef HAVE_LLSEEK
++#define _llseek(fd, offset_high, offset_low, result, origin) \
++        syscall(SYS__llseek, fd, offset_high, offset_low, result, origin)
++#endif
++
+ #ifndef __NR__llseek
+ #define __NR__llseek 140
+ #endif
+@@ -1362,13 +1367,6 @@
+ #if SIZEOF_OFF_T < 8
+-static _syscall5(int,_llseek,
+-                 unsigned int, fd,
+-                 unsigned long, offset_high,
+-                 unsigned long, offset_low,
+-                 loff_t*, result,
+-                 unsigned int, origin)
+-
+ loff_t
+ llseek (unsigned int fd, loff_t offset, unsigned int whence)
+ {
index d1b5cbe..4eb8aa5 100644 (file)
@@ -4,11 +4,13 @@ LICENSE = "GPLv3"
 SECTION = "console/tools"
 DEPENDS = "readline e2fsprogs-libs"
 
-PR = "r1"
+PR = "r2"
 
 SRC_URI = "${GNU_MIRROR}/parted/parted-${PV}.tar.gz \
            file://syscalls.h \
            file://syscalls.patch;patch=1 \
+          file://use_llseek_syscall.patch;patch=1 \
+          file://parted-1.8.x.patch;patch=1 \
 "
            
 EXTRA_OECONF = "--disable-Werror ac_cv_func_calloc_0_nonnull=yes"