X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavformat%2Fgopher.c;h=9bbe171640359cc6c4f4e65c230737e3ea953d26;hb=0814610ee35614e417d6942784f7b299f2414a9b;hp=3070b24caf2cfa2ac654c69a126afc365bbcae99;hpb=5c1aafff2d844b177b0b20db4a38d8460992558b;p=ffmpeg diff --git a/libavformat/gopher.c b/libavformat/gopher.c index 3070b24caf2..9bbe1716403 100644 --- a/libavformat/gopher.c +++ b/libavformat/gopher.c @@ -2,6 +2,7 @@ * Gopher protocol * * Copyright (c) 2009 Toshimitsu Kimura + * Copyright (c) 2021 parazyd * * based on libavformat/http.c, Copyright (c) 2000, 2001 Fabrice Bellard * @@ -22,6 +23,8 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include "config.h" + #include "libavutil/avstring.h" #include "avformat.h" #include "internal.h" @@ -68,29 +71,30 @@ static int gopher_connect(URLContext *h, const char *path) static int gopher_close(URLContext *h) { GopherContext *s = h->priv_data; - if (s->hd) { - ffurl_close(s->hd); - s->hd = NULL; - } + ffurl_closep(&s->hd); return 0; } static int gopher_open(URLContext *h, const char *uri, int flags) { GopherContext *s = h->priv_data; - char hostname[1024], auth[1024], path[1024], buf[1024]; + char proto[10], hostname[1024], auth[1024], path[1024], buf[1024]; int port, err; + const char *lower_proto = "tcp"; h->is_streamed = 1; /* needed in any case to build the host string */ - av_url_split(NULL, 0, auth, sizeof(auth), hostname, sizeof(hostname), &port, - path, sizeof(path), uri); + av_url_split(proto, sizeof(proto), auth, sizeof(auth), + hostname, sizeof(hostname), &port, path, sizeof(path), uri); if (port < 0) port = 70; - ff_url_join(buf, sizeof(buf), "tcp", NULL, hostname, port, NULL); + if (!strcmp(proto, "gophers")) + lower_proto = "tls"; + + ff_url_join(buf, sizeof(buf), lower_proto, NULL, hostname, port, NULL); s->hd = NULL; err = ffurl_open_whitelist(&s->hd, buf, AVIO_FLAG_READ_WRITE, @@ -113,13 +117,28 @@ static int gopher_read(URLContext *h, uint8_t *buf, int size) return len; } - +#if CONFIG_GOPHER_PROTOCOL const URLProtocol ff_gopher_protocol = { - .name = "gopher", - .url_open = gopher_open, - .url_read = gopher_read, - .url_write = gopher_write, - .url_close = gopher_close, - .priv_data_size = sizeof(GopherContext), - .flags = URL_PROTOCOL_FLAG_NETWORK, + .name = "gopher", + .url_open = gopher_open, + .url_read = gopher_read, + .url_write = gopher_write, + .url_close = gopher_close, + .priv_data_size = sizeof(GopherContext), + .flags = URL_PROTOCOL_FLAG_NETWORK, + .default_whitelist = "gopher,tcp" +}; +#endif /* CONFIG_GOPHER_PROTOCOL */ + +#if CONFIG_GOPHERS_PROTOCOL +const URLProtocol ff_gophers_protocol = { + .name = "gophers", + .url_open = gopher_open, + .url_read = gopher_read, + .url_write = gopher_write, + .url_close = gopher_close, + .priv_data_size = sizeof(GopherContext), + .flags = URL_PROTOCOL_FLAG_NETWORK, + .default_whitelist = "gopher,gophers,tcp,tls" }; +#endif /* CONFIG_GOPHERS_PROTOCOL */