|
|
1.1 ! root 1: /*- ! 2: * Copyright (c) 1990 The Regents of the University of California. ! 3: * All rights reserved. ! 4: * ! 5: * This code is derived from software contributed to Berkeley by ! 6: * Ed James. ! 7: * ! 8: * Redistribution and use in source and binary forms are permitted ! 9: * provided that: (1) source distributions retain this entire copyright ! 10: * notice and comment, and (2) distributions including binaries display ! 11: * the following acknowledgement: ``This product includes software ! 12: * developed by the University of California, Berkeley and its contributors'' ! 13: * in the documentation or other materials provided with the distribution ! 14: * and in all advertising materials mentioning features or use of this ! 15: * software. Neither the name of the University nor the names of its ! 16: * contributors may be used to endorse or promote products derived ! 17: * from this software without specific prior written permission. ! 18: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ! 19: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ! 20: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 21: */ ! 22: ! 23: /* ! 24: * Copyright (c) 1987 by Ed James, UC Berkeley. All rights reserved. ! 25: * ! 26: * Copy permission is hereby granted provided that this notice is ! 27: * retained on all partial or complete copies. ! 28: * ! 29: * For more info on this and all of my stuff, mail [email protected]. ! 30: */ ! 31: ! 32: #ifndef lint ! 33: static char sccsid[] = "@(#)log.c 5.6 (Berkeley) 4/30/90"; ! 34: #endif not lint ! 35: ! 36: #include "include.h" ! 37: #include "pathnames.h" ! 38: ! 39: compar(a, b) ! 40: SCORE *a, *b; ! 41: { ! 42: if (b->planes == a->planes) ! 43: return (b->time - a->time); ! 44: else ! 45: return (b->planes - a->planes); ! 46: } ! 47: ! 48: #define SECAMIN 60 ! 49: #define MINAHOUR 60 ! 50: #define HOURADAY 24 ! 51: #define SECAHOUR (SECAMIN * MINAHOUR) ! 52: #define SECADAY (SECAHOUR * HOURADAY) ! 53: #define DAY(t) ((t) / SECADAY) ! 54: #define HOUR(t) (((t) % SECADAY) / SECAHOUR) ! 55: #define MIN(t) (((t) % SECAHOUR) / SECAMIN) ! 56: #define SEC(t) ((t) % SECAMIN) ! 57: ! 58: char * ! 59: timestr(t) ! 60: { ! 61: static char s[80]; ! 62: ! 63: if (DAY(t) > 0) ! 64: (void)sprintf(s, "%dd+%02dhrs", DAY(t), HOUR(t)); ! 65: else if (HOUR(t) > 0) ! 66: (void)sprintf(s, "%d:%02d:%02d", HOUR(t), MIN(t), SEC(t)); ! 67: else if (MIN(t) > 0) ! 68: (void)sprintf(s, "%d:%02d", MIN(t), SEC(t)); ! 69: else if (SEC(t) > 0) ! 70: (void)sprintf(s, ":%02d", SEC(t)); ! 71: else ! 72: *s = '\0'; ! 73: ! 74: return (s); ! 75: } ! 76: ! 77: log_score(list_em) ! 78: { ! 79: register int i, fd, num_scores = 0, good, changed = 0, found = 0; ! 80: struct passwd *pw; ! 81: FILE *fp; ! 82: char *cp, *index(), *rindex(); ! 83: SCORE score[100], thisscore; ! 84: #ifdef SYSV ! 85: struct utsname name; ! 86: #endif ! 87: ! 88: umask(0); ! 89: fd = open(_PATH_SCORE, O_CREAT|O_RDWR, 0644); ! 90: if (fd < 0) { ! 91: perror(_PATH_SCORE); ! 92: return (-1); ! 93: } ! 94: /* ! 95: * This is done to take advantage of stdio, while still ! 96: * allowing a O_CREAT during the open(2) of the log file. ! 97: */ ! 98: fp = fdopen(fd, "r+"); ! 99: if (fp == NULL) { ! 100: perror(_PATH_SCORE); ! 101: return (-1); ! 102: } ! 103: #ifdef BSD ! 104: if (flock(fileno(fp), LOCK_EX) < 0) ! 105: #endif ! 106: #ifdef SYSV ! 107: while (lockf(fileno(fp), F_LOCK, 1) < 0) ! 108: #endif ! 109: { ! 110: perror("flock"); ! 111: return (-1); ! 112: } ! 113: for (;;) { ! 114: good = fscanf(fp, "%s %s %s %d %d %d", ! 115: score[num_scores].name, ! 116: score[num_scores].host, ! 117: score[num_scores].game, ! 118: &score[num_scores].planes, ! 119: &score[num_scores].time, ! 120: &score[num_scores].real_time); ! 121: if (good != 6 || ++num_scores >= NUM_SCORES) ! 122: break; ! 123: } ! 124: if (!test_mode && !list_em) { ! 125: if ((pw = (struct passwd *) getpwuid(getuid())) == NULL) { ! 126: fprintf(stderr, ! 127: "getpwuid failed for uid %d. Who are you?\n", ! 128: getuid()); ! 129: return (-1); ! 130: } ! 131: strcpy(thisscore.name, pw->pw_name); ! 132: #ifdef BSD ! 133: if (gethostname(thisscore.host, sizeof (thisscore.host)) < 0) { ! 134: perror("gethostname"); ! 135: return (-1); ! 136: } ! 137: #endif ! 138: #ifdef SYSV ! 139: uname(&name); ! 140: strcpy(thisscore.host, name.sysname); ! 141: #endif ! 142: ! 143: cp = rindex(file, '/'); ! 144: if (cp == NULL) { ! 145: fprintf(stderr, "log: where's the '/' in %s?\n", file); ! 146: return (-1); ! 147: } ! 148: cp++; ! 149: strcpy(thisscore.game, cp); ! 150: ! 151: thisscore.time = clock; ! 152: thisscore.planes = safe_planes; ! 153: thisscore.real_time = time(0) - start_time; ! 154: ! 155: for (i = 0; i < num_scores; i++) { ! 156: if (strcmp(thisscore.name, score[i].name) == 0 && ! 157: strcmp(thisscore.host, score[i].host) == 0 && ! 158: strcmp(thisscore.game, score[i].game) == 0) { ! 159: if (thisscore.time > score[i].time) { ! 160: score[i].time = thisscore.time; ! 161: score[i].planes = thisscore.planes; ! 162: score[i].real_time = ! 163: thisscore.real_time; ! 164: changed++; ! 165: } ! 166: found++; ! 167: break; ! 168: } ! 169: } ! 170: if (!found) { ! 171: for (i = 0; i < num_scores; i++) { ! 172: if (thisscore.time > score[i].time) { ! 173: if (num_scores < NUM_SCORES) ! 174: num_scores++; ! 175: bcopy(&score[i], ! 176: &score[num_scores - 1], ! 177: sizeof (score[i])); ! 178: bcopy(&thisscore, &score[i], ! 179: sizeof (score[i])); ! 180: changed++; ! 181: break; ! 182: } ! 183: } ! 184: } ! 185: if (!found && !changed && num_scores < NUM_SCORES) { ! 186: bcopy(&thisscore, &score[num_scores], ! 187: sizeof (score[num_scores])); ! 188: num_scores++; ! 189: changed++; ! 190: } ! 191: ! 192: if (changed) { ! 193: if (found) ! 194: puts("You beat your previous score!"); ! 195: else ! 196: puts("You made the top players list!"); ! 197: qsort(score, num_scores, sizeof (*score), compar); ! 198: rewind(fp); ! 199: for (i = 0; i < num_scores; i++) ! 200: fprintf(fp, "%s %s %s %d %d %d\n", ! 201: score[i].name, score[i].host, ! 202: score[i].game, score[i].planes, ! 203: score[i].time, score[i].real_time); ! 204: } else { ! 205: if (found) ! 206: puts("You didn't beat your previous score."); ! 207: else ! 208: puts("You didn't make the top players list."); ! 209: } ! 210: putchar('\n'); ! 211: } ! 212: #ifdef BSD ! 213: flock(fileno(fp), LOCK_UN); ! 214: #endif ! 215: #ifdef SYSV ! 216: /* lock will evaporate upon close */ ! 217: #endif ! 218: fclose(fp); ! 219: printf("%2s: %-8s %-8s %-18s %4s %9s %4s\n", "#", "name", "host", ! 220: "game", "time", "real time", "planes safe"); ! 221: puts("-------------------------------------------------------------------------------"); ! 222: for (i = 0; i < num_scores; i++) { ! 223: cp = index(score[i].host, '.'); ! 224: if (cp != NULL) ! 225: *cp = '\0'; ! 226: printf("%2d: %-8s %-8s %-18s %4d %9s %4d\n", i + 1, ! 227: score[i].name, score[i].host, score[i].game, ! 228: score[i].time, timestr(score[i].real_time), ! 229: score[i].planes); ! 230: } ! 231: putchar('\n'); ! 232: return (0); ! 233: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.