/* Copyright (C) 2021 Free Software Foundation, Inc.
   Contributed by Oracle.

   This file is part of GNU Binutils.

   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 3, 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; if not, write to the Free Software
   Foundation, 51 Franklin Street - Fifth Floor, Boston,
   MA 02110-1301, USA.  */

/* Lineage events for process fork, exec, etc. */

#ifndef DESCENDANTS_H
#define DESCENDANTS_H

#include <dlfcn.h>
#include <errno.h>
#include <fcntl.h>
#include <alloca.h>
#include <assert.h>

#include "gp-defs.h"
#include "gp-experiment.h"
#include "collector.h"
#include "memmgr.h"
#include "cc_libcollector.h"
#include "tsd.h"

/* configuration, not changed after init. */
typedef enum
{
  LM_DORMANT        = -2,   /* env vars preserved, not recording */
  LM_CLOSED         = -1,   /* env vars cleared, not recording */
  LM_TRACK_LINEAGE  = 1,    /* env vars preserved, recording */
} line_mode_t;

extern line_mode_t line_mode;
extern int user_follow_mode;
extern int java_mode;
extern int dbg_current_mode; 	/* for debug only */
extern unsigned line_key;
extern char **sp_env_backup;

#define INIT_REENTRANCE(x)  ((x) = __collector_tsd_get_by_key (line_key))
#define CHCK_REENTRANCE(x)  (((INIT_REENTRANCE(x)) == NULL) || (*(x) != 0))
#define PUSH_REENTRANCE(x)  ((*(x))++)
#define POP_REENTRANCE(x)   ((*(x))--)

/* environment variables that must be forwarded to descendents */
#define SP_COLLECTOR_PARAMS         "SP_COLLECTOR_PARAMS"
#define SP_COLLECTOR_EXPNAME        "SP_COLLECTOR_EXPNAME"
#define SP_COLLECTOR_FOLLOW_SPEC    "SP_COLLECTOR_FOLLOW_SPEC"
#define SP_COLLECTOR_FOUNDER        "SP_COLLECTOR_FOUNDER"
#define SP_PRELOAD_STRINGS          "SP_COLLECTOR_PRELOAD"
#define LD_PRELOAD_STRINGS          "LD_PRELOAD"
#define SP_LIBPATH_STRINGS          "SP_COLLECTOR_LIBRARY_PATH"
#define LD_LIBPATH_STRINGS          "LD_LIBRARY_PATH"
#define JAVA_TOOL_OPTIONS          "JAVA_TOOL_OPTIONS"
#define COLLECTOR_JVMTI_OPTION     "-agentlib:gp-collector"

extern int __collector_linetrace_shutdown_hwcs_6830763_XXXX;
extern void __collector_env_unset (char *envp[]);
extern void __collector_env_save_preloads ();
extern char ** __collector_env_backup ();
extern void __collector_env_backup_free ();
extern void __collector_env_update (char *envp[]);
extern void __collector_env_print (char *label);
extern void __collector_env_printall (char *label, char *envp[]);
extern char ** __collector_env_allocate (char *const old_env[], int allocate_env);

#endif
