diff options
author | mycroft <mycroft@NetBSD.org> | 2002-09-20 20:54:15 +0000 |
---|---|---|
committer | mycroft <mycroft@NetBSD.org> | 2002-09-20 20:54:15 +0000 |
commit | a59b491d37669e51053c17262118e5fec67ad358 (patch) | |
tree | ba4a3a015e73c96fa05b76f80679c5c5e7ffdfca /hunt/huntd | |
parent | e05b1c0de535fc268d8d5ccb5f1d3d9c0f6d0d42 (diff) | |
download | bsdgames-darwin-a59b491d37669e51053c17262118e5fec67ad358.tar.gz bsdgames-darwin-a59b491d37669e51053c17262118e5fec67ad358.tar.zst bsdgames-darwin-a59b491d37669e51053c17262118e5fec67ad358.zip |
select() -> poll()
Also, turn off talk announcements; it's a wretched hack.
Diffstat (limited to 'hunt/huntd')
-rw-r--r-- | hunt/huntd/answer.c | 20 | ||||
-rw-r--r-- | hunt/huntd/ctl_transact.c | 20 | ||||
-rw-r--r-- | hunt/huntd/driver.c | 161 | ||||
-rw-r--r-- | hunt/huntd/extern.c | 8 | ||||
-rw-r--r-- | hunt/huntd/faketalk.c | 7 | ||||
-rw-r--r-- | hunt/huntd/hunt.h | 9 |
6 files changed, 100 insertions, 125 deletions
diff --git a/hunt/huntd/answer.c b/hunt/huntd/answer.c index c78fcea2..832f74cc 100644 --- a/hunt/huntd/answer.c +++ b/hunt/huntd/answer.c @@ -1,4 +1,4 @@ -/* $NetBSD: answer.c,v 1.3 1997/10/10 16:32:50 lukem Exp $ */ +/* $NetBSD: answer.c,v 1.4 2002/09/20 20:54:16 mycroft Exp $ */ /* * Hunt * Copyright (c) 1985 Conrad C. Huang, Gregory S. Couch, Kenneth C.R.C. Arnold @@ -7,7 +7,7 @@ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: answer.c,v 1.3 1997/10/10 16:32:50 lukem Exp $"); +__RCSID("$NetBSD: answer.c,v 1.4 2002/09/20 20:54:16 mycroft Exp $"); #endif /* not lint */ # include <ctype.h> @@ -37,6 +37,7 @@ answer() char *cp1, *cp2; int flags; long version; + int i; # ifdef INTERNET socklen = sizeof sockstruct; @@ -123,9 +124,10 @@ answer() # endif # ifdef MONITOR if (mode == C_MONITOR) - if (End_monitor < &Monitor[MAXMON]) + if (End_monitor < &Monitor[MAXMON]) { pp = End_monitor++; - else { + i = pp - Monitor + MAXPL + 3; + } else { socklen = 0; (void) write(newsock, (char *) &socklen, sizeof socklen); @@ -134,9 +136,10 @@ answer() } else # endif - if (End_player < &Player[MAXPL]) + if (End_player < &Player[MAXPL]) { pp = End_player++; - else { + i = pp - Player + 3; + } else { socklen = 0; (void) write(newsock, (char *) &socklen, sizeof socklen); @@ -152,9 +155,8 @@ answer() pp->p_output = fdopen(newsock, "w"); pp->p_death[0] = '\0'; pp->p_fd = newsock; - FD_SET(pp->p_fd, &Fds_mask); - if (pp->p_fd >= Num_fds) - Num_fds = pp->p_fd + 1; + fdset[i].fd = newsock; + fdset[i].events = POLLIN; pp->p_y = 0; pp->p_x = 0; diff --git a/hunt/huntd/ctl_transact.c b/hunt/huntd/ctl_transact.c index 71e1610b..8d303744 100644 --- a/hunt/huntd/ctl_transact.c +++ b/hunt/huntd/ctl_transact.c @@ -1,4 +1,4 @@ -/* $NetBSD: ctl_transact.c,v 1.4 2001/06/12 15:17:12 wiz Exp $ */ +/* $NetBSD: ctl_transact.c,v 1.5 2002/09/20 20:54:16 mycroft Exp $ */ /* * Copyright (c) 1983 Regents of the University of California. * All rights reserved. The Berkeley software License Agreement @@ -14,7 +14,7 @@ #if 0 static char sccsid[] = "@(#)ctl_transact.c 5.2 (Berkeley) 3/13/86"; #else -__RCSID("$NetBSD: ctl_transact.c,v 1.4 2001/06/12 15:17:12 wiz Exp $"); +__RCSID("$NetBSD: ctl_transact.c,v 1.5 2002/09/20 20:54:16 mycroft Exp $"); #endif #endif /* not lint */ @@ -38,24 +38,21 @@ ctl_transact(target, msg, type, rp) int type; CTL_RESPONSE *rp; { - fd_set read_mask, ctl_mask; + struct pollfd set[1]; int nready, cc, retries; - struct timeval wait; nready = 0; msg.type = type; daemon_addr.sin_addr = target; daemon_addr.sin_port = daemon_port; - FD_ZERO(&ctl_mask); - FD_SET(ctl_sockt, &ctl_mask); + set[0].fd = ctl_sockt; + set[0].events = POLLIN; /* * Keep sending the message until a response of * the proper type is obtained. */ do { - wait.tv_sec = CTL_WAIT; - wait.tv_usec = 0; /* resend message until a response is obtained */ for (retries = MAX_RETRY; retries > 0; retries -= 1) { cc = sendto(ctl_sockt, (char *)&msg, sizeof (msg), 0, @@ -65,8 +62,7 @@ ctl_transact(target, msg, type, rp) continue; p_error("Error on write to talk daemon"); } - read_mask = ctl_mask; - nready = select(32, &read_mask, 0, 0, &wait); + nready = poll(set, 1, CTL_WAIT * 1000); if (nready < 0) { if (errno == EINTR) continue; @@ -89,10 +85,8 @@ ctl_transact(target, msg, type, rp) continue; p_error("Error on read from talk daemon"); } - read_mask = ctl_mask; /* an immediate poll */ - timerclear(&wait); - nready = select(32, &read_mask, 0, 0, &wait); + nready = poll(set, 1, 0); } while (nready > 0 && ( #ifdef TALK_43 rp->vers != TALK_VERSION || diff --git a/hunt/huntd/driver.c b/hunt/huntd/driver.c index c8a4c806..63ac0824 100644 --- a/hunt/huntd/driver.c +++ b/hunt/huntd/driver.c @@ -1,4 +1,4 @@ -/* $NetBSD: driver.c,v 1.7 2001/01/09 23:49:54 lukem Exp $ */ +/* $NetBSD: driver.c,v 1.8 2002/09/20 20:54:16 mycroft Exp $ */ /* * Hunt * Copyright (c) 1985 Conrad C. Huang, Gregory S. Couch, Kenneth C.R.C. Arnold @@ -7,7 +7,7 @@ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: driver.c,v 1.7 2001/01/09 23:49:54 lukem Exp $"); +__RCSID("$NetBSD: driver.c,v 1.8 2002/09/20 20:54:16 mycroft Exp $"); #endif /* not lint */ # include <sys/ioctl.h> @@ -44,12 +44,12 @@ u_short stat_port; /* port # of statistics tcp socket */ # endif static void clear_scores __P((void)); -static int havechar __P((PLAYER *)); +static int havechar __P((PLAYER *, int)); static void init __P((void)); int main __P((int, char *[], char *[])); static void makeboots __P((void)); static void send_stats __P((void)); -static void zap __P((PLAYER *, FLAG)); +static void zap __P((PLAYER *, FLAG, int)); /* @@ -62,18 +62,16 @@ main(ac, av, ep) char **av, **ep; { PLAYER *pp; - int had_char; # ifdef INTERNET u_short msg; short port_num, reply; int namelen; SOCKET test; # endif - static fd_set read_fds; static FLAG first = TRUE; static FLAG server = FALSE; - int c; - static struct timeval linger = { 90, 0 }; + int c, i; + const int linger = 90 * 1000; First_arg = av[0]; if (ep == NULL || *ep == NULL) @@ -107,9 +105,8 @@ erred: again: do { - read_fds = Fds_mask; errno = 0; - while (select(Num_fds, &read_fds, NULL, NULL, NULL) < 0) + while (poll(fdset, 3+MAXPL+MAXMON, INFTIM) < 0) { if (errno != EINTR) # ifdef LOG @@ -119,9 +116,8 @@ again: # endif errno = 0; } - Have_inp = read_fds; # ifdef INTERNET - if (FD_ISSET(Test_socket, &read_fds)) { + if (fdset[2].revents & POLLIN) { namelen = DAEMON_SIZE; port_num = htons(sock_port); (void) recvfrom(Test_socket, (char *) &msg, sizeof msg, @@ -153,39 +149,34 @@ again: } } # endif - for (;;) { - had_char = FALSE; - for (pp = Player; pp < End_player; pp++) - if (havechar(pp)) { + { + for (pp = Player, i = 0; pp < End_player; pp++, i++) + if (havechar(pp, i + 3)) { execute(pp); pp->p_nexec++; - had_char++; } # ifdef MONITOR - for (pp = Monitor; pp < End_monitor; pp++) - if (havechar(pp)) { + for (pp = Monitor, i = 0; pp < End_monitor; pp++, i++) + if (havechar(pp, i + MAXPL + 3)) { mon_execute(pp); pp->p_nexec++; - had_char++; } # endif - if (!had_char) - break; moveshots(); - for (pp = Player; pp < End_player; ) + for (pp = Player, i = 0; pp < End_player; ) if (pp->p_death[0] != '\0') - zap(pp, TRUE); + zap(pp, TRUE, i + 3); else - pp++; + pp++, i++; # ifdef MONITOR - for (pp = Monitor; pp < End_monitor; ) + for (pp = Monitor, i = 0; pp < End_monitor; ) if (pp->p_death[0] != '\0') - zap(pp, FALSE); + zap(pp, FALSE, i + MAXPL + 3); else - pp++; + pp++, i++; # endif } - if (FD_ISSET(Socket, &read_fds)) + if (fdset[0].revents & POLLIN) if (answer()) { # ifdef INTERNET if (first && standard_port) @@ -193,17 +184,17 @@ again: # endif first = FALSE; } - if (FD_ISSET(Status, &read_fds)) + if (fdset[1].revents & POLLIN) send_stats(); - for (pp = Player; pp < End_player; pp++) { - if (FD_ISSET(pp->p_fd, &read_fds)) + for (pp = Player, i = 0; pp < End_player; pp++, i++) { + if (fdset[i + 3].revents & POLLIN) sendcom(pp, READY, pp->p_nexec); pp->p_nexec = 0; (void) fflush(pp->p_output); } # ifdef MONITOR - for (pp = Monitor; pp < End_monitor; pp++) { - if (FD_ISSET(pp->p_fd, &read_fds)) + for (pp = Monitor, i = 0; pp < End_monitor; pp++, i++) { + if (fdset[i + MAXPL + 3].revents & POLLIN) sendcom(pp, READY, pp->p_nexec); pp->p_nexec = 0; (void) fflush(pp->p_output); @@ -211,8 +202,7 @@ again: # endif } while (Nplayer > 0); - read_fds = Fds_mask; - if (select(Num_fds, &read_fds, NULL, NULL, &linger) > 0) { + if (poll(fdset, 3+MAXPL+MAXMON, linger) > 0) { goto again; } if (server) { @@ -227,8 +217,8 @@ again: } # ifdef MONITOR - for (pp = Monitor; pp < End_monitor; ) - zap(pp, FALSE); + for (pp = Monitor, i = 0; pp < End_monitor; i++) + zap(pp, FALSE, i + MAXPL + 3); # endif cleanup(0); /* NOTREACHED */ @@ -365,10 +355,10 @@ init() /* * Initialize minimal select mask */ - FD_ZERO(&Fds_mask); - FD_SET(Socket, &Fds_mask); - FD_SET(Status, &Fds_mask); - Num_fds = ((Socket > Status) ? Socket : Status) + 1; + fdset[0].fd = Socket; + fdset[0].events = POLLIN; + fdset[1].fd = Status; + fdset[1].events = POLLIN; # ifdef INTERNET len = sizeof (SOCKET); @@ -397,9 +387,10 @@ init() (void) listen(Test_socket, 5); } - FD_SET(Test_socket, &Fds_mask); - if (Test_socket + 1 > Num_fds) - Num_fds = Test_socket + 1; + fdset[2].fd = Test_socket; + fdset[2].events = POLLIN; +# else + fdset[2].fd = -1; # endif Seed = getpid() + time((time_t *) NULL); @@ -582,11 +573,12 @@ checkdam(ouch, gotcha, credit, amt, shot_type) * Kill off a player and take him out of the game. */ static void -zap(pp, was_player) +zap(pp, was_player, i) PLAYER *pp; FLAG was_player; + int i; { - int i, len; + int n, len; BULLET *bp; PLAYER *np; int x, y; @@ -603,8 +595,8 @@ zap(pp, was_player) x = (WIDTH - len) / 2; cgoto(pp, HEIGHT / 2, x); outstr(pp, pp->p_death, len); - for (i = 1; i < len; i++) - pp->p_death[i] = '-'; + for (n = 1; n < len; n++) + pp->p_death[n] = '-'; pp->p_death[0] = '+'; pp->p_death[len - 1] = '+'; cgoto(pp, HEIGHT / 2 - 1, x); @@ -625,22 +617,22 @@ zap(pp, was_player) bp->b_over = SPACE; } - i = rand_num(pp->p_ammo); + n = rand_num(pp->p_ammo); x = rand_num(pp->p_ammo); - if (x > i) - i = x; + if (x > n) + n = x; if (pp->p_ammo == 0) x = 0; - else if (i == pp->p_ammo - 1) { + else if (n == pp->p_ammo - 1) { x = pp->p_ammo; len = SLIME; } else { for (x = MAXBOMB - 1; x > 0; x--) - if (i >= shot_req[x]) + if (n >= shot_req[x]) break; for (y = MAXSLIME - 1; y > 0; y--) - if (i >= slime_req[y]) + if (n >= slime_req[y]) break; if (y >= 0 && slime_req[y] > shot_req[x]) { x = slime_req[y]; @@ -728,31 +720,34 @@ zap(pp, was_player) End_player--; if (pp != End_player) { memcpy(pp, End_player, sizeof (PLAYER)); + fdset[i] = fdset[End_player - Player + 3]; + fdset[End_player - Player + 3].fd = -1; (void) sprintf(Buf, "%5.2f%c%-10.10s %c", pp->p_ident->i_score, stat_char(pp), pp->p_ident->i_name, pp->p_ident->i_team); - i = STAT_PLAY_ROW + 1 + (pp - Player); + n = STAT_PLAY_ROW + 1 + (pp - Player); for (np = Player; np < End_player; np++) { - cgoto(np, i, STAT_NAME_COL); + cgoto(np, n, STAT_NAME_COL); outstr(np, Buf, STAT_NAME_LEN); } # ifdef MONITOR for (np = Monitor; np < End_monitor; np++) { - cgoto(np, i, STAT_NAME_COL); + cgoto(np, n, STAT_NAME_COL); outstr(np, Buf, STAT_NAME_LEN); } # endif - } + } else + fdset[i].fd = -1; /* Erase the last player */ - i = STAT_PLAY_ROW + 1 + Nplayer; + n = STAT_PLAY_ROW + 1 + Nplayer; for (np = Player; np < End_player; np++) { - cgoto(np, i, STAT_NAME_COL); + cgoto(np, n, STAT_NAME_COL); ce(np); } # ifdef MONITOR for (np = Monitor; np < End_monitor; np++) { - cgoto(np, i, STAT_NAME_COL); + cgoto(np, n, STAT_NAME_COL); ce(np); } } @@ -764,50 +759,34 @@ zap(pp, was_player) End_monitor--; if (pp != End_monitor) { memcpy(pp, End_monitor, sizeof (PLAYER)); + fdset[i] = fdset[End_monitor - Monitor + MAXPL + 3]; + fdset[End_monitor - Monitor + MAXPL + 3].fd = -1; (void) sprintf(Buf, "%5.5s %-10.10s %c", " ", pp->p_ident->i_name, pp->p_ident->i_team); - i = STAT_MON_ROW + 1 + (pp - Player); + n = STAT_MON_ROW + 1 + (pp - Player); for (np = Player; np < End_player; np++) { - cgoto(np, i, STAT_NAME_COL); + cgoto(np, n, STAT_NAME_COL); outstr(np, Buf, STAT_NAME_LEN); } for (np = Monitor; np < End_monitor; np++) { - cgoto(np, i, STAT_NAME_COL); + cgoto(np, n, STAT_NAME_COL); outstr(np, Buf, STAT_NAME_LEN); } - } + } else + fdset[i].fd = -1; /* Erase the last monitor */ - i = STAT_MON_ROW + 1 + (End_monitor - Monitor); + n = STAT_MON_ROW + 1 + (End_monitor - Monitor); for (np = Player; np < End_player; np++) { - cgoto(np, i, STAT_NAME_COL); + cgoto(np, n, STAT_NAME_COL); ce(np); } for (np = Monitor; np < End_monitor; np++) { - cgoto(np, i, STAT_NAME_COL); + cgoto(np, n, STAT_NAME_COL); ce(np); } - } # endif - - FD_CLR(savefd, &Fds_mask); - if (Num_fds == savefd + 1) { - Num_fds = Socket; -# ifdef INTERNET - if (Test_socket > Socket) - Num_fds = Test_socket; -# endif - for (np = Player; np < End_player; np++) - if (np->p_fd > Num_fds) - Num_fds = np->p_fd; -# ifdef MONITOR - for (np = Monitor; np < End_monitor; np++) - if (np->p_fd > Num_fds) - Num_fds = np->p_fd; -# endif - Num_fds++; - } } /* @@ -828,15 +807,15 @@ rand_num(range) * FALSE. */ static int -havechar(pp) +havechar(pp, i) PLAYER *pp; + int i; { if (pp->p_ncount < pp->p_nchar) return TRUE; - if (!FD_ISSET(pp->p_fd, &Have_inp)) + if (!(fdset[i].revents & POLLIN)) return FALSE; - FD_CLR(pp->p_fd, &Have_inp); check_again: errno = 0; if ((pp->p_nchar = read(pp->p_fd, pp->p_cbuf, sizeof pp->p_cbuf)) <= 0) diff --git a/hunt/huntd/extern.c b/hunt/huntd/extern.c index e25ba836..d11b0ca5 100644 --- a/hunt/huntd/extern.c +++ b/hunt/huntd/extern.c @@ -1,4 +1,4 @@ -/* $NetBSD: extern.c,v 1.2 1997/10/10 16:33:24 lukem Exp $ */ +/* $NetBSD: extern.c,v 1.3 2002/09/20 20:54:16 mycroft Exp $ */ /* * Hunt * Copyright (c) 1985 Conrad C. Huang, Gregory S. Couch, Kenneth C.R.C. Arnold @@ -7,7 +7,7 @@ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: extern.c,v 1.2 1997/10/10 16:33:24 lukem Exp $"); +__RCSID("$NetBSD: extern.c,v 1.3 2002/09/20 20:54:16 mycroft Exp $"); #endif /* not lint */ # include "hunt.h" @@ -20,10 +20,8 @@ char Buf[BUFSIZ]; /* general scribbling buffer */ char Maze[HEIGHT][WIDTH2]; /* the maze */ char Orig_maze[HEIGHT][WIDTH2]; /* the original maze */ -fd_set Fds_mask; /* mask for the file descriptors */ -fd_set Have_inp; /* which file descriptors have input */ +struct pollfd fdset[3+MAXPL+MAXMON]; int Nplayer = 0; /* number of players */ -int Num_fds; /* number of maximum file descriptor */ int Socket; /* main socket */ int Status; /* stat socket */ int See_over[NASCII]; /* lookup table for determining whether diff --git a/hunt/huntd/faketalk.c b/hunt/huntd/faketalk.c index 132a523f..92ed83b3 100644 --- a/hunt/huntd/faketalk.c +++ b/hunt/huntd/faketalk.c @@ -1,4 +1,4 @@ -/* $NetBSD: faketalk.c,v 1.6 2001/02/05 00:42:14 christos Exp $ */ +/* $NetBSD: faketalk.c,v 1.7 2002/09/20 20:54:16 mycroft Exp $ */ /* * Hunt * Copyright (c) 1985 Conrad C. Huang, Gregory S. Couch, Kenneth C.R.C. Arnold @@ -11,10 +11,11 @@ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: faketalk.c,v 1.6 2001/02/05 00:42:14 christos Exp $"); +__RCSID("$NetBSD: faketalk.c,v 1.7 2002/09/20 20:54:16 mycroft Exp $"); #endif /* not lint */ #include "bsd.h" +#include "hunt.h" #if defined(TALK_43) || defined(TALK_42) @@ -26,7 +27,6 @@ __RCSID("$NetBSD: faketalk.c,v 1.6 2001/02/05 00:42:14 christos Exp $"); # include <stdio.h> # include <string.h> # include <unistd.h> -# include "hunt.h" # include "talk_ctl.h" # define TRUE 1 @@ -222,6 +222,7 @@ do_announce(s) p_error("send delete remote"); } #else +void faketalk() { return; diff --git a/hunt/huntd/hunt.h b/hunt/huntd/hunt.h index 1bb208b8..a76a777e 100644 --- a/hunt/huntd/hunt.h +++ b/hunt/huntd/hunt.h @@ -1,4 +1,4 @@ -/* $NetBSD: hunt.h,v 1.6 2000/01/21 17:08:34 mycroft Exp $ */ +/* $NetBSD: hunt.h,v 1.7 2002/09/20 20:54:17 mycroft Exp $ */ /* * Hunt @@ -20,7 +20,7 @@ # endif # include <sys/types.h> # include <sys/uio.h> -# include <sys/socket.h> +# include <sys/poll.h> # ifdef INTERNET # include <netinet/in.h> # include <netdb.h> @@ -81,6 +81,7 @@ # define MAXMON 1 # else # define MAXPL 17 +# define MAXMON 0 # endif # define SHORTLEN 2 /* sizeof (network short) */ # define LONGLEN 4 /* sizeof (network long) */ @@ -346,8 +347,8 @@ extern char Buf[BUFSIZ], Maze[HEIGHT][WIDTH2], Orig_maze[HEIGHT][WIDTH2]; extern char *Sock_name, *Driver; -extern int Nplayer, Num_fds, Socket, Status; -extern fd_set Fds_mask, Have_inp; +extern int Nplayer, Socket, Status; +extern struct pollfd fdset[]; # ifdef INTERNET extern u_short Test_port; |