/* Core file generic interface routines for BFD.
   Copyright 1990, 1991, 1992, 1993, 1994, 2000
   Free Software Foundation, Inc.
   Written by Cygnus Support.

This file is part of BFD, the Binary File Descriptor library.

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
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */

/*
SECTION
	Core files

DESCRIPTION
	These are functions pertaining to core files.
*/

#include "bfd.h"
#include "sysdep.h"
#include "libbfd.h"

/*
FUNCTION
	bfd_core_file_failing_command

SYNOPSIS
	CONST char *bfd_core_file_failing_command(bfd *abfd);

DESCRIPTION
	Return a read-only string explaining which program was running
	when it failed and produced the core file @var{abfd}.

*/

CONST char *
bfd_core_file_failing_command (abfd)
     bfd *abfd;
{
  if (abfd->format != bfd_core) {
    bfd_set_error (bfd_error_invalid_operation);
    return NULL;
  }
  return BFD_SEND (abfd, _core_file_failing_command, (abfd));
}

/*
FUNCTION
	bfd_core_file_failing_signal

SYNOPSIS
	int bfd_core_file_failing_signal(bfd *abfd);

DESCRIPTION
	Returns the signal number which caused the core dump which
	generated the file the BFD @var{abfd} is attached to.
*/

int
bfd_core_file_failing_signal (abfd)
     bfd *abfd;
{
  if (abfd->format != bfd_core) {
    bfd_set_error (bfd_error_invalid_operation);
    return 0;
  }
  return BFD_SEND (abfd, _core_file_failing_signal, (abfd));
}

/*
FUNCTION
	core_file_matches_executable_p

SYNOPSIS
	boolean core_file_matches_executable_p
		(bfd *core_bfd, bfd *exec_bfd);

DESCRIPTION
	Return <<true>> if the core file attached to @var{core_bfd}
	was generated by a run of the executable file attached to
	@var{exec_bfd}, <<false>> otherwise.
*/
boolean
core_file_matches_executable_p (core_bfd, exec_bfd)
     bfd *core_bfd, *exec_bfd;
{
    if ((core_bfd->format != bfd_core) || (exec_bfd->format != bfd_object)) {
	    bfd_set_error (bfd_error_wrong_format);
	    return false;
	}

    return BFD_SEND (core_bfd, _core_file_matches_executable_p,
		     (core_bfd, exec_bfd));
}
