* gdb.base/help.exp (help source): Update expected output.
[deliverable/binutils-gdb.git] / gdb / ser-pipe.c
CommitLineData
daf3f280 1/* Serial interface for a pipe to a separate program
4c38e0a4 2 Copyright (C) 1999, 2000, 2001, 2007, 2008, 2009, 2010
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
daf3f280
JM
47/* Open up a raw pipe */
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
JM
65 int pid;
66 if (socketpair (AF_UNIX, SOCK_STREAM, 0, pdes) < 0)
67 return -1;
65cc4390
VP
68 if (socketpair (AF_UNIX, SOCK_STREAM, 0, err_pdes) < 0)
69 return -1;
daf3f280 70
7700434b
KB
71 /* Create the child process to run the command in. Note that the
72 apparent call to vfork() below *might* actually be a call to
73 fork() due to the fact that autoconf will ``#define vfork fork''
74 on certain platforms. */
adf40b2e
JM
75 pid = vfork ();
76
77 /* Error. */
78 if (pid == -1)
daf3f280 79 {
daf3f280
JM
80 close (pdes[0]);
81 close (pdes[1]);
65cc4390
VP
82 close (err_pdes[0]);
83 close (err_pdes[1]);
daf3f280 84 return -1;
adf40b2e
JM
85 }
86
65cc4390
VP
87 if (fcntl (err_pdes[0], F_SETFL, O_NONBLOCK) == -1)
88 {
89 close (err_pdes[0]);
90 close (err_pdes[1]);
91 err_pdes[0] = err_pdes[1] = -1;
92 }
93
adf40b2e
JM
94 /* Child. */
95 if (pid == 0)
96 {
97 /* re-wire pdes[1] to stdin/stdout */
daf3f280
JM
98 close (pdes[0]);
99 if (pdes[1] != STDOUT_FILENO)
100 {
101 dup2 (pdes[1], STDOUT_FILENO);
102 close (pdes[1]);
103 }
104 dup2 (STDOUT_FILENO, STDIN_FILENO);
65cc4390
VP
105
106 if (err_pdes[0] != -1)
107 {
108 close (err_pdes[0]);
109 dup2 (err_pdes[1], STDERR_FILENO);
110 close (err_pdes[1]);
111 }
adf40b2e
JM
112#if 0
113 /* close any stray FD's - FIXME - how? */
114 /* POSIX.2 B.3.2.2 "popen() shall ensure that any streams
115 from previous popen() calls that remain open in the
116 parent process are closed in the new child process. */
117 for (old = pidlist; old; old = old->next)
118 close (fileno (old->fp)); /* don't allow a flush */
119#endif
36662fde 120 execl ("/bin/sh", "sh", "-c", name, (char *) 0);
daf3f280
JM
121 _exit (127);
122 }
123
adf40b2e 124 /* Parent. */
daf3f280 125 close (pdes[1]);
adf40b2e
JM
126 /* :end chunk */
127 state = XMALLOC (struct pipe_state);
128 state->pid = pid;
daf3f280 129 scb->fd = pdes[0];
65cc4390 130 scb->error_fd = err_pdes[0];
adf40b2e 131 scb->state = state;
daf3f280 132
daf3f280
JM
133 /* If we don't do this, GDB simply exits when the remote side dies. */
134 signal (SIGPIPE, SIG_IGN);
135 return 0;
136#endif
137}
138
daf3f280 139static void
819cc324 140pipe_close (struct serial *scb)
daf3f280 141{
adf40b2e
JM
142 struct pipe_state *state = scb->state;
143 if (state != NULL)
144 {
145 int pid = state->pid;
146 close (scb->fd);
147 scb->fd = -1;
b8c9b27d 148 xfree (state);
adf40b2e
JM
149 scb->state = NULL;
150 kill (pid, SIGTERM);
151 /* Might be useful to check that the child does die. */
152 }
daf3f280
JM
153}
154
c2c6d25f 155static struct serial_ops pipe_ops;
daf3f280
JM
156
157void
c2c6d25f 158_initialize_ser_pipe (void)
daf3f280 159{
c2c6d25f 160 struct serial_ops *ops = XMALLOC (struct serial_ops);
2fdbdd39 161 memset (ops, 0, sizeof (struct serial_ops));
c2c6d25f
JM
162 ops->name = "pipe";
163 ops->next = 0;
164 ops->open = pipe_open;
165 ops->close = pipe_close;
b4505029 166 ops->readchar = ser_base_readchar;
dd5da072
MM
167 ops->write = ser_base_write;
168 ops->flush_output = ser_base_flush_output;
169 ops->flush_input = ser_base_flush_input;
170 ops->send_break = ser_base_send_break;
171 ops->go_raw = ser_base_raw;
172 ops->get_tty_state = ser_base_get_tty_state;
173 ops->set_tty_state = ser_base_set_tty_state;
174 ops->print_tty_state = ser_base_print_tty_state;
175 ops->noflush_set_tty_state = ser_base_noflush_set_tty_state;
176 ops->setbaudrate = ser_base_setbaudrate;
177 ops->setstopbits = ser_base_setstopbits;
178 ops->drain_output = ser_base_drain_output;
179 ops->async = ser_base_async;
b4505029
MM
180 ops->read_prim = ser_unix_read_prim;
181 ops->write_prim = ser_unix_write_prim;
c2c6d25f 182 serial_add_interface (ops);
daf3f280 183}
This page took 1.101649 seconds and 4 git commands to generate.