]> git.pond.sub.org Git - empserver/blobdiff - src/server/shutdown.c
Fix trailing whitespace
[empserver] / src / server / shutdown.c
index 2538bc2344cb61cfac91c4a8dd0bc4c0b2fa5916..0bf329005b569c2f87fe8b629175708efbf62b93 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  Empire - A multi-player, client/server Internet based war game.
- *  Copyright (C) 1986-2006, Dave Pare, Jeff Bailey, Thomas Ruschak,
+ *  Copyright (C) 1986-2008, Dave Pare, Jeff Bailey, Thomas Ruschak,
  *                           Ken Stevens, Steve McClure
  *
  *  This program is free software; you can redistribute it and/or modify
  *  ---
  *
  *  shutdown.c: Shuts down server.  Runs at low priority.
- * 
+ *
  *  Known contributors to this file:
  *     Ken Stevens, 1995
+ *     Markus Armbruster, 2007-2008
  */
 
 #include <config.h>
 
-#include "misc.h"
-#include "player.h"
-#include "empio.h"
+#include <time.h>
 #include "empthread.h"
-#include "nat.h"
 #include "file.h"
-#include <time.h>
-#include "server.h"
+#include "nat.h"
 #include "prototypes.h"
+#include "server.h"
 
 int shutdown_pending;
+static empth_t *shutdown_thread;
+
+static void shutdown_sequence(void *unused);
 
-void
-shutdown_init(void)
+/*
+ * Initiate shutdown in MINS_FROM_NOW minutes.
+ * If MINS_FROM_NOW is negative, cancel any pending shutdown instead.
+ * Return -1 on error, zero when no shutdown was pending, positive
+ * number when a pending shutdown was modified.
+ */
+int
+shutdown_initiate(int mins_from_now)
 {
-    shutdown_pending = 0;
+    int old_pending = shutdown_pending;
+
+    if (mins_from_now < 0) {
+       if (shutdown_pending) {
+           shutdown_pending = 0;
+           pr_wall("The server shutdown has been cancelled!\n");
+       }
+       return old_pending;
+    }
+
+    shutdown_pending = mins_from_now + 1;
+
+    if (shutdown_thread) {
+       if (old_pending)
+           pr_wall("The shutdown time has been changed to %d minutes!\n",
+                   mins_from_now);
+       empth_wakeup(shutdown_thread);
+    } else {
+       shutdown_thread = empth_create(shutdown_sequence, 50 * 1024, 0,
+                                      "shutdownSeq", NULL);
+       if (!shutdown_thread) {
+           shutdown_pending = 0;
+           return -1;
+       }
+    }
+
+    return old_pending;
 }
 
-void
+static void
 shutdown_sequence(void *unused)
 {
-    struct natstr *god;
-    struct tm *tm;
     time_t now;
-    s_char header[100];
 
-    if (shutdown_pending <= 0) {
-       shutdown_pending = 0;
-       logerror("shutdown called with 0 shutdown_pending");
-       empth_exit();
-       return;
-    }
-    god = getnatp(0);
+    pr_wall("The server will shut down in %d minutes!\n",
+           shutdown_pending - 1);
+
     while (shutdown_pending > 0) {
        --shutdown_pending;
        time(&now);
        if (shutdown_pending <= 1440) { /* one day */
-           tm = localtime(&now);
-           sprintf(header, "BROADCAST from %s @ %02d:%02d: ",
-                   god->nat_cnam, tm->tm_hour, tm->tm_min);
-           if (!shutdown_pending) {
-               pr_wall("%sServer shutting down NOW!\n", header);
+           if (shutdown_pending == 0) {
                shutdwn(0);
            } else if (shutdown_pending == 1) {
-               pr_wall("%sServer shutting down in 1 minute!\n", header);
+               pr_wall("Server shutting down in 1 minute!\n");
            } else if (shutdown_pending <= 5) {
-               pr_wall("%sServer shutting down in %d minutes!\n", header,
+               pr_wall("Server shutting down in %d minutes!\n",
                        shutdown_pending);
            } else if (shutdown_pending <= 60
                       && shutdown_pending % 10 == 0) {
-               pr_wall("%sThe server will be shutting down in %d minutes!\n",
-                       header, shutdown_pending);
+               pr_wall("The server will be shutting down in %d minutes!\n",
+                       shutdown_pending);
            } else if (shutdown_pending % 60 == 0) {
-               pr_wall("%sThe server will be shutting down %d hours from now.\n",
-                       header, (int)(shutdown_pending / 60));
+               pr_wall("The server will be shutting down %d hours from now.\n",
+                       shutdown_pending / 60);
            }
        }
+       /* FIXME error due to late wakeup accumulates */
        empth_sleep(now + 60);
     }
-    empth_exit();
+
+    shutdown_thread = NULL;
 }