1/* 2 * Copyright (c) 1982, 1986, 1989, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 17 unchanged lines hidden (view full) --- 26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 * 33 * @(#)tty_pty.c 8.4 (Berkeley) 2/20/95 |
34 * $FreeBSD: head/sys/kern/tty_pty.c 50652 1999-08-30 10:35:37Z phk $ |
35 */ 36 37/* 38 * Pseudo-teletype Driver 39 * (Actually two drivers, requiring two entries in 'cdevsw') 40 */ 41#include "pty.h" /* XXX */ 42#include "opt_compat.h" --- 118 unchanged lines hidden (view full) --- 161 pt = malloc(sizeof(*pt), M_PTY, M_WAITOK); 162 bzero(pt, sizeof(*pt)); 163 pt->devs = devs = make_dev(&pts_cdevsw, n, 164 0, 0, 0666, "tty%c%r", names[n / 32], n % 32); 165 pt->devc = devc = make_dev(&ptc_cdevsw, n, 166 0, 0, 0666, "pty%c%r", names[n / 32], n % 32); 167 168 devs->si_drv1 = devc->si_drv1 = pt; |
169 devs->si_tty = devc->si_tty = &pt->pt_tty; |
170 ttyregister(&pt->pt_tty); 171} 172 173/*ARGSUSED*/ 174static int 175ptsopen(dev, flag, devtype, p) 176 dev_t dev; 177 int flag, devtype; --- 15 unchanged lines hidden (view full) --- 193 if (!nextdev->si_drv1) { 194 ptyinit(minr + 1); 195 } 196 } 197 if (!dev->si_drv1) 198 ptyinit(minor(dev)); 199 if (!dev->si_drv1) 200 return(ENXIO); |
201 tp = dev->si_tty; |
202 if ((tp->t_state & TS_ISOPEN) == 0) { 203 ttychars(tp); /* Set up default chars */ 204 tp->t_iflag = TTYDEF_IFLAG; 205 tp->t_oflag = TTYDEF_OFLAG; 206 tp->t_lflag = TTYDEF_LFLAG; 207 tp->t_cflag = TTYDEF_CFLAG; 208 tp->t_ispeed = tp->t_ospeed = TTYDEF_SPEED; 209 } else if (tp->t_state & TS_XCLUDE && suser(p)) --- 18 unchanged lines hidden (view full) --- 228ptsclose(dev, flag, mode, p) 229 dev_t dev; 230 int flag, mode; 231 struct proc *p; 232{ 233 register struct tty *tp; 234 int err; 235 |
236 tp = dev->si_tty; |
237 err = (*linesw[tp->t_line].l_close)(tp, flag); 238 ptsstop(tp, FREAD|FWRITE); 239 (void) ttyclose(tp); 240 return (err); 241} 242 243static int 244ptsread(dev, uio, flag) 245 dev_t dev; 246 struct uio *uio; 247 int flag; 248{ 249 struct proc *p = curproc; |
250 register struct tty *tp = dev->si_tty; |
251 register struct pt_ioctl *pti = dev->si_drv1; 252 int error = 0; 253 254again: 255 if (pti->pt_flags & PF_REMOTE) { 256 while (isbackground(p, tp)) { 257 if ((p->p_sigignore & sigmask(SIGTTIN)) || 258 (p->p_sigmask & sigmask(SIGTTIN)) || --- 39 unchanged lines hidden (view full) --- 298static int 299ptswrite(dev, uio, flag) 300 dev_t dev; 301 struct uio *uio; 302 int flag; 303{ 304 register struct tty *tp; 305 |
306 tp = dev->si_tty; |
307 if (tp->t_oproc == 0) 308 return (EIO); 309 return ((*linesw[tp->t_line].l_write)(tp, uio, flag)); 310} 311 312/* 313 * Start output on pseudo-tty. 314 * Wake up process selecting or sleeping for input from controlling tty. --- 38 unchanged lines hidden (view full) --- 353{ 354 register struct tty *tp; 355 struct pt_ioctl *pti; 356 357 if (!dev->si_drv1) 358 ptyinit(minor(dev)); 359 if (!dev->si_drv1) 360 return(ENXIO); |
361 tp = dev->si_tty; |
362 if (tp->t_oproc) 363 return (EIO); 364 tp->t_oproc = ptsstart; 365 (void)(*linesw[tp->t_line].l_modem)(tp, 1); 366 tp->t_lflag &= ~EXTPROC; 367 pti = dev->si_drv1; 368 pti->pt_flags = 0; 369 pti->pt_send = 0; --- 5 unchanged lines hidden (view full) --- 375ptcclose(dev, flags, fmt, p) 376 dev_t dev; 377 int flags; 378 int fmt; 379 struct proc *p; 380{ 381 register struct tty *tp; 382 |
383 tp = dev->si_tty; |
384 (void)(*linesw[tp->t_line].l_modem)(tp, 0); 385 386 /* 387 * XXX MDMBUF makes no sense for ptys but would inhibit the above 388 * l_modem(). CLOCAL makes sense but isn't supported. Special 389 * l_modem()s that ignore carrier drop make no sense for ptys but 390 * may be in use because other parts of the line discipline make 391 * sense for ptys. Recover by doing everything that a normal --- 10 unchanged lines hidden (view full) --- 402} 403 404static int 405ptcread(dev, uio, flag) 406 dev_t dev; 407 struct uio *uio; 408 int flag; 409{ |
410 register struct tty *tp = dev->si_tty; |
411 struct pt_ioctl *pti = dev->si_drv1; 412 char buf[BUFSIZ]; 413 int error = 0, cc; 414 415 /* 416 * We want to block until the slave 417 * is open, and there's something to read; 418 * but if we lost the slave or we're NBIO, --- 69 unchanged lines hidden (view full) --- 488} 489 490static int 491ptcpoll(dev, events, p) 492 dev_t dev; 493 int events; 494 struct proc *p; 495{ |
496 register struct tty *tp = dev->si_tty; |
497 struct pt_ioctl *pti = dev->si_drv1; 498 int revents = 0; 499 int s; 500 501 if ((tp->t_state & TS_CONNECTED) == 0) 502 return (seltrue(dev, events, p) | POLLHUP); 503 504 /* --- 33 unchanged lines hidden (view full) --- 538} 539 540static int 541ptcwrite(dev, uio, flag) 542 dev_t dev; 543 register struct uio *uio; 544 int flag; 545{ |
546 register struct tty *tp = dev->si_tty; |
547 register u_char *cp = 0; 548 register int cc = 0; 549 u_char locbuf[BUFSIZ]; 550 int cnt = 0; 551 struct pt_ioctl *pti = dev->si_drv1; 552 int error = 0; 553 554again: --- 94 unchanged lines hidden (view full) --- 649 650static struct tty * 651ptydevtotty(dev) 652 dev_t dev; 653{ 654 if (minor(dev) & ~0xff) 655 return (NULL); 656 |
657 return dev->si_tty; |
658} 659 660/*ARGSUSED*/ 661static int 662ptyioctl(dev, cmd, data, flag, p) 663 dev_t dev; 664 u_long cmd; 665 caddr_t data; 666 int flag; 667 struct proc *p; 668{ |
669 register struct tty *tp = dev->si_tty; |
670 register struct pt_ioctl *pti = dev->si_drv1; 671 register u_char *cc = tp->t_cc; 672 int stop, error; 673 674 if (devsw(dev)->d_open == ptcopen) { 675 switch (cmd) { 676 677 case TIOCGPGRP: --- 166 unchanged lines hidden --- |