X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fgdbserver%2Fgdbreplay.c;h=167291f0e5794427a1ef4f7fa9719b301ebf06b4;hb=8424cc978c8c76aca7945d50408762de65646095;hp=a4934651d5ce4d19046690b122dcd6fa6ef82611;hpb=6e7ffa3987298345340b374db2b1d3ceb96005ef;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/gdbserver/gdbreplay.c b/gdb/gdbserver/gdbreplay.c index a4934651d5..167291f0e5 100644 --- a/gdb/gdbserver/gdbreplay.c +++ b/gdb/gdbserver/gdbreplay.c @@ -1,6 +1,5 @@ /* Replay a remote debug session logfile for GDB. - Copyright (C) 1996, 1998, 1999, 2000, 2002, 2003, 2005, 2006, 2007, 2008, - 2009 Free Software Foundation, Inc. + Copyright (C) 1996-2016 Free Software Foundation, Inc. Written by Fred Fish (fnf@cygnus.com) from pieces of gdbserver. This file is part of GDB. @@ -19,6 +18,9 @@ along with this program. If not, see . */ #include "config.h" +#include "build-gnulib-gdbserver/config.h" +#include "version.h" + #include #if HAVE_SYS_FILE_H #include @@ -30,18 +32,10 @@ #if HAVE_FCNTL_H #include #endif -#if HAVE_ERRNO_H #include -#endif -#ifdef HAVE_STDLIB_H #include -#endif -#ifdef HAVE_STRING_H #include -#endif -#ifdef HAVE_UNISTD_H #include -#endif #ifdef HAVE_NETINET_IN_H #include #endif @@ -54,12 +48,11 @@ #if HAVE_NETINET_TCP_H #include #endif -#if HAVE_MALLOC_H -#include -#endif + +#include #if USE_WIN32API -#include +#include #endif #ifndef HAVE_SOCKLEN_T @@ -69,10 +62,6 @@ typedef int socklen_t; /* Sort of a hack... */ #define EOL (EOF - 1) -/* Version information, from version.c. */ -extern const char version[]; -extern const char host_name[]; - static int remote_desc; #ifdef __MINGW32CE__ @@ -162,6 +151,14 @@ sync_error (FILE *fp, char *desc, int expect, int got) exit (1); } +static void +remote_error (const char *desc) +{ + fprintf (stderr, "\n%s\n", desc); + fflush (stderr); + exit (1); +} + static void remote_close (void) { @@ -210,7 +207,7 @@ remote_open (char *name) #endif tmp_desc = socket (PF_INET, SOCK_STREAM, 0); - if (tmp_desc < 0) + if (tmp_desc == -1) perror_with_name ("Can't open socket"); /* Allow rapid reuse of this port. */ @@ -233,7 +230,8 @@ remote_open (char *name) /* Enable TCP keep alive process. */ tmp = 1; - setsockopt (tmp_desc, SOL_SOCKET, SO_KEEPALIVE, (char *) &tmp, sizeof (tmp)); + setsockopt (tmp_desc, SOL_SOCKET, SO_KEEPALIVE, + (char *) &tmp, sizeof (tmp)); /* Tell TCP not to delay small packets. This greatly speeds up interactive response. */ @@ -244,8 +242,9 @@ remote_open (char *name) #ifndef USE_WIN32API close (tmp_desc); /* No longer need this */ - signal (SIGPIPE, SIG_IGN); /* If we don't do this, then gdbreplay simply - exits when the remote side dies. */ + signal (SIGPIPE, SIG_IGN); /* If we don't do this, then + gdbreplay simply exits when + the remote side dies. */ #else closesocket (tmp_desc); /* No longer need this */ #endif @@ -260,7 +259,7 @@ remote_open (char *name) } static int -tohex (int ch) +fromhex (int ch) { if (ch >= '0' && ch <= '9') { @@ -323,11 +322,11 @@ logchar (FILE *fp) ch2 = fgetc (fp); fputc (ch2, stdout); fflush (stdout); - ch = tohex (ch2) << 4; + ch = fromhex (ch2) << 4; ch2 = fgetc (fp); fputc (ch2, stdout); fflush (stdout); - ch |= tohex (ch2); + ch |= fromhex (ch2); break; default: /* Treat any other char as just itself */ @@ -339,6 +338,17 @@ logchar (FILE *fp) return (ch); } +static int +gdbchar (int desc) +{ + unsigned char fromgdb; + + if (read (desc, &fromgdb, 1) != 1) + return -1; + else + return fromgdb; +} + /* Accept input from gdb and match with chars from fp (after skipping one blank) up until a \n is read from fp (which is not matched) */ @@ -346,7 +356,7 @@ static void expect (FILE *fp) { int fromlog; - unsigned char fromgdb; + int fromgdb; if ((fromlog = logchar (fp)) != ' ') { @@ -357,15 +367,16 @@ expect (FILE *fp) { fromlog = logchar (fp); if (fromlog == EOL) - { - break; - } - read (remote_desc, &fromgdb, 1); + break; + fromgdb = gdbchar (remote_desc); + if (fromgdb < 0) + remote_error ("Error during read from gdb"); } while (fromlog == fromgdb); + if (fromlog != EOL) { - sync_error (fp, "Sync error during read of gdb packet", fromlog, + sync_error (fp, "Sync error during read of gdb packet from log", fromlog, fromgdb); } } @@ -387,7 +398,8 @@ play (FILE *fp) while ((fromlog = logchar (fp)) != EOL) { ch = fromlog; - write (remote_desc, &ch, 1); + if (write (remote_desc, &ch, 1) != 1) + remote_error ("Error during write to gdb"); } } @@ -395,8 +407,9 @@ static void gdbreplay_version (void) { printf ("GNU gdbreplay %s%s\n" - "Copyright (C) 2010 Free Software Foundation, Inc.\n" - "gdbreplay is free software, covered by the GNU General Public License.\n" + "Copyright (C) 2016 Free Software Foundation, Inc.\n" + "gdbreplay is free software, covered by " + "the GNU General Public License.\n" "This gdbreplay was configured as \"%s\"\n", PKGVERSION, version, host_name); }