14b88c807SRodney W. Grimes /* 24b88c807SRodney W. Grimes * Copyright (c) 1991, 1993, 1994 34b88c807SRodney W. Grimes * The Regents of the University of California. All rights reserved. 44b88c807SRodney W. Grimes * 54b88c807SRodney W. Grimes * Redistribution and use in source and binary forms, with or without 64b88c807SRodney W. Grimes * modification, are permitted provided that the following conditions 74b88c807SRodney W. Grimes * are met: 84b88c807SRodney W. Grimes * 1. Redistributions of source code must retain the above copyright 94b88c807SRodney W. Grimes * notice, this list of conditions and the following disclaimer. 104b88c807SRodney W. Grimes * 2. Redistributions in binary form must reproduce the above copyright 114b88c807SRodney W. Grimes * notice, this list of conditions and the following disclaimer in the 124b88c807SRodney W. Grimes * documentation and/or other materials provided with the distribution. 134b88c807SRodney W. Grimes * 3. All advertising materials mentioning features or use of this software 144b88c807SRodney W. Grimes * must display the following acknowledgement: 154b88c807SRodney W. Grimes * This product includes software developed by the University of 164b88c807SRodney W. Grimes * California, Berkeley and its contributors. 174b88c807SRodney W. Grimes * 4. Neither the name of the University nor the names of its contributors 184b88c807SRodney W. Grimes * may be used to endorse or promote products derived from this software 194b88c807SRodney W. Grimes * without specific prior written permission. 204b88c807SRodney W. Grimes * 214b88c807SRodney W. Grimes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 224b88c807SRodney W. Grimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 234b88c807SRodney W. Grimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 244b88c807SRodney W. Grimes * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 254b88c807SRodney W. Grimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 264b88c807SRodney W. Grimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 274b88c807SRodney W. Grimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 284b88c807SRodney W. Grimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 294b88c807SRodney W. Grimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 304b88c807SRodney W. Grimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 314b88c807SRodney W. Grimes * SUCH DAMAGE. 324b88c807SRodney W. Grimes */ 334b88c807SRodney W. Grimes 344b88c807SRodney W. Grimes #ifndef lint 3543525740SSteve Price static char const copyright[] = 364b88c807SRodney W. Grimes "@(#) Copyright (c) 1991, 1993, 1994\n\ 374b88c807SRodney W. Grimes The Regents of the University of California. All rights reserved.\n"; 384b88c807SRodney W. Grimes #endif /* not lint */ 394b88c807SRodney W. Grimes 404b88c807SRodney W. Grimes #ifndef lint 41c9a8d1f4SPhilippe Charnier #if 0 42c9a8d1f4SPhilippe Charnier static char sccsid[] = "@(#)pwd.c 8.3 (Berkeley) 4/1/94"; 43c9a8d1f4SPhilippe Charnier #endif 44c9a8d1f4SPhilippe Charnier static const char rcsid[] = 452a456239SPeter Wemm "$FreeBSD$"; 464b88c807SRodney W. Grimes #endif /* not lint */ 474b88c807SRodney W. Grimes 480dd10caeSMike Barcroft #include <sys/param.h> 497a396ef4SMike Barcroft #include <sys/stat.h> 500dd10caeSMike Barcroft #include <sys/types.h> 517a396ef4SMike Barcroft 524b88c807SRodney W. Grimes #include <err.h> 537a396ef4SMike Barcroft #include <errno.h> 544b88c807SRodney W. Grimes #include <stdio.h> 554b88c807SRodney W. Grimes #include <stdlib.h> 564b88c807SRodney W. Grimes #include <unistd.h> 574b88c807SRodney W. Grimes 587a396ef4SMike Barcroft static char *getcwd_logical(void); 5946251ddeSWarner Losh void usage(void); 604b88c807SRodney W. Grimes 614b88c807SRodney W. Grimes int 6246251ddeSWarner Losh main(int argc, char *argv[]) 634b88c807SRodney W. Grimes { 646873c4b7STim J. Robbins int physical; 654b88c807SRodney W. Grimes int ch; 664b88c807SRodney W. Grimes char *p; 677a396ef4SMike Barcroft 686873c4b7STim J. Robbins physical = 0; 697a396ef4SMike Barcroft while ((ch = getopt(argc, argv, "LP")) != -1) 704b88c807SRodney W. Grimes switch (ch) { 717a396ef4SMike Barcroft case 'L': 726873c4b7STim J. Robbins physical = 0; 737a396ef4SMike Barcroft break; 744b88c807SRodney W. Grimes case 'P': 756873c4b7STim J. Robbins physical = 1; 764b88c807SRodney W. Grimes break; 774b88c807SRodney W. Grimes case '?': 784b88c807SRodney W. Grimes default: 794b88c807SRodney W. Grimes usage(); 804b88c807SRodney W. Grimes } 814b88c807SRodney W. Grimes argc -= optind; 824b88c807SRodney W. Grimes argv += optind; 834b88c807SRodney W. Grimes 846873c4b7STim J. Robbins if (argc != 0) 857a396ef4SMike Barcroft usage(); 867a396ef4SMike Barcroft 876873c4b7STim J. Robbins /* 886873c4b7STim J. Robbins * If we're trying to find the logical current directory and that 896873c4b7STim J. Robbins * fails, behave as if -P was specified. 906873c4b7STim J. Robbins */ 916873c4b7STim J. Robbins if ((!physical && (p = getcwd_logical()) != NULL) || 926873c4b7STim J. Robbins (p = getcwd(NULL, 0)) != NULL) 936873c4b7STim J. Robbins printf("%s\n", p); 946873c4b7STim J. Robbins else 95f21a1a10SJordan K. Hubbard err(1, "."); 961082b687SPoul-Henning Kamp 974b88c807SRodney W. Grimes exit(0); 984b88c807SRodney W. Grimes } 994b88c807SRodney W. Grimes 1004b88c807SRodney W. Grimes void 10146251ddeSWarner Losh usage(void) 1024b88c807SRodney W. Grimes { 1034b88c807SRodney W. Grimes 1046873c4b7STim J. Robbins (void)fprintf(stderr, "usage: pwd [-LP]\n"); 1054b88c807SRodney W. Grimes exit(1); 1064b88c807SRodney W. Grimes } 1077a396ef4SMike Barcroft 1087a396ef4SMike Barcroft static char * 1097a396ef4SMike Barcroft getcwd_logical(void) 1107a396ef4SMike Barcroft { 1117a396ef4SMike Barcroft struct stat log, phy; 1127a396ef4SMike Barcroft char *pwd; 1137a396ef4SMike Barcroft 1147a396ef4SMike Barcroft /* 1157a396ef4SMike Barcroft * Check that $PWD is an absolute logical pathname referring to 1167a396ef4SMike Barcroft * the current working directory. 1177a396ef4SMike Barcroft */ 1187a396ef4SMike Barcroft if ((pwd = getenv("PWD")) != NULL && *pwd == '/') { 1197a396ef4SMike Barcroft if (stat(pwd, &log) == -1 || stat(".", &phy) == -1) 1207a396ef4SMike Barcroft return (NULL); 1217a396ef4SMike Barcroft if (log.st_dev == phy.st_dev && log.st_ino == phy.st_ino) 1227a396ef4SMike Barcroft return (pwd); 1237a396ef4SMike Barcroft } 1247a396ef4SMike Barcroft 1257a396ef4SMike Barcroft errno = ENOENT; 1267a396ef4SMike Barcroft return (NULL); 1277a396ef4SMike Barcroft } 128