From: Colin Walters Date: Fri, 5 Apr 2002 08:58:12 +0000 (+0000) Subject: (toplevel): Include pwd.h. X-Git-Tag: ttn-vms-21-2-B4~15774 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=cd553ffbf3c5eae5d6edb492ff62ce3fb6e7e6b8;p=emacs.git (toplevel): Include pwd.h. (struct score_entry): Add username field. (push_score): Use it. (get_user_id): New function. (main): Don't malloc excessively. (main): Use username field. (read_score): Read it. (push_score): Handle it. (write_scores) Write it. (read_score): Handle arbitrary length data. --- diff --git a/lib-src/ChangeLog b/lib-src/ChangeLog index 804ebb10933..605fa235f5f 100644 --- a/lib-src/ChangeLog +++ b/lib-src/ChangeLog @@ -1,3 +1,16 @@ +2002-04-05 Colin Walters + + * update-game-score.c (toplevel): Include pwd.h. + (struct score_entry): Add username field. + (push_score): Use it. + (get_user_id): New function. + (main): Don't malloc excessively. + (main): Use username field. + (read_score): Read it. + (push_score): Handle it. + (write_scores) Write it. + (read_score): Handle arbitrary length data. + 2002-03-30 Eli Zaretskii * ebrowse.c (add_declarator): Fix the first call to add_member_defn. @@ -11,6 +24,10 @@ * makefile.w32-in (lisp): Move backquote.elc into emacs-lisp. +2002-03-27 Colin Walters + + * update-game-score.c: New file. + 2002-03-22 Paul Eggert * etags.c (main): Use `sort -o TAGFILE TAGFILE' instead of diff --git a/lib-src/update-game-score.c b/lib-src/update-game-score.c index 9cf4c4359dd..e713d732fef 100644 --- a/lib-src/update-game-score.c +++ b/lib-src/update-game-score.c @@ -33,10 +33,11 @@ Boston, MA 02111-1307, USA. */ #include #include #include +#include #include #include #include -// #include "config.h" +#include #define MAX_ATTEMPTS 5 #define SCORE_FILE_PREFIX "/var/games/emacs/" @@ -60,6 +61,7 @@ unlock_file(const char *filename, void *state); struct score_entry { long score; + char *username; char *data; }; @@ -68,13 +70,31 @@ read_scores(const char *filename, struct score_entry **scores, int *count); int push_score(struct score_entry **scores, int *count, - int newscore, char *newdata); + 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); +char * +get_user_id() +{ + char *name; + struct passwd *buf = getpwuid(getuid()); + if (!buf) + { + int count = 1; + int uid = (int) getuid(); + while (uid /= 10) + count++; + name = malloc(count+1); + sprintf(name, "%d", uid); + return name; + } + return buf->pw_name; +} + int main(int argc, char **argv) { @@ -106,7 +126,7 @@ main(int argc, char **argv) if (optind+3 != argc) usage(1); - scorefile = malloc(strlen(SCORE_FILE_PREFIX) + strlen(argv[optind]) + 20); + scorefile = malloc(strlen(SCORE_FILE_PREFIX) + strlen(argv[optind]) + 1); if (!scorefile) { fprintf(stderr, "Couldn't create score file name: %s\n", @@ -136,7 +156,7 @@ main(int argc, char **argv) scorefile, strerror(errno)); goto fail_unlock; } - push_score(&scores, &scorecount, newscore, newdata); + push_score(&scores, &scorecount, newscore, get_user_id(), newdata); sort_scores(scores, scorecount, reverse); if (write_scores(scorefile, scores, scorecount) < 0) { @@ -159,10 +179,43 @@ read_score(FILE *f, struct score_entry *score) if (feof(f)) return 1; while ((c = getc(f)) != EOF - && isdigit(c)) { - score->score *= 10; - score->score += (c-48); + && isdigit(c)) + { + score->score *= 10; + score->score += (c-48); + } + while ((c = getc(f)) != EOF + && isspace(c)) + ; + if (c == EOF) + return -1; +#ifdef HAVE_GETDELIM + { + int count = 0; + if (getdelim(&score->username, &count, ' ', f) < 1 + || score->username == NULL) + return -1; } +#else + { + int unameread = 0; + int unamelen = 30; + char *username; + + while ((c = getc(f)) != EOF + && !isspace(c)) + { + if (unameread == unamelen) + { + if (!(username = realloc(username, unamelen *= 2))) + return -1; + } + username[unameread] = c; + unameread++; + } + score->username = username; + } +#endif #ifdef HAVE_GETLINE score->data = NULL; errno = ESUCCES; @@ -172,12 +225,25 @@ read_score(FILE *f, struct score_entry *score) return -1; } #else - /* We should probably just copy the getline code into here from - glibc, instead of this halfassed solution. */ - score->data = malloc(122); - score->data[0] = '\0'; - if (!fgets(score->data, 120, f)) - return -1; + { + int cur = 0; + int len = 16; + char *buf = malloc(len); + if (!buf) + return -1; + while ((c = getc(f)) != EOF) + { + if (cur >= len-1) + { + if (!(buf = realloc(buf, len *= 2))) + return -1; + } + buf[cur] = c; + cur++; + } + score->data = buf; + score->data[cur+1] = '\0'; + } #endif /* Trim the newline */ score->data[strlen(score->data)-1] = '\0'; @@ -234,13 +300,14 @@ score_compare_reverse(const void *a, const void *b) int push_score(struct score_entry **scores, int *count, - int newscore, char *newdata) + int newscore, char *username, char *newdata) { struct score_entry *newscores = realloc(*scores, sizeof(struct score_entry) * ((*count) + 1)); if (!newscores) return -1; newscores[*count].score = newscore; + newscores[*count].username = username; newscores[*count].data = newdata; (*count) += 1; *scores = newscores; @@ -269,7 +336,8 @@ write_scores(const char *filename, const struct score_entry *scores, || !(f = fopen(tempfile, "w"))) return -1; for (i = 0; i < count; i++) - if (fprintf(f, "%ld %s\n", scores[i].score, scores[i].data) < 0) + if (fprintf(f, "%ld %s %s\n", scores[i].score, scores[i].username, + scores[i].data) < 0) return -1; fclose(f); rename(tempfile, filename);