diff options
author | stevel@tonic-gate <none@none> | 2005-06-14 00:00:00 -0700 |
---|---|---|
committer | stevel@tonic-gate <none@none> | 2005-06-14 00:00:00 -0700 |
commit | 7c478bd95313f5f23a4c958a745db2134aa03244 (patch) | |
tree | c871e58545497667cbb4b0a4f2daf204743e1fe7 /usr/src/lib/libbc/libc/sys/common/syscall.c | |
download | illumos-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.c | 556 |
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); + } +} |