1 /*
2  * Copyright (c) 2007, 2019, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.
8  *
9  * This code is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12  * version 2 for more details (a copy is included in the LICENSE file that
13  * accompanied this code).
14  *
15  * You should have received a copy of the GNU General Public License version
16  * 2 along with this work; if not, write to the Free Software Foundation,
17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18  *
19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20  * or visit www.oracle.com if you need additional information or have any
21  * questions.
22  */
23 #include <jni.h>
24 #include <jvmti.h>
25 #include "agent_common.h"
26 #include <string.h>
27 #include "jvmti_tools.h"
28 
29 extern "C" {
30 
31 #define FILE_NAME "nsk/jvmti/scenarios/hotswap/HS302/hs302t002/MyClass"
32 #define CLASS_NAME "Lnsk/jvmti/scenarios/hotswap/HS302/hs302t002/MyClass;"
33 
callbackClassPrepare(jvmtiEnv * jvmti_env,JNIEnv * jni_env,jthread thread,jclass klass)34 void JNICALL callbackClassPrepare(jvmtiEnv *jvmti_env,
35                                JNIEnv* jni_env,
36                                jthread thread,
37                                jclass klass) {
38   char * className;
39   char * generic;
40   int redefineNumber;
41   redefineNumber=0;
42   jvmti_env->GetClassSignature(klass, &className, &generic);
43   if (strcmp(className,CLASS_NAME) == 0) {
44       char fileName[512];
45       nsk_jvmti_disableNotification(jvmti_env, JVMTI_EVENT_CLASS_PREPARE, NULL);
46       nsk_jvmti_getFileName(redefineNumber, FILE_NAME, fileName, sizeof(fileName)/sizeof(char));
47       if (nsk_jvmti_redefineClass(jvmti_env, klass, fileName)) {
48           nsk_printf("Redefine successful ..\n");
49       } else {
50           nsk_printf("Redefine failed ..     \n");
51       }
52   }
53 }
54 
55 #ifdef STATIC_BUILD
Agent_OnLoad_hs302t002(JavaVM * jvm,char * options,void * reserved)56 JNIEXPORT jint JNICALL Agent_OnLoad_hs302t002(JavaVM *jvm, char *options, void *reserved) {
57     return Agent_Initialize(jvm, options, reserved);
58 }
Agent_OnAttach_hs302t002(JavaVM * jvm,char * options,void * reserved)59 JNIEXPORT jint JNICALL Agent_OnAttach_hs302t002(JavaVM *jvm, char *options, void *reserved) {
60     return Agent_Initialize(jvm, options, reserved);
61 }
JNI_OnLoad_hs302t002(JavaVM * jvm,char * options,void * reserved)62 JNIEXPORT jint JNI_OnLoad_hs302t002(JavaVM *jvm, char *options, void *reserved) {
63     return JNI_VERSION_1_8;
64 }
65 #endif
Agent_Initialize(JavaVM * vm,char * options,void * reserved)66 jint  Agent_Initialize(JavaVM *vm, char *options, void *reserved) {
67     jint rc ;
68     jvmtiEnv * jvmti;
69 
70     nsk_printf("Agent:: VM.. Started..\n");
71     rc=vm->GetEnv((void **)&jvmti, JVMTI_VERSION_1_1);
72     if (rc != JNI_OK) {
73         nsk_printf("Agent:: Could not load JVMTI interface \n");
74         return JNI_ERR;
75     } else {
76         jvmtiCapabilities caps;
77         jvmtiEventCallbacks eventCallbacks;
78 
79         if (!nsk_jvmti_parseOptions(options)) {
80             nsk_printf("# error agent Failed to parse options \n");
81             return JNI_ERR;
82         }
83 
84         memset(&caps, 0, sizeof(caps));
85         caps.can_redefine_classes = 1;
86         caps.can_generate_all_class_hook_events=1;
87         jvmti->AddCapabilities(&caps);
88         memset(&eventCallbacks, 0, sizeof(eventCallbacks));
89         eventCallbacks.ClassPrepare = &callbackClassPrepare;
90         rc=jvmti->SetEventCallbacks(&eventCallbacks,
91                 sizeof(eventCallbacks));
92 
93         if (rc != JVMTI_ERROR_NONE) {
94             nsk_printf(" Agent:: Error occured while setting event call back \n");
95             return JNI_ERR;
96         }
97         if (nsk_jvmti_enableNotification(jvmti, JVMTI_EVENT_CLASS_PREPARE, NULL)) {
98             nsk_printf(" Enabled. noftification..");
99         } else {
100             nsk_printf(" Failed to Enable ..");
101         }
102     }
103     return JNI_OK;
104 }
105 
106 }
107