OSDN Git Service

Make syscalls.c way more generic. Now works on alpha...
authorEric Andersen <andersen@codepoet.org>
Thu, 30 May 2002 02:05:42 +0000 (02:05 -0000)
committerEric Andersen <andersen@codepoet.org>
Thu, 30 May 2002 02:05:42 +0000 (02:05 -0000)
 -Erik

libc/sysdeps/linux/common/syscalls.c

index 389ce9e..b3498f4 100644 (file)
@@ -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