| /* Copyright (C) 2021-2024 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.  */ | 
 |  | 
 | #ifndef _COLLECT_H | 
 | #define _COLLECT_H | 
 |  | 
 | #include <Application.h> | 
 |  | 
 | extern "C" | 
 | { | 
 |   typedef void (*SignalHandler)(int); | 
 | } | 
 |  | 
 | class Coll_Ctrl; | 
 | class Elf; | 
 |  | 
 | #define MAXLABELS       10      /* maximum number of -C arguments */ | 
 | #define STDEBUFSIZE     24000 | 
 |  | 
 | enum { MAX_LD_PRELOAD_TYPES = 3 }; | 
 |  | 
 | struct Process | 
 | { | 
 |   Process (pid_t _pid) : pid (_pid) { } | 
 |   pid_t pid; | 
 | }; | 
 |  | 
 | struct DtraceTool | 
 | { | 
 |   DtraceTool (char*); | 
 |   ~DtraceTool (); | 
 |  | 
 |   char *name;       // Tool name as specified by -D flag | 
 |   char *params;     // Tool parameters | 
 |   char *dfile;      // Extracted d-script | 
 |   char *mfile;      // Extracted metadata file | 
 |   char *ofile;      // Output file | 
 |   pid_t pid; | 
 | }; | 
 |  | 
 | // collect object | 
 | class collect : Application | 
 | { | 
 | public: | 
 |   collect (int argc, char *argv[], char **envp); | 
 |   virtual ~collect (); | 
 |   void start (int argc, char *argv[]); | 
 |   void  writeStr (int f, const char *buf); | 
 |  | 
 |   // the collector control class | 
 |   Coll_Ctrl *cc; | 
 |  | 
 | private: | 
 |   enum Exec_status | 
 |   { | 
 |     EXEC_OK = 0, // found as runnable executable | 
 |     EXEC_ELF_NOSHARE, // found, but built unshared | 
 |     EXEC_IS_JAR, // found as a .jar file | 
 |     EXEC_IS_CLASS, // found as a .class file but name missing .class | 
 |     EXEC_IS_CLASSCLASS, // found as a .class file with explicit .class | 
 |     EXEC_OPEN_FAIL, // could not be opened | 
 |     EXEC_ELF_LIB, // internal error: bad elf library | 
 |     EXEC_ELF_HEADER, // executable, with bad ELF header | 
 |     EXEC_ELF_ARCH, // executable, but unrunnable architecture | 
 |     EXEC_ISDIR, // a directory, not a file | 
 |     EXEC_NOT_EXEC, // a file, but not executable | 
 |     EXEC_NOT_FOUND // a directory, not a file | 
 |   }; | 
 |  | 
 |   // override methods in base class | 
 |   void usage (); | 
 |   void short_usage (); | 
 |   void show_hwc_usage (); | 
 |   int check_args (int argc, char *argv[]); | 
 |   void check_target (int, char **); | 
 |   Exec_status check_executable (char *); | 
 |   Exec_status check_executable_arch (Elf *); | 
 |   char *status_str (Exec_status, char *); | 
 |   int do_flag (const char *); | 
 |   char *find_java (void); | 
 |   char *java_path; | 
 |   char *java_how; | 
 |   int putenv_libcollector (); | 
 |   int putenv_libcollector_ld_audits (); | 
 |   int putenv_libcollector_ld_preloads (); | 
 |   int putenv_libcollector_ld_misc (); | 
 |   void add_ld_preload (const char *lib); | 
 |   int putenv_ld_preloads (); | 
 |   int putenv_memso (); | 
 |   int env_strip (char *env, const char *str); | 
 |   int putenv_purged_ld_preloads (const char *var); | 
 |   int putenv_append (const char *var, const char *val); | 
 |   void get_count_data (); | 
 |   void prepare_dbx (); | 
 |   int traceme (const char *file, char *const argv[]); | 
 |   int checkflagterm (const char *); | 
 |   void dupflagseen (char); | 
 |   void dupflagseen (const char *); | 
 |   void validate_config (int); | 
 |   void validate_java (const char *, const char *, int); | 
 |   int set_output (); | 
 |   void reset_output (); | 
 |  | 
 |   /* Logging warning messages */ | 
 |   char **collect_warnings; | 
 |   int collect_warnings_idx; | 
 |   void warn_open (); | 
 |   void warn_close (); | 
 |   void warn_write (const char *format, ...); | 
 |   void warn_comment (const char *kind, int num, char *s = NULL, int len = 0); | 
 |   char *warnfilename; | 
 |   FILE *warn_file; | 
 |  | 
 |   /* MPI experiment handling */ | 
 |   void setup_MPI_expt ();   /* the founder experiment */ | 
 |   void write_MPI_founder_log (); | 
 |   void close_MPI_founder_log (int, int); | 
 |   void spawn_MPI_job (); /* run the MPI job */ | 
 |   void copy_collect_args (char ***);   /* copy collect args for an MPI target */ | 
 |   int disabled; | 
 |   int jseen_global;         /* if -j flag was seen */ | 
 |   int verbose; | 
 |   bool mem_so_me;           /* if T, preload mem.so, not libcollector */ | 
 |   int origargc; | 
 |   char **arglist; | 
 |   char **origargv; | 
 |   char **origenvp; | 
 |   int targ_index;           // index of name of target in origargv | 
 |   bool is_64; | 
 |   int nargs; | 
 |   int njargs; | 
 |   char *jargs; | 
 |   int nlabels; | 
 |   char *label[MAXLABELS]; | 
 |   char *sp_preload_list[MAX_LD_PRELOAD_TYPES + 1];  // +1 for NULL termination | 
 |   char *sp_libpath_list[MAX_LD_PRELOAD_TYPES + 1];  // +1 for NULL termination | 
 | }; | 
 |  | 
 | #endif /* ! _COLLECT_H */ |