Greetings,

  this mail concerns Parted Edge.

  Vanni Brutto has drafted a patch that adds undo/redo functionality
to libparted; note the "drafted" -- its current state is that of a
proof-of-concept. He states that he will rewrite it in a clean manner
when the approach is agreed upon.

  Find it attached for peer review. Be sure to give it a look.

    Leslie

-- 
gpg --keyserver pgp.mit.edu --recv-keys DD4EBF83
http://nic-nac-project.de/~skypher/
diff -u --recursive --new-file parted-1.7.1/include/parted/device.h 
parted-1.7.1-my/include/parted/device.h
--- parted-1.7.1/include/parted/device.h        2006-05-25 19:28:43.000000000 
+0200
+++ parted-1.7.1-my/include/parted/device.h     2006-10-17 21:27:10.000000000 
+0200
@@ -77,6 +77,8 @@
         int             open_count; /**< the number of times this device has
                                          been opened with ped_device_open(). */
         int             read_only;
+        int             test_mode; //zanac
+        void*           operation; //zanac
         int             external_mode;
         int             dirty;
         int             boot_dirty;
@@ -119,6 +121,7 @@
 extern int ped_device_open (PedDevice* dev);
 extern int ped_device_close (PedDevice* dev);
 extern void ped_device_destroy (PedDevice* dev);
+extern int ped_device_test_mode (PedDevice* dev, int test_mode); //zanac
 
 extern int ped_device_begin_external_access (PedDevice* dev);
 extern int ped_device_end_external_access (PedDevice* dev);
diff -u --recursive --new-file parted-1.7.1/include/parted/disk.h 
parted-1.7.1-my/include/parted/disk.h
--- parted-1.7.1/include/parted/disk.h  2006-05-25 19:28:43.000000000 +0200
+++ parted-1.7.1-my/include/parted/disk.h       2006-10-17 21:18:13.000000000 
+0200
@@ -37,6 +37,7 @@
 #include <parted/filesys.h>
 #include <parted/natmath.h>
 #include <parted/geom.h>
+#include <parted/operation.h>
 
 /**
  * Partition types
@@ -138,6 +139,8 @@
 struct _PedDisk {
         PedDevice*          dev;         /**< the device where the
                                               partition table lies */
+        PedDisk*            disk;        /**< "parent" disk used for
+                                              apply/undo. */ //zanac
         const PedDiskType*  type;        /**< type of disk label */
         const int*          block_sizes; /**< block sizes supported
                                               by this label */
@@ -234,6 +237,8 @@
 extern int ped_disk_commit (PedDisk* disk);
 extern int ped_disk_commit_to_dev (PedDisk* disk);
 extern int ped_disk_commit_to_os (PedDisk* disk);
+extern PedDisk *ped_disk_commit_test_disk (PedDisk **disk); //zanac
+
 extern int ped_disk_check (PedDisk* disk);
 extern void ped_disk_print (PedDisk* disk);
 
diff -u --recursive --new-file parted-1.7.1/include/parted/Makefile.am 
parted-1.7.1-my/include/parted/Makefile.am
--- parted-1.7.1/include/parted/Makefile.am     2006-05-25 19:28:43.000000000 
+0200
+++ parted-1.7.1-my/include/parted/Makefile.am  2006-10-17 19:03:20.000000000 
+0200
@@ -5,6 +5,7 @@
                        debug.h         \
                        device.h        \
                        disk.h          \
+                       operation.h \
                        exception.h     \
                        filesys.h       \
                        geom.h          \
diff -u --recursive --new-file parted-1.7.1/include/parted/Makefile.in 
parted-1.7.1-my/include/parted/Makefile.in
--- parted-1.7.1/include/parted/Makefile.in     2006-05-27 11:50:03.000000000 
+0200
+++ parted-1.7.1-my/include/parted/Makefile.in  2006-10-17 19:03:36.000000000 
+0200
@@ -192,6 +192,7 @@
                        debug.h         \
                        device.h        \
                        disk.h          \
+                       operation.h \
                        exception.h     \
                        filesys.h       \
                        geom.h          \
diff -u --recursive --new-file parted-1.7.1/include/parted/operation.h 
parted-1.7.1-my/include/parted/operation.h
--- parted-1.7.1/include/parted/operation.h     1970-01-01 01:00:00.000000000 
+0100
+++ parted-1.7.1-my/include/parted/operation.h  2006-10-28 12:42:13.000000000 
+0200
@@ -0,0 +1,81 @@
+/*
+    libparted - a library for manipulating disk partitions
+    Copyright (C) 1999, 2000, 2001, 2002 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
+*/
+
+/**
+ * \addtogroup PedOperation
+ * @{
+ */
+
+/** \file operation.h */
+#include <parted/disk.h>
+
+#ifndef PED_OPERATION_H_INCLUDED
+#define PED_OPERATION_H_INCLUDED
+
+
+
+typedef struct _PedOperation            PedOperation;
+typedef struct _PedOperationRM          PedOperationRM;
+typedef struct _PedOperationMKPART      PedOperationMKPART;
+
+/**
+ * Operation types
+ */
+typedef enum {
+        PED_OPERATION_MKPART            = 1,
+        PED_OPERATION_RM                = 2 
+} PedOperationType;
+
+
+/**
+ * PedOperation structure represents an operation to by committed
+ */
+struct _PedOperation {
+        PedOperation*           prev;
+        PedOperation*           next;
+        PedOperationType        type;
+        void*                    operation;
+};
+
+struct _PedOperationRM {
+        int                     num;   /**< the partition number:  In Linux, 
this is the 
+                                               same as the minor number. No 
assumption 
+                                               should be made about "num" and 
"type" 
+                                               - different disk labels have 
different rules. */
+};
+
+struct _PedOperationMKPART {
+        PedOperationType           oper_type;
+       int                        part_type;
+        const PedFileSystemType*   fs_type;
+        PedSector                  start;
+        PedSector                  end;    
+        PedGeometry*               range_start;
+        PedGeometry*               range_end;
+        char*                      part_name;
+};
+
+
+/** @} */
+
+
+#endif /* PED_OPERATION_H_INCLUDED */
+
+/** @} */
+
diff -u --recursive --new-file parted-1.7.1/libparted/device.c 
parted-1.7.1-my/libparted/device.c
--- parted-1.7.1/libparted/device.c     2006-05-25 19:29:06.000000000 +0200
+++ parted-1.7.1-my/libparted/device.c  2006-10-28 13:12:47.000000000 +0200
@@ -195,6 +195,9 @@
        if (!walk)
                return NULL;
        _device_register (walk);
+
+       walk->test_mode = 0;
+
        return walk;
 }
 
@@ -271,6 +274,20 @@
                return ped_architecture->dev_ops->close (dev);
 }
 
+//zanac
+int
+ped_device_test_mode (PedDevice* dev, int test_mode)
+{
+       PED_ASSERT (dev != NULL, return 0);
+       PED_ASSERT ((test_mode == 0) || (test_mode == 1), return 0);
+
+       dev->test_mode = test_mode;
+
+        return 1;
+}
+
+
+
 /**
  * Begins external access mode.  External access mode allows you to
  * safely do IO on the device.  If a PedDevice is open, then you should
diff -u --recursive --new-file parted-1.7.1/libparted/disk.c 
parted-1.7.1-my/libparted/disk.c
--- parted-1.7.1/libparted/disk.c       2006-05-25 19:29:06.000000000 +0200
+++ parted-1.7.1-my/libparted/disk.c    2006-10-17 21:25:06.000000000 +0200
@@ -190,6 +190,22 @@
        if (!type->ops->read (disk))
                goto error_destroy_disk;
        disk->needs_clobber = 0;
+    disk->disk = NULL; //zanac
+
+    if (dev->test_mode) { //zanac
+        PedDisk *clone_disk;
+
+        clone_disk = ped_disk_duplicate (disk);
+        if (!clone_disk)
+            goto error_destroy_disk;
+        
+        clone_disk->disk = disk;
+
+        ped_device_close(dev);
+
+        return clone_disk;
+    }
+
        ped_device_close (dev);
        return disk;
 
@@ -433,6 +449,27 @@
        return 0;
 }
 
+//zanac
+PedDisk *
+ped_disk_commit_test_disk (PedDisk **disk)
+{
+    PedDisk *clone_disk;
+    clone_disk = ped_disk_duplicate(*disk);
+
+    if (!clone_disk)
+        goto error;
+
+    clone_disk->disk = *disk;
+    *disk = clone_disk;
+
+    return clone_disk;
+
+error:
+    return 0;
+}
+
+
+
 /**
  * Write the changes made to the in-memory description
  * of a partition table to the device.
@@ -486,6 +523,8 @@
 int
 ped_disk_commit (PedDisk* disk)
 {
+    if (disk->dev->test_mode) return 1; //zanac
+
        if (!ped_disk_commit_to_dev (disk))
                return 0;
        return ped_disk_commit_to_os (disk);
diff -u --recursive --new-file parted-1.7.1/libparted/filesys.c 
parted-1.7.1-my/libparted/filesys.c
--- parted-1.7.1/libparted/filesys.c    2006-05-25 19:29:06.000000000 +0200
+++ parted-1.7.1-my/libparted/filesys.c 2006-10-14 16:47:46.000000000 +0200
@@ -297,6 +297,10 @@
        PedFileSystemType*      fs_type = NULL;
 
        PED_ASSERT (geom != NULL, return 0);
+       PED_ASSERT (geom->dev != NULL, return 0);
+
+    if (geom->dev->test_mode)
+        return 1;
 
        if (!ped_device_open (geom->dev))
                goto error;
@@ -440,6 +444,7 @@
 
        PED_ASSERT (geom != NULL, return NULL);
        PED_ASSERT (type != NULL, return NULL);
+       PED_ASSERT (geom->dev != NULL, return NULL);
 
        if (!type->ops->create) {
                ped_exception_throw (PED_EXCEPTION_NO_FEATURE,
@@ -476,6 +481,10 @@
 {
        PedDevice*      dev = fs->geom->dev;
 
+    if (fs->geom->dev->test_mode)
+           ped_device_close (dev);
+        return 1;
+
        PED_ASSERT (fs != NULL, goto error_close_dev);
 
        if (!fs->type->ops->close (fs))
diff -u --recursive --new-file parted-1.7.1/parted/parted.c 
parted-1.7.1-my/parted/parted.c
--- parted-1.7.1/parted/parted.c        2006-05-25 19:28:42.000000000 +0200
+++ parted-1.7.1-my/parted/parted.c     2006-10-28 13:13:36.000000000 +0200
@@ -34,6 +34,7 @@
 
 #include <parted/parted.h>
 #include <parted/debug.h>
+#include "../include/parted/operation.h"
 
 #include <ctype.h>
 #include <stdarg.h>
@@ -48,6 +49,8 @@
 #ifdef HAVE_GETOPT_H
 #include <getopt.h>
 
+PedDisk*        disk;
+
 /* minimum amount of free space to leave, or maximum amount to gobble up */
 #define MIN_FREESPACE           (1000 * 2)      /* 1000k */
 
@@ -126,6 +129,96 @@
 
 static void _done (PedDevice* dev);
 
+//zanac
+int 
+ped_device_add_operation_mkpart (PedDevice* dev,
+                PedPartitionType part_type,
+                const PedFileSystemType *fs_type,
+                PedSector start,
+                PedSector end,
+                PedGeometry *range_start,
+                PedGeometry *range_end,
+                char *part_name)
+{
+    PedOperationMKPART *operationMKPART;
+    operationMKPART = malloc(sizeof (PedOperationMKPART));
+    if (!operationMKPART)
+        goto error;
+
+    PedOperation* new_operation;
+    new_operation = malloc(sizeof (PedOperation));
+    if (!new_operation)
+        goto error;
+
+    operationMKPART->part_type = part_type;
+    operationMKPART->fs_type = fs_type;
+    operationMKPART->start = start;
+    operationMKPART->end = end;
+    operationMKPART->range_start = range_start;
+    operationMKPART->range_end = range_end;
+    operationMKPART->part_name = part_name;
+    new_operation->operation = operationMKPART;
+    new_operation->prev = NULL;
+    new_operation->next = NULL;
+    new_operation->type = PED_OPERATION_MKPART;
+
+    if (dev->operation == NULL) {
+        dev->operation = new_operation;
+    }
+    else {
+        PedOperation *operation = dev->operation;
+        PedOperation *last_operation = dev->operation;
+        while ((operation = operation->next))
+            last_operation = operation;
+        new_operation->prev = last_operation;
+        last_operation->next = new_operation;
+    }
+
+    return 1;
+
+error:
+    return 0;
+}
+
+int 
+ped_device_add_operation_rm (PedDevice* dev,
+                int num)
+{
+    PedOperationRM *operationRM;
+    operationRM = malloc(sizeof (PedOperationRM));
+    if (!operationRM)
+        goto error;
+
+    PedOperation* new_operation;
+    new_operation = malloc(sizeof (PedOperation));
+    if (!new_operation)
+        goto error;
+
+    operationRM->num = num;
+    new_operation->operation = operationRM;
+    new_operation->prev = NULL;
+    new_operation->next = NULL;
+    new_operation->type = PED_OPERATION_RM;
+
+    if (dev->operation == NULL) {
+        dev->operation = new_operation;
+    }
+    else {
+        PedOperation *operation = dev->operation;
+        PedOperation *last_operation = dev->operation;
+        while ((operation = operation->next))
+            last_operation = operation;
+        new_operation->prev = last_operation;
+        last_operation->next = new_operation;
+    }
+
+    return 1;
+
+error:
+    return 0;
+}
+
+
 static void
 _timer_handler (PedTimer* timer, void* context)
 {
@@ -598,10 +691,12 @@
         if (!command_line_get_fs_type (_("File system?"), &type))
                 goto error_destroy_disk;
 
-        fs = ped_file_system_create (&part->geom, type, timer);
-        if (!fs)
-                goto error_destroy_disk;
-        ped_file_system_close (fs);
+        if (!(*dev)->test_mode) {
+            fs = ped_file_system_create (&part->geom, type, timer);
+            if (!fs)
+                    goto error_destroy_disk;
+            ped_file_system_close (fs);
+        }
 
         if (!ped_partition_set_system (part, type))
                 goto error_destroy_disk;
@@ -618,61 +713,66 @@
         return 0;
 }
 
+
 static int
-do_mkpart (PedDevice** dev)
+do_true_mkpart (PedDevice** dev,
+                PedPartitionType part_type,
+                const PedFileSystemType *fs_type,
+                PedSector start,
+                PedSector end,
+                PedGeometry *range_start,
+                PedGeometry *range_end,
+                char *part_name)
 {
-        PedDisk*                 disk;
         PedPartition*            part;
-        PedPartitionType         part_type;
+        /*PedPartitionType         part_type;
         const PedFileSystemType* fs_type = ped_file_system_type_get ("ext2");
         PedSector                start = 0, end = 0;
-        PedGeometry              *range_start = NULL, *range_end = NULL;
+        PedGeometry              *range_start = NULL, *range_end = NULL;*/
         PedConstraint*           user_constraint;
         PedConstraint*           dev_constraint;
         PedConstraint*           final_constraint;
         char*                    peek_word;
-        char*                    part_name = NULL;
+        //char*                    part_name = NULL;
         char                     *start_usr = NULL, *end_usr = NULL;
         char                     *start_sol = NULL, *end_sol = NULL;
         
-        disk = ped_disk_new (*dev);
-        if (!disk)
-                goto error;
-
-        if (!ped_disk_type_check_feature (disk->type, PED_DISK_TYPE_EXTENDED)) 
{
-                part_type = PED_PARTITION_NORMAL;
-        } else {
-                if (!command_line_get_part_type (_("Partition type?"),
-                                                disk, &part_type))
-                        goto error_destroy_disk;
-        }
-
-        if (ped_disk_type_check_feature (disk->type,
-                                         PED_DISK_TYPE_PARTITION_NAME)) 
-                part_name = command_line_get_word (_("Partition name?"),
-                                                   "", NULL, 1); 
-                
-        peek_word = command_line_peek_word ();
-        if (part_type == PED_PARTITION_EXTENDED
-            || (peek_word && isdigit (peek_word[0]))) {
-                fs_type = NULL;
-        } else {
-                if (!command_line_get_fs_type (_("File system type?"),
-                                               &fs_type))
-                        goto error_destroy_disk;
+        if ((*dev)->test_mode) {
+            if (!ped_disk_type_check_feature (disk->type, 
PED_DISK_TYPE_EXTENDED)) {
+                    part_type = PED_PARTITION_NORMAL;
+            } else {
+                    if (!command_line_get_part_type (_("Partition type?"),
+                                                    disk, &part_type))
+                            goto error;
+            }
+
+            if (ped_disk_type_check_feature (disk->type,
+                                             PED_DISK_TYPE_PARTITION_NAME)) 
+                    part_name = command_line_get_word (_("Partition name?"),
+                                                       "", NULL, 1); 
+                    
+            peek_word = command_line_peek_word ();
+            if (part_type == PED_PARTITION_EXTENDED
+                || (peek_word && isdigit (peek_word[0]))) {
+                    fs_type = NULL;
+            } else {
+                    if (!command_line_get_fs_type (_("File system type?"),
+                                                   &fs_type))
+                            goto error;
+            }
+            if (peek_word)
+                    ped_free (peek_word);
+
+            if (!command_line_get_sector (_("Start?"), *dev, &start, 
&range_start))
+                    goto error;
+            if (!command_line_get_sector (_("End?"), *dev, &end, &range_end))
+                    goto error;
         }
-        if (peek_word)
-                ped_free (peek_word);
-
-        if (!command_line_get_sector (_("Start?"), *dev, &start, &range_start))
-                goto error_destroy_disk;
-        if (!command_line_get_sector (_("End?"), *dev, &end, &range_end))
-                goto error_destroy_disk;
         
         /* processing starts here */
         part = ped_partition_new (disk, part_type, fs_type, start, end);
         if (!part)
-                goto error_destroy_disk;
+                goto error;
 
         snap_to_boundaries (&part->geom, NULL, disk, range_start, range_end);
 
@@ -729,24 +829,24 @@
         if (part_name)
                 PED_ASSERT (ped_partition_set_name (part, part_name), return 
0);
         if (!ped_partition_set_system (part, fs_type))
-                goto error_destroy_disk;
+                goto error;
         if (ped_partition_is_flag_available (part, PED_PARTITION_LBA))
                 ped_partition_set_flag (part, PED_PARTITION_LBA, 1);
         
         if (!ped_disk_commit (disk))
-                goto error_destroy_disk;
+                goto error;
         
         /* clean up */
         ped_constraint_destroy (final_constraint);
         ped_constraint_destroy (user_constraint);
         ped_constraint_destroy (dev_constraint);
-
-        ped_disk_destroy (disk);
         
-        if (range_start != NULL)
-                ped_geometry_destroy (range_start);
-        if (range_end != NULL)
-                ped_geometry_destroy (range_end);
+        if (!(*dev)->test_mode) {
+            if (range_start != NULL)
+                    ped_geometry_destroy (range_start);
+            if (range_end != NULL)
+                    ped_geometry_destroy (range_end);
+        }
         
         if (start_usr != NULL)
                 ped_free (start_usr);
@@ -757,6 +857,16 @@
         if (end_sol != NULL)
                 ped_free (end_sol);
 
+        disk = ped_disk_commit_test_disk(&disk);
+        if (!disk)
+            goto error;
+
+        if ((*dev)->test_mode) {
+            ped_device_add_operation_mkpart (*dev, part_type,
+                                           fs_type, start, end, range_start, 
range_end,
+                                           part_name);
+        }
+
         return 1;
 
 error_remove_part:
@@ -768,8 +878,8 @@
         ped_constraint_destroy (dev_constraint);
 error_destroy_part:
         ped_partition_destroy (part);
-error_destroy_disk:
-        ped_disk_destroy (disk);
+/*error_destroy_disk:
+        ped_disk_destroy (disk);*/
 error:
         if (range_start != NULL)
                 ped_geometry_destroy (range_start);
@@ -788,6 +898,29 @@
         return 0;
 }
 
+
+static int
+do_mkpart (PedDevice** dev)
+{
+        PedPartition*            part;
+        PedPartitionType         part_type;
+        const PedFileSystemType* fs_type = ped_file_system_type_get ("ext2");
+        PedSector                start = 0, end = 0;
+        PedGeometry              *range_start = NULL, *range_end = NULL;
+        PedConstraint*           user_constraint;
+        PedConstraint*           dev_constraint;
+        PedConstraint*           final_constraint;
+        char*                    peek_word;
+        char*                    part_name = NULL;
+        char                     *start_usr = NULL, *end_usr = NULL;
+        char                     *start_sol = NULL, *end_sol = NULL;
+
+        do_true_mkpart (dev, part_type, fs_type, start, end,
+                        range_start, range_end, part_name);
+
+        return 0;
+}
+
 static int
 do_mkpartfs (PedDevice** dev)
 {
@@ -1183,7 +1316,6 @@
 static int
 do_print (PedDevice** dev)
 {
-        PedDisk*        disk;
         PedPartition*   part;
         Table*          table;
         StrList*        row;
@@ -1200,10 +1332,6 @@
         char*           tmp;
         wchar_t*        table_rendered;
 
-        disk = ped_disk_new (*dev);
-        if (!disk)
-                goto error;
-
         peek_word = command_line_peek_word ();
         if (peek_word) {
                 has_num_arg = isdigit (peek_word[0]);
@@ -1368,12 +1496,9 @@
         ped_free (table_rendered);
 
         table_destroy (table);
-        ped_disk_destroy (disk);
 
         return 1;
 
-error_destroy_disk:
-        ped_disk_destroy (disk);
 error:
         return 0;
 }
@@ -1651,27 +1776,135 @@
 }
 
 static int
-do_rm (PedDevice** dev)
+do_undo (PedDevice** dev)
+{
+    PedOperation *operation = (*dev)->operation;
+    if (operation == NULL) {
+        printf("Cannot undo... of course! ;)\n");
+        goto error;
+    }
+
+       PedDisk *old_disk = disk->disk;
+       ped_disk_destroy(disk);
+       disk = old_disk;
+
+       old_disk = disk->disk;
+       ped_disk_destroy(disk);
+       disk = old_disk;
+
+    disk = ped_disk_commit_test_disk(&disk);
+
+    if (operation->next == NULL) {
+        printf("No other undo available!\n");
+        free(operation);
+        (*dev)->operation = NULL;
+    } else {
+        operation = (*dev)->operation;
+        PedOperation *last_operation = (*dev)->operation;
+        while ((operation = operation->next))
+            last_operation = operation;
+        
+        operation = last_operation->prev;
+        operation->next = NULL;
+        free(last_operation);
+    }
+
+       return 1;
+
+error:
+    return 0;
+}
+
+static int
+do_true_rm (PedDevice** dev, int num)
 {
-        PedDisk*                disk;
         PedPartition*           part = NULL;
 
-        disk = ped_disk_new (*dev);
-        if (!disk)
-                goto error;
+        part = ped_disk_get_partition (disk, num);
+        if (!part)
+            goto error;
+
+        ped_disk_delete_partition (disk, part);
+        ped_disk_commit (disk);
+        disk = ped_disk_commit_test_disk(&disk);
+
+        if ((*dev)->test_mode) {
+            ped_device_add_operation_rm (*dev, num);
+        }
+
+        return 1;
+
+error:
+        return 0;
+}
+
+static int
+do_apply (PedDevice** dev)
+{
+    PedOperation *operation = (*dev)->operation;
+    if (operation == NULL) {
+        printf("Cannot apply... of course! ;)\n");
+        goto error;
+    }
+
+    /*Destroy all disk used to save intermediate state*/
+    while (disk->disk != NULL) {
+        PedDisk *old_disk = disk->disk;
+        ped_disk_destroy(disk);
+        disk = old_disk;
+    }
+
+
+    /*make a new backup of disk*/
+    disk = ped_disk_commit_test_disk(&disk);
+       ped_device_test_mode(*dev, 0); //test mode off: now committing!
+
+
+    /*Do all operation saved!*/
+    do {
+        if (operation->type == PED_OPERATION_RM) {
+            PedOperationRM *operationRM = operation->operation;
+            do_true_rm(dev, operationRM->num);
+        }
+        if (operation->type == PED_OPERATION_MKPART) {
+            PedOperationMKPART *operationMKPART = operation->operation;
+            do_true_mkpart(dev, 
+                           operationMKPART->part_type,
+                           operationMKPART->fs_type,
+                           operationMKPART->start,
+                           operationMKPART->end,
+                           operationMKPART->range_start,
+                           operationMKPART->range_end,
+                           operationMKPART->part_name);
+        }
+    } while ((operation = operation->next));
+
+       ped_device_test_mode(*dev, 1); //test mode on
+
+    /*Warning: memory leak, we don't really empty the list of operation! FIX*/
+    //FIX mast create an API like "ped_operation_free(dev)";
+    (*dev)->operation = NULL;
+
+       return 1;
+
+error:
+    return 0;
+}
+
+static int
+do_rm (PedDevice** dev)
+{
+        PedPartition*           part = NULL;
 
         if (!command_line_get_partition (_("Partition number?"), disk, &part))
-                goto error_destroy_disk;
+                goto error;
         if (!_partition_warn_busy (part))
-                goto error_destroy_disk;
+                goto error;
+
+        do_true_rm(dev, part->num);
 
-        ped_disk_delete_partition (disk, part);
-        ped_disk_commit (disk);
-        ped_disk_destroy (disk);
         return 1;
 
-error_destroy_disk:
-        ped_disk_destroy (disk);
 error:
         return 0;
 }
@@ -2073,6 +2306,30 @@
 "copy of GNU Parted\n"),
 NULL), 1));
 
+command_register (commands, command_create (
+        str_list_create_unique ("undo", _("undo"), NULL),
+        do_undo,
+        str_list_create (
+_("undo                                  displays the current undo "
+"of GNU Parted and copyright information"),
+NULL),
+        str_list_create (
+_("undo displays copyright and version information corressponding to this "
+"copy of GNU Parted\n"),
+NULL), 1));
+
+command_register (commands, command_create (
+        str_list_create_unique ("apply", _("apply"), NULL),
+        do_apply,
+        str_list_create (
+_("apply                                  displays the current apply "
+"of GNU Parted and copyright information"),
+NULL),
+        str_list_create (
+_("apply displays copyright and version information corressponding to this "
+"copy of GNU Parted\n"),
+NULL), 1));
+
 }
 
 static void
@@ -2146,6 +2403,8 @@
         dev = ped_device_get ((*argv_ptr) [0]);
         if (!dev)
                 return NULL;
+       /*printf("test mode by Zanac\n");*/
+       ped_device_test_mode(dev, 1);
         (*argc_ptr)--;
         (*argv_ptr)++;
 } else {
@@ -2235,6 +2494,7 @@
 main (int argc, char** argv)
 {
         PedDevice*      dev;
+
         int             status;
 
 #ifdef HAVE_GETUID
@@ -2248,11 +2508,23 @@
         if (!dev)
                 return 1;
 
+        //zanac
+        dev->operation = NULL;
+       disk = ped_disk_new (dev);
+       if (!disk)
+               return 1;
+
         if (argc || opt_script_mode)
                 status = non_interactive_mode (&dev, commands, argc, argv);
         else
                 status = interactive_mode (&dev, commands);
 
+
+       PedDisk *orig_disk;
+       orig_disk = disk->disk;
+       ped_disk_destroy(disk);
+       ped_disk_destroy(orig_disk);
+
         _done (dev);
 
         return !status;

Attachment: pgp0oZ3SgI9Cl.pgp
Description: PGP signature

_______________________________________________
bug-parted mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/bug-parted

Reply via email to