blob: 8382e98a3b374f3b84aaeb26d50692fe8e3229de [file] [log] [blame]
/*
* Copyright (C) 2000, 2001 Jeff Dike (jdike@karaya.com)
* Licensed under the GPL
*/
#ifndef _UM_UNISTD_H_
#define _UM_UNISTD_H_
#include "linux/resource.h"
#include "asm/uaccess.h"
extern long sys_open(const char *filename, int flags, int mode);
extern long sys_dup(unsigned int fildes);
extern long sys_close(unsigned int fd);
extern int um_execve(const char *file, char *const argv[], char *const env[]);
extern long sys_setsid(void);
extern long sys_waitpid(pid_t pid, unsigned int * stat_addr, int options);
extern long sys_wait4(pid_t pid,unsigned int *stat_addr, int options,
struct rusage *ru);
extern long sys_mount(char *dev_name, char *dir_name, char *type,
unsigned long flags, void *data);
extern long sys_select(int n, fd_set *inp, fd_set *outp, fd_set *exp,
struct timeval *tvp);
extern long sys_lseek(unsigned int fildes, unsigned long offset, int whence);
extern long sys_read(unsigned int fildes, char *buf, int len);
extern long sys_write(unsigned int fildes, char *buf, int len);
#ifdef __KERNEL_SYSCALLS__
#define KERNEL_CALL(ret_t, sys, args...) \
mm_segment_t fs = get_fs(); \
ret_t ret; \
set_fs(KERNEL_DS); \
ret = sys(args); \
set_fs(fs); \
if (ret >= 0) \
return ret; \
errno = -(long)ret; \
return -1;
static inline long open(const char *pathname, int flags, int mode)
{
KERNEL_CALL(int, sys_open, pathname, flags, mode)
}
static inline long dup(unsigned int fd)
{
KERNEL_CALL(int, sys_dup, fd);
}
static inline long close(unsigned int fd)
{
KERNEL_CALL(int, sys_close, fd);
}
static inline int execve(const char *filename, char *const argv[],
char *const envp[])
{
KERNEL_CALL(int, um_execve, filename, argv, envp);
}
static inline long waitpid(pid_t pid, unsigned int *status, int options)
{
KERNEL_CALL(pid_t, sys_wait4, pid, status, options, NULL)
}
static inline pid_t wait(int *status)
{
KERNEL_CALL(pid_t, sys_wait4, -1, status, 0, NULL)
}
static inline pid_t setsid(void)
{
KERNEL_CALL(pid_t, sys_setsid)
}
static inline long lseek(unsigned int fd, off_t offset, unsigned int whence)
{
KERNEL_CALL(long, sys_lseek, fd, offset, whence)
}
static inline int read(unsigned int fd, char * buf, int len)
{
KERNEL_CALL(int, sys_read, fd, buf, len)
}
static inline int write(unsigned int fd, char * buf, int len)
{
KERNEL_CALL(int, sys_write, fd, buf, len)
}
#endif
/* Save the value of __KERNEL_SYSCALLS__, undefine it, include the underlying
* arch's unistd.h for the system call numbers, and restore the old
* __KERNEL_SYSCALLS__.
*/
#ifdef __KERNEL_SYSCALLS__
#define __SAVE_KERNEL_SYSCALLS__ __KERNEL_SYSCALLS__
#endif
#undef __KERNEL_SYSCALLS__
#include "asm/arch/unistd.h"
#ifdef __KERNEL_SYSCALLS__
#define __KERNEL_SYSCALLS__ __SAVE_KERNEL_SYSCALLS__
#endif
#endif
/*
* Overrides for Emacs so that we follow Linus's tabbing style.
* Emacs will notice this stuff at the end of the file and automatically
* adjust the settings for this buffer only. This must remain at the end
* of the file.
* ---------------------------------------------------------------------------
* Local variables:
* c-file-style: "linux"
* End:
*/