diff options
author | cognet <cognet@FreeBSD.org> | 2006-01-27 15:13:40 +0000 |
---|---|---|
committer | cognet <cognet@FreeBSD.org> | 2006-01-27 15:13:40 +0000 |
commit | b1d0cfd746a6ac4932835a100688725431f086c3 (patch) | |
tree | bd3adfa48cac1657f52f8350a16b8089158747fa /sys/kern/tty_pts.c | |
parent | abe2470791285c4717ebd857367dc12714ae2fda (diff) | |
download | FreeBSD-src-b1d0cfd746a6ac4932835a100688725431f086c3.zip FreeBSD-src-b1d0cfd746a6ac4932835a100688725431f086c3.tar.gz |
Merge a bunch of changes that where done in tty_pty.c after tty_pts.c was
forked from it, but missed from some reason.
Diffstat (limited to 'sys/kern/tty_pts.c')
-rw-r--r-- | sys/kern/tty_pts.c | 111 |
1 files changed, 7 insertions, 104 deletions
diff --git a/sys/kern/tty_pts.c b/sys/kern/tty_pts.c index e903b99..a91282d 100644 --- a/sys/kern/tty_pts.c +++ b/sys/kern/tty_pts.c @@ -153,11 +153,8 @@ static LIST_HEAD(,pt_desc) pt_free_list; #define PF_PKT 0x008 /* packet mode */ #define PF_STOPPED 0x010 /* user told stopped */ -#define PF_REMOTE 0x020 /* remote and flow controlled input */ #define PF_NOSTOP 0x040 #define PF_UCNTL 0x080 /* user control mode */ -#define PF_COPEN 0x100 /* control half open */ -#define PF_SOPEN 0x200 /* slave half open */ static unsigned int next_avail_nb; @@ -265,14 +262,9 @@ ptsopen(struct cdev *dev, int flag, int devtype, struct thread *td) pt = dev->si_drv1; tp = dev->si_tty; - if ((tp->t_state & TS_ISOPEN) == 0) { - ttychars(tp); /* Set up default chars */ - tp->t_iflag = TTYDEF_IFLAG; - tp->t_oflag = TTYDEF_OFLAG; - tp->t_lflag = TTYDEF_LFLAG; - tp->t_cflag = TTYDEF_CFLAG; - tp->t_ispeed = tp->t_ospeed = TTYDEF_SPEED; - } else if (tp->t_state & TS_XCLUDE && suser(td)) { + if ((tp->t_state & TS_ISOPEN) == 0) + ttyinitmode(tp, 1, 0); + else if (tp->t_state & TS_XCLUDE && suser(td)) { return (EBUSY); } else if (pt->pt_prison != td->td_ucred->cr_prison) { return (EBUSY); @@ -314,57 +306,11 @@ ptsclose(struct cdev *dev, int flag, int mode, struct thread *td) static int ptsread(struct cdev *dev, struct uio *uio, int flag) { - struct thread *td = curthread; - struct proc *p = td->td_proc; struct tty *tp = dev->si_tty; - struct pt_desc *pt = dev->si_drv1; - struct pgrp *pg; int error = 0; -again: - if (pt->pt_flags & PF_REMOTE) { - while (isbackground(p, tp)) { - sx_slock(&proctree_lock); - PROC_LOCK(p); - if (SIGISMEMBER(p->p_sigacts->ps_sigignore, SIGTTIN) || - SIGISMEMBER(td->td_sigmask, SIGTTIN) || - p->p_pgrp->pg_jobc == 0 || p->p_flag & P_PPWAIT) { - PROC_UNLOCK(p); - sx_sunlock(&proctree_lock); - return (EIO); - } - pg = p->p_pgrp; - PROC_UNLOCK(p); - PGRP_LOCK(pg); - sx_sunlock(&proctree_lock); - pgsignal(pg, SIGTTIN, 1); - PGRP_UNLOCK(pg); - error = ttysleep(tp, &lbolt, TTIPRI | PCATCH, "ptsbg", - 0); - if (error) - return (error); - } - if (tp->t_canq.c_cc == 0) { - if (flag & IO_NDELAY) - return (EWOULDBLOCK); - error = ttysleep(tp, TSA_PTS_READ(tp), TTIPRI | PCATCH, - "ptsin", 0); - if (error) - return (error); - goto again; - } - while (tp->t_canq.c_cc > 1 && uio->uio_resid > 0) - if (ureadc(getc(&tp->t_canq), uio) < 0) { - error = EFAULT; - break; - } - if (tp->t_canq.c_cc == 1) - (void) getc(&tp->t_canq); - if (tp->t_canq.c_cc) - return (error); - } else - if (tp->t_oproc) - ttyld_read(tp, uio, flag); + if (tp->t_oproc) + error = ttyld_read(tp, uio, flag); ptcwakeup(tp, FWRITE); return (error); } @@ -539,7 +485,7 @@ ptcread(struct cdev *dev, struct uio *uio, int flag) } if ((tp->t_state & TS_CONNECTED) == 0) return (0); /* EOF */ - if (flag & IO_NDELAY) + if (flag & O_NONBLOCK) return (EWOULDBLOCK); error = tsleep(TSA_PTC_READ(tp), TTIPRI | PCATCH, "ptcin", 0); if (error) @@ -605,9 +551,7 @@ ptcpoll(struct cdev *dev, int events, struct thread *td) if (events & (POLLOUT | POLLWRNORM)) if (tp->t_state & TS_ISOPEN && - ((pt->pt_flags & PF_REMOTE) ? - (tp->t_canq.c_cc == 0) : - ((tp->t_rawq.c_cc + tp->t_canq.c_cc < TTYHOG - 2) || + (((tp->t_rawq.c_cc + tp->t_canq.c_cc < TTYHOG - 2) || (tp->t_canq.c_cc == 0 && (tp->t_lflag & ICANON))))) revents |= events & (POLLOUT | POLLWRNORM); @@ -635,52 +579,11 @@ ptcwrite(struct cdev *dev, struct uio *uio, int flag) int cc = 0; u_char locbuf[BUFSIZ]; int cnt = 0; - struct pt_desc *pt = dev->si_drv1; int error = 0; again: if ((tp->t_state&TS_ISOPEN) == 0) goto block; - if (pt->pt_flags & PF_REMOTE) { - if (tp->t_canq.c_cc) - goto block; - while ((uio->uio_resid > 0 || cc > 0) && - tp->t_canq.c_cc < TTYHOG - 1) { - if (cc == 0) { - cc = min(uio->uio_resid, BUFSIZ); - cc = min(cc, TTYHOG - 1 - tp->t_canq.c_cc); - cp = locbuf; - error = uiomove(cp, cc, uio); - if (error) - return (error); - /* check again for safety */ - if ((tp->t_state & TS_ISOPEN) == 0) { - /* adjust as usual */ - uio->uio_resid += cc; - return (EIO); - } - } - if (cc > 0) { - cc = b_to_q((char *)cp, cc, &tp->t_canq); - /* - * XXX we don't guarantee that the canq size - * is >= TTYHOG, so the above b_to_q() may - * leave some bytes uncopied. However, space - * is guaranteed for the null terminator if - * we don't fail here since (TTYHOG - 1) is - * not a multiple of CBSIZE. - */ - if (cc > 0) - break; - } - } - /* adjust for data copied in but not written */ - uio->uio_resid += cc; - (void) putc(0, &tp->t_canq); - ttwakeup(tp); - wakeup(TSA_PTS_READ(tp)); - return (0); - } while (uio->uio_resid > 0 || cc > 0) { if (cc == 0) { cc = min(uio->uio_resid, BUFSIZ); |