• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 nanosleep() causes the current thread to be suspended
9  * until a signal whose action is to invoke a signal handling function
10  * is received.
11  */
12 #include <stdio.h>
13 #include <time.h>
14 #include <signal.h>
15 #include <unistd.h>
16 #include <sys/wait.h>
17 #include "posixtest.h"
18 
handler(int signo PTS_ATTRIBUTE_UNUSED)19 static void handler(int signo PTS_ATTRIBUTE_UNUSED)
20 {
21 	printf("In handler\n");
22 }
23 
main(void)24 int main(void)
25 {
26 	struct timespec tssleepfor, tsstorage, tsbefore, tsafter;
27 	int sleepsec = 30;
28 	int pid;
29 	struct sigaction act;
30 
31 	if (clock_gettime(CLOCK_REALTIME, &tsbefore) == -1) {
32 		perror("Error in clock_gettime()\n");
33 		return PTS_UNRESOLVED;
34 	}
35 
36 	if ((pid = fork()) == 0) {
37 		/* child here */
38 
39 		act.sa_handler = handler;
40 		act.sa_flags = 0;
41 		if (sigemptyset(&act.sa_mask) == -1) {
42 			perror("Error calling sigemptyset\n");
43 			return PTS_UNRESOLVED;
44 		}
45 		if (sigaction(SIGABRT, &act, 0) == -1) {
46 			perror("Error calling sigaction\n");
47 			return PTS_UNRESOLVED;
48 		}
49 		tssleepfor.tv_sec = sleepsec;
50 		tssleepfor.tv_nsec = 0;
51 		nanosleep(&tssleepfor, &tsstorage);
52 	} else {
53 		/* parent here */
54 		int i;
55 
56 		sleep(1);
57 
58 		if (kill(pid, SIGABRT) != 0) {
59 			printf("Could not raise signal being tested\n");
60 			return PTS_UNRESOLVED;
61 		}
62 
63 		if (wait(&i) == -1) {
64 			perror("Error waiting for child to exit\n");
65 			return PTS_UNRESOLVED;
66 		}
67 		if (clock_gettime(CLOCK_REALTIME, &tsafter) == -1) {
68 			perror("Error in clock_gettime()\n");
69 			return PTS_UNRESOLVED;
70 		}
71 
72 		/*
73 		 * pass if we slept for less than the (large) sleep time
74 		 * allotted
75 		 */
76 		if ((tsafter.tv_sec - tsbefore.tv_sec) < sleepsec) {
77 			printf("Test PASSED\n");
78 			return PTS_PASS;
79 		} else {
80 			printf("Slept for too long: %d >= %d\n",
81 			       (int)tsafter.tv_sec - (int)tsbefore.tv_sec,
82 			       sleepsec);
83 			printf("Test FAILED\n");
84 			return PTS_FAIL;
85 		}
86 	}
87 	return PTS_UNRESOLVED;
88 }
89