source: trunk/libtransmission/dirname.c @ 3650

Last change on this file since 3650 was 3650, checked in by charles, 15 years ago

part 1 of the data corruption fix: plug the leaky abstraction in fdlimit

  • Property svn:keywords set to Date Rev Author Id
File size: 1.9 KB
Line 
1/*  $Id: dirname.c 3650 2007-10-30 18:35:06Z charles $            */
2/*      $OpenBSD: dirname.c,v 1.13 2005/08/08 08:05:33 espie Exp $      */
3
4/*
5 * Copyright (c) 1997, 2004 Todd C. Miller <Todd.Miller@courtesan.com>
6 *
7 * Permission to use, copy, modify, and distribute this software for any
8 * purpose with or without fee is hereby granted, provided that the above
9 * copyright notice and this permission notice appear in all copies.
10 *
11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18 */
19
20#ifndef HAVE_DIRNAME
21
22#include <errno.h>
23#include <string.h>
24#include <unistd.h> /* for MAXPATHLEN */
25#include <sys/param.h>
26
27char *
28dirname( char *path )
29{
30        static char dname[MAXPATHLEN];
31        size_t len;
32        const char *endp;
33
34        /* Empty or NULL string gets treated as "." */
35        if (path == NULL || *path == '\0') {
36                dname[0] = '.';
37                dname[1] = '\0';
38                return (dname);
39        }
40
41        /* Strip any trailing slashes */
42        endp = path + strlen(path) - 1;
43        while (endp > path && *endp == '/')
44                endp--;
45
46        /* Find the start of the dir */
47        while (endp > path && *endp != '/')
48                endp--;
49
50        /* Either the dir is "/" or there are no slashes */
51        if (endp == path) {
52                dname[0] = *endp == '/' ? '/' : '.';
53                dname[1] = '\0';
54                return (dname);
55        } else {
56                /* Move forward past the separating slashes */
57                do {
58                        endp--;
59                } while (endp > path && *endp == '/');
60        }
61
62        len = endp - path + 1;
63        if (len >= sizeof(dname)) {
64                errno = ENAMETOOLONG;
65                return (NULL);
66        }
67        memcpy(dname, path, len);
68        dname[len] = '\0';
69        return (dname);
70}
71
72#endif /* HAVE_DIRNAME */
Note: See TracBrowser for help on using the repository browser.