realpath.c revision 1.1
11.1Skamil/*	$NetBSD: realpath.c,v 1.1 2020/02/02 21:49:44 kamil Exp $	*/
21.1Skamil/*-
31.1Skamil * SPDX-License-Identifier: BSD-3-Clause
41.1Skamil *
51.1Skamil * Copyright (c) 1991, 1993, 1994
61.1Skamil *	The Regents of the University of California.  All rights reserved.
71.1Skamil *
81.1Skamil * Redistribution and use in source and binary forms, with or without
91.1Skamil * modification, are permitted provided that the following conditions
101.1Skamil * are met:
111.1Skamil * 1. Redistributions of source code must retain the above copyright
121.1Skamil *    notice, this list of conditions and the following disclaimer.
131.1Skamil * 2. Redistributions in binary form must reproduce the above copyright
141.1Skamil *    notice, this list of conditions and the following disclaimer in the
151.1Skamil *    documentation and/or other materials provided with the distribution.
161.1Skamil * 3. Neither the name of the University nor the names of its contributors
171.1Skamil *    may be used to endorse or promote products derived from this software
181.1Skamil *    without specific prior written permission.
191.1Skamil *
201.1Skamil * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
211.1Skamil * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
221.1Skamil * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
231.1Skamil * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
241.1Skamil * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
251.1Skamil * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
261.1Skamil * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
271.1Skamil * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
281.1Skamil * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
291.1Skamil * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
301.1Skamil * SUCH DAMAGE.
311.1Skamil */
321.1Skamil
331.1Skamil#include <sys/cdefs.h>
341.1Skamil#if !defined(lint)
351.1Skamil#if 0
361.1Skamil__FBSDID("$FreeBSD: head/bin/realpath/realpath.c 326025 2017-11-20 19:49:47Z pfg $");
371.1Skamil#else
381.1Skamil__RCSID("$NetBSD: realpath.c,v 1.1 2020/02/02 21:49:44 kamil Exp $");
391.1Skamil#endif
401.1Skamil#endif /* not lint */
411.1Skamil
421.1Skamil#include <sys/param.h>
431.1Skamil
441.1Skamil#include <err.h>
451.1Skamil#include <stdio.h>
461.1Skamil#include <stdlib.h>
471.1Skamil#include <unistd.h>
481.1Skamil
491.1Skamilstatic void usage(void) __dead;
501.1Skamil
511.1Skamilint
521.1Skamilmain(int argc, char *argv[])
531.1Skamil{
541.1Skamil	char buf[PATH_MAX];
551.1Skamil	char *p;
561.1Skamil	const char *path;
571.1Skamil	int ch, qflag, rval;
581.1Skamil
591.1Skamil	setprogname(argv[0]);
601.1Skamil
611.1Skamil	qflag = 0;
621.1Skamil	while ((ch = getopt(argc, argv, "q")) != -1) {
631.1Skamil		switch (ch) {
641.1Skamil		case 'q':
651.1Skamil			qflag = 1;
661.1Skamil			break;
671.1Skamil		case '?':
681.1Skamil		default:
691.1Skamil			usage();
701.1Skamil		}
711.1Skamil	}
721.1Skamil	argc -= optind;
731.1Skamil	argv += optind;
741.1Skamil	path = *argv != NULL ? *argv++ : ".";
751.1Skamil	rval  = 0;
761.1Skamil	do {
771.1Skamil		if ((p = realpath(path, buf)) == NULL) {
781.1Skamil			if (!qflag)
791.1Skamil				warn("%s", path);
801.1Skamil			rval = 1;
811.1Skamil		} else
821.1Skamil			(void)printf("%s\n", p);
831.1Skamil	} while ((path = *argv++) != NULL);
841.1Skamil	exit(rval);
851.1Skamil}
861.1Skamil
871.1Skamilstatic void
881.1Skamilusage(void)
891.1Skamil{
901.1Skamil
911.1Skamil	(void)fprintf(stderr, "usage: %s [-q] [path ...]\n", getprogname());
921.1Skamil  	exit(1);
931.1Skamil}
94