Here is a diff to add support for the POSIX functions dprintf(3)
and vdprintf(3).


Index: lib/libc/shlib_version
===================================================================
RCS file: /cvs/src/lib/libc/shlib_version,v
retrieving revision 1.146
diff -u -p -r1.146 shlib_version
--- lib/libc/shlib_version      3 Dec 2012 20:08:33 -0000       1.146
+++ lib/libc/shlib_version      23 Jan 2013 06:15:32 -0000
@@ -1,4 +1,4 @@
 major=66
-minor=1
+minor=2
 # note: If changes were made to include/thread_private.h or if system
 # calls were added/changed then librthread/shlib_version also be updated.
Index: include/stdio.h
===================================================================
RCS file: /cvs/src/include/stdio.h,v
retrieving revision 1.42
diff -u -p -r1.42 stdio.h
--- include/stdio.h     21 Mar 2012 23:44:35 -0000      1.42
+++ include/stdio.h     23 Jan 2013 06:15:32 -0000
@@ -212,6 +212,9 @@ __END_DECLS
  */
 __BEGIN_DECLS
 void    clearerr(FILE *);
+#if __POSIX_VISIBLE >= 200809
+int     dprintf(int, const char * __restrict, ...);
+#endif
 int     fclose(FILE *);
 int     feof(FILE *);
 int     ferror(FILE *);
@@ -272,6 +275,9 @@ int  ungetc(int, FILE *);
 int     vfprintf(FILE *, const char *, __va_list);
 int     vprintf(const char *, __va_list);
 int     vsprintf(char *, const char *, __va_list);
+#if __POSIX_VISIBLE >= 200809
+int     vdprintf(int, const char * __restrict, __va_list);
+#endif
 
 #if __ISO_C_VISIBLE >= 1999 || __BSD_VISIBLE
 int     snprintf(char *, size_t, const char *, ...)
Index: lib/libc/stdio/Makefile.inc
===================================================================
RCS file: /cvs/src/lib/libc/stdio/Makefile.inc,v
retrieving revision 1.22
diff -u -p -r1.22 Makefile.inc
--- lib/libc/stdio/Makefile.inc 21 Mar 2012 23:44:35 -0000      1.22
+++ lib/libc/stdio/Makefile.inc 23 Jan 2013 06:15:32 -0000
@@ -19,7 +19,7 @@ SRCS+=        asprintf.c clrerr.c fclose.c fdop
        putwc.c putwchar.c ungetwc.c \
        fwprintf.c swprintf.c vfwprintf.c vswprintf.c vwprintf.c wprintf.c \
        fwscanf.c swscanf.c vfwscanf.c vswscanf.c vwscanf.c wscanf.c \
-       getdelim.c getline.c
+       getdelim.c getline.c dprintf.c vdprintf.c
 
 MAN+=  fclose.3 ferror.3 fflush.3 fgetln.3 fgets.3 fopen.3 fputs.3 \
        fread.3 fseek.3 funopen.3 getc.3 mktemp.3 perror.3 printf.3 putc.3 \
@@ -43,7 +43,8 @@ MLINKS+=mktemp.3 mkdtemp.3
 MLINKS+=mktemp.3 mkstemps.3
 MLINKS+=printf.3 fprintf.3 printf.3 snprintf.3 printf.3 sprintf.3 \
        printf.3 vfprintf.3 printf.3 vprintf.3 printf.3 vsnprintf.3 \
-       printf.3 vsprintf.3 printf.3 asprintf.3 printf.3 vasprintf.3
+       printf.3 vsprintf.3 printf.3 asprintf.3 printf.3 vasprintf.3 \
+       printf.3 dprintf.3 printf.3 vdprintf.3
 MLINKS+=putc.3 fputc.3 putc.3 putchar.3 putc.3 putw.3
 MLINKS+=scanf.3 fscanf.3 scanf.3 sscanf.3 scanf.3 vfscanf.3 scanf.3 vscanf.3 \
        scanf.3 vsscanf.3
Index: lib/libc/stdio/dprintf.c
===================================================================
RCS file: lib/libc/stdio/dprintf.c
diff -N lib/libc/stdio/dprintf.c
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ lib/libc/stdio/dprintf.c    23 Jan 2013 06:15:32 -0000
@@ -0,0 +1,48 @@
+/*     $OpenBSD$       */
+/*     $FreeBSD: src/lib/libc/stdio/dprintf.c,v 1.2 2012/11/17 01:49:39 svnexp 
Exp $   */
+
+/*-
+ * Copyright (c) 2009 David Schultz <d...@freebsd.org>
+ * All rights reserved.
+ *
+ * Copyright (c) 2011 The FreeBSD Foundation
+ * All rights reserved.
+ * Portions of this software were developed by David Chisnall
+ * under sponsorship from the FreeBSD Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <stdio.h>
+#include <stdarg.h>
+
+int
+dprintf(int fd, const char * __restrict fmt, ...)
+{
+       va_list ap;
+       int ret;
+
+       va_start(ap, fmt);
+       ret = vdprintf(fd, fmt, ap);
+       va_end(ap);
+       return ret;
+}
Index: lib/libc/stdio/printf.3
===================================================================
RCS file: /cvs/src/lib/libc/stdio/printf.3,v
retrieving revision 1.59
diff -u -p -r1.59 printf.3
--- lib/libc/stdio/printf.3     3 Sep 2011 22:59:07 -0000       1.59
+++ lib/libc/stdio/printf.3     23 Jan 2013 06:15:33 -0000
@@ -42,11 +42,13 @@
 .Nm sprintf ,
 .Nm snprintf ,
 .Nm asprintf ,
+.Nm dprintf ,
 .Nm vprintf ,
 .Nm vfprintf ,
 .Nm vsprintf ,
 .Nm vsnprintf ,
-.Nm vasprintf
+.Nm vasprintf ,
+.Nm vdprintf
 .Nd formatted output conversion
 .Sh SYNOPSIS
 .Fd #include <stdio.h>
@@ -60,6 +62,8 @@
 .Fn snprintf "char *str" "size_t size" "const char *format" ...
 .Ft int
 .Fn asprintf "char **ret" "const char *format" ...
+.Ft int
+.Fn dprintf "int fd" "const char * restrict format" ...
 .Fd #include <stdarg.h>
 .Ft int
 .Fn vprintf "const char *format" "va_list ap"
@@ -71,6 +75,8 @@
 .Fn vsnprintf "char *str" "size_t size" "const char *format" "va_list ap"
 .Ft int
 .Fn vasprintf "char **ret" "const char *format" "va_list ap"
+.Ft int
+.Fn vdprintf "int fd" "const char * restrict format" "va_list ap"
 .Sh DESCRIPTION
 The
 .Fn printf
@@ -95,6 +101,10 @@ and
 .Fn vfprintf
 write output to the supplied stream pointer
 .Fa stream ;
+.Fn dprintf
+and
+.Fn vdprintf
+write output to the given file descriptor;
 .Fn sprintf ,
 .Fn snprintf ,
 .Fn vsprintf ,
@@ -754,6 +764,12 @@ and
 .Fn vsprintf
 functions conform to
 .St -ansiC .
+The
+.Fn dprintf
+and
+.Fn vdprintf
+functions conform to
+.St -p1003.1-2008 .
 .Sh HISTORY
 The functions
 .Fn snprintf
@@ -769,6 +785,13 @@ and
 first appeared in the GNU C library.
 This implementation first appeared in
 .Ox 2.3 .
+.Pp
+The functions
+.Fn dprintf
+and
+.Fn vdprintf
+first appeared in
+.Ox 5.3 .
 .Sh CAVEATS
 The conversion formats
 .Cm \&%D ,
Index: lib/libc/stdio/vdprintf.c
===================================================================
RCS file: lib/libc/stdio/vdprintf.c
diff -N lib/libc/stdio/vdprintf.c
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ lib/libc/stdio/vdprintf.c   23 Jan 2013 06:15:33 -0000
@@ -0,0 +1,84 @@
+/*     $OpenBSD$       */
+/*     $FreeBSD: src/lib/libc/stdio/vdprintf.c,v 1.4 2012/11/17 01:49:40 
svnexp Exp $ */
+
+/*-
+ * Copyright (c) 2009 David Schultz <d...@freebsd.org>
+ * All rights reserved.
+ *
+ * Copyright (c) 2011 The FreeBSD Foundation
+ * All rights reserved.
+ * Portions of this software were developed by David Chisnall
+ * under sponsorship from the FreeBSD Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/stat.h>
+
+#include <errno.h>
+#include <fcntl.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "local.h"
+
+int
+vdprintf(int fd, const char * __restrict fmt, va_list ap)
+{
+       FILE f;
+       struct __sfileext fext;
+       unsigned char buf[BUFSIZ];
+       int ret, fdflags, tmp;
+
+       /* _file is only a short */
+       if (fd > SHRT_MAX) {
+               errno = EMFILE;
+               return EOF;
+       }
+
+       if ((fdflags = fcntl(fd, F_GETFL, 0)) == -1)
+               return EOF;
+
+       tmp = fdflags & O_ACCMODE;
+       if (tmp != O_RDWR && tmp != O_WRONLY) {
+               errno = EINVAL;
+               return EOF;
+       }
+
+       _FILEEXT_SETUP(&f, &fext);
+
+       f._p = buf;
+       f._w = sizeof(buf);
+       f._flags = __SWR;
+       f._file = fd;
+       f._bf._base = buf;
+       f._bf._size = sizeof(buf);
+       f._cookie = &f;
+       f._write = __swrite;
+
+       if ((ret = __vfprintf(&f, fmt, ap)) < 0)
+               return ret;
+
+       return fflush(&f) ? EOF : ret;
+}

-- 
This message has been scanned for viruses and
dangerous content by MailScanner, and is
believed to be clean.

Reply via email to