home *** CD-ROM | disk | FTP | other *** search
- static char sccs_id[] = "@(#) vfork.c 2.0 " __DATE__ " HJR";
-
- /* vfork.c (c) Copyright 1990 H.Rogers */
-
- #include <errno.h>
- #include <string.h>
- #include <stdlib.h>
- #include <setjmp.h>
-
- #include "termio.h"
-
- #include "sys/unix.h"
- #include "sys/syslib.h"
- #include "sys/param.h"
- #include "sys/debug.h"
-
- int *
- __vfork (void)
- {
- register struct proc *u = 0;
- register int argc;
- register char **argv = 0;
- register char *argb = 0;
- register int i;
-
- #ifdef DEBUG
- __debug ("vfork() <- parent");
- #endif
-
- if (!(u = malloc (sizeof (struct proc))))
- goto nomem;
- if (!(argv = malloc (sizeof (int) * (4 * MAXCOMMANDLEN >> 2))))
- goto nomem;
- if (!(argb = malloc (4 * MAXCOMMANDLEN)))
- goto nomem;
-
- memcpy (u, __u, sizeof (struct proc));
- u->ppid = u->pid++;
- u->pproc = __u;
- {
- register char *s1, *s2;
-
- argc = u->argc;
- s2 = argb;
-
- for (i = 0; i < argc; i++)
- {
- argv[i] = s2;
- s1 = u->argv[i];
- while (*s2++ = *s1++);
- }
- argv[i] = 0;
- }
- u->argv = argv;
- u->argb = argb;
- {
- register int v = (char *) u - (char *) __u;
-
- for (i = 0; i < MAXFD; i++)
- if (u->file[i].dup)
- u->file[i].dup = (void *) ((char *) u->file[i].dup + v);
- }
-
- u->flag |= __U_PPROC;
- __u = u;
-
- #ifdef DEBUG
- __debug ("vfork() -> child");
- #endif
-
- return (u->vreg);
-
- nomem:
-
- if (argb)
- free (argb);
- if (argv)
- free (argv);
- if (u)
- free (u);
-
- return (0);
- }
-
- int *
- __vexit (int e)
- {
- register struct proc *u = __u;
- register char **argv = u->argv;
- register char *argb = u->argb;
- register int i;
-
- #ifdef DEBUG
- __debug ("__vexit() <- child");
- #endif
-
- for (i = 0; i < MAXFD; i++)
- if (u->file[i].dup)
- close (i);
-
- #ifdef DEBUG
- __debug ("__vexit() <- child (close())");
- #endif
-
- __u = u->pproc;
- __u->wait = e << 8;
- __u->flag |= __U_ZCLD;
-
- free (argb);
- free (argv);
- free (u); /* relies on free() not corrupting data */
-
- #ifdef DEBUG
- __debug ("__vexit() -> parent");
- #endif
-
- u->vreg[13] = u->pid;
- return (u->vreg);
- }
-