projects
/
unix-history
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
tags
|
clone url
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
vinvalbuf takes two more parameters
[unix-history]
/
usr
/
src
/
sys
/
kern
/
tty_pty.c
diff --git
a/usr/src/sys/kern/tty_pty.c
b/usr/src/sys/kern/tty_pty.c
index
c730dfd
..
43bffc6
100644
(file)
--- a/
usr/src/sys/kern/tty_pty.c
+++ b/
usr/src/sys/kern/tty_pty.c
@@
-4,7
+4,7
@@
*
* %sccs.include.redist.c%
*
*
* %sccs.include.redist.c%
*
- * @(#)tty_pty.c 7.2
2
(Berkeley) %G%
+ * @(#)tty_pty.c 7.2
8
(Berkeley) %G%
*/
/*
*/
/*
@@
-14,16
+14,16
@@
#include "pty.h"
#if NPTY > 0
#include "pty.h"
#if NPTY > 0
-#include
"param.h"
-#include
"systm.h"
-#include
"ioctl.h"
-#include
"tty.h"
-#include
"conf.h"
-#include
"file.h"
-#include
"proc.h"
-#include
"uio.h"
-#include
"kernel.h"
-#include
"vnode.h"
+#include
<sys/param.h>
+#include
<sys/systm.h>
+#include
<sys/ioctl.h>
+#include
<sys/proc.h>
+#include
<sys/tty.h>
+#include
<sys/conf.h>
+#include
<sys/file.h>
+#include
<sys/uio.h>
+#include
<sys/kernel.h>
+#include
<sys/vnode.h>
#include "tsleep.h"
#if NPTY == 1
#include "tsleep.h"
#if NPTY == 1
@@
-40,7
+40,7
@@
struct tty pt_tty[NPTY];
struct pt_ioctl {
int pt_flags;
struct tty pt_tty[NPTY];
struct pt_ioctl {
int pt_flags;
- struct
proc *pt_selr, *
pt_selw;
+ struct
selinfo pt_selr,
pt_selw;
u_char pt_send;
u_char pt_ucntl;
struct clist pt_ioc;
u_char pt_send;
u_char pt_ucntl;
struct clist pt_ioc;
@@
-61,9
+61,12
@@
int npty = NPTY; /* for pstat -t */
#define PF_BLOCK 0x0800 /* block writes to slave */
#define PF_OWAIT 0x1000 /* waiting for PF_BLOCK to clear */
#define PF_BLOCK 0x0800 /* block writes to slave */
#define PF_OWAIT 0x1000 /* waiting for PF_BLOCK to clear */
+void ptsstop __P((struct tty *, int));
+
/*ARGSUSED*/
ptsopen(dev, flag, devtype, p)
dev_t dev;
/*ARGSUSED*/
ptsopen(dev, flag, devtype, p)
dev_t dev;
+ int flag, devtype;
struct proc *p;
{
register struct tty *tp;
struct proc *p;
{
register struct tty *tp;
@@
-96,7
+99,7
@@
ptsopen(dev, flag, devtype, p)
ttopen, 0))
return (error);
}
ttopen, 0))
return (error);
}
- error = (*linesw[tp->t_line].l_open)(dev, tp
, flag
);
+ error = (*linesw[tp->t_line].l_open)(dev, tp);
ptcwakeup(tp, FREAD|FWRITE);
return (error);
}
ptcwakeup(tp, FREAD|FWRITE);
return (error);
}
@@
-107,17
+110,20
@@
ptsclose(dev, flag, mode, p)
struct proc *p;
{
register struct tty *tp;
struct proc *p;
{
register struct tty *tp;
+ int err;
tp = &pt_tty[minor(dev)];
tp = &pt_tty[minor(dev)];
- (*linesw[tp->t_line].l_close)(tp, flag);
- ttyclose(tp);
+
err =
(*linesw[tp->t_line].l_close)(tp, flag);
+
err |=
ttyclose(tp);
ptcwakeup(tp, FREAD|FWRITE);
ptcwakeup(tp, FREAD|FWRITE);
+ return (err);
return (0);
}
ptsread(dev, uio, flag)
dev_t dev;
struct uio *uio;
return (0);
}
ptsread(dev, uio, flag)
dev_t dev;
struct uio *uio;
+ int flag;
{
struct proc *p = curproc;
register struct tty *tp = &pt_tty[minor(dev)];
{
struct proc *p = curproc;
register struct tty *tp = &pt_tty[minor(dev)];
@@
-169,6
+175,7
@@
again:
ptswrite(dev, uio, flag)
dev_t dev;
struct uio *uio;
ptswrite(dev, uio, flag)
dev_t dev;
struct uio *uio;
+ int flag;
{
register struct tty *tp = &pt_tty[minor(dev)];
register struct pt_ioctl *pti = &pt_ioctl[minor(dev)];
{
register struct tty *tp = &pt_tty[minor(dev)];
register struct pt_ioctl *pti = &pt_ioctl[minor(dev)];
@@
-188,6
+195,7
@@
ptswrite(dev, uio, flag)
* Start output on pseudo-tty.
* Wake up process selecting or sleeping for input from controlling tty.
*/
* Start output on pseudo-tty.
* Wake up process selecting or sleeping for input from controlling tty.
*/
+void
ptsstart(tp)
struct tty *tp;
{
ptsstart(tp)
struct tty *tp;
{
@@
-204,23
+212,16
@@
ptsstart(tp)
ptcwakeup(tp, flag)
struct tty *tp;
ptcwakeup(tp, flag)
struct tty *tp;
+ int flag;
{
struct pt_ioctl *pti = &pt_ioctl[minor(tp->t_dev)];
if (flag & FREAD) {
{
struct pt_ioctl *pti = &pt_ioctl[minor(tp->t_dev)];
if (flag & FREAD) {
- if (pti->pt_selr) {
- selwakeup(pti->pt_selr, pti->pt_flags & PF_RCOLL);
- pti->pt_selr = 0;
- pti->pt_flags &= ~PF_RCOLL;
- }
+ selwakeup(&pti->pt_selr);
wakeup((caddr_t)&tp->t_outq.c_cf);
}
if (flag & FWRITE) {
wakeup((caddr_t)&tp->t_outq.c_cf);
}
if (flag & FWRITE) {
- if (pti->pt_selw) {
- selwakeup(pti->pt_selw, pti->pt_flags & PF_WCOLL);
- pti->pt_selw = 0;
- pti->pt_flags &= ~PF_WCOLL;
- }
+ selwakeup(&pti->pt_selw);
wakeup((caddr_t)&tp->t_rawq.c_cf);
}
}
wakeup((caddr_t)&tp->t_rawq.c_cf);
}
}
@@
-244,6
+245,9
@@
ptcopen(dev, flag, devtype, p)
if (tp->t_oproc)
return (EIO);
tp->t_oproc = ptsstart;
if (tp->t_oproc)
return (EIO);
tp->t_oproc = ptsstart;
+#ifdef sun4c
+ tp->t_stop = ptsstop;
+#endif
(void)(*linesw[tp->t_line].l_modem)(tp, 1);
tp->t_lflag &= ~EXTPROC;
pti = &pt_ioctl[minor(dev)];
(void)(*linesw[tp->t_line].l_modem)(tp, 1);
tp->t_lflag &= ~EXTPROC;
pti = &pt_ioctl[minor(dev)];
@@
-264,11
+268,13
@@
ptcclose(dev)
tp->t_oproc = 0; /* mark closed */
tp->t_session = 0;
return (0);
tp->t_oproc = 0; /* mark closed */
tp->t_session = 0;
return (0);
+ return (0);
}
ptcread(dev, uio, flag)
dev_t dev;
struct uio *uio;
}
ptcread(dev, uio, flag)
dev_t dev;
struct uio *uio;
+ int flag;
{
register struct tty *tp = &pt_tty[minor(dev)];
struct pt_ioctl *pti = &pt_ioctl[minor(dev)];
{
register struct tty *tp = &pt_tty[minor(dev)];
struct pt_ioctl *pti = &pt_ioctl[minor(dev)];
@@
-288,7
+294,7
@@
ptcread(dev, uio, flag)
if (error)
return (error);
if (pti->pt_send & TIOCPKT_IOCTL) {
if (error)
return (error);
if (pti->pt_send & TIOCPKT_IOCTL) {
- cc =
MIN
(uio->uio_resid,
+ cc =
min
(uio->uio_resid,
sizeof(tp->t_termios));
uiomove(&tp->t_termios, cc, uio);
}
sizeof(tp->t_termios));
uiomove(&tp->t_termios, cc, uio);
}
@@
-329,7
+335,7
@@
ptcread(dev, uio, flag)
if (pti->pt_flags & (PF_PKT|PF_UCNTL|PF_TIOC))
error = ureadc(0, uio);
while (uio->uio_resid > 0 && error == 0) {
if (pti->pt_flags & (PF_PKT|PF_UCNTL|PF_TIOC))
error = ureadc(0, uio);
while (uio->uio_resid > 0 && error == 0) {
- cc = q_to_b(&tp->t_outq, buf,
MIN
(uio->uio_resid, BUFSIZ));
+ cc = q_to_b(&tp->t_outq, buf,
min
(uio->uio_resid, BUFSIZ));
if (cc <= 0)
break;
error = uiomove(buf, cc, uio);
if (cc <= 0)
break;
error = uiomove(buf, cc, uio);
@@
-339,6
+345,7
@@
ptcread(dev, uio, flag)
return (error);
}
return (error);
}
+void
ptswake(tp)
register struct tty *tp;
{
ptswake(tp)
register struct tty *tp;
{
@@
-383,7
+390,6
@@
ptcselect(dev, rw, p)
{
register struct tty *tp = &pt_tty[minor(dev)];
struct pt_ioctl *pti = &pt_ioctl[minor(dev)];
{
register struct tty *tp = &pt_tty[minor(dev)];
struct pt_ioctl *pti = &pt_ioctl[minor(dev)];
- struct proc *prev;
int s;
if ((tp->t_state&TS_CARR_ON) == 0)
int s;
if ((tp->t_state&TS_CARR_ON) == 0)
@@
-409,10
+415,7
@@
ptcselect(dev, rw, p)
pti->pt_flags&PF_TIOC && pti->pt_ioc.c_cc ||
pti->pt_flags&PF_UCNTL && pti->pt_ucntl))
return (1);
pti->pt_flags&PF_TIOC && pti->pt_ioc.c_cc ||
pti->pt_flags&PF_UCNTL && pti->pt_ucntl))
return (1);
- if ((prev = pti->pt_selr) && prev->p_wchan == (caddr_t)&selwait)
- pti->pt_flags |= PF_RCOLL;
- else
- pti->pt_selr = p;
+ selrecord(p, &pti->pt_selr);
break;
break;
@@
-428,10
+431,7
@@
ptcselect(dev, rw, p)
return (1);
}
}
return (1);
}
}
- if ((prev = pti->pt_selw) && prev->p_wchan == (caddr_t)&selwait)
- pti->pt_flags |= PF_WCOLL;
- else
- pti->pt_selw = p;
+ selrecord(p, &pti->pt_selw);
break;
}
break;
}
@@
-441,6
+441,7
@@
ptcselect(dev, rw, p)
ptcwrite(dev, uio, flag)
dev_t dev;
register struct uio *uio;
ptcwrite(dev, uio, flag)
dev_t dev;
register struct uio *uio;
+ int flag;
{
register struct tty *tp = &pt_tty[minor(dev)];
register u_char *cp;
{
register struct tty *tp = &pt_tty[minor(dev)];
register u_char *cp;
@@
-525,9
+526,12
@@
block:
}
/*ARGSUSED*/
}
/*ARGSUSED*/
-ptyioctl(dev, cmd, data, flag)
- caddr_t data;
+ptyioctl(dev, cmd, data, flag, p)
dev_t dev;
dev_t dev;
+ int cmd;
+ caddr_t data;
+ int flag;
+ struct proc *p;
{
register struct tty *tp = &pt_tty[minor(dev)];
register struct pt_ioctl *pti = &pt_ioctl[minor(dev)];
{
register struct tty *tp = &pt_tty[minor(dev)];
register struct pt_ioctl *pti = &pt_ioctl[minor(dev)];
@@
-628,18
+632,19
@@
ptyioctl(dev, cmd, data, flag)
ttyflush(tp, FREAD|FWRITE);
return (0);
ttyflush(tp, FREAD|FWRITE);
return (0);
+#ifdef COMPAT_43
case FIONREAD:
*(int *)data = tp->t_outq.c_cc;
return (0);
case TIOCSETP:
case TIOCSETN:
case FIONREAD:
*(int *)data = tp->t_outq.c_cc;
return (0);
case TIOCSETP:
case TIOCSETN:
+#endif
case TIOCSETD:
case TIOCSETA:
case TIOCSETAW:
case TIOCSETAF:
case TIOCSETD:
case TIOCSETA:
case TIOCSETAW:
case TIOCSETAF:
- while (getc(&tp->t_outq) >= 0)
- ;
+ ndflush(&tp->t_outq, tp->t_outq.c_cc);
break;
case TIOCSIG:
break;
case TIOCSIG:
@@
-716,7
+721,7
@@
ptyioctl(dev, cmd, data, flag)
}
doioctl:
}
doioctl:
- error = (*linesw[tp->t_line].l_ioctl)(tp, cmd, data, flag);
+ error = (*linesw[tp->t_line].l_ioctl)(tp, cmd, data, flag
, p
);
if (error < 0)
error = ttioctl(tp, cmd, data, flag);
if (error < 0)
error = ttioctl(tp, cmd, data, flag);
@@
-739,9
+744,11
@@
ptyioctl(dev, cmd, data, flag)
case TIOCSETA:
case TIOCSETAW:
case TIOCSETAF:
case TIOCSETA:
case TIOCSETAW:
case TIOCSETAF:
+#ifdef COMPAT_43
case TIOCSETP:
case TIOCSETN:
case TIOCSETP:
case TIOCSETN:
-#ifdef COMPAT_43
+#endif
+#if defined(COMPAT_43) || defined(COMPAT_SUNOS)
case TIOCSETC:
case TIOCSLTC:
case TIOCLBIS:
case TIOCSETC:
case TIOCSLTC:
case TIOCLBIS: