* gdb.python/py-infthread.exp: Load gdb-python.exp.
[deliverable/binutils-gdb.git] / gdb / ser-tcp.c
CommitLineData
f9f87d2c
MK
1/* Serial interface for raw TCP connections on Un*x like systems.
2
6aba47ca 3 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2001, 2005, 2006,
7b6bb8da 4 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
c906108c 5
c5aa993b 6 This file is part of GDB.
c906108c 7
c5aa993b
JM
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
a9762ec7 10 the Free Software Foundation; either version 3 of the License, or
c5aa993b 11 (at your option) any later version.
c906108c 12
c5aa993b
JM
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
c906108c 17
c5aa993b 18 You should have received a copy of the GNU General Public License
a9762ec7 19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c906108c
SS
20
21#include "defs.h"
22#include "serial.h"
3eb25fda 23#include "ser-base.h"
0ea3f30e 24#include "ser-tcp.h"
84603566
SL
25#include "gdbcmd.h"
26#include "cli/cli-decode.h"
27#include "cli/cli-setshow.h"
c2c6d25f 28
c906108c 29#include <sys/types.h>
0cf3e697
MH
30
31#ifdef HAVE_SYS_FILIO_H
32#include <sys/filio.h> /* For FIONBIO. */
33#endif
34#ifdef HAVE_SYS_IOCTL_H
35#include <sys/ioctl.h> /* For FIONBIO. */
36#endif
37
c906108c 38#include <sys/time.h>
b4505029
MM
39
40#ifdef USE_WIN32API
41#include <winsock2.h>
42#define ETIMEDOUT WSAETIMEDOUT
056d7646 43#define close(fd) closesocket (fd)
b4505029
MM
44#define ioctl ioctlsocket
45#else
c906108c
SS
46#include <netinet/in.h>
47#include <arpa/inet.h>
48#include <netdb.h>
49#include <sys/socket.h>
c906108c 50#include <netinet/tcp.h>
b4505029 51#endif
c906108c 52
042be3a9 53#include <signal.h>
c906108c 54#include "gdb_string.h"
84603566 55#include "gdb_select.h"
c906108c 56
f9f87d2c
MK
57#ifndef HAVE_SOCKLEN_T
58typedef int socklen_t;
59#endif
60
c2c6d25f 61void _initialize_ser_tcp (void);
c906108c 62
84603566
SL
63/* For "set tcp" and "show tcp". */
64
65static struct cmd_list_element *tcp_set_cmdlist;
66static struct cmd_list_element *tcp_show_cmdlist;
67
68/* Whether to auto-retry refused connections. */
69
70static int tcp_auto_retry = 1;
71
72/* Timeout period for connections, in seconds. */
73
74static int tcp_retry_limit = 15;
75
98bbd631 76/* how many times per second to poll deprecated_ui_loop_hook */
84603566
SL
77
78#define POLL_INTERVAL 5
79
80/* Helper function to wait a while. If SCB is non-null, wait on its
81 file descriptor. Otherwise just wait on a timeout, updating *POLLS.
82 Returns -1 on timeout or interrupt, otherwise the value of select. */
83
84static int
85wait_for_connect (struct serial *scb, int *polls)
86{
87 struct timeval t;
88 int n;
89
90 /* While we wait for the connect to complete,
91 poll the UI so it can update or the user can
92 interrupt. */
93 if (deprecated_ui_loop_hook && deprecated_ui_loop_hook (0))
94 {
95 errno = EINTR;
96 return -1;
97 }
98
99 /* Check for timeout. */
100 if (*polls > tcp_retry_limit * POLL_INTERVAL)
101 {
102 errno = ETIMEDOUT;
103 return -1;
104 }
105
106 /* Back off to polling once per second after the first POLL_INTERVAL
107 polls. */
108 if (*polls < POLL_INTERVAL)
109 {
110 t.tv_sec = 0;
111 t.tv_usec = 1000000 / POLL_INTERVAL;
112 }
113 else
114 {
115 t.tv_sec = 1;
116 t.tv_usec = 0;
117 }
118
119 if (scb)
120 {
121 fd_set rset, wset, eset;
433759f7 122
84603566
SL
123 FD_ZERO (&rset);
124 FD_SET (scb->fd, &rset);
125 wset = rset;
126 eset = rset;
127
128 /* POSIX systems return connection success or failure by signalling
129 wset. Windows systems return success in wset and failure in
130 eset.
131
132 We must call select here, rather than gdb_select, because
133 the serial structure has not yet been initialized - the
134 MinGW select wrapper will not know that this FD refers
135 to a socket. */
136 n = select (scb->fd + 1, &rset, &wset, &eset, &t);
137 }
138 else
139 /* Use gdb_select here, since we have no file descriptors, and on
140 Windows, plain select doesn't work in that case. */
141 n = gdb_select (0, NULL, NULL, NULL, &t);
142
143 /* If we didn't time out, only count it as one poll. */
144 if (n > 0 || *polls < POLL_INTERVAL)
145 (*polls)++;
146 else
147 (*polls) += POLL_INTERVAL;
148
149 return n;
150}
7c7a201a
MH
151
152/* Open a tcp socket */
c906108c 153
0ea3f30e 154int
9db8d71f 155net_open (struct serial *scb, const char *name)
c906108c 156{
7c7a201a
MH
157 char *port_str, hostname[100];
158 int n, port, tmp;
9db8d71f 159 int use_udp;
c906108c
SS
160 struct hostent *hostent;
161 struct sockaddr_in sockaddr;
b4505029
MM
162#ifdef USE_WIN32API
163 u_long ioarg;
164#else
165 int ioarg;
166#endif
84603566 167 int polls = 0;
c906108c 168
9db8d71f
DJ
169 use_udp = 0;
170 if (strncmp (name, "udp:", 4) == 0)
171 {
172 use_udp = 1;
173 name = name + 4;
174 }
175 else if (strncmp (name, "tcp:", 4) == 0)
176 name = name + 4;
177
c906108c
SS
178 port_str = strchr (name, ':');
179
180 if (!port_str)
3e43a32a 181 error (_("net_open: No colon in host name!")); /* Shouldn't ever happen */
c906108c
SS
182
183 tmp = min (port_str - name, (int) sizeof hostname - 1);
c5aa993b 184 strncpy (hostname, name, tmp); /* Don't want colon */
c906108c
SS
185 hostname[tmp] = '\000'; /* Tie off host name */
186 port = atoi (port_str + 1);
187
7c7a201a 188 /* default hostname is localhost */
ad4571f3
CV
189 if (!hostname[0])
190 strcpy (hostname, "localhost");
191
c906108c 192 hostent = gethostbyname (hostname);
c906108c
SS
193 if (!hostent)
194 {
195 fprintf_unfiltered (gdb_stderr, "%s: unknown host\n", hostname);
196 errno = ENOENT;
197 return -1;
198 }
199
84603566
SL
200 sockaddr.sin_family = PF_INET;
201 sockaddr.sin_port = htons (port);
202 memcpy (&sockaddr.sin_addr.s_addr, hostent->h_addr,
203 sizeof (struct in_addr));
204
205 retry:
206
9db8d71f
DJ
207 if (use_udp)
208 scb->fd = socket (PF_INET, SOCK_DGRAM, 0);
209 else
210 scb->fd = socket (PF_INET, SOCK_STREAM, 0);
211
363a6e9f 212 if (scb->fd == -1)
7c7a201a
MH
213 return -1;
214
7c7a201a 215 /* set socket nonblocking */
b4505029
MM
216 ioarg = 1;
217 ioctl (scb->fd, FIONBIO, &ioarg);
c906108c 218
3e43a32a
MS
219 /* Use Non-blocking connect. connect() will return 0 if connected
220 already. */
7c7a201a 221 n = connect (scb->fd, (struct sockaddr *) &sockaddr, sizeof (sockaddr));
c906108c 222
84603566
SL
223 if (n < 0)
224 {
b4505029 225#ifdef USE_WIN32API
84603566 226 int err = WSAGetLastError();
b4505029 227#else
84603566 228 int err = errno;
b4505029 229#endif
84603566
SL
230
231 /* Maybe we're waiting for the remote target to become ready to
232 accept connections. */
233 if (tcp_auto_retry
b4505029 234#ifdef USE_WIN32API
84603566
SL
235 && err == WSAECONNREFUSED
236#else
237 && err == ECONNREFUSED
b4505029 238#endif
84603566
SL
239 && wait_for_connect (NULL, &polls) >= 0)
240 {
241 close (scb->fd);
242 goto retry;
243 }
c906108c 244
84603566
SL
245 if (
246#ifdef USE_WIN32API
247 /* Under Windows, calling "connect" with a non-blocking socket
248 results in WSAEWOULDBLOCK, not WSAEINPROGRESS. */
249 err != WSAEWOULDBLOCK
250#else
251 err != EINPROGRESS
252#endif
253 )
254 {
255 errno = err;
256 net_close (scb);
257 return -1;
258 }
7c7a201a 259
84603566 260 /* looks like we need to wait for the connect */
7c7a201a
MH
261 do
262 {
84603566 263 n = wait_for_connect (scb, &polls);
7c7a201a 264 }
84603566
SL
265 while (n == 0);
266 if (n < 0)
7c7a201a 267 {
9db8d71f 268 net_close (scb);
7c7a201a
MH
269 return -1;
270 }
271 }
c906108c 272
7c7a201a
MH
273 /* Got something. Is it an error? */
274 {
47b667de
AC
275 int res, err;
276 socklen_t len;
433759f7 277
0ea3f30e 278 len = sizeof (err);
b4505029
MM
279 /* On Windows, the fourth parameter to getsockopt is a "char *";
280 on UNIX systems it is generally "void *". The cast to "void *"
281 is OK everywhere, since in C "void *" can be implicitly
282 converted to any pointer type. */
283 res = getsockopt (scb->fd, SOL_SOCKET, SO_ERROR, (void *) &err, &len);
7c7a201a
MH
284 if (res < 0 || err)
285 {
84603566
SL
286 /* Maybe the target still isn't ready to accept the connection. */
287 if (tcp_auto_retry
288#ifdef USE_WIN32API
289 && err == WSAECONNREFUSED
290#else
291 && err == ECONNREFUSED
292#endif
293 && wait_for_connect (NULL, &polls) >= 0)
294 {
295 close (scb->fd);
296 goto retry;
297 }
7c7a201a
MH
298 if (err)
299 errno = err;
9db8d71f 300 net_close (scb);
7c7a201a
MH
301 return -1;
302 }
303 }
9db8d71f 304
7c7a201a 305 /* turn off nonblocking */
b4505029
MM
306 ioarg = 0;
307 ioctl (scb->fd, FIONBIO, &ioarg);
7c7a201a 308
9db8d71f
DJ
309 if (use_udp == 0)
310 {
311 /* Disable Nagle algorithm. Needed in some cases. */
312 tmp = 1;
313 setsockopt (scb->fd, IPPROTO_TCP, TCP_NODELAY,
314 (char *)&tmp, sizeof (tmp));
315 }
316
6d318c73 317#ifdef SIGPIPE
7c7a201a
MH
318 /* If we don't do this, then GDB simply exits
319 when the remote side dies. */
320 signal (SIGPIPE, SIG_IGN);
6d318c73 321#endif
c906108c
SS
322
323 return 0;
324}
325
0ea3f30e 326void
9db8d71f 327net_close (struct serial *scb)
c906108c 328{
363a6e9f 329 if (scb->fd == -1)
c906108c
SS
330 return;
331
c5aa993b 332 close (scb->fd);
c906108c
SS
333 scb->fd = -1;
334}
335
0ea3f30e 336int
b4505029
MM
337net_read_prim (struct serial *scb, size_t count)
338{
339 return recv (scb->fd, scb->buf, count, 0);
340}
341
0ea3f30e 342int
b4505029
MM
343net_write_prim (struct serial *scb, const void *buf, size_t count)
344{
345 return send (scb->fd, buf, count, 0);
346}
347
8775bb90
MS
348int
349ser_tcp_send_break (struct serial *scb)
350{
351 /* Send telnet IAC and BREAK characters. */
352 return (serial_write (scb, "\377\363", 2));
353}
354
84603566
SL
355/* Support for "set tcp" and "show tcp" commands. */
356
357static void
358set_tcp_cmd (char *args, int from_tty)
359{
360 help_list (tcp_set_cmdlist, "set tcp ", -1, gdb_stdout);
361}
362
363static void
364show_tcp_cmd (char *args, int from_tty)
365{
366 help_list (tcp_show_cmdlist, "show tcp ", -1, gdb_stdout);
367}
368
369
c906108c 370void
c2c6d25f 371_initialize_ser_tcp (void)
c906108c 372{
b4505029 373#ifdef USE_WIN32API
0ea3f30e
DJ
374 /* Do nothing; the TCP serial operations will be initialized in
375 ser-mingw.c. */
0ea3f30e
DJ
376#else
377 struct serial_ops *ops;
433759f7 378
b4505029 379 ops = XMALLOC (struct serial_ops);
2fdbdd39 380 memset (ops, 0, sizeof (struct serial_ops));
c2c6d25f
JM
381 ops->name = "tcp";
382 ops->next = 0;
9db8d71f
DJ
383 ops->open = net_open;
384 ops->close = net_close;
b4505029 385 ops->readchar = ser_base_readchar;
dd5da072
MM
386 ops->write = ser_base_write;
387 ops->flush_output = ser_base_flush_output;
388 ops->flush_input = ser_base_flush_input;
8775bb90 389 ops->send_break = ser_tcp_send_break;
dd5da072
MM
390 ops->go_raw = ser_base_raw;
391 ops->get_tty_state = ser_base_get_tty_state;
392 ops->set_tty_state = ser_base_set_tty_state;
393 ops->print_tty_state = ser_base_print_tty_state;
394 ops->noflush_set_tty_state = ser_base_noflush_set_tty_state;
395 ops->setbaudrate = ser_base_setbaudrate;
396 ops->setstopbits = ser_base_setstopbits;
397 ops->drain_output = ser_base_drain_output;
398 ops->async = ser_base_async;
b4505029
MM
399 ops->read_prim = net_read_prim;
400 ops->write_prim = net_write_prim;
c2c6d25f 401 serial_add_interface (ops);
0ea3f30e 402#endif /* USE_WIN32API */
84603566
SL
403
404 add_prefix_cmd ("tcp", class_maintenance, set_tcp_cmd, _("\
405TCP protocol specific variables\n\
406Configure variables specific to remote TCP connections"),
407 &tcp_set_cmdlist, "set tcp ",
408 0 /* allow-unknown */, &setlist);
409 add_prefix_cmd ("tcp", class_maintenance, show_tcp_cmd, _("\
410TCP protocol specific variables\n\
411Configure variables specific to remote TCP connections"),
412 &tcp_show_cmdlist, "show tcp ",
413 0 /* allow-unknown */, &showlist);
414
415 add_setshow_boolean_cmd ("auto-retry", class_obscure,
416 &tcp_auto_retry, _("\
417Set auto-retry on socket connect"), _("\
418Show auto-retry on socket connect"),
419 NULL, NULL, NULL,
420 &tcp_set_cmdlist, &tcp_show_cmdlist);
421
422 add_setshow_uinteger_cmd ("connect-timeout", class_obscure,
423 &tcp_retry_limit, _("\
424Set timeout limit for socket connection"), _("\
425Show timeout limit for socket connection"),
426 NULL, NULL, NULL,
427 &tcp_set_cmdlist, &tcp_show_cmdlist);
c906108c 428}
This page took 1.012622 seconds and 4 git commands to generate.