[Spice-devel] [PATCH server 0.8 1/3] server: introduce red_log and red_warn

Marc-André Lureau marcandre.lureau at gmail.com
Sun Oct 9 09:37:30 PDT 2011


Hi

On Sun, Oct 9, 2011 at 4:29 PM, Alon Levy <alevy at redhat.com> wrote:
> change all red_printf variants to call red_log, including red_warn.
> Introduce a static (per compile unit) spice_log_level, settable on
> first access (via get_spice_log_level) from the environment variable
> SPICE_LOG_LEVEL (we already have SPICEC_LOG_LEVEL and spice-gtk has
> SPICE_DEBUG, though much more verbose and useful, but relying on glib).
>
> This might seem like a waste of time if we move to glib, but we haven't
> yet and I want the ability to add prints that are not on by default into
> the code base (as opposed to locally for each developer).

As we discussed on IRC, I think changing logging is fairly easy, so as
long as it call a function such as red_warn ("blah blah"); It's easy
to move to use something else in the future.

However, red_log(2, "blah"); is bad for several reasons. Why not use
red_debug()?

> ---
>  server/agent-msg-filter.c       |    8 +-
>  server/red_channel.c            |   12 +-
>  server/red_common.h             |   45 ++++-
>  server/red_dispatcher.c         |   19 +-
>  server/red_tunnel_worker.c      |  142 ++++++++--------
>  server/red_worker.c             |  160 +++++++++---------
>  server/reds.c                   |  372 +++++++++++++++++++-------------------
>  server/smartcard.c              |   14 +-
>  server/snd_worker.c             |   42 +++---
>  server/tests/basic_event_loop.c |    1 +
>  server/zlib_encoder.c           |    2 +-
>  11 files changed, 426 insertions(+), 391 deletions(-)
>
> diff --git a/server/agent-msg-filter.c b/server/agent-msg-filter.c
> index cd1f78c..afa0f76 100644
> --- a/server/agent-msg-filter.c
> +++ b/server/agent-msg-filter.c
> @@ -36,7 +36,7 @@ int agent_msg_filter_process_data(struct AgentMsgFilter *filter,
>     struct VDAgentMessage msg_header;
>
>     if (len > VD_AGENT_MAX_DATA_SIZE) {
> -        red_printf("invalid agent message: too large");
> +        red_warn("invalid agent message: too large");
>         return AGENT_MSG_FILTER_PROTO_ERROR;
>     }
>
> @@ -44,7 +44,7 @@ int agent_msg_filter_process_data(struct AgentMsgFilter *filter,
>     if (filter->msg_data_to_read) {
>  data_to_read:
>         if (len > filter->msg_data_to_read) {
> -            red_printf("invalid agent message: data exceeds size from header");
> +            red_warn("invalid agent message: data exceeds size from header");
>             return AGENT_MSG_FILTER_PROTO_ERROR;
>         }
>         filter->msg_data_to_read -= len;
> @@ -52,14 +52,14 @@ data_to_read:
>     }
>
>     if (len < sizeof(msg_header)) {
> -        red_printf("invalid agent message: incomplete header");
> +        red_warn("invalid agent message: incomplete header");
>         return AGENT_MSG_FILTER_PROTO_ERROR;
>     }
>     memcpy(&msg_header, data, sizeof(msg_header));
>     len -= sizeof(msg_header);
>
>     if (msg_header.protocol != VD_AGENT_PROTOCOL) {
> -        red_printf("invalid agent protocol: %u", msg_header.protocol);
> +        red_warn("invalid agent protocol: %u", msg_header.protocol);
>         return AGENT_MSG_FILTER_PROTO_ERROR;
>     }
>
> diff --git a/server/red_channel.c b/server/red_channel.c
> index da0fb9f..b7c0db5 100644
> --- a/server/red_channel.c
> +++ b/server/red_channel.c
> @@ -55,7 +55,7 @@ static int red_peer_receive(RedsStream *stream, uint8_t *buf, uint32_t size)
>             } else if (errno == EPIPE) {
>                 return -1;
>             } else {
> -                red_printf("%s", strerror(errno));
> +                red_warn("%s", strerror(errno));
>                 return -1;
>             }
>         } else {
> @@ -91,7 +91,7 @@ static void red_peer_handle_incoming(RedsStream *stream, IncomingHandler *handle
>             if (!handler->msg) {
>                 handler->msg = handler->alloc_msg_buf(handler->opaque, &handler->header);
>                 if (handler->msg == NULL) {
> -                    red_printf("ERROR: channel refused to allocate buffer.");
> +                    red_warn("ERROR: channel refused to allocate buffer.");
>                     handler->on_error(handler->opaque);
>                     return;
>                 }
> @@ -165,7 +165,7 @@ static void red_peer_handle_outgoing(RedsStream *stream, OutgoingHandler *handle
>                 handler->on_error(handler->opaque);
>                 return;
>             default:
> -                red_printf("%s", strerror(errno));
> +                red_warn("%s", strerror(errno));
>                 handler->on_error(handler->opaque);
>                 return;
>             }
> @@ -314,7 +314,7 @@ void red_channel_destroy(RedChannel *channel)
>
>  void red_channel_shutdown(RedChannel *channel)
>  {
> -    red_printf("");
> +    red_log(2, "");
>     if (channel->stream && !channel->stream->shutdown) {
>         channel->core->watch_update_mask(channel->stream->watch,
>                                          SPICE_WATCH_EVENT_READ);
> @@ -335,7 +335,7 @@ int red_channel_handle_message(RedChannel *channel, SpiceDataHeader *header, uin
>     switch (header->type) {
>     case SPICE_MSGC_ACK_SYNC:
>         if (header->size != sizeof(uint32_t)) {
> -            red_printf("bad message size");
> +            red_warn("bad message size");
>             return FALSE;
>         }
>         channel->ack_data.client_generation = *(uint32_t *)(msg);
> @@ -347,7 +347,7 @@ int red_channel_handle_message(RedChannel *channel, SpiceDataHeader *header, uin
>         }
>         break;
>     default:
> -        red_printf("invalid message type %u", header->type);
> +        red_warn("invalid message type %u", header->type);
>         return FALSE;
>     }
>     return TRUE;
> diff --git a/server/red_common.h b/server/red_common.h
> index c863922..c060495 100644
> --- a/server/red_common.h
> +++ b/server/red_common.h
> @@ -26,6 +26,31 @@
>  #include <messages.h>
>  #include <spice/macros.h>
>
> +#define LOG_INVALID -1
> +#define LOG_NONE 0
> +#define LOG_WARN 1
> +/* anything higher is not defined */
> +
> +#define SPICE_DEFAULT_LOG_LEVEL LOG_WARN
> +
> +static int spice_log_level = LOG_INVALID;
> +
> +static inline int get_spice_log_level(void) {
> +    char *log_level;
> +
> +    if (spice_log_level != LOG_INVALID) {
> +        return spice_log_level;
> +    }
> +    log_level = getenv("SPICE_LOG_LEVEL");
> +
> +    if (log_level == NULL) {
> +        spice_log_level = SPICE_DEFAULT_LOG_LEVEL;
> +    } else {
> +        spice_log_level = atoi(log_level);
> +    }
> +    return spice_log_level;
> +}
> +
>  #define ASSERT(x) if (!(x)) {                               \
>     printf("%s: ASSERT %s failed\n", __FUNCTION__, #x);     \
>     abort();                                                \
> @@ -46,23 +71,29 @@
>     abort();                                                     \
>  }
>
> -#define red_printf(format, ...) \
> -    printf("%s: " format "\n", __FUNCTION__, ## __VA_ARGS__ )
> +#define red_warn(format, ...) red_log(LOG_WARN, format, ## __VA_ARGS__)
>
> -#define red_printf_once(format, ...) {                              \
> +#define red_log(level, format, ...)                                     \
> +    do {                                                                \
> +        if (level <= get_spice_log_level()) {                           \
> +            printf("spice(%d) %s: " format "\n", level, __FUNCTION__, ## __VA_ARGS__ );  \
> +        }                                                               \
> +    } while (0)
> +
> +#define red_log_once(level, format, ...) {                       \
>     static int do_print = TRUE;                                     \
>     if (do_print) {                                                 \
>         do_print = FALSE;                                           \
> -        printf("%s: " format "\n", __FUNCTION__, ## __VA_ARGS__ );  \
> +        red_log(level, "%s: " format "\n", __FUNCTION__, ## __VA_ARGS__ );  \
>     }                                                               \
>  }
>
> -#define red_printf_some(every, format, ...) {                       \
> +#define red_log_some(level, every, format, ...) do {                \
>     static int count = 0;                                           \
>     if (count++ % (every) == 0) {                                   \
> -        printf("%s: " format "\n", __FUNCTION__, ## __VA_ARGS__ );  \
> +        red_log(level, "%s: " format "\n", __FUNCTION__, ## __VA_ARGS__ );  \
>     }                                                               \
> -}
> +} while (0)
>
>  enum {
>     STREAM_VIDEO_INVALID,
> diff --git a/server/red_dispatcher.c b/server/red_dispatcher.c
> index f74b13e..f846a8c 100644
> --- a/server/red_dispatcher.c
> +++ b/server/red_dispatcher.c
> @@ -79,7 +79,7 @@ static void red_dispatcher_set_peer(Channel *channel, RedsStream *stream, int mi
>  {
>     RedDispatcher *dispatcher;
>
> -    red_printf("");
> +    red_log(2, "");
>     dispatcher = (RedDispatcher *)channel->data;
>     RedWorkerMessage message = RED_WORKER_MESSAGE_DISPLAY_CONNECT;
>     write_message(dispatcher->channel, &message);
> @@ -90,7 +90,7 @@ static void red_dispatcher_set_peer(Channel *channel, RedsStream *stream, int mi
>  static void red_dispatcher_shutdown_peer(Channel *channel)
>  {
>     RedDispatcher *dispatcher = (RedDispatcher *)channel->data;
> -    red_printf("");
> +    red_log(2, "");
>     RedWorkerMessage message = RED_WORKER_MESSAGE_DISPLAY_DISCONNECT;
>     write_message(dispatcher->channel, &message);
>  }
> @@ -98,7 +98,7 @@ static void red_dispatcher_shutdown_peer(Channel *channel)
>  static void red_dispatcher_migrate(Channel *channel)
>  {
>     RedDispatcher *dispatcher = (RedDispatcher *)channel->data;
> -    red_printf("channel type %u id %u", channel->type, channel->id);
> +    red_log(2, "channel type %u id %u", channel->type, channel->id);
>     RedWorkerMessage message = RED_WORKER_MESSAGE_DISPLAY_MIGRATE;
>     write_message(dispatcher->channel, &message);
>  }
> @@ -109,7 +109,7 @@ static void red_dispatcher_set_cursor_peer(Channel *channel, RedsStream *stream,
>                                            uint32_t *caps)
>  {
>     RedDispatcher *dispatcher = (RedDispatcher *)channel->data;
> -    red_printf("");
> +    red_log(2, "");
>     RedWorkerMessage message = RED_WORKER_MESSAGE_CURSOR_CONNECT;
>     write_message(dispatcher->channel, &message);
>     send_data(dispatcher->channel, &stream, sizeof(RedsStream *));
> @@ -119,7 +119,7 @@ static void red_dispatcher_set_cursor_peer(Channel *channel, RedsStream *stream,
>  static void red_dispatcher_shutdown_cursor_peer(Channel *channel)
>  {
>     RedDispatcher *dispatcher = (RedDispatcher *)channel->data;
> -    red_printf("");
> +    red_log(2, "");
>     RedWorkerMessage message = RED_WORKER_MESSAGE_CURSOR_DISCONNECT;
>     write_message(dispatcher->channel, &message);
>  }
> @@ -127,7 +127,7 @@ static void red_dispatcher_shutdown_cursor_peer(Channel *channel)
>  static void red_dispatcher_cursor_migrate(Channel *channel)
>  {
>     RedDispatcher *dispatcher = (RedDispatcher *)channel->data;
> -    red_printf("channel type %u id %u", channel->type, channel->id);
> +    red_log(2, "channel type %u id %u", channel->type, channel->id);
>     RedWorkerMessage message = RED_WORKER_MESSAGE_CURSOR_MIGRATE;
>     write_message(dispatcher->channel, &message);
>  }
> @@ -229,7 +229,8 @@ static RedWorkerMessage red_dispatcher_async_start(RedDispatcher *dispatcher,
>  {
>     pthread_mutex_lock(&dispatcher->async_lock);
>     if (dispatcher->async_message != RED_WORKER_MESSAGE_NOP) {
> -        red_printf("error: async clash. second async ignored");
> +        red_warn("warning: async clash. have %d, ignoring %d",
> +                   dispatcher->async_message, message);
>         pthread_mutex_unlock(&dispatcher->async_lock);
>         return RED_WORKER_MESSAGE_NOP;
>     }
> @@ -570,7 +571,7 @@ static void red_dispatcher_loadvm_commands(RedDispatcher *dispatcher,
>  {
>     RedWorkerMessage message = RED_WORKER_MESSAGE_LOADVM_COMMANDS;
>
> -    red_printf("");
> +    red_log(2, "");
>     write_message(dispatcher->channel, &message);
>     send_data(dispatcher->channel, &count, sizeof(uint32_t));
>     send_data(dispatcher->channel, ext, sizeof(QXLCommandExt) * count);
> @@ -824,7 +825,7 @@ void red_dispatcher_async_complete(struct RedDispatcher *dispatcher, uint64_t co
>     case RED_WORKER_MESSAGE_FLUSH_SURFACES_ASYNC:
>         break;
>     default:
> -        red_printf("unexpected message");
> +        red_warn("unexpected message");
>     }
>     dispatcher->async_message = RED_WORKER_MESSAGE_NOP;
>     pthread_mutex_unlock(&dispatcher->async_lock);
> diff --git a/server/red_tunnel_worker.c b/server/red_tunnel_worker.c
> index 46cccb5..b90f253 100644
> --- a/server/red_tunnel_worker.c
> +++ b/server/red_tunnel_worker.c
> @@ -41,7 +41,7 @@
>  //#define DEBUG_NETWORK
>
>  #ifdef DEBUG_NETWORK
> -#define PRINT_SCKT(sckt) red_printf("TUNNEL_DBG SOCKET(connection_id=%d port=%d, service=%d)",\
> +#define PRINT_SCKT(sckt) red_log(2, "TUNNEL_DBG SOCKET(connection_id=%d port=%d, service=%d)",\
>                                     sckt->connection_id, ntohs(sckt->local_port),             \
>                                     sckt->far_service->id)
>  #endif
> @@ -477,7 +477,7 @@ static inline void tunnel_channel_activate_migrated_sockets(TunnelChannel *chann
>    failed (which triggered from a call to slirp) */
>  #define SET_TUNNEL_ERROR(channel,format, ...) {   \
>     channel->tunnel_error = TRUE;                 \
> -    red_printf(format, ## __VA_ARGS__);           \
> +    red_warn(format, ## __VA_ARGS__);             \
>  }
>
>  /* should be checked after each subroutine that may cause error or after calls to slirp routines */
> @@ -608,7 +608,8 @@ static void handle_tunnel_channel_migrate(struct Channel *channel);
>  static void tunnel_shutdown(TunnelWorker *worker)
>  {
>     int i;
> -    red_printf("");
> +
> +    red_log(2, "");
>     /* shutdown input from channel */
>     if (worker->channel) {
>         red_channel_shutdown(&worker->channel->base);
> @@ -1054,7 +1055,7 @@ static inline TunnelService *__tunnel_worker_add_service(TunnelWorker *worker, u
>         TunnelService *service_of_same_group;
>         if (!(service_of_same_group = __tunnel_worker_find_service_of_group(worker, group))) {
>             if (!net_slirp_allocate_virtual_ip(&new_service->virt_ip)) {
> -                red_printf("failed to allocate virtual ip");
> +                red_warn("failed to allocate virtual ip");
>                 free(new_service);
>                 return NULL;
>             }
> @@ -1062,7 +1063,7 @@ static inline TunnelService *__tunnel_worker_add_service(TunnelWorker *worker, u
>             if (strcmp(name, service_of_same_group->name) == 0) {
>                 new_service->virt_ip.s_addr = service_of_same_group->virt_ip.s_addr;
>             } else {
> -                red_printf("inconsistent name for service group %d", group);
> +                red_warn("inconsistent name for service group %d", group);
>                 free(new_service);
>                 return NULL;
>             }
> @@ -1084,7 +1085,7 @@ static inline TunnelService *__tunnel_worker_add_service(TunnelWorker *worker, u
>     worker->num_services++;
>
>  #ifdef DEBUG_NETWORK
> -    red_printf("TUNNEL_DBG: ==>SERVICE ADDED: id=%d virt ip=%s port=%d name=%s desc=%s",
> +    red_log(2, "TUNNEL_DBG: ==>SERVICE ADDED: id=%d virt ip=%s port=%d name=%s desc=%s",
>                new_service->id, inet_ntoa(new_service->virt_ip),
>                new_service->port, new_service->name, new_service->description);
>  #endif
> @@ -1137,12 +1138,12 @@ static TunnelPrintService *tunnel_worker_add_print_service(TunnelWorker *worker,
>     if (redc_service->type == SPICE_TUNNEL_IP_TYPE_IPv4) {
>         memcpy(service->ip, redc_service->u.ip.data, sizeof(SpiceTunnelIPv4));
>     } else {
> -        red_printf("unexpected ip type=%d", redc_service->type);
> +        red_warn("unexpected ip type=%d", redc_service->type);
>         tunnel_worker_free_print_service(worker, service);
>         return NULL;
>     }
>  #ifdef DEBUG_NETWORK
> -    red_printf("TUNNEL_DBG: ==>PRINT SERVICE ADDED: ip=%d.%d.%d.%d", service->ip[0],
> +    red_log(2, "TUNNEL_DBG: ==>PRINT SERVICE ADDED: ip=%d.%d.%d.%d", service->ip[0],
>                service->ip[1], service->ip[2], service->ip[3]);
>  #endif
>     return service;
> @@ -1159,7 +1160,7 @@ static int tunnel_channel_handle_service_add(TunnelChannel *channel,
>         out_service = tunnel_worker_add_service(channel->worker, sizeof(TunnelService),
>                                                 service_msg);
>     } else {
> -        red_printf("invalid service type");
> +        red_warn("invalid service type");
>     }
>
>     free(service_msg);
> @@ -1412,7 +1413,7 @@ static int tunnel_channel_handle_socket_connect_ack(TunnelChannel *channel, RedS
>                                                     uint32_t tokens)
>  {
>  #ifdef DEBUG_NETWORK
> -    red_printf("TUNNEL_DBG");
> +    red_log(2, "TUNNEL_DBG");
>  #endif
>     if (channel->mig_inprogress || channel->base.migrate) {
>         sckt->mig_client_status_msg = SPICE_MSGC_TUNNEL_SOCKET_OPEN_ACK;
> @@ -1421,7 +1422,7 @@ static int tunnel_channel_handle_socket_connect_ack(TunnelChannel *channel, RedS
>     }
>
>     if (sckt->client_status != CLIENT_SCKT_STATUS_WAIT_OPEN) {
> -        red_printf("unexpected SPICE_MSGC_TUNNEL_SOCKET_OPEN_ACK status=%d", sckt->client_status);
> +        red_warn("unexpected SPICE_MSGC_TUNNEL_SOCKET_OPEN_ACK status=%d", sckt->client_status);
>         return FALSE;
>     }
>     sckt->client_status = CLIENT_SCKT_STATUS_OPEN;
> @@ -1435,7 +1436,7 @@ static int tunnel_channel_handle_socket_connect_ack(TunnelChannel *channel, RedS
>         sckt->out_data.num_tokens = tokens;
>         net_slirp_socket_connected_notify(sckt->slirp_sckt);
>     } else {
> -        red_printf("unexpected slirp status status=%d", sckt->slirp_status);
> +        red_warn("unexpected slirp status status=%d", sckt->slirp_status);
>         return FALSE;
>     }
>
> @@ -1453,7 +1454,7 @@ static int tunnel_channel_handle_socket_connect_nack(TunnelChannel *channel, Red
>     }
>
>     if (sckt->client_status != CLIENT_SCKT_STATUS_WAIT_OPEN) {
> -        red_printf("unexpected SPICE_MSGC_TUNNEL_SOCKET_OPEN_NACK status=%d", sckt->client_status);
> +        red_warn("unexpected SPICE_MSGC_TUNNEL_SOCKET_OPEN_NACK status=%d", sckt->client_status);
>         return FALSE;
>     }
>     sckt->client_status = CLIENT_SCKT_STATUS_CLOSED;
> @@ -1478,7 +1479,7 @@ static int tunnel_channel_handle_socket_fin(TunnelChannel *channel, RedSocket *s
>     }
>
>     if (sckt->client_status != CLIENT_SCKT_STATUS_OPEN) {
> -        red_printf("unexpected SPICE_MSGC_TUNNEL_SOCKET_FIN status=%d", sckt->client_status);
> +        red_warn("unexpected SPICE_MSGC_TUNNEL_SOCKET_FIN status=%d", sckt->client_status);
>         return FALSE;
>     }
>     sckt->client_status = CLIENT_SCKT_STATUS_SHUTDOWN_SEND;
> @@ -1495,7 +1496,7 @@ static int tunnel_channel_handle_socket_fin(TunnelChannel *channel, RedSocket *s
>         net_slirp_socket_can_receive_notify(sckt->slirp_sckt);
>     } else if (sckt->slirp_status == SLIRP_SCKT_STATUS_SHUTDOWN_RECV) {
>         // it already received the FIN
> -        red_printf("unexpected slirp status=%d", sckt->slirp_status);
> +        red_warn("unexpected slirp status=%d", sckt->slirp_status);
>         return FALSE;
>     }
>
> @@ -1544,7 +1545,7 @@ static int tunnel_channel_handle_socket_closed(TunnelChannel *channel, RedSocket
>         // slirp can be in wait close if both slirp and client sent fin previously
>         // otherwise, the prev client status would also have been wait close, and this
>         // case was handled above
> -        red_printf("unexpected slirp_status=%d", sckt->slirp_status);
> +        red_warn("unexpected slirp_status=%d", sckt->slirp_status);
>         return FALSE;
>     }
>
> @@ -1569,8 +1570,8 @@ static int tunnel_channel_handle_socket_closed_ack(TunnelChannel *channel, RedSo
>     }
>
>     if (sckt->slirp_status != SLIRP_SCKT_STATUS_CLOSED) {
> -        red_printf("unexpected SPICE_MSGC_TUNNEL_SOCKET_CLOSED_ACK slirp_status=%d",
> -                   sckt->slirp_status);
> +        red_warn("unexpected SPICE_MSGC_TUNNEL_SOCKET_CLOSED_ACK slirp_status=%d",
> +                 sckt->slirp_status);
>         return FALSE;
>     }
>
> @@ -1583,8 +1584,8 @@ static int tunnel_channel_handle_socket_receive_data(TunnelChannel *channel, Red
>  {
>     if ((sckt->client_status == CLIENT_SCKT_STATUS_SHUTDOWN_SEND) ||
>         (sckt->client_status == CLIENT_SCKT_STATUS_CLOSED)) {
> -        red_printf("unexpected SPICE_MSGC_TUNNEL_SOCKET_DATA client_status=%d",
> -                   sckt->client_status);
> +        red_warn("unexpected SPICE_MSGC_TUNNEL_SOCKET_DATA client_status=%d",
> +                 sckt->client_status);
>         return FALSE;
>     }
>
> @@ -1595,9 +1596,9 @@ static int tunnel_channel_handle_socket_receive_data(TunnelChannel *channel, Red
>         return (!CHECK_TUNNEL_ERROR(channel));
>     } else if ((sckt->in_data.num_buffers == MAX_SOCKET_IN_BUFFERS) &&
>                !channel->mig_inprogress && !channel->base.migrate) {
> -        red_printf("socket in buffers overflow, socket will be closed"
> -                   " (local_port=%d, service_id=%d)",
> -                   ntohs(sckt->local_port), sckt->far_service->id);
> +        red_warn("socket in buffers overflow, socket will be closed"
> +                 " (local_port=%d, service_id=%d)",
> +                 ntohs(sckt->local_port), sckt->far_service->id);
>         __tunnel_worker_free_socket_rcv_buf(sckt->worker, recv_data);
>         tunnel_socket_force_close(channel, sckt);
>         return (!CHECK_TUNNEL_ERROR(channel));
> @@ -1605,7 +1606,7 @@ static int tunnel_channel_handle_socket_receive_data(TunnelChannel *channel, Red
>
>     tunnel_socket_assign_rcv_buf(sckt, recv_data, buf_size);
>     if (!sckt->in_data.client_total_num_tokens) {
> -        red_printf("token violation");
> +        red_warn("token violation");
>         return FALSE;
>     }
>
> @@ -1749,7 +1750,7 @@ static int tunnel_channel_handle_migrate_mark(TunnelChannel *channel)
>     RedSocket *sckt;
>
>     if (!channel->expect_migrate_mark) {
> -        red_printf("unexpected");
> +        red_warn("unexpected");
>         return FALSE;
>     }
>     channel->expect_migrate_mark = FALSE;
> @@ -1758,7 +1759,7 @@ static int tunnel_channel_handle_migrate_mark(TunnelChannel *channel)
>
>     migrate_item->slirp_state_size = net_slirp_state_export(&migrate_item->slirp_state);
>     if (!migrate_item->slirp_state) {
> -        red_printf("failed export slirp state");
> +        red_warn("failed export slirp state");
>         goto error;
>     }
>
> @@ -1891,7 +1892,7 @@ RawTunneledBuffer *__tunnel_socket_alloc_restore_tokens_buf(RedSocket *sckt, int
>     buf->base.base.release_proc = restore_tokens_buf_release;
>     buf->num_tokens = num_tokens;
>  #ifdef DEBUG_NETWORK
> -    red_printf("TUNNEL DBG: num_tokens=%d", num_tokens);
> +    red_log(2, "TUNNEL DBG: num_tokens=%d", num_tokens);
>  #endif
>     return &buf->base.base;
>  }
> @@ -2055,7 +2056,8 @@ static void tunnel_channel_restore_migrated_socket(TunnelChannel *channel,
>  static void tunnel_channel_restore_socket_state(TunnelChannel *channel, RedSocket *sckt)
>  {
>     int ret = TRUE;
> -    red_printf("");
> +
> +    red_log(2, "");
>     // handling client status msgs that were received during migration
>     switch (sckt->mig_client_status_msg) {
>     case 0:
> @@ -2162,14 +2164,14 @@ static int tunnel_channel_handle_migrate_data(TunnelChannel *channel,
>     int i;
>
>     if (!channel->expect_migrate_data) {
> -        red_printf("unexpected");
> +        red_warn("unexpected");
>         goto error;
>     }
>     channel->expect_migrate_data = FALSE;
>
>     if (migrate_data->magic != TUNNEL_MIGRATE_DATA_MAGIC ||
>         migrate_data->version != TUNNEL_MIGRATE_DATA_VERSION) {
> -        red_printf("invalid content");
> +        red_warn("invalid content");
>         goto error;
>     }
>
> @@ -2186,7 +2188,7 @@ static int tunnel_channel_handle_migrate_data(TunnelChannel *channel,
>                                                                         services_list->services[i]),
>                                                 migrate_data->data);
>         if (CHECK_TUNNEL_ERROR(channel)) {
> -            red_printf("failed restoring service");
> +            red_warn("failed restoring service");
>             goto error;
>         }
>     }
> @@ -2199,7 +2201,7 @@ static int tunnel_channel_handle_migrate_data(TunnelChannel *channel,
>                                                                        sockets_list->sockets[i]),
>                                                migrate_data->data);
>         if (CHECK_TUNNEL_ERROR(channel)) {
> -            red_printf("failed restoring socket");
> +            red_warn("failed restoring socket");
>             goto error;
>         }
>     }
> @@ -2242,7 +2244,7 @@ static int tunnel_channel_handle_message(RedChannel *channel, SpiceDataHeader *h
>         // the first field in these messages is connection id
>         sckt = tunnel_channel->worker->sockets + (*((uint16_t *)msg));
>         if (!sckt->allocated) {
> -            red_printf("red socket not found");
> +            red_warn("red socket not found");
>             return FALSE;
>         }
>         break;
> @@ -2253,18 +2255,18 @@ static int tunnel_channel_handle_message(RedChannel *channel, SpiceDataHeader *h
>     switch (header->type) {
>     case SPICE_MSGC_TUNNEL_SERVICE_ADD:
>         if (header->size < sizeof(SpiceMsgcTunnelAddGenericService)) {
> -            red_printf("bad message size");
> +            red_warn("bad message size");
>             free(msg);
>             return FALSE;
>         }
>         return tunnel_channel_handle_service_add(tunnel_channel,
>                                                  (SpiceMsgcTunnelAddGenericService *)msg);
>     case SPICE_MSGC_TUNNEL_SERVICE_REMOVE:
> -        red_printf("REDC_TUNNEL_REMOVE_SERVICE not supported yet");
> +        red_warn("REDC_TUNNEL_REMOVE_SERVICE not supported yet");
>         return FALSE;
>     case SPICE_MSGC_TUNNEL_SOCKET_OPEN_ACK:
>         if (header->size != sizeof(SpiceMsgcTunnelSocketOpenAck)) {
> -            red_printf("bad message size");
> +            red_warn("bad message size");
>             return FALSE;
>         }
>
> @@ -2273,7 +2275,7 @@ static int tunnel_channel_handle_message(RedChannel *channel, SpiceDataHeader *h
>
>     case SPICE_MSGC_TUNNEL_SOCKET_OPEN_NACK:
>         if (header->size != sizeof(SpiceMsgcTunnelSocketOpenNack)) {
> -            red_printf("bad message size");
> +            red_warn("bad message size");
>             return FALSE;
>         }
>
> @@ -2281,7 +2283,7 @@ static int tunnel_channel_handle_message(RedChannel *channel, SpiceDataHeader *h
>     case SPICE_MSGC_TUNNEL_SOCKET_DATA:
>     {
>         if (header->size < sizeof(SpiceMsgcTunnelSocketData)) {
> -            red_printf("bad message size");
> +            red_warn("bad message size");
>             return FALSE;
>         }
>
> @@ -2291,25 +2293,25 @@ static int tunnel_channel_handle_message(RedChannel *channel, SpiceDataHeader *h
>     }
>     case SPICE_MSGC_TUNNEL_SOCKET_FIN:
>         if (header->size != sizeof(SpiceMsgcTunnelSocketFin)) {
> -            red_printf("bad message size");
> +            red_warn("bad message size");
>             return FALSE;
>         }
>         return tunnel_channel_handle_socket_fin(tunnel_channel, sckt);
>     case SPICE_MSGC_TUNNEL_SOCKET_CLOSED:
>         if (header->size != sizeof(SpiceMsgcTunnelSocketClosed)) {
> -            red_printf("bad message size");
> +            red_warn("bad message size");
>             return FALSE;
>         }
>         return tunnel_channel_handle_socket_closed(tunnel_channel, sckt);
>     case SPICE_MSGC_TUNNEL_SOCKET_CLOSED_ACK:
>         if (header->size != sizeof(SpiceMsgcTunnelSocketClosedAck)) {
> -            red_printf("bad message size");
> +            red_warn("bad message size");
>             return FALSE;
>         }
>         return tunnel_channel_handle_socket_closed_ack(tunnel_channel, sckt);
>     case SPICE_MSGC_TUNNEL_SOCKET_TOKEN:
>         if (header->size != sizeof(SpiceMsgcTunnelSocketTokens)) {
> -            red_printf("bad message size");
> +            red_warn("bad message size");
>             return FALSE;
>         }
>
> @@ -2319,7 +2321,7 @@ static int tunnel_channel_handle_message(RedChannel *channel, SpiceDataHeader *h
>         return tunnel_channel_handle_migrate_mark(tunnel_channel);
>     case SPICE_MSGC_MIGRATE_DATA:
>         if (header->size < sizeof(TunnelMigrateData)) {
> -            red_printf("bad message size");
> +            red_warn("bad message size");
>             free(msg);
>             return FALSE;
>         }
> @@ -2594,9 +2596,9 @@ static void tunnel_channel_send_socket_fin(TunnelChannel *channel, PipeItem *ite
>     ASSERT(!sckt->out_data.ready_chunks_queue.head);
>
>     if (sckt->out_data.process_queue->head) {
> -        red_printf("socket sent FIN but there are still buffers in outgoing process queue"
> -                   "(local_port=%d, service_id=%d)",
> -                   ntohs(sckt->local_port), sckt->far_service->id);
> +        red_warn("socket sent FIN but there are still buffers in outgoing process queue"
> +                 "(local_port=%d, service_id=%d)",
> +                 ntohs(sckt->local_port), sckt->far_service->id);
>     }
>
>     channel->send_data.u.socket_fin.connection_id = sckt->connection_id;
> @@ -2619,16 +2621,16 @@ static void tunnel_channel_send_socket_close(TunnelChannel *channel, PipeItem *i
>
>     // can happen when it is a forced close
>     if (sckt->out_data.ready_chunks_queue.head) {
> -        red_printf("socket closed but there are still buffers in outgoing ready queue"
> -                   "(local_port=%d, service_id=%d)",
> -                   ntohs(sckt->local_port),
> -                   sckt->far_service->id);
> +        red_warn("socket closed but there are still buffers in outgoing ready queue"
> +                 "(local_port=%d, service_id=%d)",
> +                 ntohs(sckt->local_port),
> +                 sckt->far_service->id);
>     }
>
>     if (sckt->out_data.process_queue->head) {
> -        red_printf("socket closed but there are still buffers in outgoing process queue"
> -                   "(local_port=%d, service_id=%d)",
> -                   ntohs(sckt->local_port), sckt->far_service->id);
> +        red_warn("socket closed but there are still buffers in outgoing process queue"
> +                 "(local_port=%d, service_id=%d)",
> +                 ntohs(sckt->local_port), sckt->far_service->id);
>     }
>
>     channel->send_data.u.socket_close.connection_id = sckt->connection_id;
> @@ -2924,7 +2926,7 @@ static int tunnel_socket_connect(SlirpUsrNetworkInterface *usr_interface,
>     ASSERT(usr_interface);
>
>  #ifdef DEBUG_NETWORK
> -    red_printf("TUNNEL_DBG");
> +    red_log(2, "TUNNEL_DBG");
>  #endif
>     worker = ((RedSlirpNetworkInterface *)usr_interface)->worker;
>     ASSERT(worker->channel);
> @@ -2938,13 +2940,13 @@ static int tunnel_socket_connect(SlirpUsrNetworkInterface *usr_interface,
>     }
>
>     if (tunnel_worker_find_socket(worker, src_port, far_service->id)) {
> -        red_printf("slirp tried to open a socket that is still opened");
> +        red_warn("slirp tried to open a socket that is still opened");
>         errno = EADDRINUSE;
>         return -1;
>     }
>
>     if (worker->num_sockets == MAX_SOCKETS_NUM) {
> -        red_printf("number of tunneled sockets exceeds the limit");
> +        red_warn("number of tunneled sockets exceeds the limit");
>         errno = ENFILE;
>         return -1;
>     }
> @@ -2992,7 +2994,7 @@ static int tunnel_socket_send(SlirpUsrNetworkInterface *usr_interface, UserSocke
>
>     if ((sckt->client_status != CLIENT_SCKT_STATUS_OPEN) &&
>         (sckt->client_status != CLIENT_SCKT_STATUS_SHUTDOWN_SEND)) {
> -        red_printf("client socket is unable to receive data");
> +        red_warn("client socket is unable to receive data");
>         errno = ECONNRESET;
>         return -1;
>     }
> @@ -3000,7 +3002,7 @@ static int tunnel_socket_send(SlirpUsrNetworkInterface *usr_interface, UserSocke
>
>     if ((sckt->slirp_status == SLIRP_SCKT_STATUS_SHUTDOWN_SEND) ||
>         (sckt->slirp_status == SLIRP_SCKT_STATUS_WAIT_CLOSE)) {
> -        red_printf("send was shutdown");
> +        red_warn("send was shutdown");
>         errno = EPIPE;
>         return -1;
>     }
> @@ -3026,9 +3028,9 @@ static int tunnel_socket_send(SlirpUsrNetworkInterface *usr_interface, UserSocke
>             ASSERT(sckt->out_data.process_queue->head);
>             if ((sckt->out_data.data_size + len) >
>                                                   (MAX_SOCKET_OUT_BUFFERS * MAX_SOCKET_DATA_SIZE)) {
> -                red_printf("socket out buffers overflow, socket will be closed"
> -                           " (local_port=%d, service_id=%d)",
> -                           ntohs(sckt->local_port), sckt->far_service->id);
> +                red_warn("socket out buffers overflow, socket will be closed"
> +                         " (local_port=%d, service_id=%d)",
> +                         ntohs(sckt->local_port), sckt->far_service->id);
>                 tunnel_socket_force_close(worker->channel, sckt);
>                 size_to_send = 0;
>             } else {
> @@ -3118,9 +3120,9 @@ static int tunnel_socket_recv(SlirpUsrNetworkInterface *usr_interface, UserSocke
>     // if there is data in ready queue, when it is acked, slirp will call recv and get 0
>     if (__should_send_fin_to_guest(sckt)) {
>         if (sckt->in_data.process_queue->head) {
> -            red_printf("client socket sent FIN but there are still buffers in incoming process"
> -                       "queue (local_port=%d, service_id=%d)",
> -                       ntohs(sckt->local_port), sckt->far_service->id);
> +            red_warn("client socket sent FIN but there are still buffers in incoming process"
> +                     "queue (local_port=%d, service_id=%d)",
> +                     ntohs(sckt->local_port), sckt->far_service->id);
>         }
>         return 0; // slirp will call shutdown recv now and it will also send FIN to the guest.
>     }
> @@ -3326,7 +3328,7 @@ static void arm_timer(SlirpUsrNetworkInterface *usr_interface, UserTimer *timer,
>     worker = ((RedSlirpNetworkInterface *)usr_interface)->worker;
>  #ifdef DEBUG_NETWORK
>     if (!worker->channel) {
> -        red_printf("channel not connected");
> +        red_warn("channel not connected");
>     }
>  #endif
>     if (worker->channel && worker->channel->mig_inprogress) {
> @@ -3348,12 +3350,12 @@ static int tunnel_channel_config_socket(RedChannel *channel)
>     int delay_val;
>
>     if ((flags = fcntl(channel->stream->socket, F_GETFL)) == -1) {
> -        red_printf("accept failed, %s", strerror(errno)); // can't we just use red_error?
> +        red_warn("accept failed, %s", strerror(errno)); // can't we just use red_error?
>         return FALSE;
>     }
>
>     if (fcntl(channel->stream->socket, F_SETFL, flags | O_NONBLOCK) == -1) {
> -        red_printf("accept failed, %s", strerror(errno));
> +        red_warn("accept failed, %s", strerror(errno));
>         return FALSE;
>     }
>
> @@ -3361,7 +3363,7 @@ static int tunnel_channel_config_socket(RedChannel *channel)
>
>     if (setsockopt(channel->stream->socket, IPPROTO_TCP, TCP_NODELAY, &delay_val,
>                    sizeof(delay_val)) == -1) {
> -        red_printf("setsockopt failed, %s", strerror(errno));
> +        red_warn("setsockopt failed, %s", strerror(errno));
>     }
>
>     return TRUE;
> @@ -3396,7 +3398,7 @@ static void tunnel_channel_disconnect(RedChannel *channel)
>     if (!channel) {
>         return;
>     }
> -    red_printf("");
> +    red_log(2, "");
>     worker = tunnel_channel->worker;
>
>     tunnel_worker_disconnect_slirp(worker);
> @@ -3461,7 +3463,7 @@ static void handle_tunnel_channel_shutdown(struct Channel *channel)
>  static void handle_tunnel_channel_migrate(struct Channel *channel)
>  {
>  #ifdef DEBUG_NETWORK
> -    red_printf("TUNNEL_DBG: MIGRATE STARTED");
> +    red_log(2, "TUNNEL_DBG: MIGRATE STARTED");
>  #endif
>     TunnelChannel *tunnel_channel = ((TunnelWorker *)channel->data)->channel;
>     tunnel_channel->mig_inprogress = TRUE;
> diff --git a/server/red_worker.c b/server/red_worker.c
> index 5f07803..0d67586 100644
> --- a/server/red_worker.c
> +++ b/server/red_worker.c
> @@ -995,46 +995,46 @@ static void print_compress_stats(DisplayChannel *display_channel)
>                        display_channel->zlib_glz_stat.comp_size :
>                        display_channel->glz_stat.comp_size;
>
> -    red_printf("==> Compression stats for display %u", display_channel->base.id);
> -    red_printf("Method   \t  count  \torig_size(MB)\tenc_size(MB)\tenc_time(s)");
> -    red_printf("QUIC     \t%8d\t%13.2f\t%12.2f\t%12.2f",
> +    red_log(2, "==> Compression stats for display %u", display_channel->base.id);
> +    red_log(2, "Method   \t  count  \torig_size(MB)\tenc_size(MB)\tenc_time(s)");
> +    red_log(2, "QUIC     \t%8d\t%13.2f\t%12.2f\t%12.2f",
>                display_channel->quic_stat.count,
>                stat_byte_to_mega(display_channel->quic_stat.orig_size),
>                stat_byte_to_mega(display_channel->quic_stat.comp_size),
>                stat_cpu_time_to_sec(display_channel->quic_stat.total)
>                );
> -    red_printf("GLZ      \t%8d\t%13.2f\t%12.2f\t%12.2f",
> +    red_log(2, "GLZ      \t%8d\t%13.2f\t%12.2f\t%12.2f",
>                display_channel->glz_stat.count,
>                stat_byte_to_mega(display_channel->glz_stat.orig_size),
>                stat_byte_to_mega(display_channel->glz_stat.comp_size),
>                stat_cpu_time_to_sec(display_channel->glz_stat.total)
>                );
> -    red_printf("ZLIB GLZ \t%8d\t%13.2f\t%12.2f\t%12.2f",
> +    red_log(2, "ZLIB GLZ \t%8d\t%13.2f\t%12.2f\t%12.2f",
>                display_channel->zlib_glz_stat.count,
>                stat_byte_to_mega(display_channel->zlib_glz_stat.orig_size),
>                stat_byte_to_mega(display_channel->zlib_glz_stat.comp_size),
>                stat_cpu_time_to_sec(display_channel->zlib_glz_stat.total)
>                );
> -    red_printf("LZ       \t%8d\t%13.2f\t%12.2f\t%12.2f",
> +    red_log(2, "LZ       \t%8d\t%13.2f\t%12.2f\t%12.2f",
>                display_channel->lz_stat.count,
>                stat_byte_to_mega(display_channel->lz_stat.orig_size),
>                stat_byte_to_mega(display_channel->lz_stat.comp_size),
>                stat_cpu_time_to_sec(display_channel->lz_stat.total)
>                );
> -    red_printf("JPEG     \t%8d\t%13.2f\t%12.2f\t%12.2f",
> +    red_log(2, "JPEG     \t%8d\t%13.2f\t%12.2f\t%12.2f",
>                display_channel->jpeg_stat.count,
>                stat_byte_to_mega(display_channel->jpeg_stat.orig_size),
>                stat_byte_to_mega(display_channel->jpeg_stat.comp_size),
>                stat_cpu_time_to_sec(display_channel->jpeg_stat.total)
>                );
> -    red_printf("JPEG-RGBA\t%8d\t%13.2f\t%12.2f\t%12.2f",
> +    red_log(2, "JPEG-RGBA\t%8d\t%13.2f\t%12.2f\t%12.2f",
>                display_channel->jpeg_alpha_stat.count,
>                stat_byte_to_mega(display_channel->jpeg_alpha_stat.orig_size),
>                stat_byte_to_mega(display_channel->jpeg_alpha_stat.comp_size),
>                stat_cpu_time_to_sec(display_channel->jpeg_alpha_stat.total)
>                );
> -    red_printf("-------------------------------------------------------------------");
> -    red_printf("Total    \t%8d\t%13.2f\t%12.2f\t%12.2f",
> +    red_log(2, "-------------------------------------------------------------------");
> +    red_log(2, "Total    \t%8d\t%13.2f\t%12.2f\t%12.2f",
>                display_channel->lz_stat.count + display_channel->glz_stat.count +
>                                                 display_channel->quic_stat.count +
>                                                 display_channel->jpeg_stat.count +
> @@ -1917,7 +1917,7 @@ void __show_current(TreeItem *item, void *data)
>  static void show_current(RedWorker *worker, Ring *ring)
>  {
>     if (ring_is_empty(ring)) {
> -        red_printf("TEST: TREE: EMPTY");
> +        red_log(2, "TEST: TREE: EMPTY");
>         return;
>     }
>     current_tree_for_each(worker, ring, __show_current, NULL);
> @@ -2918,7 +2918,7 @@ static void red_reset_stream_trace(RedWorker *worker)
>         if (!stream->current) {
>             red_stop_stream(worker, stream);
>         } else {
> -            red_printf("attached stream");
> +            red_log(2, "attached stream");
>         }
>     }
>
> @@ -3010,7 +3010,7 @@ static inline int red_current_add(RedWorker *worker, Ring *ring, Drawable *drawa
>                 if (!((DrawItem *)sibling)->container_root) {
>                     container = __new_container(worker, (DrawItem *)sibling);
>                     if (!container) {
> -                        red_printf("create new container failed");
> +                        red_warn("create new container failed");
>                         region_destroy(&exclude_rgn);
>                         return FALSE;
>                     }
> @@ -3174,17 +3174,17 @@ static inline int red_current_add_qxl(RedWorker *worker, Ring *ring, Drawable *d
>  #ifdef RED_WORKER_STAT
>     if ((++worker->add_count % 100) == 0) {
>         stat_time_t total = worker->add_stat.total;
> -        red_printf("add with shadow count %u",
> +        red_log(2, "add with shadow count %u",
>                    worker->add_with_shadow_count);
>         worker->add_with_shadow_count = 0;
> -        red_printf("add[%u] %f exclude[%u] %f __exclude[%u] %f",
> +        red_log(2, "add[%u] %f exclude[%u] %f __exclude[%u] %f",
>                    worker->add_stat.count,
>                    stat_cpu_time_to_sec(total),
>                    worker->exclude_stat.count,
>                    stat_cpu_time_to_sec(worker->exclude_stat.total),
>                    worker->__exclude_stat.count,
>                    stat_cpu_time_to_sec(worker->__exclude_stat.total));
> -        red_printf("add %f%% exclude %f%% exclude2 %f%% __exclude %f%%",
> +        red_log(2, "add %f%% exclude %f%% exclude2 %f%% __exclude %f%%",
>                    (double)(total - worker->exclude_stat.total) / total * 100,
>                    (double)(worker->exclude_stat.total) / total * 100,
>                    (double)(worker->exclude_stat.total -
> @@ -3902,7 +3902,7 @@ static void red_draw_qxl_drawable(RedWorker *worker, Drawable *drawable)
>         break;
>     }
>     default:
> -        red_printf("invalid type");
> +        red_warn("invalid type");
>     }
>  }
>
> @@ -4396,7 +4396,7 @@ static int red_process_commands(RedWorker *worker, uint32_t max_pipe_size, int *
>                             &message, ext_cmd.cmd.data);
>  #ifdef DEBUG
>             /* alert: accessing message.data is insecure */
> -            red_printf("MESSAGE: %s", message.data);
> +            red_log(2, "MESSAGE: %s", message.data);
>  #endif
>             release_info_ext.group_id = ext_cmd.group_id;
>             release_info_ext.info = message.release_info;
> @@ -4857,7 +4857,7 @@ static void quic_usr_error(QuicUsrContext *usr, const char *fmt, ...)
>     va_start(ap, fmt);
>     vsnprintf(usr_data->message_buf, sizeof(usr_data->message_buf), fmt, ap);
>     va_end(ap);
> -    red_printf("%s", usr_data->message_buf);
> +    red_warn("%s", usr_data->message_buf);
>
>     longjmp(usr_data->jmp_env, 1);
>  }
> @@ -4870,7 +4870,7 @@ static void lz_usr_error(LzUsrContext *usr, const char *fmt, ...)
>     va_start(ap, fmt);
>     vsnprintf(usr_data->message_buf, sizeof(usr_data->message_buf), fmt, ap);
>     va_end(ap);
> -    red_printf("%s", usr_data->message_buf);
> +    red_warn("%s", usr_data->message_buf);
>
>     longjmp(usr_data->jmp_env, 1);
>  }
> @@ -4898,7 +4898,7 @@ static void quic_usr_warn(QuicUsrContext *usr, const char *fmt, ...)
>     va_start(ap, fmt);
>     vsnprintf(usr_data->message_buf, sizeof(usr_data->message_buf), fmt, ap);
>     va_end(ap);
> -    red_printf("%s", usr_data->message_buf);
> +    red_warn("%s", usr_data->message_buf);
>  }
>
>  static void lz_usr_warn(LzUsrContext *usr, const char *fmt, ...)
> @@ -4909,7 +4909,7 @@ static void lz_usr_warn(LzUsrContext *usr, const char *fmt, ...)
>     va_start(ap, fmt);
>     vsnprintf(usr_data->message_buf, sizeof(usr_data->message_buf), fmt, ap);
>     va_end(ap);
> -    red_printf("%s", usr_data->message_buf);
> +    red_warn("%s", usr_data->message_buf);
>  }
>
>  static void glz_usr_warn(GlzEncoderUsrContext *usr, const char *fmt, ...)
> @@ -4920,7 +4920,7 @@ static void glz_usr_warn(GlzEncoderUsrContext *usr, const char *fmt, ...)
>     va_start(ap, fmt);
>     vsnprintf(usr_data->message_buf, sizeof(usr_data->message_buf), fmt, ap);
>     va_end(ap);
> -    red_printf("%s", usr_data->message_buf);
> +    red_warn("%s", usr_data->message_buf);
>  }
>
>  static void *quic_usr_malloc(QuicUsrContext *usr, int size)
> @@ -5362,7 +5362,7 @@ static inline int red_glz_compress_image(DisplayChannel *display_channel,
>     zlib_data->data.bufs_head = zlib_data->data.bufs_tail;
>
>     if (!zlib_data->data.bufs_head) {
> -        red_printf("failed to allocate zlib compress buffer");
> +        red_warn("failed to allocate zlib compress buffer");
>         goto glz;
>     }
>
> @@ -5523,7 +5523,7 @@ static int red_jpeg_compress_image(DisplayChannel *display_channel, SpiceImage *
>     jpeg_data->data.bufs_head = jpeg_data->data.bufs_tail;
>
>     if (!jpeg_data->data.bufs_head) {
> -        red_printf("failed to allocate compress buffer");
> +        red_warn("failed to allocate compress buffer");
>         return FALSE;
>     }
>
> @@ -5762,7 +5762,7 @@ static inline int red_compress_image(DisplayChannel *display_channel,
>
>     if (quic_compress) {
>  #ifdef COMPRESS_DEBUG
> -        red_printf("QUIC compress");
> +        red_log(2, "QUIC compress");
>  #endif
>         // if bitmaps is picture-like, compress it using jpeg
>         if (can_lossy && display_channel->enable_jpeg &&
> @@ -5808,12 +5808,12 @@ static inline int red_compress_image(DisplayChannel *display_channel,
>             ret = red_lz_compress_image(display_channel, dest, src, o_comp_data,
>                                         drawable->group_id);
>  #ifdef COMPRESS_DEBUG
> -            red_printf("LZ LOCAL compress");
> +            red_log(2, "LZ LOCAL compress");
>  #endif
>         }
>  #ifdef COMPRESS_DEBUG
>         else {
> -            red_printf("LZ global compress fmt=%d", src->format);
> +            red_log(2, "LZ global compress fmt=%d", src->format);
>         }
>  #endif
>         return ret;
> @@ -7345,7 +7345,7 @@ static void red_send_data(RedChannel *channel, void *item)
>                 channel->disconnect(channel);
>                 return;
>             default:
> -                red_printf("%s", strerror(errno));
> +                red_warn("%s", strerror(errno));
>                 channel->disconnect(channel);
>                 return;
>             }
> @@ -7476,7 +7476,7 @@ static inline uint8_t *red_get_image_line(RedWorker *worker, SpiceChunks *chunks
>     }
>
>     if (chunk->len - *offset < stride) {
> -        red_printf("bad chunk alignment");
> +        red_warn("bad chunk alignment");
>         return NULL;
>     }
>     ret = chunk->data + *offset;
> @@ -7687,7 +7687,7 @@ static inline int red_send_stream_data(DisplayChannel *display_channel, Drawable
>         }
>         break;
>     default:
> -        red_printf_some(1000, "unsupported format %d", image->u.bitmap.format);
> +        red_log_some(LOG_WARN, 1000, "unsupported format %d", image->u.bitmap.format);
>         return FALSE;
>     }
>
> @@ -8307,7 +8307,7 @@ static void display_channel_push(RedWorker *worker)
>             free(pipe_item);
>             break;
>         case PIPE_ITEM_TYPE_MIGRATE:
> -            red_printf("PIPE_ITEM_TYPE_MIGRATE");
> +            red_log(2, "PIPE_ITEM_TYPE_MIGRATE");
>             display_channel_send_migrate(display_channel);
>             free(pipe_item);
>             break;
> @@ -8379,7 +8379,7 @@ static void cursor_channel_push(RedWorker *worker)
>             free(pipe_item);
>             break;
>         case PIPE_ITEM_TYPE_MIGRATE:
> -            red_printf("PIPE_ITEM_TYPE_MIGRATE");
> +            red_log(2, "PIPE_ITEM_TYPE_MIGRATE");
>             cursor_channel_send_migrate(cursor_channel);
>             free(pipe_item);
>             break;
> @@ -8762,7 +8762,7 @@ static inline void flush_display_commands(RedWorker *worker)
>             red_receive(channel);
>             red_send_data(channel, NULL);
>             if (red_now() >= end_time) {
> -                red_printf("update timeout");
> +                red_warn("update timeout");
>                 red_disconnect_display(channel);
>             } else {
>                 sleep_count++;
> @@ -8804,7 +8804,7 @@ static inline void flush_cursor_commands(RedWorker *worker)
>             red_receive(channel);
>             red_send_data(channel, NULL);
>             if (red_now() >= end_time) {
> -                red_printf("flush cursor timeout");
> +                red_warn("flush cursor timeout");
>                 red_disconnect_cursor(channel);
>             } else {
>                 sleep_count++;
> @@ -8854,7 +8854,7 @@ static int display_channel_wait_for_init(DisplayChannel *display_channel)
>             return TRUE;
>         }
>         if (red_now() > end_time) {
> -            red_printf("timeout");
> +            red_warn("timeout");
>             red_disconnect_display((RedChannel *)display_channel);
>             break;
>         }
> @@ -8904,7 +8904,7 @@ static int channel_handle_message(RedChannel *channel, size_t size, uint32_t typ
>     case SPICE_MSGC_DISCONNECTING:
>         break;
>     default:
> -        red_printf("invalid message type %u", type);
> +        red_warn("invalid message type %u", type);
>         return FALSE;
>     }
>     return TRUE;
> @@ -8948,7 +8948,7 @@ static GlzSharedDictionary *red_create_glz_dictionary(DisplayChannel *display,
>                                                             MAX_LZ_ENCODERS,
>                                                             &display->glz_data.usr);
>  #ifdef COMPRESS_DEBUG
> -    red_printf("Lz Window %d Size=%d", id, window_size);
> +    red_log(2, "Lz Window %d Size=%d", id, window_size);
>  #endif
>     if (!glz_dict) {
>         PANIC("failed creating lz dictionary");
> @@ -9136,7 +9136,7 @@ static int display_channel_handle_migrate_glz_dictionary(DisplayChannel *channel
>  static int display_channel_handle_migrate_mark(DisplayChannel *channel)
>  {
>     if (!channel->expect_migrate_mark) {
> -        red_printf("unexpected");
> +        red_warn("unexpected");
>         return FALSE;
>     }
>     channel->expect_migrate_mark = FALSE;
> @@ -9150,18 +9150,18 @@ static int display_channel_handle_migrate_data(DisplayChannel *channel, size_t s
>     int i;
>
>     if (!channel->expect_migrate_data) {
> -        red_printf("unexpected");
> +        red_warn("unexpected");
>         return FALSE;
>     }
>     channel->expect_migrate_data = FALSE;
>     if (size < sizeof(*migrate_data)) {
> -        red_printf("bad message size");
> +        red_warn("bad message size");
>         return FALSE;
>     }
>     migrate_data = (DisplayChannelMigrateData *)message;
>     if (migrate_data->magic != DISPLAY_MIGRATE_DATA_MAGIC ||
>                                             migrate_data->version != DISPLAY_MIGRATE_DATA_VERSION) {
> -        red_printf("invalid content");
> +        red_warn("invalid content");
>         return FALSE;
>     }
>     ASSERT(channel->base.send_data.serial == 0);
> @@ -9202,7 +9202,7 @@ static int display_channel_handle_message(RedChannel *channel, size_t size, uint
>     switch (type) {
>     case SPICE_MSGC_DISPLAY_INIT:
>         if (!((DisplayChannel *)channel)->expect_init) {
> -            red_printf("unexpected SPICE_MSGC_DISPLAY_INIT");
> +            red_warn("unexpected SPICE_MSGC_DISPLAY_INIT");
>             return FALSE;
>         }
>         ((DisplayChannel *)channel)->expect_init = FALSE;
> @@ -9239,7 +9239,7 @@ static void red_receive(RedChannel *channel)
>                 channel->disconnect(channel);
>                 return;
>             default:
> -                red_printf("%s", strerror(errno));
> +                red_warn("%s", strerror(errno));
>                 channel->disconnect(channel);
>                 return;
>             }
> @@ -9261,7 +9261,7 @@ static void red_receive(RedChannel *channel)
>                                          SPICE_VERSION_MINOR, &parsed_size, &parsed_free);
>
>                 if (parsed == NULL) {
> -                    red_printf("failed to parse message type %d", header->type);
> +                    red_warn("failed to parse message type %d", header->type);
>                     channel->disconnect(channel);
>                     return;
>                 }
> @@ -9303,18 +9303,18 @@ static RedChannel *__new_channel(RedWorker *worker, int size, uint32_t channel_i
>     int delay_val;
>
>     if ((flags = fcntl(stream->socket, F_GETFL)) == -1) {
> -        red_printf("accept failed, %s", strerror(errno));
> +        red_warn("accept failed, %s", strerror(errno));
>         goto error1;
>     }
>
>     if (fcntl(stream->socket, F_SETFL, flags | O_NONBLOCK) == -1) {
> -        red_printf("accept failed, %s", strerror(errno));
> +        red_warn("accept failed, %s", strerror(errno));
>         goto error1;
>     }
>
>     delay_val = IS_LOW_BANDWIDTH() ? 0 : 1;
>     if (setsockopt(stream->socket, IPPROTO_TCP, TCP_NODELAY, &delay_val, sizeof(delay_val)) == -1) {
> -        red_printf("setsockopt failed, %s", strerror(errno));
> +        red_warn("setsockopt failed, %s", strerror(errno));
>     }
>
>     ASSERT(size >= sizeof(*channel));
> @@ -9343,7 +9343,7 @@ static RedChannel *__new_channel(RedWorker *worker, int size, uint32_t channel_i
>     event.events = EPOLLIN | EPOLLOUT | EPOLLET;
>     event.data.ptr = channel;
>     if (epoll_ctl(worker->epoll, EPOLL_CTL_ADD, stream->socket, &event) == -1) {
> -        red_printf("epoll_ctl failed, %s", strerror(errno));
> +        red_warn("epoll_ctl failed, %s", strerror(errno));
>         goto error2;
>     }
>
> @@ -9476,8 +9476,8 @@ static void handle_new_display_channel(RedWorker *worker, RedsStream *stream, in
>                                                  SPICE_WAN_COMPRESSION_ALWAYS);
>     }
>
> -    red_printf("jpeg %s", display_channel->enable_jpeg ? "enabled" : "disabled");
> -    red_printf("zlib-over-glz %s", display_channel->enable_zlib_glz_wrap ? "enabled" : "disabled");
> +    red_log(2, "jpeg %s", display_channel->enable_jpeg ? "enabled" : "disabled");
> +    red_log(2, "zlib-over-glz %s", display_channel->enable_zlib_glz_wrap ? "enabled" : "disabled");
>
>     // todo: tune level according to bandwidth
>     display_channel->zlib_level = ZLIB_DEFAULT_COMPRESSION_LEVEL;
> @@ -9584,7 +9584,7 @@ static void red_wait_outgoing_item(RedChannel *channel)
>     red_ref_channel(channel);
>
>     end_time = red_now() + DETACH_TIMEOUT;
> -    red_printf("blocked");
> +    red_log(2, "blocked");
>
>     do {
>         usleep(DETACH_SLEEP_DURATION);
> @@ -9593,7 +9593,7 @@ static void red_wait_outgoing_item(RedChannel *channel)
>     } while ((blocked = channel->send_data.blocked) && red_now() < end_time);
>
>     if (blocked) {
> -        red_printf("timeout");
> +        red_warn("timeout");
>         channel->disconnect(channel);
>     }
>     red_unref_channel(channel);
> @@ -9608,7 +9608,7 @@ static void red_wait_pipe_item_sent(RedChannel *channel, PipeItem *item)
>         return;
>     }
>
> -    red_printf("");
> +    red_log(2, "");
>     red_ref_channel(channel);
>     channel->hold_item(item);
>
> @@ -9629,7 +9629,7 @@ static void red_wait_pipe_item_sent(RedChannel *channel, PipeItem *item)
>     }
>
>     if (item_in_pipe) {
> -        red_printf("timeout");
> +        red_warn("timeout");
>         channel->disconnect(channel);
>     } else {
>         if (channel->send_data.item == item) {
> @@ -9991,7 +9991,7 @@ static void handle_dev_input(EventListener *listener, uint32_t events)
>             display_channel_push(worker);
>         }
>         if (worker->qxl->st->qif->flush_resources(worker->qxl) == 0) {
> -            red_printf("oom current %u pipe %u", worker->current_size, worker->display_channel ?
> +            red_warn("oom current %u pipe %u", worker->current_size, worker->display_channel ?
>                        worker->display_channel->base.pipe_size : 0);
>             red_free_some(worker);
>             worker->qxl->st->qif->flush_resources(worker->qxl);
> @@ -10023,7 +10023,7 @@ static void handle_dev_input(EventListener *listener, uint32_t events)
>     case RED_WORKER_MESSAGE_DISPLAY_CONNECT: {
>         RedsStream *stream;
>         int migrate;
> -        red_printf("connect");
> +        red_log(2, "connect");
>
>         receive_data(worker->channel, &stream, sizeof(RedsStream *));
>         receive_data(worker->channel, &migrate, sizeof(int));
> @@ -10031,38 +10031,38 @@ static void handle_dev_input(EventListener *listener, uint32_t events)
>         break;
>     }
>     case RED_WORKER_MESSAGE_DISPLAY_DISCONNECT:
> -        red_printf("disconnect");
> +        red_log(2, "disconnect");
>         red_disconnect_display((RedChannel *)worker->display_channel);
>         break;
>     case RED_WORKER_MESSAGE_STOP: {
> -        red_printf("stop");
> +        red_log(2, "stop");
>         handle_dev_stop(worker);
>         break;
>     }
>     case RED_WORKER_MESSAGE_START:
> -        red_printf("start");
> +        red_log(2, "start");
>         handle_dev_start(worker);
>         break;
>     case RED_WORKER_MESSAGE_DISPLAY_MIGRATE:
> -        red_printf("migrate");
> +        red_log(2, "migrate");
>         red_migrate_display(worker);
>         break;
>     case RED_WORKER_MESSAGE_CURSOR_CONNECT: {
>         RedsStream *stream;
>         int migrate;
>
> -        red_printf("cursor connect");
> +        red_log(2, "cursor connect");
>         receive_data(worker->channel, &stream, sizeof(RedsStream *));
>         receive_data(worker->channel, &migrate, sizeof(int));
>         red_connect_cursor(worker, stream, migrate);
>         break;
>     }
>     case RED_WORKER_MESSAGE_CURSOR_DISCONNECT:
> -        red_printf("cursor disconnect");
> +        red_log(2, "cursor disconnect");
>         red_disconnect_cursor((RedChannel *)worker->cursor_channel);
>         break;
>     case RED_WORKER_MESSAGE_CURSOR_MIGRATE:
> -        red_printf("cursor migrate");
> +        red_log(2, "cursor migrate");
>         red_migrate_cursor(worker);
>         break;
>     case RED_WORKER_MESSAGE_SET_COMPRESSION:
> @@ -10070,25 +10070,25 @@ static void handle_dev_input(EventListener *listener, uint32_t events)
>                      sizeof(spice_image_compression_t));
>         switch (worker->image_compression) {
>         case SPICE_IMAGE_COMPRESS_AUTO_LZ:
> -            red_printf("ic auto_lz");
> +            red_log(2, "ic auto_lz");
>             break;
>         case SPICE_IMAGE_COMPRESS_AUTO_GLZ:
> -            red_printf("ic auto_glz");
> +            red_log(2, "ic auto_glz");
>             break;
>         case SPICE_IMAGE_COMPRESS_QUIC:
> -            red_printf("ic quic");
> +            red_log(2, "ic quic");
>             break;
>         case SPICE_IMAGE_COMPRESS_LZ:
> -            red_printf("ic lz");
> +            red_log(2, "ic lz");
>             break;
>         case SPICE_IMAGE_COMPRESS_GLZ:
> -            red_printf("ic glz");
> +            red_log(2, "ic glz");
>             break;
>         case SPICE_IMAGE_COMPRESS_OFF:
> -            red_printf("ic off");
> +            red_log(2, "ic off");
>             break;
>         default:
> -            red_printf("ic invalid");
> +            red_warn("ic invalid");
>         }
>  #ifdef COMPRESS_STAT
>         print_compress_stats(worker->display_channel);
> @@ -10107,21 +10107,21 @@ static void handle_dev_input(EventListener *listener, uint32_t events)
>         ASSERT(worker->streaming_video != STREAM_VIDEO_INVALID);
>         switch(worker->streaming_video) {
>             case STREAM_VIDEO_ALL:
> -                red_printf("sv all");
> +                red_log(2, "sv all");
>                 break;
>             case STREAM_VIDEO_FILTER:
> -                red_printf("sv filter");
> +                red_log(2, "sv filter");
>                 break;
>             case STREAM_VIDEO_OFF:
> -                red_printf("sv off");
> +                red_log(2, "sv off");
>                 break;
>             default:
> -                red_printf("sv invalid");
> +                red_warn("sv invalid");
>         }
>         break;
>     case RED_WORKER_MESSAGE_SET_MOUSE_MODE:
>         receive_data(worker->channel, &worker->mouse_mode, sizeof(uint32_t));
> -        red_printf("mouse mode %u", worker->mouse_mode);
> +        red_log(2, "mouse mode %u", worker->mouse_mode);
>         break;
>     case RED_WORKER_MESSAGE_ADD_MEMSLOT_ASYNC:
>     case RED_WORKER_MESSAGE_ADD_MEMSLOT:
> @@ -10139,7 +10139,7 @@ static void handle_dev_input(EventListener *listener, uint32_t events)
>         RedCursorCmd *cursor_cmd;
>         RedSurfaceCmd *surface_cmd;
>
> -        red_printf("loadvm_commands");
> +        red_log(2, "loadvm_commands");
>         receive_data(worker->channel, &count, sizeof(uint32_t));
>         while (count > 0) {
>             receive_data(worker->channel, &ext, sizeof(QXLCommandExt));
> @@ -10157,7 +10157,7 @@ static void handle_dev_input(EventListener *listener, uint32_t events)
>                 red_process_surface(worker, surface_cmd, ext.group_id, TRUE);
>                 break;
>             default:
> -                red_printf("unhandled loadvm command type (%d)", ext.cmd.type);
> +                red_warn("unhandled loadvm command type (%d)", ext.cmd.type);
>                 break;
>             }
>             count--;
> @@ -10251,7 +10251,7 @@ void *red_worker_main(void *arg)
>  {
>     RedWorker worker;
>
> -    red_printf("begin");
> +    red_log(2, "begin");
>     ASSERT(MAX_PIPE_SIZE > WIDE_CLIENT_ACK_WINDOW &&
>            MAX_PIPE_SIZE > NARROW_CLIENT_ACK_WINDOW); //ensure wakeup by ack message
>
> @@ -10316,7 +10316,7 @@ void *red_worker_main(void *arg)
>         }
>         red_push(&worker);
>     }
> -    red_printf("exit");
> +    red_log(2, "exit");
>     return 0;
>  }
>
> diff --git a/server/reds.c b/server/reds.c
> index 8e83b99..ed6bd34 100644
> --- a/server/reds.c
> +++ b/server/reds.c
> @@ -637,7 +637,7 @@ void reds_unregister_channel(Channel *channel)
>         }
>         now = &(*now)->next;
>     }
> -    red_printf("not found");
> +    red_warn("not found");
>  }
>
>  static Channel *reds_find_channel(uint32_t type, uint32_t id)
> @@ -732,7 +732,7 @@ static void reds_disconnect()
>         return;
>     }
>
> -    red_printf("");
> +    red_log(2, "");
>     reds->disconnecting = TRUE;
>     reds_reset_outgoing();
>     /* Reset write filter to start with clean state on client reconnect */
> @@ -801,7 +801,7 @@ static int handle_incoming(RedsStream *stream, IncomingHandler *handler)
>             case EPIPE:
>                 return -1;
>             default:
> -                red_printf("%s", strerror(errno));
> +                red_warn("%s", strerror(errno));
>                 return -1;
>             }
>         } else {
> @@ -819,7 +819,7 @@ static int handle_incoming(RedsStream *stream, IncomingHandler *handler)
>                 parsed = handler->parser(data, data + header->size, header->type,
>                                          SPICE_VERSION_MINOR, &parsed_size, &parsed_free);
>                 if (parsed == NULL) {
> -                    red_printf("failed to parse message type %d", header->type);
> +                    red_warn("failed to parse message type %d", header->type);
>                     return -1;
>                 }
>                 handler->handle_message(handler->opaque, parsed_size, header->type, parsed);
> @@ -855,7 +855,7 @@ static int handle_outgoing(RedsStream *stream, OutgoingHandler *handler)
>             case EPIPE:
>                 return -1;
>             default:
> -                red_printf("%s", strerror(errno));
> +                red_warn("%s", strerror(errno));
>                 return -1;
>             }
>         } else {
> @@ -895,7 +895,7 @@ static int outgoing_write(RedsStream *stream, OutgoingHandler *handler, void *in
>             case EPIPE:
>                 return OUTGOING_FAILED;
>             default:
> -                red_printf("%s", strerror(errno));
> +                red_warn("%s", strerror(errno));
>                 return OUTGOING_FAILED;
>             }
>         } else {
> @@ -945,7 +945,7 @@ static void reds_send_channels()
>     int i;
>
>     if (reds->mig_target) {
> -        red_printf("warning: unexpected SPICE_MSGC_MAIN_ATTACH_CHANNELS during migration");
> +        red_warn("warning: unexpected SPICE_MSGC_MAIN_ATTACH_CHANNELS during migration");
>         return;
>     }
>
> @@ -996,7 +996,7 @@ static int send_ping(int size)
>  static void do_ping_client(const char *opt, int has_interval, int interval)
>  {
>     if (!reds->stream) {
> -        red_printf("not connected to stream");
> +        red_warn("not connected to stream");
>         return;
>     }
>
> @@ -1017,7 +1017,7 @@ static void do_ping_client(const char *opt, int has_interval, int interval)
>  static void ping_timer_cb()
>  {
>     if (!reds->stream) {
> -        red_printf("not connected to stream, ping off");
> +        red_warn("not connected to stream, ping off");
>         core->timer_cancel(reds->ping_timer);
>         return;
>     }
> @@ -1247,7 +1247,7 @@ static void dispatch_vdi_port_data(int port, VDIReadBuf *buf)
>         break;
>     default:
>         ring_add(&state->read_bufs, &buf->link);
> -        red_printf("invalid port");
> +        red_warn("invalid port");
>         reds_agent_remove();
>     }
>  }
> @@ -1488,7 +1488,7 @@ static int main_channel_restore_vdi_read_state(MainMigrateData *data, uint8_t **
>     switch (state->read_state) {
>     case VDI_PORT_READ_STATE_READ_HADER:
>         if (data->read_buf_len) {
> -            red_printf("unexpected receive buf");
> +            red_warn("unexpected receive buf");
>             reds_disconnect();
>             return FALSE;
>         }
> @@ -1496,13 +1496,13 @@ static int main_channel_restore_vdi_read_state(MainMigrateData *data, uint8_t **
>         break;
>     case VDI_PORT_READ_STATE_GET_BUFF:
>         if (state->message_recive_len > state->vdi_chunk_header.size) {
> -            red_printf("invalid message receive len");
> +            red_warn("invalid message receive len");
>             reds_disconnect();
>             return FALSE;
>         }
>
>         if (data->read_buf_len) {
> -            red_printf("unexpected receive buf");
> +            red_warn("unexpected receive buf");
>             reds_disconnect();
>             return FALSE;
>         }
> @@ -1512,20 +1512,20 @@ static int main_channel_restore_vdi_read_state(MainMigrateData *data, uint8_t **
>         uint32_t n;
>
>         if (!data->read_buf_len) {
> -            red_printf("read state and read_buf_len == 0");
> +            red_warn("read state and read_buf_len == 0");
>             reds_disconnect();
>             return FALSE;
>         }
>
>         if (state->message_recive_len > state->vdi_chunk_header.size) {
> -            red_printf("invalid message receive len");
> +            red_warn("invalid message receive len");
>             reds_disconnect();
>             return FALSE;
>         }
>
>
>         if (!(ring_item = ring_get_head(&state->read_bufs))) {
> -            red_printf("get read buf failed");
> +            red_warn("get read buf failed");
>             reds_disconnect();
>             return FALSE;
>         }
> @@ -1535,7 +1535,7 @@ static int main_channel_restore_vdi_read_state(MainMigrateData *data, uint8_t **
>         buff->len = data->read_buf_len;
>         n = buff->len - state->recive_len;
>         if (buff->len > SPICE_AGENT_MAX_DATA_SIZE || n > SPICE_AGENT_MAX_DATA_SIZE) {
> -            red_printf("bad read position");
> +            red_warn("bad read position");
>             reds_disconnect();
>             return FALSE;
>         }
> @@ -1545,7 +1545,7 @@ static int main_channel_restore_vdi_read_state(MainMigrateData *data, uint8_t **
>         break;
>     }
>     default:
> -        red_printf("invalid read state");
> +        red_warn("invalid read state");
>         reds_disconnect();
>         return FALSE;
>     }
> @@ -1573,14 +1573,14 @@ static int main_channel_restore_vdi_wqueue(MainMigrateData *data, uint8_t *pos,
>     inf_end = inf + data->write_queue_size;
>     pos = (uint8_t *)inf_end;
>     if (pos > end) {
> -        red_printf("access violation");
> +        red_warn("access violation");
>         reds_disconnect();
>         return FALSE;
>     }
>
>     for (; inf < inf_end; inf++) {
>         if (pos + inf->len > end) {
> -            red_printf("access violation");
> +            red_warn("access violation");
>             reds_disconnect();
>             return FALSE;
>         }
> @@ -1588,7 +1588,7 @@ static int main_channel_restore_vdi_wqueue(MainMigrateData *data, uint8_t *pos,
>             VDInternalBuf *buf;
>
>             if (inf->len > sizeof(*buf) - SPICE_OFFSETOF(VDInternalBuf, header)) {
> -                red_printf("bad buffer len");
> +                red_warn("bad buffer len");
>                 reds_disconnect();
>                 return FALSE;
>             }
> @@ -1604,12 +1604,12 @@ static int main_channel_restore_vdi_wqueue(MainMigrateData *data, uint8_t *pos,
>
>             state->num_tokens--;
>             if (inf->len > sizeof(*buf) - SPICE_OFFSETOF(VDAgentExtBuf, buf)) {
> -                red_printf("bad buffer len");
> +                red_warn("bad buffer len");
>                 reds_disconnect();
>                 return FALSE;
>             }
>             if (!(ring_item = ring_get_head(&reds->agent_state.external_bufs))) {
> -                red_printf("no external buff");
> +                red_warn("no external buff");
>                 reds_disconnect();
>                 return FALSE;
>             }
> @@ -1620,7 +1620,7 @@ static int main_channel_restore_vdi_wqueue(MainMigrateData *data, uint8_t *pos,
>             buf->base.write_len = inf->len;
>             ring_add(&reds->agent_state.write_queue, &buf->base.link);
>         } else {
> -            red_printf("invalid data");
> +            red_warn("invalid data");
>             reds_disconnect();
>             return FALSE;
>         }
> @@ -1635,7 +1635,7 @@ static void main_channel_recive_migrate_data(MainMigrateData *data, uint8_t *end
>     uint8_t *pos;
>
>     if (data->version != MAIN_CHANNEL_MIG_DATA_VERSION) {
> -        red_printf("version mismatch");
> +        red_warn("version mismatch");
>         reds_disconnect();
>         return;
>     }
> @@ -1684,7 +1684,7 @@ static void reds_main_handle_message(void *opaque, size_t size, uint32_t type, v
>
>     switch (type) {
>     case SPICE_MSGC_MAIN_AGENT_START:
> -        red_printf("agent start");
> +        red_log(2, "agent start");
>         if (!reds->stream || !vdagent) {
>             return;
>         }
> @@ -1695,7 +1695,7 @@ static void reds_main_handle_message(void *opaque, size_t size, uint32_t type, v
>         VDAgentExtBuf *buf;
>
>         if (!reds->agent_state.num_client_tokens) {
> -            red_printf("token violation");
> +            red_warn("token violation");
>             reds_disconnect();
>             break;
>         }
> @@ -1715,7 +1715,7 @@ static void reds_main_handle_message(void *opaque, size_t size, uint32_t type, v
>         }
>
>         if (!(ring_item = ring_get_head(&reds->agent_state.external_bufs))) {
> -            red_printf("no agent free bufs");
> +            red_warn("no agent free bufs");
>             reds_disconnect();
>             break;
>         }
> @@ -1735,14 +1735,14 @@ static void reds_main_handle_message(void *opaque, size_t size, uint32_t type, v
>         reds_send_channels();
>         break;
>     case SPICE_MSGC_MAIN_MIGRATE_CONNECTED:
> -        red_printf("client connected to migration target");
> +        red_log(2, "client connected to migration target");
>         if (reds->mig_wait_connect) {
>             reds->mig_connect_ok = TRUE;
>             reds_mig_cleanup();
>         }
>         break;
>     case SPICE_MSGC_MAIN_MIGRATE_CONNECT_ERROR:
> -        red_printf("mig connect error");
> +        red_log(2, "mig connect error");
>         if (reds->mig_wait_connect) {
>             reds->mig_connect_ok = FALSE;
>             reds_mig_cleanup();
> @@ -1754,14 +1754,14 @@ static void reds_main_handle_message(void *opaque, size_t size, uint32_t type, v
>             if (reds->is_client_mouse_allowed) {
>                 reds_set_mouse_mode(SPICE_MOUSE_MODE_CLIENT);
>             } else {
> -                red_printf("client mouse is disabled");
> +                red_log(2, "client mouse is disabled");
>             }
>             break;
>         case SPICE_MOUSE_MODE_SERVER:
>             reds_set_mouse_mode(SPICE_MOUSE_MODE_SERVER);
>             break;
>         default:
> -            red_printf("unsupported mouse mode");
> +            red_warn("unsupported mouse mode");
>         }
>         break;
>     }
> @@ -1789,12 +1789,12 @@ static void reds_main_handle_message(void *opaque, size_t size, uint32_t type, v
>                 if (roundtrip <= latency) {
>                     // probably high load on client or server result with incorrect values
>                     latency = 0;
> -                    red_printf("net test: invalid values, latency %lu roundtrip %lu. assuming high"
> -                               "bandwidth", latency, roundtrip);
> +                    red_warn("net test: invalid values, latency %lu roundtrip %lu. assuming high"
> +                             "bandwidth", latency, roundtrip);
>                     break;
>                 }
>                 bitrate_per_sec = (uint64_t)(NET_TEST_BYTES * 8) * 1000000 / (roundtrip - latency);
> -                red_printf("net test: latency %f ms, bitrate %lu bps (%f Mbps)%s",
> +                red_log(2, "net test: latency %f ms, bitrate %lu bps (%f Mbps)%s",
>                            (double)latency / 1000,
>                            bitrate_per_sec,
>                            (double)bitrate_per_sec / 1024 / 1024,
> @@ -1802,10 +1802,10 @@ static void reds_main_handle_message(void *opaque, size_t size, uint32_t type, v
>                 reds->net_test_stage = NET_TEST_STAGE_INVALID;
>                 break;
>             default:
> -                red_printf("invalid net test stage, ping id %d test id %d stage %d",
> -                           ping->id,
> -                           reds->net_test_id,
> -                           reds->net_test_stage);
> +                red_warn("invalid net test stage, ping id %d test id %d stage %d",
> +                         ping->id,
> +                         reds->net_test_id,
> +                         reds->net_test_stage);
>             }
>             break;
>         }
> @@ -1827,18 +1827,18 @@ static void reds_main_handle_message(void *opaque, size_t size, uint32_t type, v
>         break;
>     case SPICE_MSGC_MAIN_MIGRATE_END:
>         if (!reds->mig_target) {
> -            red_printf("unexpected SPICE_MSGC_MIGRATE_END, not target");
> +            red_warn("unexpected SPICE_MSGC_MIGRATE_END, not target");
>             return;
>         }
>         if (!reds->client_semi_mig_cap) {
> -            red_printf("unexpected SPICE_MSGC_MIGRATE_END"
> -                       ",client does not support semi-seamless migration");
> +            red_warn("unexpected SPICE_MSGC_MIGRATE_END"
> +                     ",client does not support semi-seamless migration");
>             return;
>         }
>         reds_handle_client_migrate_complete();
>         break;
>     default:
> -        red_printf("unexpected type %d", type);
> +        red_warn("unexpected type %d", type);
>     }
>  }
>
> @@ -1865,7 +1865,7 @@ static int reds_send_data()
>                 reds_disconnect();
>                 return FALSE;
>             default:
> -                red_printf("%s", strerror(errno));
> +                red_warn("%s", strerror(errno));
>                 reds_disconnect();
>                 return FALSE;
>             }
> @@ -2025,12 +2025,12 @@ static int reds_send_link_ack(RedLinkInfo *link)
>     ack.caps_offset = sizeof(SpiceLinkReply);
>
>     if (!(link->tiTicketing.rsa = RSA_new())) {
> -        red_printf("RSA nes failed");
> +        red_warn("RSA nes failed");
>         return FALSE;
>     }
>
>     if (!(bio = BIO_new(BIO_s_mem()))) {
> -        red_printf("BIO new failed");
> +        red_warn("BIO new failed");
>         return FALSE;
>     }
>
> @@ -2076,7 +2076,7 @@ static int reds_send_link_error(RedLinkInfo *link, uint32_t error)
>
>  static void reds_show_new_channel(RedLinkInfo *link, int connection_id)
>  {
> -    red_printf("channel %d:%d, connected successfully, over %s link",
> +    red_log(2, "channel %d:%d, connected successfully, over %s link",
>                link->link_mess->channel_type,
>                link->link_mess->channel_id,
>                link->stream->ssl == NULL ? "Non Secure" : "Secure");
> @@ -2153,7 +2153,7 @@ static void reds_handle_main_link(RedLinkInfo *link)
>     uint32_t *channel_caps;
>     uint32_t num_channel_caps;
>
> -    red_printf("");
> +    red_log(2, "");
>
>     reds_disconnect();
>
> @@ -2184,8 +2184,8 @@ static void reds_handle_main_link(RedLinkInfo *link)
>                                       NULL;
>     reds->client_semi_mig_cap = test_capability(channel_caps, num_channel_caps, SPICE_MAIN_CAP_SEMI_SEAMLESS_MIGRATE);
>     if (reds->client_semi_mig_cap && (SPICE_VERSION_MAJOR == 2) && (reds->peer_minor_version < 1)) {
> -        red_printf("warning: client claims to support semi seamless migration,"
> -                   "but its version is incompatible");
> +        red_warn("warning: client claims to support semi seamless migration,"
> +                 "but its version is incompatible");
>         reds->client_semi_mig_cap = FALSE;
>     }
>
> @@ -2323,7 +2323,7 @@ static void inputs_handle_input(void *opaque, size_t size, uint32_t type, void *
>         if (++state->motion_count % SPICE_INPUT_MOTION_ACK_BUNCH == 0) {
>             m = marshaller_new_for_outgoing(state, SPICE_MSG_INPUTS_MOUSE_MOTION_ACK);
>             if (!marshaller_outgoing_write(m, state)) {
> -                red_printf("motion ack failed");
> +                red_warn("motion ack failed");
>                 reds_disconnect();
>             }
>             spice_marshaller_destroy(m);
> @@ -2343,7 +2343,7 @@ static void inputs_handle_input(void *opaque, size_t size, uint32_t type, void *
>         if (++state->motion_count % SPICE_INPUT_MOTION_ACK_BUNCH == 0) {
>             m = marshaller_new_for_outgoing(state, SPICE_MSG_INPUTS_MOUSE_MOTION_ACK);
>             if (!marshaller_outgoing_write(m, state)) {
> -                red_printf("position ack failed");
> +                red_warn("position ack failed");
>                 reds_disconnect();
>             }
>             spice_marshaller_destroy(m);
> @@ -2443,7 +2443,7 @@ static void inputs_handle_input(void *opaque, size_t size, uint32_t type, void *
>     case SPICE_MSGC_DISCONNECTING:
>         break;
>     default:
> -        red_printf("unexpected type %d", type);
> +        red_warn("unexpected type %d", type);
>     }
>  }
>
> @@ -2517,7 +2517,7 @@ static void inputs_migrate(Channel *channel)
>     spice_marshall_msg_migrate(m, &migrate);
>
>     if (!marshaller_outgoing_write(m, state)) {
> -        red_printf("write failed");
> +        red_warn("write failed");
>     }
>     spice_marshaller_destroy(m);
>  }
> @@ -2526,8 +2526,8 @@ static void inputs_select(void *opaque, int select)
>  {
>     InputsState *inputs_state;
>     int eventmask = SPICE_WATCH_EVENT_READ;
> -    red_printf("");
>
> +    red_log(2, "");
>     inputs_state = (InputsState *)opaque;
>     if (select) {
>         eventmask |= SPICE_WATCH_EVENT_WRITE;
> @@ -2537,7 +2537,7 @@ static void inputs_select(void *opaque, int select)
>
>  static void inputs_may_write(void *opaque)
>  {
> -    red_printf("");
> +    red_log(2, "");
>  }
>
>  static void inputs_link(Channel *channel, RedsStream *stream, int migration,
> @@ -2548,19 +2548,19 @@ static void inputs_link(Channel *channel, RedsStream *stream, int migration,
>     int delay_val;
>     int flags;
>
> -    red_printf("");
> +    red_log(2, "");
>     ASSERT(channel->data == NULL);
>
>     inputs_state = spice_new0(InputsState, 1);
>
>     delay_val = 1;
> -    if (setsockopt(stream->socket, IPPROTO_TCP, TCP_NODELAY, &delay_val, sizeof(delay_val)) == -1) {
> -        red_printf("setsockopt failed, %s", strerror(errno));
> +    if (setsockopt(stream->socket, IPPROTO_TCP,TCP_NODELAY, &delay_val, sizeof(delay_val)) == -1) {
> +        red_warn("setsockopt failed, %s", strerror(errno));
>     }
>
>     if ((flags = fcntl(stream->socket, F_GETFL)) == -1 ||
>                                             fcntl(stream->socket, F_SETFL, flags | O_ASYNC) == -1) {
> -        red_printf("fcntl failed, %s", strerror(errno));
> +        red_warn("fcntl failed, %s", strerror(errno));
>     }
>
>     inputs_state->stream = stream;
> @@ -2584,7 +2584,7 @@ static void inputs_link(Channel *channel, RedsStream *stream, int migration,
>     inputs_init.keyboard_modifiers = kbd_get_leds(keyboard);
>     spice_marshall_msg_inputs_init(m, &inputs_init);
>     if (!marshaller_outgoing_write(m, inputs_state)) {
> -        red_printf("failed to send modifiers state");
> +        red_warn("failed to send modifiers state");
>         reds_disconnect();
>     }
>     spice_marshaller_destroy(m);
> @@ -2608,7 +2608,7 @@ static void reds_send_keyboard_modifiers(uint8_t modifiers)
>     spice_marshall_msg_inputs_key_modifiers(m, &key_modifiers);
>
>     if (!marshaller_outgoing_write(m, state)) {
> -        red_printf("failed to send modifiers state");
> +        red_warn("failed to send modifiers state");
>         reds_disconnect();
>     }
>     spice_marshaller_destroy(m);
> @@ -2665,7 +2665,7 @@ static void reds_mig_pending_link_add(SpiceLinkMess *link_msg, RedsStream *strea
>
>  static void reds_mig_pending_links_free(void)
>  {
> -    red_printf("");
> +    red_log(2, "");
>     while(reds->mig_pending_links) {
>         RedsMigPendingLink *tmp = reds->mig_pending_links;
>         reds->mig_pending_links = tmp->next;
> @@ -2717,7 +2717,7 @@ static void reds_handle_client_migrate_complete(void)
>  {
>     RedsMigPendingLink *cur_link;
>
> -    red_printf("");
> +    red_log(2, "");
>     // TODO: not doing net test. consider doing it on client_migrate_info
>     reds_main_channel_init(FALSE);
>
> @@ -2725,8 +2725,8 @@ static void reds_handle_client_migrate_complete(void)
>         Channel *channel = reds_find_channel(cur_link->link_msg->channel_type,
>                                              cur_link->link_msg->channel_id);
>         if (!channel) {
> -            red_printf("warning: channel (%d, %d) (type,id) wasn't found",
> -                       cur_link->link_msg->channel_type, cur_link->link_msg->channel_id);
> +            red_warn("warning: channel (%d, %d) (type,id) wasn't found",
> +                     cur_link->link_msg->channel_type, cur_link->link_msg->channel_id);
>             continue;
>        }
>        reds_channel_do_link(channel, cur_link->link_msg, cur_link->stream);
> @@ -2804,8 +2804,8 @@ static void reds_handle_ticket(void *opaque)
>
>         if (strlen(taTicket.password) == 0) {
>             reds_send_link_result(link, SPICE_LINK_ERR_PERMISSION_DENIED);
> -            red_printf("Ticketing is enabled, but no password is set. "
> -                       "please set a ticket first");
> +            red_warn("Ticketing is enabled, but no password is set. "
> +                     "please set a ticket first");
>             reds_link_free(link);
>             return;
>         }
> @@ -2849,7 +2849,7 @@ ssize_t reds_stream_sasl_write(RedsStream *s, const void *buf, size_t nbyte)
>                           (const char **)&s->sasl.encoded,
>                           &s->sasl.encodedLength);
>         if (err != SASL_OK) {
> -            red_printf("sasl_encode error: %d", err);
> +            red_warn("sasl_encode error: %d", err);
>             return -1;
>         }
>
> @@ -2858,7 +2858,7 @@ ssize_t reds_stream_sasl_write(RedsStream *s, const void *buf, size_t nbyte)
>         }
>
>         if (!s->sasl.encoded) {
> -            red_printf("sasl_encode didn't return a buffer!");
> +            red_warn("sasl_encode didn't return a buffer!");
>             return 0;
>         }
>
> @@ -2910,7 +2910,7 @@ static ssize_t reds_stream_sasl_read(RedsStream *s, void *buf, size_t nbyte)
>                       (char *)encoded, n,
>                       &decoded, &decodedlen);
>     if (err != SASL_OK) {
> -        red_printf("sasl_decode error: %d", err);
> +        red_warn("sasl_decode error: %d", err);
>         return -1;
>     }
>
> @@ -2992,8 +2992,8 @@ static char *addr_to_string(const char *format,
>                            host, sizeof(host),
>                            serv, sizeof(serv),
>                            NI_NUMERICHOST | NI_NUMERICSERV)) != 0) {
> -        red_printf("Cannot resolve address %d: %s",
> -                   err, gai_strerror(err));
> +        red_warn("Cannot resolve address %d: %s",
> +                 err, gai_strerror(err));
>         return NULL;
>     }
>
> @@ -3023,7 +3023,7 @@ static int auth_sasl_check_ssf(RedsSASL *sasl, int *runSSF)
>     }
>
>     ssf = *(const int *)val;
> -    red_printf("negotiated an SSF of %d", ssf);
> +    red_log(2, "negotiated an SSF of %d", ssf);
>     if (ssf < 56) {
>         return 0; /* 56 is good for Kerberos */
>     }
> @@ -3070,7 +3070,7 @@ static void reds_handle_auth_sasl_step(void *opaque)
>         datalen--; /* Don't count NULL byte when passing to _start() */
>     }
>
> -    red_printf("Step using SASL Data %p (%d bytes)",
> +    red_log(2, "Step using SASL Data %p (%d bytes)",
>                clientdata, datalen);
>     err = sasl_server_step(sasl->conn,
>                            clientdata,
> @@ -3079,18 +3079,18 @@ static void reds_handle_auth_sasl_step(void *opaque)
>                            &serveroutlen);
>     if (err != SASL_OK &&
>         err != SASL_CONTINUE) {
> -        red_printf("sasl step failed %d (%s)",
> -                   err, sasl_errdetail(sasl->conn));
> +        red_warn("sasl step failed %d (%s)",
> +                 err, sasl_errdetail(sasl->conn));
>         goto authabort;
>     }
>
>     if (serveroutlen > SASL_DATA_MAX_LEN) {
> -        red_printf("sasl step reply data too long %d",
> -                   serveroutlen);
> +        red_warn("sasl step reply data too long %d",
> +                 serveroutlen);
>         goto authabort;
>     }
>
> -    red_printf("SASL return data %d bytes, %p", serveroutlen, serverout);
> +    red_log(2, "SASL return data %d bytes, %p", serveroutlen, serverout);
>
>     if (serveroutlen) {
>         serveroutlen += 1;
> @@ -3104,7 +3104,7 @@ static void reds_handle_auth_sasl_step(void *opaque)
>     sync_write_u8(link->stream, err == SASL_CONTINUE ? 0 : 1);
>
>     if (err == SASL_CONTINUE) {
> -        red_printf("%s", "Authentication must continue (step)");
> +        red_log(2, "%s", "Authentication must continue (step)");
>         /* Wait for step length */
>         obj->now = (uint8_t *)&sasl->len;
>         obj->end = obj->now + sizeof(uint32_t);
> @@ -3114,11 +3114,11 @@ static void reds_handle_auth_sasl_step(void *opaque)
>         int ssf;
>
>         if (auth_sasl_check_ssf(sasl, &ssf) == 0) {
> -            red_printf("Authentication rejected for weak SSF");
> +            red_warn("Authentication rejected for weak SSF");
>             goto authreject;
>         }
>
> -        red_printf("Authentication successful");
> +        red_log(2, "Authentication successful");
>         sync_write_u32(link->stream, SPICE_LINK_ERR_OK); /* Accept auth */
>
>         /*
> @@ -3148,9 +3148,9 @@ static void reds_handle_auth_sasl_steplen(void *opaque)
>     AsyncRead *obj = &link->asyc_read;
>     RedsSASL *sasl = &link->stream->sasl;
>
> -    red_printf("Got steplen %d", sasl->len);
> +    red_log(2, "Got steplen %d", sasl->len);
>     if (sasl->len > SASL_DATA_MAX_LEN) {
> -        red_printf("Too much SASL data %d", sasl->len);
> +        red_warn("Too much SASL data %d", sasl->len);
>         reds_link_free(link);
>         return;
>     }
> @@ -3200,7 +3200,7 @@ static void reds_handle_auth_sasl_start(void *opaque)
>         datalen--; /* Don't count NULL byte when passing to _start() */
>     }
>
> -    red_printf("Start SASL auth with mechanism %s. Data %p (%d bytes)",
> +    red_log(2, "Start SASL auth with mechanism %s. Data %p (%d bytes)",
>               sasl->mechlist, clientdata, datalen);
>     err = sasl_server_start(sasl->conn,
>                             sasl->mechlist,
> @@ -3210,18 +3210,18 @@ static void reds_handle_auth_sasl_start(void *opaque)
>                             &serveroutlen);
>     if (err != SASL_OK &&
>         err != SASL_CONTINUE) {
> -        red_printf("sasl start failed %d (%s)",
> -                   err, sasl_errdetail(sasl->conn));
> +        red_warn("sasl start failed %d (%s)",
> +                 err, sasl_errdetail(sasl->conn));
>         goto authabort;
>     }
>
>     if (serveroutlen > SASL_DATA_MAX_LEN) {
> -        red_printf("sasl start reply data too long %d",
> -                   serveroutlen);
> +        red_warn("sasl start reply data too long %d",
> +                 serveroutlen);
>         goto authabort;
>     }
>
> -    red_printf("SASL return data %d bytes, %p", serveroutlen, serverout);
> +    red_log(2, "SASL return data %d bytes, %p", serveroutlen, serverout);
>
>     if (serveroutlen) {
>         serveroutlen += 1;
> @@ -3235,7 +3235,7 @@ static void reds_handle_auth_sasl_start(void *opaque)
>     sync_write_u8(link->stream, err == SASL_CONTINUE ? 0 : 1);
>
>     if (err == SASL_CONTINUE) {
> -        red_printf("%s", "Authentication must continue (start)");
> +        red_log(2, "%s", "Authentication must continue (start)");
>         /* Wait for step length */
>         obj->now = (uint8_t *)&sasl->len;
>         obj->end = obj->now + sizeof(uint32_t);
> @@ -3245,11 +3245,11 @@ static void reds_handle_auth_sasl_start(void *opaque)
>         int ssf;
>
>         if (auth_sasl_check_ssf(sasl, &ssf) == 0) {
> -            red_printf("Authentication rejected for weak SSF");
> +            red_warn("Authentication rejected for weak SSF");
>             goto authreject;
>         }
>
> -        red_printf("Authentication successful");
> +        red_log(2, "Authentication successful");
>         sync_write_u32(link->stream, SPICE_LINK_ERR_OK); /* Accept auth */
>
>         /*
> @@ -3279,9 +3279,9 @@ static void reds_handle_auth_startlen(void *opaque)
>     AsyncRead *obj = &link->asyc_read;
>     RedsSASL *sasl = &link->stream->sasl;
>
> -    red_printf("Got client start len %d", sasl->len);
> +    red_log(2, "Got client start len %d", sasl->len);
>     if (sasl->len > SASL_DATA_MAX_LEN) {
> -        red_printf("Too much SASL data %d", sasl->len);
> +        red_log(2, "Too much SASL data %d", sasl->len);
>         reds_send_link_error(link, SPICE_LINK_ERR_INVALID_DATA);
>         reds_link_free(link);
>         return;
> @@ -3306,24 +3306,24 @@ static void reds_handle_auth_mechname(void *opaque)
>     RedsSASL *sasl = &link->stream->sasl;
>
>     sasl->mechname[sasl->len] = '\0';
> -    red_printf("Got client mechname '%s' check against '%s'",
> +    red_log(2, "Got client mechname '%s' check against '%s'",
>                sasl->mechname, sasl->mechlist);
>
>     if (strncmp(sasl->mechlist, sasl->mechname, sasl->len) == 0) {
>         if (sasl->mechlist[sasl->len] != '\0' &&
>             sasl->mechlist[sasl->len] != ',') {
> -            red_printf("One %d", sasl->mechlist[sasl->len]);
> +            red_log(2, "One %d", sasl->mechlist[sasl->len]);
>             reds_link_free(link);
>             return;
>         }
>     } else {
>         char *offset = strstr(sasl->mechlist, sasl->mechname);
> -        red_printf("Two %p", offset);
> +        red_log(2, "Two %p", offset);
>         if (!offset) {
>             reds_send_link_error(link, SPICE_LINK_ERR_INVALID_DATA);
>             return;
>         }
> -        red_printf("Two '%s'", offset);
> +        red_log(2, "Two '%s'", offset);
>         if (offset[-1] != ',' ||
>             (offset[sasl->len] != '\0'&&
>              offset[sasl->len] != ',')) {
> @@ -3335,7 +3335,7 @@ static void reds_handle_auth_mechname(void *opaque)
>     free(sasl->mechlist);
>     sasl->mechlist = strdup(sasl->mechname);
>
> -    red_printf("Validated mechname '%s'", sasl->mechname);
> +    red_log(2, "Validated mechname '%s'", sasl->mechname);
>
>     obj->now = (uint8_t *)&sasl->len;
>     obj->end = obj->now + sizeof(uint32_t);
> @@ -3352,14 +3352,14 @@ static void reds_handle_auth_mechlen(void *opaque)
>     RedsSASL *sasl = &link->stream->sasl;
>
>     if (sasl->len < 1 || sasl->len > 100) {
> -        red_printf("Got bad client mechname len %d", sasl->len);
> +        red_log(2, "Got bad client mechname len %d", sasl->len);
>         reds_link_free(link);
>         return;
>     }
>
>     sasl->mechname = spice_malloc(sasl->len + 1);
>
> -    red_printf("Wait for client mechname");
> +    red_log(2, "Wait for client mechname");
>     obj->now = (uint8_t *)sasl->mechname;
>     obj->end = obj->now + sasl->len;
>     obj->done = reds_handle_auth_mechname;
> @@ -3399,8 +3399,8 @@ static void reds_start_auth_sasl(RedLinkInfo *link)
>     localAddr = remoteAddr = NULL;
>
>     if (err != SASL_OK) {
> -        red_printf("sasl context setup failed %d (%s)",
> -                   err, sasl_errstring(err, NULL, NULL));
> +        red_warn("sasl context setup failed %d (%s)",
> +                 err, sasl_errstring(err, NULL, NULL));
>         sasl->conn = NULL;
>         goto error;
>     }
> @@ -3412,8 +3412,8 @@ static void reds_start_auth_sasl(RedLinkInfo *link)
>         ssf = SSL_get_cipher_bits(link->stream->ssl, NULL);
>         err = sasl_setprop(sasl->conn, SASL_SSF_EXTERNAL, &ssf);
>         if (err != SASL_OK) {
> -            red_printf("cannot set SASL external SSF %d (%s)",
> -                       err, sasl_errstring(err, NULL, NULL));
> +            red_warn("cannot set SASL external SSF %d (%s)",
> +                     err, sasl_errstring(err, NULL, NULL));
>             sasl_dispose(&sasl->conn);
>             sasl->conn = NULL;
>             goto error;
> @@ -3442,8 +3442,8 @@ static void reds_start_auth_sasl(RedLinkInfo *link)
>
>     err = sasl_setprop(sasl->conn, SASL_SEC_PROPS, &secprops);
>     if (err != SASL_OK) {
> -        red_printf("cannot set SASL security props %d (%s)",
> -                   err, sasl_errstring(err, NULL, NULL));
> +        red_warn("cannot set SASL security props %d (%s)",
> +                 err, sasl_errstring(err, NULL, NULL));
>         sasl_dispose(&sasl->conn);
>         sasl->conn = NULL;
>         goto error;
> @@ -3458,24 +3458,24 @@ static void reds_start_auth_sasl(RedLinkInfo *link)
>                         NULL,
>                         NULL);
>     if (err != SASL_OK) {
> -        red_printf("cannot list SASL mechanisms %d (%s)",
> -                   err, sasl_errdetail(sasl->conn));
> +        red_warn("cannot list SASL mechanisms %d (%s)",
> +                 err, sasl_errdetail(sasl->conn));
>         sasl_dispose(&sasl->conn);
>         sasl->conn = NULL;
>         goto error;
>     }
> -    red_printf("Available mechanisms for client: '%s'", mechlist);
> +    red_log(2, "Available mechanisms for client: '%s'", mechlist);
>
>     sasl->mechlist = strdup(mechlist);
>
>     mechlistlen = strlen(mechlist);
>     if (!sync_write(link->stream, &mechlistlen, sizeof(uint32_t))
>         || !sync_write(link->stream, sasl->mechlist, mechlistlen)) {
> -        red_printf("SASL mechanisms write error");
> +        red_warn("SASL mechanisms write error");
>         goto error;
>     }
>
> -    red_printf("Wait for client mechname length");
> +    red_log(2, "Wait for client mechname length");
>     obj->now = (uint8_t *)&sasl->len;
>     obj->end = obj->now + sizeof(uint32_t);
>     obj->done = reds_handle_auth_mechlen;
> @@ -3493,7 +3493,7 @@ static void reds_handle_auth_mechanism(void *opaque)
>  {
>     RedLinkInfo *link = (RedLinkInfo *)opaque;
>
> -    red_printf("Auth method: %d", link->auth_mechanism.auth_mechanism);
> +    red_log(2, "Auth method: %d", link->auth_mechanism.auth_mechanism);
>
>     if (link->auth_mechanism.auth_mechanism == SPICE_COMMON_CAP_AUTH_SPICE
>         && !sasl_enabled
> @@ -3501,13 +3501,13 @@ static void reds_handle_auth_mechanism(void *opaque)
>         reds_get_spice_ticket(link);
>  #if HAVE_SASL
>     } else if (link->auth_mechanism.auth_mechanism == SPICE_COMMON_CAP_AUTH_SASL) {
> -        red_printf("Starting SASL");
> +        red_log(2, "Starting SASL");
>         reds_start_auth_sasl(link);
>  #endif
>     } else {
> -        red_printf("Unknown auth method, disconnecting");
> +        red_warn("Unknown auth method, disconnecting");
>         if (sasl_enabled) {
> -            red_printf("Your client doesn't handle SASL?");
> +            red_warn("Your client doesn't handle SASL?");
>         }
>         reds_send_link_error(link, SPICE_LINK_ERR_INVALID_DATA);
>         reds_link_free(link);
> @@ -3544,10 +3544,10 @@ static void reds_handle_read_link_done(void *opaque)
>
>     if (!reds_security_check(link)) {
>         if (link->stream->ssl) {
> -            red_printf("spice channels %d should not be encrypted", link_mess->channel_type);
> +            red_warn("spice channels %d should not be encrypted", link_mess->channel_type);
>             reds_send_link_error(link, SPICE_LINK_ERR_NEED_UNSECURED);
>         } else {
> -            red_printf("spice channels %d should be encrypted", link_mess->channel_type);
> +            red_warn("spice channels %d should be encrypted", link_mess->channel_type);
>             reds_send_link_error(link, SPICE_LINK_ERR_NEED_SECURED);
>         }
>         reds_link_free(link);
> @@ -3561,11 +3561,11 @@ static void reds_handle_read_link_done(void *opaque)
>
>     if (!auth_selection) {
>         if (sasl_enabled) {
> -            red_printf("SASL enabled, but peer supports only spice authentication");
> +            red_warn("SASL enabled, but peer supports only spice authentication");
>             reds_send_link_error(link, SPICE_LINK_ERR_VERSION_MISMATCH);
>             return;
>         }
> -        red_printf("Peer doesn't support AUTH selection");
> +        red_warn("Peer doesn't support AUTH selection");
>         reds_get_spice_ticket(link);
>     } else {
>         obj->now = (uint8_t *)&link->auth_mechanism;
> @@ -3583,7 +3583,7 @@ static void reds_handle_link_error(void *opaque, int err)
>     case EPIPE:
>         break;
>     default:
> -        red_printf("%s", strerror(errno));
> +        red_warn("%s", strerror(errno));
>         break;
>     }
>     reds_link_free(link);
> @@ -3606,7 +3606,7 @@ static void reds_handle_read_header_done(void *opaque)
>             reds_send_link_error(link, SPICE_LINK_ERR_VERSION_MISMATCH);
>         }
>
> -        red_printf("version mismatch");
> +        red_warn("version mismatch");
>         reds_link_free(link);
>         return;
>     }
> @@ -3615,7 +3615,7 @@ static void reds_handle_read_header_done(void *opaque)
>
>     if (header->size < sizeof(SpiceLinkMess)) {
>         reds_send_link_error(link, SPICE_LINK_ERR_INVALID_DATA);
> -        red_printf("bad size %u", header->size);
> +        red_warn("bad size %u", header->size);
>         reds_link_free(link);
>         return;
>     }
> @@ -3648,7 +3648,7 @@ static void reds_handle_ssl_accept(int fd, int event, void *data)
>     if ((return_code = SSL_accept(link->stream->ssl)) != 1) {
>         int ssl_error = SSL_get_error(link->stream->ssl, return_code);
>         if (ssl_error != SSL_ERROR_WANT_READ && ssl_error != SSL_ERROR_WANT_WRITE) {
> -            red_printf("SSL_accept failed, error=%d", ssl_error);
> +            red_warn("SSL_accept failed, error=%d", ssl_error);
>             reds_link_free(link);
>         } else {
>             if (ssl_error == SSL_ERROR_WANT_READ) {
> @@ -3672,22 +3672,22 @@ static RedLinkInfo *__reds_accept_connection(int listen_socket)
>     int socket;
>
>     if ((socket = accept(listen_socket, NULL, 0)) == -1) {
> -        red_printf("accept failed, %s", strerror(errno));
> +        red_warn("accept failed, %s", strerror(errno));
>         return NULL;
>     }
>
>     if ((flags = fcntl(socket, F_GETFL)) == -1) {
> -        red_printf("accept failed, %s", strerror(errno));
> +        red_warn("accept failed, %s", strerror(errno));
>         goto error;
>     }
>
>     if (fcntl(socket, F_SETFL, flags | O_NONBLOCK) == -1) {
> -        red_printf("accept failed, %s", strerror(errno));
> +        red_warn("accept failed, %s", strerror(errno));
>         goto error;
>     }
>
>     if (setsockopt(socket, IPPROTO_TCP, TCP_NODELAY, &delay_val, sizeof(delay_val)) == -1) {
> -        red_printf("setsockopt failed, %s", strerror(errno));
> +        red_warn("setsockopt failed, %s", strerror(errno));
>     }
>
>     link = spice_new0(RedLinkInfo, 1);
> @@ -3743,13 +3743,13 @@ static void reds_accept_ssl_connection(int fd, int event, void *data)
>
>     // Handle SSL handshaking
>     if (!(sbio = BIO_new_socket(link->stream->socket, BIO_NOCLOSE))) {
> -        red_printf("could not allocate ssl bio socket");
> +        red_warn("could not allocate ssl bio socket");
>         goto error;
>     }
>
>     link->stream->ssl = SSL_new(reds->ctx);
>     if (!link->stream->ssl) {
> -        red_printf("could not allocate ssl context");
> +        red_warn("could not allocate ssl context");
>         BIO_free(sbio);
>         goto error;
>     }
> @@ -3777,7 +3777,7 @@ static void reds_accept_ssl_connection(int fd, int event, void *data)
>     }
>
>     ERR_print_errors_fp(stderr);
> -    red_printf("SSL_accept failed, error=%d", ssl_error);
> +    red_warn("SSL_accept failed, error=%d", ssl_error);
>     SSL_free(link->stream->ssl);
>
>  error:
> @@ -3793,7 +3793,7 @@ static void reds_accept(int fd, int event, void *data)
>
>     link = reds_accept_connection(reds->listen_socket);
>     if (link == NULL) {
> -        red_printf("accept failed");
> +        red_warn("accept failed");
>         return;
>     }
>     reds_handle_new_link(link);
> @@ -3842,8 +3842,8 @@ static int reds_init_socket(const char *addr, int portnr, int family)
>         }
>         close(slisten);
>     }
> -    red_printf("%s: binding socket to %s:%d failed", __FUNCTION__,
> -               addr, portnr);
> +    red_warn("%s: binding socket to %s:%d failed", __FUNCTION__,
> +             addr, portnr);
>     freeaddrinfo(res);
>     return -1;
>
> @@ -4070,7 +4070,7 @@ enum {
>  static inline void on_activating_ticketing()
>  {
>     if (!ticketing_enabled && reds->stream) {
> -        red_printf("disconnecting");
> +        red_warn("disconnecting");
>         reds_disconnect();
>     }
>  }
> @@ -4134,7 +4134,7 @@ static void reds_mig_connect(void)
>     SpiceMsgMainMigrationBegin migrate;
>     RedsOutItem *item;
>
> -    red_printf("");
> +    red_log(2, "");
>     ASSERT(reds->client_semi_mig_cap);
>     item = new_out_item(SPICE_MSG_MAIN_MIGRATE_BEGIN);
>
> @@ -4185,7 +4185,7 @@ static void reds_mig_started(void)
>  {
>     SpiceMigrateInterface *sif = NULL;
>
> -    red_printf("");
> +    red_log(2, "");
>     ASSERT(reds->mig_spice);
>
>     if (!migration_interface) {
> @@ -4197,7 +4197,7 @@ static void reds_mig_started(void)
>     reds->mig_connect_ok = FALSE;
>
>     if (reds->stream == NULL) {
> -        red_printf("not connected to stream");
> +        red_warn("not connected to stream");
>         reds_mig_release();
>         sif->migrate_connect_complete(migration_interface);
>         return;
> @@ -4207,7 +4207,7 @@ static void reds_mig_started(void)
>     if (reds->client_semi_mig_cap) {
>         reds->mig_inprogress = TRUE;
>         if (reds->mig_target) {
> -            red_printf("previous spice migration hasn't completed yet. Waiting for client");
> +            red_log(2, "previous spice migration hasn't completed yet. Waiting for client");
>             reds->mig_wait_prev_complete = TRUE;
>             core->timer_start(reds->mig_timer, MIGRATE_TIMEOUT);
>         } else {
> @@ -4225,10 +4225,10 @@ static void reds_mig_finished(int completed)
>  {
>     RedsOutItem *item;
>
> -    red_printf("");
> +    red_log(2, "");
>     reds_mig_release();
> ...
>
> [Message clipped]



-- 
Marc-André Lureau


More information about the Spice-devel mailing list