xref: /openbsd-src/usr.bin/realpath/realpath.c (revision 9a9b50cee7c3331056b036749cf34a8c922cfe8c)
1 /*	$OpenBSD: realpath.c,v 1.1 2021/10/13 15:04:53 kn Exp $ */
2 /*
3  * Copyright (c) 2021 Klemens Nanni <kn@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 <err.h>
19 #include <limits.h>
20 #include <stdio.h>
21 #include <stdlib.h>
22 #include <unistd.h>
23 
24 void __dead
usage(void)25 usage(void)
26 {
27 	fprintf(stderr, "usage: %s [-q] file\n", getprogname());
28 	exit(1);
29 }
30 
31 int
main(int argc,char * argv[])32 main(int argc, char *argv[])
33 {
34 	int ch, qflag = 0;
35 	char *buf;
36 
37 	if (pledge("stdio rpath", NULL) == -1)
38 		err(1, "pledge");
39 
40 	while ((ch = getopt(argc, argv, "q")) != -1) {
41 		switch (ch) {
42 		case 'q':
43 			qflag = 1;
44 			break;
45 		default:
46 			usage();
47 		}
48 	}
49 	argc -= optind;
50 	argv += optind;
51 	if (argc != 1)
52 		usage();
53 
54 	buf = realpath(argv[0], NULL);
55 	if (buf == NULL) {
56 		if (qflag)
57 			return (1);
58 		err(1, "%s", argv[0]);
59 	}
60 
61 	printf("%s\n", buf);
62 	return (0);
63 }
64