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