home *** CD-ROM | disk | FTP | other *** search
-
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <dos.h>
-
- #include <proto/exec.h>
- #include <proto/dos.h>
- #include <exec/types.h>
- #include <exec/nodes.h>
- #include <exec/tasks.h>
- #include <exec/memory.h>
- #include <exec/execbase.h>
- #include <libraries/dos.h>
- #include <libraries/dosextens.h>
- #include <dos/dostags.h>
- #include <utility/tagitem.h>
-
- #include "cus.h"
- #include "defines.h"
- #include "fork.h"
-
- extern far ForkExit();
-
- struct Process *fork(char *cmdname, char *cmdargs, int *childrc, int tasksig)
- {
- struct TagItem caTag1[RANGE_5BIT];
- struct TagItem caTag[RANGE_5BIT];
- int tagidx;
- struct Process *pid;
- struct Process *rc;
- struct ForkExitInfo *ForkExitInfo = NULL;
- struct Process *proc = NULL;
- BPTRáseglist = NULL;
- ULONG ifh = NULL;
- ULONG ofh = NULL;
-
- pid = (struct Process *)FindTask(NULL);
-
- tagidx = 0;
- caTag1[tagidx] .ti_Tag = NP_StackSize;
- caTag1[tagidx++].ti_Data = (ULONG)(pid->pr_StackSize);
- caTag1[tagidx] .ti_Tag = TAG_DONE;
- caTag1[tagidx++].ti_Data = 0;
-
- if ((seglist = NewLoadSeg(cmdname, caTag1)) == NULL)
- CU(NULL);
-
- tagidx = 0;
- caTag[tagidx] .ti_Tag = NP_Seglist;
- caTag[tagidx++].ti_Data = (ULONG)seglist;
- caTag[tagidx] .ti_Tag = NP_FreeSeglist;
- caTag[tagidx++].ti_Data = (ULONG)TRUE;
- if ((ifh = Open("NIL:", MODE_OLDFILE)) == NULL)
- CU(NULL);
- caTag[tagidx] .ti_Tag = NP_Input;
- caTag[tagidx++].ti_Data = (ULONG)ifh;
- caTag[tagidx] .ti_Tag = NP_CloseInput;
- caTag[tagidx++].ti_Data = (ULONG)TRUE;
- if ((ofh = Open("NIL:", MODE_NEWFILE)) == NULL)
- CU(NULL);
- caTag[tagidx] .ti_Tag = NP_Output;
- caTag[tagidx++].ti_Data = (ULONG)ofh;
- caTag[tagidx] .ti_Tag = NP_CloseOutput;
- caTag[tagidx++].ti_Data = (ULONG)TRUE;
- caTag[tagidx] .ti_Tag = NP_Name;
- caTag[tagidx++].ti_Data = (ULONG)"New Fork Process";
- caTag[tagidx] .ti_Tag = NP_Priority;
- caTag[tagidx++].ti_Data = (ULONG)(pid->pr_Task.tc_Node.ln_Pri);
- caTag[tagidx] .ti_Tag = NP_StackSize;
- caTag[tagidx++].ti_Data = (ULONG)(pid->pr_StackSize);
- caTag[tagidx] .ti_Tag = NP_Cli;
- caTag[tagidx++].ti_Data = (ULONG)TRUE;
- caTag[tagidx] .ti_Tag = NP_CopyVars;
- caTag[tagidx++].ti_Data = (ULONG)TRUE;
- caTag[tagidx] .ti_Tag = NP_CommandName;
- caTag[tagidx++].ti_Data = (ULONG)cmdname;
- caTag[tagidx] .ti_Tag = NP_Arguments;
- caTag[tagidx++].ti_Data = (ULONG)cmdargs;
- caTag[tagidx] .ti_Tag = NP_Synchronous;
- caTag[tagidx++].ti_Data = (ULONG)FALSE;
- caTag[tagidx] .ti_Tag = NP_ExitCode;
- caTag[tagidx++].ti_Data = (ULONG)&ForkExit;
- if ((ForkExitInfo = AllocVec(sizeof(struct ForkExitInfo), MEMF_PUBLIC)) == NULL)
- CU(NULL);
- ForkExitInfo->ParentTask = (struct Task *)pid;
- ForkExitInfo->ParentTaskSignal = tasksig;
- ForkExitInfo->ChildRc = childrc;
- caTag[tagidx] .ti_Tag = NP_ExitData;
- caTag[tagidx++].ti_Data = (ULONG)ForkExitInfo;
- caTag[tagidx] .ti_Tag = TAG_DONE;
- caTag[tagidx++].ti_Data = 0;
-
- if ((proc = CreateNewProc(caTag)) == NULL)
- CU(NULL);
- ifh = NULL;
- ofh = NULL;
- ForkExitInfo = NULL;
- seglist = NULL;
-
- rc = proc;
-
- CUS:
- if (seglist)
- UnLoadSeg(seglist);
- if (ForkExitInfo)
- FreeVec(ForkExitInfo);
- if (ifh)
- Close(ifh);
- if (ofh)
- Close(ifh);
- return rc;
- }
-
-