commit-mailutils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[SCM] GNU Mailutils branch, master, updated. rel-2_1-43-g1413567


From: Sergey Poznyakoff
Subject: [SCM] GNU Mailutils branch, master, updated. rel-2_1-43-g1413567
Date: Sat, 20 Feb 2010 18:23:11 +0000

This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU Mailutils".

http://git.savannah.gnu.org/cgit/mailutils.git/commit/?id=1413567bfd73bfb39404201a4fc19a4d23dae3ec

The branch, master has been updated
       via  1413567bfd73bfb39404201a4fc19a4d23dae3ec (commit)
       via  a192c1115ffc99fe631826cd6f17ce00f4d22820 (commit)
      from  5781e1f68d451a0930060f166a376ba38a88fad2 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 1413567bfd73bfb39404201a4fc19a4d23dae3ec
Author: Sergey Poznyakoff <address@hidden>
Date:   Sat Feb 20 20:19:45 2010 +0200

    Mu_list_replace and mu_list_remove actually reclaim the memory associated 
with the item.
    
    * include/mailutils/iterator.h (mu_itrctl_delete_nd)
    (mu_itrctl_replace_nd): New mu_itrctl_req constants.
    * include/mailutils/list.h (mu_list_remove_nd)
    (mu_list_replace_nd): New prototypes.
    (mu_list_destroy_item_t): New typedef.
    (mu_list_set_destroy_item): Return mu_list_destroy_item_t.
    * mailbox/list.c (DESTROY_ITEM): New macro.
    (mu_list_destroy): Use DESTROY_ITEM.
    (mu_list_remove, mu_list_replace): Actually destroy the
    item being removed.
    (mu_list_remove_nd, mu_list_replace_nd): New functions.
    (mu_list_set_destroy_item): Return previous value of
    destroy_item.
    (list_itrctl): Handle mu_itrctl_delete_nd and mu_itrctl_replace_nd.
    
    * mailbox/observer.c (mu_observable_create): Register destroy_item
    function.
    (mu_observable_destroy): Remove explicit loop. Rely on destroy_item
    instead.
    (mu_observable_detach): Use mu_iterator_ctl to actually
    remove the event.
    * mh/mh_alias.y (_insert_list): Remove.
    (alias_expand_list): Use mu_iterator_ctl to insert
    replacement list and remove the current item.
    * mh/sortm.c (addop): Register destroy_item function.
    (remop): Remove call to free.
    * movemail/movemail.c (main): <uidl loop>: Use mu_itrctl_delete
    to remove items.
    
    * libmu_sieve/util.c: Minor change.
    
    * mail/util.c (util_slist_compare): New static function.
    (util_slist_add): Register destroy_item and comparison
    functions for the new list.
    (util_slist_remove,util_slist_destroy): Rewrite.
    
    * imap4d/authenticate.c (auth_add): Use mu_list_free_item as
    destroy_item function.
    * imap4d/util.c (util_register_event): Likewise.
    
    * include/mailutils/cpp/list.h (List)<set_destroy_item>: Change
    return value.
    * libmu_cpp/list.cc (List::set_destroy_item): Reflect changes to
    mu_list_set_destroy_item.
    * libmu_argp/common.c: Include stdlib.h

commit a192c1115ffc99fe631826cd6f17ce00f4d22820
Author: Sergey Poznyakoff <address@hidden>
Date:   Sat Feb 20 14:20:12 2010 +0200

    Implement `iterator_ctl' function.
    
    * include/mailutils/iterator.h (mu_itrctl_req): New enum.
    (mu_iterator_skip, mu_iterator_ctl)
    (mu_iterator_set_itrctl): New prototypes.
    * include/mailutils/list.h (mu_list_free_item): New prototype.
    * libproto/include/iterator0.h (struct _mu_iterator)<itrctl>: New method.
    * libproto/include/list0.h (_mu_list_clear): New proto.
    * mailbox/iterator.c (mu_iterator_set_itrctl): New function.
    (mu_iterator_skip, mu_iterator_ctl): New functions.
    * mailbox/list.c (_insert_item): Re-implement function.
    (mu_list_insert): Use _insert_item again.
    (mu_list_remove): Don't keep track of the previous item.
    (list_itrctl): New function.
    (mu_list_get_iterator): Set itrctl method.
    * mailbox/listlist.c (clear_list): Rename to _mu_list_clear,
    remove static qualifier. All uses updated.
    
    * mailbox/freeitem.c: New file.
    * mailbox/Makefile.am (libmailutils_la_SOURCES): Add freeitem.c.
    
    * examples/listop.c (read_list): Rewrite to simplify
    calling convention. All callers updated.
    (inctl_tell,ictl_del,ictl_repl)
    (ictl_ins,ictl): New functions.
    (help): Add new commands.
    (shell): Handle "inctl" command.
    (delete): Fix memory leak.
    (main): Set mu_list_free_item as a destroy_item function.
    
    * mailbox/testsuite/mailbox/listop.c: Add ictl tests.
    
    * libmu_cfg/sieve.c (_add_path): Set mu_list_free_item as
    a destroy_item function.
    * mailbox/gocs.c (mu_gocs_store): Likewise.
    * maidag/lmtp.c (cfun_rcpt_to): Likewise.
    * imap4d/namespace.c (namespace_init): Likewise.
    * libmu_sieve/conf.c (_path_append): Likewise.

-----------------------------------------------------------------------

Summary of changes:
 examples/listop.c                          |  143 ++++++++++++++++++++----
 imap4d/authenticate.c                      |    1 +
 imap4d/namespace.c                         |   10 +--
 imap4d/util.c                              |    5 +-
 include/mailutils/cpp/list.h               |    2 +-
 include/mailutils/iterator.h               |   19 +++-
 include/mailutils/list.h                   |   10 ++-
 libmu_argp/common.c                        |    1 +
 libmu_cfg/sieve.c                          |    8 +-
 libmu_cpp/list.cc                          |    8 +-
 libmu_sieve/conf.c                         |    8 +-
 libmu_sieve/util.c                         |    1 -
 libproto/include/iterator0.h               |    1 +
 libproto/include/list0.h                   |    1 +
 maidag/lmtp.c                              |    8 +-
 mail/util.c                                |   57 ++++------
 mailbox/Makefile.am                        |    1 +
 libmu_argp/cmdline.h => mailbox/freeitem.c |   14 ++-
 mailbox/gocs.c                             |    8 +-
 mailbox/iterator.c                         |   34 ++++++
 mailbox/list.c                             |  167 ++++++++++++++++++++++++----
 mailbox/listlist.c                         |   10 +-
 mailbox/mailbox.c                          |   10 +--
 mailbox/observer.c                         |   46 +++-----
 mailbox/testsuite/mailbox/list.exp         |   77 +++++++++++++
 mh/mh_alias.y                              |   26 +----
 mh/sortm.c                                 |   11 +-
 movemail/movemail.c                        |    3 +-
 28 files changed, 488 insertions(+), 202 deletions(-)
 copy libmu_argp/cmdline.h => mailbox/freeitem.c (80%)

diff --git a/examples/listop.c b/examples/listop.c
index 971cfee..c04adac 100644
--- a/examples/listop.c
+++ b/examples/listop.c
@@ -106,7 +106,7 @@ delete (mu_list_t list, int argc, char **argv)
 
   while (--argc)
     {
-      rc = mu_list_remove (list, strdup (*++argv));
+      rc = mu_list_remove (list, *++argv);
       if (rc)
        fprintf (stderr, "mu_list_remove(%s): %s\n", *argv, mu_strerror (rc));
     }
@@ -150,18 +150,30 @@ prep (mu_list_t list, int argc, char **argv)
     }
 }
 
-static int
-read_list (mu_list_t list, int argc, char **argv)
+static mu_list_t
+read_list (int argc, char **argv)
 {
   int rc;
+  mu_list_t list;
   
+  rc = mu_list_create (&list);
+  if (rc)
+    {
+      fprintf (stderr, "creating temp list: %s\n", mu_strerror (rc));
+      return NULL;
+    }
+  mu_list_set_destroy_item (list, mu_list_free_item);
   for (; argc; argc--, argv++)
     {
       rc = mu_list_append (list, strdup (*argv));
       if (rc)
-       break;
+       {
+         mu_list_destroy (&list);
+         fprintf (stderr, "adding to temp list: %s\n", mu_strerror (rc));
+         break;
+       }
     }
-  return rc;
+  return list;
 }
 
 void
@@ -196,21 +208,9 @@ ins (mu_list_t list, int argc, char **argv)
     rc = mu_list_insert (list, item, strdup (argv[an]), insert_before);
   else
     {
-      mu_list_t tmp;
-      
-      rc = mu_list_create (&tmp);
-      if (rc)
-       {
-         fprintf (stderr, "creating temp list: %s\n", mu_strerror (rc));
-         return;
-       }
-
-      rc = read_list (tmp, argc - an, argv + an);
-      if (rc)
-       {
-         fprintf (stderr, "reading temp list: %s\n", mu_strerror (rc));
-         return;
-       }
+      mu_list_t tmp = read_list (argc - an, argv + an);
+      if (!tmp)
+       return;
       rc = mu_list_insert_list (list, item, tmp, insert_before);
       mu_list_destroy (&tmp);
     }
@@ -219,7 +219,6 @@ ins (mu_list_t list, int argc, char **argv)
     lperror ("mu_list_insert", rc);
 }
   
-
 void
 repl (mu_list_t list, int argc, char **argv)
 {
@@ -236,6 +235,99 @@ repl (mu_list_t list, int argc, char **argv)
     fprintf (stderr, "mu_list_replace: %s\n", mu_strerror (rc));
 }
 
+void
+ictl_tell (mu_iterator_t itr, int argc)
+{
+  size_t pos;
+  int rc;
+
+  if (argc)
+    {
+      fprintf (stderr, "ictl tell?\n");
+      return;
+    }
+  
+  rc = mu_iterator_ctl (itr, mu_itrctl_tell, &pos);
+  if (rc)
+    lperror ("mu_iterator_ctl", rc);
+  printf ("%lu\n", (unsigned long) pos);
+}
+
+void
+ictl_del (mu_iterator_t itr, int argc)
+{
+  int rc;
+
+  if (argc)
+    {
+      fprintf (stderr, "ictl del?\n");
+      return;
+    }
+  rc = mu_iterator_ctl (itr, mu_itrctl_delete, NULL);
+  if (rc)
+    lperror ("mu_iterator_ctl", rc);
+}
+
+void
+ictl_repl (mu_iterator_t itr, int argc, char **argv)
+{
+  int rc;
+  
+  if (argc != 1)
+    {
+      fprintf (stderr, "ictl repl item?\n");
+      return;
+    }
+
+  rc = mu_iterator_ctl (itr, mu_itrctl_replace, strdup (argv[0]));
+  if (rc)
+    lperror ("mu_iterator_ctl", rc);
+}
+
+void
+ictl_ins (mu_iterator_t itr, int argc, char **argv)
+{
+  int rc;
+  
+  if (argc < 1)
+    {
+      fprintf (stderr, "ictl ins item [item*]?\n");
+      return;
+    }
+
+  if (argc == 1)
+    rc = mu_iterator_ctl (itr, mu_itrctl_insert, strdup (argv[0]));
+  else
+    {
+      mu_list_t tmp = read_list (argc, argv);
+      if (!tmp)
+       return;
+      rc = mu_iterator_ctl (itr, mu_itrctl_insert_list, tmp);
+      mu_list_destroy (&tmp);
+    }
+}
+
+void
+ictl (mu_iterator_t itr, int argc, char **argv)
+{
+  if (argc == 1)
+    {
+      fprintf (stderr, "ictl tell|del|repl|ins?\n");
+      return;
+    }
+  
+  if (strcmp (argv[1], "tell") == 0)
+    ictl_tell (itr, argc - 2);
+  else if (strcmp (argv[1], "del") == 0)
+    ictl_del (itr, argc - 2);
+  else if (strcmp (argv[1], "repl") == 0)
+    ictl_repl (itr, argc - 2, argv + 2);
+  else if (strcmp (argv[1], "ins") == 0)
+    ictl_ins (itr, argc - 2, argv + 2);
+  else
+    fprintf (stderr, "unknown subcommand\n");
+}
+    
 #define NITR 4
 
 int
@@ -295,6 +387,10 @@ help ()
   printf ("prep item [item*]\n");
   printf ("repl old_item new_item\n");
   printf ("ins [before|after] item new_item [new_item*]\n");
+  printf ("ictl tell\n");
+  printf ("ictl del\n");
+  printf ("ictl repl item\n");
+  printf ("ictl ins item [item*]\n");
   printf ("print\n");
   printf ("quit\n");
   printf ("iter num\n");
@@ -356,6 +452,8 @@ shell (mu_list_t list)
            ins (list, argc, argv);
          else if (strcmp (argv[0], "repl") == 0)
            repl (list, argc, argv);
+         else if (strcmp (argv[0], "ictl") == 0)
+           ictl (itr[num], argc, argv);
          else if (strcmp (argv[0], "print") == 0)
            print (list);
          else if (strcmp (argv[0], "quit") == 0)
@@ -437,7 +535,8 @@ main (int argc, char **argv)
   if (rc)
     lperror ("mu_list_create", rc);
   mu_list_set_comparator (list, string_comp);
-
+  mu_list_set_destroy_item (list, mu_list_free_item);
+  
   while (argc--)
     {
       rc = mu_list_append (list, *argv++);
diff --git a/imap4d/authenticate.c b/imap4d/authenticate.c
index 12978b5..1354203 100644
--- a/imap4d/authenticate.c
+++ b/imap4d/authenticate.c
@@ -47,6 +47,7 @@ auth_add (char *name, imap4d_auth_handler_fp handler)
     {
       mu_list_create (&imap_auth_list);
       mu_list_set_comparator (imap_auth_list, comp);
+      mu_list_set_destroy_item (imap_auth_list, mu_list_free_item);
     }
   mu_list_append (imap_auth_list, (void*)p);
 }
diff --git a/imap4d/namespace.c b/imap4d/namespace.c
index 45feeca..abe21cd 100644
--- a/imap4d/namespace.c
+++ b/imap4d/namespace.c
@@ -261,12 +261,6 @@ normalize_fun (void *item, void *data)
                         mu_strdup (mu_normalize_path (name)));
 }
 
-static void
-free_item (void *item)
-{
-  free (item);
-}
-  
 void
 namespace_init ()
 {
@@ -278,9 +272,9 @@ namespace_init ()
        {
          mu_list_t list;
          mu_list_create (&list);
-         mu_list_set_destroy_item (list, free_item);
+         mu_list_set_destroy_item (list, mu_list_free_item);
          mu_list_do (namespace[i], normalize_fun, list);
-         mu_list_set_destroy_item (namespace[i], free_item);
+         mu_list_set_destroy_item (namespace[i], mu_list_free_item);
          mu_list_destroy (&namespace[i]);
          namespace[i] = list;
        }
diff --git a/imap4d/util.c b/imap4d/util.c
index 51b19c1..d697a33 100644
--- a/imap4d/util.c
+++ b/imap4d/util.c
@@ -951,7 +951,10 @@ util_register_event (int old_state, int new_state,
   evp->action = action;
   evp->data = data;
   if (!event_list)
-    mu_list_create (&event_list);
+    {
+      mu_list_create (&event_list);
+      mu_list_set_destroy_item (event_list, mu_list_free_item);
+    }
   mu_list_append (event_list, (void*)evp);
 }
 
diff --git a/include/mailutils/cpp/list.h b/include/mailutils/cpp/list.h
index 810b66b..c579b69 100644
--- a/include/mailutils/cpp/list.h
+++ b/include/mailutils/cpp/list.h
@@ -69,7 +69,7 @@ class List
 
   void apply (mu_list_action_t* action, void* cbdata);
   mu_list_comparator_t set_comparator (mu_list_comparator_t comp);
-  void set_destroy_item (void (*mu_destoy_item) (void *item));
+  mu_list_destroy_item_t set_destroy_item (mu_list_destroy_item_t 
mu_destroy_item);
 
   bool is_empty ();
   size_t count ();
diff --git a/include/mailutils/iterator.h b/include/mailutils/iterator.h
index dfe4c2d..1ecbda2 100644
--- a/include/mailutils/iterator.h
+++ b/include/mailutils/iterator.h
@@ -26,16 +26,30 @@
 extern "C" {
 #endif
 
+enum mu_itrctl_req
+  {
+    mu_itrctl_tell,        /* Return current position in the object */
+    mu_itrctl_delete,      /* Delete current element */
+    mu_itrctl_delete_nd,   /* Delete current element, non-destructive */
+    mu_itrctl_replace,     /* Replace current element */
+    mu_itrctl_replace_nd,  /* Replace current element, non-destructive */
+    mu_itrctl_insert,      /* Insert new element in the current position */
+    mu_itrctl_insert_list, /* Insert a list of elements */
+  };
+  
 extern int mu_iterator_create   (mu_iterator_t *, void *);
 extern int mu_iterator_dup      (mu_iterator_t *piterator, mu_iterator_t orig);
 extern void mu_iterator_destroy (mu_iterator_t *);
 extern int mu_iterator_first    (mu_iterator_t);
 extern int mu_iterator_next     (mu_iterator_t);
+extern int mu_iterator_skip (mu_iterator_t iterator, ssize_t count);
 extern int mu_iterator_current  (mu_iterator_t, void **pitem);
 extern int mu_iterator_current_kv (mu_iterator_t,
                                   const void **key, void **pitem);  
 extern int mu_iterator_is_done  (mu_iterator_t);
 
+extern int mu_iterator_ctl (mu_iterator_t, enum mu_itrctl_req, void *);
+  
 extern int mu_iterator_attach (mu_iterator_t *root, mu_iterator_t iterator);
 extern int mu_iterator_detach (mu_iterator_t *root, mu_iterator_t iterator);
 extern void mu_iterator_advance (mu_iterator_t iterator, void *e);
@@ -53,7 +67,10 @@ extern int mu_iterator_set_destroy (mu_iterator_t itr,
                                 int (*destroy) (mu_iterator_t, void *data));
 extern int mu_iterator_set_curitem_p (mu_iterator_t itr,
                                   int (*curitem_p) (void *, void *));
-  
+extern int mu_iterator_set_itrctl (mu_iterator_t itr,
+                                  int (*itrctl) (void *,
+                                                 enum mu_itrctl_req,
+                                                 void *));
 #ifdef __cplusplus
 }
 #endif
diff --git a/include/mailutils/list.h b/include/mailutils/list.h
index ef29bca..bb1b377 100644
--- a/include/mailutils/list.h
+++ b/include/mailutils/list.h
@@ -35,7 +35,9 @@ extern int mu_list_insert   (mu_list_t list, void *item, void 
*new_item,
 extern int mu_list_is_empty (mu_list_t);
 extern int mu_list_count    (mu_list_t, size_t *pcount);
 extern int mu_list_remove   (mu_list_t, void *item);
+extern int mu_list_remove_nd  (mu_list_t, void *item);
 extern int mu_list_replace  (mu_list_t list, void *old_item, void *new_item);  
+extern int mu_list_replace_nd (mu_list_t list, void *old_item, void 
*new_item);  
 extern int mu_list_get      (mu_list_t, size_t _index, void **pitem);
 extern int mu_list_to_array (mu_list_t list, void **array, size_t count, 
size_t *pcount);
 extern int mu_list_locate   (mu_list_t list, void *item, void **ret_item);
@@ -53,8 +55,12 @@ extern mu_list_comparator_t mu_list_set_comparator 
(mu_list_t,
                                                    mu_list_comparator_t);
 extern int mu_list_get_comparator (mu_list_t, mu_list_comparator_t *);
 
-extern int mu_list_set_destroy_item (mu_list_t list,
-                                    void (*destroy_item) (void *));
+extern void mu_list_free_item (void *item);
+
+typedef void (*mu_list_destroy_item_t) (void *);
+  
+extern mu_list_destroy_item_t mu_list_set_destroy_item
+              (mu_list_t list, mu_list_destroy_item_t destroy_item);
 
 
 extern int mu_list_intersect_dup (mu_list_t *, mu_list_t, mu_list_t,
diff --git a/libmu_argp/common.c b/libmu_argp/common.c
index fca1c17..6584c6a 100644
--- a/libmu_argp/common.c
+++ b/libmu_argp/common.c
@@ -21,6 +21,7 @@
 #endif
 #include "cmdline.h"
 #include <unistd.h>
+#include <stdlib.h>
 #include <string.h>
 #include <mailutils/syslog.h>
 #include <mailutils/mailbox.h>
diff --git a/libmu_cfg/sieve.c b/libmu_cfg/sieve.c
index 595fb13..5b4a5ed 100644
--- a/libmu_cfg/sieve.c
+++ b/libmu_cfg/sieve.c
@@ -58,12 +58,6 @@ cb_clear_include_path (mu_debug_t debug, void *data, 
mu_config_value_t *val)
   return 0;
 }
 
-static void
-destroy_string (void *str)
-{
-  free (str);
-}
-
 static int
 _add_path (mu_debug_t debug, const char *arg, void *data)
 {
@@ -79,7 +73,7 @@ _add_path (mu_debug_t debug, const char *arg, void *data)
                               _("cannot create list: %s"), mu_strerror (rc));
          exit (1);
        }
-      mu_list_set_destroy_item (*plist, destroy_string);
+      mu_list_set_destroy_item (*plist, mu_list_free_item);
     }
   /* FIXME: Use mu_argcv */
   tmp = strdup (arg);
diff --git a/libmu_cpp/list.cc b/libmu_cpp/list.cc
index dc29b58..75dd945 100644
--- a/libmu_cpp/list.cc
+++ b/libmu_cpp/list.cc
@@ -215,12 +215,10 @@ List :: set_comparator (mu_list_comparator_t comp)
   return mu_list_set_comparator (mu_list, comp);
 }
 
-void
-List :: set_destroy_item (void (*mu_destroy_item) (void *item))
+mu_list_destroy_item_t
+List :: set_destroy_item (mu_list_destroy_item_t mu_destroy_item)
 {
-  int status = mu_list_set_destroy_item (mu_list, mu_destroy_item);
-  if (status)
-    throw Exception ("List::set_destroy_item", status);
+  return mu_list_set_destroy_item (mu_list, mu_destroy_item);
 }
 
 std::list<void*>
diff --git a/libmu_sieve/conf.c b/libmu_sieve/conf.c
index f2c0170..9566a0b 100644
--- a/libmu_sieve/conf.c
+++ b/libmu_sieve/conf.c
@@ -26,12 +26,6 @@
 mu_list_t mu_sieve_include_path = NULL;
 mu_list_t mu_sieve_library_path = NULL;
 
-static void
-destroy_string (void *str)
-{
-  free (str);
-}
-
 static int
 _path_append (void *item, void *data)
 {
@@ -44,7 +38,7 @@ _path_append (void *item, void *data)
          mu_error (_("cannot create list: %s"), mu_strerror (rc));
          exit (1);
        }
-      mu_list_set_destroy_item (*plist, destroy_string);
+      mu_list_set_destroy_item (*plist, mu_list_free_item);
     }
   return mu_list_append (*plist, strdup (item));
 }
diff --git a/libmu_sieve/util.c b/libmu_sieve/util.c
index 327cb52..2966950 100644
--- a/libmu_sieve/util.c
+++ b/libmu_sieve/util.c
@@ -96,7 +96,6 @@ mu_sieve_prealloc (mu_list_t *pool, void *ptr, size_t size)
 void
 mu_sieve_pfree (mu_list_t *pool, void *ptr)
 {
-
   if (*pool)
     mu_list_remove (*pool, ptr);
   free (ptr);
diff --git a/libproto/include/iterator0.h b/libproto/include/iterator0.h
index f84c45b..8abbb80 100644
--- a/libproto/include/iterator0.h
+++ b/libproto/include/iterator0.h
@@ -43,6 +43,7 @@ struct _mu_iterator
   int (*getitem) (void *owner, void **pret, const void **pkey);
   int (*curitem_p) (void *owner, void *item);
   int (*finished_p) (void *owner);
+  int (*itrctl) (void *owner, enum mu_itrctl_req req, void *arg);
 };
 
 #ifdef __cplusplus
diff --git a/libproto/include/list0.h b/libproto/include/list0.h
index 530d9fa..3ac00fb 100644
--- a/libproto/include/list0.h
+++ b/libproto/include/list0.h
@@ -51,6 +51,7 @@ struct _mu_list
   struct _mu_iterator *itr;
 };
 
+extern void _mu_list_clear (mu_list_t list);
 extern void _mu_list_insert_sublist (mu_list_t list,
                                     struct list_data *current,
                                     struct list_data *head,
diff --git a/maidag/lmtp.c b/maidag/lmtp.c
index e821451..4393291 100644
--- a/maidag/lmtp.c
+++ b/maidag/lmtp.c
@@ -155,12 +155,6 @@ mu_list_t rcpt_list;   /* Recipient addresses */
 struct mail_tmp *mtmp; /* Temporary mail storage */
 mu_mailbox_t mbox;     /* Collected mail body */
 
-static void
-rcpt_to_destroy_item (void *ptr)
-{
-  free (ptr);
-}
-
 
 int
 cfun_unknown (FILE *out, char *arg)
@@ -295,7 +289,7 @@ cfun_rcpt_to (FILE *out, char *arg)
   if (!rcpt_list)
     {
       mu_list_create (&rcpt_list);
-      mu_list_set_destroy_item (rcpt_list, rcpt_to_destroy_item);
+      mu_list_set_destroy_item (rcpt_list, mu_list_free_item);
     }
   mu_list_append (rcpt_list, user);
   lmtp_reply (out, "250", "2.1.5", "Go ahead");
diff --git a/mail/util.c b/mail/util.c
index 70cc8f1..013ae83 100644
--- a/mail/util.c
+++ b/mail/util.c
@@ -587,55 +587,39 @@ util_slist_lookup (mu_list_t list, const char *str)
   return rc;
 }
 
-void
-util_slist_add (mu_list_t *list, char *value)
+static int
+util_slist_compare (const void *a, const void *b)
 {
-  char *p;
+  return mu_c_strcasecmp (a, b);
+}
 
-  if (!*list && mu_list_create (list))
-    return;
+void
+util_slist_add (mu_list_t *plist, char *value)
+{
+  mu_list_t list;
 
-  if ((p = strdup(value)) == NULL)
+  if (!*plist)
     {
-      util_error(_("Not enough memory"));
-      return;
+      if (mu_list_create (&list))
+       return;
+      mu_list_set_destroy_item (list, mu_list_free_item);
+      mu_list_set_comparator (list, util_slist_compare);
+      *plist = list;
     }
-  mu_list_append (*list, p);
-}
-
-static int
-comp (const void *item, const void *data)
-{
-  return strcmp ((char*)item, (char*)data);
+  else
+    list = *plist;
+  mu_list_append (list, xstrdup (value));
 }
 
 void
 util_slist_remove (mu_list_t *list, char *value)
 {
-  mu_list_comparator_t cp;
-  
-  if (!*list)
-    return;
-  cp = mu_list_set_comparator (*list, comp);
   mu_list_remove (*list, value);
-  mu_list_set_comparator (*list, cp);
 }
 
 void
 util_slist_destroy (mu_list_t *list)
 {
-  mu_iterator_t itr;
-  char *name;
-
-  if (!*list || mu_list_get_iterator (*list, &itr))
-    return;
-
-  for (mu_iterator_first (itr); !mu_iterator_is_done (itr); mu_iterator_next 
(itr))
-    {
-      mu_iterator_current (itr, (void **)&name);
-      free (name);
-    }
-  mu_iterator_destroy (&itr);
   mu_list_destroy (list);
 }
 
@@ -649,12 +633,13 @@ util_slist_to_string (mu_list_t list, const char *delim)
   if (!list || mu_list_get_iterator (list, &itr))
     return NULL;
 
-  for (mu_iterator_first (itr); !mu_iterator_is_done (itr); mu_iterator_next 
(itr))
+  for (mu_iterator_first (itr); !mu_iterator_is_done (itr);
+       mu_iterator_next (itr))
     {
       mu_iterator_current (itr, (void **)&name);
       if (str && delim)
-       util_strcat(&str, delim);
-      util_strcat(&str, name);
+       util_strcat (&str, delim);
+      util_strcat (&str, name);
     }
   mu_iterator_destroy (&itr);
   return str;
diff --git a/mailbox/Makefile.am b/mailbox/Makefile.am
index 9982187..845bc58 100644
--- a/mailbox/Makefile.am
+++ b/mailbox/Makefile.am
@@ -78,6 +78,7 @@ libmailutils_la_SOURCES = \
  filter_rfc822.c\
  filter_trans.c\
  folder.c\
+ freeitem.c\
  gdebug.c\
  gocs.c\
  hdritr.c\
diff --git a/libmu_argp/cmdline.h b/mailbox/freeitem.c
similarity index 80%
copy from libmu_argp/cmdline.h
copy to mailbox/freeitem.c
index fecb043..65dd7f9 100644
--- a/libmu_argp/cmdline.h
+++ b/mailbox/freeitem.c
@@ -1,5 +1,5 @@
 /* GNU Mailutils -- a suite of utilities for electronic mail
-   Copyright (C) 2007, 2010 Free Software Foundation, Inc.
+   Copyright (C) 2010 Free Software Foundation, Inc.
 
    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
@@ -16,7 +16,13 @@
    Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
    Boston, MA 02110-1301 USA */
 
-#include "mailutils/libcfg.h"
-#include "mailutils/libargp.h"
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
 
-extern struct mu_cfg_tree *mu_argp_tree;
+/* Default destroy_item function. */
+void
+mu_list_free_item (void *item)
+{
+  free (item);
+}
diff --git a/mailbox/gocs.c b/mailbox/gocs.c
index 35e85ac..40bde9d 100644
--- a/mailbox/gocs.c
+++ b/mailbox/gocs.c
@@ -333,12 +333,6 @@ struct mu_gocs_data
 
 static mu_list_t /* of struct mu_gocs_data */ data_list;
 
-static void
-_destroy_data (void *item)
-{
-  free (item);
-}
-
 static int
 _gocs_comp (const void *a, const void *b)
 {
@@ -353,7 +347,7 @@ mu_gocs_store (char *capa, void *data)
   if (!data_list)
     {
       mu_list_create (&data_list);
-      mu_list_set_destroy_item (data_list, _destroy_data);
+      mu_list_set_destroy_item (data_list, mu_list_free_item);
       mu_list_set_comparator (data_list, _gocs_comp);
     }
   s = malloc (sizeof *s);
diff --git a/mailbox/iterator.c b/mailbox/iterator.c
index 9ace323..9ecae2b 100644
--- a/mailbox/iterator.c
+++ b/mailbox/iterator.c
@@ -92,6 +92,18 @@ mu_iterator_set_curitem_p (mu_iterator_t itr,
 }
 
 int
+mu_iterator_set_itrctl (mu_iterator_t itr,
+                       int (*itrctl) (void *,
+                                      enum mu_itrctl_req,
+                                      void *))
+{
+  if (!itr)
+    return EINVAL;
+  itr->itrctl = itrctl;
+  return 0;
+}
+
+int
 mu_iterator_set_destroy (mu_iterator_t itr, int (*destroy) (mu_iterator_t, 
void *))
 {
   if (!itr)
@@ -176,6 +188,18 @@ mu_iterator_next (mu_iterator_t iterator)
 }
 
 int
+mu_iterator_skip (mu_iterator_t iterator, ssize_t count)
+{
+  int status;
+  if (count < 0)
+    return ENOSYS; /* Need prev method */
+  while (count--)
+    if ((status = mu_iterator_next (iterator)))
+      break;
+  return status;
+}
+
+int
 mu_iterator_current (mu_iterator_t iterator, void **pitem)
 {
   return iterator->getitem (iterator->owner, pitem, NULL);
@@ -247,3 +271,13 @@ mu_iterator_detach (mu_iterator_t *root, mu_iterator_t 
iterator)
   
   return 0;
 }
+
+int
+mu_iterator_ctl (mu_iterator_t iterator, enum mu_itrctl_req req, void *arg)
+{
+  if (!iterator)
+    return EINVAL;
+  if (!iterator->itrctl)
+    return ENOSYS;
+  return iterator->itrctl (iterator->owner, req, arg);
+}
diff --git a/mailbox/list.c b/mailbox/list.c
index f598281..9985d4f 100644
--- a/mailbox/list.c
+++ b/mailbox/list.c
@@ -29,6 +29,14 @@
 #include <iterator0.h>
 #include <mailutils/errno.h>
 
+#define DESTROY_ITEM(list, elt)                        \
+  do                                           \
+    {                                          \
+       if ((list)->destroy_item)               \
+        (list)->destroy_item ((elt)->item);    \
+    }                                          \
+  while (0)
+
 int
 mu_list_create (mu_list_t *plist)
 {
@@ -66,8 +74,7 @@ mu_list_destroy (mu_list_t *plist)
        {
          previous = current;
          current = current->next;
-         if (list->destroy_item)
-           list->destroy_item (previous->item);
+         DESTROY_ITEM (list, previous);
          free (previous);
        }
       mu_monitor_unlock (list->monitor);
@@ -196,6 +203,26 @@ mu_list_locate (mu_list_t list, void *item, void 
**ret_item)
   return status;
 }
 
+static int
+_insert_item (mu_list_t list, struct list_data *current, void *new_item,
+             int insert_before)
+{
+  int status;
+  struct list_data *ldata = calloc (sizeof (*ldata), 1);
+  if (ldata == NULL)
+    status = ENOMEM;
+  else
+    {
+      ldata->item = new_item;
+      _mu_list_insert_sublist (list, current,
+                              ldata, ldata,
+                              1,
+                              insert_before);
+      status = 0;
+    }
+  return status;
+}
+
 int
 mu_list_insert (mu_list_t list, void *item, void *new_item, int insert_before)
 {
@@ -214,18 +241,7 @@ mu_list_insert (mu_list_t list, void *item, void 
*new_item, int insert_before)
     {
       if (comp (current->item, item) == 0)
        {
-         struct list_data *ldata = calloc (sizeof (*ldata), 1);
-         if (ldata == NULL)
-           status = ENOMEM;
-         else
-           {
-             ldata->item = new_item;
-             _mu_list_insert_sublist (list, current,
-                                      ldata, ldata,
-                                      1,
-                                      insert_before);
-             status = 0;
-           }
+         status = _insert_item (list, current, new_item, insert_before);
          break;
        }
     }
@@ -236,7 +252,7 @@ mu_list_insert (mu_list_t list, void *item, void *new_item, 
int insert_before)
 int
 mu_list_remove (mu_list_t list, void *item)
 {
-  struct list_data *current, *previous;
+  struct list_data *current;
   mu_list_comparator_t comp;
   int status = MU_ERR_NOENT;
 
@@ -244,14 +260,17 @@ mu_list_remove (mu_list_t list, void *item)
     return EINVAL;
   comp = list->comp ? list->comp : _mu_list_ptr_comparator;
   mu_monitor_wrlock (list->monitor);
-  for (previous = &list->head, current = list->head.next;
-       current != &list->head; previous = current, current = current->next)
+  for (current = list->head.next;
+       current != &list->head; current = current->next)
     {
       if (comp (current->item, item) == 0)
        {
+         struct list_data *previous = current->prev;
+         
          mu_iterator_advance (list->itr, current);
          previous->next = current->next;
          current->next->prev = previous;
+         DESTROY_ITEM (list, current);
          free (current);
          list->count--;
          status = 0;
@@ -263,6 +282,15 @@ mu_list_remove (mu_list_t list, void *item)
 }
 
 int
+mu_list_remove_nd (mu_list_t list, void *item)
+{
+  mu_list_destroy_item_t dptr = mu_list_set_destroy_item (list, NULL);
+  int rc = mu_list_remove (list, item);
+  mu_list_set_destroy_item (list, dptr);
+  return rc;
+}
+
+int
 mu_list_replace (mu_list_t list, void *old_item, void *new_item)
 {
   struct list_data *current, *previous;
@@ -278,6 +306,7 @@ mu_list_replace (mu_list_t list, void *old_item, void 
*new_item)
     {
       if (comp (current->item, old_item) == 0)
        {
+         DESTROY_ITEM (list, current);
          current->item = new_item;
          status = 0;
          break;
@@ -288,6 +317,15 @@ mu_list_replace (mu_list_t list, void *old_item, void 
*new_item)
 }
 
 int
+mu_list_replace_nd (mu_list_t list, void *item, void *new_item)
+{
+  mu_list_destroy_item_t dptr = mu_list_set_destroy_item (list, NULL);
+  int rc = mu_list_replace (list, item, new_item);
+  mu_list_set_destroy_item (list, dptr);
+  return rc;
+}
+
+int
 mu_list_get (mu_list_t list, size_t indx, void **pitem)
 {
   struct list_data *current;
@@ -336,13 +374,12 @@ mu_list_do (mu_list_t list, mu_list_action_t *action, 
void *cbdata)
   return status;
 }
 
-int
+mu_list_destroy_item_t
 mu_list_set_destroy_item (mu_list_t list, void (*destroy_item)(void *item))
 {
-  if (list == NULL)
-    return EINVAL;
+  mu_list_destroy_item_t ret = list->destroy_item;
   list->destroy_item = destroy_item;
-  return 0;
+  return ret;
 }
 
 int
@@ -503,6 +540,91 @@ list_data_dup (void **ptr, void *owner)
   return 0;
 }
 
+static int
+list_itrctl (void *owner, enum mu_itrctl_req req, void *arg)
+{
+  struct list_iterator *itr = owner;
+  mu_list_t list = itr->list;
+  struct list_data *ptr;
+  
+  if (itr->cur == NULL)
+    return MU_ERR_NOENT;
+  switch (req)
+    {
+    case mu_itrctl_tell:
+      /* Return current position in the object */
+      {
+       size_t count;
+
+       for (count = 0, ptr = list->head.next; ptr != &list->head;
+            ptr = ptr->next, count++)
+         {
+           if (ptr == itr->cur)
+             {
+               *(size_t*)arg = count;
+               return 0;
+             }
+         }
+       return MU_ERR_NOENT;
+      }
+       
+    case mu_itrctl_delete:
+    case mu_itrctl_delete_nd:
+      /* Delete current element */
+      {
+       struct list_data *prev;
+       
+       ptr = itr->cur;
+       prev = ptr->prev;
+       
+       mu_iterator_advance (list->itr, ptr);
+       prev->next = ptr->next;
+       ptr->next->prev = prev;
+       if (req == mu_itrctl_delete)
+         DESTROY_ITEM (list, ptr);
+       free (ptr);
+       list->count--;
+      }
+      break;
+      
+    case mu_itrctl_replace:
+    case mu_itrctl_replace_nd:
+      /* Replace current element */
+      if (!arg)
+       return EINVAL;
+      if (req == mu_itrctl_replace)
+         DESTROY_ITEM (list, ptr);
+      ptr = itr->cur;
+      ptr->item = arg;
+      break;
+      
+    case mu_itrctl_insert:
+      /* Insert new element in the current position */
+      if (!arg)
+       return EINVAL;
+      return _insert_item (list, itr->cur, arg, 0);
+
+    case mu_itrctl_insert_list:
+      /* Insert a list of elements */
+      if (!arg)
+       return EINVAL;
+      else
+       {
+         mu_list_t new_list = arg;
+         _mu_list_insert_sublist (list, itr->cur,
+                                  new_list->head.next, new_list->head.prev,
+                                  new_list->count,
+                                  0);
+         _mu_list_clear (new_list);
+       }
+      break;
+      
+    default:
+      return ENOSYS;
+    }
+  return 0;
+}
+
 int
 mu_list_get_iterator (mu_list_t list, mu_iterator_t *piterator)
 {
@@ -533,7 +655,8 @@ mu_list_get_iterator (mu_list_t list, mu_iterator_t 
*piterator)
   mu_iterator_set_curitem_p (iterator, curitem_p);
   mu_iterator_set_destroy (iterator, destroy);
   mu_iterator_set_dup (iterator, list_data_dup);
-
+  mu_iterator_set_itrctl (iterator, list_itrctl);
+  
   mu_iterator_attach (&list->itr, iterator);
 
   *piterator = iterator;
diff --git a/mailbox/listlist.c b/mailbox/listlist.c
index d566710..af52862 100644
--- a/mailbox/listlist.c
+++ b/mailbox/listlist.c
@@ -62,8 +62,8 @@ _mu_list_insert_sublist (mu_list_t list,
   list->count += count;
 }
 
-static void
-clear_list (mu_list_t list)
+void
+_mu_list_clear (mu_list_t list)
 {
   list->head.next = list->head.prev = &list->head;
   list->count = 0;
@@ -92,7 +92,7 @@ mu_list_insert_list (mu_list_t list, void *item, mu_list_t 
new_list,
                                   new_list->head.next, new_list->head.prev,
                                   new_list->count,
                                   insert_before);
-         clear_list (new_list);
+         _mu_list_clear (new_list);
          status = 0;
          break;
        }
@@ -114,7 +114,7 @@ mu_list_append_list (mu_list_t list, mu_list_t new_list)
                             new_list->head.next, new_list->head.prev,
                             new_list->count,
                             0);
-  clear_list (new_list);
+  _mu_list_clear (new_list);
 }
 
 void
@@ -130,7 +130,7 @@ mu_list_prepend_list (mu_list_t list, mu_list_t new_list)
                             new_list->head.next, new_list->head.prev,
                             new_list->count,
                             1);
-  clear_list (new_list);
+  _mu_list_clear (new_list);
 }
 
 
diff --git a/mailbox/mailbox.c b/mailbox/mailbox.c
index 91c658b..b06fe3d 100644
--- a/mailbox/mailbox.c
+++ b/mailbox/mailbox.c
@@ -681,12 +681,6 @@ mu_mailbox_unlock (mu_mailbox_t mbox)
   return mu_locker_unlock (lock);
 }
 
-static void
-free_uidl (void *item)
-{
-  free (item);
-}
-
 int
 mu_mailbox_get_uidls (mu_mailbox_t mbox, mu_list_t *plist)
 {
@@ -700,7 +694,7 @@ mu_mailbox_get_uidls (mu_mailbox_t mbox, mu_list_t *plist)
   status = mu_list_create (&list);
   if (status)
     return status;
-  mu_list_set_destroy_item (list, free_uidl);
+  mu_list_set_destroy_item (list, mu_list_free_item);
   if (mbox->_get_uidls)
     status = mbox->_get_uidls (mbox, list);
   else
@@ -734,7 +728,7 @@ mu_mailbox_get_uidls (mu_mailbox_t mbox, mu_list_t *plist)
          status = mu_list_append (list, uidl);
          if (status)
            {
-             free_uidl (uidl);
+             free (uidl);
              break;
            }
        }
diff --git a/mailbox/observer.c b/mailbox/observer.c
index d6b26f4..355a4fa 100644
--- a/mailbox/observer.c
+++ b/mailbox/observer.c
@@ -119,6 +119,14 @@ mu_observer_set_flags (mu_observer_t observer, int flags)
   return 0;
 }
 
+static void
+_free_event (void *ptr)
+{
+  event_t event = ptr;
+  mu_observer_destroy (&event->observer, NULL);
+  free (event);
+}
+
 int
 mu_observable_create (mu_observable_t *pobservable, void *owner)
 {
@@ -129,12 +137,13 @@ mu_observable_create (mu_observable_t *pobservable, void 
*owner)
   observable = calloc (sizeof (*observable), 1);
   if (observable == NULL)
     return ENOMEM;
-  status = mu_list_create (&(observable->list));
+  status = mu_list_create (&observable->list);
   if (status != 0 )
     {
       free (observable);
       return status;
     }
+  mu_list_set_destroy_item (observable->list, _free_event);
   observable->owner = owner;
   *pobservable = observable;
   return 0;
@@ -143,31 +152,13 @@ mu_observable_create (mu_observable_t *pobservable, void 
*owner)
 void
 mu_observable_destroy (mu_observable_t *pobservable, void *owner)
 {
-  mu_iterator_t iterator;
   if (pobservable && *pobservable)
     {
       mu_observable_t observable = *pobservable;
       if (observable->owner == owner)
        {
-         int status = mu_list_get_iterator (observable->list, &iterator);
-         if (status == 0)
-           {
-             event_t event = NULL;
-             for (mu_iterator_first (iterator); !mu_iterator_is_done 
(iterator);
-                  mu_iterator_next (iterator))
-               {
-                 event = NULL;
-                 mu_iterator_current (iterator, (void **)&event);
-                 if (event != NULL)
-                   {
-                     mu_observer_destroy (&(event->observer), NULL);
-                     free (event);
-                   }
-               }
-             mu_iterator_destroy (&iterator);
-           }
-         mu_list_destroy (&((*pobservable)->list));
-         free (*pobservable);
+         mu_list_destroy (&observable->list);
+         free (observable);
        }
       *pobservable = NULL;
     }
@@ -198,13 +189,14 @@ mu_observable_detach (mu_observable_t observable, 
mu_observer_t observer)
 {
   mu_iterator_t iterator;
   int status;
-  int found = 0;
   event_t event = NULL;
+
   if (observable == NULL || observer == NULL)
     return EINVAL;
   status = mu_list_get_iterator (observable->list, &iterator);
   if (status != 0)
     return status;
+  status = MU_ERR_NOENT;
   for (mu_iterator_first (iterator); !mu_iterator_is_done (iterator);
        mu_iterator_next (iterator))
     {
@@ -212,18 +204,12 @@ mu_observable_detach (mu_observable_t observable, 
mu_observer_t observer)
       mu_iterator_current (iterator, (void **)&event);
       if (event && event->observer == observer)
         {
-          found = 1;
+          mu_iterator_ctl (iterator, mu_itrctl_delete, NULL);
+         status = 0;
           break;
         }
     }
   mu_iterator_destroy (&iterator);
-  if (found)
-    {
-      status = mu_list_remove (observable->list, event);
-      free (event);
-    }
-  else
-    status = MU_ERR_NOENT;
   return status;
 }
 
diff --git a/mailbox/testsuite/mailbox/list.exp 
b/mailbox/testsuite/mailbox/list.exp
index 062d8e2..56aac99 100644
--- a/mailbox/testsuite/mailbox/list.exp
+++ b/mailbox/testsuite/mailbox/list.exp
@@ -224,6 +224,83 @@ mailbox_prog_test "print" \
     "to" \
     "fem"
 
+mailbox_prog_test "ictl tell" "12"
+
+prompt_text "dos"
+mailbox_prog_test "ictl del"
+
+prompt_text "dos"
+mailbox_prog_test "next"
+
+mailbox_prog_test "print" \
+    "# items: 16" \
+    "1" \
+    "2" \
+    "3" \
+    "4" \
+    "5" \
+    "6" \
+    "zero" \
+    "jeden" \
+    "dwa" \
+    "zero" \
+    "jeden" \
+    "cero" \
+    "dos" \
+    "en" \
+    "to" \
+    "fem"
+
+mailbox_prog_test "ictl ins seis"
+
+mailbox_prog_test "print" \
+    "# items: 17" \
+    "1" \
+    "2" \
+    "3" \
+    "4" \
+    "5" \
+    "6" \
+    "zero" \
+    "jeden" \
+    "dwa" \
+    "zero" \
+    "jeden" \
+    "cero" \
+    "dos" \
+    "seis" \
+    "en" \
+    "to" \
+    "fem"
+
+mailbox_prog_test "ictl ins tres quatro cinco"
+
+mailbox_prog_test "print" \
+    "# items: 20" \
+    "1" \
+    "2" \
+    "3" \
+    "4" \
+    "5" \
+    "6" \
+    "zero" \
+    "jeden" \
+    "dwa" \
+    "zero" \
+    "jeden" \
+    "cero" \
+    "dos" \
+    "tres" \
+    "quatro" \
+    "cinco" \
+    "seis" \
+    "en" \
+    "to" \
+    "fem"
+
+prompt_text "tres"
+mailbox_prog_test "next"
+
 mailbox_prog_send "quit"
 mailbox_prog_stop
 
diff --git a/mh/mh_alias.y b/mh/mh_alias.y
index c6e742b..ca27e8b 100644
--- a/mh/mh_alias.y
+++ b/mh/mh_alias.y
@@ -262,26 +262,6 @@ aliascmp (const char *pattern, const char *name)
   return strcmp (pattern, name);
 }
 
-
-int
-_insert_list (mu_list_t list, void *prev, mu_list_t new_list)
-{
-  mu_iterator_t itr;
-
-  if (mu_list_get_iterator (new_list, &itr))
-    return 1;
-  for (mu_iterator_first (itr); !mu_iterator_is_done (itr); mu_iterator_next 
(itr))
-    {
-      void *item;
-      
-      mu_iterator_current (itr, &item);
-      mu_list_insert (list, prev, item, 0);
-      prev = item;
-    }
-  mu_iterator_destroy (&itr);
-  return 0;
-}
-
 static int mh_alias_get_internal (const char *name, mu_iterator_t start,
                                  mu_list_t *return_list, int *inclusive);
 
@@ -300,9 +280,11 @@ alias_expand_list (mu_list_t name_list, mu_iterator_t 
orig_itr, int *inclusive)
       mu_iterator_current (itr, (void **)&name);
       if (mh_alias_get_internal (name, orig_itr, &exlist, inclusive) == 0)
        {
-         _insert_list (name_list, name, exlist);
-         mu_list_remove (name_list, name);
+         /* Insert exlist after name */
+         mu_iterator_ctl (itr, mu_itrctl_insert_list, exlist);
          mu_list_destroy (&exlist);
+         /* Remove name */
+         mu_iterator_ctl (itr, mu_itrctl_delete, NULL);
        }
     }
   mu_iterator_destroy (&itr);
diff --git a/mh/sortm.c b/mh/sortm.c
index 06482f9..68b95c3 100644
--- a/mh/sortm.c
+++ b/mh/sortm.c
@@ -215,10 +215,14 @@ addop (char *field, compfun comp)
 {
   struct comp_op *op = xmalloc (sizeof (*op));
   
-  if (!oplist && mu_list_create (&oplist))
+  if (!oplist)
     {
-      mu_error (_("can't create operation list"));
-      exit (1);
+      if (mu_list_create (&oplist))
+       {
+         mu_error (_("can't create operation list"));
+         exit (1);
+       }
+      mu_list_set_destroy_item (oplist, mu_list_free_item);
     }
   op->field = field;
   op->comp = comp;
@@ -248,7 +252,6 @@ remop (compfun comp)
   d.op = NULL;
   mu_list_do (oplist, rem_action, &d);
   mu_list_remove (oplist, d.op);
-  free (d.op);
 }
 
 struct comp_data {
diff --git a/movemail/movemail.c b/movemail/movemail.c
index c9ce1e1..d843bb6 100644
--- a/movemail/movemail.c
+++ b/movemail/movemail.c
@@ -731,7 +731,6 @@ main (int argc, char **argv)
       if (rc)
        die (dest, _("cannot get UIDLs"), rc);
 
-      mu_list_set_comparator (src_uidl_list, NULL);
       mu_list_set_comparator (dst_uidl_list, _compare_uidls);
       
       mu_list_get_iterator (src_uidl_list, &itr);
@@ -742,7 +741,7 @@ main (int argc, char **argv)
              
          mu_iterator_current (itr, (void **)&uidl);
          if (mu_list_locate (dst_uidl_list, uidl, NULL) == 0)
-           mu_list_remove (src_uidl_list, uidl);
+           mu_iterator_ctl (itr, mu_itrctl_delete, NULL);
        }
       mu_iterator_destroy (&itr);
       mu_list_destroy (&dst_uidl_list);


hooks/post-receive
-- 
GNU Mailutils




reply via email to

[Prev in Thread] Current Thread [Next in Thread]