realpath(1): Sync with FreeBSD to add -q option
authorJohn Marino <draco@marino.st>
Fri, 11 Oct 2013 20:12:25 +0000 (22:12 +0200)
committerJohn Marino <draco@marino.st>
Fri, 11 Oct 2013 23:29:27 +0000 (01:29 +0200)
If -q is specified, warnings will not be printed out when realpath(3) fails.

bin/realpath/realpath.1
bin/realpath/realpath.c

index ffa20e3..cc57f96 100644 (file)
@@ -1,3 +1,4 @@
+.\"-
 .\" Copyright (c) 1990, 1993
 .\"    The Regents of the University of California.  All rights reserved.
 .\"
 .\"
 .\"     @(#)pwd.1      8.2 (Berkeley) 4/28/95
 .\" From: src/bin/pwd/pwd.1,v 1.11 2000/11/20 11:39:39 ru Exp
-.\" $FreeBSD: src/bin/pwd/realpath.1,v 1.2.2.3 2001/08/16 10:01:07 ru Exp $
-.\" $DragonFly: src/bin/pwd/realpath.1,v 1.2 2003/06/17 04:22:50 dillon Exp $
+.\" $FreeBSD: head/bin/realpath/realpath.1 223372 2011-06-21 19:34:57Z ru $
 .\"
-.Dd November 24, 2000
+.Dd June 21, 2011
 .Dt REALPATH 1
 .Os
 .Sh NAME
 .Nd return resolved physical path
 .Sh SYNOPSIS
 .Nm
-.Ar path
+.Op Fl q
+.Op Ar path ...
 .Sh DESCRIPTION
+The
 .Nm
-uses the
+utility uses the
 .Xr realpath 3
 function to resolve all symbolic links, extra
 .Ql /
@@ -54,6 +56,17 @@ and
 .Pa /../
 in
 .Ar path .
+If
+.Ar path
+is absent, the current working directory
+.Pq Sq Pa .\&
+is assumed.
+.Pp
+If
+.Fl q
+is specified, warnings will not be printed when
+.Xr realpath 3
+fails.
 .Sh EXIT STATUS
 .Ex -std
 .Sh SEE ALSO
index f69dd03..4421469 100644 (file)
@@ -1,4 +1,4 @@
-/*
+/*-
  * Copyright (c) 1991, 1993, 1994
  *     The Regents of the University of California.  All rights reserved.
  *
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * @(#) Copyright (c) 1991, 1993, 1994 The Regents of the University of California.  All rights reserved.
- * @(#)pwd.c   8.3 (Berkeley) 4/1/94
- * $FreeBSD: src/bin/pwd/pwd.c,v 1.9.2.3 2002/06/17 11:04:22 tjr Exp $
+ * $FreeBSD: head/bin/realpath/realpath.c 223372 2011-06-21 19:34:57Z ru $
  */
 
+
 #include <sys/param.h>
-#include <sys/types.h>
-#include <sys/stat.h>
 
 #include <err.h>
-#include <errno.h>
-#include <limits.h>
 #include <stdio.h>
 #include <stdlib.h>
-#include <string.h>
 #include <unistd.h>
 
-static char    *getcwd_logical(void);
-static void    usage(void);
+static void usage(void) __dead2;
 
 int
 main(int argc, char *argv[])
 {
-       int physical;
-       int ch;
-       char *p;
        char buf[PATH_MAX];
+       char *p;
+       const char *path;
+       int ch, qflag, rval;
 
-       if (argc != 2)
-               usage();
-       if ((p = realpath(argv[1], buf)) == NULL)
-               err(1, "%s", argv[1]);
-       printf("%s\n", p);
-       exit(0);
-
-       physical = 1;
-       while ((ch = getopt(argc, argv, "LP")) != -1)
+       qflag = 0;
+       while ((ch = getopt(argc, argv, "q")) != -1) {
                switch (ch) {
-               case 'L':
-                       physical = 0;
-                       break;
-               case 'P':
-                       physical = 1;
+               case 'q':
+                       qflag = 1;
                        break;
                case '?':
                default:
                        usage();
                }
+       }
        argc -= optind;
        argv += optind;
-
-       if (argc != 0)
-               usage();
-
-       /*
-        * If we're trying to find the logical current directory and that
-        * fails, behave as if -P was specified.
-        */
-       if ((!physical && (p = getcwd_logical()) != NULL) ||
-           (p = getcwd(NULL, 0)) != NULL)
-               printf("%s\n", p);
-       else
-               err(1, ".");
-
-       exit(0);
+       path = *argv != NULL ? *argv++ : ".";
+       rval  = 0;
+       do {
+               if ((p = realpath(path, buf)) == NULL) {
+                       if (!qflag)
+                               warn("%s", path);
+                       rval = 1;
+               } else
+                       (void)printf("%s\n", p);
+       } while ((path = *argv++) != NULL);
+       exit(rval);
 }
 
 static void
 usage(void)
 {
-       if (strcmp(getprogname(), "realpath") == 0)
-               fprintf(stderr, "usage: realpath [path]\n");
-       exit(1);
-}
-
-static char *
-getcwd_logical(void)
-{
-       struct stat logic, phy;
-       char *pwd;
-
-       /*
-        * Check that $PWD is an absolute logical pathname referring to
-        * the current working directory.
-        */
-       if ((pwd = getenv("PWD")) != NULL && *pwd == '/') {
-               if (stat(pwd, &logic) == -1 || stat(".", &phy) == -1)
-                       return (NULL);
-               if (logic.st_dev == phy.st_dev && logic.st_ino == phy.st_ino)
-                       return (pwd);
-       }
 
-       errno = ENOENT;
-       return (NULL);
+       (void)fprintf(stderr, "usage: realpath [-q] [path ...]\n");
+       exit(1);
 }