1/* Core file generic interface routines for BFD.
2   Copyright (C) 1990-2017 Free Software Foundation, Inc.
3   Written by Cygnus Support.
4
5   This file is part of BFD, the Binary File Descriptor library.
6
7   This program is free software; you can redistribute it and/or modify
8   it under the terms of the GNU General Public License as published by
9   the Free Software Foundation; either version 3 of the License, or
10   (at your option) any later version.
11
12   This program is distributed in the hope that it will be useful,
13   but WITHOUT ANY WARRANTY; without even the implied warranty of
14   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15   GNU General Public License for more details.
16
17   You should have received a copy of the GNU General Public License
18   along with this program; if not, write to the Free Software
19   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20   MA 02110-1301, USA.  */
21
22/*
23SECTION
24	Core files
25
26SUBSECTION
27	Core file functions
28
29DESCRIPTION
30	These are functions pertaining to core files.
31*/
32
33#include "sysdep.h"
34#include "bfd.h"
35#include "libbfd.h"
36
37/*
38FUNCTION
39	bfd_core_file_failing_command
40
41SYNOPSIS
42	const char *bfd_core_file_failing_command (bfd *abfd);
43
44DESCRIPTION
45	Return a read-only string explaining which program was running
46	when it failed and produced the core file @var{abfd}.
47
48*/
49
50const char *
51bfd_core_file_failing_command (bfd *abfd)
52{
53  if (abfd->format != bfd_core)
54    {
55      bfd_set_error (bfd_error_invalid_operation);
56      return NULL;
57    }
58  return BFD_SEND (abfd, _core_file_failing_command, (abfd));
59}
60
61/*
62FUNCTION
63	bfd_core_file_failing_signal
64
65SYNOPSIS
66	int bfd_core_file_failing_signal (bfd *abfd);
67
68DESCRIPTION
69	Returns the signal number which caused the core dump which
70	generated the file the BFD @var{abfd} is attached to.
71*/
72
73int
74bfd_core_file_failing_signal (bfd *abfd)
75{
76  if (abfd->format != bfd_core)
77    {
78      bfd_set_error (bfd_error_invalid_operation);
79      return 0;
80    }
81  return BFD_SEND (abfd, _core_file_failing_signal, (abfd));
82}
83
84/*
85FUNCTION
86	bfd_core_file_pid
87
88SYNOPSIS
89	int bfd_core_file_pid (bfd *abfd);
90
91DESCRIPTION
92
93	Returns the PID of the process the core dump the BFD
94	@var{abfd} is attached to was generated from.
95*/
96
97int
98bfd_core_file_pid (bfd *abfd)
99{
100  if (abfd->format != bfd_core)
101    {
102      bfd_set_error (bfd_error_invalid_operation);
103      return 0;
104    }
105  return BFD_SEND (abfd, _core_file_pid, (abfd));
106}
107
108
109/*
110FUNCTION
111	core_file_matches_executable_p
112
113SYNOPSIS
114	bfd_boolean core_file_matches_executable_p
115	  (bfd *core_bfd, bfd *exec_bfd);
116
117DESCRIPTION
118	Return <<TRUE>> if the core file attached to @var{core_bfd}
119	was generated by a run of the executable file attached to
120	@var{exec_bfd}, <<FALSE>> otherwise.
121*/
122
123bfd_boolean
124core_file_matches_executable_p (bfd *core_bfd, bfd *exec_bfd)
125{
126  if (core_bfd->format != bfd_core || exec_bfd->format != bfd_object)
127    {
128      bfd_set_error (bfd_error_wrong_format);
129      return FALSE;
130    }
131
132  return BFD_SEND (core_bfd, _core_file_matches_executable_p,
133		   (core_bfd, exec_bfd));
134}
135
136/*
137FUNCTION
138        generic_core_file_matches_executable_p
139
140SYNOPSIS
141        bfd_boolean generic_core_file_matches_executable_p
142          (bfd *core_bfd, bfd *exec_bfd);
143
144DESCRIPTION
145        Return TRUE if the core file attached to @var{core_bfd}
146        was generated by a run of the executable file attached
147        to @var{exec_bfd}.  The match is based on executable
148        basenames only.
149
150        Note: When not able to determine the core file failing
151        command or the executable name, we still return TRUE even
152        though we're not sure that core file and executable match.
153        This is to avoid generating a false warning in situations
154        where we really don't know whether they match or not.
155*/
156
157bfd_boolean
158generic_core_file_matches_executable_p (bfd *core_bfd, bfd *exec_bfd)
159{
160  char *exec;
161  char *core;
162  char *last_slash;
163
164  if (exec_bfd == NULL || core_bfd == NULL)
165    return TRUE;
166
167  /* The cast below is to avoid a compiler warning due to the assignment
168     of the const char * returned by bfd_core_file_failing_command to a
169     non-const char *.  In this case, the assignement does not lead to
170     breaking the const, as we're only reading the string.  */
171
172  core = (char *) bfd_core_file_failing_command (core_bfd);
173  if (core == NULL)
174    return TRUE;
175
176  exec = bfd_get_filename (exec_bfd);
177  if (exec == NULL)
178    return TRUE;
179
180  last_slash = strrchr (core, '/');
181  if (last_slash != NULL)
182    core = last_slash + 1;
183
184  last_slash = strrchr (exec, '/');
185  if (last_slash != NULL)
186    exec = last_slash + 1;
187
188  return filename_cmp (exec, core) == 0;
189}
190
191