diff options
-rw-r--r-- | server/reds.c | 31 | ||||
-rw-r--r-- | server/reds.h | 2 | ||||
-rw-r--r-- | server/spice.h | 19 |
3 files changed, 48 insertions, 4 deletions
diff --git a/server/reds.c b/server/reds.c index 5fafe400..fcdda798 100644 --- a/server/reds.c +++ b/server/reds.c @@ -385,6 +385,13 @@ static ChannelSecurityOptions *find_channel_security(int id) return now; } +static void reds_channel_event(RedsStreamContext *peer, int event) +{ + if (core->base.minor_version < 3 || core->channel_event == NULL) + return; + core->channel_event(event, &peer->info); +} + static int reds_write(void *ctx, void *buf, size_t size) { int return_code; @@ -409,6 +416,7 @@ static int reds_read(void *ctx, void *buf, size_t size) static int reds_free(RedsStreamContext *peer) { + reds_channel_event(peer, SPICE_CHANNEL_EVENT_DISCONNECTED); close(peer->socket); free(peer); return 0; @@ -471,6 +479,7 @@ static int reds_ssl_writev(void *ctx, const struct iovec *vector, int count) static int reds_ssl_free(RedsStreamContext *peer) { + reds_channel_event(peer, SPICE_CHANNEL_EVENT_DISCONNECTED); SSL_free(peer->ssl); close(peer->socket); free(peer); @@ -1980,12 +1989,20 @@ static int reds_send_link_error(RedLinkInfo *link, uint32_t error) sizeof(reply)); } -static void reds_show_new_channel(RedLinkInfo *link) +static void reds_show_new_channel(RedLinkInfo *link, int connection_id) { red_printf("channel %d:%d, connected successfully, over %s link", link->link_mess->channel_type, link->link_mess->channel_id, link->peer->ssl == NULL ? "Non Secure" : "Secure"); + /* add info + send event */ + if (link->peer->ssl) { + link->peer->info.flags |= SPICE_CHANNEL_EVENT_FLAG_TLS; + } + link->peer->info.connection_id = connection_id; + link->peer->info.type = link->link_mess->channel_type; + link->peer->info.id = link->link_mess->channel_id; + reds_channel_event(link->peer, SPICE_CHANNEL_EVENT_INITIALIZED); } static void reds_send_link_result(RedLinkInfo *link, uint32_t error) @@ -2038,7 +2055,7 @@ static void reds_handle_main_link(RedLinkInfo *link) reds->peer = link->peer; reds->in_handler.shut = FALSE; - reds_show_new_channel(link); + reds_show_new_channel(link, connection_id); __reds_release_link(link); if (vdagent) { SpiceCharDeviceInterface *sif; @@ -2530,7 +2547,7 @@ static void reds_handle_other_links(RedLinkInfo *link) } reds_send_link_result(link, SPICE_LINK_ERR_OK); - reds_show_new_channel(link); + reds_show_new_channel(link, reds->link_id); if (link_mess->channel_type == SPICE_CHANNEL_INPUTS && !link->peer->ssl) { RedsOutItem *item; SpiceMsgNotify notify; @@ -2813,6 +2830,14 @@ static RedLinkInfo *__reds_accept_connection(int listen_socket) peer = spice_new0(RedsStreamContext, 1); link->peer = peer; peer->socket = socket; + + /* gather info + send event */ + peer->info.llen = sizeof(peer->info.laddr); + peer->info.plen = sizeof(peer->info.paddr); + getsockname(peer->socket, (struct sockaddr*)(&peer->info.laddr), &peer->info.llen); + getpeername(peer->socket, (struct sockaddr*)(&peer->info.paddr), &peer->info.plen); + reds_channel_event(peer, SPICE_CHANNEL_EVENT_CONNECTED); + openssl_init(link); return link; diff --git a/server/reds.h b/server/reds.h index 6eed02be..e95aea5e 100644 --- a/server/reds.h +++ b/server/reds.h @@ -35,6 +35,8 @@ typedef struct RedsStreamContext { int shutdown; SSL *ssl; + SpiceChannelEventInfo info; + int (*cb_write)(void *, void *, int); int (*cb_read)(void *, void *, int); diff --git a/server/spice.h b/server/spice.h index 6f4c7820..e6304020 100644 --- a/server/spice.h +++ b/server/spice.h @@ -42,18 +42,34 @@ struct SpiceBaseInstance { #define SPICE_INTERFACE_CORE "core" #define SPICE_INTERFACE_CORE_MAJOR 1 -#define SPICE_INTERFACE_CORE_MINOR 2 +#define SPICE_INTERFACE_CORE_MINOR 3 typedef struct SpiceCoreInterface SpiceCoreInterface; #define SPICE_WATCH_EVENT_READ (1 << 0) #define SPICE_WATCH_EVENT_WRITE (1 << 1) +#define SPICE_CHANNEL_EVENT_CONNECTED 1 +#define SPICE_CHANNEL_EVENT_INITIALIZED 2 +#define SPICE_CHANNEL_EVENT_DISCONNECTED 3 + +#define SPICE_CHANNEL_EVENT_FLAG_TLS (1 << 0) + typedef struct SpiceWatch SpiceWatch; typedef void (*SpiceWatchFunc)(int fd, int event, void *opaque); typedef struct SpiceTimer SpiceTimer; typedef void (*SpiceTimerFunc)(void *opaque); +typedef struct SpiceChannelEventInfo { + int connection_id; + int type; + int id; + int flags; + struct sockaddr laddr; + struct sockaddr paddr; + socklen_t llen, plen; +} SpiceChannelEventInfo; + struct SpiceCoreInterface { SpiceBaseInterface base; @@ -66,6 +82,7 @@ struct SpiceCoreInterface { void (*watch_update_mask)(SpiceWatch *watch, int event_mask); void (*watch_remove)(SpiceWatch *watch); + void (*channel_event)(int event, SpiceChannelEventInfo *info); }; /* qxl interface */ |