Message ID | CAMo8BfKboDoohwd_QPGicRai5a+6q9djxq6csFhO2SFZ0tXgfg@mail.gmail.com |
---|---|
State | Awaiting Upstream |
Headers | show |
Hi Max, On Thu, 2016-06-02 at 19:31 +0300, Max Filippov wrote: > Hi Alexey, > > On Wed, Jun 1, 2016 at 10:56 AM, Alexey Brodkin > <Alexey.Brodkin@synopsys.com> wrote: > > > > We are discussing one issue with "util-linux" package building. > > The problem is in "util-linux" wants to use alloc modifier (either "%as" > > or "%ms") in scanf(). > > > > Looks like uClibc still doesn't support neither "%ms" nor "%as" (this one > > is obsolete glibc-specific so let's not bother with it anyways). > a while ago I touched %m support for %c and %[...] in uclibc > (b2d27c71bd13820a4263fa7ebda4c1a4a95b501c), > I've got an impression that %ms was working. I've expanded > test/stdio/scanf_m.c a bit (attached) and it appears to work. > So I'm curious, how the issue manifests itself. During configuration of "util-linux" it tests if "%as" or "ms" could be used when compiling a simple test. If not then "libmount" gets disabled. Then in OpenWRT/Lede on installation of "util-linux" to staging folder explicit "cp" is executed for copying some of "libmount" build artifacts and since "libmount" was never built "cp" fails and so entire build stops. -Alexey
On Thu, Jun 2, 2016 at 7:46 PM, Waldemar Brodkorb <wbx@uclibc-ng.org> wrote: > Hi, > Max Filippov wrote, > >> Hi Alexey, >> >> On Wed, Jun 1, 2016 at 10:56 AM, Alexey Brodkin >> <Alexey.Brodkin@synopsys.com> wrote: >> > We are discussing one issue with "util-linux" package building. >> > The problem is in "util-linux" wants to use alloc modifier (either "%as" >> > or "%ms") in scanf(). >> > >> > Looks like uClibc still doesn't support neither "%ms" nor "%as" (this one >> > is obsolete glibc-specific so let's not bother with it anyways). >> >> a while ago I touched %m support for %c and %[...] in uclibc >> (b2d27c71bd13820a4263fa7ebda4c1a4a95b501c), >> I've got an impression that %ms was working. I've expanded >> test/stdio/scanf_m.c a bit (attached) and it appears to work. >> So I'm curious, how the issue manifests itself. > > Thanks for the patch. > Indeed I was wondering why I have no patch included > in OpenADK. I am overriding the configure check: > CONFIGURE_ENV+= have_scanf_alloc_modifier=yes \ > scanf_cv_alloc_modifier=ms > > So either the autoconf check is faulty or uClibc-ng implementation > is somehow not correct. > > We need to check the autoconf configure check. The check looks like this: | #include <stdio.h> | #include <unistd.h> | | #ifdef __GLIBC__ | | #if !(__GLIBC_PREREQ(2, 7)) | #error %m is not available | #endif | | #elif defined(_POSIX_VERSION) | | #if _POSIX_VERSION < 200809L | #error %m is not available | #endif | | #else | #error Your C-library is not supported. | #endif And its result with uClibc-ng is the following: conftest.c:136:7: error: #error %m is not available #error %m is not available Because we have the following definition in features.h: /* Major and minor version number of the GNU C library package. Use these macros to test for features in specific releases. */ /* Don't do it, if you want to keep uClibc happy. */ #define __GLIBC__ 2 #define __GLIBC_MINOR__ 2
From a018296d1908ad02f942cab0559a24ed3dd261e8 Mon Sep 17 00:00:00 2001 From: Max Filippov <jcmvbkbc@gmail.com> Date: Thu, 2 Jun 2016 18:24:28 +0300 Subject: [PATCH] tests: add %ms scanf format test Signed-off-by: Max Filippov <jcmvbkbc@gmail.com> --- test/stdio/scanf_m.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/test/stdio/scanf_m.c b/test/stdio/scanf_m.c index 0ce78b6..e1dde27 100644 --- a/test/stdio/scanf_m.c +++ b/test/stdio/scanf_m.c @@ -5,20 +5,23 @@ int main(void) { const char *buf = "hello world"; - char *ps = NULL, *pc = NULL; - char s[6], c; + char *ps = NULL, *pc = NULL, *ps2 = NULL; + char s[6], c, s2[5]; - /* Check that %[...]/%c work. */ - sscanf(buf, "%[a-z] %c", s, &c); - /* Check that %m[...]/%mc work. */ - sscanf(buf, "%m[a-z] %mc", &ps, &pc); + /* Check that %[...]/%c/%s work. */ + sscanf(buf, "%[a-z] %c %s", s, &c, s2); + /* Check that %m[...]/%mc/%ms work. */ + sscanf(buf, "%m[a-z] %mc %ms", &ps, &pc, &ps2); if (strcmp(ps, "hello") != 0 || *pc != 'w' || - strcmp(s, "hello") != 0 || c != 'w') + strcmp(ps2, "orld") != 0 || + strcmp(s, "hello") != 0 || c != 'w' || + strcmp(s2, "orld") != 0) return 1; free(ps); free(pc); + free(ps2); return 0; } -- 2.1.4