From: Jonathon Jongsma <jjongsma@xxxxxxxxxx> This should be the final piece of removing the global reds variable. We still need a global variable to clean up during the atexit() function, but we use a GList of servers (even though we technically don't support multiple servers in the same process yet). --- server/display-channel.c | 2 + server/reds.c | 188 ++++++++++++++++++++--------------------------- server/reds.h | 1 - server/smartcard.c | 15 ++-- 4 files changed, 90 insertions(+), 116 deletions(-) diff --git a/server/display-channel.c b/server/display-channel.c index aa84356..e1f07b8 100644 --- a/server/display-channel.c +++ b/server/display-channel.c @@ -1909,6 +1909,8 @@ void display_channel_create_surface(DisplayChannel *display, uint32_t surface_id if (display->renderer == RED_RENDERER_INVALID) { int i; + QXLInstance *qxl = display->common.qxl; + RedsState *reds = red_dispatcher_get_server(qxl->st->dispatcher); GArray *renderers = reds_get_renderers(reds); for (i = 0; i < renderers->len; i++) { uint32_t renderer = g_array_index(renderers, uint32_t, i); diff --git a/server/reds.c b/server/reds.c index 3334ac0..f241490 100644 --- a/server/reds.c +++ b/server/reds.c @@ -145,7 +145,9 @@ static SpiceCoreInterfaceInternal core_interface_adapter = { static pthread_mutex_t *lock_cs; static long *lock_count; -RedsState *reds = NULL; +/* While we can technically create more than one server in a process, the + * intended use is to support a single server per process */ +GList *servers = NULL; typedef struct RedLinkInfo { RedsState *reds; @@ -870,9 +872,8 @@ static int reds_get_n_clients(RedsState *reds) return reds ? reds->num_clients : 0; } -SPICE_GNUC_VISIBLE int spice_server_get_num_clients(SpiceServer *s) +SPICE_GNUC_VISIBLE int spice_server_get_num_clients(SpiceServer *reds) { - spice_assert(reds == s); return reds_get_n_clients(reds); } @@ -2408,11 +2409,10 @@ static void reds_accept(int fd, int event, void *data) } -SPICE_GNUC_VISIBLE int spice_server_add_client(SpiceServer *s, int socket, int skip_auth) +SPICE_GNUC_VISIBLE int spice_server_add_client(SpiceServer *reds, int socket, int skip_auth) { RedLinkInfo *link; - spice_assert(reds == s); if (!(link = reds_init_client_connection(reds, socket))) { spice_warning("accept failed"); return -1; @@ -2425,11 +2425,10 @@ SPICE_GNUC_VISIBLE int spice_server_add_client(SpiceServer *s, int socket, int s } -SPICE_GNUC_VISIBLE int spice_server_add_ssl_client(SpiceServer *s, int socket, int skip_auth) +SPICE_GNUC_VISIBLE int spice_server_add_ssl_client(SpiceServer *reds, int socket, int skip_auth) { RedLinkInfo *link; - spice_assert(reds == s); if (!(link = reds_init_client_ssl_connection(reds, socket))) { return -1; } @@ -2755,8 +2754,9 @@ static int reds_init_ssl(RedsState *reds) return 0; } -static void reds_exit(void) +static void reds_destroy_internal(RedsState *reds) { + g_array_unref(reds->renderers); if (reds->main_channel) { main_channel_close(reds->main_channel); } @@ -2769,6 +2769,16 @@ static void reds_exit(void) #endif } +static void reds_exit(void) +{ + GList *l; + + for (l = servers; l != NULL; l = l->next) { + RedsState *reds = l->data; + reds_destroy_internal(reds); + } +} + static inline void on_activating_ticketing(RedsState *reds) { if (!reds->ticketing_enabled && reds_main_channel_connected(reds)) { @@ -3092,18 +3102,16 @@ void reds_on_char_device_state_destroy(RedsState *reds, SpiceCharDeviceState *de reds_char_device_remove_state(reds, dev); } -static int spice_server_char_device_add_interface(SpiceServer *s, +static int spice_server_char_device_add_interface(SpiceServer *reds, SpiceBaseInstance *sin) { SpiceCharDeviceInstance* char_device = SPICE_CONTAINEROF(sin, SpiceCharDeviceInstance, base); SpiceCharDeviceState *dev_state = NULL; - spice_assert(s == reds); - spice_info("CHAR_DEVICE %s", char_device->subtype); if (strcmp(char_device->subtype, SUBTYPE_VDAGENT) == 0) { - if (s->vdagent) { + if (reds->vdagent) { spice_warning("vdagent already attached"); return -1; } @@ -3168,13 +3176,11 @@ static void spice_server_char_device_remove_interface(RedsState *reds, SpiceBase char_device->st = NULL; } -SPICE_GNUC_VISIBLE int spice_server_add_interface(SpiceServer *s, +SPICE_GNUC_VISIBLE int spice_server_add_interface(SpiceServer *reds, SpiceBaseInstance *sin) { const SpiceBaseInterface *interface = sin->sif; - spice_assert(reds == s); - if (strcmp(interface->type, SPICE_INTERFACE_KEYBOARD) == 0) { spice_info("SPICE_INTERFACE_KEYBOARD"); if (interface->major_version != SPICE_INTERFACE_KEYBOARD_MAJOR || @@ -3264,7 +3270,7 @@ SPICE_GNUC_VISIBLE int spice_server_add_interface(SpiceServer *s, spice_warning("unsupported char device interface"); return -1; } - spice_server_char_device_add_interface(s, sin); + spice_server_char_device_add_interface(reds, sin); } else if (strcmp(interface->type, SPICE_INTERFACE_MIGRATION) == 0) { spice_info("SPICE_INTERFACE_MIGRATION"); @@ -3343,6 +3349,7 @@ const char *version_string = VERSION; static int do_spice_init(RedsState *reds, SpiceCoreInterface *core_interface) { + static gboolean first = TRUE; spice_info("starting %s", version_string); if (core_interface->base.major_version != SPICE_INTERFACE_CORE_MAJOR) { @@ -3423,7 +3430,11 @@ static int do_spice_init(RedsState *reds, SpiceCoreInterface *core_interface) if (reds->allow_multiple_clients) { spice_warning("spice: allowing multiple client connections"); } - atexit(reds_exit); + if (first) { + atexit(reds_exit); + first = FALSE; + } + servers = g_list_prepend(servers, reds); return 0; err: @@ -3435,10 +3446,7 @@ static const char default_renderer[] = "sw"; /* new interface */ SPICE_GNUC_VISIBLE SpiceServer *spice_server_new(void) { - /* we can't handle multiple instances (yet) */ - spice_assert(reds == NULL); - - reds = spice_new0(RedsState, 1); + RedsState *reds = spice_new0(RedsState, 1); reds->default_channel_security = SPICE_CHANNEL_SECURITY_NONE | SPICE_CHANNEL_SECURITY_SSL; reds->renderers = g_array_sized_new(FALSE, TRUE, sizeof(uint32_t), RED_RENDERER_LAST); @@ -3497,23 +3505,23 @@ static int reds_add_renderer(RedsState *reds, const char *name) return TRUE; } -SPICE_GNUC_VISIBLE int spice_server_init(SpiceServer *s, SpiceCoreInterface *core) +SPICE_GNUC_VISIBLE int spice_server_init(SpiceServer *reds, SpiceCoreInterface *core) { int ret; - spice_assert(reds == s); - ret = do_spice_init(s, core); - if (s->renderers->len == 0) { - reds_add_renderer(s, default_renderer); + ret = do_spice_init(reds, core); + if (reds->renderers->len == 0) { + reds_add_renderer(reds, default_renderer); } return ret; } -SPICE_GNUC_VISIBLE void spice_server_destroy(SpiceServer *s) +SPICE_GNUC_VISIBLE void spice_server_destroy(SpiceServer *reds) { - spice_assert(reds == s); - g_array_unref(s->renderers); - reds_exit(); + reds_destroy_internal(reds); + /* remove the server from the list of servers so that we don't attempt to + * free it again at exit */ + servers = g_list_remove(servers, reds); } SPICE_GNUC_VISIBLE spice_compat_version_t spice_get_current_compat_version(void) @@ -3521,7 +3529,7 @@ SPICE_GNUC_VISIBLE spice_compat_version_t spice_get_current_compat_version(void) return SPICE_COMPAT_VERSION_CURRENT; } -SPICE_GNUC_VISIBLE int spice_server_set_compat_version(SpiceServer *s, +SPICE_GNUC_VISIBLE int spice_server_set_compat_version(SpiceServer *reds, spice_compat_version_t version) { if (version < SPICE_COMPAT_VERSION_0_6) { @@ -3536,28 +3544,25 @@ SPICE_GNUC_VISIBLE int spice_server_set_compat_version(SpiceServer *s, return 0; } -SPICE_GNUC_VISIBLE int spice_server_set_port(SpiceServer *s, int port) +SPICE_GNUC_VISIBLE int spice_server_set_port(SpiceServer *reds, int port) { - spice_assert(reds == s); if (port < 0 || port > 0xffff) { return -1; } - s->spice_port = port; + reds->spice_port = port; return 0; } -SPICE_GNUC_VISIBLE void spice_server_set_addr(SpiceServer *s, const char *addr, int flags) +SPICE_GNUC_VISIBLE void spice_server_set_addr(SpiceServer *reds, const char *addr, int flags) { - spice_assert(reds == s); - - g_strlcpy(s->spice_addr, addr, sizeof(s->spice_addr)); + g_strlcpy(reds->spice_addr, addr, sizeof(reds->spice_addr)); if (flags == SPICE_ADDR_FLAG_IPV4_ONLY) { - s->spice_family = PF_INET; + reds->spice_family = PF_INET; } else if (flags == SPICE_ADDR_FLAG_IPV6_ONLY) { - s->spice_family = PF_INET6; + reds->spice_family = PF_INET6; } else if (flags == SPICE_ADDR_FLAG_UNIX_ONLY) { - s->spice_family = AF_UNIX; + reds->spice_family = AF_UNIX; } else if (flags != 0) { spice_warning("unknown address flag: 0x%X", flags); } @@ -3565,21 +3570,18 @@ SPICE_GNUC_VISIBLE void spice_server_set_addr(SpiceServer *s, const char *addr, SPICE_GNUC_VISIBLE int spice_server_set_listen_socket_fd(SpiceServer *s, int listen_fd) { - spice_assert(reds == s); s->spice_listen_socket_fd = listen_fd; return 0; } SPICE_GNUC_VISIBLE int spice_server_set_exit_on_disconnect(SpiceServer *s, int flag) { - spice_assert(reds == s); s->exit_on_disconnect = !!flag; return 0; } SPICE_GNUC_VISIBLE int spice_server_set_noauth(SpiceServer *s) { - spice_assert(reds == s); memset(s->taTicket.password, 0, sizeof(s->taTicket.password)); s->ticketing_enabled = FALSE; return 0; @@ -3587,7 +3589,6 @@ SPICE_GNUC_VISIBLE int spice_server_set_noauth(SpiceServer *s) SPICE_GNUC_VISIBLE int spice_server_set_sasl(SpiceServer *s, int enabled) { - spice_assert(reds == s); #if HAVE_SASL s->sasl_enabled = enabled; return 0; @@ -3598,7 +3599,6 @@ SPICE_GNUC_VISIBLE int spice_server_set_sasl(SpiceServer *s, int enabled) SPICE_GNUC_VISIBLE int spice_server_set_sasl_appname(SpiceServer *s, const char *appname) { - spice_assert(reds == s); #if HAVE_SASL free(s->sasl_appname); s->sasl_appname = spice_strdup(appname); @@ -3620,13 +3620,11 @@ SPICE_GNUC_VISIBLE void spice_server_set_uuid(SpiceServer *s, const uint8_t uuid s->spice_uuid_is_set = TRUE; } -SPICE_GNUC_VISIBLE int spice_server_set_ticket(SpiceServer *s, +SPICE_GNUC_VISIBLE int spice_server_set_ticket(SpiceServer *reds, const char *passwd, int lifetime, int fail_if_connected, int disconnect_if_connected) { - spice_assert(reds == s); - if (reds_main_channel_connected(reds)) { if (fail_if_connected) { return -1; @@ -3660,7 +3658,6 @@ SPICE_GNUC_VISIBLE int spice_server_set_tls(SpiceServer *s, int port, const char *private_key_file, const char *key_passwd, const char *dh_key_file, const char *ciphersuite) { - spice_assert(reds == s); if (port == 0 || ca_cert_file == NULL || certs_file == NULL || private_key_file == NULL) { return -1; @@ -3696,7 +3693,6 @@ SPICE_GNUC_VISIBLE int spice_server_set_tls(SpiceServer *s, int port, SPICE_GNUC_VISIBLE int spice_server_set_image_compression(SpiceServer *s, SpiceImageCompression comp) { - spice_assert(reds == s); #ifndef USE_LZ4 if (comp == SPICE_IMAGE_COMPRESSION_LZ4) { spice_warning("LZ4 compression not supported, falling back to auto GLZ"); @@ -3711,13 +3707,11 @@ SPICE_GNUC_VISIBLE int spice_server_set_image_compression(SpiceServer *s, SPICE_GNUC_VISIBLE SpiceImageCompression spice_server_get_image_compression(SpiceServer *s) { - spice_assert(reds == s); return s->image_compression; } SPICE_GNUC_VISIBLE int spice_server_set_jpeg_compression(SpiceServer *s, spice_wan_compression_t comp) { - spice_assert(reds == s); if (comp == SPICE_WAN_COMPRESSION_INVALID) { spice_error("invalid jpeg state"); return -1; @@ -3729,7 +3723,6 @@ SPICE_GNUC_VISIBLE int spice_server_set_jpeg_compression(SpiceServer *s, spice_w SPICE_GNUC_VISIBLE int spice_server_set_zlib_glz_compression(SpiceServer *s, spice_wan_compression_t comp) { - spice_assert(reds == s); if (comp == SPICE_WAN_COMPRESSION_INVALID) { spice_error("invalid zlib_glz state"); return -1; @@ -3756,8 +3749,6 @@ SPICE_GNUC_VISIBLE int spice_server_set_channel_security(SpiceServer *s, const c }; int i; - spice_assert(reds == s); - if (channel == NULL) { s->default_channel_security = security; return 0; @@ -3771,34 +3762,30 @@ SPICE_GNUC_VISIBLE int spice_server_set_channel_security(SpiceServer *s, const c return -1; } -SPICE_GNUC_VISIBLE int spice_server_get_sock_info(SpiceServer *s, struct sockaddr *sa, socklen_t *salen) +SPICE_GNUC_VISIBLE int spice_server_get_sock_info(SpiceServer *reds, struct sockaddr *sa, socklen_t *salen) { - spice_assert(reds == s); if (main_channel_getsockname(reds->main_channel, sa, salen) < 0) { return -1; } return 0; } -SPICE_GNUC_VISIBLE int spice_server_get_peer_info(SpiceServer *s, struct sockaddr *sa, socklen_t *salen) +SPICE_GNUC_VISIBLE int spice_server_get_peer_info(SpiceServer *reds, struct sockaddr *sa, socklen_t *salen) { - spice_assert(reds == s); if (main_channel_getpeername(reds->main_channel, sa, salen) < 0) { return -1; } return 0; } -SPICE_GNUC_VISIBLE int spice_server_is_server_mouse(SpiceServer *s) +SPICE_GNUC_VISIBLE int spice_server_is_server_mouse(SpiceServer *reds) { - spice_assert(reds == s); return reds->mouse_mode == SPICE_MOUSE_MODE_SERVER; } -SPICE_GNUC_VISIBLE int spice_server_add_renderer(SpiceServer *s, const char *name) +SPICE_GNUC_VISIBLE int spice_server_add_renderer(SpiceServer *reds, const char *name) { - spice_assert(reds == s); - if (!reds_add_renderer(s, name)) { + if (!reds_add_renderer(reds, name)) { return -1; } return 0; @@ -3811,14 +3798,13 @@ SPICE_GNUC_VISIBLE int spice_server_kbd_leds(SpiceKbdInstance *sin, int leds) return 0; } -SPICE_GNUC_VISIBLE int spice_server_set_streaming_video(SpiceServer *s, int value) +SPICE_GNUC_VISIBLE int spice_server_set_streaming_video(SpiceServer *reds, int value) { - spice_assert(reds == s); if (value != SPICE_STREAM_VIDEO_OFF && value != SPICE_STREAM_VIDEO_ALL && value != SPICE_STREAM_VIDEO_FILTER) return -1; - s->streaming_video = value; + reds->streaming_video = value; reds_on_sv_change(reds); return 0; } @@ -3828,36 +3814,32 @@ uint32_t reds_get_streaming_video(const RedsState *reds) return reds->streaming_video; } -SPICE_GNUC_VISIBLE int spice_server_set_playback_compression(SpiceServer *s, int enable) +SPICE_GNUC_VISIBLE int spice_server_set_playback_compression(SpiceServer *reds, int enable) { - spice_assert(reds == s); snd_set_playback_compression(enable); return 0; } -SPICE_GNUC_VISIBLE int spice_server_set_agent_mouse(SpiceServer *s, int enable) +SPICE_GNUC_VISIBLE int spice_server_set_agent_mouse(SpiceServer *reds, int enable) { - spice_assert(reds == s); reds->agent_mouse = enable; reds_update_mouse_mode(reds); return 0; } -SPICE_GNUC_VISIBLE int spice_server_set_agent_copypaste(SpiceServer *s, int enable) +SPICE_GNUC_VISIBLE int spice_server_set_agent_copypaste(SpiceServer *reds, int enable) { - spice_assert(reds == s); - s->agent_copypaste = enable; - reds->agent_state.write_filter.copy_paste_enabled = s->agent_copypaste; - reds->agent_state.read_filter.copy_paste_enabled = s->agent_copypaste; + reds->agent_copypaste = enable; + reds->agent_state.write_filter.copy_paste_enabled = reds->agent_copypaste; + reds->agent_state.read_filter.copy_paste_enabled = reds->agent_copypaste; return 0; } -SPICE_GNUC_VISIBLE int spice_server_set_agent_file_xfer(SpiceServer *s, int enable) +SPICE_GNUC_VISIBLE int spice_server_set_agent_file_xfer(SpiceServer *reds, int enable) { - spice_assert(reds == s); - s->agent_file_xfer = enable; - reds->agent_state.write_filter.file_xfer_enabled = s->agent_file_xfer; - reds->agent_state.read_filter.file_xfer_enabled = s->agent_file_xfer; + reds->agent_file_xfer = enable; + reds->agent_state.write_filter.file_xfer_enabled = reds->agent_file_xfer; + reds->agent_state.read_filter.file_xfer_enabled = reds->agent_file_xfer; return 0; } @@ -3888,7 +3870,7 @@ static int reds_set_migration_dest_info(RedsState *reds, } /* semi-seamless client migration */ -SPICE_GNUC_VISIBLE int spice_server_migrate_connect(SpiceServer *s, const char* dest, +SPICE_GNUC_VISIBLE int spice_server_migrate_connect(SpiceServer *reds, const char* dest, int port, int secure_port, const char* cert_subject) { @@ -3896,18 +3878,17 @@ SPICE_GNUC_VISIBLE int spice_server_migrate_connect(SpiceServer *s, const char* int try_seamless; spice_info(NULL); - spice_assert(s->migration_interface); - spice_assert(reds == s); + spice_assert(reds->migration_interface); if (reds->expect_migrate) { spice_info("consecutive calls without migration. Canceling previous call"); main_channel_migrate_src_complete(reds->main_channel, FALSE); } - sif = SPICE_CONTAINEROF(s->migration_interface->base.sif, SpiceMigrateInterface, base); + sif = SPICE_CONTAINEROF(reds->migration_interface->base.sif, SpiceMigrateInterface, base); if (!reds_set_migration_dest_info(reds, dest, port, secure_port, cert_subject)) { - sif->migrate_connect_complete(s->migration_interface); + sif->migrate_connect_complete(reds->migration_interface); return -1; } @@ -3933,18 +3914,18 @@ SPICE_GNUC_VISIBLE int spice_server_migrate_connect(SpiceServer *s, const char* reds_mig_release(reds); spice_info("no client connected"); } - sif->migrate_connect_complete(s->migration_interface); + sif->migrate_connect_complete(reds->migration_interface); } return 0; } -SPICE_GNUC_VISIBLE int spice_server_migrate_info(SpiceServer *s, const char* dest, +SPICE_GNUC_VISIBLE int spice_server_migrate_info(SpiceServer *reds, const char* dest, int port, int secure_port, const char* cert_subject) { spice_info(NULL); - spice_assert(!s->migration_interface); + spice_assert(!reds->migration_interface); if (!reds_set_migration_dest_info(reds, dest, port, secure_port, cert_subject)) { return -1; @@ -3952,9 +3933,8 @@ SPICE_GNUC_VISIBLE int spice_server_migrate_info(SpiceServer *s, const char* des return 0; } -SPICE_GNUC_VISIBLE int spice_server_migrate_start(SpiceServer *s) +SPICE_GNUC_VISIBLE int spice_server_migrate_start(SpiceServer *reds) { - spice_assert(reds == s); spice_info(NULL); if (!reds->mig_spice) { return -1; @@ -3962,17 +3942,16 @@ SPICE_GNUC_VISIBLE int spice_server_migrate_start(SpiceServer *s) return 0; } -SPICE_GNUC_VISIBLE int spice_server_migrate_end(SpiceServer *s, int completed) +SPICE_GNUC_VISIBLE int spice_server_migrate_end(SpiceServer *reds, int completed) { SpiceMigrateInterface *sif; int ret = 0; spice_info(NULL); - spice_assert(s->migration_interface); - spice_assert(reds == s); + spice_assert(reds->migration_interface); - sif = SPICE_CONTAINEROF(s->migration_interface->base.sif, SpiceMigrateInterface, base); + sif = SPICE_CONTAINEROF(reds->migration_interface->base.sif, SpiceMigrateInterface, base); if (completed && !reds->expect_migrate && reds->num_clients) { spice_warning("spice_server_migrate_info was not called, disconnecting clients"); reds_disconnect(reds); @@ -3989,15 +3968,14 @@ SPICE_GNUC_VISIBLE int spice_server_migrate_end(SpiceServer *s, int completed) return 0; complete: if (sif->migrate_end_complete) { - sif->migrate_end_complete(s->migration_interface); + sif->migrate_end_complete(reds->migration_interface); } return ret; } /* interface for switch-host migration */ -SPICE_GNUC_VISIBLE int spice_server_migrate_switch(SpiceServer *s) +SPICE_GNUC_VISIBLE int spice_server_migrate_switch(SpiceServer *reds) { - spice_assert(reds == s); spice_info(NULL); if (!reds->num_clients) { return 0; @@ -4007,11 +3985,10 @@ SPICE_GNUC_VISIBLE int spice_server_migrate_switch(SpiceServer *s) return 0; } -SPICE_GNUC_VISIBLE void spice_server_vm_start(SpiceServer *s) +SPICE_GNUC_VISIBLE void spice_server_vm_start(SpiceServer *reds) { RingItem *item; - spice_assert(s == reds); reds->vm_running = TRUE; RING_FOREACH(item, &reds->char_devs_states) { SpiceCharDeviceStateItem *st_item; @@ -4022,11 +3999,10 @@ SPICE_GNUC_VISIBLE void spice_server_vm_start(SpiceServer *s) reds_on_vm_start(reds); } -SPICE_GNUC_VISIBLE void spice_server_vm_stop(SpiceServer *s) +SPICE_GNUC_VISIBLE void spice_server_vm_stop(SpiceServer *reds) { RingItem *item; - spice_assert(s == reds); reds->vm_running = FALSE; RING_FOREACH(item, &reds->char_devs_states) { SpiceCharDeviceStateItem *st_item; @@ -4037,17 +4013,15 @@ SPICE_GNUC_VISIBLE void spice_server_vm_stop(SpiceServer *s) reds_on_vm_stop(reds); } -SPICE_GNUC_VISIBLE void spice_server_set_seamless_migration(SpiceServer *s, int enable) +SPICE_GNUC_VISIBLE void spice_server_set_seamless_migration(SpiceServer *reds, int enable) { - spice_assert(s == reds); /* seamless migration is not supported with multiple clients */ reds->seamless_migration_enabled = enable && !reds->allow_multiple_clients; spice_debug("seamless migration enabled=%d", enable); } -SPICE_GNUC_VISIBLE void spice_server_set_keepalive_timeout(SpiceServer *s, int timeout) +SPICE_GNUC_VISIBLE void spice_server_set_keepalive_timeout(SpiceServer *reds, int timeout) { - spice_assert(s == reds); reds->keepalive_timeout = timeout; spice_debug("keepalive timeout=%d", timeout); } diff --git a/server/reds.h b/server/reds.h index 891a1ea..8e9bbbc 100644 --- a/server/reds.h +++ b/server/reds.h @@ -32,7 +32,6 @@ #include "migration-protocol.h" typedef struct RedsState RedsState; -extern RedsState *reds; struct QXLState { QXLInterface *qif; diff --git a/server/smartcard.c b/server/smartcard.c index c7b1f30..565a71d 100644 --- a/server/smartcard.c +++ b/server/smartcard.c @@ -107,7 +107,7 @@ static struct Readers { static SpiceCharDeviceInstance* smartcard_readers_get_unattached(void); static SpiceCharDeviceInstance* smartcard_readers_get(uint32_t reader_id); -static int smartcard_char_device_add_to_readers(SpiceCharDeviceInstance *sin); +static int smartcard_char_device_add_to_readers(RedsState *reds, SpiceCharDeviceInstance *sin); static void smartcard_char_device_attach_client( SpiceCharDeviceInstance *char_device, SmartCardChannelClient *scc); static void smartcard_channel_write_to_reader(SpiceCharDeviceWriteBuffer *write_buf); @@ -116,7 +116,7 @@ static MsgItem *smartcard_char_device_on_message_from_device( SmartCardDeviceState *state, VSCMsgHeader *header); static SmartCardDeviceState *smartcard_device_state_new(RedsState *reds, SpiceCharDeviceInstance *sin); static void smartcard_device_state_free(SmartCardDeviceState* st); -static void smartcard_init(void); +static void smartcard_init(RedsState *reds); static void smartcard_read_buf_prepare(SmartCardDeviceState *state, VSCMsgHeader *vheader) { @@ -231,7 +231,7 @@ MsgItem *smartcard_char_device_on_message_from_device(SmartCardDeviceState *stat return NULL; } -static int smartcard_char_device_add_to_readers(SpiceCharDeviceInstance *char_device) +static int smartcard_char_device_add_to_readers(RedsState *reds, SpiceCharDeviceInstance *char_device) { SmartCardDeviceState *state = spice_char_device_state_opaque_get(char_device->st); @@ -240,7 +240,7 @@ static int smartcard_char_device_add_to_readers(SpiceCharDeviceInstance *char_de } state->reader_id = g_smartcard_readers.num; g_smartcard_readers.sin[g_smartcard_readers.num++] = char_device; - smartcard_init(); + smartcard_init(reds); return 0; } @@ -317,7 +317,7 @@ SpiceCharDeviceState *smartcard_device_connect(RedsState *reds, SpiceCharDeviceI SmartCardDeviceState *st; st = smartcard_device_state_new(reds, char_device); - if (smartcard_char_device_add_to_readers(char_device) == -1) { + if (smartcard_char_device_add_to_readers(reds, char_device) == -1) { smartcard_device_state_free(st); return NULL; } @@ -830,7 +830,7 @@ static void smartcard_connect_client(RedChannel *channel, RedClient *client, SmartCardChannel *g_smartcard_channel; -static void smartcard_init(void) +static void smartcard_init(RedsState *reds) { ChannelCbs channel_cbs = { NULL, }; ClientCbs client_cbs = { NULL, }; @@ -849,8 +849,7 @@ static void smartcard_init(void) channel_cbs.handle_migrate_data = smartcard_channel_client_handle_migrate_data; g_smartcard_channel = (SmartCardChannel*)red_channel_create(sizeof(SmartCardChannel), - reds, - reds_get_core_interface(reds), + reds, reds_get_core_interface(reds), SPICE_CHANNEL_SMARTCARD, 0, FALSE /* handle_acks */, smartcard_channel_handle_message, -- 2.5.0 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel