Upgrading pwd

Change-Id: I3bab8335ac58f2d0af20c5cee4b772b1175c2ede
This commit is contained in:
Lionel Sambuc 2013-01-30 18:57:00 +01:00
parent 5debab0eb0
commit 06f3970b9e
10 changed files with 260 additions and 82 deletions

View file

@ -2,6 +2,6 @@
# @(#)Makefile 8.1 (Berkeley) 5/31/93
SUBDIR= cat date echo ed expr \
mkdir pax rm rmdir test
mkdir pax pwd rm rmdir test
.include <bsd.subdir.mk>

6
bin/pwd/Makefile Normal file
View file

@ -0,0 +1,6 @@
# $NetBSD: Makefile,v 1.8 1997/07/20 22:37:41 christos Exp $
# @(#)Makefile 8.1 (Berkeley) 5/31/93
PROG= pwd
.include <bsd.prog.mk>

107
bin/pwd/pwd.1 Normal file
View file

@ -0,0 +1,107 @@
.\" $NetBSD: pwd.1,v 1.24 2003/10/30 14:58:23 wiz Exp $
.\"
.\" Copyright (c) 1990, 1993
.\" The Regents of the University of California. All rights reserved.
.\"
.\" This code is derived from software contributed to Berkeley by
.\" the Institute of Electrical and Electronics Engineers, Inc.
.\"
.\" Redistribution and use in source and binary forms, with or without
.\" modification, are permitted provided that the following conditions
.\" are met:
.\" 1. Redistributions of source code must retain the above copyright
.\" notice, this list of conditions and the following disclaimer.
.\" 2. Redistributions in binary form must reproduce the above copyright
.\" notice, this list of conditions and the following disclaimer in the
.\" documentation and/or other materials provided with the distribution.
.\" 3. Neither the name of the University nor the names of its contributors
.\" may be used to endorse or promote products derived from this software
.\" without specific prior written permission.
.\"
.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
.\" @(#)pwd.1 8.2 (Berkeley) 4/28/95
.\"
.Dd October 30, 2003
.Dt PWD 1
.Os
.Sh NAME
.Nm pwd
.Nd return working directory name
.Sh SYNOPSIS
.Nm
.Op Fl LP
.Sh DESCRIPTION
.Nm
writes the absolute pathname of the current working directory to
the standard output.
.Pp
The following options are available:
.Bl -tag -width indent
.It Fl L
If the
.Ev PWD
environment variable is an absolute pathname that contains
neither "/./" nor "/../" and references the current directory, then
.Ev PWD
is assumed to be the name of the current directory.
.It Fl P
Print the physical path to the current working directory, with symbolic
links in the path resolved.
.El
.Pp
The default for the
.Nm
command is
.Fl P .
.Pp
.Nm
is usually provided as a shell builtin (which may have a different
default).
.Sh EXIT STATUS
The
.Nm
utility exits 0 on success, and \*[Gt]0 if an error occurs.
.Sh SEE ALSO
.Xr cd 1 ,
.Xr csh 1 ,
.Xr ksh 1 ,
.Xr sh 1 ,
.Xr getcwd 3
.Sh STANDARDS
The
.Nm
utility is expected to be conforming to
.St -p1003.1 ,
except that the default is
.Fl P
not
.Fl L .
.Sh BUGS
In
.Xr csh 1
the command
.Ic dirs
is always faster (although it can give a different answer in the rare case
that the current directory or a containing directory was moved after
the shell descended into it).
.Pp
.Nm
.Fl L
relies on the file system having unique inode numbers.
If this is not true (e.g., on FAT file systems) then
.Nm
.Fl L
may fail to detect that
.Ev PWD
is incorrect.

143
bin/pwd/pwd.c Normal file
View file

@ -0,0 +1,143 @@
/* $NetBSD: pwd.c,v 1.22 2011/08/29 14:51:19 joerg Exp $ */
/*
* Copyright (c) 1991, 1993, 1994
* The Regents of the University of California. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#include <sys/cdefs.h>
#ifndef lint
__COPYRIGHT("@(#) Copyright (c) 1991, 1993, 1994\
The Regents of the University of California. All rights reserved.");
#endif /* not lint */
#ifndef lint
#if 0
static char sccsid[] = "@(#)pwd.c 8.3 (Berkeley) 4/1/94";
#else
__RCSID("$NetBSD: pwd.c,v 1.22 2011/08/29 14:51:19 joerg Exp $");
#endif
#endif /* not lint */
#include <sys/param.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <err.h>
#include <errno.h>
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
static char *getcwd_logical(void);
__dead static void usage(void);
/*
* Note that EEE Std 1003.1, 2003 requires that the default be -L.
* This is inconsistent with the historic behaviour of everything
* except the ksh builtin.
* To avoid breaking scripts the default has been kept as -P.
* (Some scripts run /bin/pwd in order to get 'pwd -P'.)
*/
int
main(int argc, char *argv[])
{
int ch, lFlag;
const char *p;
setprogname(argv[0]);
(void)setlocale(LC_ALL, "");
lFlag = 0;
while ((ch = getopt(argc, argv, "LP")) != -1) {
switch (ch) {
case 'L':
lFlag = 1;
break;
case 'P':
lFlag = 0;
break;
case '?':
default:
usage();
}
}
argc -= optind;
argv += optind;
if (argc != 0)
usage();
if (lFlag)
p = getcwd_logical();
else
p = NULL;
if (p == NULL)
p = getcwd(NULL, 0);
if (p == NULL)
err(EXIT_FAILURE, NULL);
(void)printf("%s\n", p);
exit(EXIT_SUCCESS);
/* NOTREACHED */
}
static char *
getcwd_logical(void)
{
char *pwd;
struct stat s_pwd, s_dot;
/* Check $PWD -- if it's right, it's fast. */
pwd = getenv("PWD");
if (pwd == NULL)
return NULL;
if (pwd[0] != '/')
return NULL;
if (strstr(pwd, "/./") != NULL)
return NULL;
if (strstr(pwd, "/../") != NULL)
return NULL;
if (stat(pwd, &s_pwd) == -1 || stat(".", &s_dot) == -1)
return NULL;
if (s_pwd.st_dev != s_dot.st_dev || s_pwd.st_ino != s_dot.st_ino)
return NULL;
return pwd;
}
static void
usage(void)
{
(void)fprintf(stderr, "usage: %s [-LP]\n", getprogname());
exit(EXIT_FAILURE);
/* NOTREACHED */
}

View file

@ -19,7 +19,7 @@ SUBDIR= add_route arp ash at backup banner basename btrace cal \
mount mt netconf nice acknm nohup \
nonamed od paste patch \
ping postinstall poweroff pr prep printroot \
profile progressbar pr_routes ps pwd pwdauth \
profile progressbar pr_routes ps pwdauth \
ramdisk rarpd rawspeed rcp rdate readclock \
reboot remsync rev rget rlogin \
rotate rsh rshd service setup shar acksize \

View file

@ -1,5 +0,0 @@
PROG= pwd
BINDIR= /bin
MAN=
.include <bsd.prog.mk>

View file

@ -1,49 +0,0 @@
/* pwd - print working directory Author: Norbert Schlenker */
/*
* pwd - print working directory
* Syntax: pwd
* Flags: None.
* Author: Norbert Schlenker
* Copyright: None. Released to the public domain.
* Reference: IEEE P1003.2 Section 4.50 (draft 10)
* Bugs: No internationalization support; all messages are in English.
*/
/* Force visible Posix names */
#ifndef _POSIX_SOURCE
#define _POSIX_SOURCE 1
#endif
/* External interfaces */
#include <sys/types.h>
#include <limits.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <stdio.h>
/* Magic numbers suggested or required by Posix specification */
#define SUCCESS 0 /* exit code in case of success */
#define FAILURE 1 /* or failure */
int main(void);
static char dir[PATH_MAX + 1];
static char *errmsg = "pwd: cannot search some directory on the path\n";
int main()
{
char *p;
size_t n;
p = getcwd(dir, PATH_MAX);
if (p == NULL) {
write(STDERR_FILENO, errmsg, strlen(errmsg));
exit(FAILURE);
}
n = strlen(p);
p[n] = '\n';
if (write(STDOUT_FILENO, p, n + 1) != n + 1) exit(FAILURE);
return(SUCCESS);
}

View file

@ -13,7 +13,7 @@ MAN= ash.1 at.1 banner.1 basename.1 \
mesg.1 mixer.1 mkfs.mfs.1 \
mkproto.1 mount.1 mt.1 nice.1 nm.1 nohup.1 od.1 \
paste.1 ping.1 playwave.1 pr.1 prep.1 \
profile.1 ps.1 pwd.1 rcp.1 recwave.1 \
profile.1 ps.1 rcp.1 recwave.1 \
remsync.1 rget.1 rlogin.1 rsh.1 rz.1 \
shar.1 acksize.1 sleep.1 spell.1 \
split.1 stty.1 svc.1 svrctl.1 \

View file

@ -1,25 +0,0 @@
.TH PWD 1
.SH NAME
pwd \- print working directory
.SH SYNOPSIS
\fBpwd\fR
.br
.de FL
.TP
\\fB\\$1\\fR
\\$2
..
.de EX
.TP 20
\\fB\\$1\\fR
# \\$2
..
.SH EXAMPLES
.TP 20
.B pwd
# Print the name of the working directory
.SH DESCRIPTION
.PP
The full path name of the current working directory is printed.
.SH "SEE ALSO"
.BR getcwd (3).

View file

@ -15,6 +15,7 @@
2012/10/17 12:00:00,bin/Makefile.inc
2008/07/20 00:52:40,bin/mkdir
2012/10/17 12:00:00,bin/pax
2012/10/17 12:00:00,bin/pwd
2011/08/29 14:48:46,bin/rm
2011/08/29 14:49:38,bin/rmdir
2012/10/17 12:00:00,bin/test