[vlc-commits] tls: allocate server session in core

Rémi Denis-Courmont git at videolan.org
Sat Sep 29 18:14:26 CEST 2012


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Sat Sep 29 11:05:43 2012 +0300| [179ffb95f427e265b6a6ef77d0b89fb33b67938f] | committer: Rémi Denis-Courmont

tls: allocate server session in core

This enables the use of vlc_custom_create() and, later, sharing more
code between server and client sides.

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=179ffb95f427e265b6a6ef77d0b89fb33b67938f
---

 include/vlc_tls.h     |   22 ++++++++++++----------
 modules/misc/gnutls.c |   42 ++++++++++++++++--------------------------
 src/network/tls.c     |   17 +++++++++++++----
 3 files changed, 41 insertions(+), 40 deletions(-)

diff --git a/include/vlc_tls.h b/include/vlc_tls.h
index 66fcafd..c2fb2e0 100644
--- a/include/vlc_tls.h
+++ b/include/vlc_tls.h
@@ -29,21 +29,24 @@
 
 # include <vlc_network.h>
 
+typedef struct vlc_tls vlc_tls_t;
 typedef struct vlc_tls_sys vlc_tls_sys_t;
+typedef struct vlc_tls_creds vlc_tls_creds_t;
+typedef struct vlc_tls_creds_sys vlc_tls_creds_sys_t;
+
 
-typedef struct vlc_tls
+struct vlc_tls
 {
     VLC_COMMON_MEMBERS
 
     union {
         module_t *module; /**< Plugin handle (client) */
-        void    (*close) (struct vlc_tls *); /**< Close callback (server) */
     } u;
     vlc_tls_sys_t *sys;
 
     struct virtual_socket_t sock;
     int  (*handshake) (struct vlc_tls *);
-} vlc_tls_t;
+};
 
 VLC_API vlc_tls_t *vlc_tls_ClientCreate (vlc_object_t *, int fd,
                                          const char *hostname);
@@ -55,21 +58,20 @@ VLC_API void vlc_tls_ClientDelete (vlc_tls_t *);
 # define tls_Recv( a, b, c ) (((vlc_tls_t *)a)->sock.pf_recv (a, b, c))
 
 
-typedef struct vlc_tls_creds_sys vlc_tls_creds_sys_t;
-
 /** TLS (server-side) credentials */
-typedef struct vlc_tls_creds
+struct vlc_tls_creds
 {
     VLC_COMMON_MEMBERS
 
     module_t  *module;
     vlc_tls_creds_sys_t *sys;
 
-    int (*add_CA) (struct vlc_tls_creds *, const char *path);
-    int (*add_CRL) (struct vlc_tls_creds *, const char *path);
+    int (*add_CA) (vlc_tls_creds_t *, const char *path);
+    int (*add_CRL) (vlc_tls_creds_t *, const char *path);
 
-    vlc_tls_t *(*open) (struct vlc_tls_creds *, int fd);
-} vlc_tls_creds_t;
+    int (*open) (vlc_tls_creds_t *, vlc_tls_t *, int fd);
+    void (*close) (vlc_tls_creds_t *, vlc_tls_t *);
+};
 
 vlc_tls_creds_t *vlc_tls_ServerCreate (vlc_object_t *,
                                        const char *cert, const char *key);
diff --git a/modules/misc/gnutls.c b/modules/misc/gnutls.c
index 1f3d7b0..e5c6aec 100644
--- a/modules/misc/gnutls.c
+++ b/modules/misc/gnutls.c
@@ -635,7 +635,7 @@ struct vlc_tls_creds_sys
  * Terminates TLS session and releases session data.
  * You still have to close the socket yourself.
  */
-static void gnutls_SessionClose (vlc_tls_t *session)
+static void gnutls_SessionClose (vlc_tls_creds_t *crd, vlc_tls_t *session)
 {
     vlc_tls_sys_t *sys = session->sys;
 
@@ -643,57 +643,46 @@ static void gnutls_SessionClose (vlc_tls_t *session)
         gnutls_bye (sys->session, GNUTLS_SHUT_WR);
     gnutls_deinit (sys->session);
 
-    vlc_object_release (session);
     free (sys);
+    (void) crd;
 }
 
 
 /**
  * Initializes a server-side TLS session.
  */
-static vlc_tls_t *gnutls_SessionOpen (vlc_tls_creds_t *server, int fd)
+static int gnutls_SessionOpen (vlc_tls_creds_t *crd, vlc_tls_t *session,
+                               int fd)
 {
-    vlc_tls_creds_sys_t *ssys = server->sys;
-    int val;
-
-    vlc_tls_t *session = vlc_object_create (server, sizeof (*session));
-    if (unlikely(session == NULL))
-        return NULL;
-
     vlc_tls_sys_t *sys = malloc (sizeof (*session->sys));
     if (unlikely(sys == NULL))
-    {
-        vlc_object_release (session);
-        return NULL;
-    }
+        return VLC_ENOMEM;
 
     session->sys = sys;
     session->sock.p_sys = session;
     session->sock.pf_send = gnutls_Send;
     session->sock.pf_recv = gnutls_Recv;
-    session->handshake = ssys->handshake;
-    session->u.close = gnutls_SessionClose;
+    session->handshake = crd->sys->handshake;
     sys->handshaked = false;
     sys->hostname = NULL;
 
-    val = gnutls_init (&sys->session, GNUTLS_SERVER);
+    int val = gnutls_init (&sys->session, GNUTLS_SERVER);
     if (val != 0)
     {
-        msg_Err (server, "cannot initialize TLS session: %s",
+        msg_Err (session, "cannot initialize TLS session: %s",
                  gnutls_strerror (val));
         free (sys);
-        vlc_object_release (session);
-        return NULL;
+        return VLC_EGENERIC;
     }
 
-    if (gnutls_SessionPrioritize (VLC_OBJECT (server), sys->session))
+    if (gnutls_SessionPrioritize (VLC_OBJECT (crd), sys->session))
         goto error;
 
     val = gnutls_credentials_set (sys->session, GNUTLS_CRD_CERTIFICATE,
-                                  ssys->x509_cred);
+                                  crd->sys->x509_cred);
     if (val < 0)
     {
-        msg_Err (server, "cannot set TLS session credentials: %s",
+        msg_Err (session, "cannot set TLS session credentials: %s",
                  gnutls_strerror (val));
         goto error;
     }
@@ -704,11 +693,11 @@ static vlc_tls_t *gnutls_SessionOpen (vlc_tls_creds_t *server, int fd)
 
     gnutls_transport_set_ptr (sys->session,
                               (gnutls_transport_ptr_t)(intptr_t)fd);
-    return session;
+    return VLC_SUCCESS;
 
 error:
-    gnutls_SessionClose (session);
-    return NULL;
+    gnutls_SessionClose (crd, session);
+    return VLC_EGENERIC;
 }
 
 
@@ -791,6 +780,7 @@ static int OpenServer (vlc_object_t *obj)
     server->add_CA  = gnutls_ServerAddCA;
     server->add_CRL = gnutls_ServerAddCRL;
     server->open    = gnutls_SessionOpen;
+    server->close   = gnutls_SessionClose;
     /* No certificate validation by default */
     sys->handshake  = gnutls_ContinueHandshake;
 
diff --git a/src/network/tls.c b/src/network/tls.c
index 93892aa..13f049d 100644
--- a/src/network/tls.c
+++ b/src/network/tls.c
@@ -113,15 +113,24 @@ int vlc_tls_ServerAddCRL (vlc_tls_creds_t *srv, const char *path)
 }
 
 
-vlc_tls_t *vlc_tls_ServerSessionCreate (vlc_tls_creds_t *srv, int fd)
+vlc_tls_t *vlc_tls_ServerSessionCreate (vlc_tls_creds_t *crd, int fd)
 {
-    return srv->open (srv, fd);
+    vlc_tls_t *session = vlc_custom_create (crd, sizeof (*session),
+                                            "tls server");
+    int val = crd->open (crd, session, fd);
+    if (val == VLC_SUCCESS)
+        return session;
+    vlc_object_release (session);
+    return NULL;
 }
 
 
-void vlc_tls_ServerSessionDelete (vlc_tls_t *ses)
+void vlc_tls_ServerSessionDelete (vlc_tls_t *session)
 {
-    ses->u.close (ses);
+    vlc_tls_creds_t *crd = (vlc_tls_creds_t *)(session->p_parent);
+
+    crd->close (crd, session);
+    vlc_object_release (session);
 }
 
 



More information about the vlc-commits mailing list