diff options
author | Robert de Bath <rdebath@poboxes.com> | 1996-12-01 16:58:31 +0100 |
---|---|---|
committer | Lubomir Rintel <lkundrak@v3.sk> | 2013-10-23 23:34:16 +0200 |
commit | f8de35da65c5d93bb733073cf40da154bc1c0748 (patch) | |
tree | d28c7644739a24402376d24cb0020ea410a9ccff /libc/syscall/execve.c | |
parent | c218c617b5be443b7968308506969ad2b726d73c (diff) | |
download | dev86-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.c | 208 |
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 |