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));
+}
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to