apio
12cf37d0a7
Previously, sys_write only wrote to the tty. Now, it uses the VFS interface, as it should.
92 lines
2.4 KiB
C++
92 lines
2.4 KiB
C++
#include <bits/error.h>
|
|
#include <luna.h>
|
|
#include <luna/syscall.h>
|
|
#include <stdarg.h>
|
|
#include <unistd.h>
|
|
|
|
extern "C"
|
|
{
|
|
int execv(const char*, char* const[])
|
|
{
|
|
NOT_IMPLEMENTED("execv");
|
|
}
|
|
int execve(const char*, char* const[], char* const[])
|
|
{
|
|
NOT_IMPLEMENTED("execve");
|
|
}
|
|
int execvp(const char*, char* const[])
|
|
{
|
|
NOT_IMPLEMENTED("execvp");
|
|
}
|
|
pid_t fork(void)
|
|
{
|
|
NOT_IMPLEMENTED("fork");
|
|
}
|
|
|
|
long syscall(long number, ...)
|
|
{
|
|
typedef unsigned long int arg;
|
|
long result;
|
|
va_list ap;
|
|
va_start(ap, number);
|
|
switch (number)
|
|
{
|
|
case SYS_yield:
|
|
case SYS_gettid:
|
|
case SYS_rand: result = __luna_syscall0(number); break;
|
|
case SYS_exit:
|
|
case SYS_close:
|
|
case SYS_sleep: result = __luna_syscall1(number, va_arg(ap, arg)); break;
|
|
case SYS_munmap:
|
|
case SYS_open:
|
|
case SYS_getversion: {
|
|
arg arg0 = va_arg(ap, arg);
|
|
arg arg1 = va_arg(ap, arg);
|
|
result = __luna_syscall2(number, arg0, arg1);
|
|
break;
|
|
}
|
|
case SYS_write:
|
|
case SYS_read:
|
|
case SYS_mmap: {
|
|
arg arg0 = va_arg(ap, arg);
|
|
arg arg1 = va_arg(ap, arg);
|
|
arg arg2 = va_arg(ap, arg);
|
|
result = __luna_syscall3(number, arg0, arg1, arg2);
|
|
break;
|
|
}
|
|
case SYS_paint: {
|
|
arg arg0 = va_arg(ap, arg);
|
|
arg arg1 = va_arg(ap, arg);
|
|
arg arg2 = va_arg(ap, arg);
|
|
arg arg3 = va_arg(ap, arg);
|
|
arg arg4 = va_arg(ap, arg);
|
|
result = __luna_syscall5(number, arg0, arg1, arg2, arg3, arg4);
|
|
break;
|
|
}
|
|
default: result = -ENOSYS; break;
|
|
}
|
|
va_end(ap);
|
|
if (number == SYS_mmap) { _RETURN_WITH_MEMORY_ERRNO(result, long int); }
|
|
else { _RETURN_WITH_ERRNO(result, long); }
|
|
}
|
|
|
|
unsigned int sleep(unsigned int seconds)
|
|
{
|
|
return msleep(seconds * 1000);
|
|
}
|
|
|
|
ssize_t read(int fd, void* buf, size_t count)
|
|
{
|
|
return syscall(SYS_read, fd, count, buf); // yes, our read() syscall is in the wrong order.
|
|
}
|
|
|
|
ssize_t write(int fd, const void* buf, size_t count)
|
|
{
|
|
return syscall(SYS_write, fd, count, buf); // yes, our read() syscall is in the wrong order.
|
|
}
|
|
|
|
int close(int fd)
|
|
{
|
|
return (int)syscall(SYS_close, fd);
|
|
}
|
|
} |