1 /* 2 * Copyright (c) 2004, 2015, Oracle and/or its affiliates. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 8 * - Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 11 * - Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * - Neither the name of Oracle nor the names of its 16 * contributors may be used to endorse or promote products derived 17 * from this software without specific prior written permission. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS 20 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 21 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 23 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 24 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 25 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 26 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 27 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 28 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 29 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 */ 31 32 /* 33 * This source code is provided to illustrate the usage of a given feature 34 * or technique and has been deliberately simplified. Additional steps 35 * required for a production-quality application, such as security checks, 36 * input validation and proper error handling, might not be present in 37 * this sample code. 38 */ 39 40 41 #ifndef AGENT_UTIL_H 42 #define AGENT_UTIL_H 43 44 #include <stdio.h> 45 #include <stdlib.h> 46 #include <string.h> 47 #include <stddef.h> 48 #include <stdarg.h> 49 50 #include "jni.h" 51 #include "jvmti.h" 52 53 #ifdef __cplusplus 54 extern "C" { 55 #endif 56 57 void stdout_message(const char * format, ...); 58 void fatal_error(const char * format, ...); 59 char *get_token(char *str, char *seps, char *buf, int max); 60 int interested(char *cname, char *mname, 61 char *include_list, char *exclude_list); 62 63 void check_jvmti_error(jvmtiEnv *jvmti, jvmtiError errnum, const char *str); 64 void deallocate(jvmtiEnv *jvmti, void *ptr); 65 void *allocate(jvmtiEnv *jvmti, jint len); 66 void add_demo_jar_to_bootclasspath(jvmtiEnv *jvmti, char *demo_name); 67 68 #ifdef STATIC_BUILD 69 /* Macros for handling declaration of static/dynamic 70 * Agent library Load/Attach/Unload functions 71 * 72 * DEF_Agent_OnLoad, DEF_Agent_OnAttach or DEF_Agent_OnUnload 73 * generate the appropriate entrypoint names based on static 74 * versus dynamic builds. 75 * 76 * STATIC_BUILD must be defined to build static versions of these libraries. 77 * LIBRARY_NAME must be set to the name of the library for static builds. 78 */ 79 #define ADD_LIB_NAME3(name, lib) name ## lib 80 #define ADD_LIB_NAME2(name, lib) ADD_LIB_NAME3(name, lib) 81 #define ADD_LIB_NAME(entry) ADD_LIB_NAME2(entry, LIBRARY_NAME) 82 83 #define DEF_Agent_OnLoad \ 84 ADD_LIB_NAME(Agent_OnLoad_)(JavaVM *vm, char *options, void *reserved) \ 85 { \ 86 jint JNICALL ADD_LIB_NAME(Agent_OnLoad_dynamic_)(JavaVM *vm, char *options, void *reserved); \ 87 return ADD_LIB_NAME(Agent_OnLoad_dynamic_)(vm, options, reserved); \ 88 } \ 89 jint JNICALL ADD_LIB_NAME(Agent_OnLoad_dynamic_) 90 91 #define DEF_Agent_OnAttach \ 92 ADD_LIB_NAME(Agent_OnAttach_)(JavaVM *vm, char *options, void *reserved) \ 93 { \ 94 jint JNICALL ADD_LIB_NAME(Agent_OnAttach_dynamic_)(JavaVM *vm, char *options, void *reserved); \ 95 return ADD_LIB_NAME(Agent_OnAttach_dynamic_)(vm, options, reserved); \ 96 } \ 97 jint JNICALL ADD_LIB_NAME(Agent_OnAttach_dynamic_) 98 99 #define DEF_Agent_OnUnload \ 100 ADD_LIB_NAME(Agent_OnUnload_)(JavaVM *vm) \ 101 { \ 102 void JNICALL ADD_LIB_NAME(Agent_OnUnload_dynamic_)(JavaVM *vm); \ 103 ADD_LIB_NAME(Agent_OnUnload_dynamic_)(vm); \ 104 } \ 105 void JNICALL ADD_LIB_NAME(Agent_OnUnload_dynamic_) 106 107 #else 108 #define DEF_Agent_OnLoad Agent_OnLoad 109 #define DEF_Agent_OnAttach Agent_OnAttach 110 #define DEF_Agent_OnUnload Agent_OnUnload 111 #endif 112 113 #ifdef __cplusplus 114 } /* extern "C" */ 115 #endif /* __cplusplus */ 116 117 #endif