summaryrefslogtreecommitdiff
path: root/usr/src/uts
diff options
context:
space:
mode:
authorJerry Jelinek <jerry.jelinek@joyent.com>2020-03-06 12:22:09 +0000
committerJerry Jelinek <jerry.jelinek@joyent.com>2020-03-06 12:22:09 +0000
commitc9d5215bf1b67592fb838367435fe20cfd079dd2 (patch)
tree0e98d0e92f52dfd2c43d36b0395e004d62f664b9 /usr/src/uts
parent37db1b725f2132b140356cbf6ba045af1d7dfd97 (diff)
parent7d8deab2c421c563ab11a55e623ed48109e237af (diff)
downloadillumos-joyent-c9d5215bf1b67592fb838367435fe20cfd079dd2.tar.gz
[illumos-gate merge]
commit 7d8deab2c421c563ab11a55e623ed48109e237af 12306 XPG4v2 slave pty behaviour should generally be disabled Conflicts: usr/src/uts/common/os/streamio.c
Diffstat (limited to 'usr/src/uts')
-rw-r--r--usr/src/uts/common/io/ldterm.c5
-rw-r--r--usr/src/uts/common/io/ptm.c11
-rw-r--r--usr/src/uts/common/io/pts.c13
-rw-r--r--usr/src/uts/common/os/streamio.c54
-rw-r--r--usr/src/uts/common/sys/strsubr.h4
5 files changed, 75 insertions, 12 deletions
diff --git a/usr/src/uts/common/io/ldterm.c b/usr/src/uts/common/io/ldterm.c
index 97a9c1a478..46669ace0c 100644
--- a/usr/src/uts/common/io/ldterm.c
+++ b/usr/src/uts/common/io/ldterm.c
@@ -22,7 +22,7 @@
* Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
* Copyright (c) 2018, Joyent, Inc.
- * Copyright 2018 OmniOS Community Edition (OmniOSce) Association.
+ * Copyright 2020 OmniOS Community Edition (OmniOSce) Association.
*/
/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
@@ -4087,7 +4087,8 @@ ldterm_dosig(queue_t *q, int sig, uchar_t c, int mtype, int mode)
if (c != '\0') {
if ((tp->t_echomp = allocb(4, BPRI_HI)) != NULL) {
- if (ldterm_echo(c, WR(q), 4, tp) > 0)
+ if (ldterm_echo(c, WR(q), 4, tp) > 0 ||
+ (tp->t_state & TS_ISPTSTTY))
putnext(WR(q), tp->t_echomp);
else
freemsg(tp->t_echomp);
diff --git a/usr/src/uts/common/io/ptm.c b/usr/src/uts/common/io/ptm.c
index 4d24932269..d4dfe83766 100644
--- a/usr/src/uts/common/io/ptm.c
+++ b/usr/src/uts/common/io/ptm.c
@@ -24,7 +24,9 @@
/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
/* All Rights Reserved */
-
+/*
+ * Copyright 2020 OmniOS Community Edition (OmniOSce) Association.
+ */
/*
* Pseudo Terminal Master Driver.
@@ -533,6 +535,13 @@ ptmwput(queue_t *qp, mblk_t *mp)
DBG(("ack the UNLKPT/ISPTM\n"));
miocack(qp, mp, 0, 0);
break;
+ case PTSSTTY:
+ mutex_enter(&ptmp->pt_lock);
+ ptmp->pt_state |= PTSTTY;
+ mutex_exit(&ptmp->pt_lock);
+ DBG(("ack PTSSTTY\n"));
+ miocack(qp, mp, 0, 0);
+ break;
case ZONEPT:
{
zoneid_t z;
diff --git a/usr/src/uts/common/io/pts.c b/usr/src/uts/common/io/pts.c
index d67beb255a..ff2d91f566 100644
--- a/usr/src/uts/common/io/pts.c
+++ b/usr/src/uts/common/io/pts.c
@@ -25,7 +25,9 @@
/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
/* All Rights Reserved */
-
+/*
+ * Copyright 2020 OmniOS Community Edition (OmniOSce) Association.
+ */
/*
* Pseudo Terminal Slave Driver.
@@ -106,6 +108,7 @@
#include <sys/sysmacros.h>
#include <sys/stream.h>
#include <sys/stropts.h>
+#include <sys/strsubr.h>
#include <sys/stat.h>
#include <sys/errno.h>
#include <sys/debug.h>
@@ -337,7 +340,6 @@ ptsopen(
DDBGP("ptsopen: p = %p\n", (uintptr_t)ptsp);
DDBG("ptsopen: state = %x\n", ptsp->pt_state);
-
ASSERT(ptsp->pt_minor == dminor);
if ((ptsp->pt_state & PTLOCK) || !(ptsp->pt_state & PTMOPEN)) {
@@ -347,7 +349,7 @@ ptsopen(
}
/*
- * if already, open simply return...
+ * if already open, simply return...
*/
if (ptsp->pt_state & PTSOPEN) {
ASSERT(rqp->q_ptr == ptsp);
@@ -386,6 +388,9 @@ ptsopen(
mutex_exit(&ptsp->pt_lock);
mutex_exit(&ptms_lock);
+ if (ptsp->pt_state & PTSTTY)
+ STREAM(rqp)->sd_flag |= STRXPG4TTY;
+
qprocson(rqp);
/*
@@ -416,8 +421,6 @@ ptsopen(
return (0);
}
-
-
/*
* Find the address to private data identifying the slave's write
* queue. Send a 0-length msg up the slave's read queue to designate
diff --git a/usr/src/uts/common/os/streamio.c b/usr/src/uts/common/os/streamio.c
index 1a1a734d5f..866fd3fc2c 100644
--- a/usr/src/uts/common/os/streamio.c
+++ b/usr/src/uts/common/os/streamio.c
@@ -25,7 +25,7 @@
/*
* Copyright (c) 1988, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright 2017 Joyent, Inc.
- * Copyright 2019 OmniOS Community Edition (OmniOSce) Association.
+ * Copyright 2020 OmniOS Community Edition (OmniOSce) Association.
*/
#include <sys/types.h>
@@ -79,6 +79,7 @@
#include <sys/dld.h>
#include <sys/zone.h>
#include <sys/limits.h>
+#include <sys/ptms.h>
#include <c2/audit.h>
/*
@@ -232,6 +233,50 @@ push_mod(queue_t *qp, dev_t *devp, struct stdata *stp, const char *name,
return (0);
}
+static int
+xpg4_fixup(queue_t *qp, dev_t *devp, struct stdata *stp, cred_t *crp)
+{
+ static const char *ptsmods[] = {
+ "ptem", "ldterm", "ttcompat"
+ };
+ dev_t dummydev = *devp;
+ struct strioctl strioc;
+ zoneid_t zoneid;
+ int32_t rval;
+ uint_t i;
+
+ /*
+ * Push modules required for the slave PTY to have terminal
+ * semantics out of the box; this is required by XPG4v2.
+ * These three modules are flagged as single-instance so that
+ * the system will never end up with duplicate copies pushed
+ * onto a stream.
+ */
+
+ zoneid = crgetzoneid(crp);
+ for (i = 0; i < ARRAY_SIZE(ptsmods); i++) {
+ int error;
+
+ error = push_mod(qp, &dummydev, stp, ptsmods[i], 0,
+ crp, zoneid);
+ if (error != 0)
+ return (error);
+ }
+
+ /*
+ * Send PTSSTTY down the stream
+ */
+
+ strioc.ic_cmd = PTSSTTY;
+ strioc.ic_timout = 0;
+ strioc.ic_len = 0;
+ strioc.ic_dp = NULL;
+
+ (void) strdoioctl(stp, &strioc, FNATIVE, K_TO_K, crp, &rval);
+
+ return (0);
+}
+
/*
* Open a stream device.
*/
@@ -550,10 +595,15 @@ retryap:
opendone:
+ if (error == 0 &&
+ (stp->sd_flag & (STRISTTY|STRXPG4TTY)) == (STRISTTY|STRXPG4TTY)) {
+ error = xpg4_fixup(qp, devp, stp, crp);
+ }
+
/*
* let specfs know that open failed part way through
*/
- if (error) {
+ if (error != 0) {
mutex_enter(&stp->sd_lock);
stp->sd_flag |= STREOPENFAIL;
mutex_exit(&stp->sd_lock);
diff --git a/usr/src/uts/common/sys/strsubr.h b/usr/src/uts/common/sys/strsubr.h
index 65bdfb2e17..14e17c1c0c 100644
--- a/usr/src/uts/common/sys/strsubr.h
+++ b/usr/src/uts/common/sys/strsubr.h
@@ -29,7 +29,7 @@
*/
/*
- * Copyright 2019 OmniOS Community Edition (OmniOSce) Association.
+ * Copyright 2020 OmniOS Community Edition (OmniOSce) Association.
*/
#ifndef _SYS_STRSUBR_H
@@ -289,7 +289,7 @@ typedef struct stdata {
#define SNDMREAD 0x00008000 /* used for read notification */
#define OLDNDELAY 0x00010000 /* use old TTY semantics for */
/* NDELAY reads and writes */
- /* 0x00020000 unused */
+#define STRXPG4TTY 0x00020000 /* Use XPG4 TTY semantics */
/* 0x00040000 unused */
#define STRTOSTOP 0x00080000 /* block background writes */
#define STRCMDWAIT 0x00100000 /* someone is doing an _I_CMD */