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