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