Added BPatch_thread::oneTimeCode, BPatch_thread::loadLibrary, and other
[dyninst.git] / dyninstAPI / tests / src / test2.mutatee.c
1
2 /* Test application (Mutatee) */
3
4 #include <stdio.h>
5 #include <sys/types.h>
6 #include <signal.h>
7 #include <string.h>
8 #if defined(sparc_sun_sunos4_1_3) || defined(sparc_sun_solaris2_4)
9 #include <unistd.h>
10 #endif
11 #if defined(i386_unknown_nt4_0)
12 #include <stdlib.h>
13 #define WIN32_LEAN_AND_MEAN
14 #include <windows.h>
15 #endif
16
17 #if defined(sparc_sun_solaris2_4) || defined(i386_unknown_solaris2_5)
18 #include <dlfcn.h>
19 #endif
20
21 #include "test2.h"
22
23 /* XXX Currently, there's a bug in the library that prevents a subroutine call
24  * instrumentation point from being recognized if it is the first instruction
25  * in a function.  The following variable is used in this program in a number
26  * of kludges to get around this.
27  */
28 int kludge;
29
30 // control debug printf statements
31 #define dprintf if (debugPrint) printf
32 int debugPrint = 0;
33
34 #define TRUE    1
35 #define FALSE   0
36
37 int isAttached = 0;
38
39 /*
40  * Check to see if the mutator has attached to us.
41  */
42 int checkIfAttached()
43 {
44     return isAttached;
45 }
46
47
48 /*
49  * Stop the process (in order to wait for the mutator to finish what it's
50  * doing and restart us).
51  */
52 void stop_process()
53 {
54 #ifdef i386_unknown_nt4_0
55     DebugBreak();
56 #else
57     kill(getpid(), SIGSTOP);
58 #endif
59 }
60
61 void func10_1()
62 {
63     // Does nothing.  Will be instrumented with a BPatch_breakPointExpr
64 }
65
66 void func11_1()
67 {
68     // Does nothing.
69 }
70
71 void main(int argc, char *argv[])
72 {
73     int i;
74     void *ref;
75     int useAttach = FALSE;
76  
77     for (i=1; i < argc; i++) {
78         if (!strcmp(argv[i], "-verbose")) {
79             debugPrint = 1;
80         } else if (!strcmp(argv[i], "-attach")) {
81             useAttach = TRUE;
82         } else {
83             fprintf(stderr, "Usage: test2.mutatee [-attach] [-verbose]\n");
84             exit(-1);
85         }
86     }
87
88     // see if we should wait for the attach
89     if (useAttach) {
90         printf("Waiting for mutator to attach...\n");
91         while (!checkIfAttached()) ;
92         printf("Mutator attached.  Mutatee continuing.\n");
93     }
94
95 #ifdef sparc_sun_solaris2_4
96     // now use the dlopen interface to force an object to load.
97     ref = dlopen(TEST_DYNAMIC_LIB, RTLD_NOW);
98     if (!ref) {
99         fprintf(stderr, "%s\n", dlerror());
100         fflush(stderr);
101     }
102
103     // Stop and wait for the mutator to check that we linked the library
104     stop_process();
105 #endif
106
107     func10_1();
108
109     while(1);
110
111     exit(0);
112 }