summaryrefslogtreecommitdiff
path: root/usr/src/lib/libbc/libc/sys/common/syscall.c
diff options
context:
space:
mode:
authorstevel@tonic-gate <none@none>2005-06-14 00:00:00 -0700
committerstevel@tonic-gate <none@none>2005-06-14 00:00:00 -0700
commit7c478bd95313f5f23a4c958a745db2134aa03244 (patch)
treec871e58545497667cbb4b0a4f2daf204743e1fe7 /usr/src/lib/libbc/libc/sys/common/syscall.c
downloadillumos-gate-7c478bd95313f5f23a4c958a745db2134aa03244.tar.gz
OpenSolaris Launch
Diffstat (limited to 'usr/src/lib/libbc/libc/sys/common/syscall.c')
-rw-r--r--usr/src/lib/libbc/libc/sys/common/syscall.c556
1 files changed, 556 insertions, 0 deletions
diff --git a/usr/src/lib/libbc/libc/sys/common/syscall.c b/usr/src/lib/libbc/libc/sys/common/syscall.c
new file mode 100644
index 0000000000..93eb70df09
--- /dev/null
+++ b/usr/src/lib/libbc/libc/sys/common/syscall.c
@@ -0,0 +1,556 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ * Copyright 1995 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <errno.h>
+#include <stdio.h>
+#include <varargs.h>
+#include <sys/syscall.h>
+#include "xsyscall.h"
+
+/*
+ * Array of SVR4 system call numbers. The 4.1 numbers are mapped
+ * to their SVR4/5.0 equivalents before trapping into the kernel.
+ */
+
+int syscallnum[190] = { SYS_syscall, SYS_exit, SYS_fork,
+ SYS_read, SYS_write, SYS_open, SYS_close,
+ -1, SYS_creat, SYS_link, SYS_unlink,
+ -1, SYS_chdir, 0, SYS_mknod,
+ SYS_chmod, SYS_lchown, 0, 0,
+ SYS_lseek, SYS_getpid, 0, 0,
+ 0, SYS_getuid, 0, SYS_ptrace,
+ 0, 0, 0, 0,
+ 0, 0, SYS_access, 0,
+ 0, SYS_sync, SYS_kill, SYS_stat,
+ 0, SYS_lstat, SYS_dup, SYS_pipe,
+ 0, SYS_profil, 0, 0,
+ SYS_getgid, 0, 0, 0,
+ SYS_acct, 0, -1, SYS_ioctl,
+ -1 /*reboot*/, 0, SYS_symlink, SYS_readlink,
+ SYS_execve, SYS_umask, SYS_chroot, SYS_fstat,
+ 0, -1/*getpagesize*/,-1, 0,
+ 0, 0, -1, -1,
+ SYS_mmap, -1, SYS_munmap, SYS_mprotect,
+ -1 /*advise*/, SYS_vhangup, 0, SYS_mincore,
+ SYS_getgroups, SYS_setgroups, -1 /*getpgrp*/, -1 /*setpgrp*/,
+ SYS_setitimer, 0, -1 /*swapon*/, SYS_getitimer,
+ -1/*gethostname*/,-1/*sethostname*/,-1/*getdtablesize*/,-1/*dup2*/,
+ -1/*getdopt*/, SYS_fcntl, -1 /*select*/, -1 /*setdopt*/,
+ SYS_fsync, -1 /*setprio*/, -1 /*socket*/, -1 /*connect*/,
+ -1 /*accept*/, -1 /*getprio*/, -1 /*send*/, -1 /*recv*/,
+ 0, -1 /*bind*/, -1 /*setsockopt*/,-1 /*listen*/,
+ 0, -1 /*sigvec*/, -1 /*sigblock*/, -1 /*sigsetmask*/,
+ -1 /*sigpause*/, -1 /*sigstack*/, -1 /*recvmsg*/, -1 /*sendmsg*/,
+ -1 /*vtrace*/, SYS_gettimeofday, -1 /*getrusage*/, -1 /*getsockopt*/,
+ 0, SYS_readv, SYS_writev, -1 /*settimeofday*/,
+ SYS_fchown, SYS_fchmod, -1 /*recvfrom*/, -1 /*setreuid*/,
+ -1 /*getregid*/, SYS_rename, -1 /*truncate*/, -1 /*ftruncate*/,
+ -1 /*flock*/, 0, -1 /*sendto*/, -1 /*shutdown*/,
+ -1 /*socketpair*/,SYS_mkdir, SYS_rmdir, SYS_utimes,
+ 0, SYS_adjtime, -1 /*getpeername*/,-1 /*gethostid*/,
+ 0, SYS_getrlimit, SYS_setrlimit, -1 /*killpg*/,
+ 0, 0, 0, -1/*getsockname*/,
+ SYS_getmsg, SYS_putmsg, SYS_poll, 0,
+ -1/*nfssvc*/, -1 /*getdirentries*/, SYS_statfs, SYS_fstatfs,
+ SYS_umount, -1 /*async_daemmon*/ -1 /*getfh*/, -1/*getdomain*/,
+ -1/*setdomain*/, 0, -1 /*quotactl*/, -1 /*exportfs*/,
+ SYS_mount, -1/*ustat*/, SYS_semsys, SYS_msgsys,
+ SYS_shmsys, -1 /*auditsys*/, -1 /*rfsys*/, SYS_getdents,
+ -1 /*setsid*/, SYS_fchdir, SYS_fchroot, -1 /*vpixsys*/,
+ -1 /*aioread*/, -1 /*aiowrite*/, -1 /*aiocancel*/, SYS_sigpending,
+ 0, -1 /*setpgid*/, SYS_pathconf, SYS_uname,
+};
+
+
+syscall(sysnum, va_alist)
+int sysnum;
+va_dcl
+{
+ va_list ap;
+ int i1, i2, i3, i4;
+ char *c1, *c2, *c3, *c4;
+
+ va_start(ap);
+ switch(sysnum) {
+ case XSYS_read:
+ i1 = va_arg(ap, int);
+ c1 = va_arg(ap, char *);
+ i2 = va_arg(ap, int);
+ return(bc_read(i1, c1, i2));
+ case XSYS_write:
+ i1 = va_arg(ap, int);
+ c1 = va_arg(ap, char *);
+ i2 = va_arg(ap, int);
+ return(bc_write(i1, c1, i2));
+ case XSYS_readv:
+ i1 = va_arg(ap, int);
+ c1 = va_arg(ap, char *);
+ i2 = va_arg(ap, int);
+ return(bc_readv(i1, c1, i2));
+ case XSYS_writev:
+ i1 = va_arg(ap, int);
+ c1 = va_arg(ap, char *);
+ i2 = va_arg(ap, int);
+ return(bc_writev(i1, c1, i2));
+ case XSYS_open:
+ c1 = va_arg(ap, char *);
+ i1 = va_arg(ap, int);
+ i2 = va_arg(ap, int);
+ if (i2)
+ return(bc_open(c1, i1, i2));
+ else
+ return(bc_open(c1, i1));
+ case XSYS_close:
+ i1 = va_arg(ap, int);
+ return(bc_close(i1));
+ case XSYS_fcntl:
+ i1 = va_arg(ap, int);
+ i2 = va_arg(ap, int);
+ i3 = va_arg(ap, int);
+ return(bc_fcntl(i1, i2, i3));
+ case XSYS_select:
+ i1 = va_arg(ap, int);
+ c1 = va_arg(ap, char *);
+ c2 = va_arg(ap, char *);
+ c3 = va_arg(ap, char *);
+ c4 = va_arg(ap, char *);
+ return(_select(i1, c1, c2, c3, c4));
+ case XSYS_ioctl :
+ i1 = va_arg(ap, int);
+ i2 = va_arg(ap, int);
+ c1 = va_arg(ap, char *);
+ return(bc_ioctl(i1, i2, c1));
+ case XSYS_stat:
+ c1 = va_arg(ap, char *);
+ c2 = va_arg(ap, char *);
+ return(bc_stat(c1, c2));
+ case XSYS_lstat:
+ c1 = va_arg(ap, char *);
+ c2 = va_arg(ap, char *);
+ return(bc_lstat(c1, c2));
+ case XSYS_fstat:
+ i1 = va_arg(ap, int);
+ c1 = va_arg(ap, char *);
+ return(bc_fstat(i1, c1));
+ case XSYS_getdents:
+ i1 = va_arg(ap, int);
+ c1 = va_arg(ap, char *);
+ i2 = va_arg(ap, int);
+ return(bc_getdents(i1, c1, i2));
+ case XSYS_kill:
+ i1 = va_arg(ap, int);
+ i2 = va_arg(ap, int);
+ return(bc_kill(i1, i2));
+ case XSYS_mount:
+ c1 = va_arg(ap, char *);
+ c2 = va_arg(ap, char *);
+ i1 = va_arg(ap, int);
+ c3 = va_arg(ap, char *);
+ return(mount(c1, c2, i1, c3));
+ case XSYS_getrlimit:
+ i1 = va_arg(ap, int);
+ c1 = va_arg(ap, char *);
+ return(bc_getrlimit(i1, c1));
+ case XSYS_setrlimit:
+ i1 = va_arg(ap, int);
+ c1 = va_arg(ap, char *);
+ return(bc_setrlimit(i1, c1));
+ case XSYS_uname:
+ c1 = va_arg(ap, char *);
+ return(bc_uname(c1));
+ case XSYS_creat:
+ c1 = va_arg(ap, char *);
+ i1 = va_arg(ap, int);
+ return(creat(c1, i1));
+ case XSYS_unmount:
+ c1 = va_arg(ap, char *);
+ return(umount(c1));
+ case XSYS_link:
+ c1 = va_arg(ap, char *);
+ c2 = va_arg(ap, char *);
+ return(link(c1, c2));
+ case XSYS_unlink:
+ c1 = va_arg(ap, char *);
+ return(unlink(c1));
+ case XSYS_chdir:
+ c1 = va_arg(ap, char *);
+ return(chdir(c1));
+ case XSYS_mknod:
+ c1 = va_arg(ap, char *);
+ i1 = va_arg(ap, int);
+ i2 = va_arg(ap, int);
+ return(mknod(c1, i1, i2));
+ case XSYS_chmod:
+ c1 = va_arg(ap, char *);
+ i1 = va_arg(ap, int);
+ return(chmod(c1, i1));
+ case XSYS_chown:
+ c1 = va_arg(ap, char *);
+ i1 = va_arg(ap, int);
+ i2 = va_arg(ap, int);
+ return(chown(c1, i1, i2));
+ case XSYS_lseek:
+ i1 = va_arg(ap, int);
+ i2 = va_arg(ap, int);
+ i3 = va_arg(ap, int);
+ return(lseek(i1, i2, i3));
+ case XSYS_access:
+ c1 = va_arg(ap, char *);
+ i1 = va_arg(ap, int);
+ return(access(c1, i1));
+ case XSYS_dup:
+ i1 = va_arg(ap, int);
+ return(dup(i1));
+ case XSYS_dup2:
+ i1 = va_arg(ap, int);
+ i2 = va_arg(ap, int);
+ return(dup(i1, i2));
+ case XSYS_pipe:
+ c1 = (char *)va_arg(ap, int *);
+ return(pipe(c1));
+ case XSYS_symlink:
+ c1 = va_arg(ap, char *);
+ c2 = va_arg(ap, char *);
+ return(symlink(c1, c2));
+ case XSYS_readlink:
+ c1 = va_arg(ap, char *);
+ c2 = va_arg(ap, char *);
+ i1 = va_arg(ap, int);
+ return(readlink(c1, c2, i1));
+ case XSYS_execve:
+ c1 = va_arg(ap, char *);
+ c2 = (char *)va_arg(ap, char **);
+ c3 = (char *)va_arg(ap, char **);
+ return(execve(c1, c2, c3));
+ case XSYS_chroot:
+ c1 = va_arg(ap, char *);
+ return(chroot(c1));
+ case XSYS_getgroups:
+ i1 = va_arg(ap, int);
+ c1 = (char *)va_arg(ap, int *);
+ return(getgroups(i1, c1));
+ case XSYS_setgroups:
+ i1 = va_arg(ap, int);
+ c1 = (char *)va_arg(ap, int *);
+ return(setgroups(i1, c1));
+ case XSYS_fsync:
+ i1 = va_arg(ap, int);
+ return(fsync(i1));
+ case XSYS_gettimeofday:
+ c1 = va_arg(ap, char *);
+ c2 = va_arg(ap, char *);
+ return(gettimeofday(c1, c2));
+ case XSYS_settimeofday:
+ c1 = va_arg(ap, char *);
+ c2 = va_arg(ap, char *);
+ return(settimeofday(c1, c2));
+ case XSYS_rename:
+ c1 = va_arg(ap, char *);
+ c2 = va_arg(ap, char *);
+ return(rename(c1, c2));
+ case XSYS_mkdir:
+ c1 = va_arg(ap, char *);
+ i1 = va_arg(ap, int);
+ return(mkdir(c1, i1));
+ case XSYS_rmdir:
+ c1 = va_arg(ap, char *);
+ return(rmdir(c1));
+ case XSYS_statfs:
+ c1 = va_arg(ap, char *);
+ c2 = va_arg(ap, char *);
+ return(statfs(c1, c2));
+ case XSYS_fstatfs:
+ i1 = va_arg(ap, int);
+ c1 = va_arg(ap, char *);
+ return(fstatfs(i1, c1));
+ case XSYS_getpagesize:
+ return(getpagesize());
+ case XSYS_gethostid:
+ return(gethostid());
+ case XSYS_getdtablesize:
+ return(getdtablesize());
+ case XSYS_pathconf:
+ c1 = va_arg(ap, char *);
+ i1 = va_arg(ap, int);
+ return(pathconf(c1, i1));
+ case XSYS_gethostname:
+ c1 = va_arg(ap, char *);
+ i1 = va_arg(ap, int);
+ return(gethostname(c1, i1));
+ case XSYS_sethostname:
+ c1 = va_arg(ap, char *);
+ i1 = va_arg(ap, int);
+ return(sethostname(c1, i1));
+ case XSYS_setreuid:
+ i1 = va_arg(ap, int);
+ i2 = va_arg(ap, int);
+ return(setreuid(i1, i2));
+ case XSYS_setregid:
+ i1 = va_arg(ap, int);
+ i2 = va_arg(ap, int);
+ return(setregid(i1, i2));
+ case XSYS_getpriority:
+ i1 = va_arg(ap, int);
+ i2 = va_arg(ap, int);
+ return(getpriority(i1, i2));
+ case XSYS_setpriority:
+ i1 = va_arg(ap, int);
+ i2 = va_arg(ap, int);
+ i3 = va_arg(ap, int);
+ return(setpriority(i1, i2, i3));
+ case XSYS_sigvec:
+ i1 = va_arg(ap, int);
+ c1 = va_arg(ap, char *);
+ c2 = va_arg(ap, char *);
+ return(sigvec(i1, c1, c2));
+ case XSYS_sigblock:
+ i1 = va_arg(ap, int);
+ return(sigblock(i1));
+ case XSYS_sigpending:
+ c1 = va_arg(ap, char *);
+ return(sigpending(c1));
+ case XSYS_sigsetmask:
+ i1 = va_arg(ap, int);
+ return(sigsetmask(i1));
+ case XSYS_sigpause:
+ c1 = va_arg(ap, char *);
+ return(sigpause(c1));
+ case XSYS_sigstack:
+ c1 = va_arg(ap, char *);
+ c2 = va_arg(ap, char *);
+ return(sigstack(c1, c2));
+ case XSYS_truncate:
+ c1 = va_arg(ap, char *);
+ i1 = va_arg(ap, int);
+ return(truncate(c1, i1));
+ case XSYS_ftruncate:
+ i1 = va_arg(ap, int);
+ i2 = va_arg(ap, int);
+ return(ftruncate(i1, i2));
+ case XSYS_killpg:
+ i1 = va_arg(ap, int);
+ i2 = va_arg(ap, int);
+ return(killpg(i1, i2));
+ case XSYS_setpgid:
+ i1 = va_arg(ap, int);
+ i2 = va_arg(ap, int);
+ return(setpgid(i1, i2));
+ case XSYS_ptrace:
+ i1 = va_arg(ap, int);
+ i2 = va_arg(ap, int);
+ i3 = va_arg(ap, int);
+ c1 = va_arg(ap, char *);
+ i4 = va_arg(ap, int);
+ c2 = va_arg(ap, char *);
+ return(ptrace(i1, i2, i3, c1, i4, c2));
+#ifdef S5EMUL
+ case XSYS_getpgrp:
+ return(getpgrp());
+ case XSYS_setpgrp:
+ return(setpgrp());
+#else
+ case XSYS_getpgrp:
+ i1 = va_arg(ap, int);
+ return(getpgrp(i1));
+ case XSYS_setpgrp:
+ i1 = va_arg(ap, int);
+ i2 = va_arg(ap, int);
+ return(setpgrp(i1, i2));
+#endif
+ case XSYS_getrusage:
+ i1 = va_arg(ap, int);
+ c1 = va_arg(ap, char *);
+ return(getrusage(i1, c1));
+ case XSYS_setsid:
+ return(setsid());
+
+ case XSYS_flock:
+ i1 = va_arg(ap, int);
+ i2 = va_arg(ap, int);
+ return(flock(i1, i2));
+
+ /* the following system calls are now implemented in
+ * libsocket */
+ case XSYS_accept:
+ i1 = va_arg(ap, int);
+ c1 = va_arg(ap, char *);
+ c2 = (char *)va_arg(ap, int *);
+ return(_accept(i1, c1, c2));
+ case XSYS_bind:
+ i1 = va_arg(ap, int);
+ c1 = va_arg(ap, char *);
+ i2 = va_arg(ap, int);
+ return(_bind(i1, c1, i2));
+ case XSYS_connect:
+ i1 = va_arg(ap, int);
+ c1 = va_arg(ap, char *);
+ i2 = va_arg(ap, int);
+ return(_connect(i1, c1, i2));
+ case XSYS_getsockopt:
+ i1 = va_arg(ap, int);
+ i2 = va_arg(ap, int);
+ i3 = va_arg(ap, int);
+ c1 = va_arg(ap, char *);
+ c2 = va_arg(ap, char *);
+ return(_getsockopt(i1, i2, i3, c1, c2));
+ case XSYS_getpeername:
+ i1 = va_arg(ap, int);
+ c1 = va_arg(ap, char *);
+ c2 = va_arg(ap, char *);
+ return(_getpeername(i1, c1, c2));
+ case XSYS_getsockname:
+ i1 = va_arg(ap, int);
+ c1 = va_arg(ap, char *);
+ c2 = va_arg(ap, char *);
+ return(_getsockname(i1, c1, c2));
+ case XSYS_getdomainname:
+ c1 = va_arg(ap, char *);
+ i1 = va_arg(ap, int);
+ return(getdomainname(c1, i1));
+ case XSYS_listen:
+ i1 = va_arg(ap, int);
+ i2 = va_arg(ap, int);
+ return(_listen(i1, i2));
+ case XSYS_recv:
+ i1 = va_arg(ap, int);
+ c1 = va_arg(ap, char *);
+ i2 = va_arg(ap, int);
+ i3 = va_arg(ap, int);
+ return(_recv(i1, c1, i2, i3));
+ case XSYS_recvfrom:
+ i1 = va_arg(ap, int);
+ c1 = va_arg(ap, char *);
+ i2 = va_arg(ap, int);
+ i3 = va_arg(ap, int);
+ c2 = va_arg(ap, char *);
+ c3 = va_arg(ap, char *);
+ return(_recvfrom(i1, c1, i2, i3, c2, c3));
+ case XSYS_recvmsg:
+ i1 = va_arg(ap, int);
+ c1 = va_arg(ap, char *);
+ i2 = va_arg(ap, int);
+ return(_recvmsg(i1, c1, i2));
+ case XSYS_send:
+ i1 = va_arg(ap, int);
+ c1 = va_arg(ap, char *);
+ i2 = va_arg(ap, int);
+ i3 = va_arg(ap, int);
+ return(_send(i1, c1, i2, i3));
+ case XSYS_sendto:
+ i1 = va_arg(ap, int);
+ c1 = va_arg(ap, char *);
+ i2 = va_arg(ap, int);
+ i3 = va_arg(ap, int);
+ c2 = va_arg(ap, char *);
+ i4 = va_arg(ap, int);
+ return(_sendto(i1, c1, i2, i3, c2, i4));
+ case XSYS_sendmsg:
+ i1 = va_arg(ap, int);
+ c1 = va_arg(ap, char *);
+ i2 = va_arg(ap, int);
+ return(_sendmsg(i1, c1, i2));
+ case XSYS_setdomainname:
+ c1 = va_arg(ap, char *);
+ i1 = va_arg(ap, int);
+ return(setdomainname(c1 ,i1));
+ case XSYS_setsockopt:
+ i1 = va_arg(ap, int);
+ i2 = va_arg(ap, int);
+ i3 = va_arg(ap, int);
+ c1 = va_arg(ap, char *);
+ i4 = va_arg(ap, int);
+ return(_setsockopt(i1, i2, i3, c1, i4));
+ case XSYS_shutdown:
+ i1 = va_arg(ap, int);
+ i2 = va_arg(ap, int);
+ return(_shutdown(i1, i2));
+ case XSYS_socket:
+ i1 = va_arg(ap, int);
+ i2 = va_arg(ap, int);
+ i3 = va_arg(ap, int);
+ return(_socket(i1, i2, i3));
+ case XSYS_socketpair:
+ i1 = va_arg(ap, int);
+ i2 = va_arg(ap, int);
+ i3 = va_arg(ap, int);
+ c1 = va_arg(ap, char *);
+ return(_socketpair(i1, i2, i3, c1));
+
+
+ /* The following can directly go through syscall */
+ case XSYS_acct:
+ case XSYS_adjtime:
+ case XSYS_exit:
+ case XSYS_fchdir:
+ case XSYS_fchmod:
+ case XSYS_fchown:
+ case XSYS_fchroot:
+ case XSYS_fork:
+ case XSYS_getgid:
+ case XSYS_getitimer:
+ case XSYS_getmsg:
+ case XSYS_getpid:
+ case XSYS_getuid:
+ case XSYS_mincore:
+ case XSYS_mprotect:
+ case XSYS_munmap:
+ case XSYS_putmsg:
+ case XSYS_poll:
+ case XSYS_profil:
+ case XSYS_setitimer:
+ case XSYS_sync:
+ case XSYS_umask:
+ case XSYS_utimes:
+ case XSYS_semsys:
+ case XSYS_msgsys:
+ case XSYS_shmsys:
+ case XSYS_mmap:
+ case XSYS_vhangup:
+ return(_syscall(syscallnum[sysnum], va_alist));
+
+ case XSYS_aioread:
+ case XSYS_aiowrite:
+ case XSYS_aiocancel:
+ case XSYS_swapon:
+ case XSYS_async_daemon:
+ case XSYS_getfh:
+ case XSYS_nfssvc:
+ case XSYS_exportfs:
+ case XSYS_auditsys:
+ case XSYS_vpixsys:
+ case XSYS_quotactl:
+ case XSYS_getdopt:
+ case XSYS_setdopt:
+ case XSYS_ustat:
+ case XSYS_vtrace:
+ case XSYS_reboot:
+ case XSYS_madvise:
+ case XSYS_vadvise:
+ case XSYS_getdirentries:
+ fprintf(stderr,"system call not supported\n");
+ return(-1);
+ }
+}