/*
 *	File:			robot_main.c
 *	Purpose:		Generic main routine for robot card game clients.
 *	Functions:		client_play, main, robot_exit, talk.
 *	Created:		23 Jun 89
 *	Last Modified:	03 Aug 93
 *	Comments:
 *		Must fix hardcoded server machine name.
 *
 *	History:
 *		23 Jun 89/JVE	Cloned from client_main.c.
 *		29 Sep 89/JVE	Use FD_SET macros.
 *		23 Nov 89/JVE	Use environment var ROBOT_NAME.
 *		25 Nov 89/JVE	Added call to strategy_init().
 *		15 Jun 90/JVE	Made "myname" a global.
 *		18 Jun 90/JVE	Added robot_exit() function to handle SIGTERM.
 *		02 Jan 91/JVE	Changed hard-coded hostname from jeffv to cinnamon.
 *		02 Oct 91/JVE	SIGINT -> robot_exit(), had robot_exit() send QUIT.
 *		29 Nov 91/JVE	Moved talk() here.
 *		31 Mar 93/JVE	Ported to AmigaDOS.
 *		03 Aug 93/JVE	Undefine getenv() to use our version.
 */

# include	<stdio.h>
# include	<stdlib.h>
# include	<string.h>
# include	<signal.h>
# if _AMIGA
# undef getenv				/* use our version which checks for locals */
# endif
# include	"standard.h"
# include	"ipc.h"
# include	"local.h"
# include	"commands.h"
# include	"robot.h"
# include	"robot_main_protos.h"
# include	"strategy_protos.h"

/*
 *	Remember my name.
 */

char			*myname;

/*
 *	IPC port to server.  Global so exit function can release it.
 */

static PORT		from_server = -1;
static PORT		to_server = -1;

void			client_play(PORT to_server, PORT from_server);
void			robot_exit(void);


main( argc, argv )

int		argc;
char	**argv;

{
IPC_ADDRESS			addr;		/* put servers address here for connect call */

# ifdef sun
signal( SIGXCPU, SIG_IGN );		/* we expect to be running for a long time */
signal( SIGHUP, SIG_IGN );
signal( SIGPIPE, SIG_IGN );		/* in case server shuts down or dies */
# endif
signal( SIGTERM, robot_exit );	/* close politely on owner's signal */
signal( SIGINT, robot_exit );	/* close politely on owner's signal */
setvbuf( stdout, NULL, _IOLBF, BUFSIZ );
setvbuf( stderr, NULL, _IOLBF, BUFSIZ );

/*
 *	Now connect to the server.
 */

addr.host_name = "cinnamon";
addr.handle = TEMPORARY;
if ( ipc_connect( addr, &to_server, &from_server ) != ERROR )
	client_play( to_server, from_server );

robot_exit();
}


/****************************************************************************/
/*	FUNCTION:	client_play													*/
/*																			*/
/*	PURPOSE:	Plays the game, from the client's side.						*/
/*																			*/
/*	INPUT PARAMETERS:														*/
/*		NAME		I/O		DESCRIPTION										*/
/*		----		---		-----------										*/
/*		to_server	 I		IPC port to talk to server.						*/
/*		from_server	 I		IPC port to listen to server.					*/
/*																			*/
/*	RETURNS:																*/
/*																			*/
/*	COMMENTS:																*/
/*																			*/
/*	HISTORY:																*/
/*		1.	01 Jan 89		Created.										*/
/*		2.	22 Jun 89		Use user id and environment variable for name.	*/
/*		3.	29 Sep 89		Use FD_SET macros.								*/
/*		4.	23 Nov 89		Use environment var ROBOT_NAME.					*/
/*																			*/
/****************************************************************************/

void client_play( PORT to_server, PORT from_server )

{
fd_set		readfds;
char		s[MAXLINE];
int			len;

if ( ( myname = getenv( "ROBOT_NAME" ) ) == NULLP( char ) )
	myname = MYNAME;
if ( strategy_init() )
	sprintf( s, "PLAY:-2:%s", myname );
else
	sprintf( s, "WATCH:-2:%s", myname );
ipc_sends( to_server, s );
FD_ZERO( &readfds );
FD_SET( (int) from_server, &readfds );
while ( ipc_wait( &readfds ) > 0 )
	{
	if ( FD_ISSET( (int) from_server, &readfds ) )
		{
		if ( ( len = ipc_recvs( from_server, s, MAXLINE ) ) <= 0 )
			{
			perror( "server recv" );
			break;
			}
		do_server_cmd( to_server, s );
		}
	FD_ZERO( &readfds );
	FD_SET( (int) from_server, &readfds );
	}
}


/****************************************************************************/
/*	FUNCTION:	robot_exit													*/
/*																			*/
/*	PURPOSE:	Exit the robot program.										*/
/*																			*/
/*	INPUT PARAMETERS:														*/
/*		NAME		I/O		DESCRIPTION										*/
/*		----		---		-----------										*/
/*																			*/
/*	RETURNS: none															*/
/*																			*/
/*	COMMENTS:																*/
/*																			*/
/*	HISTORY:																*/
/*		1.	18 Jun 90		Created.										*/
/*																			*/
/****************************************************************************/

void robot_exit(void)

{
if ( to_server != -1 )
	{
	ipc_sends( to_server, QUIT );
	ipc_release( to_server );
	ipc_release( from_server );
	}
exit( 0 );
}

/*
 ***********************************************************************
 *
 * FUNCTION NAME:	talk
 *
 * DESCRIPTION:		Send a message.
 *
 * PARAMETERS: 
 *		NAME		I/O		DESCRIPTION
 *		----		---		-----------
 *		text		 I		Text to be sent.
 *
 * RETURN CODES: 
 *
 * COMMENTS:
 *
 **********************************************************************
 */

void		talk( text )

char		*text;

{
char		msg[MAXLINE];

sprintf( msg, "%s:%s\n", SAY, text );
(void) ipc_sends( to_server, msg );
}
