GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: usr.bin/readlink/readlink.c Lines: 19 31 61.3 %
Date: 2016-12-06 Branches: 10 21 47.6 %

Line Branch Exec Source
1
/*
2
 * $OpenBSD: readlink.c,v 1.27 2015/10/09 01:37:08 deraadt Exp $
3
 *
4
 * Copyright (c) 1997
5
 *	Kenneth Stailey (hereinafter referred to as the author)
6
 *
7
 * Redistribution and use in source and binary forms, with or without
8
 * modification, are permitted provided that the following conditions
9
 * are met:
10
 * 1. Redistributions of source code must retain the above copyright
11
 *    notice, this list of conditions and the following disclaimer.
12
 * 2. Redistributions in binary form must reproduce the above copyright
13
 *    notice, this list of conditions and the following disclaimer in the
14
 *    documentation and/or other materials provided with the distribution.
15
 * 3. The name of the author may not be used to endorse or promote products
16
 *    derived from this software without specific prior written permission.
17
 *
18
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
 */
29
30
#include <err.h>
31
#include <errno.h>
32
#include <limits.h>
33
#include <stdio.h>
34
#include <stdlib.h>
35
#include <string.h>
36
#include <unistd.h>
37
38
static void	usage(void);
39
40
int
41
main(int argc, char *argv[])
42
2
{
43
	char buf[PATH_MAX];
44
2
	int n, ch, nflag = 0, fflag = 0;
45
	extern int optind;
46
47
2
	if (pledge("stdio rpath wpath cpath", NULL) == -1)
48
		err(1, "pledge");
49
50
6
	while ((ch = getopt(argc, argv, "fn")) != -1)
51
4
		switch (ch) {
52
		case 'f':
53
2
			fflag = 1;
54
2
			break;
55
		case 'n':
56
2
			nflag = 1;
57
2
			break;
58
		default:
59
			usage();
60
		}
61
2
	argc -= optind;
62
2
	argv += optind;
63
64
2
	if (argc != 1)
65
		usage();
66
67
2
	n = strlen(argv[0]);
68
2
	if (n > PATH_MAX - 1) {
69
		fprintf(stderr,
70
		    "readlink: filename longer than PATH_MAX-1 (%d)\n",
71
		    PATH_MAX - 1);
72
		exit(1);
73
	}
74
75
2
	if (fflag) {
76
2
		if (realpath(argv[0], buf) == NULL)
77
			err(1, "%s", argv[0]);
78
	} else {
79
		if ((n = readlink(argv[0], buf, sizeof buf-1)) < 0)
80
			exit(1);
81
		buf[n] = '\0';
82
	}
83
84
2
	printf("%s", buf);
85
2
	if (!nflag)
86
		putchar('\n');
87
2
	exit(0);
88
}
89
90
static void
91
usage(void)
92
{
93
	(void)fprintf(stderr, "usage: readlink [-fn] file\n");
94
	exit(1);
95
}