1*f67b7b8dSSebastian Wiedenroth /*
2*f67b7b8dSSebastian Wiedenroth  * This file and its contents are supplied under the terms of the
3*f67b7b8dSSebastian Wiedenroth  * Common Development and Distribution License ("CDDL"), version 1.0.
4*f67b7b8dSSebastian Wiedenroth  * You may only use this file in accordance with the terms of version
5*f67b7b8dSSebastian Wiedenroth  * 1.0 of the CDDL.
6*f67b7b8dSSebastian Wiedenroth  *
7*f67b7b8dSSebastian Wiedenroth  * A full copy of the text of the CDDL should have accompanied this
8*f67b7b8dSSebastian Wiedenroth  * source.  A copy of the CDDL is also available via the Internet at
9*f67b7b8dSSebastian Wiedenroth  * http://www.illumos.org/license/CDDL.
10*f67b7b8dSSebastian Wiedenroth  */
11*f67b7b8dSSebastian Wiedenroth 
12*f67b7b8dSSebastian Wiedenroth /*
13*f67b7b8dSSebastian Wiedenroth  * Copyright 2017 Sebastian Wiedenroth
14*f67b7b8dSSebastian Wiedenroth  */
15*f67b7b8dSSebastian Wiedenroth 
16*f67b7b8dSSebastian Wiedenroth /*
17*f67b7b8dSSebastian Wiedenroth  * Test for MSG_NOSIGNAL flag.
18*f67b7b8dSSebastian Wiedenroth  */
19*f67b7b8dSSebastian Wiedenroth 
20*f67b7b8dSSebastian Wiedenroth 
21*f67b7b8dSSebastian Wiedenroth #include <unistd.h>
22*f67b7b8dSSebastian Wiedenroth #include <signal.h>
23*f67b7b8dSSebastian Wiedenroth #include <stdio.h>
24*f67b7b8dSSebastian Wiedenroth #include <sys/types.h>
25*f67b7b8dSSebastian Wiedenroth #include <sys/socket.h>
26*f67b7b8dSSebastian Wiedenroth #include <arpa/inet.h>
27*f67b7b8dSSebastian Wiedenroth #include <errno.h>
28*f67b7b8dSSebastian Wiedenroth #include <assert.h>
29*f67b7b8dSSebastian Wiedenroth 
30*f67b7b8dSSebastian Wiedenroth /* allow the test to build and fail */
31*f67b7b8dSSebastian Wiedenroth #ifndef MSG_NOSIGNAL
32*f67b7b8dSSebastian Wiedenroth #define	MSG_NOSIGNAL 0
33*f67b7b8dSSebastian Wiedenroth #endif
34*f67b7b8dSSebastian Wiedenroth 
35*f67b7b8dSSebastian Wiedenroth volatile sig_atomic_t sigcount = 0;
36*f67b7b8dSSebastian Wiedenroth 
37*f67b7b8dSSebastian Wiedenroth void
sigpipe_h(int sig0)38*f67b7b8dSSebastian Wiedenroth sigpipe_h(int sig0)
39*f67b7b8dSSebastian Wiedenroth {
40*f67b7b8dSSebastian Wiedenroth 	sigcount++;
41*f67b7b8dSSebastian Wiedenroth 	signal(SIGPIPE, sigpipe_h);
42*f67b7b8dSSebastian Wiedenroth }
43*f67b7b8dSSebastian Wiedenroth 
44*f67b7b8dSSebastian Wiedenroth int
main()45*f67b7b8dSSebastian Wiedenroth main()
46*f67b7b8dSSebastian Wiedenroth {
47*f67b7b8dSSebastian Wiedenroth 	signal(SIGPIPE, sigpipe_h);
48*f67b7b8dSSebastian Wiedenroth 
49*f67b7b8dSSebastian Wiedenroth 	int len = 0;
50*f67b7b8dSSebastian Wiedenroth 	const char *msg = "hello illumos";
51*f67b7b8dSSebastian Wiedenroth 
52*f67b7b8dSSebastian Wiedenroth 	struct sockaddr_in sin;
53*f67b7b8dSSebastian Wiedenroth 	sin.sin_family = AF_INET;
54*f67b7b8dSSebastian Wiedenroth 	sin.sin_addr.s_addr = inet_addr("127.0.0.1");
55*f67b7b8dSSebastian Wiedenroth 	sin.sin_port = htons(4242);
56*f67b7b8dSSebastian Wiedenroth 
57*f67b7b8dSSebastian Wiedenroth 	int s = socket(PF_INET, SOCK_STREAM, 0);
58*f67b7b8dSSebastian Wiedenroth 	int c = socket(PF_INET, SOCK_STREAM, 0);
59*f67b7b8dSSebastian Wiedenroth 	assert(s >= 0 && c >= 0);
60*f67b7b8dSSebastian Wiedenroth 
61*f67b7b8dSSebastian Wiedenroth 	assert(bind(s, (struct sockaddr *)&sin, sizeof (sin)) >= 0);
62*f67b7b8dSSebastian Wiedenroth 	assert(listen(s, 3) >= 0);
63*f67b7b8dSSebastian Wiedenroth 	assert(connect(c, (struct sockaddr *)&sin, sizeof (sin)) >= 0);
64*f67b7b8dSSebastian Wiedenroth 	assert(close(s) == 0);
65*f67b7b8dSSebastian Wiedenroth 
66*f67b7b8dSSebastian Wiedenroth 	assert(MSG_NOSIGNAL > 0);
67*f67b7b8dSSebastian Wiedenroth 	assert(sigcount == 0);
68*f67b7b8dSSebastian Wiedenroth 
69*f67b7b8dSSebastian Wiedenroth 	/* test failure with signal */
70*f67b7b8dSSebastian Wiedenroth 	len = send(c, msg, strlen(msg), 0);
71*f67b7b8dSSebastian Wiedenroth 	assert(len == -1 && errno == EPIPE);
72*f67b7b8dSSebastian Wiedenroth 	sleep(1);
73*f67b7b8dSSebastian Wiedenroth 	assert(sigcount == 1);
74*f67b7b8dSSebastian Wiedenroth 
75*f67b7b8dSSebastian Wiedenroth 	/* test failure without signal */
76*f67b7b8dSSebastian Wiedenroth 	len = send(c, msg, strlen(msg), MSG_NOSIGNAL);
77*f67b7b8dSSebastian Wiedenroth 	assert(len == -1 && errno == EPIPE);
78*f67b7b8dSSebastian Wiedenroth 	sleep(1);
79*f67b7b8dSSebastian Wiedenroth 	assert(sigcount == 1);
80*f67b7b8dSSebastian Wiedenroth 
81*f67b7b8dSSebastian Wiedenroth 	assert(close(c) == 0);
82*f67b7b8dSSebastian Wiedenroth 	return (0);
83*f67b7b8dSSebastian Wiedenroth }
84