home *** CD-ROM | disk | FTP | other *** search
/ back2roots/padua / padua.7z / padua / uucp / uupoll068.lha / source / fork.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-08-03  |  3.1 KB  |  115 lines

  1.  
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <dos.h>
  6.  
  7. #include <proto/exec.h>
  8. #include <proto/dos.h>
  9. #include <exec/types.h>
  10. #include <exec/nodes.h>
  11. #include <exec/tasks.h>
  12. #include <exec/memory.h>
  13. #include <exec/execbase.h>
  14. #include <libraries/dos.h>
  15. #include <libraries/dosextens.h>
  16. #include <dos/dostags.h>
  17. #include <utility/tagitem.h>
  18.  
  19. #include "cus.h"
  20. #include "defines.h"
  21. #include "fork.h"
  22.  
  23. extern far ForkExit();
  24.  
  25. struct Process *fork(char *cmdname, char *cmdargs, int *childrc, int tasksig)
  26. {
  27.     struct TagItem caTag1[RANGE_5BIT];
  28.     struct TagItem caTag[RANGE_5BIT];
  29.     int tagidx;
  30.     struct Process *pid;
  31.     struct Process *rc;
  32.     struct ForkExitInfo *ForkExitInfo = NULL;
  33.     struct Process *proc = NULL;
  34.     BPTRáseglist = NULL;
  35.     ULONG ifh = NULL;
  36.     ULONG ofh = NULL;
  37.  
  38.     pid = (struct Process *)FindTask(NULL);
  39.  
  40.     tagidx = 0;
  41.     caTag1[tagidx]  .ti_Tag  = NP_StackSize;
  42.     caTag1[tagidx++].ti_Data = (ULONG)(pid->pr_StackSize);
  43.     caTag1[tagidx]  .ti_Tag  = TAG_DONE;
  44.     caTag1[tagidx++].ti_Data = 0;
  45.  
  46.     if ((seglist = NewLoadSeg(cmdname, caTag1)) == NULL)
  47.         CU(NULL);
  48.  
  49.     tagidx = 0;
  50.     caTag[tagidx]  .ti_Tag  = NP_Seglist;
  51.     caTag[tagidx++].ti_Data = (ULONG)seglist;
  52.     caTag[tagidx]  .ti_Tag  = NP_FreeSeglist;
  53.     caTag[tagidx++].ti_Data = (ULONG)TRUE;
  54.     if ((ifh = Open("NIL:", MODE_OLDFILE)) == NULL)
  55.         CU(NULL);
  56.     caTag[tagidx]  .ti_Tag  = NP_Input;
  57.     caTag[tagidx++].ti_Data = (ULONG)ifh;
  58.     caTag[tagidx]  .ti_Tag  = NP_CloseInput;
  59.     caTag[tagidx++].ti_Data = (ULONG)TRUE;
  60.     if ((ofh = Open("NIL:", MODE_NEWFILE)) == NULL)
  61.         CU(NULL);
  62.     caTag[tagidx]  .ti_Tag  = NP_Output;
  63.     caTag[tagidx++].ti_Data = (ULONG)ofh;
  64.     caTag[tagidx]  .ti_Tag  = NP_CloseOutput;
  65.     caTag[tagidx++].ti_Data = (ULONG)TRUE;
  66.     caTag[tagidx]  .ti_Tag  = NP_Name;
  67.     caTag[tagidx++].ti_Data = (ULONG)"New Fork Process";
  68.     caTag[tagidx]  .ti_Tag  = NP_Priority;
  69.     caTag[tagidx++].ti_Data = (ULONG)(pid->pr_Task.tc_Node.ln_Pri);
  70.     caTag[tagidx]  .ti_Tag  = NP_StackSize;
  71.     caTag[tagidx++].ti_Data = (ULONG)(pid->pr_StackSize);
  72.     caTag[tagidx]  .ti_Tag  = NP_Cli;
  73.     caTag[tagidx++].ti_Data = (ULONG)TRUE;
  74.     caTag[tagidx]  .ti_Tag  = NP_CopyVars;
  75.     caTag[tagidx++].ti_Data = (ULONG)TRUE;
  76.     caTag[tagidx]  .ti_Tag  = NP_CommandName;
  77.     caTag[tagidx++].ti_Data = (ULONG)cmdname;
  78.     caTag[tagidx]  .ti_Tag  = NP_Arguments;
  79.     caTag[tagidx++].ti_Data = (ULONG)cmdargs;
  80.     caTag[tagidx]  .ti_Tag  = NP_Synchronous;
  81.     caTag[tagidx++].ti_Data = (ULONG)FALSE;
  82.     caTag[tagidx]  .ti_Tag  = NP_ExitCode;
  83.     caTag[tagidx++].ti_Data = (ULONG)&ForkExit;
  84.     if ((ForkExitInfo = AllocVec(sizeof(struct ForkExitInfo), MEMF_PUBLIC)) == NULL)
  85.         CU(NULL);
  86.     ForkExitInfo->ParentTask       = (struct Task *)pid;
  87.     ForkExitInfo->ParentTaskSignal = tasksig;
  88.     ForkExitInfo->ChildRc          = childrc;
  89.     caTag[tagidx]  .ti_Tag  = NP_ExitData;
  90.     caTag[tagidx++].ti_Data = (ULONG)ForkExitInfo;
  91.     caTag[tagidx]  .ti_Tag  = TAG_DONE;
  92.     caTag[tagidx++].ti_Data = 0;
  93.  
  94.     if ((proc = CreateNewProc(caTag)) == NULL)
  95.         CU(NULL);
  96.     ifh = NULL;
  97.     ofh = NULL;
  98.     ForkExitInfo = NULL;
  99.     seglist = NULL;
  100.  
  101.     rc = proc;
  102.  
  103.     CUS:
  104.     if (seglist)
  105.         UnLoadSeg(seglist);
  106.     if (ForkExitInfo)
  107.         FreeVec(ForkExitInfo);
  108.     if (ifh)
  109.         Close(ifh);
  110.     if (ofh)
  111.         Close(ifh);
  112.     return rc;
  113. }
  114.  
  115.