| 1 | 1325 | phoenix | #ifndef _LD_SYSCALL_H_
 | 
      
         | 2 |  |  | #define _LD_SYSCALL_H_
 | 
      
         | 3 |  |  |  
 | 
      
         | 4 |  |  | /* Pull in the arch specific syscall implementation */
 | 
      
         | 5 |  |  | #include <ld_syscalls.h>
 | 
      
         | 6 |  |  | /*  For MAP_ANONYMOUS -- differs between platforms */
 | 
      
         | 7 |  |  | #include <asm/mman.h>                   
 | 
      
         | 8 |  |  | /* Pull in whatever this particular arch's kernel thinks the kernel version of
 | 
      
         | 9 |  |  |  * struct stat should look like.  It turns out that each arch has a different
 | 
      
         | 10 |  |  |  * opinion on the subject, and different kernel revs use different names... */
 | 
      
         | 11 |  |  | #define kernel_stat stat
 | 
      
         | 12 |  |  | #include <bits/kernel_stat.h>
 | 
      
         | 13 |  |  |  
 | 
      
         | 14 |  |  |  
 | 
      
         | 15 |  |  | /* Encoding of the file mode.  */
 | 
      
         | 16 |  |  | #define S_IFMT          0170000 /* These bits determine file type.  */
 | 
      
         | 17 |  |  |  
 | 
      
         | 18 |  |  | /* File types.  */
 | 
      
         | 19 |  |  | #define S_IFDIR         0040000 /* Directory.  */
 | 
      
         | 20 |  |  | #define S_IFCHR         0020000 /* Character device.  */
 | 
      
         | 21 |  |  | #define S_IFBLK         0060000 /* Block device.  */
 | 
      
         | 22 |  |  | #define S_IFREG         0100000 /* Regular file.  */
 | 
      
         | 23 |  |  | #define S_IFIFO         0010000 /* FIFO.  */
 | 
      
         | 24 |  |  | #define S_IFLNK         0120000 /* Symbolic link.  */
 | 
      
         | 25 |  |  | #define S_IFSOCK        0140000 /* Socket.  */
 | 
      
         | 26 |  |  |  
 | 
      
         | 27 |  |  | /* Protection bits.  */
 | 
      
         | 28 |  |  |  
 | 
      
         | 29 |  |  | #define S_ISUID         04000   /* Set user ID on execution.  */
 | 
      
         | 30 |  |  | #define S_ISGID         02000   /* Set group ID on execution.  */
 | 
      
         | 31 |  |  | #define S_ISVTX         01000   /* Save swapped text after use (sticky).  */
 | 
      
         | 32 |  |  | #define S_IREAD         0400    /* Read by owner.  */
 | 
      
         | 33 |  |  | #define S_IWRITE        0200    /* Write by owner.  */
 | 
      
         | 34 |  |  | #define S_IEXEC         0100    /* Execute by owner.  */
 | 
      
         | 35 |  |  |  
 | 
      
         | 36 |  |  |  
 | 
      
         | 37 |  |  | /* Here are the definitions for some syscalls that are used
 | 
      
         | 38 |  |  |    by the dynamic linker.  The idea is that we want to be able
 | 
      
         | 39 |  |  |    to call these before the errno symbol is dynamicly linked, so
 | 
      
         | 40 |  |  |    we use our own version here.  Note that we cannot assume any
 | 
      
         | 41 |  |  |    dynamic linking at all, so we cannot return any error codes.
 | 
      
         | 42 |  |  |    We just punt if there is an error. */
 | 
      
         | 43 |  |  |  
 | 
      
         | 44 |  |  |  
 | 
      
         | 45 |  |  | #define __NR__dl_exit __NR_exit
 | 
      
         | 46 |  |  | static inline _syscall1(void, _dl_exit, int, status);
 | 
      
         | 47 |  |  |  
 | 
      
         | 48 |  |  |  
 | 
      
         | 49 |  |  | #define __NR__dl_close __NR_close
 | 
      
         | 50 |  |  | static inline _syscall1(int, _dl_close, int, fd);
 | 
      
         | 51 |  |  |  
 | 
      
         | 52 |  |  |  
 | 
      
         | 53 |  |  | #if defined(__powerpc__) || defined(__mips__) || defined(__sh__)
 | 
      
         | 54 |  |  | /* PowerPC, MIPS and SuperH have a different calling convention for mmap(). */
 | 
      
         | 55 |  |  | #define __NR__dl_mmap __NR_mmap
 | 
      
         | 56 |  |  | static inline _syscall6(void *, _dl_mmap, void *, start, size_t, length,
 | 
      
         | 57 |  |  |                 int, prot, int, flags, int, fd, off_t, offset);
 | 
      
         | 58 |  |  | #else
 | 
      
         | 59 |  |  | #define __NR__dl_mmap_real __NR_mmap
 | 
      
         | 60 |  |  | static inline _syscall1(void *, _dl_mmap_real, unsigned long *, buffer);
 | 
      
         | 61 |  |  |  
 | 
      
         | 62 |  |  | static inline void * _dl_mmap(void * addr, unsigned long size, int prot,
 | 
      
         | 63 |  |  |                 int flags, int fd, unsigned long offset)
 | 
      
         | 64 |  |  | {
 | 
      
         | 65 |  |  |         unsigned long buffer[6];
 | 
      
         | 66 |  |  |  
 | 
      
         | 67 |  |  |         buffer[0] = (unsigned long) addr;
 | 
      
         | 68 |  |  |         buffer[1] = (unsigned long) size;
 | 
      
         | 69 |  |  |         buffer[2] = (unsigned long) prot;
 | 
      
         | 70 |  |  |         buffer[3] = (unsigned long) flags;
 | 
      
         | 71 |  |  |         buffer[4] = (unsigned long) fd;
 | 
      
         | 72 |  |  |         buffer[5] = (unsigned long) offset;
 | 
      
         | 73 |  |  |         return (void *) _dl_mmap_real(buffer);
 | 
      
         | 74 |  |  | }
 | 
      
         | 75 |  |  | #endif
 | 
      
         | 76 |  |  |  
 | 
      
         | 77 |  |  | #ifndef _dl_MAX_ERRNO
 | 
      
         | 78 |  |  | #define _dl_MAX_ERRNO 4096
 | 
      
         | 79 |  |  | #endif
 | 
      
         | 80 |  |  | #define _dl_mmap_check_error(__res)     \
 | 
      
         | 81 |  |  |         (((int)__res) < 0 && ((int)__res) >= -_dl_MAX_ERRNO)
 | 
      
         | 82 |  |  | #ifndef MAP_ANONYMOUS
 | 
      
         | 83 |  |  | #ifdef __sparc__
 | 
      
         | 84 |  |  | #define MAP_ANONYMOUS 0x20
 | 
      
         | 85 |  |  | #else
 | 
      
         | 86 |  |  | #error MAP_ANONYMOUS not defined and suplementary value not known
 | 
      
         | 87 |  |  | #endif
 | 
      
         | 88 |  |  | #endif
 | 
      
         | 89 |  |  |  
 | 
      
         | 90 |  |  |  
 | 
      
         | 91 |  |  | #define __NR__dl_open __NR_open
 | 
      
         | 92 |  |  | #define O_RDONLY        0x0000
 | 
      
         | 93 |  |  | #define O_WRONLY             01
 | 
      
         | 94 |  |  | #define O_RDWR               02
 | 
      
         | 95 |  |  | #define O_CREAT            0100 /* not fcntl */
 | 
      
         | 96 |  |  | static inline _syscall2(int, _dl_open, const char *, fn, int, flags);
 | 
      
         | 97 |  |  |  
 | 
      
         | 98 |  |  | #define __NR__dl_write __NR_write
 | 
      
         | 99 |  |  | static inline _syscall3(unsigned long, _dl_write, int, fd,
 | 
      
         | 100 |  |  |             const void *, buf, unsigned long, count);
 | 
      
         | 101 |  |  |  
 | 
      
         | 102 |  |  |  
 | 
      
         | 103 |  |  | #define __NR__dl_read __NR_read
 | 
      
         | 104 |  |  | static inline _syscall3(unsigned long, _dl_read, int, fd,
 | 
      
         | 105 |  |  |             const void *, buf, unsigned long, count);
 | 
      
         | 106 |  |  |  
 | 
      
         | 107 |  |  | #define __NR__dl_mprotect __NR_mprotect
 | 
      
         | 108 |  |  | static inline _syscall3(int, _dl_mprotect, const void *, addr, unsigned long, len, int, prot);
 | 
      
         | 109 |  |  |  
 | 
      
         | 110 |  |  |  
 | 
      
         | 111 |  |  |  
 | 
      
         | 112 |  |  | #define __NR__dl_stat __NR_stat
 | 
      
         | 113 |  |  | static inline _syscall2(int, _dl_stat, const char *, file_name, struct stat *, buf);
 | 
      
         | 114 |  |  |  
 | 
      
         | 115 |  |  |  
 | 
      
         | 116 |  |  | #define __NR__dl_munmap __NR_munmap
 | 
      
         | 117 |  |  | static inline _syscall2(int, _dl_munmap, void *, start, unsigned long, length);
 | 
      
         | 118 |  |  |  
 | 
      
         | 119 |  |  | #define __NR__dl_getuid __NR_getuid
 | 
      
         | 120 |  |  | static inline _syscall0(uid_t, _dl_getuid);
 | 
      
         | 121 |  |  |  
 | 
      
         | 122 |  |  | #define __NR__dl_geteuid __NR_geteuid
 | 
      
         | 123 |  |  | static inline _syscall0(uid_t, _dl_geteuid);
 | 
      
         | 124 |  |  |  
 | 
      
         | 125 |  |  | #define __NR__dl_getgid __NR_getgid
 | 
      
         | 126 |  |  | static inline _syscall0(gid_t, _dl_getgid);
 | 
      
         | 127 |  |  |  
 | 
      
         | 128 |  |  | #define __NR__dl_getegid __NR_getegid
 | 
      
         | 129 |  |  | static inline _syscall0(gid_t, _dl_getegid);
 | 
      
         | 130 |  |  |  
 | 
      
         | 131 |  |  | #define __NR__dl_getpid __NR_getpid
 | 
      
         | 132 |  |  | static inline _syscall0(gid_t, _dl_getpid);
 | 
      
         | 133 |  |  |  
 | 
      
         | 134 |  |  | /*
 | 
      
         | 135 |  |  |  * Not an actual syscall, but we need something in assembly to say whether
 | 
      
         | 136 |  |  |  * this is OK or not.
 | 
      
         | 137 |  |  |  */
 | 
      
         | 138 |  |  | static inline int _dl_suid_ok(void)
 | 
      
         | 139 |  |  | {
 | 
      
         | 140 |  |  |     uid_t uid, euid, gid, egid;
 | 
      
         | 141 |  |  |  
 | 
      
         | 142 |  |  |     uid = _dl_getuid();
 | 
      
         | 143 |  |  |     euid = _dl_geteuid();
 | 
      
         | 144 |  |  |     gid = _dl_getgid();
 | 
      
         | 145 |  |  |     egid = _dl_getegid();
 | 
      
         | 146 |  |  |  
 | 
      
         | 147 |  |  |     if(uid == euid && gid == egid)
 | 
      
         | 148 |  |  |         return 1;
 | 
      
         | 149 |  |  |     else
 | 
      
         | 150 |  |  |         return 0;
 | 
      
         | 151 |  |  | }
 | 
      
         | 152 |  |  |  
 | 
      
         | 153 |  |  | #define __NR__dl_readlink __NR_readlink
 | 
      
         | 154 |  |  | static inline _syscall3(int, _dl_readlink, const char *, path, char *, buf, size_t, bufsiz);
 | 
      
         | 155 |  |  |  
 | 
      
         | 156 |  |  | #endif /* _LD_SYSCALL_H_ */
 | 
      
         | 157 |  |  |  
 |