diff mbox

[LEDE-DEV,uclibc-ng-devel] package/util-linux: Fix libmount build under uClibc

Message ID CAMo8BfKboDoohwd_QPGicRai5a+6q9djxq6csFhO2SFZ0tXgfg@mail.gmail.com
State Awaiting Upstream
Headers show

Commit Message

Max Filippov June 2, 2016, 4:31 p.m. UTC
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.

Comments

Alexey Brodkin June 2, 2016, 5:23 p.m. UTC | #1
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
Max Filippov June 2, 2016, 8:50 p.m. UTC | #2
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
diff mbox

Patch

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