commit-mailutils
[Top][All Lists]
Advanced

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

[SCM] GNU Mailutils branch, master, updated. release-2.2-289-g45c0bb9


From: Sergey Poznyakoff
Subject: [SCM] GNU Mailutils branch, master, updated. release-2.2-289-g45c0bb9
Date: Mon, 13 Dec 2010 15:10:49 +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=45c0bb9011bdfb74d77d6ca90481441844612692

The branch, master has been updated
       via  45c0bb9011bdfb74d77d6ca90481441844612692 (commit)
      from  1f1dca416897539ad734149945482fecf6f066e5 (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 45c0bb9011bdfb74d77d6ca90481441844612692
Author: Sergey Poznyakoff <address@hidden>
Date:   Mon Dec 13 17:02:59 2010 +0200

    Remove mu_filter_iconv_create.
    
    Callers should use mu_filter_create_args instead.
    
    * examples/iconv.c: Rewrite using mu_filter_create_args.
    * libmailutils/mime/mimehdr.c (mu_mimehdr_decode_param): Use 
mu_decode_filter.
    
    * imap4d/imap4d.h: Include prog.h
    * include/mailutils/filter.h (mu_filter_iconv_create): Mark as deprecated.
    * include/mailutils/util.h (mu_decode_filter_args): New proto.
    * libmailutils/base/msgid.c (mu_rfc2822_in_reply_to): Silence a
    cast warning.
    * libmailutils/tests/wicket.c (match_string): Likewise.
    * libmailutils/filter/decode.c (mu_decode_filter_args): New function.
    (mu_decode_filter): Rewrite as an alternative entry point to
    mu_decode_filter_args.
    * ibmailutils/filter/filter_iconv.c: Remove.
    * libmailutils/filter/Makefile.am (libfilter_la_SOURCES): Remove
    filter_iconv.c
    * libmu_compat/filter_iconv.c: New file.
    * libmu_compat/Makefile.am (libmu_compat_la_SOURCES): Add filter_iconv.c
    
    * libmailutils/filter/iconvflt.c (_icvt_decoder): Set errcode
    before returning failure.
    
    * libmailutils/stream/fltstream.c (init_iobuf, filter_stream_init): Provide
    a default value for io->errcode.

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

Summary of changes:
 examples/iconv.c                                   |   35 +-
 imap4d/imap4d.h                                    |    1 +
 include/mailutils/filter.h                         |    5 +-
 include/mailutils/util.h                           |    4 +
 libmailutils/base/msgid.c                          |    2 +-
 libmailutils/filter/Makefile.am                    |    1 -
 libmailutils/filter/decode.c                       |   59 ++-
 libmailutils/filter/filter_iconv.c                 |  486 --------------------
 libmailutils/filter/iconvflt.c                     |    2 +
 libmailutils/mime/mimehdr.c                        |    7 +-
 libmailutils/stream/fltstream.c                    |    3 +-
 libmailutils/tests/wicket.c                        |    2 +-
 libmu_compat/Makefile.am                           |    1 +
 .../hdrfirst.c => libmu_compat/filter_iconv.c      |   43 +-
 po/POTFILES.in                                     |    2 -
 15 files changed, 95 insertions(+), 558 deletions(-)
 delete mode 100644 libmailutils/filter/filter_iconv.c
 copy libmailutils/mailbox/hdrfirst.c => libmu_compat/filter_iconv.c (58%)

diff --git a/examples/iconv.c b/examples/iconv.c
index 6a03349..1e3195f 100644
--- a/examples/iconv.c
+++ b/examples/iconv.c
@@ -28,35 +28,32 @@
 int
 main (int argc, char **argv)
 {
-  int rc;
+  int i;
   mu_stream_t in, out;
   mu_stream_t cvt;
-  size_t  size;
-  char buffer[80];
+  const char *args[5] = { "iconv" };
   
-  if (argc != 3)
+  if (argc < 3 || argc > 4)
     {
-      fprintf (stderr, "usage: %s from-code to-code\n", argv[0]);
+      fprintf (stderr, "usage: %s from-code to-code [err]\n", argv[0]);
       return 1;
     }
 
   MU_ASSERT (mu_stdio_stream_create (&in, MU_STDIN_FD, 0));
-  MU_ASSERT (mu_filter_iconv_create (&cvt, in, argv[1], argv[2], 
-                                     0, mu_fallback_none));
+  args[1] = argv[1];
+  args[2] = argv[2];
+  i = 3;
+  if (argc == 4)
+    args[i++] = argv[3];
+  args[i] = NULL;
   
+  MU_ASSERT (mu_filter_create_args (&cvt, in, args[0], i, args,
+                                   MU_FILTER_DECODE,
+                                   MU_FILTER_READ));
+  mu_stream_unref (in);
   MU_ASSERT (mu_stdio_stream_create (&out, MU_STDOUT_FD, 0));
-
-  while ((rc = mu_stream_read (cvt, buffer, sizeof (buffer), &size)) == 0
-        && size > 0)
-    {
-      mu_stream_write (out, buffer, size, NULL);
-    }
+  MU_ASSERT (mu_stream_copy (out, cvt, 0, NULL));
+  mu_stream_unref (cvt);
   mu_stream_flush (out);
-  if (rc)
-    {
-      fprintf (stderr, "error: %s / %s\n",
-              mu_stream_strerror (cvt, rc),
-              mu_strerror (rc));
-    }
   return 0;
 }
diff --git a/imap4d/imap4d.h b/imap4d/imap4d.h
index 9c27300..5026812 100644
--- a/imap4d/imap4d.h
+++ b/imap4d/imap4d.h
@@ -104,6 +104,7 @@
 #include <mailutils/cctype.h>
 #include <mailutils/cstr.h>
 #include <mailutils/io.h>
+#include <mailutils/prog.h>
 
 #include <mu_umaxtostr.h>
 #include <muaux.h>
diff --git a/include/mailutils/filter.h b/include/mailutils/filter.h
index b44964f..4649968 100644
--- a/include/mailutils/filter.h
+++ b/include/mailutils/filter.h
@@ -132,8 +132,9 @@ enum mu_iconv_fallback_mode
 extern int mu_filter_iconv_create (mu_stream_t *s, mu_stream_t transport,
                                   const char *fromcode, const char *tocode,
                                   int flags,
-                                  enum mu_iconv_fallback_mode fallback_mode);
-
+                                  enum mu_iconv_fallback_mode fallback_mode)
+                                   MU_DEPRECATED;
+  
 
 extern int mu_linelen_filter_create (mu_stream_t *pstream, mu_stream_t stream,
                                     size_t limit, int flags);
diff --git a/include/mailutils/util.h b/include/mailutils/util.h
index e020dcc..63503c5 100644
--- a/include/mailutils/util.h
+++ b/include/mailutils/util.h
@@ -152,6 +152,10 @@ int mu_rfc2822_in_reply_to (mu_message_t msg, char **pstr);
 int mu_decode_filter (mu_stream_t *pfilter, mu_stream_t input,
                      const char *filter_type,
                      const char *fromcode, const char *tocode);
+int mu_decode_filter_args (mu_stream_t *pfilter, mu_stream_t input,
+                          const char *filter_name,
+                          int argc, const char **argv,
+                          const char *fromcode, const char *tocode);
 
 extern enum mu_iconv_fallback_mode mu_default_fallback_mode;
 int mu_set_default_fallback (const char *str);
diff --git a/libmailutils/base/msgid.c b/libmailutils/base/msgid.c
index 84f055b..c0731aa 100644
--- a/libmailutils/base/msgid.c
+++ b/libmailutils/base/msgid.c
@@ -202,7 +202,7 @@ mu_rfc2822_in_reply_to (mu_message_t msg, char **pstr)
     }
 
   if (idx > 1)
-    rc = mu_argcv_join (idx, argv, "", mu_argcv_escape_no, pstr);
+    rc = mu_argcv_join (idx, (char**) argv, "", mu_argcv_escape_no, pstr);
   else
     rc = MU_ERR_FAILURE;
   return rc;
diff --git a/libmailutils/filter/Makefile.am b/libmailutils/filter/Makefile.am
index 9f0924e..c60239e 100644
--- a/libmailutils/filter/Makefile.am
+++ b/libmailutils/filter/Makefile.am
@@ -25,7 +25,6 @@ libfilter_la_SOURCES =\
  decode.c\
  dot.c\
  filter.c\
- filter_iconv.c\
  fltchain.c\
  fromflt.c\
  header.c\
diff --git a/libmailutils/filter/decode.c b/libmailutils/filter/decode.c
index 56e7a59..9d39567 100644
--- a/libmailutils/filter/decode.c
+++ b/libmailutils/filter/decode.c
@@ -21,6 +21,7 @@
 #endif
 
 #include <unistd.h>
+#include <stdlib.h>
 #include <string.h>
 #include <errno.h>
 #include <mailutils/stream.h>
@@ -44,30 +45,46 @@ mu_set_default_fallback (const char *str)
 }
 
 int
-mu_decode_filter (mu_stream_t *pfilter, mu_stream_t input,
-                 const char *filter_type,
-                 const char *fromcode, const char *tocode)
+mu_decode_filter_args (mu_stream_t *pfilter, mu_stream_t input,
+                      const char *filter_name, int argc, const char **argv,
+                      const char *fromcode, const char *tocode)
 {
-  mu_stream_t filter;
+  int xargc, i;
+  char **xargv;
+  int rc;
   
-  int status = mu_filter_create (&filter, input, filter_type,
-                                MU_FILTER_DECODE, MU_STREAM_READ);
-  if (status)
-    return status;
+  xargc = argc + 5;
+  xargv = calloc (xargc + 1, sizeof (xargv[0]));
+  if (!xargv)
+    return ENOMEM;
 
-  if (fromcode && tocode && mu_c_strcasecmp (fromcode, tocode))
-    {
-      mu_stream_t cvt;
+  i = 0;
+  if (filter_name)
+    xargv[i++] = (char*) filter_name;
+  for (; i < argc; i++)
+    xargv[i] = (char*) argv[i];
 
-      status = mu_filter_iconv_create (&cvt, filter, fromcode, tocode,
-                                      0, mu_default_fallback_mode);
-      if (status == 0)
-       {
-          mu_stream_unref (filter);
-          filter = cvt;
-       }
-    }
-  *pfilter = filter;
-  return 0;
+  if (i)
+    xargv[i++] = "+";
+  xargv[i++] = "ICONV";
+  xargv[i++] = (char*) fromcode;
+  xargv[i++] = (char*) tocode;
+  xargv[i] = NULL;
+
+  rc = mu_filter_chain_create (pfilter, input,
+                              MU_FILTER_DECODE, MU_STREAM_READ,
+                              xargc, xargv);
+  free (xargv);
+  return rc;
+}
+
+
+int
+mu_decode_filter (mu_stream_t *pfilter, mu_stream_t input,
+                 const char *filter_name,
+                 const char *fromcode, const char *tocode)
+{
+  return mu_decode_filter_args (pfilter, input, filter_name, 0, NULL,
+                               fromcode, tocode);
 }
 
diff --git a/libmailutils/filter/filter_iconv.c 
b/libmailutils/filter/filter_iconv.c
deleted file mode 100644
index ae39370..0000000
--- a/libmailutils/filter/filter_iconv.c
+++ /dev/null
@@ -1,486 +0,0 @@
-/* GNU Mailutils -- a suite of utilities for electronic mail
-   Copyright (C) 2004, 2005, 2007, 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
-   License as published by the Free Software Foundation; either
-   version 3 of the License, or (at your option) any later version.
-
-   This library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General
-   Public License along with this library.  If not, see
-   <http://www.gnu.org/licenses/>. */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include <unistd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <mailutils/stream.h>
-#include <mailutils/sys/stream.h>
-#include <mailutils/filter.h>
-#include <mailutils/errno.h>
-#include <mailutils/nls.h>
-
-#ifdef HAVE_ICONV_H
-# include <iconv.h>
-#endif
-
-#ifndef ICONV_CONST
-# define ICONV_CONST
-#endif
-
-#ifndef HAVE_ICONV
-# undef iconv_open
-# define iconv_open(tocode, fromcode) ((iconv_t) -1)
-
-# undef iconv
-# define iconv(cd, inbuf, inbytesleft, outbuf, outbytesleft) (errno = EILSEQ, 
(size_t) -1)
-
-# undef iconv_close
-# define iconv_close(cd) 0
-
-#endif 
-
-enum _icvt_state
-  {
-    state_closed,           /* Filter is closed */
-    state_open,             /* Filter is open and running in conversion mode */
-    state_copy_pass,        /* Filter is open and running in copy-pass mode */
-    state_copy_octal,       /* Filter is open and running in copy-octal mode */
-    state_iconv_error,      /* A fatal iconv error has occurred */
-    state_transport_error   /* A fatal transport error has occurred */
-  };
-
-struct icvt_stream
-{
-  struct _mu_stream stream;
-  mu_stream_t transport;/* I/O stream */
-  int fallback_mode;
-  iconv_t cd;           /* Conversion descriptor */
-  char *buf;            /* Conversion buffer */
-  size_t bufsize;       /* Size of buf */
-  size_t bufpos;        /* Current position in buf */
-  enum _icvt_state state;
-  int ec;               /* Error code */
-  char errbuf[128];     /* Error message buffer */
-};
-
-static int
-_icvt_open (mu_stream_t stream)
-{
-  struct icvt_stream *s = (struct icvt_stream *)stream;
-  if (s->cd == (iconv_t) -1)
-    return EINVAL;
-  s->state = state_open;
-  return 0;
-}
-
-static int
-_icvt_close (mu_stream_t stream)
-{
-  struct icvt_stream *s = (struct icvt_stream *)stream;
-  if (s->state != state_closed)
-    {
-      mu_stream_close (s->transport);
-      iconv_close (s->cd);
-      s->cd = (iconv_t) -1;
-      s->state = state_closed;
-    }
-  return 0;
-}
-
-static void
-_icvt_done (mu_stream_t stream)
-{
-  struct icvt_stream *s = (struct icvt_stream *)stream;
-
-  if (s->state != state_closed)
-    _icvt_close (stream);
-  mu_stream_destroy (&s->transport);
-  free (s->buf);
-}
-
-static int _icvt_read (mu_stream_t stream, char *optr, size_t osize,
-                      size_t *pnbytes);
-
-static int
-internal_icvt_read (mu_stream_t stream, char *optr, size_t osize,
-                   size_t *pnbytes)
-{
-  struct icvt_stream *s = (struct icvt_stream *)stream;
-  size_t nbytes = 0;
-  int rc, status = 0;
-  char *ob = optr;
-  size_t olen = osize;
-
-  if (s->bufpos == 0)
-    {
-      status = mu_stream_read (s->transport, s->buf, s->bufsize, &nbytes);
-      if (status)
-       {
-         s->state = state_transport_error;
-         s->ec = rc;
-         return MU_ERR_FAILURE;
-       }
-      else if (nbytes == 0)
-       {
-         if (pnbytes)
-           *pnbytes = 0;
-         return 0;
-       }
-    }
-  
-  do
-    {
-      char ICONV_CONST *ib = s->buf;
-      size_t inlen = s->bufpos + nbytes;
-      
-      rc = iconv (s->cd, &ib, &inlen, &ob, &olen);
-      if (ib > s->buf)
-       {
-         memmove (s->buf, ib, inlen);
-         s->bufpos = inlen;
-       }
-      else
-       s->bufpos += nbytes;
-      
-      if (rc == -1)
-       {
-         if (errno == E2BIG)
-           {
-             if (ob > optr)
-               break;
-             else
-               {
-                 s->ec = MU_ERR_BUFSPACE;
-                 return MU_ERR_BUFSPACE;
-               }
-           }
-         else if (errno == EILSEQ)
-           {
-             switch (s->fallback_mode)
-               {
-               case mu_fallback_none:
-                 s->state = state_iconv_error;
-                 s->ec = errno;
-                 if (ob == optr)
-                   return MU_ERR_FAILURE;
-                 break;
-
-               case mu_fallback_copy_pass:
-                 s->state = state_copy_pass;
-                 if (ob == optr)
-                   return _icvt_read (stream, optr, osize, pnbytes);
-                 break;
-                 
-               case mu_fallback_copy_octal:
-                 s->state = state_copy_octal;
-                 if (ob == optr)
-                   return _icvt_read (stream, optr, osize, pnbytes);
-                 break;
-               }
-           }
-         else if (errno == EINVAL)
-           {
-             if (inlen == s->bufsize)
-               {
-                 /* Try to reallocate temp buffer */
-                 char *p = realloc (s->buf, s->bufsize + 128);
-                 if (!p)
-                   return ENOMEM;
-                 s->buf = p;
-                 s->bufsize += 128;
-               }
-             continue;
-           }
-         else
-           {
-             s->ec = errno;
-             s->state = state_iconv_error;
-             return MU_ERR_FAILURE;
-           }
-       }
-    }
-  while (olen > 0 
-        && (status = mu_stream_read (s->transport,
-                                     s->buf + s->bufpos,
-                                     s->bufsize - s->bufpos,
-                                     &nbytes)) == 0
-        && nbytes);
-
-  if (status)
-    {
-      s->state = state_transport_error;
-      s->ec = status;
-      if (ob == optr)
-       return MU_ERR_FAILURE;
-    }
-      
-  if (pnbytes)
-    *pnbytes = ob - optr;
-  return 0;
-}
-
-#define ISPRINT(c) (((c)>=' '&&(c)<127)||(c)=='\n')
-
-static int
-copy_octal (struct icvt_stream *s, char *optr, size_t osize, size_t *pnbytes)
-{
-  size_t i, j;
-  int status;
-  
-  if (osize == 0)
-    return MU_ERR_BUFSPACE;
-  
-  if (s->bufpos < osize)
-    {
-      size_t rdcount = osize;
-      if (s->bufsize < rdcount)
-       {
-         /* Try to reallocate temp buffer */
-         char *p = realloc (s->buf, rdcount);
-         if (p)
-           {
-             s->bufsize = rdcount;
-             s->buf = p;
-           }
-         else
-           rdcount = s->bufsize;
-       }
-
-      status = mu_stream_read (s->transport,
-                              s->buf + s->bufpos,
-                              rdcount - s->bufpos,
-                              &rdcount);
-      if (status)
-       {
-         s->state = state_transport_error;
-         s->ec = status;
-         if (s->bufpos == 0)
-           return MU_ERR_FAILURE;
-       }
-      else
-       s->bufpos += rdcount;
-    }
-  
-  for (i = j = 0; j < osize && i < s->bufpos; i++)
-    {
-      if (ISPRINT (*(unsigned char*)(s->buf+i)))
-       optr[j++] = s->buf[i];
-      else if (j + 4 >= osize)
-       break;
-      else
-       {
-         sprintf (optr + j, "\\%03o", *(unsigned char*)(s->buf+i));
-         j += 4;
-       }
-    }
-  s->bufpos -= i;
-  memmove (s->buf, s->buf + i, s->bufpos);
-  if (pnbytes)
-    *pnbytes = j;
-  return 0;
-}
-
-static int
-copy_pass (struct icvt_stream *s, char *optr, size_t osize, size_t *pnbytes)
-{
-  int status;
-  size_t nbytes;
-  
-  if (s->bufpos)
-    {
-      size_t sz = s->bufpos < osize ? s->bufpos : osize;
-      memcpy (optr, s->buf, sz);
-      s->bufpos -= sz;
-      if (s->bufpos)
-       memmove (s->buf, s->buf + sz, s->bufpos);
-      if (pnbytes)
-       *pnbytes = sz;
-      return 0;
-    }
-
-  status = mu_stream_read (s->transport, optr, osize, &nbytes);
-  if (status)
-    {
-      s->state = state_transport_error;
-      s->ec = status;
-      if (s->bufpos == 0)
-       return MU_ERR_FAILURE;
-    }
-  if (pnbytes)
-    *pnbytes = nbytes;
-  return 0;
-}
-
-static int
-_icvt_read (mu_stream_t stream, char *optr, size_t osize, size_t *pnbytes)
-{
-  struct icvt_stream *s = (struct icvt_stream *)stream;
-
-  switch (s->state)
-    {
-    case state_open:
-      return internal_icvt_read (stream, optr, osize, pnbytes);
-      
-    case state_closed:
-      return EINVAL;
-      
-    case state_copy_pass:
-      return copy_pass (s, optr, osize, pnbytes);
-      
-    case state_copy_octal:
-      return copy_octal (s, optr, osize, pnbytes);
-       
-    default:
-      break;
-    }
-  return MU_ERR_FAILURE;
-}
-
-const char *
-_icvt_strerror (mu_stream_t stream, int rc)
-{
-  struct icvt_stream *s = (struct icvt_stream *)stream;
-
-  switch (s->state)
-    {
-    case state_transport_error:
-      snprintf (s->errbuf, sizeof s->errbuf,
-               _("Transport error: %s"), mu_strerror (s->ec));
-      break;
-
-    case state_iconv_error:
-      switch (s->ec)
-       {
-       case EILSEQ:
-         snprintf (s->errbuf, sizeof s->errbuf,
-                   _("Illegal multibyte sequence near %*.*s"),
-                   (int) s->bufpos, (int) s->bufpos, s->buf);
-         break;
-
-       default:
-         snprintf (s->errbuf, sizeof s->errbuf,
-                   _("Iconv error: %s"), mu_strerror (s->ec));
-       }
-      break;
-
-    case state_closed:
-      return _("Stream is closed"); 
-      
-    default:
-      return mu_strerror (s->ec);
-    }
-  
-  return s->errbuf;
-}
-
-static int
-_icvt_ioctl (mu_stream_t stream, int code, int opcode, void *ptr)
-{
-  struct icvt_stream *s = (struct icvt_stream *)stream;
-  mu_transport_t *ptrans;
-  
-  switch (code)
-    {
-    case MU_IOCTL_TRANSPORT:
-      if (!ptr)
-       return EINVAL;
-      switch (opcode)
-       {
-       case MU_IOCTL_OP_GET:
-         ptrans = ptr;
-         ptrans[0] = (mu_transport_t) s->transport;
-         ptrans[1] = NULL;
-         break;
-
-       default:
-         return ENOSYS;
-       }
-      break;
-
-    case MU_IOCTL_SUBSTREAM:
-    case MU_IOCTL_TRANSPORT_BUFFER:
-      return mu_stream_ioctl (s->transport, code, opcode, ptr);
-      
-    default:
-      return ENOSYS;
-    }
-  return 0;
-}
-
-int
-_icvt_wait (mu_stream_t stream, int *pflags, struct timeval *tvp)
-{
-  struct icvt_stream *s = (struct icvt_stream *)stream;
-  return mu_stream_wait (s->transport, pflags, tvp);
-}
-
-/* FIXME: Seeks in the *transport* stream. */
-int
-_icvt_seek (mu_stream_t stream, mu_off_t off, mu_off_t *presult)
-{
-  struct icvt_stream *s = (struct icvt_stream *)stream;
-  return mu_stream_seek (s->transport, off, MU_SEEK_SET, presult);
-}
-
-int
-mu_filter_iconv_create (mu_stream_t *s, mu_stream_t transport,
-                       const char *fromcode, const char *tocode, int flags,
-                       enum mu_iconv_fallback_mode fallback_mode)
-{
-  struct icvt_stream *iptr;
-  iconv_t cd;
-  int rc;
-  mu_stream_t stream;
-    
-  cd = iconv_open (tocode, fromcode);
-  if (cd == (iconv_t) -1)
-    return MU_ERR_FAILURE;
-
-  iptr = (struct icvt_stream *) _mu_stream_create (sizeof (*iptr), flags);
-  if (!iptr)
-    {
-      iconv_close (cd);
-      return ENOMEM;
-    }
-  
-  mu_stream_ref (transport);
-  iptr->transport = transport;
-  iptr->fallback_mode = fallback_mode;
-  iptr->cd = cd;
-  iptr->state = state_closed;
-  iptr->bufsize = 128;
-  iptr->buf = malloc (iptr->bufsize);
-  if (!iptr->buf)
-    {
-      free (iptr);
-      return ENOMEM;
-    }
-  iptr->bufpos = 0;
-  
-  iptr->stream.open = _icvt_open;
-  iptr->stream.close = _icvt_close;
-  iptr->stream.read = _icvt_read;
-  iptr->stream.done = _icvt_done;
-  iptr->stream.error_string = _icvt_strerror;
-  iptr->stream.ctl = _icvt_ioctl;
-  iptr->stream.wait = _icvt_wait;
-  iptr->stream.seek = _icvt_seek;
-  iptr->stream.flags = MU_STREAM_READ | MU_STREAM_SEEK;
-  stream = (mu_stream_t)iptr;
-  rc = mu_stream_open (stream);
-  if (rc)
-    mu_stream_destroy (&stream);
-  else
-    *s = stream;
-  return 0;
-}
diff --git a/libmailutils/filter/iconvflt.c b/libmailutils/filter/iconvflt.c
index 54458f1..fbd3066 100644
--- a/libmailutils/filter/iconvflt.c
+++ b/libmailutils/filter/iconvflt.c
@@ -147,6 +147,7 @@ _icvt_decoder (void *xd,
          switch (_icvt->fallback_mode)
            {
            case mu_fallback_none:
+             iobuf->errcode = EILSEQ;
              return mu_filter_failure;
              
            case mu_fallback_copy_pass:
@@ -181,6 +182,7 @@ _icvt_decoder (void *xd,
          break;
              
        default:
+         iobuf->errcode = errno;
          return mu_filter_failure;
        }
     }
diff --git a/libmailutils/mime/mimehdr.c b/libmailutils/mime/mimehdr.c
index 21da8a8..ae47503 100644
--- a/libmailutils/mime/mimehdr.c
+++ b/libmailutils/mime/mimehdr.c
@@ -514,10 +514,9 @@ mu_mimehdr_decode_param (const char *value, int flags,
                  rc = mu_memory_stream_create (&outstr, 0);
                  if (rc)
                    break;
-                 
-                 rc = mu_filter_iconv_create (&cvt, instr, source_cs, charset,
-                                              0,
-                                              mu_default_fallback_mode);
+
+                 rc = mu_decode_filter (&cvt, instr, NULL,
+                                        source_cs, charset);
                  if (rc)
                    break;
                  
diff --git a/libmailutils/stream/fltstream.c b/libmailutils/stream/fltstream.c
index 8160d31..edfed3b 100644
--- a/libmailutils/stream/fltstream.c
+++ b/libmailutils/stream/fltstream.c
@@ -49,7 +49,7 @@ init_iobuf (struct mu_filter_io *io, struct _mu_filter_stream 
*fs)
   io->isize = MFB_RDBYTES (fs->inbuf);
   io->output = MFB_ENDPTR (fs->outbuf);
   io->osize = MFB_FREESIZE (fs->outbuf);
-  io->errcode = 0;
+  io->errcode = MU_ERR_FAILURE;
   io->eof = 0;
 }
 
@@ -60,6 +60,7 @@ filter_stream_init (struct _mu_filter_stream *fs)
     {
       struct mu_filter_io iobuf;
       memset (&iobuf, 0, sizeof (iobuf));
+      iobuf.errcode = MU_ERR_FAILURE;
       if (fs->xcode (fs->xdata, mu_filter_init, &iobuf) == mu_filter_failure)
        return iobuf.errcode;
     }
diff --git a/libmailutils/tests/wicket.c b/libmailutils/tests/wicket.c
index 7d0ea60..f7eb819 100644
--- a/libmailutils/tests/wicket.c
+++ b/libmailutils/tests/wicket.c
@@ -39,7 +39,7 @@ match_string (const char *str)
       return;
     }
   MU_ASSERT (mu_stream_seek (stream, 0, MU_SEEK_SET, NULL));
-  loc.mu_file = name;
+  loc.mu_file = (char*)name;
   loc.mu_line = 0;
   loc.mu_col = 0;
   rc = mu_wicket_stream_match_url (stream, &loc, u, MU_URL_PARSE_ALL, &url);
diff --git a/libmu_compat/Makefile.am b/libmu_compat/Makefile.am
index c555908..fffa99f 100644
--- a/libmu_compat/Makefile.am
+++ b/libmu_compat/Makefile.am
@@ -19,6 +19,7 @@ lib_LTLIBRARIES = libmu_compat.la
 
 libmu_compat_la_SOURCES = \
  argcv.c\
+ filter_iconv.c\
  vartab.c
 
 INCLUDES = @MU_LIB_COMMON_INCLUDES@ -I/libmailutils
diff --git a/libmailutils/mailbox/hdrfirst.c b/libmu_compat/filter_iconv.c
similarity index 58%
copy from libmailutils/mailbox/hdrfirst.c
copy to libmu_compat/filter_iconv.c
index 363021f..a0aa628 100644
--- a/libmailutils/mailbox/hdrfirst.c
+++ b/libmu_compat/filter_iconv.c
@@ -18,31 +18,34 @@
 #ifdef HAVE_CONFIG_H
 # include <config.h>
 #endif
-
 #include <stdlib.h>
 #include <mailutils/types.h>
-#include <mailutils/header.h>
-#include <mailutils/errno.h>
+#include <mailutils/stream.h>
+#include <mailutils/filter.h>
 
 int
-mu_header_sget_firstof (mu_header_t hdr, char **names,
-                       const char **pval, int *pidx)
+mu_filter_iconv_create (mu_stream_t *s, mu_stream_t transport,
+                       const char *fromcode, const char *tocode, int flags,
+                       enum mu_iconv_fallback_mode fallback_mode)
 {
-  int status;
-  const char *s = NULL;
-  int i;
-  
-  for (i = 0; names[i]; i++)
+  const char *argv[] = { "iconv", fromcode, tocode, NULL, NULL };
+
+  switch (fallback_mode)
     {
-      status = mu_header_sget_value (hdr, names[i], &s);
-      if (status == 0 && *s != 0)
-       {
-         if (pval)
-           *pval = s;
-         if (pidx)
-           *pidx = i;
-         return 0;
-       }
+    case mu_fallback_none:
+      argv[3] = "none";
+      break;
+      
+    case mu_fallback_copy_pass:
+      argv[3] = "copy-pass";
+      break;
+      
+    case mu_fallback_copy_octal:
+      argv[3] = "copy-octal";
     }
-  return MU_ERR_NOENT;
+
+  return mu_filter_create_args (s, transport, "iconv", 4, argv,
+                               MU_FILTER_DECODE,  MU_FILTER_READ);
 }
+
+  
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 3099cf3..ddb2b8a 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -135,8 +135,6 @@ libmailutils/stream/file_stream.c
 libmailutils/stream/prog_stream.c
 libmailutils/stream/logstream.c
 
-libmailutils/filter/filter_iconv.c
-
 libmailutils/server/ipsrv.c
 libmailutils/server/msrv.c
 


hooks/post-receive
-- 
GNU Mailutils



reply via email to

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