/* Serial interface for a pipe to a separate program
- Copyright (C) 1999-2013 Free Software Foundation, Inc.
+ Copyright (C) 1999-2023 Free Software Foundation, Inc.
Contributed by Cygnus Solutions.
#include <sys/types.h>
#include <sys/socket.h>
-#include <sys/time.h>
+#include "gdbsupport/gdb_sys_time.h"
#include <fcntl.h>
-#include <string.h>
-#include "filestuff.h"
+#include "gdbsupport/filestuff.h"
+#include "gdbsupport/pathstuff.h"
#include <signal.h>
static int pipe_open (struct serial *scb, const char *name);
static void pipe_close (struct serial *scb);
-extern void _initialize_ser_pipe (void);
-
struct pipe_state
{
int pid;
int err_pdes[2];
int pid;
+ if (*name == '|')
+ {
+ name++;
+ name = skip_spaces (name);
+ }
+
if (gdb_socketpair_cloexec (AF_UNIX, SOCK_STREAM, 0, pdes) < 0)
return -1;
if (gdb_socketpair_cloexec (AF_UNIX, SOCK_STREAM, 0, err_pdes) < 0)
}
close_most_fds ();
- execl ("/bin/sh", "sh", "-c", name, (char *) 0);
+
+ const char *shellfile = get_shell ();
+ execl (shellfile, shellfile, "-c", name, (char *) 0);
_exit (127);
}
if (err_pdes[1] != -1)
close (err_pdes[1]);
/* :end chunk */
- state = XMALLOC (struct pipe_state);
+ state = XNEW (struct pipe_state);
state->pid = pid;
scb->fd = pdes[0];
scb->error_fd = err_pdes[0];
static void
pipe_close (struct serial *scb)
{
- struct pipe_state *state = scb->state;
+ struct pipe_state *state = (struct pipe_state *) scb->state;
close (scb->fd);
scb->fd = -1;
ser_base_copy_tty_state,
ser_base_set_tty_state,
ser_base_print_tty_state,
- ser_base_noflush_set_tty_state,
ser_base_setbaudrate,
ser_base_setstopbits,
+ ser_base_setparity,
ser_base_drain_output,
ser_base_async,
ser_unix_read_prim,
ser_unix_write_prim
};
+void _initialize_ser_pipe ();
void
-_initialize_ser_pipe (void)
+_initialize_ser_pipe ()
{
serial_add_interface (&pipe_ops);
}