chiark / gitweb /
*** empty log message ***
[sympathy.git] / src / testtty.c
1 /*
2  * testtty.c:
3  *
4  * Copyright (c) 2008 James McKenzie <james@fishsoup.dhs.org>,
5  * All rights reserved.
6  *
7  */
8
9 static char rcsid[] = "$Id$";
10
11 /*
12  * $Log$
13  * Revision 1.2  2008/02/04 02:05:06  james
14  * *** empty log message ***
15  *
16  * Revision 1.1  2008/02/04 01:32:39  james
17  * *** empty log message ***
18  *
19  */
20
21 #include "project.h"
22
23 static void
24 default_termios (struct termios *termios)
25 {
26
27   memset (termios, 0, sizeof (termios));
28
29   termios->c_iflag = ICRNL | IXON;
30   termios->c_oflag = OPOST | ONLCR | NL0 | CR0 | TAB0 | BS0 | VT0 | FF0;
31   termios->c_lflag =
32     ISIG | ICANON | IEXTEN | ECHO | ECHOE | ECHOK | ECHOCTL | ECHOKE;
33
34   termios->c_cc[VINTR] = 003;
35   termios->c_cc[VQUIT] = 034;
36   termios->c_cc[VERASE] = 0177;
37   termios->c_cc[VKILL] = 025;
38   termios->c_cc[VEOF] = 004;
39   termios->c_cc[VEOL] = 0;
40   termios->c_cc[VEOL2] = 0;
41   termios->c_cc[VSTART] = 021;
42   termios->c_cc[VSTOP] = 023;
43   termios->c_cc[VSUSP] = 032;
44   termios->c_cc[VLNEXT] = 026;
45   termios->c_cc[VWERASE] = 027;
46   termios->c_cc[VREPRINT] = 022;
47   termios->c_cc[VDISCARD] = 017;
48
49   termios->c_cflag = CS8 | CREAD | CLOCAL;
50
51   cfsetispeed (termios, B9600);
52   cfsetospeed (termios, B9600);
53 }
54
55
56 int
57 open_fd_to_bash (void)          /*thump */
58 {
59   pid_t child;
60   int fd;
61   struct winsize winsize = { 0 };
62   struct termios termios;
63
64   default_termios (&termios);
65
66   winsize.ws_row = CRT_ROWS;
67   winsize.ws_col = CRT_COLS;
68
69   child = forkpty (&fd, NULL, &termios, &winsize);
70
71   switch (child)
72     {
73     case -1:                   /*boo hiss */
74       return -1;
75     case 0:                    /*waaah */
76       setenv ("TERM", "vt102", 1);
77       execl ("/bin/sh", "-", (char *) 0);
78       _exit (-1);
79     }
80
81   return fd;
82 }