[vlc-commits] tls: use const struct for callbacks
Rémi Denis-Courmont
git at videolan.org
Sun Jul 29 11:06:37 CEST 2018
vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Sun Jul 29 12:00:59 2018 +0300| [9541414aea77b995a867c44513d2f600d078c0f9] | committer: Rémi Denis-Courmont
tls: use const struct for callbacks
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=9541414aea77b995a867c44513d2f600d078c0f9
---
include/vlc_tls.h | 14 +++++---
modules/access/http/chunked_test.c | 7 +++-
modules/access/http/h2conn.c | 2 +-
modules/access/http/h2output.c | 2 +-
modules/access/http/h2output_test.c | 9 +++--
modules/access/http/tunnel.c | 19 +++++++----
modules/misc/gnutls.c | 19 +++++++----
modules/misc/securetransport.c | 19 +++++++----
.../chromecast/chromecast_communication.cpp | 2 +-
src/network/httpd.c | 4 +--
src/network/stream.c | 38 ++++++++++++++--------
src/network/tls.c | 2 +-
test/modules/misc/tls.c | 4 +--
13 files changed, 91 insertions(+), 50 deletions(-)
diff --git a/include/vlc_tls.h b/include/vlc_tls.h
index a13471598f..5243412b1e 100644
--- a/include/vlc_tls.h
+++ b/include/vlc_tls.h
@@ -42,14 +42,18 @@
/** Transport layer socket */
typedef struct vlc_tls
{
+ const struct vlc_tls_operations *ops;
+ struct vlc_tls *p;
+} vlc_tls_t;
+
+struct vlc_tls_operations
+{
int (*get_fd)(struct vlc_tls *);
ssize_t (*readv)(struct vlc_tls *, struct iovec *, unsigned);
ssize_t (*writev)(struct vlc_tls *, const struct iovec *, unsigned);
int (*shutdown)(struct vlc_tls *, bool duplex);
void (*close)(struct vlc_tls *);
-
- struct vlc_tls *p;
-} vlc_tls_t;
+};
/**
* \defgroup tls Transport Layer Security
@@ -186,7 +190,7 @@ VLC_API void vlc_tls_SessionDelete (vlc_tls_t *);
static inline int vlc_tls_GetFD(vlc_tls_t *tls)
{
- return tls->get_fd(tls);
+ return tls->ops->get_fd(tls);
}
/**
@@ -240,7 +244,7 @@ VLC_API ssize_t vlc_tls_Write(vlc_tls_t *, const void *buf, size_t len);
*/
static inline int vlc_tls_Shutdown(vlc_tls_t *tls, bool duplex)
{
- return tls->shutdown(tls, duplex);
+ return tls->ops->shutdown(tls, duplex);
}
/**
diff --git a/modules/access/http/chunked_test.c b/modules/access/http/chunked_test.c
index 0f134666ab..6740d84094 100644
--- a/modules/access/http/chunked_test.c
+++ b/modules/access/http/chunked_test.c
@@ -76,13 +76,18 @@ static void close_callback(struct vlc_tls *tls)
(void) tls;
}
-static struct vlc_tls chunked_tls =
+static const struct vlc_tls_operations chunked_ops =
{
.get_fd = fd_callback,
.readv = recv_callback,
.close = close_callback,
};
+static struct vlc_tls chunked_tls =
+{
+ .ops = &chunked_ops,
+};
+
static void stream_close_callback(struct vlc_http_stream *stream, bool bad)
{
(void) stream;
diff --git a/modules/access/http/h2conn.c b/modules/access/http/h2conn.c
index fb66b8ab24..0cbef910a1 100644
--- a/modules/access/http/h2conn.c
+++ b/modules/access/http/h2conn.c
@@ -563,7 +563,7 @@ static ssize_t vlc_https_recv(vlc_tls_t *tls, void *buf, size_t len)
while (iov.iov_len > 0)
{
int canc = vlc_savecancel();
- ssize_t val = tls->readv(tls, &iov, 1);
+ ssize_t val = tls->ops->readv(tls, &iov, 1);
vlc_restorecancel(canc);
diff --git a/modules/access/http/h2output.c b/modules/access/http/h2output.c
index c171f1c51e..4ed8e33129 100644
--- a/modules/access/http/h2output.c
+++ b/modules/access/http/h2output.c
@@ -204,7 +204,7 @@ static ssize_t vlc_https_send(vlc_tls_t *tls, const void *buf, size_t len)
while (count < len)
{
int canc = vlc_savecancel();
- ssize_t val = tls->writev(tls, &iov, 1);
+ ssize_t val = tls->ops->writev(tls, &iov, 1);
vlc_restorecancel(canc);
diff --git a/modules/access/http/h2output_test.c b/modules/access/http/h2output_test.c
index 1faa155677..3530f5969f 100644
--- a/modules/access/http/h2output_test.c
+++ b/modules/access/http/h2output_test.c
@@ -51,7 +51,7 @@ static ssize_t send_callback(vlc_tls_t *tls, const struct iovec *iov,
unsigned count)
{
assert(count == 1);
- assert(tls->writev == send_callback);
+ assert(tls->ops->writev == send_callback);
const uint8_t *p = iov->iov_base;
size_t len = iov->iov_len;
@@ -83,12 +83,17 @@ static ssize_t send_callback(vlc_tls_t *tls, const struct iovec *iov,
return send_failure ? -1 : (ssize_t)len;
}
-static vlc_tls_t fake_tls =
+static const struct vlc_tls_operations fake_ops =
{
.get_fd = fd_callback,
.writev = send_callback,
};
+static vlc_tls_t fake_tls =
+{
+ .ops = &fake_ops,
+};
+
static struct vlc_h2_frame *frame(unsigned char c)
{
struct vlc_h2_frame *f = vlc_h2_frame_data(1, &c, 1, false);
diff --git a/modules/access/http/tunnel.c b/modules/access/http/tunnel.c
index f311ecff52..6ad53a0e25 100644
--- a/modules/access/http/tunnel.c
+++ b/modules/access/http/tunnel.c
@@ -107,7 +107,7 @@ static ssize_t vlc_tls_ProxyRead(vlc_tls_t *tls, struct iovec *iov,
vlc_tls_proxy_t *proxy = (vlc_tls_proxy_t *)tls;
vlc_tls_t *sock = proxy->sock;
- return sock->readv(sock, iov, count);
+ return sock->ops->readv(sock, iov, count);
}
static ssize_t vlc_tls_ProxyWrite(vlc_tls_t *tls, const struct iovec *iov,
@@ -116,7 +116,7 @@ static ssize_t vlc_tls_ProxyWrite(vlc_tls_t *tls, const struct iovec *iov,
vlc_tls_proxy_t *proxy = (vlc_tls_proxy_t *)tls;
vlc_tls_t *sock = proxy->sock;
- return sock->writev(sock, iov, count);
+ return sock->ops->writev(sock, iov, count);
}
static int vlc_tls_ProxyShutdown(vlc_tls_t *tls, bool duplex)
@@ -133,6 +133,15 @@ static void vlc_tls_ProxyClose(vlc_tls_t *tls)
free(proxy);
}
+static const struct vlc_tls_operations vlc_tls_proxy_ops =
+{
+ vlc_tls_ProxyGetFD,
+ vlc_tls_ProxyRead,
+ vlc_tls_ProxyWrite,
+ vlc_tls_ProxyShutdown,
+ vlc_tls_ProxyClose,
+};
+
vlc_tls_t *vlc_https_connect_proxy(void *ctx, vlc_tls_creds_t *creds,
const char *hostname, unsigned port,
bool *restrict two, const char *proxy)
@@ -181,11 +190,7 @@ vlc_tls_t *vlc_https_connect_proxy(void *ctx, vlc_tls_creds_t *creds,
goto error;
}
- psock->tls.get_fd = vlc_tls_ProxyGetFD;
- psock->tls.readv = vlc_tls_ProxyRead;
- psock->tls.writev = vlc_tls_ProxyWrite;
- psock->tls.shutdown = vlc_tls_ProxyShutdown;
- psock->tls.close = vlc_tls_ProxyClose;
+ psock->tls.ops = &vlc_tls_proxy_ops;
psock->tls.p = NULL;
psock->sock = sock;
diff --git a/modules/misc/gnutls.c b/modules/misc/gnutls.c
index 1cca9c14a7..56541af94b 100644
--- a/modules/misc/gnutls.c
+++ b/modules/misc/gnutls.c
@@ -102,7 +102,7 @@ static ssize_t vlc_gnutls_read(gnutls_transport_ptr_t ptr, void *buf,
.iov_len = length,
};
- return sock->readv(sock, &iov, 1);
+ return sock->ops->readv(sock, &iov, 1);
}
static ssize_t vlc_gnutls_writev(gnutls_transport_ptr_t ptr,
@@ -130,7 +130,7 @@ static ssize_t vlc_gnutls_writev(gnutls_transport_ptr_t ptr,
iov[i].iov_len = giov[i].iov_len;
}
- return sock->writev(sock, iov, iovcnt);
+ return sock->ops->writev(sock, iov, iovcnt);
}
static int gnutls_GetFD(vlc_tls_t *tls)
@@ -217,6 +217,15 @@ static void gnutls_Close (vlc_tls_t *tls)
free(priv);
}
+static const struct vlc_tls_operations gnutls_ops =
+{
+ gnutls_GetFD,
+ gnutls_Recv,
+ gnutls_Send,
+ gnutls_Shutdown,
+ gnutls_Close,
+};
+
static vlc_tls_gnutls_t *gnutls_SessionOpen(vlc_tls_creds_t *creds, int type,
gnutls_certificate_credentials_t x509,
vlc_tls_t *sock,
@@ -298,11 +307,7 @@ static vlc_tls_gnutls_t *gnutls_SessionOpen(vlc_tls_creds_t *creds, int type,
vlc_tls_t *tls = &priv->tls;
- tls->get_fd = gnutls_GetFD;
- tls->readv = gnutls_Recv;
- tls->writev = gnutls_Send;
- tls->shutdown = gnutls_Shutdown;
- tls->close = gnutls_Close;
+ tls->ops = &gnutls_ops;
return priv;
error:
diff --git a/modules/misc/securetransport.c b/modules/misc/securetransport.c
index 4cafc30d3a..6928e9565d 100644
--- a/modules/misc/securetransport.c
+++ b/modules/misc/securetransport.c
@@ -220,7 +220,7 @@ static OSStatus st_SocketReadFunc (SSLConnectionRef connection,
OSStatus retValue = noErr;
while (iov.iov_len > 0) {
- ssize_t val = sys->sock->readv(sys->sock, &iov, 1);
+ ssize_t val = sys->sock->ops->readv(sys->sock, &iov, 1);
if (val <= 0) {
if (val == 0) {
msg_Dbg(sys->obj, "found eof");
@@ -274,7 +274,7 @@ static OSStatus st_SocketWriteFunc (SSLConnectionRef connection,
OSStatus retValue = noErr;
while (iov.iov_len > 0) {
- ssize_t val = sys->sock->writev(sys->sock, &iov, 1);
+ ssize_t val = sys->sock->ops->writev(sys->sock, &iov, 1);
if (val < 0) {
switch (errno) {
case EAGAIN:
@@ -691,6 +691,15 @@ static void st_SessionClose (vlc_tls_t *session) {
free(sys);
}
+static const struct vlc_tls_operations st_ops =
+{
+ st_GetFD,
+ st_Recv,
+ st_Send,
+ st_SessionShutdown,
+ st_SessionClose,
+};
+
/**
* Initializes a client-side TLS session.
*/
@@ -714,11 +723,7 @@ static vlc_tls_t *st_SessionOpenCommon(vlc_tls_creds_t *crd, vlc_tls_t *sock,
vlc_tls_t *tls = &sys->tls;
- tls->get_fd = st_GetFD;
- tls->readv = st_Recv;
- tls->writev = st_Send;
- tls->shutdown = st_SessionShutdown;
- tls->close = st_SessionClose;
+ tls->ops = &st_ops;
crd->handshake = st_Handshake;
SSLContextRef p_context = NULL;
diff --git a/modules/stream_out/chromecast/chromecast_communication.cpp b/modules/stream_out/chromecast/chromecast_communication.cpp
index 4d339f5efd..59df59a016 100644
--- a/modules/stream_out/chromecast/chromecast_communication.cpp
+++ b/modules/stream_out/chromecast/chromecast_communication.cpp
@@ -135,7 +135,7 @@ ssize_t ChromecastCommunication::receive( uint8_t *p_data, size_t i_size, int i_
* connection as dead. */
do
{
- ssize_t i_ret = m_tls->readv( m_tls, &iov, 1 );
+ ssize_t i_ret = m_tls->ops->readv( m_tls, &iov, 1 );
if ( i_ret < 0 )
{
#ifdef _WIN32
diff --git a/src/network/httpd.c b/src/network/httpd.c
index d3cd9324ad..3d7ae0405d 100644
--- a/src/network/httpd.c
+++ b/src/network/httpd.c
@@ -1220,7 +1220,7 @@ ssize_t httpd_NetRecv (httpd_client_t *cl, uint8_t *p, size_t i_len)
{
vlc_tls_t *sock = cl->sock;
struct iovec iov = { .iov_base = p, .iov_len = i_len };
- return sock->readv(sock, &iov, 1);
+ return sock->ops->readv(sock, &iov, 1);
}
static
@@ -1228,7 +1228,7 @@ ssize_t httpd_NetSend (httpd_client_t *cl, const uint8_t *p, size_t i_len)
{
vlc_tls_t *sock = cl->sock;
const struct iovec iov = { .iov_base = (void *)p, .iov_len = i_len };
- return sock->writev(sock, &iov, 1);
+ return sock->ops->writev(sock, &iov, 1);
}
diff --git a/src/network/stream.c b/src/network/stream.c
index 90744ac0f0..7d53a6266e 100644
--- a/src/network/stream.c
+++ b/src/network/stream.c
@@ -69,7 +69,7 @@ ssize_t vlc_tls_Read(vlc_tls_t *session, void *buf, size_t len, bool waitall)
return -1;
}
- ssize_t val = session->readv(session, &iov, 1);
+ ssize_t val = session->ops->readv(session, &iov, 1);
if (val > 0)
{
if (!waitall)
@@ -110,7 +110,7 @@ ssize_t vlc_tls_Write(vlc_tls_t *session, const void *buf, size_t len)
return -1;
}
- ssize_t val = session->writev(session, &iov, 1);
+ ssize_t val = session->ops->writev(session, &iov, 1);
if (val > 0)
{
iov.iov_base = ((char *)iov.iov_base) + val;
@@ -212,6 +212,15 @@ static void vlc_tls_SocketClose(vlc_tls_t *tls)
free(tls);
}
+static const struct vlc_tls_operations vlc_tls_socket_ops =
+{
+ vlc_tls_SocketGetFD,
+ vlc_tls_SocketRead,
+ vlc_tls_SocketWrite,
+ vlc_tls_SocketShutdown,
+ vlc_tls_SocketClose,
+};
+
static vlc_tls_t *vlc_tls_SocketAlloc(int fd,
const struct sockaddr *restrict peer,
socklen_t peerlen)
@@ -222,11 +231,7 @@ static vlc_tls_t *vlc_tls_SocketAlloc(int fd,
vlc_tls_t *tls = &sock->tls;
- tls->get_fd = vlc_tls_SocketGetFD;
- tls->readv = vlc_tls_SocketRead;
- tls->writev = vlc_tls_SocketWrite;
- tls->shutdown = vlc_tls_SocketShutdown;
- tls->close = vlc_tls_SocketClose;
+ tls->ops = &vlc_tls_socket_ops;
tls->p = NULL;
sock->fd = fd;
@@ -346,6 +351,9 @@ static ssize_t vlc_tls_Connect(vlc_tls_t *tls)
static ssize_t vlc_tls_ConnectWrite(vlc_tls_t *tls,
const struct iovec *iov,unsigned count)
{
+ /* Next time, write directly. Do not retry to connect. */
+ tls->ops = &vlc_tls_socket_ops;
+
#ifdef MSG_FASTOPEN
vlc_tls_socket_t *sock = (vlc_tls_socket_t *)tls;
const struct msghdr msg =
@@ -357,9 +365,6 @@ static ssize_t vlc_tls_ConnectWrite(vlc_tls_t *tls,
};
ssize_t ret;
- /* Next time, write directly. Do not retry to connect. */
- tls->writev = vlc_tls_SocketWrite;
-
ret = sendmsg(vlc_tls_SocketGetFD(tls), &msg, MSG_NOSIGNAL|MSG_FASTOPEN);
if (ret >= 0)
{ /* Fast open in progress */
@@ -375,8 +380,6 @@ static ssize_t vlc_tls_ConnectWrite(vlc_tls_t *tls,
if (errno != EOPNOTSUPP)
return -1;
/* Fast open not supported or disabled... fallback to normal mode */
-#else
- tls->writev = vlc_tls_SocketWrite;
#endif
if (vlc_tls_Connect(tls))
@@ -385,6 +388,15 @@ static ssize_t vlc_tls_ConnectWrite(vlc_tls_t *tls,
return vlc_tls_SocketWrite(tls, iov, count);
}
+static const struct vlc_tls_operations vlc_tls_socket_fastopen_ops =
+{
+ vlc_tls_SocketGetFD,
+ vlc_tls_SocketRead,
+ vlc_tls_ConnectWrite,
+ vlc_tls_SocketShutdown,
+ vlc_tls_SocketClose,
+};
+
vlc_tls_t *vlc_tls_SocketOpenAddrInfo(const struct addrinfo *restrict info,
bool defer_connect)
{
@@ -395,7 +407,7 @@ vlc_tls_t *vlc_tls_SocketOpenAddrInfo(const struct addrinfo *restrict info,
if (defer_connect)
{ /* The socket is not connected yet.
* The connection will be triggered on the first send. */
- sock->writev = vlc_tls_ConnectWrite;
+ sock->ops = &vlc_tls_socket_fastopen_ops;
}
else
{
diff --git a/src/network/tls.c b/src/network/tls.c
index f94196b5f8..00193eeec8 100644
--- a/src/network/tls.c
+++ b/src/network/tls.c
@@ -145,7 +145,7 @@ static vlc_tls_t *vlc_tls_SessionCreate(vlc_tls_creds_t *crd,
void vlc_tls_SessionDelete (vlc_tls_t *session)
{
int canc = vlc_savecancel();
- session->close(session);
+ session->ops->close(session);
vlc_restorecancel(canc);
}
diff --git a/test/modules/misc/tls.c b/test/modules/misc/tls.c
index 2860f5ba03..4259151ad8 100644
--- a/test/modules/misc/tls.c
+++ b/test/modules/misc/tls.c
@@ -192,7 +192,7 @@ int main(void)
iov.iov_base = buf;
iov.iov_len = sizeof (buf);
- val = tls->readv(tls, &iov, 1);
+ val = tls->ops->readv(tls, &iov, 1);
assert(val == -1 && errno == EAGAIN);
val = vlc_tls_Write(tls, "Hello ", 6);
@@ -230,7 +230,7 @@ int main(void)
data[i] = rand_r(&seed);
bytes += sizeof (data);
}
- while ((val = tls->writev(tls, &iov, 1)) == sizeof (data));
+ while ((val = tls->ops->writev(tls, &iov, 1)) == sizeof (data));
bytes -= sizeof (data);
if (val > 0)
More information about the vlc-commits
mailing list