2011-01-05 Michael Snyder <msnyder@vmware.com>
[deliverable/binutils-gdb.git] / gdb / ser-tcp.c
1 /* Serial interface for raw TCP connections on Un*x like systems.
2
3 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2001, 2005, 2006,
4 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
5
6 This file is part of GDB.
7
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
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
12
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.
17
18 You should have received a copy of the GNU General Public License
19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
20
21 #include "defs.h"
22 #include "serial.h"
23 #include "ser-base.h"
24 #include "ser-tcp.h"
25 #include "gdbcmd.h"
26 #include "cli/cli-decode.h"
27 #include "cli/cli-setshow.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 <sys/time.h>
39
40 #ifdef USE_WIN32API
41 #include <winsock2.h>
42 #define ETIMEDOUT WSAETIMEDOUT
43 #define close(fd) closesocket (fd)
44 #define ioctl ioctlsocket
45 #else
46 #include <netinet/in.h>
47 #include <arpa/inet.h>
48 #include <netdb.h>
49 #include <sys/socket.h>
50 #include <netinet/tcp.h>
51 #endif
52
53 #include <signal.h>
54 #include "gdb_string.h"
55 #include "gdb_select.h"
56
57 #ifndef HAVE_SOCKLEN_T
58 typedef int socklen_t;
59 #endif
60
61 void _initialize_ser_tcp (void);
62
63 /* For "set tcp" and "show tcp". */
64
65 static struct cmd_list_element *tcp_set_cmdlist;
66 static struct cmd_list_element *tcp_show_cmdlist;
67
68 /* Whether to auto-retry refused connections. */
69
70 static int tcp_auto_retry = 1;
71
72 /* Timeout period for connections, in seconds. */
73
74 static int tcp_retry_limit = 15;
75
76 /* how many times per second to poll deprecated_ui_loop_hook */
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
84 static int
85 wait_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;
122
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 }
151
152 /* Open a tcp socket */
153
154 int
155 net_open (struct serial *scb, const char *name)
156 {
157 char *port_str, hostname[100];
158 int n, port, tmp;
159 int use_udp;
160 struct hostent *hostent;
161 struct sockaddr_in sockaddr;
162 #ifdef USE_WIN32API
163 u_long ioarg;
164 #else
165 int ioarg;
166 #endif
167 int polls = 0;
168
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
178 port_str = strchr (name, ':');
179
180 if (!port_str)
181 error (_("net_open: No colon in host name!")); /* Shouldn't ever happen */
182
183 tmp = min (port_str - name, (int) sizeof hostname - 1);
184 strncpy (hostname, name, tmp); /* Don't want colon */
185 hostname[tmp] = '\000'; /* Tie off host name */
186 port = atoi (port_str + 1);
187
188 /* default hostname is localhost */
189 if (!hostname[0])
190 strcpy (hostname, "localhost");
191
192 hostent = gethostbyname (hostname);
193 if (!hostent)
194 {
195 fprintf_unfiltered (gdb_stderr, "%s: unknown host\n", hostname);
196 errno = ENOENT;
197 return -1;
198 }
199
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
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
212 if (scb->fd == -1)
213 return -1;
214
215 /* set socket nonblocking */
216 ioarg = 1;
217 ioctl (scb->fd, FIONBIO, &ioarg);
218
219 /* Use Non-blocking connect. connect() will return 0 if connected
220 already. */
221 n = connect (scb->fd, (struct sockaddr *) &sockaddr, sizeof (sockaddr));
222
223 if (n < 0)
224 {
225 #ifdef USE_WIN32API
226 int err = WSAGetLastError();
227 #else
228 int err = errno;
229 #endif
230
231 /* Maybe we're waiting for the remote target to become ready to
232 accept connections. */
233 if (tcp_auto_retry
234 #ifdef USE_WIN32API
235 && err == WSAECONNREFUSED
236 #else
237 && err == ECONNREFUSED
238 #endif
239 && wait_for_connect (NULL, &polls) >= 0)
240 {
241 close (scb->fd);
242 goto retry;
243 }
244
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 }
259
260 /* looks like we need to wait for the connect */
261 do
262 {
263 n = wait_for_connect (scb, &polls);
264 }
265 while (n == 0);
266 if (n < 0)
267 {
268 net_close (scb);
269 return -1;
270 }
271 }
272
273 /* Got something. Is it an error? */
274 {
275 int res, err;
276 socklen_t len;
277
278 len = sizeof (err);
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);
284 if (res < 0 || err)
285 {
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 }
298 if (err)
299 errno = err;
300 net_close (scb);
301 return -1;
302 }
303 }
304
305 /* turn off nonblocking */
306 ioarg = 0;
307 ioctl (scb->fd, FIONBIO, &ioarg);
308
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
317 #ifdef SIGPIPE
318 /* If we don't do this, then GDB simply exits
319 when the remote side dies. */
320 signal (SIGPIPE, SIG_IGN);
321 #endif
322
323 return 0;
324 }
325
326 void
327 net_close (struct serial *scb)
328 {
329 if (scb->fd == -1)
330 return;
331
332 close (scb->fd);
333 scb->fd = -1;
334 }
335
336 int
337 net_read_prim (struct serial *scb, size_t count)
338 {
339 return recv (scb->fd, scb->buf, count, 0);
340 }
341
342 int
343 net_write_prim (struct serial *scb, const void *buf, size_t count)
344 {
345 return send (scb->fd, buf, count, 0);
346 }
347
348 int
349 ser_tcp_send_break (struct serial *scb)
350 {
351 /* Send telnet IAC and BREAK characters. */
352 return (serial_write (scb, "\377\363", 2));
353 }
354
355 /* Support for "set tcp" and "show tcp" commands. */
356
357 static void
358 set_tcp_cmd (char *args, int from_tty)
359 {
360 help_list (tcp_set_cmdlist, "set tcp ", -1, gdb_stdout);
361 }
362
363 static void
364 show_tcp_cmd (char *args, int from_tty)
365 {
366 help_list (tcp_show_cmdlist, "show tcp ", -1, gdb_stdout);
367 }
368
369
370 void
371 _initialize_ser_tcp (void)
372 {
373 #ifdef USE_WIN32API
374 /* Do nothing; the TCP serial operations will be initialized in
375 ser-mingw.c. */
376 #else
377 struct serial_ops *ops;
378
379 ops = XMALLOC (struct serial_ops);
380 memset (ops, 0, sizeof (struct serial_ops));
381 ops->name = "tcp";
382 ops->next = 0;
383 ops->open = net_open;
384 ops->close = net_close;
385 ops->readchar = ser_base_readchar;
386 ops->write = ser_base_write;
387 ops->flush_output = ser_base_flush_output;
388 ops->flush_input = ser_base_flush_input;
389 ops->send_break = ser_tcp_send_break;
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;
399 ops->read_prim = net_read_prim;
400 ops->write_prim = net_write_prim;
401 serial_add_interface (ops);
402 #endif /* USE_WIN32API */
403
404 add_prefix_cmd ("tcp", class_maintenance, set_tcp_cmd, _("\
405 TCP protocol specific variables\n\
406 Configure 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, _("\
410 TCP protocol specific variables\n\
411 Configure 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, _("\
417 Set auto-retry on socket connect"), _("\
418 Show 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, _("\
424 Set timeout limit for socket connection"), _("\
425 Show timeout limit for socket connection"),
426 NULL, NULL, NULL,
427 &tcp_set_cmdlist, &tcp_show_cmdlist);
428 }
This page took 0.040702 seconds and 4 git commands to generate.