This is md_unix.c in view mode; [Download] [Up]
/*
* PCN Abstract Machine Emulator
* Authors: Steve Tuecke and Ian Foster
* Argonne National Laboratory
*
* Please see the DISCLAIMER file in the top level directory of the
* distribution regarding the provisions under which this software
* is distributed.
*
* md_unix.c - Machine dependent file for Unix systems
*/
#include "pcn.h"
#include <signal.h>
#ifdef PDB_HOST
static FILE *keyboard_fp;
#endif
static void abort_handler(i)
int i;
{
char buf[256];
#ifdef PDB
if (i == SIGINT && !_pdb_query_to_abort())
{
#ifdef iris
signal(SIGINT, abort_handler);
#endif
return;
}
#endif /* PDB */
sprintf(buf, "Aborting on signal %d", i);
_p_fatal_error(buf);
signal(i, SIG_DFL);
#if defined(PCN_SYSV)
sigrelse(i);
#else /* PCN_SYSV */
sigsetmask(0);
#endif /* PCN_SYSV */
kill(getpid(), i);
exit(1);
} /* abort_handler() */
#ifndef PCN_SYSV3_2
static void stop_handler(i)
int i;
{
if (i == SIGTSTP)
{
signal(SIGTSTP, SIG_DFL);
kill(getpid(), SIGTSTP);
}
else /* SIGCONT */
{
signal(SIGTSTP, stop_handler);
}
} /* stop_handler() */
#endif /* PCN_SYSV3_2 */
/*
* void _p_init_machine_dep()
*
* Initialize any machine dependencies.
*/
void _p_init_machine_dep()
{
#ifdef PDB_HOST
/* Set up for PDB keyboard input */
keyboard_fp = stdin;
#endif /* PDB_HOST */
if (!_p_no_signal_handlers)
{
#ifndef PCN_SYSV3_2
/*
signal(SIGTSTP, stop_handler);
signal(SIGCONT, stop_handler);
*/
#endif /* PCN_SYSV3_2 */
/* Set up the signal handlers for controlled crashes */
signal(SIGQUIT, abort_handler);
signal(SIGILL, abort_handler);
signal(SIGFPE, abort_handler);
signal(SIGBUS, abort_handler);
signal(SIGTERM, abort_handler);
signal(SIGINT, abort_handler);
#ifndef symmetry
/* The Sequent machines use SEGV to deal with shared memory */
signal(SIGSEGV, abort_handler);
#endif /* symmetry */
}
} /* _p_init_machine_dep() */
/*
* void _p_shutdown_machine_dep()
*
* Shutdown any machine dependencies.
*/
void _p_shutdown_machine_dep()
{
} /* _p_shutdown_machine_dep() */
/*
* void _p_abort_machine_dep()
*
* Shutdown any machine dependencies for an abortive exit.
*/
void _p_abort_machine_dep()
{
} /* _p_abort_machine_dep() */
#ifdef PDB_HOST
/*
* char *_p_fgets(char *buf, int buf_len)
*
* This function implements a blocking read of a single
* line of text from the keyboard (stdin normally).
* It is used by PDB to get an input line.
*
* It reads n-1 characters, or up through a newline character,
* whichever comes first, from the keyboard stream into the buffer
* 'buf'. The last character read into s is followed by a null
* character. (In other words, this function is like fgets()...)
*
* If EOF is encountered, then reset the keyboard_fp so that a
* future read from it will not automatically return EOF. In other
* words, this routine should return EOF -- but after returning
* EOF then it should go on as normal as if the EOF did not occur.
*
* Return: NULL upon EOF, otherwise 'buf'.
*/
char *_p_fgets(buf, buf_len)
char *buf;
int buf_len;
{
if (!_p_host)
{
return ((char *) NULL);
}
else
{
char *rc = fgets(buf, buf_len, keyboard_fp);
if (rc == (char *) NULL)
fseek(stdin, 2, 0L); /* Reset keyboard_fp */
return (rc);
}
} /* _p_fgets() */
#endif /* PDB_HOST */
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.