summaryrefslogtreecommitdiffstats
path: root/server/reds.c
diff options
context:
space:
mode:
Diffstat (limited to 'server/reds.c')
-rw-r--r--server/reds.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/server/reds.c b/server/reds.c
index 3edf474f..b4ec6e14 100644
--- a/server/reds.c
+++ b/server/reds.c
@@ -59,6 +59,9 @@
#ifdef USE_TUNNEL
#include "red_tunnel_worker.h"
#endif
+#ifdef USE_SMARTCARD
+#include "smartcard.h"
+#endif
SpiceCoreInterface *core = NULL;
static SpiceKbdInstance *keyboard = NULL;
@@ -1251,6 +1254,7 @@ static int read_from_vdi_port(void)
VDIReadBuf *dispatch_buf;
int total = 0;
int n;
+
if (inside_call) {
return 0;
}
@@ -3432,9 +3436,13 @@ __visible__ void spice_server_char_device_wakeup(SpiceCharDeviceInstance* sin)
}
#define SUBTYPE_VDAGENT "vdagent"
+#define SUBTYPE_SMARTCARD "smartcard"
const char *spice_server_char_device_recognized_subtypes_list[] = {
SUBTYPE_VDAGENT,
+#ifdef USE_SMARTCARD
+ SUBTYPE_SMARTCARD,
+#endif
NULL,
};
@@ -3460,6 +3468,13 @@ static int spice_server_char_device_add_interface(SpiceServer *s,
char_device->st = &vdagent_char_device_state;
attach_to_red_agent(char_device);
}
+#ifdef USE_SMARTCARD
+ else if (strcmp(char_device->subtype, SUBTYPE_SMARTCARD) == 0) {
+ if (smartcard_device_connect(char_device) == -1) {
+ return -1;
+ }
+ }
+#endif
return 0;
}
@@ -3474,6 +3489,11 @@ static void spice_server_char_device_remove_interface(SpiceBaseInstance *sin)
reds_agent_remove();
}
}
+#ifdef USE_SMARTCARD
+ else if (strcmp(char_device->subtype, SUBTYPE_SMARTCARD) == 0) {
+ smartcard_device_disconnect(char_device);
+ }
+#endif
}
__visible__ int spice_server_add_interface(SpiceServer *s,
@@ -3759,6 +3779,10 @@ static void do_spice_init(SpiceCoreInterface *core_interface)
}
inputs_init();
+#ifdef USE_SMARTCARD
+ smartcard_channel_init();
+#endif
+
reds->mouse_mode = SPICE_MOUSE_MODE_SERVER;
atexit(reds_exit);
}