import gdb-19990422 snapshot
[deliverable/binutils-gdb.git] / gdb / ser-tcp.c
CommitLineData
c906108c
SS
1/* Serial interface for raw TCP connections on Un*x like systems
2 Copyright 1992, 1993, 1998 Free Software Foundation, Inc.
3
4This file is part of GDB.
5
6This program is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
8the Free Software Foundation; either version 2 of the License, or
9(at your option) any later version.
10
11This program is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with this program; if not, write to the Free Software
18Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
19
20#include "defs.h"
21#include "serial.h"
22#include <sys/types.h>
23#include <sys/time.h>
24#include <netinet/in.h>
25#include <arpa/inet.h>
26#include <netdb.h>
27#include <sys/socket.h>
7a292a7a
SS
28#ifdef HAVE_UNISTD_H
29#include <unistd.h>
30#endif
c906108c
SS
31
32#ifndef __CYGWIN32__
33#include <netinet/tcp.h>
34#endif
35
36#include "signals.h"
37#include "gdb_string.h"
38
7a292a7a
SS
39extern int (*ui_loop_hook) PARAMS ((int));
40
c906108c
SS
41struct tcp_ttystate
42{
43 int bogus;
44};
45
46static int tcp_open PARAMS ((serial_t scb, const char *name));
47static void tcp_raw PARAMS ((serial_t scb));
48static int wait_for PARAMS ((serial_t scb, int timeout));
49static int tcp_readchar PARAMS ((serial_t scb, int timeout));
50static int tcp_setbaudrate PARAMS ((serial_t scb, int rate));
51static int tcp_setstopbits PARAMS ((serial_t scb, int num));
52static int tcp_write PARAMS ((serial_t scb, const char *str, int len));
53/* FIXME: static void tcp_restore PARAMS ((serial_t scb)); */
54static void tcp_close PARAMS ((serial_t scb));
55static serial_ttystate tcp_get_tty_state PARAMS ((serial_t scb));
56static int tcp_set_tty_state PARAMS ((serial_t scb, serial_ttystate state));
57static int tcp_return_0 PARAMS ((serial_t));
58static int tcp_noflush_set_tty_state PARAMS ((serial_t, serial_ttystate,
59 serial_ttystate));
60static void tcp_print_tty_state PARAMS ((serial_t, serial_ttystate));
61
62void _initialize_ser_tcp PARAMS ((void));
63
64/* Open up a raw tcp socket */
65
66static int
67tcp_open(scb, name)
68 serial_t scb;
69 const char *name;
70{
71 char *port_str;
72 int port;
73 struct hostent *hostent;
74 struct sockaddr_in sockaddr;
75 int tmp;
76 char hostname[100];
77 struct protoent *protoent;
78 int i;
79
80 port_str = strchr (name, ':');
81
82 if (!port_str)
83 error ("tcp_open: No colon in host name!"); /* Shouldn't ever happen */
84
85 tmp = min (port_str - name, (int) sizeof hostname - 1);
86 strncpy (hostname, name, tmp); /* Don't want colon */
87 hostname[tmp] = '\000'; /* Tie off host name */
88 port = atoi (port_str + 1);
89
90 hostent = gethostbyname (hostname);
91
92 if (!hostent)
93 {
94 fprintf_unfiltered (gdb_stderr, "%s: unknown host\n", hostname);
95 errno = ENOENT;
96 return -1;
97 }
98
99 for (i = 1; i <= 15; i++)
100 {
101 scb->fd = socket (PF_INET, SOCK_STREAM, 0);
102 if (scb->fd < 0)
103 return -1;
104
105 /* Allow rapid reuse of this port. */
106 tmp = 1;
107 setsockopt (scb->fd, SOL_SOCKET, SO_REUSEADDR, (char *)&tmp, sizeof(tmp));
108
109 /* Enable TCP keep alive process. */
110 tmp = 1;
111 setsockopt (scb->fd, SOL_SOCKET, SO_KEEPALIVE, (char *)&tmp, sizeof(tmp));
112
113 sockaddr.sin_family = PF_INET;
114 sockaddr.sin_port = htons(port);
115 memcpy (&sockaddr.sin_addr.s_addr, hostent->h_addr,
116 sizeof (struct in_addr));
117
118 if (!connect (scb->fd, (struct sockaddr *) &sockaddr, sizeof(sockaddr)))
119 break;
120
121 close (scb->fd);
122 scb->fd = -1;
123
124/* We retry for ECONNREFUSED because that is often a temporary condition, which
125 happens when the server is being restarted. */
126
127 if (errno != ECONNREFUSED)
128 return -1;
129
130 sleep (1);
131 }
132
133 protoent = getprotobyname ("tcp");
134 if (!protoent)
135 return -1;
136
137 tmp = 1;
138 if (setsockopt (scb->fd, protoent->p_proto, TCP_NODELAY,
139 (char *)&tmp, sizeof(tmp)))
140 return -1;
141
142 signal(SIGPIPE, SIG_IGN); /* If we don't do this, then GDB simply exits
143 when the remote side dies. */
144
145 return 0;
146}
147
148static serial_ttystate
149tcp_get_tty_state(scb)
150 serial_t scb;
151{
152 struct tcp_ttystate *state;
153
154 state = (struct tcp_ttystate *)xmalloc(sizeof *state);
155
156 return (serial_ttystate)state;
157}
158
159static int
160tcp_set_tty_state(scb, ttystate)
161 serial_t scb;
162 serial_ttystate ttystate;
163{
164 struct tcp_ttystate *state;
165
166 state = (struct tcp_ttystate *)ttystate;
167
168 return 0;
169}
170
171static int
172tcp_return_0 (scb)
173 serial_t scb;
174{
175 return 0;
176}
177
178static void
179tcp_raw(scb)
180 serial_t scb;
181{
182 return; /* Always in raw mode */
183}
184
185/* Wait for input on scb, with timeout seconds. Returns 0 on success,
186 otherwise SERIAL_TIMEOUT or SERIAL_ERROR.
187
188 For termio{s}, we actually just setup VTIME if necessary, and let the
189 timeout occur in the read() in tcp_read().
190 */
191
192static int
193wait_for (scb, timeout)
194 serial_t scb;
195 int timeout;
196{
197 int numfds;
198 struct timeval tv;
199 fd_set readfds, exceptfds;
200
201 FD_ZERO (&readfds);
202 FD_ZERO (&exceptfds);
203
204 tv.tv_sec = timeout;
205 tv.tv_usec = 0;
206
207 FD_SET(scb->fd, &readfds);
208 FD_SET(scb->fd, &exceptfds);
209
210 while (1)
211 {
212 if (timeout >= 0)
213 numfds = select(scb->fd+1, &readfds, 0, &exceptfds, &tv);
214 else
215 numfds = select(scb->fd+1, &readfds, 0, &exceptfds, 0);
216
217 if (numfds <= 0)
218 {
219 if (numfds == 0)
220 return SERIAL_TIMEOUT;
221 else if (errno == EINTR)
222 continue;
223 else
224 return SERIAL_ERROR; /* Got an error from select or poll */
225 }
226
227 return 0;
228 }
229}
230
231/* Read a character with user-specified timeout. TIMEOUT is number of seconds
232 to wait, or -1 to wait forever. Use timeout of 0 to effect a poll. Returns
233 char if successful. Returns -2 if timeout expired, EOF if line dropped
234 dead, or -3 for any other error (see errno in that case). */
235
236static int
237tcp_readchar (scb, timeout)
238 serial_t scb;
239 int timeout;
240{
241 int status;
7a292a7a 242 int delta;
c906108c
SS
243
244 if (scb->bufcnt-- > 0)
245 return *scb->bufp++;
246
7a292a7a
SS
247 /* We have to be able to keep the GUI alive here, so we break the original
248 timeout into steps of 1 second, running the "keep the GUI alive" hook
249 each time through the loop.
250
251 Also, timeout = 0 means to poll, so we just set the delta to 0, so we
252 will only go through the loop once. */
253
254 delta = (timeout == 0 ? 0 : 1);
255 while (1)
256 {
257
258 /* N.B. The UI may destroy our world (for instance by calling
259 remote_stop,) in which case we want to get out of here as
260 quickly as possible. It is not safe to touch scb, since
261 someone else might have freed it. The ui_loop_hook signals that
262 we should exit by returning 1. */
263
264 if (ui_loop_hook)
265 {
266 if (ui_loop_hook (0))
267 return SERIAL_TIMEOUT;
268 }
269
270 status = wait_for (scb, delta);
271 timeout -= delta;
272
273 /* If we got a character or an error back from wait_for, then we can
274 break from the loop before the timeout is completed. */
275
276 if (status != SERIAL_TIMEOUT)
277 {
278 break;
279 }
280
281 /* If we have exhausted the original timeout, then generate
282 a SERIAL_TIMEOUT, and pass it out of the loop. */
283
284 else if (timeout == 0)
285 {
286 status == SERIAL_TIMEOUT;
287 break;
288 }
289 }
c906108c
SS
290
291 if (status < 0)
292 return status;
293
294 while (1)
295 {
296 scb->bufcnt = read(scb->fd, scb->buf, BUFSIZ);
297 if (scb->bufcnt != -1 || errno != EINTR)
298 break;
299 }
300
301 if (scb->bufcnt <= 0)
302 {
303 if (scb->bufcnt == 0)
304 return SERIAL_TIMEOUT; /* 0 chars means timeout [may need to
305 distinguish between EOF & timeouts
306 someday] */
307 else
308 return SERIAL_ERROR; /* Got an error from read */
309 }
310
311 scb->bufcnt--;
312 scb->bufp = scb->buf;
313 return *scb->bufp++;
314}
315
316static int
317tcp_noflush_set_tty_state (scb, new_ttystate, old_ttystate)
318 serial_t scb;
319 serial_ttystate new_ttystate;
320 serial_ttystate old_ttystate;
321{
322 return 0;
323}
324
325static void
326tcp_print_tty_state (scb, ttystate)
327 serial_t scb;
328 serial_ttystate ttystate;
329{
330 /* Nothing to print. */
331 return;
332}
333
334static int
335tcp_setbaudrate(scb, rate)
336 serial_t scb;
337 int rate;
338{
339 return 0; /* Never fails! */
340}
341
342static int
343tcp_setstopbits(scb, num)
344 serial_t scb;
345 int num;
346{
347 return 0; /* Never fails! */
348}
349
350static int
351tcp_write(scb, str, len)
352 serial_t scb;
353 const char *str;
354 int len;
355{
356 int cc;
357
358 while (len > 0)
359 {
360 cc = write(scb->fd, str, len);
361
362 if (cc < 0)
363 return 1;
364 len -= cc;
365 str += cc;
366 }
367 return 0;
368}
369
370static void
371tcp_close(scb)
372 serial_t scb;
373{
374 if (scb->fd < 0)
375 return;
376
377 close(scb->fd);
378 scb->fd = -1;
379}
380
381static struct serial_ops tcp_ops =
382{
383 "tcp",
384 0,
385 tcp_open,
386 tcp_close,
387 tcp_readchar,
388 tcp_write,
389 tcp_return_0, /* flush output */
390 tcp_return_0, /* flush input */
391 tcp_return_0, /* send break */
392 tcp_raw,
393 tcp_get_tty_state,
394 tcp_set_tty_state,
395 tcp_print_tty_state,
396 tcp_noflush_set_tty_state,
397 tcp_setbaudrate,
398 tcp_setstopbits,
399 tcp_return_0, /* wait for output to drain */
400};
401
402void
403_initialize_ser_tcp ()
404{
405 serial_add_interface (&tcp_ops);
406}
This page took 0.039253 seconds and 4 git commands to generate.