xref: /openbsd-src/regress/sys/kern/pledge/sockopt/sockopt.c (revision 14d8cbe29cdbb558d73148ddac40b6bddb7715f2)
1*14d8cbe2Sbluhm /*
2*14d8cbe2Sbluhm  * Copyright (c) 2017 Alexander Bluhm <bluhm@openbsd.org>
3*14d8cbe2Sbluhm  *
4*14d8cbe2Sbluhm  * Permission to use, copy, modify, and distribute this software for any
5*14d8cbe2Sbluhm  * purpose with or without fee is hereby granted, provided that the above
6*14d8cbe2Sbluhm  * copyright notice and this permission notice appear in all copies.
7*14d8cbe2Sbluhm  *
8*14d8cbe2Sbluhm  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9*14d8cbe2Sbluhm  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10*14d8cbe2Sbluhm  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11*14d8cbe2Sbluhm  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12*14d8cbe2Sbluhm  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13*14d8cbe2Sbluhm  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14*14d8cbe2Sbluhm  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15*14d8cbe2Sbluhm  */
16*14d8cbe2Sbluhm 
17*14d8cbe2Sbluhm #include <sys/socket.h>
18*14d8cbe2Sbluhm 
19*14d8cbe2Sbluhm #include <netinet/in.h>
20*14d8cbe2Sbluhm #include <netinet/ip.h>
21*14d8cbe2Sbluhm #include <netinet/ip6.h>
22*14d8cbe2Sbluhm #include <netinet/tcp.h>
23*14d8cbe2Sbluhm #include <netinet/udp.h>
24*14d8cbe2Sbluhm #include <netinet/icmp6.h>
25*14d8cbe2Sbluhm 
26*14d8cbe2Sbluhm #include <err.h>
27*14d8cbe2Sbluhm #include <errno.h>
28*14d8cbe2Sbluhm #include <string.h>
29*14d8cbe2Sbluhm #include <unistd.h>
30*14d8cbe2Sbluhm 
31*14d8cbe2Sbluhm int
main(void)32*14d8cbe2Sbluhm main(void)
33*14d8cbe2Sbluhm {
34*14d8cbe2Sbluhm 	char promises[1024];
35*14d8cbe2Sbluhm 	size_t i, l;
36*14d8cbe2Sbluhm 	int s, r;
37*14d8cbe2Sbluhm 	int optval;
38*14d8cbe2Sbluhm 	socklen_t optlen;
39*14d8cbe2Sbluhm 
40*14d8cbe2Sbluhm 	if (strcmp(PROMISES, "0") != 0) {
41*14d8cbe2Sbluhm 		l = strlcpy(promises, "stdio ", sizeof(promises));
42*14d8cbe2Sbluhm 		for (i = 0;
43*14d8cbe2Sbluhm 		    PROMISES[i] != '\0'&& l < sizeof(promises);
44*14d8cbe2Sbluhm 		    i++, l++) {
45*14d8cbe2Sbluhm 			promises[l] = PROMISES[i] == '+' ?
46*14d8cbe2Sbluhm 			    ' ' : PROMISES[i];
47*14d8cbe2Sbluhm 		}
48*14d8cbe2Sbluhm 		if (l >= sizeof(promises))
49*14d8cbe2Sbluhm 			l = sizeof(promises) - 1;
50*14d8cbe2Sbluhm 		promises[l] = '\0';
51*14d8cbe2Sbluhm 		warnx("pledge(%s)", promises);
52*14d8cbe2Sbluhm 		if (pledge(promises, NULL) == -1)
53*14d8cbe2Sbluhm 			err(1, "pledge");
54*14d8cbe2Sbluhm 	}
55*14d8cbe2Sbluhm 
56*14d8cbe2Sbluhm 	if ((s = socket(DOMAIN, TYPE, PROTOCOL)) == -1)
57*14d8cbe2Sbluhm 		err(1, "socket");
58*14d8cbe2Sbluhm 	optlen = sizeof(int);
59*14d8cbe2Sbluhm 	if (strcmp(CALL, "set") == 0) {
60*14d8cbe2Sbluhm 		optval = OPTVAL;
61*14d8cbe2Sbluhm 		r = setsockopt(s, LEVEL, OPTNAME, &optval, optlen);
62*14d8cbe2Sbluhm 	} else if (strcmp(CALL, "get") == 0) {
63*14d8cbe2Sbluhm 		optval = 0;
64*14d8cbe2Sbluhm 		r = getsockopt(s, LEVEL, OPTNAME, &optval, &optlen);
65*14d8cbe2Sbluhm 	} else {
66*14d8cbe2Sbluhm 		errx(1, "call: %s", CALL);
67*14d8cbe2Sbluhm 	}
68*14d8cbe2Sbluhm 	if (r == 0) {
69*14d8cbe2Sbluhm 		if (ERRNO != 0)
70*14d8cbe2Sbluhm 			errx(1, "success");
71*14d8cbe2Sbluhm 	} else if (r == -1) {
72*14d8cbe2Sbluhm 		if (errno != ERRNO)
73*14d8cbe2Sbluhm 			err(1, "error");
74*14d8cbe2Sbluhm 	} else {
75*14d8cbe2Sbluhm 		errx(1, "return: %d", r);
76*14d8cbe2Sbluhm 	}
77*14d8cbe2Sbluhm 	if (optval != OPTVAL)
78*14d8cbe2Sbluhm 		errx(1, "optval: %d", optval);
79*14d8cbe2Sbluhm 
80*14d8cbe2Sbluhm 	return (0);
81*14d8cbe2Sbluhm }
82