1 /* $OpenBSD: cfscores.c,v 1.11 2003/07/10 00:03:01 david Exp $ */ 2 /* $NetBSD: cfscores.c,v 1.3 1995/03/21 15:08:37 cgd Exp $ */ 3 4 /* 5 * Copyright (c) 1983, 1993 6 * The Regents of the University of California. All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 3. Neither the name of the University nor the names of its contributors 17 * may be used to endorse or promote products derived from this software 18 * without specific prior written permission. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 21 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 23 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 24 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 26 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 30 * SUCH DAMAGE. 31 */ 32 33 #ifndef lint 34 static char copyright[] = 35 "@(#) Copyright (c) 1983, 1993\n\ 36 The Regents of the University of California. All rights reserved.\n"; 37 #endif /* not lint */ 38 39 #ifndef lint 40 #if 0 41 static char sccsid[] = "@(#)cfscores.c 8.1 (Berkeley) 5/31/93"; 42 #else 43 static char rcsid[] = "$OpenBSD: cfscores.c,v 1.11 2003/07/10 00:03:01 david Exp $"; 44 #endif 45 #endif /* not lint */ 46 47 #include <sys/types.h> 48 #include <err.h> 49 #include <fcntl.h> 50 #include <pwd.h> 51 #include <stdio.h> 52 #include <stdlib.h> 53 #include <string.h> 54 #include <unistd.h> 55 #include "pathnames.h" 56 57 struct betinfo { 58 long hand; /* cost of dealing hand */ 59 long inspection; /* cost of inspecting hand */ 60 long game; /* cost of buying game */ 61 long runs; /* cost of running through hands */ 62 long information; /* cost of information */ 63 long thinktime; /* cost of thinking time */ 64 long wins; /* total winnings */ 65 long worth; /* net worth after costs */ 66 }; 67 68 int dbfd; 69 70 void printuser(const struct passwd *, int); 71 72 int 73 main(argc, argv) 74 int argc; 75 char *argv[]; 76 { 77 struct passwd *pw; 78 int uid; 79 80 if (argc > 2) { 81 fprintf(stderr, "Usage: cfscores [user]\n"); 82 exit(1); 83 } 84 dbfd = open(_PATH_SCORE, O_RDONLY); 85 if (dbfd < 0) 86 err(2, "%s", _PATH_SCORE); 87 88 /* revoke privs */ 89 setegid(getgid()); 90 setgid(getgid()); 91 92 setpwent(); 93 if (argc == 1) { 94 uid = getuid(); 95 pw = getpwuid(uid); 96 if (pw == 0) { 97 printf("You are not listed in the password file?!?\n"); 98 exit(2); 99 } 100 printuser(pw, 1); 101 exit(0); 102 } 103 if (strcmp(argv[1], "-a") == 0) { 104 while ((pw = getpwent()) != 0) 105 printuser(pw, 0); 106 exit(0); 107 } 108 pw = getpwnam(argv[1]); 109 if (pw == 0) { 110 printf("User %s unknown\n", argv[1]); 111 exit(3); 112 } 113 printuser(pw, 1); 114 exit(0); 115 } 116 117 /* 118 * print out info for specified password entry 119 */ 120 void 121 printuser(pw, printfail) 122 const struct passwd *pw; 123 int printfail; 124 { 125 struct betinfo total; 126 int i; 127 128 if (pw->pw_uid < 0) { 129 printf("Bad uid %u\n", pw->pw_uid); 130 return; 131 } 132 i = lseek(dbfd, pw->pw_uid * sizeof(struct betinfo), SEEK_SET); 133 if (i < 0) { 134 warn("lseek %s", _PATH_SCORE); 135 return; 136 } 137 i = read(dbfd, (char *)&total, sizeof(total)); 138 if (i < 0) { 139 warn("lseek %s", _PATH_SCORE); 140 return; 141 } 142 if (i == 0 || total.hand == 0) { 143 if (printfail) 144 printf("%s has never played canfield.\n", pw->pw_name); 145 return; 146 } 147 i = strlen(pw->pw_name); 148 printf("*----------------------*\n"); 149 if (total.worth >= 0) { 150 if (i <= 8) 151 printf("* Winnings for %-8s*\n", pw->pw_name); 152 else { 153 printf("* Winnings for *\n"); 154 if (i <= 20) 155 printf("* %20s *\n", pw->pw_name); 156 else 157 printf("%s\n", pw->pw_name); 158 } 159 } else { 160 if (i <= 10) 161 printf("* Losses for %-10s*\n", pw->pw_name); 162 else { 163 printf("* Losses for *\n"); 164 if (i <= 20) 165 printf("* %20s *\n", pw->pw_name); 166 else 167 printf("%s\n", pw->pw_name); 168 } 169 } 170 printf("*======================*\n"); 171 printf("|Costs Total |\n"); 172 printf("| Hands %8ld |\n", total.hand); 173 printf("| Inspections %8ld |\n", total.inspection); 174 printf("| Games %8ld |\n", total.game); 175 printf("| Runs %8ld |\n", total.runs); 176 printf("| Information %8ld |\n", total.information); 177 printf("| Think time %8ld |\n", total.thinktime); 178 printf("|Total Costs %8ld |\n", total.wins - total.worth); 179 printf("|Winnings %8ld |\n", total.wins); 180 printf("|Net Worth %8ld |\n", total.worth); 181 printf("*----------------------*\n\n"); 182 } 183