summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristophe Fergeau <cfergeau@redhat.com>2011-07-04 14:27:11 +0200
committerAlon Levy <alevy@redhat.com>2011-07-21 15:09:29 +0300
commitedce17a574257a4551fd93562040969f5b47b6eb (patch)
tree3cf383ef614f87424cde1b22c63b06f7db0f0ef5
parentc44878ff8d7c2af53c243579c930211ab34c3e42 (diff)
Fix spice-server/qemu channel version checks
When qemu creates a channel, reds.c contains code to check the minor/major channel versions known to QEMU (ie the ones that were current in spice-server when QEMU was compiled) and to compare these versions against the current ones the currently installed spice-server version. According to kraxel [1], the rules for these interface numbers are: "The purpose of the versions is exactly to avoid the need for a new soname. The rules are basically: (1) You add stuff to the interface, strictly append-only to not break binary compatibility. (2) You bump the minor version of the interface. (3) You check the minor version at runtime to figure whenever the added fields contain valid stuff or not. An example is here (core interface, minor goes from 2 to 3, new channel_event callback): http://cgit.freedesktop.org/spice/spice/commit/?id=97f33fa86aa6edd25111b173dc0d9599ac29f879 " The code currently refuses to create a channel if QEMU minor version is less than the current spice-server version. This does not correspond to the intended behaviour, this patch changes to fail is qemu was compiled with a spice-server that is *newer* than the one currently installed. This case is something we cannot support nicely. [1] http://lists.freedesktop.org/archives/spice-devel/2011-July/004440.html
-rw-r--r--server/reds.c16
1 files changed, 8 insertions, 8 deletions
diff --git a/server/reds.c b/server/reds.c
index c74b2141..e97cd774 100644
--- a/server/reds.c
+++ b/server/reds.c
@@ -4242,7 +4242,7 @@ __visible__ int spice_server_add_interface(SpiceServer *s,
return -1;
}
if (interface->major_version != SPICE_INTERFACE_KEYBOARD_MAJOR ||
- interface->minor_version < SPICE_INTERFACE_KEYBOARD_MINOR) {
+ interface->minor_version > SPICE_INTERFACE_KEYBOARD_MINOR) {
red_printf("unsupported keyboard interface");
return -1;
}
@@ -4256,7 +4256,7 @@ __visible__ int spice_server_add_interface(SpiceServer *s,
return -1;
}
if (interface->major_version != SPICE_INTERFACE_MOUSE_MAJOR ||
- interface->minor_version < SPICE_INTERFACE_MOUSE_MINOR) {
+ interface->minor_version > SPICE_INTERFACE_MOUSE_MINOR) {
red_printf("unsupported mouse interface");
return -1;
}
@@ -4268,7 +4268,7 @@ __visible__ int spice_server_add_interface(SpiceServer *s,
red_printf("SPICE_INTERFACE_QXL");
if (interface->major_version != SPICE_INTERFACE_QXL_MAJOR ||
- interface->minor_version < SPICE_INTERFACE_QXL_MINOR) {
+ interface->minor_version > SPICE_INTERFACE_QXL_MINOR) {
red_printf("unsupported qxl interface");
return -1;
}
@@ -4285,7 +4285,7 @@ __visible__ int spice_server_add_interface(SpiceServer *s,
return -1;
}
if (interface->major_version != SPICE_INTERFACE_TABLET_MAJOR ||
- interface->minor_version < SPICE_INTERFACE_TABLET_MINOR) {
+ interface->minor_version > SPICE_INTERFACE_TABLET_MINOR) {
red_printf("unsupported tablet interface");
return -1;
}
@@ -4302,7 +4302,7 @@ __visible__ int spice_server_add_interface(SpiceServer *s,
} else if (strcmp(interface->type, SPICE_INTERFACE_PLAYBACK) == 0) {
red_printf("SPICE_INTERFACE_PLAYBACK");
if (interface->major_version != SPICE_INTERFACE_PLAYBACK_MAJOR ||
- interface->minor_version < SPICE_INTERFACE_PLAYBACK_MINOR) {
+ interface->minor_version > SPICE_INTERFACE_PLAYBACK_MINOR) {
red_printf("unsupported playback interface");
return -1;
}
@@ -4311,7 +4311,7 @@ __visible__ int spice_server_add_interface(SpiceServer *s,
} else if (strcmp(interface->type, SPICE_INTERFACE_RECORD) == 0) {
red_printf("SPICE_INTERFACE_RECORD");
if (interface->major_version != SPICE_INTERFACE_RECORD_MAJOR ||
- interface->minor_version < SPICE_INTERFACE_RECORD_MINOR) {
+ interface->minor_version > SPICE_INTERFACE_RECORD_MINOR) {
red_printf("unsupported record interface");
return -1;
}
@@ -4319,7 +4319,7 @@ __visible__ int spice_server_add_interface(SpiceServer *s,
} else if (strcmp(interface->type, SPICE_INTERFACE_CHAR_DEVICE) == 0) {
if (interface->major_version != SPICE_INTERFACE_CHAR_DEVICE_MAJOR ||
- interface->minor_version < SPICE_INTERFACE_CHAR_DEVICE_MINOR) {
+ interface->minor_version > SPICE_INTERFACE_CHAR_DEVICE_MINOR) {
red_printf("unsupported char device interface");
return -1;
}
@@ -4334,7 +4334,7 @@ __visible__ int spice_server_add_interface(SpiceServer *s,
return -1;
}
if (interface->major_version != SPICE_INTERFACE_NET_WIRE_MAJOR ||
- interface->minor_version < SPICE_INTERFACE_NET_WIRE_MINOR) {
+ interface->minor_version > SPICE_INTERFACE_NET_WIRE_MINOR) {
red_printf("unsupported net wire interface");
return -1;
}