summaryrefslogtreecommitdiff
path: root/syscall.c
diff options
context:
space:
mode:
Diffstat (limited to 'syscall.c')
-rw-r--r--syscall.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/syscall.c b/syscall.c
index 80d5d8e..39c6821 100644
--- a/syscall.c
+++ b/syscall.c
@@ -140,6 +140,7 @@ sys_write(void)
return -1;
if(addr + n > p->sz)
return -1;
+
ret = fd_write(p->fds[fd], p->mem + addr, n);
return ret;
}
@@ -421,6 +422,7 @@ sys_dup(void)
fd_close(fd1);
return -1;
}
+ cp->fds[ufd1] = fd1;
fd1->type = cp->fds[fd]->type;
fd1->readable = cp->fds[fd]->readable;
fd1->writeable = cp->fds[fd]->writeable;
@@ -450,6 +452,27 @@ sys_link(void)
}
int
+sys_getpid(void)
+{
+ struct proc *cp = curproc[cpu()];
+ return cp->pid;
+}
+
+
+int
+sys_sbrk(void)
+{
+ int r, n;
+ struct proc *cp = curproc[cpu()];
+
+ if(fetcharg(0, &n) < 0)
+ return -1;
+ r = growproc(n);
+ setupsegs(cp);
+ return r;
+}
+
+int
sys_exec(void)
{
struct proc *cp = curproc[cpu()];
@@ -638,6 +661,12 @@ syscall(void)
case SYS_dup:
ret = sys_dup();
break;
+ case SYS_getpid:
+ ret = sys_getpid();
+ break;
+ case SYS_sbrk:
+ ret = sys_sbrk();
+ break;
default:
cprintf("unknown sys call %d\n", num);
// XXX fault