mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-08 15:32:32 +00:00
curlsink: handle socket callback for active FTP connections as well
Since version 7.28.0, libcurl allows application to set socket options for active FTP connections. Bump libcurl requirement to version tested. https://bugzilla.gnome.org/show_bug.cgi?id=749815
This commit is contained in:
parent
c4ff5359aa
commit
c1bad1be5d
3 changed files with 29 additions and 9 deletions
|
@ -1812,7 +1812,7 @@ AG_GST_CHECK_FEATURE(CHROMAPRINT, [chromaprint], chromaprint, [
|
||||||
dnl *** Curl ***
|
dnl *** Curl ***
|
||||||
translit(dnm, m, l) AM_CONDITIONAL(USE_CURL, true)
|
translit(dnm, m, l) AM_CONDITIONAL(USE_CURL, true)
|
||||||
AG_GST_CHECK_FEATURE(CURL, [Curl plugin], curl, [
|
AG_GST_CHECK_FEATURE(CURL, [Curl plugin], curl, [
|
||||||
PKG_CHECK_MODULES(CURL, libcurl >= 7.21.0, [
|
PKG_CHECK_MODULES(CURL, libcurl >= 7.37.1, [
|
||||||
HAVE_CURL="yes"
|
HAVE_CURL="yes"
|
||||||
AC_CHECK_HEADERS([unistd.h sys/socket.h sys/types.h netinet/in.h netinet/ip.h netinet/tcp.h fcntl.h], [ ], [
|
AC_CHECK_HEADERS([unistd.h sys/socket.h sys/types.h netinet/in.h netinet/ip.h netinet/tcp.h fcntl.h], [ ], [
|
||||||
AC_CHECK_HEADERS([unistd.h sys/types.h winsock2.h ws2tcpip.h fcntl.h], [ ], [HAVE_CURL="no"])
|
AC_CHECK_HEADERS([unistd.h sys/types.h winsock2.h ws2tcpip.h fcntl.h], [ ], [HAVE_CURL="no"])
|
||||||
|
|
|
@ -449,6 +449,8 @@ gst_curl_base_sink_start (GstBaseSink * bsink)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gst_poll_fd_init (&sink->fd);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -972,6 +974,18 @@ handle_transfer (GstCurlBaseSink * sink)
|
||||||
|
|
||||||
gst_curl_base_sink_got_response_notify (sink);
|
gst_curl_base_sink_got_response_notify (sink);
|
||||||
|
|
||||||
|
GST_OBJECT_LOCK (sink);
|
||||||
|
if (sink->socket_type == CURLSOCKTYPE_ACCEPT) {
|
||||||
|
if (!gst_poll_remove_fd (sink->fdset, &sink->fd)) {
|
||||||
|
sink->error = g_strdup_printf ("failed to remove fd");
|
||||||
|
retval = GST_FLOW_ERROR;
|
||||||
|
GST_OBJECT_UNLOCK (sink);
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
sink->fd.fd = -1;
|
||||||
|
}
|
||||||
|
GST_OBJECT_UNLOCK (sink);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
|
@ -1041,7 +1055,7 @@ gst_curl_base_sink_debug_cb (CURL * handle, curl_infotype type, char *data,
|
||||||
* the connect() call. */
|
* the connect() call. */
|
||||||
static int
|
static int
|
||||||
gst_curl_base_sink_transfer_socket_cb (void *clientp, curl_socket_t curlfd,
|
gst_curl_base_sink_transfer_socket_cb (void *clientp, curl_socket_t curlfd,
|
||||||
curlsocktype G_GNUC_UNUSED purpose)
|
curlsocktype socket_type)
|
||||||
{
|
{
|
||||||
GstCurlBaseSink *sink;
|
GstCurlBaseSink *sink;
|
||||||
gboolean ret = TRUE;
|
gboolean ret = TRUE;
|
||||||
|
@ -1058,14 +1072,19 @@ gst_curl_base_sink_transfer_socket_cb (void *clientp, curl_socket_t curlfd,
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
gst_poll_fd_init (&sink->fd);
|
|
||||||
sink->fd.fd = curlfd;
|
|
||||||
|
|
||||||
ret &= gst_poll_add_fd (sink->fdset, &sink->fd);
|
|
||||||
ret &= gst_poll_fd_ctl_write (sink->fdset, &sink->fd, TRUE);
|
|
||||||
ret &= gst_poll_fd_ctl_read (sink->fdset, &sink->fd, TRUE);
|
|
||||||
GST_DEBUG_OBJECT (sink, "fd: %d", sink->fd.fd);
|
|
||||||
GST_OBJECT_LOCK (sink);
|
GST_OBJECT_LOCK (sink);
|
||||||
|
sink->socket_type = socket_type;
|
||||||
|
|
||||||
|
if (sink->fd.fd != curlfd) {
|
||||||
|
if (sink->fd.fd > 0 && sink->socket_type != CURLSOCKTYPE_ACCEPT) {
|
||||||
|
ret &= gst_poll_remove_fd (sink->fdset, &sink->fd);
|
||||||
|
}
|
||||||
|
sink->fd.fd = curlfd;
|
||||||
|
ret &= gst_poll_add_fd (sink->fdset, &sink->fd);
|
||||||
|
ret &= gst_poll_fd_ctl_write (sink->fdset, &sink->fd, TRUE);
|
||||||
|
ret &= gst_poll_fd_ctl_read (sink->fdset, &sink->fd, TRUE);
|
||||||
|
}
|
||||||
|
GST_DEBUG_OBJECT (sink, "fd: %d", sink->fd.fd);
|
||||||
gst_curl_base_sink_setup_dscp_unlocked (sink);
|
gst_curl_base_sink_setup_dscp_unlocked (sink);
|
||||||
GST_OBJECT_UNLOCK (sink);
|
GST_OBJECT_UNLOCK (sink);
|
||||||
|
|
||||||
|
|
|
@ -67,6 +67,7 @@ struct _GstCurlBaseSink
|
||||||
CURL *curl;
|
CURL *curl;
|
||||||
GstPollFD fd;
|
GstPollFD fd;
|
||||||
GstPoll *fdset;
|
GstPoll *fdset;
|
||||||
|
curlsocktype socket_type;
|
||||||
GThread *transfer_thread;
|
GThread *transfer_thread;
|
||||||
gchar *error;
|
gchar *error;
|
||||||
GstFlowReturn flow_ret;
|
GstFlowReturn flow_ret;
|
||||||
|
|
Loading…
Reference in a new issue