C/C++ determination/reporting.
[dyninst.git] / dyninstAPI / tests / src / test4a.mutatee.c
1
2 /* Test application (Mutatee) */
3
4 /* $Id: test4a.mutatee.c,v 1.4 2000/06/20 21:45:58 wylie Exp $ */
5
6 #include <stdio.h>
7 #include <assert.h>
8 #include <sys/types.h>
9 #include <signal.h>
10 #include <string.h>
11 #include <stdlib.h>
12
13 #if defined(i386_unknown_nt4_0) && !defined(__GNUC__)
14 #define WIN32_LEAN_AND_MEAN
15 #include <windows.h>
16 #include <process.h>
17 #define getpid _getpid
18 #else
19 #include <unistd.h>
20 #endif
21
22 #ifdef __cplusplus
23 int mutateeCplusplus = 1;
24 #else
25 int mutateeCplusplus = 0;
26 #endif
27
28 /* control debug printf statements */
29 #define dprintf if (debugPrint) printf
30 int debugPrint = 0;
31
32 #define TRUE    1
33 #define FALSE   0
34
35 int runAllTests = TRUE;
36 #define MAX_TEST 5
37 int runTest[MAX_TEST+1];
38
39 unsigned int globalVariable1_1 = 0xdeadbeef;
40 unsigned int globalVariable2_1 = 0xdeadbeef;
41
42 void func1_1()
43 {
44     globalVariable1_1 = 1000001;
45     exit((int) getpid());
46 }
47
48 /* should be called by parent */
49 void func2_3()
50 {
51     dprintf("pid %d in func2_3\n", (int) getpid());
52     globalVariable2_1 = 2000002;
53 }
54
55 /* should be called by child */
56 void func2_4()
57 {
58     dprintf("pid %d in func2_4\n", (int) getpid());
59     globalVariable2_1 = 2000003;
60 }
61
62 void func2_2() {
63     /* if we get this value at exit, no function was called */
64     globalVariable2_1 = 2000001;
65 }
66
67 void func2_1()
68 {
69 #ifndef i386_unknown_nt4_0
70     int pid;
71
72     pid = fork();
73     if (pid >= 0) {
74         /* both parent and child exit here */
75         func2_2();
76         dprintf("at exit of %d, globalVariable2_1 = %d\n", (int) getpid(),
77             globalVariable2_1);
78         exit(getpid());
79     } else if (pid < 0) {
80         /* error case */
81         exit(pid);
82     }
83 #endif
84 }
85
86 unsigned int globalVariable3_1 = 0xdeadbeef;
87
88 void func3_1(int argc, char *argv[])
89 {
90     int i;
91     char *ch;
92     char **newArgv;
93
94     newArgv = (char **) calloc(sizeof(char *), argc +1);
95     for (i = 0; i < argc; i++) newArgv[i] = argv[i];
96
97     /* replace 4a in copy of myName by 4b */
98     newArgv[0] = strdup(argv[0]);
99     for (ch=newArgv[0]; *ch; ch++) {
100         if (!strncmp(ch, "4a", 2)) *(ch+1) = 'b';
101     }
102
103     globalVariable3_1 = 3000001;
104     dprintf("Starting \"%s\"\n", newArgv[0]);
105     execvp(newArgv[0], newArgv);
106     perror("execvp");
107 }
108
109 unsigned int globalVariable4_1 = 0xdeadbeef;
110
111 void func4_3()
112 {
113     dprintf("in func4_3\n");
114     globalVariable4_1 = 4000002;
115 }
116
117 void func4_2()
118 {
119     dprintf("in func4_2\n");
120     /* call to func4_3 should be inserted here */
121 }
122
123 void func4_1(int argc, char *argv[])
124 {
125 #ifndef i386_unknown_nt4_0
126     int i;
127     int pid;
128     char *ch;
129     char **newArgv;
130
131     pid = fork();
132     if (pid == 0) {
133         newArgv = (char**) calloc(sizeof(char *), argc +1);
134         for (i = 0; i < argc; i++) newArgv[i] = argv[i];
135
136         /* replace 4a in copy of myName by 4b */
137         newArgv[0] = strdup(argv[0]);
138         for (ch=newArgv[0]; *ch; ch++) {
139             if (!strncmp(ch, "4a", 2)) *(ch+1) = 'b';
140         }
141
142         globalVariable3_1 = 3000001;
143         dprintf("Starting \"%s\"\n", newArgv[0]);
144         execvp(newArgv[0], newArgv);
145         perror("execvp");
146     } else {
147         func4_2();
148         exit(getpid());
149     }
150 #endif
151 }
152
153 int main(int argc, char *argv[])
154 {                                       
155     int i, j;
156
157     for (i=1; i < argc; i++) {
158         if (!strcmp(argv[i], "-verbose")) {
159             debugPrint = TRUE;
160         } else if (!strcmp(argv[i], "-run")) {
161             runAllTests = FALSE;
162             for (j=0; j <= MAX_TEST; j++) runTest[j] = FALSE;
163             for (j=i+1; j < argc; j++) {
164                 unsigned int testId;
165                 if ((testId = atoi(argv[j]))) {
166                     if ((testId > 0) && (testId <= MAX_TEST)) {
167                         runTest[testId] = TRUE;
168                     } else {
169                         printf("invalid test %d requested\n", testId);
170                         exit(-1);
171                     }
172                 } else {
173                     /* end of test list */
174                     break;
175                 }
176             }
177             i=j-1;
178         } else {
179             fprintf(stderr, "Usage: %s [-verbose] [-run <num> ..]\n", argv[0]);
180             exit(-1);
181         }
182     }
183
184     dprintf("Mutatee %s running (%s).\n", argv[0], 
185                 mutateeCplusplus ? "C++" : "C");
186
187     if (runTest[1]) func1_1();
188     if (runTest[2]) func2_1();
189     if (runTest[3]) func3_1(argc, argv);
190     if (runTest[4]) func4_1(argc, argv);
191
192     dprintf("Mutatee %s terminating.\n", argv[0]);
193     return 0;
194 }