xref: /openbsd-src/usr.bin/realpath/realpath.c (revision 9a9b50cee7c3331056b036749cf34a8c922cfe8c)
1*9a9b50ceSkn /*	$OpenBSD: realpath.c,v 1.1 2021/10/13 15:04:53 kn Exp $ */
2*9a9b50ceSkn /*
3*9a9b50ceSkn  * Copyright (c) 2021 Klemens Nanni <kn@openbsd.org>
4*9a9b50ceSkn  *
5*9a9b50ceSkn  * Permission to use, copy, modify, and distribute this software for any
6*9a9b50ceSkn  * purpose with or without fee is hereby granted, provided that the above
7*9a9b50ceSkn  * copyright notice and this permission notice appear in all copies.
8*9a9b50ceSkn  *
9*9a9b50ceSkn  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10*9a9b50ceSkn  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11*9a9b50ceSkn  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12*9a9b50ceSkn  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13*9a9b50ceSkn  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14*9a9b50ceSkn  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15*9a9b50ceSkn  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16*9a9b50ceSkn  */
17*9a9b50ceSkn 
18*9a9b50ceSkn #include <err.h>
19*9a9b50ceSkn #include <limits.h>
20*9a9b50ceSkn #include <stdio.h>
21*9a9b50ceSkn #include <stdlib.h>
22*9a9b50ceSkn #include <unistd.h>
23*9a9b50ceSkn 
24*9a9b50ceSkn void __dead
usage(void)25*9a9b50ceSkn usage(void)
26*9a9b50ceSkn {
27*9a9b50ceSkn 	fprintf(stderr, "usage: %s [-q] file\n", getprogname());
28*9a9b50ceSkn 	exit(1);
29*9a9b50ceSkn }
30*9a9b50ceSkn 
31*9a9b50ceSkn int
main(int argc,char * argv[])32*9a9b50ceSkn main(int argc, char *argv[])
33*9a9b50ceSkn {
34*9a9b50ceSkn 	int ch, qflag = 0;
35*9a9b50ceSkn 	char *buf;
36*9a9b50ceSkn 
37*9a9b50ceSkn 	if (pledge("stdio rpath", NULL) == -1)
38*9a9b50ceSkn 		err(1, "pledge");
39*9a9b50ceSkn 
40*9a9b50ceSkn 	while ((ch = getopt(argc, argv, "q")) != -1) {
41*9a9b50ceSkn 		switch (ch) {
42*9a9b50ceSkn 		case 'q':
43*9a9b50ceSkn 			qflag = 1;
44*9a9b50ceSkn 			break;
45*9a9b50ceSkn 		default:
46*9a9b50ceSkn 			usage();
47*9a9b50ceSkn 		}
48*9a9b50ceSkn 	}
49*9a9b50ceSkn 	argc -= optind;
50*9a9b50ceSkn 	argv += optind;
51*9a9b50ceSkn 	if (argc != 1)
52*9a9b50ceSkn 		usage();
53*9a9b50ceSkn 
54*9a9b50ceSkn 	buf = realpath(argv[0], NULL);
55*9a9b50ceSkn 	if (buf == NULL) {
56*9a9b50ceSkn 		if (qflag)
57*9a9b50ceSkn 			return (1);
58*9a9b50ceSkn 		err(1, "%s", argv[0]);
59*9a9b50ceSkn 	}
60*9a9b50ceSkn 
61*9a9b50ceSkn 	printf("%s\n", buf);
62*9a9b50ceSkn 	return (0);
63*9a9b50ceSkn }
64