/*
 * Copyright (c) 2002, Intel Corporation. All rights reserved.
 * Created by:  rolla.n.selbak REMOVE-THIS AT intel DOT com
 * This file is licensed under the GPL license.  For the full content
 * of this license, see the COPYING file at the top level of this
 * source tree.
 *
 * int pthread_atfork(void (*prepare) (void), void (*parent) (void), void (*child) (void))
 *
 * If no handling is desired at one or more of these three points, the corresponding fork
 * handler address(es) may be set to NULL.
 *
 * STEPS:
 * 1. Call pthread_atfork() with all NULL paramters
 * 2. Check to make sure the function returns success
 *
 */

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
#include "posixtest.h"

int main ()
{
	pid_t pid;
	int ret;

	/* Set up the fork handlers */
	ret = pthread_atfork(NULL, NULL, NULL);
	if (ret != 0)
	{
		if (ret == ENOMEM)
		{
			printf("Error: ran out of memory\n");
			return PTS_UNRESOLVED;
		}

		printf("Test FAILED: Expected return value success, instead received %d\n", ret);
		return PTS_FAIL;
	}

	/* Now call fork() to make sure everything goes smoothly */
	pid = fork();

	if (pid < 0)
	{
		perror("Error in fork()\n");
		return PTS_UNRESOLVED;
	}
	if (pid == 0)
	{
		/* Child process */
		pthread_exit(0);
	} else
	{
		/* Parent process */
		wait(NULL);
	}

	printf("Test PASSED\n");
	return PTS_PASS;
}
