summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian@centricular.com>2020-08-05 11:21:48 +0300
committerGStreamer Merge Bot <gitlab-merge-bot@gstreamer-foundation.org>2020-08-06 07:29:14 +0000
commite70ec38000404de1c871d835a6e35dbfcc47884d (patch)
tree8dd3c092de4c5fb72234e44f4ff41edab26e980d
parent1522e40397a9213e3b1badd7a332938f4b17fb21 (diff)
downloadgstreamer-plugins-bad-e70ec38000404de1c871d835a6e35dbfcc47884d.tar.gz
srt: Add support for using hostnames instead of IP addresses
If an address can't be parsed as IP address, try resolving it via GResolver instead. SRT URIs more often than not contain hostnames and without trying to resolve them we won't be able to handle such URIs. Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1493>
-rw-r--r--ext/srt/gstsrtobject.c80
1 files changed, 69 insertions, 11 deletions
diff --git a/ext/srt/gstsrtobject.c b/ext/srt/gstsrtobject.c
index acd4694f5..7f558cf63 100644
--- a/ext/srt/gstsrtobject.c
+++ b/ext/srt/gstsrtobject.c
@@ -125,6 +125,56 @@ static struct srt_constant_params srt_params[] = {
static gint srt_init_refcount = 0;
+static GSocketAddress *
+gst_srt_object_resolve (GstSRTObject * srtobject, const gchar * address,
+ guint port, GCancellable * cancellable, GError ** err_out)
+{
+ GError *err = NULL;
+ GSocketAddress *saddr;
+ GResolver *resolver;
+
+ saddr = g_inet_socket_address_new_from_string (address, port);
+ if (!saddr) {
+ GList *results;
+
+ GST_DEBUG_OBJECT (srtobject->element, "resolving IP address for host %s",
+ address);
+ resolver = g_resolver_get_default ();
+ results = g_resolver_lookup_by_name (resolver, address, cancellable, &err);
+ if (!results)
+ goto name_resolve;
+
+ saddr = g_inet_socket_address_new (G_INET_ADDRESS (results->data), port);
+
+ g_resolver_free_addresses (results);
+ g_object_unref (resolver);
+ }
+#ifndef GST_DISABLE_GST_DEBUG
+ {
+ gchar *ip =
+ g_inet_address_to_string (g_inet_socket_address_get_address
+ (G_INET_SOCKET_ADDRESS (saddr)));
+
+ GST_DEBUG_OBJECT (srtobject->element, "IP address for host %s is %s",
+ address, ip);
+ g_free (ip);
+ }
+#endif
+
+ return saddr;
+
+name_resolve:
+ {
+ GST_WARNING_OBJECT (srtobject->element, "Failed to resolve %s: %s", address,
+ err->message);
+ g_set_error (err_out, GST_RESOURCE_ERROR, GST_RESOURCE_ERROR_OPEN_READ,
+ "Failed to resolve host '%s': %s", address, err->message);
+ g_clear_error (&err);
+ g_object_unref (resolver);
+ return NULL;
+ }
+}
+
static gboolean
gst_srt_object_set_common_params (SRTSOCKET sock, GstSRTObject * srtobject,
GError ** error)
@@ -779,7 +829,7 @@ gst_srt_object_wait_connect (GstSRTObject * srtobject,
GSocketFamily bind_sa_family;
gpointer bind_sa;
gsize bind_sa_len;
- GSocketAddress *bind_addr;
+ GSocketAddress *bind_addr = NULL;
GST_OBJECT_LOCK (srtobject->element);
@@ -792,7 +842,13 @@ gst_srt_object_wait_connect (GstSRTObject * srtobject,
GST_OBJECT_UNLOCK (srtobject->element);
- bind_addr = g_inet_socket_address_new_from_string (local_address, local_port);
+ bind_addr =
+ gst_srt_object_resolve (srtobject, local_address, local_port, cancellable,
+ error);
+ if (!bind_addr) {
+ goto failed;
+ }
+
bind_sa_len = g_socket_address_get_native_size (bind_addr);
bind_sa = g_alloca (bind_sa_len);
bind_sa_family = g_socket_address_get_family (bind_addr);
@@ -869,7 +925,7 @@ failed:
}
static gboolean
-gst_srt_object_connect (GstSRTObject * srtobject,
+gst_srt_object_connect (GstSRTObject * srtobject, GCancellable * cancellable,
GstSRTConnectionMode connection_mode, GSocketFamily sa_family, gpointer sa,
size_t sa_len, GError ** error)
{
@@ -930,8 +986,12 @@ gst_srt_object_connect (GstSRTObject * srtobject,
gsize bind_sa_len;
GSocketAddress *bind_addr =
- g_inet_socket_address_new_from_string (local_address,
- local_port);
+ gst_srt_object_resolve (srtobject, local_address,
+ local_port, cancellable, error);
+
+ if (!bind_addr) {
+ goto failed;
+ }
bind_sa_len = g_socket_address_get_native_size (bind_addr);
bind_sa = g_alloca (bind_sa_len);
@@ -999,8 +1059,8 @@ gst_srt_object_open_connection (GstSRTObject * srtobject,
sa_len, error);
} else {
ret =
- gst_srt_object_connect (srtobject, connection_mode, sa_family, sa,
- sa_len, error);
+ gst_srt_object_connect (srtobject, cancellable, connection_mode,
+ sa_family, sa, sa_len, error);
}
return ret;
@@ -1048,11 +1108,9 @@ gst_srt_object_open_internal (GstSRTObject * srtobject,
GST_OBJECT_UNLOCK (srtobject->element);
- socket_address = g_inet_socket_address_new_from_string (addr_str, port);
-
+ socket_address =
+ gst_srt_object_resolve (srtobject, addr_str, port, cancellable, error);
if (socket_address == NULL) {
- g_set_error (error, GST_RESOURCE_ERROR, GST_RESOURCE_ERROR_OPEN_READ,
- "Invalid host");
goto out;
}