client/locale: properly check popen return value
[platform/upstream/freerdp.git] / libfreerdp / locale / keyboard_x11.c
index 55737d6..e9ca41f 100644 (file)
 #include <stdlib.h>
 #include <string.h>
 
+#include <winpr/crt.h>
+#include <winpr/input.h>
+
 #include "liblocale.h"
-#include <freerdp/utils/memory.h>
+
 #include <freerdp/locale/locale.h>
 #include <freerdp/locale/keyboard.h>
 
 #include "keyboard_x11.h"
-#include "keyboard_keymap.h"
 #include "xkb_layout_ids.h"
 
-#ifdef WITH_SUN
-#include "keyboard_sun.h"
-#endif
-
-
-extern const RDP_SCANCODE VIRTUAL_KEY_CODE_TO_DEFAULT_RDP_SCANCODE_TABLE[256];
-
-
-uint32 freerdp_detect_keyboard_layout_from_xkb(char** xkb_layout, char** xkb_variant)
+int freerdp_detect_keyboard_layout_from_xkb(DWORD* keyboardLayoutId)
 {
        char* pch;
        char* beg;
@@ -51,11 +45,11 @@ uint32 freerdp_detect_keyboard_layout_from_xkb(char** xkb_layout, char** xkb_var
        char buffer[1024];
        char* layout = NULL;
        char* variant = NULL;
-       uint32 keyboardLayoutId = 0;
 
        /* We start by looking for _XKB_RULES_NAMES_BACKUP which appears to be used by libxklavier */
 
-        xprop = popen("xprop -root _XKB_RULES_NAMES_BACKUP", "r");
+    if (!(xprop = popen("xprop -root _XKB_RULES_NAMES_BACKUP", "r")))
+               return 0;
 
        /* Sample output for "Canadian Multilingual Standard"
         *
@@ -66,12 +60,12 @@ uint32 freerdp_detect_keyboard_layout_from_xkb(char** xkb_layout, char** xkb_var
         * "multi" the keyboard layout variant
         */
 
-       while(fgets(buffer, sizeof(buffer), xprop) != NULL)
+       while (fgets(buffer, sizeof(buffer), xprop) != NULL)
        {
-               if((pch = strstr(buffer, "_XKB_RULES_NAMES_BACKUP(STRING) = ")) != NULL)
+               if ((pch = strstr(buffer, "_XKB_RULES_NAMES_BACKUP(STRING) = ")) != NULL)
                {
                        /* "rules" */
-                       pch = strchr(&buffer[34], ','); // We assume it is xorg
+                       pch = strchr(&buffer[34], ','); /* We assume it is xorg */
                        pch += 1;
 
                        /* "type" */
@@ -96,25 +90,23 @@ uint32 freerdp_detect_keyboard_layout_from_xkb(char** xkb_layout, char** xkb_var
                        variant = beg;
                }
        }
+
        pclose(xprop);
 
        DEBUG_KBD("_XKB_RULES_NAMES_BACKUP layout: %s, variant: %s", layout, variant);
-       keyboardLayoutId = find_keyboard_layout_in_xorg_rules(layout, variant);
+       *keyboardLayoutId = find_keyboard_layout_in_xorg_rules(layout, variant);
 
-       if (keyboardLayoutId > 0)
-       {
-               *xkb_layout = xstrdup(layout);
-               *xkb_variant = xstrdup(variant);
-               return keyboardLayoutId;
-       }
+       if (*keyboardLayoutId > 0)
+               return 0;
 
        /* Check _XKB_RULES_NAMES if _XKB_RULES_NAMES_BACKUP fails */
 
-       xprop = popen("xprop -root _XKB_RULES_NAMES", "r");
+       if (!(xprop = popen("xprop -root _XKB_RULES_NAMES", "r")))
+               return 0;
 
-       while(fgets(buffer, sizeof(buffer), xprop) != NULL)
+       while (fgets(buffer, sizeof(buffer), xprop) != NULL)
        {
-               if((pch = strstr(buffer, "_XKB_RULES_NAMES(STRING) = ")) != NULL)
+               if ((pch = strstr(buffer, "_XKB_RULES_NAMES(STRING) = ")) != NULL)
                {
                        /* "rules" */
                        pch = strchr(&buffer[27], ','); // We assume it is xorg
@@ -142,17 +134,14 @@ uint32 freerdp_detect_keyboard_layout_from_xkb(char** xkb_layout, char** xkb_var
                        variant = beg;
                }
        }
+
        pclose(xprop);
 
        DEBUG_KBD("_XKB_RULES_NAMES layout: %s, variant: %s", layout, variant);
-       keyboardLayoutId = find_keyboard_layout_in_xorg_rules(layout, variant);
+       *keyboardLayoutId = find_keyboard_layout_in_xorg_rules(layout, variant);
 
-       if (keyboardLayoutId > 0)
-       {
-               *xkb_layout = xstrdup(layout);
-               *xkb_variant = xstrdup(variant);
-               return keyboardLayoutId;
-       }
+       if (*keyboardLayoutId > 0)
+               return *keyboardLayoutId;
 
        return 0;
 }
@@ -170,6 +159,9 @@ char* freerdp_detect_keymap_from_xkb()
        /* this tells us about the current XKB configuration, if XKB is available */
        setxkbmap = popen("setxkbmap -print", "r");
 
+       if (!setxkbmap)
+               return NULL;
+
        while (fgets(buffer, sizeof(buffer), setxkbmap) != NULL)
        {
                /* the line with xkb_keycodes is what interests us */
@@ -194,9 +186,11 @@ char* freerdp_detect_keymap_from_xkb()
                                *end = '\0';
 
                                length = (end - beg);
-                               keymap = (char*) xmalloc(length + 1);
-                               strncpy(keymap, beg, length);
-                               keymap[length] = '\0';
+                               keymap = (char*) malloc(length + 1);
+                               if (keymap) {
+                                       strncpy(keymap, beg, length);
+                                       keymap[length] = '\0';
+                               }
 
                                break;
                        }
@@ -207,58 +201,3 @@ char* freerdp_detect_keymap_from_xkb()
 
        return keymap;
 }
-
-uint32 freerdp_keyboard_init_x11(uint32 keyboardLayoutId, RDP_SCANCODE x11_keycode_to_rdp_scancode[256])
-{
-       uint32 vkcode;
-       uint32 keycode;
-       uint32 keycode_to_vkcode[256];
-
-       memset(keycode_to_vkcode, 0, sizeof(keycode_to_vkcode));
-       memset(x11_keycode_to_rdp_scancode, 0, sizeof(x11_keycode_to_rdp_scancode));
-
-#ifdef __APPLE__
-       /* Apple X11 breaks XKB detection */
-       freerdp_keyboard_load_map(keycode_to_vkcode, "macosx(macosx)");
-#elif defined(WITH_SUN)
-       {
-               char sunkeymap[32];
-
-               freerdp_detect_keyboard_type_and_layout_solaris(sunkeymap, sizeof(sunkeymap));
-               freerdp_keyboard_load_map(keycode_to_vkcode, sunkeymap);
-       }
-#else
-       {
-               char* keymap;
-               char* xkb_layout;
-               char* xkb_variant;
-
-               if (keyboardLayoutId == 0)
-               {
-                       keyboardLayoutId = freerdp_detect_keyboard_layout_from_xkb(&xkb_layout, &xkb_variant);
-                       xfree(xkb_layout);
-                       xfree(xkb_variant);
-               }
-
-               keymap = freerdp_detect_keymap_from_xkb();
-
-               if (keymap != NULL)
-               {
-                       freerdp_keyboard_load_maps(keycode_to_vkcode, keymap);
-                       xfree(keymap);
-               }
-       }
-#endif
-
-       for (keycode = 0; keycode < 256; keycode++)
-       {
-               vkcode = keycode_to_vkcode[keycode];
-
-               if (!(vkcode > 0 && vkcode < 256))
-                       continue;
-
-               x11_keycode_to_rdp_scancode[keycode] = VIRTUAL_KEY_CODE_TO_DEFAULT_RDP_SCANCODE_TABLE[vkcode];
-       }
-
-       return keyboardLayoutId;
-}