summaryrefslogtreecommitdiff
path: root/lib-src/update-game-score.c
diff options
context:
space:
mode:
authorColin Walters <walters@gnu.org>2002-04-29 22:49:00 +0000
committerColin Walters <walters@gnu.org>2002-04-29 22:49:00 +0000
commitc89e80d1288539b69378b3c2e657aa28fee031aa (patch)
treeddbd25ef3446c0b840bac25815eefa640a7fbdd6 /lib-src/update-game-score.c
parent5eec678fa914977f779cca119336f1fe9e2069ba (diff)
downloademacs-c89e80d1288539b69378b3c2e657aa28fee031aa.tar.gz
(SCORE_FILE_PREFIX): Delete.
(main): New argument -d, for specifying directory. (usage): Document. (get_user_id): Compute (get_home_dir): Deleted. (get_prefix): New function, taken from main. (main): Check whether or not we are running setuid. Move prefix computation to get_prefix. Don't call getpwent; we don't need to any more. Instead, move it to get_user_id().
Diffstat (limited to 'lib-src/update-game-score.c')
-rw-r--r--lib-src/update-game-score.c86
1 files changed, 41 insertions, 45 deletions
diff --git a/lib-src/update-game-score.c b/lib-src/update-game-score.c
index 0762956a701..194997b63ab 100644
--- a/lib-src/update-game-score.c
+++ b/lib-src/update-game-score.c
@@ -49,12 +49,6 @@ Boston, MA 02111-1307, USA. */
#define MAX_SCORES 200
#define MAX_DATA_LEN 1024
-#ifdef HAVE_SHARED_GAME_DIR
-#define SCORE_FILE_PREFIX HAVE_SHARED_GAME_DIR
-#else
-#define SCORE_FILE_PREFIX "~/.emacs.d/games"
-#endif
-
#if !defined (__GNUC__) || __GNUC__ < 2
#define __attribute__(x)
#endif
@@ -67,6 +61,7 @@ usage(int err)
fprintf(stdout, " -h\t\tDisplay this help.\n");
fprintf(stdout, " -m MAX\t\tLimit the maximum number of scores to MAX.\n");
fprintf(stdout, " -r\t\tSort the scores in increasing order.\n");
+ fprintf(stdout, " -d DIR\t\tStore scores in DIR (only if not setuid).\n");
exit(err);
}
@@ -94,10 +89,23 @@ int
write_scores(const char *filename, const struct score_entry *scores,
int count);
+void lose(const char *msg, ...)
+ __attribute__ ((format (printf,1,0), noreturn));
+
+void lose(const char *msg, ...)
+{
+ va_list ap;
+ va_start(ap, msg);
+ vfprintf(stderr, msg, ap);
+ va_end(ap);
+ exit(1);
+}
+
char *
-get_user_id(struct passwd *buf)
+get_user_id(void)
{
char *name;
+ struct passwd *buf = getpwuid(getuid());
if (!buf)
{
int count = 1;
@@ -106,6 +114,8 @@ get_user_id(struct passwd *buf)
while (tuid /= 10)
count++;
name = malloc(count+1);
+ if (!name)
+ return NULL;
sprintf(name, "%d", uid);
return name;
}
@@ -113,45 +123,43 @@ get_user_id(struct passwd *buf)
}
char *
-get_home_dir(struct passwd *buf)
+get_prefix(int running_suid, char *user_prefix)
{
- if (!buf)
- return NULL;
- return buf->pw_dir;
-}
-
-void lose(const char *msg, ...)
- __attribute__ ((format (printf,1,0), noreturn));
-
-void lose(const char *msg, ...)
-{
- va_list ap;
- va_start(ap, msg);
- vfprintf(stderr, msg, ap);
- va_end(ap);
- exit(1);
+ if (!running_suid && user_prefix == NULL)
+ lose("Not using a shared game directory, and no prefix given.\n");
+ if (running_suid)
+ {
+#ifdef HAVE_SHARED_GAME_DIR
+ return HAVE_SHARED_GAME_DIR;
+#else
+ lose("This program was compiled without HAVE_SHARED_GAME_DIR,\n and should not be suid.\n");
+#endif
+ }
+ return user_prefix;
}
int
main(int argc, char **argv)
{
- int c;
+ int c, running_suid;
void *lockstate;
- char *scorefile, *prefix;
+ char *user_id, *scorefile, *prefix, *user_prefix = NULL;
struct stat buf;
struct score_entry *scores;
int newscore, scorecount, reverse = 0, max = MAX_SCORES;
char *newdata;
- struct passwd *passwdbuf;
srand(time(0));
- while ((c = getopt(argc, argv, "hrm:")) != -1)
+ while ((c = getopt(argc, argv, "hrm:d:")) != -1)
switch (c)
{
case 'h':
usage(0);
break;
+ case 'd':
+ user_prefix = optarg;
+ break;
case 'r':
reverse = 1;
break;
@@ -167,36 +175,24 @@ main(int argc, char **argv)
if (optind+3 != argc)
usage(1);
- passwdbuf = getpwuid(getuid());
+ running_suid = (getuid() != geteuid());
- if (!strncmp(SCORE_FILE_PREFIX, "~", 1))
- {
- char *homedir = get_home_dir(passwdbuf);
- if (!homedir)
- lose("Unable to determine home directory\n");
- prefix = malloc(strlen(homedir) + strlen(SCORE_FILE_PREFIX) + 1);
- strcpy(prefix, homedir);
- /* Skip over the '~'. */
- strcat(prefix, SCORE_FILE_PREFIX+1);
- }
- else
- prefix = strdup(SCORE_FILE_PREFIX);
-
- if (!prefix)
- lose("Couldn't create score file name: %s\n", strerror(errno));
+ prefix = get_prefix(running_suid, user_prefix);
scorefile = malloc(strlen(prefix) + strlen(argv[optind]) + 2);
if (!scorefile)
lose("Couldn't create score file name: %s\n", strerror(errno));
strcpy(scorefile, prefix);
- free(prefix);
strcat(scorefile, "/");
strcat(scorefile, argv[optind]);
newscore = atoi(argv[optind+1]);
newdata = argv[optind+2];
if (strlen(newdata) > MAX_DATA_LEN)
newdata[MAX_DATA_LEN] = '\0';
+
+ if ((user_id = get_user_id()) == NULL)
+ lose("Couldn't determine user id: %s\n", strerror(errno));
if (stat(scorefile, &buf) < 0)
lose("Failed to access scores file \"%s\": %s\n", scorefile,
@@ -210,7 +206,7 @@ main(int argc, char **argv)
lose("Failed to read scores file \"%s\": %s\n", scorefile,
strerror(errno));
}
- push_score(&scores, &scorecount, newscore, get_user_id(passwdbuf), newdata);
+ push_score(&scores, &scorecount, newscore, user_id, newdata);
/* 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