diff options
| -rw-r--r-- | libc/sysdeps/linux/common/syscalls.c | 177 | 
1 files changed, 173 insertions, 4 deletions
| diff --git a/libc/sysdeps/linux/common/syscalls.c b/libc/sysdeps/linux/common/syscalls.c index 389ce9e1d..b3498f406 100644 --- a/libc/sysdeps/linux/common/syscalls.c +++ b/libc/sysdeps/linux/common/syscalls.c @@ -93,7 +93,15 @@ weak_alias(__libc_close, close)  //#define __NR_creat            8  #ifdef L_creat  #include <fcntl.h> +#ifdef __NR_creat  _syscall2(int, creat, const char *, file, mode_t, mode); +#else +extern int __libc_open (const char *file, int flags, mode_t mode); +int creat (const char *file, mode_t mode) +{ +	  return __libc_open (file, O_WRONLY|O_CREAT|O_TRUNC, mode); +} +#endif  #endif  //#define __NR_link             9 @@ -124,7 +132,21 @@ _syscall1(int, chdir, const char *, path);  //#define __NR_time             13  #ifdef L_time  #include <time.h> +#include <sys/time.h> +#ifdef __NR_time  _syscall1(time_t, time, time_t *, t); +#else +time_t time (time_t *t) +{  +	time_t result; +	struct timeval tv; +	if (gettimeofday (&tv, (struct timezone *) NULL)) { +		result = (time_t) -1; +	} else { result = (time_t) tv.tv_sec; } +	if (t != NULL) { *t = result; } +	return result; +} +#endif  #endif  //#define __NR_mknod            14 @@ -181,6 +203,9 @@ weak_alias(__libc_lseek, lseek)  //#define __NR_getpid           20  #ifdef L___libc_getpid  #include <unistd.h> +#if defined (__alpha__) +#define __NR_getpid     __NR_getxpid +#endif  #define __NR___libc_getpid __NR_getpid  _syscall0(pid_t, __libc_getpid);  weak_alias(__libc_getpid, getpid) @@ -220,13 +245,28 @@ int setuid(uid_t uid)  //#define __NR_getuid           24  #ifdef L_getuid  #include <unistd.h> +#if defined (__alpha__) +#define __NR_getuid     __NR_getxuid +#endif  _syscall0(uid_t, getuid);  #endif  //#define __NR_stime            25  #ifdef L_stime  #include <time.h> +#include <sys/time.h> +#ifdef _NR_stime  _syscall1(int, stime, const time_t *, t); +#else +int stime(const time_t *when) +{  +	struct timeval tv; +	if (when == NULL) { __set_errno (EINVAL); return -1; } +	tv.tv_sec = *when; +	tv.tv_usec = 0; +	return settimeofday (&tv, (struct timezone *) 0); +} +#endif  #endif  //#define __NR_ptrace           26 @@ -241,7 +281,24 @@ _syscall4(long, __ptrace, enum __ptrace_request, request, pid_t, pid,  //#define __NR_alarm            27  #ifdef L_alarm  #include <unistd.h> +#ifdef __NR_alarm  _syscall1(unsigned int, alarm, unsigned int, seconds); +#else +#include <sys/time.h> +unsigned int alarm (unsigned int seconds) +{ +	struct itimerval old, new; +	unsigned int retval; +	new.it_value.tv_usec = 0; +	new.it_interval.tv_sec = 0; +	new.it_interval.tv_usec = 0; +	new.it_value.tv_sec = (long int) seconds; +	if (setitimer (ITIMER_REAL, &new, &old) < 0) { return 0; } +	retval = old.it_value.tv_sec; +	if (old.it_value.tv_usec) { ++retval; } +	return retval; +} +#endif  #endif  //#define __NR_oldfstat         28 @@ -249,15 +306,61 @@ _syscall1(unsigned int, alarm, unsigned int, seconds);  //#define __NR_pause            29  #ifdef L___libc_pause  #include <unistd.h> +#ifdef __NR_pause  #define __NR___libc_pause __NR_pause  _syscall0(int, __libc_pause); +#else +#include <signal.h> +int __libc_pause (void) +{ +	return(__sigpause(sigblock(0), 0)); +} +#endif  weak_alias(__libc_pause, pause)  #endif  //#define __NR_utime            30  #ifdef L_utime  #include <utime.h> -_syscall2(int, utime, const char *, filename, const struct utimbuf *, buf); +#ifdef __NR_utime +_syscall2(int, utime, const char *, file, const struct utimbuf *, times); +#else +#include <stdlib.h> +#include <sys/time.h> +int utime(const char *file, const struct utimbuf *times) +{ +	struct timeval timevals[2]; +	if (times != NULL) { +		timevals[0].tv_usec = 0L; +		timevals[1].tv_usec = 0L; +		timevals[0].tv_sec = (long int) times->actime; +		timevals[1].tv_sec = (long int) times->modtime; +	} else { +		if (gettimeofday (&timevals[0], NULL) < 0) { return -1; } +		timevals[1] = timevals[0]; +	} +	return utimes(file, timevals); +} +#endif +#endif + +//#define __NR_utimed +#ifdef L_utimes +#include <utime.h> +#ifdef __NR_utimes +_syscall2(int, utimes, const char *, file, const struct timeval *, tvp); +#else +int utimes (const char *file, const struct timeval tvp[2]) +{ +	struct utimbuf buf, *times; +	if (tvp) { +		times = &buf; +		times->actime = tvp[0].tv_sec; +		times->modtime = tvp[1].tv_sec; +	} else { times = NULL; } +	return utime(file, times); +} +#endif  #endif  //#define __NR_stty             31 @@ -289,7 +392,24 @@ _syscall2(int, access, const char *, pathname, int, mode);  //#define __NR_nice             34  #ifdef L_nice  #include <unistd.h> +#ifdef __NR_nice  _syscall1(int, nice, int, inc); +#else +#include <sys/resource.h> +int nice (int incr) +{ +	int save, prio, result; +	save = errno; +	__set_errno (0); +	prio = getpriority (PRIO_PROCESS, 0); +	if (prio == -1) { +		if (errno != 0) { return -1; }  +		else { __set_errno (save); } +	} +	result = setpriority (PRIO_PROCESS, 0, prio + incr); +	if (result != -1) { return prio + incr; } else { return -1; } +} +#endif  #endif  //#define __NR_ftime            35 @@ -356,6 +476,9 @@ _syscall1(int, setgid, gid_t, gid);  //#define __NR_getgid           47  #ifdef L_getgid  #include <unistd.h> +#if defined (__alpha__) +#define __NR_getgid     __NR_getxgid +#endif  _syscall0(gid_t, getgid);  #endif @@ -363,8 +486,8 @@ _syscall0(gid_t, getgid);  //#define __NR_geteuid          49  #ifdef	L_geteuid +#include <unistd.h>  #	ifdef	__NR_geteuid -#	include <unistd.h>  	_syscall0(uid_t, geteuid);  #	else  	uid_t geteuid(void) @@ -376,8 +499,8 @@ _syscall0(gid_t, getgid);  //#define __NR_getegid          50  #ifdef	L_getegid +#include <unistd.h>  #	ifdef	__NR_getegid -#	include <unistd.h>  	_syscall0(gid_t, getegid);  #	else  	gid_t getegid(void) @@ -797,8 +920,10 @@ _syscall2(int, fstatfs, int, fd, struct statfs *, buf);  //#define __NR_socketcall       102  #ifdef L_socketcall +#ifdef __NR_socketcall  _syscall2(int, socketcall, int, call, unsigned long *, args);  #endif +#endif  //#define __NR_syslog           103  #ifdef L__syslog @@ -949,9 +1074,11 @@ _syscall1(int, sysinfo, struct sysinfo *, info);  //#define __NR_ipc              117  #ifdef L___ipc +#ifdef __NR_ipc  #define __NR___ipc __NR_ipc  _syscall5(int, __ipc, unsigned int, call, int, first, int, second, int, third, void *, ptr);  #endif +#endif  //#define __NR_fsync            118  #ifdef L___libc_fsync @@ -1085,6 +1212,7 @@ _syscall1(int, setfsgid, gid_t, gid);  //#define __NR__llseek          140  #ifdef L__llseek  #ifdef __UCLIBC_HAVE_LFS__ +#ifdef _NR_llseek  extern int _llseek(int fd, __off_t offset_hi, __off_t offset_lo,   		__loff_t *result, int whence); @@ -1103,6 +1231,11 @@ __loff_t __libc_lseek64(int fd, __loff_t offset, int whence)  }  weak_alias(__libc_lseek64, llseek);  weak_alias(__libc_lseek64, lseek64); +#else +extern __off_t __libc_lseek(int fildes, __off_t offset, int whence); +weak_alias(__libc_lseek, llseek); +weak_alias(__libc_lseek, lseek64); +#endif  #endif  #endif @@ -1114,13 +1247,20 @@ _syscall3(int, getdents, int, fd, char *, dirp, size_t, count);  #endif  //#define __NR__newselect       142 -#ifdef L__newselect +#if defined L__newselect || defined L_select  #include <unistd.h> +#ifdef _NR__newselect  extern int _newselect(int n, fd_set *readfds, fd_set *writefds,  					  fd_set *exceptfds, struct timeval *timeout);  _syscall5(int, _newselect, int, n, fd_set *, readfds, fd_set *, writefds,  		fd_set *, exceptfds, struct timeval *, timeout);  weak_alias(_newselect, select); +#else +extern int select(int n, fd_set *readfds, fd_set *writefds,  +		fd_set *exceptfds, struct timeval *timeout); +_syscall5(int, select, int, n, fd_set *, readfds, fd_set *, writefds, +		fd_set *, exceptfds, struct timeval *, timeout); +#endif  #endif  //#define __NR_flock            143 @@ -1494,6 +1634,7 @@ int getrlimit (__rlimit_resource_t resource, struct rlimit *rlimits)  #ifdef L___stat64  #ifdef __UCLIBC_HAVE_LFS__  #include <unistd.h> +#ifdef __NR_stat64  #include "statfix64.h"  #define __NR___stat64	__NR_stat64  extern int __stat64(const char *file_name, struct kernel_stat64 *buf); @@ -1514,6 +1655,13 @@ int stat64(const char *file_name, struct libc_stat64 *buf)  {  	return(__xstat64(0, file_name, buf));  } +#else +struct stat; +extern int stat(const char *file_name, struct stat *buf); +extern int __xstat(int version, const char * file_name, struct stat *cstat); +weak_alias(stat, stat64); +weak_alias(__xstat, __xstat64); +#endif  #endif /* __UCLIBC_HAVE_LFS__ */  #endif @@ -1521,6 +1669,7 @@ int stat64(const char *file_name, struct libc_stat64 *buf)  #ifdef L___lstat64  #ifdef __UCLIBC_HAVE_LFS__  #include <unistd.h> +#ifdef __NR_lstat64  #include "statfix64.h"  #define __NR___lstat64	__NR_lstat64  extern int __lstat64(const char *file_name, struct kernel_stat64 *buf); @@ -1541,6 +1690,13 @@ int lstat64(const char *file_name, struct libc_stat64 *buf)  {  	return(__lxstat64(0, file_name, buf));  } +#else +struct stat; +extern int lstat(const char *file_name, struct stat *buf); +extern int __lxstat(int version, const char * file_name, struct stat * cstat); +weak_alias(lstat, lstat64); +weak_alias(__lxstat, __lxstat64); +#endif  #endif /* __UCLIBC_HAVE_LFS__ */  #endif @@ -1548,6 +1704,7 @@ int lstat64(const char *file_name, struct libc_stat64 *buf)  #ifdef L___fstat64  #ifdef __UCLIBC_HAVE_LFS__  #include <unistd.h> +#ifdef __NR_fstat64  #include "statfix64.h"  #define __NR___fstat64	__NR_fstat64  extern int __fstat64(int filedes, struct kernel_stat64 *buf); @@ -1568,6 +1725,13 @@ int fstat64(int filedes, struct libc_stat64 *buf)  {  	return(__fxstat64(0, filedes, buf));  } +#else +struct stat; +extern int fstat(int filedes, struct stat *buf); +extern int __fxstat(int version, int fd, struct stat * cstat); +weak_alias(fstat, fstat64); +weak_alias(__fxstat, __fxstat64); +#endif  #endif /* __UCLIBC_HAVE_LFS__ */  #endif @@ -1614,6 +1778,7 @@ _syscall3(int, getdents64, int, fd, char *, dirp, size_t, count);  //#define __NR_fcntl64		221  #ifdef L__fcntl64  #ifdef __UCLIBC_HAVE_LFS__ +#ifdef __NR_fcntl64  #define __NR__fcntl64 __NR_fcntl64  #include <stdarg.h>  #include <fcntl.h> @@ -1632,6 +1797,10 @@ int fcntl64(int fd, int command, ...)  	va_end(list);  	return _fcntl64(fd, command, arg);  } +#else +extern int __libc_fcntl(int fd, int command, ...); +weak_alias(__libc_fcntl, fcntl64) +#endif  #endif  #endif | 
