summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorswallace <swallace@FreeBSD.org>1995-10-10 07:59:30 +0000
committerswallace <swallace@FreeBSD.org>1995-10-10 07:59:30 +0000
commit20f13c7a7ed3183879431f56c3761a1c7914af8a (patch)
tree81a969abda60acfc5b1785850773a90772c8c462
parent6c1c648223be1d6caaddff391d1d2946ebc316a2 (diff)
downloadFreeBSD-src-20f13c7a7ed3183879431f56c3761a1c7914af8a.zip
FreeBSD-src-20f13c7a7ed3183879431f56c3761a1c7914af8a.tar.gz
Remove old files no longer needed.
Add new files created for emulator. Modify NetBSD import to work with FreeBSD and add new features and code. The complete emulator is essentially a combination of work/code implemented by Sean Eric Fagan, Soren Schmidt, Scott Bartram, and myself, Steven Wallace. Features of this new emulator system include: o "clean" code, including strict prototyping. o Auto-generation of ibcs2 system calls, xenix system calls, isc system calls. Generation includes system tables, structure definitions, and prototyping of function calls. o ibcs2 emulator does not rely on any COMPAT_43 system calls. o embedded socksys support o ibcs2 msgsys, semsys, shmsys calls supported if supported in kernel o alternate /emul/ibcs2 namespace searched first for files in ibcs2 system. Usefull to keep sysv libraries, binaries in /emul/ibcs2. o many other finer details and functions fixed or implemented.
-rw-r--r--sys/i386/ibcs2/ibcs2_dirent.h2
-rw-r--r--sys/i386/ibcs2/ibcs2_errno.c4
-rw-r--r--sys/i386/ibcs2/ibcs2_fcntl.c45
-rw-r--r--sys/i386/ibcs2/ibcs2_fcntl.h3
-rw-r--r--sys/i386/ibcs2/ibcs2_ioctl.c1419
-rw-r--r--sys/i386/ibcs2/ibcs2_ioctl.h55
-rw-r--r--sys/i386/ibcs2/ibcs2_ipc.c388
-rw-r--r--sys/i386/ibcs2/ibcs2_ipc.h76
-rw-r--r--sys/i386/ibcs2/ibcs2_isc.c170
-rw-r--r--sys/i386/ibcs2/ibcs2_isc_syscall.h23
-rw-r--r--sys/i386/ibcs2/ibcs2_isc_sysent.c49
-rw-r--r--sys/i386/ibcs2/ibcs2_misc.c1635
-rw-r--r--sys/i386/ibcs2/ibcs2_msg.c142
-rw-r--r--sys/i386/ibcs2/ibcs2_other.c76
-rw-r--r--sys/i386/ibcs2/ibcs2_poll.h51
-rw-r--r--sys/i386/ibcs2/ibcs2_proto.h359
-rw-r--r--sys/i386/ibcs2/ibcs2_signal.c763
-rw-r--r--sys/i386/ibcs2/ibcs2_signal.h18
-rw-r--r--sys/i386/ibcs2/ibcs2_socksys.c1441
-rw-r--r--sys/i386/ibcs2/ibcs2_socksys.h466
-rw-r--r--sys/i386/ibcs2/ibcs2_stat.c66
-rw-r--r--sys/i386/ibcs2/ibcs2_stat.h2
-rw-r--r--sys/i386/ibcs2/ibcs2_syscall.h32
-rw-r--r--sys/i386/ibcs2/ibcs2_sysent.c647
-rw-r--r--sys/i386/ibcs2/ibcs2_sysi86.c51
-rw-r--r--sys/i386/ibcs2/ibcs2_sysvec.c50
-rw-r--r--sys/i386/ibcs2/ibcs2_termios.h2
-rw-r--r--sys/i386/ibcs2/ibcs2_time.h2
-rw-r--r--sys/i386/ibcs2/ibcs2_ustat.h2
-rw-r--r--sys/i386/ibcs2/ibcs2_util.c2
-rw-r--r--sys/i386/ibcs2/ibcs2_util.h13
-rw-r--r--sys/i386/ibcs2/ibcs2_utime.h2
-rw-r--r--sys/i386/ibcs2/ibcs2_xenix.c367
-rw-r--r--sys/i386/ibcs2/ibcs2_xenix.h95
-rw-r--r--sys/i386/ibcs2/ibcs2_xenix_syscall.h27
-rw-r--r--sys/i386/ibcs2/ibcs2_xenix_sysent.c84
-rw-r--r--sys/i386/ibcs2/imgact_coff.c121
-rw-r--r--sys/i386/ibcs2/syscalls.conf17
-rw-r--r--sys/i386/ibcs2/syscalls.isc36
-rw-r--r--sys/i386/ibcs2/syscalls.isc.conf12
-rw-r--r--sys/i386/ibcs2/syscalls.master358
-rw-r--r--sys/i386/ibcs2/syscalls.xenix75
-rw-r--r--sys/i386/ibcs2/syscalls.xenix.conf11
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"
OpenPOWER on IntegriCloud