1 1.22 dholland /* $NetBSD: cfscores.c,v 1.22 2014/03/22 23:45:34 dholland Exp $ */ 2 1.3 cgd 3 1.1 cgd /* 4 1.3 cgd * Copyright (c) 1983, 1993 5 1.3 cgd * The Regents of the University of California. All rights reserved. 6 1.1 cgd * 7 1.1 cgd * Redistribution and use in source and binary forms, with or without 8 1.1 cgd * modification, are permitted provided that the following conditions 9 1.1 cgd * are met: 10 1.1 cgd * 1. Redistributions of source code must retain the above copyright 11 1.1 cgd * notice, this list of conditions and the following disclaimer. 12 1.1 cgd * 2. Redistributions in binary form must reproduce the above copyright 13 1.1 cgd * notice, this list of conditions and the following disclaimer in the 14 1.1 cgd * documentation and/or other materials provided with the distribution. 15 1.11 agc * 3. Neither the name of the University nor the names of its contributors 16 1.1 cgd * may be used to endorse or promote products derived from this software 17 1.1 cgd * without specific prior written permission. 18 1.1 cgd * 19 1.1 cgd * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 20 1.1 cgd * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21 1.1 cgd * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22 1.1 cgd * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 23 1.1 cgd * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24 1.1 cgd * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 25 1.1 cgd * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 26 1.1 cgd * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27 1.1 cgd * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 28 1.1 cgd * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29 1.1 cgd * SUCH DAMAGE. 30 1.1 cgd */ 31 1.1 cgd 32 1.4 lukem #include <sys/cdefs.h> 33 1.1 cgd #ifndef lint 34 1.15 lukem __COPYRIGHT("@(#) Copyright (c) 1983, 1993\ 35 1.15 lukem The Regents of the University of California. All rights reserved."); 36 1.1 cgd #endif /* not lint */ 37 1.1 cgd 38 1.1 cgd #ifndef lint 39 1.3 cgd #if 0 40 1.3 cgd static char sccsid[] = "@(#)cfscores.c 8.1 (Berkeley) 5/31/93"; 41 1.3 cgd #else 42 1.22 dholland __RCSID("$NetBSD: cfscores.c,v 1.22 2014/03/22 23:45:34 dholland Exp $"); 43 1.3 cgd #endif 44 1.1 cgd #endif /* not lint */ 45 1.1 cgd 46 1.1 cgd #include <sys/types.h> 47 1.5 lukem #include <err.h> 48 1.4 lukem #include <fcntl.h> 49 1.1 cgd #include <pwd.h> 50 1.4 lukem #include <stdio.h> 51 1.10 matt #include <stdlib.h> 52 1.10 matt #include <string.h> 53 1.4 lukem #include <unistd.h> 54 1.20 dholland #include "betinfo.h" 55 1.1 cgd #include "pathnames.h" 56 1.1 cgd 57 1.16 dholland static int dbfd; 58 1.1 cgd 59 1.16 dholland static void printuser(const struct passwd *, int); 60 1.4 lukem 61 1.4 lukem int 62 1.13 jmc main(int argc, char *argv[]) 63 1.1 cgd { 64 1.4 lukem struct passwd *pw; 65 1.14 dholland uid_t uid; 66 1.8 jsm 67 1.8 jsm /* Revoke setgid privileges */ 68 1.9 mycroft setgid(getgid()); 69 1.1 cgd 70 1.1 cgd if (argc > 2) { 71 1.21 dholland fprintf(stderr, "Usage: %s -a | %s [user]\n", 72 1.21 dholland getprogname(), getprogname()); 73 1.21 dholland exit(1); 74 1.1 cgd } 75 1.6 hubertf dbfd = open(_PATH_SCORE, O_RDONLY); 76 1.5 lukem if (dbfd < 0) 77 1.5 lukem err(2, "open %s", _PATH_SCORE); 78 1.1 cgd setpwent(); 79 1.1 cgd if (argc == 1) { 80 1.1 cgd uid = getuid(); 81 1.1 cgd pw = getpwuid(uid); 82 1.19 dholland if (pw == NULL) { 83 1.18 dholland errx(2, "You are not listed in the password file?!?"); 84 1.1 cgd } 85 1.1 cgd printuser(pw, 1); 86 1.1 cgd exit(0); 87 1.1 cgd } 88 1.1 cgd if (strcmp(argv[1], "-a") == 0) { 89 1.19 dholland while ((pw = getpwent()) != NULL) 90 1.1 cgd printuser(pw, 0); 91 1.1 cgd exit(0); 92 1.1 cgd } 93 1.1 cgd pw = getpwnam(argv[1]); 94 1.19 dholland if (pw == NULL) { 95 1.18 dholland errx(3, "User %s unknown", argv[1]); 96 1.1 cgd } 97 1.1 cgd printuser(pw, 1); 98 1.1 cgd exit(0); 99 1.1 cgd } 100 1.1 cgd 101 1.1 cgd /* 102 1.1 cgd * print out info for specified password entry 103 1.1 cgd */ 104 1.16 dholland static void 105 1.13 jmc printuser(const struct passwd *pw, int printfail) 106 1.1 cgd { 107 1.1 cgd struct betinfo total; 108 1.14 dholland off_t pos; 109 1.22 dholland ssize_t i; 110 1.1 cgd 111 1.14 dholland pos = pw->pw_uid * (off_t)sizeof(struct betinfo); 112 1.14 dholland /* test pos, not pw_uid; uid_t can be unsigned, which makes gcc warn */ 113 1.14 dholland if (pos < 0) { 114 1.18 dholland warnx("Bad uid %d", (int)pw->pw_uid); 115 1.1 cgd return; 116 1.1 cgd } 117 1.22 dholland if (lseek(dbfd, pos, SEEK_SET) < 0) { 118 1.22 dholland warn("%s: lseek", _PATH_SCORE); 119 1.22 dholland } 120 1.19 dholland i = read(dbfd, &total, sizeof(total)); 121 1.5 lukem if (i < 0) 122 1.5 lukem warn("read %s", _PATH_SCORE); 123 1.1 cgd if (i == 0 || total.hand == 0) { 124 1.1 cgd if (printfail) 125 1.1 cgd printf("%s has never played canfield.\n", pw->pw_name); 126 1.1 cgd return; 127 1.1 cgd } 128 1.1 cgd printf("*----------------------*\n"); 129 1.1 cgd if (total.worth >= 0) 130 1.1 cgd printf("* Winnings for %-8s*\n", pw->pw_name); 131 1.1 cgd else 132 1.1 cgd printf("* Losses for %-10s*\n", pw->pw_name); 133 1.1 cgd printf("*======================*\n"); 134 1.1 cgd printf("|Costs Total |\n"); 135 1.4 lukem printf("| Hands %8ld |\n", total.hand); 136 1.4 lukem printf("| Inspections %8ld |\n", total.inspection); 137 1.4 lukem printf("| Games %8ld |\n", total.game); 138 1.4 lukem printf("| Runs %8ld |\n", total.runs); 139 1.4 lukem printf("| Information %8ld |\n", total.information); 140 1.4 lukem printf("| Think time %8ld |\n", total.thinktime); 141 1.4 lukem printf("|Total Costs %8ld |\n", total.wins - total.worth); 142 1.4 lukem printf("|Winnings %8ld |\n", total.wins); 143 1.4 lukem printf("|Net Worth %8ld |\n", total.worth); 144 1.1 cgd printf("*----------------------*\n\n"); 145 1.1 cgd } 146