Home | History | Annotate | Line # | Download | only in gdb
      1   1.1  christos /* Serial interface for local (hardwired) serial ports on Un*x like systems
      2   1.1  christos 
      3  1.11  christos    Copyright (C) 1992-2024 Free Software Foundation, Inc.
      4   1.1  christos 
      5   1.1  christos    This file is part of GDB.
      6   1.1  christos 
      7   1.1  christos    This program is free software; you can redistribute it and/or modify
      8   1.1  christos    it under the terms of the GNU General Public License as published by
      9   1.1  christos    the Free Software Foundation; either version 3 of the License, or
     10   1.1  christos    (at your option) any later version.
     11   1.1  christos 
     12   1.1  christos    This program is distributed in the hope that it will be useful,
     13   1.1  christos    but WITHOUT ANY WARRANTY; without even the implied warranty of
     14   1.1  christos    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15   1.1  christos    GNU General Public License for more details.
     16   1.1  christos 
     17   1.1  christos    You should have received a copy of the GNU General Public License
     18   1.1  christos    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
     19   1.1  christos 
     20   1.1  christos #include "serial.h"
     21   1.1  christos #include "ser-base.h"
     22   1.1  christos #include "ser-unix.h"
     23   1.1  christos 
     24   1.1  christos #include <fcntl.h>
     25   1.1  christos #include <sys/types.h>
     26   1.1  christos #include "terminal.h"
     27   1.1  christos #include <sys/socket.h>
     28   1.9  christos #include "gdbsupport/gdb_sys_time.h"
     29   1.1  christos 
     30   1.9  christos #include "gdbsupport/gdb_select.h"
     31  1.11  christos #include "cli/cli-cmds.h"
     32   1.9  christos #include "gdbsupport/filestuff.h"
     33   1.8  christos #include <termios.h>
     34  1.10  christos #include "gdbsupport/scoped_ignore_sigttou.h"
     35   1.1  christos 
     36   1.1  christos struct hardwire_ttystate
     37   1.1  christos   {
     38   1.1  christos     struct termios termios;
     39   1.1  christos   };
     40   1.1  christos 
     41   1.1  christos #ifdef CRTSCTS
     42   1.1  christos /* Boolean to explicitly enable or disable h/w flow control.  */
     43   1.9  christos static bool serial_hwflow;
     44   1.1  christos static void
     45   1.1  christos show_serial_hwflow (struct ui_file *file, int from_tty,
     46   1.1  christos 		    struct cmd_list_element *c, const char *value)
     47   1.1  christos {
     48  1.10  christos   gdb_printf (file, _("Hardware flow control is %s.\n"), value);
     49   1.1  christos }
     50   1.1  christos #endif
     51   1.1  christos 
     52   1.1  christos static void hardwire_raw (struct serial *scb);
     53   1.1  christos static int rate_to_code (int rate);
     54  1.11  christos static void hardwire_setbaudrate (struct serial *scb, int rate);
     55   1.5  christos static int hardwire_setparity (struct serial *scb, int parity);
     56   1.1  christos static void hardwire_close (struct serial *scb);
     57   1.1  christos static int get_tty_state (struct serial *scb,
     58   1.1  christos 			  struct hardwire_ttystate * state);
     59   1.1  christos static int set_tty_state (struct serial *scb,
     60   1.1  christos 			  struct hardwire_ttystate * state);
     61   1.1  christos static serial_ttystate hardwire_get_tty_state (struct serial *scb);
     62   1.1  christos static int hardwire_set_tty_state (struct serial *scb, serial_ttystate state);
     63   1.1  christos static void hardwire_print_tty_state (struct serial *, serial_ttystate,
     64   1.1  christos 				      struct ui_file *);
     65   1.1  christos static int hardwire_drain_output (struct serial *);
     66   1.1  christos static int hardwire_flush_output (struct serial *);
     67   1.1  christos static int hardwire_flush_input (struct serial *);
     68  1.11  christos static void hardwire_send_break (struct serial *);
     69   1.1  christos static int hardwire_setstopbits (struct serial *, int);
     70   1.1  christos 
     71   1.1  christos /* Open up a real live device for serial I/O.  */
     72   1.1  christos 
     73  1.11  christos static void
     74   1.1  christos hardwire_open (struct serial *scb, const char *name)
     75   1.1  christos {
     76  1.10  christos   scb->fd = gdb_open_cloexec (name, O_RDWR, 0).release ();
     77   1.1  christos   if (scb->fd < 0)
     78  1.11  christos     perror_with_name ("could not open device");
     79   1.1  christos }
     80   1.1  christos 
     81   1.1  christos static int
     82   1.1  christos get_tty_state (struct serial *scb, struct hardwire_ttystate *state)
     83   1.1  christos {
     84   1.1  christos   if (tcgetattr (scb->fd, &state->termios) < 0)
     85   1.1  christos     return -1;
     86   1.1  christos 
     87   1.1  christos   return 0;
     88   1.1  christos }
     89   1.1  christos 
     90   1.1  christos static int
     91   1.1  christos set_tty_state (struct serial *scb, struct hardwire_ttystate *state)
     92   1.1  christos {
     93   1.1  christos   if (tcsetattr (scb->fd, TCSANOW, &state->termios) < 0)
     94   1.1  christos     return -1;
     95   1.1  christos 
     96   1.1  christos   return 0;
     97   1.1  christos }
     98   1.1  christos 
     99   1.1  christos static serial_ttystate
    100   1.1  christos hardwire_get_tty_state (struct serial *scb)
    101   1.1  christos {
    102   1.6  christos   struct hardwire_ttystate *state = XNEW (struct hardwire_ttystate);
    103   1.1  christos 
    104   1.1  christos   if (get_tty_state (scb, state))
    105   1.1  christos     {
    106   1.1  christos       xfree (state);
    107   1.1  christos       return NULL;
    108   1.1  christos     }
    109   1.1  christos 
    110   1.1  christos   return (serial_ttystate) state;
    111   1.1  christos }
    112   1.1  christos 
    113   1.1  christos static serial_ttystate
    114   1.1  christos hardwire_copy_tty_state (struct serial *scb, serial_ttystate ttystate)
    115   1.1  christos {
    116   1.6  christos   struct hardwire_ttystate *state = XNEW (struct hardwire_ttystate);
    117   1.1  christos 
    118   1.1  christos   *state = *(struct hardwire_ttystate *) ttystate;
    119   1.1  christos 
    120   1.1  christos   return (serial_ttystate) state;
    121   1.1  christos }
    122   1.1  christos 
    123   1.1  christos static int
    124   1.1  christos hardwire_set_tty_state (struct serial *scb, serial_ttystate ttystate)
    125   1.1  christos {
    126   1.1  christos   struct hardwire_ttystate *state;
    127   1.1  christos 
    128   1.1  christos   state = (struct hardwire_ttystate *) ttystate;
    129   1.1  christos 
    130   1.1  christos   return set_tty_state (scb, state);
    131   1.1  christos }
    132   1.1  christos 
    133   1.1  christos static void
    134   1.1  christos hardwire_print_tty_state (struct serial *scb,
    135   1.1  christos 			  serial_ttystate ttystate,
    136   1.1  christos 			  struct ui_file *stream)
    137   1.1  christos {
    138   1.1  christos   struct hardwire_ttystate *state = (struct hardwire_ttystate *) ttystate;
    139   1.1  christos   int i;
    140   1.1  christos 
    141  1.10  christos   gdb_printf (stream, "c_iflag = 0x%x, c_oflag = 0x%x,\n",
    142  1.10  christos 	      (int) state->termios.c_iflag,
    143  1.10  christos 	      (int) state->termios.c_oflag);
    144  1.10  christos   gdb_printf (stream, "c_cflag = 0x%x, c_lflag = 0x%x\n",
    145  1.10  christos 	      (int) state->termios.c_cflag,
    146  1.10  christos 	      (int) state->termios.c_lflag);
    147   1.1  christos #if 0
    148   1.1  christos   /* This not in POSIX, and is not really documented by those systems
    149   1.1  christos      which have it (at least not Sun).  */
    150  1.10  christos   gdb_printf (stream, "c_line = 0x%x.\n", state->termios.c_line);
    151   1.1  christos #endif
    152  1.10  christos   gdb_printf (stream, "c_cc: ");
    153   1.1  christos   for (i = 0; i < NCCS; i += 1)
    154  1.10  christos     gdb_printf (stream, "0x%x ", state->termios.c_cc[i]);
    155  1.10  christos   gdb_printf (stream, "\n");
    156   1.1  christos }
    157   1.1  christos 
    158   1.1  christos /* Wait for the output to drain away, as opposed to flushing
    159   1.1  christos    (discarding) it.  */
    160   1.1  christos 
    161   1.1  christos static int
    162   1.1  christos hardwire_drain_output (struct serial *scb)
    163   1.1  christos {
    164   1.8  christos   /* Ignore SIGTTOU which may occur during the drain.  */
    165   1.8  christos   scoped_ignore_sigttou ignore_sigttou;
    166   1.8  christos 
    167   1.1  christos   return tcdrain (scb->fd);
    168   1.1  christos }
    169   1.1  christos 
    170   1.1  christos static int
    171   1.1  christos hardwire_flush_output (struct serial *scb)
    172   1.1  christos {
    173   1.1  christos   return tcflush (scb->fd, TCOFLUSH);
    174   1.1  christos }
    175   1.1  christos 
    176   1.1  christos static int
    177   1.1  christos hardwire_flush_input (struct serial *scb)
    178   1.1  christos {
    179   1.1  christos   ser_base_flush_input (scb);
    180   1.1  christos 
    181   1.1  christos   return tcflush (scb->fd, TCIFLUSH);
    182   1.1  christos }
    183   1.1  christos 
    184  1.11  christos static void
    185   1.1  christos hardwire_send_break (struct serial *scb)
    186   1.1  christos {
    187  1.11  christos   if (tcsendbreak (scb->fd, 0) == -1)
    188  1.11  christos     perror_with_name ("sending break");
    189   1.1  christos }
    190   1.1  christos 
    191   1.1  christos static void
    192   1.1  christos hardwire_raw (struct serial *scb)
    193   1.1  christos {
    194   1.1  christos   struct hardwire_ttystate state;
    195   1.1  christos 
    196   1.1  christos   if (get_tty_state (scb, &state))
    197  1.10  christos     gdb_printf (gdb_stderr, "get_tty_state failed: %s\n",
    198  1.10  christos 		safe_strerror (errno));
    199   1.1  christos 
    200   1.1  christos   state.termios.c_iflag = 0;
    201   1.1  christos   state.termios.c_oflag = 0;
    202   1.1  christos   state.termios.c_lflag = 0;
    203   1.5  christos   state.termios.c_cflag &= ~CSIZE;
    204   1.1  christos   state.termios.c_cflag |= CLOCAL | CS8;
    205   1.1  christos #ifdef CRTSCTS
    206   1.1  christos   /* h/w flow control.  */
    207   1.1  christos   if (serial_hwflow)
    208   1.1  christos     state.termios.c_cflag |= CRTSCTS;
    209   1.1  christos   else
    210   1.1  christos     state.termios.c_cflag &= ~CRTSCTS;
    211   1.1  christos #ifdef CRTS_IFLOW
    212   1.1  christos   if (serial_hwflow)
    213   1.1  christos     state.termios.c_cflag |= CRTS_IFLOW;
    214   1.1  christos   else
    215   1.1  christos     state.termios.c_cflag &= ~CRTS_IFLOW;
    216   1.1  christos #endif
    217   1.1  christos #endif
    218   1.1  christos   state.termios.c_cc[VMIN] = 0;
    219   1.1  christos   state.termios.c_cc[VTIME] = 0;
    220   1.1  christos 
    221   1.1  christos   if (set_tty_state (scb, &state))
    222  1.10  christos     gdb_printf (gdb_stderr, "set_tty_state failed: %s\n",
    223  1.10  christos 		safe_strerror (errno));
    224   1.1  christos }
    225   1.1  christos 
    226   1.1  christos #ifndef B19200
    227   1.1  christos #define B19200 EXTA
    228   1.1  christos #endif
    229   1.1  christos 
    230   1.1  christos #ifndef B38400
    231   1.1  christos #define B38400 EXTB
    232   1.1  christos #endif
    233   1.1  christos 
    234   1.1  christos /* Translate baud rates from integers to damn B_codes.  Unix should
    235   1.1  christos    have outgrown this crap years ago, but even POSIX wouldn't buck it.  */
    236   1.1  christos 
    237   1.1  christos static struct
    238   1.1  christos {
    239   1.1  christos   int rate;
    240   1.1  christos   int code;
    241   1.1  christos }
    242   1.1  christos baudtab[] =
    243   1.1  christos {
    244   1.1  christos   {
    245   1.1  christos     50, B50
    246   1.1  christos   }
    247   1.1  christos   ,
    248   1.1  christos   {
    249   1.1  christos     75, B75
    250   1.1  christos   }
    251   1.1  christos   ,
    252   1.1  christos   {
    253   1.1  christos     110, B110
    254   1.1  christos   }
    255   1.1  christos   ,
    256   1.1  christos   {
    257   1.1  christos     134, B134
    258   1.1  christos   }
    259   1.1  christos   ,
    260   1.1  christos   {
    261   1.1  christos     150, B150
    262   1.1  christos   }
    263   1.1  christos   ,
    264   1.1  christos   {
    265   1.1  christos     200, B200
    266   1.1  christos   }
    267   1.1  christos   ,
    268   1.1  christos   {
    269   1.1  christos     300, B300
    270   1.1  christos   }
    271   1.1  christos   ,
    272   1.1  christos   {
    273   1.1  christos     600, B600
    274   1.1  christos   }
    275   1.1  christos   ,
    276   1.1  christos   {
    277   1.1  christos     1200, B1200
    278   1.1  christos   }
    279   1.1  christos   ,
    280   1.1  christos   {
    281   1.1  christos     1800, B1800
    282   1.1  christos   }
    283   1.1  christos   ,
    284   1.1  christos   {
    285   1.1  christos     2400, B2400
    286   1.1  christos   }
    287   1.1  christos   ,
    288   1.1  christos   {
    289   1.1  christos     4800, B4800
    290   1.1  christos   }
    291   1.1  christos   ,
    292   1.1  christos   {
    293   1.1  christos     9600, B9600
    294   1.1  christos   }
    295   1.1  christos   ,
    296   1.1  christos   {
    297   1.1  christos     19200, B19200
    298   1.1  christos   }
    299   1.1  christos   ,
    300   1.1  christos   {
    301   1.1  christos     38400, B38400
    302   1.1  christos   }
    303   1.1  christos   ,
    304   1.1  christos #ifdef B57600
    305   1.1  christos   {
    306   1.1  christos     57600, B57600
    307   1.1  christos   }
    308   1.1  christos   ,
    309   1.1  christos #endif
    310   1.1  christos #ifdef B115200
    311   1.1  christos   {
    312   1.1  christos     115200, B115200
    313   1.1  christos   }
    314   1.1  christos   ,
    315   1.1  christos #endif
    316   1.1  christos #ifdef B230400
    317   1.1  christos   {
    318   1.1  christos     230400, B230400
    319   1.1  christos   }
    320   1.1  christos   ,
    321   1.1  christos #endif
    322   1.1  christos #ifdef B460800
    323   1.1  christos   {
    324   1.1  christos     460800, B460800
    325   1.1  christos   }
    326   1.1  christos   ,
    327   1.1  christos #endif
    328  1.11  christos #ifdef B500000
    329  1.11  christos   {
    330  1.11  christos     500000, B500000
    331  1.11  christos   }
    332  1.11  christos   ,
    333  1.11  christos #endif
    334  1.11  christos #ifdef B576000
    335  1.11  christos   {
    336  1.11  christos     576000, B576000
    337  1.11  christos   }
    338  1.11  christos   ,
    339  1.11  christos #endif
    340  1.11  christos #ifdef B921600
    341  1.11  christos   {
    342  1.11  christos     921600, B921600
    343  1.11  christos   }
    344  1.11  christos   ,
    345  1.11  christos #endif
    346  1.11  christos #ifdef B1000000
    347  1.11  christos   {
    348  1.11  christos     1000000, B1000000
    349  1.11  christos   }
    350  1.11  christos   ,
    351  1.11  christos #endif
    352  1.11  christos #ifdef B1152000
    353  1.11  christos   {
    354  1.11  christos     1152000, B1152000
    355  1.11  christos   }
    356  1.11  christos   ,
    357  1.11  christos #endif
    358  1.11  christos #ifdef B1500000
    359  1.11  christos   {
    360  1.11  christos     1500000, B1500000
    361  1.11  christos   }
    362  1.11  christos   ,
    363  1.11  christos #endif
    364  1.11  christos #ifdef B2000000
    365  1.11  christos   {
    366  1.11  christos     2000000, B2000000
    367  1.11  christos   }
    368  1.11  christos   ,
    369  1.11  christos #endif
    370  1.11  christos #ifdef B2500000
    371  1.11  christos   {
    372  1.11  christos     2500000, B2500000
    373  1.11  christos   }
    374  1.11  christos   ,
    375  1.11  christos #endif
    376  1.11  christos #ifdef B3000000
    377  1.11  christos   {
    378  1.11  christos     3000000, B3000000
    379  1.11  christos   }
    380  1.11  christos   ,
    381  1.11  christos #endif
    382  1.11  christos #ifdef B3500000
    383  1.11  christos   {
    384  1.11  christos     3500000, B3500000
    385  1.11  christos   }
    386  1.11  christos   ,
    387  1.11  christos #endif
    388  1.11  christos #ifdef B4000000
    389  1.11  christos   {
    390  1.11  christos     4000000, B4000000
    391  1.11  christos   }
    392  1.11  christos   ,
    393  1.11  christos #endif
    394   1.1  christos   {
    395   1.1  christos     -1, -1
    396   1.1  christos   }
    397   1.1  christos   ,
    398   1.1  christos };
    399   1.1  christos 
    400   1.1  christos static int
    401   1.1  christos rate_to_code (int rate)
    402   1.1  christos {
    403   1.1  christos   int i;
    404   1.1  christos 
    405   1.1  christos   for (i = 0; baudtab[i].rate != -1; i++)
    406   1.1  christos     {
    407   1.1  christos       /* test for perfect macth.  */
    408   1.1  christos       if (rate == baudtab[i].rate)
    409  1.10  christos 	return baudtab[i].code;
    410   1.1  christos       else
    411  1.10  christos 	{
    412   1.1  christos 	  /* check if it is in between valid values.  */
    413  1.10  christos 	  if (rate < baudtab[i].rate)
    414   1.1  christos 	    {
    415   1.1  christos 	      if (i)
    416  1.10  christos 		{
    417  1.11  christos 		  error (_("Invalid baud rate %d.  "
    418  1.11  christos 			   "Closest values are %d and %d."),
    419  1.11  christos 			 rate, baudtab[i - 1].rate, baudtab[i].rate);
    420   1.1  christos 		}
    421   1.1  christos 	      else
    422  1.10  christos 		{
    423  1.11  christos 		  error (_("Invalid baud rate %d.  Minimum value is %d."),
    424  1.11  christos 			 rate, baudtab[0].rate);
    425   1.1  christos 		}
    426   1.1  christos 	    }
    427  1.10  christos 	}
    428   1.1  christos     }
    429   1.1  christos 
    430   1.1  christos   /* The requested speed was too large.  */
    431  1.11  christos   error (_("Invalid baud rate %d.  Maximum value is %d."),
    432  1.11  christos 	 rate, baudtab[i - 1].rate);
    433   1.1  christos }
    434   1.1  christos 
    435  1.11  christos static void
    436   1.1  christos hardwire_setbaudrate (struct serial *scb, int rate)
    437   1.1  christos {
    438   1.1  christos   struct hardwire_ttystate state;
    439   1.1  christos   int baud_code = rate_to_code (rate);
    440   1.1  christos 
    441   1.1  christos   if (get_tty_state (scb, &state))
    442  1.11  christos     perror_with_name ("could not get tty state");
    443   1.1  christos 
    444   1.1  christos   cfsetospeed (&state.termios, baud_code);
    445   1.1  christos   cfsetispeed (&state.termios, baud_code);
    446   1.1  christos 
    447  1.11  christos   if (set_tty_state (scb, &state))
    448  1.11  christos     perror_with_name ("could not set tty state");
    449   1.1  christos }
    450   1.1  christos 
    451   1.1  christos static int
    452   1.1  christos hardwire_setstopbits (struct serial *scb, int num)
    453   1.1  christos {
    454   1.1  christos   struct hardwire_ttystate state;
    455   1.1  christos   int newbit;
    456   1.1  christos 
    457   1.1  christos   if (get_tty_state (scb, &state))
    458   1.1  christos     return -1;
    459   1.1  christos 
    460   1.1  christos   switch (num)
    461   1.1  christos     {
    462   1.1  christos     case SERIAL_1_STOPBITS:
    463   1.1  christos       newbit = 0;
    464   1.1  christos       break;
    465   1.1  christos     case SERIAL_1_AND_A_HALF_STOPBITS:
    466   1.1  christos     case SERIAL_2_STOPBITS:
    467   1.1  christos       newbit = 1;
    468   1.1  christos       break;
    469   1.1  christos     default:
    470   1.1  christos       return 1;
    471   1.1  christos     }
    472   1.1  christos 
    473   1.1  christos   if (!newbit)
    474   1.1  christos     state.termios.c_cflag &= ~CSTOPB;
    475   1.1  christos   else
    476   1.1  christos     state.termios.c_cflag |= CSTOPB;	/* two bits */
    477   1.1  christos 
    478   1.1  christos   return set_tty_state (scb, &state);
    479   1.1  christos }
    480   1.1  christos 
    481   1.5  christos /* Implement the "setparity" serial_ops callback.  */
    482   1.5  christos 
    483   1.5  christos static int
    484   1.5  christos hardwire_setparity (struct serial *scb, int parity)
    485   1.5  christos {
    486   1.5  christos   struct hardwire_ttystate state;
    487   1.5  christos   int newparity = 0;
    488   1.5  christos 
    489   1.5  christos   if (get_tty_state (scb, &state))
    490   1.5  christos     return -1;
    491   1.5  christos 
    492   1.5  christos   switch (parity)
    493   1.5  christos     {
    494   1.5  christos     case GDBPARITY_NONE:
    495   1.5  christos       newparity = 0;
    496   1.5  christos       break;
    497   1.5  christos     case GDBPARITY_ODD:
    498   1.5  christos       newparity = PARENB | PARODD;
    499   1.5  christos       break;
    500   1.5  christos     case GDBPARITY_EVEN:
    501   1.5  christos       newparity = PARENB;
    502   1.5  christos       break;
    503   1.5  christos     default:
    504  1.10  christos       internal_warning ("Incorrect parity value: %d", parity);
    505   1.5  christos       return -1;
    506   1.5  christos     }
    507   1.5  christos 
    508   1.5  christos   state.termios.c_cflag &= ~(PARENB | PARODD);
    509   1.5  christos   state.termios.c_cflag |= newparity;
    510   1.5  christos 
    511   1.5  christos   return set_tty_state (scb, &state);
    512   1.5  christos }
    513   1.5  christos 
    514   1.5  christos 
    515   1.1  christos static void
    516   1.1  christos hardwire_close (struct serial *scb)
    517   1.1  christos {
    518   1.1  christos   if (scb->fd < 0)
    519   1.1  christos     return;
    520   1.1  christos 
    521   1.1  christos   close (scb->fd);
    522   1.1  christos   scb->fd = -1;
    523   1.1  christos }
    524   1.1  christos 
    525   1.1  christos 
    527   1.1  christos 
    529   1.1  christos /* The hardwire ops.  */
    530   1.1  christos 
    531   1.1  christos static const struct serial_ops hardwire_ops =
    532   1.1  christos {
    533   1.1  christos   "hardwire",
    534   1.1  christos   hardwire_open,
    535   1.7  christos   hardwire_close,
    536   1.1  christos   NULL,
    537   1.1  christos   ser_base_readchar,
    538   1.1  christos   ser_base_write,
    539   1.1  christos   hardwire_flush_output,
    540   1.1  christos   hardwire_flush_input,
    541   1.1  christos   hardwire_send_break,
    542   1.1  christos   hardwire_raw,
    543   1.1  christos   hardwire_get_tty_state,
    544   1.1  christos   hardwire_copy_tty_state,
    545   1.1  christos   hardwire_set_tty_state,
    546   1.1  christos   hardwire_print_tty_state,
    547   1.5  christos   hardwire_setbaudrate,
    548   1.1  christos   hardwire_setstopbits,
    549   1.1  christos   hardwire_setparity,
    550   1.1  christos   hardwire_drain_output,
    551   1.1  christos   ser_base_async,
    552   1.1  christos   ser_unix_read_prim,
    553   1.1  christos   ser_unix_write_prim
    554   1.9  christos };
    555   1.1  christos 
    556   1.9  christos void _initialize_ser_hardwire ();
    557   1.1  christos void
    558   1.1  christos _initialize_ser_hardwire ()
    559   1.1  christos {
    560   1.1  christos   serial_add_interface (&hardwire_ops);
    561   1.1  christos 
    562   1.1  christos #ifdef CRTSCTS
    563   1.1  christos   add_setshow_boolean_cmd ("remoteflow", no_class,
    564   1.1  christos 			   &serial_hwflow, _("\
    565   1.1  christos Set use of hardware flow control for remote serial I/O."), _("\
    566   1.1  christos Show use of hardware flow control for remote serial I/O."), _("\
    567   1.1  christos Enable or disable hardware flow control (RTS/CTS) on the serial port\n\
    568   1.1  christos when debugging using remote targets."),
    569   1.1  christos 			   NULL,
    570   1.1  christos 			   show_serial_hwflow,
    571   1.1  christos 			   &setlist, &showlist);
    572   1.1  christos #endif
    573   1.1  christos }
    574   1.1  christos 
    575   1.1  christos int
    576  1.11  christos ser_unix_read_prim (struct serial *scb, size_t count)
    577  1.11  christos {
    578  1.11  christos   int result = read (scb->fd, scb->buf, count);
    579  1.11  christos   if (result == -1 && errno != EINTR)
    580   1.1  christos     perror_with_name ("error while reading");
    581   1.1  christos   return result;
    582   1.1  christos }
    583   1.1  christos 
    584   1.1  christos int
    585  1.11  christos ser_unix_write_prim (struct serial *scb, const void *buf, size_t len)
    586  1.11  christos {
    587  1.11  christos   int result = write (scb->fd, buf, len);
    588  1.11  christos   if (result == -1 && errno != EINTR)
    589   1.1  christos     perror_with_name ("error while writing");
    590                   return result;
    591                 }
    592