]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/ser-tcp.c
Implement IPv6 support for GDB/gdbserver
[thirdparty/binutils-gdb.git] / gdb / ser-tcp.c
CommitLineData
f9f87d2c
MK
1/* Serial interface for raw TCP connections on Un*x like systems.
2
e2882c85 3 Copyright (C) 1992-2018 Free Software Foundation, Inc.
c906108c 4
c5aa993b 5 This file is part of GDB.
c906108c 6
c5aa993b
JM
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
a9762ec7 9 the Free Software Foundation; either version 3 of the License, or
c5aa993b 10 (at your option) any later version.
c906108c 11
c5aa993b
JM
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
c906108c 16
c5aa993b 17 You should have received a copy of the GNU General Public License
a9762ec7 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c906108c
SS
19
20#include "defs.h"
21#include "serial.h"
3eb25fda 22#include "ser-base.h"
0ea3f30e 23#include "ser-tcp.h"
84603566
SL
24#include "gdbcmd.h"
25#include "cli/cli-decode.h"
26#include "cli/cli-setshow.h"
614c279d 27#include "filestuff.h"
c7ab0aef 28#include "netstuff.h"
c2c6d25f 29
c906108c 30#include <sys/types.h>
0cf3e697
MH
31
32#ifdef HAVE_SYS_FILIO_H
c378eb4e 33#include <sys/filio.h> /* For FIONBIO. */
0cf3e697
MH
34#endif
35#ifdef HAVE_SYS_IOCTL_H
c378eb4e 36#include <sys/ioctl.h> /* For FIONBIO. */
0cf3e697
MH
37#endif
38
438e1e42 39#include "gdb_sys_time.h"
b4505029
MM
40
41#ifdef USE_WIN32API
42#include <winsock2.h>
c7ab0aef 43#include <wspiapi.h>
8e7ebaf5 44#ifndef ETIMEDOUT
b4505029 45#define ETIMEDOUT WSAETIMEDOUT
8e7ebaf5 46#endif
6ec2e0f5
SDJ
47/* Gnulib defines close too, but gnulib's replacement
48 doesn't call closesocket unless we import the
49 socketlib module. */
50#undef close
056d7646 51#define close(fd) closesocket (fd)
b4505029
MM
52#define ioctl ioctlsocket
53#else
9eb1356e 54#include <netinet/in.h>
c906108c
SS
55#include <arpa/inet.h>
56#include <netdb.h>
9eb1356e 57#include <sys/socket.h>
c906108c 58#include <netinet/tcp.h>
b4505029 59#endif
c906108c 60
042be3a9 61#include <signal.h>
84603566 62#include "gdb_select.h"
325fac50 63#include <algorithm>
c906108c 64
f9f87d2c
MK
65#ifndef HAVE_SOCKLEN_T
66typedef int socklen_t;
67#endif
68
84603566
SL
69/* For "set tcp" and "show tcp". */
70
71static struct cmd_list_element *tcp_set_cmdlist;
72static struct cmd_list_element *tcp_show_cmdlist;
73
74/* Whether to auto-retry refused connections. */
75
76static int tcp_auto_retry = 1;
77
78/* Timeout period for connections, in seconds. */
79
964b8317 80static unsigned int tcp_retry_limit = 15;
84603566 81
c378eb4e 82/* How many times per second to poll deprecated_ui_loop_hook. */
84603566
SL
83
84#define POLL_INTERVAL 5
85
c7ab0aef
SDJ
86/* Helper function to wait a while. If SOCK is not -1, wait on its
87 file descriptor. Otherwise just wait on a timeout, updating
88 *POLLS. Returns -1 on timeout or interrupt, otherwise the value of
89 select. */
84603566
SL
90
91static int
c7ab0aef 92wait_for_connect (int sock, unsigned int *polls)
84603566
SL
93{
94 struct timeval t;
95 int n;
96
97 /* While we wait for the connect to complete,
98 poll the UI so it can update or the user can
99 interrupt. */
100 if (deprecated_ui_loop_hook && deprecated_ui_loop_hook (0))
101 {
102 errno = EINTR;
103 return -1;
104 }
105
106 /* Check for timeout. */
107 if (*polls > tcp_retry_limit * POLL_INTERVAL)
108 {
109 errno = ETIMEDOUT;
110 return -1;
111 }
112
113 /* Back off to polling once per second after the first POLL_INTERVAL
114 polls. */
115 if (*polls < POLL_INTERVAL)
116 {
117 t.tv_sec = 0;
118 t.tv_usec = 1000000 / POLL_INTERVAL;
119 }
120 else
121 {
122 t.tv_sec = 1;
123 t.tv_usec = 0;
124 }
125
c7ab0aef 126 if (sock >= 0)
84603566
SL
127 {
128 fd_set rset, wset, eset;
433759f7 129
84603566 130 FD_ZERO (&rset);
c7ab0aef 131 FD_SET (sock, &rset);
84603566
SL
132 wset = rset;
133 eset = rset;
c7ab0aef 134
84603566
SL
135 /* POSIX systems return connection success or failure by signalling
136 wset. Windows systems return success in wset and failure in
137 eset.
c7ab0aef 138
84603566
SL
139 We must call select here, rather than gdb_select, because
140 the serial structure has not yet been initialized - the
141 MinGW select wrapper will not know that this FD refers
142 to a socket. */
c7ab0aef 143 n = select (sock + 1, &rset, &wset, &eset, &t);
84603566
SL
144 }
145 else
146 /* Use gdb_select here, since we have no file descriptors, and on
147 Windows, plain select doesn't work in that case. */
148 n = gdb_select (0, NULL, NULL, NULL, &t);
149
150 /* If we didn't time out, only count it as one poll. */
151 if (n > 0 || *polls < POLL_INTERVAL)
152 (*polls)++;
153 else
154 (*polls) += POLL_INTERVAL;
155
156 return n;
157}
7c7a201a 158
c7ab0aef
SDJ
159/* Try to connect to the host represented by AINFO. If the connection
160 succeeds, return its socket. Otherwise, return -1 and set ERRNO
161 accordingly. POLLS is used when 'connect' returns EINPROGRESS, and
162 we need to invoke 'wait_for_connect' to obtain the status. */
c906108c 163
c7ab0aef
SDJ
164static int
165try_connect (const struct addrinfo *ainfo, unsigned int *polls)
c906108c 166{
c7ab0aef
SDJ
167 int sock = gdb_socket_cloexec (ainfo->ai_family, ainfo->ai_socktype,
168 ainfo->ai_protocol);
84603566 169
c7ab0aef 170 if (sock < 0)
7c7a201a 171 return -1;
c7ab0aef 172
c378eb4e 173 /* Set socket nonblocking. */
c7ab0aef
SDJ
174 int ioarg = 1;
175
176 ioctl (sock, FIONBIO, &ioarg);
c906108c 177
3e43a32a 178 /* Use Non-blocking connect. connect() will return 0 if connected
c378eb4e 179 already. */
c7ab0aef 180 if (connect (sock, ainfo->ai_addr, ainfo->ai_addrlen) < 0)
84603566 181 {
b4505029 182#ifdef USE_WIN32API
84603566 183 int err = WSAGetLastError();
b4505029 184#else
84603566 185 int err = errno;
b4505029 186#endif
84603566 187
c7ab0aef
SDJ
188 /* If we've got a "connection refused" error, just return
189 -1. The caller will know what to do. */
190 if (
b4505029 191#ifdef USE_WIN32API
c7ab0aef 192 err == WSAECONNREFUSED
84603566 193#else
c7ab0aef 194 err == ECONNREFUSED
b4505029 195#endif
c7ab0aef 196 )
84603566 197 {
c7ab0aef
SDJ
198 close (sock);
199 errno = err;
200 return -1;
84603566 201 }
c906108c 202
84603566 203 if (
c7ab0aef
SDJ
204 /* Any other error (except EINPROGRESS) will be "swallowed"
205 here. We return without specifying a return value, and
206 set errno if the caller wants to inspect what
207 happened. */
84603566
SL
208#ifdef USE_WIN32API
209 /* Under Windows, calling "connect" with a non-blocking socket
210 results in WSAEWOULDBLOCK, not WSAEINPROGRESS. */
211 err != WSAEWOULDBLOCK
212#else
213 err != EINPROGRESS
214#endif
215 )
216 {
c7ab0aef 217 close (sock);
84603566 218 errno = err;
84603566
SL
219 return -1;
220 }
7c7a201a 221
c378eb4e 222 /* Looks like we need to wait for the connect. */
c7ab0aef
SDJ
223 int n;
224
225 do
226 n = wait_for_connect (sock, polls);
84603566 227 while (n == 0);
c7ab0aef 228
84603566 229 if (n < 0)
7c7a201a 230 {
c7ab0aef
SDJ
231 int saved_errno = errno;
232
233 /* A negative value here means that we either timed out or
234 got interrupted by the user. Just return. */
235 close (sock);
236 errno = saved_errno;
7c7a201a
MH
237 return -1;
238 }
239 }
c906108c 240
c378eb4e 241 /* Got something. Is it an error? */
c7ab0aef
SDJ
242 int err;
243 socklen_t len = sizeof (err);
244
245 /* On Windows, the fourth parameter to getsockopt is a "char *";
246 on UNIX systems it is generally "void *". The cast to "char *"
247 is OK everywhere, since in C++ any data pointer type can be
248 implicitly converted to "void *". */
249 int ret = getsockopt (sock, SOL_SOCKET, SO_ERROR, (char *) &err, &len);
250
251 if (ret < 0)
252 {
253 int saved_errno = errno;
254
255 close (sock);
256 errno = saved_errno;
257 return -1;
258 }
259 else if (ret == 0 && err != 0)
260 {
261 close (sock);
262 errno = err;
263 return -1;
264 }
265
266 /* The connection succeeded. Return the socket. */
267 return sock;
268}
269
270/* Open a tcp socket. */
271
272int
273net_open (struct serial *scb, const char *name)
274{
275 struct addrinfo hint;
276 struct addrinfo *ainfo;
277
278 memset (&hint, 0, sizeof (hint));
279 /* Assume no prefix will be passed, therefore we should use
280 AF_UNSPEC. */
281 hint.ai_family = AF_UNSPEC;
282 hint.ai_socktype = SOCK_STREAM;
283 hint.ai_protocol = IPPROTO_TCP;
284
285 parsed_connection_spec parsed = parse_connection_spec (name, &hint);
286
287 if (parsed.port_str.empty ())
288 error (_("Missing port on hostname '%s'"), name);
289
290 int r = getaddrinfo (parsed.host_str.c_str (),
291 parsed.port_str.c_str (),
292 &hint, &ainfo);
293
294 if (r != 0)
295 {
296 fprintf_unfiltered (gdb_stderr, _("%s: cannot resolve name: %s\n"),
297 name, gai_strerror (r));
298 errno = ENOENT;
299 return -1;
300 }
301
302 scoped_free_addrinfo free_ainfo (ainfo);
303
304 /* Flag to indicate whether we've got a connection refused. It will
305 be true if any of the connections tried was refused. */
306 bool got_connrefused;
307 /* If a connection succeeeds, SUCCESS_AINFO will point to the
308 'struct addrinfo' that succeed. */
309 struct addrinfo *success_ainfo = NULL;
310 unsigned int polls = 0;
311
312 /* Assume the worst. */
313 scb->fd = -1;
314
315 do
316 {
317 got_connrefused = false;
318
319 for (struct addrinfo *iter = ainfo; iter != NULL; iter = iter->ai_next)
320 {
321 /* Iterate over the list of possible addresses to connect
322 to. For each, we'll try to connect and see if it
323 succeeds. */
324 int sock = try_connect (iter, &polls);
325
326 if (sock >= 0)
327 {
328 /* We've gotten a successful connection. Save its
329 'struct addrinfo', the socket, and break. */
330 success_ainfo = iter;
331 scb->fd = sock;
332 break;
333 }
334 else if (
84603566 335#ifdef USE_WIN32API
c7ab0aef 336 errno == WSAECONNREFUSED
84603566 337#else
c7ab0aef 338 errno == ECONNREFUSED
84603566 339#endif
c7ab0aef
SDJ
340 )
341 got_connrefused = true;
342 }
343 }
344 /* Just retry if:
345
346 - tcp_auto_retry is true, and
347 - We haven't gotten a connection yet, and
348 - Any of our connection attempts returned with ECONNREFUSED, and
349 - wait_for_connect signals that we can keep going. */
350 while (tcp_auto_retry
351 && success_ainfo == NULL
352 && got_connrefused
353 && wait_for_connect (-1, &polls) >= 0);
354
355 if (success_ainfo == NULL)
356 {
357 net_close (scb);
358 return -1;
359 }
9db8d71f 360
c378eb4e 361 /* Turn off nonblocking. */
c7ab0aef
SDJ
362#ifdef USE_WIN32API
363 u_long ioarg = 0;
364#else
365 int ioarg = 0;
366#endif
367
b4505029 368 ioctl (scb->fd, FIONBIO, &ioarg);
7c7a201a 369
c7ab0aef 370 if (success_ainfo->ai_socktype == IPPROTO_TCP)
9db8d71f 371 {
c378eb4e 372 /* Disable Nagle algorithm. Needed in some cases. */
c7ab0aef
SDJ
373 int tmp = 1;
374
9db8d71f 375 setsockopt (scb->fd, IPPROTO_TCP, TCP_NODELAY,
c7ab0aef 376 (char *) &tmp, sizeof (tmp));
9db8d71f
DJ
377 }
378
6d318c73 379#ifdef SIGPIPE
7c7a201a
MH
380 /* If we don't do this, then GDB simply exits
381 when the remote side dies. */
382 signal (SIGPIPE, SIG_IGN);
6d318c73 383#endif
c906108c
SS
384
385 return 0;
386}
387
0ea3f30e 388void
9db8d71f 389net_close (struct serial *scb)
c906108c 390{
363a6e9f 391 if (scb->fd == -1)
c906108c
SS
392 return;
393
c5aa993b 394 close (scb->fd);
c906108c
SS
395 scb->fd = -1;
396}
397
0ea3f30e 398int
b4505029
MM
399net_read_prim (struct serial *scb, size_t count)
400{
c49e7f76
PA
401 /* Need to cast to silence -Wpointer-sign on MinGW, as Winsock's
402 'recv' takes 'char *' as second argument, while 'scb->buf' is
403 'unsigned char *'. */
69e976f8 404 return recv (scb->fd, (char *) scb->buf, count, 0);
b4505029
MM
405}
406
0ea3f30e 407int
b4505029
MM
408net_write_prim (struct serial *scb, const void *buf, size_t count)
409{
69e976f8
PA
410 /* On Windows, the second parameter to send is a "const char *"; on
411 UNIX systems it is generally "const void *". The cast to "const
412 char *" is OK everywhere, since in C++ any data pointer type can
413 be implicitly converted to "const void *". */
414 return send (scb->fd, (const char *) buf, count, 0);
b4505029
MM
415}
416
8775bb90
MS
417int
418ser_tcp_send_break (struct serial *scb)
419{
c378eb4e 420 /* Send telnet IAC and BREAK characters. */
8775bb90
MS
421 return (serial_write (scb, "\377\363", 2));
422}
423
84603566
SL
424/* Support for "set tcp" and "show tcp" commands. */
425
426static void
981a3fb3 427set_tcp_cmd (const char *args, int from_tty)
84603566 428{
635c7e8a 429 help_list (tcp_set_cmdlist, "set tcp ", all_commands, gdb_stdout);
84603566
SL
430}
431
432static void
981a3fb3 433show_tcp_cmd (const char *args, int from_tty)
84603566 434{
635c7e8a 435 help_list (tcp_show_cmdlist, "show tcp ", all_commands, gdb_stdout);
84603566
SL
436}
437
12e8c7d7
TT
438#ifndef USE_WIN32API
439
440/* The TCP ops. */
441
442static const struct serial_ops tcp_ops =
443{
444 "tcp",
445 net_open,
446 net_close,
447 NULL,
448 ser_base_readchar,
449 ser_base_write,
450 ser_base_flush_output,
451 ser_base_flush_input,
452 ser_tcp_send_break,
453 ser_base_raw,
454 ser_base_get_tty_state,
455 ser_base_copy_tty_state,
456 ser_base_set_tty_state,
457 ser_base_print_tty_state,
12e8c7d7
TT
458 ser_base_setbaudrate,
459 ser_base_setstopbits,
236af5e3 460 ser_base_setparity,
12e8c7d7
TT
461 ser_base_drain_output,
462 ser_base_async,
463 net_read_prim,
464 net_write_prim
465};
466
467#endif /* USE_WIN32API */
84603566 468
c906108c 469void
c2c6d25f 470_initialize_ser_tcp (void)
c906108c 471{
b4505029 472#ifdef USE_WIN32API
0ea3f30e
DJ
473 /* Do nothing; the TCP serial operations will be initialized in
474 ser-mingw.c. */
0ea3f30e 475#else
12e8c7d7 476 serial_add_interface (&tcp_ops);
0ea3f30e 477#endif /* USE_WIN32API */
84603566
SL
478
479 add_prefix_cmd ("tcp", class_maintenance, set_tcp_cmd, _("\
480TCP protocol specific variables\n\
481Configure variables specific to remote TCP connections"),
482 &tcp_set_cmdlist, "set tcp ",
483 0 /* allow-unknown */, &setlist);
484 add_prefix_cmd ("tcp", class_maintenance, show_tcp_cmd, _("\
485TCP protocol specific variables\n\
486Configure variables specific to remote TCP connections"),
487 &tcp_show_cmdlist, "show tcp ",
488 0 /* allow-unknown */, &showlist);
489
490 add_setshow_boolean_cmd ("auto-retry", class_obscure,
491 &tcp_auto_retry, _("\
492Set auto-retry on socket connect"), _("\
493Show auto-retry on socket connect"),
494 NULL, NULL, NULL,
495 &tcp_set_cmdlist, &tcp_show_cmdlist);
496
497 add_setshow_uinteger_cmd ("connect-timeout", class_obscure,
498 &tcp_retry_limit, _("\
f81d1120
PA
499Set timeout limit in seconds for socket connection"), _("\
500Show timeout limit in seconds for socket connection"), _("\
501If set to \"unlimited\", GDB will keep attempting to establish a\n\
502connection forever, unless interrupted with Ctrl-c.\n\
503The default is 15 seconds."),
504 NULL, NULL,
505 &tcp_set_cmdlist, &tcp_show_cmdlist);
c906108c 506}