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 487a396ef4SMike Barcroft #include <sys/types.h> 497a396ef4SMike Barcroft #include <sys/stat.h> 507a396ef4SMike Barcroft 514b88c807SRodney W. Grimes #include <err.h> 527a396ef4SMike Barcroft #include <errno.h> 5391a086eaSWarner Losh #include <limits.h> 544b88c807SRodney W. Grimes #include <stdio.h> 554b88c807SRodney W. Grimes #include <stdlib.h> 564b88c807SRodney W. Grimes #include <unistd.h> 571082b687SPoul-Henning Kamp #include <sys/param.h> 584b88c807SRodney W. Grimes 597a396ef4SMike Barcroft extern char *__progname; 607a396ef4SMike Barcroft 617a396ef4SMike Barcroft static char *getcwd_logical(void); 6246251ddeSWarner Losh void usage(void); 634b88c807SRodney W. Grimes 644b88c807SRodney W. Grimes int 6546251ddeSWarner Losh main(int argc, char *argv[]) 664b88c807SRodney W. Grimes { 677a396ef4SMike Barcroft int Lflag, Pflag; 684b88c807SRodney W. Grimes int ch; 694b88c807SRodney W. Grimes char *p; 7091a086eaSWarner Losh char buf[PATH_MAX]; 714b88c807SRodney W. Grimes 727a396ef4SMike Barcroft if (strcmp(__progname, "realpath") == 0) { 737a396ef4SMike Barcroft if (argc != 2) 747a396ef4SMike Barcroft usage(); 757a396ef4SMike Barcroft if ((p = realpath(argv[1], buf)) == NULL) 767a396ef4SMike Barcroft err(1, "%s", argv[1]); 777a396ef4SMike Barcroft (void)printf("%s\n", p); 787a396ef4SMike Barcroft exit(0); 797a396ef4SMike Barcroft } 807a396ef4SMike Barcroft 817a396ef4SMike Barcroft Lflag = Pflag = 0; 827a396ef4SMike Barcroft while ((ch = getopt(argc, argv, "LP")) != -1) 834b88c807SRodney W. Grimes switch (ch) { 847a396ef4SMike Barcroft case 'L': 857a396ef4SMike Barcroft Lflag = 1; 867a396ef4SMike Barcroft break; 874b88c807SRodney W. Grimes case 'P': 887a396ef4SMike Barcroft Pflag = 1; 894b88c807SRodney W. Grimes break; 904b88c807SRodney W. Grimes case '?': 914b88c807SRodney W. Grimes default: 924b88c807SRodney W. Grimes usage(); 934b88c807SRodney W. Grimes } 944b88c807SRodney W. Grimes argc -= optind; 954b88c807SRodney W. Grimes argv += optind; 964b88c807SRodney W. Grimes 977a396ef4SMike Barcroft if (argc != 0 || (Lflag && Pflag)) 987a396ef4SMike Barcroft usage(); 997a396ef4SMike Barcroft 1007a396ef4SMike Barcroft p = Lflag ? getcwd_logical() : getcwd(NULL, 0); 1011082b687SPoul-Henning Kamp if (p == NULL) 102f21a1a10SJordan K. Hubbard err(1, "."); 1034b88c807SRodney W. Grimes (void)printf("%s\n", p); 1041082b687SPoul-Henning Kamp 1054b88c807SRodney W. Grimes exit(0); 1064b88c807SRodney W. Grimes } 1074b88c807SRodney W. Grimes 1084b88c807SRodney W. Grimes void 10946251ddeSWarner Losh usage(void) 1104b88c807SRodney W. Grimes { 1114b88c807SRodney W. Grimes 1127a396ef4SMike Barcroft if (strcmp(__progname, "realpath") == 0) 1137a396ef4SMike Barcroft (void)fprintf(stderr, "usage: realpath [path]\n"); 1147a396ef4SMike Barcroft else 1157a396ef4SMike Barcroft (void)fprintf(stderr, "usage: pwd [-L | -P]\n"); 1164b88c807SRodney W. Grimes exit(1); 1174b88c807SRodney W. Grimes } 1187a396ef4SMike Barcroft 1197a396ef4SMike Barcroft static char * 1207a396ef4SMike Barcroft getcwd_logical(void) 1217a396ef4SMike Barcroft { 1227a396ef4SMike Barcroft struct stat log, phy; 1237a396ef4SMike Barcroft char *pwd; 1247a396ef4SMike Barcroft 1257a396ef4SMike Barcroft /* 1267a396ef4SMike Barcroft * Check that $PWD is an absolute logical pathname referring to 1277a396ef4SMike Barcroft * the current working directory. 1287a396ef4SMike Barcroft */ 1297a396ef4SMike Barcroft if ((pwd = getenv("PWD")) != NULL && *pwd == '/') { 1307a396ef4SMike Barcroft if (stat(pwd, &log) == -1 || stat(".", &phy) == -1) 1317a396ef4SMike Barcroft return (NULL); 1327a396ef4SMike Barcroft if (log.st_dev == phy.st_dev && log.st_ino == phy.st_ino) 1337a396ef4SMike Barcroft return (pwd); 1347a396ef4SMike Barcroft } 1357a396ef4SMike Barcroft 1367a396ef4SMike Barcroft errno = ENOENT; 1377a396ef4SMike Barcroft return (NULL); 1387a396ef4SMike Barcroft } 139