summaryrefslogtreecommitdiff
path: root/libc/syscall/execve.c
diff options
context:
space:
mode:
authorRobert de Bath <rdebath@poboxes.com>1996-12-01 16:58:31 +0100
committerLubomir Rintel <lkundrak@v3.sk>2013-10-23 23:34:16 +0200
commitf8de35da65c5d93bb733073cf40da154bc1c0748 (patch)
treed28c7644739a24402376d24cb0020ea410a9ccff /libc/syscall/execve.c
parentc218c617b5be443b7968308506969ad2b726d73c (diff)
downloaddev86-f8de35da65c5d93bb733073cf40da154bc1c0748.tar.gz
Import Dev86src-0.0.9.tar.gzv0.0.9
Diffstat (limited to 'libc/syscall/execve.c')
-rw-r--r--libc/syscall/execve.c208
1 files changed, 0 insertions, 208 deletions
diff --git a/libc/syscall/execve.c b/libc/syscall/execve.c
deleted file mode 100644
index 33643ca..0000000
--- a/libc/syscall/execve.c
+++ /dev/null
@@ -1,208 +0,0 @@
-
-#include <errno.h>
-
-extern char ** environ;
-
-#ifdef L_execl
-int
-execl(fname, arg0)
-char * fname, *arg0;
-{
- return execve(fname, &arg0, environ);
-}
-#endif
-
-#ifdef L_execv
-int
-execv(fname, argv)
-char * fname, **argv;
-{
- return execve(fname, argv, environ);
-}
-#endif
-
-#ifdef L_execle
-int
-execle(fname, arg0)
-char *fname, *arg0;
-{
- char ** envp = &arg0;
- while(*envp) envp++;
- return execve(fname, &arg0, envp+1);
-}
-#endif
-
-#ifdef L_execve
-int
-execve(fname, argv, envp)
-char * fname;
-char ** argv;
-char ** envp;
-{
- char **p;
- int argv_len=0, argv_count=0;
- int envp_len=0, envp_count=0;
- int stack_bytes;
- unsigned short * pip;
- char * pcp, * stk_ptr, *baseoff;
- int rv;
-
- /* How much space for argv */
- for(p=argv; p && *p && argv_len >= 0; p++)
- {
- argv_count++; argv_len += strlen(*p)+1;
- }
-
- /* How much space for envp */
- for(p=envp; p && *p && envp_len >= 0; p++)
- {
- envp_count++; envp_len += strlen(*p)+1;
- }
-
- /* tot it all up */
- stack_bytes = 2 /* argc */
- + argv_count * 2 + 2 /* argv */
- + argv_len
- + envp_count * 2 + 2 /* envp */
- + envp_len;
-
- /* Allocate it */
- if( argv_len < 0 || envp_len < 0 || stack_bytes <= 0
- || (int)(stk_ptr = (char*)sbrk(stack_bytes)) == -1)
- {
- errno = ENOMEM;
- return -1;
- }
-
-/* Sanity check
- printf("Argv = (%d,%d), Envp=(%d,%d), stack=%d\n",
- argv_count, argv_len, envp_count, envp_len, stack_bytes);
-*/
-
- /* Now copy in the strings */
- pip=(unsigned short *) stk_ptr;
- pcp=stk_ptr+2*(1+argv_count+1+envp_count+1);
-
- /* baseoff = stk_ptr + stack_bytes; */
- baseoff = stk_ptr;
- *pip++ = argv_count;
- for(p=argv; p && *p; p++)
- {
- int l;
- *pip++ = pcp-baseoff;
- l = strlen(*p)+1;
- memcpy(pcp, *p, l);
- pcp += l;
- }
- *pip++ = 0;
-
- for(p=envp; p && *p; p++)
- {
- int l;
- *pip++ = pcp-baseoff;
- l = strlen(*p)+1;
- memcpy(pcp, *p, l);
- pcp += l;
- }
- *pip++ = 0;
-
- rv = __exec(fname, stk_ptr, stack_bytes);
- /* FIXME: This will probably have to interpret '#!' style exe's */
- sbrk(-stack_bytes);
- return rv;
-}
-#endif
-
-#ifdef L_execvve
-int
-execvve(fname, interp, argv, envp)
-char * fname;
-char ** interp;
-char ** argv;
-char ** envp;
-{
- char **p;
- int argv_len=0, argv_count=0;
- int envp_len=0, envp_count=0;
- int stack_bytes;
- unsigned short * pip;
- char * pcp, * stk_ptr, *baseoff;
- int rv;
-
- /* How much space for argv */
- for(p=interp; p && *p && argv_len >= 0; p++)
- {
- argv_count++; argv_len += strlen(*p)+1;
- }
- for(p=argv; p && *p && argv_len >= 0; p++)
- {
- argv_count++; argv_len += strlen(*p)+1;
- }
-
- /* How much space for envp */
- for(p=envp; p && *p && envp_len >= 0; p++)
- {
- envp_count++; envp_len += strlen(*p)+1;
- }
-
- /* tot it all up */
- stack_bytes = 2 /* argc */
- + argv_count * 2 + 2 /* argv */
- + argv_len
- + envp_count * 2 + 2 /* envp */
- + envp_len;
-
- /* Allocate it */
- if( argv_len < 0 || envp_len < 0 || stack_bytes <= 0
- || (int)(stk_ptr = (char*)sbrk(stack_bytes)) == -1)
- {
- errno = ENOMEM;
- return -1;
- }
-
-/* Sanity check
- printf("Argv = (%d,%d), Envp=(%d,%d), stack=%d\n",
- argv_count, argv_len, envp_count, envp_len, stack_bytes);
-*/
-
- /* Now copy in the strings */
- pip=(unsigned short *) stk_ptr;
- pcp=stk_ptr+2*(1+argv_count+1+envp_count+1);
-
- /* baseoff = stk_ptr + stack_bytes; */
- baseoff = stk_ptr;
- *pip++ = argv_count;
- for(p=interp; p && *p; p++)
- {
- int l;
- *pip++ = pcp-baseoff;
- l = strlen(*p)+1;
- memcpy(pcp, *p, l);
- pcp += l;
- }
- for(p=argv; p && *p; p++)
- {
- int l;
- *pip++ = pcp-baseoff;
- l = strlen(*p)+1;
- memcpy(pcp, *p, l);
- pcp += l;
- }
- *pip++ = 0;
-
- for(p=envp; p && *p; p++)
- {
- int l;
- *pip++ = pcp-baseoff;
- l = strlen(*p)+1;
- memcpy(pcp, *p, l);
- pcp += l;
- }
- *pip++ = 0;
-
- rv = __exec(fname, stk_ptr, stack_bytes);
- /* FIXME: This will probably have to interpret '#!' style exe's */
- sbrk(-stack_bytes);
- return rv;
-}
-#endif