528 lines
9.7 KiB
C
528 lines
9.7 KiB
C
/* 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
|
|
|
|
|
|
#ifndef HAVE_MINCORE
|
|
int
|
|
mincore(void *addr __attribute__ ((unused)),
|
|
size_t length __attribute__ ((unused)),
|
|
unsigned char *vec __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 __attribute__ ((unused)), ...)
|
|
{
|
|
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
|