[BACK]Return to dirname.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / lib / libc / gen

Annotation of src/lib/libc/gen/dirname.c, Revision 1.13.22.1

1.13.22.1! pgoyette    1: /*     $NetBSD: dirname.c,v 1.14 2018/09/27 00:45:34 kre Exp $ */
1.1       kleink      2:
                      3: /*-
1.6       thorpej     4:  * Copyright (c) 1997, 2002 The NetBSD Foundation, Inc.
1.1       kleink      5:  * All rights reserved.
                      6:  *
                      7:  * This code is derived from software contributed to The NetBSD Foundation
1.6       thorpej     8:  * by Klaus Klein and Jason R. Thorpe.
1.1       kleink      9:  *
                     10:  * Redistribution and use in source and binary forms, with or without
                     11:  * modification, are permitted provided that the following conditions
                     12:  * are met:
                     13:  * 1. Redistributions of source code must retain the above copyright
                     14:  *    notice, this list of conditions and the following disclaimer.
                     15:  * 2. Redistributions in binary form must reproduce the above copyright
                     16:  *    notice, this list of conditions and the following disclaimer in the
                     17:  *    documentation and/or other materials provided with the distribution.
                     18:  *
                     19:  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
                     20:  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
                     21:  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
                     22:  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
                     23:  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
                     24:  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
                     25:  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
                     26:  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
                     27:  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
                     28:  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
                     29:  * POSSIBILITY OF SUCH DAMAGE.
                     30:  */
                     31:
                     32: #include <sys/cdefs.h>
                     33: #if defined(LIBC_SCCS) && !defined(lint)
1.13.22.1! pgoyette   34: __RCSID("$NetBSD: dirname.c,v 1.14 2018/09/27 00:45:34 kre Exp $");
1.1       kleink     35: #endif /* !LIBC_SCCS && !lint */
                     36:
                     37: #include "namespace.h"
1.12      christos   38: #include <sys/param.h>
1.1       kleink     39: #include <libgen.h>
1.6       thorpej    40: #include <limits.h>
1.5       tv         41: #include <string.h>
1.1       kleink     42:
                     43: #ifdef __weak_alias
1.2       mycroft    44: __weak_alias(dirname,_dirname)
1.1       kleink     45: #endif
                     46:
1.12      christos   47: static size_t
1.13      christos   48: xdirname_r(const char *path, char *buf, size_t buflen)
1.1       kleink     49: {
1.12      christos   50:        const char *endp;
1.6       thorpej    51:        size_t len;
1.1       kleink     52:
                     53:        /*
1.6       thorpej    54:         * If `path' is a null pointer or points to an empty string,
                     55:         * return a pointer to the string ".".
1.1       kleink     56:         */
1.12      christos   57:        if (path == NULL || *path == '\0') {
                     58:                path = ".";
                     59:                len = 1;
                     60:                goto out;
                     61:        }
1.1       kleink     62:
1.6       thorpej    63:        /* Strip trailing slashes, if any. */
1.12      christos   64:        endp = path + strlen(path) - 1;
                     65:        while (endp != path && *endp == '/')
                     66:                endp--;
                     67:
                     68:        /* Find the start of the dir */
                     69:        while (endp > path && *endp != '/')
                     70:                endp--;
                     71:
                     72:        if (endp == path) {
                     73:                path = *endp == '/' ? "/" : ".";
                     74:                len = 1;
                     75:                goto out;
                     76:        }
                     77:
                     78:        do
                     79:                endp--;
                     80:        while (endp > path && *endp == '/');
                     81:
                     82:        len = endp - path + 1;
                     83: out:
                     84:        if (buf != NULL && buflen != 0) {
                     85:                buflen = MIN(len, buflen - 1);
1.13.22.1! pgoyette   86:                if (buf != path)
        !            87:                        memcpy(buf, path, buflen);
1.12      christos   88:                buf[buflen] = '\0';
                     89:        }
                     90:        return len;
                     91: }
1.11      tnozaki    92:
1.12      christos   93: #if !HAVE_DIRNAME
                     94: char *
                     95: dirname(char *path)
                     96: {
                     97:        static char result[PATH_MAX];
1.13      christos   98:        (void)xdirname_r(path, result, sizeof(result));
1.12      christos   99:        return result;
1.1       kleink    100: }
1.4       tv        101: #endif

CVSweb <webmaster@jp.NetBSD.org>