|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T p
Length: 5463 (0x1557)
Types: TextFile
Names: »players.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
└─⟦this⟧ »EUUGD18/General/Poker/players.c«
/*
** Routines to handle players joining game and quitting.
*/
# include "players.h"
# include "util.h"
# include "port.h"
# include "scores.h"
# include <errno.h>
# include <sys/types.h>
# include <sys/socket.h>
# ifdef MASSCOMP
# include <net/in.h>
typedef unsigned long u_long;
# include <net/misc.h>
# else
# include <netinet/in.h>
# include <sys/time.h>
# endif
# include <stdio.h>
# include <netdb.h>
# ifdef MASSCOMP
extern char *index();
# else
# include <strings.h>
# endif
# define TRUE 1
# define FALSE 0
# define ERROR -1
# define START_CASH 200 /* amount new player starts with */
# define MAX_PLAYERS 5 /* max # concurrent players */
PLAYER player[MAX_PLAYERS]; /* player information */
int n_players=1; /* computer is playing */
static int main_socket=ERROR; /* socket to accept connections on */
void new_players( player, n_players, block )
PLAYER player[]; /* array of player info structures */
int *n_players; /* number of players (incl comp) */
int block; /* if nobody wants to join, wait on socket
until somebody does. */
{
int readfds; /* for select() call */
char temp[80]; /* to read player's name*/
int s; /* temp holder for new socket */
int rc; /* # ready selected sockets */
int open_sock(); /* to open main socket */
# ifdef MASSCOMP
int free_socket(); /* gets a free socket */
int new_socket; /* file descriptor of socket gotten */
# endif
struct sockaddr_in from; /* connection acceptor */
int fromlen = sizeof(from);
# ifndef MASSCOMP
struct timeval t; /* don't let select() run forever */
# endif
int i;
if (main_socket == ERROR)
main_socket = open_sock();
/* set up 1 second timeout for use on all select() calls */
# ifndef MASSCOMP
t.tv_sec = 1L;
t.tv_usec = 0L;
# endif
/* see if people who were sitting out want to rejoin yet */
for( i=1; i<*n_players; i++ )
{
if ( player[i].sittingout )
{
readfds = 1 << player[i].socket;
# ifdef MASSCOMP
if ( select( 32, &readfds, 0, 1000 ) > 0 ) /* 1000 ms */
# else
if ( select( 32, &readfds, 0, 0, &t ) > 0 )
# endif
{
readln( player[i].socket, temp );
if ( temp[0] == 'S' )
player[i].sittingout = FALSE;
}
}
}
for (;;)
{
readfds = 1 << main_socket;
# ifdef MASSCOMP
rc = select( 32, &readfds, 0, 1000 );
# else
rc = select( 32, &readfds, 0, 0, &t );
# endif
if (rc > 0 || block)
{
# ifdef MASSCOMP
if ((s = accept( main_socket, &from )) < 0 )
# else
if ((s = accept( main_socket, &from, &fromlen)) < 0)
# endif
{
perror("accept");
fflush(stdout);
break;
}
if ( *n_players >= MAX_PLAYERS )
{
writeln( s, "TOOMANY" );
close( s );
}
else
{
block = FALSE;
printf("accepted connection from ");
# ifdef MASSCOMP
new_socket = free_socket();
socketaddr( new_socket, &from );
sprintf( temp, "%d", ntohs( from.sin_port ) );
writeln( main_socket, temp );
accept( new_socket, &from );
read( main_socket, temp, 1 ); /* eat the EOF ????? */
close( main_socket );
sleep(5);
main_socket = open_sock();
s = new_socket;
# else
writeln( s, "OK" );
# endif
player[*n_players].socket = s;
player[*n_players].cash = START_CASH;
player[*n_players].in = FALSE;
player[*n_players].wantsout = FALSE;
player[*n_players].sittingout = FALSE;
player[*n_players].lonehands = 0;
readln( s, temp );
temp[strlen( temp ) - 1] = NULL;
/* don't allow colons in name because of format of score file */
if ( index( temp, ':' ) != NULL )
*index( temp, ':' ) = NULL;
if ( strlen( temp ) > 25 )
temp[25] = NULL;
player[*n_players].name = strsave( temp );
printf("%s\n",temp);
fflush(stdout);
readln( s, temp );
player[*n_players].userid = atoi( temp );
if ( played_before( player[*n_players].name, player[*n_players].userid ) )
player[*n_players].cash = get_cash();
(*n_players)++;
break;
}
}
else
break;
}
}
void leave( player, n_players )
PLAYER player[];
int *n_players;
{
register int i;
for( i=1; i<*n_players; i++)
if (player[i].wantsout)
{
writeln( player[i].socket, "Q" );
put_cash( player[i].name, player[i].userid, player[i].cash );
high_score_list( player[i].socket );
close( player[i].socket );
free( player[i].name );
player[i] = player[*n_players - 1];
(*n_players)--;
--i; /* since this entry is new, test again */
}
}
/* Open the main socket. */
int open_sock()
{
int s;
struct sockaddr_in sockaddr;
struct hostent *host;
# ifdef MASSCOMP
sockaddr.sin_family = AF_INET;
sockaddr.sin_port = htons( PORT );
if ((host = gethostbyname( HOST )) == NULL)
{
perror( "gethostbyname" );
exit(1);
}
sockaddr.sin_addr.s_addr = *(u_long *) host->h_addr;
s = socket( SOCK_STREAM, 0, &sockaddr, SO_ACCEPTCONN );
# else
s = socket( AF_INET, SOCK_STREAM, 0 );
# endif
if (s < 0)
{
perror("open_sock");
exit(1);
}
# ifndef MASSCOMP
sockaddr.sin_family = AF_INET;
sockaddr.sin_port = htons( PORT );
if (bind( s, &sockaddr, sizeof(sockaddr)) < 0)
{
perror("bind");
exit(1);
}
if (listen( s, 0 ) < 0)
{
perror("listen");
exit(1);
}
# endif
return( s );
}
void crash()
{
int i;
for(i=0; i<32; i++)
close(i);
exit(9);
}
\f
# ifdef MASSCOMP
/* accept() does not allocate a new socket on the Masscomps. Therefore we
** have to grab our own new socket and tell the client where it is.
*/
free_socket()
{
int s;
if ( ( s = socket( SOCK_STREAM, 0, 0, SO_ACCEPTCONN ) ) < 0 )
{
perror( "free_socket" );
crash();
}
return( s );
}
# endif