summary refs log tree commit diff
path: root/pkgs/tools/X11
diff options
context:
space:
mode:
authorFrederik Rietdijk <fridh@fridh.nl>2019-08-17 09:39:23 +0200
committerFrederik Rietdijk <fridh@fridh.nl>2019-08-17 09:39:23 +0200
commitfe9a3e3e63fa59c8014d454b0efd3231bdd19350 (patch)
tree3546e83902366b34599e8d5f6a698e37935a104d /pkgs/tools/X11
parented3cb39bfa7234e5bbf2b50ce6f658ef5fda686a (diff)
parentc68f58d95c0e34d91ff3e4f08464954fd0e9e466 (diff)
downloadnixpkgs-fe9a3e3e63fa59c8014d454b0efd3231bdd19350.tar
nixpkgs-fe9a3e3e63fa59c8014d454b0efd3231bdd19350.tar.gz
nixpkgs-fe9a3e3e63fa59c8014d454b0efd3231bdd19350.tar.bz2
nixpkgs-fe9a3e3e63fa59c8014d454b0efd3231bdd19350.tar.lz
nixpkgs-fe9a3e3e63fa59c8014d454b0efd3231bdd19350.tar.xz
nixpkgs-fe9a3e3e63fa59c8014d454b0efd3231bdd19350.tar.zst
nixpkgs-fe9a3e3e63fa59c8014d454b0efd3231bdd19350.zip
Merge staging-next into staging
Diffstat (limited to 'pkgs/tools/X11')
-rw-r--r--pkgs/tools/X11/xkbvalidate/default.nix6
-rw-r--r--pkgs/tools/X11/xkbvalidate/xkbvalidate.c21
2 files changed, 21 insertions, 6 deletions
diff --git a/pkgs/tools/X11/xkbvalidate/default.nix b/pkgs/tools/X11/xkbvalidate/default.nix
index f5a26410835..92a47aa6563 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"
-  gcc -std=gnu11 -Wall -pedantic -lxkbcommon ${./xkbvalidate.c} \
-    -o "$out/bin/validate"
+  $CC -std=c11 -Wall -pedantic -lxkbcommon ${./xkbvalidate.c} \
+    -o "$out/bin/xkbvalidate"
 ''
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 <stdarg.h>
 #include <stdbool.h>
 #include <stdio.h>
@@ -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)