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