xref: /aosp_15_r20/external/ltp/testcases/open_posix_testsuite/conformance/interfaces/clock_settime/8-1.c (revision 49cdfc7efb34551c7342be41a7384b9c40d7cab7)
1 /*
2  * Copyright (c) 2002, Intel Corporation. All rights reserved.
3  * Created by:  julie.n.fleischer REMOVE-THIS AT intel DOT com
4  * This file is licensed under the GPL license.  For the full content
5  * of this license, see the COPYING file at the top level of this
6  * source tree.
7  *
8  * Test that clock_settime() does not affect clock_nanosleep()
9  * relative timers expiration times.
10  *
11  * Steps:
12  * - get time T0
13  * - in child:  set clock_nanosleep() to sleep for SLEEPSEC seconds
14  * - in parent:  sleep SMALLTIME (< SLEEPSEC)
15  * - in parent:  set time back to T0
16  * - in child:  ensure time when clock_nanosleep() expires is within
17  *   ACCEPTABLEDELTA of T0+(SLEEPSEC-SMALLTIME)
18  */
19 #include <stdio.h>
20 #include <time.h>
21 #include <signal.h>
22 #include <unistd.h>
23 #include <sys/wait.h>
24 #include "posixtest.h"
25 #include "helpers.h"
26 
27 #define SLEEPSEC 5
28 #define SMALLTIME 2
29 #define ACCEPTABLEDELTA 1
30 
31 #define CHILDPASS 1
32 #define CHILDFAIL 0
33 
main(void)34 int main(void)
35 {
36 	struct timespec tsT0, tssleep;
37 	int pid;
38 
39 	/* Check that we're root...can't call clock_settime with CLOCK_REALTIME otherwise */
40 	if (getuid() != 0) {
41 		printf("Run this test as ROOT, not as a Regular User\n");
42 		return PTS_UNTESTED;
43 	}
44 
45 	if (clock_gettime(CLOCK_REALTIME, &tsT0) != 0) {
46 		perror("clock_gettime() did not return success\n");
47 		return PTS_UNRESOLVED;
48 	}
49 
50 	if ((pid = fork()) == 0) {
51 		/* child here */
52 		struct timespec tsend;
53 		time_t expectedsec;
54 
55 		tssleep.tv_sec = SLEEPSEC;
56 		tssleep.tv_nsec = 0;
57 
58 		if (clock_nanosleep(CLOCK_REALTIME, 0, &tssleep, NULL) != 0) {
59 			printf("clock_nanosleep() did not return success\n");
60 			return CHILDFAIL;
61 		}
62 
63 		if (clock_gettime(CLOCK_REALTIME, &tsend) != 0) {
64 			perror("clock_gettime() did not return success\n");
65 			return CHILDFAIL;
66 		}
67 
68 		expectedsec = tsT0.tv_sec + (SLEEPSEC - SMALLTIME);
69 
70 		if (tsend.tv_sec >= expectedsec) {
71 			if ((tsend.tv_sec - expectedsec) <= ACCEPTABLEDELTA) {
72 				return CHILDPASS;
73 			} else {
74 				printf("Ended too late.  %d >> %d\n",
75 				       (int)tsend.tv_sec, (int)expectedsec);
76 				return CHILDFAIL;
77 			}
78 		} else {
79 			printf("Did not sleep for long enough %d < %d\n",
80 			       (int)tsend.tv_sec, (int)expectedsec);
81 			return CHILDFAIL;
82 		}
83 
84 		return CHILDFAIL;
85 	} else {
86 		/* parent here */
87 		int i;
88 		struct timespec tsreset;
89 
90 		sleep(SMALLTIME);
91 
92 		if (clock_settime(CLOCK_REALTIME, &tsT0) != 0) {
93 			printf("clock_settime() did not return success\n");
94 			return PTS_UNRESOLVED;
95 		}
96 
97 		if (wait(&i) == -1) {
98 			perror("Error waiting for child to exit\n");
99 			return PTS_UNRESOLVED;
100 		}
101 
102 		getBeforeTime(&tsreset);	// get current time
103 		tsreset.tv_sec += SMALLTIME;
104 		setBackTime(tsreset);
105 
106 		if (WIFEXITED(i) && WEXITSTATUS(i)) {
107 			printf("Test PASSED\n");
108 			return PTS_PASS;
109 		} else {
110 			printf("Test FAILED\n");
111 			return PTS_FAIL;
112 		}
113 	}
114 
115 	return PTS_UNRESOLVED;
116 }
117