libctf: library version enforcement
authorNick Alcock <nick.alcock@oracle.com>
Wed, 24 Apr 2019 10:26:42 +0000 (11:26 +0100)
committerNick Alcock <nick.alcock@oracle.com>
Tue, 28 May 2019 16:08:29 +0000 (17:08 +0100)
This old Solaris standard allows callers to specify that they are
expecting one particular API and/or CTF file format from the library.

libctf/
* ctf-impl.h (_libctf_version): New declaration.
* ctf-subr.c (_libctf_version): Define it.
(ctf_version): New.

include/
* ctf-api.h (ctf_version): New.

include/ChangeLog
include/ctf-api.h
libctf/ChangeLog
libctf/ctf-impl.h
libctf/ctf-subr.c

index 4be07a5..56922ad 100644 (file)
@@ -1,5 +1,9 @@
 2019-05-28  Nick Alcock  <nick.alcock@oracle.com>
 
+       * ctf-api.h (ctf_version): New.
+
+2019-05-28  Nick Alcock  <nick.alcock@oracle.com>
+
        * ctf-api.h (ctf_func_info): New.
        (ctf_func_args): Likewise.
        (ctf_lookup_by_symbol): Likewise.
index 045d8af..6ab754a 100644 (file)
@@ -269,6 +269,7 @@ extern void *ctf_getspecific (ctf_file_t *);
 
 extern int ctf_errno (ctf_file_t *);
 extern const char *ctf_errmsg (int);
+extern int ctf_version (int);
 
 extern int ctf_func_info (ctf_file_t *, unsigned long, ctf_funcinfo_t *);
 extern int ctf_func_args (ctf_file_t *, unsigned long, uint32_t, ctf_id_t *);
index c0c98d2..a6eb11e 100644 (file)
@@ -1,5 +1,11 @@
 2019-05-28  Nick Alcock  <nick.alcock@oracle.com>
 
+       * ctf-impl.h (_libctf_version): New declaration.
+       * ctf-subr.c (_libctf_version): Define it.
+       (ctf_version): New.
+
+2019-05-28  Nick Alcock  <nick.alcock@oracle.com>
+
        * ctf-create.c (enumcmp): New.
        (enumadd): Likewise.
        (membcmp): Likewise.
index ff18504..363b62d 100644 (file)
@@ -375,6 +375,7 @@ extern const char *ctf_lookup_symbol_name (ctf_file_t *fp, unsigned long symidx)
 extern const char _CTF_SECTION[];      /* name of CTF ELF section */
 extern const char _CTF_NULLSTR[];      /* empty string */
 
+extern int _libctf_version;    /* library client version */
 extern int _libctf_debug;      /* debugging messages enabled */
 
 #ifdef __cplusplus
index 3103e28..09ec295 100644 (file)
@@ -27,6 +27,7 @@
 #include <unistd.h>
 
 static size_t _PAGESIZE _libctf_unused_;
+int _libctf_version = CTF_VERSION;           /* Library client version.  */
 int _libctf_debug = 0;                       /* Debugging messages enabled.  */
 
 _libctf_malloc_ void *
@@ -190,6 +191,32 @@ ctf_strerror (int err)
   return (const char *) (strerror (err));
 }
 
+/* Set the CTF library client version to the specified version.  If version is
+   zero, we just return the default library version number.  */
+int
+ctf_version (int version)
+{
+  if (version < 0)
+    {
+      errno = EINVAL;
+      return -1;
+    }
+
+  if (version > 0)
+    {
+      /*  Dynamic version switching is not presently supported. */
+      if (version != CTF_VERSION)
+       {
+         errno = ENOTSUP;
+         return -1;
+       }
+      ctf_dprintf ("ctf_version: client using version %d\n", version);
+      _libctf_version = version;
+    }
+
+  return _libctf_version;
+}
+
 void
 libctf_init_debug (void)
 {