setlocale() sets errno to ENOENT ... open("/usr/lib/locale/de_DE.UTF-8/LC_NUMERIC", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) open("/usr/lib/locale/de_DE.utf8/LC_NUMERIC", O_RDONLY|O_CLOEXEC) = 3 and this causes a problem later on (bsc#908516) --- free.c | 5 +++++ 1 file changed, 5 insertions(+) --- free.c +++ free.c 2018-04-04 12:47:06.360757839 +0000 @@ -197,6 +197,7 @@ int main(int argc, char **argv) { int c, flags = 0, unit_set = 0; struct commandline_arguments args; + int errsv; /* * For long options that have no equivalent short option, use a @@ -247,10 +248,12 @@ int main(int argc, char **argv) #ifdef HAVE_PROGRAM_INVOCATION_NAME program_invocation_name = program_invocation_short_name; #endif + errsv = errno; setlocale (LC_ALL, ""); bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); atexit(close_stdout); + errno = errsv; while ((c = getopt_long(argc, argv, "bkmghltCc:ws:V", longopts, NULL)) != -1) switch (c) { @@ -317,11 +320,13 @@ int main(int argc, char **argv) break; case 's': flags |= FREE_REPEAT; + errsv = errno; errno = 0; args.repeat_interval = (1000000 * strtod_nol_or_err(optarg, "seconds argument failed")); if (args.repeat_interval < 1) xerrx(EXIT_FAILURE, _("seconds argument `%s' is not positive number"), optarg); + errno = errsv; break; case 'c': flags |= FREE_REPEAT;