1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * Copyright (c) International Business Machines  Corp., 2001
4 * Ported to LTP 07/2001 John George
5 * Testcase to check the basic functionality of settimeofday().
6 */
7
8#include <sys/time.h>
9#include <errno.h>
10#include <unistd.h>
11#include "tst_test.h"
12#include "lapi/syscalls.h"
13
14#define	VAL_SEC		100
15#define	VAL_MSEC	100
16#define ACCEPTABLE_DELTA 500
17#define USEC_PER_SEC    1000000L
18
19static void verify_settimeofday(void)
20{
21	suseconds_t delta;
22	struct timeval tv1, tv2;
23
24	if (gettimeofday(&tv1, NULL) == -1)
25		tst_brk(TBROK | TERRNO, "gettimeofday(&tv1, NULL) failed");
26
27	tv1.tv_sec += VAL_SEC;
28	tv1.tv_usec += VAL_MSEC;
29	if (tv1.tv_usec >= USEC_PER_SEC)
30		tv1.tv_usec = VAL_MSEC;
31
32	TEST(settimeofday(&tv1, NULL));
33	if (TST_RET == -1) {
34		tst_res(TFAIL | TTERRNO, "settimeofday(&tv1, NULL) failed");
35		return;
36	}
37
38	if (gettimeofday(&tv2, NULL) == -1)
39		tst_brk(TBROK | TERRNO, "gettimeofday(&tv2, NULL) failed");
40
41	if (tv2.tv_sec > tv1.tv_sec) {
42		delta =
43			(suseconds_t) (tv2.tv_sec - tv1.tv_sec) * 1000 +
44			(tv2.tv_usec - tv1.tv_usec) / 1000;
45	} else {
46		delta =
47			(suseconds_t) (tv1.tv_sec - tv2.tv_sec) * 1000 +
48			(tv1.tv_usec - tv2.tv_usec) / 1000;
49	}
50
51	if (delta > -ACCEPTABLE_DELTA && delta < ACCEPTABLE_DELTA)
52		tst_res(TPASS, "settimeofday() pass");
53	else
54		tst_res(TFAIL, "settimeofday() fail");
55}
56
57static struct tst_test test = {
58	.restore_wallclock = 1,
59	.test_all = verify_settimeofday,
60	.needs_root = 1,
61};
62