X-Git-Url: https://git.cameronkatri.com/bsdgames-darwin.git/blobdiff_plain/01389e73932da5ab0c565531b778ca875a9b7c31..c2997b6e22cfa183e7e73501ecdb2d5020434c9a:/rogue/machdep.c diff --git a/rogue/machdep.c b/rogue/machdep.c index c831fc90..e6d6292d 100644 --- a/rogue/machdep.c +++ b/rogue/machdep.c @@ -1,4 +1,4 @@ -/* $NetBSD: machdep.c,v 1.11 1999/09/13 17:14:08 jsm Exp $ */ +/* $NetBSD: machdep.c,v 1.20 2012/12/01 11:37:27 mbalmer Exp $ */ /* * Copyright (c) 1988, 1993 @@ -15,11 +15,7 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors + * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * @@ -41,7 +37,7 @@ #if 0 static char sccsid[] = "@(#)machdep.c 8.1 (Berkeley) 5/31/93"; #else -__RCSID("$NetBSD: machdep.c,v 1.11 1999/09/13 17:14:08 jsm Exp $"); +__RCSID("$NetBSD: machdep.c,v 1.20 2012/12/01 11:37:27 mbalmer Exp $"); #endif #endif /* not lint */ @@ -67,7 +63,7 @@ __RCSID("$NetBSD: machdep.c,v 1.11 1999/09/13 17:14:08 jsm Exp $"); * * All UNIX code should be included between the single "#ifdef UNIX" at the * top of this file, and the "#endif" at the bottom. - * + * * To change a routine to include a new UNIX system, simply #ifdef the * existing routine, as in the following example: * @@ -88,7 +84,7 @@ __RCSID("$NetBSD: machdep.c,v 1.11 1999/09/13 17:14:08 jsm Exp $"); * #endif * } * - * Appropriate variations of this are of course acceptible. + * Appropriate variations of this are of course acceptable. * The use of "#elseif" is discouraged because of non-portability. * If the correct #define doesn't exist, "UNIX_SYSV" in this case, make it up * and insert it in the list at the top of the file. Alter the CFLAGS @@ -132,7 +128,7 @@ __RCSID("$NetBSD: machdep.c,v 1.11 1999/09/13 17:14:08 jsm Exp $"); */ void -md_slurp() +md_slurp(void) { (void)fpurge(stdin); } @@ -154,7 +150,7 @@ md_slurp() */ void -md_heed_signals() +md_heed_signals(void) { signal(SIGINT, onintr); signal(SIGQUIT, byebye); @@ -174,7 +170,7 @@ md_heed_signals() */ void -md_ignore_signals() +md_ignore_signals(void) { signal(SIGQUIT, SIG_IGN); signal(SIGINT, SIG_IGN); @@ -191,15 +187,14 @@ md_ignore_signals() */ int -md_get_file_id(fname) - const char *fname; +md_get_file_id(const char *fname) { struct stat sbuf; if (stat(fname, &sbuf)) { return(-1); } - return((int) sbuf.st_ino); + return((int)sbuf.st_ino); } /* md_link_count(): @@ -211,13 +206,12 @@ md_get_file_id(fname) */ int -md_link_count(fname) - const char *fname; +md_link_count(const char *fname) { struct stat sbuf; stat(fname, &sbuf); - return((int) sbuf.st_nlink); + return((int)sbuf.st_nlink); } /* md_gct(): (Get Current Time) @@ -231,12 +225,11 @@ md_link_count(fname) * system doesn't provide all of the time units requested here, then you * can provide only those that it does, and return zeros for the others. * If you cannot provide good time values, then users may be able to copy - * saved-game files and play them. + * saved-game files and play them. */ void -md_gct(rt_buf) - struct rogue_time *rt_buf; +md_gct(struct rogue_time *rt_buf) { struct tm *t; time_t seconds; @@ -263,22 +256,20 @@ md_gct(rt_buf) * exactly the same here. * Or if md_gct() is implemented correctly, but your system does not provide * file modification dates, you may return some date far in the past so - * that the program will never know that a saved-game file being modified. + * that the program will never know that a saved-game file being modified. * You may also do this if you wish to be able to restore games from * saved-games that have been modified. */ void -md_gfmt(fname, rt_buf) - const char *fname; - struct rogue_time *rt_buf; +md_gfmt(const char *fname, struct rogue_time *rt_buf) { struct stat sbuf; time_t seconds; struct tm *t; stat(fname, &sbuf); - seconds = (long) sbuf.st_mtime; + seconds = sbuf.st_mtime; t = localtime(&seconds); rt_buf->year = t->tm_year; @@ -301,8 +292,7 @@ md_gfmt(fname, rt_buf) */ boolean -md_df(fname) - const char *fname; +md_df(const char *fname) { if (unlink(fname)) { return(0); @@ -320,13 +310,13 @@ md_df(fname) */ const char * -md_gln() +md_gln(void) { struct passwd *p; if (!(p = getpwuid(getuid()))) - return((char *)NULL); - return(p->pw_name); + return NULL; + return p->pw_name; } /* md_sleep: @@ -339,10 +329,9 @@ md_gln() */ void -md_sleep(nsecs) - int nsecs; +md_sleep(int nsecs) { - (void) sleep(nsecs); + (void)sleep(nsecs); } /* md_getenv() @@ -369,8 +358,7 @@ md_sleep(nsecs) */ char * -md_getenv(name) - const char *name; +md_getenv(const char *name) { char *value; @@ -387,9 +375,8 @@ md_getenv(name) * when no more memory can be allocated. */ -char * -md_malloc(n) - int n; +void * +md_malloc(size_t n) { char *t; @@ -400,7 +387,7 @@ md_malloc(n) /* md_gseed() (Get Seed) * * This function returns a seed for the random number generator (RNG). This - * seed causes the RNG to begin generating numbers at some point in it's + * seed causes the RNG to begin generating numbers at some point in its * sequence. Without a random seed, the RNG will generate the same set * of numbers, and every game will start out exactly the same way. A good * number to use is the process id, given by getpid() on most UNIX systems. @@ -408,7 +395,7 @@ md_malloc(n) * You need to find some single random integer, such as: * process id. * current time (minutes + seconds) returned from md_gct(), if implemented. - * + * * It will not help to return "get_rand()" or "rand()" or the return value of * any pseudo-RNG. If you don't have a random number, you can just return 1, * but this means your games will ALWAYS start the same way, and will play @@ -416,12 +403,12 @@ md_malloc(n) */ int -md_gseed() +md_gseed(void) { time_t seconds; time(&seconds); - return((int) seconds); + return((int)seconds); } /* md_exit(): @@ -432,8 +419,7 @@ md_gseed() */ void -md_exit(status) - int status; +md_exit(int status) { exit(status); } @@ -450,17 +436,16 @@ md_exit(status) */ void -md_lock(l) - boolean l; +md_lock(boolean l) { - static int fd; + static int fd = -1; short tries; if (l) { setegid(egid); if ((fd = open(_PATH_SCOREFILE, O_RDONLY)) < 1) { setegid(gid); - message("cannot lock score file", 0); + messagef(0, "cannot lock score file"); return; } setegid(gid); @@ -468,7 +453,7 @@ md_lock(l) if (!flock(fd, LOCK_EX|LOCK_NB)) return; } else { - (void)flock(fd, LOCK_NB); + (void)flock(fd, LOCK_UN|LOCK_NB); (void)close(fd); } } @@ -476,22 +461,32 @@ md_lock(l) /* md_shell(): * * This function spawns a shell for the user to use. When this shell is - * terminated, the game continues. Since this program may often be run - * setuid to gain access to privileged files, care is taken that the shell - * is run with the user's REAL user id, and not the effective user id. - * The effective user id is restored after the shell completes. + * terminated, the game continues. + * + * It is important that the game not give the shell the privileges the + * game uses to access the scores file. This version of the game runs + * with privileges low by default; only the saved gid (if setgid) or uid + * (if setuid) will be privileged, but that privilege is discarded by + * exec(). */ void -md_shell(shell) - const char *shell; +md_shell(const char *shell) { int w; - - if (!fork()) { - execl(shell, shell, 0); + pid_t pid; + + pid = fork(); + switch (pid) { + case -1: + break; + case 0: + execl(shell, shell, (char *)NULL); + _exit(255); + default: + waitpid(pid, &w, 0); + break; } - wait(&w); } -#endif +#endif /* UNIX */