Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 6 Oct 2009 14:05:57 +0000 (UTC)
From:      Robert Watson <rwatson@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r197804 - in head: include lib/libc/gen
Message-ID:  <200910061405.n96E5vsq049153@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: rwatson
Date: Tue Oct  6 14:05:57 2009
New Revision: 197804
URL: http://svn.freebsd.org/changeset/base/197804

Log:
  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.
  
  MFC after:	1 month
  Sponsored by:	Google

Modified:
  head/include/libgen.h
  head/lib/libc/gen/Makefile.inc
  head/lib/libc/gen/Symbol.map
  head/lib/libc/gen/basename.3
  head/lib/libc/gen/basename.c

Modified: head/include/libgen.h
==============================================================================
--- head/include/libgen.h	Tue Oct  6 13:45:49 2009	(r197803)
+++ head/include/libgen.h	Tue Oct  6 14:05:57 2009	(r197804)
@@ -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: head/lib/libc/gen/Makefile.inc
==============================================================================
--- head/lib/libc/gen/Makefile.inc	Tue Oct  6 13:45:49 2009	(r197803)
+++ head/lib/libc/gen/Makefile.inc	Tue Oct  6 14:05:57 2009	(r197804)
@@ -76,6 +76,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: head/lib/libc/gen/Symbol.map
==============================================================================
--- head/lib/libc/gen/Symbol.map	Tue Oct  6 13:45:49 2009	(r197803)
+++ head/lib/libc/gen/Symbol.map	Tue Oct  6 14:05:57 2009	(r197804)
@@ -367,6 +367,7 @@ FBSD_1.1 {
 };
 
 FBSD_1.2 {
+	basename_r;
 	getpagesizes;
 };
 

Modified: head/lib/libc/gen/basename.3
==============================================================================
--- head/lib/libc/gen/basename.3	Tue Oct  6 13:45:49 2009	(r197803)
+++ head/lib/libc/gen/basename.3	Tue Oct  6 14:05:57 2009	(r197804)
@@ -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: head/lib/libc/gen/basename.c
==============================================================================
--- head/lib/libc/gen/basename.c	Tue Oct  6 13:45:49 2009	(r197803)
+++ head/lib/libc/gen/basename.c	Tue Oct  6 14:05:57 2009	(r197804)
@@ -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));
+}



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200910061405.n96E5vsq049153>