On Fri, 26 May 2017 13:56:13 +0200
Diego Biurrun <[email protected]> wrote:
> ---
> TLS is not handled like other protocols. Instead the implementation details
> of which crypto library is used get exposed to the user. Hiding those
> details allows simplifying and refactoring some code and avoiding the
> special-casing of TLS.
>
> This should get a slightly more elaborate log message before pushing.
>
> configure | 8 ++----
> libavformat/Makefile | 3 +-
> libavformat/network.c | 20 --------------
> libavformat/protocols.c | 3 +-
> libavformat/tls.c | 70
> +++++++++++++++++++++++++++++++++++++++++------
> libavformat/tls.h | 8 ------
> libavformat/tls_gnutls.c | 53 +++--------------------------------
> libavformat/tls_openssl.c | 53 +++--------------------------------
> libavformat/utils.c | 4 +++
> 9 files changed, 77 insertions(+), 145 deletions(-)
>
> diff --git a/configure b/configure
> index d6c44cf..d17e9f7 100755
> --- a/configure
> +++ b/configure
> @@ -2468,12 +2468,8 @@ sctp_protocol_deps="struct_sctp_event_subscribe"
> sctp_protocol_select="network"
> srtp_protocol_select="rtp_protocol srtp"
> tcp_protocol_select="network"
> -tls_gnutls_protocol_deps="gnutls"
> -tls_gnutls_protocol_select="tcp_protocol"
> -tls_openssl_protocol_conflict="tls_gnutls_protocol"
> -tls_openssl_protocol_deps="openssl"
> -tls_openssl_protocol_select="tcp_protocol"
> -tls_protocol_deps_any="tls_gnutls_protocol tls_openssl_protocol"
> +tls_protocol_deps_any="gnutls openssl"
> +tls_protocol_select="tcp_protocol"
> udp_protocol_select="network"
> unix_protocol_deps="sys_un_h"
> unix_protocol_select="network"
> diff --git a/libavformat/Makefile b/libavformat/Makefile
> index 7b1df93..7e306ec 100644
> --- a/libavformat/Makefile
> +++ b/libavformat/Makefile
> @@ -408,8 +408,7 @@ OBJS-$(CONFIG_RTP_PROTOCOL) += rtpproto.o
> OBJS-$(CONFIG_SCTP_PROTOCOL) += sctp.o
> OBJS-$(CONFIG_SRTP_PROTOCOL) += srtpproto.o srtp.o
> OBJS-$(CONFIG_TCP_PROTOCOL) += tcp.o
> -OBJS-$(CONFIG_TLS_GNUTLS_PROTOCOL) += tls_gnutls.o tls.o
> -OBJS-$(CONFIG_TLS_OPENSSL_PROTOCOL) += tls_openssl.o tls.o
> +OBJS-$(CONFIG_TLS_PROTOCOL) += tls.o
> OBJS-$(CONFIG_UDP_PROTOCOL) += udp.o
> OBJS-$(CONFIG_UNIX_PROTOCOL) += unix.o
>
> diff --git a/libavformat/network.c b/libavformat/network.c
> index 2c34b4a..978ff73 100644
> --- a/libavformat/network.c
> +++ b/libavformat/network.c
> @@ -25,26 +25,6 @@
> #include "libavcodec/internal.h"
> #include "libavutil/mem.h"
>
> -void ff_tls_init(void)
> -{
> -#if CONFIG_TLS_OPENSSL_PROTOCOL
> - ff_openssl_init();
> -#endif
> -#if CONFIG_TLS_GNUTLS_PROTOCOL
> - ff_gnutls_init();
> -#endif
> -}
> -
> -void ff_tls_deinit(void)
> -{
> -#if CONFIG_TLS_OPENSSL_PROTOCOL
> - ff_openssl_deinit();
> -#endif
> -#if CONFIG_TLS_GNUTLS_PROTOCOL
> - ff_gnutls_deinit();
> -#endif
> -}
> -
> int ff_network_inited_globally;
>
> int ff_network_init(void)
> diff --git a/libavformat/protocols.c b/libavformat/protocols.c
> index d254540..8ea5c0e 100644
> --- a/libavformat/protocols.c
> +++ b/libavformat/protocols.c
> @@ -48,8 +48,7 @@ extern const URLProtocol ff_rtp_protocol;
> extern const URLProtocol ff_sctp_protocol;
> extern const URLProtocol ff_srtp_protocol;
> extern const URLProtocol ff_tcp_protocol;
> -extern const URLProtocol ff_tls_gnutls_protocol;
> -extern const URLProtocol ff_tls_openssl_protocol;
> +extern const URLProtocol ff_tls_protocol;
> extern const URLProtocol ff_udp_protocol;
> extern const URLProtocol ff_unix_protocol;
> extern const URLProtocol ff_librtmp_protocol;
> diff --git a/libavformat/tls.c b/libavformat/tls.c
> index fab243e..afb174b 100644
> --- a/libavformat/tls.c
> +++ b/libavformat/tls.c
> @@ -19,15 +19,13 @@
> * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
> USA
> */
>
> -#include "avformat.h"
> -#include "internal.h"
> -#include "network.h"
> -#include "os_support.h"
> -#include "url.h"
> -#include "tls.h"
> -#include "libavutil/avstring.h"
> -#include "libavutil/opt.h"
> -#include "libavutil/parseutils.h"
> +#include "config.h"
> +
> +#if CONFIG_GNUTLS
> +#include "tls_gnutls.c"
> +#else
> +#include "tls_openssl.c"
> +#endif
>
> int ff_tls_open_underlying(TLSShared *c, URLContext *parent, const char
> *uri, AVDictionary **options)
> {
> @@ -78,3 +76,57 @@ int ff_tls_open_underlying(TLSShared *c, URLContext
> *parent, const char *uri, AV
> return ffurl_open(&c->tcp, buf, AVIO_FLAG_READ_WRITE,
> &parent->interrupt_callback, options,
> parent->protocols, parent);
> }
> +
> +
> +static int tls_read(URLContext *h, uint8_t *buf, int size)
> +{
> + TLSContext *c = h->priv_data;
> +#if CONFIG_GNUTLS
> + int ret = gnutls_record_recv(c->session, buf, size);
> +#else
> + int ret = SSL_read(c->ssl, buf, size);
> +#endif
> + if (ret > 0)
> + return ret;
> + if (ret == 0)
> + return AVERROR_EOF;
> + return print_tls_error(h, ret);
> +}
> +
> +static int tls_write(URLContext *h, const uint8_t *buf, int size)
> +{
> + TLSContext *c = h->priv_data;
> +#if CONFIG_GNUTLS
> + int ret = gnutls_record_send(c->session, buf, size);
> +#else
> + int ret = SSL_write(c->ssl, buf, size);
> +#endif
> + if (ret > 0)
> + return ret;
> + if (ret == 0)
> + return AVERROR_EOF;
> + return print_tls_error(h, ret);
> +}
> +
> +static const AVOption options[] = {
> + TLS_COMMON_OPTIONS(TLSContext, tls_shared),
> + { NULL }
> +};
> +
> +static const AVClass tls_class = {
> + .class_name = "tls",
> + .item_name = av_default_item_name,
> + .option = options,
> + .version = LIBAVUTIL_VERSION_INT,
> +};
> +
> +const URLProtocol ff_tls_protocol = {
> + .name = "tls",
> + .url_open2 = tls_open,
> + .url_read = tls_read,
> + .url_write = tls_write,
> + .url_close = tls_close,
> + .priv_data_size = sizeof(TLSContext),
> + .flags = URL_PROTOCOL_FLAG_NETWORK,
> + .priv_data_class = &tls_class,
> +};
> diff --git a/libavformat/tls.h b/libavformat/tls.h
> index 22cb625..57adff9 100644
> --- a/libavformat/tls.h
> +++ b/libavformat/tls.h
> @@ -26,8 +26,6 @@
> #include "url.h"
> #include "libavutil/opt.h"
>
> -#define CONFIG_TLS_PROTOCOL (CONFIG_TLS_GNUTLS_PROTOCOL |
> CONFIG_TLS_OPENSSL_PROTOCOL)
> -
> typedef struct TLSShared {
> char *ca_file;
> int verify;
> @@ -51,10 +49,4 @@ typedef struct TLSShared {
>
> int ff_tls_open_underlying(TLSShared *c, URLContext *parent, const char
> *uri, AVDictionary **options);
>
> -void ff_gnutls_init(void);
> -void ff_gnutls_deinit(void);
> -
> -void ff_openssl_init(void);
> -void ff_openssl_deinit(void);
> -
> #endif /* AVFORMAT_TLS_H */
> diff --git a/libavformat/tls_gnutls.c b/libavformat/tls_gnutls.c
> index f8a612a..82bc6d7 100644
> --- a/libavformat/tls_gnutls.c
> +++ b/libavformat/tls_gnutls.c
> @@ -43,14 +43,14 @@ typedef struct TLSContext {
> int need_shutdown;
> } TLSContext;
>
> -void ff_gnutls_init(void)
> +void ff_tls_init(void)
> {
> avpriv_lock_avformat();
> gnutls_global_init();
> avpriv_unlock_avformat();
> }
>
> -void ff_gnutls_deinit(void)
> +void ff_tls_deinit(void)
> {
> avpriv_lock_avformat();
> gnutls_global_deinit();
> @@ -84,7 +84,7 @@ static int tls_close(URLContext *h)
> gnutls_certificate_free_credentials(c->cred);
> if (c->tls_shared.tcp)
> ffurl_close(c->tls_shared.tcp);
> - ff_gnutls_deinit();
> + ff_tls_deinit();
> return 0;
> }
>
> @@ -120,7 +120,7 @@ static int tls_open(URLContext *h, const char *uri, int
> flags, AVDictionary **op
> TLSShared *c = &p->tls_shared;
> int ret;
>
> - ff_gnutls_init();
> + ff_tls_init();
>
> if ((ret = ff_tls_open_underlying(c, h, uri, options)) < 0)
> goto fail;
> @@ -198,48 +198,3 @@ fail:
> tls_close(h);
> return ret;
> }
> -
> -static int tls_read(URLContext *h, uint8_t *buf, int size)
> -{
> - TLSContext *c = h->priv_data;
> - int ret = gnutls_record_recv(c->session, buf, size);
> - if (ret > 0)
> - return ret;
> - if (ret == 0)
> - return AVERROR_EOF;
> - return print_tls_error(h, ret);
> -}
> -
> -static int tls_write(URLContext *h, const uint8_t *buf, int size)
> -{
> - TLSContext *c = h->priv_data;
> - int ret = gnutls_record_send(c->session, buf, size);
> - if (ret > 0)
> - return ret;
> - if (ret == 0)
> - return AVERROR_EOF;
> - return print_tls_error(h, ret);
> -}
> -
> -static const AVOption options[] = {
> - TLS_COMMON_OPTIONS(TLSContext, tls_shared),
> - { NULL }
> -};
> -
> -static const AVClass tls_class = {
> - .class_name = "tls",
> - .item_name = av_default_item_name,
> - .option = options,
> - .version = LIBAVUTIL_VERSION_INT,
> -};
> -
> -const URLProtocol ff_tls_gnutls_protocol = {
> - .name = "tls",
> - .url_open2 = tls_open,
> - .url_read = tls_read,
> - .url_write = tls_write,
> - .url_close = tls_close,
> - .priv_data_size = sizeof(TLSContext),
> - .flags = URL_PROTOCOL_FLAG_NETWORK,
> - .priv_data_class = &tls_class,
> -};
> diff --git a/libavformat/tls_openssl.c b/libavformat/tls_openssl.c
> index 0abccf0..066c1f4 100644
> --- a/libavformat/tls_openssl.c
> +++ b/libavformat/tls_openssl.c
> @@ -66,7 +66,7 @@ static unsigned long openssl_thread_id(void)
> #endif
> #endif
>
> -void ff_openssl_init(void)
> +void ff_tls_init(void)
> {
> avpriv_lock_avformat();
> if (!openssl_init) {
> @@ -89,7 +89,7 @@ void ff_openssl_init(void)
> avpriv_unlock_avformat();
> }
>
> -void ff_openssl_deinit(void)
> +void ff_tls_deinit(void)
> {
> avpriv_lock_avformat();
> openssl_init--;
> @@ -128,7 +128,7 @@ static int tls_close(URLContext *h)
> if (c->url_bio_method)
> BIO_meth_free(c->url_bio_method);
> #endif
> - ff_openssl_deinit();
> + ff_tls_deinit();
> return 0;
> }
>
> @@ -216,7 +216,7 @@ static int tls_open(URLContext *h, const char *uri, int
> flags, AVDictionary **op
> BIO *bio;
> int ret;
>
> - ff_openssl_init();
> + ff_tls_init();
>
> if ((ret = ff_tls_open_underlying(c, h, uri, options)) < 0)
> goto fail;
> @@ -288,48 +288,3 @@ fail:
> tls_close(h);
> return ret;
> }
> -
> -static int tls_read(URLContext *h, uint8_t *buf, int size)
> -{
> - TLSContext *c = h->priv_data;
> - int ret = SSL_read(c->ssl, buf, size);
> - if (ret > 0)
> - return ret;
> - if (ret == 0)
> - return AVERROR_EOF;
> - return print_tls_error(h, ret);
> -}
> -
> -static int tls_write(URLContext *h, const uint8_t *buf, int size)
> -{
> - TLSContext *c = h->priv_data;
> - int ret = SSL_write(c->ssl, buf, size);
> - if (ret > 0)
> - return ret;
> - if (ret == 0)
> - return AVERROR_EOF;
> - return print_tls_error(h, ret);
> -}
> -
> -static const AVOption options[] = {
> - TLS_COMMON_OPTIONS(TLSContext, tls_shared),
> - { NULL }
> -};
> -
> -static const AVClass tls_class = {
> - .class_name = "tls",
> - .item_name = av_default_item_name,
> - .option = options,
> - .version = LIBAVUTIL_VERSION_INT,
> -};
> -
> -const URLProtocol ff_tls_openssl_protocol = {
> - .name = "tls",
> - .url_open2 = tls_open,
> - .url_read = tls_read,
> - .url_write = tls_write,
> - .url_close = tls_close,
> - .priv_data_size = sizeof(TLSContext),
> - .flags = URL_PROTOCOL_FLAG_NETWORK,
> - .priv_data_class = &tls_class,
> -};
> diff --git a/libavformat/utils.c b/libavformat/utils.c
> index eaba473..fd85a02 100644
> --- a/libavformat/utils.c
> +++ b/libavformat/utils.c
> @@ -3211,8 +3211,10 @@ int avformat_network_init(void)
> ff_network_inited_globally = 1;
> if ((ret = ff_network_init()) < 0)
> return ret;
> +#if CONFIG_TLS_PROTOCOL
> ff_tls_init();
> #endif
> +#endif
> return 0;
> }
>
> @@ -3220,8 +3222,10 @@ int avformat_network_deinit(void)
> {
> #if CONFIG_NETWORK
> ff_network_close();
> +#if CONFIG_TLS_PROTOCOL
> ff_tls_deinit();
> #endif
> +#endif
> return 0;
> }
>
Are you serious? This reverts the change wbs and me have done to
_disentangle_ those protocols.
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel