diff options
Diffstat (limited to 'sys')
43 files changed, 4243 insertions, 5016 deletions
diff --git a/sys/i386/ibcs2/ibcs2_dirent.h b/sys/i386/ibcs2/ibcs2_dirent.h index f93e3a9..9db996d 100644 --- a/sys/i386/ibcs2/ibcs2_dirent.h +++ b/sys/i386/ibcs2/ibcs2_dirent.h @@ -34,7 +34,7 @@ #ifndef _IBCS2_DIRENT_H #define _IBCS2_DIRENT_H 1 -#include <compat/ibcs2/ibcs2_types.h> +#include <i386/ibcs2/ibcs2_types.h> #define IBCS2_MAXNAMLEN 512 #define IBCS2_DIRBUF 1048 diff --git a/sys/i386/ibcs2/ibcs2_errno.c b/sys/i386/ibcs2/ibcs2_errno.c index 48cb88e..fa0586c 100644 --- a/sys/i386/ibcs2/ibcs2_errno.c +++ b/sys/i386/ibcs2/ibcs2_errno.c @@ -29,9 +29,9 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include <compat/ibcs2/ibcs2_errno.h> +#include <i386/ibcs2/ibcs2_errno.h> -int bsd2ibcs_errno[] = { +int bsd_to_ibcs2_errno[] = { 0, /* 0 */ IBCS2_EPERM, /* 1 */ IBCS2_ENOENT, /* 2 */ diff --git a/sys/i386/ibcs2/ibcs2_fcntl.c b/sys/i386/ibcs2/ibcs2_fcntl.c index 4dede8c..a17f884 100644 --- a/sys/i386/ibcs2/ibcs2_fcntl.c +++ b/sys/i386/ibcs2/ibcs2_fcntl.c @@ -36,14 +36,19 @@ #include <sys/kernel.h> #include <sys/mount.h> #include <sys/malloc.h> -#include <sys/syscallargs.h> +#include <sys/sysproto.h> -#include <compat/ibcs2/ibcs2_types.h> -#include <compat/ibcs2/ibcs2_fcntl.h> -#include <compat/ibcs2/ibcs2_signal.h> -#include <compat/ibcs2/ibcs2_syscallargs.h> -#include <compat/ibcs2/ibcs2_util.h> +#include <i386/ibcs2/ibcs2_types.h> +#include <i386/ibcs2/ibcs2_fcntl.h> +#include <i386/ibcs2/ibcs2_signal.h> +#include <i386/ibcs2/ibcs2_proto.h> +#include <i386/ibcs2/ibcs2_util.h> +static void cvt_iflock2flock __P((struct ibcs2_flock *, struct flock *)); +static void cvt_flock2iflock __P((struct flock *, struct ibcs2_flock *)); +static int cvt_o_flags __P((int)); +static int oflags2ioflags __P((int)); +static int ioflags2oflags __P((int)); static int cvt_o_flags(flags) @@ -53,13 +58,16 @@ cvt_o_flags(flags) /* convert mode into NetBSD mode */ if (flags & IBCS2_O_WRONLY) r |= O_WRONLY; - if (flags & IBCS2_O_RDWR) r |= O_RDWR; + if (flags & IBCS2_O_RDWR) r |= O_RDWR; if (flags & (IBCS2_O_NDELAY | IBCS2_O_NONBLOCK)) r |= O_NONBLOCK; if (flags & IBCS2_O_APPEND) r |= O_APPEND; - if (flags & IBCS2_O_SYNC) r |= O_FSYNC; - if (flags & IBCS2_O_CREAT) r |= O_CREAT; - if (flags & IBCS2_O_TRUNC) r |= O_TRUNC; - if (flags & IBCS2_O_EXCL) r |= O_EXCL; + if (flags & IBCS2_O_SYNC) r |= O_FSYNC; + if (flags & IBCS2_O_CREAT) r |= O_CREAT; + if (flags & IBCS2_O_TRUNC) r |= O_TRUNC /* | O_CREAT ??? */; + if (flags & IBCS2_O_EXCL) r |= O_EXCL; + if (flags & IBCS2_O_RDONLY) r |= O_RDONLY; + if (flags & IBCS2_O_PRIV) r |= O_EXLOCK; + if (flags & IBCS2_O_NOCTTY) r |= O_NOCTTY; return r; } @@ -86,6 +94,16 @@ cvt_flock2iflock(flp, iflp) iflp->l_pid = (ibcs2_pid_t)flp->l_pid; } +#ifdef DEBUG_IBCS2 +static void +print_flock(struct flock *flp) +{ + printf("flock: start=%x len=%x pid=%d type=%d whence=%d\n", + (int)flp->l_start, (int)flp->l_len, (int)flp->l_pid, + flp->l_type, flp->l_whence); +} +#endif + static void cvt_iflock2flock(iflp, flp) struct ibcs2_flock *iflp; @@ -165,7 +183,7 @@ ibcs2_open(p, uap, retval) CHECKALTCREAT(p, &sg, SCARG(uap, path)); else CHECKALTEXIST(p, &sg, SCARG(uap, path)); - ret = open(p, uap, retval); + ret = open(p, (struct open_args *)uap, retval); if (!ret && !noctty && SESS_LEADER(p) && !(p->p_flag & P_CONTROLT)) { struct filedesc *fdp = p->p_fd; @@ -248,7 +266,7 @@ ibcs2_fcntl(p, uap, retval) case IBCS2_F_SETFL: SCARG(&fa, fd) = SCARG(uap, fd); SCARG(&fa, cmd) = F_SETFL; - SCARG(&fa, arg) = (void *)ioflags2oflags(SCARG(uap, arg)); + SCARG(&fa, arg) = (void *)ioflags2oflags((int)SCARG(uap, arg)); return fcntl(p, &fa, retval); case IBCS2_F_GETLK: @@ -283,6 +301,7 @@ ibcs2_fcntl(p, uap, retval) SCARG(&fa, fd) = SCARG(uap, fd); SCARG(&fa, cmd) = F_SETLK; SCARG(&fa, arg) = (void *)flp; + return fcntl(p, &fa, retval); } diff --git a/sys/i386/ibcs2/ibcs2_fcntl.h b/sys/i386/ibcs2/ibcs2_fcntl.h index b75537c..9af2106 100644 --- a/sys/i386/ibcs2/ibcs2_fcntl.h +++ b/sys/i386/ibcs2/ibcs2_fcntl.h @@ -33,7 +33,7 @@ #ifndef _IBCS2_FCNTL_H #define _IBCS2_FCNTL_H 1 -#include <compat/ibcs2/ibcs2_types.h> +#include <i386/ibcs2/ibcs2_types.h> #define IBCS2_O_RDONLY 0x0000 #define IBCS2_O_WRONLY 0x0001 @@ -46,6 +46,7 @@ #define IBCS2_O_TRUNC 0x0200 #define IBCS2_O_EXCL 0x0400 #define IBCS2_O_NOCTTY 0x0800 +#define IBCS2_O_PRIV 0x1000 #define IBCS2_F_DUPFD 0 #define IBCS2_F_GETFD 1 diff --git a/sys/i386/ibcs2/ibcs2_ioctl.c b/sys/i386/ibcs2/ibcs2_ioctl.c index 2f2a6cb..08e06c6 100644 --- a/sys/i386/ibcs2/ibcs2_ioctl.c +++ b/sys/i386/ibcs2/ibcs2_ioctl.c @@ -1,19 +1,18 @@ -/*- - * Copyright (c) 1994 Søren Schmidt - * Copyright (c) 1994 Sean Eric Fagan +/* $NetBSD: ibcs2_ioctl.c,v 1.6 1995/03/14 15:12:28 scottb Exp $ */ + +/* + * Copyright (c) 1994, 1995 Scott Bartram * All rights reserved. * + * based on compat/sunos/sun_ioctl.c + * * 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 - * in this position and unchanged. - * 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 withough specific prior written permission + * notice, this list of conditions and the following disclaimer. + * 2. 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 @@ -25,923 +24,603 @@ * 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. - * - * $Id: ibcs2_ioctl.c,v 1.3 1994/10/23 19:19:42 sos Exp $ */ -#include <i386/ibcs2/ibcs2.h> #include <sys/param.h> #include <sys/systm.h> +#include <sys/namei.h> +#include <sys/dir.h> #include <sys/proc.h> -#include <sys/ioctl.h> -#include <sys/ioctl_compat.h> #include <sys/file.h> +#include <sys/stat.h> #include <sys/filedesc.h> -#include <sys/tty.h> +#include <sys/ioctl.h> +#include <sys/ioctl_compat.h> +#include <sys/kernel.h> +#include <sys/malloc.h> +#include <sys/mbuf.h> +#include <sys/mman.h> +#include <sys/mount.h> +#include <sys/reboot.h> +#include <sys/resource.h> +#include <sys/resourcevar.h> +#include <sys/signal.h> +#include <sys/signalvar.h> +#include <sys/socket.h> #include <sys/termios.h> +#include <sys/time.h> +#include <sys/times.h> +#include <sys/tty.h> +#include <sys/vnode.h> +#include <sys/uio.h> +#include <sys/wait.h> +#include <sys/utsname.h> +#include <sys/unistd.h> #include <machine/console.h> -struct ibcs2_termio { - unsigned short c_iflag; - unsigned short c_oflag; - unsigned short c_cflag; - unsigned short c_lflag; - char c_line; - unsigned char c_cc[IBCS2_NCC]; -}; +#include <net/if.h> +#include <sys/sysproto.h> -struct ibcs2_termios { - unsigned short c_iflag; - unsigned short c_oflag; - unsigned short c_cflag; - unsigned short c_lflag; - char c_line; - unsigned char c_cc[IBCS2_NCCS]; - char c_ispeed; - char c_ospeed; -}; +#include <i386/ibcs2/ibcs2_types.h> +#include <i386/ibcs2/ibcs2_signal.h> +#include <i386/ibcs2/ibcs2_socksys.h> +#include <i386/ibcs2/ibcs2_stropts.h> +#include <i386/ibcs2/ibcs2_proto.h> +#include <i386/ibcs2/ibcs2_termios.h> +#include <i386/ibcs2/ibcs2_util.h> +#include <i386/ibcs2/ibcs2_ioctl.h> -struct ibcs2_winsize { - char bytex, bytey; - short bitx, bity; -}; +static void stios2btios __P((struct ibcs2_termios *, struct termios *)); +static void btios2stios __P((struct termios *, struct ibcs2_termios *)); +static void stios2stio __P((struct ibcs2_termios *, struct ibcs2_termio *)); +static void stio2stios __P((struct ibcs2_termio *, struct ibcs2_termios *)); -static struct speedtab sptab[] = { - { 0, 0 }, { 50, 1 }, { 75, 2 }, { 110, 3 }, - { 134, 4 }, { 135, 4 }, { 150, 5 }, { 200, 6 }, - { 300, 7 }, { 600, 8 }, { 1200, 9 }, { 1800, 10 }, - { 2400, 11 }, { 4800, 12 }, { 9600, 13 }, - { 19200, 14 }, { 38400, 15 }, - { 57600, 15 }, { 115200, 15 }, {-1, -1 } -}; -static int -ibcs2_to_bsd_speed(int code, struct speedtab *table) +int +ibcs2_gtty(struct proc *p, struct ibcs2_gtty_args *args, int *retval) { - for ( ; table->sp_code != -1; table++) - if (table->sp_code == code) - return (table->sp_speed); - return -1; + struct ioctl_args ioctl_arg; + + ioctl_arg.fd = args->fd; + ioctl_arg.com = TIOCGETC; + ioctl_arg.data = (caddr_t)args->buf; + + return ioctl(p, &ioctl_arg, retval); } -static int -bsd_to_ibcs2_speed(int speed, struct speedtab *table) +int +ibcs2_stty(struct proc *p, struct ibcs2_stty_args *args, int *retval) { - for ( ; table->sp_speed != -1; table++) - if (table->sp_speed == speed) - return (table->sp_code); - return -1; + struct ioctl_args ioctl_arg; + + ioctl_arg.fd = args->fd; + ioctl_arg.com = TIOCSETC; + ioctl_arg.data = (caddr_t)args->buf; + + return ioctl(p, &ioctl_arg, retval); } + +/* + * iBCS2 ioctl calls. + */ + +static struct speedtab sptab[] = { + { 0, 0 }, + { 50, 1 }, + { 75, 2 }, + { 110, 3 }, + { 134, 4 }, + { 135, 4 }, + { 150, 5 }, + { 200, 6 }, + { 300, 7 }, + { 600, 8 }, + { 1200, 9 }, + { 1800, 10 }, + { 2400, 11 }, + { 4800, 12 }, + { 9600, 13 }, + { 19200, 14 }, + { 38400, 15 }, + { -1, -1 } +}; + +static u_long s2btab[] = { + 0, + 50, + 75, + 110, + 134, + 150, + 200, + 300, + 600, + 1200, + 1800, + 2400, + 4800, + 9600, + 19200, + 38400, +}; + static void -bsd_termios_to_ibcs2_termio(struct termios *bsd_termios, - struct ibcs2_termio *ibcs2_termio) +stios2btios(st, bt) + struct ibcs2_termios *st; + struct termios *bt; { - int speed; - - if (ibcs2_trace & IBCS2_TRACE_IOCTLCNV) { - int i; - printf("IBCS2: BSD termios structure (input):\n"); - printf("i=%08x o=%08x c=%08x l=%08x ispeed=%d ospeed=%d\n", - bsd_termios->c_iflag, bsd_termios->c_oflag, - bsd_termios->c_cflag, bsd_termios->c_lflag, - bsd_termios->c_ispeed, bsd_termios->c_ospeed); - printf("c_cc "); - for (i=0; i<NCCS; i++) - printf("%02x ", bsd_termios->c_cc[i]); - printf("\n"); - } - - ibcs2_termio->c_iflag = bsd_termios->c_iflag & - (IGNBRK|BRKINT|IGNPAR|PARMRK|INPCK - |ISTRIP|INLCR|IGNCR|ICRNL|IXANY); - if (bsd_termios->c_iflag & IXON) - ibcs2_termio->c_iflag |= IBCS2_IXON; - if (bsd_termios->c_iflag & IXOFF) - ibcs2_termio->c_iflag |= IBCS2_IXOFF; - - ibcs2_termio->c_oflag = 0; - if (bsd_termios->c_oflag & OPOST) - ibcs2_termio->c_oflag |= IBCS2_OPOST; - if (bsd_termios->c_oflag & ONLCR) - ibcs2_termio->c_oflag |= IBCS2_ONLCR; - if (bsd_termios->c_oflag & OXTABS) - ibcs2_termio->c_oflag |= (IBCS2_TAB1|IBCS2_TAB2); - - speed = bsd_to_ibcs2_speed(bsd_termios->c_ospeed, sptab); - - ibcs2_termio->c_cflag = speed >= 0 ? speed : 0; - ibcs2_termio->c_cflag |= (bsd_termios->c_cflag & CSIZE) >> 4; /* XXX */ - if (bsd_termios->c_cflag & CSTOPB) - ibcs2_termio->c_cflag |= IBCS2_CSTOPB; - if (bsd_termios->c_cflag & PARENB) - ibcs2_termio->c_cflag |= IBCS2_PARENB; - if (bsd_termios->c_cflag & PARODD) - ibcs2_termio->c_cflag |= IBCS2_PARODD; - if (bsd_termios->c_cflag & HUPCL) - ibcs2_termio->c_cflag |= IBCS2_HUPCL; - if (bsd_termios->c_cflag & CLOCAL) - ibcs2_termio->c_cflag |= IBCS2_CLOCAL; - - ibcs2_termio->c_lflag = 0; - if (bsd_termios->c_lflag & ISIG) - ibcs2_termio->c_lflag |= IBCS2_ISIG; - if (bsd_termios->c_lflag & ICANON) - ibcs2_termio->c_lflag |= IBCS2_ICANON; - if (bsd_termios->c_lflag & ECHO) - ibcs2_termio->c_lflag |= IBCS2_ECHO; - if (bsd_termios->c_lflag & ECHOE) - ibcs2_termio->c_lflag |= IBCS2_ECHOE; - if (bsd_termios->c_lflag & ECHOK) - ibcs2_termio->c_lflag |= IBCS2_ECHOK; - if (bsd_termios->c_lflag & ECHONL) - ibcs2_termio->c_lflag |= IBCS2_ECHONL; - if (bsd_termios->c_lflag & NOFLSH) - ibcs2_termio->c_lflag |= IBCS2_NOFLSH; - if (bsd_termios->c_lflag & ECHOCTL) - ibcs2_termio->c_lflag |= 0x0200; /* XXX */ - if (bsd_termios->c_lflag & ECHOPRT) - ibcs2_termio->c_lflag |= 0x0400; /* XXX */ - if (bsd_termios->c_lflag & ECHOKE) - ibcs2_termio->c_lflag |= 0x0800; /* XXX */ - if (bsd_termios->c_lflag & IEXTEN) - ibcs2_termio->c_lflag |= 0x8000; /* XXX */ - - ibcs2_termio->c_cc[IBCS2_VINTR] = bsd_termios->c_cc[VINTR]; - ibcs2_termio->c_cc[IBCS2_VQUIT] = bsd_termios->c_cc[VQUIT]; - ibcs2_termio->c_cc[IBCS2_VERASE] = bsd_termios->c_cc[VERASE]; - ibcs2_termio->c_cc[IBCS2_VKILL] = bsd_termios->c_cc[VKILL]; - if (bsd_termios->c_lflag & ICANON) { - ibcs2_termio->c_cc[IBCS2_VEOF] = bsd_termios->c_cc[VEOF]; - ibcs2_termio->c_cc[IBCS2_VEOL] = bsd_termios->c_cc[VEOL]; - } else { - ibcs2_termio->c_cc[IBCS2_VMIN] = bsd_termios->c_cc[VMIN]; - ibcs2_termio->c_cc[IBCS2_VTIME] = bsd_termios->c_cc[VTIME]; - } - ibcs2_termio->c_cc[IBCS2_VEOL2] = bsd_termios->c_cc[VEOL2]; - ibcs2_termio->c_cc[IBCS2_VSWTCH] = 0xff; - ibcs2_termio->c_line = 0; - - if (ibcs2_trace & IBCS2_TRACE_IOCTLCNV) { - int i; - printf("IBCS2: IBCS2 termio structure (output):\n"); - printf("i=%08x o=%08x c=%08x l=%08x speed=%d line=%d\n", - ibcs2_termio->c_iflag, ibcs2_termio->c_oflag, - ibcs2_termio->c_cflag, ibcs2_termio->c_lflag, - ibcs2_to_bsd_speed( - ibcs2_termio->c_cflag & IBCS2_CBAUD, sptab), - ibcs2_termio->c_line); - printf("c_cc "); - for (i=0; i<IBCS2_NCC; i++) - printf("%02x ", ibcs2_termio->c_cc[i]); - printf("\n"); + register u_long l, r; + + l = st->c_iflag; r = 0; + if (l & IBCS2_IGNBRK) r |= IGNBRK; + if (l & IBCS2_BRKINT) r |= BRKINT; + if (l & IBCS2_IGNPAR) r |= IGNPAR; + if (l & IBCS2_PARMRK) r |= PARMRK; + if (l & IBCS2_INPCK) r |= INPCK; + if (l & IBCS2_ISTRIP) r |= ISTRIP; + if (l & IBCS2_INLCR) r |= INLCR; + if (l & IBCS2_IGNCR) r |= IGNCR; + if (l & IBCS2_ICRNL) r |= ICRNL; + if (l & IBCS2_IXON) r |= IXON; + if (l & IBCS2_IXANY) r |= IXANY; + if (l & IBCS2_IXOFF) r |= IXOFF; + if (l & IBCS2_IMAXBEL) r |= IMAXBEL; + bt->c_iflag = r; + + l = st->c_oflag; r = 0; + if (l & IBCS2_OPOST) r |= OPOST; + if (l & IBCS2_ONLCR) r |= ONLCR; + if (l & IBCS2_TAB3) r |= OXTABS; + bt->c_oflag = r; + + l = st->c_cflag; r = 0; + switch (l & IBCS2_CSIZE) { + case IBCS2_CS5: r |= CS5; break; + case IBCS2_CS6: r |= CS6; break; + case IBCS2_CS7: r |= CS7; break; + case IBCS2_CS8: r |= CS8; break; } + if (l & IBCS2_CSTOPB) r |= CSTOPB; + if (l & IBCS2_CREAD) r |= CREAD; + if (l & IBCS2_PARENB) r |= PARENB; + if (l & IBCS2_PARODD) r |= PARODD; + if (l & IBCS2_HUPCL) r |= HUPCL; + if (l & IBCS2_CLOCAL) r |= CLOCAL; + bt->c_cflag = r; + + l = st->c_lflag; r = 0; + if (l & IBCS2_ISIG) r |= ISIG; + if (l & IBCS2_ICANON) r |= ICANON; + if (l & IBCS2_ECHO) r |= ECHO; + if (l & IBCS2_ECHOE) r |= ECHOE; + if (l & IBCS2_ECHOK) r |= ECHOK; + if (l & IBCS2_ECHONL) r |= ECHONL; + if (l & IBCS2_NOFLSH) r |= NOFLSH; + if (l & IBCS2_TOSTOP) r |= TOSTOP; + bt->c_lflag = r; + + bt->c_ispeed = bt->c_ospeed = s2btab[l & 0x0000000f]; + + bt->c_cc[VINTR] = + st->c_cc[IBCS2_VINTR] ? st->c_cc[IBCS2_VINTR] : _POSIX_VDISABLE; + bt->c_cc[VQUIT] = + st->c_cc[IBCS2_VQUIT] ? st->c_cc[IBCS2_VQUIT] : _POSIX_VDISABLE; + bt->c_cc[VERASE] = + st->c_cc[IBCS2_VERASE] ? st->c_cc[IBCS2_VERASE] : _POSIX_VDISABLE; + bt->c_cc[VKILL] = + st->c_cc[IBCS2_VKILL] ? st->c_cc[IBCS2_VKILL] : _POSIX_VDISABLE; + bt->c_cc[VEOF] = + st->c_cc[IBCS2_VEOF] ? st->c_cc[IBCS2_VEOF] : _POSIX_VDISABLE; + bt->c_cc[VEOL] = + st->c_cc[IBCS2_VEOL] ? st->c_cc[IBCS2_VEOL] : _POSIX_VDISABLE; + bt->c_cc[VEOL2] = + st->c_cc[IBCS2_VEOL2] ? st->c_cc[IBCS2_VEOL2] : _POSIX_VDISABLE; +#if 0 + bt->c_cc[VSWTCH] = + st->c_cc[IBCS2_VSWTCH] ? st->c_cc[IBCS2_VSWTCH] : _POSIX_VDISABLE; +#endif + bt->c_cc[VSTART] = + st->c_cc[IBCS2_VSTART] ? st->c_cc[IBCS2_VSTART] : _POSIX_VDISABLE; + bt->c_cc[VSTOP] = + st->c_cc[IBCS2_VSTOP] ? st->c_cc[IBCS2_VSTOP] : _POSIX_VDISABLE; + bt->c_cc[VSUSP] = + st->c_cc[IBCS2_VSUSP] ? st->c_cc[IBCS2_VSUSP] : _POSIX_VDISABLE; + bt->c_cc[VDSUSP] = _POSIX_VDISABLE; + bt->c_cc[VREPRINT] = _POSIX_VDISABLE; + bt->c_cc[VDISCARD] = _POSIX_VDISABLE; + bt->c_cc[VWERASE] = _POSIX_VDISABLE; + bt->c_cc[VLNEXT] = _POSIX_VDISABLE; + bt->c_cc[VSTATUS] = _POSIX_VDISABLE; } static void -ibcs2_termio_to_bsd_termios(struct ibcs2_termio *ibcs2_termio, - struct termios *bsd_termios) +btios2stios(bt, st) + struct termios *bt; + struct ibcs2_termios *st; { - int i, speed; - - if (ibcs2_trace & IBCS2_TRACE_IOCTLCNV) { - int i; - printf("IBCS2: IBCS2 termio structure (input):\n"); - printf("i=%08x o=%08x c=%08x l=%08x speed=%d line=%d\n", - ibcs2_termio->c_iflag, ibcs2_termio->c_oflag, - ibcs2_termio->c_cflag, ibcs2_termio->c_lflag, - ibcs2_to_bsd_speed( - ibcs2_termio->c_cflag & IBCS2_CBAUD, sptab), - ibcs2_termio->c_line); - printf("c_cc "); - for (i=0; i<IBCS2_NCC; i++) - printf("%02x ", ibcs2_termio->c_cc[i]); - printf("\n"); - } - - bsd_termios->c_iflag = ibcs2_termio->c_iflag & - (IBCS2_IGNBRK|IBCS2_BRKINT|IBCS2_IGNPAR|IBCS2_PARMRK|IBCS2_INPCK - |IBCS2_ISTRIP|IBCS2_INLCR|IBCS2_IGNCR|IBCS2_ICRNL|IBCS2_IXANY); - if (ibcs2_termio->c_iflag & IBCS2_IXON) - bsd_termios->c_iflag |= IXON; - if (ibcs2_termio->c_iflag & IBCS2_IXOFF) - bsd_termios->c_iflag |= IXOFF; - - bsd_termios->c_oflag = 0; - if (ibcs2_termio->c_oflag & IBCS2_OPOST) - bsd_termios->c_oflag |= OPOST; - if (ibcs2_termio->c_oflag & IBCS2_ONLCR) - bsd_termios->c_oflag |= ONLCR; - if (ibcs2_termio->c_oflag & (IBCS2_TAB1|IBCS2_TAB2)) - bsd_termios->c_oflag |= OXTABS; - - speed = ibcs2_to_bsd_speed(ibcs2_termio->c_cflag & IBCS2_CBAUD, sptab); - bsd_termios->c_ospeed = bsd_termios->c_ispeed = speed >= 0 ? speed : 0; - - bsd_termios->c_cflag = (ibcs2_termio->c_cflag & IBCS2_CSIZE) << 4; - if (ibcs2_termio->c_cflag & IBCS2_CSTOPB) - bsd_termios->c_cflag |= CSTOPB; - if (ibcs2_termio->c_cflag & IBCS2_PARENB) - bsd_termios->c_cflag |= PARENB; - if (ibcs2_termio->c_cflag & IBCS2_PARODD) - bsd_termios->c_cflag |= PARODD; - if (ibcs2_termio->c_cflag & IBCS2_HUPCL) - bsd_termios->c_cflag |= HUPCL; - if (ibcs2_termio->c_cflag & IBCS2_CLOCAL) - bsd_termios->c_cflag |= CLOCAL; - - bsd_termios->c_lflag = 0; - if (ibcs2_termio->c_lflag & IBCS2_ISIG) - bsd_termios->c_lflag |= ISIG; - if (ibcs2_termio->c_lflag & IBCS2_ICANON) - bsd_termios->c_lflag |= ICANON; - if (ibcs2_termio->c_lflag & IBCS2_ECHO) - bsd_termios->c_lflag |= ECHO; - if (ibcs2_termio->c_lflag & IBCS2_ECHOE) - bsd_termios->c_lflag |= ECHOE; - if (ibcs2_termio->c_lflag & IBCS2_ECHOK) - bsd_termios->c_lflag |= ECHOK; - if (ibcs2_termio->c_lflag & IBCS2_ECHONL) - bsd_termios->c_lflag |= ECHONL; - if (ibcs2_termio->c_lflag & IBCS2_NOFLSH) - bsd_termios->c_lflag |= NOFLSH; - if (ibcs2_termio->c_lflag & 0x0200) /* XXX */ - bsd_termios->c_lflag |= ECHOCTL; - if (ibcs2_termio->c_lflag & 0x0400) /* XXX */ - bsd_termios->c_lflag |= ECHOPRT; - if (ibcs2_termio->c_lflag & 0x0800) /* XXX */ - bsd_termios->c_lflag |= ECHOKE; - if (ibcs2_termio->c_lflag & 0x8000) /* XXX */ - bsd_termios->c_lflag |= IEXTEN; - - for (i=0; i<NCCS; bsd_termios->c_cc[i++] = 0) ; - bsd_termios->c_cc[VINTR] = ibcs2_termio->c_cc[IBCS2_VINTR]; - bsd_termios->c_cc[VQUIT] = ibcs2_termio->c_cc[IBCS2_VQUIT]; - bsd_termios->c_cc[VERASE] = ibcs2_termio->c_cc[IBCS2_VERASE]; - bsd_termios->c_cc[VKILL] = ibcs2_termio->c_cc[IBCS2_VKILL]; - if (ibcs2_termio->c_lflag & IBCS2_ICANON) { - bsd_termios->c_cc[VEOF] = ibcs2_termio->c_cc[IBCS2_VEOF]; - bsd_termios->c_cc[VEOL] = ibcs2_termio->c_cc[IBCS2_VEOL]; - } else { - bsd_termios->c_cc[VMIN] = ibcs2_termio->c_cc[IBCS2_VMIN]; - bsd_termios->c_cc[VTIME] = ibcs2_termio->c_cc[IBCS2_VTIME]; - } - bsd_termios->c_cc[VEOL2] = ibcs2_termio->c_cc[IBCS2_VEOL2]; - - if (ibcs2_trace & IBCS2_TRACE_IOCTLCNV) { - int i; - printf("IBCS2: BSD termios structure (output):\n"); - printf("i=%08x o=%08x c=%08x l=%08x ispeed=%d ospeed=%d\n", - bsd_termios->c_iflag, bsd_termios->c_oflag, - bsd_termios->c_cflag, bsd_termios->c_lflag, - bsd_termios->c_ispeed, bsd_termios->c_ospeed); - printf("c_cc "); - for (i=0; i<NCCS; i++) - printf("%02x ", bsd_termios->c_cc[i]); - printf("\n"); + register u_long l, r; + + l = bt->c_iflag; r = 0; + if (l & IGNBRK) r |= IBCS2_IGNBRK; + if (l & BRKINT) r |= IBCS2_BRKINT; + if (l & IGNPAR) r |= IBCS2_IGNPAR; + if (l & PARMRK) r |= IBCS2_PARMRK; + if (l & INPCK) r |= IBCS2_INPCK; + if (l & ISTRIP) r |= IBCS2_ISTRIP; + if (l & INLCR) r |= IBCS2_INLCR; + if (l & IGNCR) r |= IBCS2_IGNCR; + if (l & ICRNL) r |= IBCS2_ICRNL; + if (l & IXON) r |= IBCS2_IXON; + if (l & IXANY) r |= IBCS2_IXANY; + if (l & IXOFF) r |= IBCS2_IXOFF; + if (l & IMAXBEL) r |= IBCS2_IMAXBEL; + st->c_iflag = r; + + l = bt->c_oflag; r = 0; + if (l & OPOST) r |= IBCS2_OPOST; + if (l & ONLCR) r |= IBCS2_ONLCR; + if (l & OXTABS) r |= IBCS2_TAB3; + st->c_oflag = r; + + l = bt->c_cflag; r = 0; + switch (l & CSIZE) { + case CS5: r |= IBCS2_CS5; break; + case CS6: r |= IBCS2_CS6; break; + case CS7: r |= IBCS2_CS7; break; + case CS8: r |= IBCS2_CS8; break; } + if (l & CSTOPB) r |= IBCS2_CSTOPB; + if (l & CREAD) r |= IBCS2_CREAD; + if (l & PARENB) r |= IBCS2_PARENB; + if (l & PARODD) r |= IBCS2_PARODD; + if (l & HUPCL) r |= IBCS2_HUPCL; + if (l & CLOCAL) r |= IBCS2_CLOCAL; + st->c_cflag = r; + + l = bt->c_lflag; r = 0; + if (l & ISIG) r |= IBCS2_ISIG; + if (l & ICANON) r |= IBCS2_ICANON; + if (l & ECHO) r |= IBCS2_ECHO; + if (l & ECHOE) r |= IBCS2_ECHOE; + if (l & ECHOK) r |= IBCS2_ECHOK; + if (l & ECHONL) r |= IBCS2_ECHONL; + if (l & NOFLSH) r |= IBCS2_NOFLSH; + if (l & TOSTOP) r |= IBCS2_TOSTOP; + st->c_lflag = r; + + l = ttspeedtab(bt->c_ospeed, sptab); + if ((int)l >= 0) + st->c_cflag |= l; + + st->c_cc[IBCS2_VINTR] = + bt->c_cc[VINTR] != _POSIX_VDISABLE ? bt->c_cc[VINTR] : 0; + st->c_cc[IBCS2_VQUIT] = + bt->c_cc[VQUIT] != _POSIX_VDISABLE ? bt->c_cc[VQUIT] : 0; + st->c_cc[IBCS2_VERASE] = + bt->c_cc[VERASE] != _POSIX_VDISABLE ? bt->c_cc[VERASE] : 0; + st->c_cc[IBCS2_VKILL] = + bt->c_cc[VKILL] != _POSIX_VDISABLE ? bt->c_cc[VKILL] : 0; + st->c_cc[IBCS2_VEOF] = + bt->c_cc[VEOF] != _POSIX_VDISABLE ? bt->c_cc[VEOF] : 0; + st->c_cc[IBCS2_VEOL] = + bt->c_cc[VEOL] != _POSIX_VDISABLE ? bt->c_cc[VEOL] : 0; + st->c_cc[IBCS2_VEOL2] = + bt->c_cc[VEOL2] != _POSIX_VDISABLE ? bt->c_cc[VEOL2] : 0; + st->c_cc[IBCS2_VSWTCH] = + 0; + st->c_cc[IBCS2_VSUSP] = + bt->c_cc[VSUSP] != _POSIX_VDISABLE ? bt->c_cc[VSUSP] : 0; + st->c_cc[IBCS2_VSTART] = + bt->c_cc[VSTART] != _POSIX_VDISABLE ? bt->c_cc[VSTART] : 0; + st->c_cc[IBCS2_VSTOP] = + bt->c_cc[VSTOP] != _POSIX_VDISABLE ? bt->c_cc[VSTOP] : 0; + + st->c_line = 0; } static void -bsd_to_ibcs2_termios(struct termios *bsd_termios, - struct ibcs2_termios *ibcs2_termios) +stios2stio(ts, t) + struct ibcs2_termios *ts; + struct ibcs2_termio *t; { - int speed; - - if (ibcs2_trace & IBCS2_TRACE_IOCTLCNV) { - int i; - printf("IBCS2: BSD termios structure (input):\n"); - printf("i=%08x o=%08x c=%08x l=%08x ispeed=%d ospeed=%d\n", - bsd_termios->c_iflag, bsd_termios->c_oflag, - bsd_termios->c_cflag, bsd_termios->c_lflag, - bsd_termios->c_ispeed, bsd_termios->c_ospeed); - printf("c_cc "); - for (i=0; i<NCCS; i++) - printf("%02x ", bsd_termios->c_cc[i]); - printf("\n"); - } - - ibcs2_termios->c_iflag = bsd_termios->c_iflag & - (IGNBRK|BRKINT|IGNPAR|PARMRK|INPCK - |ISTRIP|INLCR|IGNCR|ICRNL|IXANY); - if (bsd_termios->c_iflag & IXON) - ibcs2_termios->c_iflag |= IBCS2_IXON; - if (bsd_termios->c_iflag & IXOFF) - ibcs2_termios->c_iflag |= IBCS2_IXOFF; - - ibcs2_termios->c_oflag = 0; - if (bsd_termios->c_oflag & OPOST) - ibcs2_termios->c_oflag |= IBCS2_OPOST; - if (bsd_termios->c_oflag & ONLCR) - ibcs2_termios->c_oflag |= IBCS2_ONLCR; - if (bsd_termios->c_oflag & OXTABS) - ibcs2_termios->c_oflag |= (IBCS2_TAB1|IBCS2_TAB2); - - ibcs2_termios->c_cflag = (bsd_termios->c_cflag & CSIZE) >> 4; /* XXX */ - if (bsd_termios->c_cflag & CSTOPB) - ibcs2_termios->c_cflag |= IBCS2_CSTOPB; - if (bsd_termios->c_cflag & PARENB) - ibcs2_termios->c_cflag |= IBCS2_PARENB; - if (bsd_termios->c_cflag & PARODD) - ibcs2_termios->c_cflag |= IBCS2_PARODD; - if (bsd_termios->c_cflag & HUPCL) - ibcs2_termios->c_cflag |= IBCS2_HUPCL; - if (bsd_termios->c_cflag & CLOCAL) - ibcs2_termios->c_cflag |= IBCS2_CLOCAL; - if (bsd_termios->c_cflag & CRTSCTS) - ibcs2_termios->c_cflag |= 0x8000; /* XXX */ - - ibcs2_termios->c_lflag = 0; - if (bsd_termios->c_lflag & ISIG) - ibcs2_termios->c_lflag |= IBCS2_ISIG; - if (bsd_termios->c_lflag & ICANON) - ibcs2_termios->c_lflag |= IBCS2_ICANON; - if (bsd_termios->c_lflag & ECHO) - ibcs2_termios->c_lflag |= IBCS2_ECHO; - if (bsd_termios->c_lflag & ECHOE) - ibcs2_termios->c_lflag |= IBCS2_ECHOE; - if (bsd_termios->c_lflag & ECHOK) - ibcs2_termios->c_lflag |= IBCS2_ECHOK; - if (bsd_termios->c_lflag & ECHONL) - ibcs2_termios->c_lflag |= IBCS2_ECHONL; - if (bsd_termios->c_lflag & NOFLSH) - ibcs2_termios->c_lflag |= IBCS2_NOFLSH; - if (bsd_termios->c_lflag & ECHOCTL) - ibcs2_termios->c_lflag |= 0x0200; /* XXX */ - if (bsd_termios->c_lflag & ECHOPRT) - ibcs2_termios->c_lflag |= 0x0400; /* XXX */ - if (bsd_termios->c_lflag & ECHOKE) - ibcs2_termios->c_lflag |= 0x0800; /* XXX */ - if (bsd_termios->c_lflag & IEXTEN) - ibcs2_termios->c_lflag |= 0x8000; /* XXX */ - - ibcs2_termios->c_cc[IBCS2_VINTR] = bsd_termios->c_cc[VINTR]; - ibcs2_termios->c_cc[IBCS2_VQUIT] = bsd_termios->c_cc[VQUIT]; - ibcs2_termios->c_cc[IBCS2_VERASE] = bsd_termios->c_cc[VERASE]; - ibcs2_termios->c_cc[IBCS2_VKILL] = bsd_termios->c_cc[VKILL]; - if (bsd_termios->c_lflag & ICANON) { - ibcs2_termios->c_cc[IBCS2_VEOF] = bsd_termios->c_cc[VEOF]; - ibcs2_termios->c_cc[IBCS2_VEOL] = bsd_termios->c_cc[VEOL]; - } else { - ibcs2_termios->c_cc[IBCS2_VMIN] = bsd_termios->c_cc[VMIN]; - ibcs2_termios->c_cc[IBCS2_VTIME] = bsd_termios->c_cc[VTIME]; - } - ibcs2_termios->c_cc[IBCS2_VEOL2] = bsd_termios->c_cc[VEOL2]; - ibcs2_termios->c_cc[IBCS2_VSWTCH] = 0xff; - ibcs2_termios->c_cc[IBCS2_VSUSP] = bsd_termios->c_cc[VSUSP]; - ibcs2_termios->c_cc[IBCS2_VSTART] = bsd_termios->c_cc[VSTART]; - ibcs2_termios->c_cc[IBCS2_VSTOP] = bsd_termios->c_cc[VSTOP]; - - ibcs2_termios->c_ispeed = - bsd_to_ibcs2_speed(bsd_termios->c_ispeed, sptab); - ibcs2_termios->c_ospeed = - bsd_to_ibcs2_speed(bsd_termios->c_ospeed, sptab); - ibcs2_termios->c_line = 0; - - if (ibcs2_trace & IBCS2_TRACE_IOCTLCNV) { - int i; - printf("IBCS2: IBCS2 termios structure (output):\n"); - printf("i=%08x o=%08x c=%08x l=%08x ispeed=%d ospeed=%d " - "line=%d\n", - ibcs2_termios->c_iflag, ibcs2_termios->c_oflag, - ibcs2_termios->c_cflag, ibcs2_termios->c_lflag, - ibcs2_to_bsd_speed(ibcs2_termios->c_ispeed, sptab), - ibcs2_to_bsd_speed(ibcs2_termios->c_ospeed, sptab), - ibcs2_termios->c_line); - printf("c_cc "); - for (i=0; i<IBCS2_NCCS; i++) - printf("%02x ", ibcs2_termios->c_cc[i]); - printf("\n"); - } + t->c_iflag = ts->c_iflag; + t->c_oflag = ts->c_oflag; + t->c_cflag = ts->c_cflag; + t->c_lflag = ts->c_lflag; + t->c_line = ts->c_line; + bcopy(ts->c_cc, t->c_cc, IBCS2_NCC); } static void -ibcs2_to_bsd_termios(struct ibcs2_termios *ibcs2_termios, - struct termios *bsd_termios) +stio2stios(t, ts) + struct ibcs2_termio *t; + struct ibcs2_termios *ts; { - int i, speed; - - if (ibcs2_trace & IBCS2_TRACE_IOCTLCNV) { - int i; - printf("IBCS2: IBCS2 termios structure (input):\n"); - printf("i=%08x o=%08x c=%08x l=%08x ispeed=%d ospeed=%d " - "line=%d\n", - ibcs2_termios->c_iflag, ibcs2_termios->c_oflag, - ibcs2_termios->c_cflag, ibcs2_termios->c_lflag, - ibcs2_to_bsd_speed(ibcs2_termios->c_ispeed, sptab), - ibcs2_to_bsd_speed(ibcs2_termios->c_ospeed, sptab), - ibcs2_termios->c_line); - printf("c_cc "); - for (i=0; i<IBCS2_NCCS; i++) - printf("%02x ", ibcs2_termios->c_cc[i]); - printf("\n"); - } - - bsd_termios->c_iflag = ibcs2_termios->c_iflag & - (IBCS2_IGNBRK|IBCS2_BRKINT|IBCS2_IGNPAR|IBCS2_PARMRK|IBCS2_INPCK - |IBCS2_ISTRIP|IBCS2_INLCR|IBCS2_IGNCR|IBCS2_ICRNL|IBCS2_IXANY); - if (ibcs2_termios->c_iflag & IBCS2_IXON) - bsd_termios->c_iflag |= IXON; - if (ibcs2_termios->c_iflag & IBCS2_IXOFF) - bsd_termios->c_iflag |= IXOFF; - - bsd_termios->c_oflag = 0; - if (ibcs2_termios->c_oflag & IBCS2_OPOST) - bsd_termios->c_oflag |= OPOST; - if (ibcs2_termios->c_oflag & IBCS2_ONLCR) - bsd_termios->c_oflag |= ONLCR; - if (ibcs2_termios->c_oflag & (IBCS2_TAB1|IBCS2_TAB2)) - bsd_termios->c_oflag |= OXTABS; - - bsd_termios->c_cflag = (ibcs2_termios->c_cflag & IBCS2_CSIZE) << 4; - if (ibcs2_termios->c_cflag & IBCS2_CSTOPB) - bsd_termios->c_cflag |= CSTOPB; - if (ibcs2_termios->c_cflag & IBCS2_PARENB) - bsd_termios->c_cflag |= PARENB; - if (ibcs2_termios->c_cflag & IBCS2_PARODD) - bsd_termios->c_cflag |= PARODD; - if (ibcs2_termios->c_cflag & IBCS2_HUPCL) - bsd_termios->c_cflag |= HUPCL; - if (ibcs2_termios->c_cflag & IBCS2_CLOCAL) - bsd_termios->c_cflag |= CLOCAL; - if (ibcs2_termios->c_cflag & 0x8000) - bsd_termios->c_cflag |= CRTSCTS; /* XXX */ - - bsd_termios->c_lflag = 0; - if (ibcs2_termios->c_lflag & IBCS2_ISIG) - bsd_termios->c_lflag |= ISIG; - if (ibcs2_termios->c_lflag & IBCS2_ICANON) - bsd_termios->c_lflag |= ICANON; - if (ibcs2_termios->c_lflag & IBCS2_ECHO) - bsd_termios->c_lflag |= ECHO; - if (ibcs2_termios->c_lflag & IBCS2_ECHOE) - bsd_termios->c_lflag |= ECHOE; - if (ibcs2_termios->c_lflag & IBCS2_ECHOK) - bsd_termios->c_lflag |= ECHOK; - if (ibcs2_termios->c_lflag & IBCS2_ECHONL) - bsd_termios->c_lflag |= ECHONL; - if (ibcs2_termios->c_lflag & IBCS2_NOFLSH) - bsd_termios->c_lflag |= NOFLSH; - if (ibcs2_termios->c_lflag & 0x0200) /* XXX */ - bsd_termios->c_lflag |= ECHOCTL; - if (ibcs2_termios->c_lflag & 0x0400) /* XXX */ - bsd_termios->c_lflag |= ECHOPRT; - if (ibcs2_termios->c_lflag & 0x0800) /* XXX */ - bsd_termios->c_lflag |= ECHOKE; - if (ibcs2_termios->c_lflag & 0x8000) /* XXX */ - bsd_termios->c_lflag |= IEXTEN; - - for (i=0; i<NCCS; bsd_termios->c_cc[i++] = 0) ; - bsd_termios->c_cc[VINTR] = ibcs2_termios->c_cc[IBCS2_VINTR]; - bsd_termios->c_cc[VQUIT] = ibcs2_termios->c_cc[IBCS2_VQUIT]; - bsd_termios->c_cc[VERASE] = ibcs2_termios->c_cc[IBCS2_VERASE]; - bsd_termios->c_cc[VKILL] = ibcs2_termios->c_cc[IBCS2_VKILL]; - if (ibcs2_termios->c_lflag & IBCS2_ICANON) { - bsd_termios->c_cc[VEOF] = ibcs2_termios->c_cc[IBCS2_VEOF]; - bsd_termios->c_cc[VEOL] = ibcs2_termios->c_cc[IBCS2_VEOL]; - } else { - bsd_termios->c_cc[VMIN] = ibcs2_termios->c_cc[IBCS2_VMIN]; - bsd_termios->c_cc[VTIME] = ibcs2_termios->c_cc[IBCS2_VTIME]; - } - bsd_termios->c_cc[VEOL2] = ibcs2_termios->c_cc[IBCS2_VEOL2]; - bsd_termios->c_cc[VSUSP] = ibcs2_termios->c_cc[IBCS2_VSUSP]; - bsd_termios->c_cc[VSTART] = ibcs2_termios->c_cc[IBCS2_VSTART]; - bsd_termios->c_cc[VSTOP] = ibcs2_termios->c_cc[IBCS2_VSTOP]; - - bsd_termios->c_ispeed = - ibcs2_to_bsd_speed(ibcs2_termios->c_ispeed, sptab); - bsd_termios->c_ospeed = - ibcs2_to_bsd_speed(ibcs2_termios->c_ospeed, sptab); - - if (ibcs2_trace & IBCS2_TRACE_IOCTLCNV) { - int i; - printf("IBCS2: BSD termios structure (output):\n"); - printf("i=%08x o=%08x c=%08x l=%08x ispeed=%d ospeed=%d\n", - bsd_termios->c_iflag, bsd_termios->c_oflag, - bsd_termios->c_cflag, bsd_termios->c_lflag, - bsd_termios->c_ispeed, bsd_termios->c_ospeed); - printf("c_cc "); - for (i=0; i<NCCS; i++) - printf("%02x ", bsd_termios->c_cc[i]); - printf("\n"); - } + ts->c_iflag = t->c_iflag; + ts->c_oflag = t->c_oflag; + ts->c_cflag = t->c_cflag; + ts->c_lflag = t->c_lflag; + ts->c_line = t->c_line; + bcopy(t->c_cc, ts->c_cc, IBCS2_NCC); } - -struct ibcs2_ioctl_args { - int fd; - int cmd; - int arg; -}; - int -ibcs2_ioctl(struct proc *p, struct ibcs2_ioctl_args *args, int *retval) +ibcs2_ioctl(p, uap, retval) + struct proc *p; + struct ibcs2_ioctl_args *uap; + int *retval; { - struct termios bsd_termios; - struct winsize bsd_winsize; - struct ibcs2_termio ibcs2_termio; - struct ibcs2_termios ibcs2_termios; - struct ibcs2_winsize ibcs2_winsize; struct filedesc *fdp = p->p_fd; struct file *fp; - int (*func)(); - int type = (args->cmd&0xffff00)>>8; - int num = args->cmd&0xff; + int (*ctl) __P((struct file *, int, caddr_t, struct proc *)); int error; - if (ibcs2_trace & IBCS2_TRACE_IOCTL) - printf("IBCS2: 'ioctl' fd=%d, typ=%d(%c), num=%d\n", - args->fd, type, type, num); - - if ((unsigned)args->fd >= fdp->fd_nfiles - || (fp = fdp->fd_ofiles[args->fd]) == 0) + if (SCARG(uap, fd) < 0 || SCARG(uap, fd) >= fdp->fd_nfiles || + (fp = fdp->fd_ofiles[SCARG(uap, fd)]) == NULL) { + DPRINTF(("ibcs2_ioctl(%d): bad fd %d ", p->p_pid, + SCARG(uap, fd))); return EBADF; + } - if (!fp || (fp->f_flag & (FREAD | FWRITE)) == 0) { + if ((fp->f_flag & (FREAD|FWRITE)) == 0) { + DPRINTF(("ibcs2_ioctl(%d): bad fp flag ", p->p_pid)); return EBADF; } - func = fp->f_ops->fo_ioctl; - - switch (type) { - case 'f': - switch (num) { - case 1: - args->cmd = FIOCLEX; - return ioctl(p, args, retval); - case 2: - args->cmd = FIONCLEX; - return ioctl(p, args, retval); - case 3: - args->cmd = FIONREAD; - return ioctl(p, args, retval); - } - break; -#if 0 - case 'j': - switch (num) { - case 5: /* jerq winsize ?? */ - ibcs2_winsize.bytex = 80; - /* p->p_session->s_ttyp->t_winsize.ws_col; XXX */ - ibcs2_winsize.bytey = 25; - /* p->p_session->s_ttyp->t_winsize.ws_row; XXX */ - ibcs2_winsize.bitx = - p->p_session->s_ttyp->t_winsize.ws_xpixel; - ibcs2_winsize.bity = - p->p_session->s_ttyp->t_winsize.ws_ypixel; - return copyout((caddr_t)&ibcs2_winsize, - (caddr_t)args->arg, - sizeof(ibcs2_winsize)); - } + ctl = fp->f_ops->fo_ioctl; + + switch (SCARG(uap, cmd)) { + case IBCS2_TCGETA: + case IBCS2_XCGETA: + case IBCS2_OXCGETA: + { + struct termios bts; + struct ibcs2_termios sts; + struct ibcs2_termio st; + + if ((error = (*ctl)(fp, TIOCGETA, (caddr_t)&bts, p)) != 0) + return error; + + btios2stios (&bts, &sts); + if (SCARG(uap, cmd) == IBCS2_TCGETA) { + stios2stio (&sts, &st); + error = copyout((caddr_t)&st, SCARG(uap, data), + sizeof (st)); +#ifdef DEBUG_IBCS2 + if (error) + DPRINTF(("ibcs2_ioctl(%d): copyout failed ", + p->p_pid)); #endif - case 't': - switch (num) { - case 0: - args->cmd = TIOCGETD; - return ioctl(p, args, retval); - case 1: - args->cmd = TIOCSETD; - return ioctl(p, args, retval); - case 2: - args->cmd = TIOCHPCL; - return ioctl(p, args, retval); - case 8: - args->cmd = TIOCGETP; - return ioctl(p, args, retval); - case 9: - args->cmd = TIOCSETP; - return ioctl(p, args, retval); - case 10: - args->cmd = TIOCSETN; - return ioctl(p, args, retval); - case 13: - args->cmd = TIOCEXCL; - return ioctl(p, args, retval); - case 14: - args->cmd = TIOCNXCL; - return ioctl(p, args, retval); - case 16: - args->cmd = TIOCFLUSH; - return ioctl(p, args, retval); - case 17: - args->cmd = TIOCSETC; - return ioctl(p, args, retval); - case 18: - args->cmd = TIOCGETC; - return ioctl(p, args, retval); - } - break; - - case 'T': - switch (num) { - case 1: /* TCGETA */ - if ((error = (*func)(fp, TIOCGETA, - (caddr_t)&bsd_termios, p)) != 0) - return error; - bsd_termios_to_ibcs2_termio(&bsd_termios,&ibcs2_termio); - return copyout((caddr_t)&ibcs2_termio, - (caddr_t)args->arg, - sizeof(ibcs2_termio)); - - case 2: /* TCSETA */ - ibcs2_termio_to_bsd_termios( - (struct ibcs2_termio *)args->arg, &bsd_termios); - return (*func)(fp, TIOCSETA, (caddr_t)&bsd_termios, p); - - case 3: /* TCSETAW */ - ibcs2_termio_to_bsd_termios( - (struct ibcs2_termio *)args->arg, &bsd_termios); - return (*func)(fp, TIOCSETAW, (caddr_t)&bsd_termios, p); - - case 4: /* TCSETAF */ - ibcs2_termio_to_bsd_termios( - (struct ibcs2_termio *)args->arg, &bsd_termios); - return (*func)(fp, TIOCSETAF, (caddr_t)&bsd_termios, p); - - case 5: /* TCSBRK */ - args->cmd = TIOCDRAIN; - if (error = ioctl(p, args, retval)) - return error; - args->cmd = TIOCSBRK; - ioctl(p, args, retval); - args->cmd = TIOCCBRK; - error = ioctl(p, args, retval); return error; - - case 6: /* TCONC */ - if (args->arg == 0) args->cmd = TIOCSTOP; - else args->cmd = TIOCSTART; - return ioctl(p, args, retval); - - case 7: /* TCFLSH */ - args->cmd = TIOCFLUSH; - if ((int)args->arg == 0) (int)args->arg = FREAD; - if ((int)args->arg == 1) (int)args->arg = FWRITE; - if ((int)args->arg == 2) (int)args->arg = FREAD|FWRITE; - return ioctl(p, args, retval); - - case 103: /* TIOCSWINSZ */ - bsd_winsize.ws_row = - ((struct ibcs2_winsize *)(args->arg))->bytex; - bsd_winsize.ws_col = - ((struct ibcs2_winsize *)(args->arg))->bytey; - bsd_winsize.ws_xpixel = - ((struct ibcs2_winsize *)(args->arg))->bitx; - bsd_winsize.ws_ypixel = - ((struct ibcs2_winsize *)(args->arg))->bity; - return (*func)(fp, TIOCSWINSZ, - (caddr_t)&bsd_winsize, p); - - case 104: /* TIOCGWINSZ */ - if ((error = (*func)(fp, TIOCGWINSZ, - (caddr_t)&bsd_winsize, p)) != 0) - return error; - ibcs2_winsize.bytex = bsd_winsize.ws_col; - ibcs2_winsize.bytey = bsd_winsize.ws_row; - ibcs2_winsize.bitx = bsd_winsize.ws_xpixel; - ibcs2_winsize.bity = bsd_winsize.ws_ypixel; - return copyout((caddr_t)&ibcs2_winsize, - (caddr_t)args->arg, - sizeof(ibcs2_winsize)); - - case 20: /* TCSETPGRP */ - case 118: /* TIOCSPGRP */ - args->cmd = TIOCSPGRP; - return ioctl(p, args, retval); - - case 21: /* TCGETPGRP */ - case 119: /* TIOCGPGRP */ - args->cmd = TIOCGPGRP; - return ioctl(p, args, retval); + } else + return copyout((caddr_t)&sts, SCARG(uap, data), + sizeof (sts)); + /*NOTREACHED*/ + } + + case IBCS2_TCSETA: + case IBCS2_TCSETAW: + case IBCS2_TCSETAF: + { + struct termios bts; + struct ibcs2_termios sts; + struct ibcs2_termio st; + + if ((error = copyin(SCARG(uap, data), (caddr_t)&st, + sizeof(st))) != 0) { + DPRINTF(("ibcs2_ioctl(%d): TCSET copyin failed ", + p->p_pid)); + return error; } - break; - - case ('x'): - switch (num) { - case 1: - if ((error = (*func)(fp, TIOCGETA, - (caddr_t)&bsd_termios, p)) != 0) - return error; - bsd_to_ibcs2_termios(&bsd_termios, &ibcs2_termios); - return copyout((caddr_t)&ibcs2_termios, - (caddr_t)args->arg, - sizeof(ibcs2_termios)); - case 2: - ibcs2_to_bsd_termios((struct ibcs2_termios *)args->arg, - &bsd_termios); - return (*func)(fp, TIOCSETA, (caddr_t)&bsd_termios, p); - case 3: - ibcs2_to_bsd_termios((struct ibcs2_termios *)args->arg, - &bsd_termios); - return (*func)(fp, TIOCSETAW, (caddr_t)&bsd_termios, p); - case 4: - ibcs2_to_bsd_termios((struct ibcs2_termios *)args->arg, - &bsd_termios); - return (*func)(fp, TIOCSETAF, (caddr_t)&bsd_termios, p); - } - break; - - /* below is console ioctl's, we have syscons so no problem here */ - case 'a': - switch (num) { - case 0: - args->cmd = GIO_ATTR; - error = ioctl(p, args, retval); - *retval = (int)args->arg; + /* get full BSD termios so we don't lose information */ + if ((error = (*ctl)(fp, TIOCGETA, (caddr_t)&bts, p)) != 0) { + DPRINTF(("ibcs2_ioctl(%d): TCSET ctl failed fd %d ", + p->p_pid, SCARG(uap, fd))); return error; } - break; - - case 'c': - switch (num) { - case 0: - args->cmd = GIO_COLOR; - ioctl(p, args, retval); - *retval = (int)args->arg; - return error; - case 1: - args->cmd = CONS_CURRENT; - ioctl(p, args, retval); - *retval = (int)args->arg; - return error; - case 2: - args->cmd = CONS_GET; - ioctl(p, args, retval); - *retval = (int)args->arg; + + /* + * convert to iBCS2 termios, copy in information from + * termio, and convert back, then set new values. + */ + btios2stios(&bts, &sts); + stio2stios(&st, &sts); + stios2btios(&sts, &bts); + + return (*ctl)(fp, SCARG(uap, cmd) - IBCS2_TCSETA + TIOCSETA, + (caddr_t)&bts, p); + } + + case IBCS2_XCSETA: + case IBCS2_XCSETAW: + case IBCS2_XCSETAF: + { + struct termios bts; + struct ibcs2_termios sts; + + if ((error = copyin(SCARG(uap, data), (caddr_t)&sts, + sizeof (sts))) != 0) { return error; - case 4: - args->cmd = CONS_BLANKTIME; - return ioctl(p, args, retval); - case 64: - args->cmd = PIO_FONT8x8; - return ioctl(p, args, retval); - case 65: - args->cmd = GIO_FONT8x8; - return ioctl(p, args, retval); - case 66: - args->cmd = PIO_FONT8x14; - return ioctl(p, args, retval); - case 67: - args->cmd = GIO_FONT8x14; - return ioctl(p, args, retval); - case 68: - args->cmd = PIO_FONT8x16; - return ioctl(p, args, retval); - case 69: - args->cmd = GIO_FONT8x16; - return ioctl(p, args, retval); - case 73: - args->cmd = CONS_GETINFO; - return ioctl(p, args, retval); - } - break; - - case 'k': - switch (num) { - case 0: - args->cmd = GETFKEY; - return ioctl(p, args, retval); - case 1: - args->cmd = SETFKEY; - return ioctl(p, args, retval); - case 2: - args->cmd = GIO_SCRNMAP; - return ioctl(p, args, retval); - case 3: - args->cmd = PIO_SCRNMAP; - return ioctl(p, args, retval); - case 6: - args->cmd = GIO_KEYMAP; - return ioctl(p, args, retval); - case 7: - args->cmd = PIO_KEYMAP; - return ioctl(p, args, retval); - } - break; - - case 'K': - switch (num) { - case 6: - args->cmd = KDGKBMODE; - return ioctl(p, args, retval); - case 7: - args->cmd = KDSKBMODE; - return ioctl(p, args, retval); - case 8: - args->cmd = KDMKTONE; - return ioctl(p, args, retval); - case 9: - args->cmd = KDGETMODE; - return ioctl(p, args, retval); - case 10: - args->cmd = KDSETMODE; - return ioctl(p, args, retval); - case 13: - args->cmd = KDSBORDER; - return ioctl(p, args, retval); - case 19: - args->cmd = KDGKBSTATE; - return ioctl(p, args, retval); - case 20: - args->cmd = KDSETRAD; - return ioctl(p, args, retval); - case 60: - args->cmd = KDENABIO; - return ioctl(p, args, retval); - case 61: - args->cmd = KDDISABIO; - return ioctl(p, args, retval); - case 63: - args->cmd = KIOCSOUND; - return ioctl(p, args, retval); - case 64: - args->cmd = KDGKBTYPE; - return ioctl(p, args, retval); - case 65: - args->cmd = KDGETLED; - return ioctl(p, args, retval); - case 66: - args->cmd = KDSETLED; - return ioctl(p, args, retval); } - break; - - case 'S': - args->cmd = _IO('S', num); - return ioctl(p, args, retval); - - case 'v': - switch (num) { - case 1: - args->cmd = VT_OPENQRY; - return ioctl(p, args, retval); - case 2: - args->cmd = VT_SETMODE; - return ioctl(p, args, retval); - case 3: - args->cmd = VT_GETMODE; - return ioctl(p, args, retval); - case 4: - args->cmd = VT_RELDISP; - return ioctl(p, args, retval); - case 5: - args->cmd = VT_ACTIVATE; - return ioctl(p, args, retval); - case 6: - args->cmd = VT_WAITACTIVE; - return ioctl(p, args, retval); + stios2btios (&sts, &bts); + return (*ctl)(fp, SCARG(uap, cmd) - IBCS2_XCSETA + TIOCSETA, + (caddr_t)&bts, p); + } + + case IBCS2_OXCSETA: + case IBCS2_OXCSETAW: + case IBCS2_OXCSETAF: + { + struct termios bts; + struct ibcs2_termios sts; + + if ((error = copyin(SCARG(uap, data), (caddr_t)&sts, + sizeof (sts))) != 0) { + return error; } - break; - } - - switch (type & 0xff) { - case 'I': /* socksys 'I' type calls */ - return ioctl(p, args, retval); - case 'R': /* socksys 'R' type calls */ - return ioctl(p, args, retval); - case 'S': /* socksys 'S' type calls */ - return ioctl(p, args, retval); + stios2btios (&sts, &bts); + return (*ctl)(fp, SCARG(uap, cmd) - IBCS2_OXCSETA + TIOCSETA, + (caddr_t)&bts, p); + } + + case IBCS2_TCSBRK: + DPRINTF(("ibcs2_ioctl(%d): TCSBRK ", p->p_pid)); + return ENOSYS; + + case IBCS2_TCXONC: + DPRINTF(("ibcs2_ioctl(%d): TCXONC ", p->p_pid)); + return ENOSYS; + + case IBCS2_TCFLSH: + DPRINTF(("ibcs2_ioctl(%d): TCFLSH ", p->p_pid)); + return ENOSYS; + + case IBCS2_TIOCGWINSZ: + SCARG(uap, cmd) = TIOCGWINSZ; + return ioctl(p, (struct ioctl_args *)uap, retval); + + case IBCS2_TIOCSWINSZ: + SCARG(uap, cmd) = TIOCSWINSZ; + return ioctl(p, (struct ioctl_args *)uap, retval); + + case IBCS2_TIOCGPGRP: + return copyout((caddr_t)&p->p_pgrp->pg_id, SCARG(uap, data), + sizeof(p->p_pgrp->pg_id)); + + case IBCS2_TIOCSPGRP: /* XXX - is uap->data a pointer to pgid? */ + { + struct setpgid_args sa; + + SCARG(&sa, pid) = 0; + SCARG(&sa, pgid) = (int)SCARG(uap, data); + if (error = setpgid(p, &sa, retval)) + return error; + return 0; + } + + case IBCS2_TCGETSC: /* SCO console - get scancode flags */ + return EINTR; /* ENOSYS; */ + + case IBCS2_TCSETSC: /* SCO console - set scancode flags */ + return 0; /* ENOSYS; */ + + case IBCS2_JWINSIZE: /* Unix to Jerq I/O control */ + { + struct ibcs2_jwinsize { + char bytex, bytey; + short bitx, bity; + } ibcs2_jwinsize; + + ibcs2_jwinsize.bytex = 80; + /* p->p_session->s_ttyp->t_winsize.ws_col; XXX */ + ibcs2_jwinsize.bytey = 25; + /* p->p_session->s_ttyp->t_winsize.ws_row; XXX */ + ibcs2_jwinsize.bitx = + p->p_session->s_ttyp->t_winsize.ws_xpixel; + ibcs2_jwinsize.bity = + p->p_session->s_ttyp->t_winsize.ws_ypixel; + return copyout((caddr_t)&ibcs2_jwinsize, SCARG(uap, data), + sizeof(ibcs2_jwinsize)); + } + + /* keyboard and display ioctl's -- type 'K' */ + case IBCS2_KDGKBMODE: /* get keyboard translation mode */ + SCARG(uap, cmd) = KDGKBMODE; +/* printf("ioctl KDGKBMODE = %x\n", SCARG(uap, cmd));*/ + return ioctl(p, (struct ioctl_args *)uap, retval); + + case IBCS2_KDSKBMODE: /* set keyboard translation mode */ + SCARG(uap, cmd) = KDSKBMODE; + return ioctl(p, (struct ioctl_args *)uap, retval); + + case IBCS2_KDMKTONE: /* sound tone */ + SCARG(uap, cmd) = KDMKTONE; + return ioctl(p, (struct ioctl_args *)uap, retval); + + case IBCS2_KDGETMODE: /* get text/graphics mode */ + SCARG(uap, cmd) = KDGETMODE; + return ioctl(p, (struct ioctl_args *)uap, retval); + + case IBCS2_KDSETMODE: /* set text/graphics mode */ + SCARG(uap, cmd) = KDSETMODE; + return ioctl(p, (struct ioctl_args *)uap, retval); + + case IBCS2_KDSBORDER: /* set ega color border */ + SCARG(uap, cmd) = KDSBORDER; + return ioctl(p, (struct ioctl_args *)uap, retval); + + case IBCS2_KDGKBSTATE: + SCARG(uap, cmd) = KDGKBSTATE; + return ioctl(p, (struct ioctl_args *)uap, retval); + + case IBCS2_KDSETRAD: + SCARG(uap, cmd) = KDSETRAD; + return ioctl(p, (struct ioctl_args *)uap, retval); + + case IBCS2_KDENABIO: /* enable direct I/O to ports */ + SCARG(uap, cmd) = KDENABIO; + return ioctl(p, (struct ioctl_args *)uap, retval); + + case IBCS2_KDDISABIO: /* disable direct I/O to ports */ + SCARG(uap, cmd) = KDDISABIO; + return ioctl(p, (struct ioctl_args *)uap, retval); + + case IBCS2_KIOCSOUND: /* start sound generation */ + SCARG(uap, cmd) = KIOCSOUND; + return ioctl(p, (struct ioctl_args *)uap, retval); + + case IBCS2_KDGKBTYPE: /* get keyboard type */ + SCARG(uap, cmd) = KDGKBTYPE; + return ioctl(p, (struct ioctl_args *)uap, retval); + + case IBCS2_KDGETLED: /* get keyboard LED status */ + SCARG(uap, cmd) = KDGETLED; + return ioctl(p, (struct ioctl_args *)uap, retval); + + case IBCS2_KDSETLED: /* set keyboard LED status */ + SCARG(uap, cmd) = KDSETLED; + return ioctl(p, (struct ioctl_args *)uap, retval); + + /* Xenix keyboard and display ioctl's from sys/kd.h -- type 'k' */ + case IBCS2_GETFKEY: /* Get function key */ + SCARG(uap, cmd) = GETFKEY; + return ioctl(p, (struct ioctl_args *)uap, retval); + + case IBCS2_SETFKEY: /* Set function key */ + SCARG(uap, cmd) = SETFKEY; + return ioctl(p, (struct ioctl_args *)uap, retval); + + case IBCS2_GIO_SCRNMAP: /* Get screen output map table */ + SCARG(uap, cmd) = GIO_SCRNMAP; + return ioctl(p, (struct ioctl_args *)uap, retval); + + case IBCS2_PIO_SCRNMAP: /* Set screen output map table */ + SCARG(uap, cmd) = PIO_SCRNMAP; + return ioctl(p, (struct ioctl_args *)uap, retval); + + case IBCS2_GIO_KEYMAP: /* Get keyboard map table */ + SCARG(uap, cmd) = GIO_KEYMAP; + return ioctl(p, (struct ioctl_args *)uap, retval); + + case IBCS2_PIO_KEYMAP: /* Set keyboard map table */ + SCARG(uap, cmd) = PIO_KEYMAP; + return ioctl(p, (struct ioctl_args *)uap, retval); + + /* socksys */ + case IBCS2_SIOCSOCKSYS: + return ibcs2_socksys(p, (struct ibcs2_socksys_args *)uap, + retval); + + case IBCS2_I_NREAD: /* STREAMS */ + SCARG(uap, cmd) = FIONREAD; + return ioctl(p, (struct ioctl_args *)uap, retval); + + default: + DPRINTF(("ibcs2_ioctl(%d): unknown cmd 0x%lx ", + p->p_pid, SCARG(uap, cmd))); + return ENOSYS; } - uprintf("IBCS2: 'ioctl' fd=%d, typ=%d(%c), num=%d not implemented\n", - args->fd, type, type, num); - return EINVAL; -} - -struct ibcs2_sgtty_args { - int fd; - struct sgttyb *buf; -}; - -struct ioctl_args { - int fd; - int cmd; - caddr_t arg; -}; - -int -ibcs2_gtty(struct proc *p, struct ibcs2_sgtty_args *args, int *retval) -{ - struct ioctl_args ioctl_arg; - - if (ibcs2_trace & IBCS2_TRACE_IOCTL) - printf("IBCS2: 'gtty' fd=%d\n", args->fd); - ioctl_arg.fd = args->fd; - ioctl_arg.cmd = TIOCGETC; - ioctl_arg.arg = (caddr_t)args->buf; - - return ioctl(p, &ioctl_arg, retval); -} - -int -ibcs2_stty(struct proc *p, struct ibcs2_sgtty_args *args, int *retval) -{ - struct ioctl_args ioctl_arg; - - if (ibcs2_trace & IBCS2_TRACE_IOCTL) - printf("IBCS2: 'stty' fd=%d\n", args->fd); - ioctl_arg.fd = args->fd; - ioctl_arg.cmd = TIOCSETC; - ioctl_arg.arg = (caddr_t)args->buf; - return ioctl(p, &ioctl_arg, retval); + return ENOSYS; } diff --git a/sys/i386/ibcs2/ibcs2_ioctl.h b/sys/i386/ibcs2/ibcs2_ioctl.h new file mode 100644 index 0000000..eb66cb0 --- /dev/null +++ b/sys/i386/ibcs2/ibcs2_ioctl.h @@ -0,0 +1,55 @@ +/* misc IOCTL's */ + +/* Unix to Jerq I/O control */ +#define IBCS2_JTYPE ('j'<<8) +#define IBCS2_JBOOT (IBCS2_JTYPE|1) +#define IBCS2_JTERM (IBCS2_JTYPE|2) +#define IBCS2_JMPX (IBCS2_JTYPE|3) +#define IBCS2_JTIMO (IBCS2_JTYPE|4) +#define IBCS2_JWINSIZE (IBCS2_JTYPE|5) +#define IBCS2_JTIMOM (IBCS2_JTYPE|6) +#define IBCS2_JZOMBOOT (IBCS2_JTYPE|7) +#define IBCS2_JAGENT (IBCS2_JTYPE|9) +#define IBCS2_JTRUN (IBCS2_JTYPE|10) + + +/* Defines for keyboard and display ioctl's */ +#define IBCS2_KIOC ('K'<<8) +#define IBCS2_KDDISPTYPE (IBCS2_KIOC|1) +#define IBCS2_KDMAPDISP (IBCS2_KIOC|2) +#define IBCS2_KDUNMAPDISP (IBCS2_KIOC|3) +#define IBCS2_KDGKBENT (IBCS2_KIOC|4) +#define IBCS2_KDSKBENT (IBCS2_KIOC|5) +#define IBCS2_KDGKBMODE (IBCS2_KIOC|6) +#define IBCS2_KDSKBMODE (IBCS2_KIOC|7) +#define IBCS2_KDMKTONE (IBCS2_KIOC|8) +#define IBCS2_KDGETMODE (IBCS2_KIOC|9) +#define IBCS2_KDSETMODE (IBCS2_KIOC|10) +#define IBCS2_KDADDIO (IBCS2_KIOC|11) +#define IBCS2_KDDELIO (IBCS2_KIOC|12) +#define IBCS2_KDSBORDER (IBCS2_KIOC|13) +#define IBCS2_KDQUEMODE (IBCS2_KIOC|15) +#define IBCS2_KDVDCTYPE (IBCS2_KIOC|16) +#define IBCS2_KDGKBSTATE (IBCS2_KIOC|19) +#define IBCS2_KDSETRAD (IBCS2_KIOC|20) +#define IBCS2_KDENABIO (IBCS2_KIOC|60) +#define IBCS2_KDDISABIO (IBCS2_KIOC|61) +#define IBCS2_KIOCINFO (IBCS2_KIOC|62) +#define IBCS2_KIOCSOUND (IBCS2_KIOC|63) +#define IBCS2_KDGKBTYPE (IBCS2_KIOC|64) +#define IBCS2_KDGETLED (IBCS2_KIOC|65) +#define IBCS2_KDSETLED (IBCS2_KIOC|66) + + +/* Defines for Xenix keyboard and display ioctl's */ +#define IBCS2_MIOC ('k' << 8) +#define IBCS2_GETFKEY (IBCS2_MIOC | 0) +#define IBCS2_SETFKEY (IBCS2_MIOC | 1) +#define IBCS2_GIO_SCRNMAP (IBCS2_MIOC | 2) +#define IBCS2_PIO_SCRNMAP (IBCS2_MIOC | 3) +#define IBCS2_GIO_STRMAP_21 (IBCS2_MIOC | 4) +#define IBCS2_PIO_STRMAP_21 (IBCS2_MIOC | 5) +#define IBCS2_GIO_KEYMAP (IBCS2_MIOC | 6) +#define IBCS2_PIO_KEYMAP (IBCS2_MIOC | 7) +#define IBCS2_GIO_STRMAP (IBCS2_MIOC | 11) +#define IBCS2_PIO_STRMAP (IBCS2_MIOC | 12) diff --git a/sys/i386/ibcs2/ibcs2_ipc.c b/sys/i386/ibcs2/ibcs2_ipc.c index e2e5a5b..7e42bb0 100644 --- a/sys/i386/ibcs2/ibcs2_ipc.c +++ b/sys/i386/ibcs2/ibcs2_ipc.c @@ -1,18 +1,15 @@ -/*- - * Copyright (c) 1994 Søren Schmidt +/* + * Copyright (c) 1995 Scott Bartram + * Copyright (c) 1995 Steven Wallace * 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 - * in this position and unchanged. - * 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 withough specific prior written permission + * notice, this list of conditions and the following disclaimer. + * 2. 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 @@ -24,52 +21,367 @@ * 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. - * - * $Id: ibcs2_ipc.c,v 1.1 1994/10/14 08:53:04 sos Exp $ */ - -#include <i386/ibcs2/ibcs2.h> #include <sys/param.h> #include <sys/systm.h> -#include <sys/errno.h> +#include <sys/namei.h> #include <sys/proc.h> +#include <sys/file.h> +#include <sys/stat.h> +#include <sys/filedesc.h> +#include <sys/ioctl.h> +#include <sys/ipc.h> +#include <sys/kernel.h> +#include <sys/malloc.h> +#include <sys/mbuf.h> +#include <sys/mman.h> +#include <sys/mount.h> +#include <sys/reboot.h> +#include <sys/resource.h> +#include <sys/resourcevar.h> +#include <sys/signal.h> +#include <sys/signalvar.h> +#include <sys/socket.h> +#include <sys/time.h> +#include <sys/times.h> +#include <sys/vnode.h> +#include <sys/uio.h> +#include <sys/wait.h> +#include <sys/utsname.h> +#include <sys/unistd.h> +#include <sys/msg.h> +#include <sys/sem.h> +#include <sys/shm.h> +#include <sys/sysproto.h> -int -ibcs2_msgsys(struct proc *p, void *args, int *retval) +#include <vm/vm.h> + +#include <i386/ibcs2/ibcs2_types.h> +#include <i386/ibcs2/ibcs2_signal.h> +#include <i386/ibcs2/ibcs2_proto.h> +#include <i386/ibcs2/ibcs2_util.h> +#include <i386/ibcs2/ibcs2_ipc.h> + +#define IBCS2_IPC_RMID 0 +#define IBCS2_IPC_SET 1 +#define IBCS2_IPC_STAT 2 + + +static void cvt_msqid2imsqid __P((struct msqid_ds *, struct ibcs2_msqid_ds *)); +static void cvt_imsqid2msqid __P((struct ibcs2_msqid_ds *, struct msqid_ds *)); +static void cvt_sem2isem __P((struct sem *, struct ibcs2_sem *)); +static void cvt_isem2sem __P((struct ibcs2_sem *, struct sem *)); +static void cvt_semid2isemid __P((struct semid_ds *, struct ibcs2_semid_ds *)); +static void cvt_isemid2semid __P((struct ibcs2_semid_ds *, struct semid_ds *)); +static void cvt_shmid2ishmid __P((struct shmid_ds *, struct ibcs2_shmid_ds *)); +static void cvt_ishmid2shmid __P((struct ibcs2_shmid_ds *, struct shmid_ds *)); + + +/* + * iBCS2 msgsys call + */ + +static void +cvt_msqid2imsqid(bp, ibp) +struct msqid_ds *bp; +struct ibcs2_msqid_ds *ibp; { - if (ibcs2_trace & IBCS2_TRACE_MISC) - printf("IBCS2: 'msgsys'\n"); + ibp->msg_perm = bp->msg_perm; + ibp->msg_first = bp->msg_first; + ibp->msg_last = bp->msg_last; + ibp->msg_cbytes = (u_short)bp->msg_cbytes; + ibp->msg_qnum = (u_short)bp->msg_qnum; + ibp->msg_qbytes = (u_short)bp->msg_qbytes; + ibp->msg_lspid = (u_short)bp->msg_lspid; + ibp->msg_lrpid = (u_short)bp->msg_lrpid; + ibp->msg_stime = bp->msg_stime; + ibp->msg_rtime = bp->msg_rtime; + ibp->msg_ctime = bp->msg_ctime; + return; +} + +static void +cvt_imsqid2msqid(ibp, bp) +struct ibcs2_msqid_ds *ibp; +struct msqid_ds *bp; +{ + bp->msg_perm = ibp->msg_perm; + bp->msg_first = ibp->msg_first; + bp->msg_last = ibp->msg_last; + bp->msg_cbytes = ibp->msg_cbytes; + bp->msg_qnum = ibp->msg_qnum; + bp->msg_qbytes = ibp->msg_qbytes; + bp->msg_lspid = ibp->msg_lspid; + bp->msg_lrpid = ibp->msg_lrpid; + bp->msg_stime = ibp->msg_stime; + bp->msg_rtime = ibp->msg_rtime; + bp->msg_ctime = ibp->msg_ctime; + return; +} + #ifdef SYSVMSG - return msgsys(p, args, retval); -#else - printf("IBCS2: 'msgsys' not implemented yet\n"); - return EINVAL; +int +ibcs2_msgsys(p, uap, retval) + struct proc *p; + struct ibcs2_msgsys_args *uap; + int *retval; +{ + switch (SCARG(uap, which)) { + case 0: /* msgget */ + SCARG(uap, which) = 1; + return msgsys(p, (struct msgsys_args *)uap, retval); + case 1: { /* msgctl */ + int error; + struct msgsys_args margs; + caddr_t sg = stackgap_init(); + + SCARG(&margs, which) = 0; + SCARG(&margs, a2) = SCARG(uap, a2); + SCARG(&margs, a4) = + (int)stackgap_alloc(&sg, sizeof(struct msqid_ds)); + SCARG(&margs, a3) = SCARG(uap, a3); + switch (SCARG(&margs, a3)) { + case IBCS2_IPC_STAT: + error = msgsys(p, &margs, retval); + if (!error) + cvt_msqid2imsqid(SCARG(&margs, a4), + (struct ibcs2_msqid_ds *)SCARG(uap, a4)); + return error; + case IBCS2_IPC_SET: + cvt_imsqid2msqid((struct ibcs2_msqid_ds *)SCARG(uap, + a4), + SCARG(&margs, a4)); + return msgsys(p, &margs, retval); + case IBCS2_IPC_RMID: + return msgsys(p, &margs, retval); + } + return EINVAL; + } + case 2: /* msgrcv */ + SCARG(uap, which) = 3; + return msgsys(p, (struct msgsys_args *)uap, retval); + case 3: /* msgsnd */ + SCARG(uap, which) = 2; + return msgsys(p, (struct msgsys_args *)uap, retval); + default: + return EINVAL; + } +} #endif + +/* + * iBCS2 semsys call + */ + +static void +cvt_sem2isem(bp, ibp) +struct sem *bp; +struct ibcs2_sem *ibp; +{ + ibp->semval = bp->semval; + ibp->sempid = bp->sempid; + ibp->semncnt = bp->semncnt; + ibp->semzcnt = bp->semzcnt; + return; } -int -ibcs2_semsys(struct proc *p, void *args, int *retval) +static void +cvt_isem2sem(ibp, bp) +struct ibcs2_sem *ibp; +struct sem *bp; +{ + bp->semval = ibp->semval; + bp->sempid = ibp->sempid; + bp->semncnt = ibp->semncnt; + bp->semzcnt = ibp->semzcnt; + return; +} + +static void +cvt_semid2isemid(bp, ibp) +struct semid_ds *bp; +struct ibcs2_semid_ds *ibp; +{ + ibp->sem_perm = bp->sem_perm; + ibp->sem_base = (struct ibcs2_sem *)bp->sem_base; + ibp->sem_nsems = bp->sem_nsems; + ibp->sem_otime = bp->sem_otime; + ibp->sem_ctime = bp->sem_ctime; + return; +} + +static void +cvt_isemid2semid(ibp, bp) +struct ibcs2_semid_ds *ibp; +struct semid_ds *bp; { - if (ibcs2_trace & IBCS2_TRACE_MISC) - printf("IBCS2: 'semsys'\n"); + bp->sem_perm = ibp->sem_perm; + bp->sem_base = (struct sem *)ibp->sem_base; + bp->sem_nsems = ibp->sem_nsems; + bp->sem_otime = ibp->sem_otime; + bp->sem_ctime = ibp->sem_ctime; + return; +} + #ifdef SYSVSEM - return semsys(p, args, retval); -#else - printf("IBCS2: 'semsys' not implemented yet\n"); +int +ibcs2_semsys(p, uap, retval) + struct proc *p; + struct ibcs2_semsys_args *uap; + int *retval; +{ + int error; + + switch (SCARG(uap, which)) { + case 0: /* semctl */ + switch(SCARG(uap, a4)) { + case IBCS2_IPC_STAT: + { + struct ibcs2_semid_ds *isp; + struct semid_ds *sp; + caddr_t sg = stackgap_init(); + + isp = (struct ibcs2_semid_ds *)SCARG(uap, a5); + sp = stackgap_alloc(&sg, sizeof(struct semid_ds)); + SCARG(uap, a5) = (int)sp; + error = semsys(p, (struct semsys_args *)uap, retval); + if (!error) { + SCARG(uap, a5) = (int)isp; + isp = stackgap_alloc(&sg, sizeof(*isp)); + cvt_semid2isemid(sp, isp); + error = copyout((caddr_t)isp, + (caddr_t)SCARG(uap, a5), + sizeof(*isp)); + } + return error; + } + case IBCS2_IPC_SET: + { + struct ibcs2_semid_ds *isp; + struct semid_ds *sp; + caddr_t sg = stackgap_init(); + + isp = stackgap_alloc(&sg, sizeof(*isp)); + sp = stackgap_alloc(&sg, sizeof(*sp)); + error = copyin((caddr_t)SCARG(uap, a5), (caddr_t)isp, + sizeof(*isp)); + if (error) + return error; + cvt_isemid2semid(isp, sp); + SCARG(uap, a5) = (int)sp; + return semsys(p, (struct semsys_args *)uap, retval); + } + } + return semsys(p, (struct semsys_args *)uap, retval); + + case 1: /* semget */ + return semsys(p, (struct semsys_args *)uap, retval); + + case 2: /* semop */ + return semsys(p, (struct semsys_args *)uap, retval); + } return EINVAL; +} #endif + +/* + * iBCS2 shmsys call + */ + +static void +cvt_shmid2ishmid(bp, ibp) +struct shmid_ds *bp; +struct ibcs2_shmid_ds *ibp; +{ + ibp->shm_perm = bp->shm_perm; + ibp->shm_segsz = bp->shm_segsz; + ibp->shm_lpid = bp->shm_lpid; + ibp->shm_cpid = bp->shm_cpid; + ibp->shm_nattch = bp->shm_nattch; + ibp->shm_cnattch = 0; /* ignored anyway */ + ibp->shm_atime = bp->shm_atime; + ibp->shm_dtime = bp->shm_dtime; + ibp->shm_ctime = bp->shm_ctime; + return; } -int -ibcs2_shmsys(struct proc *p, void *args, int *retval) +static void +cvt_ishmid2shmid(ibp, bp) +struct ibcs2_shmid_ds *ibp; +struct shmid_ds *bp; { - if (ibcs2_trace & IBCS2_TRACE_MISC) - printf("IBCS2: 'shmsys'\n"); + bp->shm_perm = ibp->shm_perm; + bp->shm_segsz = ibp->shm_segsz; + bp->shm_lpid = ibp->shm_lpid; + bp->shm_cpid = ibp->shm_cpid; + bp->shm_nattch = ibp->shm_nattch; + bp->shm_atime = ibp->shm_atime; + bp->shm_dtime = ibp->shm_dtime; + bp->shm_ctime = ibp->shm_ctime; + bp->shm_internal = (void *)0; /* ignored anyway */ + return; +} + #ifdef SYSVSHM - return shmsys(p, args, retval); -#else - printf("IBCS2: 'shmsys' not implemented yet\n"); +int +ibcs2_shmsys(p, uap, retval) + struct proc *p; + struct ibcs2_shmsys_args *uap; + int *retval; +{ + int error; + + switch (SCARG(uap, which)) { + case 0: /* shmat */ + return shmsys(p, (struct shmsys_args *)uap, retval); + + case 1: /* shmctl */ + switch(SCARG(uap, a3)) { + case IBCS2_IPC_STAT: + { + struct ibcs2_shmid_ds *isp; + struct shmid_ds *sp; + caddr_t sg = stackgap_init(); + + isp = (struct ibcs2_shmid_ds *)SCARG(uap, a4); + sp = stackgap_alloc(&sg, sizeof(*sp)); + SCARG(uap, a4) = (int)sp; + error = shmsys(p, (struct shmsys_args *)uap, retval); + if (!error) { + SCARG(uap, a4) = (int)isp; + isp = stackgap_alloc(&sg, sizeof(*isp)); + cvt_shmid2ishmid(sp, isp); + error = copyout((caddr_t)isp, + (caddr_t)SCARG(uap, a4), + sizeof(*isp)); + } + return error; + } + case IBCS2_IPC_SET: + { + struct ibcs2_shmid_ds *isp; + struct shmid_ds *sp; + caddr_t sg = stackgap_init(); + + isp = stackgap_alloc(&sg, sizeof(*isp)); + sp = stackgap_alloc(&sg, sizeof(*sp)); + error = copyin((caddr_t)SCARG(uap, a4), (caddr_t)isp, + sizeof(*isp)); + if (error) + return error; + cvt_ishmid2shmid(isp, sp); + SCARG(uap, a4) = (int)sp; + return shmsys(p, (struct shmsys_args *)uap, retval); + } + } + return shmsys(p, (struct shmsys_args *)uap, retval); + + case 2: /* shmdt */ + return shmsys(p, (struct shmsys_args *)uap, retval); + + case 3: /* shmget */ + return shmsys(p, (struct shmsys_args *)uap, retval); + } return EINVAL; -#endif } - +#endif diff --git a/sys/i386/ibcs2/ibcs2_ipc.h b/sys/i386/ibcs2/ibcs2_ipc.h new file mode 100644 index 0000000..1fe2750 --- /dev/null +++ b/sys/i386/ibcs2/ibcs2_ipc.h @@ -0,0 +1,76 @@ +/* + * Copyright (c) 1995 Steven Wallace + * 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. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Steven Wallace. + * 4. 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. + * + * $Id$ + */ + + +struct ibcs2_msqid_ds { + struct ipc_perm msg_perm; + struct msg *msg_first; + struct msg *msg_last; + u_short msg_cbytes; + u_short msg_qnum; + u_short msg_qbytes; + u_short msg_lspid; + u_short msg_lrpid; + ibcs2_time_t msg_stime; + ibcs2_time_t msg_rtime; + ibcs2_time_t msg_ctime; +}; + +struct ibcs2_semid_ds { + struct ipc_perm sem_perm; + struct ibcs2_sem *sem_base; + u_short sem_nsems; + int pad1; + ibcs2_time_t sem_otime; + ibcs2_time_t sem_ctime; +}; + +struct ibcs2_sem { + u_short semval; + ibcs2_pid_t sempid; + u_short semncnt; + u_short semzcnt; +}; + +struct ibcs2_shmid_ds { + struct ipc_perm shm_perm; + int shm_segsz; + int pad1; + char pad2[4]; + u_short shm_lpid; + u_short shm_cpid; + u_short shm_nattch; + u_short shm_cnattch; + ibcs2_time_t shm_atime; + ibcs2_time_t shm_dtime; + ibcs2_time_t shm_ctime; +}; diff --git a/sys/i386/ibcs2/ibcs2_isc.c b/sys/i386/ibcs2/ibcs2_isc.c index a6c9dbd..0b6f596 100644 --- a/sys/i386/ibcs2/ibcs2_isc.c +++ b/sys/i386/ibcs2/ibcs2_isc.c @@ -1,6 +1,7 @@ /*- * Copyright (c) 1994 Søren Schmidt * Copyright (c) 1994 Sean Eric Fagan + * Copyright (c) 1995 Steven Wallace * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -26,166 +27,37 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $Id: ibcs2_isc.c,v 1.3 1995/04/30 11:30:12 ache Exp $ + * $Id: ibcs2_isc.c,v 1.4 1995/05/30 07:59:58 rgrimes Exp $ */ -#include <i386/ibcs2/ibcs2.h> #include <sys/param.h> -#include <sys/proc.h> +#include <sys/systm.h> #include <sys/sysent.h> -#include <sys/errno.h> -#include <sys/ioctl.h> -#include <sys/signal.h> -#include <sys/syslimits.h> -#include <sys/timeb.h> -#include <sys/unistd.h> -#include <sys/utsname.h> + #include <machine/cpu.h> #include <machine/psl.h> #include <machine/reg.h> +#include <i386/ibcs2/ibcs2_types.h> +#include <i386/ibcs2/ibcs2_signal.h> +#include <i386/ibcs2/ibcs2_util.h> +#include <i386/ibcs2/ibcs2_proto.h> +#include <i386/ibcs2/ibcs2_isc_syscall.h> + +extern struct sysent isc_sysent[]; + int -ibcs2_cisc(struct proc *p, void *args, int *retval) +ibcs2_isc(struct proc *p, struct ibcs2_isc_args *uap, int *retval) { struct trapframe *tf = (struct trapframe *)p->p_md.md_regs; + struct sysent *callp; + u_int code; - switch ((tf->tf_eax & 0xffffff00) >> 8) { - - case 0x00: - printf("IBCS2: 'cisc #0' what is this ??\n"); - return 0; - - case 0x02: - if (ibcs2_trace & IBCS2_TRACE_ISC) - printf("IBCS2: 'cisc rename'\n"); - return rename(p, args, retval); - - case 0x03: - if (ibcs2_trace & IBCS2_TRACE_ISC) - printf("IBCS2: 'cisc sigaction'\n"); - return ibcs2_sigaction(p, args, retval); - - case 0x04: - if (ibcs2_trace & IBCS2_TRACE_ISC) - printf("IBCS2: 'cisc sigprocmask'\n"); - return ibcs2_sigprocmask(p, args, retval); - - case 0x05: - if (ibcs2_trace & IBCS2_TRACE_ISC) - printf("IBCS2: 'cisc sigpending'\n"); - return ibcs2_sigpending(p, args, retval); - - case 0x06: - if (ibcs2_trace & IBCS2_TRACE_ISC) - printf("IBCS2: 'cisc getgroups'\n"); - return getgroups(p, args, retval); - - case 0x07: - if (ibcs2_trace & IBCS2_TRACE_ISC) - printf("IBCS2: 'cisc setgroups'\n"); - return setgroups(p, args, retval); - - case 0x08: /* pathconf */ - case 0x09: /* fpathconf */ - if (ibcs2_trace & IBCS2_TRACE_ISC) - printf("IBCS2: 'cisc (f)pathconf'"); - return ibcs2_pathconf(p, args, retval); - - case 0x10: { /* sysconf */ - struct ibcs2_sysconf_args { - int num; - } *sysconf_args = args; - - if (ibcs2_trace & IBCS2_TRACE_ISC) - printf("IBCS2: 'cisc sysconf'"); - switch (sysconf_args->num) { - case 0: /* _SC_ARG_MAX */ - *retval = (ARG_MAX); - break; - case 1: /* _SC_CHILD_MAX */ - *retval = (CHILD_MAX); - break; - case 2: /* _SC_CLK_TCK */ - *retval = (_BSD_CLK_TCK_); - break; - case 3: /* _SC_NGROUPS_MAX */ - *retval = (NGROUPS_MAX); - break; - case 4: /* _SC_OPEN_MAX */ - *retval = (OPEN_MAX); - break; - case 5: /* _SC_JOB_CONTROL */ -#ifdef _POSIX_JOB_CONTROL - *retval = (1); -#else - *retval = (-1); -#endif - break; - case 6: /* _SC_SAVED_IDS */ -#ifdef _POSIX_SAVED_IDS - *retval = (1); -#else - *retval = (-1); -#endif - break; - case 7: /* _SC_VERSION */ - *retval = (_POSIX_VERSION); - break; - default: - *retval = -1; - return EINVAL; - } - return 0; - } - - case 0x0b: - if (ibcs2_trace & IBCS2_TRACE_ISC) - printf("IBCS2: 'cisc waitpid'\n"); - return ibcs2_wait(p, args, retval); - - case 0x0c: - if (ibcs2_trace & IBCS2_TRACE_ISC) - printf("IBCS2: 'cisc setsid'\n"); - return setsid(p, args, retval); - - case 0x0d: - if (ibcs2_trace & IBCS2_TRACE_ISC) - printf("IBCS2: 'cisc setpgid'\n"); - return setpgid(p, args, retval); - - case 0x11: - if (ibcs2_trace & IBCS2_TRACE_ISC) - printf("IBCS2: 'cisc sigsuspend'\n"); - return ibcs2_sigsuspend(p, args, retval); - - case 0x12: - if (ibcs2_trace & IBCS2_TRACE_ISC) - printf("IBCS2: 'cisc symlink'\n"); - return symlink(p, args, retval); - - case 0x13: - if (ibcs2_trace & IBCS2_TRACE_ISC) - printf("IBCS2: 'cisc readlink'\n"); - return readlink(p, args, retval); + code = (tf->tf_eax & 0xffffff00) >> 8; + callp = &isc_sysent[code]; - /* Here needs more work to be done */ - case 0x01: - printf("IBCS2: 'cisc setostype'"); - break; - case 0x0e: - printf("IBCS2: 'cisc adduser'"); - break; - case 0x0f: - printf("IBCS2: 'cisc setuser'"); - break; - case 0x14: - printf("IBCS2: 'cisc getmajor'"); - break; - default: - printf("IBCS2: 'cisc' function %d(0x%x)", - tf->tf_eax>>8, tf->tf_eax>>8); - break; - } - printf(" not implemented yet\n"); - return EINVAL; + if(code < IBCS2_ISC_MAXSYSCALL) + return((*callp->sy_call)(p, (void *)uap, retval)); + else + return ENOSYS; } diff --git a/sys/i386/ibcs2/ibcs2_isc_syscall.h b/sys/i386/ibcs2/ibcs2_isc_syscall.h new file mode 100644 index 0000000..7f0e360 --- /dev/null +++ b/sys/i386/ibcs2/ibcs2_isc_syscall.h @@ -0,0 +1,23 @@ +/* + * System call numbers. + * + * DO NOT EDIT-- this file is automatically generated. + * created from Id: syscalls.isc,v 1.1 1995/10/06 15:12:52 swallace Exp + */ + +#define IBCS2_ISC_ibcs2_rename 2 +#define IBCS2_ISC_ibcs2_sigaction 3 +#define IBCS2_ISC_ibcs2_sigprocmask 4 +#define IBCS2_ISC_ibcs2_sigpending 5 +#define IBCS2_ISC_getgroups 6 +#define IBCS2_ISC_setgroups 7 +#define IBCS2_ISC_ibcs2_pathconf 8 +#define IBCS2_ISC_ibcs2_fpathconf 9 +#define IBCS2_ISC_ibcs2_wait 11 +#define IBCS2_ISC_setsid 12 +#define IBCS2_ISC_getpid 13 +#define IBCS2_ISC_ibcs2_sysconf 16 +#define IBCS2_ISC_ibcs2_sigsuspend 17 +#define IBCS2_ISC_ibcs2_symlink 18 +#define IBCS2_ISC_ibcs2_readlink 19 +#define IBCS2_ISC_MAXSYSCALL 21 diff --git a/sys/i386/ibcs2/ibcs2_isc_sysent.c b/sys/i386/ibcs2/ibcs2_isc_sysent.c new file mode 100644 index 0000000..39a9e8a --- /dev/null +++ b/sys/i386/ibcs2/ibcs2_isc_sysent.c @@ -0,0 +1,49 @@ +/* + * System call switch table. + * + * DO NOT EDIT-- this file is automatically generated. + * created from Id: syscalls.isc,v 1.1 1995/10/06 15:12:52 swallace Exp + */ + +#include <sys/types.h> +#include <sys/param.h> +#include <sys/sysent.h> +#include <sys/sysproto.h> +#include <i386/ibcs2/ibcs2_types.h> +#include <i386/ibcs2/ibcs2_signal.h> +#include <i386/ibcs2/ibcs2_statfs.h> +#include <i386/ibcs2/ibcs2_proto.h> +#include <i386/ibcs2/ibcs2_xenix.h> + +#ifdef COMPAT_43 +#define compat(n, name) n, (sy_call_t *)__CONCAT(o,name) +#else +#define compat(n, name) 0, (sy_call_t *)nosys +#endif + +/* The casts are bogus but will do for now. */ +struct sysent isc_sysent[] = { + { 0, (sy_call_t *)nosys }, /* 0 = nosys */ + { 0, (sy_call_t *)nosys }, /* 1 = isc_setostype */ + { 2, (sy_call_t *)ibcs2_rename }, /* 2 = ibcs2_rename */ + { 3, (sy_call_t *)ibcs2_sigaction }, /* 3 = ibcs2_sigaction */ + { 3, (sy_call_t *)ibcs2_sigprocmask }, /* 4 = ibcs2_sigprocmask */ + { 1, (sy_call_t *)ibcs2_sigpending }, /* 5 = ibcs2_sigpending */ + { 2, (sy_call_t *)getgroups }, /* 6 = getgroups */ + { 2, (sy_call_t *)setgroups }, /* 7 = setgroups */ + { 2, (sy_call_t *)ibcs2_pathconf }, /* 8 = ibcs2_pathconf */ + { 2, (sy_call_t *)ibcs2_fpathconf }, /* 9 = ibcs2_fpathconf */ + { 0, (sy_call_t *)nosys }, /* 10 = nosys */ + { 3, (sy_call_t *)ibcs2_wait }, /* 11 = ibcs2_wait */ + { 0, (sy_call_t *)setsid }, /* 12 = setsid */ + { 0, (sy_call_t *)getpid }, /* 13 = getpid */ + { 0, (sy_call_t *)nosys }, /* 14 = isc_adduser */ + { 0, (sy_call_t *)nosys }, /* 15 = isc_setuser */ + { 1, (sy_call_t *)ibcs2_sysconf }, /* 16 = ibcs2_sysconf */ + { 1, (sy_call_t *)ibcs2_sigsuspend }, /* 17 = ibcs2_sigsuspend */ + { 2, (sy_call_t *)ibcs2_symlink }, /* 18 = ibcs2_symlink */ + { 3, (sy_call_t *)ibcs2_readlink }, /* 19 = ibcs2_readlink */ + { 0, (sy_call_t *)nosys }, /* 20 = isc_getmajor */ +}; + + diff --git a/sys/i386/ibcs2/ibcs2_misc.c b/sys/i386/ibcs2/ibcs2_misc.c index 742f211..aeac770 100644 --- a/sys/i386/ibcs2/ibcs2_misc.c +++ b/sys/i386/ibcs2/ibcs2_misc.c @@ -1,17 +1,24 @@ -/*- - * Copyright (c) 1994 Søren Schmidt - * Copyright (c) 1994 Sean Eric Fagan - * All rights reserved. +/* $NetBSD: ibcs2_misc.c,v 1.6 1995/05/01 19:33:17 mycroft Exp $ */ + +/* + * Copyright (c) 1994, 1995 Scott Bartram + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This software was developed by the Computer Systems Engineering group + * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and + * contributed to Berkeley. * - * Copyright (c) 1982, 1986, 1989, 1991 Regents of the University of California. - * All rights reserved. + * All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Lawrence Berkeley Laboratory. * * 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 - * in this position and unchanged. + * 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. @@ -35,922 +42,1096 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: ibcs2_misc.c,v 1.4 1995/05/02 17:14:38 ache Exp $ + * from: Header: sun_misc.c,v 1.16 93/04/07 02:46:27 torek Exp + * + * @(#)sun_misc.c 8.1 (Berkeley) 6/18/93 */ -#include <i386/ibcs2/ibcs2.h> +/* + * IBCS2 compatibility module. + * + * IBCS2 system calls that are implemented differently in BSD are + * handled here. + */ #include <sys/param.h> #include <sys/systm.h> +#include <sys/namei.h> #include <sys/proc.h> -#include <sys/exec.h> -#include <sys/sysent.h> +#include <sys/file.h> +#include <sys/filedesc.h> #include <sys/ioctl.h> +#include <sys/kernel.h> +#include <sys/malloc.h> +#include <sys/mbuf.h> +#include <sys/mman.h> +#include <sys/mount.h> +#include <sys/reboot.h> #include <sys/resource.h> #include <sys/resourcevar.h> +#include <sys/socket.h> #include <sys/stat.h> #include <sys/time.h> #include <sys/times.h> -#include <sys/unistd.h> +#include <sys/vnode.h> +#include <sys/uio.h> #include <sys/wait.h> +#include <sys/utsname.h> +#include <sys/unistd.h> + +#include <ufs/ufs/dir.h> + +#include <netinet/in.h> +#include <sys/sysproto.h> + +#include <miscfs/specfs/specdev.h> + #include <vm/vm.h> +#include <sys/sysctl.h> /* must be included after vm.h */ + #include <machine/cpu.h> #include <machine/psl.h> #include <machine/reg.h> -int ibcs2_trace = 0; - -struct ibcs2_traceemu_args { - int options; -}; +#include <i386/ibcs2/ibcs2_types.h> +#include <i386/ibcs2/ibcs2_dirent.h> +#include <i386/ibcs2/ibcs2_fcntl.h> +#include <i386/ibcs2/ibcs2_time.h> +#include <i386/ibcs2/ibcs2_signal.h> +#include <i386/ibcs2/ibcs2_unistd.h> +#include <i386/ibcs2/ibcs2_utsname.h> +#include <i386/ibcs2/ibcs2_util.h> +#include <i386/ibcs2/ibcs2_utime.h> +#include <i386/ibcs2/ibcs2_poll.h> +#include <i386/ibcs2/ibcs2_proto.h> +#include <i386/ibcs2/ibcs2_xenix.h> -int -ibcs2_traceemu(struct proc *p, struct ibcs2_traceemu_args *args, int *retval) -{ - *retval = ibcs2_trace; - ibcs2_trace = args->options; - return 0; -} - -int -ibcs2_access(struct proc *p, void *args, int *retval) -{ - if (ibcs2_trace & IBCS2_TRACE_MISC) - printf("IBCS2: 'access'\n"); - return access(p, args, retval); -} - -struct ibcs2_alarm_args { - unsigned int secs; -}; int -ibcs2_alarm(struct proc *p, struct ibcs2_alarm_args *args, int *retval) +ibcs2_ulimit(p, uap, retval) + struct proc *p; + struct ibcs2_ulimit_args *uap; + int *retval; { - extern struct timeval time; - struct itimerval it, oit; - int s; - - if (ibcs2_trace & IBCS2_TRACE_MISC) - printf("IBCS2: 'alarm' secs=%d\n", args->secs); - it.it_value.tv_sec = (long)args->secs; - it.it_value.tv_usec = 0; - it.it_interval.tv_sec = 0; - it.it_interval.tv_usec = 0; - s = splclock(); - oit = p->p_realtimer; - if (timerisset(&oit.it_value)) - if (timercmp(&oit.it_value, &time, <)) - timerclear(&oit.it_value); + int error; + struct rlimit rl; + struct setrlimit_args { + int resource; + struct rlimit *rlp; + } sra; +#define IBCS2_GETFSIZE 1 +#define IBCS2_SETFSIZE 2 +#define IBCS2_GETPSIZE 3 +#define IBCS2_GETDTABLESIZE 4 + + switch (SCARG(uap, cmd)) { + case IBCS2_GETFSIZE: + *retval = p->p_rlimit[RLIMIT_FSIZE].rlim_cur; + return 0; + case IBCS2_SETFSIZE: /* XXX - fix this */ +#ifdef notyet + rl.rlim_cur = SCARG(uap, newlimit); + sra.resource = RLIMIT_FSIZE; + sra.rlp = &rl; + error = setrlimit(p, &sra, retval); + if (!error) + *retval = p->p_rlimit[RLIMIT_FSIZE].rlim_cur; else - timevalsub(&oit.it_value, &time); - splx(s); - if (itimerfix(&it.it_value) || itimerfix(&it.it_interval)) - return EINVAL; - s = splclock(); - untimeout(realitexpire, (caddr_t)p); - if (timerisset(&it.it_value)) { - timevaladd(&it.it_value, &time); - timeout(realitexpire, (caddr_t)p, hzto(&it.it_value)); + DPRINTF(("failed ")); + return error; +#else + *retval = SCARG(uap, newlimit); + return 0; +#endif + case IBCS2_GETPSIZE: + *retval = p->p_rlimit[RLIMIT_RSS].rlim_cur; /* XXX */ + return 0; + case IBCS2_GETDTABLESIZE: + uap->cmd = IBCS2_SC_OPEN_MAX; + return ibcs2_sysconf(p, (struct ibcs2_sysconf_args *)uap, + retval); + default: + return ENOSYS; } - p->p_realtimer = it; - splx(s); - if (oit.it_value.tv_usec) - oit.it_value.tv_sec++; - *retval = oit.it_value.tv_sec; - return 0; } -struct ibcs2_break_args { - char *dsend; -}; - int -ibcs2_break(struct proc *p, struct ibcs2_break_args *args, int *retval) +ibcs2_wait(p, uap, retval) + struct proc *p; + struct ibcs2_wait_args *uap; + int *retval; { - struct vmspace *vm = p->p_vmspace; - vm_offset_t new, old; - int rv, diff; - extern int swap_pager_full; - - if (ibcs2_trace & IBCS2_TRACE_MISC) - printf("IBCS2: 'break' dsend=%x\n", - (unsigned int)args->dsend); - - if ((vm_offset_t)args->dsend < (vm_offset_t)vm->vm_daddr) - return EINVAL; - if (((caddr_t)args->dsend - (caddr_t)vm->vm_daddr) - > p->p_rlimit[RLIMIT_DATA].rlim_cur) - return ENOMEM; - - old = round_page((vm_offset_t)vm->vm_daddr) + ctob(vm->vm_dsize); - new = round_page((vm_offset_t)args->dsend); - - diff = new - old; - if (diff > 0) { - if (swap_pager_full) { - return ENOMEM; - } - rv = vm_map_find(&vm->vm_map, NULL, 0, &old, diff, FALSE); - if (rv != KERN_SUCCESS) { - return ENOMEM; - } - vm->vm_dsize += btoc(diff); - } - else if (diff < 0) { - diff = -diff; - rv = vm_map_remove(&vm->vm_map, new, new + diff); - if (rv != KERN_SUCCESS) - return ENOMEM; - vm->vm_dsize -= btoc(diff); + int error, status; + struct wait_args w4; + struct trapframe *tf = (struct trapframe *)p->p_md.md_regs; + + SCARG(&w4, rusage) = NULL; + if ((tf->tf_eflags & (PSL_Z|PSL_PF|PSL_N|PSL_V)) + == (PSL_Z|PSL_PF|PSL_N|PSL_V)) { + /* waitpid */ + SCARG(&w4, pid) = SCARG(uap, a1); + SCARG(&w4, status) = (int *)SCARG(uap, a2); + SCARG(&w4, options) = SCARG(uap, a3); + } else { + /* wait */ + SCARG(&w4, pid) = WAIT_ANY; + SCARG(&w4, status) = (int *)SCARG(uap, a1); + SCARG(&w4, options) = 0; } + if ((error = wait4(p, &w4, retval)) != 0) + return error; + if (SCARG(&w4, status)) /* this is real iBCS brain-damage */ + return copyin((caddr_t)SCARG(&w4, status), (caddr_t)&retval[1], + sizeof(SCARG(&w4, status))); return 0; } int -ibcs2_chdir(struct proc *p, void *args, int *retval) +ibcs2_execv(p, uap, retval) + struct proc *p; + struct ibcs2_execv_args *uap; + int *retval; { - if (ibcs2_trace & IBCS2_TRACE_MISC) - printf("IBCS2: 'chdir'\n"); - return chdir(p, args, retval); + struct execve_args ea; + caddr_t sg = stackgap_init(); + + CHECKALTEXIST(p, &sg, SCARG(uap, path)); + SCARG(&ea, fname) = SCARG(uap, path); + SCARG(&ea, argv) = SCARG(uap, argp); + SCARG(&ea, envv) = NULL; + return execve(p, &ea, retval); } int -ibcs2_chmod(struct proc *p, void *args, int *retval) +ibcs2_execve(p, uap, retval) + struct proc *p; + struct ibcs2_execve_args *uap; + int *retval; { - if (ibcs2_trace & IBCS2_TRACE_MISC) - printf("IBCS2: 'chmod'\n"); - return chmod(p, args, retval); + caddr_t sg = stackgap_init(); + CHECKALTEXIST(p, &sg, SCARG(uap, path)); + return execve(p, (struct execve_args *)uap, retval); } int -ibcs2_chown(struct proc *p, void *args, int *retval) +ibcs2_umount(p, uap, retval) + struct proc *p; + struct ibcs2_umount_args *uap; + int *retval; { - if (ibcs2_trace & IBCS2_TRACE_MISC) - printf("IBCS2: 'chown'\n"); - return chown(p, args, retval); -} + struct unmount_args um; -int -ibcs2_chroot(struct proc *p, void *args, int *retval) -{ - if (ibcs2_trace & IBCS2_TRACE_MISC) - printf("IBCS2: 'chroot'\n"); - return chroot(p, args, retval); + SCARG(&um, path) = SCARG(uap, name); + SCARG(&um, flags) = 0; + return unmount(p, &um, retval); } -struct exec_args { - char *name; - char **argv; -}; - int -ibcs2_exec(struct proc *p, struct exec_args *args, int *retval) +ibcs2_mount(p, uap, retval) + struct proc *p; + struct ibcs2_mount_args *uap; + int *retval; { - struct execve_args { - char *name; - char **argv; - char **envp; - } execve_args; - - if (ibcs2_trace & IBCS2_TRACE_MISC) - printf("IBCS2: 'exec' name=%s\n", args->name); - execve_args.name = args->name; - execve_args.argv = args->argv; - execve_args.envp = 0; - return execve(p, &execve_args, retval); +#ifdef notyet + int oflags = SCARG(uap, flags), nflags, error; + char fsname[MFSNAMELEN]; + + if (oflags & (IBCS2_MS_NOSUB | IBCS2_MS_SYS5)) + return (EINVAL); + if ((oflags & IBCS2_MS_NEWTYPE) == 0) + return (EINVAL); + nflags = 0; + if (oflags & IBCS2_MS_RDONLY) + nflags |= MNT_RDONLY; + if (oflags & IBCS2_MS_NOSUID) + nflags |= MNT_NOSUID; + if (oflags & IBCS2_MS_REMOUNT) + nflags |= MNT_UPDATE; + SCARG(uap, flags) = nflags; + + if (error = copyinstr((caddr_t)SCARG(uap, type), fsname, sizeof fsname, + (u_int *)0)) + return (error); + + if (strcmp(fsname, "4.2") == 0) { + SCARG(uap, type) = (caddr_t)STACK_ALLOC(); + if (error = copyout("ufs", SCARG(uap, type), sizeof("ufs"))) + return (error); + } else if (strcmp(fsname, "nfs") == 0) { + struct ibcs2_nfs_args sna; + struct sockaddr_in sain; + struct nfs_args na; + struct sockaddr sa; + + if (error = copyin(SCARG(uap, data), &sna, sizeof sna)) + return (error); + if (error = copyin(sna.addr, &sain, sizeof sain)) + return (error); + bcopy(&sain, &sa, sizeof sa); + sa.sa_len = sizeof(sain); + SCARG(uap, data) = (caddr_t)STACK_ALLOC(); + na.addr = (struct sockaddr *)((int)SCARG(uap, data) + sizeof na); + na.sotype = SOCK_DGRAM; + na.proto = IPPROTO_UDP; + na.fh = (nfsv2fh_t *)sna.fh; + na.flags = sna.flags; + na.wsize = sna.wsize; + na.rsize = sna.rsize; + na.timeo = sna.timeo; + na.retrans = sna.retrans; + na.hostname = sna.hostname; + + if (error = copyout(&sa, na.addr, sizeof sa)) + return (error); + if (error = copyout(&na, SCARG(uap, data), sizeof na)) + return (error); + } + return (mount(p, uap, retval)); +#else + return EINVAL; +#endif } -struct ibcs2_exece_args { - char *name; - char **argv; - char **envp; -}; +/* + * Read iBCS2-style directory entries. We suck them into kernel space so + * that they can be massaged before being copied out to user code. Like + * SunOS, we squish out `empty' entries. + * + * This is quite ugly, but what do you expect from compatibility code? + */ int -ibcs2_exece(struct proc *p, struct ibcs2_exece_args *args, int *retval) +ibcs2_getdents(p, uap, retval) + struct proc *p; + register struct ibcs2_getdents_args *uap; + int *retval; { - if (ibcs2_trace & IBCS2_TRACE_MISC) - printf("IBCS2: 'exece' name=%s\n", args->name); - return execve(p, args, retval); + register struct vnode *vp; + register caddr_t inp, buf; /* BSD-format */ + register int len, reclen; /* BSD-format */ + register caddr_t outp; /* iBCS2-format */ + register int resid; /* iBCS2-format */ + struct file *fp; + struct uio auio; + struct iovec aiov; + struct ibcs2_dirent idb; + off_t off; /* true file offset */ + int buflen, error, eofflag; +#define BSD_DIRENT(cp) ((struct direct *)(cp)) +#define IBCS2_RECLEN(reclen) (reclen + sizeof(u_short)) + + if ((error = getvnode(p->p_fd, SCARG(uap, fd), &fp)) != 0) + return (error); + if ((fp->f_flag & FREAD) == 0) + return (EBADF); + vp = (struct vnode *)fp->f_data; + if (vp->v_type != VDIR) /* XXX vnode readdir op should do this */ + return (EINVAL); + buflen = min(MAXBSIZE, SCARG(uap, nbytes)); + buf = malloc(buflen, M_TEMP, M_WAITOK); + VOP_LOCK(vp); + off = fp->f_offset; +again: + aiov.iov_base = buf; + aiov.iov_len = buflen; + auio.uio_iov = &aiov; + auio.uio_iovcnt = 1; + auio.uio_rw = UIO_READ; + auio.uio_segflg = UIO_SYSSPACE; + auio.uio_procp = p; + auio.uio_resid = buflen; + auio.uio_offset = off; + /* + * First we read into the malloc'ed buffer, then + * we massage it into user space, one record at a time. + */ + if (error = VOP_READDIR(vp, &auio, fp->f_cred, &eofflag, NULL, NULL)) + goto out; + inp = buf; + outp = SCARG(uap, buf); + resid = SCARG(uap, nbytes); + if ((len = buflen - auio.uio_resid) == 0) + goto eof; + for (; len > 0; len -= reclen) { + reclen = BSD_DIRENT(inp)->d_reclen; + if (reclen & 3) + panic("ibcs2_getdents"); + off += reclen; /* each entry points to next */ + if (BSD_DIRENT(inp)->d_ino == 0) { + inp += reclen; /* it is a hole; squish it out */ + continue; + } + if (reclen > len || resid < IBCS2_RECLEN(reclen)) { + /* entry too big for buffer, so just stop */ + outp++; + break; + } + /* + * Massage in place to make a iBCS2-shaped dirent (otherwise + * we have to worry about touching user memory outside of + * the copyout() call). + */ + idb.d_ino = (ibcs2_ino_t)BSD_DIRENT(inp)->d_ino; + idb.d_off = (ibcs2_off_t)off; + idb.d_reclen = (u_short)IBCS2_RECLEN(reclen); + if ((error = copyout((caddr_t)&idb, outp, 10)) != 0 || + (error = copyout(BSD_DIRENT(inp)->d_name, outp + 10, + BSD_DIRENT(inp)->d_namlen + 1)) != 0) + goto out; + /* advance past this real entry */ + inp += reclen; + /* advance output past iBCS2-shaped entry */ + outp += IBCS2_RECLEN(reclen); + resid -= IBCS2_RECLEN(reclen); + } + /* if we squished out the whole block, try again */ + if (outp == SCARG(uap, buf)) + goto again; + fp->f_offset = off; /* update the vnode offset */ +eof: + *retval = SCARG(uap, nbytes) - resid; +out: + VOP_UNLOCK(vp); + free(buf, M_TEMP); + return (error); } int -ibcs2_exit(struct proc *p, void *args, int *retval) +ibcs2_read(p, uap, retval) + struct proc *p; + struct ibcs2_read_args *uap; + int *retval; { - if (ibcs2_trace & IBCS2_TRACE_MISC) - printf("IBCS2: 'exit'\n"); - return exit(p, args, retval); + register struct vnode *vp; + register caddr_t inp, buf; /* BSD-format */ + register int len, reclen; /* BSD-format */ + register caddr_t outp; /* iBCS2-format */ + register int resid; /* iBCS2-format */ + struct file *fp; + struct uio auio; + struct iovec aiov; + struct ibcs2_direct { + ibcs2_ino_t ino; + char name[14]; + } idb; + off_t off; /* true file offset */ + int buflen, error, eofflag, size; + + if (error = getvnode(p->p_fd, SCARG(uap, fd), &fp)) { + if (error == EINVAL) + return read(p, (struct read_args *)uap, retval); + else + return error; + } + if ((fp->f_flag & FREAD) == 0) + return (EBADF); + vp = (struct vnode *)fp->f_data; + if (vp->v_type != VDIR) + return read(p, (struct read_args *)uap, retval); + DPRINTF(("ibcs2_read: read directory\n")); + buflen = max(MAXBSIZE, SCARG(uap, nbytes)); + buf = malloc(buflen, M_TEMP, M_WAITOK); + VOP_LOCK(vp); + off = fp->f_offset; +again: + aiov.iov_base = buf; + aiov.iov_len = buflen; + auio.uio_iov = &aiov; + auio.uio_iovcnt = 1; + auio.uio_rw = UIO_READ; + auio.uio_segflg = UIO_SYSSPACE; + auio.uio_procp = p; + auio.uio_resid = buflen; + auio.uio_offset = off & ~(DIRBLKSIZ - 1); + /* + * First we read into the malloc'ed buffer, then + * we massage it into user space, one record at a time. + */ + if (error = VOP_READDIR(vp, &auio, fp->f_cred, &eofflag, 0, 0)) { + DPRINTF(("VOP_READDIR failed: %d\n", error)); + goto out; + } + inp = buf + (off & (DIRBLKSIZ - 1)); + buflen -= off & (DIRBLKSIZ - 1); + outp = SCARG(uap, buf); + resid = SCARG(uap, nbytes); + if ((len = buflen - auio.uio_resid) == 0) + goto eof; + for (; len > 0 && resid > 0; len -= reclen) { + reclen = BSD_DIRENT(inp)->d_reclen; + if (reclen & 3) + panic("ibcs2_read"); + if (BSD_DIRENT(inp)->d_ino == 0) { + inp += reclen; /* it is a hole; squish it out */ + off += reclen; + continue; + } + if (reclen > len || resid < sizeof(struct ibcs2_direct)) { + /* entry too big for buffer, so just stop */ + outp++; + break; + } + /* + * Massage in place to make a iBCS2-shaped dirent (otherwise + * we have to worry about touching user memory outside of + * the copyout() call). + * + * TODO: if length(filename) > 14, then break filename into + * multiple entries and set inode = 0xffff except last + */ + idb.ino = (BSD_DIRENT(inp)->d_ino > 0xfffe) ? 0xfffe : + BSD_DIRENT(inp)->d_ino; + (void)copystr(BSD_DIRENT(inp)->d_name, idb.name, 14, &size); + bzero(idb.name + size, 14 - size); + if (error = copyout(&idb, outp, sizeof(struct ibcs2_direct))) + goto out; + /* advance past this real entry */ + off += reclen; + inp += reclen; + /* advance output past iBCS2-shaped entry */ + outp += sizeof(struct ibcs2_direct); + resid -= sizeof(struct ibcs2_direct); + } + /* if we squished out the whole block, try again */ + if (outp == SCARG(uap, buf)) + goto again; + fp->f_offset = off; /* update the vnode offset */ +eof: + *retval = SCARG(uap, nbytes) - resid; +out: + VOP_UNLOCK(vp); + free(buf, M_TEMP); + return (error); } int -ibcs2_fork(struct proc *p, void *args, int *retval) +ibcs2_mknod(p, uap, retval) + struct proc *p; + struct ibcs2_mknod_args *uap; + int *retval; { - if (ibcs2_trace & IBCS2_TRACE_MISC) - printf("IBCS2: 'fork'\n"); - return fork(p, args, retval); + caddr_t sg = stackgap_init(); + + CHECKALTCREAT(p, &sg, SCARG(uap, path)); + if (S_ISFIFO(SCARG(uap, mode))) { + struct mkfifo_args ap; + SCARG(&ap, path) = SCARG(uap, path); + SCARG(&ap, mode) = SCARG(uap, mode); + return mkfifo(p, &ap, retval); + } else { + struct mknod_args ap; + SCARG(&ap, path) = SCARG(uap, path); + SCARG(&ap, mode) = SCARG(uap, mode); + SCARG(&ap, dev) = SCARG(uap, dev); + return mknod(p, &ap, retval); + } } int -ibcs2_fsync(struct proc *p, void *args, int *retval) +ibcs2_getgroups(p, uap, retval) + struct proc *p; + struct ibcs2_getgroups_args *uap; + int *retval; { - if (ibcs2_trace & IBCS2_TRACE_MISC) - printf("IBCS2: 'fsync'\n"); - return fsync(p, args, retval); + int error, i; + ibcs2_gid_t igid, *iset; + struct getgroups_args sa; + gid_t *gp; + caddr_t sg = stackgap_init(); + + SCARG(&sa, gidsetsize) = SCARG(uap, gidsetsize); + if (SCARG(uap, gidsetsize)) { + SCARG(&sa, gidset) = stackgap_alloc(&sg, NGROUPS_MAX * + sizeof(gid_t *)); + } + iset = stackgap_alloc(&sg, SCARG(uap, gidsetsize)*sizeof(ibcs2_gid_t)); + if (error = getgroups(p, &sa, retval)) + return error; + for (i = 0, gp = SCARG(&sa, gidset); i < retval[0]; i++) + iset[i] = (ibcs2_gid_t)*gp++; + if (retval[0] && (error = copyout((caddr_t)iset, + (caddr_t)SCARG(uap, gidset), + sizeof(ibcs2_gid_t) * retval[0]))) + return error; + return 0; } int -ibcs2_getgid(struct proc *p, void *args, int *retval) +ibcs2_setgroups(p, uap, retval) + struct proc *p; + struct ibcs2_setgroups_args *uap; + int *retval; { - if (ibcs2_trace & IBCS2_TRACE_MISC) - printf("IBCS2: 'getgid'\n"); - return getgid(p, args, retval); + int error, i; + ibcs2_gid_t igid, *iset; + struct setgroups_args sa; + gid_t *gp; + caddr_t sg = stackgap_init(); + + SCARG(&sa, gidsetsize) = SCARG(uap, gidsetsize); + SCARG(&sa, gidset) = stackgap_alloc(&sg, SCARG(&sa, gidsetsize) * + sizeof(gid_t *)); + iset = stackgap_alloc(&sg, SCARG(&sa, gidsetsize) * + sizeof(ibcs2_gid_t *)); + if (SCARG(&sa, gidsetsize)) { + if (error = copyin((caddr_t)SCARG(uap, gidset), (caddr_t)iset, + sizeof(ibcs2_gid_t *) * + SCARG(uap, gidsetsize))) + return error; + } + for (i = 0, gp = SCARG(&sa, gidset); i < SCARG(&sa, gidsetsize); i++) + *gp++ = (gid_t)iset[i]; + return setgroups(p, &sa, retval); } -struct ibcs2_getgroups_args { - int gidsetsize; - ibcs2_gid_t *gidset; -}; - int -ibcs2_getgroups(struct proc *p, struct ibcs2_getgroups_args *args, int *retval) +ibcs2_setuid(p, uap, retval) + struct proc *p; + struct ibcs2_setuid_args *uap; + int *retval; { - struct getgroups_args { - u_int gidsetsize; - gid_t *gidset; - } tmp; - ibcs2_gid_t *ibcs2_gidset; - int i, error; - - if (ibcs2_trace & IBCS2_TRACE_MISC) - printf("IBCS2: 'getgroups'\n"); + struct setuid_args sa; - tmp.gidsetsize = args->gidsetsize; - tmp.gidset = (gid_t *)UA_ALLOC(); - ibcs2_gidset = (ibcs2_gid_t *)&tmp.gidset[NGROUPS_MAX]; - if (error = getgroups(p, &tmp, retval)) - return error; - for (i = 0; i < retval[0]; i++) - ibcs2_gidset[i] = (ibcs2_gid_t)tmp.gidset[i]; - return copyout((caddr_t)ibcs2_gidset, (caddr_t)args->gidset, - sizeof(ibcs2_gid_t) * retval[0]); + SCARG(&sa, uid) = (uid_t)SCARG(uap, uid); + return setuid(p, &sa, retval); } int -ibcs2_getpid(struct proc *p, void *args, int *retval) +ibcs2_setgid(p, uap, retval) + struct proc *p; + struct ibcs2_setgid_args *uap; + int *retval; { - if (ibcs2_trace & IBCS2_TRACE_MISC) - printf("IBCS2: 'getpid'\n"); - return getpid(p, args, retval); -} + struct setgid_args sa; -int -ibcs2_getuid(struct proc *p, void *args, int *retval) -{ - if (ibcs2_trace & IBCS2_TRACE_MISC) - printf("IBCS2: 'getuid'\n"); - return getuid(p, args, retval); + SCARG(&sa, gid) = (gid_t)SCARG(uap, gid); + return setgid(p, &sa, retval); } -struct gtime_args { - long *timeptr; -}; - int -ibcs2_gtime(struct proc *p, struct gtime_args *args, int *retval) +ibcs2_time(p, uap, retval) + struct proc *p; + struct ibcs2_time_args *uap; + int *retval; { - int error = 0; struct timeval tv; - if (ibcs2_trace & IBCS2_TRACE_MISC) - printf("IBCS2: 'gtime'\n"); microtime(&tv); *retval = tv.tv_sec; - if (args) - (long)args->timeptr = tv.tv_sec; - return error; + if (SCARG(uap, tp)) + return copyout((caddr_t)&tv.tv_sec, (caddr_t)SCARG(uap, tp), + sizeof(ibcs2_time_t)); + else + return 0; } int -ibcs2_link(struct proc *p, void *args, int *retval) +ibcs2_pathconf(p, uap, retval) + struct proc *p; + struct ibcs2_pathconf_args *uap; + int *retval; { - if (ibcs2_trace & IBCS2_TRACE_MISC) - printf("IBCS2: 'link'\n"); - return link(p, args, retval); + SCARG(uap, name)++; /* iBCS2 _PC_* defines are offset by one */ + return pathconf(p, (struct pathconf_args *)uap, retval); } int -ibcs2_mkdir(struct proc *p, void *args, int *retval) +ibcs2_fpathconf(p, uap, retval) + struct proc *p; + struct ibcs2_fpathconf_args *uap; + int *retval; { - if (ibcs2_trace & IBCS2_TRACE_MISC) - printf("IBCS2: 'mkdir'\n"); - return mkdir(p, args, retval); + SCARG(uap, name)++; /* iBCS2 _PC_* defines are offset by one */ + return fpathconf(p, (struct fpathconf_args *)uap, retval); } -struct ibcs2_mknod_args { - char *fname; - int fmode; - ibcs2_dev_t dev; -}; - int -ibcs2_mknod(struct proc *p, struct ibcs2_mknod_args *args, int *retval) +ibcs2_sysconf(p, uap, retval) + struct proc *p; + struct ibcs2_sysconf_args *uap; + int *retval; { - if (ibcs2_trace & IBCS2_TRACE_MISC) - printf("IBCS2: 'mknod'\n"); - if (S_ISFIFO(args->fmode)) - return mkfifo(p, args, retval); - return mknod(p, args, retval); -} + int mib[2], value, len, error; + struct sysctl_args sa; + struct __getrlimit_args ga; + + switch(SCARG(uap, name)) { + case IBCS2_SC_ARG_MAX: + mib[1] = KERN_ARGMAX; + break; + + case IBCS2_SC_CHILD_MAX: + { + caddr_t sg = stackgap_init(); + + SCARG(&ga, which) = RLIMIT_NPROC; + SCARG(&ga, rlp) = stackgap_alloc(&sg, sizeof(struct rlimit *)); + if (error = getrlimit(p, &ga, retval)) + return error; + *retval = SCARG(&ga, rlp)->rlim_cur; + return 0; + } -struct ibcs2_nice_args { - int niceval; -}; + case IBCS2_SC_CLK_TCK: + *retval = hz; + return 0; -int -ibcs2_nice(struct proc *p, struct ibcs2_nice_args *args, int *retval) -{ - int error; + case IBCS2_SC_NGROUPS_MAX: + mib[1] = KERN_NGROUPS; + break; - if (ibcs2_trace & IBCS2_TRACE_MISC) - printf("IBCS2: 'nice'\n"); - error = donice(p, p, args->niceval); - *retval = p->p_nice; - return error; -} + case IBCS2_SC_OPEN_MAX: + { + caddr_t sg = stackgap_init(); -struct ibcs2_pathconf_args { - long unused; - int cmd; -}; -int -ibcs2_pathconf(struct proc *p, struct ibcs2_pathconf_args *args, int *retval) -{ - if (ibcs2_trace & IBCS2_TRACE_MISC) - printf("IBCS2: '(f)pathconf'\n"); - switch (args->cmd) { - case 0: /* _PC_LINK_MAX */ - *retval = (LINK_MAX); - break; - case 1: /* _PC_MAX_CANON */ - *retval = (MAX_CANON); - break; - case 2: /* _PC_MAX_INPUT */ - *retval = (MAX_INPUT); - break; - case 5: /* _PC_PATH_MAX */ - *retval = (PATH_MAX); - break; - case 8: /* _PC_VDISABLE */ - *retval = (_POSIX_VDISABLE); - break; - case 3: /* _PC_NAME_MAX */ - *retval = (NAME_MAX); - break; - case 4: /* _PC_PATH_MAX */ - *retval = (PATH_MAX); - break; - case 6: /* _PC_CHOWN_RESTRICTED */ -#ifdef _POSIX_CHOWN_RESTRICTED - *retval = (1); -#else - *retval = (-1); -#endif - break; - case 7: /* _PC_NO_TRUNC */ -#ifdef _POSIX_NO_TRUNC - *retval = (1); -#else - *retval = (-1); -#endif - break; - default: - *retval = -1; - return EINVAL; - } - return 0; -} + SCARG(&ga, which) = RLIMIT_NOFILE; + SCARG(&ga, rlp) = stackgap_alloc(&sg, sizeof(struct rlimit *)); + if (error = getrlimit(p, &ga, retval)) + return error; + *retval = SCARG(&ga, rlp)->rlim_cur; + return 0; + } + + case IBCS2_SC_JOB_CONTROL: + mib[1] = KERN_JOB_CONTROL; + break; + + case IBCS2_SC_SAVED_IDS: + mib[1] = KERN_SAVED_IDS; + break; + + case IBCS2_SC_VERSION: + mib[1] = KERN_POSIX1; + break; + + case IBCS2_SC_PASS_MAX: + *retval = 128; /* XXX - should we create PASS_MAX ? */ + return 0; -int -ibcs2_pause(struct proc *p, void *args, int *retval) -{ - int mask = 0; + case IBCS2_SC_XOPEN_VERSION: + *retval = 2; /* XXX: What should that be? */ + return 0; + + default: + return EINVAL; + } - if (ibcs2_trace & IBCS2_TRACE_MISC) - printf("IBCS2: 'pause'\n"); - return sigsuspend(p, &mask, retval); + mib[0] = CTL_KERN; + len = sizeof(value); + SCARG(&sa, name) = mib; + SCARG(&sa, namelen) = 2; + SCARG(&sa, old) = &value; + SCARG(&sa, oldlenp) = &len; + SCARG(&sa, new) = NULL; + SCARG(&sa, newlen) = 0; + if (error = __sysctl(p, &sa, retval)) + return error; + *retval = value; + return 0; } int -ibcs2_pipe(struct proc *p, void *args, int *retval) +ibcs2_alarm(p, uap, retval) + struct proc *p; + struct ibcs2_alarm_args *uap; + int *retval; { - if (ibcs2_trace & IBCS2_TRACE_MISC) - printf("IBCS2: 'pipe'\n"); - return pipe(p, args, retval); + int error; + struct itimerval *itp, *oitp; + struct setitimer_args sa; + caddr_t sg = stackgap_init(); + + itp = stackgap_alloc(&sg, sizeof(*itp)); + oitp = stackgap_alloc(&sg, sizeof(*oitp)); + timerclear(&itp->it_interval); + itp->it_value.tv_sec = SCARG(uap, sec); + itp->it_value.tv_usec = 0; + + SCARG(&sa, which) = ITIMER_REAL; + SCARG(&sa, itv) = itp; + SCARG(&sa, oitv) = oitp; + error = setitimer(p, &sa, retval); + if (error) + return error; + if (oitp->it_value.tv_usec) + oitp->it_value.tv_sec++; + *retval = oitp->it_value.tv_sec; + return 0; } -struct ibcs2_poll { - int fd; - short events; - short revents; -}; - -struct ibcs2_poll_args { - struct ibcs2_poll *fds; - unsigned long nfds; - int timeout; -}; - int -ibcs2_poll(struct proc *p, struct ibcs2_poll_args *args, int *retval) +ibcs2_getmsg(p, uap, retval) + struct proc *p; + struct ibcs2_getmsg_args *uap; + int *retval; { - struct ibcs2_poll conv; - fd_set *readfds, *writefds, *exceptfds; - struct timeval *timeout; - struct select_args { - u_int nd; - fd_set *in, *ou, *ex; - struct timeval *tv; - } tmp_select; - int i, error; - - if (ibcs2_trace & IBCS2_TRACE_MISC) - printf("IBCS2: 'poll'\n"); - if (args->nfds > FD_SETSIZE) - return EINVAL; - readfds = (fd_set *)UA_ALLOC(); - FD_ZERO(readfds); - writefds = (fd_set *)UA_ALLOC() + sizeof(fd_set *); - FD_ZERO(writefds); - exceptfds = (fd_set *)UA_ALLOC() + 2*sizeof(fd_set *); - FD_ZERO(exceptfds); - timeout = (struct timeval *)UA_ALLOC() + 3*sizeof(fd_set *); - if (args->timeout == -1) - timeout = NULL; - else { - timeout->tv_usec = (args->timeout % 1000)*1000; - timeout->tv_sec = args->timeout / 1000; - } - tmp_select.nd = 0; - tmp_select.in = readfds; - tmp_select.ou = writefds; - tmp_select.ex = exceptfds; - tmp_select.tv = timeout; - for (i = 0; i < args->nfds; i++) { - if (error = copyin(args->fds + i*sizeof(struct ibcs2_poll), - &conv, sizeof(conv))) - return error; - conv.revents = 0; - if (conv.fd < 0 || conv.fd > FD_SETSIZE) - continue; - if (conv.fd >= tmp_select.nd) - tmp_select.nd = conv.fd + 1; - if (conv.events & IBCS2_READPOLL) - FD_SET(conv.fd, readfds); - if (conv.events & IBCS2_WRITEPOLL) - FD_SET(conv.fd, writefds); - FD_SET(conv.fd, exceptfds); - } - if (error = select(p, &tmp_select, retval)) - return error; - if (*retval == 0) - return 0; - *retval = 0; - for (*retval = 0, i = 0; i < args->nfds; i++) { - copyin(args->fds + i*sizeof(struct ibcs2_poll), - &conv, sizeof(conv)); - conv.revents = 0; - if (conv.fd < 0 || conv.fd > FD_SETSIZE) - /* should check for open as well */ - conv.revents |= IBCS2_POLLNVAL; - else { - if (FD_ISSET(conv.fd, readfds)) - conv.revents |= IBCS2_POLLIN; - if (FD_ISSET(conv.fd, writefds)) - conv.revents |= IBCS2_POLLOUT; - if (FD_ISSET(conv.fd, exceptfds)) - conv.revents |= IBCS2_POLLERR; - if (conv.revents) - ++*retval; - } - if (error = copyout(&conv, - args->fds + i*sizeof(struct ibcs2_poll), - sizeof(conv))) - return error; - } return 0; } -struct ibcs2_procids_args { - int req; - int eax; -}; - int -ibcs2_procids(struct proc *p, struct ibcs2_procids_args *args, int *retval) +ibcs2_putmsg(p, uap, retval) + struct proc *p; + struct ibcs2_putmsg_args *uap; + int *retval; { - if (ibcs2_trace & IBCS2_TRACE_MISC) - printf("IBCS2: 'procids' request=%d, eax=%x\n", - args->req, args->eax); - switch (args->req) { - case 0: /* getpgrp */ - return getpgrp(p, args, retval); - case 1: /* setpgrp */ - { - struct setpgid_args { - int pid; - int pgid; - } tmp; - tmp.pid = tmp.pgid = 0; - return setpgid(p, &tmp, retval); - } - case 2: /* setpgid */ - return setpgid(p, args, retval); - case 3: /* setsid */ - return setsid(p, args, retval); - default: - return EINVAL; - } + return 0; } int -ibcs2_profil(struct proc *p, void *args, int *retval) +ibcs2_times(p, uap, retval) + struct proc *p; + struct ibcs2_times_args *uap; + int *retval; { - if (ibcs2_trace & IBCS2_TRACE_MISC) - printf("IBCS2: 'profil'\n"); - return profil(p, args, retval); + int error; + struct getrusage_args ga; + struct tms tms; + struct timeval t; + caddr_t sg = stackgap_init(); + struct rusage *ru = stackgap_alloc(&sg, sizeof(*ru)); +#define CONVTCK(r) (r.tv_sec * hz + r.tv_usec / (1000000 / hz)) + + SCARG(&ga, who) = RUSAGE_SELF; + SCARG(&ga, rusage) = ru; + error = getrusage(p, &ga, retval); + if (error) + return error; + tms.tms_utime = CONVTCK(ru->ru_utime); + tms.tms_stime = CONVTCK(ru->ru_stime); + + SCARG(&ga, who) = RUSAGE_CHILDREN; + error = getrusage(p, &ga, retval); + if (error) + return error; + tms.tms_cutime = CONVTCK(ru->ru_utime); + tms.tms_cstime = CONVTCK(ru->ru_stime); + + microtime(&t); + *retval = CONVTCK(t); + + return copyout((caddr_t)&tms, (caddr_t)SCARG(uap, tp), + sizeof(struct tms)); } int -ibcs2_ptrace(struct proc *p, void *args, int *retval) +ibcs2_stime(p, uap, retval) + struct proc *p; + struct ibcs2_stime_args *uap; + int *retval; { - if (ibcs2_trace & IBCS2_TRACE_MISC) - printf("IBCS2: 'ptrace'\n"); - return ptrace(p, args, retval); -} + int error; + struct settimeofday_args sa; + caddr_t sg = stackgap_init(); -int -ibcs2_readlink(struct proc *p, void *args, int *retval) -{ - if (ibcs2_trace & IBCS2_TRACE_MISC) - printf("IBCS2: 'readlink'\n"); - return readlink(p, args, retval); + SCARG(&sa, tv) = stackgap_alloc(&sg, sizeof(*SCARG(&sa, tv))); + SCARG(&sa, tzp) = NULL; + if (error = copyin((caddr_t)SCARG(uap, timep), + &(SCARG(&sa, tv)->tv_sec), sizeof(long))) + return error; + SCARG(&sa, tv)->tv_usec = 0; + if (error = settimeofday(p, &sa, retval)) + return EPERM; + return 0; } int -ibcs2_rename(struct proc *p, void *args, int *retval) +ibcs2_utime(p, uap, retval) + struct proc *p; + struct ibcs2_utime_args *uap; + int *retval; { - if (ibcs2_trace & IBCS2_TRACE_MISC) - printf("IBCS2: 'rename'\n"); - return rename(p, args, retval); + int error; + struct utimes_args sa; + struct timeval *tp; + caddr_t sg = stackgap_init(); + + CHECKALTEXIST(p, &sg, SCARG(uap, path)); + SCARG(&sa, path) = SCARG(uap, path); + if (SCARG(uap, buf)) { + struct ibcs2_utimbuf ubuf; + + if (error = copyin((caddr_t)SCARG(uap, buf), (caddr_t)&ubuf, + sizeof(ubuf))) + return error; + SCARG(&sa, tptr) = stackgap_alloc(&sg, + 2 * sizeof(struct timeval *)); + tp = (struct timeval *)SCARG(&sa, tptr); + tp->tv_sec = ubuf.actime; + tp->tv_usec = 0; + tp++; + tp->tv_sec = ubuf.modtime; + tp->tv_usec = 0; + } else + SCARG(&sa, tptr) = NULL; + return utimes(p, &sa, retval); } int -ibcs2_rmdir(struct proc *p, void *args, int *retval) +ibcs2_nice(p, uap, retval) + struct proc *p; + struct ibcs2_nice_args *uap; + int *retval; { - if (ibcs2_trace & IBCS2_TRACE_MISC) - printf("IBCS2: 'rmdir'\n"); - return rmdir(p, args, retval); + int error, cur_nice = p->p_nice; + struct setpriority_args sa; + + SCARG(&sa, which) = PRIO_PROCESS; + SCARG(&sa, who) = 0; + SCARG(&sa, prio) = p->p_nice + SCARG(uap, incr); + if (error = setpriority(p, &sa, retval)) + return EPERM; + *retval = p->p_nice; + return 0; } -struct ibcs2_secure_args { - int cmd; - int arg1; - int arg2; - int arg3; - int arg4; - int arg5; -}; +/* + * iBCS2 getpgrp, setpgrp, setsid, and setpgid + */ int -ibcs2_secure(struct proc *p, struct ibcs2_secure_args *args, int *retval) +ibcs2_pgrpsys(p, uap, retval) + struct proc *p; + struct ibcs2_pgrpsys_args *uap; + int *retval; { - struct trapframe *tf = (struct trapframe *)p->p_md.md_regs; + switch (SCARG(uap, type)) { + case 0: /* getpgrp */ + *retval = p->p_pgrp->pg_id; + return 0; - if (ibcs2_trace & IBCS2_TRACE_MISC) - printf("IBCS2: 'secure'\n"); + case 1: /* setpgrp */ + { + struct setpgid_args sa; - switch (args->cmd) { + SCARG(&sa, pid) = 0; + SCARG(&sa, pgid) = 0; + setpgid(p, &sa, retval); + *retval = p->p_pgrp->pg_id; + return 0; + } - case 1: /* get login uid */ - *retval = p->p_ucred->cr_uid; - return EPERM; + case 2: /* setpgid */ + { + struct setpgid_args sa; + + SCARG(&sa, pid) = SCARG(uap, pid); + SCARG(&sa, pgid) = SCARG(uap, pgid); + return setpgid(p, &sa, retval); + } - case 2: /* set login uid */ + case 3: /* setsid */ + return setsid(p, NULL, retval); default: - printf("IBCS2: 'secure' cmd=%d not implemented\n",args->cmd); + return EINVAL; } - return EINVAL; } -struct ibcs2_setgid_args { - ibcs2_gid_t gid; -}; +/* + * XXX - need to check for nested calls + */ int -ibcs2_setgid(struct proc *p, struct ibcs2_setgid_args *args, int *retval) +ibcs2_plock(p, uap, retval) + struct proc *p; + struct ibcs2_plock_args *uap; + int *retval; { - struct setgid_args { - gid_t gid; - } tmp; - - if (ibcs2_trace & IBCS2_TRACE_MISC) - printf("IBCS2: 'setgid'\n"); - tmp.gid = (gid_t) args->gid; - return setgid(p, &tmp, retval); + int error; +#define IBCS2_UNLOCK 0 +#define IBCS2_PROCLOCK 1 +#define IBCS2_TEXTLOCK 2 +#define IBCS2_DATALOCK 4 + + + if (error = suser(p->p_ucred, &p->p_acflag)) + return EPERM; + switch(SCARG(uap, cmd)) { + case IBCS2_UNLOCK: + case IBCS2_PROCLOCK: + case IBCS2_TEXTLOCK: + case IBCS2_DATALOCK: + return 0; /* XXX - TODO */ + } + return EINVAL; } -struct ibcs2_setgroups_args { - int gidsetsize; - ibcs2_gid_t *gidset; -}; - int -ibcs2_setgroups(struct proc *p, struct ibcs2_setgroups_args *args, int *retval) +ibcs2_uadmin(p, uap, retval) + struct proc *p; + struct ibcs2_uadmin_args *uap; + int *retval; { - struct setgroups_args { - u_int gidsetsize; - gid_t *gidset; - } tmp; - ibcs2_gid_t *ibcs2_gidset; - int i, error; - - if (ibcs2_trace & IBCS2_TRACE_MISC) - printf("IBCS2: 'setgroups'\n"); - tmp.gidsetsize = args->gidsetsize; - tmp.gidset = (gid_t *)UA_ALLOC(); - ibcs2_gidset = (ibcs2_gid_t *)&tmp.gidset[NGROUPS_MAX]; - if (error = copyin((caddr_t)args->gidset, (caddr_t)ibcs2_gidset, - sizeof(ibcs2_gid_t) * tmp.gidsetsize)) - return error; - for (i = 0; i < tmp.gidsetsize; i++) - tmp.gidset[i] = (gid_t)ibcs2_gidset[i]; - return setgroups(p, &tmp, retval); +#define SCO_A_REBOOT 1 +#define SCO_A_SHUTDOWN 2 +#define SCO_A_REMOUNT 4 +#define SCO_A_CLOCK 8 +#define SCO_A_SETCONFIG 128 +#define SCO_A_GETDEV 130 + +#define SCO_AD_HALT 0 +#define SCO_AD_BOOT 1 +#define SCO_AD_IBOOT 2 +#define SCO_AD_PWRDOWN 3 +#define SCO_AD_PWRNAP 4 + +#define SCO_AD_PANICBOOT 1 + +#define SCO_AD_GETBMAJ 0 +#define SCO_AD_GETCMAJ 1 + + if (suser(p->p_ucred, &p->p_acflag)) + return EPERM; + + switch(SCARG(uap, cmd)) { + case SCO_A_REBOOT: + case SCO_A_SHUTDOWN: + switch(SCARG(uap, func)) { + struct reboot_args r; + case SCO_AD_HALT: + case SCO_AD_PWRDOWN: + case SCO_AD_PWRNAP: + r.opt = RB_HALT; + reboot(p, &r, retval); + case SCO_AD_BOOT: + case SCO_AD_IBOOT: + r.opt = RB_AUTOBOOT; + reboot(p, &r, retval); + } + return EINVAL; + case SCO_A_REMOUNT: + case SCO_A_CLOCK: + case SCO_A_SETCONFIG: + return 0; + case SCO_A_GETDEV: + return EINVAL; /* XXX - TODO */ + } + return EINVAL; } -struct ibcs2_setuid_args { - ibcs2_uid_t uid; -}; - int -ibcs2_setuid(struct proc *p, struct ibcs2_setuid_args *args, int *retval) +ibcs2_sysfs(p, uap, retval) + struct proc *p; + struct ibcs2_sysfs_args *uap; + int *retval; { - struct setuid_args { - uid_t uid; - } tmp; - - if (ibcs2_trace & IBCS2_TRACE_MISC) - printf("IBCS2: 'setuid'\n"); - tmp.uid = (uid_t) args->uid; - return setuid(p, &tmp, retval); +#define IBCS2_GETFSIND 1 +#define IBCS2_GETFSTYP 2 +#define IBCS2_GETNFSTYP 3 + + switch(SCARG(uap, cmd)) { + case IBCS2_GETFSIND: + case IBCS2_GETFSTYP: + case IBCS2_GETNFSTYP: + } + return EINVAL; /* XXX - TODO */ } int -ibcs2_smount(struct proc *p, void *args, int *retval) +ibcs2_unlink(p, uap, retval) + struct proc *p; + struct ibcs2_unlink_args *uap; + int *retval; { - if (ibcs2_trace & IBCS2_TRACE_MISC) - printf("IBCS2: 'smount'\n"); - return mount(p, args, retval); -} + caddr_t sg = stackgap_init(); -struct ibcs2_stime_args { - long *timeptr; -}; + CHECKALTEXIST(p, &sg, SCARG(uap, path)); + return unlink(p, (struct unlink_args *)uap, retval); +} int -ibcs2_stime(struct proc *p, struct ibcs2_stime_args *args, int *retval) +ibcs2_chdir(p, uap, retval) + struct proc *p; + struct ibcs2_chdir_args *uap; + int *retval; { - int error; + caddr_t sg = stackgap_init(); - if (ibcs2_trace & IBCS2_TRACE_MISC) - printf("IBCS2: 'stime'\n"); - if (error = suser(p->p_ucred, &p->p_acflag)) - return error; - if (args->timeptr) { -#if 0 - /* WHAT DO WE DO ABOUT PENDING REAL-TIME TIMEOUTS??? */ - boottime.tv_sec += (long)args->timeptr - time.tv_sec; - s = splhigh(); - time.tv_sec = (long)args->timeptr; - time.tv_usec = 0; - splx(s); - resettodr(); -#else - printf("IBCS2: trying to set system time %d\n", - (long)args->timeptr); -#endif - } - return 0; + CHECKALTEXIST(p, &sg, SCARG(uap, path)); + return chdir(p, (struct chdir_args *)uap, retval); } int -ibcs2_sumount(struct proc *p, void *args, int *retval) +ibcs2_chmod(p, uap, retval) + struct proc *p; + struct ibcs2_chmod_args *uap; + int *retval; { - if (ibcs2_trace & IBCS2_TRACE_MISC) - printf("IBCS2: 'sumount'\n"); - return unmount(p, args, retval); -} + caddr_t sg = stackgap_init(); -int -ibcs2_symlink(struct proc *p, void *args, int *retval) -{ - if (ibcs2_trace & IBCS2_TRACE_MISC) - printf("IBCS2: 'symlink'\n"); - return symlink(p, args, retval); + CHECKALTEXIST(p, &sg, SCARG(uap, path)); + return chmod(p, (struct chmod_args *)uap, retval); } int -ibcs2_sync(struct proc *p, void *args, int *retval) +ibcs2_chown(p, uap, retval) + struct proc *p; + struct ibcs2_chown_args *uap; + int *retval; { - if (ibcs2_trace & IBCS2_TRACE_MISC) - printf("IBCS2: 'sync'\n"); - return sync(p, args, retval); -} + caddr_t sg = stackgap_init(); -int -ibcs2_sysacct(struct proc *p, void *args, int *retval) -{ - if (ibcs2_trace & IBCS2_TRACE_MISC) - printf("IBCS2: 'sysacct'\n"); - return acct(p, args, retval); + CHECKALTEXIST(p, &sg, SCARG(uap, path)); + return chown(p, (struct chown_args *)uap, retval); } -struct ibcs2_tms { - long tms_utime; - long tms_stime; - long tms_cutime; - long tms_cstime; -}; - int -ibcs2_times(struct proc *p, struct ibcs2_tms *args, int *retval) +ibcs2_rmdir(p, uap, retval) + struct proc *p; + struct ibcs2_rmdir_args *uap; + int *retval; { - extern int hz; - struct timeval tv; - struct ibcs2_tms tms; - - if (ibcs2_trace & IBCS2_TRACE_MISC) - printf("IBCS2: 'times'\n"); - tms.tms_utime = p->p_uticks; - tms.tms_stime = p->p_sticks; - tms.tms_cutime = p->p_stats->p_cru.ru_utime.tv_sec * hz + - ((p->p_stats->p_cru.ru_utime.tv_usec * hz)/1000000); - tms.tms_cstime = p->p_stats->p_cru.ru_stime.tv_sec * hz + - ((p->p_stats->p_cru.ru_stime.tv_usec * hz)/1000000); - microtime(&tv); - *retval = tv.tv_sec * hz + (tv.tv_usec * hz)/1000000; - return (copyout((caddr_t)&tms, - (caddr_t)args->tms_utime, - sizeof(struct ibcs2_tms))); -} + caddr_t sg = stackgap_init(); -struct ibcs2_ulimit_args { - int cmd; - long limit; -}; + CHECKALTEXIST(p, &sg, SCARG(uap, path)); + return rmdir(p, (struct rmdir_args *)uap, retval); +} int -ibcs2_ulimit(struct proc *p, struct ibcs2_ulimit_args *args, int *retval) +ibcs2_mkdir(p, uap, retval) + struct proc *p; + struct ibcs2_mkdir_args *uap; + int *retval; { - if (ibcs2_trace & IBCS2_TRACE_MISC) - printf("IBCS2: 'ulimit'\n"); - switch (args->cmd) { - case IBCS2_GETFSIZE: - *retval = p->p_rlimit[RLIMIT_FSIZE].rlim_cur; - return 0; + caddr_t sg = stackgap_init(); - case IBCS2_SETFSIZE: - return EINVAL; - - case IBCS2_GETPSIZE: - *retval = p->p_rlimit[RLIMIT_RSS].rlim_cur; - return 0; - case IBCS2_GETMOPEN: - *retval = p->p_rlimit[RLIMIT_NOFILE].rlim_cur; - return 0; - } - return EINVAL; + CHECKALTCREAT(p, &sg, SCARG(uap, path)); + return mkdir(p, (struct mkdir_args *)uap, retval); } int -ibcs2_umask(struct proc *p, void *args, int *retval) +ibcs2_symlink(p, uap, retval) + struct proc *p; + struct ibcs2_symlink_args *uap; + int *retval; { - if (ibcs2_trace & IBCS2_TRACE_MISC) - printf("IBCS2: 'umask'\n"); - return umask(p, args, retval); -} + caddr_t sg = stackgap_init(); -int -ibcs2_unlink(struct proc *p, void *args, int *retval) -{ - if (ibcs2_trace & IBCS2_TRACE_MISC) - printf("IBCS2: 'unlink'\n"); - return unlink(p, args, retval); + CHECKALTEXIST(p, &sg, SCARG(uap, path)); + CHECKALTCREAT(p, &sg, SCARG(uap, link)); + return symlink(p, (struct symlink_args *)uap, retval); } -struct ibcs2_utime_args { - char *fname; - ibcs2_time_t *timeptr; -}; - int -ibcs2_utime(struct proc *p, struct ibcs2_utime_args *args, int *retval) +ibcs2_rename(p, uap, retval) + struct proc *p; + struct ibcs2_rename_args *uap; + int *retval; { - struct bsd_utimes_args { - char *fname; - struct timeval *tptr; - } bsdutimes; - struct timeval tv; - - if (ibcs2_trace & IBCS2_TRACE_MISC) - printf("IBCS2: 'utime'\n"); - tv.tv_sec = (long)args->timeptr; - tv.tv_usec = 0; - bsdutimes.tptr = &tv; - bsdutimes.fname = args->fname; - return utimes(p, &bsdutimes, retval); -} - -struct ibcs2_utssys_args { - char *buf; - int mv; - int cmd; -}; - -int -ibcs2_utssys(struct proc *p, struct ibcs2_utssys_args *args, int *retval) -{ - struct ibcs2_utsname { - char sysname[9]; - char nodename[9]; - char release[9]; - char version[9]; - char machine[9]; - } ibcs2_uname; - extern char ostype[], hostname[], osrelease[], machine[]; - - if (ibcs2_trace & IBCS2_TRACE_MISC) - printf("IBCS2: 'utssys' cmd=%d\n", args->cmd); - switch(args->cmd) { - case 0: /* uname */ - bzero(&ibcs2_uname, sizeof(struct ibcs2_utsname)); - strncpy(ibcs2_uname.sysname, ostype, 8); - strncpy(ibcs2_uname.nodename, hostname, 8); - strncpy(ibcs2_uname.release, osrelease, 8); - strncpy(ibcs2_uname.version, version, 8); - strncpy(ibcs2_uname.machine, machine, 8); - return (copyout((caddr_t)&ibcs2_uname, - (caddr_t)args->buf, - sizeof(struct ibcs2_utsname))); - - case 2: /* ustat */ - printf("IBCS2: utssys(ustat) not implemented yet\n"); - return EINVAL; + caddr_t sg = stackgap_init(); - case 1: /* umask, obsolete */ - default: - printf("IBCS2: 'utssys cmd (%d) not implemented yet'\n", - args->cmd); - return EINVAL; - } + CHECKALTEXIST(p, &sg, SCARG(uap, from)); + CHECKALTCREAT(p, &sg, SCARG(uap, to)); + return rename(p, (struct rename_args *)uap, retval); } int -ibcs2_wait(struct proc *p, void *args, int *retval) -{ - struct trapframe *tf = (struct trapframe *)p->p_md.md_regs; - struct ibcs2_waitpid_args { - int pid; - int *status; - int options; - } *t = args; - struct wait4_args { - int pid; - int *status; - int options; - struct rusage *rusage; - int compat; - } tmp; - - tmp.compat = 1; - tmp.rusage = 0; - if (ibcs2_trace & IBCS2_TRACE_MISC) - printf("IBCS2: 'wait'\n"); - - if ((tf->tf_eflags & (PSL_Z|PSL_PF|PSL_N|PSL_V)) - == (PSL_Z|PSL_PF|PSL_N|PSL_V)) { - tmp.pid = t->pid; - tmp.status = t->status; - tmp.options = 0; - if (t->options & 02) - tmp.options |= WUNTRACED; - if (t->options & 01) - tmp.options |= WNOHANG; - tmp.options = t->options; - } else { - tmp.pid = WAIT_ANY; - tmp.status = (int*)t->pid; - tmp.options = 0; - } - return wait1(p, &tmp, retval); +ibcs2_readlink(p, uap, retval) + struct proc *p; + struct ibcs2_readlink_args *uap; + int *retval; +{ + caddr_t sg = stackgap_init(); + + CHECKALTEXIST(p, &sg, SCARG(uap, path)); + return readlink(p, (struct readlink_args *) uap, retval); } diff --git a/sys/i386/ibcs2/ibcs2_msg.c b/sys/i386/ibcs2/ibcs2_msg.c new file mode 100644 index 0000000..3a13a3f --- /dev/null +++ b/sys/i386/ibcs2/ibcs2_msg.c @@ -0,0 +1,142 @@ +/* + * Copyright (c) 1995 Steven Wallace + * 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. 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. + * + * $Id$ + */ + +/* + * IBCS2 message compatibility module. + * + */ + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/sysproto.h> +#include <sys/kernel.h> + +#include <i386/ibcs2/ibcs2_types.h> +#include <i386/ibcs2/ibcs2_signal.h> +#include <i386/ibcs2/ibcs2_util.h> +#include <i386/ibcs2/ibcs2_poll.h> +#include <i386/ibcs2/ibcs2_proto.h> + + +int +ibcs2_getmsg(p, uap, retval) + struct proc *p; + struct ibcs2_getmsg_args *uap; + int *retval; +{ + return 0; /* fake */ +} + +int +ibcs2_putmsg(p, uap, retval) + struct proc *p; + struct ibcs2_putmsg_args *uap; + int *retval; +{ + return 0; /* fake */ +} + + +int +ibcs2_poll(p, uap, retval) + struct proc *p; + struct ibcs2_poll_args *uap; + int *retval; +{ + int error, i; + fd_set *readfds, *writefds, *exceptfds; + struct timeval *timeout; + struct ibcs2_poll conv; + struct select_args tmp_select; + caddr_t sg = stackgap_init(); + + if (uap->nfds > FD_SETSIZE) + return EINVAL; + readfds = stackgap_alloc(&sg, sizeof(fd_set *)); + writefds = stackgap_alloc(&sg, sizeof(fd_set *)); + exceptfds = stackgap_alloc(&sg, sizeof(fd_set *)); + timeout = stackgap_alloc(&sg, sizeof(struct timeval *)); + + FD_ZERO(readfds); + FD_ZERO(writefds); + FD_ZERO(exceptfds); + if (uap->timeout == -1) + timeout = NULL; + else { + timeout->tv_usec = (uap->timeout % 1000)*1000; + timeout->tv_sec = uap->timeout / 1000; + } + + tmp_select.nd = 0; + tmp_select.in = readfds; + tmp_select.ou = writefds; + tmp_select.ex = exceptfds; + tmp_select.tv = timeout; + + for (i = 0; i < uap->nfds; i++) { + if (error = copyin(uap->fds + i*sizeof(struct ibcs2_poll), + &conv, sizeof(conv))) + return error; + conv.revents = 0; + if (conv.fd < 0 || conv.fd > FD_SETSIZE) + continue; + if (conv.fd >= tmp_select.nd) + tmp_select.nd = conv.fd + 1; + if (conv.events & IBCS2_READPOLL) + FD_SET(conv.fd, readfds); + if (conv.events & IBCS2_WRITEPOLL) + FD_SET(conv.fd, writefds); + FD_SET(conv.fd, exceptfds); + } + if (error = select(p, &tmp_select, retval)) + return error; + if (*retval == 0) + return 0; + *retval = 0; + for (*retval = 0, i = 0; i < uap->nfds; i++) { + copyin(uap->fds + i*sizeof(struct ibcs2_poll), + &conv, sizeof(conv)); + conv.revents = 0; + if (conv.fd < 0 || conv.fd > FD_SETSIZE) + /* should check for open as well */ + conv.revents |= IBCS2_POLLNVAL; + else { + if (FD_ISSET(conv.fd, readfds)) + conv.revents |= IBCS2_POLLIN; + if (FD_ISSET(conv.fd, writefds)) + conv.revents |= IBCS2_POLLOUT; + if (FD_ISSET(conv.fd, exceptfds)) + conv.revents |= IBCS2_POLLERR; + if (conv.revents) + ++*retval; + } + if (error = copyout(&conv, + uap->fds + i*sizeof(struct ibcs2_poll), + sizeof(conv))) + return error; + } + return 0; +} diff --git a/sys/i386/ibcs2/ibcs2_other.c b/sys/i386/ibcs2/ibcs2_other.c new file mode 100644 index 0000000..aaf32b6 --- /dev/null +++ b/sys/i386/ibcs2/ibcs2_other.c @@ -0,0 +1,76 @@ +/* + * Copyright (c) 1995 Steven Wallace + * 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. 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. + * + * $Id$ + */ + +/* + * IBCS2 compatibility module. + */ + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/sysproto.h> +#include <sys/kernel.h> + +#include <i386/ibcs2/ibcs2_types.h> +#include <i386/ibcs2/ibcs2_signal.h> +#include <i386/ibcs2/ibcs2_util.h> +#include <i386/ibcs2/ibcs2_proto.h> + +#define IBCS2_SECURE_GETLUID 1 +#define IBCS2_SECURE_SETLUID 2 + +int +ibcs2_secure(struct proc *p, struct ibcs2_secure_args *uap, int *retval) +{ + switch (uap->cmd) { + + case IBCS2_SECURE_GETLUID: /* get login uid */ + *retval = p->p_ucred->cr_uid; + return 0; + + case IBCS2_SECURE_SETLUID: /* set login uid */ + return EPERM; + + default: + printf("IBCS2: 'secure' cmd=%d not implemented\n", uap->cmd); + } + + return EINVAL; +} + +int +ibcs2_lseek(struct proc *p, register struct ibcs2_lseek_args *uap, int *retval) +{ + struct lseek_args largs; + off_t lret; + int error; + + largs.fd = uap->fd; + largs.offset = uap->offset; + largs.whence = uap->whence; + error = lseek(p, &largs, (int *)&lret); + *(long *)retval = lret; + return (error); +} diff --git a/sys/i386/ibcs2/ibcs2_poll.h b/sys/i386/ibcs2/ibcs2_poll.h new file mode 100644 index 0000000..d04fce1 --- /dev/null +++ b/sys/i386/ibcs2/ibcs2_poll.h @@ -0,0 +1,51 @@ +/* + * Copyright (c) 1995 Steven Wallace + * 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. 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. + * + * $Id$ + */ + + +#ifndef _IBCS2_POLL_H +#define _IBCS2_POLL_H 1 + +/* iBCS2 poll commands */ +#define IBCS2_POLLIN 0x0001 +#define IBCS2_POLLPRI 0x0002 +#define IBCS2_POLLOUT 0x0004 +#define IBCS2_POLLERR 0x0008 +#define IBCS2_POLLHUP 0x0010 +#define IBCS2_POLLNVAL 0x0020 +#define IBCS2_POLLRDNORM 0x0040 +#define IBCS2_POLLWRNORM 0x0004 +#define IBCS2_POLLRDBAND 0x0080 +#define IBCS2_POLLWRBAND 0x0100 +#define IBCS2_READPOLL (IBCS2_POLLIN|IBCS2_POLLRDNORM|IBCS2_POLLRDBAND) +#define IBCS2_WRITEPOLL (IBCS2_POLLOUT|IBCS2_POLLWRNORM|IBCS2_POLLWRBAND) + +struct ibcs2_poll { + int fd; + short events; + short revents; +}; + +#endif /* _IBCS2_POLL_H */ diff --git a/sys/i386/ibcs2/ibcs2_proto.h b/sys/i386/ibcs2/ibcs2_proto.h new file mode 100644 index 0000000..7d77c20 --- /dev/null +++ b/sys/i386/ibcs2/ibcs2_proto.h @@ -0,0 +1,359 @@ +/* + * System call prototypes. + * + * DO NOT EDIT-- this file is automatically generated. + * created from Id: syscalls.master,v 1.1 1995/10/06 15:12:52 swallace Exp + */ + +#ifndef _IBCS2_SYSPROTO_H_ +#define _IBCS2_SYSPROTO_H_ + +#include <sys/types.h> +#include <sys/param.h> +#include <sys/mount.h> + +struct ibcs2_read_args { + int fd; + char * buf; + u_int nbytes; +}; +struct ibcs2_open_args { + char * path; + int flags; + int mode; +}; +struct ibcs2_wait_args { + int a1; + int a2; + int a3; +}; +struct ibcs2_creat_args { + char * path; + int mode; +}; +struct ibcs2_unlink_args { + char * path; +}; +struct ibcs2_execv_args { + char * path; + char ** argp; +}; +struct ibcs2_chdir_args { + char * path; +}; +struct ibcs2_time_args { + ibcs2_time_t * tp; +}; +struct ibcs2_mknod_args { + char * path; + int mode; + int dev; +}; +struct ibcs2_chmod_args { + char * path; + int mode; +}; +struct ibcs2_chown_args { + char * path; + int uid; + int gid; +}; +struct ibcs2_stat_args { + char * path; + struct ibcs2_stat * st; +}; +struct ibcs2_lseek_args { + int fd; + long offset; + int whence; +}; +struct ibcs2_mount_args { + char * special; + char * dir; + int flags; + int fstype; + char * data; + int len; +}; +struct ibcs2_umount_args { + char * name; +}; +struct ibcs2_setuid_args { + int uid; +}; +struct ibcs2_stime_args { + long * timep; +}; +struct ibcs2_alarm_args { + unsigned sec; +}; +struct ibcs2_fstat_args { + int fd; + struct ibcs2_stat * st; +}; +struct ibcs2_pause_args { + int dummy; +}; +struct ibcs2_utime_args { + char * path; + struct ibcs2_utimbuf * buf; +}; +struct ibcs2_stty_args { + int fd; + struct sgttyb * buf; +}; +struct ibcs2_gtty_args { + int fd; + struct sgttyb * buf; +}; +struct ibcs2_access_args { + char * path; + int flags; +}; +struct ibcs2_nice_args { + int incr; +}; +struct ibcs2_statfs_args { + char * path; + struct ibcs2_statfs * buf; + int len; + int fstype; +}; +struct ibcs2_kill_args { + int pid; + int signo; +}; +struct ibcs2_fstatfs_args { + int fd; + struct ibcs2_statfs * buf; + int len; + int fstype; +}; +struct ibcs2_pgrpsys_args { + int type; + caddr_t dummy; + int pid; + int pgid; +}; +struct ibcs2_xenix_args { + int a1; + int a2; + int a3; + int a4; + int a5; +}; +struct ibcs2_times_args { + struct tms * tp; +}; +struct ibcs2_plock_args { + int cmd; +}; +struct ibcs2_setgid_args { + int gid; +}; +struct ibcs2_sigsys_args { + int sig; + ibcs2_sig_t fp; +}; +#ifdef SYSVMSG +struct ibcs2_msgsys_args { + int which; + int a2; + int a3; + int a4; + int a5; + int a6; +}; +#else +#endif +struct ibcs2_sysi86_args { + int cmd; + int * arg; +}; +#ifdef SYSVSHM +struct ibcs2_shmsys_args { + int which; + int a2; + int a3; + int a4; +}; +#else +#endif +#ifdef SYSVSEM +struct ibcs2_semsys_args { + int which; + int a2; + int a3; + int a4; + int a5; +}; +#else +#endif +struct ibcs2_ioctl_args { + int fd; + int cmd; + caddr_t data; +}; +struct ibcs2_uadmin_args { + int cmd; + int func; + caddr_t data; +}; +struct ibcs2_utssys_args { + int a1; + int a2; + int flag; +}; +struct ibcs2_execve_args { + char * path; + char ** argp; + char ** envp; +}; +struct ibcs2_fcntl_args { + int fd; + int cmd; + char * arg; +}; +struct ibcs2_ulimit_args { + int cmd; + int newlimit; +}; +struct ibcs2_rmdir_args { + char * path; +}; +struct ibcs2_mkdir_args { + char * path; + int mode; +}; +struct ibcs2_getdents_args { + int fd; + char * buf; + int nbytes; +}; +struct ibcs2_sysfs_args { + int cmd; + caddr_t d1; + char * buf; +}; +struct ibcs2_getmsg_args { + int fd; + struct ibcs2_stropts * ctl; + struct ibcs2_stropts * dat; + int * flags; +}; +struct ibcs2_putmsg_args { + int fd; + struct ibcs2_stropts * ctl; + struct ibcs2_stropts * dat; + int flags; +}; +struct ibcs2_poll_args { + struct ibcs2_poll * fds; + long nfds; + int timeout; +}; +struct ibcs2_secure_args { + int cmd; + int a1; + int a2; + int a3; + int a4; + int a5; +}; +struct ibcs2_symlink_args { + char * path; + char * link; +}; +struct ibcs2_lstat_args { + char * path; + struct ibcs2_stat * st; +}; +struct ibcs2_readlink_args { + char * path; + char * buf; + int count; +}; +struct ibcs2_isc_args { + int dummy; +}; +int ibcs2_read __P((struct proc *, struct ibcs2_read_args *, int [])); +int ibcs2_open __P((struct proc *, struct ibcs2_open_args *, int [])); +int ibcs2_wait __P((struct proc *, struct ibcs2_wait_args *, int [])); +int ibcs2_creat __P((struct proc *, struct ibcs2_creat_args *, int [])); +int ibcs2_unlink __P((struct proc *, struct ibcs2_unlink_args *, int [])); +int ibcs2_execv __P((struct proc *, struct ibcs2_execv_args *, int [])); +int ibcs2_chdir __P((struct proc *, struct ibcs2_chdir_args *, int [])); +int ibcs2_time __P((struct proc *, struct ibcs2_time_args *, int [])); +int ibcs2_mknod __P((struct proc *, struct ibcs2_mknod_args *, int [])); +int ibcs2_chmod __P((struct proc *, struct ibcs2_chmod_args *, int [])); +int ibcs2_chown __P((struct proc *, struct ibcs2_chown_args *, int [])); +int ibcs2_stat __P((struct proc *, struct ibcs2_stat_args *, int [])); +int ibcs2_lseek __P((struct proc *, struct ibcs2_lseek_args *, int [])); +int ibcs2_mount __P((struct proc *, struct ibcs2_mount_args *, int [])); +int ibcs2_umount __P((struct proc *, struct ibcs2_umount_args *, int [])); +int ibcs2_setuid __P((struct proc *, struct ibcs2_setuid_args *, int [])); +int ibcs2_stime __P((struct proc *, struct ibcs2_stime_args *, int [])); +int ibcs2_alarm __P((struct proc *, struct ibcs2_alarm_args *, int [])); +int ibcs2_fstat __P((struct proc *, struct ibcs2_fstat_args *, int [])); +int ibcs2_pause __P((struct proc *, struct ibcs2_pause_args *, int [])); +int ibcs2_utime __P((struct proc *, struct ibcs2_utime_args *, int [])); +int ibcs2_stty __P((struct proc *, struct ibcs2_stty_args *, int [])); +int ibcs2_gtty __P((struct proc *, struct ibcs2_gtty_args *, int [])); +int ibcs2_access __P((struct proc *, struct ibcs2_access_args *, int [])); +int ibcs2_nice __P((struct proc *, struct ibcs2_nice_args *, int [])); +int ibcs2_statfs __P((struct proc *, struct ibcs2_statfs_args *, int [])); +int ibcs2_kill __P((struct proc *, struct ibcs2_kill_args *, int [])); +int ibcs2_fstatfs __P((struct proc *, struct ibcs2_fstatfs_args *, int [])); +int ibcs2_pgrpsys __P((struct proc *, struct ibcs2_pgrpsys_args *, int [])); +int ibcs2_xenix __P((struct proc *, struct ibcs2_xenix_args *, int [])); +int ibcs2_times __P((struct proc *, struct ibcs2_times_args *, int [])); +int ibcs2_plock __P((struct proc *, struct ibcs2_plock_args *, int [])); +int ibcs2_setgid __P((struct proc *, struct ibcs2_setgid_args *, int [])); +int ibcs2_sigsys __P((struct proc *, struct ibcs2_sigsys_args *, int [])); +#ifdef SYSVMSG +int ibcs2_msgsys __P((struct proc *, struct ibcs2_msgsys_args *, int [])); +#else +#endif +int ibcs2_sysi86 __P((struct proc *, struct ibcs2_sysi86_args *, int [])); +#ifdef SYSVSHM +int ibcs2_shmsys __P((struct proc *, struct ibcs2_shmsys_args *, int [])); +#else +#endif +#ifdef SYSVSEM +int ibcs2_semsys __P((struct proc *, struct ibcs2_semsys_args *, int [])); +#else +#endif +int ibcs2_ioctl __P((struct proc *, struct ibcs2_ioctl_args *, int [])); +int ibcs2_uadmin __P((struct proc *, struct ibcs2_uadmin_args *, int [])); +int ibcs2_utssys __P((struct proc *, struct ibcs2_utssys_args *, int [])); +int ibcs2_execve __P((struct proc *, struct ibcs2_execve_args *, int [])); +int ibcs2_fcntl __P((struct proc *, struct ibcs2_fcntl_args *, int [])); +int ibcs2_ulimit __P((struct proc *, struct ibcs2_ulimit_args *, int [])); +int ibcs2_rmdir __P((struct proc *, struct ibcs2_rmdir_args *, int [])); +int ibcs2_mkdir __P((struct proc *, struct ibcs2_mkdir_args *, int [])); +int ibcs2_getdents __P((struct proc *, struct ibcs2_getdents_args *, int [])); +int ibcs2_sysfs __P((struct proc *, struct ibcs2_sysfs_args *, int [])); +int ibcs2_getmsg __P((struct proc *, struct ibcs2_getmsg_args *, int [])); +int ibcs2_putmsg __P((struct proc *, struct ibcs2_putmsg_args *, int [])); +int ibcs2_poll __P((struct proc *, struct ibcs2_poll_args *, int [])); +int ibcs2_secure __P((struct proc *, struct ibcs2_secure_args *, int [])); +int ibcs2_symlink __P((struct proc *, struct ibcs2_symlink_args *, int [])); +int ibcs2_lstat __P((struct proc *, struct ibcs2_lstat_args *, int [])); +int ibcs2_readlink __P((struct proc *, struct ibcs2_readlink_args *, int [])); +int ibcs2_isc __P((struct proc *, struct ibcs2_isc_args *, int [])); + +#ifdef COMPAT_43 + +#ifdef SYSVMSG +#else +#endif +#ifdef SYSVSHM +#else +#endif +#ifdef SYSVSEM +#else +#endif + +#endif /* COMPAT_43 */ + +#endif /* !_IBCS2_SYSPROTO_H_ */ diff --git a/sys/i386/ibcs2/ibcs2_signal.c b/sys/i386/ibcs2/ibcs2_signal.c index 3171c2c..2170b9c 100644 --- a/sys/i386/ibcs2/ibcs2_signal.c +++ b/sys/i386/ibcs2/ibcs2_signal.c @@ -1,462 +1,475 @@ -/*- - * Copyright (c) 1994 Sean Eric Fagan - * Copyright (c) 1994 Søren Schmidt - * All rights reserved. - * - * Copyright (c) 1982, 1986, 1989, 1991 Regents of the University of California. +/* $NetBSD: ibcs2_signal.c,v 1.6 1995/09/19 22:19:07 thorpej Exp $ */ + +/* + * Copyright (c) 1995 Scott Bartram * 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 - * in this position and unchanged. + * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``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 REGENTS OR CONTRIBUTORS 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. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission * - * $Id: ibcs2_signal.c,v 1.1 1994/10/14 08:53:07 sos Exp $ + * 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. */ -#include <i386/ibcs2/ibcs2.h> -#include <sys/ioctl.h> -#include <sys/ioctl_compat.h> #include <sys/param.h> #include <sys/systm.h> -#include <sys/fcntl.h> -#include <sys/file.h> -#include <sys/filedesc.h> #include <sys/namei.h> -#include <sys/mount.h> #include <sys/proc.h> -#include <sys/resource.h> -#include <sys/resourcevar.h> +#include <sys/filedesc.h> +#include <sys/ioctl.h> +#include <sys/mount.h> +#include <sys/kernel.h> #include <sys/signal.h> #include <sys/signalvar.h> -#include <sys/stat.h> -#include <sys/tty.h> -#include <sys/termios.h> -#include <sys/time.h> -#include <sys/times.h> -#include <sys/vnode.h> -#include <vm/vm.h> -#include <vm/vm_param.h> -#include <vm/vm_map.h> -#include <vm/vm_kern.h> - - -#define DONTMASK (sigmask(SIGKILL)|sigmask(SIGSTOP)|sigmask(SIGCHLD)) - -int bsd_to_ibcs2_signal[NSIG] = { - 0, IBCS2_SIGHUP, IBCS2_SIGINT, IBCS2_SIGQUIT, - IBCS2_SIGILL, IBCS2_SIGTRAP, IBCS2_SIGABRT, IBCS2_SIGEMT, - IBCS2_SIGFPE, IBCS2_SIGKILL, IBCS2_SIGBUS, IBCS2_SIGSEGV, - IBCS2_SIGSYS, IBCS2_SIGPIPE, IBCS2_SIGALRM, IBCS2_SIGTERM, - IBCS2_SIGURG, IBCS2_SIGSTOP, IBCS2_SIGTSTP, IBCS2_SIGCONT, - IBCS2_SIGCHLD, IBCS2_SIGTTIN, IBCS2_SIGTTOU, IBCS2_SIGIO, - IBCS2_SIGGXCPU, IBCS2_SIGGXFSZ, IBCS2_SIGVTALRM, IBCS2_SIGPROF, - IBCS2_SIGWINCH, 0, IBCS2_SIGUSR1, IBCS2_SIGUSR2 +#include <sys/malloc.h> +#include <sys/sysproto.h> + +#include <i386/ibcs2/ibcs2_types.h> +#include <i386/ibcs2/ibcs2_signal.h> +#include <i386/ibcs2/ibcs2_proto.h> +#include <i386/ibcs2/ibcs2_xenix.h> +#include <i386/ibcs2/ibcs2_util.h> + +#define sigemptyset(s) bzero((s), sizeof(*(s))) +#define sigismember(s, n) (*(s) & sigmask(n)) +#define sigaddset(s, n) (*(s) |= sigmask(n)) + +#define ibcs2_sigmask(n) (1 << ((n) - 1)) +#define ibcs2_sigemptyset(s) bzero((s), sizeof(*(s))) +#define ibcs2_sigismember(s, n) (*(s) & ibcs2_sigmask(n)) +#define ibcs2_sigaddset(s, n) (*(s) |= ibcs2_sigmask(n)) + +static void ibcs2_to_bsd_sigset __P((const ibcs2_sigset_t *, sigset_t *)); +static void bsd_to_ibcs2_sigset __P((const sigset_t *, ibcs2_sigset_t *)); +static void ibcs2_to_bsd_sigaction __P((struct ibcs2_sigaction *, + struct sigaction *)); +static void bsd_to_ibcs2_sigaction __P((struct sigaction *, + struct ibcs2_sigaction *)); + +int bsd_to_ibcs2_sig[] = { + 0, /* 0 */ + IBCS2_SIGHUP, /* 1 */ + IBCS2_SIGINT, /* 2 */ + IBCS2_SIGQUIT, /* 3 */ + IBCS2_SIGILL, /* 4 */ + IBCS2_SIGTRAP, /* 5 */ + IBCS2_SIGABRT, /* 6 */ + IBCS2_SIGEMT, /* 7 */ + IBCS2_SIGFPE, /* 8 */ + IBCS2_SIGKILL, /* 9 */ + IBCS2_SIGBUS, /* 10 */ + IBCS2_SIGSEGV, /* 11 */ + IBCS2_SIGSYS, /* 12 */ + IBCS2_SIGPIPE, /* 13 */ + IBCS2_SIGALRM, /* 14 */ + IBCS2_SIGTERM, /* 15 */ + 0, /* 16 - SIGURG */ + IBCS2_SIGSTOP, /* 17 */ + IBCS2_SIGTSTP, /* 18 */ + IBCS2_SIGCONT, /* 19 */ + IBCS2_SIGCLD, /* 20 */ + IBCS2_SIGTTIN, /* 21 */ + IBCS2_SIGTTOU, /* 22 */ + IBCS2_SIGPOLL, /* 23 */ + 0, /* 24 - SIGXCPU */ + 0, /* 25 - SIGXFSZ */ + IBCS2_SIGVTALRM, /* 26 */ + IBCS2_SIGPROF, /* 27 */ + IBCS2_SIGWINCH, /* 28 */ + 0, /* 29 */ + IBCS2_SIGUSR1, /* 30 */ + IBCS2_SIGUSR2, /* 31 */ }; -int ibcs2_to_bsd_signal[IBCS2_NSIG] = { - 0, SIGHUP, SIGINT, SIGQUIT, SIGILL, SIGTRAP, SIGABRT, SIGEMT, - SIGFPE, SIGKILL, SIGBUS, SIGSEGV, SIGSYS, SIGPIPE, SIGALRM, SIGTERM, - SIGUSR1, SIGUSR2, SIGCHLD, 0, SIGWINCH, SIGURG, SIGIO, SIGSTOP, - SIGTSTP, SIGCONT, SIGTTIN, SIGTTOU, SIGVTALRM, SIGPROF, SIGXCPU, SIGXFSZ +static int ibcs2_to_bsd_sig[] = { + 0, /* 0 */ + SIGHUP, /* 1 */ + SIGINT, /* 2 */ + SIGQUIT, /* 3 */ + SIGILL, /* 4 */ + SIGTRAP, /* 5 */ + SIGABRT, /* 6 */ + SIGEMT, /* 7 */ + SIGFPE, /* 8 */ + SIGKILL, /* 9 */ + SIGBUS, /* 10 */ + SIGSEGV, /* 11 */ + SIGSYS, /* 12 */ + SIGPIPE, /* 13 */ + SIGALRM, /* 14 */ + SIGTERM, /* 15 */ + SIGUSR1, /* 16 */ + SIGUSR2, /* 17 */ + SIGCHLD, /* 18 */ + 0, /* 19 - SIGPWR */ + SIGWINCH, /* 20 */ + 0, /* 21 */ + SIGIO, /* 22 */ + SIGSTOP, /* 23 */ + SIGTSTP, /* 24 */ + SIGCONT, /* 25 */ + SIGTTIN, /* 26 */ + SIGTTOU, /* 27 */ + SIGVTALRM, /* 28 */ + SIGPROF, /* 29 */ + 0, /* 30 */ + 0, /* 31 */ }; -static char ibcs2_sig_name[IBCS2_NSIG][10] = { - "UNKNOWN", "SIGHUP", "SIGINT", "SIGQUIT", "SIGILL", "SIGTRAP", - "SIGABRT", "SIGEMT", "SIGFPE", "SIGKILL", "SIGBUS", "SIGSEGV", - "SIGSYS", "SIGPIPE", "SIGALRM", "SIGTERM", "SIGUSR1", "SIGUSR2", - "SIGCHLD", "SIGPWR", "SIGWINCH", "SIGURG", "SIGIO", "SIGSTOP", - "SIGTSTP", "SIGCONT", "SIGTTIN", "SIGTTOU", "SIGVTALRM", - "SIGPROF", "SIGXCPU", "SIGXFSZ" -}; - -/*#define LEGAL_SIG(x) \ - (((x & IBCS2_SIGMASK) < IBCS2_NSIG) ? (x & IBCS2_SIGMASK) : (0))*/ -int -LEGAL_SIG(int sig) +void +ibcs2_to_bsd_sigset(iss, bss) + const ibcs2_sigset_t *iss; + sigset_t *bss; { - if ((sig & IBCS2_SIGMASK) > IBCS2_NSIG) { - printf("IBCS2: illegal ibcs2 signal %d(%08x)\n", - sig & IBCS2_SIGMASK, sig); - return 0; + int i, newsig; + + sigemptyset(bss); + for (i = 1; i < IBCS2_NSIG; i++) { + if (ibcs2_sigismember(iss, i)) { + newsig = ibcs2_to_bsd_sig[i]; + if (newsig) + sigaddset(bss, newsig); + } } - else - return (sig & IBCS2_SIGMASK); } -char * -ibcs2_sig_to_str(int sig) +static void +bsd_to_ibcs2_sigset(bss, iss) + const sigset_t *bss; + ibcs2_sigset_t *iss; { - if (sig > IBCS2_NSIG) { - printf("IBCS2: ibcs2 signal out of range (%d)\n", sig); - return ibcs2_sig_name[0]; - } - else - return ibcs2_sig_name[sig]; -} - -static sig_t -ibcs2_to_bsd_sigfunc(ibcs2_sig_t func) { - switch ((int)func) { - case IBCS2_SIG_DFL: - return SIG_DFL; - case IBCS2_SIG_IGN: - return SIG_IGN; - case IBCS2_SIG_HOLD: - return SIG_HOLD; - default: - return func; - } -} - -static ibcs2_sig_t -bsd_to_ibcs2_sigfunc(sig_t func) { - switch ((int)func) { - case SIG_DFL: - return IBCS2_SIG_DFL; - case SIG_IGN: - return IBCS2_SIG_IGN; - case SIG_CATCH: - printf("IBCS2: Oops - SIG_CATCH does not translate :-(\n"); - return IBCS2_SIG_DFL; - case SIG_HOLD: - return IBCS2_SIG_HOLD; - default: - return func; + int i, newsig; + + ibcs2_sigemptyset(iss); + for (i = 1; i < NSIG; i++) { + if (sigismember(bss, i)) { + newsig = bsd_to_ibcs2_sig[i]; + if (newsig) + ibcs2_sigaddset(iss, newsig); + } } } -static sigset_t -ibcs2_to_bsd_sigmask(ibcs2_sigset_t mask) { - int i; - sigset_t new = 0; +static void +ibcs2_to_bsd_sigaction(isa, bsa) + struct ibcs2_sigaction *isa; + struct sigaction *bsa; +{ - for (i = 1; i < NSIG; i++) - if (mask & (1 << i-1)) - new |= (1 << (ibcs2_to_bsd_signal[i]-1)); - return new; + bsa->sa_handler = isa->sa_handler; + ibcs2_to_bsd_sigset(&isa->sa_mask, &bsa->sa_mask); + bsa->sa_flags = 0; + if ((isa->sa_flags & IBCS2_SA_NOCLDSTOP) != 0) + bsa->sa_flags |= SA_NOCLDSTOP; } -static ibcs2_sigset_t -bsd_to_ibcs2_sigmask(sigset_t mask) { - int i; - sigset_t new = 0; +static void +bsd_to_ibcs2_sigaction(bsa, isa) + struct sigaction *bsa; + struct ibcs2_sigaction *isa; +{ - for (i = 1; i < IBCS2_NSIG; i++) - if (mask & (1 << i-1)) - new |= (1 << (bsd_to_ibcs2_signal[i]-1)); - return new; + isa->sa_handler = bsa->sa_handler; + bsd_to_ibcs2_sigset(&bsa->sa_mask, &isa->sa_mask); + isa->sa_flags = 0; + if ((bsa->sa_flags & SA_NOCLDSTOP) != 0) + isa->sa_flags |= SA_NOCLDSTOP; } -struct ibcs2_signal_args { - int signo; - ibcs2_sig_t func; -}; - -static int -ibcs2_sigset(struct proc *p, struct ibcs2_signal_args *args, int *retval) +int +ibcs2_sigaction(p, uap, retval) + register struct proc *p; + struct ibcs2_sigaction_args *uap; + int *retval; { - struct sigaction tmp; - int sig_bsd = ibcs2_to_bsd_signal[LEGAL_SIG(args->signo)]; - - *retval = (int)bsd_to_ibcs2_sigfunc(p->p_sigacts->ps_sigact[sig_bsd]); - if (args->func == IBCS2_SIG_HOLD) { - (void) splhigh(); - p->p_sigmask |= (sigmask(sig_bsd) &~ DONTMASK); - (void) spl0(); - } - else { - tmp.sa_mask = sigmask(sig_bsd); - tmp.sa_handler = ibcs2_to_bsd_sigfunc(args->func); - tmp.sa_flags = 0; - setsigvec(p, sig_bsd, &tmp); - } - return 0; -} + struct ibcs2_sigaction *nisa, *oisa, tmpisa; + struct sigaction *nbsa, *obsa, tmpbsa; + struct sigaction_args sa; + caddr_t sg; + int error; -static int -ibcs2_sighold(struct proc *p, struct ibcs2_signal_args *args, int *retval) -{ - int sig_bsd = ibcs2_to_bsd_signal[LEGAL_SIG(args->signo)]; + sg = stackgap_init(); + nisa = SCARG(uap, act); + oisa = SCARG(uap, oact); - (void) splhigh(); - *retval = p->p_sigmask; - p->p_sigmask |= (sigmask(sig_bsd) & ~DONTMASK); - (void) spl0(); - return 0; -} + if (oisa != NULL) + obsa = stackgap_alloc(&sg, sizeof(struct sigaction)); + else + obsa = NULL; -static int -ibcs2_sigrelse(struct proc *p, struct ibcs2_signal_args *args, int *retval) -{ - int sig_bsd = ibcs2_to_bsd_signal[LEGAL_SIG(args->signo)]; + if (nisa != NULL) { + nbsa = stackgap_alloc(&sg, sizeof(struct sigaction)); + if ((error = copyin(nisa, &tmpisa, sizeof(tmpisa))) != 0) + return error; + ibcs2_to_bsd_sigaction(&tmpisa, &tmpbsa); + if ((error = copyout(&tmpbsa, nbsa, sizeof(tmpbsa))) != 0) + return error; + } else + nbsa = NULL; - (void) splhigh(); - *retval = p->p_sigmask; - p->p_sigmask &= ~sigmask(sig_bsd); - (void) spl0(); - return 0; -} + SCARG(&sa, signum) = ibcs2_to_bsd_sig[SCARG(uap, sig)]; + SCARG(&sa, nsa) = nbsa; + SCARG(&sa, osa) = obsa; -static int -ibcs2_sigignore(struct proc *p, struct ibcs2_signal_args *args, int *retval) -{ - struct sigaction tmp; - int sig_bsd = ibcs2_to_bsd_signal[LEGAL_SIG(args->signo)]; - - tmp.sa_mask = sigmask(sig_bsd); - tmp.sa_handler = SIG_IGN; - tmp.sa_flags = 0; - *retval = (int)bsd_to_ibcs2_sigfunc(p->p_sigacts->ps_sigact[sig_bsd]); - setsigvec(p, sig_bsd, &tmp); - return 0; -} + if ((error = sigaction(p, &sa, retval)) != 0) + return error; -static int -ibcs2_sigpause(struct proc *p, struct ibcs2_signal_args *args, int *retval) -{ - struct sigacts *ps = p->p_sigacts; - int sig_bsd = ibcs2_to_bsd_signal[LEGAL_SIG(args->signo)]; - - ps->ps_oldmask = p->p_sigmask; - ps->ps_flags |= SAS_OLDMASK; - p->p_sigmask = sigmask(sig_bsd) &~ DONTMASK; - (void) tsleep((caddr_t) ps, PPAUSE|PCATCH, "i-pause", 0); - *retval = -1; - return EINTR; -} + if (oisa != NULL) { + if ((error = copyin(obsa, &tmpbsa, sizeof(tmpbsa))) != 0) + return error; + bsd_to_ibcs2_sigaction(&tmpbsa, &tmpisa); + if ((error = copyout(&tmpisa, oisa, sizeof(tmpisa))) != 0) + return error; + } -static int -ibcs2_signal(struct proc *p, struct ibcs2_signal_args *args, int *retval) -{ - struct sigaction tmp; - int sig_bsd = ibcs2_to_bsd_signal[LEGAL_SIG(args->signo)]; - - tmp.sa_mask = sigmask(sig_bsd); - tmp.sa_handler = ibcs2_to_bsd_sigfunc(args->func); - tmp.sa_flags = 0; - *retval = (int)bsd_to_ibcs2_sigfunc(p->p_sigacts->ps_sigact[sig_bsd]); - setsigvec(p, sig_bsd, &tmp); - return 0; + return 0; } int -ibcs2_sigsys(struct proc *p, struct ibcs2_signal_args *args, int *retval) +ibcs2_sigsys(p, uap, retval) + register struct proc *p; + struct ibcs2_sigsys_args *uap; + int *retval; { - if (ibcs2_trace & IBCS2_TRACE_SIGNAL) - printf("IBCS2: 'sigsys' signo=%d(%s) ", - args->signo & IBCS2_SIGMASK, - ibcs2_sig_to_str(args->signo & IBCS2_SIGMASK)); - - switch (args->signo & ~IBCS2_SIGMASK ) { - case 0x0000: - if (ibcs2_trace & IBCS2_TRACE_SIGNAL) - printf("signal() func=%x\n", args->func); - return ibcs2_signal(p, args, retval); - case 0x0100: - if (ibcs2_trace & IBCS2_TRACE_SIGNAL) - printf("sigset() func=%x\n", args->func); - return ibcs2_sigset(p, args, retval); - case 0x0200: - if (ibcs2_trace & IBCS2_TRACE_SIGNAL) - printf("sighold()\n"); - return ibcs2_sighold(p, args, retval); - case 0x0400: - if (ibcs2_trace & IBCS2_TRACE_SIGNAL) - printf("sigrelse()\n"); - return ibcs2_sigrelse(p, args, retval); - case 0x0800: - if (ibcs2_trace & IBCS2_TRACE_SIGNAL) - printf("sigignore()\n"); - return ibcs2_sigignore(p, args, retval); - case 0x1000: - if (ibcs2_trace & IBCS2_TRACE_SIGNAL) - printf("sigpause()\n"); - return ibcs2_sigpause(p, args, retval); - default: - printf("IBCS2: unknown signal action\n"); break; - } - *retval = -1; - return EINVAL; -} - -struct ibcs2_sigaction_args { - int signo; - struct sigaction *osa, *nsa; -}; + int signum = ibcs2_to_bsd_sig[IBCS2_SIGNO(SCARG(uap, sig))]; + int error; + caddr_t sg = stackgap_init(); -int -ibcs2_sigaction(struct proc *p, struct ibcs2_sigaction_args *args, int *retval) -{ - struct sigaction vec; - register struct sigaction *sa; - register struct sigacts *ps = p->p_sigacts; - register int sig; - int bit, error; - - if (ibcs2_trace & IBCS2_TRACE_SIGNAL) - printf("IBCS2: 'sigaction' signo=%d(%s)\n", - args->signo, ibcs2_sig_to_str(args->signo)); - sig = ibcs2_to_bsd_signal[LEGAL_SIG(args->signo)]; - if (sig <= 0 || sig >= NSIG || sig == SIGKILL || sig == SIGSTOP) { - *retval = -1; + if (signum <= 0 || signum >= IBCS2_NSIG) { + if (IBCS2_SIGCALL(SCARG(uap, sig)) == IBCS2_SIGNAL_MASK || + IBCS2_SIGCALL(SCARG(uap, sig)) == IBCS2_SIGSET_MASK) + *retval = (int)IBCS2_SIG_ERR; return EINVAL; } - sa = &vec; - if (args->osa) { - sa->sa_handler = ps->ps_sigact[sig]; - sa->sa_mask = ps->ps_catchmask[sig]; - bit = sigmask(sig); - sa->sa_flags = 0; - if (p->p_flag & SA_NOCLDSTOP) - sa->sa_flags = IBCS2_SA_NOCLDSTOP; - if (error = copyout((caddr_t)sa, (caddr_t)args->osa, - sizeof(vec))) { - *retval = -1; - return error; - } - } - if (args->nsa) { - if (error = copyin((caddr_t)args->nsa, (caddr_t)sa, - sizeof(vec))) { - *retval = -1; - return error; - } + + switch (IBCS2_SIGCALL(SCARG(uap, sig))) { + /* + * sigset is identical to signal() except that SIG_HOLD is allowed as + * an action. + */ + case IBCS2_SIGSET_MASK: /* - * iBCS2 only defines one SA_ flag right now + * sigset is identical to signal() except + * that SIG_HOLD is allowed as + * an action. */ - if (vec.sa_flags & IBCS2_SA_NOCLDSTOP) - vec.sa_flags = SA_NOCLDSTOP; - setsigvec(p, sig, sa); + if (SCARG(uap, fp) == IBCS2_SIG_HOLD) { + struct sigprocmask_args sa; + + SCARG(&sa, how) = SIG_BLOCK; + SCARG(&sa, mask) = sigmask(signum); + return sigprocmask(p, &sa, retval); + } + /* FALLTHROUGH */ + + case IBCS2_SIGNAL_MASK: + { + struct sigaction_args sa_args; + struct sigaction *nbsa, *obsa, sa; + + nbsa = stackgap_alloc(&sg, sizeof(struct sigaction)); + obsa = stackgap_alloc(&sg, sizeof(struct sigaction)); + SCARG(&sa_args, signum) = signum; + SCARG(&sa_args, nsa) = nbsa; + SCARG(&sa_args, osa) = obsa; + + sa.sa_handler = SCARG(uap, fp); + sigemptyset(&sa.sa_mask); + sa.sa_flags = 0; +#if 0 + if (signum != SIGALRM) + sa.sa_flags = SA_RESTART; +#endif + if ((error = copyout(&sa, nbsa, sizeof(sa))) != 0) + return error; + if ((error = sigaction(p, &sa_args, retval)) != 0) { + DPRINTF(("signal: sigaction failed: %d\n", + error)); + *retval = (int)IBCS2_SIG_ERR; + return error; + } + if ((error = copyin(obsa, &sa, sizeof(sa))) != 0) + return error; + *retval = (int)sa.sa_handler; + return 0; + } + + case IBCS2_SIGHOLD_MASK: + { + struct sigprocmask_args sa; + + SCARG(&sa, how) = SIG_BLOCK; + SCARG(&sa, mask) = sigmask(signum); + return sigprocmask(p, &sa, retval); + } + + case IBCS2_SIGRELSE_MASK: + { + struct sigprocmask_args sa; + + SCARG(&sa, how) = SIG_UNBLOCK; + SCARG(&sa, mask) = sigmask(signum); + return sigprocmask(p, &sa, retval); + } + + case IBCS2_SIGIGNORE_MASK: + { + struct sigaction_args sa_args; + struct sigaction *bsa, sa; + + bsa = stackgap_alloc(&sg, sizeof(struct sigaction)); + SCARG(&sa_args, signum) = signum; + SCARG(&sa_args, nsa) = bsa; + SCARG(&sa_args, osa) = NULL; + + sa.sa_handler = SIG_IGN; + sigemptyset(&sa.sa_mask); + sa.sa_flags = 0; + if ((error = copyout(&sa, bsa, sizeof(sa))) != 0) + return error; + if ((error = sigaction(p, &sa_args, retval)) != 0) { + DPRINTF(("sigignore: sigaction failed\n")); + return error; + } + return 0; + } + + case IBCS2_SIGPAUSE_MASK: + { + struct sigsuspend_args sa; + + SCARG(&sa, mask) = p->p_sigmask &~ sigmask(signum); + return sigsuspend(p, &sa, retval); + } + + default: + return ENOSYS; } - *retval = 0; - return 0; } -struct ibcs2_sigprocmask_args { - int how; - unsigned long *mask; - unsigned long *omask; -}; - int -ibcs2_sigprocmask(struct proc *p, struct ibcs2_sigprocmask_args *args, int *retval) +ibcs2_sigprocmask(p, uap, retval) + register struct proc *p; + struct ibcs2_sigprocmask_args *uap; + int *retval; { - int error; - sigset_t umask; - sigset_t omask = bsd_to_ibcs2_sigmask(p->p_sigmask); - - if (ibcs2_trace & IBCS2_TRACE_SIGNAL) - printf("IBCS2: 'sigprocmask' how=%d\n", args->how); - if (error = copyin(args->mask, &umask, sizeof(args->mask))) { - *retval = -1; - return error; + ibcs2_sigset_t iss; + sigset_t bss; + int error = 0; + + if (SCARG(uap, oset) != NULL) { + /* Fix the return value first if needed */ + bsd_to_ibcs2_sigset(&p->p_sigmask, &iss); + if ((error = copyout(&iss, SCARG(uap, oset), sizeof(iss))) != 0) + return error; } - umask = ibcs2_to_bsd_sigmask(umask); - if (args->omask) - if (error = copyout(&omask, args->omask, sizeof(args->omask))) { - *retval = -1; - return error; - } + + if (SCARG(uap, set) == NULL) + /* Just examine */ + return 0; + + if ((error = copyin(SCARG(uap, set), &iss, sizeof(iss))) != 0) + return error; + + ibcs2_to_bsd_sigset(&iss, &bss); + (void) splhigh(); - switch (args->how) { - case 0: /* SIG_SETMASK */ - p->p_sigmask = umask &~ DONTMASK; + + switch (SCARG(uap, how)) { + case IBCS2_SIG_BLOCK: + p->p_sigmask |= bss & ~sigcantmask; break; - case 1: /* SIG_BLOCK */ - p->p_sigmask |= (umask &~ DONTMASK); + case IBCS2_SIG_UNBLOCK: + p->p_sigmask &= ~bss; break; - case 2: /* SIG_UNBLOCK */ - p->p_sigmask &= ~umask; + case IBCS2_SIG_SETMASK: + p->p_sigmask = bss & ~sigcantmask; break; default: error = EINVAL; break; } + (void) spl0(); - if (error) - *retval = -1; - else - *retval = 0; - return error; -} -struct ibcs2_sigpending_args { - unsigned long *sigs; -}; + return error; +} int -ibcs2_sigpending(struct proc *p, struct ibcs2_sigpending_args *args, int *retval) +ibcs2_sigpending(p, uap, retval) + register struct proc *p; + struct ibcs2_sigpending_args *uap; + int *retval; { - int error; - sigset_t mask = bsd_to_ibcs2_sigmask(p->p_siglist); + sigset_t bss; + ibcs2_sigset_t iss; - if (ibcs2_trace & IBCS2_TRACE_SIGNAL) - printf("IBCS2: 'sigpending' which=%x\n", args->sigs); - if (error = copyout(&mask, args->sigs, sizeof(unsigned long))) - *retval = -1; - else - *retval = 0; - return error; -} + bss = p->p_siglist & p->p_sigmask; + bsd_to_ibcs2_sigset(&bss, &iss); -struct ibcs2_sigsuspend_args { - sigset_t *mask; -}; + return copyout(&iss, SCARG(uap, mask), sizeof(iss)); +} int -ibcs2_sigsuspend(struct proc *p, struct ibcs2_sigsuspend_args *args, int *retval) +ibcs2_sigsuspend(p, uap, retval) + register struct proc *p; + struct ibcs2_sigsuspend_args *uap; + int *retval; { - sigset_t mask = ibcs2_to_bsd_sigmask((sigset_t)args->mask); + ibcs2_sigset_t sss; + sigset_t bss; + struct sigsuspend_args sa; + int error; - if (ibcs2_trace & IBCS2_TRACE_SIGNAL) - printf("IBCS2: 'sigsuspend'\n"); - return sigsuspend(p, &mask, retval); -} + if ((error = copyin(SCARG(uap, mask), &sss, sizeof(sss))) != 0) + return error; -struct kill_args { - int pid; - int signo; -}; + ibcs2_to_bsd_sigset(&sss, &bss); + + SCARG(&sa, mask) = bss; + return sigsuspend(p, &sa, retval); +} int -ibcs2_kill(struct proc *p, struct kill_args *args, int *retval) +ibcs2_pause(p, uap, retval) + register struct proc *p; + struct ibcs2_pause_args *uap; + int *retval; { - struct kill_args tmp; - - if (ibcs2_trace & IBCS2_TRACE_SIGNAL) - printf("IBCS2: 'kill' pid=%d, sig=%d(%s)\n", args->pid, - args->signo, ibcs2_sig_to_str(args->signo)); - tmp.pid = args->pid; - tmp.signo = (args->signo < IBCS2_NSIG) ? - ibcs2_to_bsd_signal[args->signo] : IBCS2_NSIG; - return kill(p, &tmp, retval); + struct sigsuspend_args bsa; + + SCARG(&bsa, mask) = p->p_sigmask; + return sigsuspend(p, &bsa, retval); } +int +ibcs2_kill(p, uap, retval) + register struct proc *p; + struct ibcs2_kill_args *uap; + int *retval; +{ + struct kill_args ka; + + SCARG(&ka, pid) = SCARG(uap, pid); + SCARG(&ka, signum) = ibcs2_to_bsd_sig[SCARG(uap, signo)]; + return kill(p, &ka, retval); +} diff --git a/sys/i386/ibcs2/ibcs2_signal.h b/sys/i386/ibcs2/ibcs2_signal.h index 2858688..6822026 100644 --- a/sys/i386/ibcs2/ibcs2_signal.h +++ b/sys/i386/ibcs2/ibcs2_signal.h @@ -79,15 +79,6 @@ #define IBCS2_SIGNO(x) ((x) & IBCS2_SIGNO_MASK) #define IBCS2_SIGCALL(x) ((x) & ~IBCS2_SIGNO_MASK) -#define IBCS2_SIG_DFL (void(*)())0 -#define IBCS2_SIG_ERR (void(*)())-1 -#define IBCS2_SIG_IGN (void(*)())1 -#define IBCS2_SIG_HOLD (void(*)())2 - -#define IBCS2_SIG_SETMASK 0 -#define IBCS2_SIG_BLOCK 1 -#define IBCS2_SIG_UNBLOCK 2 - typedef long ibcs2_sigset_t; typedef void (*ibcs2_sig_t) __P((int)); @@ -97,6 +88,15 @@ struct ibcs2_sigaction { int sa_flags; }; +#define IBCS2_SIG_DFL (ibcs2_sig_t)(0) +#define IBCS2_SIG_ERR (ibcs2_sig_t)(-1) +#define IBCS2_SIG_IGN (ibcs2_sig_t)(1) +#define IBCS2_SIG_HOLD (ibcs2_sig_t)(2) + +#define IBCS2_SIG_SETMASK 0 +#define IBCS2_SIG_BLOCK 1 +#define IBCS2_SIG_UNBLOCK 2 + /* sa_flags */ #define IBCS2_SA_NOCLDSTOP 1 diff --git a/sys/i386/ibcs2/ibcs2_socksys.c b/sys/i386/ibcs2/ibcs2_socksys.c index a1a52ad..c95526d 100644 --- a/sys/i386/ibcs2/ibcs2_socksys.c +++ b/sys/i386/ibcs2/ibcs2_socksys.c @@ -1,21 +1,15 @@ -/*- - * Copyright (c) 1994 Mostyn Lewis +/* + * Copyright (c) 1994, 1995 Scott Bartram + * Copyright (c) 1994 Arne H Juul * All rights reserved. * - * This software is based on code which is: - * Copyright (c) 1994 Mike Jagdis (jaggy@purplet.demon.co.uk) - * * 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 - * in this position and unchanged. - * 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 withough specific prior written permission + * notice, this list of conditions and the following disclaimer. + * 2. 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 @@ -27,1367 +21,110 @@ * 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. - * - * $Id: ibcs2_socksys.c,v 1.2 1994/10/17 22:13:08 sos Exp $ */ #include <sys/param.h> #include <sys/systm.h> -#include <sys/filedesc.h> +#include <sys/proc.h> #include <sys/file.h> -#include <sys/kernel.h> -#include <sys/mbuf.h> -#include <sys/protosw.h> +#include <sys/filedesc.h> +#include <sys/ioctl.h> +#include <sys/termios.h> +#include <sys/tty.h> #include <sys/socket.h> -#include <sys/socketvar.h> #include <sys/ioctl.h> -#include <sys/sockio.h> -#include <sys/proc.h> -#include <sys/exec.h> -#include <sys/stat.h> -#include <sys/syscall.h> -#include <sys/sysent.h> -#include <sys/malloc.h> -#include <sys/un.h> +#include <sys/sysproto.h> #include <net/if.h> -#include <net/if_arp.h> -#include <net/route.h> -#include <netinet/in.h> -#include <vm/vm.h> -#include <i386/ibcs2/ibcs2.h> -#include <i386/ibcs2/ibcs2_socksys.h> - -/* Socksys pseudo driver entry points */ - -int sockopen (dev_t dev, int mode, int devtype, struct proc *p); -int sockioctl(dev_t dev, int cmd, caddr_t arg, int fflag, struct proc *p); -int sockclose(dev_t dev, int flag, int mode, struct proc *p); -/* Socksys internal functions */ - -static void put_socket_fops(struct proc *p, int fd); -static int ss_fop_close(struct file *fp, struct proc *p); -static int ss_fop_ioctl(struct file*fp, int cmd, caddr_t arg, struct proc *p); -static int ss_syscall(caddr_t arg, struct proc *p); +#include <i386/ibcs2/ibcs2_socksys.h> +#include <i386/ibcs2/ibcs2_util.h> /* - * This structure is setup on first usage. Its address is planted - * into a socket's file structure fileops pointer after a successful - * socket creation or accept. + * iBCS2 socksys calls. */ -static struct fileops ss_socket_fops = { - NULL, /* normal socket read */ - NULL, /* normal socket write */ - NULL, /* socksys ioctl */ - NULL, /* normal socket select */ - NULL, /* socksys close */ -}; - -static int (*close_s)__P((struct file *fp, struct proc *p)); -static int (*ioctl_s)__P((struct file *fp, int cmd, caddr_t data, struct proc *p)); - -int ss_debug = 10; - -static int -ss_syscall(arg, p) - caddr_t arg; - struct proc *p; -{ - int cmd; - int error; - int retval[2]; - - retval[0] = retval[1] = 0; - cmd = ((struct ss_call *)arg)->arg[0]; - - if(ss_debug) { - static char *ss_syscall_strings[] = { - "0?", "accept", "bind", "connect", "getpeername", - "getsockname", "getsockopt", "listen", "recv(from)", - "recvfrom", "send(to)", "sendto", "setsockopt", "shutdown", - "socket", "select", "getipdomain", "setipdomain", - "adjtime", "setreuid", "setregid", "gettimeofday", - "settimeofday", "getitimer", "setitimer", - }; - - printf("ss_syscall: [%d] ",p->p_pid); - if(cmd < 0 || (cmd > CMD_SO_SETITIMER && cmd != CMD_SO_SS_DEBUG) ) - printf("? "); - else { - if(cmd == CMD_SO_SS_DEBUG) - printf("%s ","ss_debug"); - else - printf("%s ",ss_syscall_strings[cmd]); - } - printf("(%d) <0x%x,0x%x,0x%x,0x%x,0x%x,0x%x>\n", - cmd, - ((struct ss_call *)arg)->arg[1], - ((struct ss_call *)arg)->arg[2], - ((struct ss_call *)arg)->arg[3], - ((struct ss_call *)arg)->arg[4], - ((struct ss_call *)arg)->arg[5], - ((struct ss_call *)arg)->arg[6]); - } - - error = 0; - - switch (cmd) { - - case CMD_SO_SS_DEBUG: - - /* ss_debug = ((struct ss_call *)arg)->arg[1]; */ - break; - - case CMD_SO_SOCKET: { /* NO CONV */ - - if(ss_debug > 1) - printf("SO_SOCKET af in %d\n", - ((struct ss_call *)arg)->arg[1]); - ((struct ss_call *)arg)->arg[1] = ss_convert( - af_whatevers, - &(((struct ss_call *)arg)->arg[1]), - 0); - if(ss_debug > 1) { - printf("SO_SOCKET af out %d\n", - ((struct ss_call *)arg)->arg[1]); - - printf("SO_SOCKET type in %d\n", - ((struct ss_call *)arg)->arg[2]); - } - ((struct ss_call *)arg)->arg[2] = ss_convert( - type_whatevers, - &(((struct ss_call *)arg)->arg[2]), - 0); - if(ss_debug > 1) - printf("SO_SOCKET type out %d\n", - ((struct ss_call *)arg)->arg[2]); - - SYSCALL(SYS_socket, 0, 0); - - if(ss_debug) - printf("ss_syscall: [%d] socket fd=%d\n", - p->p_pid, retval[0]); - put_socket_fops(p,retval[0]); - - break; - } - - case CMD_SO_ACCEPT: { /* CONVERSION in arg 2 */ - - SYSCALL(SYS_accept, 2, SS_STRUCT_SOCKADDR); - - if(ss_debug) - printf("ss_syscall: [%d] accept fd=%d\n", - p->p_pid, retval[0]); - put_socket_fops(p,retval[0]); - - break; - } - - case CMD_SO_BIND: - SYSCALL(SYS_bind, 2, SS_STRUCT_SOCKADDR); - break; - - case CMD_SO_CONNECT: { - struct alien_sockaddr *sa; - unsigned short family; - - /* Remap any INADDR_ANY (0.0.0.0) to localhost */ - - sa = (struct alien_sockaddr *)((struct ss_call *)arg)->arg[1]; - if(error = copyin((caddr_t)&sa->sa_family, - (caddr_t)&family, sizeof(short))) - return(error); - if (family == AF_INET) { - unsigned long *addr; - unsigned long saddr; - - addr = &(((struct alien_sockaddr_in *)sa)->sin_addr.s_addr); - if(error = copyin((caddr_t)addr, (caddr_t)&saddr, sizeof(long))) - return(error); - if (saddr == INADDR_ANY) { - /* 0x0100007f is 127.0.0.1 reversed */ - saddr = 0x0100007f; - if(error = copyout((caddr_t)&saddr, - (caddr_t)addr, sizeof(long))) - return(error); - if (ss_debug) - printf("ss_syscall: remapped INADDR_ANY to localhost\n"); - } - } - SYSCALL(SYS_connect, 2, SS_STRUCT_SOCKADDR); - break; - } - - case CMD_SO_GETPEERNAME: - SYSCALL(SYS_getpeername, 2, SS_STRUCT_SOCKADDR); - break; - - case CMD_SO_GETSOCKNAME: - SYSCALL(SYS_getsockname, 2, SS_STRUCT_SOCKADDR); - break; - - case CMD_SO_GETSOCKOPT: - if(error = ss_getsockopt((caddr_t)(((int *)arg) + 1),retval,p)) - return(error); - break; - - case CMD_SO_LISTEN: - SYSCALL(SYS_listen, 0, 0); - break; - - case CMD_SO_RECV: - ((struct ss_call *)arg)->arg[5] = (int)((struct sockaddr *)NULL); - ((struct ss_call *)arg)->arg[6] = 0; - SYSCALL(SYS_recvfrom, 0, 0); - break; - - case CMD_SO_RECVFROM: - SYSCALL(SYS_recvfrom, 5, SS_STRUCT_SOCKADDR); - break; - - case CMD_SO_SEND: - ((struct ss_call *)arg)->arg[5] = (int)((struct sockaddr *)NULL); - ((struct ss_call *)arg)->arg[6] = 0; - SYSCALL(SYS_sendto, 0, 0); - break; - - case CMD_SO_SENDTO: - SYSCALL(SYS_sendto, 5, SS_STRUCT_SOCKADDR); - break; - - case CMD_SO_SETSOCKOPT: - if(error = ss_setsockopt((caddr_t)(((int *)arg) + 1),retval,p)) - return(error); - - case CMD_SO_SHUTDOWN: - SYSCALL(SYS_shutdown, 0, 0); - break; - - case CMD_SO_GETIPDOMAIN: - SYSCALL(SYS_getdomainname, 0, 0); - break; - - case CMD_SO_SETIPDOMAIN: /* Note check on BSD utsname no change? */ - SYSCALL(SYS_setdomainname, 0, 0); - break; - - case CMD_SO_SETREUID: - SYSCALL(126/*SYS_setreuid*/, 0, 0); - break; - - case CMD_SO_SETREGID: - SYSCALL(127/*SYS_setregid*/, 0, 0); - break; - - case CMD_SO_GETTIME: - SYSCALL(SYS_gettimeofday, 0, 0); - break; - - case CMD_SO_SETTIME: - SYSCALL(SYS_settimeofday, 0, 0); - break; - - case CMD_SO_GETITIMER: - SYSCALL(SYS_getitimer, 0, 0); - break; - - case CMD_SO_SETITIMER: - SYSCALL(SYS_setitimer, 0, 0); - break; - - case CMD_SO_SELECT: - SYSCALL(SYS_select, 0, 0); - break; - - case CMD_SO_ADJTIME: - SYSCALL(SYS_adjtime, 0, 0); - break; - - default: - printf("ss_syscall: default 0x%x\n",cmd); - return (EINVAL); - } - IBCS2_MAGIC_RETURN(arg); -} - - -static int -ss_fop_ioctl(fp, cmd, arg, p) - struct file *fp; - int cmd; - caddr_t arg; - struct proc *p; -{ - int error; - int retval[2]; - - if(ss_debug) { - static char **ioctl_strings; - int fd; - struct filedesc *fdp; - unsigned int ioctl_type; - unsigned int ioctl_len; - char cmd_type; - int cmd_ordinal; - - static char *ioctl_type_strings[] = { - "0?", "SS_IO", "SS_IOR", "3?", "SS_IOW", "5?", "SS_IOWR" - }; - static char *ioctl_S_strings[] = { - "0?", "SIOCSHIWAT", "SIOCGHIWAT", "SIOCSLOWAT", "SIOCGLOWAT", - "SIOCATMARK", "SIOCSPGRP", "SIOCGPGRP", "FIONREAD", - "FIONBIO", "FIOASYNC", "SIOCPROTO", "SIOCGETNAME", - "SIOCGETPEER", "IF_UNITSEL", "SIOCXPROTO" - }; - static char *ioctl_R_strings[] = { - "0?", "1?", "2?", "3?", "4?", "5?", "6?", "7?", "8?", - "SIOCADDRT", "SIOCDELRT" - }; - static char *ioctl_I_strings[] = { - "0?", "1?", "2?", "3?", "4?", "5?", "6?", "7?", "8?", - "9?", "10?", "SIOCSIFADDR", "SIOCGIFADDR", "SIOCSIFDSTADDR", - "SIOCGIFDSTADDR", "SIOCSIFFLAGS", "SIOCGIFFLAGS", - "SIOCGIFCONF", "18?", "19?", "20?", "SIOCSIFMTU", - "SIOCGIFMTU", "23?", "24?", "25?", "SIOCIFDETACH", - "SIOCGENPSTATS", "28?", "SIOCX25XMT", "SS_SIOCX25RCV", - "SS_SIOCX25TBL", "SIOCGIFBRDADDR" ,"SIOCSIFBRDADDR", - "SIOCGIFNETMASK", "SIOCSIFNETMASK", "SIOCGIFMETRIC", - "SIOCSIFMETRIC", "SIOCSARP", "SIOCGARP", "SIOCDARP", - "SIOCSIFNAME", "SIOCGIFONEP", "SIOCSIFONEP ", - "44?", "45?", "46?", "47?", "48?", "49?", "50?", "51?", - "52?", "53?", "54?", "55?", "56?", "57?", "58?", "59?", - "60?", "61?", "62?", "63?", "64?", "SIOCGENADDR", - "SIOCSOCKSYS" - }; - - cmd_type = (cmd >> 8) & 0xff; - cmd_ordinal = cmd & 0xff; - - switch (cmd_type) { - - case 'S': - ioctl_strings = ioctl_S_strings; - if (cmd_ordinal > 15) - cmd_ordinal = -1; - break; - - case 'R': - ioctl_strings = ioctl_R_strings; - if (cmd_ordinal > 10) - cmd_ordinal = -1; - break; - - case 'I': - ioctl_strings = ioctl_I_strings; - if (cmd_ordinal > 66) - cmd_ordinal = -1; - break; - - default: - cmd_type = '?'; - break; - } - fdp = p->p_fd; - fd = -1; - while(++fd < NOFILE) - if ( fp == fdp->fd_ofiles[fd] ) - break; - - ioctl_type = (0xe0000000 & cmd) >> 29; - ioctl_len = (cmd >> 16) & SS_IOCPARM_MASK; - - printf("ss_fop_ioctl: [%d] fd=%d ",p->p_pid, fd); - if(cmd_type != '?'){ - if(cmd_ordinal != -1) - printf("%s %s('%c',%d,l=%d) ",ioctl_strings[cmd_ordinal], - ioctl_type_strings[ioctl_type], - cmd_type, - cmd_ordinal, - ioctl_len); - else { - cmd_ordinal = cmd & 0xff; - printf("[unknown ordinal %d] %s('%c',%d,l=%d) ",cmd_ordinal, - ioctl_type_strings[ioctl_type], - cmd_type, - cmd_ordinal, - ioctl_len); - } - } - else { - printf("? %s('%c',%d,l=%d) ", - ioctl_type_strings[ioctl_type], - cmd_type, - cmd_ordinal, - ioctl_len); - } - - printf("0x%x (0x%x) <0x%x>\n", - fp, cmd, arg); - } - - /* No dogs allowed */ - - if(*(((int *)arg) - 3) != IBCS2_MAGIC_IN){ - printf("ss_fop_ioctl: bad magic (sys_generic.c has no socksys mods?)\n"); - return(EINVAL); - } - - if(fp->f_type != DTYPE_SOCKET) - return (ENOTSOCK); - - retval[0] = retval[1] = 0; - - - error = 0; - - switch (cmd) { - case SS_SIOCSOCKSYS: /* ss syscall */ - return ss_syscall(arg, p); - - case SS_SIOCSHIWAT: /* set high watermark */ - case SS_SIOCSLOWAT: /* set low watermark */ - break; /* return value of 0 and no error */ - - case SS_SIOCGHIWAT: /* get high watermark */ - case SS_SIOCGLOWAT: /* get low watermark */ - break; /* return value of 0 and no error */ - - case SS_SIOCATMARK: /* at oob mark */ - IOCTL(SIOCATMARK); - break; - - case SS_SIOCSPGRP: /* set process group */ - IOCTL(SIOCSPGRP); - break; - case SS_SIOCGPGRP: /* get process group */ - IOCTL(SIOCGPGRP); - break; - - case FIONREAD: - case SS_FIONREAD: /* get # bytes to read */ - IOCTL(FIONREAD); - break; - - case SS_FIONBIO: /* set/clear non-blocking i/o */ - IOCTL(FIONBIO); - break; - - case SS_FIOASYNC: /* set/clear async i/o */ - IOCTL(FIOASYNC); - break; - - case SS_SIOCADDRT: /* add route - uses struct ortentry */ - IOCTL(SIOCADDRT); - break; - - case SS_SIOCDELRT: /* delete route - uses struct ortentry */ - IOCTL(SIOCDELRT); - break; - - case SS_SIOCSIFADDR: /* set ifnet address */ - IOCTL(SIOCSIFADDR); - break; - - case SS_SIOCGIFADDR: /* get ifnet address */ - IOCTL(SIOCGIFADDR); - break; - - case SS_SIOCSIFDSTADDR: /* set p-p address */ - IOCTL(SIOCSIFDSTADDR); - break; - - case SS_SIOCGIFDSTADDR: /* get p-p address */ - IOCTL(SIOCGIFDSTADDR); - break; - - case SS_SIOCSIFFLAGS: /* set ifnet flags */ - IOCTL(SIOCSIFFLAGS); - break; - - case SS_SIOCGIFFLAGS: /* get ifnet flags */ - IOCTL(SIOCGIFFLAGS); - break; - - case SS_SIOCGIFCONF: /* get ifnet ltst */ - IOCTL(SIOCGIFCONF); - break; - - case SS_SIOCGIFBRDADDR: /* get broadcast addr */ - IOCTL(SIOCGIFBRDADDR); - break; - - case SS_SIOCSIFBRDADDR: /* set broadcast addr */ - IOCTL(SIOCSIFBRDADDR); - break; - - case SS_SIOCGIFNETMASK: /* get net addr mask */ - IOCTL(SIOCGIFNETMASK); - break; - - case SS_SIOCSIFNETMASK: /* set net addr mask */ - IOCTL(SIOCSIFNETMASK); - break; - - case SS_SIOCGIFMETRIC: /* get IF metric */ - IOCTL(SIOCGIFMETRIC); - break; - - case SS_SIOCSIFMETRIC: /* set IF metric */ - IOCTL(SIOCSIFMETRIC); - break; - -/* FreeBSD 2.0 does not have socket ARPs */ - -#ifdef SIOCSARP - - case SS_SIOCSARP: /* set arp entry */ - IOCTL(SIOCSARP); - break; - - case SS_SIOCGARP: /* get arp entry */ - IOCTL(SIOCGARP); - break; - - case SS_SIOCDARP: /* delete arp entry */ - IOCTL(SIOCDARP); - break; - -#else /* SIOCSARP */ - - case SS_SIOCSARP: /* set arp entry */ - return(EINVAL); - - case SS_SIOCGARP: /* get arp entry */ - return(EINVAL); - - case SS_SIOCDARP: /* delete arp entry */ - return(EINVAL); - -#endif /* SIOCSARP */ - - case SS_SIOCGENADDR: /* Get ethernet addr XXX */ - return (EINVAL); -/* return (error = ioctl_s(fp, SIOCGIFHWADDR, arg, p)); */ - - case SS_SIOCSIFMTU: /* get if_mtu */ - IOCTL(SIOCSIFMTU); - break; - - case SS_SIOCGIFMTU: /* set if_mtu */ - IOCTL(SIOCGIFMTU); - break; - - case SS_SIOCGETNAME: /* getsockname XXX */ - return (EINVAL); -/* return (ioctl_s(fp, SIOCGIFNAME, arg, p)); MMM */ - - case SS_SIOCGETPEER: { /* getpeername */ - struct moose { - int fd; - caddr_t asa; - int *alen; - int compat_43; - } args; - - struct alien_sockaddr uaddr; - struct sockaddr nuaddr; - int nuaddr_len = sizeof(struct sockaddr); - struct filedesc *fdp; - - if(fp->f_type != DTYPE_SOCKET) - return (ENOTSOCK); - - bzero((caddr_t)&nuaddr, sizeof(struct sockaddr)); - fdp = p->p_fd; - args.fd = -1; - while(++args.fd < NOFILE) - if ( fp == fdp->fd_ofiles[args.fd] ) - break; - if(args.fd == NOFILE){ - printf("ss_fop_ioctl: [%d] SS_SIOCGETPEER args.fd > NOFILE\n", p->p_pid); - return(EBADF); - } - args.asa = (caddr_t)&nuaddr; - args.alen = &nuaddr_len; - args.compat_43 = 0; - error = SYSCALLX(SYS_getpeername, &args); - if(error) - return(error); - - bzero((caddr_t)&uaddr, sizeof(struct alien_sockaddr)); - uaddr.sa_family = (unsigned short)nuaddr.sa_family; - bcopy(&nuaddr.sa_data, &uaddr.sa_data, __ALIEN_SOCK_SIZE__ - sizeof(unsigned short)); - - error = copyout((caddr_t)&uaddr, (caddr_t)arg, sizeof(struct alien_sockaddr)); - return error; - } - - default: - printf("ss_fop_ioctl: [%d] %lx unknown ioctl 0x%x, 0x%lx\n", - p->p_pid, (unsigned long)fp, - cmd, (unsigned long)arg); - return (EINVAL); - } - IBCS2_MAGIC_RETURN(arg); -} int -sockioctl(dev, cmd, arg, fflag, p) - dev_t dev; - int cmd; - caddr_t arg; - int fflag; - struct proc *p; +ibcs2_socksys(p, uap, retval) + register struct proc *p; + register struct ibcs2_socksys_args *uap; + int *retval; { + register struct filedesc *fdp = p->p_fd; + register struct file *fp; int error; - int retval[2]; - - if(ss_debug) { - char cmd_type; - int cmd_ordinal; - static char **ioctl_strings; - unsigned int ioctl_type; - unsigned int ioctl_len; - - static char *ioctl_type_strings[] = { - "NIOCxx", "SS_IO", "SS_IOR", "3?", "SS_IOW", "5?", "SS_IOWR" - }; - static char *ioctl_S_strings[] = { - "0?", "SIOCSHIWAT", "SIOCGHIWAT", "SIOCSLOWAT", "SIOCGLOWAT", - "SIOCATMARK", "SIOCSPGRP", "SIOCGPGRP", "FIONREAD", - "FIONBIO", "FIOASYNC", "SIOCPROTO", "SIOCGETNAME", - "SIOCGETPEER", "IF_UNITSEL", "SIOCXPROTO" - }; - static char *ioctl_R_strings[] = { - "0?", "1?", "2?", "3?", "4?", "5?", "6?", "7?", "8?", - "SIOCADDRT", "SIOCDELRT" - }; - static char *ioctl_I_strings[] = { - "0?", "1?", "2?", "3?", "4?", "5?", "6?", "7?", "8?", - "9?", "10?", "SIOCSIFADDR", "SIOCGIFADDR", "SIOCSIFDSTADDR", - "SIOCGIFDSTADDR", "SIOCSIFFLAGS", "SIOCGIFFLAGS", - "SIOCGIFCONF", "18?", "19?", "20?", "SIOCSIFMTU", - "SIOCGIFMTU", "23?", "24?", "25?", "SIOCIFDETACH", - "SIOCGENPSTATS", "28?", "SIOCX25XMT", "SS_SIOCX25RCV", - "SS_SIOCX25TBL", "SIOCGIFBRDADDR" ,"SIOCSIFBRDADDR", - "SIOCGIFNETMASK", "SIOCSIFNETMASK", "SIOCGIFMETRIC", - "SIOCSIFMETRIC", "SIOCSARP", "SIOCGARP", "SIOCDARP", - "SIOCSIFNAME", "SIOCGIFONEP", "SIOCSIFONEP ", - "44?", "45?", "46?", "47?", "48?", "49?", "50?", "51?", - "52?", "53?", "54?", "55?", "56?", "57?", "58?", "59?", - "60?", "61?", "62?", "63?", "64?", "SIOCGENADDR", - "SIOCSOCKSYS" - }; - static char *ioctl_NIOC_strings[] = { - "0?", "NIOCNFSD", "NIOCOLDGETFH", "NIOCASYNCD", - "NIOCSETDOMNAM", "NIOCGETDOMNAM", "NIOCCLNTHAND", - "NIOCEXPORTFS", "NIOCGETFH", "NIOCLSTAT" - }; - - cmd_ordinal = cmd & 0xff; - cmd_type = (cmd >> 8) & 0xff; - switch (cmd_type) { - - case 0: - ioctl_strings = ioctl_NIOC_strings; - cmd_type = ' '; - if (cmd_ordinal > 9) - cmd_ordinal = -1; - break; - - case 'S': - ioctl_strings = ioctl_S_strings; - if (cmd_ordinal > 15) - cmd_ordinal = -1; - break; - - case 'R': - ioctl_strings = ioctl_R_strings; - if (cmd_ordinal > 10) - cmd_ordinal = -1; - break; - - case 'I': - ioctl_strings = ioctl_I_strings; - if (cmd_ordinal > 66) - cmd_ordinal = -1; - break; - - default: - cmd_type = '?'; - break; - - } - ioctl_type = (0xe0000000 & cmd) >> 29; - ioctl_len = (cmd >> 16) & SS_IOCPARM_MASK; - - printf("sockioctl: [%d] ",p->p_pid); - if(cmd_type != '?'){ - if(cmd_ordinal != -1) - printf("%s %s('%c',%d,l=%d) ",ioctl_strings[cmd_ordinal], - ioctl_type_strings[ioctl_type], - cmd_type, - cmd_ordinal, - ioctl_len); - else { - cmd_ordinal = cmd & 0xff; - printf("[unknown ordinal %d] %s('%c',%d,l=%d) ",cmd_ordinal, - ioctl_type_strings[ioctl_type], - cmd_type, - cmd_ordinal, - ioctl_len); - } - } - else { - printf("? %s('%c',%d,l=%d) ", - ioctl_type_strings[ioctl_type], - cmd_type, - cmd_ordinal, - ioctl_len); - } - - printf("0x%x (0x%x) <0x%x>\n", - dev, cmd, arg); - } - - if(*(((int *)arg) - 3) != IBCS2_MAGIC_IN){ - printf("sockioctl: bad magic (sys_generic.c has no socksys mods?)\n"); - return(EINVAL); - } - - switch (cmd) { - - case SS_SIOCSOCKSYS: /* ss syscall */ - return ss_syscall(arg, p); + int realargs[7]; /* 1 for command, 6 for recvfrom */ + void *passargs; - /* NIOCxx: These ioctls are really just integers - * (no other information to go on). + /* + * SOCKET should only be legal on /dev/socksys. + * GETIPDOMAINNAME should only be legal on /dev/socksys ? + * The others are (and should be) only legal on sockets. */ - case NIOCSETDOMNAM: { - struct sgdomarg domargs; - - if(error = copyin((caddr_t)*((caddr_t *)arg), (caddr_t)&domargs, sizeof(struct sgdomarg))) - return(error); - - arg = (caddr_t)&domargs; - SYSCALL_N(SYS_setdomainname, 0, 0); - break; - } - - case NIOCGETDOMNAM: { - struct sgdomarg domargs; - - if(error = copyin((caddr_t)*((caddr_t *)arg), (caddr_t)&domargs, sizeof(struct sgdomarg))) - return(error); - - arg = (caddr_t)&domargs; - SYSCALL_N(SYS_getdomainname, 0, 0); - break; - } - - case NIOCLSTAT: { - struct lstatarg st; - - if(error = copyin((caddr_t)*((caddr_t *)arg), (caddr_t)&st, sizeof(struct lstatarg))) - return(error); - - /* DO WE HAVE A FOREIGN LSTAT */ -/* return mumbo_lstat(st.fname, st.statb); */ - return (EINVAL); - } - - case NIOCNFSD: - case NIOCOLDGETFH: - case NIOCASYNCD: - case NIOCCLNTHAND: - case NIOCEXPORTFS: - case NIOCGETFH: - return (EINVAL); - - - case SS_IF_UNITSEL: /* set unit number */ - case SS_SIOCXPROTO: /* empty proto table */ - - case SS_SIOCIFDETACH: /* detach interface */ - case SS_SIOCGENPSTATS: /* get ENP stats */ - - case SS_SIOCSIFNAME: /* set interface name */ - case SS_SIOCGIFONEP: /* get one-packet params */ - case SS_SIOCSIFONEP: /* set one-packet params */ - - case SS_SIOCPROTO: /* link proto */ - case SS_SIOCX25XMT: - case SS_SIOCX25RCV: - case SS_SIOCX25TBL: - - printf("sockioctl: [%d] unsupported ioctl 0x%x , 0x%lx\n", - p->p_pid, - cmd, (unsigned long)arg); - return (EINVAL); - - default: - printf("sockioctl: [%d] unknown ioctl 0x%x , 0x%lx\n", - p->p_pid, - cmd, (unsigned long)arg); - return (EINVAL); - } - IBCS2_MAGIC_RETURN(arg); -} - - -int sockopen(dev, mode, devtype, p) - dev_t dev; - int mode; - int devtype; - struct proc *p; -{ - - if(ss_debug) - printf("sockopen: [%d] 0x%x\n", p->p_pid, dev); - - /* minor = 0 is the socksys device itself. No special handling - * will be needed as it is controlled by the application - * via ioctls. - */ - if (minor(dev) == 0) - return 0; - - /* minor = 1 is the spx device. This is the client side of a - * streams pipe to the X server. Under SCO and friends - * the library code messes around setting the connection - * up itself. We do it ourselves - this means we don't - * need to worry about the implementation of the server - * side (/dev/X0R - which must exist but can be a link - * to /dev/null) nor do we need to actually implement - * getmsg/putmsg. - */ -{ /* SPX */ - int fd, error, args[3]; - int retval[2]; -#define SUN_LEN(su) \ - (sizeof(*(su)) - sizeof((su)->sun_path) + strlen((su)->sun_path)) + 1 - struct sockaddr_un *Xaddr = (struct sockaddr_un *)UA_ALLOC(); - retval[0] = retval[1] = 0; - if(ss_debug) - printf("sockopen: SPX: [%d] opening\n", p->p_pid); - - /* Grab a socket. */ - if(ss_debug) - printf("sockopen: SPX: [%d] get a unix domain socket\n", - p->p_pid); - args[0] = AF_UNIX; - args[1] = SOCK_STREAM; - args[2] = 0; - error = SYSCALLX(SYS_socket, args); - if (error) + if (error = copyin(uap->argsp, (caddr_t)realargs, sizeof(realargs))) return error; - fd = retval[0]; - if(fd < 1) { - printf("sockopen: SPX: [%d] unexpected fd of %d\n", - p->p_pid, fd); - return(EOPNOTSUPP); /* MRL whatever */ - } - - /* Connect the socket to X. */ - if(ss_debug) - printf("sockopen: SPX: [%d] connect to /tmp/X11-unix/X0\n", - p->p_pid); - args[0] = fd; - Xaddr->sun_family = AF_UNIX; - copyout("/tmp/.X11-unix/X0", Xaddr->sun_path, 18); - Xaddr->sun_len = SUN_LEN(Xaddr); - args[1] = (int)Xaddr; - args[2] = sizeof(struct sockaddr_un); - error = SYSCALLX(SYS_connect, args); - if (error) { - (void)SYSCALLX(SYS_close, &fd); - return error; - } - - put_socket_fops(p,fd); - - return 0; -} /* SPX */ -} - - -int sockclose(dev, flag, mode, p) - dev_t dev; - int flag; - int mode; - struct proc *p; -{ - if(ss_debug) - printf("sockclose: [%d] 0x%x\n", p->p_pid, dev); - return(0); -} - -static -int ss_fop_close(struct file *fp, struct proc *p) -{ - -int fd; -struct filedesc *fdp; - - if(ss_debug){ - fdp = p->p_fd; - fd = -1; - while(++fd < NOFILE) - if ( fp == fdp->fd_ofiles[fd] ) - break; - printf("ss_fop_close: [%d] fd=%d ", p->p_pid, fd); - } - - if(fp->f_type == DTYPE_SOCKET) { - if(ss_debug) - printf("is a socket\n"); - return(close_s(fp, p)); - } - else { - if(ss_debug) - printf("is not a socket\n"); - return(ENOTSOCK); - } -} - -void put_socket_fops(struct proc *p, int fd) -{ -struct filedesc *fdp; -struct file *fp; - - fdp = p->p_fd; - fp = fdp->fd_ofiles[fd]; - if (ss_socket_fops.fo_ioctl != fp->f_ops->fo_ioctl) { - bcopy(fp->f_ops, &ss_socket_fops, sizeof(struct fileops)); - ioctl_s = ss_socket_fops.fo_ioctl; /* save standard ioctl */ - close_s = ss_socket_fops.fo_close; /* save standard close */ - ss_socket_fops.fo_ioctl = ss_fop_ioctl; - ss_socket_fops.fo_close = ss_fop_close; - } - fp->f_ops = &ss_socket_fops; - - return; -} - -int ss_SYSCALL(n,convert_arg,indicator,arg,p,retval) - int n; /* syscall ordinal */ - int convert_arg; /* if not 0, argument to convert */ - int indicator; /* type of argument to convert */ - int *arg; /* address of alien arg */ - struct proc *p; - int *retval; -{ -int error; -int rc; - - if(convert_arg){ - if(rc = ss_convert_struct( (caddr_t)*(arg + convert_arg), - indicator, - SS_ALIEN_TO_NATIVE)) - return(rc); - - error = (*sysent[n].sy_call)(p, arg + 1, retval); - rc = ss_convert_struct( (caddr_t)*(arg + convert_arg), - indicator, - SS_NATIVE_TO_ALIEN); - if(ss_debug) - printf("ss_SYSCALL: [%d] error=%d, rc=%d\n", - p->p_pid, error, rc); - } - else { - rc = 0; - error = (*sysent[n].sy_call)(p, arg + 1, retval); - if(ss_debug) - printf("ss_SYSCALL: [%d] error=%d\n",p->p_pid, error); - } - - return(error ? error : rc); -} - -int ss_IOCTL(fp, cmd, arg, p) - struct file *fp; - int cmd; - int *arg; /* address of alien arg */ - struct proc *p; -{ -int error, rc; -int these[2]; -char cmd_type; -int cmd_ordinal; -int indicator; - - cmd_type = (cmd >> 8) & 0xff; - cmd_ordinal = cmd & 0xff; - these[0] = cmd_type; - these[1] = cmd_ordinal; - if(ss_debug > 1) - printf("ss_IOCTL: calling ss_convert with %d(%c) %d\n", - these[0],these[0],these[1]); - indicator = ss_convert( struct_whatevers, these, 0); - if(ss_debug > 1) - printf("ss_IOCTL: ss_convert returns indicator %d\n",indicator); - if(indicator){ - error = ss_convert_struct((caddr_t)*(arg + 2), - indicator, - SS_ALIEN_TO_NATIVE); - if(ss_debug > 1) - printf("ss_IOCTL: ss_convert_struct returns %d\n",error); - if(error) - return(error); - /* change len in ioctl now - in the general case */ - error = ioctl_s(fp, cmd, (caddr_t)arg, p); - rc = ss_convert_struct( (caddr_t)*(arg + 2), - indicator, - SS_NATIVE_TO_ALIEN); - if(ss_debug) - printf("ss_IOCTL: [%d] error=%d, rc=%d\n",p->p_pid, - error, rc); - } - else { - rc = 0; - error = ioctl_s(fp, cmd, (caddr_t)arg, p); - if(ss_debug) - printf("ss_IOCTL: [%d] error=%d\n",p->p_pid, error); - } - - return(error ? error : rc); -} - - -struct ss_socketopt_args { - int s; - int level; - int name; - caddr_t val; - int valsize; -}; - -int -ss_setsockopt(arg, ret, p) - struct ss_socketopt_args *arg; - int *ret; - struct proc *p; -{ - int error, optname; - int retval[2]; - - if (arg->level != 0xffff) /* FreeBSD, SCO and ? */ - return (ENOPROTOOPT); - - optname = ss_convert(sopt_whatevers, &arg->name, 0); - - switch (optname) { - - case SO_ACCEPTCONN: - case SO_BROADCAST: - case SO_DEBUG: - case SO_DONTROUTE: - case SO_LINGER: - case SO_KEEPALIVE: - case SO_OOBINLINE: - case SO_RCVBUF: - case SO_RCVLOWAT: - case SO_RCVTIMEO: - case SO_REUSEADDR: - case SO_SNDBUF: - case SO_SNDLOWAT: - case SO_SNDTIMEO: - case SO_USELOOPBACK: - error = SYSCALLX(SYS_setsockopt, arg); - *ret = retval[0]; - *(ret + 1) = retval[1]; - return(error); - - case SO_ERROR: - case SO_IMASOCKET: - case SO_NO_CHECK: - case SO_ORDREL: - case SO_PRIORITY: - case SO_PROTOTYPE: - case SO_TYPE: - return (ENOPROTOOPT); - - } - - return (ENOPROTOOPT); -} - - -int -ss_getsockopt(arg, ret, p) - struct ss_socketopt_args *arg; - int *ret; - struct proc *p; -{ - int error, optname; - int retval[2]; - - if (arg->level != 0xffff) /* FreeBSD, SCO and ? */ - return (ENOPROTOOPT); - - optname = ss_convert(sopt_whatevers, &arg->name, 0); - - switch (optname) { - - case SO_ACCEPTCONN: - case SO_BROADCAST: - case SO_DEBUG: - case SO_DONTROUTE: - case SO_ERROR: - case SO_KEEPALIVE: - case SO_LINGER: - case SO_OOBINLINE: - case SO_RCVBUF: - case SO_RCVLOWAT: - case SO_RCVTIMEO: - case SO_REUSEADDR: - case SO_SNDBUF: - case SO_SNDLOWAT: - case SO_SNDTIMEO: - case SO_TYPE: - case SO_USELOOPBACK: - error = SYSCALLX(SYS_getsockopt, arg); - *ret = retval[0]; - *(ret + 1) = retval[1]; - return(error); - - - case SO_PROTOTYPE: { - int value = 0; - - error = copyout((caddr_t)&value, (caddr_t)arg->s, sizeof(int)); - return(error); - } - - - case SO_IMASOCKET: { - int value = 1; - - error = copyout((caddr_t)&value, (caddr_t)arg->s, sizeof(int)); - return(error); - } - - case SO_NO_CHECK: - case SO_ORDREL: - case SO_PRIORITY: - return (ENOPROTOOPT); - } - - return (ENOPROTOOPT); -} - -#define SS_CONVERT -int system_type = SS_FREEBSD; /* FreeBSD */ - -int -ss_convert(what, this, otherwise) - struct whatever **what; - int *this; - int otherwise; -{ - struct whatever *specific; - - if(!(specific = what[system_type])) - return *this; - - for (; specific->from != -1; specific++) - if(specific->from <= *this && *this <= specific->to) - if(specific->from == specific->to){ - if(specific->more){ - specific = specific->more; - this++; - continue; - } - else { - return((int)specific->conversion); - } - } - else { - return(specific->conversion ? ( - specific->all_the_same ? (int)specific->conversion : specific->conversion[*this - specific->from] ) : *this); - } - - return otherwise; -} - -/* Returns 0 - no conversion, no pointer modification - 1 - converted, relevant pointer modification - -1 - error - */ -int -ss_convert_struct(alien, indicator, direction) - char *alien; - int indicator; - int direction; -{ -int error, len; - - switch (system_type) { - - case SS_FREEBSD: - return(0); - case SS_SYSVR4: - case SS_SYSVR3: - case SS_SCO_32: - case SS_WYSE_321: - case SS_ISC: - case SS_LINUX: - - switch(direction){ - - case SS_ALIEN_TO_NATIVE: - - error = ss_atn(alien, indicator); - if(ss_debug > 1) - printf("ss_convert: ATN ss_atn error %d\n",error); - return(error); - - case SS_NATIVE_TO_ALIEN: - - error = ss_nta(alien, indicator); - if(ss_debug > 1) - printf("ss_convert: NTA ss_nta error %d\n",error); - return(error); - - } + DPRINTF(("ibcs2_socksys: %08x %08x %08x %08x %08x %08x %08x\n", + realargs[0], realargs[1], realargs[2], realargs[3], + realargs[4], realargs[5], realargs[6])); + + passargs = (void *)(realargs + 1); + switch (realargs[0]) { + case SOCKSYS_ACCEPT: + return accept(p, passargs, retval); + case SOCKSYS_BIND: + return bind(p, passargs, retval); + case SOCKSYS_CONNECT: + return connect(p, passargs, retval); + case SOCKSYS_GETPEERNAME: + return getpeername(p, passargs, retval); + case SOCKSYS_GETSOCKNAME: + return getsockname(p, passargs, retval); + case SOCKSYS_GETSOCKOPT: + return getsockopt(p, passargs, retval); + case SOCKSYS_LISTEN: + return listen(p, passargs, retval); + case SOCKSYS_RECV: + realargs[5] = realargs[6] = 0; + /* FALLTHROUGH */ + case SOCKSYS_RECVFROM: + return recvfrom(p, passargs, retval); + case SOCKSYS_SEND: + realargs[5] = realargs[6] = 0; + /* FALLTHROUGH */ + case SOCKSYS_SENDTO: + return sendto(p, passargs, retval); + case SOCKSYS_SETSOCKOPT: + return setsockopt(p, passargs, retval); + case SOCKSYS_SHUTDOWN: + return shutdown(p, passargs, retval); + case SOCKSYS_SOCKET: + return socket(p, passargs, retval); + case SOCKSYS_SELECT: + return select(p, passargs, retval); + case SOCKSYS_GETIPDOMAIN: + return getdomainname(p, passargs, retval); + case SOCKSYS_SETIPDOMAIN: + return setdomainname(p, passargs, retval); + case SOCKSYS_ADJTIME: + return adjtime(p, passargs, retval); + case SOCKSYS_SETREUID: + return setreuid(p, passargs, retval); + case SOCKSYS_SETREGID: + return setregid(p, passargs, retval); + case SOCKSYS_GETTIME: + return gettimeofday(p, passargs, retval); + case SOCKSYS_SETTIME: + return settimeofday(p, passargs, retval); + case SOCKSYS_GETITIMER: + return getitimer(p, passargs, retval); + case SOCKSYS_SETITIMER: + return setitimer(p, passargs, retval); default: - - printf("ss_convert_struct: not expecting system_type %d\n", system_type); - break; - - } - return(EINVAL); -} - -/* note sockaddr_un linux unsigned short fam, 108 path - BSD uchar , uchar 104 */ -int -ss_atn(alien, indicator) - char *alien; - int indicator; -{ -int error; - - switch (indicator) { - - case SS_STRUCT_ARPREQ: - /* compatible */ - return(0); - - case SS_STRUCT_IFCONF: - /* compatible */ - return(0); - - case SS_STRUCT_IFREQ: - /* length OK - more unions - function dependent */ - return(0); - - case SS_STRUCT_ORTENTRY: - /* compatible */ - return(0); - - case SS_STRUCT_SOCKADDR:{ - struct native_hdr { - u_char len; - u_char family; - }; - union hdr_part { - struct native_hdr native; - u_short alien_family; - } hdr; - - if(error = copyin((caddr_t)alien,(caddr_t)&hdr,sizeof(hdr))) - return(error); - if(ss_debug > 1) - printf("ss_atn:copyin 0x%x\n",hdr.alien_family); - - if( hdr.alien_family < AF_MAX){ - hdr.native.family = hdr.alien_family >> 8; /* 386 endianess */ - /* OR LEN FOM A PARAM ? */ - hdr.native.len = sizeof(struct sockaddr); - if(ss_debug > 1) - printf("ss_atn:copyout 0x%x\n",hdr.alien_family); - error = copyout((caddr_t)&hdr,(caddr_t)alien,sizeof(hdr)); - return(error); - } - else { - printf("ss_atn: sa_family = %d\n", hdr.alien_family); - return(EINVAL); - } - - } - - case SS_STRUCT_SOCKNEWPROTO: - /* don't have */ - printf("ss_atn: not expecting SS_STRUCT_SOCKNEWPROTO\n"); - return(EINVAL); - - default: - printf("ss_atn: not expecting case %d\n",indicator); - return(EINVAL); - - } -} - -/* note sockaddr_un linux unsigned short fam, 108 path - BSD uchar , uchar 104 */ -int -ss_nta(alien, indicator) - char *alien; - int indicator; -{ -int error; - - switch (indicator) { - - case SS_STRUCT_ARPREQ: - /* compatible */ - return(0); - - case SS_STRUCT_IFCONF: - /* compatible */ - return(0); - - case SS_STRUCT_IFREQ: - /* length OK - more unions - function dependent */ - return(0); - - case SS_STRUCT_ORTENTRY: - /* compatible */ - return(0); - - case SS_STRUCT_SOCKADDR:{ - struct native_hdr { - u_char len; - u_char family; - }; - union hdr_part { - struct native_hdr native; - u_short alien_family; - } hdr; - - if(error = copyin((caddr_t)alien,(caddr_t)&hdr,sizeof(hdr))) - return(error); - if(ss_debug > 1) - printf("ss_nta:copyin 0x%x\n",hdr.alien_family); - hdr.alien_family = hdr.native.family; - if(ss_debug > 1) - printf("ss_nta:copyout 0x%x\n",hdr.alien_family); - error = copyout((caddr_t)&hdr,(caddr_t)alien,sizeof(hdr)); - return(error); - } - - case SS_STRUCT_SOCKNEWPROTO: - /* don't have */ - printf("ss_nta: not expecting SS_STRUCT_SOCKNEWPROTO\n"); - return(EINVAL); - - default: - printf("ss_nta: not expecting case %d\n",indicator); - return(EINVAL); - + printf("socksys unknown %08x %08x %08x %08x %08x %08x %08x\n", + realargs[0], realargs[1], realargs[2], realargs[3], + realargs[4], realargs[5], realargs[6]); + return EINVAL; } + /* NOTREACHED */ } diff --git a/sys/i386/ibcs2/ibcs2_socksys.h b/sys/i386/ibcs2/ibcs2_socksys.h index fc5b2e2..f0f29f21 100644 --- a/sys/i386/ibcs2/ibcs2_socksys.h +++ b/sys/i386/ibcs2/ibcs2_socksys.h @@ -1,21 +1,15 @@ -/*- - * Copyright (c) 1994 Mostyn Lewis +/* + * Copyright (c) 1994, 1995 Scott Bartram + * Copyright (c) 1994 Arne H Juul * All rights reserved. * - * This software is based on code which is: - * Copyright (c) 1994 Mike Jagdis (jaggy@purplet.demon.co.uk) - * * 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 - * in this position and unchanged. - * 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 withough specific prior written permission + * notice, this list of conditions and the following disclaimer. + * 2. 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 @@ -27,370 +21,106 @@ * 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. - * - * $Id: ibcs2_socksys.h,v 1.2 1994/10/17 22:13:10 sos Exp $ */ -struct ss_call { - int arg[7]; -}; - -/* Alien socket */ -struct alien_sockaddr { - unsigned short sa_family; /* address family, AF_xxx */ - char sa_data[14]; /* 14 bytes of protocol address */ -}; - -struct alien_in_addr { - unsigned long int s_addr; -}; - -#define __ALIEN_SOCK_SIZE__ 16 /* sizeof(struct alien_sockaddr)*/ -struct alien_sockaddr_in { - short int sin_family; /* Address family */ - unsigned short int sin_port; /* Port number */ - struct alien_in_addr sin_addr; /* Internet address */ - unsigned char __filling[__ALIEN_SOCK_SIZE__ - sizeof(short int) - - sizeof(unsigned short int) - sizeof(struct alien_in_addr)]; -}; - -struct sgdomarg { - char *name; - int namelen; -}; -struct lstatarg { - char *fname; - void *statb; +#ifndef _IBCS2_SOCKSYS_H +#define _IBCS2_SOCKSYS_H 1 + +#include <sys/ioccom.h> +#include <i386/ibcs2/ibcs2_types.h> + +#define SOCKSYS_ACCEPT 1 +#define SOCKSYS_BIND 2 +#define SOCKSYS_CONNECT 3 +#define SOCKSYS_GETPEERNAME 4 +#define SOCKSYS_GETSOCKNAME 5 +#define SOCKSYS_GETSOCKOPT 6 +#define SOCKSYS_LISTEN 7 +#define SOCKSYS_RECV 8 +#define SOCKSYS_RECVFROM 9 +#define SOCKSYS_SEND 10 +#define SOCKSYS_SENDTO 11 +#define SOCKSYS_SETSOCKOPT 12 +#define SOCKSYS_SHUTDOWN 13 +#define SOCKSYS_SOCKET 14 +#define SOCKSYS_SELECT 15 +#define SOCKSYS_GETIPDOMAIN 16 +#define SOCKSYS_SETIPDOMAIN 17 +#define SOCKSYS_ADJTIME 18 +#define SOCKSYS_SETREUID 19 +#define SOCKSYS_SETREGID 20 +#define SOCKSYS_GETTIME 21 +#define SOCKSYS_SETTIME 22 +#define SOCKSYS_GETITIMER 23 +#define SOCKSYS_SETITIMER 24 + +#define IBCS2_SIOCSHIWAT _IOW('S', 1, int) +#define IBCS2_SIOCGHIWAT _IOR('S', 2, int) +#define IBCS2_SIOCSLOWAT _IOW('S', 3, int) +#define IBCS2_SIOCGLOWAT _IOR('S', 4, int) +#define IBCS2_SIOCATMARK _IOR('S', 5, int) +#define IBCS2_SIOCSPGRP _IOW('S', 6, int) +#define IBCS2_SIOCGPGRP _IOR('S', 7, int) +#define IBCS2_FIONREAD _IOR('S', 8, int) +#define IBCS2_FIONBIO _IOW('S', 9, int) +#define IBCS2_FIOASYNC _IOW('S', 10, int) +#define IBCS2_SIOCPROTO _IOW('S', 11, struct socknewproto) +#define IBCS2_SIOCGETNAME _IOR('S', 12, struct sockaddr) +#define IBCS2_SIOCGETPEER _IOR('S', 13, struct sockaddr) +#define IBCS2_IF_UNITSEL _IOW('S', 14, int) +#define IBCS2_SIOCXPROTO _IO('S', 15) + +#define IBCS2_SIOCADDRT _IOW('R', 9, struct rtentry) +#define IBCS2_SIOCDELRT _IOW('R', 10, struct rtentry) + +#define IBCS2_SIOCSIFADDR _IOW('I', 11, struct ifreq) +#define IBCS2_SIOCGIFADDR _IOWR('I', 12, struct ifreq) +#define IBCS2_SIOCSIFDSTADDR _IOW('I', 13, struct ifreq) +#define IBCS2_SIOCGIFDSTADDR _IOWR('I', 14, struct ifreq) +#define IBCS2_SIOCSIFFLAGS _IOW('I', 15, struct ifreq) +#define IBCS2_SIOCGIFFLAGS _IOWR('I', 16, struct ifreq) +#define IBCS2_SIOCGIFCONF _IOWR('I', 17, struct ifconf) +#define IBCS2_SIOCSIFMTU _IOW('I', 21, struct ifreq) +#define IBCS2_SIOCGIFMTU _IOWR('I', 22, struct ifreq) +#define IBCS2_SIOCIFDETACH _IOW('I', 26, struct ifreq) +#define IBCS2_SIOCGENPSTATS _IOWR('I', 27, struct ifreq) +#define IBCS2_SIOCX25XMT _IOWR('I', 29, struct ifreq) +#define IBCS2_SIOCX25RCV _IOWR('I', 30, struct ifreq) +#define IBCS2_SIOCX25TBL _IOWR('I', 31, struct ifreq) +#define IBCS2_SIOCGIFBRDADDR _IOWR('I', 32, struct ifreq) +#define IBCS2_SIOCSIFBRDADDR _IOW('I', 33, struct ifreq) +#define IBCS2_SIOCGIFNETMASK _IOWR('I', 34, struct ifreq) +#define IBCS2_SIOCSIFNETMASK _IOW('I', 35, struct ifreq) +#define IBCS2_SIOCGIFMETRIC _IOWR('I', 36, struct ifreq) +#define IBCS2_SIOCSIFMETRIC _IOW('I', 37, struct ifreq) +#define IBCS2_SIOCSARP _IOW('I', 38, struct arpreq) +#define IBCS2_SIOCGARP _IOWR('I', 39, struct arpreq) +#define IBCS2_SIOCDARP _IOW('I', 40, struct arpreq) +#define IBCS2_SIOCSIFNAME _IOW('I', 41, struct ifreq) +#define IBCS2_SIOCGIFONEP _IOWR('I', 42, struct ifreq) +#define IBCS2_SIOCSIFONEP _IOW('I', 43, struct ifreq) +#define IBCS2_SIOCGENADDR _IOWR('I', 65, struct ifreq) +#define IBCS2_SIOCSOCKSYS _IOW('I', 66, struct socksysreq) + +struct socksysreq { + int realargs[7]; }; struct socknewproto { - int family; /* address family (AF_INET, etc.) */ - int type; /* protocol type (SOCK_STREAM, etc.) */ - int proto; /* per family proto number */ - dev_t dev; /* major/minor to use (must be a clone) */ - int flags; /* protosw flags */ -}; - -/* System type ordinals */ -#define SS_FREEBSD 0 -#define SS_SYSVR4 1 -#define SS_SYSVR3 2 -#define SS_SCO_32 3 -#define SS_WYSE_321 4 -#define SS_ISC 5 -#define SS_LINUX 6 - - -/* Socksys macros */ -#define IOCTL(cmd) \ - if(error = ss_IOCTL(fp, cmd, arg, p))\ - return(error); -#define SYSCALL(number,conv_arg,indicator) \ - if(error = ss_SYSCALL(number,conv_arg,indicator,arg,p,retval))\ - return(error); -#define SYSCALL_N(number,conv_arg,indicator) \ - arg = (caddr_t)(((int *)arg) - 1);\ - if(error = ss_SYSCALL(number,conv_arg,indicator,arg,p,retval))\ - return(error); -#define SYSCALLX(number,arg) (*sysent[number].sy_call)(p, (caddr_t)arg, retval) -#define SYSCALL_RETURN(number) SYSCALL(number) ; IBCS2_MAGIC_RETURN - -/* Socksys commands */ -#define CMD_SO_ACCEPT 1 -#define CMD_SO_BIND 2 -#define CMD_SO_CONNECT 3 -#define CMD_SO_GETPEERNAME 4 -#define CMD_SO_GETSOCKNAME 5 -#define CMD_SO_GETSOCKOPT 6 -#define CMD_SO_LISTEN 7 -#define CMD_SO_RECV 8 -#define CMD_SO_RECVFROM 9 -#define CMD_SO_SEND 10 -#define CMD_SO_SENDTO 11 -#define CMD_SO_SETSOCKOPT 12 -#define CMD_SO_SHUTDOWN 13 -#define CMD_SO_SOCKET 14 -#define CMD_SO_SELECT 15 -#define CMD_SO_GETIPDOMAIN 16 -#define CMD_SO_SETIPDOMAIN 17 -#define CMD_SO_ADJTIME 18 -#define CMD_SO_SETREUID 19 -#define CMD_SO_SETREGID 20 -#define CMD_SO_GETTIME 21 -#define CMD_SO_SETTIME 22 -#define CMD_SO_GETITIMER 23 -#define CMD_SO_SETITIMER 24 - -#define CMD_SO_SS_DEBUG 255 - -/* socksys ioctls */ -#define SS_IOCPARM_MASK 0x7f /* parameters must be < 128 bytes */ -#define SS_IOC_VOID 0x20000000 /* no parameters */ -#define SS_IOC_OUT 0x40000000 /* copy out parameters */ -#define SS_IOC_IN 0x80000000 /* copy in parameters */ -#define SS_IOC_INOUT (SS_IOC_IN|SS_IOC_OUT) - -#define SS_IO(x,y) (SS_IOC_VOID|(x<<8)|y) -#define SS_IOR(x,y,t) (SS_IOC_OUT|((sizeof(t)&SS_IOCPARM_MASK)<<16)|(x<<8)|y) -#define SS_IOW(x,y,t) (SS_IOC_IN|((sizeof(t)&SS_IOCPARM_MASK)<<16)|(x<<8)|y) -#define SS_IOWR(x,y,t) (SS_IOC_INOUT|((sizeof(t)&SS_IOCPARM_MASK)<<16)|(x<<8)|y) - -#define SS_SIOCSHIWAT SS_IOW ('S', 1, int) /* set high watermark */ -#define SS_SIOCGHIWAT SS_IOR ('S', 2, int) /* get high watermark */ -#define SS_SIOCSLOWAT SS_IOW ('S', 3, int) /* set low watermark */ -#define SS_SIOCGLOWAT SS_IOR ('S', 4, int) /* get low watermark */ -#define SS_SIOCATMARK SS_IOR ('S', 5, int) /* at oob mark? */ -#define SS_SIOCSPGRP SS_IOW ('S', 6, int) /* set process group */ -#define SS_SIOCGPGRP SS_IOR ('S', 7, int) /* get process group */ -#define SS_FIONREAD SS_IOR ('S', 8, int) -#define SS_FIONBIO SS_IOW ('S', 9, int) -#define SS_FIOASYNC SS_IOW ('S', 10, int) -#define SS_SIOCPROTO SS_IOW ('S', 11, struct socknewproto) /* link proto */ -#define SS_SIOCGETNAME SS_IOR ('S', 12, struct sockaddr) /* getsockname */ -#define SS_SIOCGETPEER SS_IOR ('S', 13,struct sockaddr) /* getpeername */ -#define SS_IF_UNITSEL SS_IOW ('S', 14, int)/* set unit number */ -#define SS_SIOCXPROTO SS_IO ('S', 15) /* empty proto table */ - -#define SS_SIOCADDRT SS_IOW ('R', 9, struct ortentry) /* add route */ -#define SS_SIOCDELRT SS_IOW ('R', 10, struct ortentry)/* delete route */ - -#define SS_SIOCSIFADDR SS_IOW ('I', 11, struct ifreq)/* set ifnet address */ -#define SS_SIOCGIFADDR SS_IOWR('I', 12, struct ifreq)/* get ifnet address */ -#define SS_SIOCSIFDSTADDR SS_IOW ('I', 13, struct ifreq)/* set p-p address */ -#define SS_SIOCGIFDSTADDR SS_IOWR('I', 14,struct ifreq) /* get p-p address */ -#define SS_SIOCSIFFLAGS SS_IOW ('I', 15, struct ifreq)/* set ifnet flags */ -#define SS_SIOCGIFFLAGS SS_IOWR('I', 16, struct ifreq)/* get ifnet flags */ -#define SS_SIOCGIFCONF SS_IOWR('I', 17, struct ifconf)/* get ifnet list */ - -#define SS_SIOCSIFMTU SS_IOW ('I', 21, struct ifreq)/* get if_mtu */ -#define SS_SIOCGIFMTU SS_IOWR('I', 22, struct ifreq)/* set if_mtu */ - -#define SS_SIOCIFDETACH SS_IOW ('I', 26, struct ifreq)/* detach interface */ -#define SS_SIOCGENPSTATS SS_IOWR('I', 27, struct ifreq)/* get ENP stats */ - -#define SS_SIOCX25XMT SS_IOWR('I', 29, struct ifreq)/* start a slp proc in x25if */ -#define SS_SIOCX25RCV SS_IOWR('I', 30, struct ifreq)/* start a slp proc in x25if */ -#define SS_SIOCX25TBL SS_IOWR('I', 31, struct ifreq)/* xfer lun table to kernel */ - -#define SS_SIOCGIFBRDADDR SS_IOWR('I', 32, struct ifreq)/* get broadcast addr */ -#define SS_SIOCSIFBRDADDR SS_IOW ('I', 33, struct ifreq)/* set broadcast addr */ -#define SS_SIOCGIFNETMASK SS_IOWR('I', 34, struct ifreq)/* get net addr mask */ -#define SS_SIOCSIFNETMASK SS_IOW ('I', 35, struct ifreq)/* set net addr mask */ -#define SS_SIOCGIFMETRIC SS_IOWR('I', 36, struct ifreq)/* get IF metric */ -#define SS_SIOCSIFMETRIC SS_IOW ('I', 37, struct ifreq)/* set IF metric */ - -#define SS_SIOCSARP SS_IOW ('I', 38, struct arpreq)/* set arp entry */ -#define SS_SIOCGARP SS_IOWR('I', 39, struct arpreq)/* get arp entry */ -#define SS_SIOCDARP SS_IOW ('I', 40, struct arpreq)/* delete arp entry */ - -#define SS_SIOCSIFNAME SS_IOW ('I', 41, struct ifreq)/* set interface name */ -#define SS_SIOCGIFONEP SS_IOWR('I', 42, struct ifreq)/* get 1-packet parms */ -#define SS_SIOCSIFONEP SS_IOW ('I', 43, struct ifreq)/* set 1-packet parms */ - -#define SS_SIOCGENADDR SS_IOWR('I', 65, struct ifreq)/* Get ethernet addr */ - -#define SS_SIOCSOCKSYS SS_IOW ('I', 66, struct ss_call)/* ss syscall */ - - -/* - * NFS/NIS has a pseudo device called /dev/nfsd which may accept ioctl - * calls. /dev/nfsd is linked to /dev/socksys. - */ - -#define NIOCNFSD 1 -#define NIOCOLDGETFH 2 -#define NIOCASYNCD 3 -#define NIOCSETDOMNAM 4 -#define NIOCGETDOMNAM 5 -#define NIOCCLNTHAND 6 -#define NIOCEXPORTFS 7 -#define NIOCGETFH 8 -#define NIOCLSTAT 9 - - -/* - * noso - */ - -#define SO_ORDREL 0xff02 -#define SO_IMASOCKET 0xff03 -#define SO_PROTOTYPE 0xff04 -/* Check below */ -#define SO_NO_CHECK 11 -#define SO_PRIORITY 12 - -/* - * convert - */ - -/* Structure conversion indicators */ - -#define SS_STRUCT_ARPREQ 1 -#define SS_STRUCT_IFCONF 2 -#define SS_STRUCT_IFREQ 3 -#define SS_STRUCT_ORTENTRY 4 -#define SS_STRUCT_SOCKADDR 5 -#define SS_STRUCT_SOCKNEWPROTO 6 - -#define SS_ALIEN_TO_NATIVE 1 -#define SS_NATIVE_TO_ALIEN 2 - -struct whatever { - int from, to; - unsigned char *conversion; - unsigned char all_the_same; - struct whatever *more; -}; - - -extern struct whatever *af_whatevers[]; -extern struct whatever *type_whatevers[]; -extern struct whatever *sopt_whatevers[]; -extern struct whatever *struct_whatevers[]; - -extern int ss_convert(struct whatever **what, int *this, int otherwise); -extern int ss_convert_struct(char *alien, int indicator, int direction); - -/* - * convert af - */ - - -static struct whatever af_whatevers_all[] = { - { 0, 2, NULL, 0, 0 }, - { -1 } -}; - - -struct whatever *af_whatevers[] = { - NULL, /* FreeBSD */ - af_whatevers_all, /* SysVR4 */ - af_whatevers_all, /* SysVR3 */ - af_whatevers_all, /* SCO 3.2.[24] */ - af_whatevers_all, /* Wyse Unix V/386 3.2.1 */ - af_whatevers_all, /* ISC */ - af_whatevers_all /* Linux */ -}; - -/* - * convert sopt - */ - -static struct whatever sopt_whatevers_all[] = { - { 0x0001, 0x0001, (char *)SO_DEBUG, 0, 0 }, - { 0x0002, 0x0002, (char *)SO_ACCEPTCONN, 0, 0 }, - { 0x0004, 0x0004, (char *)SO_REUSEADDR, 0, 0 }, - { 0x0008, 0x0008, (char *)SO_KEEPALIVE, 0, 0 }, - { 0x0010, 0x0010, (char *)SO_DONTROUTE, 0, 0 }, - { 0x0020, 0x0020, (char *)SO_BROADCAST, 0, 0 }, - { 0x0040, 0x0040, (char *)SO_USELOOPBACK, 0, 0 }, - { 0x0080, 0x0080, (char *)SO_LINGER, 0, 0 }, - { 0x0100, 0x0100, (char *)SO_OOBINLINE, 0, 0 }, - { 0x0200, 0x0200, (char *)SO_ORDREL, 0, 0 }, - { 0x0400, 0x0400, (char *)SO_IMASOCKET, 0, 0 }, - { 0x1001, 0x1001, (char *)SO_SNDBUF, 0, 0 }, - { 0x1002, 0x1001, (char *)SO_RCVBUF, 0, 0 }, - { 0x1003, 0x1001, (char *)SO_SNDLOWAT, 0, 0 }, - { 0x1004, 0x1001, (char *)SO_RCVLOWAT, 0, 0 }, - { 0x1005, 0x1001, (char *)SO_SNDTIMEO, 0, 0 }, - { 0x1006, 0x1001, (char *)SO_RCVTIMEO, 0, 0 }, - { 0x1007, 0x1001, (char *)SO_ERROR, 0, 0 }, - { 0x1008, 0x1001, (char *)SO_TYPE, 0, 0 }, - { 0x1009, 0x1001, (char *)SO_PROTOTYPE, 0, 0 }, - { -1 } -}; - - -struct whatever *sopt_whatevers[] = { - NULL, /* FreeBSD */ - sopt_whatevers_all, /* SysVR4 */ - sopt_whatevers_all, /* SysVR3 */ - sopt_whatevers_all, /* SCO 3.2.[24] */ - sopt_whatevers_all, /* Wyse Unix V/386 3.2.1 */ - sopt_whatevers_all, /* ISC */ - sopt_whatevers_all /* Linux */ -}; - -/* - * convert struct - */ - -static struct whatever struct_whatever_typeI_ranges[] = { - { 11, 16, (char *)SS_STRUCT_IFREQ , 1, 0 }, /* OK */ - { 17, 17, (char *)SS_STRUCT_IFCONF , 1, 0 }, /* OK */ - { 21, 22, (char *)SS_STRUCT_IFREQ , 1, 0 }, /* SIZE OK */ - { 26, 27, (char *)SS_STRUCT_IFREQ , 1, 0 }, /* SIZE OK */ - { 29, 37, (char *)SS_STRUCT_IFREQ , 1, 0 }, /* SIZE OK */ - { 38, 40, (char *)SS_STRUCT_ARPREQ , 1, 0 }, /* OK */ - { 41, 43, (char *)SS_STRUCT_IFREQ , 1, 0 }, /* SIZE OK */ - { 65, 65, (char *)SS_STRUCT_IFREQ , 1, 0 }, /* SIZE OK */ - { -1 } -}; - -static struct whatever struct_whatever_typeR_ranges[] = { - { 9, 10, (char *)SS_STRUCT_ORTENTRY , 1, 0 }, /* SIZE OK */ - { -1 } -}; - -static struct whatever struct_whatever_typeS_ranges[] = { - { 1, 10, 0 , 1, 0 }, - { 11, 11, (char *)SS_STRUCT_SOCKNEWPROTO, 1, 0 }, /* NO SUPPORT */ - { 12, 13, (char *)SS_STRUCT_SOCKADDR , 1, 0 }, /* len and family */ - { 14, 15, 0 , 1, 0 }, - { -1 } + int family; + int type; + int proto; + ibcs2_dev_t dev; + int flags; }; -static struct whatever struct_whatevers_all[] = { - { 'I', 'I', 0, 0, struct_whatever_typeI_ranges }, - { 'R', 'R', 0, 0, struct_whatever_typeR_ranges }, - { 'S', 'S', 0, 0, struct_whatever_typeS_ranges }, - { -1 } +struct ibcs2_socksys_args { + int fd; + int magic; + caddr_t argsp; }; -struct whatever *struct_whatevers[] = { - struct_whatevers_all, /* FreeBSD */ - struct_whatevers_all, /* SysVR4 */ - struct_whatevers_all, /* SysVR3 */ - struct_whatevers_all, /* SCO 3.2.[24] */ - struct_whatevers_all, /* Wyse Unix V/386 3.2.1 */ - struct_whatevers_all, /* ISC */ - struct_whatevers_all /* Linux */ -}; - -int ss_struct_native_sizes[] = { - sizeof(struct arpreq), - sizeof(struct ifconf), - sizeof(struct ifreq), - sizeof(struct rtentry), - sizeof(struct sockaddr), - sizeof(struct socknewproto) -}; - -/* - * convert type - */ +int ibcs2_socksys __P((struct proc *, struct ibcs2_socksys_args *, int *)); -static char type_conversion_SysVr4_range1[] = { - SOCK_DGRAM, - SOCK_STREAM, - 0, - SOCK_RAW, - SOCK_RDM, - SOCK_SEQPACKET -}; - -static struct whatever type_whatevers_SysVr4[] = { - { 1, 6, type_conversion_SysVr4_range1, 0 }, - { -1 } -}; - -struct whatever *type_whatevers[] = { - NULL, /* FreeBSD */ - type_whatevers_SysVr4, /* SysVR4 */ - NULL, /* SysVR3 */ - NULL, /* SCO 3.2.[24] */ - NULL, /* Wyse Unix V/386 3.2.1 */ - NULL, /* ISC */ - NULL /* Linux */ -}; +#endif /* _IBCS2_SOCKSYS_H */ diff --git a/sys/i386/ibcs2/ibcs2_stat.c b/sys/i386/ibcs2/ibcs2_stat.c index a9d5c4b..529d185 100644 --- a/sys/i386/ibcs2/ibcs2_stat.c +++ b/sys/i386/ibcs2/ibcs2_stat.c @@ -1,5 +1,6 @@ /* * Copyright (c) 1995 Scott Bartram + * Copyright (c) 1995 Steven Wallace * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -37,35 +38,41 @@ #include <sys/mount.h> #include <sys/malloc.h> #include <sys/vnode.h> -#include <sys/syscallargs.h> +#include <sys/sysctl.h> +#include <sys/sysproto.h> #include <vm/vm.h> -#include <compat/ibcs2/ibcs2_types.h> -#include <compat/ibcs2/ibcs2_fcntl.h> -#include <compat/ibcs2/ibcs2_signal.h> -#include <compat/ibcs2/ibcs2_stat.h> -#include <compat/ibcs2/ibcs2_statfs.h> -#include <compat/ibcs2/ibcs2_syscallargs.h> -#include <compat/ibcs2/ibcs2_ustat.h> -#include <compat/ibcs2/ibcs2_util.h> -#include <compat/ibcs2/ibcs2_utsname.h> +#include <i386/ibcs2/ibcs2_types.h> +#include <i386/ibcs2/ibcs2_fcntl.h> +#include <i386/ibcs2/ibcs2_signal.h> +#include <i386/ibcs2/ibcs2_stat.h> +#include <i386/ibcs2/ibcs2_statfs.h> +#include <i386/ibcs2/ibcs2_proto.h> +#include <i386/ibcs2/ibcs2_ustat.h> +#include <i386/ibcs2/ibcs2_util.h> +#include <i386/ibcs2/ibcs2_utsname.h> +static void bsd_stat2ibcs_stat __P((struct stat *, struct ibcs2_stat *)); +static int cvt_statfs __P((struct statfs *, caddr_t, int)); static void bsd_stat2ibcs_stat(st, st4) - struct ostat *st; + struct stat *st; struct ibcs2_stat *st4; { bzero(st4, sizeof(*st4)); - st4->st_dev = (ibcs2_dev_t)st->st_dev; - st4->st_ino = (ibcs2_ino_t)st->st_ino; + st4->st_dev = (ibcs2_dev_t)st->st_dev; + st4->st_ino = (ibcs2_ino_t)st->st_ino; st4->st_mode = (ibcs2_mode_t)st->st_mode; - st4->st_nlink = (ibcs2_nlink_t)st->st_nlink; - st4->st_uid = (ibcs2_uid_t)st->st_uid; - st4->st_gid = (ibcs2_gid_t)st->st_gid; + st4->st_nlink= (ibcs2_nlink_t)st->st_nlink; + st4->st_uid = (ibcs2_uid_t)st->st_uid; + st4->st_gid = (ibcs2_gid_t)st->st_gid; st4->st_rdev = (ibcs2_dev_t)st->st_rdev; - st4->st_size = (ibcs2_off_t)st->st_size; + if (st->st_size < (quad_t)1 << 32) + st4->st_size = (ibcs2_off_t)st->st_size; + else + st4->st_size = -2; st4->st_atim = (ibcs2_time_t)st->st_atime; st4->st_mtim = (ibcs2_time_t)st->st_mtime; st4->st_ctim = (ibcs2_time_t)st->st_ctime; @@ -144,17 +151,19 @@ ibcs2_stat(p, uap, retval) struct ibcs2_stat_args *uap; int *retval; { - struct ostat st; + struct stat st; struct ibcs2_stat ibcs2_st; - struct compat_43_stat_args cup; + struct stat_args cup; int error; caddr_t sg = stackgap_init(); CHECKALTEXIST(p, &sg, SCARG(uap, path)); SCARG(&cup, path) = SCARG(uap, path); SCARG(&cup, ub) = stackgap_alloc(&sg, sizeof(st)); - if (error = compat_43_stat(p, &cup, retval)) + + if (error = stat(p, &cup, retval)) return error; + if (error = copyin(SCARG(&cup, ub), &st, sizeof(st))) return error; bsd_stat2ibcs_stat(&st, &ibcs2_st); @@ -168,17 +177,19 @@ ibcs2_lstat(p, uap, retval) struct ibcs2_lstat_args *uap; int *retval; { - struct ostat st; + struct stat st; struct ibcs2_stat ibcs2_st; - struct compat_43_lstat_args cup; + struct lstat_args cup; int error; caddr_t sg = stackgap_init(); CHECKALTEXIST(p, &sg, SCARG(uap, path)); SCARG(&cup, path) = SCARG(uap, path); SCARG(&cup, ub) = stackgap_alloc(&sg, sizeof(st)); - if (error = compat_43_lstat(p, &cup, retval)) + + if (error = lstat(p, &cup, retval)) return error; + if (error = copyin(SCARG(&cup, ub), &st, sizeof(st))) return error; bsd_stat2ibcs_stat(&st, &ibcs2_st); @@ -192,16 +203,18 @@ ibcs2_fstat(p, uap, retval) struct ibcs2_fstat_args *uap; int *retval; { - struct ostat st; + struct stat st; struct ibcs2_stat ibcs2_st; - struct compat_43_fstat_args cup; + struct fstat_args cup; int error; caddr_t sg = stackgap_init(); SCARG(&cup, fd) = SCARG(uap, fd); SCARG(&cup, sb) = stackgap_alloc(&sg, sizeof(st)); - if (error = compat_43_fstat(p, &cup, retval)) + + if (error = fstat(p, &cup, retval)) return error; + if (error = copyin(SCARG(&cup, sb), &st, sizeof(st))) return error; bsd_stat2ibcs_stat(&st, &ibcs2_st); @@ -219,7 +232,6 @@ ibcs2_utssys(p, uap, retval) case 0: /* uname(2) */ { struct ibcs2_utsname sut; - extern char ostype[], machine[], osrelease[]; bzero(&sut, ibcs2_utsname_len); bcopy(ostype, sut.sysname, sizeof(sut.sysname) - 1); diff --git a/sys/i386/ibcs2/ibcs2_stat.h b/sys/i386/ibcs2/ibcs2_stat.h index 2eb0102..97928be 100644 --- a/sys/i386/ibcs2/ibcs2_stat.h +++ b/sys/i386/ibcs2/ibcs2_stat.h @@ -33,7 +33,7 @@ #ifndef _IBCS2_STAT_H #define _IBCS2_STAT_H -#include <compat/ibcs2/ibcs2_types.h> +#include <i386/ibcs2/ibcs2_types.h> struct ibcs2_stat { ibcs2_dev_t st_dev; diff --git a/sys/i386/ibcs2/ibcs2_syscall.h b/sys/i386/ibcs2/ibcs2_syscall.h index f02ad42..eb4f2fb 100644 --- a/sys/i386/ibcs2/ibcs2_syscall.h +++ b/sys/i386/ibcs2/ibcs2_syscall.h @@ -2,7 +2,7 @@ * System call numbers. * * DO NOT EDIT-- this file is automatically generated. - * created from NetBSD: syscalls.master,v 1.4 1995/03/14 15:12:52 scottb Exp + * created from Id: syscalls.master,v 1.1 1995/10/06 15:12:52 swallace Exp */ #define IBCS2_SYS_syscall 0 @@ -12,7 +12,7 @@ #define IBCS2_SYS_write 4 #define IBCS2_SYS_ibcs2_open 5 #define IBCS2_SYS_close 6 -#define IBCS2_SYS_ibcs2_waitsys 7 +#define IBCS2_SYS_ibcs2_wait 7 #define IBCS2_SYS_ibcs2_creat 8 #define IBCS2_SYS_link 9 #define IBCS2_SYS_ibcs2_unlink 10 @@ -24,17 +24,20 @@ #define IBCS2_SYS_ibcs2_chown 16 #define IBCS2_SYS_obreak 17 #define IBCS2_SYS_ibcs2_stat 18 -#define IBCS2_SYS_compat_43_lseek 19 +#define IBCS2_SYS_ibcs2_lseek 19 #define IBCS2_SYS_getpid 20 #define IBCS2_SYS_ibcs2_mount 21 #define IBCS2_SYS_ibcs2_umount 22 #define IBCS2_SYS_ibcs2_setuid 23 #define IBCS2_SYS_getuid 24 #define IBCS2_SYS_ibcs2_stime 25 +#define IBCS2_SYS_ptrace 26 #define IBCS2_SYS_ibcs2_alarm 27 #define IBCS2_SYS_ibcs2_fstat 28 #define IBCS2_SYS_ibcs2_pause 29 #define IBCS2_SYS_ibcs2_utime 30 +#define IBCS2_SYS_ibcs2_stty 31 +#define IBCS2_SYS_ibcs2_gtty 32 #define IBCS2_SYS_ibcs2_access 33 #define IBCS2_SYS_ibcs2_nice 34 #define IBCS2_SYS_ibcs2_statfs 35 @@ -42,19 +45,23 @@ #define IBCS2_SYS_ibcs2_kill 37 #define IBCS2_SYS_ibcs2_fstatfs 38 #define IBCS2_SYS_ibcs2_pgrpsys 39 +#define IBCS2_SYS_ibcs2_xenix 40 #define IBCS2_SYS_dup 41 #define IBCS2_SYS_pipe 42 #define IBCS2_SYS_ibcs2_times 43 +#define IBCS2_SYS_profil 44 #define IBCS2_SYS_ibcs2_plock 45 #define IBCS2_SYS_ibcs2_setgid 46 #define IBCS2_SYS_getgid 47 #define IBCS2_SYS_ibcs2_sigsys 48 #define IBCS2_SYS_ibcs2_msgsys 49 +#define IBCS2_SYS_ibcs2_sysi86 50 #define IBCS2_SYS_ibcs2_shmsys 52 #define IBCS2_SYS_ibcs2_semsys 53 #define IBCS2_SYS_ibcs2_ioctl 54 #define IBCS2_SYS_ibcs2_uadmin 55 #define IBCS2_SYS_ibcs2_utssys 57 +#define IBCS2_SYS_fsync 58 #define IBCS2_SYS_ibcs2_execve 59 #define IBCS2_SYS_umask 60 #define IBCS2_SYS_chroot 61 @@ -75,23 +82,10 @@ #define IBCS2_SYS_ibcs2_getmsg 85 #define IBCS2_SYS_ibcs2_putmsg 86 #define IBCS2_SYS_ibcs2_poll 87 +#define IBCS2_SYS_ibcs2_secure 89 #define IBCS2_SYS_ibcs2_symlink 90 #define IBCS2_SYS_ibcs2_lstat 91 #define IBCS2_SYS_ibcs2_readlink 92 #define IBCS2_SYS_sigreturn 103 -#define IBCS2_SYS_xenix_rdchk 135 -#define IBCS2_SYS_xenix_chsize 138 -#define IBCS2_SYS_xenix_ftime 139 -#define IBCS2_SYS_xenix_nap 140 -#define IBCS2_SYS_select 164 -#define IBCS2_SYS_ibcs2_sigaction 167 -#define IBCS2_SYS_ibcs2_sigprocmask 168 -#define IBCS2_SYS_ibcs2_sigpending 169 -#define IBCS2_SYS_ibcs2_sigsuspend 170 -#define IBCS2_SYS_ibcs2_getgroups 171 -#define IBCS2_SYS_ibcs2_setgroups 172 -#define IBCS2_SYS_ibcs2_sysconf 173 -#define IBCS2_SYS_ibcs2_pathconf 174 -#define IBCS2_SYS_ibcs2_fpathconf 175 -#define IBCS2_SYS_ibcs2_rename 176 -#define IBCS2_SYS_MAXSYSCALL 177 +#define IBCS2_SYS_ibcs2_isc 105 +#define IBCS2_SYS_MAXSYSCALL 128 diff --git a/sys/i386/ibcs2/ibcs2_sysent.c b/sys/i386/ibcs2/ibcs2_sysent.c index 23ce9ce..0453bd6 100644 --- a/sys/i386/ibcs2/ibcs2_sysent.c +++ b/sys/i386/ibcs2/ibcs2_sysent.c @@ -1,500 +1,167 @@ -/*- - * Copyright (c) 1994 Søren Schmidt - * Copyright (c) 1994 Sean Eric Fagan - * All rights reserved. +/* + * System call switch table. * - * 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 - * in this position and unchanged. - * 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 withough 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. - * - * $Id: ibcs2_sysent.c,v 1.1 1994/10/14 08:53:10 sos Exp $ + * DO NOT EDIT-- this file is automatically generated. + * created from Id: syscalls.master,v 1.1 1995/10/06 15:12:52 swallace Exp */ -#include <i386/ibcs2/ibcs2.h> +#include <sys/types.h> #include <sys/param.h> -#include <sys/systm.h> -#include <sys/signal.h> #include <sys/sysent.h> +#include <sys/sysproto.h> +#include <i386/ibcs2/ibcs2_types.h> +#include <i386/ibcs2/ibcs2_signal.h> +#include <i386/ibcs2/ibcs2_statfs.h> +#include <i386/ibcs2/ibcs2_proto.h> -#define NERR 80 /* XXX must match sys/errno.h */ - -/* errno conversion tables */ -int bsd_to_svr3_errno[NERR] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 45, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 32, 33, 34, 11, 91, 92, 93, 94, - 95, 96,118, 97, 98, 99,100,101,102,103, - 104,105,106,107,108, 63,110,111,112,113, - 114,115, 31, 78,116,117,145, 11, 11, 11, - 0, 66, 0, 0, 0, 0, 0, 46, 89, 0, -}; - -/* function defines */ -int ibcs2_access(); -int ibcs2_advfs(); -int ibcs2_alarm(); -int ibcs2_break(); -int ibcs2_chdir(); -int ibcs2_chmod(); -int ibcs2_chown(); -int ibcs2_chroot(); -int ibcs2_cisc(); -int ibcs2_clocal(); -int ibcs2_close(); -int ibcs2_creat(); -int ibcs2_cxenix(); -int ibcs2_dup(); -int ibcs2_exec(); -int ibcs2_exece(); -int ibcs2_exit(); -int ibcs2_fcntl(); -int ibcs2_fork(); -int ibcs2_fstat(); -int ibcs2_fstatfs(); -int ibcs2_fsync(); -int ibcs2_getdents(); -int ibcs2_getgid(); -int ibcs2_getmsg(); -int ibcs2_getpid(); -int ibcs2_getuid(); -int ibcs2_gtime(); -int ibcs2_gtty(); -int ibcs2_ioctl(); -int ibcs2_kill(); -int ibcs2_libattach(); -int ibcs2_libdetach(); -int ibcs2_link(); -int ibcs2_lstat(); -int ibcs2_mkdir(); -int ibcs2_mknod(); -int ibcs2_msgsys(); -int ibcs2_nice(); -int ibcs2_nosys(); -int ibcs2_open(); -int ibcs2_pause(); -int ibcs2_pipe(); -int ibcs2_plock(); -int ibcs2_poll(); -int ibcs2_procids(); -int ibcs2_profil(); -int ibcs2_ptrace(); -int ibcs2_putmsg(); -int ibcs2_read(); -int ibcs2_readlink(); -int ibcs2_rfdebug(); -int ibcs2_rfstart(); -int ibcs2_rfstop(); -int ibcs2_rfsys(); -int ibcs2_rmdir(); -int ibcs2_rmount(); -int ibcs2_rumount(); -int ibcs2_secure(); -int ibcs2_seek(); -int ibcs2_semsys(); -int ibcs2_setgid(); -int ibcs2_setuid(); -int ibcs2_shmsys(); -int ibcs2_sigsys(); -int ibcs2_smount(); -int ibcs2_stat(); -int ibcs2_statfs(); -int ibcs2_stime(); -int ibcs2_stty(); -int ibcs2_sumount(); -int ibcs2_symlink(); -int ibcs2_sync(); -int ibcs2_sysacct(); -int ibcs2_sysfs(); -int ibcs2_sysi86(); -int ibcs2_times(); -int ibcs2_uadmin(); -int ibcs2_ulimit(); -int ibcs2_umask(); -int ibcs2_unadvfs(); -int ibcs2_unlink(); -int ibcs2_utime(); -int ibcs2_utssys(); -int ibcs2_wait(); -int ibcs2_write(); -int ibcs2_traceemu(); /* XXX */ -int sigreturn(); /* XXX */ - -/* ibcs2 svr3 sysent table */ -struct sysent svr3_sysent[] = -{ - 0, ibcs2_nosys, /* 0 = indir */ - 1, ibcs2_exit, /* 1 = exit */ - 0, ibcs2_fork, /* 2 = fork */ - 3, ibcs2_read, /* 3 = read */ - 3, ibcs2_write, /* 4 = write */ - 3, ibcs2_open, /* 5 = open */ - 1, ibcs2_close, /* 6 = close */ - 3, ibcs2_wait, /* 7 = wait */ - 2, ibcs2_creat, /* 8 = creat */ - 2, ibcs2_link, /* 9 = link */ - 1, ibcs2_unlink, /* 10 = unlink */ - 2, ibcs2_exec, /* 11 = exec */ - 1, ibcs2_chdir, /* 12 = chdir */ - 0, ibcs2_gtime, /* 13 = time */ - 3, ibcs2_mknod, /* 14 = mknod */ - 2, ibcs2_chmod, /* 15 = chmod */ - 3, ibcs2_chown, /* 16 = chown */ - 1, ibcs2_break, /* 17 = break */ - 2, ibcs2_stat, /* 18 = stat */ - 3, ibcs2_seek, /* 19 = seek */ - 0, ibcs2_getpid, /* 20 = getpid */ - 6, ibcs2_smount, /* 21 = mount */ - 1, ibcs2_sumount, /* 22 = umount */ - 1, ibcs2_setuid, /* 23 = setuid */ - 0, ibcs2_getuid, /* 24 = getuid */ - 1, ibcs2_stime, /* 25 = stime */ - 4, ibcs2_ptrace, /* 26 = ptrace */ - 1, ibcs2_alarm, /* 27 = alarm */ - 2, ibcs2_fstat, /* 28 = fstat */ - 0, ibcs2_pause, /* 29 = pause */ - 2, ibcs2_utime, /* 30 = utime */ - 2, ibcs2_stty, /* 31 = stty */ - 2, ibcs2_gtty, /* 32 = gtty */ - 2, ibcs2_access, /* 33 = access */ - 1, ibcs2_nice, /* 34 = nice */ - 4, ibcs2_statfs, /* 35 = statfs */ - 0, ibcs2_sync, /* 36 = sync */ - 2, ibcs2_kill, /* 37 = kill */ - 4, ibcs2_fstatfs, /* 38 = fstatfs */ - 1, ibcs2_procids, /* 39 = procids */ - 5, ibcs2_cxenix, /* 40 = XENIX special system call */ - 1, ibcs2_dup, /* 41 = dup */ - 1, ibcs2_pipe, /* 42 = pipe */ - 1, ibcs2_times, /* 43 = times */ - 4, ibcs2_profil, /* 44 = prof */ - 1, ibcs2_plock, /* 45 = proc lock */ - 1, ibcs2_setgid, /* 46 = setgid */ - 0, ibcs2_getgid, /* 47 = getgid */ - 2, ibcs2_sigsys, /* 48 = signal */ - 6, ibcs2_msgsys, /* 49 = IPC message */ - 4, ibcs2_sysi86, /* 50 = i386-specific system call */ - 1, ibcs2_sysacct, /* 51 = turn acct off/on */ - 4, ibcs2_shmsys, /* 52 = shared memory */ - 5, ibcs2_semsys, /* 53 = IPC semaphores */ - 3, ibcs2_ioctl, /* 54 = ioctl */ - 3, ibcs2_uadmin, /* 55 = uadmin */ - 0, ibcs2_nosys, /* 56 = reserved for exch */ - 3, ibcs2_utssys, /* 57 = utssys */ - 1, ibcs2_fsync, /* 58 = fsync */ - 3, ibcs2_exece, /* 59 = exece */ - 1, ibcs2_umask, /* 60 = umask */ - 1, ibcs2_chroot, /* 61 = chroot */ - 3, ibcs2_fcntl, /* 62 = fcntl */ - 2, ibcs2_ulimit, /* 63 = ulimit */ - 0, ibcs2_nosys, /* 64 = nosys */ - 0, ibcs2_nosys, /* 65 = nosys */ - 0, ibcs2_nosys, /* 66 = nosys */ - 0, ibcs2_nosys, /* 67 = file locking call */ - 0, ibcs2_nosys, /* 68 = local system calls */ - 0, ibcs2_nosys, /* 69 = inode open */ - 4, ibcs2_advfs, /* 70 = advfs */ - 1, ibcs2_unadvfs, /* 71 = unadvfs */ - 4, ibcs2_rmount, /* 72 = rmount */ - 1, ibcs2_rumount, /* 73 = rumount */ - 5, ibcs2_rfstart, /* 74 = rfstart */ - 0, ibcs2_nosys, /* 75 = not used */ - 1, ibcs2_rfdebug, /* 76 = rfdebug */ - 0, ibcs2_rfstop, /* 77 = rfstop */ - 6, ibcs2_rfsys, /* 78 = rfsys */ - 1, ibcs2_rmdir, /* 79 = rmdir */ - 2, ibcs2_mkdir, /* 80 = mkdir */ - 4, ibcs2_getdents, /* 81 = getdents */ - 3, ibcs2_libattach, /* 82 = libattach */ - 1, ibcs2_libdetach, /* 83 = libdetach */ - 3, ibcs2_sysfs, /* 84 = sysfs */ - 4, ibcs2_getmsg, /* 85 = getmsg */ - 4, ibcs2_putmsg, /* 86 = putmsg */ - 3, ibcs2_poll, /* 87 = poll */ - 0, ibcs2_nosys, /* 88 = not used */ - 6, ibcs2_secure, /* 89 = secureware */ - 2, ibcs2_symlink, /* 90 = symlink */ - 2, ibcs2_lstat, /* 91 = lstat */ - 3, ibcs2_readlink, /* 92 = readlink */ - 0, ibcs2_nosys, /* 93 = not used */ - 0, ibcs2_nosys, /* 94 = not used */ - 0, ibcs2_nosys, /* 95 = not used */ - 0, ibcs2_nosys, /* 96 = not used */ - 0, ibcs2_nosys, /* 97 = not used */ - 0, ibcs2_nosys, /* 98 = not used */ - 0, ibcs2_nosys, /* 99 = not used */ - 0, ibcs2_nosys, /* 100 = not used */ - 0, ibcs2_nosys, /* 101 = not used */ - 0, ibcs2_nosys, /* 102 = not used */ - 1, sigreturn, /* 103 = BSD sigreturn XXX */ - 0, ibcs2_nosys, /* 104 = not used */ - 5, ibcs2_cisc, /* 105 = ISC special */ - 0, ibcs2_nosys, /* 106 = not used */ - 0, ibcs2_nosys, /* 107 = not used */ - 0, ibcs2_nosys, /* 108 = not used */ - 0, ibcs2_nosys, /* 109 = not used */ - 0, ibcs2_nosys, /* 110 = not used */ - 0, ibcs2_nosys, /* 111 = not used */ - 0, ibcs2_nosys, /* 112 = not used */ - 0, ibcs2_nosys, /* 113 = not used */ - 0, ibcs2_nosys, /* 114 = not used */ - 0, ibcs2_nosys, /* 115 = not used */ - 0, ibcs2_nosys, /* 116 = not used */ - 0, ibcs2_nosys, /* 117 = not used */ - 0, ibcs2_nosys, /* 118 = not used */ - 0, ibcs2_nosys, /* 119 = not used */ - 0, ibcs2_nosys, /* 120 = not used */ - 0, ibcs2_nosys, /* 121 = not used */ - 0, ibcs2_nosys, /* 122 = not used */ - 0, ibcs2_nosys, /* 123 = not used */ - 0, ibcs2_nosys, /* 124 = not used */ - 0, ibcs2_nosys, /* 125 = not used */ - 1, ibcs2_traceemu, /* 126 = ibcs2 emulator trace cntl */ - 5, ibcs2_clocal, /* 127 = local system calls */ -}; - -struct sysentvec ibcs2_svr3_sysvec = { - sizeof (svr3_sysent) / sizeof (svr3_sysent[0]), - svr3_sysent, - 0x7F, - NSIG, - bsd_to_ibcs2_signal, - NERR, - bsd_to_svr3_errno -}; - -#if 0 - -int ibcs2_acancel(); -int ibcs2_adjtime(); -int ibcs2_context(); -int ibcs2_evsys(); -int ibcs2_evtrapret(); -int ibcs2_fchdir(); -int ibcs2_fchmod(); -int ibcs2_fchown(); -int ibcs2_fstatvfs(); -int ibcs2_fxstat(); -int ibcs2_getgroups(); -int ibcs2_getpmsg(); -int ibcs2_getrlimit(); -int ibcs2_hrtsys(); -int ibcs2_lchown(); -int ibcs2_lxstat(); -int ibcs2_memcntl(); -int ibcs2_mincore(); -int ibcs2_mmap(); -int ibcs2_mprotect(); -int ibcs2_munmap(); -int ibcs2_pathconf(); -int ibcs2_priocntlsys(); -int ibcs2_putgmsg(); -int ibcs2_readv(); -int ibcs2_rename(); -int ibcs2_setegid(); -int ibcs2_seteuid(); -int ibcs2_setgroups(); -int ibcs2_setrlimit(); -int ibcs2_sigaction(); -int ibcs2_sigaltstack(); -int ibcs2_sigpending(); -int ibcs2_sigprocmask(); -int ibcs2_sigsendsys(); -int ibcs2_sigsuspend(); -int ibcs2_statvfs(); -int ibcs2_sysconfig(); -int ibcs2_systeminfo(); -int ibcs2_vfork(); -int ibcs2_waitsys(); -int ibcs2_writev(); -int ibcs2_xmknod(); -int ibcs2_xstat(); - -int bsd_to_svr4_errno[NERR] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 45, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 32, 33, 34, 11,150,149, 95, 96, - 97, 98, 99,120,121,122,123,124,125,126, - 127,128,129,130,131,132,133,134,143,144, - 145,146, 90, 78,147,148, 93, 11, 94, 11, - 0, 0, 0, 0, 0, 0, 0, 46, 89, 0, -}; +#ifdef COMPAT_43 +#define compat(n, name) n, (sy_call_t *)__CONCAT(o,name) +#else +#define compat(n, name) 0, (sy_call_t *)nosys +#endif -/* ibcs2 svr4 sysent table */ -struct sysent svr4_sysent[] = -{ - 0, ibcs2_nosys, /* 0 = indir */ - 1, ibcs2_exit, /* 1 = exit */ - 0, ibcs2_fork, /* 2 = fork */ - 3, ibcs2_read, /* 3 = read */ - 3, ibcs2_write, /* 4 = write */ - 3, ibcs2_open, /* 5 = open */ - 1, ibcs2_close, /* 6 = close */ - 3, ibcs2_wait, /* 7 = wait */ - 2, ibcs2_creat, /* 8 = creat */ - 2, ibcs2_link, /* 9 = link */ - 1, ibcs2_unlink, /* 10 = unlink */ - 2, ibcs2_exec, /* 11 = exec */ - 1, ibcs2_chdir, /* 12 = chdir */ - 0, ibcs2_gtime, /* 13 = time */ - 3, ibcs2_mknod, /* 14 = mknod */ - 2, ibcs2_chmod, /* 15 = chmod */ - 3, ibcs2_chown, /* 16 = chown */ - 1, ibcs2_break, /* 17 = break */ - 2, ibcs2_stat, /* 18 = stat */ - 3, ibcs2_seek, /* 19 = seek */ - 0, ibcs2_getpid, /* 20 = getpid */ - 6, ibcs2_smount, /* 21 = mount */ - 1, ibcs2_sumount, /* 22 = umount */ - 1, ibcs2_setuid, /* 23 = setuid */ - 0, ibcs2_getuid, /* 24 = getuid */ - 1, ibcs2_stime, /* 25 = stime */ - 4, ibcs2_ptrace, /* 26 = ptrace */ - 1, ibcs2_alarm, /* 27 = alarm */ - 2, ibcs2_fstat, /* 28 = fstat */ - 0, ibcs2_pause, /* 29 = pause */ - 2, ibcs2_utime, /* 30 = utime */ - 2, ibcs2_stty, /* 31 = stty */ - 2, ibcs2_gtty, /* 32 = gtty */ - 2, ibcs2_access, /* 33 = access */ - 1, ibcs2_nice, /* 34 = nice */ - 4, ibcs2_statfs, /* 35 = statfs */ - 0, ibcs2_sync, /* 36 = sync */ - 2, ibcs2_kill, /* 37 = kill */ - 4, ibcs2_fstatfs, /* 38 = fstatfs */ - 1, ibcs2_procids, /* 39 = procids */ - 5, ibcs2_cxenix, /* 40 = XENIX special system call */ - 1, ibcs2_dup, /* 41 = dup */ - 1, ibcs2_pipe, /* 42 = pipe */ - 1, ibcs2_times, /* 43 = times */ - 4, ibcs2_profil, /* 44 = prof */ - 1, ibcs2_plock, /* 45 = proc lock */ - 1, ibcs2_setgid, /* 46 = setgid */ - 0, ibcs2_getgid, /* 47 = getgid */ - 2, ibcs2_sigsys, /* 48 = signal */ - 6, ibcs2_msgsys, /* 49 = IPC message */ - 4, ibcs2_sysi86, /* 50 = i386-specific system call */ - 1, ibcs2_sysacct, /* 51 = turn acct off/on */ - 4, ibcs2_shmsys, /* 52 = shared memory */ - 5, ibcs2_semsys, /* 53 = IPC semaphores */ - 3, ibcs2_ioctl, /* 54 = ioctl */ - 3, ibcs2_uadmin, /* 55 = uadmin */ - 0, ibcs2_nosys, /* 56 = reserved for exch */ - 3, ibcs2_utssys, /* 57 = utssys */ - 1, ibcs2_fsync, /* 58 = fsync */ - 3, ibcs2_exece, /* 59 = exece */ - 1, ibcs2_umask, /* 60 = umask */ - 1, ibcs2_chroot, /* 61 = chroot */ - 3, ibcs2_fcntl, /* 62 = fcntl */ - 2, ibcs2_ulimit, /* 63 = ulimit */ - 0, ibcs2_nosys, /* 64 = nosys */ - 0, ibcs2_nosys, /* 65 = nosys */ - 0, ibcs2_nosys, /* 66 = nosys */ - 0, ibcs2_nosys, /* 67 = file locking call */ - 0, ibcs2_nosys, /* 68 = local system calls */ - 0, ibcs2_nosys, /* 69 = inode open */ - 4, ibcs2_advfs, /* 70 = advfs */ - 1, ibcs2_unadvfs, /* 71 = unadvfs */ - 4, ibcs2_rmount, /* 72 = rmount */ - 1, ibcs2_rumount, /* 73 = rumount */ - 5, ibcs2_rfstart, /* 74 = rfstart */ - 0, ibcs2_nosys, /* 75 = not used */ - 1, ibcs2_rfdebug, /* 76 = rfdebug */ - 0, ibcs2_rfstop, /* 77 = rfstop */ - 6, ibcs2_rfsys, /* 78 = rfsys */ - 1, ibcs2_rmdir, /* 79 = rmdir */ - 2, ibcs2_mkdir, /* 80 = mkdir */ - 4, ibcs2_getdents, /* 81 = getdents */ - 3, ibcs2_libattach, /* 82 = libattach */ - 1, ibcs2_libdetach, /* 83 = libdetach */ - 3, ibcs2_sysfs, /* 84 = sysfs */ - 4, ibcs2_getmsg, /* 85 = getmsg */ - 4, ibcs2_putmsg, /* 86 = putmsg */ - 3, ibcs2_poll, /* 87 = poll */ - 6, ibcs2_lstat, /* 88 = lstat */ - 2, ibcs2_symlink, /* 89 = symlink */ - 3, ibcs2_readlink, /* 90 = readlink */ - 2, ibcs2_setgroups, /* 91 = setgroups */ - 2, ibcs2_getgroups, /* 92 = getgroups */ - 2, ibcs2_fchmod, /* 93 = fchmod */ - 3, ibcs2_fchown, /* 94 = fchown */ - 3, ibcs2_sigprocmask, /* 95 = sigprocmask */ - 0, ibcs2_sigsuspend, /* 96 = sigsuspend */ - 2, ibcs2_sigaltstack, /* 97 = sigaltstack */ - 3, ibcs2_sigaction, /* 98 = sigaction */ - 1, ibcs2_sigpending, /* 99 = sigpending */ - 0, ibcs2_context, /* 100 = context */ - 0, ibcs2_evsys, /* 101 = evsys */ - 0, ibcs2_evtrapret, /* 102 = evtrapret */ - 0, ibcs2_statvfs, /* 103 = statvfs */ - 0, ibcs2_fstatvfs, /* 104 = fstatvfs */ - 5, ibcs2_cisc, /* 105 = ISC special */ - 0, ibcs2_nfssys, /* 106 = nfssys */ - 0, ibcs2_waitsys, /* 107 = waitsys */ - 0, ibcs2_sigsendsys, /* 108 = sigsendsys */ - 0, ibcs2_hrtsys, /* 109 = hrtsys */ - 0, ibcs2_acancel, /* 110 = acancel */ - 0, ibcs2_async, /* 111 = async */ - 0, ibcs2_priocntlsys, /* 112 = priocntlsys */ - 0, ibcs2_pathconf, /* 113 = pathconf */ - 0, ibcs2_mincore, /* 114 = mincore */ - 6, ibcs2_mmap, /* 115 = mmap */ - 3, ibcs2_mprotect, /* 116 = mprotect */ - 2, ibcs2_munmap, /* 117 = munmap */ - 0, ibcs2_pathconf, /* 118 = fpathconf */ - 0, ibcs2_vfork, /* 119 = vfork */ - 0, ibcs2_fchdir, /* 120 = fchdir */ - 0, ibcs2_readv, /* 121 = readv */ - 0, ibcs2_writev, /* 122 = writev */ - 3, ibcs2_xstat, /* 123 = xstat */ - 3, ibcs2_lxstat, /* 124 = lxstat */ - 3, ibcs2_fxstat, /* 125 = fxstat */ - 4, ibcs2_xmknod, /* 126 = xmknod */ - 5, ibcs2_clocal, /* 127 = local system calls */ - 0, ibcs2_setrlimit, /* 128 = setrlimit */ - 0, ibcs2_getrlimit, /* 129 = getrlimit */ - 0, ibcs2_lchown, /* 130 = lchown */ - 0, ibcs2_memcntl, /* 131 = memcntl */ - 0, ibcs2_getpmsg, /* 132 = getpmsg */ - 0, ibcs2_putgmsg, /* 133 = putgmsg */ - 2, ibcs2_rename, /* 134 = rename */ - 1, ibcs2_uname, /* 135 = uname */ - 0, ibcs2_setegid, /* 136 = setegid */ - 0, ibcs2_sysconfig, /* 137 = sysconfig */ - 0, ibcs2_adjtime, /* 138 = adjtime */ - 0, ibcs2_systeminfo, /* 139 = systeminfo */ - 0, ibcs2_nosys, /* 140 = not used */ - 0, ibcs2_seteuid, /* 141 = seteuid */ +/* The casts are bogus but will do for now. */ +struct sysent ibcs2_sysent[] = { + { 0, (sy_call_t *)nosys }, /* 0 = syscall */ + { 1, (sy_call_t *)exit }, /* 1 = exit */ + { 0, (sy_call_t *)fork }, /* 2 = fork */ + { 3, (sy_call_t *)ibcs2_read }, /* 3 = ibcs2_read */ + { 3, (sy_call_t *)write }, /* 4 = write */ + { 3, (sy_call_t *)ibcs2_open }, /* 5 = ibcs2_open */ + { 1, (sy_call_t *)close }, /* 6 = close */ + { 3, (sy_call_t *)ibcs2_wait }, /* 7 = ibcs2_wait */ + { 2, (sy_call_t *)ibcs2_creat }, /* 8 = ibcs2_creat */ + { 2, (sy_call_t *)link }, /* 9 = link */ + { 1, (sy_call_t *)ibcs2_unlink }, /* 10 = ibcs2_unlink */ + { 2, (sy_call_t *)ibcs2_execv }, /* 11 = ibcs2_execv */ + { 1, (sy_call_t *)ibcs2_chdir }, /* 12 = ibcs2_chdir */ + { 1, (sy_call_t *)ibcs2_time }, /* 13 = ibcs2_time */ + { 3, (sy_call_t *)ibcs2_mknod }, /* 14 = ibcs2_mknod */ + { 2, (sy_call_t *)ibcs2_chmod }, /* 15 = ibcs2_chmod */ + { 3, (sy_call_t *)ibcs2_chown }, /* 16 = ibcs2_chown */ + { 1, (sy_call_t *)obreak }, /* 17 = obreak */ + { 2, (sy_call_t *)ibcs2_stat }, /* 18 = ibcs2_stat */ + { 3, (sy_call_t *)ibcs2_lseek }, /* 19 = ibcs2_lseek */ + { 0, (sy_call_t *)getpid }, /* 20 = getpid */ + { 6, (sy_call_t *)ibcs2_mount }, /* 21 = ibcs2_mount */ + { 1, (sy_call_t *)ibcs2_umount }, /* 22 = ibcs2_umount */ + { 1, (sy_call_t *)ibcs2_setuid }, /* 23 = ibcs2_setuid */ + { 0, (sy_call_t *)getuid }, /* 24 = getuid */ + { 1, (sy_call_t *)ibcs2_stime }, /* 25 = ibcs2_stime */ + { 4, (sy_call_t *)ptrace }, /* 26 = ptrace */ + { 1, (sy_call_t *)ibcs2_alarm }, /* 27 = ibcs2_alarm */ + { 2, (sy_call_t *)ibcs2_fstat }, /* 28 = ibcs2_fstat */ + { 0, (sy_call_t *)ibcs2_pause }, /* 29 = ibcs2_pause */ + { 2, (sy_call_t *)ibcs2_utime }, /* 30 = ibcs2_utime */ + { 2, (sy_call_t *)ibcs2_stty }, /* 31 = ibcs2_stty */ + { 2, (sy_call_t *)ibcs2_gtty }, /* 32 = ibcs2_gtty */ + { 2, (sy_call_t *)ibcs2_access }, /* 33 = ibcs2_access */ + { 1, (sy_call_t *)ibcs2_nice }, /* 34 = ibcs2_nice */ + { 4, (sy_call_t *)ibcs2_statfs }, /* 35 = ibcs2_statfs */ + { 0, (sy_call_t *)sync }, /* 36 = sync */ + { 2, (sy_call_t *)ibcs2_kill }, /* 37 = ibcs2_kill */ + { 4, (sy_call_t *)ibcs2_fstatfs }, /* 38 = ibcs2_fstatfs */ + { 4, (sy_call_t *)ibcs2_pgrpsys }, /* 39 = ibcs2_pgrpsys */ + { 5, (sy_call_t *)ibcs2_xenix }, /* 40 = ibcs2_xenix */ + { 1, (sy_call_t *)dup }, /* 41 = dup */ + { 0, (sy_call_t *)pipe }, /* 42 = pipe */ + { 1, (sy_call_t *)ibcs2_times }, /* 43 = ibcs2_times */ + { 4, (sy_call_t *)profil }, /* 44 = profil */ + { 1, (sy_call_t *)ibcs2_plock }, /* 45 = ibcs2_plock */ + { 1, (sy_call_t *)ibcs2_setgid }, /* 46 = ibcs2_setgid */ + { 0, (sy_call_t *)getgid }, /* 47 = getgid */ + { 2, (sy_call_t *)ibcs2_sigsys }, /* 48 = ibcs2_sigsys */ +#ifdef SYSVMSG + { 6, (sy_call_t *)ibcs2_msgsys }, /* 49 = ibcs2_msgsys */ +#else + { 0, (sy_call_t *)nosys }, /* 49 = nosys */ +#endif + { 2, (sy_call_t *)ibcs2_sysi86 }, /* 50 = ibcs2_sysi86 */ + { 0, (sy_call_t *)nosys }, /* 51 = ibcs2_acct */ +#ifdef SYSVSHM + { 4, (sy_call_t *)ibcs2_shmsys }, /* 52 = ibcs2_shmsys */ +#else + { 0, (sy_call_t *)nosys }, /* 52 = nosys */ +#endif +#ifdef SYSVSEM + { 5, (sy_call_t *)ibcs2_semsys }, /* 53 = ibcs2_semsys */ +#else + { 0, (sy_call_t *)nosys }, /* 53 = nosys */ +#endif + { 3, (sy_call_t *)ibcs2_ioctl }, /* 54 = ibcs2_ioctl */ + { 3, (sy_call_t *)ibcs2_uadmin }, /* 55 = ibcs2_uadmin */ + { 0, (sy_call_t *)nosys }, /* 56 = nosys */ + { 3, (sy_call_t *)ibcs2_utssys }, /* 57 = ibcs2_utssys */ + { 1, (sy_call_t *)fsync }, /* 58 = fsync */ + { 3, (sy_call_t *)ibcs2_execve }, /* 59 = ibcs2_execve */ + { 1, (sy_call_t *)umask }, /* 60 = umask */ + { 1, (sy_call_t *)chroot }, /* 61 = chroot */ + { 3, (sy_call_t *)ibcs2_fcntl }, /* 62 = ibcs2_fcntl */ + { 2, (sy_call_t *)ibcs2_ulimit }, /* 63 = ibcs2_ulimit */ + { 0, (sy_call_t *)nosys }, /* 64 = reserved for unix/pc */ + { 0, (sy_call_t *)nosys }, /* 65 = reserved for unix/pc */ + { 0, (sy_call_t *)nosys }, /* 66 = reserved for unix/pc */ + { 0, (sy_call_t *)nosys }, /* 67 = reserved for unix/pc */ + { 0, (sy_call_t *)nosys }, /* 68 = reserved for unix/pc */ + { 0, (sy_call_t *)nosys }, /* 69 = reserved for unix/pc */ + { 0, (sy_call_t *)nosys }, /* 70 = obsolete rfs_advfs */ + { 0, (sy_call_t *)nosys }, /* 71 = obsolete rfs_unadvfs */ + { 0, (sy_call_t *)nosys }, /* 72 = obsolete rfs_rmount */ + { 0, (sy_call_t *)nosys }, /* 73 = obsolete rfs_rumount */ + { 0, (sy_call_t *)nosys }, /* 74 = obsolete rfs_rfstart */ + { 0, (sy_call_t *)nosys }, /* 75 = obsolete rfs_sigret */ + { 0, (sy_call_t *)nosys }, /* 76 = obsolete rfs_rdebug */ + { 0, (sy_call_t *)nosys }, /* 77 = obsolete rfs_rfstop */ + { 0, (sy_call_t *)nosys }, /* 78 = rfs_rfsys */ + { 1, (sy_call_t *)ibcs2_rmdir }, /* 79 = ibcs2_rmdir */ + { 2, (sy_call_t *)ibcs2_mkdir }, /* 80 = ibcs2_mkdir */ + { 3, (sy_call_t *)ibcs2_getdents }, /* 81 = ibcs2_getdents */ + { 0, (sy_call_t *)nosys }, /* 82 = nosys */ + { 0, (sy_call_t *)nosys }, /* 83 = nosys */ + { 3, (sy_call_t *)ibcs2_sysfs }, /* 84 = ibcs2_sysfs */ + { 4, (sy_call_t *)ibcs2_getmsg }, /* 85 = ibcs2_getmsg */ + { 4, (sy_call_t *)ibcs2_putmsg }, /* 86 = ibcs2_putmsg */ + { 3, (sy_call_t *)ibcs2_poll }, /* 87 = ibcs2_poll */ + { 0, (sy_call_t *)nosys }, /* 88 = nosys */ + { 6, (sy_call_t *)ibcs2_secure }, /* 89 = ibcs2_secure */ + { 2, (sy_call_t *)ibcs2_symlink }, /* 90 = ibcs2_symlink */ + { 2, (sy_call_t *)ibcs2_lstat }, /* 91 = ibcs2_lstat */ + { 3, (sy_call_t *)ibcs2_readlink }, /* 92 = ibcs2_readlink */ + { 0, (sy_call_t *)nosys }, /* 93 = nosys */ + { 0, (sy_call_t *)nosys }, /* 94 = nosys */ + { 0, (sy_call_t *)nosys }, /* 95 = nosys */ + { 0, (sy_call_t *)nosys }, /* 96 = nosys */ + { 0, (sy_call_t *)nosys }, /* 97 = nosys */ + { 0, (sy_call_t *)nosys }, /* 98 = nosys */ + { 0, (sy_call_t *)nosys }, /* 99 = nosys */ + { 0, (sy_call_t *)nosys }, /* 100 = nosys */ + { 0, (sy_call_t *)nosys }, /* 101 = nosys */ + { 0, (sy_call_t *)nosys }, /* 102 = nosys */ + { 1, (sy_call_t *)sigreturn }, /* 103 = sigreturn */ + { 0, (sy_call_t *)nosys }, /* 104 = nosys */ + { 0, (sy_call_t *)ibcs2_isc }, /* 105 = ibcs2_isc */ + { 0, (sy_call_t *)nosys }, /* 106 = nosys */ + { 0, (sy_call_t *)nosys }, /* 107 = nosys */ + { 0, (sy_call_t *)nosys }, /* 108 = nosys */ + { 0, (sy_call_t *)nosys }, /* 109 = nosys */ + { 0, (sy_call_t *)nosys }, /* 110 = nosys */ + { 0, (sy_call_t *)nosys }, /* 111 = nosys */ + { 0, (sy_call_t *)nosys }, /* 112 = nosys */ + { 0, (sy_call_t *)nosys }, /* 113 = nosys */ + { 0, (sy_call_t *)nosys }, /* 114 = nosys */ + { 0, (sy_call_t *)nosys }, /* 115 = nosys */ + { 0, (sy_call_t *)nosys }, /* 116 = nosys */ + { 0, (sy_call_t *)nosys }, /* 117 = nosys */ + { 0, (sy_call_t *)nosys }, /* 118 = nosys */ + { 0, (sy_call_t *)nosys }, /* 119 = nosys */ + { 0, (sy_call_t *)nosys }, /* 120 = nosys */ + { 0, (sy_call_t *)nosys }, /* 121 = nosys */ + { 0, (sy_call_t *)nosys }, /* 122 = nosys */ + { 0, (sy_call_t *)nosys }, /* 123 = nosys */ + { 0, (sy_call_t *)nosys }, /* 124 = nosys */ + { 0, (sy_call_t *)nosys }, /* 125 = nosys */ + { 0, (sy_call_t *)nosys }, /* 126 = nosys */ + { 0, (sy_call_t *)nosys }, /* 127 = nosys */ }; -struct sysentvec ibcs2_svr4_sysvec = { - sizeof (svr4_sysent) / sizeof (svr4_sysent[0]), - svr4_sysent, - 0xFF, - NSIG, - bsd_to_ibcs2_signal, - NERR, - bsd_to_svr4_errno -}; -#endif diff --git a/sys/i386/ibcs2/ibcs2_sysi86.c b/sys/i386/ibcs2/ibcs2_sysi86.c index 611ad10..c00be03 100644 --- a/sys/i386/ibcs2/ibcs2_sysi86.c +++ b/sys/i386/ibcs2/ibcs2_sysi86.c @@ -1,5 +1,6 @@ /*- * Copyright (c) 1994 Søren Schmidt + * Copyright (c) 1995 Steven Wallace * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -25,44 +26,68 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $Id: ibcs2_sysi86.c,v 1.1 1994/10/14 08:53:11 sos Exp $ + * ibcs2_sysi86.c,v 1.1 1994/10/14 08:53:11 sos Exp */ -#include <i386/ibcs2/ibcs2.h> #include <sys/param.h> #include <sys/systm.h> #include <sys/kernel.h> #include <sys/proc.h> +#include <sys/user.h> +#include <sys/sysctl.h> +#include <i386/ibcs2/ibcs2_types.h> +#include <i386/ibcs2/ibcs2_signal.h> +#include <i386/ibcs2/ibcs2_util.h> +#include <i386/ibcs2/ibcs2_proto.h> + +#define IBCS2_FP_NO 0 /* no fp support */ +#define IBCS2_FP_SW 1 /* software emulator */ +#define IBCS2_FP_287 2 /* 80287 FPU */ +#define IBCS2_FP_387 3 /* 80387 FPU */ + +#define SI86_FPHW 40 +#define STIME 54 +#define SETNAME 56 +#define SI86_MEM 65 -struct ibcs2_sysi86_args { - int cmd; - int *arg; -}; int ibcs2_sysi86(struct proc *p, struct ibcs2_sysi86_args *args, int *retval) { - switch (args->cmd) { - case 0x28: { /* SI86_FPHW */ + switch (SCARG(args, cmd)) { + case SI86_FPHW: { /* Floating Point information */ int val, error; - extern int hw_float; if (hw_float) val = IBCS2_FP_387; /* FPU hardware */ else val = IBCS2_FP_SW; /* FPU emulator */ - - if (error = copyout(&val, args->arg, sizeof(val))) + + if (error = copyout(&val, SCARG(args, arg), sizeof(val))) return error; return 0; } - case 0x33: /* SI86_MEM */ + case STIME: /* set the system time given pointer to long */ + /* gettimeofday; time.tv_sec = *args->arg; settimeofday */ + return EINVAL; + + case SETNAME: { /* set hostname given string w/ len <= 7 chars */ + int name; + int error; + + if ((error = suser(p->p_ucred, &p->p_acflag))) + return (error); + name = KERN_HOSTNAME; + return (kern_sysctl(&name, 1, 0, 0, SCARG(args, arg), 7, p)); + } + + case SI86_MEM: /* size of physical memory */ *retval = ctob(physmem); return 0; default: printf("IBCS2: 'sysi86' function %d(0x%x) " - "not implemented yet\n", args->cmd, args->cmd); + "not implemented yet\n", SCARG(args, cmd), args->cmd); return EINVAL; } } diff --git a/sys/i386/ibcs2/ibcs2_sysvec.c b/sys/i386/ibcs2/ibcs2_sysvec.c new file mode 100644 index 0000000..160409e --- /dev/null +++ b/sys/i386/ibcs2/ibcs2_sysvec.c @@ -0,0 +1,50 @@ +/* + * Copyright (c) 1995 Steven Wallace + * 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. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Steven Wallace. + * 4. 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. + * + * $Id$ + */ + +#include <sys/param.h> +#include <sys/sysent.h> +#include <i386/ibcs2/ibcs2_syscall.h> + +extern int bsd_to_ibcs2_sig[]; +extern int bsd_to_ibcs2_errno[]; +extern struct sysent ibcs2_sysent[IBCS2_SYS_MAXSYSCALL]; + +struct sysentvec ibcs2_svr3_sysvec = { + sizeof (ibcs2_sysent) / sizeof (ibcs2_sysent[0]), + ibcs2_sysent, + 0xFF, + NSIG, + bsd_to_ibcs2_sig, + ELAST, + bsd_to_ibcs2_errno, + 0 +}; diff --git a/sys/i386/ibcs2/ibcs2_termios.h b/sys/i386/ibcs2/ibcs2_termios.h index 35602cf..394f7f3 100644 --- a/sys/i386/ibcs2/ibcs2_termios.h +++ b/sys/i386/ibcs2/ibcs2_termios.h @@ -33,7 +33,7 @@ #ifndef _IBCS2_TERMIOS_H #define _IBCS2_TERMIOS_H 1 -#include <compat/ibcs2/ibcs2_types.h> +#include <i386/ibcs2/ibcs2_types.h> #define IBCS2_NCC 8 #define IBCS2_NCCS 13 diff --git a/sys/i386/ibcs2/ibcs2_time.h b/sys/i386/ibcs2/ibcs2_time.h index a3b669b..d416a3d 100644 --- a/sys/i386/ibcs2/ibcs2_time.h +++ b/sys/i386/ibcs2/ibcs2_time.h @@ -33,7 +33,7 @@ #ifndef _IBCS2_TIME_H #define _IBCS2_TIME_H -#include <compat/ibcs2/ibcs2_types.h> +#include <i386/ibcs2/ibcs2_types.h> struct ibcs2_tm { int tm_sec; diff --git a/sys/i386/ibcs2/ibcs2_ustat.h b/sys/i386/ibcs2/ibcs2_ustat.h index 03c7146..9bbad51 100644 --- a/sys/i386/ibcs2/ibcs2_ustat.h +++ b/sys/i386/ibcs2/ibcs2_ustat.h @@ -33,7 +33,7 @@ #ifndef _IBCS2_USTAT_H #define _IBCS2_USTAT_H 1 -#include <compat/ibcs2/ibcs2_types.h> +#include <i386/ibcs2/ibcs2_types.h> struct ibcs2_ustat { long f_tfree; diff --git a/sys/i386/ibcs2/ibcs2_util.c b/sys/i386/ibcs2/ibcs2_util.c index 69937ac..ce1e0e4 100644 --- a/sys/i386/ibcs2/ibcs2_util.c +++ b/sys/i386/ibcs2/ibcs2_util.c @@ -41,7 +41,7 @@ #include <sys/malloc.h> #include <sys/vnode.h> -#include <compat/ibcs2/ibcs2_util.h> +#include <i386/ibcs2/ibcs2_util.h> const char ibcs2_emul_path[] = "/emul/ibcs2"; diff --git a/sys/i386/ibcs2/ibcs2_util.h b/sys/i386/ibcs2/ibcs2_util.h index 6aa4e8c..124a411 100644 --- a/sys/i386/ibcs2/ibcs2_util.h +++ b/sys/i386/ibcs2/ibcs2_util.h @@ -39,16 +39,25 @@ #ifndef _IBCS2_UTIL_H_ #define _IBCS2_UTIL_H_ +#include <vm/vm.h> +#include <vm/vm_param.h> #include <machine/vmparam.h> #include <sys/exec.h> #include <sys/cdefs.h> +#ifndef SCARG +#define SCARG(p, x) (p)->x +#endif + +static __inline caddr_t stackgap_init(void); +static __inline void *stackgap_alloc(caddr_t *, size_t); + static __inline caddr_t stackgap_init() { - extern char sigcode[], esigcode[]; #define szsigcode ((caddr_t)(esigcode - sigcode)) - return STACKGAPBASE; + return (caddr_t)(ALIGN(((caddr_t)PS_STRINGS) + + sizeof(struct ps_strings))); } diff --git a/sys/i386/ibcs2/ibcs2_utime.h b/sys/i386/ibcs2/ibcs2_utime.h index 02d8315..46700ae 100644 --- a/sys/i386/ibcs2/ibcs2_utime.h +++ b/sys/i386/ibcs2/ibcs2_utime.h @@ -31,7 +31,7 @@ #ifndef _IBCS2_UTIME_H #define _IBCS2_UTIME_H -#include <compat/ibcs2/ibcs2_types.h> +#include <i386/ibcs2/ibcs2_types.h> struct ibcs2_utimbuf { ibcs2_time_t actime; diff --git a/sys/i386/ibcs2/ibcs2_xenix.c b/sys/i386/ibcs2/ibcs2_xenix.c index 3bbe7e7..b2b2790 100644 --- a/sys/i386/ibcs2/ibcs2_xenix.c +++ b/sys/i386/ibcs2/ibcs2_xenix.c @@ -1,6 +1,7 @@ /*- * Copyright (c) 1994 Sean Eric Fagan * Copyright (c) 1994 Søren Schmidt + * Copyright (c) 1995 Steven Wallace * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -26,119 +27,124 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $Id: ibcs2_xenix.c,v 1.4 1995/05/02 13:14:59 ache Exp $ + * $Id: ibcs2_xenix.c,v 1.2 1995/02/03 21:31:35 bde Exp $ */ -#include <i386/ibcs2/ibcs2.h> #include <sys/param.h> -#include <sys/proc.h> +#include <sys/systm.h> +#include <sys/sysproto.h> +#include <sys/kernel.h> #include <sys/exec.h> +#include <sys/ioctl.h> +#include <sys/proc.h> +#include <sys/vnode.h> +#include <sys/sysctl.h> #include <sys/sysent.h> #include <sys/errno.h> -#include <sys/ioctl.h> -#include <sys/signal.h> -#include <sys/syslimits.h> -#include <sys/unistd.h> #include <sys/timeb.h> +#include <sys/unistd.h> + #include <vm/vm.h> #include <machine/cpu.h> #include <machine/psl.h> #include <machine/reg.h> -struct ibcs2_sco_chsize_args { - int fd; - ibcs2_off_t size; -}; +#include <i386/ibcs2/ibcs2_types.h> +#include <i386/ibcs2/ibcs2_signal.h> +#include <i386/ibcs2/ibcs2_util.h> +#include <i386/ibcs2/ibcs2_proto.h> +#include <i386/ibcs2/ibcs2_xenix.h> +#include <i386/ibcs2/ibcs2_xenix_syscall.h> -static int -sco_chsize(struct proc *p, struct ibcs2_sco_chsize_args *args, int *retval) +extern struct sysent xenix_sysent[]; + +int +ibcs2_xenix(struct proc *p, struct ibcs2_xenix_args *uap, int *retval) { - struct ftruncate_args { - int fd; - int pad; - off_t length; - } tmp; + struct trapframe *tf = (struct trapframe *)p->p_md.md_regs; + struct sysent *callp; + u_int code; - if (ibcs2_trace & IBCS2_TRACE_XENIX) - printf("IBCS2: 'cxenix chsize'\n"); - tmp.fd = args->fd; - tmp.pad = 0; - tmp.length = args->size; - return ftruncate(p, &tmp, retval); -} + code = (tf->tf_eax & 0xff00) >> 8; + callp = &xenix_sysent[code]; -struct ibcs2_sco_ftime_args { - struct timeb *tp; -}; + if(code < IBCS2_XENIX_MAXSYSCALL) + return((*callp->sy_call)(p, (void *)uap, retval)); + else + return ENOSYS; +} -static int -sco_ftime(struct proc *p, struct ibcs2_sco_ftime_args *args, int *retval) +int +xenix_rdchk(p, uap, retval) + struct proc *p; + struct xenix_rdchk_args *uap; + int *retval; { - struct timeval atv; - extern struct timezone tz; - struct timeb tb; + int error; + struct ioctl_args sa; + caddr_t sg = stackgap_init(); + + DPRINTF(("IBCS2: 'xenix rdchk'\n")); + SCARG(&sa, fd) = SCARG(uap, fd); + SCARG(&sa, com) = FIONREAD; + SCARG(&sa, data) = stackgap_alloc(&sg, sizeof(int)); + if (error = ioctl(p, &sa, retval)) + return error; + *retval = (*((int*)SCARG(&sa, data))) ? 1 : 0; + return 0; +} - if (ibcs2_trace & IBCS2_TRACE_XENIX) - printf("IBCS2: 'cxenix ftime'\n"); - microtime(&atv); - tb.time = atv.tv_sec; - tb.millitm = atv.tv_usec / 1000; - tb.timezone = tz.tz_minuteswest; - tb.dstflag = tz.tz_dsttime != DST_NONE; +int +xenix_chsize(p, uap, retval) + struct proc *p; + struct xenix_chsize_args *uap; + int *retval; +{ + struct ftruncate_args sa; - return copyout((caddr_t)&tb, (caddr_t)args->tp, sizeof(struct timeb)); + DPRINTF(("IBCS2: 'xenix chsize'\n")); + SCARG(&sa, fd) = SCARG(uap, fd); + SCARG(&sa, pad) = 0; + SCARG(&sa, length) = SCARG(uap, size); + return ftruncate(p, &sa, retval); } -struct ibcs2_sco_nap_args { - long time; -}; -static int -sco_nap(struct proc *p, struct ibcs2_sco_nap_args *args, int *retval) +int +xenix_ftime(p, uap, retval) + struct proc *p; + struct xenix_ftime_args *uap; + int *retval; +{ + struct timeval tv; + struct timeb itb; + + DPRINTF(("IBCS2: 'xenix ftime'\n")); + microtime(&tv); + itb.time = tv.tv_sec; + itb.millitm = (tv.tv_usec / 1000); + itb.timezone = tz.tz_minuteswest; + itb.dstflag = tz.tz_dsttime != DST_NONE; + + return copyout((caddr_t)&itb, (caddr_t)SCARG(uap, tp), + sizeof(struct timeb)); +} + +int +xenix_nap(struct proc *p, struct xenix_nap_args *uap, int *retval) { long period; - extern int hz; - if (ibcs2_trace & IBCS2_TRACE_XENIX) - printf("IBCS2: 'cxenix nap %d ms'\n", args->time); - period = (long)args->time / (1000/hz); + DPRINTF(("IBCS2: 'xenix nap %d ms'\n", SCARG(uap, millisec))); + period = (long)SCARG(uap, millisec) / (1000/hz); if (period) - while (tsleep(&period, PUSER, "nap", period) + while (tsleep(&period, PUSER, "nap", period) != EWOULDBLOCK) ; return 0; } -struct ibcs2_sco_rdchk_args { - int fd; -}; - -static int -sco_rdchk(struct proc *p, struct ibcs2_sco_rdchk_args *args, int *retval) -{ - struct ioctl_arg { - int fd; - int cmd; - caddr_t arg; - } tmp; - int error; - - if (ibcs2_trace & IBCS2_TRACE_XENIX) - printf("IBCS2: 'cxenix rdchk'\n"); - tmp.fd = args->fd; - tmp.cmd = FIONREAD; - tmp.arg = (caddr_t)UA_ALLOC(); - error = ioctl(p, &tmp, retval); - if (!error) - *retval = *retval <= 0 ? 0 : 1; - return error; -} - -struct ibcs2_sco_utsname_args { - long addr; -}; - -static int -sco_utsname(struct proc *p, struct ibcs2_sco_utsname_args *args, int *retval) +int +xenix_utsname(struct proc *p, struct xenix_utsname_args *args, int *retval) { struct ibcs2_sco_utsname { char sysname[9]; @@ -153,10 +159,8 @@ sco_utsname(struct proc *p, struct ibcs2_sco_utsname_args *args, int *retval) char numusers[9]; unsigned short numcpu; } ibcs2_sco_uname; - extern char ostype[], hostname[], osrelease[], version[], machine[]; - if (ibcs2_trace & IBCS2_TRACE_XENIX) - printf("IBCS2: 'cxenix sco_utsname'\n"); + DPRINTF(("IBCS2: 'xenix sco_utsname'\n")); bzero(&ibcs2_sco_uname, sizeof(struct ibcs2_sco_utsname)); strncpy(ibcs2_sco_uname.sysname, ostype, 8); strncpy(ibcs2_sco_uname.nodename, hostname, 8); @@ -174,194 +178,9 @@ sco_utsname(struct proc *p, struct ibcs2_sco_utsname_args *args, int *retval) } int -ibcs2_cxenix(struct proc *p, void *args, int *retval) +xenix_scoinfo(struct proc *p, struct xenix_scoinfo_args *uap, int *retval) { - struct trapframe *tf = (struct trapframe *)p->p_md.md_regs; - - switch ((tf->tf_eax & 0xff00) >> 8) { - - case 0x07: /* rdchk */ - return sco_rdchk(p, args, retval); - - case 0x0a: /* chsize */ - return sco_chsize(p, args, retval); - - case 0x0b: /* ftime */ - return sco_ftime(p, args, retval); - - case 0x0c: /* nap */ - return sco_nap(p, args, retval); - - case 0x15: /* scoinfo (not documented) */ - *retval = 0; - return 0; - - case 0x24: /* select */ - if (ibcs2_trace & IBCS2_TRACE_XENIX) - printf("IBCS2: 'cxenix select'\n"); - return select(p, args, retval); - - case 0x25: /* eaccess */ - if (ibcs2_trace & IBCS2_TRACE_XENIX) - printf("IBCS2: 'cxenix eaccess'\n"); - return ibcs2_access(p, args, retval); - - case 0x27: /* sigaction */ - if (ibcs2_trace & IBCS2_TRACE_XENIX) - printf("IBCS2: 'cxenix sigaction'\n"); - return ibcs2_sigaction (p, args, retval); - - case 0x28: /* sigprocmask */ - if (ibcs2_trace & IBCS2_TRACE_XENIX) - printf("IBCS2: 'cxenix sigprocmask'\n"); - return ibcs2_sigprocmask (p, args, retval); - - case 0x29: /* sigpending */ - if (ibcs2_trace & IBCS2_TRACE_XENIX) - printf("IBCS2: 'cxenix sigpending'\n"); - return ibcs2_sigpending (p, args, retval); - - case 0x2a: /* sigsuspend */ - if (ibcs2_trace & IBCS2_TRACE_XENIX) - printf("IBCS2: 'cxenix sigsuspend'\n"); - return ibcs2_sigsuspend (p, args, retval); - - case 0x2b: /* getgroups */ - if (ibcs2_trace & IBCS2_TRACE_XENIX) - printf("IBCS2: 'cxenix getgroups'\n"); - return ibcs2_getgroups(p, args, retval); - - case 0x2c: /* setgroups */ - if (ibcs2_trace & IBCS2_TRACE_XENIX) - printf("IBCS2: 'cxenix setgroups'\n"); - return ibcs2_setgroups(p, args, retval); - - case 0x2d: { /* sysconf */ - struct ibcs2_sysconf_args { - int num; - } *sysconf_args = args; - - if (ibcs2_trace & IBCS2_TRACE_XENIX) - printf("IBCS2: 'cxenix sysconf'"); - switch (sysconf_args->num) { - case 0: /* _SC_ARG_MAX */ - *retval = (ARG_MAX); - break; - case 1: /* _SC_CHILD_MAX */ - *retval = (CHILD_MAX); - break; - case 2: /* _SC_CLK_TCK */ - *retval = (_BSD_CLK_TCK_); - break; - case 3: /* _SC_NGROUPS_MAX */ - *retval = (NGROUPS_MAX); - break; - case 4: /* _SC_OPEN_MAX */ - *retval = (OPEN_MAX); - break; - case 5: /* _SC_JOB_CONTROL */ -#ifdef _POSIX_JOB_CONTROL - *retval = (1); -#else - *retval = (-1); -#endif - break; - case 6: /* _SC_SAVED_IDS */ -#ifdef _POSIX_SAVED_IDS - *retval = (1); -#else - *retval = (-1); -#endif - break; - case 7: /* _SC_VERSION */ - *retval = (_POSIX_VERSION); - break; - default: - *retval = -1; - return EINVAL; - } - return 0; - } - - case 0x2e: /* pathconf */ - case 0x2f: /* fpathconf */ - if (ibcs2_trace & IBCS2_TRACE_XENIX) - printf("IBCS2: 'cxenix (f)pathconf'\n"); - return ibcs2_pathconf(p, args, retval); - - case 0x30: /* rename */ - if (ibcs2_trace & IBCS2_TRACE_XENIX) - printf("IBCS2: 'cxenix rename'\n"); - return ibcs2_rename(p, args, retval); - - case 0x32: /* sco_utsname */ - return sco_utsname(p, args, retval); - - case 0x37: /* getitimer */ - if (ibcs2_trace & IBCS2_TRACE_XENIX) - printf("IBCS2: 'cxenix getitimer'\n"); - return getitimer(p, args, retval); - - case 0x38: /* setitimer */ - if (ibcs2_trace & IBCS2_TRACE_XENIX) - printf("IBCS2: 'cxenix setitimer'\n"); - return setitimer(p, args, retval); - - - /* Not implemented yet SORRY */ - case 0x01: /* xlocking */ - printf("IBCS2: 'cxenix xlocking'"); - break; - case 0x02: /* creatsem */ - printf("IBCS2: 'cxenix creatsem'"); - break; - case 0x03: /* opensem */ - printf("IBCS2: 'cxenix opensem'"); - break; - case 0x04: /* sigsem */ - printf("IBCS2: 'cxenix sigsem'"); - break; - case 0x05: /* waitsem */ - printf("IBCS2: 'cxenix waitsem'"); - break; - case 0x06: /* nbwaitsem */ - printf("IBCS2: 'cxenix nbwaitsem'"); - break; - case 0x0d: /* sdget */ - printf("IBCS2: 'cxenix sdget'"); - break; - case 0x0e: /* sdfree */ - printf("IBCS2: 'cxenix sdfree'"); - break; - case 0x0f: /* sdenter */ - printf("IBCS2: 'cxenix sdenter'"); - break; - case 0x10: /* sdleave */ - printf("IBCS2: 'cxenix sdleave'"); - break; - case 0x11: /* sdgetv */ - printf("IBCS2: 'cxenix sdgetv'"); - break; - case 0x12: /* sdwaitv */ - printf("IBCS2: 'cxenix sdwaitv'"); - break; - case 0x20: /* proctl */ - printf("IBCS2: 'cxenix proctl'"); - break; - case 0x21: /* execseg */ - printf("IBCS2: 'cxenix execseg'"); - break; - case 0x22: /* unexecseg */ - printf("IBCS2: 'cxenix unexecseg'"); - break; - case 0x26: /* paccess */ - printf("IBCS2: 'cxenix paccess'"); - break; - default: - printf("IBCS2: 'cxenix' function %d(0x%x)", - tf->tf_eax>>8, tf->tf_eax>>8); - break; - } - printf(" not implemented yet\n"); - return EINVAL; + /* scoinfo (not documented) */ + *retval = 0; + return 0; } diff --git a/sys/i386/ibcs2/ibcs2_xenix.h b/sys/i386/ibcs2/ibcs2_xenix.h new file mode 100644 index 0000000..45f0085 --- /dev/null +++ b/sys/i386/ibcs2/ibcs2_xenix.h @@ -0,0 +1,95 @@ +/* + * System call prototypes. + * + * DO NOT EDIT-- this file is automatically generated. + * created from Id: syscalls.xenix,v 1.1 1995/10/06 15:12:52 swallace Exp + */ + +#ifndef _IBCS2_XENIX_H_ +#define _IBCS2_XENIX_H_ + +#include <sys/types.h> +#include <sys/param.h> +#include <sys/mount.h> + +struct xenix_rdchk_args { + int fd; +}; +struct xenix_chsize_args { + int fd; + long size; +}; +struct xenix_ftime_args { + struct timeb * tp; +}; +struct xenix_nap_args { + int millisec; +}; +struct xenix_scoinfo_args { + int dummy; +}; +struct ibcs2_sigaction_args { + int sig; + struct ibcs2_sigaction * act; + struct ibcs2_sigaction * oact; +}; +struct ibcs2_sigprocmask_args { + int how; + ibcs2_sigset_t * set; + ibcs2_sigset_t * oset; +}; +struct ibcs2_sigpending_args { + ibcs2_sigset_t * mask; +}; +struct ibcs2_sigsuspend_args { + ibcs2_sigset_t * mask; +}; +struct ibcs2_getgroups_args { + int gidsetsize; + ibcs2_gid_t * gidset; +}; +struct ibcs2_setgroups_args { + int gidsetsize; + ibcs2_gid_t * gidset; +}; +struct ibcs2_sysconf_args { + int name; +}; +struct ibcs2_pathconf_args { + char * path; + int name; +}; +struct ibcs2_fpathconf_args { + int fd; + int name; +}; +struct ibcs2_rename_args { + char * from; + char * to; +}; +struct xenix_utsname_args { + long addr; +}; +int xenix_rdchk __P((struct proc *, struct xenix_rdchk_args *, int [])); +int xenix_chsize __P((struct proc *, struct xenix_chsize_args *, int [])); +int xenix_ftime __P((struct proc *, struct xenix_ftime_args *, int [])); +int xenix_nap __P((struct proc *, struct xenix_nap_args *, int [])); +int xenix_scoinfo __P((struct proc *, struct xenix_scoinfo_args *, int [])); +int ibcs2_sigaction __P((struct proc *, struct ibcs2_sigaction_args *, int [])); +int ibcs2_sigprocmask __P((struct proc *, struct ibcs2_sigprocmask_args *, int [])); +int ibcs2_sigpending __P((struct proc *, struct ibcs2_sigpending_args *, int [])); +int ibcs2_sigsuspend __P((struct proc *, struct ibcs2_sigsuspend_args *, int [])); +int ibcs2_getgroups __P((struct proc *, struct ibcs2_getgroups_args *, int [])); +int ibcs2_setgroups __P((struct proc *, struct ibcs2_setgroups_args *, int [])); +int ibcs2_sysconf __P((struct proc *, struct ibcs2_sysconf_args *, int [])); +int ibcs2_pathconf __P((struct proc *, struct ibcs2_pathconf_args *, int [])); +int ibcs2_fpathconf __P((struct proc *, struct ibcs2_fpathconf_args *, int [])); +int ibcs2_rename __P((struct proc *, struct ibcs2_rename_args *, int [])); +int xenix_utsname __P((struct proc *, struct xenix_utsname_args *, int [])); + +#ifdef COMPAT_43 + + +#endif /* COMPAT_43 */ + +#endif /* !_IBCS2_XENIX_H_ */ diff --git a/sys/i386/ibcs2/ibcs2_xenix_syscall.h b/sys/i386/ibcs2/ibcs2_xenix_syscall.h new file mode 100644 index 0000000..4d0b422 --- /dev/null +++ b/sys/i386/ibcs2/ibcs2_xenix_syscall.h @@ -0,0 +1,27 @@ +/* + * System call numbers. + * + * DO NOT EDIT-- this file is automatically generated. + * created from Id: syscalls.xenix,v 1.1 1995/10/06 15:12:52 swallace Exp + */ + +#define IBCS2_XENIX_xenix_rdchk 7 +#define IBCS2_XENIX_xenix_chsize 10 +#define IBCS2_XENIX_xenix_ftime 11 +#define IBCS2_XENIX_xenix_nap 12 +#define IBCS2_XENIX_xenix_scoinfo 21 +#define IBCS2_XENIX_select 36 +#define IBCS2_XENIX_ibcs2_sigaction 39 +#define IBCS2_XENIX_ibcs2_sigprocmask 40 +#define IBCS2_XENIX_ibcs2_sigpending 41 +#define IBCS2_XENIX_ibcs2_sigsuspend 42 +#define IBCS2_XENIX_ibcs2_getgroups 43 +#define IBCS2_XENIX_ibcs2_setgroups 44 +#define IBCS2_XENIX_ibcs2_sysconf 45 +#define IBCS2_XENIX_ibcs2_pathconf 46 +#define IBCS2_XENIX_ibcs2_fpathconf 47 +#define IBCS2_XENIX_ibcs2_rename 48 +#define IBCS2_XENIX_xenix_utsname 50 +#define IBCS2_XENIX_getitimer 55 +#define IBCS2_XENIX_setitimer 56 +#define IBCS2_XENIX_MAXSYSCALL 57 diff --git a/sys/i386/ibcs2/ibcs2_xenix_sysent.c b/sys/i386/ibcs2/ibcs2_xenix_sysent.c new file mode 100644 index 0000000..fdffa3a --- /dev/null +++ b/sys/i386/ibcs2/ibcs2_xenix_sysent.c @@ -0,0 +1,84 @@ +/* + * System call switch table. + * + * DO NOT EDIT-- this file is automatically generated. + * created from Id: syscalls.xenix,v 1.1 1995/10/06 15:12:52 swallace Exp + */ + +#include <sys/types.h> +#include <sys/param.h> +#include <sys/sysent.h> +#include <sys/sysproto.h> +#include <i386/ibcs2/ibcs2_types.h> +#include <i386/ibcs2/ibcs2_signal.h> +#include <i386/ibcs2/ibcs2_statfs.h> +#include <i386/ibcs2/ibcs2_xenix.h> + +#ifdef COMPAT_43 +#define compat(n, name) n, (sy_call_t *)__CONCAT(o,name) +#else +#define compat(n, name) 0, (sy_call_t *)nosys +#endif + +/* The casts are bogus but will do for now. */ +struct sysent xenix_sysent[] = { + { 0, (sy_call_t *)nosys }, /* 0 = nosys */ + { 0, (sy_call_t *)nosys }, /* 1 = xenix_xlocking */ + { 0, (sy_call_t *)nosys }, /* 2 = xenix_creatsem */ + { 0, (sy_call_t *)nosys }, /* 3 = xenix_opensem */ + { 0, (sy_call_t *)nosys }, /* 4 = xenix_sigsem */ + { 0, (sy_call_t *)nosys }, /* 5 = xenix_waitsem */ + { 0, (sy_call_t *)nosys }, /* 6 = xenix_nbwaitsem */ + { 1, (sy_call_t *)xenix_rdchk }, /* 7 = xenix_rdchk */ + { 0, (sy_call_t *)nosys }, /* 8 = nosys */ + { 0, (sy_call_t *)nosys }, /* 9 = nosys */ + { 2, (sy_call_t *)xenix_chsize }, /* 10 = xenix_chsize */ + { 1, (sy_call_t *)xenix_ftime }, /* 11 = xenix_ftime */ + { 1, (sy_call_t *)xenix_nap }, /* 12 = xenix_nap */ + { 0, (sy_call_t *)nosys }, /* 13 = xenix_sdget */ + { 0, (sy_call_t *)nosys }, /* 14 = xenix_sdfree */ + { 0, (sy_call_t *)nosys }, /* 15 = xenix_sdenter */ + { 0, (sy_call_t *)nosys }, /* 16 = xenix_sdleave */ + { 0, (sy_call_t *)nosys }, /* 17 = xenix_sdgetv */ + { 0, (sy_call_t *)nosys }, /* 18 = xenix_sdwaitv */ + { 0, (sy_call_t *)nosys }, /* 19 = nosys */ + { 0, (sy_call_t *)nosys }, /* 20 = nosys */ + { 0, (sy_call_t *)xenix_scoinfo }, /* 21 = xenix_scoinfo */ + { 0, (sy_call_t *)nosys }, /* 22 = nosys */ + { 0, (sy_call_t *)nosys }, /* 23 = nosys */ + { 0, (sy_call_t *)nosys }, /* 24 = nosys */ + { 0, (sy_call_t *)nosys }, /* 25 = nosys */ + { 0, (sy_call_t *)nosys }, /* 26 = nosys */ + { 0, (sy_call_t *)nosys }, /* 27 = nosys */ + { 0, (sy_call_t *)nosys }, /* 28 = nosys */ + { 0, (sy_call_t *)nosys }, /* 29 = nosys */ + { 0, (sy_call_t *)nosys }, /* 30 = nosys */ + { 0, (sy_call_t *)nosys }, /* 31 = nosys */ + { 0, (sy_call_t *)nosys }, /* 32 = xenix_proctl */ + { 0, (sy_call_t *)nosys }, /* 33 = xenix_execseg */ + { 0, (sy_call_t *)nosys }, /* 34 = xenix_unexecseg */ + { 0, (sy_call_t *)nosys }, /* 35 = nosys */ + { 5, (sy_call_t *)select }, /* 36 = select */ + { 0, (sy_call_t *)nosys }, /* 37 = xenix_eaccess */ + { 0, (sy_call_t *)nosys }, /* 38 = xenix_paccess */ + { 3, (sy_call_t *)ibcs2_sigaction }, /* 39 = ibcs2_sigaction */ + { 3, (sy_call_t *)ibcs2_sigprocmask }, /* 40 = ibcs2_sigprocmask */ + { 1, (sy_call_t *)ibcs2_sigpending }, /* 41 = ibcs2_sigpending */ + { 1, (sy_call_t *)ibcs2_sigsuspend }, /* 42 = ibcs2_sigsuspend */ + { 2, (sy_call_t *)ibcs2_getgroups }, /* 43 = ibcs2_getgroups */ + { 2, (sy_call_t *)ibcs2_setgroups }, /* 44 = ibcs2_setgroups */ + { 1, (sy_call_t *)ibcs2_sysconf }, /* 45 = ibcs2_sysconf */ + { 2, (sy_call_t *)ibcs2_pathconf }, /* 46 = ibcs2_pathconf */ + { 2, (sy_call_t *)ibcs2_fpathconf }, /* 47 = ibcs2_fpathconf */ + { 2, (sy_call_t *)ibcs2_rename }, /* 48 = ibcs2_rename */ + { 0, (sy_call_t *)nosys }, /* 49 = nosys */ + { 1, (sy_call_t *)xenix_utsname }, /* 50 = xenix_utsname */ + { 0, (sy_call_t *)nosys }, /* 51 = nosys */ + { 0, (sy_call_t *)nosys }, /* 52 = nosys */ + { 0, (sy_call_t *)nosys }, /* 53 = nosys */ + { 0, (sy_call_t *)nosys }, /* 54 = nosys */ + { 2, (sy_call_t *)getitimer }, /* 55 = getitimer */ + { 3, (sy_call_t *)setitimer }, /* 56 = setitimer */ +}; + + diff --git a/sys/i386/ibcs2/imgact_coff.c b/sys/i386/ibcs2/imgact_coff.c index 9529e11..2318f7d 100644 --- a/sys/i386/ibcs2/imgact_coff.c +++ b/sys/i386/ibcs2/imgact_coff.c @@ -26,7 +26,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $Id: imgact_coff.c,v 1.6 1995/08/28 09:18:36 julian Exp $ + * $Id: imgact_coff.c,v 1.7 1995/09/13 02:12:51 sef Exp $ */ #include <sys/param.h> @@ -42,8 +42,17 @@ #include <sys/sysent.h> #include <vm/vm.h> #include <vm/vm_kern.h> -#include "coff.h" -#include "ibcs2.h" + +#include <i386/ibcs2/coff.h> +#include <i386/ibcs2/ibcs2_util.h> + +extern struct sysentvec ibcs2_svr3_sysvec; + +extern int coff_load_file __P((struct proc *p, char *name)); +extern int exec_coff_imgact __P((struct image_params *iparams)); + +static int load_coff_section __P((struct vmspace *vmspace, struct vnode *vp, vm_offset_t offset, caddr_t vmaddr, size_t memsz, size_t filsz, vm_prot_t prot)); + static int load_coff_section(vmspace, vp, offset, vmaddr, memsz, filsz, prot) @@ -80,11 +89,9 @@ load_coff_section(vmspace, vp, offset, vmaddr, memsz, filsz, prot) map_len = round_page(offset + filsz) - trunc_page(map_offset); } -if (ibcs2_trace & IBCS2_TRACE_COFF) { -printf("%s(%d): vm_mmap(&vmspace->vm_map, &0x%08lx, 0x%x, 0x%x, " - "VM_PROT_ALL, MAP_FILE | MAP_PRIVATE | MAP_FIXED, vp, 0x%x)\n", - __FILE__, __LINE__, map_addr, map_len, prot, map_offset); -} + DPRINTF(("%s(%d): vm_mmap(&vmspace->vm_map, &0x%08lx, 0x%x, 0x%x, " + "VM_PROT_ALL, MAP_FILE | MAP_PRIVATE | MAP_FIXED, vp, 0x%x)\n", + __FILE__, __LINE__, map_addr, map_len, prot, map_offset)); if (error = vm_mmap(&vmspace->vm_map, &map_addr, @@ -113,10 +120,7 @@ printf("%s(%d): vm_mmap(&vmspace->vm_map, &0x%08lx, 0x%x, 0x%x, " map_addr = trunc_page(vmaddr + filsz); map_len = round_page(memsz) - trunc_page(filsz); -if (ibcs2_trace & IBCS2_TRACE_COFF) { -printf("%s(%d): vm_map_find(&vmspace->vm_map, NULL, 0, &0x%08lx, 0x%x, FALSE)\n", - __FILE__, __LINE__, map_addr, map_len); -} + DPRINTF(("%s(%d): vm_map_find(&vmspace->vm_map, NULL, 0, &0x%08lx,0x%x, FALSE)\n", __FILE__, __LINE__, map_addr, map_len)); if (map_len != 0) { error = vm_map_find(&vmspace->vm_map, NULL, 0, &map_addr, @@ -292,7 +296,6 @@ exec_coff_imgact(iparams) unsigned long vmaddr; int nscns; int error, len; - extern struct sysentvec ibcs2_svr3_sysvec; unsigned long text_offset = 0, text_address = 0, text_size = 0; unsigned long data_offset = 0, data_address = 0, data_size = 0; unsigned long bss_size = 0; @@ -306,11 +309,8 @@ exec_coff_imgact(iparams) if (fhdr->f_magic != I386_COFF || !(fhdr->f_flags & F_EXEC)) { -if (ibcs2_trace & IBCS2_TRACE_COFF) { -printf("%s(%d): return -1\n", __FILE__, __LINE__); -} - - return -1; + DPRINTF(("%s(%d): return -1\n", __FILE__, __LINE__)); + return -1; } nscns = fhdr->f_nscns; @@ -320,10 +320,8 @@ printf("%s(%d): return -1\n", __FILE__, __LINE__); * read in all of the section structures. */ -if (ibcs2_trace & IBCS2_TRACE_COFF) { -printf("%s(%d): return -1\n", __FILE__, __LINE__); -} - return -1; + DPRINTF(("%s(%d): return -1\n", __FILE__, __LINE__)); + return -1; } ahdr = (struct aouthdr*)((char*)(iparams->image_header) + @@ -335,22 +333,17 @@ printf("%s(%d): return -1\n", __FILE__, __LINE__); sizeof(struct aouthdr)); if (error = exec_extract_strings(iparams)) { - -if (ibcs2_trace & IBCS2_TRACE_COFF) { -printf("%s(%d): return %d\n", __FILE__, __LINE__, error); -} - return error; + DPRINTF(("%s(%d): return %d\n", __FILE__, __LINE__, error)); + return error; } exec_new_vmspace(iparams); for (i = 0; i < nscns; i++) { -if (ibcs2_trace & IBCS2_TRACE_COFF) { -printf("i = %d, scns[i].s_name = %s, scns[i].s_vaddr = %08lx, " - "scns[i].s_scnptr = %d\n", i, scns[i].s_name, - scns[i].s_vaddr, scns[i].s_scnptr); -} + DPRINTF(("i = %d, scns[i].s_name = %s, scns[i].s_vaddr = %08lx, " + "scns[i].s_scnptr = %d\n", i, scns[i].s_name, + scns[i].s_vaddr, scns[i].s_scnptr)); if (scns[i].s_flags & STYP_NOLOAD) { /* * A section that is not loaded, for whatever @@ -389,15 +382,20 @@ printf("i = %d, scns[i].s_name = %s, scns[i].s_vaddr = %08lx, " } for (j = off; j < scns[i].s_size + off; j++) { char *libname; + char libbuf[40]; + libname = buf + j + 4 * *(long*)(buf + j + 4); j += 4* *(long*)(buf + j); -if (ibcs2_trace & IBCS2_TRACE_COFF) { -printf("%s(%d): shared library %s\n", __FILE__, __LINE__, libname); -} - error = coff_load_file(iparams->proc, libname); + DPRINTF(("%s(%d): shared library %s\n", + __FILE__, __LINE__, libname)); + strcpy(libbuf, "/emul/ibcs2"); + strcpy(&libbuf[11], libname); + error = coff_load_file(iparams->proc, libbuf); + if (error) + error = coff_load_file(iparams->proc, libname); if (error) - break; + break; } if (vm_map_remove(kernel_map, (vm_offset_t) buf, @@ -411,20 +409,15 @@ printf("%s(%d): shared library %s\n", __FILE__, __LINE__, libname); * Map in .text now */ -if (ibcs2_trace & IBCS2_TRACE_COFF) { -printf("%s(%d): load_coff_section(vmspace, " - "iparams->vnodep, %08lx, %08lx, 0x%x, 0x%x, 0x%x)\n", - __FILE__, __LINE__, text_offset, text_address, - text_size, text_size, VM_PROT_READ | VM_PROT_EXECUTE); -} + DPRINTF(("%s(%d): load_coff_section(vmspace, " + "iparams->vnodep, %08lx, %08lx, 0x%x, 0x%x, 0x%x)\n", + __FILE__, __LINE__, text_offset, text_address, + text_size, text_size, VM_PROT_READ | VM_PROT_EXECUTE)); if (error = load_coff_section(vmspace, iparams->vnodep, text_offset, (caddr_t)text_address, text_size, text_size, VM_PROT_READ | VM_PROT_EXECUTE)) { - -if (ibcs2_trace & IBCS2_TRACE_COFF) { -printf("%s(%d): error = %d\n", __FILE__, __LINE__, error); -} + DPRINTF(("%s(%d): error = %d\n", __FILE__, __LINE__, error)); return error; } /* @@ -432,20 +425,16 @@ printf("%s(%d): error = %d\n", __FILE__, __LINE__, error); */ -if (ibcs2_trace & IBCS2_TRACE_COFF) { -printf("%s(%d): load_coff_section(vmspace, " - "iparams->vnodep, 0x%08lx, 0x%08lx, 0x%x, 0x%x, 0x%x)\n", - __FILE__, __LINE__, data_offset, data_address, - data_size + bss_size, data_size, VM_PROT_ALL); -} + DPRINTF(("%s(%d): load_coff_section(vmspace, " + "iparams->vnodep, 0x%08lx, 0x%08lx, 0x%x, 0x%x, 0x%x)\n", + __FILE__, __LINE__, data_offset, data_address, + data_size + bss_size, data_size, VM_PROT_ALL)); if (error = load_coff_section(vmspace, iparams->vnodep, data_offset, (caddr_t)data_address, data_size + bss_size, data_size, VM_PROT_ALL)) { -if (ibcs2_trace & IBCS2_TRACE_COFF) { -printf("%s(%d): error = %d\n", __FILE__, __LINE__, error); -} + DPRINTF(("%s(%d): error = %d\n", __FILE__, __LINE__, error)); return error; } @@ -460,20 +449,18 @@ printf("%s(%d): error = %d\n", __FILE__, __LINE__, error); hole = (caddr_t)trunc_page(vmspace->vm_daddr) + ctob(vmspace->vm_dsize); -if (ibcs2_trace & IBCS2_TRACE_COFF) { -printf("%s(%d): vm_map_find(&vmspace->vm_map, NULL, 0, &0x%08lx, PAGE_SIZE, FALSE)\n", - __FILE__, __LINE__, hole); -printf("imgact: error = %d\n", error); -} + DPRINTF(("%s(%d): vm_map_find(&vmspace->vm_map, NULL, 0, &0x%08lx, PAGE_SIZE, FALSE)\n", + __FILE__, __LINE__, hole)); + DPRINTF(("imgact: error = %d\n", error)); + error = vm_map_find(&vmspace->vm_map, NULL, 0, (vm_offset_t *) &hole, PAGE_SIZE, FALSE); -if (ibcs2_trace & IBCS2_TRACE_COFF) { -printf("IBCS2: start vm_dsize = 0x%x, vm_daddr = 0x%x end = 0x%x\n", - ctob(vmspace->vm_dsize), vmspace->vm_daddr, - ctob(vmspace->vm_dsize) + vmspace->vm_daddr ); -printf("%s(%d): returning successfully!\n", __FILE__, __LINE__); -} + DPRINTF(("IBCS2: start vm_dsize = 0x%x, vm_daddr = 0x%x end = 0x%x\n", + ctob(vmspace->vm_dsize), vmspace->vm_daddr, + ctob(vmspace->vm_dsize) + vmspace->vm_daddr )); + DPRINTF(("%s(%d): returning successfully!\n", __FILE__, __LINE__)); + /* Indicate that this file should not be modified */ iparams->vnodep->v_flag |= VTEXT; return 0; diff --git a/sys/i386/ibcs2/syscalls.conf b/sys/i386/ibcs2/syscalls.conf index 7f46f44..4474f6e 100644 --- a/sys/i386/ibcs2/syscalls.conf +++ b/sys/i386/ibcs2/syscalls.conf @@ -1,12 +1,11 @@ -# syscalls.conf - -sysnames="ibcs2_syscalls.c" -sysnumhdr="ibcs2_syscall.h" +# syscalls.conf $Id$ +sysnames="/dev/null" +sysproto="ibcs2_proto.h" +sysproto_h=_IBCS2_SYSPROTO_H_ +syshdr="ibcs2_syscall.h" syssw="ibcs2_sysent.c" -sysarghdr="ibcs2_syscallargs.h" -compatopts="compat_43 compat_09 compat_10" -libcompatopts="" - +syshide="/dev/null" +syscallprefix="IBCS2_SYS_" switchname="ibcs2_sysent" namesname="ibcs2_syscallnames" -constprefix="IBCS2_SYS_" +sysvec="\n" diff --git a/sys/i386/ibcs2/syscalls.isc b/sys/i386/ibcs2/syscalls.isc new file mode 100644 index 0000000..149285f --- /dev/null +++ b/sys/i386/ibcs2/syscalls.isc @@ -0,0 +1,36 @@ + $Id: syscalls.isc,v 1.1 1995/10/06 15:12:52 swallace Exp $ + +#include <sys/types.h> +#include <sys/param.h> +#include <sys/sysent.h> +#include <sys/sysproto.h> +#include <i386/ibcs2/ibcs2_types.h> +#include <i386/ibcs2/ibcs2_signal.h> +#include <i386/ibcs2/ibcs2_statfs.h> +#include <i386/ibcs2/ibcs2_proto.h> +#include <i386/ibcs2/ibcs2_xenix.h> + +0 UNIMPL ISC nosys +1 UNIMPL ISC isc_setostype +2 NOPROTO ISC { int ibcs2_rename(char *from, char *to); } +3 NOPROTO ISC { int ibcs2_sigaction(int sig, \ + struct ibcs2_sigaction *act, \ + struct ibcs2_sigaction *oact); } +4 NOPROTO ISC { int ibcs2_sigprocmask(int how, ibcs2_sigset_t *set, \ + ibcs2_sigset_t *oset); } +5 NOPROTO ISC { int ibcs2_sigpending(ibcs2_sigset_t *mask); } +6 NOPROTO POSIX { int getgroups(u_int gidsetsize, gid_t *gidset); } +7 NOPROTO POSIX { int setgroups(u_int gidsetsize, gid_t *gidset); } +8 NOPROTO ISC { int ibcs2_pathconf(char *path, int name); } +9 NOPROTO ISC { int ibcs2_fpathconf(int fd, int name); } +10 UNIMPL ISC nosys +11 NOPROTO SVR3 { int ibcs2_wait(int a1, int a2, int a3); } +12 NOPROTO POSIX { int setsid(void); } +13 NOPROTO POSIX { pid_t getpid(void); } +14 UNIMPL ISC isc_adduser +15 UNIMPL ISC isc_setuser +16 NOPROTO ISC { int ibcs2_sysconf(int name); } +17 NOPROTO ISC { int ibcs2_sigsuspend(ibcs2_sigset_t *mask); } +18 NOPROTO SVR3 { int ibcs2_symlink(char *path, char *link); } +19 NOPROTO SVR3 { int ibcs2_readlink(char *path, char *buf, int count); } +20 UNIMPL ISC isc_getmajor diff --git a/sys/i386/ibcs2/syscalls.isc.conf b/sys/i386/ibcs2/syscalls.isc.conf new file mode 100644 index 0000000..fc52716 --- /dev/null +++ b/sys/i386/ibcs2/syscalls.isc.conf @@ -0,0 +1,12 @@ +# syscalls.conf $Id$ +sysnames="/dev/null" +#sysproto="ibcs2_isc.h" +sysproto="/dev/null" +sysproto_h=_IBCS2_ISC_H_ +syshdr="ibcs2_isc_syscall.h" +syssw="ibcs2_isc_sysent.c" +syshide="/dev/null" +syscallprefix="IBCS2_ISC_" +switchname="isc_sysent" +namesname="isc_syscallnames" +sysvec="\n" diff --git a/sys/i386/ibcs2/syscalls.master b/sys/i386/ibcs2/syscalls.master index db907d7..0423cd3 100644 --- a/sys/i386/ibcs2/syscalls.master +++ b/sys/i386/ibcs2/syscalls.master @@ -1,243 +1,193 @@ - $NetBSD: syscalls.master,v 1.4 1995/03/14 15:12:52 scottb Exp $ + $Id: syscalls.master,v 1.1 1995/10/06 15:12:52 swallace Exp $ ; @(#)syscalls.master 8.1 (Berkeley) 7/19/93 ; System call name/number master file (or rather, slave, from IBCS2). ; Processed to created ibcs2_sysent.c, ibcs2_syscalls.c and ibcs2_syscall.h. -; Columns: number type nargs name altname/comments +; Columns: number type nargs namespc name alt{name,tag,rtyp}/comments ; number system call number, must be in order -; type one of STD, OBSOL, UNIMPL, STD -; nargs number of arguments -; name name of syscall routine +; type one of STD, OBSOL, UNIMPL, COMPAT +; namespc one of POSIX, BSD, SVR3, SCO, NOHIDE +; name psuedo-prototype of syscall routine +; If one of the following alts is different, then all appear: ; altname name of system call if different +; alttag name of args struct tag if different from [o]`name'"_args" +; altrtyp return type if not int (bogus - syscalls always return int) ; for UNIMPL/OBSOL, name continues with comments -#include <sys/param.h> -#include <compat/ibcs2/ibcs2_types.h> -#include <compat/ibcs2/ibcs2_signal.h> -#include <compat/ibcs2/ibcs2_statfs.h> -#include <sys/systm.h> -#include <sys/signal.h> -#include <sys/mount.h> -#include <sys/syscallargs.h> -#include <compat/ibcs2/ibcs2_syscallargs.h> - ; types: ; STD always included -; STD included on COMPAT #ifdef -; LIBSTD included on COMPAT #ifdef, and placed in syscall.h +; COMPAT included on COMPAT #ifdef +; LIBCOMPAT included on COMPAT #ifdef, and placed in syscall.h ; OBSOL obsolete, not included in system, only specifies name ; UNIMPL not implemented, placeholder only +#include <sys/types.h> +#include <sys/param.h> +#include <sys/sysent.h> +#include <sys/sysproto.h> +#include <i386/ibcs2/ibcs2_types.h> +#include <i386/ibcs2/ibcs2_signal.h> +#include <i386/ibcs2/ibcs2_statfs.h> +#include <i386/ibcs2/ibcs2_proto.h> + ; #ifdef's, etc. may be included, and are copied to the output files. -0 NOARGS { int nosys(void); } syscall -1 NOARGS { int exit(int rval); } -2 NOARGS { int fork(void); } -3 STD { int ibcs2_read(int fd, char *buf, u_int nbytes); } -4 NOARGS { int write(int fd, char *buf, u_int nbytes); } -5 STD { int ibcs2_open(char *path, int flags, int mode); } -6 NOARGS { int close(int fd); } -7 STD { int ibcs2_waitsys(int a1, int a2, int a3); } -8 STD { int ibcs2_creat(char *path, int mode); } -9 NOARGS { int link(char *path, char *link); } -10 STD { int ibcs2_unlink(char *path); } -11 STD { int ibcs2_execv(char *path, char **argp); } -12 STD { int ibcs2_chdir(char *path); } -13 STD { int ibcs2_time(ibcs2_time_t *tp); } -14 STD { int ibcs2_mknod(char* path, int mode, int dev); } -15 STD { int ibcs2_chmod(char *path, int mode); } -16 STD { int ibcs2_chown(char *path, int uid, int gid); } -17 NOARGS { int obreak(caddr_t nsize); } -18 STD { int ibcs2_stat(char* path, struct ibcs2_stat *st); } -19 NOARGS { long compat_43_lseek(int fd, long offset, \ - int whence); } -20 NOARGS { pid_t getpid(void); } -21 STD { int ibcs2_mount(char *special, char *dir, int flags, \ +0 NOPROTO NOHIDE { int nosys(void); } syscall nosys_args int +1 NOPROTO NOHIDE { int exit(int rval); } +2 NOPROTO POSIX { int fork(void); } +3 STD POSIX { int ibcs2_read(int fd, char *buf, u_int nbytes); } +4 NOPROTO POSIX { int write(int fd, char *buf, u_int nbytes); } +5 STD POSIX { int ibcs2_open(char *path, int flags, int mode); } +6 NOPROTO POSIX { int close(int fd); } +7 STD SVR3 { int ibcs2_wait(int a1, int a2, int a3); } +8 STD SVR3 { int ibcs2_creat(char *path, int mode); } +9 NOPROTO POSIX { int link(char *path, char *link); } +10 STD POSIX { int ibcs2_unlink(char *path); } +11 STD NOHIDE { int ibcs2_execv(char *path, char **argp); } +12 STD POSIX { int ibcs2_chdir(char *path); } +13 STD SVR3 { int ibcs2_time(ibcs2_time_t *tp); } +14 STD SVR3 { int ibcs2_mknod(char* path, int mode, int dev); } +15 STD SVR3 { int ibcs2_chmod(char *path, int mode); } +16 STD SVR3 { int ibcs2_chown(char *path, int uid, int gid); } +17 NOPROTO SVR3 { int obreak(caddr_t nsize); } +18 STD SVR3 { int ibcs2_stat(char* path, struct ibcs2_stat *st); } +19 STD POSIX { long ibcs2_lseek(int fd, long offset, int whence); } +20 NOPROTO POSIX { pid_t getpid(void); } +21 STD SVR3 { int ibcs2_mount(char *special, char *dir, int flags,\ int fstype, char *data, int len); } -22 STD { int ibcs2_umount(char *name); } -23 STD { int ibcs2_setuid(int uid); } -24 NOARGS { uid_t getuid(void); } -25 STD { int ibcs2_stime(long *timep); } -26 UNIMPL ibcs2_ptrace -27 STD { int ibcs2_alarm(unsigned sec); } -28 STD { int ibcs2_fstat(int fd, struct ibcs2_stat *st); } -29 STD { int ibcs2_pause(void); } -30 STD { int ibcs2_utime(char *path, \ +22 STD SVR3 { int ibcs2_umount(char *name); } +23 STD POSIX { int ibcs2_setuid(int uid); } +24 NOPROTO SVR3 { uid_t getuid(void); } +25 STD SVR3 { int ibcs2_stime(long *timep); } +26 NOPROTO SVR3 { int ptrace(int req, pid_t pid, caddr_t addr, \ + int data); } +27 STD SVR3 { int ibcs2_alarm(unsigned sec); } +28 STD SVR3 { int ibcs2_fstat(int fd, struct ibcs2_stat *st); } +29 STD SVR3 { int ibcs2_pause(void); } +30 STD SVR3 { int ibcs2_utime(char *path, \ struct ibcs2_utimbuf *buf); } -31 UNIMPL was stty -32 UNIMPL was gtty -33 STD { int ibcs2_access(char *path, int flags); } -34 STD { int ibcs2_nice(int incr); } -35 STD { int ibcs2_statfs(char *path, \ +31 STD SCO { int ibcs2_stty(int fd, struct sgttyb *buf); } +32 STD SCO { int ibcs2_gtty(int fd, struct sgttyb *buf); } +33 STD POSIX { int ibcs2_access(char *path, int flags); } +34 STD SVR3 { int ibcs2_nice(int incr); } +35 STD SVR3 { int ibcs2_statfs(char *path, \ struct ibcs2_statfs *buf, \ int len, int fstype); } -36 NOARGS { int sync(void); } -37 STD { int ibcs2_kill(int pid, int signo); } -38 STD { int ibcs2_fstatfs(int fd, struct ibcs2_statfs *buf, \ +36 NOPROTO SVR3 { int sync(void); } +37 STD POSIX { int ibcs2_kill(int pid, int signo); } +38 STD SVR3 { int ibcs2_fstatfs(int fd, struct ibcs2_statfs *buf, \ int len, int fstype); } -39 STD { int ibcs2_pgrpsys(int type, caddr_t dummy, int pid, \ +39 STD SVR3 { int ibcs2_pgrpsys(int type, caddr_t dummy, int pid, \ int pgid); } -40 UNIMPL ibcs2_xenix -41 NOARGS { int dup(u_int fd); } -42 NOARGS { int pipe(void); } -43 STD { int ibcs2_times(struct tms *tp); } -44 UNIMPL profil -45 STD { int ibcs2_plock(int cmd); } -46 STD { int ibcs2_setgid(int gid); } -47 NOARGS { gid_t getgid(void); } -48 STD { int ibcs2_sigsys(int sig, ibcs2_sig_t fp); } +40 STD SCO { int ibcs2_xenix(int a1, int a2, int a3, int a4, \ + int a5); } +41 NOPROTO POSIX { int dup(u_int fd); } +42 NOPROTO POSIX { int pipe(void); } +43 STD SVR3 { int ibcs2_times(struct tms *tp); } +44 NOPROTO SVR3 { int profil(caddr_t samples, u_int size, \ + u_int offset, u_int scale); } +45 STD SVR3 { int ibcs2_plock(int cmd); } +46 STD SVR3 { int ibcs2_setgid(int gid); } +47 NOPROTO SVR3 { gid_t getgid(void); } +48 STD SVR3 { int ibcs2_sigsys(int sig, ibcs2_sig_t fp); } #ifdef SYSVMSG -49 STD { int ibcs2_msgsys(int which, int a2, int a3, int a4, \ +49 STD SVR3 { int ibcs2_msgsys(int which, int a2, int a3, int a4, \ int a5, int a6); } #else -49 UNIMPL nosys +49 UNIMPL SVR3 nosys #endif -50 UNIMPL ibcs2_sys3b -51 UNIMPL ibcs2_acct +50 STD SVR3 { int ibcs2_sysi86(int cmd, int *arg); } +51 UNIMPL SVR3 ibcs2_acct #ifdef SYSVSHM -52 STD { int ibcs2_shmsys(int which, int a2, int a3, int a4); } +52 STD SVR3 { int ibcs2_shmsys(int which, int a2, int a3, int a4); } #else -52 UNIMPL nosys +52 UNIMPL SVR3 nosys #endif #ifdef SYSVSEM -53 STD { int ibcs2_semsys(int which, int a2, int a3, int a4, \ +53 STD SVR3 { int ibcs2_semsys(int which, int a2, int a3, int a4, \ int a5); } #else -53 UNIMPL nosys +53 UNIMPL SVR3 nosys #endif -54 STD { int ibcs2_ioctl(int fd, int cmd, caddr_t data); } -55 STD { int ibcs2_uadmin(int cmd, int func, caddr_t data); } -56 UNIMPL nosys -57 STD { int ibcs2_utssys(int a1, int a2, int flag); } -58 UNIMPL nosys -59 STD { int ibcs2_execve(char *path, char **argp, \ +54 STD SVR3 { int ibcs2_ioctl(int fd, int cmd, caddr_t data); } +55 STD SVR3 { int ibcs2_uadmin(int cmd, int func, caddr_t data); } +56 UNIMPL SVR3 nosys +57 STD SVR3 { int ibcs2_utssys(int a1, int a2, int flag); } +58 NOPROTO POSIX { int fsync(int fd); } +59 STD SVR3 { int ibcs2_execve(char *path, char **argp, \ char **envp); } -60 NOARGS { int umask(int newmask); } -61 NOARGS { int chroot(char *path); } -62 STD { int ibcs2_fcntl(int fd, int cmd, char *arg); } -63 STD { long ibcs2_ulimit(int cmd, int newlimit); } -64 UNIMPL reserved for unix/pc -65 UNIMPL reserved for unix/pc -66 UNIMPL reserved for unix/pc -67 UNIMPL reserved for unix/pc -68 UNIMPL reserved for unix/pc -69 UNIMPL reserved for unix/pc -70 OBSOL rfs_advfs -71 OBSOL rfs_unadvfs -72 OBSOL rfs_rmount -73 OBSOL rfs_rumount -74 OBSOL rfs_rfstart -75 OBSOL rfs_sigret -76 OBSOL rfs_rdebug -77 OBSOL rfs_rfstop -78 UNIMPL rfs_rfsys -79 STD { int ibcs2_rmdir(char *path); } -80 STD { int ibcs2_mkdir(char *path, int mode); } -81 STD { int ibcs2_getdents(int fd, char *buf, int nbytes); } -82 UNIMPL nosys -83 UNIMPL nosys -84 STD { int ibcs2_sysfs(int cmd, caddr_t d1, char *buf); } -85 STD { int ibcs2_getmsg(int fd, struct ibcs2_stropts *ctl, \ +60 NOPROTO SVR3 { int umask(int newmask); } +61 NOPROTO SVR3 { int chroot(char *path); } +62 STD SVR3 { int ibcs2_fcntl(int fd, int cmd, char *arg); } +63 STD SVR3 { long ibcs2_ulimit(int cmd, int newlimit); } +64 UNIMPL SVR3 reserved for unix/pc +65 UNIMPL SVR3 reserved for unix/pc +66 UNIMPL SVR3 reserved for unix/pc +67 UNIMPL SVR3 reserved for unix/pc +68 UNIMPL SVR3 reserved for unix/pc +69 UNIMPL SVR3 reserved for unix/pc +70 OBSOL SVR3 rfs_advfs +71 OBSOL SVR3 rfs_unadvfs +72 OBSOL SVR3 rfs_rmount +73 OBSOL SVR3 rfs_rumount +74 OBSOL SVR3 rfs_rfstart +75 OBSOL SVR3 rfs_sigret +76 OBSOL SVR3 rfs_rdebug +77 OBSOL SVR3 rfs_rfstop +78 UNIMPL SVR3 rfs_rfsys +79 STD SVR3 { int ibcs2_rmdir(char *path); } +80 STD SVR3 { int ibcs2_mkdir(char *path, int mode); } +81 STD SVR3 { int ibcs2_getdents(int fd, char *buf, int nbytes); } +82 UNIMPL SVR3 nosys +83 UNIMPL SVR3 nosys +84 STD SVR3 { int ibcs2_sysfs(int cmd, caddr_t d1, char *buf); } +85 STD SVR3 { int ibcs2_getmsg(int fd, struct ibcs2_stropts *ctl, \ struct ibcs2_stropts *dat, \ int *flags); } -86 STD { int ibcs2_putmsg(int fd, struct ibcs2_stropts *ctl, \ +86 STD SVR3 { int ibcs2_putmsg(int fd, struct ibcs2_stropts *ctl, \ struct ibcs2_stropts *dat, \ int flags); } -87 STD { int ibcs2_poll(struct ibcs2_pollfd *fds, long nfds, \ +87 STD SVR3 { int ibcs2_poll(struct ibcs2_poll *fds, long nfds, \ int timeout); } -88 UNIMPL nosys -89 UNIMPL nosys -90 STD { int ibcs2_symlink(char *path, char *link); } -91 STD { int ibcs2_lstat(char *path, struct ibcs2_stat *st); } -92 STD { int ibcs2_readlink(char *path, char *buf, int count); } -93 UNIMPL nosys -94 UNIMPL nosys -95 UNIMPL nosys -96 UNIMPL nosys -97 UNIMPL nosys -98 UNIMPL nosys -99 UNIMPL nosys -100 UNIMPL nosys -101 UNIMPL nosys -102 UNIMPL nosys -103 NOARGS { int sigreturn(struct sigcontext *sigcntxp); } -104 UNIMPL nosys -105 UNIMPL nosys -106 UNIMPL nosys -107 UNIMPL nosys -108 UNIMPL nosys -109 UNIMPL nosys -110 UNIMPL nosys -111 UNIMPL nosys -112 UNIMPL nosys -113 UNIMPL nosys -114 UNIMPL nosys -115 UNIMPL nosys -116 UNIMPL nosys -117 UNIMPL nosys -118 UNIMPL nosys -119 UNIMPL nosys -120 UNIMPL nosys -121 UNIMPL nosys -122 UNIMPL nosys -123 UNIMPL nosys -124 UNIMPL nosys -125 UNIMPL nosys -126 UNIMPL nosys -127 UNIMPL nosys -128 UNIMPL nosys -129 UNIMPL xenix_xlocking -130 UNIMPL xenix_creatsem -131 UNIMPL xenix_opensem -132 UNIMPL xenix_sigsem -133 UNIMPL xenix_waitsem -134 UNIMPL xenix_nbwaitsem -135 STD { int xenix_rdchk(int fd); } -136 UNIMPL nosys -137 UNIMPL nosys -138 STD { int xenix_chsize(int fd, long size); } -139 STD { int xenix_ftime(struct xenix_timeb *tp); } -140 STD { int xenix_nap(int millisec); } -141 UNIMPL xenix_sdget -142 UNIMPL xenix_sdfree -143 UNIMPL xenix_sdenter -144 UNIMPL xenix_sdleave -145 UNIMPL xenix_sdgetv -146 UNIMPL xenix_sdwaitv -147 UNIMPL nosys -148 UNIMPL nosys -149 UNIMPL nosys -150 UNIMPL nosys -151 UNIMPL nosys -152 UNIMPL nosys -153 UNIMPL nosys -154 UNIMPL nosys -155 UNIMPL nosys -156 UNIMPL nosys -157 UNIMPL nosys -158 UNIMPL nosys -159 UNIMPL nosys -160 UNIMPL xenix_proctl -161 UNIMPL xenix_execseg -162 UNIMPL xenix_unexecseg -163 UNIMPL nosys -164 NOARGS { int select(u_int nd, fd_set *in, fd_set *ou, \ - fd_set *ex, struct timeval *tv); } -165 UNIMPL xenix_eaccess -166 UNIMPL xenix_paccess -167 STD { int ibcs2_sigaction(int sig, \ - struct ibcs2_sigaction *act, \ - struct ibcs2_sigaction *oact); } -168 STD { int ibcs2_sigprocmask(int how, ibcs2_sigset_t *set, \ - ibcs2_sigset_t *oset); } -169 STD { int ibcs2_sigpending(ibcs2_sigset_t *mask); } -170 STD { int ibcs2_sigsuspend(ibcs2_sigset_t *mask); } -171 STD { int ibcs2_getgroups(int gidsetsize, \ - ibcs2_gid_t *gidset); } -172 STD { int ibcs2_setgroups(int gidsetsize, \ - ibcs2_gid_t *gidset); } -173 STD { int ibcs2_sysconf(int name); } -174 STD { int ibcs2_pathconf(char *path, int name); } -175 STD { int ibcs2_fpathconf(int fd, int name); } -176 STD { int ibcs2_rename(char *from, char *to); } +88 UNIMPL SVR3 nosys +89 STD SVR3 { int ibcs2_secure(int cmd, int a1, int a2, int a3, \ + int a4, int a5); } +90 STD SVR3 { int ibcs2_symlink(char *path, char *link); } +91 STD SVR3 { int ibcs2_lstat(char *path, struct ibcs2_stat *st); } +92 STD SVR3 { int ibcs2_readlink(char *path, char *buf, int count); } +93 UNIMPL NOHIDE nosys +94 UNIMPL NOHIDE nosys +95 UNIMPL NOHIDE nosys +96 UNIMPL NOHIDE nosys +97 UNIMPL NOHIDE nosys +98 UNIMPL NOHIDE nosys +99 UNIMPL NOHIDE nosys +100 UNIMPL NOHIDE nosys +101 UNIMPL NOHIDE nosys +102 UNIMPL NOHIDE nosys +103 NOPROTO POSIX { int sigreturn(struct sigcontext *sigcntxp); } +104 UNIMPL NOHIDE nosys +105 STD SCO { int ibcs2_isc(void); } +106 UNIMPL NOHIDE nosys +107 UNIMPL NOHIDE nosys +108 UNIMPL NOHIDE nosys +109 UNIMPL NOHIDE nosys +110 UNIMPL NOHIDE nosys +111 UNIMPL NOHIDE nosys +112 UNIMPL NOHIDE nosys +113 UNIMPL NOHIDE nosys +114 UNIMPL NOHIDE nosys +115 UNIMPL NOHIDE nosys +116 UNIMPL NOHIDE nosys +117 UNIMPL NOHIDE nosys +118 UNIMPL NOHIDE nosys +119 UNIMPL NOHIDE nosys +120 UNIMPL NOHIDE nosys +121 UNIMPL NOHIDE nosys +122 UNIMPL NOHIDE nosys +123 UNIMPL NOHIDE nosys +124 UNIMPL NOHIDE nosys +125 UNIMPL NOHIDE nosys +126 UNIMPL NOHIDE nosys +127 UNIMPL NOHIDE nosys diff --git a/sys/i386/ibcs2/syscalls.xenix b/sys/i386/ibcs2/syscalls.xenix new file mode 100644 index 0000000..d22554d --- /dev/null +++ b/sys/i386/ibcs2/syscalls.xenix @@ -0,0 +1,75 @@ + $Id: syscalls.xenix,v 1.1 1995/10/06 15:12:52 swallace Exp $ + +#include <sys/types.h> +#include <sys/param.h> +#include <sys/sysent.h> +#include <sys/sysproto.h> +#include <i386/ibcs2/ibcs2_types.h> +#include <i386/ibcs2/ibcs2_signal.h> +#include <i386/ibcs2/ibcs2_statfs.h> +#include <i386/ibcs2/ibcs2_xenix.h> + +0 UNIMPL XENIX nosys +1 UNIMPL XENIX xenix_xlocking +2 UNIMPL XENIX xenix_creatsem +3 UNIMPL XENIX xenix_opensem +4 UNIMPL XENIX xenix_sigsem +5 UNIMPL XENIX xenix_waitsem +6 UNIMPL XENIX xenix_nbwaitsem +7 STD XENIX { int xenix_rdchk(int fd); } +8 UNIMPL XENIX nosys +9 UNIMPL XENIX nosys +10 STD XENIX { int xenix_chsize(int fd, long size); } +11 STD XENIX { int xenix_ftime(struct timeb *tp); } +12 STD XENIX { int xenix_nap(int millisec); } +13 UNIMPL XENIX xenix_sdget +14 UNIMPL XENIX xenix_sdfree +15 UNIMPL XENIX xenix_sdenter +16 UNIMPL XENIX xenix_sdleave +17 UNIMPL XENIX xenix_sdgetv +18 UNIMPL XENIX xenix_sdwaitv +19 UNIMPL XENIX nosys +20 UNIMPL XENIX nosys +21 STD XENIX { int xenix_scoinfo(void); } +22 UNIMPL XENIX nosys +23 UNIMPL XENIX nosys +24 UNIMPL XENIX nosys +25 UNIMPL XENIX nosys +26 UNIMPL XENIX nosys +27 UNIMPL XENIX nosys +28 UNIMPL XENIX nosys +29 UNIMPL XENIX nosys +30 UNIMPL XENIX nosys +31 UNIMPL XENIX nosys +32 UNIMPL XENIX xenix_proctl +33 UNIMPL XENIX xenix_execseg +34 UNIMPL XENIX xenix_unexecseg +35 UNIMPL XENIX nosys +36 NOPROTO XENIX { int select(u_int nd, fd_set *in, fd_set *ou, \ + fd_set *ex, struct timeval *tv); } +37 UNIMPL XENIX xenix_eaccess +38 UNIMPL XENIX xenix_paccess +39 STD XENIX { int ibcs2_sigaction(int sig, \ + struct ibcs2_sigaction *act, \ + struct ibcs2_sigaction *oact); } +40 STD XENIX { int ibcs2_sigprocmask(int how, ibcs2_sigset_t *set, \ + ibcs2_sigset_t *oset); } +41 STD XENIX { int ibcs2_sigpending(ibcs2_sigset_t *mask); } +42 STD XENIX { int ibcs2_sigsuspend(ibcs2_sigset_t *mask); } +43 STD XENIX { int ibcs2_getgroups(int gidsetsize, \ + ibcs2_gid_t *gidset); } +44 STD XENIX { int ibcs2_setgroups(int gidsetsize, \ + ibcs2_gid_t *gidset); } +45 STD XENIX { int ibcs2_sysconf(int name); } +46 STD XENIX { int ibcs2_pathconf(char *path, int name); } +47 STD XENIX { int ibcs2_fpathconf(int fd, int name); } +48 STD XENIX { int ibcs2_rename(char *from, char *to); } +49 UNIMPL XENIX nosys +50 STD XENIX { int xenix_utsname(long addr); } +51 UNIMPL XENIX nosys +52 UNIMPL XENIX nosys +53 UNIMPL XENIX nosys +54 UNIMPL XENIX nosys +55 NOPROTO XENIX { int getitimer(u_int which, struct itimerval *itv); } +56 NOPROTO XENIX { int setitimer(u_int which, struct itimerval *itv, \ + struct itimerval *otv); } diff --git a/sys/i386/ibcs2/syscalls.xenix.conf b/sys/i386/ibcs2/syscalls.xenix.conf new file mode 100644 index 0000000..742080e --- /dev/null +++ b/sys/i386/ibcs2/syscalls.xenix.conf @@ -0,0 +1,11 @@ +# syscalls.conf $Id$ +sysnames="/dev/null" +sysproto="ibcs2_xenix.h" +sysproto_h=_IBCS2_XENIX_H_ +syshdr="ibcs2_xenix_syscall.h" +syssw="ibcs2_xenix_sysent.c" +syshide="/dev/null" +syscallprefix="IBCS2_XENIX_" +switchname="xenix_sysent" +namesname="xenix_syscallnames" +sysvec="\n" |