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