diff options
Diffstat (limited to 'openbsd-compat/dirname.c')
-rw-r--r-- | openbsd-compat/dirname.c | 40 |
1 files changed, 21 insertions, 19 deletions
diff --git a/openbsd-compat/dirname.c b/openbsd-compat/dirname.c index 25ab34dd6..30fcb4968 100644 --- a/openbsd-compat/dirname.c +++ b/openbsd-compat/dirname.c | |||
@@ -1,9 +1,7 @@ | |||
1 | /* OPENBSD ORIGINAL: lib/libc/gen/dirname.c */ | 1 | /* $OpenBSD: dirname.c,v 1.13 2005/08/08 08:05:33 espie Exp $ */ |
2 | |||
3 | /* $OpenBSD: dirname.c,v 1.10 2003/06/17 21:56:23 millert Exp $ */ | ||
4 | 2 | ||
5 | /* | 3 | /* |
6 | * Copyright (c) 1997 Todd C. Miller <Todd.Miller@courtesan.com> | 4 | * Copyright (c) 1997, 2004 Todd C. Miller <Todd.Miller@courtesan.com> |
7 | * | 5 | * |
8 | * Permission to use, copy, modify, and distribute this software for any | 6 | * Permission to use, copy, modify, and distribute this software for any |
9 | * purpose with or without fee is hereby granted, provided that the above | 7 | * purpose with or without fee is hereby granted, provided that the above |
@@ -18,13 +16,11 @@ | |||
18 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | 16 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
19 | */ | 17 | */ |
20 | 18 | ||
19 | /* OPENBSD ORIGINAL: lib/libc/gen/dirname.c */ | ||
20 | |||
21 | #include "includes.h" | 21 | #include "includes.h" |
22 | #ifndef HAVE_DIRNAME | 22 | #ifndef HAVE_DIRNAME |
23 | 23 | ||
24 | #ifndef lint | ||
25 | static char rcsid[] = "$OpenBSD: dirname.c,v 1.10 2003/06/17 21:56:23 millert Exp $"; | ||
26 | #endif /* not lint */ | ||
27 | |||
28 | #include <errno.h> | 24 | #include <errno.h> |
29 | #include <string.h> | 25 | #include <string.h> |
30 | #include <sys/param.h> | 26 | #include <sys/param.h> |
@@ -32,16 +28,18 @@ static char rcsid[] = "$OpenBSD: dirname.c,v 1.10 2003/06/17 21:56:23 millert Ex | |||
32 | char * | 28 | char * |
33 | dirname(const char *path) | 29 | dirname(const char *path) |
34 | { | 30 | { |
35 | static char bname[MAXPATHLEN]; | 31 | static char dname[MAXPATHLEN]; |
36 | register const char *endp; | 32 | size_t len; |
33 | const char *endp; | ||
37 | 34 | ||
38 | /* Empty or NULL string gets treated as "." */ | 35 | /* Empty or NULL string gets treated as "." */ |
39 | if (path == NULL || *path == '\0') { | 36 | if (path == NULL || *path == '\0') { |
40 | (void)strlcpy(bname, ".", sizeof bname); | 37 | dname[0] = '.'; |
41 | return(bname); | 38 | dname[1] = '\0'; |
39 | return (dname); | ||
42 | } | 40 | } |
43 | 41 | ||
44 | /* Strip trailing slashes */ | 42 | /* Strip any trailing slashes */ |
45 | endp = path + strlen(path) - 1; | 43 | endp = path + strlen(path) - 1; |
46 | while (endp > path && *endp == '/') | 44 | while (endp > path && *endp == '/') |
47 | endp--; | 45 | endp--; |
@@ -52,19 +50,23 @@ dirname(const char *path) | |||
52 | 50 | ||
53 | /* Either the dir is "/" or there are no slashes */ | 51 | /* Either the dir is "/" or there are no slashes */ |
54 | if (endp == path) { | 52 | if (endp == path) { |
55 | (void)strlcpy(bname, *endp == '/' ? "/" : ".", sizeof bname); | 53 | dname[0] = *endp == '/' ? '/' : '.'; |
56 | return(bname); | 54 | dname[1] = '\0'; |
55 | return (dname); | ||
57 | } else { | 56 | } else { |
57 | /* Move forward past the separating slashes */ | ||
58 | do { | 58 | do { |
59 | endp--; | 59 | endp--; |
60 | } while (endp > path && *endp == '/'); | 60 | } while (endp > path && *endp == '/'); |
61 | } | 61 | } |
62 | 62 | ||
63 | if (endp - path + 2 > sizeof(bname)) { | 63 | len = endp - path + 1; |
64 | if (len >= sizeof(dname)) { | ||
64 | errno = ENAMETOOLONG; | 65 | errno = ENAMETOOLONG; |
65 | return(NULL); | 66 | return (NULL); |
66 | } | 67 | } |
67 | strlcpy(bname, path, endp - path + 2); | 68 | memcpy(dname, path, len); |
68 | return(bname); | 69 | dname[len] = '\0'; |
70 | return (dname); | ||
69 | } | 71 | } |
70 | #endif | 72 | #endif |