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.