tNicer reporting of startup errors from server when running as an NT Service - vaccinewars - be a doctor and try to vaccinate the world (HTM) git clone git://src.adamsgaard.dk/vaccinewars (DIR) Log (DIR) Files (DIR) Refs (DIR) README (DIR) LICENSE --- (DIR) commit bead22d4de1db3ef56c7be794b8f2bc5d6d1af3a (DIR) parent 9c49b19f283c016694c0284c3a07d20a9a3927ac (HTM) Author: Ben Webb <ben@salilab.org> Date: Tue, 6 Nov 2001 22:52:46 +0000 Nicer reporting of startup errors from server when running as an NT Service Diffstat: M src/serverside.c | 43 ++++++++++++++++++++++++------- M src/serverside.h | 1 - M src/winmain.c | 1 + 3 files changed, 35 insertions(+), 10 deletions(-) --- (DIR) diff --git a/src/serverside.c b/src/serverside.c t@@ -89,6 +89,8 @@ int MetaUpdateTimeout; int MetaMinTimeout; gboolean WantQuit=FALSE; +static SERVICE_STATUS_HANDLE scHandle; + /* Do we want to update the player details on the metaserver when the timeout expires? */ gboolean MetaPlayerPending=FALSE; t@@ -692,12 +694,13 @@ gboolean ReadServerKey(GString *LineBuf,gboolean *EndOfLine) { #endif } -void StartServer() { - LastError *sockerr; +static void StartServer(void) { + LastError *sockerr=NULL; GString *errstr; #ifndef CYGWIN struct sigaction sact; #endif + SERVICE_STATUS status; Scanner=g_scanner_new(&ScannerConfig); Scanner->input_name="(stdin)"; t@@ -734,21 +737,23 @@ void StartServer() { errstr=g_string_new(""); g_string_assign_error(errstr,sockerr); g_log(NULL,G_LOG_LEVEL_CRITICAL, - _("Cannot listen on port %u (%s) Aborting."), + _("Cannot bind to port %u (%s) Aborting."), Port,errstr->str); g_string_free(errstr,TRUE); FreeError(sockerr); exit(1); } + if (listen(ListenSock,10)==SOCKET_ERROR) { + g_log(NULL,G_LOG_LEVEL_CRITICAL, + _("Cannot listen to network socket. Aborting.")); + exit(1); + } + /* Initial startup message for the server */ dopelog(0,_("dopewars server version %s ready and waiting for " "connections on port %d."),VERSION,Port); - if (listen(ListenSock,10)==SOCKET_ERROR) { - perror("listen socket"); exit(1); - } - MetaUpdateTimeout=MetaMinTimeout=0; TerminateRequest=ReregisterRequest=0; t@@ -1149,6 +1154,23 @@ static void GuiServerLogMessage(const gchar *log_domain, } } +#ifdef CYGWIN +static void ServiceFailure(const gchar *log_domain, + GLogLevelFlags log_level,const gchar *message, + gpointer user_data) { + SERVICE_STATUS status; + + g_print("%s\n",message); + status.dwServiceType = SERVICE_WIN32_OWN_PROCESS; + status.dwCurrentState = SERVICE_STOPPED; + status.dwControlsAccepted = SERVICE_ACCEPT_STOP; + status.dwWin32ExitCode = ERROR_NETWORK_UNREACHABLE; + status.dwCheckPoint = 0; + status.dwWaitHint = 0; + SetServiceStatus(scHandle,&status); +} +#endif + static void GuiQuitServer() { gtk_main_quit(); StopServer(); t@@ -1257,7 +1279,6 @@ static gint GuiRequestDelete(GtkWidget *widget,GdkEvent *event,gpointer data) { #ifdef CYGWIN static HWND mainhwnd=NULL; -static SERVICE_STATUS_HANDLE scHandle; static BOOL RegisterStatus(DWORD state) { SERVICE_STATUS status; t@@ -1391,7 +1412,11 @@ void GuiServerLoop(gboolean is_service) { gtk_container_add(GTK_CONTAINER(window),vbox); gtk_widget_show_all(window); - if (!is_service) { + if (is_service) { +#ifdef CYGWIN + g_log_set_handler(NULL,G_LOG_LEVEL_CRITICAL,ServiceFailure,NULL); +#endif + } else { g_set_print_handler(GuiServerPrintFunc); g_log_set_handler(NULL,LogMask()|G_LOG_LEVEL_MESSAGE|G_LOG_LEVEL_WARNING, GuiServerLogMessage,NULL); (DIR) diff --git a/src/serverside.h b/src/serverside.h t@@ -34,7 +34,6 @@ extern char *PidFile; void CleanUpServer(void); void BreakHandle(int sig); void ClientLeftServer(Player *Play); -void StartServer(void); void StopServer(void); void HandleServerCommand(char *string); Player *HandleNewConnection(void); (DIR) diff --git a/src/winmain.c b/src/winmain.c t@@ -217,6 +217,7 @@ Network=Server=TRUE; if (Server) { #ifdef NETWORKING #ifdef GUI_SERVER + g_log_set_handler(NULL,G_LOG_LEVEL_CRITICAL,LogMessage,NULL); win32_init(hInstance,hPrevInstance,"mainicon"); GuiServerLoop(FALSE); #else