/* Standard argp argument parsers for tools using libdwfl.
   Copyright (C) 2005-2010, 2012, 2015 Red Hat, Inc.
   This file is part of elfutils.

   This file is free software; you can redistribute it and/or modify
   it under the terms of either

     * the GNU Lesser General Public License as published by the Free
       Software Foundation; either version 3 of the License, or (at
       your option) any later version

   or

     * 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

   or both in parallel, as here.

   elfutils 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 copies of the GNU General Public License and
   the GNU Lesser General Public License along with this program.  If
   not, see <http://www.gnu.org/licenses/>.  */

#ifdef HAVE_CONFIG_H
# include <config.h>
#endif

#include "libdwflP.h"
#include <argp.h>
#include <stdlib.h>
#include <assert.h>
#include <libintl.h>
#include <fcntl.h>
#include <unistd.h>

/* gettext helper macros.  */
#define _(Str) dgettext ("elfutils", Str)


#define OPT_DEBUGINFO	0x100
#define OPT_COREFILE	0x101

static const struct argp_option options[] =
{
  { NULL, 0, NULL, 0, N_("Input selection options:"), 0 },
  { "executable", 'e', "FILE", 0, N_("Find addresses in FILE"), 0 },
  { "core", OPT_COREFILE, "COREFILE", 0,
    N_("Find addresses from signatures found in COREFILE"), 0 },
  { "pid", 'p', "PID", 0,
    N_("Find addresses in files mapped into process PID"), 0 },
  { "linux-process-map", 'M', "FILE", 0,
    N_("Find addresses in files mapped as read from FILE"
       " in Linux /proc/PID/maps format"), 0 },
  { "kernel", 'k', NULL, 0, N_("Find addresses in the running kernel"), 0 },
  { "offline-kernel", 'K', "RELEASE", OPTION_ARG_OPTIONAL,
    N_("Kernel with all modules"), 0 },
  { "debuginfo-path", OPT_DEBUGINFO, "PATH", 0,
    N_("Search path for separate debuginfo files"), 0 },
  { NULL, 0, NULL, 0, NULL, 0 }
};

static char *debuginfo_path;

static const Dwfl_Callbacks offline_callbacks =
  {
    .find_debuginfo = INTUSE(dwfl_standard_find_debuginfo),
    .debuginfo_path = &debuginfo_path,

    .section_address = INTUSE(dwfl_offline_section_address),

    /* We use this table for core files too.  */
    .find_elf = INTUSE(dwfl_build_id_find_elf),
  };

static const Dwfl_Callbacks proc_callbacks =
  {
    .find_debuginfo = INTUSE(dwfl_standard_find_debuginfo),
    .debuginfo_path = &debuginfo_path,

    .find_elf = INTUSE(dwfl_linux_proc_find_elf),
  };

static const Dwfl_Callbacks kernel_callbacks =
  {
    .find_debuginfo = INTUSE(dwfl_standard_find_debuginfo),
    .debuginfo_path = &debuginfo_path,

    .find_elf = INTUSE(dwfl_linux_kernel_find_elf),
    .section_address = INTUSE(dwfl_linux_kernel_module_section_address),
  };

/* Structure held at state->HOOK.  */
struct parse_opt
{
  Dwfl *dwfl;
  /* The -e|--executable parameter.  */
  const char *e;
  /* The --core parameter.  */
  const char *core;
};

static inline void
failure (Dwfl *dwfl, int errnum, const char *msg, struct argp_state *state)
{
  if (dwfl != NULL)
    dwfl_end (dwfl);
  if (errnum == -1)
    argp_failure (state, EXIT_FAILURE, 0, "%s: %s",
                  msg, INTUSE(dwfl_errmsg) (-1));
  else
    argp_failure (state, EXIT_FAILURE, errnum, "%s", msg);
}

static inline error_t
fail (Dwfl *dwfl, int errnum, const char *msg, struct argp_state *state)
{
  failure (dwfl, errnum, msg, state);
  return errnum == -1 ? EIO : errnum;
}

static error_t
parse_opt (int key, char *arg, struct argp_state *state)
{
  switch (key)
    {
    case ARGP_KEY_INIT:
      {
	assert (state->hook == NULL);
	struct parse_opt *opt = calloc (1, sizeof (*opt));
	if (opt == NULL)
	  failure (NULL, DWFL_E_ERRNO, "calloc", state);
	state->hook = opt;
      }
      break;

    case OPT_DEBUGINFO:
      debuginfo_path = arg;
      break;

    case 'e':
      {
	struct parse_opt *opt = state->hook;
	Dwfl *dwfl = opt->dwfl;
	if (dwfl == NULL)
	  {
	    dwfl = INTUSE(dwfl_begin) (&offline_callbacks);
	    if (dwfl == NULL)
	      return fail (dwfl, -1, arg, state);
	    opt->dwfl = dwfl;

	    /* Start at zero so if there is just one -e foo.so,
	       the DSO is shown without address bias.  */
	    dwfl->offline_next_address = 0;
	  }
	if (dwfl->callbacks != &offline_callbacks)
	  {
	  toomany:
	    argp_error (state, "%s",
			_("only one of -e, -p, -k, -K, or --core allowed"));
	    return EINVAL;
	  }
	opt->e = arg;
      }
      break;

    case 'p':
      {
	struct parse_opt *opt = state->hook;
	if (opt->dwfl == NULL)
	  {
	    Dwfl *dwfl = INTUSE(dwfl_begin) (&proc_callbacks);
	    int result = INTUSE(dwfl_linux_proc_report) (dwfl, atoi (arg));
	    if (result != 0)
	      return fail (dwfl, result, arg, state);

	    /* Non-fatal to not be able to attach to process, ignore error.  */
	    INTUSE(dwfl_linux_proc_attach) (dwfl, atoi (arg), false);

	    opt->dwfl = dwfl;
	  }
	else
	  goto toomany;
      }
      break;

    case 'M':
      {
	struct parse_opt *opt = state->hook;
	if (opt->dwfl == NULL)
	  {
	    FILE *f = fopen (arg, "r");
	    if (f == NULL)
	      {
		int code = errno;
		argp_failure (state, EXIT_FAILURE, code,
			      "cannot open '%s'", arg);
		return code;
	      }
	    Dwfl *dwfl = INTUSE(dwfl_begin) (&proc_callbacks);
	    int result = INTUSE(dwfl_linux_proc_maps_report) (dwfl, f);
	    fclose (f);
	    if (result != 0)
	      return fail (dwfl, result, arg, state);
	    opt->dwfl = dwfl;
	  }
	else
	  goto toomany;
      }
      break;

    case OPT_COREFILE:
      {
	struct parse_opt *opt = state->hook;
	Dwfl *dwfl = opt->dwfl;
	if (dwfl == NULL)
	  opt->dwfl = dwfl = INTUSE(dwfl_begin) (&offline_callbacks);
	/* Permit -e and --core together.  */
	else if (dwfl->callbacks != &offline_callbacks)
	  goto toomany;
	opt->core = arg;
      }
      break;

    case 'k':
      {
	struct parse_opt *opt = state->hook;
	if (opt->dwfl == NULL)
	  {
	    Dwfl *dwfl = INTUSE(dwfl_begin) (&kernel_callbacks);
	    int result = INTUSE(dwfl_linux_kernel_report_kernel) (dwfl);
	    if (result != 0)
	      return fail (dwfl, result, _("cannot load kernel symbols"), state);
	    result = INTUSE(dwfl_linux_kernel_report_modules) (dwfl);
	    if (result != 0)
	      /* Non-fatal to have no modules since we do have the kernel.  */
	      argp_failure (state, 0, result, _("cannot find kernel modules"));
	    opt->dwfl = dwfl;
	  }
	else
	  goto toomany;
      }
      break;

    case 'K':
      {
	struct parse_opt *opt = state->hook;
	if (opt->dwfl == NULL)
	  {
	    Dwfl *dwfl = INTUSE(dwfl_begin) (&offline_callbacks);
	    int result = INTUSE(dwfl_linux_kernel_report_offline) (dwfl, arg,
								   NULL);
	    if (result != 0)
	      return fail (dwfl, result, _("cannot find kernel or modules"), state);
	    opt->dwfl = dwfl;
	  }
	else
	  goto toomany;
      }
      break;

    case ARGP_KEY_SUCCESS:
      {
	struct parse_opt *opt = state->hook;
	Dwfl *dwfl = opt->dwfl;

	if (dwfl == NULL)
	  {
	    /* Default if no -e, -p, or -k, is "-e a.out".  */
	    arg = "a.out";
	    dwfl = INTUSE(dwfl_begin) (&offline_callbacks);
	    if (INTUSE(dwfl_report_offline) (dwfl, "", arg, -1) == NULL)
	      return fail (dwfl, -1, arg, state);
	    opt->dwfl = dwfl;
	  }

	if (opt->core)
	  {
	    int fd = open (opt->core, O_RDONLY);
	    if (fd < 0)
	      {
		int code = errno;
		argp_failure (state, EXIT_FAILURE, code,
			      "cannot open '%s'", opt->core);
		return code;
	      }

	    Elf *core;
	    Dwfl_Error error = __libdw_open_file (&fd, &core, true, false);
	    if (error != DWFL_E_NOERROR)
	      {
		argp_failure (state, EXIT_FAILURE, 0,
			      _("cannot read ELF core file: %s"),
			      INTUSE(dwfl_errmsg) (error));
		return error == DWFL_E_ERRNO ? errno : EIO;
	      }

	    int result = INTUSE(dwfl_core_file_report) (dwfl, core, opt->e);
	    if (result < 0)
	      {
		elf_end (core);
		close (fd);
		return fail (dwfl, result, opt->core, state);
	      }

	    /* Non-fatal to not be able to attach to core, ignore error.  */
	    INTUSE(dwfl_core_file_attach) (dwfl, core);

	    /* Store core Elf and fd in Dwfl to expose with dwfl_end.  */
	    if (dwfl->user_core == NULL)
	      {
		dwfl->user_core = calloc (1, sizeof (struct Dwfl_User_Core));
		if (dwfl->user_core == NULL)
		  {
		    argp_failure (state, EXIT_FAILURE, 0,
				  _("Not enough memory"));
		    return ENOMEM;
		  }
	      }
	    dwfl->user_core->core = core;
	    dwfl->user_core->fd = fd;

	    if (result == 0)
	      {
		argp_failure (state, EXIT_FAILURE, 0,
			      _("No modules recognized in core file"));
		return ENOENT;
	      }
	  }
	else if (opt->e)
	  {
	    if (INTUSE(dwfl_report_offline) (dwfl, "", opt->e, -1) == NULL)
	      return fail (dwfl, -1, opt->e, state);
	  }

	/* One of the three flavors has done dwfl_begin and some reporting
	   if we got here.  Tie up the Dwfl and return it to the caller of
	   argp_parse.  */

	int result = INTUSE(dwfl_report_end) (dwfl, NULL, NULL);
	assert (result == 0);

	/* Update the input all along, so a parent parser can see it.
	   As we free OPT the update below will be no longer active.  */
	*(Dwfl **) state->input = dwfl;
	free (opt);
	state->hook = NULL;
      }
      break;

    case ARGP_KEY_ERROR:
      {
	struct parse_opt *opt = state->hook;
	dwfl_end (opt->dwfl);
	free (opt);
	state->hook = NULL;
      }
      break;

    default:
      return ARGP_ERR_UNKNOWN;
    }

  /* Update the input all along, so a parent parser can see it.  */
  struct parse_opt *opt = state->hook;
  if (opt)
    *(Dwfl **) state->input = opt->dwfl;

  return 0;
}

static const struct argp libdwfl_argp =
  { .options = options, .parser = parse_opt };

const struct argp *
dwfl_standard_argp (void)
{
  return &libdwfl_argp;
}
