]> andersk Git - gssapi-openssh.git/blame - openssh/openbsd-compat/dirname.c
Import of OpenSSH 3.7p1
[gssapi-openssh.git] / openssh / openbsd-compat / dirname.c
CommitLineData
0fff78ff 1/* $OpenBSD: dirname.c,v 1.10 2003/06/17 21:56:23 millert Exp $ */
3c0ef626 2
3/*
4 * Copyright (c) 1997 Todd C. Miller <Todd.Miller@courtesan.com>
3c0ef626 5 *
0fff78ff 6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
3c0ef626 9 *
0fff78ff 10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
3c0ef626 17 */
18
19#include "includes.h"
20#ifndef HAVE_DIRNAME
21
0fff78ff 22#ifndef lint
23static char rcsid[] = "$OpenBSD: dirname.c,v 1.10 2003/06/17 21:56:23 millert Exp $";
24#endif /* not lint */
3c0ef626 25
26#include <errno.h>
27#include <string.h>
28#include <sys/param.h>
29
30char *
0fff78ff 31dirname(const char *path)
3c0ef626 32{
33 static char bname[MAXPATHLEN];
34 register const char *endp;
35
36 /* Empty or NULL string gets treated as "." */
37 if (path == NULL || *path == '\0') {
41b2f314 38 (void)strlcpy(bname, ".", sizeof bname);
3c0ef626 39 return(bname);
40 }
41
42 /* Strip trailing slashes */
43 endp = path + strlen(path) - 1;
44 while (endp > path && *endp == '/')
45 endp--;
46
47 /* Find the start of the dir */
48 while (endp > path && *endp != '/')
49 endp--;
50
51 /* Either the dir is "/" or there are no slashes */
52 if (endp == path) {
41b2f314 53 (void)strlcpy(bname, *endp == '/' ? "/" : ".", sizeof bname);
3c0ef626 54 return(bname);
55 } else {
56 do {
57 endp--;
58 } while (endp > path && *endp == '/');
59 }
60
e9a17296 61 if (endp - path + 2 > sizeof(bname)) {
3c0ef626 62 errno = ENAMETOOLONG;
63 return(NULL);
64 }
65 strlcpy(bname, path, endp - path + 2);
66 return(bname);
67}
68#endif
This page took 0.0595 seconds and 5 git commands to generate.