[05/19] libctf: error handling

Message ID 20190430225706.159422-6-nick.alcock@oracle.com
State Superseded
Headers show
Series
  • libctf, and CTF support for objdump and readelf
Related show

Commit Message

Nick Alcock April 30, 2019, 10:56 p.m.
CTF functions return zero on success or an extended errno value which
can be translated into a string via the functions in this commit.

The errno numbers start at -CTF_BASE.

libctf/
	* ctf-error.c: New file.

include/
	* ctf-api.h (ctf_errno): New declaration.
	(ctf_errmsg): Likewise.
---
 include/ctf-api.h  |  2 +
 libctf/ctf-error.c | 93 ++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 95 insertions(+)
 create mode 100644 libctf/ctf-error.c

-- 
2.21.0.237.gd0cfaa883d

Comments

Nick Clifton May 2, 2019, 4:10 p.m. | #1
Hi Nick,

> +static const char *const _ctf_errlist[] = {

> +  "File is not in CTF or ELF format",		     /* ECTF_FMT */


Have you considered allowing these strings to be translated ?

Cheers
  Nick
Nick Alcock May 3, 2019, 7:31 p.m. | #2
On 2 May 2019, Nick Clifton uttered the following:

> Hi Nick,

>

>> +static const char *const _ctf_errlist[] = {

>> +  "File is not in CTF or ELF format",		     /* ECTF_FMT */

>

> Have you considered allowing these strings to be translated ?


Sure! But gettextization is a bigger job I haven't even looked at yet.
(e.g. do we need to gettextize all the debugging strings, too?)

I suppose we'd translate the error messages in particular via explicit
gettext() calls in ctf_errmsg()? (Of course, ctf_errmsg() can also
return a strerror() value, but I suppose libc will take care of
translating that for us.)

(But if you call gettext() explicitly, presumably you have to mark the
translatable strings in the array with something too, or they won't land
in the po files? I have no idea, and haven't read the gettext manual in
far too many years... I'd have to do some research first.)

Patch

diff --git a/include/ctf-api.h b/include/ctf-api.h
index e2f5dc7571..646e848c84 100644
--- a/include/ctf-api.h
+++ b/include/ctf-api.h
@@ -122,6 +122,8 @@  enum
 #define	CTF_ADD_NONROOT	0	/* Type only visible in nested scope.  */
 #define	CTF_ADD_ROOT	1	/* Type visible at top-level scope.  */
 
+extern int ctf_errno (ctf_file_t *);
+extern const char *ctf_errmsg (int);
 
 #ifdef	__cplusplus
 }
diff --git a/libctf/ctf-error.c b/libctf/ctf-error.c
new file mode 100644
index 0000000000..ea3e113145
--- /dev/null
+++ b/libctf/ctf-error.c
@@ -0,0 +1,93 @@ 
+/* Error table.
+   Copyright (C) 2003-2019 Free Software Foundation, Inc.
+
+   This file is part of libctf.
+
+   libctf 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, 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; see the file COPYING.  If not see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <ctf-impl.h>
+
+static const char *const _ctf_errlist[] = {
+  "File is not in CTF or ELF format",		     /* ECTF_FMT */
+  "File uses more recent ELF version than libctf",   /* ECTF_ELFVERS */
+  "File uses more recent CTF version than libctf",   /* ECTF_CTFVERS */
+  "File is a different endian-ness than libctf",     /* ECTF_ENDIAN */
+  "Symbol table uses invalid entry size",	     /* ECTF_SYMTAB */
+  "Symbol table data buffer is not valid",	     /* ECTF_SYMBAD */
+  "String table data buffer is not valid",	     /* ECTF_STRBAD */
+  "File data structure corruption detected",	     /* ECTF_CORRUPT */
+  "File does not contain CTF data",		     /* ECTF_NOCTFDATA */
+  "Buffer does not contain CTF data",		     /* ECTF_NOCTFBUF */
+  "Symbol table information is not available",	     /* ECTF_NOSYMTAB */
+  "Type information is in parent and unavailable",   /* ECTF_NOPARENT */
+  "Cannot import types with different data model",   /* ECTF_DMODEL */
+  "Failed to mmap a needed data section",	     /* ECTF_MMAP */
+  "Failed to allocate (de)compression buffer",	     /* ECTF_ZALLOC */
+  "Failed to decompress CTF data",		     /* ECTF_DECOMPRESS */
+  "External string table is not available",	     /* ECTF_STRTAB */
+  "String name offset is corrupt",		     /* ECTF_BADNAME */
+  "Invalid type identifier",			     /* ECTF_BADID */
+  "Type is not a struct or union",		     /* ECTF_NOTSOU */
+  "Type is not an enum",			     /* ECTF_NOTENUM */
+  "Type is not a struct, union, or enum",	     /* ECTF_NOTSUE */
+  "Type is not an integer, float, or enum",	     /* ECTF_NOTINTFP */
+  "Type is not an array",			     /* ECTF_NOTARRAY */
+  "Type does not reference another type",	     /* ECTF_NOTREF */
+  "Input buffer is too small for type name",	     /* ECTF_NAMELEN */
+  "No type information available for that name",     /* ECTF_NOTYPE */
+  "Syntax error in type name",			     /* ECTF_SYNTAX */
+  "Symbol table entry is not a function",	     /* ECTF_NOTFUNC */
+  "No function information available for symbol",    /* ECTF_NOFUNCDAT */
+  "Symbol table entry is not a data object",	     /* ECTF_NOTDATA */
+  "No type information available for symbol",	     /* ECTF_NOTYPEDAT */
+  "No label information available for that name",    /* ECTF_NOLABEL */
+  "File does not contain any labels",		     /* ECTF_NOLABELDATA */
+  "Feature not supported",			     /* ECTF_NOTSUP */
+  "Invalid enum element name",			     /* ECTF_NOENUMNAM */
+  "Invalid member name",			     /* ECTF_NOMEMBNAM */
+  "CTF container is read-only",			     /* ECTF_RDONLY */
+  "Limit on number of dynamic type members reached", /* ECTF_DTFULL */
+  "Limit on number of dynamic types reached",	     /* ECTF_FULL */
+  "Duplicate member or variable name",		     /* ECTF_DUPLICATE */
+  "Conflicting type is already defined",	     /* ECTF_CONFLICT */
+  "Attempt to roll back past a ctf_update",	     /* ECTF_OVERROLLBACK */
+  "Failed to compress CTF data",		     /* ECTF_COMPRESS */
+  "Failed to create CTF archive",		     /* ECTF_ARCREATE */
+  "Name not found in CTF archive",		     /* ECTF_ARNNAME */
+  "Overflow of type bitness or offset in slice",     /* ECTF_SLICEOVERFLOW */
+  "Unknown section number in dump",		     /* ECTF_DUMPSECTUNKNOWN */
+  "Section changed in middle of dump"		     /* ECTF_DUMPSECTCHANGED */
+};
+
+static const int _ctf_nerr = sizeof (_ctf_errlist) / sizeof (_ctf_errlist[0]);
+
+const char *
+ctf_errmsg (int error)
+{
+  const char *str;
+
+  if (error >= ECTF_BASE && (error - ECTF_BASE) < _ctf_nerr)
+    str = _ctf_errlist[error - ECTF_BASE];
+  else
+    str = ctf_strerror (error);
+
+  return (str ? str : "Unknown error");
+}
+
+int
+ctf_errno (ctf_file_t * fp)
+{
+  return fp->ctf_errno;
+}