X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fgdbserver%2Fgdbreplay.c;h=1f823e0addc59eee8c621d158d189ea8ddeb9e6c;hb=a3d08894e544f6b9e65581469cbbafbe39a353fe;hp=f089b3f79f8050027fc4db10aa8c4f81fe8ab1f7;hpb=68070c10c721d67b22599511a73da6eb57bb4097;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/gdbserver/gdbreplay.c b/gdb/gdbserver/gdbreplay.c index f089b3f79f..1f823e0add 100644 --- a/gdb/gdbserver/gdbreplay.c +++ b/gdb/gdbserver/gdbreplay.c @@ -1,13 +1,12 @@ /* Replay a remote debug session logfile for GDB. - Copyright (C) 1996, 1998, 1999, 2000, 2002, 2003, 2005, 2006, 2007 - Free Software Foundation, Inc. + Copyright (C) 1996-2013 Free Software Foundation, Inc. Written by Fred Fish (fnf@cygnus.com) from pieces of gdbserver. This file is part of GDB. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or + the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, @@ -16,11 +15,12 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. */ + 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 @@ -38,12 +38,8 @@ #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 @@ -56,12 +52,14 @@ #if HAVE_NETINET_TCP_H #include #endif +#if HAVE_ALLOCA_H +#include +#endif #if HAVE_MALLOC_H #include #endif - #if USE_WIN32API -#include +#include #endif #ifndef HAVE_SOCKLEN_T @@ -129,7 +127,7 @@ strerror (DWORD error) Then return to command level. */ static void -perror_with_name (char *string) +perror_with_name (const char *string) { #ifndef STDC_HEADERS extern int errno; @@ -160,6 +158,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) { @@ -208,7 +214,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. */ @@ -231,10 +237,11 @@ 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. */ + interactive response. */ tmp = 1; setsockopt (remote_desc, IPPROTO_TCP, TCP_NODELAY, (char *) &tmp, sizeof (tmp)); @@ -242,8 +249,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 @@ -337,6 +345,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) */ @@ -344,7 +363,7 @@ static void expect (FILE *fp) { int fromlog; - unsigned char fromgdb; + int fromgdb; if ((fromlog = logchar (fp)) != ' ') { @@ -355,15 +374,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); } } @@ -385,20 +405,50 @@ 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"); } } +static void +gdbreplay_version (void) +{ + printf ("GNU gdbreplay %s%s\n" + "Copyright (C) 2013 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); +} + +static void +gdbreplay_usage (FILE *stream) +{ + fprintf (stream, "Usage:\tgdbreplay \n"); + if (REPORT_BUGS_TO[0] && stream == stdout) + fprintf (stream, "Report bugs to \"%s\".\n", REPORT_BUGS_TO); +} + int main (int argc, char *argv[]) { FILE *fp; int ch; + if (argc >= 2 && strcmp (argv[1], "--version") == 0) + { + gdbreplay_version (); + exit (0); + } + if (argc >= 2 && strcmp (argv[1], "--help") == 0) + { + gdbreplay_usage (stdout); + exit (0); + } + if (argc < 3) { - fprintf (stderr, "Usage: gdbreplay \n"); - fflush (stderr); + gdbreplay_usage (stderr); exit (1); } fp = fopen (argv[1], "r");