static struct serial_ops *serial_interface_lookup PARAMS ((char *)); static void serial_logchar PARAMS ((int ch, int timeout)); static char logbase_hex[] = "hex"; static char logbase_octal[] = "octal"; static char logbase_ascii[] = "ascii"; static char *logbase_enums[] = {logbase_hex, logbase_octal, logbase_ascii, NULL}; static char *serial_logbase = logbase_ascii;    static int serial_reading = 0; static int serial_writing = 0;  void serial_log_command (cmd) const char *cmd; { if (!serial_logfp) return;  if (serial_reading || serial_writing) { fputc_unfiltered ('\n', serial_logfp); serial_reading = 0; serial_writing = 0; } fprintf_unfiltered (serial_logfp, "c %s\n", cmd);  fflush (serial_logfp); }   #define SERIAL_BREAK 1235  static void serial_logchar (ch, timeout) int ch; int timeout; { if (serial_logbase != logbase_ascii) fputc_unfiltered (' ', serial_logfp);  switch (ch) { case SERIAL_TIMEOUT: fprintf_unfiltered (serial_logfp, "<Timeout: %d seconds>", timeout); return; case SERIAL_ERROR: fprintf_unfiltered (serial_logfp, "<Error: %s>", safe_strerror (errno)); return; case SERIAL_EOF: fputs_unfiltered ("<Eof>", serial_logfp); return; case SERIAL_BREAK: fputs_unfiltered ("<Break>", serial_logfp); return; default: if (serial_logbase == logbase_hex) fprintf_unfiltered (serial_logfp, "%02x", ch & 0xff); else if (serial_logbase == logbase_octal) fprintf_unfiltered (serial_logfp, "%03o", ch & 0xff); else switch (ch) { case '\\':	fputs_unfiltered ("\\\\", serial_logfp); break; case '\b':	fputs_unfiltered ("\\b", serial_logfp); break; case '\f':	fputs_unfiltered ("\\f", serial_logfp); break; case '\n':	fputs_unfiltered ("\\n", serial_logfp); break; case '\r':	fputs_unfiltered ("\\r", serial_logfp); break; case '\t':	fputs_unfiltered ("\\t", serial_logfp); break; case '\v':	fputs_unfiltered ("\\v", serial_logfp); break; default:	fprintf_unfiltered (serial_logfp, isprint (ch) ? "%c" : "\\x%02x", ch & 0xFF); break; } } }  int serial_write (scb, str, len) serial_t scb; const char *str; int len; { int count;  if (serial_logfp != NULL) { if (serial_reading) { fputc_unfiltered ('\n', serial_logfp); serial_reading = 0; } if (!serial_writing) { fputs_unfiltered ("w ", serial_logfp); serial_writing = 1; } for (count = 0; count < len; count++) { serial_logchar (str[count] & 0xff, 0); }  fflush (serial_logfp); } return (scb -> ops -> write (scb, str, len)); }  int serial_readchar (scb, timeout) serial_t scb; int timeout; { int ch;  ch = scb -> ops -> readchar (scb, timeout); if (serial_logfp != NULL) { if (serial_writing) { fputc_unfiltered ('\n', serial_logfp); serial_writing = 0; } if (!serial_reading) { fputs_unfiltered ("r ", serial_logfp); serial_reading = 1; } serial_logchar (ch, timeout);  fflush (serial_logfp); } return (ch); }  int serial_send_break (scb) serial_t scb; { if (serial_logfp != NULL) { if (serial_reading) { fputc_unfiltered ('\n', serial_logfp); serial_reading = 0; } if (!serial_writing) { fputs_unfiltered ("w ", serial_logfp); serial_writing = 1; } serial_logchar (SERIAL_BREAK, 0);  fflush (serial_logfp); } return (scb -> ops -> send_break (scb)); }  static struct serial_ops * serial_interface_lookup (name) char *name;
serial_interface_lookup (char *name)
static struct serial_ops *serial_interface_lookup PARAMS ((char *));static void serial_logchar PARAMS ((int ch, int timeout));static char logbase_hex[] = "hex";static char logbase_octal[] = "octal";static char logbase_ascii[] = "ascii";static char *logbase_enums[] = {logbase_hex, logbase_octal, logbase_ascii, NULL};static char *serial_logbase = logbase_ascii;static int serial_reading = 0;static int serial_writing = 0;voidserial_log_command (cmd)     const char *cmd;{  if (!serial_logfp)    return;  if (serial_reading || serial_writing)    {      fputc_unfiltered ('\n', serial_logfp);      serial_reading = 0;      serial_writing = 0;    }  fprintf_unfiltered (serial_logfp, "c %s\n", cmd);  /* Make sure that the log file is as up-to-date as possible,     in case we are getting ready to dump core or something. */  fflush (serial_logfp);}/* Define bogus char to represent a BREAK.  Should be careful to choose a value   that can't be confused with a normal char, or an error code.  */#define SERIAL_BREAK 1235static voidserial_logchar (ch, timeout)     int ch;     int timeout;{  if (serial_logbase != logbase_ascii)    fputc_unfiltered (' ', serial_logfp);  switch (ch)    {    case SERIAL_TIMEOUT:      fprintf_unfiltered (serial_logfp, "<Timeout: %d seconds>", timeout);      return;    case SERIAL_ERROR:      fprintf_unfiltered (serial_logfp, "<Error: %s>", safe_strerror (errno));      return;    case SERIAL_EOF:      fputs_unfiltered ("<Eof>", serial_logfp);      return;    case SERIAL_BREAK:      fputs_unfiltered ("<Break>", serial_logfp);      return;    default:      if (serial_logbase == logbase_hex)	fprintf_unfiltered (serial_logfp, "%02x", ch & 0xff);      else if (serial_logbase == logbase_octal)	fprintf_unfiltered (serial_logfp, "%03o", ch & 0xff);      else	switch (ch)	  {	  case '\\':	fputs_unfiltered ("\\\\", serial_logfp); break;		  case '\b':	fputs_unfiltered ("\\b", serial_logfp); break;		  case '\f':	fputs_unfiltered ("\\f", serial_logfp); break;		  case '\n':	fputs_unfiltered ("\\n", serial_logfp); break;		  case '\r':	fputs_unfiltered ("\\r", serial_logfp); break;		  case '\t':	fputs_unfiltered ("\\t", serial_logfp); break;		  case '\v':	fputs_unfiltered ("\\v", serial_logfp); break;		  default:	fprintf_unfiltered (serial_logfp, isprint (ch) ? "%c" : "\\x%02x", ch & 0xFF); break;	  }	}}intserial_write (scb, str, len)     serial_t scb;     const char *str;     int len;{  int count;  if (serial_logfp != NULL)    {      if (serial_reading)	{	  fputc_unfiltered ('\n', serial_logfp);	  serial_reading = 0;	}      if (!serial_writing)	{	  fputs_unfiltered ("w ", serial_logfp);	  serial_writing = 1;	}      for (count = 0; count < len; count++)	{	  serial_logchar (str[count] & 0xff, 0);	}      /* Make sure that the log file is as up-to-date as possible,	 in case we are getting ready to dump core or something. */      fflush (serial_logfp);    }  return (scb -> ops -> write (scb, str, len));}intserial_readchar (scb, timeout)     serial_t scb;     int timeout;{  int ch;  ch = scb -> ops -> readchar (scb, timeout);  if (serial_logfp != NULL)    {      if (serial_writing)	{	  fputc_unfiltered ('\n', serial_logfp);	  serial_writing = 0;	}      if (!serial_reading)	{	  fputs_unfiltered ("r ", serial_logfp);	  serial_reading = 1;	}      serial_logchar (ch, timeout);      /* Make sure that the log file is as up-to-date as possible,	 in case we are getting ready to dump core or something. */      fflush (serial_logfp);    }  return (ch);}intserial_send_break (scb)     serial_t scb;{  if (serial_logfp != NULL)    {      if (serial_reading)	{	  fputc_unfiltered ('\n', serial_logfp);	  serial_reading = 0;	}      if (!serial_writing)	{	  fputs_unfiltered ("w ", serial_logfp);	  serial_writing = 1;	}      serial_logchar (SERIAL_BREAK, 0);      /* Make sure that the log file is as up-to-date as possible,	 in case we are getting ready to dump core or something. */      fflush (serial_logfp);    }  return (scb -> ops -> send_break (scb));}static struct serial_ops *serial_interface_lookup (name)     char *name;{  struct serial_ops *ops;  for (ops = serial_ops_list; ops; ops = ops->next)    if (strcmp (name, ops->name) == 0)      return ops;  return NULL;}