gdb/testsuite/
[deliverable/binutils-gdb.git] / gdb / ser-pipe.c
CommitLineData
daf3f280 1/* Serial interface for a pipe to a separate program
7b6bb8da 2 Copyright (C) 1999, 2000, 2001, 2007, 2008, 2009, 2010, 2011
0fb0cc75 3 Free Software Foundation, Inc.
daf3f280
JM
4
5 Contributed by Cygnus Solutions.
6
7 This file is part of GDB.
8
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
a9762ec7 11 the Free Software Foundation; either version 3 of the License, or
daf3f280
JM
12 (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
a9762ec7 20 along with this program. If not, see <http://www.gnu.org/licenses/>. */
daf3f280
JM
21
22#include "defs.h"
23#include "serial.h"
3eb25fda 24#include "ser-base.h"
c2c6d25f
JM
25#include "ser-unix.h"
26
74c1b268
AC
27#include "gdb_vfork.h"
28
daf3f280 29#include <sys/types.h>
daf3f280
JM
30#include <sys/socket.h>
31#include <sys/time.h>
32#include <fcntl.h>
27b82ed2 33#include "gdb_string.h"
daf3f280 34
042be3a9 35#include <signal.h>
daf3f280 36
819cc324
AC
37static int pipe_open (struct serial *scb, const char *name);
38static void pipe_close (struct serial *scb);
adf40b2e 39
c2c6d25f 40extern void _initialize_ser_pipe (void);
adf40b2e
JM
41
42struct pipe_state
43 {
44 int pid;
45 };
46
c378eb4e 47/* Open up a raw pipe. */
daf3f280
JM
48
49static int
819cc324 50pipe_open (struct serial *scb, const char *name)
daf3f280 51{
2acceee2 52#if !HAVE_SOCKETPAIR
daf3f280
JM
53 return -1;
54#else
adf40b2e 55 struct pipe_state *state;
daf3f280 56 /* This chunk: */
daf3f280
JM
57 /* Copyright (c) 1988, 1993
58 * The Regents of the University of California. All rights reserved.
59 *
60 * This code is derived from software written by Ken Arnold and
61 * published in UNIX Review, Vol. 6, No. 8.
62 */
63 int pdes[2];
65cc4390 64 int err_pdes[2];
daf3f280 65 int pid;
433759f7 66
daf3f280
JM
67 if (socketpair (AF_UNIX, SOCK_STREAM, 0, pdes) < 0)
68 return -1;
65cc4390 69 if (socketpair (AF_UNIX, SOCK_STREAM, 0, err_pdes) < 0)
ff9f22f1
DE
70 {
71 close (pdes[0]);
72 close (pdes[1]);
73 return -1;
74 }
daf3f280 75
7700434b
KB
76 /* Create the child process to run the command in. Note that the
77 apparent call to vfork() below *might* actually be a call to
78 fork() due to the fact that autoconf will ``#define vfork fork''
79 on certain platforms. */
adf40b2e
JM
80 pid = vfork ();
81
c378eb4e 82 /* Error. */
adf40b2e 83 if (pid == -1)
daf3f280 84 {
daf3f280
JM
85 close (pdes[0]);
86 close (pdes[1]);
65cc4390
VP
87 close (err_pdes[0]);
88 close (err_pdes[1]);
daf3f280 89 return -1;
adf40b2e
JM
90 }
91
65cc4390
VP
92 if (fcntl (err_pdes[0], F_SETFL, O_NONBLOCK) == -1)
93 {
94 close (err_pdes[0]);
95 close (err_pdes[1]);
96 err_pdes[0] = err_pdes[1] = -1;
97 }
98
c378eb4e 99 /* Child. */
adf40b2e
JM
100 if (pid == 0)
101 {
e34838f0
DE
102 /* We don't want ^c to kill the connection. */
103#ifdef HAVE_SETSID
104 pid_t sid = setsid ();
105 if (sid == -1)
106 signal (SIGINT, SIG_IGN);
107#else
108 signal (SIGINT, SIG_IGN);
109#endif
110
c378eb4e 111 /* Re-wire pdes[1] to stdin/stdout. */
daf3f280
JM
112 close (pdes[0]);
113 if (pdes[1] != STDOUT_FILENO)
114 {
115 dup2 (pdes[1], STDOUT_FILENO);
116 close (pdes[1]);
117 }
118 dup2 (STDOUT_FILENO, STDIN_FILENO);
65cc4390
VP
119
120 if (err_pdes[0] != -1)
121 {
122 close (err_pdes[0]);
123 dup2 (err_pdes[1], STDERR_FILENO);
124 close (err_pdes[1]);
125 }
adf40b2e 126#if 0
c378eb4e 127 /* close any stray FD's - FIXME - how? */
adf40b2e
JM
128 /* POSIX.2 B.3.2.2 "popen() shall ensure that any streams
129 from previous popen() calls that remain open in the
c378eb4e 130 parent process are closed in the new child process. */
adf40b2e 131 for (old = pidlist; old; old = old->next)
c378eb4e 132 close (fileno (old->fp)); /* Don't allow a flush. */
adf40b2e 133#endif
36662fde 134 execl ("/bin/sh", "sh", "-c", name, (char *) 0);
daf3f280
JM
135 _exit (127);
136 }
137
c378eb4e 138 /* Parent. */
daf3f280 139 close (pdes[1]);
ff9f22f1
DE
140 if (err_pdes[1] != -1)
141 close (err_pdes[1]);
adf40b2e
JM
142 /* :end chunk */
143 state = XMALLOC (struct pipe_state);
144 state->pid = pid;
daf3f280 145 scb->fd = pdes[0];
65cc4390 146 scb->error_fd = err_pdes[0];
adf40b2e 147 scb->state = state;
daf3f280 148
daf3f280
JM
149 /* If we don't do this, GDB simply exits when the remote side dies. */
150 signal (SIGPIPE, SIG_IGN);
151 return 0;
152#endif
153}
154
daf3f280 155static void
819cc324 156pipe_close (struct serial *scb)
daf3f280 157{
adf40b2e 158 struct pipe_state *state = scb->state;
433759f7 159
58f07bae
PA
160 close (scb->fd);
161 scb->fd = -1;
162
adf40b2e
JM
163 if (state != NULL)
164 {
0b6cb71e
DE
165 int wait_result, status;
166
167 /* Don't kill the task right away, give it a chance to shut down cleanly.
168 But don't wait forever though. */
169#define PIPE_CLOSE_TIMEOUT 5
170
0a4f61e3
DJ
171 /* Assume the program will exit after SIGTERM. Might be
172 useful to print any remaining stderr output from
173 scb->error_fd while waiting. */
0b6cb71e
DE
174#define SIGTERM_TIMEOUT INT_MAX
175
176 wait_result = -1;
177#ifdef HAVE_WAITPID
178 wait_result = wait_to_die_with_timeout (state->pid, &status,
179 PIPE_CLOSE_TIMEOUT);
0a4f61e3 180#endif
0b6cb71e
DE
181 if (wait_result == -1)
182 {
183 kill (state->pid, SIGTERM);
184#ifdef HAVE_WAITPID
185 wait_to_die_with_timeout (state->pid, &status, SIGTERM_TIMEOUT);
186#endif
187 }
188
ff9f22f1
DE
189 if (scb->error_fd != -1)
190 close (scb->error_fd);
191 scb->error_fd = -1;
b8c9b27d 192 xfree (state);
adf40b2e 193 scb->state = NULL;
adf40b2e 194 }
daf3f280
JM
195}
196
58f07bae
PA
197int
198gdb_pipe (int pdes[2])
199{
200#if !HAVE_SOCKETPAIR
201 errno = ENOSYS;
202 return -1;
203#else
204
205 if (socketpair (AF_UNIX, SOCK_STREAM, 0, pdes) < 0)
206 return -1;
207
208 /* If we don't do this, GDB simply exits when the remote side
209 dies. */
210 signal (SIGPIPE, SIG_IGN);
211 return 0;
212#endif
213}
214
daf3f280 215void
c2c6d25f 216_initialize_ser_pipe (void)
daf3f280 217{
c2c6d25f 218 struct serial_ops *ops = XMALLOC (struct serial_ops);
433759f7 219
2fdbdd39 220 memset (ops, 0, sizeof (struct serial_ops));
c2c6d25f
JM
221 ops->name = "pipe";
222 ops->next = 0;
223 ops->open = pipe_open;
224 ops->close = pipe_close;
b4505029 225 ops->readchar = ser_base_readchar;
dd5da072
MM
226 ops->write = ser_base_write;
227 ops->flush_output = ser_base_flush_output;
228 ops->flush_input = ser_base_flush_input;
229 ops->send_break = ser_base_send_break;
230 ops->go_raw = ser_base_raw;
231 ops->get_tty_state = ser_base_get_tty_state;
1e182ce8 232 ops->copy_tty_state = ser_base_copy_tty_state;
dd5da072
MM
233 ops->set_tty_state = ser_base_set_tty_state;
234 ops->print_tty_state = ser_base_print_tty_state;
235 ops->noflush_set_tty_state = ser_base_noflush_set_tty_state;
236 ops->setbaudrate = ser_base_setbaudrate;
237 ops->setstopbits = ser_base_setstopbits;
238 ops->drain_output = ser_base_drain_output;
239 ops->async = ser_base_async;
b4505029
MM
240 ops->read_prim = ser_unix_read_prim;
241 ops->write_prim = ser_unix_write_prim;
c2c6d25f 242 serial_add_interface (ops);
daf3f280 243}
This page took 1.150466 seconds and 4 git commands to generate.