Retro68/gcc/newlib/libc/sys/arc/syscalls.c
2012-03-27 01:51:53 +02:00

132 lines
2.0 KiB
C

#include <sys/types.h>
#include <sys/stat.h>
#include <sys/syscall.h>
#include <_ansi.h>
#include <errno.h>
#include <fcntl.h>
#include <stdarg.h>
#include <reent.h>
_ssize_t
_read_r (struct _reent *r, int fd, void *buf, size_t nbytes)
{
int err;
_ssize_t rc;
SYSCALL (SYS_read, rc, err, fd, buf, nbytes);
if (err)
__errno_r (r) = err;
return rc;
}
_ssize_t
_write_r (struct _reent *r, int fd, const void *buf, size_t nbytes)
{
int err;
_ssize_t rc;
SYSCALL (SYS_write, rc, err, fd, buf, nbytes);
if (err)
__errno_r (r) = err;
return rc;
}
/* FIXME: The prototype in <fcntl.h> for open() uses ...,
but reent.h uses int. */
int
_open_r (struct _reent *r, const char *buf, int flags, int mode)
{
int rc,err;
#if 0
int mode;
va_list ap;
va_start (ap, flags);
mode = va_arg (ap, int);
va_end (ap);
#endif
SYSCALL (SYS_open, rc, err, buf, flags, mode);
if (err)
__errno_r (r) = err;
return rc;
}
int
_close_r (struct _reent *r, int fd)
{
int rc,err;
SYSCALL (SYS_close, rc, err, fd, 0, 0);
if (err)
__errno_r (r) = err;
return rc;
}
off_t
_lseek_r (struct _reent *r, int fd, off_t offset, int whence)
{
int err;
off_t rc;
SYSCALL (SYS_lseek, rc, err, fd, offset, whence);
if (err)
__errno_r (r) = err;
return rc;
}
int
_fstat_r (struct _reent *r, int fd, struct stat *buf)
{
int rc,err;
SYSCALL (SYS_fstat, rc, err, fd, buf, 0);
if (err)
__errno_r (r) = err;
return rc;
}
/* FIXME: Shouldn't this be _exit_r? */
void
_exit (int ret)
{
int rc,err;
SYSCALL (SYS_exit, rc, err, ret, 0, 0);
/* If that failed, use an infinite loop. */
while (1)
continue;
}
time_t
_time (time_t *timer)
{
return 0;
}
int
_creat_r (struct _reent *r, const char *path, int mode)
{
return _open_r (r, path, O_CREAT | O_TRUNC, mode);
}
int
_getpid_r (struct _reent *r)
{
return 42;
}
int
_kill_r (struct _reent *r, int pid, int sig)
{
int rc,err;
SYSCALL (SYS_kill, rc, err, pid, sig, 0);
if (err)
__errno_r (r) = err;
return rc;
}