From 14fef1954fd1eb68e89dad61a8b63b4a161adec1 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Thu, 9 Dec 2010 14:50:36 +0100 Subject: server: improve error handling We should pass up errors instead of aborting. Do that at least for bind() failures which actually happen in real live due to the tcp port being busy. Signed-off-by: Gerd Hoffmann (cherry picked from commit aafd8eea74acb23fc818b49824a74c4d885c3504) --- server/reds.c | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/server/reds.c b/server/reds.c index b4ec6e14..28409b93 100644 --- a/server/reds.c +++ b/server/reds.c @@ -2975,8 +2975,8 @@ static int reds_init_socket(const char *addr, int portnr, int family) } close(slisten); } - red_error("%s: binding socket to %s:%d failed\n", __FUNCTION__, - addr, portnr); + red_printf("%s: binding socket to %s:%d failed\n", __FUNCTION__, + addr, portnr); freeaddrinfo(res); return -1; @@ -2990,10 +2990,13 @@ listen: return slisten; } -static void reds_init_net() +static int reds_init_net(void) { if (spice_port != -1) { reds->listen_socket = reds_init_socket(spice_addr, spice_port, spice_family); + if (-1 == reds->listen_socket) { + return -1; + } reds->listen_watch = core->watch_add(reds->listen_socket, SPICE_WATCH_EVENT_READ, reds_accept, NULL); @@ -3005,6 +3008,9 @@ static void reds_init_net() if (spice_secure_port != -1) { reds->secure_listen_socket = reds_init_socket(spice_addr, spice_secure_port, spice_family); + if (-1 == reds->secure_listen_socket) { + return -1; + } reds->secure_listen_watch = core->watch_add(reds->secure_listen_socket, SPICE_WATCH_EVENT_READ, reds_accept_ssl_connection, NULL); @@ -3012,6 +3018,7 @@ static void reds_init_net() red_error("set fd handle failed"); } } + return 0; } static void load_dh_params(SSL_CTX *ctx, char *file) @@ -3709,12 +3716,13 @@ static void init_vd_agent_resources() const char *version_string = VERSION; -static void do_spice_init(SpiceCoreInterface *core_interface) +static int do_spice_init(SpiceCoreInterface *core_interface) { red_printf("starting %s", version_string); if (core_interface->base.major_version != SPICE_INTERFACE_CORE_MAJOR) { - red_error("bad core interface version"); + red_printf("bad core interface version"); + goto err; } core = core_interface; reds->listen_socket = -1; @@ -3773,7 +3781,9 @@ static void do_spice_init(SpiceCoreInterface *core_interface) } core->timer_start(reds->mm_timer, MM_TIMER_GRANULARITY_MS); - reds_init_net(); + if (reds_init_net() < 0) { + goto err; + } if (reds->secure_listen_socket != -1) { reds_init_ssl(); } @@ -3785,6 +3795,10 @@ static void do_spice_init(SpiceCoreInterface *core_interface) reds->mouse_mode = SPICE_MOUSE_MODE_SERVER; atexit(reds_exit); + return 0; + +err: + return -1; } /* new interface */ @@ -3799,12 +3813,14 @@ __visible__ SpiceServer *spice_server_new(void) __visible__ int spice_server_init(SpiceServer *s, SpiceCoreInterface *core) { + int ret; + ASSERT(reds == s); - do_spice_init(core); + ret = do_spice_init(core); if (default_renderer) { red_dispatcher_add_renderer(default_renderer); } - return 0; + return ret; } __visible__ void spice_server_destroy(SpiceServer *s) -- cgit