/*
 * Copyright (c) 2014 Fujitsu Ltd.
 * Author: Xiaoguang Wang <wangxg.fnst@cn.fujitsu.com>
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of version 2 of the GNU General Public License as
 * published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it would be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */

/*
 * Description:
 * Verify that,
 *   Basic test for fcntl(2) using F_DUPFD_CLOEXEC argument.
 */

#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <pwd.h>

#include "test.h"
#include "safe_macros.h"
#include "lapi/fcntl.h"

char *TCID = "fcntl29";
int TST_TOTAL = 1;

static void setup(void);
static void cleanup(void);

static int test_fd;

int main(int ac, char **av)
{
	int lc, dup_fd;
	const char *msg;

	msg = parse_opts(ac, av, NULL, NULL);
	if (msg != NULL)
		tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg);

	setup();

	for (lc = 0; TEST_LOOPING(lc); lc++) {
		tst_count = 0;

		TEST(fcntl(test_fd, F_DUPFD_CLOEXEC, 0));
		if (TEST_RETURN < 0) {
			tst_brkm(TFAIL | TTERRNO, cleanup, "fcntl "
				 "test F_DUPFD_CLOEXEC failed");
		}
		dup_fd = TEST_RETURN;

		TEST(fcntl(dup_fd, F_GETFD));
		if (TEST_RETURN < 0) {
			SAFE_CLOSE(cleanup, dup_fd);
			tst_brkm(TFAIL | TTERRNO, cleanup, "fcntl "
				 "test F_GETFD failed");
		}

		if (TEST_RETURN & FD_CLOEXEC) {
			tst_resm(TPASS, "fcntl test "
				 "F_DUPFD_CLOEXEC success");
		} else {
			tst_resm(TFAIL, "fcntl test "
				 "F_DUPFD_CLOEXEC fail");
		}

		SAFE_CLOSE(cleanup, dup_fd);
	}

	cleanup();
	tst_exit();
}

static void setup(void)
{
	if ((tst_kvercmp(2, 6, 24)) < 0) {
		tst_brkm(TCONF, NULL, "This test can only run on kernels"
			 "that are 2.6.24 and higher");
	}

	tst_sig(NOFORK, DEF_HANDLER, cleanup);

	tst_tmpdir();

	TEST_PAUSE;

	test_fd = SAFE_CREAT(cleanup, "testfile", 0644);
}

static void cleanup(void)
{
	if (test_fd > 0)
		SAFE_CLOSE(NULL, test_fd);

	tst_rmdir();
}
