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