summaryrefslogtreecommitdiff
path: root/libc/syscall
diff options
context:
space:
mode:
Diffstat (limited to 'libc/syscall')
-rw-r--r--libc/syscall/Makefile7
-rw-r--r--libc/syscall/execve.c94
-rw-r--r--libc/syscall/signal.c5
-rw-r--r--libc/syscall/syscall.dat57
-rw-r--r--libc/syscall/syslibc.c39
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