summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWim Taymans <wim.taymans@collabora.co.uk>2009-02-18 18:46:35 +0100
committerWim Taymans <wim.taymans@collabora.co.uk>2009-02-18 18:46:35 +0100
commita2f04c8f61efddb942bc1543f533f844ab8c7bf1 (patch)
treea5f982866ae3047c962820e82d3f4232cd3cf474
parenta6d75bd33cd94f4cfef1bf888a5950853a5ad95c (diff)
Add RTSP accept method
Add a method to accept a connection on a socket and create a GstRTSPConnection for it. API: gst_rtsp_connection_accept()
-rw-r--r--docs/libs/gst-plugins-base-libs-sections.txt1
-rw-r--r--gst-libs/gst/rtsp/gstrtspconnection.c58
-rw-r--r--gst-libs/gst/rtsp/gstrtspconnection.h1
3 files changed, 59 insertions, 1 deletions
diff --git a/docs/libs/gst-plugins-base-libs-sections.txt b/docs/libs/gst-plugins-base-libs-sections.txt
index 468038016..8f2516f33 100644
--- a/docs/libs/gst-plugins-base-libs-sections.txt
+++ b/docs/libs/gst-plugins-base-libs-sections.txt
@@ -1194,6 +1194,7 @@ gst_rtsp_base64_decode_ip
<INCLUDE>gst/rtsp/gstrtspconnection.h</INCLUDE>
GstRTSPConnection
gst_rtsp_connection_create
+gst_rtsp_connection_accept
gst_rtsp_connection_connect
gst_rtsp_connection_close
gst_rtsp_connection_free
diff --git a/gst-libs/gst/rtsp/gstrtspconnection.c b/gst-libs/gst/rtsp/gstrtspconnection.c
index 33cec5ba7..85bb56b77 100644
--- a/gst-libs/gst/rtsp/gstrtspconnection.c
+++ b/gst-libs/gst/rtsp/gstrtspconnection.c
@@ -163,7 +163,7 @@ build_reset (GstRTSPBuilder * builder)
/**
* gst_rtsp_connection_create:
* @url: a #GstRTSPUrl
- * @conn: a #GstRTSPConnection
+ * @conn: storage for a #GstRTSPConnection
*
* Create a newly allocated #GstRTSPConnection from @url and store it in @conn.
* The connection will not yet attempt to connect to @url, use
@@ -206,6 +206,62 @@ no_fdset:
}
/**
+ * gst_rtsp_connection_accept:
+ * @sock: a socket
+ * @conn: storage for a #GstRTSPConnection
+ *
+ * Accept a new connection on @sock and create a new #GstRTSPConnection for
+ * handling communication on new socket.
+ *
+ * Returns: #GST_RTSP_OK when @conn contains a valid connection.
+ *
+ * Since: 0.10.23
+ */
+GstRTSPResult
+gst_rtsp_connection_accept (gint sock, GstRTSPConnection ** conn)
+{
+ int fd;
+ unsigned int address_len;
+ GstRTSPConnection *newconn;
+ struct sockaddr_in address;
+ GstRTSPUrl *url;
+
+ address_len = sizeof (address);
+ memset (&address, 0, address_len);
+
+ fd = accept (sock, (struct sockaddr *) &address, &address_len);
+ if (fd == -1)
+ goto accept_failed;
+
+ /* set to non-blocking mode so that we can cancel the communication */
+#ifndef G_OS_WIN32
+ fcntl (fd, F_SETFL, O_NONBLOCK);
+#else
+ ioctlsocket (fd, FIONBIO, &flags);
+#endif /* G_OS_WIN32 */
+
+ /* create a url for the client address */
+ url = g_new0 (GstRTSPUrl, 1);
+ url->host = g_strdup_printf ("%s", inet_ntoa (address.sin_addr));
+ url->port = address.sin_port;
+
+ /* now create the connection object */
+ gst_rtsp_connection_create (url, &newconn);
+ newconn->fd.fd = fd;
+ gst_poll_add_fd (newconn->fdset, &newconn->fd);
+
+ *conn = newconn;
+
+ return GST_RTSP_OK;
+
+ /* ERRORS */
+accept_failed:
+ {
+ return GST_RTSP_ESYS;
+ }
+}
+
+/**
* gst_rtsp_connection_connect:
* @conn: a #GstRTSPConnection
* @timeout: a #GTimeVal timeout
diff --git a/gst-libs/gst/rtsp/gstrtspconnection.h b/gst-libs/gst/rtsp/gstrtspconnection.h
index 33bee8f8f..99dd31418 100644
--- a/gst-libs/gst/rtsp/gstrtspconnection.h
+++ b/gst-libs/gst/rtsp/gstrtspconnection.h
@@ -84,6 +84,7 @@ struct _GstRTSPConnection
/* opening/closing a connection */
GstRTSPResult gst_rtsp_connection_create (GstRTSPUrl *url, GstRTSPConnection **conn);
+GstRTSPResult gst_rtsp_connection_accept (gint sock, GstRTSPConnection **conn);
GstRTSPResult gst_rtsp_connection_connect (GstRTSPConnection *conn, GTimeVal *timeout);
GstRTSPResult gst_rtsp_connection_close (GstRTSPConnection *conn);
GstRTSPResult gst_rtsp_connection_free (GstRTSPConnection *conn);