(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().
This commit is contained in:
parent
7451222f00
commit
d99fabf003
1 changed files with 50 additions and 54 deletions
|
@ -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,32 +89,6 @@ int
|
|||
write_scores(const char *filename, const struct score_entry *scores,
|
||||
int count);
|
||||
|
||||
char *
|
||||
get_user_id(struct passwd *buf)
|
||||
{
|
||||
char *name;
|
||||
if (!buf)
|
||||
{
|
||||
int count = 1;
|
||||
int uid = (int) getuid();
|
||||
int tuid = uid;
|
||||
while (tuid /= 10)
|
||||
count++;
|
||||
name = malloc(count+1);
|
||||
sprintf(name, "%d", uid);
|
||||
return name;
|
||||
}
|
||||
return buf->pw_name;
|
||||
}
|
||||
|
||||
char *
|
||||
get_home_dir(struct passwd *buf)
|
||||
{
|
||||
if (!buf)
|
||||
return NULL;
|
||||
return buf->pw_dir;
|
||||
}
|
||||
|
||||
void lose(const char *msg, ...)
|
||||
__attribute__ ((format (printf,1,0), noreturn));
|
||||
|
||||
|
@ -132,26 +101,65 @@ void lose(const char *msg, ...)
|
|||
exit(1);
|
||||
}
|
||||
|
||||
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);
|
||||
return name;
|
||||
}
|
||||
return buf->pw_name;
|
||||
}
|
||||
|
||||
char *
|
||||
get_prefix(int running_suid, char *user_prefix)
|
||||
{
|
||||
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
|
||||
|
|
Loading…
Add table
Reference in a new issue