Statistics
| Branch: | Revision:

scoutos / prex-0.9.0 / usr / lib / libc / gen / dirname.c @ 03e9c04a

History | View | Annotate | Download (2.07 KB)

1
/*
2
 * Copyright (c) 1997, 2004 Todd C. Miller <Todd.Miller@courtesan.com>
3
 *
4
 * Permission to use, copy, modify, and distribute this software for any
5
 * purpose with or without fee is hereby granted, provided that the above
6
 * copyright notice and this permission notice appear in all copies.
7
 *
8
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15
 */
16

    
17
#include <errno.h>
18
#include <libgen.h>
19
#include <string.h>
20
#include <sys/param.h>
21

    
22
char *
23
dirname(const char *path)
24
{
25
        static char dname[MAXPATHLEN];
26
        size_t len;
27
        const char *endp;
28

    
29
        /* Empty or NULL string gets treated as "." */
30
        if (path == NULL || *path == '\0') {
31
                dname[0] = '.';
32
                dname[1] = '\0';
33
                return (dname);
34
        }
35

    
36
        /* Strip any trailing slashes */
37
        endp = path + strlen(path) - 1;
38
        while (endp > path && *endp == '/')
39
                endp--;
40

    
41
        /* Find the start of the dir */
42
        while (endp > path && *endp != '/')
43
                endp--;
44

    
45
        /* Either the dir is "/" or there are no slashes */
46
        if (endp == path) {
47
                dname[0] = *endp == '/' ? '/' : '.';
48
                dname[1] = '\0';
49
                return (dname);
50
        } else {
51
                /* Move forward past the separating slashes */
52
                do {
53
                        endp--;
54
                } while (endp > path && *endp == '/');
55
        }
56

    
57
        len = endp - path + 1;
58
        if (len >= sizeof(dname)) {
59
                errno = ENAMETOOLONG;
60
                return (NULL);
61
        }
62
        memcpy(dname, path, len);
63
        dname[len] = '\0';
64
        return (dname);
65
}