Print this page
MFV: illumos-gate@39cc040ff7c0c62aae858381f21d0567dd60042e
9967 dflt_termios and base_termios need update
Reviewed by: Andy Fiddaman <omnios@citrus-it.net>
Reviewed by: Jason King <jason.king@joyent.com>
Approved by: Dan McDonald <danmcd@joyent.com>
Author: Toomas Soome <tsoome@me.com>
9042 multiples of tty streams modules cause weirdness
Reviewed by: Randy Fishel <randyf@sibernet.com>
Reviewed by: Carlos Neira <cneirabustos@gmail.com>
Approved by: Hans Rosenfeld <rosenfeld@grumpf.hope-2000.org>
*** 19,28 ****
--- 19,29 ----
* CDDL HEADER END
*/
/*
* Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
+ * Copyright 2018 OmniOS Community Edition (OmniOSce) Association.
*/
/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
/* All Rights Reserved */
*** 71,81 ****
static struct streamtab ttcoinfo;
static struct fmodsw fsw = {
"ttcompat",
&ttcoinfo,
! D_MTQPAIR | D_MP
};
/*
* Module linkage information for the kernel.
*/
--- 72,82 ----
static struct streamtab ttcoinfo;
static struct fmodsw fsw = {
"ttcompat",
&ttcoinfo,
! D_MTQPAIR | D_MP | _D_SINGLE_INSTANCE
};
/*
* Module linkage information for the kernel.
*/
*** 154,178 ****
&ttycompatwinit,
NULL,
NULL
};
- /*
- * This is the termios structure that is used to reset terminal settings
- * when the underlying device is an instance of zcons. It came from
- * cmd/init/init.c and should be kept in-sync with dflt_termios found therein.
- */
- static const struct termios base_termios = {
- BRKINT|ICRNL|IXON|IMAXBEL, /* iflag */
- OPOST|ONLCR|TAB3, /* oflag */
- CS8|CREAD|B9600, /* cflag */
- ISIG|ICANON|ECHO|ECHOE|ECHOK|ECHOCTL|ECHOKE|IEXTEN, /* lflag */
- CINTR, CQUIT, CERASE, CKILL, CEOF, 0, 0, 0, 0, 0, 0, 0, /* c_cc vals */
- 0, 0, 0, 0, 0, 0, 0
- };
-
-
static void ttcompat_do_ioctl(ttcompat_state_t *, queue_t *, mblk_t *);
static void ttcompat_ioctl_ack(queue_t *, mblk_t *);
static void ttcopyout(queue_t *, mblk_t *);
static void ttcompat_ioctl_nak(queue_t *, mblk_t *);
static void from_compat(compat_state_t *, struct termios *);
--- 155,164 ----
*** 184,197 ****
/*ARGSUSED*/
static int
ttcompatopen(queue_t *q, dev_t *devp, int oflag, int sflag, cred_t *crp)
{
ttcompat_state_t *tp;
- mblk_t *mp;
- mblk_t *datamp;
- struct iocblk *iocb;
- int error;
if (q->q_ptr != NULL) {
tp = (ttcompat_state_t *)q->q_ptr;
/* fail open if TIOCEXCL was done and its not privileged */
if ((tp->t_new_lflags & XCLUDE) &&
--- 170,179 ----
*** 199,295 ****
return (EBUSY);
}
return (0); /* already attached */
}
tp = kmem_zalloc(sizeof (ttcompat_state_t), KM_SLEEP);
- tp->t_iocpending = NULL;
- tp->t_state = 0;
- tp->t_iocid = 0;
- tp->t_ioccmd = 0;
- tp->t_new_lflags = 0;
- tp->t_curstate.t_flags = 0;
- tp->t_curstate.t_ispeed = B0;
- tp->t_curstate.t_ospeed = B0;
- tp->t_curstate.t_erase = '\0';
- tp->t_curstate.t_kill = '\0';
- tp->t_curstate.t_intrc = '\0';
- tp->t_curstate.t_quitc = '\0';
- tp->t_curstate.t_startc = '\0';
- tp->t_curstate.t_stopc = '\0';
- tp->t_curstate.t_eofc = '\0';
- tp->t_curstate.t_brkc = '\0';
- tp->t_curstate.t_suspc = '\0';
- tp->t_curstate.t_dsuspc = '\0';
- tp->t_curstate.t_rprntc = '\0';
- tp->t_curstate.t_flushc = '\0';
- tp->t_curstate.t_werasc = '\0';
- tp->t_curstate.t_lnextc = '\0';
- tp->t_curstate.t_xflags = 0;
- tp->t_bufcallid = 0;
- tp->t_arg = 0;
-
q->q_ptr = tp;
WR(q)->q_ptr = tp;
qprocson(q);
- /*
- * Determine if the underlying device is a zcons instance. If so,
- * then issue a termios ioctl to reset the terminal settings.
- */
- if (getmajor(q->q_stream->sd_vnode->v_rdev) !=
- ddi_name_to_major("zcons"))
return (0);
-
- /*
- * Create the ioctl message.
- */
- if ((mp = mkiocb(TCSETSF)) == NULL) {
- error = ENOMEM;
- goto common_error;
- }
- if ((datamp = allocb(sizeof (struct termios), BPRI_HI)) == NULL) {
- freemsg(mp);
- error = ENOMEM;
- goto common_error;
- }
- iocb = (struct iocblk *)mp->b_rptr;
- iocb->ioc_count = sizeof (struct termios);
- bcopy(&base_termios, datamp->b_rptr, sizeof (struct termios));
- datamp->b_wptr += sizeof (struct termios);
- mp->b_cont = datamp;
-
- /*
- * Send the ioctl message on its merry way toward the driver.
- * Set some state beforehand so we can properly wait for
- * an acknowledgement.
- */
- tp->t_state |= TS_IOCWAIT | TS_TIOCNAK;
- tp->t_iocid = iocb->ioc_id;
- tp->t_ioccmd = TCSETSF;
- putnext(WR(q), mp);
-
- /*
- * Wait for an acknowledgement. A NAK is treated as an error.
- * The presence of the TS_TIOCNAK flag indicates that a NAK was
- * received.
- */
- while (tp->t_state & TS_IOCWAIT) {
- if (qwait_sig(q) == 0) {
- error = EINTR;
- goto common_error;
- }
- }
- if (!(tp->t_state & TS_TIOCNAK))
- return (0);
- error = ENOTTY;
-
- common_error:
- qprocsoff(q);
- kmem_free(tp, sizeof (ttcompat_state_t));
- q->q_ptr = NULL;
- WR(q)->q_ptr = NULL;
- return (error);
}
/* ARGSUSED1 */
static int
ttcompatclose(queue_t *q, int flag, cred_t *crp)
--- 181,195 ----