|
@@ -1,36 +1,68 @@
|
|
|
+#include <errno.h>
|
|
|
#include <stdarg.h>
|
|
|
+#include <stdint.h>
|
|
|
#include <sys/ioctl.h>
|
|
|
#include <unistd.h>
|
|
|
#include <syscall.h>
|
|
|
|
|
|
ssize_t read(int fd, void* buf, size_t count)
|
|
|
{
|
|
|
- return syscall3(SYS_read, fd, (uint32_t)buf, count);
|
|
|
+ ssize_t ret = syscall3(SYS_read, fd, (uint32_t)buf, count);
|
|
|
+ if (ret < 0) {
|
|
|
+ errno = -ret;
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
ssize_t write(int fd, const void* buf, size_t count)
|
|
|
{
|
|
|
- return syscall3(SYS_write, fd, (uint32_t)buf, count);
|
|
|
+ ssize_t ret = syscall3(SYS_write, fd, (uint32_t)buf, count);
|
|
|
+ if (ret < 0) {
|
|
|
+ errno = -ret;
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
int dup(int oldfd)
|
|
|
{
|
|
|
- return syscall1(SYS_dup, oldfd);
|
|
|
+ int ret = syscall1(SYS_dup, oldfd);
|
|
|
+ if (ret < 0) {
|
|
|
+ errno = -ret;
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
int dup2(int oldfd, int newfd)
|
|
|
{
|
|
|
- return syscall2(SYS_dup2, oldfd, newfd);
|
|
|
+ int ret = syscall2(SYS_dup2, oldfd, newfd);
|
|
|
+ if (ret < 0) {
|
|
|
+ errno = -ret;
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
int pipe(int pipefd[2])
|
|
|
{
|
|
|
- return syscall1(SYS_pipe, (uint32_t)pipefd);
|
|
|
+ int ret = syscall1(SYS_pipe, (uint32_t)pipefd);
|
|
|
+ if (ret < 0) {
|
|
|
+ errno = -ret;
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
int close(int fd)
|
|
|
{
|
|
|
- return syscall1(SYS_close, fd);
|
|
|
+ int ret = syscall1(SYS_close, fd);
|
|
|
+ if (ret < 0) {
|
|
|
+ errno = -ret;
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
_Noreturn void _exit(int code)
|
|
@@ -42,12 +74,22 @@ _Noreturn void _exit(int code)
|
|
|
|
|
|
pid_t fork(void)
|
|
|
{
|
|
|
- return syscall0(SYS_fork);
|
|
|
+ pid_t ret = syscall0(SYS_fork);
|
|
|
+ if (ret < 0) {
|
|
|
+ errno = -ret;
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
int execve(const char* pathname, char* const argv[], char* const envp[])
|
|
|
{
|
|
|
- return syscall3(SYS_execve, (uint32_t)pathname, (uint32_t)argv, (uint32_t)envp);
|
|
|
+ int ret = syscall3(SYS_execve, (uint32_t)pathname, (uint32_t)argv, (uint32_t)envp);
|
|
|
+ if (ret < 0) {
|
|
|
+ errno = -ret;
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
unsigned int sleep(unsigned int seconds)
|
|
@@ -57,37 +99,72 @@ unsigned int sleep(unsigned int seconds)
|
|
|
|
|
|
int chdir(const char* path)
|
|
|
{
|
|
|
- return syscall1(SYS_chdir, (uint32_t)path);
|
|
|
+ int ret = syscall1(SYS_chdir, (uint32_t)path);
|
|
|
+ if (ret < 0) {
|
|
|
+ errno = -ret;
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
char* getcwd(char* buf, size_t bufsize)
|
|
|
{
|
|
|
- return (char*)syscall2(SYS_getcwd, (uint32_t)buf, bufsize);
|
|
|
+ int ret = syscall2(SYS_getcwd, (uint32_t)buf, bufsize);
|
|
|
+ if (ret < 0) {
|
|
|
+ errno = -ret;
|
|
|
+ return NULL;
|
|
|
+ }
|
|
|
+ return buf;
|
|
|
}
|
|
|
|
|
|
pid_t getpid(void)
|
|
|
{
|
|
|
- return syscall0(SYS_getpid);
|
|
|
+ pid_t ret = syscall0(SYS_getpid);
|
|
|
+ if (ret < 0) {
|
|
|
+ errno = -ret;
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
pid_t getppid(void)
|
|
|
{
|
|
|
- return syscall0(SYS_getppid);
|
|
|
+ pid_t ret = syscall0(SYS_getppid);
|
|
|
+ if (ret < 0) {
|
|
|
+ errno = -ret;
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
int setpgid(pid_t pid, pid_t pgid)
|
|
|
{
|
|
|
- return syscall2(SYS_setpgid, pid, pgid);
|
|
|
+ int ret = syscall2(SYS_setpgid, pid, pgid);
|
|
|
+ if (ret < 0) {
|
|
|
+ errno = -ret;
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
pid_t setsid(void)
|
|
|
{
|
|
|
- return syscall0(SYS_setsid);
|
|
|
+ pid_t ret = syscall0(SYS_setsid);
|
|
|
+ if (ret < 0) {
|
|
|
+ errno = -ret;
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
pid_t getsid(pid_t pid)
|
|
|
{
|
|
|
- return syscall1(SYS_getsid, pid);
|
|
|
+ pid_t ret = syscall1(SYS_getsid, pid);
|
|
|
+ if (ret < 0) {
|
|
|
+ errno = -ret;
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
pid_t tcgetpgrp(int fd)
|
|
@@ -103,7 +180,7 @@ int tcsetpgrp(int fd, pid_t pgrp)
|
|
|
|
|
|
int ioctl(int fd, unsigned long request, ...)
|
|
|
{
|
|
|
- int ret = -1;
|
|
|
+ int ret = -EINVAL;
|
|
|
|
|
|
va_list args;
|
|
|
va_start(args, request);
|
|
@@ -120,5 +197,11 @@ int ioctl(int fd, unsigned long request, ...)
|
|
|
}
|
|
|
|
|
|
va_end(args);
|
|
|
+
|
|
|
+ if (ret < 0) {
|
|
|
+ errno = -ret;
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
return ret;
|
|
|
}
|