Commit 3b6bb8ae authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

tls: add separate callback for shutdown

parent 8bff13ad
...@@ -44,6 +44,7 @@ struct vlc_tls ...@@ -44,6 +44,7 @@ struct vlc_tls
ssize_t (*recv)(struct vlc_tls *, void *, size_t); ssize_t (*recv)(struct vlc_tls *, void *, size_t);
ssize_t (*send)(struct vlc_tls *, const void *, size_t); ssize_t (*send)(struct vlc_tls *, const void *, size_t);
int (*shutdown)(struct vlc_tls *, bool duplex);
void (*close)(vlc_tls_t *); void (*close)(vlc_tls_t *);
}; };
...@@ -88,6 +89,25 @@ VLC_API int vlc_tls_Read(vlc_tls_t *, void *buf, size_t len, bool waitall); ...@@ -88,6 +89,25 @@ VLC_API int vlc_tls_Read(vlc_tls_t *, void *buf, size_t len, bool waitall);
VLC_API char *vlc_tls_GetLine(vlc_tls_t *); VLC_API char *vlc_tls_GetLine(vlc_tls_t *);
VLC_API int vlc_tls_Write(vlc_tls_t *, const void *buf, size_t len); VLC_API int vlc_tls_Write(vlc_tls_t *, const void *buf, size_t len);
/**
* Terminates a TLS session.
*
* This sends the TLS session close notification to the other end, securely
* indicating that no further data will be sent. Data can still be received
* until a close notification is received from the other end.
*
* @param duplex whether to stop receiving data as well
* @retval 0 the session was terminated securely and cleanly
* (the underlying socket can be reused for other purposes)
* @return -1 the session was terminated locally, but either a notification
* could not be sent or received (the underlying socket cannot be
* reused and must be closed)
*/
static inline int vlc_tls_Shutdown(vlc_tls_t *tls, bool duplex)
{
return tls->shutdown(tls, duplex);
}
# define tls_Recv(a,b,c) vlc_tls_Read(a,b,c,false) # define tls_Recv(a,b,c) vlc_tls_Read(a,b,c,false)
# define tls_Send(a,b,c) vlc_tls_Write(a,b,c) # define tls_Send(a,b,c) vlc_tls_Write(a,b,c)
......
...@@ -182,6 +182,14 @@ static ssize_t gnutls_Recv (vlc_tls_t *tls, void *buf, size_t length) ...@@ -182,6 +182,14 @@ static ssize_t gnutls_Recv (vlc_tls_t *tls, void *buf, size_t length)
return (val < 0) ? gnutls_Error (tls, val) : val; return (val < 0) ? gnutls_Error (tls, val) : val;
} }
static int gnutls_Shutdown(vlc_tls_t *tls, bool duplex)
{
gnutls_session_t session = tls->sys;
int val = gnutls_bye(session, duplex ? GNUTLS_SHUT_RDWR : GNUTLS_SHUT_WR);
return (val < 0) ? gnutls_Error(tls, val) : 0;
}
/** /**
* Terminates a TLS session. * Terminates a TLS session.
* *
...@@ -192,7 +200,6 @@ static void gnutls_Close (vlc_tls_t *tls) ...@@ -192,7 +200,6 @@ static void gnutls_Close (vlc_tls_t *tls)
{ {
gnutls_session_t session = tls->sys; gnutls_session_t session = tls->sys;
gnutls_bye (session, GNUTLS_SHUT_RDWR);
gnutls_deinit (session); gnutls_deinit (session);
} }
...@@ -264,6 +271,7 @@ static int gnutls_SessionOpen(vlc_tls_creds_t *creds, vlc_tls_t *tls, int type, ...@@ -264,6 +271,7 @@ static int gnutls_SessionOpen(vlc_tls_creds_t *creds, vlc_tls_t *tls, int type,
tls->sys = session; tls->sys = session;
tls->send = gnutls_Send; tls->send = gnutls_Send;
tls->recv = gnutls_Recv; tls->recv = gnutls_Recv;
tls->shutdown = gnutls_Shutdown;
tls->close = gnutls_Close; tls->close = gnutls_Close;
return VLC_SUCCESS; return VLC_SUCCESS;
......
...@@ -322,6 +322,11 @@ static ssize_t vlc_tls_DummySend(vlc_tls_t *tls, const void *buf, size_t len) ...@@ -322,6 +322,11 @@ static ssize_t vlc_tls_DummySend(vlc_tls_t *tls, const void *buf, size_t len)
return send(tls->fd, buf, len, MSG_NOSIGNAL); return send(tls->fd, buf, len, MSG_NOSIGNAL);
} }
static int vlc_tls_DummyShutdown(vlc_tls_t *tls, bool duplex)
{
return shutdown(tls->fd, duplex ? SHUT_RDWR : SHUT_WR);
}
static void vlc_tls_DummyClose(vlc_tls_t *tls) static void vlc_tls_DummyClose(vlc_tls_t *tls)
{ {
(void) tls; (void) tls;
...@@ -337,6 +342,7 @@ vlc_tls_t *vlc_tls_DummyCreate(vlc_object_t *obj, int fd) ...@@ -337,6 +342,7 @@ vlc_tls_t *vlc_tls_DummyCreate(vlc_object_t *obj, int fd)
session->fd = fd; session->fd = fd;
session->recv = vlc_tls_DummyReceive; session->recv = vlc_tls_DummyReceive;
session->send = vlc_tls_DummySend; session->send = vlc_tls_DummySend;
session->shutdown = vlc_tls_DummyShutdown;
session->close = vlc_tls_DummyClose; session->close = vlc_tls_DummyClose;
return session; return session;
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment