From 77e8a12755632d62ef25541e3622f478edaa28c6 Mon Sep 17 00:00:00 2001 From: aszlig Date: Wed, 14 Aug 2019 23:57:20 +0200 Subject: xkbvalidate: Use $CC instead of hardcoded gcc I initially didn't use $CC because I thought this would be GCC specific, but it turns out that Clang actually accepts -std=gnu11. So using $CC here might not work on compilers other than Clang or GCC, but at the moment those are the compilers we typically use in nixpkgs, so even if we'd use some other compiler it *might* even work there. I've tested this by compiling against clangStdenv with both $CC and clang hardcoded and it works. This was reported by @dkudriavtsev on IRC. Signed-off-by: aszlig --- pkgs/tools/X11/xkbvalidate/default.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'pkgs/tools/X11') diff --git a/pkgs/tools/X11/xkbvalidate/default.nix b/pkgs/tools/X11/xkbvalidate/default.nix index f5a26410835..c4aec30e724 100644 --- a/pkgs/tools/X11/xkbvalidate/default.nix +++ b/pkgs/tools/X11/xkbvalidate/default.nix @@ -10,6 +10,6 @@ runCommandCC "xkbvalidate" { }; } '' mkdir -p "$out/bin" - gcc -std=gnu11 -Wall -pedantic -lxkbcommon ${./xkbvalidate.c} \ + $CC -std=gnu11 -Wall -pedantic -lxkbcommon ${./xkbvalidate.c} \ -o "$out/bin/validate" '' -- cgit 1.4.1 From 1964b0c1b1e2e8092a15da64bd37838bed261e26 Mon Sep 17 00:00:00 2001 From: aszlig Date: Thu, 15 Aug 2019 00:06:51 +0200 Subject: xkbvalidate: Don't rely on GNU extensions The only reason why I was using _GNU_SOURCE was because of vasprintf(), so getting rid of that extension should make the source way more portable. When using vsnprintf() with a null pointer for the output buffer and a size of 0, I wasn't quite sure whether this would be undefined behaviour, so I looked it up in the C11 standard. In section 7.21.6.5, it explicitly mentions this case, so we're lucky: If n is zero, nothing is written, and s may be a null pointer. Additionally, section 7.21.6.12 writes the following about vsnprintf(): The vsnprintf function does not invoke the va_end macro. So to be sure to avoid undefined behaviour I subsequently added the corresponding va_end() calls. With this, the platforms attribute is now "unix", because the program should now even run on OS X, even though it usually wouldn't be needed. Signed-off-by: aszlig --- pkgs/tools/X11/xkbvalidate/default.nix | 4 ++-- pkgs/tools/X11/xkbvalidate/xkbvalidate.c | 21 ++++++++++++++++++--- 2 files changed, 20 insertions(+), 5 deletions(-) (limited to 'pkgs/tools/X11') diff --git a/pkgs/tools/X11/xkbvalidate/default.nix b/pkgs/tools/X11/xkbvalidate/default.nix index c4aec30e724..2855d03120f 100644 --- a/pkgs/tools/X11/xkbvalidate/default.nix +++ b/pkgs/tools/X11/xkbvalidate/default.nix @@ -5,11 +5,11 @@ runCommandCC "xkbvalidate" { meta = { description = "NixOS tool to validate X keyboard configuration"; license = lib.licenses.mit; - platforms = lib.platforms.linux; + platforms = lib.platforms.unix; maintainers = [ lib.maintainers.aszlig ]; }; } '' mkdir -p "$out/bin" - $CC -std=gnu11 -Wall -pedantic -lxkbcommon ${./xkbvalidate.c} \ + $CC -std=c11 -Wall -pedantic -lxkbcommon ${./xkbvalidate.c} \ -o "$out/bin/validate" '' diff --git a/pkgs/tools/X11/xkbvalidate/xkbvalidate.c b/pkgs/tools/X11/xkbvalidate/xkbvalidate.c index d9c9042467c..d25eef154b3 100644 --- a/pkgs/tools/X11/xkbvalidate/xkbvalidate.c +++ b/pkgs/tools/X11/xkbvalidate/xkbvalidate.c @@ -1,4 +1,3 @@ -#define _GNU_SOURCE #include #include #include @@ -14,6 +13,9 @@ static bool log_alloc_success = true; static void add_log(struct xkb_context *ctx, enum xkb_log_level level, const char *fmt, va_list args) { + size_t buflen; + va_list tmpargs; + log_buffer_size++; if (log_buffer == NULL) @@ -28,11 +30,24 @@ static void add_log(struct xkb_context *ctx, enum xkb_log_level level, return; } - if (vasprintf(&log_buffer[log_buffer_size - 1], fmt, args) == -1) { + /* Unfortunately, vasprintf() is a GNU extension and thus not very + * portable, so let's first get the required buffer size using a dummy + * vsnprintf and afterwards allocate the returned amount of bytes. + * + * We also need to make a copy of the args, because the value of the args + * will be indeterminate after the return. + */ + va_copy(tmpargs, args); + buflen = vsnprintf(NULL, 0, fmt, tmpargs); + va_end(tmpargs); + + log_buffer[log_buffer_size - 1] = malloc(++buflen); + + if (vsnprintf(log_buffer[log_buffer_size - 1], buflen, fmt, args) == -1) { perror("log line alloc"); log_alloc_success = false; - return; } + va_end(args); } static void print_logs(void) -- cgit 1.4.1 From 16ecd0d5caa29f4de3e071e61306b1f5d2a2e255 Mon Sep 17 00:00:00 2001 From: aszlig Date: Thu, 15 Aug 2019 01:11:32 +0200 Subject: xkbvalidate: Rename output binary to xkbvalidate So far, the output binary has been just "validate", which is quite a very generic name and doesn't match the package name. Even though I highly doubt that this program will ever be used outside of NixOS modules, it's nevertheless less confusing to have a consistent naming. Signed-off-by: aszlig --- nixos/modules/services/x11/xserver.nix | 2 +- pkgs/tools/X11/xkbvalidate/default.nix | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'pkgs/tools/X11') diff --git a/nixos/modules/services/x11/xserver.nix b/nixos/modules/services/x11/xserver.nix index b1a31670697..7ffe1c12561 100644 --- a/nixos/modules/services/x11/xserver.nix +++ b/nixos/modules/services/x11/xserver.nix @@ -714,7 +714,7 @@ in nativeBuildInputs = [ pkgs.xkbvalidate ]; preferLocalBuild = true; } '' - validate "$xkbModel" "$layout" "$xkbVariant" "$xkbOptions" + xkbvalidate "$xkbModel" "$layout" "$xkbVariant" "$xkbOptions" touch "$out" ''); diff --git a/pkgs/tools/X11/xkbvalidate/default.nix b/pkgs/tools/X11/xkbvalidate/default.nix index 2855d03120f..92a47aa6563 100644 --- a/pkgs/tools/X11/xkbvalidate/default.nix +++ b/pkgs/tools/X11/xkbvalidate/default.nix @@ -11,5 +11,5 @@ runCommandCC "xkbvalidate" { } '' mkdir -p "$out/bin" $CC -std=c11 -Wall -pedantic -lxkbcommon ${./xkbvalidate.c} \ - -o "$out/bin/validate" + -o "$out/bin/xkbvalidate" '' -- cgit 1.4.1