11305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood/* $OpenBSD: dirname.c,v 1.13 2005/08/08 08:05:33 espie Exp $ */ 21305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 31305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood/* 41305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * Copyright (c) 1997, 2004 Todd C. Miller <Todd.Miller@courtesan.com> 51305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * 61305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * Permission to use, copy, modify, and distribute this software for any 71305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * purpose with or without fee is hereby granted, provided that the above 81305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * copyright notice and this permission notice appear in all copies. 91305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * 101305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 111305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 121305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 131305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 141305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 151305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 161305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 171305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood */ 181305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 191305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood/* OPENBSD ORIGINAL: lib/libc/gen/dirname.c */ 201305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 211305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include "includes.h" 221305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#ifndef HAVE_DIRNAME 231305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 241305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include <errno.h> 251305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include <string.h> 261305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include <sys/param.h> 271305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 281305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodchar * 291305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwooddirname(const char *path) 301305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{ 311305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood static char dname[MAXPATHLEN]; 321305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood size_t len; 331305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood const char *endp; 341305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 351305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood /* Empty or NULL string gets treated as "." */ 361305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (path == NULL || *path == '\0') { 371305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood dname[0] = '.'; 381305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood dname[1] = '\0'; 391305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return (dname); 401305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood } 411305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 421305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood /* Strip any trailing slashes */ 431305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood endp = path + strlen(path) - 1; 441305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood while (endp > path && *endp == '/') 451305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood endp--; 461305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 471305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood /* Find the start of the dir */ 481305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood while (endp > path && *endp != '/') 491305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood endp--; 501305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 511305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood /* Either the dir is "/" or there are no slashes */ 521305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (endp == path) { 531305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood dname[0] = *endp == '/' ? '/' : '.'; 541305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood dname[1] = '\0'; 551305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return (dname); 561305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood } else { 571305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood /* Move forward past the separating slashes */ 581305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood do { 591305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood endp--; 601305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood } while (endp > path && *endp == '/'); 611305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood } 621305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 631305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood len = endp - path + 1; 641305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (len >= sizeof(dname)) { 651305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood errno = ENAMETOOLONG; 661305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return (NULL); 671305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood } 681305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood memcpy(dname, path, len); 691305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood dname[len] = '\0'; 701305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return (dname); 711305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood} 721305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#endif 73