blob: 926b18ab445938fa95ef6bfe3646f3ecf68c4e51 [file] [log] [blame]
/* **********************************************************
* Copyright (c) 2009 VMware, Inc. All rights reserved.
* **********************************************************/
/* Dr. Memory: the memory debugger
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License, and no later version.
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include <sys/types.h>
#include <unistd.h>
#include <sys/types.h> /* for wait and mmap */
#include <sys/wait.h> /* for wait */
#include <assert.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
int
main(int argc, char *argv[])
{
pid_t child;
if (argc < 2) {
printf("ERROR: not enough args\n");
return -1;
}
printf("parent is running\n");
fflush(stdout);
child = fork();
if (child < 0) {
perror("ERROR on fork");
} else if (child > 0) {
pid_t result;
int iters = 0;
/* PR 479089: we can get interrupted, so loop */
do {
result = waitpid(child, NULL, 0);
assert(++iters < 100);
} while (result == -1 && errno == EINTR);
assert(result == child);
printf("child has exited\n");
fflush(stdout);
} else {
int result;
char *arg[] = { argv[1], NULL };
char *env[] = { NULL };
printf("child is running\n");
fflush(stdout);
result = execve(argv[1], arg, env);
if (result < 0)
perror("ERROR in execve");
}
return 0;
}