From d99fabf003250967223de222d8a6215c63ed19a7 Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Mon, 29 Apr 2002 22:49:00 +0000 Subject: (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(). --- lib-src/update-game-score.c | 86 +++++++++++++++++++++------------------------ 1 file changed, 41 insertions(+), 45 deletions(-) (limited to 'lib-src/update-game-score.c') diff --git a/lib-src/update-game-score.c b/lib-src/update-game-score.c index 0762956a70..194997b63a 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 -- cgit v1.2.3