bug-mailutils
[Top][All Lists]
Advanced

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

Re: [bug-mailutils] update GnuTLS usage


From: Sergey Poznyakoff
Subject: Re: [bug-mailutils] update GnuTLS usage
Date: Fri, 23 Mar 2012 16:56:33 +0200

Sergey Poznyakoff <address@hidden> ha escrit:

> I will provide a better alternative in the short run.

Here it goes attached.  Please give it a try and let me know if it works
for you.

Regards,
Sergey

>From 9f9d7b0b7cdb586b34ff08bfa7c752d05088a720 Mon Sep 17 00:00:00 2001
From: Sergey Poznyakoff <address@hidden>
Date: Fri, 23 Mar 2012 16:52:33 +0200
Subject: [PATCH] Fix semantics of MU_IOCTL_SUBSTREAM.

This also fixes e75e9123, which broke TLS support in daemons.

* include/mailutils/stream.h (MU_IOCTL_TOPSTREAM): New ioctl.
* imap4d/imap4d.c (set_strerr_flt)
(clr_strerr_flt): Use MU_IOCTL_TOPSTREAM.
* pop3d/pop3d.c: Likewise.
* libmailutils/stream/fltstream.c (filter_ctl): Handle both
MU_IOCTL_SUBSTREAM and MU_IOCTL_TOPSTREAM.
* libmailutils/stream/iostream.c (_iostream_ctl): Likewise.
* libmailutils/stream/logstream.c (_log_ctl): Likewise.
* libmailutils/stream/xscript-stream.c (_xscript_ctl): Likewise.
---
 imap4d/imap4d.c                      |   10 +++++-----
 include/mailutils/stream.h           |    4 ++++
 libmailutils/stream/fltstream.c      |   10 +++++++++-
 libmailutils/stream/iostream.c       |    1 +
 libmailutils/stream/logstream.c      |    8 ++++++++
 libmailutils/stream/xscript-stream.c |    7 +++++++
 pop3d/pop3d.c                        |   10 +++++-----
 7 files changed, 39 insertions(+), 11 deletions(-)

diff --git a/imap4d/imap4d.c b/imap4d/imap4d.c
index 03af348..98957c5 100644
--- a/imap4d/imap4d.c
+++ b/imap4d/imap4d.c
@@ -415,7 +415,7 @@ set_strerr_flt ()
   mu_stream_t flt, trans[2];
   int rc;

-  rc = mu_stream_ioctl (mu_strerr, MU_IOCTL_SUBSTREAM, MU_IOCTL_OP_GET, trans);
+  rc = mu_stream_ioctl (mu_strerr, MU_IOCTL_TOPSTREAM, MU_IOCTL_OP_GET, trans);
   if (rc == 0)
     {
       char sessidstr[10];
@@ -432,7 +432,7 @@ set_strerr_flt ()
          mu_stream_set_buffer (flt, mu_buffer_line, 0);
          trans[0] = flt;
          trans[1] = NULL;
-         rc = mu_stream_ioctl (mu_strerr, MU_IOCTL_SUBSTREAM,
+         rc = mu_stream_ioctl (mu_strerr, MU_IOCTL_TOPSTREAM,
                                MU_IOCTL_OP_SET, trans);
          mu_stream_unref (trans[0]);
          if (rc)
@@ -456,16 +456,16 @@ clr_strerr_flt ()
   mu_stream_t flt, trans[2];
   int rc;

-  rc = mu_stream_ioctl (mu_strerr, MU_IOCTL_SUBSTREAM, MU_IOCTL_OP_GET, trans);
+  rc = mu_stream_ioctl (mu_strerr, MU_IOCTL_TOPSTREAM, MU_IOCTL_OP_GET, trans);
   if (rc == 0)
     {
       flt = trans[0];

-      rc = mu_stream_ioctl (flt, MU_IOCTL_SUBSTREAM, MU_IOCTL_OP_GET, trans);
+      rc = mu_stream_ioctl (flt, MU_IOCTL_TOPSTREAM, MU_IOCTL_OP_GET, trans);
       if (rc == 0)
        {
          mu_stream_unref (trans[0]);
-         rc = mu_stream_ioctl (mu_strerr, MU_IOCTL_SUBSTREAM,
+         rc = mu_stream_ioctl (mu_strerr, MU_IOCTL_TOPSTREAM,
                                MU_IOCTL_OP_SET, trans);
          if (rc == 0)
            mu_stream_unref (flt);
diff --git a/include/mailutils/stream.h b/include/mailutils/stream.h
index b0bdc4f..bbf9ec3 100644
--- a/include/mailutils/stream.h
+++ b/include/mailutils/stream.h
@@ -73,6 +73,10 @@ enum mu_buffer_type
 #define MU_IOCTL_FD               9 /* File descriptor manipulation */
 #define MU_IOCTL_SYSLOGSTREAM    10 /* Syslog stream (see below) */
 #define MU_IOCTL_FILTER          11 /* Filter streams (see below) */
+#define MU_IOCTL_TOPSTREAM       12 /* Same as MU_IOCTL_SUBSTREAM, but
+                                      always returns the topmost substream
+                                   */

   /* Opcodes common for various families */
 #define MU_IOCTL_OP_GET 0
diff --git a/libmailutils/stream/fltstream.c b/libmailutils/stream/fltstream.c
index 8b26d27..9a8e4b5 100644
--- a/libmailutils/stream/fltstream.c
+++ b/libmailutils/stream/fltstream.c
@@ -398,7 +398,8 @@ static int
 filter_ctl (struct _mu_stream *stream, int code, int opcode, void *ptr)
 {
   struct _mu_filter_stream *fs = (struct _mu_filter_stream *)stream;
-
+  int status;
+
   switch (code)
     {
     case MU_IOCTL_FILTER:
@@ -423,6 +424,13 @@ filter_ctl (struct _mu_stream *stream, int code, int 
opcode, void *ptr)
       break;

     case MU_IOCTL_SUBSTREAM:
+      if (fs->transport &&
+          ((status = mu_stream_ioctl (fs->transport, code, opcode, ptr)) == 0
+          || status != ENOSYS))
+        return status;
+      /* fall through */
+
+    case MU_IOCTL_TOPSTREAM:
       if (!ptr)
        return EINVAL;
       else
diff --git a/libmailutils/stream/iostream.c b/libmailutils/stream/iostream.c
index 753cdc0..4eb0a80 100644
--- a/libmailutils/stream/iostream.c
+++ b/libmailutils/stream/iostream.c
@@ -159,6 +159,7 @@ _iostream_ctl (struct _mu_stream *str, int code, int 
opcode, void *arg)
       break;

     case MU_IOCTL_SUBSTREAM:
+    case MU_IOCTL_TOPSTREAM:
       if (!arg)
        return EINVAL;
       else
diff --git a/libmailutils/stream/logstream.c b/libmailutils/stream/logstream.c
index 3bcc684..81b9f65 100644
--- a/libmailutils/stream/logstream.c
+++ b/libmailutils/stream/logstream.c
@@ -281,6 +281,7 @@ static int
 _log_ctl (struct _mu_stream *str, int code, int opcode, void *arg)
 {
   struct _mu_log_stream *sp = (struct _mu_log_stream *)str;
+  int status;

   switch (code)
     {
@@ -310,6 +311,13 @@ _log_ctl (struct _mu_stream *str, int code, int opcode, 
void *arg)
       break;

     case MU_IOCTL_SUBSTREAM:
+      if (sp->transport &&
+          ((status = mu_stream_ioctl (sp->transport, code, opcode, arg)) == 0 
||
+           status != ENOSYS))
+        return status;
+      /* fall through */
+
+    case MU_IOCTL_TOPSTREAM:
       if (!arg)
        return EINVAL;
       else
diff --git a/libmailutils/stream/xscript-stream.c 
b/libmailutils/stream/xscript-stream.c
index 281eae4..9eb19ef 100644
--- a/libmailutils/stream/xscript-stream.c
+++ b/libmailutils/stream/xscript-stream.c
@@ -288,6 +288,13 @@ _xscript_ctl (struct _mu_stream *str, int code, int 
opcode, void *arg)
       break;

     case MU_IOCTL_SUBSTREAM:
+      if (sp->transport &&
+          ((status = mu_stream_ioctl (sp->transport, code, opcode, arg)) == 0 
||
+            status != ENOSYS))
+        return status;
+      /* fall through */
+
+    case MU_IOCTL_TOPSTREAM:
       if (!arg)
        return EINVAL;
       switch (opcode)
diff --git a/pop3d/pop3d.c b/pop3d/pop3d.c
index 223db35..efe4155 100644
--- a/pop3d/pop3d.c
+++ b/pop3d/pop3d.c
@@ -372,7 +372,7 @@ set_strerr_flt ()
   mu_stream_t flt, trans[2];
   int rc;

-  rc = mu_stream_ioctl (mu_strerr, MU_IOCTL_SUBSTREAM, MU_IOCTL_OP_GET, trans);
+  rc = mu_stream_ioctl (mu_strerr, MU_IOCTL_TOPSTREAM, MU_IOCTL_OP_GET, trans);
   if (rc == 0)
     {
       char sessidstr[10];
@@ -389,7 +389,7 @@ set_strerr_flt ()
          mu_stream_set_buffer (flt, mu_buffer_line, 0);
          trans[0] = flt;
          trans[1] = NULL;
-         rc = mu_stream_ioctl (mu_strerr, MU_IOCTL_SUBSTREAM,
+         rc = mu_stream_ioctl (mu_strerr, MU_IOCTL_TOPSTREAM,
                                MU_IOCTL_OP_SET, trans);
          mu_stream_unref (trans[0]);
          if (rc)
@@ -413,16 +413,16 @@ clr_strerr_flt ()
   mu_stream_t flt, trans[2];
   int rc;

-  rc = mu_stream_ioctl (mu_strerr, MU_IOCTL_SUBSTREAM, MU_IOCTL_OP_GET, trans);
+  rc = mu_stream_ioctl (mu_strerr, MU_IOCTL_TOPSTREAM, MU_IOCTL_OP_GET, trans);
   if (rc == 0)
     {
       flt = trans[0];

-      rc = mu_stream_ioctl (flt, MU_IOCTL_SUBSTREAM, MU_IOCTL_OP_GET, trans);
+      rc = mu_stream_ioctl (flt, MU_IOCTL_TOPSTREAM, MU_IOCTL_OP_GET, trans);
       if (rc == 0)
        {
          mu_stream_unref (trans[0]);
-         rc = mu_stream_ioctl (mu_strerr, MU_IOCTL_SUBSTREAM,
+         rc = mu_stream_ioctl (mu_strerr, MU_IOCTL_TOPSTREAM,
                                MU_IOCTL_OP_SET, trans);
          if (rc == 0)
            mu_stream_unref (flt);
--
1.7.3.2


reply via email to

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