mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-11-02 07:28:21 +00:00
syscalls: make a bunch of system calls use the new user memory operations
This commit is contained in:
@@ -3,6 +3,7 @@
|
|||||||
#include <kernel/fd.h>
|
#include <kernel/fd.h>
|
||||||
#include <arch/cls.h>
|
#include <arch/cls.h>
|
||||||
#include <arch/spinlock.h>
|
#include <arch/spinlock.h>
|
||||||
|
#include <kernel/ustring.h>
|
||||||
|
|
||||||
extern fs_t kerneltmpfs;
|
extern fs_t kerneltmpfs;
|
||||||
|
|
||||||
@@ -67,6 +68,17 @@ syscallret syscall_accept(int sockfd, void* addr, socklen_t* addrlen){
|
|||||||
|
|
||||||
retv.errno = socket_accept(&peer, listenersock, addr, addrlen, fd);
|
retv.errno = socket_accept(&peer, listenersock, addr, addrlen, fd);
|
||||||
|
|
||||||
|
if(retv.errno)
|
||||||
|
goto _fail;
|
||||||
|
|
||||||
|
|
||||||
|
retv.errno = u_memcpy(addr, &peer->addr_un, peer->addrlen);
|
||||||
|
|
||||||
|
if(retv.errno)
|
||||||
|
goto _fail;
|
||||||
|
|
||||||
|
retv.errno = u_memcpy(addrlen, &peer->addrlen, sizeof(socklen_t));
|
||||||
|
|
||||||
if(retv.errno)
|
if(retv.errno)
|
||||||
goto _fail;
|
goto _fail;
|
||||||
|
|
||||||
@@ -90,9 +102,6 @@ syscallret syscall_accept(int sockfd, void* addr, socklen_t* addrlen){
|
|||||||
|
|
||||||
retv.ret = connifd;
|
retv.ret = connifd;
|
||||||
|
|
||||||
memcpy(addr, &peer->addr_un, peer->addrlen);
|
|
||||||
*addrlen = peer->addrlen;
|
|
||||||
|
|
||||||
return retv;
|
return retv;
|
||||||
|
|
||||||
_fail:
|
_fail:
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
#include <arch/cls.h>
|
#include <arch/cls.h>
|
||||||
#include <kernel/sched.h>
|
#include <kernel/sched.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
#include <kernel/ustring.h>
|
||||||
|
|
||||||
syscallret syscall_chdir(const char* path){
|
syscallret syscall_chdir(const char* path){
|
||||||
syscallret retv;
|
syscallret retv;
|
||||||
@@ -17,10 +18,18 @@ syscallret syscall_chdir(const char* path){
|
|||||||
return retv;
|
return retv;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t len = strlen(path);
|
size_t len;
|
||||||
|
|
||||||
|
retv.errno = u_strlen(path, &len);
|
||||||
|
if(retv.errno)
|
||||||
|
return retv;
|
||||||
|
|
||||||
char buff[len+1];
|
char buff[len+1];
|
||||||
|
|
||||||
strcpy(buff, path);
|
retv.errno = u_strcpy(buff, path);
|
||||||
|
|
||||||
|
if(retv.errno)
|
||||||
|
return retv;
|
||||||
|
|
||||||
proc_t* proc = arch_getcls()->thread->proc;
|
proc_t* proc = arch_getcls()->thread->proc;
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
#include <arch/cls.h>
|
#include <arch/cls.h>
|
||||||
#include <kernel/fd.h>
|
#include <kernel/fd.h>
|
||||||
#include <kernel/sched.h>
|
#include <kernel/sched.h>
|
||||||
|
#include <kernel/ustring.h>
|
||||||
|
|
||||||
// flags is ignored for now
|
// flags is ignored for now
|
||||||
|
|
||||||
@@ -17,11 +18,19 @@ syscallret syscall_fchmodat(int dirfd, const char* path, mode_t mode, int flags)
|
|||||||
return retv;
|
return retv;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t len = strlen(path);
|
size_t len;
|
||||||
|
|
||||||
|
retv.errno = u_strlen(path, &len);
|
||||||
|
|
||||||
|
if(retv.errno)
|
||||||
|
return retv;
|
||||||
|
|
||||||
char buff[len+1];
|
char buff[len+1];
|
||||||
|
|
||||||
strcpy(buff, path);
|
retv.errno = u_strcpy(buff, path);
|
||||||
|
|
||||||
|
if(retv.errno)
|
||||||
|
return retv;
|
||||||
|
|
||||||
proc_t* proc = arch_getcls()->thread->proc;
|
proc_t* proc = arch_getcls()->thread->proc;
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
#include <kernel/sched.h>
|
#include <kernel/sched.h>
|
||||||
#include <kernel/vmm.h>
|
#include <kernel/vmm.h>
|
||||||
#include <arch/cls.h>
|
#include <arch/cls.h>
|
||||||
|
#include <kernel/ustring.h>
|
||||||
|
|
||||||
syscallret syscall_chroot(const char* path){
|
syscallret syscall_chroot(const char* path){
|
||||||
|
|
||||||
@@ -14,11 +15,19 @@ syscallret syscall_chroot(const char* path){
|
|||||||
return retv;
|
return retv;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t len = strlen(path);
|
size_t len;
|
||||||
|
|
||||||
|
retv.errno = u_strlen(path, &len);
|
||||||
|
|
||||||
|
if(retv.errno)
|
||||||
|
return retv;
|
||||||
|
|
||||||
char buff[len+1];
|
char buff[len+1];
|
||||||
|
|
||||||
strcpy(buff, path);
|
retv.errno = u_strcpy(buff, path);
|
||||||
|
|
||||||
|
if(retv.errno)
|
||||||
|
return retv;
|
||||||
|
|
||||||
proc_t* proc = arch_getcls()->thread->proc;
|
proc_t* proc = arch_getcls()->thread->proc;
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
#include <kernel/vmm.h>
|
#include <kernel/vmm.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
#include <kernel/ustring.h>
|
||||||
|
|
||||||
#define CLOCK_REALTIME 0
|
#define CLOCK_REALTIME 0
|
||||||
|
|
||||||
@@ -19,7 +20,8 @@ syscallret syscall_clock_gettime(int clockid, struct timespec *tp){
|
|||||||
|
|
||||||
switch(clockid){
|
switch(clockid){
|
||||||
case CLOCK_REALTIME:
|
case CLOCK_REALTIME:
|
||||||
*tp = arch_timekeeper_gettime();
|
struct timespec t = arch_timekeeper_gettime();
|
||||||
|
retv.errno = u_memcpy(tp, &t, sizeof(struct timespec));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
retv.errno = EINVAL;
|
retv.errno = EINVAL;
|
||||||
|
|||||||
+26
-11
@@ -9,6 +9,7 @@
|
|||||||
#include <kernel/elf.h>
|
#include <kernel/elf.h>
|
||||||
#include <arch/cls.h>
|
#include <arch/cls.h>
|
||||||
#include <arch/interrupt.h>
|
#include <arch/interrupt.h>
|
||||||
|
#include <kernel/ustring.h>
|
||||||
|
|
||||||
static void destroyvec(char* vec[], size_t vecsize){
|
static void destroyvec(char* vec[], size_t vecsize){
|
||||||
for(uintmax_t p = 0; p < vecsize; ++p){
|
for(uintmax_t p = 0; p < vecsize; ++p){
|
||||||
@@ -30,17 +31,28 @@ syscallret syscall_execve(const char* name, char* const argv[], char* const envp
|
|||||||
return retv;
|
return retv;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t namelen = strlen(name); // XXX user strlen
|
size_t namelen;
|
||||||
|
retv.errno = u_strlen(name, &namelen);
|
||||||
|
|
||||||
|
if(retv.errno)
|
||||||
|
return retv;
|
||||||
|
|
||||||
size_t argc = 0;
|
size_t argc = 0;
|
||||||
size_t envc = 0;
|
size_t envc = 0;
|
||||||
|
|
||||||
// this probably should be checked in a safer way
|
while(1){
|
||||||
|
char* tmp;
|
||||||
while(argv[argc]){
|
retv.errno = u_memcpy(&tmp, &argv[argc], sizeof(argv[argc]));
|
||||||
|
if(!tmp)
|
||||||
|
break;
|
||||||
++argc;
|
++argc;
|
||||||
}
|
}
|
||||||
|
|
||||||
while(envp[envc]){
|
while(1){
|
||||||
|
char* tmp;
|
||||||
|
retv.errno = u_memcpy(&tmp, &envp[envc], sizeof(envp[envc]));
|
||||||
|
if(!tmp)
|
||||||
|
break;
|
||||||
++envc;
|
++envc;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -66,28 +78,31 @@ syscallret syscall_execve(const char* name, char* const argv[], char* const envp
|
|||||||
return retv;
|
return retv;
|
||||||
}
|
}
|
||||||
|
|
||||||
strcpy(namebuff, name); // XXX user strcpy
|
int err = u_strcpy(namebuff, name);
|
||||||
|
|
||||||
int err = 0;
|
// XXX
|
||||||
|
// this is still not that safe, later make it even safer.
|
||||||
|
|
||||||
for(uintmax_t arg = 0; arg < argc && err == 0; ++arg){
|
for(uintmax_t arg = 0; arg < argc && err == 0; ++arg){
|
||||||
size_t len = strlen(argv[arg]); // XXX user strlen
|
size_t len;
|
||||||
|
err = u_strlen(argv[arg], &len);
|
||||||
argbuff[arg] = alloc(len+1);
|
argbuff[arg] = alloc(len+1);
|
||||||
if(!argbuff[arg]){
|
if(!argbuff[arg]){
|
||||||
err = ENOMEM;
|
err = ENOMEM;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
strcpy(argbuff[arg], argv[arg]); // XXX user strcpy
|
u_strcpy(argbuff[arg], argv[arg]);
|
||||||
}
|
}
|
||||||
|
|
||||||
for(uintmax_t env = 0; env < envc && err == 0; ++env){
|
for(uintmax_t env = 0; env < envc && err == 0; ++env){
|
||||||
size_t len = strlen(envp[env]); // XXX user strlen
|
size_t len;
|
||||||
|
u_strlen(envp[env], &len);
|
||||||
envbuff[env] = alloc(len+1);
|
envbuff[env] = alloc(len+1);
|
||||||
if(!envbuff[env]){
|
if(!envbuff[env]){
|
||||||
err = ENOMEM;
|
err = ENOMEM;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
strcpy(envbuff[env], envp[env]); // XXX user strcpy
|
u_strcpy(envbuff[env], envp[env]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(err){
|
if(err){
|
||||||
|
|||||||
@@ -26,10 +26,14 @@ syscallret syscall_fstat(int ifd, stat* st){
|
|||||||
return retv;
|
return retv;
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(st, &fd->node->st, sizeof(stat)); // XXX user memcpy
|
|
||||||
|
|
||||||
fd_release(fd);
|
fd_release(fd);
|
||||||
|
|
||||||
|
retv.errno = u_memcpy(st, &fd->node->st, sizeof(stat));
|
||||||
|
|
||||||
|
if(retv.errno)
|
||||||
|
return retv;
|
||||||
|
|
||||||
|
|
||||||
retv.errno = 0;
|
retv.errno = 0;
|
||||||
retv.ret = 0;
|
retv.ret = 0;
|
||||||
|
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
#include <kernel/vfs.h>
|
#include <kernel/vfs.h>
|
||||||
#include <arch/spinlock.h>
|
#include <arch/spinlock.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <kernel/ustring.h>
|
||||||
|
|
||||||
// we don't care about flags yet
|
// we don't care about flags yet
|
||||||
|
|
||||||
@@ -17,11 +18,19 @@ syscallret syscall_fstatat(int ifd, char* path, stat* st, int flags){
|
|||||||
return retv;
|
return retv;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t len = strlen(path);
|
size_t len;
|
||||||
|
|
||||||
|
retv.errno = u_strlen(path, &len);
|
||||||
|
|
||||||
|
if(retv.errno)
|
||||||
|
return retv;
|
||||||
|
|
||||||
char buff[len+1];
|
char buff[len+1];
|
||||||
|
|
||||||
strcpy(buff, path);
|
retv.errno = u_strcpy(buff, path);
|
||||||
|
|
||||||
|
if(retv.errno)
|
||||||
|
return retv;
|
||||||
|
|
||||||
proc_t* proc = arch_getcls()->thread->proc;
|
proc_t* proc = arch_getcls()->thread->proc;
|
||||||
|
|
||||||
@@ -57,12 +66,11 @@ syscallret syscall_fstatat(int ifd, char* path, stat* st, int flags){
|
|||||||
if(retv.errno)
|
if(retv.errno)
|
||||||
goto _fail;
|
goto _fail;
|
||||||
|
|
||||||
|
|
||||||
memcpy(st, &node->st, sizeof(stat)); // XXX user memcpy
|
|
||||||
|
|
||||||
vfs_close(node);
|
vfs_close(node);
|
||||||
|
|
||||||
retv.ret = 0;
|
retv.errno = u_memcpy(st, &node->st, sizeof(stat));
|
||||||
|
|
||||||
|
retv.ret = retv.errno ? -1 : 0;
|
||||||
|
|
||||||
_fail:
|
_fail:
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
#include <arch/cls.h>
|
#include <arch/cls.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <kernel/vmm.h>
|
#include <kernel/vmm.h>
|
||||||
|
#include <kernel/ustring.h>
|
||||||
|
|
||||||
syscallret syscall_getdirent(int ifd, void* buff, size_t max_size){
|
syscallret syscall_getdirent(int ifd, void* buff, size_t max_size){
|
||||||
syscallret retv;
|
syscallret retv;
|
||||||
@@ -42,7 +43,12 @@ syscallret syscall_getdirent(int ifd, void* buff, size_t max_size){
|
|||||||
|
|
||||||
retv.ret *= sizeof(dent_t);
|
retv.ret *= sizeof(dent_t);
|
||||||
|
|
||||||
memcpy(buff, kbuff, retv.ret); // XXX use user memcpy
|
retv.errno = u_memcpy(buff, kbuff, retv.ret);
|
||||||
|
|
||||||
|
if(retv.errno){
|
||||||
|
retv.ret = -1;
|
||||||
|
return retv;
|
||||||
|
}
|
||||||
|
|
||||||
fd_release(fd);
|
fd_release(fd);
|
||||||
|
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
#include <kernel/fd.h>
|
#include <kernel/fd.h>
|
||||||
#include <kernel/sched.h>
|
#include <kernel/sched.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <kernel/ustring.h>
|
||||||
|
|
||||||
|
|
||||||
static int gettarget(fd_t** targ, dirnode_t** targnode, int ifd, proc_t* proc){
|
static int gettarget(fd_t** targ, dirnode_t** targnode, int ifd, proc_t* proc){
|
||||||
@@ -44,14 +45,29 @@ syscallret syscall_linkat(int srcdirfd, const char* srcpath, int tgtdirfd, const
|
|||||||
return retv;
|
return retv;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t srclen = strlen(srcpath);
|
size_t srclen;
|
||||||
size_t tgtlen = strlen(tgtpath);
|
size_t tgtlen;
|
||||||
|
|
||||||
|
retv.errno = u_strlen(srcpath, &srclen);
|
||||||
|
if(retv.errno)
|
||||||
|
return retv;
|
||||||
|
|
||||||
|
retv.errno = u_strlen(tgtpath, &tgtlen);
|
||||||
|
if(retv.errno)
|
||||||
|
return retv;
|
||||||
|
|
||||||
char srcbuff[srclen+1];
|
char srcbuff[srclen+1];
|
||||||
char tgtbuff[tgtlen+1];
|
char tgtbuff[tgtlen+1];
|
||||||
|
|
||||||
strcpy(srcbuff, srcpath);
|
|
||||||
strcpy(tgtbuff, tgtpath);
|
|
||||||
|
retv.errno = u_strcpy(srcbuff, srcpath);
|
||||||
|
if(retv.errno)
|
||||||
|
return retv;
|
||||||
|
|
||||||
|
retv.errno = u_strcpy(tgtbuff, tgtpath);
|
||||||
|
if(retv.errno)
|
||||||
|
return retv;
|
||||||
|
|
||||||
proc_t* proc = arch_getcls()->thread->proc;
|
proc_t* proc = arch_getcls()->thread->proc;
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
#include <arch/cls.h>
|
#include <arch/cls.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
#include <kernel/ustring.h>
|
||||||
|
|
||||||
syscallret syscall_mkdirat(int dirfd, const char* pathname, mode_t mode){
|
syscallret syscall_mkdirat(int dirfd, const char* pathname, mode_t mode){
|
||||||
syscallret retv;
|
syscallret retv;
|
||||||
@@ -15,9 +16,20 @@ syscallret syscall_mkdirat(int dirfd, const char* pathname, mode_t mode){
|
|||||||
|
|
||||||
proc_t* proc = arch_getcls()->thread->proc;
|
proc_t* proc = arch_getcls()->thread->proc;
|
||||||
|
|
||||||
char path[strlen(pathname)+1];
|
size_t len;
|
||||||
|
|
||||||
strcpy(path, pathname);
|
retv.errno = u_strlen(pathname, &len);
|
||||||
|
|
||||||
|
if(retv.errno)
|
||||||
|
return retv;
|
||||||
|
|
||||||
|
char path[len+1];
|
||||||
|
|
||||||
|
|
||||||
|
retv.errno = u_strcpy(path, pathname);
|
||||||
|
|
||||||
|
if(retv.errno)
|
||||||
|
return retv;
|
||||||
|
|
||||||
dirnode_t* target;
|
dirnode_t* target;
|
||||||
fd_t* targetfd;
|
fd_t* targetfd;
|
||||||
|
|||||||
+14
-10
@@ -7,6 +7,8 @@
|
|||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <kernel/alloc.h>
|
#include <kernel/alloc.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <kernel/ustring.h>
|
||||||
|
|
||||||
syscallret syscall_openat(int dirfd, const char* pathname, int flags, mode_t mode){
|
syscallret syscall_openat(int dirfd, const char* pathname, int flags, mode_t mode){
|
||||||
syscallret retv;
|
syscallret retv;
|
||||||
@@ -17,13 +19,19 @@ syscallret syscall_openat(int dirfd, const char* pathname, int flags, mode_t mod
|
|||||||
return retv;
|
return retv;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* name = alloc(strlen(pathname) + 1); // XXX use an user specific strlen func
|
size_t len;
|
||||||
if(!name){
|
|
||||||
retv.errno = ENOMEM;
|
|
||||||
return retv;
|
|
||||||
}
|
|
||||||
|
|
||||||
strcpy(name, pathname); // XXX use an user specific strcpy
|
retv.errno = u_strlen(pathname, &len);
|
||||||
|
|
||||||
|
if(retv.errno)
|
||||||
|
return retv;
|
||||||
|
|
||||||
|
char name[len+1];
|
||||||
|
|
||||||
|
retv.errno = u_strcpy(name, pathname);
|
||||||
|
|
||||||
|
if(retv.errno)
|
||||||
|
return retv;
|
||||||
|
|
||||||
proc_t* proc = arch_getcls()->thread->proc;
|
proc_t* proc = arch_getcls()->thread->proc;
|
||||||
|
|
||||||
@@ -34,7 +42,6 @@ syscallret syscall_openat(int dirfd, const char* pathname, int flags, mode_t mod
|
|||||||
|
|
||||||
if(err){
|
if(err){
|
||||||
retv.errno = err;
|
retv.errno = err;
|
||||||
free(name);
|
|
||||||
return retv;
|
return retv;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -47,7 +54,6 @@ syscallret syscall_openat(int dirfd, const char* pathname, int flags, mode_t mod
|
|||||||
|
|
||||||
if(err){
|
if(err){
|
||||||
retv.errno = err;
|
retv.errno = err;
|
||||||
free(name);
|
|
||||||
fd_release(fd);
|
fd_release(fd);
|
||||||
fd_free(&proc->fdtable, fd);
|
fd_free(&proc->fdtable, fd);
|
||||||
return retv;
|
return retv;
|
||||||
@@ -106,7 +112,6 @@ syscallret syscall_openat(int dirfd, const char* pathname, int flags, mode_t mod
|
|||||||
|
|
||||||
fd_release(fd);
|
fd_release(fd);
|
||||||
|
|
||||||
free(name);
|
|
||||||
retv.errno = 0;
|
retv.errno = 0;
|
||||||
retv.ret = ifd;
|
retv.ret = ifd;
|
||||||
|
|
||||||
@@ -122,7 +127,6 @@ syscallret syscall_openat(int dirfd, const char* pathname, int flags, mode_t mod
|
|||||||
|
|
||||||
fd_release(fd);
|
fd_release(fd);
|
||||||
fd_free(&proc->fdtable, fd);
|
fd_free(&proc->fdtable, fd);
|
||||||
free(name);
|
|
||||||
return retv;
|
return retv;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user