1 /* $NetBSD: lo_main.c,v 1.19 2010/08/06 09:14:40 dholland Exp $ */ 2 3 /* 4 * Copyright (c) 1983, 1993 5 * The Regents of the University of California. All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 3. Neither the name of the University nor the names of its contributors 16 * may be used to endorse or promote products derived from this software 17 * without specific prior written permission. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29 * SUCH DAMAGE. 30 */ 31 32 #include <sys/cdefs.h> 33 #ifndef lint 34 #if 0 35 static char sccsid[] = "@(#)lo_main.c 8.2 (Berkeley) 4/28/95"; 36 #else 37 __RCSID("$NetBSD: lo_main.c,v 1.19 2010/08/06 09:14:40 dholland Exp $"); 38 #endif 39 #endif /* not lint */ 40 41 /* 42 * Print out the top ten SAILors 43 * 44 * -l force a long listing (print out real usernames) 45 */ 46 47 #include <err.h> 48 #include <errno.h> 49 #include <stdio.h> 50 #include <stdlib.h> 51 #include <string.h> 52 #include <pwd.h> 53 #include <curses.h> 54 55 #include "extern.h" 56 #include "pathnames.h" 57 58 59 static const char *const title[] = { 60 "Admiral", "Commodore", "Captain", "Captain", 61 "Captain", "Captain", "Captain", "Commander", 62 "Commander", "Lieutenant" 63 }; 64 65 void 66 lo_curses(void) 67 { 68 FILE *fp; 69 char sbuf[32]; 70 int n = 0, npeople; 71 int line; 72 struct passwd *pass; 73 struct logs log; 74 struct ship *ship; 75 76 erase(); 77 78 fp = fopen(_PATH_LOGFILE, "r"); 79 if (fp == NULL) { 80 mvprintw(5, 10, "%s: %s", _PATH_LOGFILE, strerror(errno)); 81 mvaddstr(7, 10, "Press any key..."); 82 getch(); 83 return; 84 } 85 switch (fread(&npeople, sizeof npeople, 1, fp)) { 86 case 0: 87 mvprintw(5, 10, "Nobody has sailed yet."); 88 mvaddstr(7, 10, "Press any key..."); 89 getch(); 90 return; 91 case 1: 92 break; 93 default: 94 mvprintw(5, 10, "%s: %s", _PATH_LOGFILE, strerror(errno)); 95 mvaddstr(7, 10, "Press any key..."); 96 getch(); 97 return; 98 } 99 line = 0; 100 while (fread(&log, sizeof log, 1, fp) == 1 && 101 log.l_name[0] != '\0' && 102 line < LINES - 2) { 103 if (longfmt && (pass = getpwuid(log.l_uid)) != NULL) 104 snprintf(sbuf, sizeof(sbuf), 105 "%10.10s (%s)", log.l_name, pass->pw_name); 106 else 107 snprintf(sbuf, sizeof(sbuf), 108 "%20.20s", log.l_name); 109 ship = &scene[log.l_gamenum].ship[log.l_shipnum]; 110 mvprintw(line, 0, 111 "%-10s %21s of the %15s %3d points, %5.2f equiv", 112 title[n++], sbuf, ship->shipname, log.l_netpoints, 113 (float) log.l_netpoints / ship->specs->pts); 114 line++; 115 } 116 fclose(fp); 117 mvprintw(line+1, 0, "%d people have played. Press any key.", npeople); 118 getch(); 119 } 120 121 int 122 lo_main(void) 123 { 124 FILE *fp; 125 char sbuf[32]; 126 int n = 0, npeople; 127 struct passwd *pass; 128 struct logs log; 129 struct ship *ship; 130 131 if ((fp = fopen(_PATH_LOGFILE, "r")) == 0) { 132 err(1, "%s", _PATH_LOGFILE); 133 } 134 switch (fread(&npeople, sizeof npeople, 1, fp)) { 135 case 0: 136 printf("Nobody has sailed yet.\n"); 137 exit(0); 138 case 1: 139 break; 140 default: 141 err(1, "%s", _PATH_LOGFILE); 142 } 143 while (fread(&log, sizeof log, 1, fp) == 1 && 144 log.l_name[0] != '\0') { 145 if (longfmt && (pass = getpwuid(log.l_uid)) != NULL) 146 snprintf(sbuf, sizeof(sbuf), 147 "%10.10s (%s)", log.l_name, pass->pw_name); 148 else 149 snprintf(sbuf, sizeof(sbuf), 150 "%20.20s", log.l_name); 151 ship = &scene[log.l_gamenum].ship[log.l_shipnum]; 152 printf("%-10s %21s of the %15s %3d points, %5.2f equiv\n", 153 title[n++], sbuf, ship->shipname, log.l_netpoints, 154 (float) log.l_netpoints / ship->specs->pts); 155 } 156 fclose(fp); 157 printf("\n%d people have played.\n", npeople); 158 return 0; 159 } 160