summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNahum Shalman <nshalman@elys.com>2013-07-18 14:07:13 -0400
committerYonit Halperin <yhalperi@redhat.com>2013-07-22 12:01:59 -0400
commitc07ba1cd4f357c0c6f89e71e3eabf12de5d4ec23 (patch)
treeaac981729a0455271d1c18997e643720fe55f670
parent7f3f51142caa19acd3f7de1daeced44649ed17c7 (diff)
downloadspice-c07ba1cd4f357c0c6f89e71e3eabf12de5d4ec23.tar.gz
spice-c07ba1cd4f357c0c6f89e71e3eabf12de5d4ec23.tar.xz
spice-c07ba1cd4f357c0c6f89e71e3eabf12de5d4ec23.zip
TIOCOUTQ -> SIOCOUTQ and portability ifdefs
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 This prevents bogus ioctls on non-Linux platforms
-rw-r--r--configure.ac1
-rw-r--r--server/red_channel.c13
2 files changed, 12 insertions, 2 deletions
diff --git a/configure.ac b/configure.ac
index a549ed93..fa1ba316 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 85d7ebce..31c991b4 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 HAVE_LINUX_SOCKIOS_H /* 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,10 @@ static void red_channel_client_ping_timer(void *opaque)
} else {
red_channel_client_push_ping(rcc);
}
+#else /* ifdef HAVE_LINUX_SOCKIOS_H */
+ /* More portable alternative code path (less accurate but avoids bogus ioctls)*/
+ red_channel_client_push_ping(rcc);
+#endif /* ifdef HAVE_LINUX_SOCKIOS_H */
}
RedChannelClient *red_channel_client_create(int size, RedChannel *channel, RedClient *client,