This is runpcn.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.
*
* runpcn.c - A wrapper program for running PCN on an iPSC/860.
*
* This program is meant to be run on an iPSC/860 host. It (optionally)
* does a getcube, loads the nodes with an emulator, and then shuts it all
* down cleanly. This program allows simple use of a node only emulator
* on the iPSC/860.
*
* There are two variables, 'default_name' and 'default_exe'. If an
* executable is not specified, then runpcn will try to use 'default_name'
* first, and if that doesn't exist then it will use 'default_exe'.
*
* To use the program, do a 'runpcn -h', which will yield something like:
Usage: runpcn [-t <cubetype>] [<name>] [<args> ...]
[-t <cubetype>] specifies the iPSC/860 cube type. If this
argument is used, runpcn will do a getcube before loading
the cube with the PCN emulator. <cubetype> is the same
for the getcube program. If this argument is left off
it is assumed that a getcube has already been done.
[<name>] is the name of the iPSC/860 node executable to use.
[<args> ...] is any PCN arguments to use.
*
*/
#include <stdio.h>
#include <signal.h>
#include "config.h"
char *default_name = "pcn.ipsc860";
char *default_exe = DEFAULT_EXE;
#ifndef TRUE
#define TRUE 1
#define FALSE 0
#endif
char run_buf[8192];
int did_getcube = FALSE;
void print_help();
void parse_rest();
void run_pcn();
mysystem(buf)
char *buf;
{
int rc;
#ifdef TEST
printf("Systeming off \"%s\"\n", buf);
#endif /* TEST */
rc = system(buf);
#ifdef TEST
printf("Return code for \"%s\" is %d\n", buf, rc);
#endif /* TEST */
if (rc != 0)
{
printf("Error: \"%s\" failed (system() return code of %d)\n", buf, rc);
if (did_getcube)
{
printf("Killing cube\n");
system("killcube");
system("relcube");
}
exit(1);
}
}
void int_handler(i)
int i;
{
#ifdef TEST
printf("In int_handler(%d)\n", i);
#endif /* TEST */
printf("Killing cube\n");
mysystem("killcube");
if (did_getcube)
mysystem("relcube");
exit(1);
}
int main(argc, argv)
int argc;
char *argv[];
{
signal(SIGINT, int_handler);
if (argc == 1)
{
parse_rest(argc, argv);
}
#ifdef RUNPCN
else if (strcmp(argv[1], "-h") == 0)
{
print_help();
}
else if (strncmp(argv[1], "-t", 2) == 0) /* argument to getcube */
{
if (strlen(argv[1]) == 2) /* -t <stuff> */
{
if (argc < 3)
{
print_help();
exit(1);
}
did_getcube = TRUE;
sprintf(run_buf, "getcube -t %s", argv[2]);
mysystem(run_buf);
parse_rest(argc - 2, &argv[2]);
mysystem("relcube");
}
else /* -t<stuff> */
{
did_getcube = TRUE;
sprintf(run_buf, "getcube -t %s", argv[1] + 2);
mysystem(run_buf);
parse_rest(argc - 1, &argv[1]);
mysystem("relcube");
}
}
#endif /* RUNPCN */
else /* No -t argument: getcube was done outside of program */
{
parse_rest(argc, argv);
}
return(0);
}
void parse_rest(argc, argv)
int argc;
char *argv[];
{
#ifdef RUNPCN
if (argc == 1 || argv[1][0] == '-') /* use default name */
{
#endif /* RUNPCN */
if (access(default_name, 4) == 0)
{
/* Use the node executable in this directory */
argv[0] = default_name;
}
else if (access(default_exe, 4) == 0)
{
/* Use the default node executable */
argv[0] = default_exe;
}
else
{
fprintf(stderr, "Cannot find: %s\n", default_name);
fprintf(stderr, " or: %s\n", default_exe);
exit(1);
}
run_pcn(argc, argv);
#ifdef RUNPCN
}
else /* executable name supplied as an argument */
{
run_pcn(argc - 1, &argv[1]);
}
#endif /* RUNPCN */
}
void run_pcn(argc, argv)
int argc;
char *argv[];
{
int i;
run_buf[0] = '\0';
strcat(run_buf, "load ");
for (i = 0; i < argc - 1; i++)
{
strcat(run_buf, argv[i]);
strcat(run_buf, " ");
}
strcat(run_buf, argv[argc-1]);
strcat(run_buf, "; waitcube");
printf("Doing load: \"%s\"\n", run_buf);
mysystem(run_buf);
#ifdef TEST
printf("Sleeping... ");
fflush(stdout);
sleep(5);
printf("done\n");
fflush(stdout);
#endif /* TEST */
/*
mysystem("waitcube");
*/
printf("Killing cube\n");
mysystem("killcube");
}
void print_help()
{
printf("Usage: runpcn [-t <cubetype>] [<name>] [<args> ...]\n");
printf("\t[-t <cubetype>] specifies the iPSC/860 cube type. If this\n");
printf("\t\targument is used, runpcn will do a getcube before loading\n");
printf("\t\tthe cube with the PCN emulator. <cubetype> is the same\n");
printf("\t\tfor the getcube program. If this argument is left off\n");
printf("\t\tit is assumed that a getcube has already been done.\n");
printf("\t[<name>] is the name of the iPSC/860 node executable to use.\n");
printf("\t[<args> ...] is any PCN arguments to use.\n");
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.