/*
 * Copyright (c) 1993 Branko Lankester <branko@hacktic.nl>
 * Copyright (c) 1993, 1994, 1995 Rick Sladkey <jrs@world.std.com>
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. The name of the author may not be used to endorse or promote products
 *    derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef HAVE_STRUCT___OLD_KERNEL_STAT
#define	sys_oldfstat		printargs
#define	sys_oldstat		printargs
#endif

/* still unfinished */
#define	sys_bpf			printargs
#define	sys_execveat		printargs
#define	sys_ioperm		printargs
#define	sys_iopl		printargs
#define	sys_kcmp		printargs
#define	sys_kexec_file_load	printargs
#define	sys_lookup_dcookie	printargs
#define	sys_memfd_create	printargs
#define	sys_name_to_handle_at	printargs
#define	sys_open_by_handle_at	printargs
#define	sys_sched_getattr	printargs
#define	sys_sched_setattr	printargs
#define	sys_sysfs		printargs
#define	sys_vm86		printargs
#define	sys_vm86old		printargs

/* machine-specific */
#if !(defined I386 || defined X86_64 || defined X32)
# define	sys_modify_ldt		printargs
# ifndef M68K
#  define	sys_get_thread_area	printargs
#  ifndef MIPS
#   define	sys_set_thread_area	printargs
#  endif
# endif
#endif

/* like another call */
#define	sys_acct		sys_chdir
#define	sys_chroot		sys_chdir
#define	sys_clock_getres	sys_clock_gettime
#define	sys_connect		sys_bind
#define	sys_fchdir		sys_close
#define	sys_fdatasync		sys_close
#define	sys_fsync		sys_close
#define	sys_getegid		sys_getuid
#define	sys_getegid16		sys_geteuid16
#define	sys_geteuid		sys_getuid
#define	sys_geteuid16		sys_getuid16
#define	sys_getgid		sys_getuid
#define	sys_getgid16		sys_getuid16
#define	sys_getpeername		sys_getsockname
#define	sys_getresgid		sys_getresuid
#define	sys_getresgid16		sys_getresuid16
#define	sys_lstat		sys_stat
#define	sys_lstat64		sys_stat64
#define	sys_mkdir		sys_chmod
#define	sys_mkdirat		sys_fchmodat
#define	sys_mlock		sys_munmap
#define	sys_mq_unlink		sys_chdir
#define	sys_munlock		sys_munmap
#define	sys_oldlstat		sys_oldstat
#define	sys_pivotroot		sys_link
#define	sys_rename		sys_link
#define	sys_rmdir		sys_chdir
#define	sys_sched_get_priority_max	sys_sched_get_priority_min
#define	sys_set_robust_list	sys_munmap
#define	sys_setdomainname	sys_sethostname
#define	sys_setfsgid		sys_setfsuid
#define	sys_setfsgid16		sys_setfsuid16
#define	sys_setgid		sys_setuid
#define	sys_setgid16		sys_setuid16
#define	sys_setregid		sys_setreuid
#define	sys_setregid16		sys_setreuid16
#define	sys_setresgid		sys_setresuid
#define	sys_setresgid16		sys_setresuid16
#define	sys_stime		sys_time
#define	sys_swapoff		sys_chdir
#define	sys_symlink		sys_link
#define	sys_syncfs		sys_close
#define	sys_umount		sys_chdir
#define	sys_unlink		sys_chdir
#define	sys_uselib		sys_chdir
#define	sys_vfork		sys_fork

/* printargs does the right thing */
#define	sys_getpgid		printargs
#define	sys_getpid		printargs
#define	sys_getppid		printargs
#define	sys_gettid		printargs
#define	sys_idle		printargs
#define	sys_inotify_init	printargs
#define	sys_ipc			printargs
#define	sys_munlockall		printargs
#define	sys_pause		printargs
#define	sys_printargs		printargs
#define	sys_rt_sigreturn	printargs
#define	sys_sched_yield		printargs
#define	sys_setsid		printargs
#define	sys_set_tid_address	printargs
#define	sys_setup		printargs
#define	sys_socketcall		printargs
#define	sys_sync		printargs
#define	sys_timer_delete	printargs
#define	sys_timer_getoverrun	printargs
#define	sys_vhangup		printargs

/* printargs_lu/ld does the right thing */
#define	sys_alarm		printargs_lu
#define	sys_epoll_create	printargs_ld
#define	sys_getpgrp		printargs_lu
#define	sys_getsid		printargs_lu
#define	sys_nice		printargs_ld
#define	sys_setpgid		printargs_lu
#define	sys_setpgrp		printargs_lu

/* unimplemented */
#define	sys_afs_syscall		printargs
#define	sys_break		printargs
#define	sys_ftime		printargs
#define	sys_get_kernel_syms	printargs
#define	sys_gtty		printargs
#define	sys_lock		printargs
#define	sys_mpx			printargs
#define	sys_nfsservctl		printargs
#define	sys_phys		printargs
#define	sys_profil		printargs
#define	sys_prof		printargs
#define	sys_security		printargs
#define	sys_stty		printargs
#define	sys_tuxcall		printargs
#define	sys_ulimit		printargs
#define	sys_ustat		printargs
#define	sys_vserver		printargs

/* deprecated */
#define	sys_bdflush		printargs
#define	sys_oldolduname		printargs
#define	sys_olduname		printargs

/* no library support */
#ifndef HAVE_SENDMSG
#define	sys_recvmsg		printargs
#define	sys_sendmsg		printargs
#endif

/* Who has STREAMS syscalls?
 * Linux hasn't. Solaris has (had?).
 * Just in case I miss something, retain in for Sparc.
 * Note: SYS_get/putpmsg may be defined even though syscalls
 * return ENOSYS. Can't just check defined(SYS_getpmsg).
 */
#if (!defined(SPARC) && !defined(SPARC64)) || !defined(SYS_getpmsg)
#define	sys_getpmsg		printargs
#endif
#if (!defined(SPARC) && !defined(SPARC64)) || !defined(SYS_putpmsg)
#define	sys_putpmsg		printargs
#endif
