1 /* Serial interface for raw TCP connections on Un*x like systems
2 Copyright 1992, 1993, 1998, 1999 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, Boston, MA 02111-1307, USA. */
22 #include <sys/types.h>
24 #include <netinet/in.h>
25 #include <arpa/inet.h>
27 #include <sys/socket.h>
33 #include <netinet/tcp.h>
36 #ifdef HAVE_SYS_SELECT_H
37 #include <sys/select.h>
41 #include "gdb_string.h"
43 extern int (*ui_loop_hook
) PARAMS ((int));
50 static int tcp_open
PARAMS ((serial_t scb
, const char *name
));
51 static void tcp_raw
PARAMS ((serial_t scb
));
52 static int wait_for
PARAMS ((serial_t scb
, int timeout
));
53 static int tcp_readchar
PARAMS ((serial_t scb
, int timeout
));
54 static int tcp_setbaudrate
PARAMS ((serial_t scb
, int rate
));
55 static int tcp_setstopbits
PARAMS ((serial_t scb
, int num
));
56 static int tcp_write
PARAMS ((serial_t scb
, const char *str
, int len
));
57 /* FIXME: static void tcp_restore PARAMS ((serial_t scb)); */
58 static void tcp_close
PARAMS ((serial_t scb
));
59 static serial_ttystate tcp_get_tty_state
PARAMS ((serial_t scb
));
60 static int tcp_set_tty_state
PARAMS ((serial_t scb
, serial_ttystate state
));
61 static int tcp_return_0
PARAMS ((serial_t
));
62 static int tcp_noflush_set_tty_state
PARAMS ((serial_t
, serial_ttystate
,
64 static void tcp_print_tty_state
PARAMS ((serial_t
, serial_ttystate
));
66 void _initialize_ser_tcp
PARAMS ((void));
68 /* Open up a raw tcp socket */
77 struct hostent
*hostent
;
78 struct sockaddr_in sockaddr
;
81 struct protoent
*protoent
;
84 port_str
= strchr (name
, ':');
87 error ("tcp_open: No colon in host name!"); /* Shouldn't ever happen */
89 tmp
= min (port_str
- name
, (int) sizeof hostname
- 1);
90 strncpy (hostname
, name
, tmp
); /* Don't want colon */
91 hostname
[tmp
] = '\000'; /* Tie off host name */
92 port
= atoi (port_str
+ 1);
94 hostent
= gethostbyname (hostname
);
98 fprintf_unfiltered (gdb_stderr
, "%s: unknown host\n", hostname
);
103 for (i
= 1; i
<= 15; i
++)
105 scb
->fd
= socket (PF_INET
, SOCK_STREAM
, 0);
109 /* Allow rapid reuse of this port. */
111 setsockopt (scb
->fd
, SOL_SOCKET
, SO_REUSEADDR
, (char *)&tmp
, sizeof(tmp
));
113 /* Enable TCP keep alive process. */
115 setsockopt (scb
->fd
, SOL_SOCKET
, SO_KEEPALIVE
, (char *)&tmp
, sizeof(tmp
));
117 sockaddr
.sin_family
= PF_INET
;
118 sockaddr
.sin_port
= htons(port
);
119 memcpy (&sockaddr
.sin_addr
.s_addr
, hostent
->h_addr
,
120 sizeof (struct in_addr
));
122 if (!connect (scb
->fd
, (struct sockaddr
*) &sockaddr
, sizeof(sockaddr
)))
128 /* We retry for ECONNREFUSED because that is often a temporary condition, which
129 happens when the server is being restarted. */
131 if (errno
!= ECONNREFUSED
)
137 protoent
= getprotobyname ("tcp");
142 if (setsockopt (scb
->fd
, protoent
->p_proto
, TCP_NODELAY
,
143 (char *)&tmp
, sizeof(tmp
)))
146 signal(SIGPIPE
, SIG_IGN
); /* If we don't do this, then GDB simply exits
147 when the remote side dies. */
152 static serial_ttystate
153 tcp_get_tty_state(scb
)
156 struct tcp_ttystate
*state
;
158 state
= (struct tcp_ttystate
*)xmalloc(sizeof *state
);
160 return (serial_ttystate
)state
;
164 tcp_set_tty_state(scb
, ttystate
)
166 serial_ttystate ttystate
;
168 struct tcp_ttystate
*state
;
170 state
= (struct tcp_ttystate
*)ttystate
;
186 return; /* Always in raw mode */
189 /* Wait for input on scb, with timeout seconds. Returns 0 on success,
190 otherwise SERIAL_TIMEOUT or SERIAL_ERROR.
192 For termio{s}, we actually just setup VTIME if necessary, and let the
193 timeout occur in the read() in tcp_read().
197 wait_for (scb
, timeout
)
203 fd_set readfds
, exceptfds
;
206 FD_ZERO (&exceptfds
);
211 FD_SET(scb
->fd
, &readfds
);
212 FD_SET(scb
->fd
, &exceptfds
);
217 numfds
= select(scb
->fd
+1, &readfds
, 0, &exceptfds
, &tv
);
219 numfds
= select(scb
->fd
+1, &readfds
, 0, &exceptfds
, 0);
224 return SERIAL_TIMEOUT
;
225 else if (errno
== EINTR
)
228 return SERIAL_ERROR
; /* Got an error from select or poll */
235 /* Read a character with user-specified timeout. TIMEOUT is number of seconds
236 to wait, or -1 to wait forever. Use timeout of 0 to effect a poll. Returns
237 char if successful. Returns -2 if timeout expired, EOF if line dropped
238 dead, or -3 for any other error (see errno in that case). */
241 tcp_readchar (scb
, timeout
)
248 if (scb
->bufcnt
-- > 0)
251 /* We have to be able to keep the GUI alive here, so we break the original
252 timeout into steps of 1 second, running the "keep the GUI alive" hook
253 each time through the loop.
255 Also, timeout = 0 means to poll, so we just set the delta to 0, so we
256 will only go through the loop once. */
258 delta
= (timeout
== 0 ? 0 : 1);
262 /* N.B. The UI may destroy our world (for instance by calling
263 remote_stop,) in which case we want to get out of here as
264 quickly as possible. It is not safe to touch scb, since
265 someone else might have freed it. The ui_loop_hook signals that
266 we should exit by returning 1. */
270 if (ui_loop_hook (0))
271 return SERIAL_TIMEOUT
;
274 status
= wait_for (scb
, delta
);
277 /* If we got a character or an error back from wait_for, then we can
278 break from the loop before the timeout is completed. */
280 if (status
!= SERIAL_TIMEOUT
)
285 /* If we have exhausted the original timeout, then generate
286 a SERIAL_TIMEOUT, and pass it out of the loop. */
288 else if (timeout
== 0)
290 status
== SERIAL_TIMEOUT
;
300 scb
->bufcnt
= read(scb
->fd
, scb
->buf
, BUFSIZ
);
301 if (scb
->bufcnt
!= -1 || errno
!= EINTR
)
305 if (scb
->bufcnt
<= 0)
307 if (scb
->bufcnt
== 0)
308 return SERIAL_TIMEOUT
; /* 0 chars means timeout [may need to
309 distinguish between EOF & timeouts
312 return SERIAL_ERROR
; /* Got an error from read */
316 scb
->bufp
= scb
->buf
;
321 tcp_noflush_set_tty_state (scb
, new_ttystate
, old_ttystate
)
323 serial_ttystate new_ttystate
;
324 serial_ttystate old_ttystate
;
330 tcp_print_tty_state (scb
, ttystate
)
332 serial_ttystate ttystate
;
334 /* Nothing to print. */
339 tcp_setbaudrate(scb
, rate
)
343 return 0; /* Never fails! */
347 tcp_setstopbits(scb
, num
)
351 return 0; /* Never fails! */
355 tcp_write(scb
, str
, len
)
364 cc
= write(scb
->fd
, str
, len
);
385 static struct serial_ops tcp_ops
=
393 tcp_return_0
, /* flush output */
394 tcp_return_0
, /* flush input */
395 tcp_return_0
, /* send break */
400 tcp_noflush_set_tty_state
,
403 tcp_return_0
, /* wait for output to drain */
407 _initialize_ser_tcp ()
409 serial_add_interface (&tcp_ops
);