Bump version to 23.1.97.
[bpt/emacs.git] / lib-src / update-game-score.c
index d871e33..24fd45f 100644 (file)
@@ -1,12 +1,16 @@
 /* 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.
 
-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
-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
@@ -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
-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'.
 
@@ -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).
 
-   Created 2002/03/22, by Colin Walters <walters@debian.org>
+   Created 2002/03/22.
 */
 
 #include <config.h>
@@ -68,6 +71,11 @@ extern int optind, opterr;
 #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;
@@ -106,17 +114,34 @@ lose (msg)
      const char *msg;
 {
   fprintf (stderr, "%s\n", msg);
-  exit (1);
+  exit (EXIT_FAILURE);
 }
 
 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));
-  exit (1);
+  exit (EXIT_FAILURE);
 }
 
 char *
@@ -177,7 +202,7 @@ main (argc, argv)
     switch (c)
       {
       case 'h':
-       usage (0);
+       usage (EXIT_SUCCESS);
        break;
       case 'd':
        user_prefix = optarg;
@@ -191,11 +216,11 @@ main (argc, argv)
          max = MAX_SCORES;
        break;
       default:
-       usage (1);
+       usage (EXIT_FAILURE);
       }
 
   if (optind+3 != argc)
-    usage (1);
+    usage (EXIT_FAILURE);
 
   running_suid = (getuid () != geteuid ());
 
@@ -216,35 +241,35 @@ main (argc, argv)
   user_id = get_user_id ();
   if (user_id == NULL)
     lose_syserr ("Couldn't determine user id");
-  
+
   if (stat (scorefile, &buf) < 0)
     lose_syserr ("Failed to access scores file");
-               
+
   if (lock_file (scorefile, &lockstate) < 0)
     lose_syserr ("Failed to lock scores file");
-                 
+
   if (read_scores (scorefile, &scores, &scorecount) < 0)
     {
       unlock_file (scorefile, lockstate);
       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);
-    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);
-  exit (0);
+  exit (EXIT_SUCCESS);
 }
 
 int
@@ -283,7 +308,7 @@ read_score (f, score)
     char *username = malloc (unamelen);
     if (!username)
       return -1;
-    
+
     while ((c = getc (f)) != EOF
           && !isspace (c))
       {
@@ -293,7 +318,7 @@ read_score (f, score)
        username[unameread] = c;
        unameread++;
       }
-    if (c == EOF)    
+    if (c == EOF)
       return -1;
     username[unameread] = '\0';
     score->username = username;
@@ -342,12 +367,12 @@ read_scores (filename, scores, count)
   int readval, scorecount, cursize;
   struct score_entry *ret;
   FILE *f = fopen (filename, "r");
-  if (!f) 
+  if (!f)
     return -1;
   scorecount = 0;
   cursize = 16;
   ret = (struct score_entry *) malloc (sizeof (struct score_entry) * cursize);
-  if (!ret) 
+  if (!ret)
     return -1;
   while ((readval = read_score (f, &ret[scorecount])) == 0)
     {
@@ -357,7 +382,9 @@ read_scores (filename, scores, count)
       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;
        }
@@ -388,7 +415,7 @@ score_compare_reverse (a, b)
 }
 
 int
-push_score (scores, count, newscore, username, newdata) 
+push_score (scores, count, newscore, username, newdata)
      struct score_entry **scores;
      int *count; int newscore;
      char *username;
@@ -406,12 +433,12 @@ push_score (scores, count, newscore, username, newdata)
   *scores = newscores;
   return 0;
 }
-  
+
 void
 sort_scores (scores, count, reverse)
      struct score_entry *scores;
      int count;
-     int reverse; 
+     int reverse;
 {
   qsort (scores, count, sizeof (struct score_entry),
        reverse ? score_compare_reverse : score_compare);
@@ -421,9 +448,9 @@ int
 write_scores (filename, scores, count)
      const char *filename;
      const struct score_entry * scores;
-     int count; 
+     int count;
 {
-  FILE *f;  
+  FILE *f;
   int i;
   char *tempfile = malloc (strlen (filename) + strlen (".tempXXXXXX") + 1);
   if (!tempfile)
@@ -448,7 +475,7 @@ write_scores (filename, scores, count)
     return -1;
   return 0;
 }
-  
+
 int
 lock_file (filename, state)
   const char *filename;
@@ -491,7 +518,7 @@ lock_file (filename, state)
   close (fd);
   return 0;
 }
+
 int
 unlock_file (filename, state)
   const char *filename;
@@ -504,3 +531,8 @@ unlock_file (filename, state)
   errno = saved_errno;
   return ret;
 }
+
+/* arch-tag: 2bf5c52e-4beb-463a-954e-c58b9c64736b
+   (do not change this comment) */
+
+/* update-game-score.c ends here */