spice_server_set_channel_security() is already mostly doing that. We can make its code more generic, and introduce a red_channel_get_name() method. This method will then be used to make debug messages more readable by showing the actual channel name rather than its type as an int. --- Changes since v3: - Added additional comment right next to the channel_names enum - Added one more sanity check to red_channel_type_to_str server/red-channel.c | 5 +++++ server/red-channel.h | 2 ++ server/reds.c | 33 ++++++++++++-------------------- server/utils.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++++ server/utils.h | 3 +++ 5 files changed, 75 insertions(+), 21 deletions(-) diff --git a/server/red-channel.c b/server/red-channel.c index 27cf9ac19..b3e98abc5 100644 --- a/server/red-channel.c +++ b/server/red-channel.c @@ -452,6 +452,11 @@ int red_channel_is_connected(RedChannel *channel) return channel && channel->priv->clients; } +const char *red_channel_get_name(RedChannel *channel) +{ + return red_channel_type_to_str(channel->priv->type); +} + void red_channel_remove_client(RedChannel *channel, RedChannelClient *rcc) { GList *link; diff --git a/server/red-channel.h b/server/red-channel.h index 573ddfd3b..70282197f 100644 --- a/server/red-channel.h +++ b/server/red-channel.h @@ -128,6 +128,8 @@ struct RedChannelClass GType red_channel_get_type(void) G_GNUC_CONST; +const char *red_channel_get_name(RedChannel *channel); + void red_channel_add_client(RedChannel *channel, RedChannelClient *rcc); void red_channel_remove_client(RedChannel *channel, RedChannelClient *rcc); diff --git a/server/reds.c b/server/reds.c index 816d0e699..0d0af05f4 100644 --- a/server/reds.c +++ b/server/reds.c @@ -3983,32 +3983,23 @@ SPICE_GNUC_VISIBLE int spice_server_set_zlib_glz_compression(SpiceServer *s, spi SPICE_GNUC_VISIBLE int spice_server_set_channel_security(SpiceServer *s, const char *channel, int security) { - static const char *const names[] = { - [ SPICE_CHANNEL_MAIN ] = "main", - [ SPICE_CHANNEL_DISPLAY ] = "display", - [ SPICE_CHANNEL_INPUTS ] = "inputs", - [ SPICE_CHANNEL_CURSOR ] = "cursor", - [ SPICE_CHANNEL_PLAYBACK ] = "playback", - [ SPICE_CHANNEL_RECORD ] = "record", -#ifdef USE_SMARTCARD - [ SPICE_CHANNEL_SMARTCARD] = "smartcard", -#endif - [ SPICE_CHANNEL_USBREDIR ] = "usbredir", - [ SPICE_CHANNEL_WEBDAV ] = "webdav", - }; - int i; - + int type; if (channel == NULL) { s->config->default_channel_security = security; return 0; } - for (i = 0; i < SPICE_N_ELEMENTS(names); i++) { - if (names[i] && strcmp(names[i], channel) == 0) { - reds_set_one_channel_security(s, i, security); - return 0; - } + type = red_channel_name_to_type(channel); +#ifndef USE_SMARTCARD + if (type == SPICE_CHANNEL_SMARTCARD) { + type = -1; } - return -1; +#endif + if (type == -1) { + return -1; + } + + reds_set_one_channel_security(s, type, security); + return 0; } /* very obsolete and old function, retain only for ABI */ diff --git a/server/utils.c b/server/utils.c index 66df86ff4..e25b78916 100644 --- a/server/utils.c +++ b/server/utils.c @@ -19,6 +19,7 @@ #endif #include <glib.h> +#include <spice/enums.h> #include "utils.h" int rgb32_data_has_alpha(int width, int height, size_t stride, @@ -48,3 +49,55 @@ int rgb32_data_has_alpha(int width, int height, size_t stride, *all_set_out = has_alpha; return has_alpha; } + +/* These names are used to parse command line options, don't change them */ +static const char *const channel_names[] = { + [ SPICE_CHANNEL_MAIN ] = "main", + [ SPICE_CHANNEL_DISPLAY ] = "display", + [ SPICE_CHANNEL_INPUTS ] = "inputs", + [ SPICE_CHANNEL_CURSOR ] = "cursor", + [ SPICE_CHANNEL_PLAYBACK ] = "playback", + [ SPICE_CHANNEL_RECORD ] = "record", + [ SPICE_CHANNEL_SMARTCARD] = "smartcard", + [ SPICE_CHANNEL_USBREDIR ] = "usbredir", + [ SPICE_CHANNEL_WEBDAV ] = "webdav", +}; + +/** + * red_channel_type_to_str: + * + * This function returns a human-readable name from a SPICE_CHANNEL_* type. + * It must be called with a valid channel type. + * + * Returns: NULL if the channel type is invalid, the channel name otherwise. + */ +const char *red_channel_type_to_str(int type) +{ + g_return_val_if_fail(type >= 0, NULL); + g_return_val_if_fail(type < G_N_ELEMENTS(channel_names), NULL); + g_return_val_if_fail(channel_names[type] != NULL, NULL); + + return channel_names[type]; +} + +/** + * red_channel_name_to_type: + * + * Converts a channel name to a SPICE_CHANNEL_* type. These names are currently + * used in our public API (see spice_server_set_channel_security()). + * + * Returns: -1 if @name was not a known channel name, the channel + * type otherwise. + * + */ +int red_channel_name_to_type(const char *name) +{ + int i; + + for (i = 0; i < G_N_ELEMENTS(channel_names); i++) { + if (g_strcmp0(channel_names[i], name) == 0) { + return i; + } + } + return -1; +} diff --git a/server/utils.h b/server/utils.h index ec2db2c90..3f735754d 100644 --- a/server/utils.h +++ b/server/utils.h @@ -74,4 +74,7 @@ static inline red_time_t spice_get_monotonic_time_ms(void) int rgb32_data_has_alpha(int width, int height, size_t stride, uint8_t *data, int *all_set_out); +const char *red_channel_type_to_str(int type); +int red_channel_name_to_type(const char *name); + #endif /* UTILS_H_ */ -- 2.13.6 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel