/* update-game-score.c --- Update a score file
-Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
- Free Software Foundation, Inc.
+Copyright (C) 2002-2012 Free Software Foundation, Inc.
Author: Colin Walters <walters@debian.org>
#include <unistd.h>
#include <errno.h>
-#ifdef HAVE_STRING_H
+#include <limits.h>
#include <string.h>
-#endif
-#ifdef HAVE_STDLIB_H
#include <stdlib.h>
-#endif
#include <stdio.h>
#include <time.h>
#include <pwd.h>
#ifdef HAVE_FCNTL_H
#include <fcntl.h>
#endif
-#ifdef STDC_HEADERS
-#include <stdarg.h>
-#endif
#include <sys/stat.h>
/* Needed for SunOS4, for instance. */
extern char *optarg;
extern int optind, opterr;
-int usage (int err) NO_RETURN;
+static int usage (int err) NO_RETURN;
#define MAX_ATTEMPTS 5
#define MAX_SCORES 200
#define difftime(t1, t0) (double)((t1) - (t0))
#endif
-int
+static int
usage (int err)
{
- fprintf (stdout, "Usage: update-game-score [-m MAX ] [ -r ] game/scorefile SCORE DATA\n");
+ fprintf (stdout, "Usage: update-game-score [-m MAX] [-r] [-d DIR] game/scorefile SCORE DATA\n");
fprintf (stdout, " update-game-score -h\n");
fprintf (stdout, " -h\t\tDisplay this help.\n");
fprintf (stdout, " -m MAX\t\tLimit the maximum number of scores to MAX.\n");
exit (err);
}
-int lock_file (const char *filename, void **state);
-int unlock_file (const char *filename, void *state);
+static int lock_file (const char *filename, void **state);
+static int unlock_file (const char *filename, void *state);
struct score_entry
{
char *data;
};
-int read_scores (const char *filename, struct score_entry **scores,
- int *count);
-int push_score (struct score_entry **scores, int *count,
- int newscore, char *username, char *newdata);
-void sort_scores (struct score_entry *scores, int count, int reverse);
-int write_scores (const char *filename, const struct score_entry *scores,
- int count);
+static int read_scores (const char *filename, struct score_entry **scores,
+ int *count);
+static int push_score (struct score_entry **scores, int *count,
+ int newscore, char *username, char *newdata);
+static void sort_scores (struct score_entry *scores, int count, int reverse);
+static int write_scores (const char *filename,
+ const struct score_entry *scores, int count);
-void lose (const char *msg) NO_RETURN;
+static void lose (const char *msg) NO_RETURN;
-void
+static void
lose (const char *msg)
{
fprintf (stderr, "%s\n", msg);
exit (EXIT_FAILURE);
}
-void lose_syserr (const char *msg) NO_RETURN;
+static void lose_syserr (const char *msg) NO_RETURN;
/* Taken from sysdep.c. */
#ifndef HAVE_STRERROR
#ifndef WINDOWSNT
char *
-strerror (errnum)
- int errnum;
+strerror (int errnum)
{
extern char *sys_errlist[];
extern int sys_nerr;
#endif /* not WINDOWSNT */
#endif /* ! HAVE_STRERROR */
-void
+static void
lose_syserr (const char *msg)
{
fprintf (stderr, "%s: %s\n", msg, strerror (errno));
exit (EXIT_FAILURE);
}
-char *
+static char *
get_user_id (void)
{
- char *name;
struct passwd *buf = getpwuid (getuid ());
if (!buf)
{
- int count = 1;
- int uid = (int) getuid ();
- int tuid = uid;
- while (tuid /= 10)
- count++;
- name = malloc (count+1);
- if (!name)
- return NULL;
- sprintf (name, "%d", uid);
+ long uid = getuid ();
+ char *name = malloc (sizeof uid * CHAR_BIT / 3 + 1);
+ if (name)
+ sprintf (name, "%ld", uid);
return name;
}
return buf->pw_name;
}
-const char *
+static const char *
get_prefix (int running_suid, const char *user_prefix)
{
if (!running_suid && user_prefix == NULL)
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. */
+ also increment the beginning of the array, to skip over the
+ *smallest* scores. Otherwise, just decrementing the number of
+ scores suffices, since the smallest is at the end. */
if (scorecount > MAX_SCORES)
- scorecount -= (scorecount - MAX_SCORES);
- if (reverse)
- scores += (scorecount - MAX_SCORES);
+ {
+ if (reverse)
+ scores += (scorecount - MAX_SCORES);
+ scorecount = MAX_SCORES;
+ }
if (write_scores (scorefile, scores, scorecount) < 0)
{
unlock_file (scorefile, lockstate);
exit (EXIT_SUCCESS);
}
-int
+static int
read_score (FILE *f, struct score_entry *score)
{
int c;
return 0;
}
-int
+static int
read_scores (const char *filename, struct score_entry **scores, int *count)
{
int readval, scorecount, cursize;
return -1;
while ((readval = read_score (f, &ret[scorecount])) == 0)
{
- /* We encoutered an error */
+ /* We encountered an error. */
if (readval < 0)
return -1;
scorecount++;
return 0;
}
-int
+static int
score_compare (const void *a, const void *b)
{
const struct score_entry *sa = (const struct score_entry *) a;
return (sb->score > sa->score) - (sb->score < sa->score);
}
-int
+static int
score_compare_reverse (const void *a, const void *b)
{
const struct score_entry *sa = (const struct score_entry *) a;
return 0;
}
-void
+static void
sort_scores (struct score_entry *scores, int count, int reverse)
{
qsort (scores, count, sizeof (struct score_entry),
reverse ? score_compare_reverse : score_compare);
}
-int
+static int
write_scores (const char *filename, const struct score_entry *scores, int count)
{
FILE *f;
return 0;
}
-int
+static int
lock_file (const char *filename, void **state)
{
int fd;
return 0;
}
-int
+static int
unlock_file (const char *filename, void *state)
{
char *lockpath = (char *) state;