Add locking for FILE.
authorDavid Xu <davidxu@dragonflybsd.org>
Mon, 9 May 2005 12:43:40 +0000 (12:43 +0000)
committerDavid Xu <davidxu@dragonflybsd.org>
Mon, 9 May 2005 12:43:40 +0000 (12:43 +0000)
Obtained from: FreeBSD

17 files changed:
include/stdio.h
lib/libc/gen/_pthread_stubs.c
lib/libc/stdio/_flock_stub.c
lib/libc/stdio/asprintf.c
lib/libc/stdio/findfp.c
lib/libc/stdio/fseek.c
lib/libc/stdio/local.h
lib/libc/stdio/refill.c
lib/libc/stdio/snprintf.c
lib/libc/stdio/sprintf.c
lib/libc/stdio/sscanf.c
lib/libc/stdio/ungetc.c
lib/libc/stdio/vasprintf.c
lib/libc/stdio/vfprintf.c
lib/libc/stdio/vsnprintf.c
lib/libc/stdio/vsprintf.c
lib/libc/stdio/vsscanf.c

index 8adfc8c..a806e1e 100644 (file)
@@ -35,7 +35,7 @@
  *
  *     @(#)stdio.h     8.5 (Berkeley) 4/29/95
  * $FreeBSD: src/include/stdio.h,v 1.24.2.5 2002/11/09 08:07:20 imp Exp $
- * $DragonFly: src/include/stdio.h,v 1.6 2005/01/31 22:28:58 dillon Exp $
+ * $DragonFly: src/include/stdio.h,v 1.7 2005/05/09 12:43:40 davidxu Exp $
  */
 
 #ifndef        _STDIO_H_
@@ -74,6 +74,8 @@ struct __sbuf {
        int     _size;
 };
 
+struct __sFILEX;
+
 /*
  * stdio state variables.
  *
@@ -118,7 +120,7 @@ typedef     struct __sFILE {
 
        /* separate buffer for long sequences of ungetc() */
        struct  __sbuf _ub;     /* ungetc buffer */
-       unsigned char *_up;     /* saved _p when _p is doing ungetc data */
+       struct  __sFILEX *_extra;
        int     _ur;            /* saved _r when _r is counting ungetc data */
 
        /* tricks to meet minimum requirements even when malloc() fails */
index 688ab9b..f43a496 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: /repoman/r/ncvs/src/lib/libc/gen/_pthread_stubs.c,v 1.1 2001/01/24 12:59:20 deischen Exp $
- * $DragonFly: src/lib/libc/gen/_pthread_stubs.c,v 1.3 2005/04/26 10:05:08 joerg Exp $
+ * $DragonFly: src/lib/libc/gen/_pthread_stubs.c,v 1.4 2005/05/09 12:43:40 davidxu Exp $
  */
 
 #include <pthread.h>
@@ -44,6 +44,12 @@ int  _pthread_mutexattr_settype_stub(pthread_mutexattr_t *, int);
 int    _pthread_once_stub(pthread_once_t *, void (*)(void));
 int    _pthread_setspecific_stub(pthread_key_t, const void *);
 
+/* define a null pthread structure just to satisfy _pthread_self */
+struct pthread {
+};
+
+static struct pthread main_thread;
+
 /*
  * Weak symbols: All libc internal usage of these functions should
  * use the weak symbol versions (_pthread_XXX).  If libpthread is
@@ -66,6 +72,7 @@ __weak_reference(_pthread_mutexattr_destroy_stub,_pthread_mutexattr_destroy);
 __weak_reference(_pthread_mutexattr_settype_stub,_pthread_mutexattr_settype);
 __weak_reference(_pthread_once_stub,_pthread_once);
 __weak_reference(_pthread_setspecific_stub,_pthread_setspecific);
+__weak_reference(_pthread_self_stub,_pthread_self);
 
 void *
 _pthread_getspecific_stub(pthread_key_t key __unused)
@@ -143,6 +150,11 @@ _pthread_once_stub(pthread_once_t *once_control __unused,
        return (0);
 }
 
+struct pthread *
+_pthread_self_stub(void)
+{
+       return (&main_thread);
+}
 int
 _pthread_setspecific_stub(pthread_key_t key __unused,
                          const void *value __unused)
index 5659ee4..d283a77 100644 (file)
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/lib/libc/stdio/_flock_stub.c,v 1.3 1999/08/28 00:00:55 peter Exp $
- * $DragonFly: src/lib/libc/stdio/_flock_stub.c,v 1.6 2005/02/02 04:57:15 dillon Exp $
+ * $DragonFly: src/lib/libc/stdio/_flock_stub.c,v 1.7 2005/05/09 12:43:40 davidxu Exp $
  *
  */
 
+#include "namespace.h"
 #include <stdio.h>
+#include <pthread.h>
+#include "un-namespace.h"
+
+#include "local.h"
 
 /* Don't build this in libc_r, just libc: */
 /*
@@ -54,12 +59,27 @@ void        _flockfile_debug(FILE *, char *, int);
 int    ftrylockfile(FILE *);
 void   funlockfile(FILE *);
 
+#define _lock _extra
+
 /*
  * This function is a stub for the _flockfile function in libpthread.
  */
 void
 _flockfile_stub(FILE *fp)
 {
+       pthread_t curthread = _pthread_self();
+
+       if (fp->_lock->fl_owner == curthread)
+               fp->_lock->fl_count++;
+       else {
+               /*
+                * Make sure this mutex is treated as a private
+                * internal mutex:
+                */
+               _pthread_mutex_lock(&fp->_lock->fl_mutex);
+               fp->_lock->fl_owner = curthread;
+               fp->_lock->fl_count = 1;
+       }
 }
 
 /*
@@ -68,6 +88,7 @@ _flockfile_stub(FILE *fp)
 void
 _flockfile_debug_stub(FILE *fp, char *fname, int lineno)
 {
+       _flockfile(fp);
 }
 
 /*
@@ -76,7 +97,22 @@ _flockfile_debug_stub(FILE *fp, char *fname, int lineno)
 int
 _ftrylockfile_stub(FILE *fp)
 {
-       return(0);
+       pthread_t curthread = _pthread_self();
+       int     ret = 0;
+
+       if (fp->_lock->fl_owner == curthread)
+               fp->_lock->fl_count++;
+       /*
+        * Make sure this mutex is treated as a private
+        * internal mutex:
+        */
+       else if (_pthread_mutex_trylock(&fp->_lock->fl_mutex) == 0) {
+               fp->_lock->fl_owner = curthread;
+               fp->_lock->fl_count = 1;
+       }
+       else
+               ret = -1;
+       return (ret);
 }
 
 /*
@@ -85,4 +121,31 @@ _ftrylockfile_stub(FILE *fp)
 void
 _funlockfile_stub(FILE *fp)
 {
+       pthread_t       curthread = _pthread_self();
+
+       /*
+        * Check if this file is owned by the current thread:
+        */
+       if (fp->_lock->fl_owner == curthread) {
+               /*
+                * Check if this thread has locked the FILE
+                * more than once:
+                */
+               if (fp->_lock->fl_count > 1)
+                       /*
+                        * Decrement the count of the number of
+                        * times the running thread has locked this
+                        * file:
+                        */
+                       fp->_lock->fl_count--;
+               else {
+                       /*
+                        * The running thread will release the
+                        * lock now:
+                        */
+                       fp->_lock->fl_count = 0;
+                       fp->_lock->fl_owner = NULL;
+                       _pthread_mutex_unlock(&fp->_lock->fl_mutex);
+               }
+       }
 }
index c157235..a4c9f85 100644 (file)
@@ -27,7 +27,7 @@
  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/lib/libc/stdio/asprintf.c,v 1.6 1999/08/28 00:00:55 peter Exp $
- * $DragonFly: src/lib/libc/stdio/asprintf.c,v 1.4 2004/06/07 17:59:42 hmp Exp $
+ * $DragonFly: src/lib/libc/stdio/asprintf.c,v 1.5 2005/05/09 12:43:40 davidxu Exp $
  */
 
 #include <stdio.h>
 #include <errno.h>
 #include <stdarg.h>
 
+#include "local.h"
+
 int
 asprintf(char **str, char const *fmt, ...)
 {
        int ret;
        va_list ap;
        FILE f;
+       struct __sFILEX ext;
 
        f._file = -1;
        f._flags = __SWR | __SSTR | __SALC;
@@ -51,8 +54,10 @@ asprintf(char **str, char const *fmt, ...)
                return (-1);
        }
        f._bf._size = f._w = 127;               /* Leave room for the NUL */
+       f._extra = &ext;
+       INITEXTRA(&f);
        va_start(ap, fmt);
-       ret = vfprintf(&f, fmt, ap);
+       ret = __vfprintf(&f, fmt, ap);          /* Use unlocked __vfprintf */
        va_end(ap);
        if (ret < 0) {
                free(f._bf._base);
index 2a1a95a..1d6f3e7 100644 (file)
@@ -35,7 +35,7 @@
  *
  * @(#)findfp.c        8.2 (Berkeley) 1/4/94
  * $FreeBSD: src/lib/libc/stdio/findfp.c,v 1.7.2.3 2001/08/17 02:56:31 peter Exp $
- * $DragonFly: src/lib/libc/stdio/findfp.c,v 1.6 2005/01/31 22:29:40 dillon Exp $
+ * $DragonFly: src/lib/libc/stdio/findfp.c,v 1.7 2005/05/09 12:43:40 davidxu Exp $
  */
 
 #include <sys/param.h>
@@ -56,13 +56,18 @@ int __sdidinit;
 #define        NDYNAMIC 10             /* add ten more whenever necessary */
 
 #define        std(flags, file) \
-       {0,0,0,flags,file,{0},0,__sF+file,__sclose,__sread,__sseek,__swrite}
+       {0,0,0,flags,file,{0},0,__sF+file,__sclose,__sread,__sseek,__swrite, \
+        {0}, __sFX + file}
 /*      p r w flags file _bf z  cookie      close    read    seek    write */
+/*     _ub _extra */
 
                                /* the usual - (stdin + stdout + stderr) */
 static FILE usual[FOPEN_MAX - 3];
+static struct __sFILEX usual_extra[FOPEN_MAX - 3];
 static struct glue uglue = { NULL, FOPEN_MAX - 3, usual };
 
+static struct __sFILEX __sFX[3];
+
 FILE __sF[3] = {
        std(__SRD, STDIN_FILENO),               /* stdin */
        std(__SWR, STDOUT_FILENO),              /* stdout */
@@ -103,18 +108,26 @@ struct glue *
 moreglue(int n)
 {
        struct glue *g;
-       FILE *p;
        static FILE empty;
+       static struct __sFILEX emptyx;
+       FILE *p;
+       struct __sFILEX *fx;
 
-       g = (struct glue *)malloc(sizeof(*g) + ALIGNBYTES + n * sizeof(FILE));
+       g = (struct glue *)malloc(sizeof(*g) + ALIGNBYTES + n * sizeof(FILE) +
+           n * sizeof(struct __sFILEX));
        if (g == NULL)
                return (NULL);
        p = (FILE *)ALIGN(g + 1);
+       fx = (struct __sFILEX *)&p[n];
        g->next = NULL;
        g->niobs = n;
        g->iobs = p;
-       while (--n >= 0)
-               *p++ = empty;
+       while (--n >= 0) {
+               *p = empty;
+               p->_extra = fx;
+               *p->_extra = emptyx;
+               p++, fx++;
+       }
        return (g);
 }
 
@@ -214,7 +227,17 @@ _cleanup(void)
 void
 __sinit(void)
 {
-       /* make sure we clean up on exit */
-       __cleanup = _cleanup;           /* conservative */
-       __sdidinit = 1;
+       int     i;
+
+       THREAD_LOCK();
+       if (__sdidinit == 0) {
+               /* Set _extra for the usual suspects. */
+               for (i = 0; i < FOPEN_MAX - 3; i++)
+                       usual[i]._extra = &usual_extra[i];
+
+               /* Make sure we clean up on exit. */
+               __cleanup = _cleanup;           /* conservative */
+               __sdidinit = 1;
+       }
+       THREAD_UNLOCK();
 }
index 204b96e..e37a136 100644 (file)
@@ -35,7 +35,7 @@
  *
  * @(#)fseek.c 8.3 (Berkeley) 1/2/94
  * $FreeBSD: src/lib/libc/stdio/fseek.c,v 1.9.2.1 2001/03/05 10:56:58 obrien Exp $
- * $DragonFly: src/lib/libc/stdio/fseek.c,v 1.6 2005/01/31 22:29:40 dillon Exp $
+ * $DragonFly: src/lib/libc/stdio/fseek.c,v 1.7 2005/05/09 12:43:40 davidxu Exp $
  */
 
 #include "namespace.h"
@@ -195,7 +195,7 @@ _fseeko(FILE *fp, off_t offset, int whence)
         */
        if (HASUB(fp)) {
                curoff += fp->_r;       /* kill off ungetc */
-               n = fp->_up - fp->_bf._base;
+               n = fp->_extra->_up - fp->_bf._base;
                curoff -= n;
                n += fp->_ur;
        } else {
index 1b428ed..8d0f686 100644 (file)
  *     @(#)local.h     8.3 (Berkeley) 7/3/94
  *
  * $FreeBSD: src/lib/libc/stdio/local.h,v 1.1.1.2.6.1 2001/03/05 11:27:49 obrien Exp $
- * $DragonFly: src/lib/libc/stdio/local.h,v 1.5 2005/01/31 22:29:40 dillon Exp $
+ * $DragonFly: src/lib/libc/stdio/local.h,v 1.6 2005/05/09 12:43:40 davidxu Exp $
  */
 
 #include <sys/types.h> /* for off_t */
+#include <pthread.h>
 
 #ifndef _MACHINE_STDINT_H_
 #include <machine/stdint.h>    /* __size_t */
@@ -65,9 +66,18 @@ extern int   __swhatbuf (FILE *, __size_t *, int *);
 extern int     _fwalk (int (*)(FILE *));
 extern int     __swsetup (FILE *);
 extern int     __sflags (const char *, int *);
+extern int     __vfprintf(FILE *, const char *, __va_list);
 
 extern int     __sdidinit;
 
+/* hold a buncha junk that would grow the ABI */
+struct __sFILEX {
+       unsigned char   *_up;   /* saved _p when _p is doing ungetc data */
+       pthread_mutex_t fl_mutex;       /* used for MT-safety */
+       pthread_t       fl_owner;       /* current owner */
+       int             fl_count;       /* recursive lock count */
+};
+
 /*
  * Return true iff the given FILE cannot be written now.
  */
@@ -94,3 +104,11 @@ extern int  __sdidinit;
        free((char *)(fp)->_lb._base); \
        (fp)->_lb._base = NULL; \
 }
+
+#define        INITEXTRA(fp) { \
+       (fp)->_extra->_up = NULL; \
+       (fp)->_extra->fl_mutex = PTHREAD_MUTEX_INITIALIZER; \
+       (fp)->_extra->fl_owner = NULL; \
+       (fp)->_extra->fl_count = 0; \
+}
+
index a71112d..2d1edf5 100644 (file)
@@ -35,7 +35,7 @@
  *
  * @(#)refill.c        8.1 (Berkeley) 6/4/93
  * $FreeBSD: src/lib/libc/stdio/refill.c,v 1.8.2.1 2001/03/05 11:27:49 obrien Exp $
- * $DragonFly: src/lib/libc/stdio/refill.c,v 1.6 2005/01/31 22:29:40 dillon Exp $
+ * $DragonFly: src/lib/libc/stdio/refill.c,v 1.7 2005/05/09 12:43:40 davidxu Exp $
  */
 
 #include <errno.h>
@@ -99,7 +99,7 @@ __srefill(FILE *fp)
                if (HASUB(fp)) {
                        FREEUB(fp);
                        if ((fp->_r = fp->_ur) != 0) {
-                               fp->_p = fp->_up;
+                               fp->_p = fp->_extra->_up;
                                return (0);
                        }
                }
index 0d13cf2..ef81d6b 100644 (file)
  *
  * @(#)snprintf.c      8.1 (Berkeley) 6/4/93
  * $FreeBSD: src/lib/libc/stdio/snprintf.c,v 1.12 1999/08/28 00:01:16 peter Exp $
- * $DragonFly: src/lib/libc/stdio/snprintf.c,v 1.3 2004/06/07 20:35:41 hmp Exp $
+ * $DragonFly: src/lib/libc/stdio/snprintf.c,v 1.4 2005/05/09 12:43:40 davidxu Exp $
  */
 
 #include <limits.h>
 #include <stdio.h>
 #include <stdarg.h>
 
+#include "local.h"
+
 int
 snprintf(char *str, size_t n, char const *fmt, ...)
 {
@@ -49,6 +51,7 @@ snprintf(char *str, size_t n, char const *fmt, ...)
        int ret;
        va_list ap;
        FILE f;
+       struct __sFILEX ext;
 
        on = n;
        if (n != 0)
@@ -60,7 +63,9 @@ snprintf(char *str, size_t n, char const *fmt, ...)
        f._flags = __SWR | __SSTR;
        f._bf._base = f._p = (unsigned char *)str;
        f._bf._size = f._w = n;
-       ret = vfprintf(&f, fmt, ap);
+       f._extra = &ext;
+       INITEXTRA(&f);
+       ret = __vfprintf(&f, fmt, ap);          /* Use unlocked __vfprintf */
        if (on > 0)
                *f._p = '\0';
        va_end(ap);
index ecfe67a..0e4fab3 100644 (file)
@@ -35,7 +35,7 @@
  *
  * @(#)sprintf.c       8.1 (Berkeley) 6/4/93
  * $FreeBSD: src/lib/libc/stdio/sprintf.c,v 1.6 1999/08/28 00:01:17 peter Exp $
- * $DragonFly: src/lib/libc/stdio/sprintf.c,v 1.3 2004/06/07 20:35:41 hmp Exp $
+ * $DragonFly: src/lib/libc/stdio/sprintf.c,v 1.4 2005/05/09 12:43:40 davidxu Exp $
  */
 
 #include <stdio.h>
@@ -49,13 +49,16 @@ sprintf(char *str, char const *fmt, ...)
        int ret;
        va_list ap;
        FILE f;
+       struct __sFILEX ext;
 
        f._file = -1;
        f._flags = __SWR | __SSTR;
        f._bf._base = f._p = (unsigned char *)str;
        f._bf._size = f._w = INT_MAX;
+       f._extra = &ext;
+       INITEXTRA(&f);
        va_start(ap, fmt);
-       ret = vfprintf(&f, fmt, ap);
+       ret = __vfprintf(&f, fmt, ap);          /* Use unlocked __vfprintf */
        va_end(ap);
        *f._p = 0;
        return (ret);
index 6bc3c55..bde5326 100644 (file)
@@ -35,7 +35,7 @@
  *
  * @(#)sscanf.c        8.1 (Berkeley) 6/4/93
  * $FreeBSD: src/lib/libc/stdio/sscanf.c,v 1.6 1999/08/28 00:01:17 peter Exp $
- * $DragonFly: src/lib/libc/stdio/sscanf.c,v 1.4 2004/06/07 20:35:41 hmp Exp $
+ * $DragonFly: src/lib/libc/stdio/sscanf.c,v 1.5 2005/05/09 12:43:40 davidxu Exp $
  */
 
 #include <stdio.h>
@@ -59,6 +59,7 @@ sscanf(const char *str, char const *fmt, ...)
        int ret;
        va_list ap;
        FILE f;
+       struct __sFILEX ext;
 
        f._file = -1;
        f._flags = __SRD;
@@ -67,6 +68,8 @@ sscanf(const char *str, char const *fmt, ...)
        f._read = eofread;
        f._ub._base = NULL;
        f._lb._base = NULL;
+       f._extra = &ext;
+       INITEXTRA(&f);
        va_start(ap, fmt);
        ret = __svfscanf(&f, fmt, ap);
        va_end(ap);
index c266370..b4bf487 100644 (file)
@@ -35,7 +35,7 @@
  *
  * @(#)ungetc.c        8.2 (Berkeley) 11/3/93
  * $FreeBSD: src/lib/libc/stdio/ungetc.c,v 1.7.2.1 2001/03/05 11:27:49 obrien Exp $
- * $DragonFly: src/lib/libc/stdio/ungetc.c,v 1.4 2005/01/31 22:29:40 dillon Exp $
+ * $DragonFly: src/lib/libc/stdio/ungetc.c,v 1.5 2005/05/09 12:43:40 davidxu Exp $
  */
 
 #include "namespace.h"
@@ -163,7 +163,7 @@ __ungetc(int c, FILE *fp)
         * Initially, we will use the `reserve' buffer.
         */
        fp->_ur = fp->_r;
-       fp->_up = fp->_p;
+       fp->_extra->_up = fp->_p;
        fp->_ub._base = fp->_ubuf;
        fp->_ub._size = sizeof(fp->_ubuf);
        fp->_ubuf[sizeof(fp->_ubuf) - 1] = c;
index 483a1c1..3dde209 100644 (file)
@@ -27,7 +27,7 @@
  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/lib/libc/stdio/vasprintf.c,v 1.11 1999/08/28 00:01:19 peter Exp $
- * $DragonFly: src/lib/libc/stdio/vasprintf.c,v 1.4 2005/01/31 22:29:40 dillon Exp $
+ * $DragonFly: src/lib/libc/stdio/vasprintf.c,v 1.5 2005/05/09 12:43:40 davidxu Exp $
  */
 
 #include <stdio.h>
@@ -41,6 +41,7 @@ vasprintf(char **str, const char *fmt, va_list ap)
 {
        int ret;
        FILE f;
+       struct __sFILEX ext;
 
        f._file = -1;
        f._flags = __SWR | __SSTR | __SALC;
@@ -51,6 +52,8 @@ vasprintf(char **str, const char *fmt, va_list ap)
                return (-1);
        }
        f._bf._size = f._w = 127;               /* Leave room for the NULL */
+       f._extra = &ext;
+       INITEXTRA(&f);
        ret = __vfprintf(&f, fmt, ap);
        *f._p = '\0';
        f._bf._base = reallocf(f._bf._base, f._bf._size + 1);
index 561a570..ae50c9c 100644 (file)
@@ -35,7 +35,7 @@
  *
  * @(#)vfprintf.c      8.1 (Berkeley) 6/4/93
  * $FreeBSD: src/lib/libc/stdio/vfprintf.c,v 1.34 2001/12/13 19:45:41 phantom Exp $
- * $DragonFly: src/lib/libc/stdio/vfprintf.c,v 1.8 2005/04/21 16:36:35 joerg Exp $
+ * $DragonFly: src/lib/libc/stdio/vfprintf.c,v 1.9 2005/05/09 12:43:40 davidxu Exp $
  */
 
 /*
@@ -158,6 +158,7 @@ __sbprintf(FILE *fp, const char *fmt, va_list ap)
        fake._file = fp->_file;
        fake._cookie = fp->_cookie;
        fake._write = fp->_write;
+       fake._extra = fp->_extra;
 
        /* set up the buffer */
        fake._bf._base = fake._p = buf;
index d4c75fd..11ee3fc 100644 (file)
@@ -35,7 +35,7 @@
  *
  * @(#)vsnprintf.c     8.1 (Berkeley) 6/4/93
  * $FreeBSD: src/lib/libc/stdio/vsnprintf.c,v 1.12.2.1 2002/09/23 06:58:17 maxim Exp $
- * $DragonFly: src/lib/libc/stdio/vsnprintf.c,v 1.4 2005/01/31 22:29:40 dillon Exp $
+ * $DragonFly: src/lib/libc/stdio/vsnprintf.c,v 1.5 2005/05/09 12:43:40 davidxu Exp $
  */
 
 #include <limits.h>
@@ -50,6 +50,7 @@ vsnprintf(char *str, size_t n, const char *fmt, va_list ap)
        int ret;
        char dummy;
        FILE f;
+       struct __sFILEX ext;
 
        on = n;
        if (n != 0)
@@ -65,6 +66,8 @@ vsnprintf(char *str, size_t n, const char *fmt, va_list ap)
        f._flags = __SWR | __SSTR;
        f._bf._base = f._p = (unsigned char *)str;
        f._bf._size = f._w = n;
+       f._extra = &ext;
+       INITEXTRA(&f);
        ret = __vfprintf(&f, fmt, ap);
        if (on > 0)
                *f._p = '\0';
index 8739ab1..d8dd830 100644 (file)
@@ -35,7 +35,7 @@
  *
  * @(#)vsprintf.c      8.1 (Berkeley) 6/4/93
  * $FreeBSD: src/lib/libc/stdio/vsprintf.c,v 1.6 1999/08/28 00:01:21 peter Exp $
- * $DragonFly: src/lib/libc/stdio/vsprintf.c,v 1.4 2005/01/31 22:29:40 dillon Exp $
+ * $DragonFly: src/lib/libc/stdio/vsprintf.c,v 1.5 2005/05/09 12:43:40 davidxu Exp $
  */
 
 #include <stdio.h>
@@ -48,11 +48,14 @@ vsprintf(char *str, const char *fmt, va_list ap)
 {
        int ret;
        FILE f;
+       struct __sFILEX ext;
 
        f._file = -1;
        f._flags = __SWR | __SSTR;
        f._bf._base = f._p = (unsigned char *)str;
        f._bf._size = f._w = INT_MAX;
+       f._extra = &ext;
+       INITEXTRA(&f);
        ret = __vfprintf(&f, fmt, ap);
        *f._p = 0;
        return (ret);
index 6f0fcf7..8d658f9 100644 (file)
  *
  * @(#)vsscanf.c       8.1 (Berkeley) 6/4/93
  * $FreeBSD: src/lib/libc/stdio/vsscanf.c,v 1.7 1999/08/28 00:01:22 peter Exp $
- * $DragonFly: src/lib/libc/stdio/vsscanf.c,v 1.5 2004/06/07 20:35:41 hmp Exp $
+ * $DragonFly: src/lib/libc/stdio/vsscanf.c,v 1.6 2005/05/09 12:43:40 davidxu Exp $
  */
 
 #include <stdio.h>
 #include <stdarg.h>
 #include <string.h>
+#include "local.h"
 
 static int
 eofread (void *, char *, int);
@@ -57,6 +58,7 @@ int
 vsscanf(const char *str, const char *fmt, va_list ap)
 {
        FILE f;
+       struct __sFILEX ext;
 
        f._file = -1;
        f._flags = __SRD;
@@ -65,5 +67,7 @@ vsscanf(const char *str, const char *fmt, va_list ap)
        f._read = eofread;
        f._ub._base = NULL;
        f._lb._base = NULL;
+       f._extra = &ext;
+       INITEXTRA(&f);
        return (__svfscanf(&f, fmt, ap));
 }