/* GStreamer UDP network utility functions * Copyright (C) 2006 Tim-Philipp Müller * Copyright (C) 2006 Joni Valtanen * Copyright (C) 2009 Jarkko Palviainen * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include "gstudpnetutils.h" gboolean gst_udp_parse_uri (const gchar * uristr, gchar ** host, guint16 * port) { gchar *protocol, *location_start; gchar *location, *location_end; gchar *colptr; /* consider no protocol to be udp:// */ protocol = gst_uri_get_protocol (uristr); if (!protocol) goto no_protocol; if (strcmp (protocol, "udp") != 0) goto wrong_protocol; g_free (protocol); location_start = gst_uri_get_location (uristr); if (!location_start) return FALSE; GST_DEBUG ("got location '%s'", location_start); /* VLC compatibility, strip everything before the @ sign. VLC uses that as the * remote address. */ location = g_strstr_len (location_start, -1, "@"); if (location == NULL) location = location_start; else location += 1; if (location[0] == '[') { GST_DEBUG ("parse IPV6 address '%s'", location); location_end = strchr (location, ']'); if (location_end == NULL) goto wrong_address; *host = g_strndup (location + 1, location_end - location - 1); colptr = strrchr (location_end, ':'); } else { GST_DEBUG ("parse IPV4 address '%s'", location); colptr = strrchr (location, ':'); if (colptr != NULL) { *host = g_strndup (location, colptr - location); } else { *host = g_strdup (location); } } GST_DEBUG ("host set to '%s'", *host); if (colptr != NULL) { *port = g_ascii_strtoll (colptr + 1, NULL, 10); } else { *port = 0; } g_free (location_start); return TRUE; /* ERRORS */ no_protocol: { GST_ERROR ("error parsing uri %s: no protocol", uristr); return FALSE; } wrong_protocol: { GST_ERROR ("error parsing uri %s: wrong protocol (%s != udp)", uristr, protocol); g_free (protocol); return FALSE; } wrong_address: { GST_ERROR ("error parsing uri %s", uristr); g_free (location); return FALSE; } }