* Makefile.in: Add new file ser-tcp.c.
[deliverable/binutils-gdb.git] / gdb / serial.c
1 /* Generic serial interface routines
2 Copyright 1992, 1993 Free Software Foundation, Inc.
3
4 This file is part of GDB.
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
19
20 #include "defs.h"
21 #include "serial.h"
22
23 /* Linked list of serial I/O handlers */
24
25 static struct serial_ops *serial_ops_list = NULL;
26
27 /* This is the last serial stream opened. Used by connect command. */
28
29 static serial_t last_serial_opened = NULL;
30
31 static struct serial_ops *
32 serial_interface_lookup (name)
33 char *name;
34 {
35 struct serial_ops *ops;
36
37 for (ops = serial_ops_list; ops; ops = ops->next)
38 if (strcmp (name, ops->name) == 0)
39 return ops;
40
41 return NULL;
42 }
43
44 void
45 serial_add_interface(optable)
46 struct serial_ops *optable;
47 {
48 optable->next = serial_ops_list;
49 serial_ops_list = optable;
50 }
51
52 /* Open up a device or a network socket, depending upon the syntax of NAME. */
53
54 serial_t
55 serial_open(name)
56 const char *name;
57 {
58 serial_t scb;
59 struct serial_ops *ops;
60
61 if (strchr (name, ':'))
62 ops = serial_interface_lookup ("tcp");
63 else
64 ops = serial_interface_lookup ("hardwire");
65
66 if (!ops)
67 return NULL;
68
69 scb = (serial_t)xmalloc (sizeof (struct _serial_t));
70
71 scb->ops = ops;
72
73 scb->bufcnt = 0;
74 scb->bufp = scb->buf;
75
76 if (scb->ops->open(scb, name))
77 {
78 free (scb);
79 return NULL;
80 }
81
82 last_serial_opened = scb;
83
84 return scb;
85 }
86
87 serial_t
88 serial_fdopen(fd)
89 const int fd;
90 {
91 serial_t scb;
92 struct serial_ops *ops;
93
94 ops = serial_interface_lookup ("hardwire");
95
96 if (!ops)
97 return NULL;
98
99 scb = (serial_t)xmalloc (sizeof (struct _serial_t));
100
101 scb->ops = ops;
102
103 scb->bufcnt = 0;
104 scb->bufp = scb->buf;
105
106 scb->fd = fd;
107
108 last_serial_opened = scb;
109
110 return scb;
111 }
112
113 void
114 serial_close(scb)
115 serial_t scb;
116 {
117 last_serial_opened = NULL;
118
119 scb->ops->close(scb);
120
121 free(scb);
122 }
123
124 #if 0
125
126 /* Connect the user directly to the remote system. This command acts just like
127 the 'cu' or 'tip' command. Use <CR>~. or <CR>~^D to break out. */
128
129 static serial_t tty_desc; /* Controlling terminal */
130
131 static void
132 cleanup_tty(ttystate)
133 serial_ttystate ttystate;
134 {
135 printf ("\r\n[Exiting connect mode]\r\n");
136 SERIAL_SET_TTY_STATE (tty_desc, ttystate);
137 free (ttystate);
138 SERIAL_CLOSE (tty_desc);
139 }
140
141 static void
142 connect_command (args, fromtty)
143 char *args;
144 int fromtty;
145 {
146 int c;
147 char cur_esc = 0;
148 serial_ttystate ttystate;
149 serial_t port_desc; /* TTY port */
150
151 dont_repeat();
152
153 if (args)
154 fprintf(stderr, "This command takes no args. They have been ignored.\n");
155
156 printf("[Entering connect mode. Use ~. or ~^D to escape]\n");
157
158 tty_desc = SERIAL_FDOPEN (0);
159 port_desc = last_serial_opened;
160
161 ttystate = SERIAL_GET_TTY_STATE (tty_desc);
162
163 SERIAL_RAW (tty_desc);
164 SERIAL_RAW (port_desc);
165
166 make_cleanup (cleanup_tty, ttystate);
167
168 while (1)
169 {
170 int mask;
171
172 mask = SERIAL_WAIT_2 (tty_desc, port_desc, -1);
173
174 if (mask & 2)
175 { /* tty input */
176 char cx;
177
178 while (1)
179 {
180 c = SERIAL_READCHAR(tty_desc, 0);
181
182 if (c == SERIAL_TIMEOUT)
183 break;
184
185 if (c < 0)
186 perror_with_name("connect");
187
188 cx = c;
189 SERIAL_WRITE(port_desc, &cx, 1);
190
191 switch (cur_esc)
192 {
193 case 0:
194 if (c == '\r')
195 cur_esc = c;
196 break;
197 case '\r':
198 if (c == '~')
199 cur_esc = c;
200 else
201 cur_esc = 0;
202 break;
203 case '~':
204 if (c == '.' || c == '\004')
205 return;
206 else
207 cur_esc = 0;
208 }
209 }
210 }
211
212 if (mask & 1)
213 { /* Port input */
214 char cx;
215
216 while (1)
217 {
218 c = SERIAL_READCHAR(port_desc, 0);
219
220 if (c == SERIAL_TIMEOUT)
221 break;
222
223 if (c < 0)
224 perror_with_name("connect");
225
226 cx = c;
227
228 SERIAL_WRITE(tty_desc, &cx, 1);
229 }
230 }
231 }
232 }
233
234 void
235 _initialize_serial ()
236 {
237 add_com ("connect", class_obscure, connect_command,
238 "Connect the terminal directly up to the command monitor.\n\
239 Use <CR>~. or <CR>~^D to break out.");
240 }
241 #endif /* 0 */
This page took 0.034633 seconds and 5 git commands to generate.