* Add devname_r(3) function, which takes a buffer and buffer length as
authorEirik Nygaard <eirikn@dragonflybsd.org>
Tue, 6 Jan 2004 15:38:09 +0000 (15:38 +0000)
committerEirik Nygaard <eirikn@dragonflybsd.org>
Tue, 6 Jan 2004 15:38:09 +0000 (15:38 +0000)
   arguments.

include/stdlib.h
lib/libc/gen/Makefile.inc
lib/libc/gen/devname.3
lib/libc/gen/devname.c

index ffe2889..f127ad4 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)stdlib.h    8.5 (Berkeley) 5/19/95
  * $FreeBSD: src/include/stdlib.h,v 1.16.2.5 2002/12/13 01:34:00 tjr Exp $
- * $DragonFly: src/include/stdlib.h,v 1.5 2003/11/15 19:28:42 asmodai Exp $
+ * $DragonFly: src/include/stdlib.h,v 1.6 2004/01/06 15:38:09 eirikn Exp $
  */
 
 #ifndef _STDLIB_H_
@@ -162,6 +162,7 @@ int  cgetustr (char *, char *, char **);
 
 int     daemon (int, int);
 char   *devname (int, int);
+char   *devname_r (int, int, char *, size_t);
 int     getloadavg (double [], int);
 __const char *
        getprogname (void);
index 516234a..496908a 100644 (file)
@@ -1,6 +1,6 @@
 #      @(#)Makefile.inc        8.6 (Berkeley) 5/4/95
 # $FreeBSD: src/lib/libc/gen/Makefile.inc,v 1.62.2.19 2003/02/21 13:46:16 phantom Exp $
-# $DragonFly: src/lib/libc/gen/Makefile.inc,v 1.2 2003/06/17 04:26:42 dillon Exp $
+# $DragonFly: src/lib/libc/gen/Makefile.inc,v 1.3 2004/01/06 15:38:09 eirikn Exp $
 
 # machine-independent gen sources
 .PATH: ${.CURDIR}/../libc/${MACHINE_ARCH}/gen ${.CURDIR}/../libc/gen
@@ -66,6 +66,7 @@ MLINKS+=ctermid.3 ctermid_r.3
 MLINKS+=directory.3 closedir.3 directory.3 dirfd.3 directory.3 opendir.3 \
        directory.3 readdir.3 directory.3 readdir_r.3 directory.3 rewinddir.3 \
        directory.3 seekdir.3 directory.3 telldir.3
+MLINKS+=devname.3 devname_r.3
 MLINKS+=dlopen.3 dlclose.3 dlopen.3 dlerror.3 dlopen.3 dlsym.3
 MLINKS+=err.3 err_set_exit.3 err.3 err_set_file.3 err.3 errc.3 err.3 errx.3 \
        err.3 verr.3 err.3 verrc.3 err.3 verrx.3 err.3 vwarn.3 err.3 vwarnc.3 \
index 8bcc08f..71d96c4 100644 (file)
 .\"
 .\"     @(#)devname.3  8.2 (Berkeley) 4/29/95
 .\" $FreeBSD: src/lib/libc/gen/devname.3,v 1.7.2.7 2003/03/15 15:11:05 trhodes Exp $
-.\" $DragonFly: src/lib/libc/gen/devname.3,v 1.3 2004/01/04 20:20:16 eirikn Exp $
+.\" $DragonFly: src/lib/libc/gen/devname.3,v 1.4 2004/01/06 15:38:09 eirikn Exp $
 .\"
 .Dd July 18, 1999
 .Dt DEVNAME 3
 .Os
 .Sh NAME
-.Nm devname
+.Nm devname ,
+.Nm devname_r
 .Nd get device name
 .Sh LIBRARY
 .Lb libc
@@ -46,6 +47,8 @@
 .In stdlib.h
 .Ft char *
 .Fn devname "dev_t dev" "mode_t type"
+.Ft char *
+.Fn devname_r "dev_t dev" "mode_t type" "char *buf" "size_t len"
 .Sh DESCRIPTION
 The
 .Fn devname
@@ -69,6 +72,12 @@ if that fails, it will format the information encapsulated in
 and
 .Fa type
 in a human-readable format.
+.Pp
+.Fn devname
+returns a pointer to an internal static object; thus, subsequent calls will
+modify the same buffer.
+.Fn devname_r
+avoids this problem by taking a buffer and buffer length as argruments.
 .Sh SEE ALSO
 .Xr stat 2 ,
 .Xr dev_mkdb 8
@@ -77,8 +86,3 @@ The
 .Fn devname
 function appeared in
 .Bx 4.4 .
-.Sh BUGS
-The
-.Fn devname
-function returns a pointer to an internal static object;
-thus, subsequent calls will modify the same buffer.
index 6ca0064..b90a8fa 100644 (file)
@@ -31,7 +31,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/lib/libc/gen/devname.c,v 1.2.2.2 2001/07/31 20:10:19 tmm Exp $
- * $DragonFly: src/lib/libc/gen/devname.c,v 1.3 2004/01/04 20:20:16 eirikn Exp $
+ * $DragonFly: src/lib/libc/gen/devname.c,v 1.4 2004/01/06 15:38:09 eirikn Exp $
  *
  * @(#)devname.c       8.2 (Berkeley) 4/29/95
  */
@@ -81,17 +81,18 @@ xdevname(dev_t dev, mode_t type)
 }
 
 char *
-devname(dev_t dev, mode_t type)
+devname_r(dev_t dev, mode_t type, char *buf, size_t len)
 {
-       static char buf[30];     /* XXX: pick up from <sys/conf.h> */
        int i;
        size_t j;
        char *r;
 
        /* First check the DB file. */
        r = xdevname(dev, type);
-       if (r != NULL)
-               return (r);
+       if (r != NULL) {
+               strlcpy(buf, r, len);
+               return (buf);
+       }
 
 #if 0
        /* The kern.devname sysctl does not exist */
@@ -105,15 +106,24 @@ devname(dev_t dev, mode_t type)
 #endif
 
        /* Finally just format it */
-       r = buf;
        if (minor(dev) > 255) {
-               sprintf(buf, "#%c%d:0x%x", 
+               snprintf(buf, len, "#%c%d:0x%x", 
                    (type & S_IFMT) == S_IFCHR ? 'C' : 'B',
                    major(dev), minor(dev));
        } else {
-               sprintf(buf, "#%c%d:%d", 
+               snprintf(buf, len, "#%c%d:%d", 
                    (type & S_IFMT) == S_IFCHR ? 'C' : 'B',
                    major(dev), minor(dev));
        }
-       return (r);
+       return (buf);
+}
+
+char *
+devname(dev_t dev, mode_t type)
+{
+       static char buf[30];     /* XXX: pick up from <sys/conf.h> */
+
+       strncpy(buf, devname_r(dev, type, buf, sizeof(buf)), sizeof(buf));
+
+       return (buf);
 }