/*
 * system call not available stub
 *
 * Copyright (C) 2009 Analog Devices Inc.
 *
 * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
 */

/* Please keep the list sorted alphabetically, in ascending order
 * of the stub name!  */

#include <errno.h>
#include <bits/wordsize.h>
#include <sys/syscall.h>

#ifdef __UCLIBC_HAS_STUBS__

__attribute_used__ static int enosys_stub(void)
{
	__set_errno(ENOSYS);
	return -1;
}

__attribute_used__ static int ret_enosys_stub(void)
{
	return ENOSYS;
}

#define make_stub(stub) \
	link_warning(stub, #stub ": this function is not implemented") \
	strong_alias(enosys_stub, stub)

#define make_ret_stub(stub) \
	link_warning(stub, #stub ": this function is not implemented") \
	strong_alias(ret_enosys_stub, stub)

#ifndef __ARCH_USE_MMU__
# undef __NR_fork
#endif

#ifdef __arm__
# define __NR_fadvise64_64 __NR_arm_fadvise64_64
# define __NR_fadvise64 __NR_arm_fadvise64_64
/* ARM always provides funcs w/out syscalls; disable the stubs */
# define __NR_ioperm 0
# define __NR_iopl 0
#endif

#ifdef __mips__
# define __NR_fadvise64_64 __NR_fadvise64
#endif

#ifdef __xtensa__
# define __NR_fadvise64 __NR_fadvise64_64
#endif

#if !defined __NR_accept && !defined __NR_socketcall && defined __UCLIBC_HAS_SOCKET__
make_stub(accept)
#endif

#if !defined __NR_accept4 && !defined __NR_socketcall && defined __UCLIBC_HAS_SOCKET__ && defined __UCLIBC_LINUX_SPECIFIC__
make_stub(accept4)
#endif

#if !defined __NR_arch_prctl && defined __UCLIBC_LINUX_SPECIFIC__
make_stub(arch_prctl)
#endif

#if !defined __NR_bdflush && defined __UCLIBC_LINUX_SPECIFIC__
make_stub(bdflush)
#endif

#if !defined __NR_bind && !defined __NR_socketcall && defined __UCLIBC_HAS_SOCKET__
make_stub(bind)
#endif

#if !defined __NR_capget && defined __UCLIBC_LINUX_SPECIFIC__
make_stub(capget)
#endif

#if !defined __NR_capset && defined __UCLIBC_LINUX_SPECIFIC__
make_stub(capset)
#endif

#if !defined __NR_connect && !defined __NR_socketcall && defined __UCLIBC_HAS_SOCKET__
make_stub(connect)
#endif

#if !defined __NR_create_module && defined __UCLIBC_LINUX_MODULE_24__
make_stub(create_module)
#endif

#if !defined __NR_delete_module && defined __UCLIBC_LINUX_MODULE_26__
make_stub(delete_module)
#endif

#if !defined __NR_epoll_create && defined __UCLIBC_HAS_EPOLL__ \
	&& !defined __NR_epoll_create1
make_stub(epoll_create)
#endif

#if !defined __NR_epoll_ctl && defined __UCLIBC_HAS_EPOLL__
make_stub(epoll_ctl)
#endif

#if !defined __NR_epoll_pwait && defined __UCLIBC_HAS_EPOLL__
make_stub(epoll_pwait)
#endif

#if !defined __NR_epoll_wait && defined __UCLIBC_HAS_EPOLL__ \
		&& !defined __NR_epoll_pwait
make_stub(epoll_wait)
#endif

#if !defined __NR_eventfd && !defined __NR_eventfd2 && defined __UCLIBC_LINUX_SPECIFIC__
make_stub(eventfd)
#endif

#if !defined __NR_fdatasync && !defined __NR_osf_fdatasync
make_stub(fdatasync)
#endif

#ifndef __NR_fgetxattr
make_stub(fgetxattr)
#endif

#ifndef __NR_flistxattr
make_stub(flistxattr)
#endif

#if !defined __NR_fork && !defined __NR_clone
make_stub(fork)
#endif

#ifndef __NR_fremovexattr
make_stub(fremovexattr)
#endif

#ifndef __NR_fsetxattr
make_stub(fsetxattr)
#endif

#if !defined __NR_fstatfs && !defined __NR_fstatfs64 \
	&& defined __UCLIBC_LINUX_SPECIFIC__
make_stub(fstatfs)
#endif

#ifndef __NR_get_kernel_syms
make_stub(get_kernel_syms)
#endif

#if !defined __NR_getpeername && !defined __NR_socketcall && defined __UCLIBC_HAS_SOCKET__
make_stub(getpeername)
#endif

#if !defined __NR_getpgrp && !defined __NR_getpgid
make_stub(getpgrp)
#endif

#if !defined __NR_getsockname && !defined __NR_socketcall && defined __UCLIBC_HAS_SOCKET__
make_stub(getsockname)
#endif

#if !defined __NR_getsockopt && !defined __NR_socketcall && defined __UCLIBC_HAS_SOCKET__
make_stub(getsockopt)
#endif

#ifndef __NR_getxattr
make_stub(getxattr)
#endif

#if !defined __NR_init_module && defined __UCLIBC_LINUX_MODULE_26__
make_stub(init_module)
#endif

#if !defined __NR_inotify_add_watch && defined __UCLIBC_LINUX_SPECIFIC__
make_stub(inotify_add_watch)
#endif

#if !defined __NR_inotify_init && defined __UCLIBC_LINUX_SPECIFIC__ \
		&& !defined __NR_inotify_init1
make_stub(inotify_init)
#endif

#if !defined __NR_inotify_init1 && defined __UCLIBC_LINUX_SPECIFIC__
make_stub(inotify_init1)
#endif

#if !defined __NR_inotify_rm_watch && defined __UCLIBC_LINUX_SPECIFIC__
make_stub(inotify_rm_watch)
#endif

#if !defined __NR_ioperm && defined __UCLIBC_LINUX_SPECIFIC__
make_stub(ioperm)
#endif

#if !defined __NR_iopl && defined __UCLIBC_LINUX_SPECIFIC__
make_stub(iopl)
#endif

#ifndef __NR_lgetxattr
make_stub(lgetxattr)
#endif

#if !defined __NR_listen && !defined __NR_socketcall && defined __UCLIBC_HAS_SOCKET__
make_stub(listen)
#endif

#ifndef __NR_listxattr
make_stub(listxattr)
#endif

#ifndef __NR_llistxattr
make_stub(llistxattr)
#endif

#ifndef __NR_lremovexattr
make_stub(lremovexattr)
#endif

#ifndef __NR_lsetxattr
make_stub(lsetxattr)
#endif

#if !defined __NR_madvise && defined __UCLIBC_LINUX_SPECIFIC__
make_stub(madvise)
#endif

#if !defined __NR_modify_ldt && defined __UCLIBC_LINUX_SPECIFIC__
make_stub(modify_ldt)
#endif

#ifndef __NR_openat
make_stub(openat)
# ifdef __UCLIBC_HAS_LFS__
make_stub(openat64)
# endif
#endif

#if !defined __NR_personality && defined __UCLIBC_LINUX_SPECIFIC__
make_stub(personality)
#endif

#if !defined __NR_pipe2 && defined __UCLIBC_LINUX_SPECIFIC__
make_stub(pipe2)
#endif

#if !defined __NR_pivot_root && defined __UCLIBC_LINUX_SPECIFIC__
make_stub(pivot_root)
#endif

#if !defined __NR_fadvise64 && defined __UCLIBC_HAS_LFS__
make_ret_stub(posix_fadvise)
#endif

#if !defined __NR_fadvise64_64 && defined __UCLIBC_HAS_LFS__ && __WORDSIZE == 32
make_ret_stub(posix_fadvise64)
#endif

#ifndef __NR_madvise
make_ret_stub(posix_madvise)
#endif

#if !defined __NR_ppoll && defined __UCLIBC_LINUX_SPECIFIC__
make_stub(ppoll)
#endif

#if !defined __NR_prctl && defined __UCLIBC_LINUX_SPECIFIC__
make_stub(prctl)
#endif

#if !defined __NR_query_module && defined __UCLIBC_LINUX_MODULE_24__
make_stub(query_module)
#endif

#if !defined __NR_readahead && defined __UCLIBC_LINUX_SPECIFIC__
make_stub(readahead)
#endif

#if !defined __NR_reboot && defined __UCLIBC_LINUX_SPECIFIC__
make_stub(reboot)
#endif

#if !defined __NR_recv && !defined __NR_socketcall && !defined __NR_recvfrom && defined __UCLIBC_HAS_SOCKET__
make_stub(recv)
#endif

#if !defined __NR_recvfrom && !defined __NR_socketcall && defined __UCLIBC_HAS_SOCKET__
make_stub(recvfrom)
#endif

#if !defined __NR_recvmsg && !defined __NR_socketcall && defined __UCLIBC_HAS_SOCKET__
make_stub(recvmsg)
#endif

#if !defined __NR_remap_file_pages && defined __UCLIBC_LINUX_SPECIFIC__
make_stub(remap_file_pages)
#endif

#ifndef __NR_removexattr
make_stub(removexattr)
#endif

#ifndef __NR_renameat
make_stub(renameat)
#endif

#if !defined __NR_sched_getaffinity && defined __UCLIBC_LINUX_SPECIFIC__
make_stub(sched_getaffinity)
#endif

#if !defined __NR_getcpu && defined __UCLIBC_LINUX_SPECIFIC__ && ((defined __x86_64__ && !defined __UCLIBC_HAS_TLS__) || !defined __x86_64__)
make_stub(sched_getcpu)
#endif

#if !defined __NR_sched_setaffinity && defined __UCLIBC_LINUX_SPECIFIC__
make_stub(sched_setaffinity)
#endif

#if !defined __NR_send && !defined __NR_socketcall && !defined __NR_sendto && defined __UCLIBC_HAS_SOCKET__
make_stub(send)
#endif

#if !defined __NR_sendfile && !defined __NR_sendfile64 \
	&& defined __UCLIBC_LINUX_SPECIFIC__
make_stub(sendfile)
#endif

#if !defined __NR_sendfile64 && !defined __NR_sendfile && defined __UCLIBC_LINUX_SPECIFIC__ && defined __UCLIBC_HAS_LFS__
make_stub(sendfile64)
#endif

#if !defined __NR_sendmsg && !defined __NR_socketcall && defined __UCLIBC_HAS_SOCKET__
make_stub(sendmsg)
#endif

#if !defined __NR_sendto && !defined __NR_socketcall && defined __UCLIBC_HAS_SOCKET__
make_stub(sendto)
#endif

#if ((__WORDSIZE == 32 && (!defined __NR_setfsgid32 && !defined __NR_setfsgid)) || (__WORDSIZE == 64 && !defined __NR_setfsgid)) && defined __UCLIBC_LINUX_SPECIFIC__
make_stub(setfsgid)
#endif

#if ((__WORDSIZE == 32 && (!defined __NR_setfsuid32 && !defined __NR_setfsuid)) || (__WORDSIZE == 64 && !defined __NR_setfsuid)) && defined __UCLIBC_LINUX_SPECIFIC__
make_stub(setfsuid)
#endif

#if !defined __NR_setresgid32 && !defined __NR_setresgid && defined __UCLIBC_LINUX_SPECIFIC__
make_stub(setresgid)
#endif

#if !defined __NR_setresuid32 && !defined __NR_setresuid && defined __UCLIBC_LINUX_SPECIFIC__
make_stub(setresuid)
#endif

#if !defined __NR_setsockopt && !defined __NR_socketcall && defined __UCLIBC_HAS_SOCKET__
make_stub(setsockopt)
#endif

#ifndef __NR_setxattr
make_stub(setxattr)
#endif

#if !defined __NR_shutdown && !defined __NR_socketcall && defined __UCLIBC_HAS_SOCKET__
make_stub(shutdown)
#endif

#if !defined __NR_signalfd4 && !defined __NR_signalfd && defined __UCLIBC_LINUX_SPECIFIC__
make_stub(signalfd)
#endif

#ifndef __NR_rt_sigtimedwait
make_stub(sigtimedwait)
make_stub(sigwaitinfo)
#endif

#ifndef __NR_rt_sigqueueinfo
make_stub(sigqueue)
#endif

#if !defined __NR_socket && !defined __NR_socketcall && defined __UCLIBC_HAS_SOCKET__
make_stub(socket)
#endif

#if !defined __NR_socketcall && defined __UCLIBC_HAS_SOCKET__
make_stub(socketcall)
#endif

#if !defined __NR_socketpair && !defined __NR_socketcall && defined __UCLIBC_HAS_SOCKET__
make_stub(socketpair)
#endif

#if !defined __NR_stime && !defined __NR_settimeofday
make_stub(stime)
make_stub(settimeofday)
#endif

#if !defined __NR_splice && defined __UCLIBC_LINUX_SPECIFIC__
make_stub(splice)
#endif

#if !defined __NR_swapoff && defined __UCLIBC_LINUX_SPECIFIC__
make_stub(swapoff)
#endif

#if !defined __NR_swapon && defined __UCLIBC_LINUX_SPECIFIC__
make_stub(swapon)
#endif

#if !defined __NR_symlink && !defined __NR_symlinkat
make_stub(symlink)
#endif

#if !defined __NR_sync_file_range && defined __UCLIBC_LINUX_SPECIFIC__
make_stub(sync_file_range)
#endif

#if !defined __NR__sysctl && defined __UCLIBC_LINUX_SPECIFIC__
make_stub(_sysctl)
#endif

#if !defined __NR_sysinfo && defined __UCLIBC_LINUX_SPECIFIC__
make_stub(sysinfo)
#endif

#if !defined __NR_tee && defined __UCLIBC_LINUX_SPECIFIC__
make_stub(tee)
#endif

#if !defined __NR_timerfd_create && defined __UCLIBC_LINUX_SPECIFIC__
make_stub(timerfd_create)
#endif

#if !defined __NR_timerfd_settime && defined __UCLIBC_LINUX_SPECIFIC__
make_stub(timerfd_settime)
#endif

#if !defined __NR_timerfd_gettime && defined __UCLIBC_LINUX_SPECIFIC__
make_stub(timerfd_gettime)
#endif

#ifndef __NR_utimensat
make_stub(futimens)
make_stub(utimensat)
# ifndef __NR_lutimes
make_stub(lutimes)
# endif
#endif

#ifndef __NR_utimensat
#if !defined __NR_utime && !defined __NR_utimes
/*make_stub(utime) obsoleted */
make_stub(utimes)
#endif
#endif

#if !defined __NR_umount && !defined __NR_umount2 && defined __UCLIBC_LINUX_SPECIFIC__
make_stub(umount)
#endif

#if !defined __NR_umount2 && defined __UCLIBC_LINUX_SPECIFIC__
make_stub(umount2)
#endif

#if !defined __NR_unshare && defined __UCLIBC_LINUX_SPECIFIC__
make_stub(unshare)
#endif

#if defined __UCLIBC_SV4_DEPRECATED__ && !defined __NR_ustat
make_stub(ustat)
#endif

#if !defined __NR_vhangup && defined __UCLIBC_LINUX_SPECIFIC__
make_stub(vhangup)
#endif

#if !defined __NR_vmsplice && defined __UCLIBC_LINUX_SPECIFIC__
make_stub(vmsplice)
#endif

#endif
