diff options
Diffstat (limited to 'usr/src/lib/libctf/common/ctf_convert.c')
-rw-r--r-- | usr/src/lib/libctf/common/ctf_convert.c | 49 |
1 files changed, 40 insertions, 9 deletions
diff --git a/usr/src/lib/libctf/common/ctf_convert.c b/usr/src/lib/libctf/common/ctf_convert.c index dcf84e57c9..6dff7994f8 100644 --- a/usr/src/lib/libctf/common/ctf_convert.c +++ b/usr/src/lib/libctf/common/ctf_convert.c @@ -24,6 +24,7 @@ #include <libctf_impl.h> #include <assert.h> #include <gelf.h> +#include <sys/list.h> static ctf_convert_f ctf_converters[] = { ctf_dwarf_convert @@ -209,17 +210,29 @@ ctf_convert_init(int *errp) cch->cch_batchsize = CTF_CONVERT_DEFAULT_BATCHSIZE; cch->cch_warncb = NULL; cch->cch_warncb_arg = NULL; + list_create(&cch->cch_nodebug, sizeof (ctf_convert_filelist_t), + offsetof(ctf_convert_filelist_t, ccf_node)); return (cch); } +static void +ctf_convert_fini_filelist(ctf_convert_filelist_t *ccf) +{ + ctf_strfree(ccf->ccf_basename); + ctf_free(ccf, sizeof (ctf_convert_filelist_t)); +} + void ctf_convert_fini(ctf_convert_t *cch) { - if (cch->cch_label != NULL) { - size_t len = strlen(cch->cch_label) + 1; - ctf_free(cch->cch_label, len); - } + ctf_convert_filelist_t *ccf; + + ctf_strfree(cch->cch_label); + while ((ccf = list_remove_head(&cch->cch_nodebug)) != NULL) + ctf_convert_fini_filelist(ccf); + list_destroy(&cch->cch_nodebug); + ctf_free(cch, sizeof (struct ctf_convert_handle)); } @@ -262,11 +275,7 @@ ctf_convert_set_label(ctf_convert_t *cch, const char *label) if (dup == NULL) return (ENOMEM); - if (cch->cch_label != NULL) { - size_t len = strlen(cch->cch_label) + 1; - ctf_free(cch->cch_label, len); - } - + ctf_strfree(cch->cch_label); cch->cch_label = dup; return (0); } @@ -279,6 +288,28 @@ ctf_convert_set_warncb(ctf_convert_t *cch, ctf_convert_warn_f cb, void *arg) return (0); } +int +ctf_convert_add_ignore(ctf_convert_t *cch, const char *basename) +{ + ctf_convert_filelist_t *ccf; + + if (strchr(basename, '/') != NULL) + return (EINVAL); + + ccf = ctf_alloc(sizeof (ctf_convert_filelist_t)); + if (ccf == NULL) + return (ENOMEM); + + ccf->ccf_basename = ctf_strdup(basename); + if (ccf->ccf_basename == NULL) { + ctf_free(ccf, sizeof (ctf_convert_filelist_t)); + return (ENOMEM); + } + list_insert_tail(&cch->cch_nodebug, ccf); + + return (0); +} + ctf_file_t * ctf_fdconvert(ctf_convert_t *cch, int fd, int *errp, char *errbuf, size_t errlen) |