/* Serial interface for local (hardwired) serial ports on Un*x like systems
- Copyright (C) 1992-2013 Free Software Foundation, Inc.
+ Copyright (C) 1992-2015 Free Software Foundation, Inc.
This file is part of GDB.
#include <sys/types.h>
#include "terminal.h"
#include <sys/socket.h>
-#include <sys/time.h>
+#include "gdb_sys_time.h"
#include "gdb_select.h"
-#include <string.h>
#include "gdbcmd.h"
#include "filestuff.h"
static int do_hardwire_readchar (struct serial *scb, int timeout);
static int rate_to_code (int rate);
static int hardwire_setbaudrate (struct serial *scb, int rate);
+static int hardwire_setparity (struct serial *scb, int parity);
static void hardwire_close (struct serial *scb);
static int get_tty_state (struct serial *scb,
struct hardwire_ttystate * state);
static serial_ttystate
hardwire_get_tty_state (struct serial *scb)
{
- struct hardwire_ttystate *state;
-
- state = (struct hardwire_ttystate *) xmalloc (sizeof *state);
+ struct hardwire_ttystate *state = XNEW (struct hardwire_ttystate);
if (get_tty_state (scb, state))
{
static serial_ttystate
hardwire_copy_tty_state (struct serial *scb, serial_ttystate ttystate)
{
- struct hardwire_ttystate *state;
+ struct hardwire_ttystate *state = XNEW (struct hardwire_ttystate);
- state = (struct hardwire_ttystate *) xmalloc (sizeof *state);
*state = *(struct hardwire_ttystate *) ttystate;
return (serial_ttystate) state;
state.termios.c_iflag = 0;
state.termios.c_oflag = 0;
state.termios.c_lflag = 0;
- state.termios.c_cflag &= ~(CSIZE | PARENB);
+ state.termios.c_cflag &= ~CSIZE;
state.termios.c_cflag |= CLOCAL | CS8;
#ifdef CRTSCTS
/* h/w flow control. */
state.termio.c_iflag = 0;
state.termio.c_oflag = 0;
state.termio.c_lflag = 0;
- state.termio.c_cflag &= ~(CSIZE | PARENB);
+ state.termio.c_cflag &= ~CSIZE;
state.termio.c_cflag |= CLOCAL | CS8;
state.termio.c_cc[VMIN] = 0;
state.termio.c_cc[VTIME] = 0;
return set_tty_state (scb, &state);
}
+/* Implement the "setparity" serial_ops callback. */
+
+static int
+hardwire_setparity (struct serial *scb, int parity)
+{
+ struct hardwire_ttystate state;
+ int newparity = 0;
+
+ if (get_tty_state (scb, &state))
+ return -1;
+
+ switch (parity)
+ {
+ case GDBPARITY_NONE:
+ newparity = 0;
+ break;
+ case GDBPARITY_ODD:
+ newparity = PARENB | PARODD;
+ break;
+ case GDBPARITY_EVEN:
+ newparity = PARENB;
+ break;
+ default:
+ internal_warning (__FILE__, __LINE__,
+ "Incorrect parity value: %d", parity);
+ return -1;
+ }
+
+#ifdef HAVE_TERMIOS
+ state.termios.c_cflag &= ~(PARENB | PARODD);
+ state.termios.c_cflag |= newparity;
+#endif
+
+#ifdef HAVE_TERMIO
+ state.termio.c_cflag &= ~(PARENB | PARODD);
+ state.termio.c_cflag |= newparity;
+#endif
+
+#ifdef HAVE_SGTTY
+ return 0; /* sgtty doesn't support this */
+#endif
+ return set_tty_state (scb, &state);
+}
+
+
static void
hardwire_close (struct serial *scb)
{
hardwire_noflush_set_tty_state,
hardwire_setbaudrate,
hardwire_setstopbits,
+ hardwire_setparity,
hardwire_drain_output,
ser_base_async,
ser_unix_read_prim,