10dc076565f772bb1953209fb69ea150b494aaa40robbiew/*
20dc076565f772bb1953209fb69ea150b494aaa40robbiew* Copyright (c) 2005, Bull S.A..  All rights reserved.
30dc076565f772bb1953209fb69ea150b494aaa40robbiew* Created by: Sebastien Decugis
45f3786942119704d17da876239c71a125985beccCyril Hrubis* Copyright (c) 2013 Cyril Hrubis <chrubis@suse.cz>
55f3786942119704d17da876239c71a125985beccCyril Hrubis*
60dc076565f772bb1953209fb69ea150b494aaa40robbiew* This program is free software; you can redistribute it and/or modify it
70dc076565f772bb1953209fb69ea150b494aaa40robbiew* under the terms of version 2 of the GNU General Public License as
80dc076565f772bb1953209fb69ea150b494aaa40robbiew* published by the Free Software Foundation.
90dc076565f772bb1953209fb69ea150b494aaa40robbiew*
100dc076565f772bb1953209fb69ea150b494aaa40robbiew* This program is distributed in the hope that it would be useful, but
110dc076565f772bb1953209fb69ea150b494aaa40robbiew* WITHOUT ANY WARRANTY; without even the implied warranty of
120dc076565f772bb1953209fb69ea150b494aaa40robbiew* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
130dc076565f772bb1953209fb69ea150b494aaa40robbiew*
140dc076565f772bb1953209fb69ea150b494aaa40robbiew* You should have received a copy of the GNU General Public License along
15fed9641096e27f79a0f2d9adfe9839dd8d11dc0fWanlong Gao* with this program; if not, write the Free Software Foundation, Inc.,
16fed9641096e27f79a0f2d9adfe9839dd8d11dc0fWanlong Gao* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
175f3786942119704d17da876239c71a125985beccCyril Hrubis*
180dc076565f772bb1953209fb69ea150b494aaa40robbiew* This sample test aims to check the following assertions:
190dc076565f772bb1953209fb69ea150b494aaa40robbiew*
202c28215423293e443469a07ae7011135d058b671Garrett Cooper* If SA_SIGINFO is not set in sa_flags, sa_handler is used as the signal
210dc076565f772bb1953209fb69ea150b494aaa40robbiew* handling function.
225f3786942119704d17da876239c71a125985beccCyril Hrubis*
230dc076565f772bb1953209fb69ea150b494aaa40robbiew* The steps are:
240dc076565f772bb1953209fb69ea150b494aaa40robbiew* -> register a handler for SIGXFSZ without SA_SIGINFO, and a known function
255f3786942119704d17da876239c71a125985beccCyril Hrubis*   as sa_handler
260dc076565f772bb1953209fb69ea150b494aaa40robbiew* -> raise SIGXFSZ, and check the function has been called.
275f3786942119704d17da876239c71a125985beccCyril Hrubis*
280dc076565f772bb1953209fb69ea150b494aaa40robbiew* The test fails if the function is not called
290dc076565f772bb1953209fb69ea150b494aaa40robbiew*/
300dc076565f772bb1953209fb69ea150b494aaa40robbiew
310dc076565f772bb1953209fb69ea150b494aaa40robbiew/* We are testing conformance to IEEE Std 1003.1, 2003 Edition */
320dc076565f772bb1953209fb69ea150b494aaa40robbiew#define _POSIX_C_SOURCE 200112L
330dc076565f772bb1953209fb69ea150b494aaa40robbiew
340dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <pthread.h>
350dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <stdarg.h>
360dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <stdio.h>
370dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <stdlib.h>
380dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <string.h>
390dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <unistd.h>
400dc076565f772bb1953209fb69ea150b494aaa40robbiew
410dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <signal.h>
420dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <errno.h>
430dc076565f772bb1953209fb69ea150b494aaa40robbiew
445f3786942119704d17da876239c71a125985beccCyril Hrubis#include "posixtest.h"
455f3786942119704d17da876239c71a125985beccCyril Hrubis
462d2b94348a482ca608886ffab9f83148244bccfcCyril Hrubisstatic volatile sig_atomic_t called = 0;
475f3786942119704d17da876239c71a125985beccCyril Hrubis
485f3786942119704d17da876239c71a125985beccCyril Hrubisstatic void handler()
490dc076565f772bb1953209fb69ea150b494aaa40robbiew{
500dc076565f772bb1953209fb69ea150b494aaa40robbiew	called = 1;
510dc076565f772bb1953209fb69ea150b494aaa40robbiew}
520dc076565f772bb1953209fb69ea150b494aaa40robbiew
534ca2bbdcd3003f3c8df4e6129e9c7b2bd1514f87Cyril Hrubisint main(void)
540dc076565f772bb1953209fb69ea150b494aaa40robbiew{
550dc076565f772bb1953209fb69ea150b494aaa40robbiew	int ret;
560dc076565f772bb1953209fb69ea150b494aaa40robbiew	struct sigaction sa;
570dc076565f772bb1953209fb69ea150b494aaa40robbiew
580dc076565f772bb1953209fb69ea150b494aaa40robbiew	/* Set the signal handler */
590dc076565f772bb1953209fb69ea150b494aaa40robbiew	sa.sa_flags = 0;
600dc076565f772bb1953209fb69ea150b494aaa40robbiew	sa.sa_handler = handler;
61e9410dfd93b8e415ecbe3f7e09a085462b27836eGarrett Cooper	ret = sigemptyset(&sa.sa_mask);
620dc076565f772bb1953209fb69ea150b494aaa40robbiew
63354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (ret != 0) {
645f3786942119704d17da876239c71a125985beccCyril Hrubis		perror("Failed to empty signal set");
655f3786942119704d17da876239c71a125985beccCyril Hrubis		return PTS_UNRESOLVED;
660dc076565f772bb1953209fb69ea150b494aaa40robbiew	}
670dc076565f772bb1953209fb69ea150b494aaa40robbiew
680dc076565f772bb1953209fb69ea150b494aaa40robbiew	/* Install the signal handler for SIGXFSZ */
695f3786942119704d17da876239c71a125985beccCyril Hrubis	ret = sigaction(SIGXFSZ, &sa, 0);
700dc076565f772bb1953209fb69ea150b494aaa40robbiew
71354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (ret != 0) {
725f3786942119704d17da876239c71a125985beccCyril Hrubis		perror("Failed to set signal handler");
735f3786942119704d17da876239c71a125985beccCyril Hrubis		return PTS_UNRESOLVED;
740dc076565f772bb1953209fb69ea150b494aaa40robbiew	}
750dc076565f772bb1953209fb69ea150b494aaa40robbiew
76354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (called) {
775f3786942119704d17da876239c71a125985beccCyril Hrubis		fprintf(stderr,
785f3786942119704d17da876239c71a125985beccCyril Hrubis			"The signal handler has been called before signal was raised");
795f3786942119704d17da876239c71a125985beccCyril Hrubis		return PTS_FAIL;
800dc076565f772bb1953209fb69ea150b494aaa40robbiew	}
810dc076565f772bb1953209fb69ea150b494aaa40robbiew
825f3786942119704d17da876239c71a125985beccCyril Hrubis	ret = raise(SIGXFSZ);
830dc076565f772bb1953209fb69ea150b494aaa40robbiew
84354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (ret != 0) {
855f3786942119704d17da876239c71a125985beccCyril Hrubis		perror("Failed to raise SIGXFSZ");
865f3786942119704d17da876239c71a125985beccCyril Hrubis		return PTS_UNRESOLVED;
870dc076565f772bb1953209fb69ea150b494aaa40robbiew	}
880dc076565f772bb1953209fb69ea150b494aaa40robbiew
89354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (!called) {
905f3786942119704d17da876239c71a125985beccCyril Hrubis		fprintf(stderr, "The sa_handler was not called\n");
915f3786942119704d17da876239c71a125985beccCyril Hrubis		return PTS_FAIL;
920dc076565f772bb1953209fb69ea150b494aaa40robbiew	}
930dc076565f772bb1953209fb69ea150b494aaa40robbiew
945f3786942119704d17da876239c71a125985beccCyril Hrubis	printf("Test PASSED\n");
950dc076565f772bb1953209fb69ea150b494aaa40robbiew
965f3786942119704d17da876239c71a125985beccCyril Hrubis	return PTS_PASS;
97ec6edca7aa42b6affd989ef91b5897f96795e40fChris Dearman}
98