/* 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
