]> code.delx.au - gnu-emacs/blobdiff - lib-src/update-game-score.c
Emulate POSIX_SIGNALS on MS-Windows.
[gnu-emacs] / lib-src / update-game-score.c
index 55737c542d77a2c49f3742a5da6494c622e1dcda..24fd45f72d352b31ce2bf7694dacf59789cd1276 100644 (file)
@@ -1,12 +1,16 @@
 /* update-game-score.c --- Update a score file
 /* update-game-score.c --- Update a score file
-   Copyright (C) 2002 Free Software Foundation, Inc.
+
+Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
+  Free Software Foundation, Inc.
+
+Author: Colin Walters <walters@debian.org>
 
 This file is part of GNU Emacs.
 
 
 This file is part of GNU Emacs.
 
-GNU Emacs is free software; you can redistribute it and/or modify
+GNU Emacs is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
-any later version.
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
 
 GNU Emacs is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 
 GNU Emacs is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -14,11 +18,10 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
 GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
-along with GNU Emacs; see the file COPYING.  If not, write to
-the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
+along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 
 
-/* This program is allows a game to securely and atomically update a
+
+/* This program allows a game to securely and atomically update a
    score file.  It should be installed setuid, owned by an appropriate
    user like `games'.
 
    score file.  It should be installed setuid, owned by an appropriate
    user like `games'.
 
@@ -26,7 +29,7 @@ Boston, MA 02111-1307, USA.  */
    defined, and in that case it will store scores in the user's home
    directory (it should NOT be setuid).
 
    defined, and in that case it will store scores in the user's home
    directory (it should NOT be setuid).
 
-   Created 2002/03/22, by Colin Walters <walters@debian.org>
+   Created 2002/03/22.
 */
 
 #include <config.h>
 */
 
 #include <config.h>
@@ -68,6 +71,11 @@ extern int optind, opterr;
 #define P_(proto) ()
 #endif
 
 #define P_(proto) ()
 #endif
 
+#ifndef HAVE_DIFFTIME
+/* OK on POSIX (time_t is arithmetic type) modulo overflow in subtraction.  */
+#define difftime(t1, t0) (double)((t1) - (t0))
+#endif
+
 int
 usage (err)
      int err;
 int
 usage (err)
      int err;
@@ -106,17 +114,34 @@ lose (msg)
      const char *msg;
 {
   fprintf (stderr, "%s\n", msg);
      const char *msg;
 {
   fprintf (stderr, "%s\n", msg);
-  exit (1);
+  exit (EXIT_FAILURE);
 }
 
 void lose_syserr P_ ((const char *msg)) NO_RETURN;
 
 }
 
 void lose_syserr P_ ((const char *msg)) NO_RETURN;
 
+/* Taken from sysdep.c.  */
+#ifndef HAVE_STRERROR
+#ifndef WINDOWSNT
+char *
+strerror (errnum)
+     int errnum;
+{
+  extern char *sys_errlist[];
+  extern int sys_nerr;
+
+  if (errnum >= 0 && errnum < sys_nerr)
+    return sys_errlist[errnum];
+  return (char *) "Unknown error";
+}
+#endif /* not WINDOWSNT */
+#endif /* ! HAVE_STRERROR */
+
 void
 lose_syserr (msg)
      const char *msg;
 {
   fprintf (stderr, "%s: %s\n", msg, strerror (errno));
 void
 lose_syserr (msg)
      const char *msg;
 {
   fprintf (stderr, "%s: %s\n", msg, strerror (errno));
-  exit (1);
+  exit (EXIT_FAILURE);
 }
 
 char *
 }
 
 char *
@@ -177,7 +202,7 @@ main (argc, argv)
     switch (c)
       {
       case 'h':
     switch (c)
       {
       case 'h':
-       usage (0);
+       usage (EXIT_SUCCESS);
        break;
       case 'd':
        user_prefix = optarg;
        break;
       case 'd':
        user_prefix = optarg;
@@ -191,11 +216,11 @@ main (argc, argv)
          max = MAX_SCORES;
        break;
       default:
          max = MAX_SCORES;
        break;
       default:
-       usage (1);
+       usage (EXIT_FAILURE);
       }
 
   if (optind+3 != argc)
       }
 
   if (optind+3 != argc)
-    usage (1);
+    usage (EXIT_FAILURE);
 
   running_suid = (getuid () != geteuid ());
 
 
   running_suid = (getuid () != geteuid ());
 
@@ -229,22 +254,22 @@ main (argc, argv)
       lose_syserr ("Failed to read scores file");
     }
   push_score (&scores, &scorecount, newscore, user_id, newdata);
       lose_syserr ("Failed to read scores file");
     }
   push_score (&scores, &scorecount, newscore, user_id, newdata);
+  sort_scores (scores, scorecount, reverse);
   /* Limit the number of scores.  If we're using reverse sorting, then
      we should increment the beginning of the array, to skip over the
      *smallest* scores.  Otherwise, we just decrement the number of
      scores, since the smallest will be at the end. */
   if (scorecount > MAX_SCORES)
     scorecount -= (scorecount - MAX_SCORES);
   /* Limit the number of scores.  If we're using reverse sorting, then
      we should increment the beginning of the array, to skip over the
      *smallest* scores.  Otherwise, we just decrement the number of
      scores, since the smallest will be at the end. */
   if (scorecount > MAX_SCORES)
     scorecount -= (scorecount - MAX_SCORES);
-    if (reverse)
-      scores += (scorecount - MAX_SCORES);
-  sort_scores (scores, scorecount, reverse);
+  if (reverse)
+    scores += (scorecount - MAX_SCORES);
   if (write_scores (scorefile, scores, scorecount) < 0)
     {
       unlock_file (scorefile, lockstate);
       lose_syserr ("Failed to write scores file");
     }
   unlock_file (scorefile, lockstate);
   if (write_scores (scorefile, scores, scorecount) < 0)
     {
       unlock_file (scorefile, lockstate);
       lose_syserr ("Failed to write scores file");
     }
   unlock_file (scorefile, lockstate);
-  exit (0);
+  exit (EXIT_SUCCESS);
 }
 
 int
 }
 
 int
@@ -357,7 +382,9 @@ read_scores (filename, scores, count)
       scorecount++;
       if (scorecount >= cursize)
        {
       scorecount++;
       if (scorecount >= cursize)
        {
-         ret = (struct score_entry *) realloc (ret, cursize *= 2);
+         cursize *= 2;
+         ret = (struct score_entry *)
+           realloc (ret, (sizeof (struct score_entry) * cursize));
          if (!ret)
            return -1;
        }
          if (!ret)
            return -1;
        }
@@ -504,3 +531,8 @@ unlock_file (filename, state)
   errno = saved_errno;
   return ret;
 }
   errno = saved_errno;
   return ret;
 }
+
+/* arch-tag: 2bf5c52e-4beb-463a-954e-c58b9c64736b
+   (do not change this comment) */
+
+/* update-game-score.c ends here */