1bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman/* $OpenBSD: basename.c,v 1.14 2005/08/08 08:05:33 espie Exp $ */ 2bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman 3bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman/* 4bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * Copyright (c) 1997, 2004 Todd C. Miller <Todd.Miller@courtesan.com> 5bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * 6bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * Permission to use, copy, modify, and distribute this software for any 7bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * purpose with or without fee is hereby granted, provided that the above 8bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * copyright notice and this permission notice appear in all copies. 9bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * 10bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman */ 18bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman 19bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman/* OPENBSD ORIGINAL: lib/libc/gen/basename.c */ 20bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman 21bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#include "includes.h" 22bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#ifndef HAVE_BASENAME 23bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#include <errno.h> 24bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#include <string.h> 25bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman 26bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanchar * 27bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartmanbasename(const char *path) 28bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman{ 29bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman static char bname[MAXPATHLEN]; 30bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman size_t len; 31bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman const char *endp, *startp; 32bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman 33bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman /* Empty or NULL string gets treated as "." */ 34bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman if (path == NULL || *path == '\0') { 35bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman bname[0] = '.'; 36bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman bname[1] = '\0'; 37bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman return (bname); 38bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman } 39bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman 40bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman /* Strip any trailing slashes */ 41bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman endp = path + strlen(path) - 1; 42bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman while (endp > path && *endp == '/') 43bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman endp--; 44bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman 45bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman /* All slashes becomes "/" */ 46bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman if (endp == path && *endp == '/') { 47bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman bname[0] = '/'; 48bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman bname[1] = '\0'; 49bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman return (bname); 50bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman } 51bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman 52bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman /* Find the start of the base */ 53bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman startp = endp; 54bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman while (startp > path && *(startp - 1) != '/') 55bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman startp--; 56bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman 57bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman len = endp - startp + 1; 58bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman if (len >= sizeof(bname)) { 59bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman errno = ENAMETOOLONG; 60bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman return (NULL); 61bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman } 62bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman memcpy(bname, startp, len); 63bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman bname[len] = '\0'; 64bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman return (bname); 65bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman} 66bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman 67bd77cf78387b72b7b3ea870459077672bf75c3b5Greg Hartman#endif /* !defined(HAVE_BASENAME) */ 68