pty.c (74810) | pty.c (77176) |
---|---|
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 | 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 74810 2001-03-26 12:41:29Z phk $ | 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)); | 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((int n)); | 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 | 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"; |
|
129/* 130 * This function creates and initializes a pts/ptc pair 131 * 132 * pts == /dev/tty[pqrsPQRS][0123456789abcdefghijklmnopqrstuv] 133 * ptc == /dev/pty[pqrsPQRS][0123456789abcdefghijklmnopqrstuv] 134 * 135 * XXX: define and add mapping of upper minor bits to allow more 136 * than 256 ptys. 137 */ 138static dev_t | 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 |
139ptyinit(n) 140 int n; | 140ptyinit(dev_t devc) |
141{ | 141{ |
142 dev_t devs, devc; 143 char *names = "pqrsPQRS"; | 142 dev_t devs; |
144 struct pt_ioctl *pt; | 143 struct pt_ioctl *pt; |
144 int n; |
|
145 | 145 |
146 devc->si_flags &= ~SI_CHEAPCLONE; 147 n = minor(devc); |
|
146 /* For now we only map the lower 8 bits of the minor */ 147 if (n & ~0xff) 148 return (NODEV); 149 150 pt = malloc(sizeof(*pt), M_PTY, M_WAITOK | M_ZERO); 151 pt->devs = devs = make_dev(&pts_cdevsw, n, 152 UID_ROOT, GID_WHEEL, 0666, "tty%c%r", names[n / 32], n % 32); | 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); |
153 pt->devc = devc = make_dev(&ptc_cdevsw, n, 154 UID_ROOT, GID_WHEEL, 0666, "pty%c%r", names[n / 32], n % 32); | 155 pt->devc = devc; |
155 156 devs->si_drv1 = devc->si_drv1 = pt; 157 devs->si_tty = devc->si_tty = &pt->pt_tty; 158 ttyregister(&pt->pt_tty); 159 return (devc); 160} 161 162/*ARGSUSED*/ 163static int 164ptsopen(dev, flag, devtype, p) 165 dev_t dev; 166 int flag, devtype; 167 struct proc *p; 168{ 169 register struct tty *tp; 170 int error; 171 struct pt_ioctl *pti; 172 173 if (!dev->si_drv1) | 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) |
174 ptyinit(minor(dev)); 175 if (!dev->si_drv1) | |
176 return(ENXIO); 177 pti = dev->si_drv1; 178 tp = dev->si_tty; 179 if ((tp->t_state & TS_ISOPEN) == 0) { 180 ttychars(tp); /* Set up default chars */ 181 tp->t_iflag = TTYDEF_IFLAG; 182 tp->t_oflag = TTYDEF_OFLAG; 183 tp->t_lflag = TTYDEF_LFLAG; --- 145 unchanged lines hidden (view full) --- 329 dev_t dev; 330 int flag, devtype; 331 struct proc *p; 332{ 333 register struct tty *tp; 334 struct pt_ioctl *pti; 335 336 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) |
337 ptyinit(minor(dev)); | 336 ptyinit(dev); |
338 if (!dev->si_drv1) 339 return(ENXIO); 340 tp = dev->si_tty; 341 if (tp->t_oproc) 342 return (EIO); 343 tp->t_timeout = -1; 344 tp->t_oproc = ptsstart; 345 tp->t_stop = ptsstop; --- 485 unchanged lines hidden (view full) --- 831 default: return; 832 } 833 if (name[4] >= '0' && name[4] <= '9') 834 u += name[4] - '0'; 835 else if (name[4] >= 'a' && name[4] <= 'v') 836 u += name[4] - 'a' + 10; 837 else 838 return; | 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; |
839 *dev = ptyinit(u); | 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; |
840 return; 841} 842 843static void 844ptc_drvinit(unused) 845 void *unused; 846{ 847 EVENTHANDLER_REGISTER(dev_clone, pty_clone, 0, 1000); 848 cdevsw_add(&pts_cdevsw); 849 cdevsw_add(&ptc_cdevsw); 850} 851 852SYSINIT(ptcdev,SI_SUB_DRIVERS,SI_ORDER_MIDDLE+CDEV_MAJOR_C,ptc_drvinit,NULL) | 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) |