This commit was generated by cvs2svn to track changes on a CVS vendor
[deliverable/binutils-gdb.git] / gdb / ser-tcp.c
1 /* Serial interface for raw TCP connections on Un*x like systems
2 Copyright 1992, 1993, 1998 Free Software Foundation, Inc.
3
4 This file is part of GDB.
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
20
21 #include "defs.h"
22 #include "serial.h"
23 #include <sys/types.h>
24 #include <sys/time.h>
25 #include <netinet/in.h>
26 #include <arpa/inet.h>
27 #include <netdb.h>
28 #include <sys/socket.h>
29 #ifdef HAVE_UNISTD_H
30 #include <unistd.h>
31 #endif
32
33 #ifndef __CYGWIN32__
34 #include <netinet/tcp.h>
35 #endif
36
37 #include "signals.h"
38 #include "gdb_string.h"
39
40 extern int (*ui_loop_hook) PARAMS ((int));
41
42 struct tcp_ttystate
43 {
44 int bogus;
45 };
46
47 static int tcp_open PARAMS ((serial_t scb, const char *name));
48 static void tcp_raw PARAMS ((serial_t scb));
49 static int wait_for PARAMS ((serial_t scb, int timeout));
50 static int tcp_readchar PARAMS ((serial_t scb, int timeout));
51 static int tcp_setbaudrate PARAMS ((serial_t scb, int rate));
52 static int tcp_setstopbits PARAMS ((serial_t scb, int num));
53 static int tcp_write PARAMS ((serial_t scb, const char *str, int len));
54 /* FIXME: static void tcp_restore PARAMS ((serial_t scb)); */
55 static void tcp_close PARAMS ((serial_t scb));
56 static serial_ttystate tcp_get_tty_state PARAMS ((serial_t scb));
57 static int tcp_set_tty_state PARAMS ((serial_t scb, serial_ttystate state));
58 static int tcp_return_0 PARAMS ((serial_t));
59 static int tcp_noflush_set_tty_state PARAMS ((serial_t, serial_ttystate,
60 serial_ttystate));
61 static void tcp_print_tty_state PARAMS ((serial_t, serial_ttystate));
62
63 void _initialize_ser_tcp PARAMS ((void));
64
65 /* Open up a raw tcp socket */
66
67 static int
68 tcp_open (scb, name)
69 serial_t scb;
70 const char *name;
71 {
72 char *port_str;
73 int port;
74 struct hostent *hostent;
75 struct sockaddr_in sockaddr;
76 int tmp;
77 char hostname[100];
78 struct protoent *protoent;
79 int i;
80
81 port_str = strchr (name, ':');
82
83 if (!port_str)
84 error ("tcp_open: No colon in host name!"); /* Shouldn't ever happen */
85
86 tmp = min (port_str - name, (int) sizeof hostname - 1);
87 strncpy (hostname, name, tmp); /* Don't want colon */
88 hostname[tmp] = '\000'; /* Tie off host name */
89 port = atoi (port_str + 1);
90
91 hostent = gethostbyname (hostname);
92
93 if (!hostent)
94 {
95 fprintf_unfiltered (gdb_stderr, "%s: unknown host\n", hostname);
96 errno = ENOENT;
97 return -1;
98 }
99
100 for (i = 1; i <= 15; i++)
101 {
102 scb->fd = socket (PF_INET, SOCK_STREAM, 0);
103 if (scb->fd < 0)
104 return -1;
105
106 /* Allow rapid reuse of this port. */
107 tmp = 1;
108 setsockopt (scb->fd, SOL_SOCKET, SO_REUSEADDR, (char *) &tmp, sizeof (tmp));
109
110 /* Enable TCP keep alive process. */
111 tmp = 1;
112 setsockopt (scb->fd, SOL_SOCKET, SO_KEEPALIVE, (char *) &tmp, sizeof (tmp));
113
114 sockaddr.sin_family = PF_INET;
115 sockaddr.sin_port = htons (port);
116 memcpy (&sockaddr.sin_addr.s_addr, hostent->h_addr,
117 sizeof (struct in_addr));
118
119 if (!connect (scb->fd, (struct sockaddr *) &sockaddr, sizeof (sockaddr)))
120 break;
121
122 close (scb->fd);
123 scb->fd = -1;
124
125 /* We retry for ECONNREFUSED because that is often a temporary condition, which
126 happens when the server is being restarted. */
127
128 if (errno != ECONNREFUSED)
129 return -1;
130
131 sleep (1);
132 }
133
134 protoent = getprotobyname ("tcp");
135 if (!protoent)
136 return -1;
137
138 tmp = 1;
139 if (setsockopt (scb->fd, protoent->p_proto, TCP_NODELAY,
140 (char *) &tmp, sizeof (tmp)))
141 return -1;
142
143 signal (SIGPIPE, SIG_IGN); /* If we don't do this, then GDB simply exits
144 when the remote side dies. */
145
146 return 0;
147 }
148
149 static serial_ttystate
150 tcp_get_tty_state (scb)
151 serial_t scb;
152 {
153 struct tcp_ttystate *state;
154
155 state = (struct tcp_ttystate *) xmalloc (sizeof *state);
156
157 return (serial_ttystate) state;
158 }
159
160 static int
161 tcp_set_tty_state (scb, ttystate)
162 serial_t scb;
163 serial_ttystate ttystate;
164 {
165 struct tcp_ttystate *state;
166
167 state = (struct tcp_ttystate *) ttystate;
168
169 return 0;
170 }
171
172 static int
173 tcp_return_0 (scb)
174 serial_t scb;
175 {
176 return 0;
177 }
178
179 static void
180 tcp_raw (scb)
181 serial_t scb;
182 {
183 return; /* Always in raw mode */
184 }
185
186 /* Wait for input on scb, with timeout seconds. Returns 0 on success,
187 otherwise SERIAL_TIMEOUT or SERIAL_ERROR.
188
189 For termio{s}, we actually just setup VTIME if necessary, and let the
190 timeout occur in the read() in tcp_read().
191 */
192
193 static int
194 wait_for (scb, timeout)
195 serial_t scb;
196 int timeout;
197 {
198 int numfds;
199 struct timeval tv;
200 fd_set readfds, exceptfds;
201
202 FD_ZERO (&readfds);
203 FD_ZERO (&exceptfds);
204
205 tv.tv_sec = timeout;
206 tv.tv_usec = 0;
207
208 FD_SET (scb->fd, &readfds);
209 FD_SET (scb->fd, &exceptfds);
210
211 while (1)
212 {
213 if (timeout >= 0)
214 numfds = select (scb->fd + 1, &readfds, 0, &exceptfds, &tv);
215 else
216 numfds = select (scb->fd + 1, &readfds, 0, &exceptfds, 0);
217
218 if (numfds <= 0)
219 {
220 if (numfds == 0)
221 return SERIAL_TIMEOUT;
222 else if (errno == EINTR)
223 continue;
224 else
225 return SERIAL_ERROR; /* Got an error from select or poll */
226 }
227
228 return 0;
229 }
230 }
231
232 /* Read a character with user-specified timeout. TIMEOUT is number of seconds
233 to wait, or -1 to wait forever. Use timeout of 0 to effect a poll. Returns
234 char if successful. Returns -2 if timeout expired, EOF if line dropped
235 dead, or -3 for any other error (see errno in that case). */
236
237 static int
238 tcp_readchar (scb, timeout)
239 serial_t scb;
240 int timeout;
241 {
242 int status;
243 int delta;
244
245 if (scb->bufcnt-- > 0)
246 return *scb->bufp++;
247
248 /* We have to be able to keep the GUI alive here, so we break the original
249 timeout into steps of 1 second, running the "keep the GUI alive" hook
250 each time through the loop.
251
252 Also, timeout = 0 means to poll, so we just set the delta to 0, so we
253 will only go through the loop once. */
254
255 delta = (timeout == 0 ? 0 : 1);
256 while (1)
257 {
258
259 /* N.B. The UI may destroy our world (for instance by calling
260 remote_stop,) in which case we want to get out of here as
261 quickly as possible. It is not safe to touch scb, since
262 someone else might have freed it. The ui_loop_hook signals that
263 we should exit by returning 1. */
264
265 if (ui_loop_hook)
266 {
267 if (ui_loop_hook (0))
268 return SERIAL_TIMEOUT;
269 }
270
271 status = wait_for (scb, delta);
272 timeout -= delta;
273
274 /* If we got a character or an error back from wait_for, then we can
275 break from the loop before the timeout is completed. */
276
277 if (status != SERIAL_TIMEOUT)
278 {
279 break;
280 }
281
282 /* If we have exhausted the original timeout, then generate
283 a SERIAL_TIMEOUT, and pass it out of the loop. */
284
285 else if (timeout == 0)
286 {
287 status == SERIAL_TIMEOUT;
288 break;
289 }
290 }
291
292 if (status < 0)
293 return status;
294
295 while (1)
296 {
297 scb->bufcnt = read (scb->fd, scb->buf, BUFSIZ);
298 if (scb->bufcnt != -1 || errno != EINTR)
299 break;
300 }
301
302 if (scb->bufcnt <= 0)
303 {
304 if (scb->bufcnt == 0)
305 return SERIAL_TIMEOUT; /* 0 chars means timeout [may need to
306 distinguish between EOF & timeouts
307 someday] */
308 else
309 return SERIAL_ERROR; /* Got an error from read */
310 }
311
312 scb->bufcnt--;
313 scb->bufp = scb->buf;
314 return *scb->bufp++;
315 }
316
317 static int
318 tcp_noflush_set_tty_state (scb, new_ttystate, old_ttystate)
319 serial_t scb;
320 serial_ttystate new_ttystate;
321 serial_ttystate old_ttystate;
322 {
323 return 0;
324 }
325
326 static void
327 tcp_print_tty_state (scb, ttystate)
328 serial_t scb;
329 serial_ttystate ttystate;
330 {
331 /* Nothing to print. */
332 return;
333 }
334
335 static int
336 tcp_setbaudrate (scb, rate)
337 serial_t scb;
338 int rate;
339 {
340 return 0; /* Never fails! */
341 }
342
343 static int
344 tcp_setstopbits (scb, num)
345 serial_t scb;
346 int num;
347 {
348 return 0; /* Never fails! */
349 }
350
351 static int
352 tcp_write (scb, str, len)
353 serial_t scb;
354 const char *str;
355 int len;
356 {
357 int cc;
358
359 while (len > 0)
360 {
361 cc = write (scb->fd, str, len);
362
363 if (cc < 0)
364 return 1;
365 len -= cc;
366 str += cc;
367 }
368 return 0;
369 }
370
371 static void
372 tcp_close (scb)
373 serial_t scb;
374 {
375 if (scb->fd < 0)
376 return;
377
378 close (scb->fd);
379 scb->fd = -1;
380 }
381
382 static struct serial_ops tcp_ops =
383 {
384 "tcp",
385 0,
386 tcp_open,
387 tcp_close,
388 tcp_readchar,
389 tcp_write,
390 tcp_return_0, /* flush output */
391 tcp_return_0, /* flush input */
392 tcp_return_0, /* send break */
393 tcp_raw,
394 tcp_get_tty_state,
395 tcp_set_tty_state,
396 tcp_print_tty_state,
397 tcp_noflush_set_tty_state,
398 tcp_setbaudrate,
399 tcp_setstopbits,
400 tcp_return_0, /* wait for output to drain */
401 };
402
403 void
404 _initialize_ser_tcp ()
405 {
406 serial_add_interface (&tcp_ops);
407 }
This page took 0.055087 seconds and 5 git commands to generate.