home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 4 / DATAFILE_PDCD4.iso / unix / unixlib36d / src / sys / c / vfork < prev   
Encoding:
Text File  |  1994-03-08  |  2.0 KB  |  120 lines

  1. static char sccs_id[] = "@(#) vfork.c 2.0 " __DATE__ " HJR";
  2.  
  3. /* vfork.c (c) Copyright 1990 H.Rogers */
  4.  
  5. #include <errno.h>
  6. #include <string.h>
  7. #include <stdlib.h>
  8. #include <setjmp.h>
  9.  
  10. #include "termio.h"
  11.  
  12. #include "sys/unix.h"
  13. #include "sys/syslib.h"
  14. #include "sys/param.h"
  15. #include "sys/debug.h"
  16.  
  17. int *
  18. __vfork (void)
  19. {
  20.   register struct proc *u = 0;
  21.   register int argc;
  22.   register char **argv = 0;
  23.   register char *argb = 0;
  24.   register int i;
  25.  
  26. #ifdef DEBUG
  27.   __debug ("vfork() <- parent");
  28. #endif
  29.  
  30.   if (!(u = malloc (sizeof (struct proc))))
  31.       goto nomem;
  32.   if (!(argv = malloc (sizeof (int) * (4 * MAXCOMMANDLEN >> 2))))
  33.       goto nomem;
  34.   if (!(argb = malloc (4 * MAXCOMMANDLEN)))
  35.     goto nomem;
  36.  
  37.   memcpy (u, __u, sizeof (struct proc));
  38.   u->ppid = u->pid++;
  39.   u->pproc = __u;
  40.   {
  41.     register char *s1, *s2;
  42.  
  43.     argc = u->argc;
  44.     s2 = argb;
  45.  
  46.     for (i = 0; i < argc; i++)
  47.       {
  48.     argv[i] = s2;
  49.     s1 = u->argv[i];
  50.     while (*s2++ = *s1++);
  51.       }
  52.     argv[i] = 0;
  53.   }
  54.   u->argv = argv;
  55.   u->argb = argb;
  56.   {
  57.     register int v = (char *) u - (char *) __u;
  58.  
  59.     for (i = 0; i < MAXFD; i++)
  60.       if (u->file[i].dup)
  61.     u->file[i].dup = (void *) ((char *) u->file[i].dup + v);
  62.   }
  63.  
  64.   u->flag |= __U_PPROC;
  65.   __u = u;
  66.  
  67. #ifdef DEBUG
  68.   __debug ("vfork() -> child");
  69. #endif
  70.  
  71.   return (u->vreg);
  72.  
  73. nomem:
  74.  
  75.   if (argb)
  76.     free (argb);
  77.   if (argv)
  78.     free (argv);
  79.   if (u)
  80.     free (u);
  81.  
  82.   return (0);
  83. }
  84.  
  85. int *
  86. __vexit (int e)
  87. {
  88.   register struct proc *u = __u;
  89.   register char **argv = u->argv;
  90.   register char *argb = u->argb;
  91.   register int i;
  92.  
  93. #ifdef DEBUG
  94.   __debug ("__vexit() <- child");
  95. #endif
  96.  
  97.   for (i = 0; i < MAXFD; i++)
  98.     if (u->file[i].dup)
  99.       close (i);
  100.  
  101. #ifdef DEBUG
  102.   __debug ("__vexit() <- child (close())");
  103. #endif
  104.  
  105.   __u = u->pproc;
  106.   __u->wait = e << 8;
  107.   __u->flag |= __U_ZCLD;
  108.  
  109.   free (argb);
  110.   free (argv);
  111.   free (u);            /* relies on free() not corrupting data */
  112.  
  113. #ifdef DEBUG
  114.   __debug ("__vexit() -> parent");
  115. #endif
  116.  
  117.   u->vreg[13] = u->pid;
  118.   return (u->vreg);
  119. }
  120.