svn commit: r213002 - in stable/8: include lib/libc/gen
Rui Paulo
rpaulo at FreeBSD.org
Wed Sep 22 18:00:35 UTC 2010
Author: rpaulo
Date: Wed Sep 22 18:00:34 2010
New Revision: 213002
URL: http://svn.freebsd.org/changeset/base/213002
Log:
MFC r197804 (rwatson):
Add basename_r(3) to complement basename(3). basename_r(3) which accepts
a caller-allocated buffer of at least MAXPATHLEN, rather than using a
global buffer.
Note about semantics: while this interface is not POSIXy, there's
another major platform that uses it (Android) and the semantics between
the two platforms are pretty much the same.
Modified:
stable/8/include/libgen.h
stable/8/lib/libc/gen/Makefile.inc
stable/8/lib/libc/gen/Symbol.map
stable/8/lib/libc/gen/basename.3
stable/8/lib/libc/gen/basename.c
Directory Properties:
stable/8/include/ (props changed)
stable/8/lib/libc/ (props changed)
stable/8/lib/libc/locale/ (props changed)
stable/8/lib/libc/stdtime/ (props changed)
stable/8/lib/libc/sys/ (props changed)
Modified: stable/8/include/libgen.h
==============================================================================
--- stable/8/include/libgen.h Wed Sep 22 16:54:22 2010 (r213001)
+++ stable/8/include/libgen.h Wed Sep 22 18:00:34 2010 (r213002)
@@ -36,6 +36,7 @@
__BEGIN_DECLS
char *basename(const char *);
+char *basename_r(const char *, char *);
char *dirname(const char *);
#if 0
char *regcmp(const char *, ...);
Modified: stable/8/lib/libc/gen/Makefile.inc
==============================================================================
--- stable/8/lib/libc/gen/Makefile.inc Wed Sep 22 16:54:22 2010 (r213001)
+++ stable/8/lib/libc/gen/Makefile.inc Wed Sep 22 18:00:34 2010 (r213002)
@@ -77,6 +77,7 @@ MAN+= alarm.3 arc4random.3 \
MLINKS+=arc4random.3 arc4random_addrandom.3 arc4random.3 arc4random_stir.3 \
arc4random.3 arc4random_buf.3 arc4random.3 arc4random_uniform.3
+MLINKS+=basename.3 basename_r.3
MLINKS+=ctermid.3 ctermid_r.3
MLINKS+=devname.3 devname_r.3
MLINKS+=devname.3 fdevname.3
Modified: stable/8/lib/libc/gen/Symbol.map
==============================================================================
--- stable/8/lib/libc/gen/Symbol.map Wed Sep 22 16:54:22 2010 (r213001)
+++ stable/8/lib/libc/gen/Symbol.map Wed Sep 22 18:00:34 2010 (r213002)
@@ -366,6 +366,7 @@ FBSD_1.1 {
};
FBSD_1.2 {
+ basename_r;
getpagesizes;
};
Modified: stable/8/lib/libc/gen/basename.3
==============================================================================
--- stable/8/lib/libc/gen/basename.3 Wed Sep 22 16:54:22 2010 (r213001)
+++ stable/8/lib/libc/gen/basename.3 Wed Sep 22 18:00:34 2010 (r213002)
@@ -27,7 +27,7 @@
.\" $OpenBSD: basename.3,v 1.12 2000/04/18 03:01:25 aaron Exp $
.\" $FreeBSD$
.\"
-.Dd October 12, 2006
+.Dd October 6, 2009
.Dt BASENAME 3
.Os
.Sh NAME
@@ -37,6 +37,8 @@
.In libgen.h
.Ft char *
.Fn basename "const char *path"
+.Ft char *
+.Fn basename_r "const char *path" "char *bname"
.Sh DESCRIPTION
The
.Fn basename
@@ -58,6 +60,12 @@ If
is a null pointer or the empty string, a pointer to the string
.Qq \&.
is returned.
+.Pp
+The
+.Fn basename_r
+variation accepts a buffer of at least
+.Dv MAXPATHLEN
+bytes in which to store the resulting component.
.Sh IMPLEMENTATION NOTES
The
.Fn basename
@@ -65,15 +73,17 @@ function
returns a pointer to internal storage space allocated on the first call
that will be overwritten
by subsequent calls.
+.Fn basename_r
+is therefore preferred for threaded applications.
.Sh RETURN VALUES
On successful completion,
.Fn basename
-returns a pointer to the last component of
+and
+.Fn basename_r
+return pointers to the last component of
.Fa path .
.Pp
-If
-.Fn basename
-fails, a null pointer is returned and the global variable
+If they fail, a null pointer is returned and the global variable
.Va errno
is set to indicate the error.
.Sh ERRORS
Modified: stable/8/lib/libc/gen/basename.c
==============================================================================
--- stable/8/lib/libc/gen/basename.c Wed Sep 22 16:54:22 2010 (r213001)
+++ stable/8/lib/libc/gen/basename.c Wed Sep 22 18:00:34 2010 (r213002)
@@ -40,18 +40,12 @@ __FBSDID("$FreeBSD$");
#include <sys/param.h>
char *
-basename(path)
+basename_r(path, bname)
const char *path;
+ char *bname;
{
- static char *bname = NULL;
const char *endp, *startp;
- if (bname == NULL) {
- bname = (char *)malloc(MAXPATHLEN);
- if (bname == NULL)
- return(NULL);
- }
-
/* Empty or NULL string gets treated as "." */
if (path == NULL || *path == '\0') {
(void)strcpy(bname, ".");
@@ -82,3 +76,17 @@ basename(path)
bname[endp - startp + 1] = '\0';
return(bname);
}
+
+char *
+basename(path)
+ const char *path;
+{
+ static char *bname = NULL;
+
+ if (bname == NULL) {
+ bname = (char *)malloc(MAXPATHLEN);
+ if (bname == NULL)
+ return (NULL);
+ }
+ return (basename_r(path, bname));
+}
More information about the svn-src-stable-8
mailing list