1 /*
2 * Copyright (c) 1983, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * This code is derived from software contributed to Berkeley by
6 * Edward Wang at The University of California, Berkeley.
7 *
8 * %sccs.include.redist.c%
9 */
10
11 #ifndef lint
12 static char sccsid[] = "@(#)wwpty.c 8.1 (Berkeley) 06/06/93";
13 #endif /* not lint */
14
15 #include "ww.h"
16 #include <fcntl.h>
17 #if !defined(OLD_TTY) && !defined(TIOCPKT)
18 #include <sys/ioctl.h>
19 #endif
20
wwgetpty(w)21 wwgetpty(w)
22 register struct ww *w;
23 {
24 register char c, *p;
25 int tty;
26 int on = 1;
27 #define PTY "/dev/XtyXX"
28 #define _PT 5
29 #define _PQRS 8
30 #define _0_9 9
31
32 (void) strcpy(w->ww_ttyname, PTY);
33 for (c = 'p'; c <= 'u'; c++) {
34 w->ww_ttyname[_PT] = 'p';
35 w->ww_ttyname[_PQRS] = c;
36 w->ww_ttyname[_0_9] = '0';
37 if (access(w->ww_ttyname, 0) < 0)
38 break;
39 for (p = "0123456789abcdef"; *p; p++) {
40 w->ww_ttyname[_PT] = 'p';
41 w->ww_ttyname[_0_9] = *p;
42 if ((w->ww_pty = open(w->ww_ttyname, 2)) < 0)
43 continue;
44 w->ww_ttyname[_PT] = 't';
45 if ((tty = open(w->ww_ttyname, 2)) < 0) {
46 (void) close(w->ww_pty);
47 continue;
48 }
49 (void) close(tty);
50 if (ioctl(w->ww_pty, TIOCPKT, (char *)&on) < 0) {
51 (void) close(w->ww_pty);
52 continue;
53 }
54 (void) fcntl(w->ww_pty, F_SETFD, 1);
55 return 0;
56 }
57 }
58 w->ww_pty = -1;
59 wwerrno = WWE_NOPTY;
60 return -1;
61 }
62