/* Serial interface for local (hardwired) serial ports on Windows systems
- Copyright (C) 2006, 2007, 2008 Free Software Foundation, Inc.
+ Copyright (C) 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
This file is part of GDB.
#include "gdb_assert.h"
#include "gdb_string.h"
+#include "command.h"
+
void _initialize_ser_windows (void);
struct ser_windows_state
struct ser_windows_state *state;
COMMTIMEOUTS timeouts;
- /* Only allow COM ports. */
- if (strncmp (name, "COM", 3) != 0)
- {
- errno = ENOENT;
- return -1;
- }
-
h = CreateFile (name, GENERIC_READ | GENERIC_WRITE, 0, NULL,
OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
if (h == INVALID_HANDLE_VALUE)
return -1;
}
- scb->fd = _open_osfhandle ((long) h, O_RDWR);
+ scb->fd = _open_osfhandle ((intptr_t) h, O_RDWR);
if (scb->fd < 0)
{
errno = ENOENT;
SetEvent(state->have_stopped);
}
+ return 0;
}
static int
SetEvent (state->have_stopped);
}
+ return 0;
}
static DWORD WINAPI
SetEvent (state->have_stopped);
}
+ return 0;
}
static void
if (isatty (scb->fd))
{
struct ser_console_ttystate *state;
+
state = (struct ser_console_ttystate *) xmalloc (sizeof *state);
state->is_a_tty = 1;
return state;
if (ps->input)
fclose (ps->input);
if (ps->pex)
- pex_free (ps->pex);
- /* pex_free closes ps->output. */
+ {
+ pex_free (ps->pex);
+ /* pex_free closes ps->output. */
+ }
+ else if (ps->output)
+ fclose (ps->output);
xfree (ps);
{
struct pipe_state *ps;
FILE *pex_stderr;
+ char **argv;
+ struct cleanup *back_to;
+
+ if (name == NULL)
+ error_no_arg (_("child command"));
+
+ argv = gdb_buildargv (name);
+ back_to = make_cleanup_freeargv (argv);
- char **argv = buildargv (name);
- struct cleanup *back_to = make_cleanup_freeargv (argv);
if (! argv[0] || argv[0][0] == '\0')
error ("missing child command");
-
ps = make_pipe_state ();
make_cleanup (cleanup_pipe_state, ps);
return -1;
}
+static int
+pipe_windows_fdopen (struct serial *scb, int fd)
+{
+ struct pipe_state *ps;
+
+ ps = make_pipe_state ();
+
+ ps->input = fdopen (fd, "r+");
+ if (! ps->input)
+ goto fail;
+
+ ps->output = fdopen (fd, "r+");
+ if (! ps->output)
+ goto fail;
+
+ scb->fd = fd;
+ scb->state = (void *) ps;
+
+ return 0;
+
+ fail:
+ free_pipe_state (ps);
+ return -1;
+}
static void
pipe_windows_close (struct serial *scb)
HANDLE h = (HANDLE) _get_osfhandle (fd);
DWORD numBytes;
BOOL r = PeekNamedPipe (h, NULL, 0, NULL, &numBytes, NULL);
+
if (r == FALSE)
numBytes = 0;
return numBytes;
}
+int
+gdb_pipe (int pdes[2])
+{
+ if (_pipe (pdes, 512, _O_BINARY | _O_NOINHERIT) == -1)
+ return -1;
+ return 0;
+}
+
struct net_windows_state
{
struct ser_console_state base;
ops->next = 0;
ops->open = pipe_windows_open;
ops->close = pipe_windows_close;
+ ops->fdopen = pipe_windows_fdopen;
ops->readchar = ser_base_readchar;
ops->write = ser_base_write;
ops->flush_output = ser_base_flush_output;
ops->write = ser_base_write;
ops->flush_output = ser_base_flush_output;
ops->flush_input = ser_base_flush_input;
- ops->send_break = ser_base_send_break;
+ ops->send_break = ser_tcp_send_break;
ops->go_raw = ser_base_raw;
ops->get_tty_state = ser_base_get_tty_state;
ops->set_tty_state = ser_base_set_tty_state;