The ioctl on sockets is actually named SIOCOUTQ though its value is identical to TIOCOUTQ which is for terminals. SIOCOUTQ is linux specific so we add a header check and ifdef based on the presence of the header / macro This prevents bogus ioctls on non-Linux platforms --- configure.ac | 1 + server/red_channel.c | 14 ++++++++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index a549ed9..fa1ba31 100644 --- a/configure.ac +++ b/configure.ac @@ -51,6 +51,7 @@ PKG_PROG_PKG_CONFIG AC_CHECK_HEADERS([sys/time.h]) AC_CHECK_HEADERS([execinfo.h]) +AC_CHECK_HEADERS([linux/sockios.h]) AC_FUNC_ALLOCA AC_DEFINE([__STDC_FORMAT_MACROS],[],[Force definition of format macros for C++]) diff --git a/server/red_channel.c b/server/red_channel.c index 85d7ebc..4b92a3b 100644 --- a/server/red_channel.c +++ b/server/red_channel.c @@ -30,6 +30,9 @@ #include <unistd.h> #include <errno.h> #include <sys/ioctl.h> +#ifdef HAVE_LINUX_SOCKIOS_H +#include <linux/sockios.h> /* SIOCOUTQ */ +#endif #include "common/generated_server_marshallers.h" #include "common/ring.h" @@ -722,9 +725,11 @@ static void red_channel_client_ping_timer(void *opaque) spice_assert(rcc->latency_monitor.state == PING_STATE_TIMER); red_channel_client_cancel_ping_timer(rcc); + +#ifdef SIOCOUTQ /* SIOCOUTQ is a Linux only ioctl on sockets. */ /* retrieving the occupied size of the socket's tcp snd buffer (unacked + unsent) */ - if (ioctl(rcc->stream->socket, TIOCOUTQ, &so_unsent_size) == -1) { - spice_printerr("ioctl(TIOCOUTQ) failed, %s", strerror(errno)); + if (ioctl(rcc->stream->socket, SIOCOUTQ, &so_unsent_size) == -1) { + spice_printerr("ioctl(SIOCOUTQ) failed, %s", strerror(errno)); } if (so_unsent_size > 0) { /* tcp snd buffer is still occupied. rescheduling ping */ @@ -732,6 +737,11 @@ static void red_channel_client_ping_timer(void *opaque) } else { red_channel_client_push_ping(rcc); } +#endif /* ifdef SIOCOUTQ */ + +#ifndef SIOCOUTQ /* More portable alternative code path (less accurate but avoids bogus ioctls)*/ + red_channel_client_push_ping(rcc); +#endif /* ifndef SIOCOUTQ */ } RedChannelClient *red_channel_client_create(int size, RedChannel *channel, RedClient *client, -- 1.7.7.6 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel