diff options
Diffstat (limited to 'newlib/libc/sys/mmixware/lseek.c')
-rw-r--r-- | newlib/libc/sys/mmixware/lseek.c | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/newlib/libc/sys/mmixware/lseek.c b/newlib/libc/sys/mmixware/lseek.c new file mode 100644 index 000000000..9405dd2a4 --- /dev/null +++ b/newlib/libc/sys/mmixware/lseek.c @@ -0,0 +1,61 @@ +/* lseek for MMIXware. + + Copyright (C) 2001 Hans-Peter Nilsson. + + Permission to use, copy, modify, and distribute this software is freely + granted, provided that this notice is preserved with no changes. + THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE. */ + +#include <_ansi.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <sys/unistd.h> +#include "sys/syscall.h" +#include <errno.h> + +off_t +_lseek (int file, + off_t ptr, + int dir) +{ + off_t simoff = dir == SEEK_END ? -(ptr + 1) : ptr; + long ret; + + if ((unsigned int) file >= 32 || _MMIX_allocated_filehandle[file] == 0) + { + errno = EBADF; + return -1; + } + + if (dir == SEEK_CUR) + { + long curpos = TRAP2f (SYS_Ftell, file, 0); + + if (curpos == -1) + { + errno = EIO; + return -1; + } + + ptr += (off_t) curpos; + } + + ret = TRAP2f (SYS_Fseek, file, simoff); + if (ret == -1) + { + return -1; + errno = EIO; + } + + ret = TRAP2f (SYS_Ftell, file, 0); + if (ret == -1) + { + errno = EIO; + return -1; + } + + return ret; +} |