1 /* Serial interface for raw TCP connections on Un*x like systems
2 Copyright 1992, 1993, 1998 Free Software Foundation, Inc.
4 This file is part of GDB.
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.
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.
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., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
23 #include <sys/types.h>
25 #include <netinet/in.h>
26 #include <arpa/inet.h>
28 #include <sys/socket.h>
34 #include <netinet/tcp.h>
38 #include "gdb_string.h"
40 extern int (*ui_loop_hook) PARAMS ((int));
47 static int tcp_open PARAMS ((serial_t scb, const char *name));
48 static void tcp_raw PARAMS ((serial_t scb));
49 static int wait_for PARAMS ((serial_t scb, int timeout));
50 static int tcp_readchar PARAMS ((serial_t scb, int timeout));
51 static int tcp_setbaudrate PARAMS ((serial_t scb, int rate));
52 static int tcp_setstopbits PARAMS ((serial_t scb, int num));
53 static int tcp_write PARAMS ((serial_t scb, const char *str, int len));
54 /* FIXME: static void tcp_restore PARAMS ((serial_t scb)); */
55 static void tcp_close PARAMS ((serial_t scb));
56 static serial_ttystate tcp_get_tty_state PARAMS ((serial_t scb));
57 static int tcp_set_tty_state PARAMS ((serial_t scb, serial_ttystate state));
58 static int tcp_return_0 PARAMS ((serial_t));
59 static int tcp_noflush_set_tty_state PARAMS ((serial_t, serial_ttystate,
61 static void tcp_print_tty_state PARAMS ((serial_t, serial_ttystate));
63 void _initialize_ser_tcp PARAMS ((void));
65 /* Open up a raw tcp socket */
74 struct hostent *hostent;
75 struct sockaddr_in sockaddr;
78 struct protoent *protoent;
81 port_str = strchr (name, ':');
84 error ("tcp_open: No colon in host name!"); /* Shouldn't ever happen */
86 tmp = min (port_str - name, (int) sizeof hostname - 1);
87 strncpy (hostname, name, tmp); /* Don't want colon */
88 hostname[tmp] = '\000'; /* Tie off host name */
89 port = atoi (port_str + 1);
91 hostent = gethostbyname (hostname);
95 fprintf_unfiltered (gdb_stderr, "%s: unknown host\n", hostname);
100 for (i = 1; i <= 15; i++)
102 scb->fd = socket (PF_INET, SOCK_STREAM, 0);
106 /* Allow rapid reuse of this port. */
108 setsockopt (scb->fd, SOL_SOCKET, SO_REUSEADDR, (char *) &tmp, sizeof (tmp));
110 /* Enable TCP keep alive process. */
112 setsockopt (scb->fd, SOL_SOCKET, SO_KEEPALIVE, (char *) &tmp, sizeof (tmp));
114 sockaddr.sin_family = PF_INET;
115 sockaddr.sin_port = htons (port);
116 memcpy (&sockaddr.sin_addr.s_addr, hostent->h_addr,
117 sizeof (struct in_addr));
119 if (!connect (scb->fd, (struct sockaddr *) &sockaddr, sizeof (sockaddr)))
125 /* We retry for ECONNREFUSED because that is often a temporary condition, which
126 happens when the server is being restarted. */
128 if (errno != ECONNREFUSED)
134 protoent = getprotobyname ("tcp");
139 if (setsockopt (scb->fd, protoent->p_proto, TCP_NODELAY,
140 (char *) &tmp, sizeof (tmp)))
143 signal (SIGPIPE, SIG_IGN); /* If we don't do this, then GDB simply exits
144 when the remote side dies. */
149 static serial_ttystate
150 tcp_get_tty_state (scb)
153 struct tcp_ttystate *state;
155 state = (struct tcp_ttystate *) xmalloc (sizeof *state);
157 return (serial_ttystate) state;
161 tcp_set_tty_state (scb, ttystate)
163 serial_ttystate ttystate;
165 struct tcp_ttystate *state;
167 state = (struct tcp_ttystate *) ttystate;
183 return; /* Always in raw mode */
186 /* Wait for input on scb, with timeout seconds. Returns 0 on success,
187 otherwise SERIAL_TIMEOUT or SERIAL_ERROR.
189 For termio{s}, we actually just setup VTIME if necessary, and let the
190 timeout occur in the read() in tcp_read().
194 wait_for (scb, timeout)
200 fd_set readfds, exceptfds;
203 FD_ZERO (&exceptfds);
208 FD_SET (scb->fd, &readfds);
209 FD_SET (scb->fd, &exceptfds);
214 numfds = select (scb->fd + 1, &readfds, 0, &exceptfds, &tv);
216 numfds = select (scb->fd + 1, &readfds, 0, &exceptfds, 0);
221 return SERIAL_TIMEOUT;
222 else if (errno == EINTR)
225 return SERIAL_ERROR; /* Got an error from select or poll */
232 /* Read a character with user-specified timeout. TIMEOUT is number of seconds
233 to wait, or -1 to wait forever. Use timeout of 0 to effect a poll. Returns
234 char if successful. Returns -2 if timeout expired, EOF if line dropped
235 dead, or -3 for any other error (see errno in that case). */
238 tcp_readchar (scb, timeout)
245 if (scb->bufcnt-- > 0)
248 /* We have to be able to keep the GUI alive here, so we break the original
249 timeout into steps of 1 second, running the "keep the GUI alive" hook
250 each time through the loop.
252 Also, timeout = 0 means to poll, so we just set the delta to 0, so we
253 will only go through the loop once. */
255 delta = (timeout == 0 ? 0 : 1);
259 /* N.B. The UI may destroy our world (for instance by calling
260 remote_stop,) in which case we want to get out of here as
261 quickly as possible. It is not safe to touch scb, since
262 someone else might have freed it. The ui_loop_hook signals that
263 we should exit by returning 1. */
267 if (ui_loop_hook (0))
268 return SERIAL_TIMEOUT;
271 status = wait_for (scb, delta);
274 /* If we got a character or an error back from wait_for, then we can
275 break from the loop before the timeout is completed. */
277 if (status != SERIAL_TIMEOUT)
282 /* If we have exhausted the original timeout, then generate
283 a SERIAL_TIMEOUT, and pass it out of the loop. */
285 else if (timeout == 0)
287 status == SERIAL_TIMEOUT;
297 scb->bufcnt = read (scb->fd, scb->buf, BUFSIZ);
298 if (scb->bufcnt != -1 || errno != EINTR)
302 if (scb->bufcnt <= 0)
304 if (scb->bufcnt == 0)
305 return SERIAL_TIMEOUT; /* 0 chars means timeout [may need to
306 distinguish between EOF & timeouts
309 return SERIAL_ERROR; /* Got an error from read */
313 scb->bufp = scb->buf;
318 tcp_noflush_set_tty_state (scb, new_ttystate, old_ttystate)
320 serial_ttystate new_ttystate;
321 serial_ttystate old_ttystate;
327 tcp_print_tty_state (scb, ttystate)
329 serial_ttystate ttystate;
331 /* Nothing to print. */
336 tcp_setbaudrate (scb, rate)
340 return 0; /* Never fails! */
344 tcp_setstopbits (scb, num)
348 return 0; /* Never fails! */
352 tcp_write (scb, str, len)
361 cc = write (scb->fd, str, len);
382 static struct serial_ops tcp_ops =
390 tcp_return_0, /* flush output */
391 tcp_return_0, /* flush input */
392 tcp_return_0, /* send break */
397 tcp_noflush_set_tty_state,
400 tcp_return_0, /* wait for output to drain */
404 _initialize_ser_tcp ()
406 serial_add_interface (&tcp_ops);