aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/sman/ChangeLog13
-rw-r--r--src/sman/Makefile.in31
-rw-r--r--src/sman/Makefile.pamphlet39
-rw-r--r--src/sman/nagman.c.pamphlet636
-rw-r--r--src/sman/session.c (renamed from src/sman/session.c.pamphlet)254
-rw-r--r--src/sman/sman.c (renamed from src/sman/sman.c.pamphlet)489
-rw-r--r--src/sman/sman.h54
7 files changed, 266 insertions, 1250 deletions
diff --git a/src/sman/ChangeLog b/src/sman/ChangeLog
index a5722d5f..98482cdd 100644
--- a/src/sman/ChangeLog
+++ b/src/sman/ChangeLog
@@ -1,3 +1,16 @@
+2007-12-05 Gabriel Dos Reis <gdr@cs.tamu.edu>
+
+ * Makefile.pamphlet: Remove rules for extracting files from
+ pamphlets.
+ (%.lo): Adjust include directory.
+ (mostlyclean-local): Don't remove source files and headers.
+ * nagman.c.pamphlet: Remove.
+ * session.c.pamphlet: Likewise.
+ * sman.c.pamphlet: Likewise.
+ * sessions.c: New.
+ * sman.h: Likewise.
+ * sman.c: Likewise.
+
2007-09-13 Alfredo Portes <alfredo.portes@gmail.com>
Waldek Hebisch <hebisch@math.uni.wroc.pl>
diff --git a/src/sman/Makefile.in b/src/sman/Makefile.in
index ca0b270f..edd36314 100644
--- a/src/sman/Makefile.in
+++ b/src/sman/Makefile.in
@@ -16,25 +16,22 @@ bin_PROGRAMS = session$(EXEEXT) \
libspad_la = $(axiom_target_libdir)/libspad.la
-session_sources = session.c
-session_SOURCES = $(addsuffix .pamphlet, $(session_sources))
-session_objects = $(session_sources:.c=.lo)
+session_SOURCES = session.c
+session_objects = $(session_SOURCES:.c=.lo)
session_LDADD = $(libspad_la) @axiom_c_runtime_extra@
session_DEPENDENCIES =
-spadclient_sources = spadclient.c
-spadclient_objects = $(spadclient_sources:.c=.lo)
+spadclient_SOURCES = spadclient.c
+spadclient_objects = $(spadclient_SOURCES:.c=.lo)
spadclient_LDADD = $(libspad_la) @axiom_c_runtime_extra@
spadclient_DEPENDENCIES =
-sman_sources = sman.c
-sman_SOURCES = $(addsuffix .pamphlet, $(sman_sources))
-sman_objects = $(sman_sources:.c=.lo)
+sman_SOURCES = sman.c
+sman_objects = $(sman_SOURCES:.c=.lo)
sman_LDADD = $(libspad_la) @axiom_c_runtime_extra@
sman_DEPENDENCIES =
-pamphlets = $(session_SOURCES) $(sman_SOURCES)
.PHONY: all all-sman
@@ -51,14 +48,9 @@ stamp: $(OUTLIB)/session$(EXEEXT) \
.SUFFIXES:
.SUFFIXES: .c .h .lo .$(OBJEXT)
.PRECIOUS: %.lo %.obj
-.PRECIOUS: %.c
-.PRECIOUS: %.h
%.lo: %.c
- $(COMPILE) ${CCF} -o $@ $(axiom_includes) -I$(builddir) $<
-
-%.c: $(srcdir)/%.c.pamphlet
- $(axiom_build_document) --tangle --output=$@ $<
+ $(COMPILE) ${CCF} -o $@ $(axiom_includes) -I$(srcdir) $<
${OUTLIB}/session$(EXEEXT): $(session_objects) $(session_DEPENDENCIES)
$(LINK) -o $@ $(session_objects) $(session_LDADD) ${LDF}
@@ -74,13 +66,10 @@ ${OUT}/sman$(EXEEXT): $(sman_objects) $(sman_DEPENDENCIES)
$(sman_objects): sman.h $(axiom_c_macros_h)
-sman.h: $(srcdir)/sman.c.pamphlet
- $(axiom_build_document) --tangle=$@ --output=$@ $<
-
mostlyclean-local:
- @rm -f $(session_sources) $(session_objects) sman.h
- @rm -f $(spadclient_sources) $(session_objects)
- @rm -f $(sman_sources) $(sman_objects)
+ @rm -f $(session_objects) sman.h
+ @rm -f $(session_objects)
+ @rm -f $(sman_objects)
clean-local: mostlyclean-local
@rm -f $(OUTLIB)/session$(EXEEXT)
diff --git a/src/sman/Makefile.pamphlet b/src/sman/Makefile.pamphlet
index db980d94..d7a50858 100644
--- a/src/sman/Makefile.pamphlet
+++ b/src/sman/Makefile.pamphlet
@@ -34,25 +34,22 @@ bin_PROGRAMS = session$(EXEEXT) \
libspad_la = $(axiom_target_libdir)/libspad.la
-session_sources = session.c
-session_SOURCES = $(addsuffix .pamphlet, $(session_sources))
-session_objects = $(session_sources:.c=.lo)
+session_SOURCES = session.c
+session_objects = $(session_SOURCES:.c=.lo)
session_LDADD = $(libspad_la) @axiom_c_runtime_extra@
session_DEPENDENCIES =
-spadclient_sources = spadclient.c
-spadclient_objects = $(spadclient_sources:.c=.lo)
+spadclient_SOURCES = spadclient.c
+spadclient_objects = $(spadclient_SOURCES:.c=.lo)
spadclient_LDADD = $(libspad_la) @axiom_c_runtime_extra@
spadclient_DEPENDENCIES =
-sman_sources = sman.c
-sman_SOURCES = $(addsuffix .pamphlet, $(sman_sources))
-sman_objects = $(sman_sources:.c=.lo)
+sman_SOURCES = sman.c
+sman_objects = $(sman_SOURCES:.c=.lo)
sman_LDADD = $(libspad_la) @axiom_c_runtime_extra@
sman_DEPENDENCIES =
-pamphlets = $(session_SOURCES) $(sman_SOURCES)
@
\section{session}
@@ -61,14 +58,6 @@ ${OUTLIB}/session$(EXEEXT): $(session_objects) $(session_DEPENDENCIES)
$(LINK) -o $@ $(session_objects) $(session_LDADD) ${LDF}
@
-\section{nagman}
-Note that we do not build the nagman component as we do not have the
-necessary code (for instance, [[callnag]]).
-<<nagman>>=
-${OUT}/nagman$(EXEEXT): $(nagman_objects) $(nagman_DEPENDENCIES)
- $(LINK) -o $@ $(nagman_objects) $(nagman_LDADD) ${LDF}
-@
-
\section{spadclient}
<<spadclient>>=
${OUTLIB}/spadclient$(EXEEXT): $(spadclient_objects) $(spadclient_DEPENDENCIES)
@@ -84,9 +73,6 @@ ${OUT}/sman$(EXEEXT): $(sman_objects) $(sman_DEPENDENCIES)
$(LINK) -o $@ $(sman_objects) $(sman_LDADD) ${LDF}
$(sman_objects): sman.h $(axiom_c_macros_h)
-
-sman.h: $(srcdir)/sman.c.pamphlet
- $(axiom_build_document) --tangle=$@ --output=$@ $<
@
<<*>>=
@@ -110,14 +96,9 @@ stamp: $(OUTLIB)/session$(EXEEXT) \
.SUFFIXES:
.SUFFIXES: .c .h .lo .$(OBJEXT)
.PRECIOUS: %.lo %.obj
-.PRECIOUS: %.c
-.PRECIOUS: %.h
%.lo: %.c
- $(COMPILE) ${CCF} -o $@ $(axiom_includes) -I$(builddir) $<
-
-%.c: $(srcdir)/%.c.pamphlet
- $(axiom_build_document) --tangle --output=$@ $<
+ $(COMPILE) ${CCF} -o $@ $(axiom_includes) -I$(srcdir) $<
<<session>>
@@ -126,9 +107,9 @@ stamp: $(OUTLIB)/session$(EXEEXT) \
<<sman>>
mostlyclean-local:
- @rm -f $(session_sources) $(session_objects) sman.h
- @rm -f $(spadclient_sources) $(session_objects)
- @rm -f $(sman_sources) $(sman_objects)
+ @rm -f $(session_objects)
+ @rm -f $(session_objects)
+ @rm -f $(sman_objects)
clean-local: mostlyclean-local
@rm -f $(OUTLIB)/session$(EXEEXT)
diff --git a/src/sman/nagman.c.pamphlet b/src/sman/nagman.c.pamphlet
deleted file mode 100644
index c8db5f61..00000000
--- a/src/sman/nagman.c.pamphlet
+++ /dev/null
@@ -1,636 +0,0 @@
-\documentclass{article}
-\usepackage{axiom}
-\begin{document}
-\title{\$SPAD/src/sman nagman.c}
-\author{The Axiom Team}
-\maketitle
-\begin{abstract}
-\end{abstract}
-\eject
-\tableofcontents
-\eject
-\section{nag.x}
-<<nag.x>>=
-
-/*
- * msg.x: Remote message printing protocol
- */
-const MAXASP = 10;
-
-/*
- * the nago structure is essentially a variable length string
- */
-
-struct nago {
- opaque z <>;
- };
-struct nagerr {
-nago p;
-nago q;
-};
-
-struct host{
-nago h <>;
-};
-
-struct nagst {
-
-/* Okay, if you understand this bit you know the essentials of how the link
- * works. h <> is an array of nago, which is an array of fortran source
- * code, the length of the array being the no. of asps (0 for most routines).
- * y is the actual (XDR) input data for the routine. nm is the name of the
- * routine. id is a tag identifying the host/axiom session. Finally per is a
- * number telling whether or not to erase old fortran files on the remote
- * machine (persistence - the number per distinct fortran files will be
- * stored, any more than this and earlier ones will be deleted.
- */
-
- nago h <>;
- nago y;
- nago nm;
- nago id;
- int per;
- };
-program NAGPROG {
- version NAGVERS {
- nagerr CALLNAG(nagst) = 1;
- nago NAGMON(int)=2;
- void AXEND(nago)=3;
- } = 1;
-/*
- * the following number is very important. It tells the
- * portmapper what number to register the nag daemon under.
- * There are rules about which number to pick - check SUN
- * technical info for more details
- */
-} = 100088;
-
-
-@
-\section{nagman}
-\subsection{includes}
-<<includes>>=
-#include "axiom-c-macros.h"
-#include "useproto.h"
-#include <unistd.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-#include <termios.h>
-#include <signal.h>
-#include <sys/time.h>
-#include <sys/stat.h>
-#include <sys/socket.h>
-#include <sys/un.h>
-#include <rpc/rpc.h> /* always needed */
-#include <fcntl.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <netdb.h>
-#include "nag.h" /* generated by rpcgen */
-#include "com.h"
-#include "bsdsignal.h"
-#include "sockio-c.H1"
-#include "bsdsignal.H1"
-#include "nagman.H1"
-
-@
-\subsection{variables}
-<<variables>>=
-#ifdef ALPHAplatform
-extern int getdomainname( char *, int );
-#endif
-#ifdef SUN4OS5platform
-extern int getdomainname( char *, int );
-extern int gethostname( char *, int );
-#endif
-
-#ifdef _NO_PROTO
-nagerr * callnag_1();
-nago * nagmon_1();
-void * axend_1();
-#else
-nagerr * callnag_1(nagst *,CLIENT *);
-nago * nagmon_1(int *,CLIENT *);
-void * axend_1(nago *,CLIENT *);
-#endif
-
-#define DO 1
-#define DONT 0
-
-int hnum, vmax;
-char *datafile, *resultsfile;
-
-struct hostnode {
- char * name;
- struct hostnode *next;
-} *hlist=NULL;
-
-nagst nag4;
-Sock *sock1;
-
-@
-\subsection{term}
-this code runs when the user quits axiom. before nagman dies, it does
-an rpc call to nagd to tell it to get rid of files etc. The rpc call in
-question is [[axend_1]]
-we also send a USR1 to sman to beget another nagman
-<<term>>=
-static void
-#ifdef _NO_PROTO
-term(sig)
- int sig;
-#else
-term(int sig)
-#endif
-{
- CLIENT *cld;
- void *res;
- struct hostnode *pnode;
-
-#ifndef HP9platform /* can't figure out a way to do this on HP/UX 9 */
- kill(atoi(getenv("SPADNUM")) , SIGUSR1);
-#endif
-
-
- if(hnum!=0)
- {
- unlink(datafile);
- unlink(resultsfile);
- }
-
- for(pnode=hlist;pnode!=NULL;pnode=pnode->next)
- {
- cld=clnt_create(pnode->name,NAGPROG, NAGVERS, "tcp");
- if (cld == NULL)
- goto NOHOST;
-
- res=axend_1(&(nag4.id),cld);
- NOHOST:
- clnt_destroy(cld);
- }
- exit(0);
-}
-
-@
-\subsection{size\_of\_file}
-<<sizeoffile>>=
-static long
-#ifdef _NO_PROTO
-size_of_file(filename)
- char *filename;
-#else
-size_of_file(char *filename)
-#endif
-{
- struct stat buf_stat;
-
- stat(filename,&buf_stat);
- return (buf_stat.st_size);
-
-}
-
-@
-\subsection{rpcloop}
-<<rpcloop>>=
-static void
-#ifdef _NO_PROTO
-rpcloop()
-#else
-rpcloop(void)
-#endif
-{
- CLIENT *cl;
- int res,j,v=0,u,showMessage;
- long i;
- register struct hostent *alias1, *alias2;
- struct in_addr *addrnum;
- u_long junk;
- struct timeval tv;
- nagerr *result;
- char *Buf , *buf1;
- char *ffile[MAXASP];
- char routine[12], naghost[256];
- FILE *nfp1, *nfp2, *nfp3;
- struct hostnode *phost;
- int fd;
-
- for (;;)
- {
-
- if((Buf=get_string(sock1))==NULL) term(1); /* one string carries all */
-
- if(hnum!=0)
- {
- /* call parameters */
- free(nag4.nm.z.z_val); /* the routine name */
- free(nag4.y.z.z_val); /* the XDR data */
- for(i=0;i<v;i++)
- {
- unlink(ffile[i]);
- free(ffile[i]); /* the asp filenames */
- free(nag4.h.h_val[i].z.z_val); /* the asps themselves*/
- }
- free(nag4.h.h_val); /* the asps array */
- unlink(datafile);
- unlink(resultsfile);
- free(resultsfile);
- free(datafile);
- vmax= (v>vmax)? v : vmax;
- }
-
-
-
-
- buf1=strtok(Buf," ");
- if (buf1) strcpy(naghost,buf1);
- else printf("can't parse the naghost\n");
- /* INFO printf("%s\n",naghost);*/
-
- buf1=strtok(NULL," ");
- if (buf1) strcpy(routine,buf1);
- else printf("can't parse the routine\n");
- /* INFO printf("%s\n",routine);*/
-
- /* make copy of filenames because we will reuse Buf before deleting the files*/
- buf1=strtok(NULL," ");
- if (buf1) resultsfile=strdup(buf1);
- else printf("can't parse the resultsfile file\n");
- /* INFO printf("%s\n",resultsfile);*/
-
- buf1=strtok(NULL," ");
- if (buf1) datafile=strdup(buf1);
- else printf("can't parse the datafile file\n");
- /* INFO printf("%s\n",datafile);*/
-
- buf1=strtok(NULL," ");
- if (buf1) nag4.per=atoi(buf1);
- else printf("can't parse the persistence\n");
- /* INFO printf("%d\n",nag4.per);*/
-
- buf1=strtok(NULL," ");
- if (buf1) {
- if (!strcmp(buf1,"on")) showMessage=DO;
- else showMessage=DONT;
- }
- else printf("can't parse the messages flag\n");
- /* INFO printf("%s\n",buf1);*/
-
- v=0; /* asp counter */
- while( (buf1=strtok(NULL," ")) )
- {
- ffile[v++]=strdup(buf1);
- /* INFO printf("%s\n",ffile[v-1]);*/
- }
-
- /* INFO printf("number of asps seen %d\n",v);*/
-
- if(showMessage==DO) printf("nagman:acknowledging request for %s\n",routine);
-
- res=0; /* prepare result integer to be sent to Lisp */
-
- if((nfp3=fopen(resultsfile,"w"))==NULL)
- {
- printf("can't open output file\n");
- goto END;
- }
-
- /* nag4.h is the XDR array of asp text */
- nag4.h.h_len=v;
- nag4.h.h_val=(nago *)malloc((v)*sizeof(nago));
-
-
- /* get asp text in call argument */
- for(u=0;u<v;u++)
- {
- /* this should be done by mmap */
- if((nfp1=fopen(ffile[u],"r"))==NULL)
- {
- fprintf(stderr,"can't open asp file %s\n",ffile[u]);
- fclose(nfp1);
- goto END;
- }
- fclose(nfp1);
- i=size_of_file(ffile[u]);
-
- /* allocs memory for the file */
- nag4.h.h_val[u].z.z_val= (char *)malloc((i+1)*sizeof(char));
-
- fd=open(ffile[u],O_RDONLY);
- read(fd,nag4.h.h_val[u].z.z_val,i);
- close(fd);
- /* make null-term. string */
- nag4.h.h_val[u].z.z_val[i]='\0';
- /* set the length */
- nag4.h.h_val[u].z.z_len=strlen(nag4.h.h_val[u].z.z_val);
- }
-
-
- nag4.nm.z.z_val=strdup(routine);
- nag4.nm.z.z_len=strlen(routine);
-
- /* get XDR data in call argument */
- /* should be done by mmap */
- if((nfp2=fopen(datafile,"r"))==NULL)
- {
- fprintf(stderr,"can't open data file\n");
- fclose(nfp2);
- goto END;
- }
-
- fclose(nfp2);
- i=size_of_file(datafile);
- nag4.y.z.z_val=(char *)malloc(i*sizeof(char));
-
- fd=open(datafile,O_RDONLY);
- read(fd,nag4.y.z.z_val,i);
- close(fd);
- nag4.y.z.z_len=i;
-
-
- /*
- * Create client "handle" used for calling MESSAGEPROG on
- * the server designated on the command line. We tell
- * the RPC package to use the "tcp" protocol when
- * contacting the server.
- */
-
- /* update naghost by lookup */
-
- if ((junk = inet_addr(naghost))!=-1)
- {
- addrnum=(struct in_addr *)junk;
- if((alias2=gethostbyaddr((char *)&addrnum,
- sizeof(addrnum),
- AF_INET))!=NULL)
- strcpy(naghost,alias2->h_name);
- else
- if((alias1=gethostbyname(naghost))!=NULL)
- strcpy(naghost,alias1->h_name);
- }
- else
- if((alias1=gethostbyname(naghost))!=NULL)
- strcpy(naghost,alias1->h_name);
-
-
-
-
- cl = clnt_create(naghost, NAGPROG, NAGVERS, "tcp");
- if (cl == NULL)
- {
- /*
- * Couldn't establish connection with server.
- * Print error message and die.
- */
- clnt_pcreateerror(naghost);
- goto END;
- }
- else
- if (showMessage==DO)
- printf("nagman:connection successful to %s\n",naghost);
-
- /*
- * this number here sets the "timeout" for the rpc call. after this number
- * of seconds, the call will quit if no response is received
- *
- */
-
- tv.tv_sec=1000000;
- tv.tv_usec=0;
- clnt_control(cl,CLSET_TIMEOUT,(char *)&tv);
-
-
- result = callnag_1(&nag4, cl);
-
- for(phost=hlist;phost!=NULL;phost=phost->next)
- {
- /*
- * hlist is the "hostlist" of sites that have been contacted by nagman.
- * here we check if this call is contacting a new site, and if so add it
- * to the hostlist
- *
- */
-
- if(!strcmp(phost->name,naghost))
- goto SKIP;
- }
-
- if(hnum==0) {
- hlist=(struct hostnode *)malloc(sizeof(struct hostnode));
- hlist->name=strdup(naghost);
- hlist->next=NULL;
- }
-
- else {
- phost=(struct hostnode *)malloc(sizeof(struct hostnode));
- phost->name=strdup(naghost);
- phost->next=hlist;
- hlist=phost;
- }
- hnum++;
-
-
- SKIP:
- if (result == NULL)
- {
- /*
- * An error occurred while calling the server.
- * Print error message and die.
- */
- if (showMessage==DO)
- printf("nagman:no results (error) from %s\n",naghost);
- clnt_perror(cl,naghost);
- clnt_destroy(cl);
- goto END;
- }
-
- /*
- * (*result).p is the part of the result with the XDRed results in it
- * (numbers). (*result).q is the part with (text) error messages that
- * have come from the NAG library. If there is neither an XDR result,
- * nor a text error message from the library, then something is wrong
- * so we just print out the "no result or error returned" message.
- *
- */
-
- else if ((*result).p.z.z_len==0)
- {
- if((*result).q.z.z_len==0)
- {
- if (showMessage==DO)
- printf("nagman:empty result (error) from %s\n",naghost);
- clnt_destroy(cl);
- goto END;
- }
- else
- {
- if (showMessage==DO)
- printf("nagman:receiving results from %s\n\n",naghost);
- for(j=0;j<(*result).q.z.z_len;j++)
- printf("%c",(*result).q.z.z_val[j]);
- clnt_destroy(cl);
- goto END;
- }
- }
- else
- if (showMessage==DO)
- printf("nagman:receiving results from %s\n\n",naghost);
-
- if (showMessage==DO)
- fwrite(result->q.z.z_val,sizeof(char),result->q.z.z_len,stdout);
-
- /*INFO printf("\nRESULTS of length %d\n",(*result).p.z.z_len);*/
-
- fwrite(result->p.z.z_val,sizeof(char),result->p.z.z_len, nfp3);
- res=1;
- clnt_destroy(cl);
-
- /*
- * in case of any type of error, a goto END in the above code causes
- * nagman to skip here and return to AXIOM
- *
- */
-
-
- END:
- fclose(nfp3);
- /*
- * if everything has gone alright, send_int returns the integer res=1. If
- * not it returns res=0. This is detected by the boot code which acts
- * accordingly.
- */
- send_int(sock1,res);
- free(Buf);
- }
-
-
-}
-
-@
-\subsection{catchSignals}
-catchSignals sets up signal handling. If nagman gets a sigterm it does not
-die but goes back to rpcloop
-<<catchSignals>>=
-static void
-#ifdef _NO_PROTO
-catchSignals()
-#else
-catchSignals(void)
-#endif
-{
- bsdSignal(SIGTERM,term,RestartSystemCalls);
- bsdSignal(SIGSEGV,term,RestartSystemCalls);
-}
-
-@
-\subsection{main}
-<<main>>=
-void
-#ifdef _NO_PROTO
-main(argc,argv)
-int argc;
-char **argv;
-#else
-main(int argc,char **argv)
-#endif
-{
- char this[256],*hname,*dname,*spadnum;
- int stat;
-
- catchSignals();
- stat=gethostname(this,256);
- if (stat!=0) perror("gethostname");
- hname=strdup(this);
-
- stat=getdomainname(this,256);
- if (stat!=0) perror("getdomainname");
- dname=strdup(this);
- spadnum=getenv("SPADNUM");
- if (spadnum==0) {
- fprintf(stderr,"nagman error: SPADNUM is not in the environment\n");
- exit(0);
- }
-
- /* some machines return a full name from hostname
- need to check hname has a . in it */
-
- if (strchr(hname,'.'))
- /* '.' found */
- sprintf(this,"%s_%i",hname,atoi(spadnum));
- else
- /* substring not found */
- sprintf(this,"%s.%s_%i",hname,dname,atoi(spadnum));
-
- /* this must contain the Internet address of the current host */
- nag4.id.z.z_val=strdup(this);
- nag4.id.z.z_len=strlen(nag4.id.z.z_val);
- hnum=0;
- vmax=0;
- /*
- * this line sets up a socket for communication with the lisp
- */
-
- sock1 = connect_to_local_server(SpadServer, DebugWindow, 120 /*seconds*/);
- if (!sock1) exit(0);
-
- rpcloop();
-}
-
-@
-\subsection{nagman}
-<<nagman>>=
-#define _NAGMAN_C
-<<includes>>
-<<variables>>
-<<term>>
-<<sizeoffile>>
-<<rpcloop>>
-<<catchSignals>>
-<<main>>
-@
-\section{License}
-<<license>>=
-/*
-Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd.
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- - Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-
- - Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in
- the documentation and/or other materials provided with the
- distribution.
-
- - Neither the name of The Numerical ALgorithms Group Ltd. nor the
- names of its contributors may be used to endorse or promote products
- derived from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
-IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
-PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
-OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-@
-<<*>>=
-<<license>>
-<<nagman>>
-@
-\eject
-\begin{thebibliography}{99}
-\bibitem{1} nothing
-\end{thebibliography}
-\end{document}
diff --git a/src/sman/session.c.pamphlet b/src/sman/session.c
index 8b6f3e92..1294fe1a 100644
--- a/src/sman/session.c.pamphlet
+++ b/src/sman/session.c
@@ -1,17 +1,42 @@
-\documentclass{article}
-\usepackage{axiom}
-\begin{document}
-\title{\$SPAD/src/sman session.c}
-\author{The Axiom Team}
-\maketitle
-\begin{abstract}
-\end{abstract}
-\eject
-\tableofcontents
-\eject
-\section{session}
-\subsection{includes}
-<<includes>>=
+/*
+ Copyright (c) 1991-2002, The Numerical Algorithms Group Ltd.
+ All rights reserved.
+
+ Copyright (C) 2007, Gabriel Dos Reis.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ - Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ - Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+
+ - Neither the name of The Numerical ALgorithms Group Ltd. nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+ OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/* #define DEBUG */
+#define _SESSION_C
+
#include "axiom-c-macros.h"
#include <stdlib.h>
#include <sys/time.h>
@@ -27,42 +52,31 @@
#include "bsdsignal.H1"
#include "session.H1"
-@
-\subsection{variables}
-<<variables>>=
-#define BufSize 4096 /* size of communication buffer */
+#define BufSize 4096 /* size of communication buffer */
typedef struct sock_list { /* linked list of Sock */
Sock Socket;
struct sock_list *next;
} Sock_List;
-Sock *spad_io = (Sock *) 0; /* to_server socket for SessionIO */
+Sock *spad_io = (Sock *) 0; /* to_server socket for SessionIO */
Sock *spad_server = (Sock *) 0; /* to_server socket for SpadServer */
-Sock *menu_client = (Sock *) 0; /* to_client socket for MenuServerName */
+Sock *menu_client = (Sock *) 0; /* to_client socket for MenuServerName */
Sock *active_session = (Sock *) 0; /* pointer to currently active session */
Sock_List *plSock = (Sock_List *) 0;
-char big_bad_buf[BufSize]; /* big I/O buffer */
-int num_active_clients = 0; /* number of InterpWindows attached */
+char big_bad_buf[BufSize]; /* big I/O buffer */
+int num_active_clients = 0; /* number of InterpWindows attached */
int reading_output = 0;
fd_set session_socket_mask;
-@
-\subsection{usr1\_handler}
-<<usr1handler>>=
static void
usr1_handler(int sig)
{
return;
}
-@
-\subsection{usr2\_handler}
-SIGUSR2 is generated by spadclients.
-We interpret it as an interrupt for the Lisp.
-<<usr2handler>>=
static void
usr2_handler(int sig)
{
@@ -70,18 +84,12 @@ usr2_handler(int sig)
return;
}
-@
-\subsection{term\_handler}
-<<termhandler>>=
static void
term_handler(int sig)
{
exit(1);
}
-@
-\subsection{pr}
-<<pr>>=
static void
pr()
{
@@ -94,9 +102,6 @@ pr()
fprintf(stderr,"\n");
}
-@
-\subsection{close\_client}
-<<closeclient>>=
static void
close_client(int frame)
{
@@ -143,25 +148,25 @@ fprintf(stderr,"trying to clear %u\n",socket_fd);
else {
for (pSock=plSock; pSock->next != (Sock_List *) 0 ; pSock=pSock->next)
if (pSock->next->Socket.frame == frame){
- socket_fd = pSock->next->Socket.socket;
- send_signal((Sock *)pSock->next, SIGTERM);
- if ( menu_client != (Sock *) 0){
- send_int(menu_client,CloseClient);
- send_int(menu_client,(*plSock).Socket.pid);
- }
+ socket_fd = pSock->next->Socket.socket;
+ send_signal((Sock *)pSock->next, SIGTERM);
+ if ( menu_client != (Sock *) 0){
+ send_int(menu_client,CloseClient);
+ send_int(menu_client,(*plSock).Socket.pid);
+ }
#ifdef DEBUG
fprintf(stderr,"trying to clear %u\n",socket_fd);
#endif
- FD_CLR(socket_fd,&session_socket_mask);
- locSock = pSock->next;
- if ( pSock->next->next == (Sock_List *) 0 )
- { pSock->next= (Sock_List *) 0;}
- else
- { pSock->next = pSock->next->next;}
- num_active_clients--;
- active_session = (Sock *) 0;
- free(locSock);
- break;
+ FD_CLR(socket_fd,&session_socket_mask);
+ locSock = pSock->next;
+ if ( pSock->next->next == (Sock_List *) 0 )
+ { pSock->next= (Sock_List *) 0;}
+ else
+ { pSock->next = pSock->next->next;}
+ num_active_clients--;
+ active_session = (Sock *) 0;
+ free(locSock);
+ break;
}
}
#ifdef DEBUG
@@ -169,9 +174,6 @@ pr();
#endif
}
-@
-\subsection{read\_SpadServer\_command}
-<<readSpadServercommand>>=
static void
read_SpadServer_command(void)
{
@@ -199,9 +201,6 @@ read_SpadServer_command(void)
}
}
-@
-\subsection{test\_sock\_for\_process}
-<<testsockforprocess>>=
static int
test_sock_for_process(Sock *sock)
{
@@ -209,9 +208,6 @@ test_sock_for_process(Sock *sock)
return kill(sock->pid, 0);
}
-@
-\subsection{read\_menu\_client\_command}
-<<readmenuclientcommand>>=
static void
read_menu_client_command(void)
{
@@ -229,7 +225,7 @@ read_menu_client_command(void)
}
cmd = get_int(menu_client);
switch(cmd) {
- case -1: /* socket closed */
+ case -1: /* socket closed */
FD_CLR(socket_fd,&session_socket_mask);
menu_client = (Sock *) 0;
reading_output = 0;
@@ -243,9 +239,9 @@ fprintf(stderr,"menu:SwitchFrames\n");
send_int(spad_server, frame);
for(i=0,pSock=plSock; pSock != (Sock_List *) 0 ; i++,pSock=pSock->next)
if ((pSock->Socket.frame == frame)) {
- active_session = (Sock *)pSock;
- reading_output = 1;
- break;
+ active_session = (Sock *)pSock;
+ reading_output = 1;
+ break;
}
if (i == num_active_clients) {
/* fprintf(stderr, "Couldn't find socket for frame %d\n", frame); */
@@ -264,9 +260,6 @@ fprintf(stderr,"menu:QuerySpad\n");
}
}
-@
-\subsection{read\_from\_spad\_io}
-<<readfromspadio>>=
static void
read_from_spad_io(void)
{
@@ -275,13 +268,10 @@ read_from_spad_io(void)
if (ret_code == -1) return;
if(active_session != (Sock *) 0) {
ret_code = swrite(active_session, big_bad_buf, ret_code,
- NULL);
+ NULL);
}
}
-@
-\subsection{kill\_spad}
-<<killspad>>=
static void
kill_spad(void)
{
@@ -290,8 +280,8 @@ kill_spad(void)
send_signal(spad_server, SIGTERM);
for (pSock=plSock,i=0;
- (i<num_active_clients) && (pSock != (Sock_List *) 0);
- i++,pSock=pSock->next) {
+ (i<num_active_clients) && (pSock != (Sock_List *) 0);
+ i++,pSock=pSock->next) {
if ((pSock->Socket).socket != 0)
send_signal((Sock *)pSock, SIGTERM);
}
@@ -299,9 +289,6 @@ kill_spad(void)
exit(0);
}
-@
-\subsection{accept\_session\_connection}
-<<acceptsessionconnection>>=
static int
accept_session_connection(Sock *server_sock)
{
@@ -338,12 +325,12 @@ accept_session_connection(Sock *server_sock)
/* new Sock is put at the head of the list */
if (plSock == (Sock_List *)0 ) {
- plSock = pls;
- plSock->next = (Sock_List *)0 ;
+ plSock = pls;
+ plSock->next = (Sock_List *)0 ;
}
else{
- pls->next = plSock;
- plSock = pls;
+ pls->next = plSock;
+ plSock = pls;
}
/* we need to maintain session_socket_mask here since we roll our own accept */
@@ -354,9 +341,9 @@ accept_session_connection(Sock *server_sock)
active_session = (Sock *)plSock;
get_string_buf(spad_server, big_bad_buf, BufSize);
ret_code = swrite((Sock *)plSock, big_bad_buf, strlen(big_bad_buf)+1,
- "session: writing to InterpWindow");
+ "session: writing to InterpWindow");
if (ret_code == -1)
- return -1;
+ return -1;
num_active_clients++;
#ifdef DEBUG
pr();
@@ -366,9 +353,6 @@ pr();
return (-1);
}
-@
-\subsection{read\_from\_session}
-<<readfromsession>>=
static void
read_from_session(Sock *sock)
{
@@ -379,14 +363,14 @@ read_from_session(Sock *sock)
}
active_session = sock;
ret_code = sread(sock, big_bad_buf, BufSize,
- "session: reading InterpWindow");
+ "session: reading InterpWindow");
if (ret_code == -1) {
active_session = (Sock *) 0;
reading_output = 0;
return;
}
ret_code = swrite(spad_io, big_bad_buf, ret_code,
- "session: writing SessionIO");
+ "session: writing SessionIO");
if (ret_code == -1) {
active_session = (Sock *)0 ;
reading_output = 0;
@@ -395,9 +379,6 @@ read_from_session(Sock *sock)
reading_output = 1;
}
-@
-\subsection{manage\_sessions}
-<<managesessions>>=
static void
manage_sessions(void)
{
@@ -429,7 +410,7 @@ fprintf(stderr,"[rd=%u ",*((long *)rd.fds_bits));
ret_code = sselect(FD_SETSIZE, &rd, &wr, &ex, NULL);
if (ret_code == -1) {
- break;
+ break;
}
#ifdef DEBUG
fprintf(stderr,"rd=%u]\n",*((long *)rd.fds_bits));
@@ -452,9 +433,9 @@ fprintf(stderr,"rd=%u]\n",*((long *)rd.fds_bits));
for(pSock=plSock; pSock != (Sock_List *) 0 ; pSock=pSock->next) {
if ((active_session == (Sock *)pSock || !reading_output) &&
- (pSock->Socket).socket>0 && FD_ISSET(pSock->Socket.socket, &rd)) {
- /* An InterpWindow */
- read_from_session((Sock *)pSock); }
+ (pSock->Socket).socket>0 && FD_ISSET(pSock->Socket.socket, &rd)) {
+ /* An InterpWindow */
+ read_from_session((Sock *)pSock); }
}
@@ -464,9 +445,6 @@ fprintf(stderr,"rd=%u]\n",*((long *)rd.fds_bits));
}
}
-@
-\subsection{main}
-<<main>>=
int
main(void)
{
@@ -486,7 +464,7 @@ main(void)
else {
#ifdef DEBUG
fprintf(stderr, "session: connected SpadServer , fd = %d\n",
- spad_server->socket);
+ spad_server->socket);
#endif
FD_SET(spad_server->socket, &session_socket_mask);
}
@@ -502,7 +480,7 @@ main(void)
else {
#ifdef DEBUG
fprintf(stderr,"session: connected SessionIOName , fd = %d\n",
- spad_io->socket);
+ spad_io->socket);
#endif
FD_SET(spad_io->socket, &session_socket_mask);
}
@@ -522,7 +500,7 @@ main(void)
else {
#ifdef DEBUG
fprintf(stderr, "session: opened SessionServer , fd = %d\n",
- server[1].socket);
+ server[1].socket);
#endif
FD_SET(server[1].socket,&session_socket_mask);
}
@@ -530,72 +508,4 @@ main(void)
return(0);
}
-@
-\subsection{session}
-<<session>>=
-/* #define DEBUG */
-#define _SESSION_C
-
-<<includes>>
-<<variables>>
-<<usr1handler>>
-<<usr2handler>>
-<<termhandler>>
-<<pr>>
-<<closeclient>>
-<<readSpadServercommand>>
-<<testsockforprocess>>
-<<readmenuclientcommand>>
-<<readfromspadio>>
-<<killspad>>
-<<acceptsessionconnection>>
-<<readfromsession>>
-<<managesessions>>
-<<main>>
-
-@
-\section{License}
-<<license>>=
-/*
-Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd.
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- - Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-
- - Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in
- the documentation and/or other materials provided with the
- distribution.
-
- - Neither the name of The Numerical ALgorithms Group Ltd. nor the
- names of its contributors may be used to endorse or promote products
- derived from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
-IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
-PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
-OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-@
-<<*>>=
-<<license>>
-<<session>>
-@
-\eject
-\begin{thebibliography}{99}
-\bibitem{1} nothing
-\end{thebibliography}
-\end{document}
diff --git a/src/sman/sman.c.pamphlet b/src/sman/sman.c
index 84243dd9..9cb3a0ba 100644
--- a/src/sman/sman.c.pamphlet
+++ b/src/sman/sman.c
@@ -1,43 +1,41 @@
-\documentclass{article}
-\usepackage{axiom}
-
-\title{\$SPAD/src/sman sman}
-\author{The Axiom Team}
-
-\begin{document}
-\maketitle
-
-\begin{abstract}
-\end{abstract}
-\eject
-
-\tableofcontents
-\eject
-
-\section{sman.h}
-<<sman.h>>=
-/* Process control definitions. Used by fork_you and spawn_of_hell */
-
-/* When a process dies it kills off everything else */
-#define Die 1
-/* When a process dies, do nothing */
-#define NadaDelShitsky 2
-/* When a process dies start it up again */
-#define DoItAgain 3
-/* When hypertex dies, clean its socket */
-#define CleanHypertexSocket 4
-
-typedef struct spad_proc {
- int proc_id; /* process id of child */
- int death_action; /* one of the above constants */
- char *command; /* sh command line to restart the process */
- struct spad_proc *next;
-} SpadProcess;
-
-@
-\section{sman}
-\subsection{includes}
-<<includes>>=
+/*
+ Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd.
+ All rights reserved.
+
+ Copyright (C) 2007, Gabriel Dos Reis.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ - Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ - Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+
+ - Neither the name of The Numerical ALgorithms Group Ltd. nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+ OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#define _SMAN_C
+
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
@@ -65,63 +63,29 @@ typedef struct spad_proc {
#include "openpty.H1"
#include "sman.H1"
-@
-\subsection{variables}
-We add a debug flag so we can print information about what \Tool{sman}
-is trying to do. This change is pervasive as it touches nearly every
-routine.
-<<debugflag>>=
-int tpd=0; /* to-print-debug information */
-@
-This line is no longer used. We would completely elide it except that
-it would raise spurious issues about deleting credit and/or copyright
-information.
-\begin{verbatim}
-char *start_line =
-"AKCL (Austin Kyoto Common Lisp) Version(1.568) Thu Aug 22 16:49:01 EDT 1991\
-\r\nContains Enhancements by W. Schelter\r\n";
-\end{verbatim}
-We modified the place where the command list lives.
-The command list used to live in
-\begin{verbatim}
-$AXIOM/../../share/algebra/command.list
-\end{verbatim}
-but the open source version of the system no longer has a share
-subdirectory so we move this to the lib subdirectory.
-<<clefprogram>>=
-char *ClefProgram =
- "$AXIOM/bin/clef -f $AXIOM/lib/command.list -e ";
-@
-and we change the command line arguments
-<<clefprogram1>>=
- ClefProgram =
- strcat(ClefCommandLine, " -f $AXIOM/lib/command.list -e ");
-@
-<<variables>>=
char *ws_path; /* location of the AXIOM executable */
-int start_clef; /* start clef under spad */
-int start_graphics; /* start the viewman */
-int start_nagman; /* start the nagman */
-int start_ht; /* start hypertex */
-int start_spadclient; /* Start the client spad buffer */
-int start_local_spadclient; /* Start the client spad buffer */
-int use_X; /* Use the X windows environment */
-int server_num; /* AXIOM server number */
-<<debugflag>>
+int start_clef; /* start clef under spad */
+int start_graphics; /* start the viewman */
+int start_ht; /* start hypertex */
+int start_spadclient; /* Start the client spad buffer */
+int start_local_spadclient; /* Start the client spad buffer */
+int use_X; /* Use the X windows environment */
+int server_num; /* AXIOM server number */
+int tpd=0; /* to-print-debug information */
/************************************************/
/* definitions of programs which sman can start */
/************************************************/
-char *GraphicsProgram = "$AXIOM/lib/viewman";
-char *NagManagerProgram = "$AXIOM/lib/nagman";
-char *HypertexProgram = "$AXIOM/lib/hypertex -s";
-<<clefprogram>>
-char *SessionManagerProgram = "$AXIOM/lib/session";
-char *SpadClientProgram = "$AXIOM/lib/spadclient";
-char *PasteFile = NULL;
-char *MakeRecordFile = NULL;
-char *VerifyRecordFile = NULL;
+char *GraphicsProgram = "$AXIOM/lib/viewman";
+char *HypertexProgram = "$AXIOM/lib/hypertex -s";
+char *ClefProgram =
+ "$AXIOM/bin/clef -f $AXIOM/lib/command.list -e ";
+char *SessionManagerProgram = "$AXIOM/lib/session";
+char *SpadClientProgram = "$AXIOM/lib/spadclient";
+char *PasteFile = NULL;
+char *MakeRecordFile = NULL;
+char *VerifyRecordFile = NULL;
SpadProcess *spad_process_list = NULL;
/***************************/
@@ -132,7 +96,7 @@ SpadProcess *spad_process_list = NULL;
char ClefCommandLine[256];
-#define BufSize 4096 /* size of communication buffer */
+#define BufSize 4096 /* size of communication buffer */
char big_bad_buf[BufSize]; /* big I/O buffer */
Sock *session_io = NULL; /* socket connecting to session manager */
@@ -156,12 +120,8 @@ struct termios oldbuf; /* the original settings */
struct termios childbuf; /* terminal structure for user i/o */
-int nagman_signal=0;
int death_signal = 0;
-@
-\subsection{process\_arguments}
-<<processarguments>>=
static void
process_arguments(int argc,char ** argv)
{
@@ -178,10 +138,6 @@ process_arguments(int argc,char ** argv)
start_graphics = 1;
else if (strcmp(argv[arg], "-nogr") == 0)
start_graphics = 0;
- else if (strcmp(argv[arg], "-nag") == 0)
- start_nagman = 1;
- else if (strcmp(argv[arg], "-nonag") == 0)
- start_nagman = 0;
else if (strcmp(argv[arg], "-ht") == 0)
start_ht = 1;
else if (strcmp(argv[arg], "-noht") == 0)
@@ -200,21 +156,20 @@ process_arguments(int argc,char ** argv)
ws_path = "$AXIOM/etc/images/comp";
else if (strcmp(argv[arg], "-nox") == 0)
{
- use_X = 0;
- start_local_spadclient = 1;
- start_spadclient = 0;
- start_ht = 0;
- start_graphics = 0;
+ use_X = 0;
+ start_local_spadclient = 1;
+ start_spadclient = 0;
+ start_ht = 0;
+ start_graphics = 0;
}
else if (strcmp(argv[arg], "-grprog") == 0)
GraphicsProgram = argv[++arg];
- else if (strcmp(argv[arg], "-nagprog") == 0)
- NagManagerProgram = argv[++arg];
else if (strcmp(argv[arg], "-htprog") == 0)
HypertexProgram = argv[++arg];
else if (strcmp(argv[arg], "-clefprog") == 0) {
strcpy(ClefCommandLine,argv[++arg]);
-<<clefprogram1>>
+ ClefProgram =
+ strcat(ClefCommandLine, " -f $AXIOM/lib/command.list -e ");
}
else if (strcmp(argv[arg], "-sessionprog") == 0)
SessionManagerProgram = argv[++arg];
@@ -228,8 +183,8 @@ process_arguments(int argc,char ** argv)
PasteFile = argv[++arg];
else {
fprintf(stderr, "Usage: sman <-clef|-noclef> \
-<-gr|-nogr> <-ht|-noht> <-iw|-noiw> <-nag|-nonag> <-nox> <-comp> <-ws spad_workspace> \
-<-grprog path> <-htprog path> <-clefprog path> <-sessionprog path> <-nagprog path> \
+<-gr|-nogr> <-ht|-noht> <-iw|-noiw> <-nox> <-comp> <-ws spad_workspace> \
+<-grprog path> <-htprog path> <-clefprog path> <-sessionprog path> \
<-clientprog path>\n");
exit(-1);
}
@@ -244,10 +199,6 @@ process_arguments(int argc,char ** argv)
fprintf(stderr,"-nogr ");
else
fprintf(stderr,"-gr ");
- if (start_nagman == 0)
- fprintf(stderr,"-nonag ");
- else
- fprintf(stderr,"-nag ");
if (start_ht == 0)
fprintf(stderr,"-noht ");
else
@@ -270,8 +221,6 @@ process_arguments(int argc,char ** argv)
fprintf(stderr,"'%s' ",ws_path);
fprintf(stderr,"-grprog ");
fprintf(stderr,"'%s' ",GraphicsProgram);
- fprintf(stderr,"-nagprog ");
- fprintf(stderr,"'%s' ",NagManagerProgram);
fprintf(stderr,"-htprog ");
fprintf(stderr,"'%s' ",HypertexProgram);
fprintf(stderr,"-clefprog ");
@@ -291,18 +240,12 @@ process_arguments(int argc,char ** argv)
if (tpd == 1) fprintf(stderr,"sman:process_arguments exit\n");
}
-@
-\subsection{should\_I\_clef}
-<<shouldIclef>>=
static int
should_I_clef(void)
{
return(1);
}
-@
-\subsection{in\_X}
-<<inX>>=
static int
in_X(void)
{
@@ -310,24 +253,12 @@ in_X(void)
return 0;
}
-@
-\subsection{set\_up\_defaults}
-These are the default values for sman. A '1' value means that
-sman will try to start the given process, a '0' value means not
-starting the process.
-
-We do not have replacement code for the [[nagman]] process nor
-do we have a copy of the [[nag fortran library]] to test the process.
-Until this changes we set [[start_nagman = 0]] in order to disable
-starting this process by default.
-<<setupdefaults>>=
static void
set_up_defaults(void)
{
if (tpd == 1) fprintf(stderr,"sman:set_up_defaults entered\n");
start_clef = should_I_clef();
start_graphics = 1;
- start_nagman = 0;
start_ht = 1;
start_spadclient = 0;
start_local_spadclient = 1;
@@ -336,9 +267,6 @@ set_up_defaults(void)
if (tpd == 1) fprintf(stderr,"sman:set_up_defaults exit\n");
}
-@
-\subsection{process\_options}
-<<processoptions>>=
static void
process_options(int argc, char **argv)
{
@@ -348,27 +276,12 @@ process_options(int argc, char **argv)
if (tpd == 1) fprintf(stderr,"sman:process_options exit\n");
}
-@
-\subsection{death\_handler}
-<<deathhandler>>=
static void
death_handler(int sig)
{
death_signal = 1;
}
-@
-\subsection{nagman\_handler}
-<<nagmanhandler>>=
-static void
-nagman_handler(int sig)
-{
- nagman_signal=1;
-}
-
-@
-\subsection{sman\_catch\_signals}
-<<smancatchsignals>>=
static void
sman_catch_signals(void)
{
@@ -383,27 +296,9 @@ sman_catch_signals(void)
bsdSignal(SIGIOT, death_handler,RestartSystemCalls);
bsdSignal(SIGBUS, death_handler,RestartSystemCalls);
bsdSignal(SIGSEGV, death_handler,RestartSystemCalls);
- /* don't restart wait call on SIGUSR1 */
- bsdSignal(SIGUSR1, nagman_handler,DontRestartSystemCalls);
- /* ONLY nagman should send this.
- If an error (such as C-c) interrupts a NAGLINK call, nagman
- gets a signal to clean up. We need to start another nagman
- almost immediately to process the next NAGLINK request.
- Since nagman takes a while to clean up, we treat it specially.
- nagman should send a signal (USR1) to sman.
- sman should respond by spawning a new nagman.
-
- so nagman is NOT a DoItAgain but a NadaDelShitsky.
-
- The USR1 mechanism does not work for HPUX 9 - use DoItAgain
- */
}
-@
-\subsection{fix\_env}
-insert SPADSERVER and SPADNUM variables into the environemnt
-<<fixenv>>=
static void
fix_env(char **envp, int spadnum)
{
@@ -419,20 +314,17 @@ fix_env(char **envp, int spadnum)
new_envp[i+2] = envp[i];
}
-@
-\subsection{init\_term\_io}
-<<inittermio>>=
static void
init_term_io(void)
{
if(!isatty(0)) return;
if( tcgetattr(0, &oldbuf) == -1) {
perror("getting termios");
- return ; /* exit(-1); */
+ return ; /* exit(-1); */
}
if( tcgetattr(0, &childbuf) == -1) {
perror("getting termios");
- return ; /* exit(-1); */
+ return ; /* exit(-1); */
}
_INTR = oldbuf.c_cc[VINTR];
_QUIT = oldbuf.c_cc[VQUIT];
@@ -442,9 +334,6 @@ init_term_io(void)
_EOL = oldbuf.c_cc[VEOL];
}
-@
-\subsection{strPrefix}
-<<strPrefix>>=
static char *
strPrefix(char *prefix,char * s)
{
@@ -456,9 +345,6 @@ strPrefix(char *prefix,char * s)
return NULL;
}
-@
-\subsection{check\_spad\_proc}
-<<checkspadproc>>=
static void
check_spad_proc(char *file, char *prefix)
{
@@ -469,15 +355,12 @@ check_spad_proc(char *file, char *prefix)
if (pid > 2) {
kill(pid, 0);
if (kill(pid, 0) == -1 && errno == ESRCH) {
- unlink(file);
+ unlink(file);
}
}
}
}
-@
-\subsection{clean\_up\_old\_sockets}
-<<cleanupoldsockets>>=
static void
clean_up_old_sockets(void)
{
@@ -486,7 +369,7 @@ clean_up_old_sockets(void)
int len;
sprintf(tmp_file, "/tmp/socks.%d", server_num);
sprintf(com, "ls /tmp/.d* /tmp/.s* /tmp/.i* /tmp/.h* 2> %s > %s",
- tmp_file, tmp_file);
+ tmp_file, tmp_file);
system(com);
file = fopen(tmp_file, "r");
if (file == NULL) {
@@ -506,9 +389,6 @@ clean_up_old_sockets(void)
unlink(tmp_file);
}
-@
-\subsection{fork\_you}
-<<forkyou>>=
static SpadProcess *
fork_you(int death_action)
{
@@ -526,9 +406,6 @@ fork_you(int death_action)
return proc;
}
-@
-\subsection{exec\_command\_env}
-<<execcommandenv>>=
static void
exec_command_env(char *command,char ** env)
{
@@ -537,9 +414,6 @@ exec_command_env(char *command,char ** env)
execle("/bin/sh","/bin/sh", "-c", new_command, 0, env);
}
-@
-\subsection{spawn\_of\_hell}
-<<spawnofhell>>=
static SpadProcess *
spawn_of_hell(char *command, int death_action)
{
@@ -552,10 +426,6 @@ spawn_of_hell(char *command, int death_action)
return NULL;
}
-@
-\subsection{start\_the\_spadclient}
-run a AXIOM client in the main process
-<<startthespadclient>>=
static void
start_the_spadclient(void)
{
@@ -563,31 +433,28 @@ start_the_spadclient(void)
if (start_clef)
#ifdef RIOSplatform
sprintf(command,
- "aixterm -sb -sl 500 -name axiomclient -n AXIOM -T AXIOM -e %s %s",
- ClefProgram, SpadClientProgram);
+ "aixterm -sb -sl 500 -name axiomclient -n AXIOM -T AXIOM -e %s %s",
+ ClefProgram, SpadClientProgram);
#else
sprintf(command,
- "xterm -sb -sl 500 -name axiomclient -n AXIOM -T AXIOM -e %s %s",
- ClefProgram, SpadClientProgram);
+ "xterm -sb -sl 500 -name axiomclient -n AXIOM -T AXIOM -e %s %s",
+ ClefProgram, SpadClientProgram);
#endif
else
#ifdef RIOSplatform
sprintf(command,
- "aixterm -sb -sl 500 -name axiomclient -n AXIOM -T AXIOM -e %s",
- SpadClientProgram);
+ "aixterm -sb -sl 500 -name axiomclient -n AXIOM -T AXIOM -e %s",
+ SpadClientProgram);
#else
sprintf(command,
- "xterm -sb -sl 500 -name axiomclient -n AXIOM -T AXIOM -e %s",
- SpadClientProgram);
+ "xterm -sb -sl 500 -name axiomclient -n AXIOM -T AXIOM -e %s",
+ SpadClientProgram);
#endif
if (tpd == 1)
fprintf(stderr,"sman:start_the_spadclient: %s\n",command);
spawn_of_hell(command, NadaDelShitsky);
}
-@
-\subsection{start\_the\_local\_spadclient}
-<<startthelocalspadclient>>=
static void
start_the_local_spadclient(void)
{
@@ -601,31 +468,12 @@ start_the_local_spadclient(void)
spawn_of_hell(command, NadaDelShitsky);
}
-@
-\subsection{start\_the\_nagman}
-<<startthenagman>>=
-static void
-start_the_nagman(void)
-{
-#if defined(HP9platform)
- spawn_of_hell(NagManagerProgram,DoItAgain);
-#else
- spawn_of_hell(NagManagerProgram,NadaDelShitsky );
-#endif
-}
-
-@
-\subsection{start\_the\_session\_manager}
-<<startthesessionmanager>>=
static void
start_the_session_manager(void)
{
spawn_of_hell(SessionManagerProgram, Die);
}
-@
-\subsection{start\_the\_hypertex}
-<<startthehypertex>>=
static void
start_the_hypertex(void)
{
@@ -643,21 +491,15 @@ start_the_hypertex(void)
sprintf(prog, "%s -k -rv %s", HypertexProgram, VerifyRecordFile);
spawn_of_hell(prog, NadaDelShitsky);
}
- else spawn_of_hell(HypertexProgram, CleanHypertexSocket);
+ else spawn_of_hell(HypertexProgram, CleanHypertexSocket);
}
-@
-\subsection{start\_the\_graphics}
-<<startthegraphics>>=
static void
start_the_graphics(void)
{
spawn_of_hell(GraphicsProgram, DoItAgain);
}
-@
-\subsection{fork\_Axiom}
-<<forkAxiom>>=
/* Start the AXIOM session in a separate process, */
/* using a pseudo-terminal to catch all input and output */
static void
@@ -730,9 +572,6 @@ fork_Axiom(void)
}
}
-@
-\subsection{start\_the\_Axiom}
-<<starttheAxiom>>=
static void
start_the_Axiom(char **envp)
{
@@ -751,9 +590,6 @@ start_the_Axiom(char **envp)
close(ptsNum);
}
-@
-\subsection{clean\_up\_sockets}
-<<cleanupsockets>>=
static void
clean_hypertex_socket(void)
{
@@ -775,9 +611,6 @@ clean_up_sockets(void)
clean_hypertex_socket();
}
-@
-\subsection{read\_from\_spad\_io}
-<<readfromspadio>>=
static void
read_from_spad_io(int ptcNum)
{
@@ -793,17 +626,17 @@ read_from_spad_io(int ptcNum)
mes_len -= ret_code;
else {
if (mes_len > 0) {
- i = mes_len;
- mes_len = 0;
+ i = mes_len;
+ mes_len = 0;
}
else
- i = 0;
+ i = 0;
ret_code = write(1, big_bad_buf+i, ret_code-i);
}
}
else
ret_code = swrite(session_io, big_bad_buf, ret_code,
- "writing to session man");
+ "writing to session man");
if (ret_code == -1) {
perror("writing output to session manager");
clean_up_sockets();
@@ -811,9 +644,6 @@ read_from_spad_io(int ptcNum)
}
}
-@
-\subsection{read\_from\_manager}
-<<readfrommanager>>=
static void
read_from_manager(int ptcNum)
{
@@ -828,9 +658,6 @@ read_from_manager(int ptcNum)
}
}
-@
-\subsection{manage\_spad\_io}
-<<managespadio>>=
static void
manage_spad_io(int ptcNum)
{
@@ -852,17 +679,17 @@ manage_spad_io(int ptcNum)
}
for(i=0; i<2; i++) {
if (server[i].socket > 0 && FD_ISSET(server[i].socket, &rd)) {
- p = accept_connection(server+i);
- switch(p) {
- case SessionIO:
- session_io = purpose_table[SessionIO];
- /* printf("connected session manager\n\r");*/
- printf("\n");
- break;
- default:
- printf("sman: Unkown connection request type: %d\n", p);
- break;
- }
+ p = accept_connection(server+i);
+ switch(p) {
+ case SessionIO:
+ session_io = purpose_table[SessionIO];
+ /* printf("connected session manager\n\r");*/
+ printf("\n");
+ break;
+ default:
+ printf("sman: Unkown connection request type: %d\n", p);
+ break;
+ }
}
}
if (session_io != NULL && FD_ISSET(session_io->socket, &rd)) {
@@ -871,18 +698,12 @@ manage_spad_io(int ptcNum)
}
}
-@
-\subsection{init\_spad\_process\_list}
-<<initspadprocesslist>>=
static void
init_spad_process_list(void)
{
spad_process_list = NULL;
}
-@
-\subsection{print\_spad\_process\_list}
-<<printspadprocesslist>>=
#if 0
static void
print_spad_process_list()
@@ -890,13 +711,10 @@ print_spad_process_list()
SpadProcess *proc;
for(proc = spad_process_list; proc != NULL; proc = proc->next)
fprintf(stderr, "proc_id = %d, death_action = %d\n", proc->proc_id,
- proc->death_action);
+ proc->death_action);
}
#endif
-@
-\subsection{find\_child}
-<<findchild>>=
static SpadProcess *
find_child(int proc_id)
{
@@ -906,9 +724,6 @@ find_child(int proc_id)
return NULL;
}
-@
-\subsection{kill\_all\_children}
-<<killallchildren>>=
static void
kill_all_children(void)
{
@@ -924,18 +739,12 @@ kill_all_children(void)
}
-@
-\subsection{clean\_up\_terminal}
-<<cleanupterminal>>=
static void
clean_up_terminal(void)
{
tcsetattr(0, TCSAFLUSH, &oldbuf);
}
-@
-\subsection{monitor\_children}
-<<monitorchildren>>=
static void
monitor_children(void)
{
@@ -952,13 +761,6 @@ monitor_children(void)
sleep(2);
exit(0);
}
- /* Check the value of dead_baby, since wait may have returned
- a pid but subsequently we have received a signal. Yeuch! */
- if(dead_baby == -1 && nagman_signal) {
- nagman_signal=0;
- spawn_of_hell(NagManagerProgram,NadaDelShitsky);
- continue;
- }
if (dead_baby == -1) {
fprintf(stderr, "sman: wait returned -1\n");
@@ -967,8 +769,8 @@ monitor_children(void)
proc = find_child(dead_baby);
if (proc == NULL) {
/* fprintf(stderr, "sman: %d is not known to be a child process\n",
- dead_baby);
- */
+ dead_baby);
+ */
continue;
}
switch(proc->death_action) {
@@ -989,14 +791,6 @@ monitor_children(void)
}
}
-@
-\subsection{main}
-The main procedure should return an [[int]]. We change the return value
-here and in [[src/include/sman.H1]].
-<<result>>=
- return(0);
-@
-<<main>>=
int
main(int argc, char *argv[],char *envp[])
{
@@ -1015,7 +809,6 @@ main(int argc, char *argv[],char *envp[])
start_the_session_manager();
if (start_spadclient) start_the_spadclient();
if (start_local_spadclient) start_the_local_spadclient();
- if (start_nagman) start_the_nagman();
if (start_ht) start_the_hypertex();
if (start_graphics) start_the_graphics();
sleep(1);
@@ -1027,95 +820,7 @@ main(int argc, char *argv[],char *envp[])
}
manage_spad_io(ptcNum);
if (tpd == 1) fprintf(stderr,"sman:main exit\n");
-<<result>>
+ return(0);
}
-@
-\subsection{sman}
-<<sman>>=
-#define _SMAN_C
-
-<<includes>>
-<<variables>>
-<<processarguments>>
-<<shouldIclef>>
-<<inX>>
-<<setupdefaults>>
-<<processoptions>>
-<<deathhandler>>
-<<nagmanhandler>>
-<<smancatchsignals>>
-<<fixenv>>
-<<inittermio>>
-<<strPrefix>>
-<<checkspadproc>>
-<<cleanupoldsockets>>
-<<forkyou>>
-<<execcommandenv>>
-<<spawnofhell>>
-<<startthespadclient>>
-<<startthelocalspadclient>>
-<<startthenagman>>
-<<startthesessionmanager>>
-<<startthehypertex>>
-<<startthegraphics>>
-<<forkAxiom>>
-<<starttheAxiom>>
-<<cleanupsockets>>
-<<readfromspadio>>
-<<readfrommanager>>
-<<managespadio>>
-<<initspadprocesslist>>
-<<printspadprocesslist>>
-<<findchild>>
-<<killallchildren>>
-<<cleanupterminal>>
-<<monitorchildren>>
-<<main>>
-
-@
-\section{License}
-<<license>>=
-/*
-Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd.
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- - Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-
- - Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in
- the documentation and/or other materials provided with the
- distribution.
-
- - Neither the name of The Numerical ALgorithms Group Ltd. nor the
- names of its contributors may be used to endorse or promote products
- derived from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
-IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
-PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
-OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-@
-<<*>>=
-<<license>>
-<<sman>>
-@
-\eject
-\begin{thebibliography}{99}
-\bibitem{1} nothing
-\end{thebibliography}
-\end{document}
diff --git a/src/sman/sman.h b/src/sman/sman.h
new file mode 100644
index 00000000..262b62d9
--- /dev/null
+++ b/src/sman/sman.h
@@ -0,0 +1,54 @@
+/*
+ Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd.
+ All rights reserved.
+
+ Copyright (C) 2007, Gabriel Dos Reis.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ - Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ - Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+
+ - Neither the name of The Numerical ALgorithms Group Ltd. nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+ OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/* Process control definitions. Used by fork_you and spawn_of_hell */
+
+/* When a process dies it kills off everything else */
+#define Die 1
+/* When a process dies, do nothing */
+#define NadaDelShitsky 2
+/* When a process dies start it up again */
+#define DoItAgain 3
+/* When hypertex dies, clean its socket */
+#define CleanHypertexSocket 4
+
+typedef struct spad_proc {
+ int proc_id; /* process id of child */
+ int death_action; /* one of the above constants */
+ char *command; /* sh command line to restart the process */
+ struct spad_proc *next;
+} SpadProcess;
+