This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[PATCH roland/env-only] Avoid re-exec-self in bug-setlocale1.
- From: Roland McGrath <roland at hack dot frob dot com>
- To: "GNU C. Library" <libc-alpha at sourceware dot org>
- Date: Wed, 4 Mar 2015 13:23:23 -0800 (PST)
- Subject: [PATCH roland/env-only] Avoid re-exec-self in bug-setlocale1.
- Authentication-results: sourceware.org; auth=none
This extends the makefile infrastructure for tests to use a variable
<testname>-ENV-only that is like the existing <testname>-ENV but for
cases where the test program should run with a completely bare
environment except for the explicit assignments in the makefile.
This lets us get rid of the use of execve in bug-setlocale1 (and any
similar cases I have not yet noticed).
Unless there are objections, I'll commit this by Thursday.
Thanks,
Roland
2015-03-04 Roland McGrath <roland@hack.frob.com>
* Makeconfig (test-wrapper-env-only): New variable.
* Rules (make-test-out): If variable $*-ENV-only is nonempty,
then use that with $(test-wrapper-env-only) rather than using
$(test-wrapper-env) $(run-program-env) $($*-ENV).
localedata/
2015-03-04 Roland McGrath <roland@hack.frob.com>
* bug-setlocale1.c (do_test): Remove argument handling and
self-exec'ing logic. Just expect to be run with the right
variables (and nothing else) directly in the environment instead.
(TEST_FUNCTION): Don't pass arguments to do_test.
* Makefile (bug-setlocale1-ARGS, bug-setlocale1-static-ARGS):
Variables removed.
(bug-setlocale1-ENV-only, bug-setlocale1-static-ENV-only):
New variables.
--- a/Makeconfig
+++ b/Makeconfig
@@ -611,6 +611,11 @@ endif
ifndef test-wrapper-env
test-wrapper-env = $(test-wrapper) env
endif
+# Likewise, but the program's environment will be empty except for any
+# explicit <variable>=<value> assignments preceding the program name.
+ifndef test-wrapper-env-only
+test-wrapper-env-only = $(test-wrapper) env -i
+endif
# Whether to run test programs built for the library's host system.
ifndef run-built-tests
--- a/Rules
+++ b/Rules
@@ -186,9 +186,11 @@ ifneq "$(strip $(tests) $(xtests) $(test-srcs))" ""
# These are the implicit rules for making test outputs
# from the test programs and whatever input files are present.
-make-test-out = $(test-wrapper-env) \
- $(run-program-env) \
- $($*-ENV) $(host-test-program-cmd) $($*-ARGS)
+define make-test-out
+$(if $($*-ENV-only),$(test-wrapper-env-only) $($*-ENV-only),\
+ $(test-wrapper-env) $(run-program-env) $($*-ENV)) \
+$(host-test-program-cmd) $($*-ARGS)
+endef
$(objpfx)%.out: %.input $(objpfx)%
$(make-test-out) > $@ < $(word 1,$^); \
$(evaluate-test)
--- a/localedata/Makefile
+++ b/localedata/Makefile
@@ -237,8 +237,8 @@ $(objpfx)mtrace-tst-leaks.out: $(objpfx)tst-leaks.out
$(common-objpfx)malloc/mtrace $(objpfx)tst-leaks.mtrace > $@; \
$(evaluate-test)
-bug-setlocale1-ARGS = -- $(host-test-program-cmd)
-bug-setlocale1-static-ARGS = $(bug-setlocale1-ARGS)
+bug-setlocale1-ENV-only = LOCPATH=$(objpfx) LC_CTYPE=de_DE.UTF-8
+bug-setlocale1-static-ENV-only = $(bug-setlocale1-ENV-only)
$(objdir)/iconvdata/gconv-modules:
$(MAKE) -C ../iconvdata subdir=iconvdata $@
--- a/localedata/bug-setlocale1.c
+++ b/localedata/bug-setlocale1.c
@@ -7,44 +7,8 @@
static int
-do_test (int argc, char *argv[])
+do_test (void)
{
- if (argc > 1)
- {
- char *newargv[5];
- int i;
- if (argc != 2 && argc != 5)
- {
- printf ("wrong number of arguments (%d)\n", argc);
- return 1;
- }
-
- for (i = 0; i < (argc == 5 ? 4 : 1); i++)
- newargv[i] = argv[i + 1];
- newargv[i] = NULL;
-
- char *env[3];
- env[0] = (char *) "LC_CTYPE=de_DE.UTF-8";
- char *loc = getenv ("LOCPATH");
- if (loc == NULL || loc[0] == '\0')
- {
- puts ("LOCPATH not set");
- return 1;
- }
- asprintf (&env[1], "LOCPATH=%s", loc);
- if (env[1] == NULL)
- {
- puts ("asprintf failed");
- return 1;
- }
- env[2] = NULL;
-
- execve (newargv[0], newargv, env);
-
- puts ("execve returned");
- return 1;
- }
-
int result = 0;
char *a = setlocale (LC_ALL, "");
@@ -128,5 +92,5 @@ do_test (int argc, char *argv[])
return result;
}
-#define TEST_FUNCTION do_test (argc, argv)
+#define TEST_FUNCTION do_test ()
#include "../test-skeleton.c"