From fcac8ff97f6b6cced6546e0096cadc1039b68b5e Mon Sep 17 00:00:00 2001 From: Elliott Hughes Date: Thu, 22 May 2014 01:24:30 -0700 Subject: [PATCH] Switch to POSIX dprintf/vdprintf. Bug: 11156955 Change-Id: I734bd02db514367ab119a48304aae9767958e367 --- libc/Android.mk | 3 +- libc/bionic/fdprintf.c | 58 --------------- libc/bionic/ndk_cruft.cpp | 15 ++++ libc/include/stdio.h | 18 +---- .../upstream-openbsd/lib/libc/stdio/dprintf.c | 48 ++++++++++++ .../lib/libc/stdio/vdprintf.c | 73 +++++++++++++++++++ 6 files changed, 141 insertions(+), 74 deletions(-) delete mode 100644 libc/bionic/fdprintf.c create mode 100644 libc/upstream-openbsd/lib/libc/stdio/dprintf.c create mode 100644 libc/upstream-openbsd/lib/libc/stdio/vdprintf.c diff --git a/libc/Android.mk b/libc/Android.mk index 53a122ec2..f19a989b7 100644 --- a/libc/Android.mk +++ b/libc/Android.mk @@ -43,7 +43,6 @@ libc_common_src_files := \ bionic/err.c \ bionic/ether_aton.c \ bionic/ether_ntoa.c \ - bionic/fdprintf.c \ bionic/ftime.c \ bionic/fts.c \ bionic/getdtablesize.c \ @@ -371,6 +370,7 @@ libc_upstream_openbsd_src_files := \ upstream-openbsd/lib/libc/net/ntohs.c \ upstream-openbsd/lib/libc/stdio/asprintf.c \ upstream-openbsd/lib/libc/stdio/clrerr.c \ + upstream-openbsd/lib/libc/stdio/dprintf.c \ upstream-openbsd/lib/libc/stdio/fdopen.c \ upstream-openbsd/lib/libc/stdio/feof.c \ upstream-openbsd/lib/libc/stdio/ferror.c \ @@ -435,6 +435,7 @@ libc_upstream_openbsd_src_files := \ upstream-openbsd/lib/libc/stdio/ungetc.c \ upstream-openbsd/lib/libc/stdio/ungetwc.c \ upstream-openbsd/lib/libc/stdio/vasprintf.c \ + upstream-openbsd/lib/libc/stdio/vdprintf.c \ upstream-openbsd/lib/libc/stdio/vfprintf.c \ upstream-openbsd/lib/libc/stdio/vfscanf.c \ upstream-openbsd/lib/libc/stdio/vfwprintf.c \ diff --git a/libc/bionic/fdprintf.c b/libc/bionic/fdprintf.c deleted file mode 100644 index c1d05add5..000000000 --- a/libc/bionic/fdprintf.c +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * 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 COPYRIGHT HOLDERS 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 - * COPYRIGHT OWNER 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 -#include -#include -#include - -int vfdprintf(int fd, const char * __restrict format, __va_list ap) -{ - char *buf=0; - int ret; - ret = vasprintf(&buf, format, ap); - if (ret < 0) - goto end; - - ret = write(fd, buf, ret); - free(buf); -end: - return ret; -} - -int fdprintf(int fd, const char * __restrict format, ...) -{ - __va_list ap; - int ret; - - va_start(ap, format); - ret = vfdprintf(fd, format, ap); - va_end(ap); - - return ret; -} diff --git a/libc/bionic/ndk_cruft.cpp b/libc/bionic/ndk_cruft.cpp index 2fed492f0..295418bc2 100644 --- a/libc/bionic/ndk_cruft.cpp +++ b/libc/bionic/ndk_cruft.cpp @@ -32,6 +32,7 @@ #include #include #include +#include #include #include #include @@ -184,4 +185,18 @@ extern "C" intmax_t strntoimax(const char* nptr, char** endptr, int base, size_t return (intmax_t) strntoumax(nptr, endptr, base, n); } +// POSIX calls this dprintf, but LP32 Android had fdprintf instead. +extern "C" int fdprintf(int fd, const char* fmt, ...) { + va_list ap; + va_start(ap, fmt); + int rc = vdprintf(fd, fmt, ap); + va_end(ap); + return rc; +} + +// POSIX calls this vdprintf, but LP32 Android had fdprintf instead. +extern "C" int vfdprintf(int fd, const char* fmt, va_list ap) { + return vdprintf(fd, fmt, ap); +} + #endif diff --git a/libc/include/stdio.h b/libc/include/stdio.h index 470d37770..90f595c9e 100644 --- a/libc/include/stdio.h +++ b/libc/include/stdio.h @@ -250,6 +250,9 @@ int vfprintf(FILE * __restrict, const char * __restrict, __va_list) int vprintf(const char * __restrict, __va_list) __printflike(1, 0); +int dprintf(int, const char * __restrict, ...) __printflike(2, 3); +int vdprintf(int, const char * __restrict, __va_list) __printflike(2, 0); + #ifndef __AUDIT__ char* gets(char*) __warnattr("gets is very unsafe; consider using fgets"); int sprintf(char* __restrict, const char* __restrict, ...) @@ -359,21 +362,6 @@ __END_DECLS #define fwopen(cookie, fn) funopen(cookie, 0, fn, 0, 0) #endif /* __BSD_VISIBLE */ -#ifdef _GNU_SOURCE -/* - * glibc defines dprintf(int, const char*, ...), which is poorly named - * and likely to conflict with locally defined debugging printfs - * fdprintf is a better name, and some programs that use fdprintf use a - * #define fdprintf dprintf for compatibility - */ -__BEGIN_DECLS -int fdprintf(int, const char*, ...) - __printflike(2, 3); -int vfdprintf(int, const char*, __va_list) - __printflike(2, 0); -__END_DECLS -#endif /* _GNU_SOURCE */ - #if defined(__BIONIC_FORTIFY) __BEGIN_DECLS diff --git a/libc/upstream-openbsd/lib/libc/stdio/dprintf.c b/libc/upstream-openbsd/lib/libc/stdio/dprintf.c new file mode 100644 index 000000000..dbf7d3457 --- /dev/null +++ b/libc/upstream-openbsd/lib/libc/stdio/dprintf.c @@ -0,0 +1,48 @@ +/* $OpenBSD: dprintf.c,v 1.1 2013/01/30 00:08:13 brad Exp $ */ +/* $FreeBSD: src/lib/libc/stdio/dprintf.c,v 1.2 2012/11/17 01:49:39 svnexp Exp $ */ + +/*- + * Copyright (c) 2009 David Schultz + * 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 +#include + +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; +} diff --git a/libc/upstream-openbsd/lib/libc/stdio/vdprintf.c b/libc/upstream-openbsd/lib/libc/stdio/vdprintf.c new file mode 100644 index 000000000..49c196977 --- /dev/null +++ b/libc/upstream-openbsd/lib/libc/stdio/vdprintf.c @@ -0,0 +1,73 @@ +/* $OpenBSD: vdprintf.c,v 1.1 2013/01/30 00:08:13 brad Exp $ */ +/* $FreeBSD: src/lib/libc/stdio/vdprintf.c,v 1.4 2012/11/17 01:49:40 svnexp Exp $ */ + +/*- + * Copyright (c) 2009 David Schultz + * 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 +#include +#include +#include +#include + +#include "local.h" + +static int +__dwrite(void *cookie, const char *buf, int n) +{ + int *fdp = cookie; + return (write(*fdp, buf, n)); +} + +int +vdprintf(int fd, const char * __restrict fmt, va_list ap) +{ + FILE f; + struct __sfileext fext; + unsigned char buf[BUFSIZ]; + int ret; + + _FILEEXT_SETUP(&f, &fext); + + f._p = buf; + f._w = sizeof(buf); + f._flags = __SWR; + f._file = -1; + f._bf._base = buf; + f._bf._size = sizeof(buf); + f._cookie = &fd; + f._write = __dwrite; + + if ((ret = __vfprintf(&f, fmt, ap)) < 0) + return ret; + + return fflush(&f) ? EOF : ret; +}