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