| /* go-nosys.c -- functions missing from system. |
| |
| Copyright 2012 The Go Authors. All rights reserved. |
| Use of this source code is governed by a BSD-style |
| license that can be found in the LICENSE file. */ |
| |
| /* This file exists to provide definitions for functions that are |
| missing from libc, according to the configure script. This permits |
| the Go syscall package to not worry about whether the functions |
| exist or not. */ |
| |
| #include "config.h" |
| |
| #include <errno.h> |
| #include <fcntl.h> |
| #include <math.h> |
| #include <pthread.h> |
| #include <stdint.h> |
| #include <stdlib.h> |
| #include <string.h> |
| #include <sys/types.h> |
| #include <sys/resource.h> |
| #include <sys/socket.h> |
| #include <sys/stat.h> |
| #include <sys/time.h> |
| #include <sys/wait.h> |
| #include <time.h> |
| #include <unistd.h> |
| |
| #ifndef HAVE_OFF64_T |
| typedef signed int off64_t __attribute__ ((mode (DI))); |
| #endif |
| |
| #ifndef HAVE_LOFF_T |
| typedef off64_t loff_t; |
| #endif |
| |
| #ifndef HAVE_ACCEPT4 |
| struct sockaddr; |
| int |
| accept4 (int sockfd __attribute__ ((unused)), |
| struct sockaddr *addr __attribute__ ((unused)), |
| socklen_t *addrlen __attribute__ ((unused)), |
| int flags __attribute__ ((unused))) |
| { |
| errno = ENOSYS; |
| return -1; |
| } |
| #endif |
| |
| #ifndef HAVE_DUP3 |
| int |
| dup3 (int oldfd __attribute__ ((unused)), |
| int newfd __attribute__ ((unused)), |
| int flags __attribute__ ((unused))) |
| { |
| errno = ENOSYS; |
| return -1; |
| } |
| #endif |
| |
| #ifndef HAVE_EPOLL_CREATE1 |
| int |
| epoll_create1 (int flags __attribute__ ((unused))) |
| { |
| errno = ENOSYS; |
| return -1; |
| } |
| #endif |
| |
| #ifndef HAVE_FACCESSAT |
| int |
| faccessat (int fd __attribute__ ((unused)), |
| const char *pathname __attribute__ ((unused)), |
| int mode __attribute__ ((unused)), |
| int flags __attribute__ ((unused))) |
| { |
| errno = ENOSYS; |
| return -1; |
| } |
| #endif |
| |
| #ifndef HAVE_FALLOCATE |
| int |
| fallocate (int fd __attribute__ ((unused)), |
| int mode __attribute__ ((unused)), |
| off_t offset __attribute__ ((unused)), |
| off_t len __attribute__ ((unused))) |
| { |
| errno = ENOSYS; |
| return -1; |
| } |
| #endif |
| |
| #ifndef HAVE_FCHMODAT |
| int |
| fchmodat (int dirfd __attribute__ ((unused)), |
| const char *pathname __attribute__ ((unused)), |
| mode_t mode __attribute__ ((unused)), |
| int flags __attribute__ ((unused))) |
| { |
| errno = ENOSYS; |
| return -1; |
| } |
| #endif |
| |
| #ifndef HAVE_FCHOWNAT |
| int |
| fchownat (int dirfd __attribute__ ((unused)), |
| const char *pathname __attribute__ ((unused)), |
| uid_t owner __attribute__ ((unused)), |
| gid_t group __attribute__ ((unused)), |
| int flags __attribute__ ((unused))) |
| { |
| errno = ENOSYS; |
| return -1; |
| } |
| #endif |
| |
| #ifndef HAVE_FUTIMESAT |
| int |
| futimesat (int dirfd __attribute__ ((unused)), |
| const char *pathname __attribute__ ((unused)), |
| const struct timeval times[2] __attribute__ ((unused))) |
| { |
| errno = ENOSYS; |
| return -1; |
| } |
| #endif |
| |
| #ifndef HAVE_GETXATTR |
| ssize_t |
| getxattr (const char *path __attribute__ ((unused)), |
| const char *name __attribute__ ((unused)), |
| void *value __attribute__ ((unused)), |
| size_t size __attribute__ ((unused))) |
| { |
| errno = ENOSYS; |
| return -1; |
| } |
| #endif |
| |
| #ifndef HAVE_INOTIFY_ADD_WATCH |
| int |
| inotify_add_watch (int fd __attribute__ ((unused)), |
| const char* pathname __attribute__ ((unused)), |
| uint32_t mask __attribute__ ((unused))) |
| { |
| errno = ENOSYS; |
| return -1; |
| } |
| #endif |
| |
| #ifndef HAVE_INOTIFY_INIT |
| int |
| inotify_init (void) |
| { |
| errno = ENOSYS; |
| return -1; |
| } |
| #endif |
| |
| #ifndef HAVE_INOTIFY_INIT1 |
| int |
| inotify_init1 (int flags __attribute__ ((unused))) |
| { |
| errno = ENOSYS; |
| return -1; |
| } |
| #endif |
| |
| #ifndef HAVE_INOTIFY_RM_WATCH |
| int |
| inotify_rm_watch (int fd __attribute__ ((unused)), |
| uint32_t wd __attribute__ ((unused))) |
| { |
| errno = ENOSYS; |
| return -1; |
| } |
| #endif |
| |
| #ifndef HAVE_LISTXATTR |
| ssize_t |
| listxattr (const char *path __attribute__ ((unused)), |
| char *list __attribute__ ((unused)), |
| size_t size __attribute__ ((unused))) |
| { |
| errno = ENOSYS; |
| return -1; |
| } |
| #endif |
| |
| #ifndef HAVE_MKDIRAT |
| int |
| mkdirat (int dirfd __attribute__ ((unused)), |
| const char *pathname __attribute__ ((unused)), |
| mode_t mode __attribute__ ((unused))) |
| { |
| errno = ENOSYS; |
| return -1; |
| } |
| #endif |
| |
| #ifndef HAVE_MKNODAT |
| int |
| mknodat (int dirfd __attribute__ ((unused)), |
| const char *pathname __attribute__ ((unused)), |
| mode_t mode __attribute__ ((unused)), |
| dev_t dev __attribute__ ((unused))) |
| { |
| errno = ENOSYS; |
| return -1; |
| } |
| #endif |
| |
| #ifndef HAVE_OPENAT |
| int |
| openat (int dirfd __attribute__ ((unused)), |
| const char *pathname __attribute__ ((unused)), |
| int oflag __attribute__ ((unused)), |
| ...) |
| { |
| errno = ENOSYS; |
| return -1; |
| } |
| #endif |
| |
| #ifndef HAVE_PIPE2 |
| int |
| pipe2 (int pipefd[2] __attribute__ ((unused)), |
| int flags __attribute__ ((unused))) |
| { |
| errno = ENOSYS; |
| return -1; |
| } |
| #endif |
| |
| #ifndef HAVE_REMOVEXATTR |
| int |
| removexattr (const char *path __attribute__ ((unused)), |
| const char *name __attribute__ ((unused))) |
| { |
| errno = ENOSYS; |
| return -1; |
| } |
| #endif |
| |
| #ifndef HAVE_RENAMEAT |
| int |
| renameat (int olddirfd __attribute__ ((unused)), |
| const char *oldpath __attribute__ ((unused)), |
| int newdirfd __attribute__ ((unused)), |
| const char *newpath __attribute__ ((unused))) |
| { |
| errno = ENOSYS; |
| return -1; |
| } |
| #endif |
| |
| #ifndef HAVE_SETXATTR |
| int |
| setxattr (const char *path __attribute__ ((unused)), |
| const char *name __attribute__ ((unused)), |
| const void *value __attribute__ ((unused)), |
| size_t size __attribute__ ((unused)), |
| int flags __attribute__ ((unused))) |
| { |
| errno = ENOSYS; |
| return -1; |
| } |
| #endif |
| |
| #ifndef HAVE_SPLICE |
| int |
| splice (int fd __attribute__ ((unused)), |
| loff_t *off_in __attribute__ ((unused)), |
| int fd_out __attribute__ ((unused)), |
| loff_t *off_out __attribute__ ((unused)), |
| size_t len __attribute__ ((unused)), |
| unsigned int flags __attribute__ ((unused))) |
| { |
| errno = ENOSYS; |
| return -1; |
| } |
| #endif |
| |
| #ifndef HAVE_SYNC_FILE_RANGE |
| int |
| sync_file_range (int fd __attribute__ ((unused)), |
| off64_t offset __attribute__ ((unused)), |
| off64_t nbytes __attribute__ ((unused)), |
| unsigned int flags __attribute__ ((unused))) |
| { |
| errno = ENOSYS; |
| return -1; |
| } |
| #endif |
| |
| #ifndef HAVE_TEE |
| int |
| tee (int fd_in __attribute__ ((unused)), |
| int fd_out __attribute__ ((unused)), |
| size_t len __attribute__ ((unused)), |
| unsigned int flags __attribute__ ((unused))) |
| { |
| errno = ENOSYS; |
| return -1; |
| } |
| #endif |
| |
| #ifndef HAVE_UNLINKAT |
| int |
| unlinkat (int dirfd __attribute__ ((unused)), |
| const char *pathname __attribute__ ((unused)), |
| int flags __attribute__ ((unused))) |
| { |
| errno = ENOSYS; |
| return -1; |
| } |
| #endif |
| |
| #ifndef HAVE_UNSHARE |
| int |
| unshare (int flags __attribute__ ((unused))) |
| { |
| errno = ENOSYS; |
| return -1; |
| } |
| #endif |
| |
| #ifndef HAVE_UTIMENSAT |
| struct timespec; |
| int |
| utimensat(int dirfd __attribute__ ((unused)), |
| const char *pathname __attribute__ ((unused)), |
| const struct timespec times[2] __attribute__ ((unused)), |
| int flags __attribute__ ((unused))) |
| { |
| errno = ENOSYS; |
| return -1; |
| } |
| #endif |
| |
| /* Long double math functions. These are needed on old i386 systems |
| that don't have them in libm. The compiler translates calls to |
| these functions on float64 to call an 80-bit floating point |
| function instead, because when optimizing that function can be |
| executed as an x87 instructure. However, when not optimizing, this |
| translates into a call to the math function. So on systems that |
| don't provide these functions, we provide a version that just calls |
| the float64 version. */ |
| |
| #ifndef HAVE_COSL |
| long double |
| cosl (long double a) |
| { |
| return (long double) cos ((double) a); |
| } |
| #endif |
| |
| #ifndef HAVE_EXPL |
| long double |
| expl (long double a) |
| { |
| return (long double) exp ((double) a); |
| } |
| #endif |
| |
| #ifndef HAVE_LOGL |
| long double |
| logl (long double a) |
| { |
| return (long double) log ((double) a); |
| } |
| #endif |
| |
| #ifndef HAVE_SINL |
| long double |
| sinl (long double a) |
| { |
| return (long double) sin ((double) a); |
| } |
| #endif |
| |
| #ifndef HAVE_TANL |
| long double |
| tanl (long double a) |
| { |
| return (long double) tan ((double) a); |
| } |
| #endif |
| |
| #ifndef HAVE_ACOSL |
| long double |
| acosl (long double a) |
| { |
| return (long double) acos ((double) a); |
| } |
| #endif |
| |
| #ifndef HAVE_ASINL |
| long double |
| asinl (long double a) |
| { |
| return (long double) asin ((double) a); |
| } |
| #endif |
| |
| #ifndef HAVE_ATANL |
| long double |
| atanl (long double a) |
| { |
| return (long double) atan ((double) a); |
| } |
| #endif |
| |
| #ifndef HAVE_ATAN2L |
| long double |
| atan2l (long double a, long double b) |
| { |
| return (long double) atan2 ((double) a, (double) b); |
| } |
| #endif |
| |
| #ifndef HAVE_EXPM1L |
| long double |
| expm1l (long double a) |
| { |
| return (long double) expm1 ((double) a); |
| } |
| #endif |
| |
| #ifndef HAVE_LDEXPL |
| long double |
| ldexpl (long double a, int exp) |
| { |
| return (long double) ldexp ((double) a, exp); |
| } |
| #endif |
| |
| #ifndef HAVE_LOG10L |
| long double |
| log10l (long double a) |
| { |
| return (long double) log10 ((double) a); |
| } |
| #endif |
| |
| #ifndef HAVE_LOG1PL |
| long double |
| log1pl (long double a) |
| { |
| return (long double) log1p ((double) a); |
| } |
| #endif |
| |
| #ifndef HAVE_STRERROR_R |
| |
| /* Some old systems do not have strerror_r. This is a replacement. |
| It assumes that nothing else in the program calls strerror. */ |
| |
| static pthread_mutex_t strerror_lock = PTHREAD_MUTEX_INITIALIZER; |
| |
| int |
| strerror_r (int errnum, char *buf, size_t buflen) |
| { |
| int i; |
| char *errmsg; |
| size_t len; |
| int ret; |
| |
| i = pthread_mutex_lock (&strerror_lock); |
| if (i != 0) |
| abort (); |
| |
| errmsg = strerror (errnum); |
| len = strlen (errmsg); |
| if (len >= buflen) |
| ret = ERANGE; |
| else |
| { |
| memcpy (buf, errmsg, len + 1); |
| ret = 0; |
| } |
| |
| i = pthread_mutex_unlock (&strerror_lock); |
| if (i != 0) |
| abort (); |
| |
| return ret; |
| } |
| |
| #endif /* ! HAVE_STRERROR_R */ |
| |
| #ifndef HAVE_SYSCALL |
| int |
| syscall(int number, ...) |
| { |
| errno = ENOSYS; |
| return -1; |
| } |
| #endif |
| |
| #ifndef HAVE_WAIT4 |
| |
| /* Some old systems do not have wait4. This is a replacement that |
| uses waitpid. */ |
| |
| pid_t |
| wait4 (pid_t pid, int *status, int options, struct rusage *rusage __attribute__ ((unused))) |
| { |
| return waitpid (pid, status, options); |
| } |
| |
| #endif |