1 /*	$OpenBSD: execpromise.c,v 1.2 2021/12/13 18:04:28 deraadt Exp $	*/
2 /*
3  * Copyright (c) 2017 Florian Obser <florian@openbsd.org>
4  *
5  * Permission to use, copy, modify, and distribute this software for any
6  * purpose with or without fee is hereby granted, provided that the above
7  * copyright notice and this permission notice appear in all copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16  */
17 
18 #include <sys/types.h>
19 #include <sys/socket.h>
20 
21 #include <err.h>
22 #include <errno.h>
23 #include <stdio.h>
24 #include <stdlib.h>
25 #include <unistd.h>
26 
27 int
28 main(int argc, char **argv)
29 {
30 	int ch, child = 0, s;
31 	char **oargv = argv;
32 
33 	while ((ch = getopt(argc, argv, "C")) != -1) {
34 		switch (ch) {
35 		case 'C':
36 			child = 1;
37 			break;
38 		default:
39 			errx(1, "");
40 		}
41 	}
42 	argc -= optind;
43 	argv += optind;
44 
45 	if (child ==1) {
46 		warnx("child");
47 		if (argc > 1)
48 			errx(1, "argc: %d", argc);
49 		if (argc == 1) {
50 			warnx("plege(\"%s\",\"\")", argv[0]);
51 			if (pledge(argv[0], "") == -1)
52 				err(24, "child pledge");
53 		}
54 
55 		warnx("trying to open socket");
56 
57 		s = socket(AF_INET, SOCK_DGRAM, 0);
58 		if (s == -1)
59 			err(23, "open");
60 		else
61 			warnx("opened socket");
62 
63 		close(s);
64 		exit(0);
65 	} else {
66 		warnx("parent");
67 		if (argc == 2)
68 			warnx("execpromise: \"%s\", child pledge: \"%s\"",
69 			    argv[0], argv[1]);
70 		else if (argc == 1)
71 			warnx("execpromise: \"%s\"", argv[0]);
72 		else
73 			errx(1, "argc out of range");
74 
75 		if (pledge("stdio exec", argv[0]) == -1)
76 			err(1, "parent pledge");
77 
78 		oargv[1] = "-C";
79 		execvp(oargv[0], &oargv[0]);
80 		err((errno == ENOENT) ? 127 : 126, "%s", argv[0]);
81 	}
82 }
83