]> code.delx.au - gnu-emacs/blobdiff - lib-src/update-game-score.c
(font-lock-comment-face, font-lock-doc-face, font-lock-string-face):
[gnu-emacs] / lib-src / update-game-score.c
index 2e526b00bd000d648f1096d475f62551a0248ff5..46d0d8b060040dd08581d325caa69388c886d4c8 100644 (file)
@@ -1,5 +1,5 @@
 /* update-game-score.c --- Update a score file
-   Copyright (C) 2002 Free Software Foundation, Inc.
+   Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
 
@@ -15,8 +15,8 @@ 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.  */
+the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+Boston, MA 02110-1301, USA.  */
 
 /* This program is allows a game to securely and atomically update a
    score file.  It should be installed setuid, owned by an appropriate
@@ -68,6 +68,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 +111,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 +199,7 @@ main (argc, argv)
     switch (c)
       {
       case 'h':
-       usage (0);
+       usage (EXIT_SUCCESS);
        break;
       case 'd':
        user_prefix = optarg;
@@ -191,11 +213,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 ());
 
@@ -213,15 +235,16 @@ main (argc, argv)
   if (strlen (newdata) > MAX_DATA_LEN)
     newdata[MAX_DATA_LEN] = '\0';
 
-  if ((user_id = get_user_id ()) == NULL)
+  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);
@@ -243,7 +266,7 @@ main (argc, argv)
       lose_syserr ("Failed to write scores file");
     }
   unlock_file (scorefile, lockstate);
-  exit (0);
+  exit (EXIT_SUCCESS);
 }
 
 int
@@ -282,7 +305,7 @@ read_score (f, score)
     char *username = malloc (unamelen);
     if (!username)
       return -1;
-    
+
     while ((c = getc (f)) != EOF
           && !isspace (c))
       {
@@ -292,7 +315,7 @@ read_score (f, score)
        username[unameread] = c;
        unameread++;
       }
-    if (c == EOF)    
+    if (c == EOF)
       return -1;
     username[unameread] = '\0';
     score->username = username;
@@ -341,12 +364,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 = malloc (sizeof (struct score_entry) * cursize);
-  if (!ret) 
+  ret = (struct score_entry *) malloc (sizeof (struct score_entry) * cursize);
+  if (!ret)
     return -1;
   while ((readval = read_score (f, &ret[scorecount])) == 0)
     {
@@ -356,7 +379,9 @@ read_scores (filename, scores, count)
       scorecount++;
       if (scorecount >= cursize)
        {
-         ret = realloc (ret, cursize *= 2);
+         cursize *= 2;
+         ret = (struct score_entry *)
+           realloc (ret, (sizeof (struct score_entry) * cursize));
          if (!ret)
            return -1;
        }
@@ -387,15 +412,15 @@ 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;
      char *newdata;
 {
  struct score_entry *newscores
-   = realloc (*scores,
-             sizeof (struct score_entry) * ((*count) + 1));
+   = (struct score_entry *) realloc (*scores,
+                                    sizeof (struct score_entry) * ((*count) + 1));
   if (!newscores)
     return -1;
   newscores[*count].score = newscore;
@@ -405,12 +430,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);
@@ -420,9 +445,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)
@@ -447,7 +472,7 @@ write_scores (filename, scores, count)
     return -1;
   return 0;
 }
-  
+
 int
 lock_file (filename, state)
   const char *filename;
@@ -469,7 +494,8 @@ lock_file (filename, state)
   if (stat (lockpath, &buf) == 0
       && (difftime (buf.st_ctime, time (NULL) > 60*60)))
     unlink (lockpath);
-  if ((fd = open (lockpath, O_CREAT | O_EXCL, 0600)) < 0)
+  fd = open (lockpath, O_CREAT | O_EXCL, 0600);
+  if (fd < 0)
     {
       if (errno == EEXIST)
        {
@@ -489,7 +515,7 @@ lock_file (filename, state)
   close (fd);
   return 0;
 }
+
 int
 unlock_file (filename, state)
   const char *filename;
@@ -502,3 +528,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 */