From 298315121605b714b1b849a356a8da3aa5b1b20a Mon Sep 17 00:00:00 2001 From: Steven Wallace Date: Thu, 28 Mar 1996 19:53:21 +0000 Subject: [PATCH] Implement ioctl's IBCS2_TCFLSH and IBCS2_TCXONC. Improve termios conversion. Implement xenix_eaccess() system call. Obtained from: NetBSD --- sys/i386/ibcs2/ibcs2_ioctl.c | 62 ++++++++++++++++++++++------ sys/i386/ibcs2/ibcs2_xenix.c | 41 ++++++++++++++++-- sys/i386/ibcs2/ibcs2_xenix.h | 5 +++ sys/i386/ibcs2/ibcs2_xenix_syscall.h | 1 + sys/i386/ibcs2/syscalls.xenix | 4 +- 5 files changed, 96 insertions(+), 17 deletions(-) diff --git a/sys/i386/ibcs2/ibcs2_ioctl.c b/sys/i386/ibcs2/ibcs2_ioctl.c index 08e06c626268..082d6081ebc2 100644 --- a/sys/i386/ibcs2/ibcs2_ioctl.c +++ b/sys/i386/ibcs2/ibcs2_ioctl.c @@ -210,10 +210,15 @@ stios2btios(st, bt) 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; + if (bt->c_lflag & ICANON) { + 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; + } else { + bt->c_cc[VMIN] = st->c_cc[IBCS2_VMIN]; + bt->c_cc[VTIME] = st->c_cc[IBCS2_VTIME]; + } bt->c_cc[VEOL2] = st->c_cc[IBCS2_VEOL2] ? st->c_cc[IBCS2_VEOL2] : _POSIX_VDISABLE; #if 0 @@ -301,10 +306,15 @@ btios2stios(bt, st) 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; + if (bt->c_lflag & ICANON) { + 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; + } else { + st->c_cc[IBCS2_VMIN] = bt->c_cc[VMIN]; + st->c_cc[IBCS2_VTIME] = bt->c_cc[VTIME]; + } st->c_cc[IBCS2_VEOL2] = bt->c_cc[VEOL2] != _POSIX_VDISABLE ? bt->c_cc[VEOL2] : 0; st->c_cc[IBCS2_VSWTCH] = @@ -470,12 +480,40 @@ ibcs2_ioctl(p, uap, retval) return ENOSYS; case IBCS2_TCXONC: - DPRINTF(("ibcs2_ioctl(%d): TCXONC ", p->p_pid)); - return ENOSYS; + { + switch ((int)SCARG(uap, data)) { + case 0: + case 1: + DPRINTF(("ibcs2_ioctl(%d): TCXONC ", p->p_pid)); + return ENOSYS; + case 2: + return (*ctl)(fp, TIOCSTOP, (caddr_t)0, p); + case 3: + return (*ctl)(fp, TIOCSTART, (caddr_t)1, p); + default: + return EINVAL; + } + } case IBCS2_TCFLSH: - DPRINTF(("ibcs2_ioctl(%d): TCFLSH ", p->p_pid)); - return ENOSYS; + { + int arg; + + switch ((int)SCARG(uap, data)) { + case 0: + arg = FREAD; + break; + case 1: + arg = FWRITE; + break; + case 2: + arg = FREAD | FWRITE; + break; + default: + return EINVAL; + } + return (*ctl)(fp, TIOCFLUSH, (caddr_t)&arg, p); + } case IBCS2_TIOCGWINSZ: SCARG(uap, cmd) = TIOCGWINSZ; diff --git a/sys/i386/ibcs2/ibcs2_xenix.c b/sys/i386/ibcs2/ibcs2_xenix.c index b2b2790e9f5e..763b2407164b 100644 --- a/sys/i386/ibcs2/ibcs2_xenix.c +++ b/sys/i386/ibcs2/ibcs2_xenix.c @@ -27,11 +27,12 @@ * (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.2 1995/02/03 21:31:35 bde Exp $ + * $Id: ibcs2_xenix.c,v 1.6 1995/10/10 07:59:19 swallace Exp $ */ #include #include +#include #include #include #include @@ -50,6 +51,7 @@ #include #include +#include #include #include #include @@ -144,7 +146,7 @@ xenix_nap(struct proc *p, struct xenix_nap_args *uap, int *retval) } int -xenix_utsname(struct proc *p, struct xenix_utsname_args *args, int *retval) +xenix_utsname(struct proc *p, struct xenix_utsname_args *uap, int *retval) { struct ibcs2_sco_utsname { char sysname[9]; @@ -173,7 +175,7 @@ xenix_utsname(struct proc *p, struct xenix_utsname_args *args, int *retval) ibcs2_sco_uname.sysorigin = 0xFFFF; ibcs2_sco_uname.sysoem = 0xFFFF; ibcs2_sco_uname.numcpu = 1; - return copyout((caddr_t)&ibcs2_sco_uname, (caddr_t)args->addr, + return copyout((caddr_t)&ibcs2_sco_uname, (caddr_t)uap->addr, sizeof(struct ibcs2_sco_utsname)); } @@ -184,3 +186,36 @@ xenix_scoinfo(struct proc *p, struct xenix_scoinfo_args *uap, int *retval) *retval = 0; return 0; } + +int +xenix_eaccess(struct proc *p, struct xenix_eaccess_args *uap, int *retval) +{ + struct ucred *cred = p->p_ucred; + struct vnode *vp; + struct nameidata nd; + int error, flags; + caddr_t sg = stackgap_init(); + + CHECKALTEXIST(p, &sg, SCARG(uap, path)); + + NDINIT(&nd, LOOKUP, FOLLOW | LOCKLEAF, UIO_USERSPACE, + SCARG(uap, path), p); + if (error = namei(&nd)) + return error; + vp = nd.ni_vp; + + /* Flags == 0 means only check for existence. */ + if (SCARG(uap, flags)) { + flags = 0; + if (SCARG(uap, flags) & IBCS2_R_OK) + flags |= VREAD; + if (SCARG(uap, flags) & IBCS2_W_OK) + flags |= VWRITE; + if (SCARG(uap, flags) & IBCS2_X_OK) + flags |= VEXEC; + if ((flags & VWRITE) == 0 || (error = vn_writechk(vp)) == 0) + error = VOP_ACCESS(vp, flags, cred, p); + } + vput(vp); + return error; +} diff --git a/sys/i386/ibcs2/ibcs2_xenix.h b/sys/i386/ibcs2/ibcs2_xenix.h index 99cf49bb8423..3b0cade63ab2 100644 --- a/sys/i386/ibcs2/ibcs2_xenix.h +++ b/sys/i386/ibcs2/ibcs2_xenix.h @@ -28,6 +28,10 @@ struct xenix_nap_args { struct xenix_scoinfo_args { int dummy; }; +struct xenix_eaccess_args { + char * path; + int flags; +}; struct ibcs2_sigaction_args { int sig; struct ibcs2_sigaction * act; @@ -75,6 +79,7 @@ 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 xenix_eaccess __P((struct proc *, struct xenix_eaccess_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 [])); diff --git a/sys/i386/ibcs2/ibcs2_xenix_syscall.h b/sys/i386/ibcs2/ibcs2_xenix_syscall.h index d038068ff111..e1fb72fb06c5 100644 --- a/sys/i386/ibcs2/ibcs2_xenix_syscall.h +++ b/sys/i386/ibcs2/ibcs2_xenix_syscall.h @@ -11,6 +11,7 @@ #define IBCS2_XENIX_xenix_nap 12 #define IBCS2_XENIX_xenix_scoinfo 21 #define IBCS2_XENIX_select 36 +#define IBCS2_XENIX_xenix_eaccess 37 #define IBCS2_XENIX_ibcs2_sigaction 39 #define IBCS2_XENIX_ibcs2_sigprocmask 40 #define IBCS2_XENIX_ibcs2_sigpending 41 diff --git a/sys/i386/ibcs2/syscalls.xenix b/sys/i386/ibcs2/syscalls.xenix index d22554d07678..82bed7fac34e 100644 --- a/sys/i386/ibcs2/syscalls.xenix +++ b/sys/i386/ibcs2/syscalls.xenix @@ -1,4 +1,4 @@ - $Id: syscalls.xenix,v 1.1 1995/10/06 15:12:52 swallace Exp $ + $Id: syscalls.xenix,v 1.1 1995/10/10 07:59:29 swallace Exp $ #include #include @@ -47,7 +47,7 @@ 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 +37 STD XENIX { int xenix_eaccess(char *path, int flags); } 38 UNIMPL XENIX xenix_paccess 39 STD XENIX { int ibcs2_sigaction(int sig, \ struct ibcs2_sigaction *act, \