Update copyright to LGPL on all files
[dyninst.git] / testsuite / src / dyninst / test4_4_mutatee.c
1 /*
2  * Copyright (c) 1996-2009 Barton P. Miller
3  * 
4  * We provide the Paradyn Parallel Performance Tools (below
5  * described as "Paradyn") on an AS IS basis, and do not warrant its
6  * validity or performance.  We reserve the right to update, modify,
7  * or discontinue this software at any time.  We shall have no
8  * obligation to supply such updates or modifications or any other
9  * form of support to you.
10  * 
11  * By your use of Paradyn, you understand and agree that we (or any
12  * other person or entity with proprietary rights in Paradyn) are
13  * under no obligation to provide either maintenance services,
14  * update services, notices of latent defects, or correction of
15  * defects for Paradyn.
16  * 
17  * This library is free software; you can redistribute it and/or
18  * modify it under the terms of the GNU Lesser General Public
19  * License as published by the Free Software Foundation; either
20  * version 2.1 of the License, or (at your option) any later version.
21  * 
22  * This library is distributed in the hope that it will be useful,
23  * but WITHOUT ANY WARRANTY; without even the implied warranty of
24  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
25  * Lesser General Public License for more details.
26  * 
27  * You should have received a copy of the GNU Lesser General Public
28  * License along with this library; if not, write to the Free Software
29  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
30  */
31 #include <errno.h>
32 #include <stdlib.h>
33 #include <string.h>
34
35 #include "mutatee_util.h"
36
37 /* Externally accessed function prototypes.  These must have globally unique
38  * names.  I suggest following the pattern <testname>_<function>
39  */
40
41 void test4_4_func2();
42 void test4_4_func3();
43
44 /* Global variables accessed by the mutator.  These must have globally unique
45  * names.
46  */
47
48 unsigned int test4_4_global1 = 0xdeadbeef;
49
50 /* Internally used function prototypes.  These should be declared with the
51  * keyword static so they don't interfere with other mutatees in the group.
52  */
53
54 /* Global variables used internally by the mutatee.  These should be declared
55  * with the keyword static so they don't interfere with other mutatees in the
56  * group.
57  */
58
59 /* Function definitions follow */
60
61 void test4_4_func3() {
62     dprintf("in test4_4_func3\n");
63     test4_4_global1 = 4000002;
64 }
65
66 void test4_4_func2()
67 {
68     dprintf("in test4_4_func2\n");
69     /* call to test4_4_func3 should be inserted here */
70 }
71
72 int test4_4_mutatee()
73 {
74 #ifndef i386_unknown_nt4_0_test
75     int i;
76     int pid;
77
78     pid = fork();
79     if (pid == 0) {
80       /* gargc and gargv are declared as extern in solo_mutatee_boilerplate.c and
81        * defined in mutatee_driver.c
82        */
83       int argc = gargc;
84       char **argv = gargv;
85       char **newArgv;
86       char *start;
87       size_t len, prefix, suffix;
88
89       newArgv = (char**) calloc(sizeof(char *), argc +1);
90       for (i = 0; i < argc; i++) newArgv[i] = argv[i];
91         
92       /* replace 4a in copy of myName by 4b */
93       /* newArgv[0] = strdup(argv[0]); */
94       len = strlen(argv[0]) + 2; /* + 2 for extra character and NULL byte */
95       start = strstr(argv[0], "test4_4");
96       if (NULL == start) {
97         /* TODO Mismatch; this is an error */
98       }
99       prefix = start - argv[0];
100       suffix = len - prefix - 8;
101       newArgv[0] = (char *) malloc(len * sizeof (char));
102       strncpy(newArgv[0], argv[0], prefix);
103       strncpy(newArgv[0] + prefix, "test4_4b", 8);
104       strncpy(newArgv[0] + prefix + 8, argv[0] + prefix + 7, suffix);
105
106       /*         for (ch=newArgv[0]; *ch; ch++) { */
107       /*             if (!strncmp(ch, "4a", 2)) *(ch+1) = 'b'; */
108       /*         } */
109
110       /* Now I need to replace 'test4_4' on the command line (argument to -run)
111        * with 'test4_4b'
112        */
113       for (i = 1; i < argc; i++) {
114         if (strcmp(newArgv[i], "-run") == 0) {
115           newArgv[i + 1] = "test4_4b";
116         }
117       }
118         
119       dprintf("Starting \"%s\"\n", newArgv[0]);
120       execvp(newArgv[0], newArgv);
121       perror("execvp");
122     } else {
123       if (pid > 0) {
124         registerPID(pid); /* Register for cleanup */
125       }
126       test4_4_func2();
127 #if defined(rs6000_ibm_aix4_1_test)
128       /* On AIX the child dies when the parent exits, so wait */
129       /* and the parent needs to wake up occasionally to keep dyninst happy*/
130       dprintf("%d SLEEPING\n",getpid());
131       sleep(10);
132       dprintf("%d SLEEP MORE\n",getpid());
133       sleep(2);
134       dprintf("%d SLEEP MORE\n",getpid());
135       sleep(5);
136       dprintf("%d DONE SLEEPING\n",getpid());
137
138 #endif
139       exit(getpid());
140     }
141 #endif
142     return 0;
143 }