/*! \file backtrace.c
 *  Routines related to generating call back traces. */
/*
 * (C) 2009 by Holger Hans Peter Freyther <zecke@selfish.org>
 * (C) 2012 by Harald Welte <laforge@gnumonks.org>
 *
 * All Rights Reserved
 *
 * SPDX-License-Identifier: GPL-2.0+
 *
 * 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.
 *
 */

#include <stdio.h>
#include <stdlib.h>
#include <osmocom/core/utils.h>
#include <osmocom/core/logging.h>
#include "config.h"

#ifdef HAVE_EXECINFO_H
#include <execinfo.h>

static void _osmo_backtrace(int use_printf, int subsys, int level)
{
	int i, nptrs;
	void *buffer[100];
	char **strings;

	nptrs = backtrace(buffer, ARRAY_SIZE(buffer));
	if (use_printf)
		printf("backtrace() returned %d addresses\n", nptrs);
	else
		LOGP(subsys, level, "backtrace() returned %d addresses\n",
		     nptrs);

	strings = backtrace_symbols(buffer, nptrs);
	if (!strings)
		return;

	for (i = 1; i < nptrs; i++) {
		if (use_printf)
			printf("%s\n", strings[i]);
		else
			LOGP(subsys, level, "\t%s\n", strings[i]);
	}

	free(strings);
}

/*! Generate and print a call back-trace
 *
 * This function will generate a function call back-trace of the
 * current process and print it to stdout. */
void osmo_generate_backtrace(void)
{
	_osmo_backtrace(1, 0, 0);
}

/*! Generate and log a call back-trace
 *  \param[in] subsys Logging sub-system
 *  \param[in] level Logging level
 *
 * This function will generate a function call back-trace of the
 * current process and log it to the specified subsystem and
 * level using the libosmocore logging subsystem */
void osmo_log_backtrace(int subsys, int level)
{
	_osmo_backtrace(0, subsys, level);
}
#else
void osmo_generate_backtrace(void)
{
	printf("This platform has no backtrace function\n");
}
void osmo_log_backtrace(int subsys, int level)
{
	LOGP(subsys, level, "This platform has no backtrace function\n");
}
#endif
