1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * Copyright (c) 2000 Silicon Graphics, Inc.  All Rights Reserved.
4 * Author: Kathy Olmsted
5 * Co-Pilot: Steve Shaw
6 */
7
8/*\
9 *[Description]
10 *
11 * - fork returns without error
12 * - fork returns the pid of the child
13 */
14
15#include <errno.h>
16#include <string.h>
17#include <stdlib.h>
18#include <sys/types.h>
19#include <sys/wait.h>
20#include "tst_test.h"
21
22#define	KIDEXIT	42
23#define FILENAME "childpid"
24
25static int fd = -1;
26
27static void verify_fork(void)
28{
29	int kid_status, term_pid, child_pid, pid, ret;
30
31	pid = SAFE_FORK();
32	if (!pid) {
33		SAFE_FILE_PRINTF(FILENAME, "%d", getpid());
34		exit(KIDEXIT);
35	}
36
37	term_pid = SAFE_WAITPID(pid, &kid_status, 0);
38	if (term_pid == pid) {
39		if (!WIFEXITED(kid_status)) {
40			tst_res(TFAIL, "child exited abnormally");
41			return;
42		}
43		ret = WEXITSTATUS(kid_status);
44		if (ret != KIDEXIT)
45			tst_res(TFAIL, "incorrect child status returned %d", ret);
46		else
47			tst_res(TPASS, "correct child status returned %d", ret);
48
49		SAFE_FILE_SCANF(FILENAME, "%d", &child_pid);
50		TST_EXP_EQ_LI(child_pid, pid);
51	} else {
52		tst_res(TFAIL, "waitpid() returns %d instead of expected pid %d",
53				term_pid, pid);
54	}
55
56	tst_reap_children();
57}
58
59static void setup(void)
60{
61	fd = SAFE_CREAT(FILENAME, 0700);
62	SAFE_CLOSE(fd);
63}
64
65static void cleanup(void)
66{
67	if (fd > -1)
68		SAFE_CLOSE(fd);
69}
70
71static struct tst_test test = {
72	.setup = setup,
73	.cleanup = cleanup,
74	.needs_tmpdir = 1,
75	.forks_child = 1,
76	.test_all = verify_fork,
77};
78