aboutsummaryrefslogtreecommitdiffstats
path: root/lib/ssl_nss.c
diff options
context:
space:
mode:
authorWilmer van der Gaast <wilmer@gaast.net>2010-11-20 15:13:40 +0000
committerWilmer van der Gaast <wilmer@gaast.net>2010-11-20 15:13:40 +0000
commitef043d3d788fa7e6597eb210fc398251b99daf6d (patch)
tree3d2aa9455b447dd2f754744a302678218216e10e /lib/ssl_nss.c
parent6d544a18db369d8f89e817dfda72f96e04494077 (diff)
Fix up NSS SSL module.
Diffstat (limited to 'lib/ssl_nss.c')
-rw-r--r--lib/ssl_nss.c32
1 files changed, 32 insertions, 0 deletions
diff --git a/lib/ssl_nss.c b/lib/ssl_nss.c
index b0e2f9f9..dee20b05 100644
--- a/lib/ssl_nss.c
+++ b/lib/ssl_nss.c
@@ -33,8 +33,10 @@
#include <prio.h>
#include <sslproto.h>
#include <nss.h>
+#include <pk11pub.h>
#include <private/pprio.h>
#include <ssl.h>
+#include <seccomon.h>
#include <secerr.h>
#include <sslerr.h>
@@ -52,6 +54,7 @@ struct scd
};
static gboolean ssl_connected( gpointer data, gint source, b_input_condition cond );
+static gboolean ssl_starttls_real( gpointer data, gint source, b_input_condition cond );
static SECStatus nss_auth_cert (void *arg, PRFileDesc *socket, PRBool checksig, PRBool isserver)
@@ -121,6 +124,35 @@ void *ssl_connect( char *host, int port, ssl_input_function func, gpointer data
return( conn );
}
+static gboolean ssl_starttls_real( gpointer data, gint source, b_input_condition cond )
+{
+ struct scd *conn = data;
+
+ return ssl_connected( conn, conn->fd, B_EV_IO_WRITE );
+}
+
+void *ssl_starttls( int fd, ssl_input_function func, gpointer data )
+{
+ struct scd *conn = g_new0( struct scd, 1 );
+
+ conn->fd = fd;
+ conn->func = func;
+ conn->data = data;
+
+ /* This function should be called via a (short) timeout instead of
+ directly from here, because these SSL calls are *supposed* to be
+ *completely* asynchronous and not ready yet when this function
+ (or *_connect, for examle) returns. Also, errors are reported via
+ the callback function, not via this function's return value.
+
+ In short, doing things like this makes the rest of the code a lot
+ simpler. */
+
+ b_timeout_add( 1, ssl_starttls_real, conn );
+
+ return conn;
+}
+
static gboolean ssl_connected( gpointer data, gint source, b_input_condition cond )
{
struct scd *conn = data;