diff options
Diffstat (limited to 'libc/syscall')
-rw-r--r-- | libc/syscall/Makefile | 7 | ||||
-rw-r--r-- | libc/syscall/execve.c | 94 | ||||
-rw-r--r-- | libc/syscall/signal.c | 5 | ||||
-rw-r--r-- | libc/syscall/syscall.dat | 57 | ||||
-rw-r--r-- | libc/syscall/syslibc.c | 39 |
5 files changed, 167 insertions, 35 deletions
diff --git a/libc/syscall/Makefile b/libc/syscall/Makefile index 2cc4494..21991ee 100644 --- a/libc/syscall/Makefile +++ b/libc/syscall/Makefile @@ -6,9 +6,10 @@ TOP=.. include $(TOP)/Make.defs LSRC=syslibc.c -LOBJ=__cstartup.o time.o lseek.o getpid.o getppid.o \ - getuid.o geteuid.o getgid.o getegid.o \ - dup2.o dup.o abort.o wait.o waitpid.o sleep.o +LOBJ=__cstartup.o time.o lseek.o getpid.o getppid.o \ + getuid.o geteuid.o getgid.o getegid.o \ + dup2.o dup.o abort.o wait.o waitpid.o sleep.o \ + killpg.o setpgrp.o getpgrp.o ESRC=execve.c EOBJ=execve.o execl.o execv.o execle.o diff --git a/libc/syscall/execve.c b/libc/syscall/execve.c index aee7182..33643ca 100644 --- a/libc/syscall/execve.c +++ b/libc/syscall/execve.c @@ -112,3 +112,97 @@ char ** envp; 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 diff --git a/libc/syscall/signal.c b/libc/syscall/signal.c index dbeac4a..dad3389 100644 --- a/libc/syscall/signal.c +++ b/libc/syscall/signal.c @@ -51,7 +51,12 @@ Sig pointer; old_sig = __sigtable[number-1]; __sigtable[number-1] = pointer; + switch(rv) + { + case 0: return SIG_DFL; + case 1: return SIG_IGN; return old_sig; + } } #asm diff --git a/libc/syscall/syscall.dat b/libc/syscall/syscall.dat index d83be4f..df61a4f 100644 --- a/libc/syscall/syscall.dat +++ b/libc/syscall/syscall.dat @@ -14,18 +14,19 @@ READ 3 3 WRITE 4 3 CLOSE 6 1 -LSEEK 19 3 * NB 2nd arg is a ptr to long not a long. +LSEEK 19 3 * NB 2nd arg is an IO ptr to long not a long. FSTAT 28 2 IOCTL 54 3 . Make this and fcntl the same ? FCNTL 55 3 -FCHMOD 94 X -FCHOWN 95 X +FTRUNCATE 93 3 +FCHMOD 94 2 +FCHOWN 95 3 FSYNC 118 1 -FCHDIR 133 X -LLSEEK 140 X -READV 145 X -WRITEV 146 X -FLOCK 143 X - Use fcntl +FCHDIR 133 1 +LLSEEK 140 3 * 2nd arg is ptr to two longs +READV 145 3 +WRITEV 146 3 +FLOCK 143 2 - Use fcntl DUP 41 1 - Using nasty fcntl function # @@ -67,52 +68,46 @@ MKDIR 39 2 RMDIR 40 1 PIPE 42 1 TIMES 43 1 -PROF 44 X SETGID 46 1 GETGID 47 1 * This gets both gid and egid SIGNAL 48 2 * Have put the despatch table in user space. -ACCT 51 1 -PHYS 52 X -LOCK 53 X -MPX 56 X +ACCT 51 1 - SETPGID 57 2 ULIMIT 58 2 UMASK 60 1 CHROOT 61 1 USTAT 62 2 -GETPGRP 65 X +GETPGRP 65 0 - use getpgid(0) SETSID 66 X SIGACTION 67 X SGETMASK 68 X SSETMASK 69 X -SETREUID 70 X -SETREGID 71 X +SETREUID 70 2 +SETREGID 71 2 SIGSUSPEND 72 X SIGPENDING 73 X SETHOSTNAME 74 2 -SETRLIMIT 75 X -GETRLIMIT 76 X -REBOOT 76 3 . The magic number is 0xfee1,0xdead,... -GETRUSAGE 77 X +SETRLIMIT 75 2 +GETRLIMIT 76 2 +GETRUSAGE 77 2 GETGROUPS 80 2 SETGROUPS 81 2 SYMLINK 83 2 LSTAT 84 2 READLINK 85 3 SWAPON 87 X -REBOOT 88 X +REBOOT 88 3 . The magic number is 0xfee1,0xdead,... MUNMAP 91 X -TRUNCATE 92 X -FTRUNCATE 93 X -GETPRIORITY 96 X -SETPRIORITY 97 X +TRUNCATE 92 3 +GETPRIORITY 96 2 +SETPRIORITY 97 3 PROFIL 98 X -STATFS 99 X -FSTATFS 100 X +STATFS 99 2 +FSTATFS 100 2 SOCKETCALL 102 X SYSLOG 103 X -SETITIMER 104 X -GETITIMER 105 X +SETITIMER 104 3 +GETITIMER 105 2 UNAME 109 1 VHANGUP 111 0 SWAPOFF 115 X @@ -127,8 +122,8 @@ QUOTACTL 131 X GETPGID 132 1 SYSFS 135 X PERSONALITY 136 X -SETFSUID 138 X -SETFSGID 139 X +SETFSUID 138 1 +SETFSGID 139 1 GETDENTS 141 X SELECT 142 5 * MSYNC 144 X diff --git a/libc/syscall/syslibc.c b/libc/syscall/syslibc.c index 1e604e8..1dcb013 100644 --- a/libc/syscall/syslibc.c +++ b/libc/syscall/syslibc.c @@ -4,6 +4,7 @@ */ #include <sys/types.h> +#include <errno.h> #include <time.h> /* MSDOS has it's own versions */ @@ -124,7 +125,6 @@ int fd; off_t posn; int where; { - off_t __lseek(); if( __lseek(fd, &posn, where) < 0 ) return -1; else return posn; } @@ -280,6 +280,43 @@ int opts; } #endif +/********************** Function killpg ************************************/ + +#ifdef L_killpg +int +killpg(pid, sig) +int pid; +int sig; +{ + if(pid == 0) + pid = getpgrp(); + if(pid > 1) + return kill(-pid, sig); + errno = EINVAL; + return -1; +} +#endif + +/********************** Function getpgrp ************************************/ + +#ifdef L_getpgrp +int +getpgrp() +{ + return getpgid(0); +} +#endif + +/********************** Function setpgrp ************************************/ + +#ifdef L_setpgrp +int +setpgrp() +{ + return setpgid(0,0); +} +#endif + /********************** Function sleep ************************************/ #ifdef L_sleep |