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 77176 2001-05-25 13:23:42Z phk $ |
35 */ 36 37/* 38 * Pseudo-teletype Driver 39 * (Actually two drivers, requiring two entries in 'cdevsw') 40 */ 41#include "opt_compat.h" 42#include <sys/param.h> --- 11 unchanged lines hidden (view full) --- 54#include <sys/signalvar.h> 55#include <sys/malloc.h> 56 57static MALLOC_DEFINE(M_PTY, "ptys", "pty data structures"); 58 59static void ptsstart __P((struct tty *tp)); 60static void ptsstop __P((struct tty *tp, int rw)); 61static void ptcwakeup __P((struct tty *tp, int flag)); |
62static dev_t ptyinit __P((dev_t cdev)); |
63 64static d_open_t ptsopen; 65static d_close_t ptsclose; 66static d_read_t ptsread; 67static d_write_t ptswrite; 68static d_ioctl_t ptyioctl; 69static d_open_t ptcopen; 70static d_close_t ptcclose; --- 50 unchanged lines hidden (view full) --- 121}; 122 123#define PF_PKT 0x08 /* packet mode */ 124#define PF_STOPPED 0x10 /* user told stopped */ 125#define PF_REMOTE 0x20 /* remote and flow controlled input */ 126#define PF_NOSTOP 0x40 127#define PF_UCNTL 0x80 /* user control mode */ 128 |
129static char *names = "pqrsPQRS"; |
130/* 131 * This function creates and initializes a pts/ptc pair 132 * 133 * pts == /dev/tty[pqrsPQRS][0123456789abcdefghijklmnopqrstuv] 134 * ptc == /dev/pty[pqrsPQRS][0123456789abcdefghijklmnopqrstuv] 135 * 136 * XXX: define and add mapping of upper minor bits to allow more 137 * than 256 ptys. 138 */ 139static dev_t |
140ptyinit(dev_t devc) |
141{ |
142 dev_t devs; |
143 struct pt_ioctl *pt; |
144 int n; |
145 |
146 devc->si_flags &= ~SI_CHEAPCLONE; 147 n = minor(devc); |
148 /* For now we only map the lower 8 bits of the minor */ 149 if (n & ~0xff) 150 return (NODEV); 151 152 pt = malloc(sizeof(*pt), M_PTY, M_WAITOK | M_ZERO); 153 pt->devs = devs = make_dev(&pts_cdevsw, n, 154 UID_ROOT, GID_WHEEL, 0666, "tty%c%r", names[n / 32], n % 32); |
155 pt->devc = devc; |
156 157 devs->si_drv1 = devc->si_drv1 = pt; 158 devs->si_tty = devc->si_tty = &pt->pt_tty; 159 ttyregister(&pt->pt_tty); 160 return (devc); 161} 162 163/*ARGSUSED*/ 164static int 165ptsopen(dev, flag, devtype, p) 166 dev_t dev; 167 int flag, devtype; 168 struct proc *p; 169{ 170 register struct tty *tp; 171 int error; 172 struct pt_ioctl *pti; 173 174 if (!dev->si_drv1) |
175 return(ENXIO); 176 pti = dev->si_drv1; 177 tp = dev->si_tty; 178 if ((tp->t_state & TS_ISOPEN) == 0) { 179 ttychars(tp); /* Set up default chars */ 180 tp->t_iflag = TTYDEF_IFLAG; 181 tp->t_oflag = TTYDEF_OFLAG; 182 tp->t_lflag = TTYDEF_LFLAG; --- 145 unchanged lines hidden (view full) --- 328 dev_t dev; 329 int flag, devtype; 330 struct proc *p; 331{ 332 register struct tty *tp; 333 struct pt_ioctl *pti; 334 335 if (!dev->si_drv1) |
336 ptyinit(dev); |
337 if (!dev->si_drv1) 338 return(ENXIO); 339 tp = dev->si_tty; 340 if (tp->t_oproc) 341 return (EIO); 342 tp->t_timeout = -1; 343 tp->t_oproc = ptsstart; 344 tp->t_stop = ptsstop; --- 485 unchanged lines hidden (view full) --- 830 default: return; 831 } 832 if (name[4] >= '0' && name[4] <= '9') 833 u += name[4] - '0'; 834 else if (name[4] >= 'a' && name[4] <= 'v') 835 u += name[4] - 'a' + 10; 836 else 837 return; |
838 *dev = make_dev(&ptc_cdevsw, u, 839 UID_ROOT, GID_WHEEL, 0666, "pty%c%r", names[u / 32], u % 32); 840 (*dev)->si_flags |= SI_CHEAPCLONE; |
841 return; 842} 843 844static void 845ptc_drvinit(unused) 846 void *unused; 847{ 848 EVENTHANDLER_REGISTER(dev_clone, pty_clone, 0, 1000); 849 cdevsw_add(&pts_cdevsw); 850 cdevsw_add(&ptc_cdevsw); 851} 852 853SYSINIT(ptcdev,SI_SUB_DRIVERS,SI_ORDER_MIDDLE+CDEV_MAJOR_C,ptc_drvinit,NULL) |