[15/31] ldbl-128ibm-compat: Add syslog functions

Message ID 20191015190529.11559-16-gabriel@inconstante.net.br
State Superseded
Headers

Commit Message

Gabriel F. T. Gomes Oct. 15, 2019, 7:05 p.m. UTC
  From: "Gabriel F. T. Gomes" <gabrielftg@linux.ibm.com>

I'm using 'syslog (LOG_DEBUG, etc.);' and support_capture_subprocess in
the test case, which I believe will not print to the console, but I'm
not sure if changing some system setting to high verbosity will disturb
people's lives.  Please advise.  :)

-- 8< --
Similarly to __vfprintf_internal and __vfscanf_internal, the internal
implementation of syslog functions (__vsyslog_internal) takes a
'mode_flags' parameter used to select the format of long double
parameters.  This patch adds variants of the syslog functions that set
'mode_flags' to PRINTF_LDBL_USES_FLOAT128, thus enabling the correct
printing of long double values on powerpc64le, when long double has IEEE
binary128 format (-mabi=ieeelongdouble).

Tested for powerpc64le.
---
 sysdeps/ieee754/ldbl-128ibm-compat/Makefile   | 11 +++-
 sysdeps/ieee754/ldbl-128ibm-compat/Versions   |  5 ++
 .../ldbl-128ibm-compat/ieee128-syslog.c       | 65 ++++++++++++++++++
 .../test-syslog-chk-ibm128.c                  |  1 +
 .../test-syslog-chk-ieee128.c                 |  1 +
 .../test-syslog-chk-ldbl-compat.c             |  6 ++
 .../ldbl-128ibm-compat/test-syslog-ibm128.c   |  1 +
 .../ldbl-128ibm-compat/test-syslog-ieee128.c  |  1 +
 .../test-syslog-ldbl-compat-template.c        | 66 +++++++++++++++++++
 .../test-syslog-ldbl-compat.c                 |  6 ++
 10 files changed, 162 insertions(+), 1 deletion(-)
 create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/ieee128-syslog.c
 create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/test-syslog-chk-ibm128.c
 create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/test-syslog-chk-ieee128.c
 create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/test-syslog-chk-ldbl-compat.c
 create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/test-syslog-ibm128.c
 create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/test-syslog-ieee128.c
 create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/test-syslog-ldbl-compat-template.c
 create mode 100644 sysdeps/ieee754/ldbl-128ibm-compat/test-syslog-ldbl-compat.c
  

Comments

Joseph Myers Oct. 15, 2019, 8:59 p.m. UTC | #1
On Tue, 15 Oct 2019, Gabriel F. T. Gomes wrote:

> From: "Gabriel F. T. Gomes" <gabrielftg@linux.ibm.com>
> 
> I'm using 'syslog (LOG_DEBUG, etc.);' and support_capture_subprocess in
> the test case, which I believe will not print to the console, but I'm
> not sure if changing some system setting to high verbosity will disturb
> people's lives.  Please advise.  :)

You need to avoid sending anything to the real system logs at all in 
syslog tests.  That is, if anything called by the test would end up 
calling the code in openlog_internal that connects to a socket at 
_PATH_LOG, you need a container test and need to ensure some suitable 
setup of _PATH_LOG within the container.
  
Gabriel F. T. Gomes Oct. 21, 2019, 1:50 a.m. UTC | #2
On Tue, 15 Oct 2019, Joseph Myers wrote:

>You need to avoid sending anything to the real system logs at all in 
>syslog tests.  That is, if anything called by the test would end up 
>calling the code in openlog_internal that connects to a socket at 
>_PATH_LOG, you need a container test and need to ensure some suitable 
>setup of _PATH_LOG within the container.

Thanks, Joseph.  I'm working on this for v2.
  

Patch

diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/Makefile b/sysdeps/ieee754/ldbl-128ibm-compat/Makefile
index 9e8237d075..c53d4ed766 100644
--- a/sysdeps/ieee754/ldbl-128ibm-compat/Makefile
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/Makefile
@@ -244,7 +244,8 @@  endif
 
 ifeq ($(subdir),misc)
 ldbl-extra-routines += err \
-		       error
+		       error \
+		       syslog
 
 tests-internal += tst-ibm128-warn tst-ieee128-warn
 tests-internal += tst-ibm128-error tst-ieee128-error
@@ -260,6 +261,14 @@  CFLAGS-tst-ibm128-error.c += -mabi=ibmlongdouble -Wno-psabi
 
 CFLAGS-tst-ieee128-warn.c += -mfloat128 -mabi=ieeelongdouble -Wno-psabi
 CFLAGS-tst-ieee128-error.c += -mfloat128 -mabi=ieeelongdouble -Wno-psabi
+
+tests-internal += test-syslog-ieee128 test-syslog-ibm128
+CFLAGS-test-syslog-ieee128.c += -mfloat128 -mabi=ieeelongdouble -Wno-psabi
+CFLAGS-test-syslog-ibm128.c += -mabi=ibmlongdouble -Wno-psabi
+
+tests-internal += test-syslog-chk-ieee128 test-syslog-chk-ibm128
+CFLAGS-test-syslog-chk-ieee128.c += -mfloat128 -mabi=ieeelongdouble -Wno-psabi
+CFLAGS-test-syslog-chk-ibm128.c += -mabi=ibmlongdouble -Wno-psabi
 endif
 
 # Add IEEE binary128 files as make targets.
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/Versions b/sysdeps/ieee754/ldbl-128ibm-compat/Versions
index f59dfb59fe..b7aa9f7993 100644
--- a/sysdeps/ieee754/ldbl-128ibm-compat/Versions
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/Versions
@@ -170,6 +170,11 @@  libc {
     __obstack_printf_chkieee128;
     __obstack_vprintf_chkieee128;
 
+    __syslogieee128;
+    __vsyslogieee128;
+    __syslog_chkieee128;
+    __vsyslog_chkieee128;
+
     __fscanfieee128;
     __scanfieee128;
     __sscanfieee128;
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-syslog.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-syslog.c
new file mode 100644
index 0000000000..fa16cc9aaf
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-syslog.c
@@ -0,0 +1,65 @@ 
+/* Wrapper for syslog.  IEEE128 version.
+   Copyright (C) 2018 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <stdarg.h>
+#include <libioP.h>
+#include <syslog.h>
+
+void
+___ieee128_syslog (int pri, const char *fmt, ...)
+{
+  va_list ap;
+
+  va_start (ap, fmt);
+  __vsyslog_internal (pri, fmt, ap, PRINTF_LDBL_USES_FLOAT128);
+  va_end (ap);
+}
+strong_alias (___ieee128_syslog, __syslogieee128)
+
+void
+___ieee128_vsyslog (int pri, const char *fmt, va_list ap)
+{
+  __vsyslog_internal (pri, fmt, ap, PRINTF_LDBL_USES_FLOAT128);
+}
+strong_alias (___ieee128_vsyslog, __vsyslogieee128)
+
+void
+___ieee128_syslog_chk (int pri, int flag, const char *fmt, ...)
+{
+  va_list ap;
+
+  unsigned int mode = PRINTF_LDBL_USES_FLOAT128;
+  if (flag > 0)
+    mode |= PRINTF_FORTIFY;
+
+  va_start (ap, fmt);
+  __vsyslog_internal (pri, fmt, ap, mode);
+  va_end (ap);
+}
+strong_alias (___ieee128_syslog_chk, __syslog_chkieee128)
+
+void
+___ieee128_vsyslog_chk (int pri, int flag, const char *fmt, va_list ap)
+{
+  unsigned int mode = PRINTF_LDBL_USES_FLOAT128;
+  if (flag > 0)
+    mode |= PRINTF_FORTIFY;
+
+  __vsyslog_internal (pri, fmt, ap, mode);
+}
+strong_alias (___ieee128_vsyslog_chk, __vsyslog_chkieee128)
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/test-syslog-chk-ibm128.c b/sysdeps/ieee754/ldbl-128ibm-compat/test-syslog-chk-ibm128.c
new file mode 100644
index 0000000000..bf42582687
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/test-syslog-chk-ibm128.c
@@ -0,0 +1 @@ 
+#include <test-syslog-chk-ldbl-compat.c>
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/test-syslog-chk-ieee128.c b/sysdeps/ieee754/ldbl-128ibm-compat/test-syslog-chk-ieee128.c
new file mode 100644
index 0000000000..bf42582687
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/test-syslog-chk-ieee128.c
@@ -0,0 +1 @@ 
+#include <test-syslog-chk-ldbl-compat.c>
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/test-syslog-chk-ldbl-compat.c b/sysdeps/ieee754/ldbl-128ibm-compat/test-syslog-chk-ldbl-compat.c
new file mode 100644
index 0000000000..513b2d2064
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/test-syslog-chk-ldbl-compat.c
@@ -0,0 +1,6 @@ 
+#define _FORTIFY_SOURCE 2
+#define SYSLOG_FUNCTION __syslog_chk
+#define SYSLOG_FUNCTION_PARAMS (LOG_DEBUG, 1, "%Lf\n", ld)
+#define VSYSLOG_FUNCTION __vsyslog_chk
+#define VSYSLOG_FUNCTION_PARAMS (LOG_DEBUG, 1, "%Lf\n", ap)
+#include <test-syslog-ldbl-compat-template.c>
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/test-syslog-ibm128.c b/sysdeps/ieee754/ldbl-128ibm-compat/test-syslog-ibm128.c
new file mode 100644
index 0000000000..8e64440e8c
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/test-syslog-ibm128.c
@@ -0,0 +1 @@ 
+#include <test-syslog-ldbl-compat.c>
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/test-syslog-ieee128.c b/sysdeps/ieee754/ldbl-128ibm-compat/test-syslog-ieee128.c
new file mode 100644
index 0000000000..8e64440e8c
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/test-syslog-ieee128.c
@@ -0,0 +1 @@ 
+#include <test-syslog-ldbl-compat.c>
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/test-syslog-ldbl-compat-template.c b/sysdeps/ieee754/ldbl-128ibm-compat/test-syslog-ldbl-compat-template.c
new file mode 100644
index 0000000000..05a9640236
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/test-syslog-ldbl-compat-template.c
@@ -0,0 +1,66 @@ 
+/* Test for the long double variants of *syslog* functions.
+   Copyright (C) 2018 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <stdarg.h>
+#include <stddef.h>
+#include <syslog.h>
+
+#include <support/capture_subprocess.h>
+#include <support/check.h>
+
+static void
+do_test_one_call (void *last, ...)
+{
+  long double ld = -1;
+  va_list ap;
+
+  /* Make syslog functions write to stderr with LOG_PERROR.  */
+  openlog ("test-syslog", LOG_PERROR | LOG_ODELAY, LOG_USER);
+
+  /* Call syslog functions that take a format string.  */
+  SYSLOG_FUNCTION SYSLOG_FUNCTION_PARAMS;
+  va_start (ap, last);
+  VSYSLOG_FUNCTION VSYSLOG_FUNCTION_PARAMS;
+  va_end (ap);
+}
+
+static void
+do_test_call (void)
+{
+  long double ld = -1;
+  do_test_one_call (NULL, ld);
+}
+
+static int
+do_test (void)
+{
+  struct support_capture_subprocess result;
+  result = support_capture_subprocess ((void *) &do_test_call, NULL);
+
+  do_test_call ();
+
+  /* Compare against the expected output.  */
+  const char *expected =
+    "test-syslog: -1.000000\n"
+    "test-syslog: -1.000000\n";
+  TEST_COMPARE_STRING (expected, result.err.buffer);
+
+  return 0;
+}
+
+#include <support/test-driver.c>
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/test-syslog-ldbl-compat.c b/sysdeps/ieee754/ldbl-128ibm-compat/test-syslog-ldbl-compat.c
new file mode 100644
index 0000000000..ff0c0a5813
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/test-syslog-ldbl-compat.c
@@ -0,0 +1,6 @@ 
+#define _FORTIFY_SOURCE 0
+#define SYSLOG_FUNCTION syslog
+#define SYSLOG_FUNCTION_PARAMS (LOG_DEBUG, "%Lf\n", ld)
+#define VSYSLOG_FUNCTION vsyslog
+#define VSYSLOG_FUNCTION_PARAMS (LOG_DEBUG, "%Lf\n", ap)
+#include <test-syslog-ldbl-compat-template.c>