Commit b89b8e70237f401aa39b963313324f60396bdda8

Ran Benita 2012-05-13T23:31:59

Change xkb_map_new_from_fd to use FILE* i.e. xkb_map_new_from_file. The reason is that flex only works with FILE's, so we must use fdopen on the file descriptor; but to avoid a memory leak, we must also fclose() it, which, in turn, closes the file descriptor itself. Either way is not acceptable, so we can either: * dup() the fd and use fdopen on that, or * have the user call fdopen on his own, and accept a FILE* instead of an fd. The second one seems better, and is standard C, so why not. We must add stdio.h to xkbcommon.h though, which is regrettable, but not a big deal. Signed-off-by: Ran Benita <ran234@gmail.com>

diff --git a/include/xkbcommon/xkbcommon.h b/include/xkbcommon/xkbcommon.h
index 2b1eb96..e2786fe 100644
--- a/include/xkbcommon/xkbcommon.h
+++ b/include/xkbcommon/xkbcommon.h
@@ -82,6 +82,7 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
 #include <stddef.h>
 #include <stdint.h>
+#include <stdio.h>
 
 #include <xkbcommon/xkbcommon-names.h>
 #include <xkbcommon/xkbcommon-keysyms.h>
@@ -260,11 +261,11 @@ enum xkb_keymap_format {
 
 /**
  * Creates an XKB keymap from a full text XKB keymap passed into the
- * file descriptor.
+ * file.
  */
 struct xkb_keymap *
-xkb_map_new_from_fd(struct xkb_context *context,
-                    int fd, enum xkb_keymap_format format,
+xkb_map_new_from_file(struct xkb_context *context,
+                    FILE *file, enum xkb_keymap_format format,
                     enum xkb_map_compile_flags flags);
 
 /**
diff --git a/src/xkbcomp/xkbcomp.c b/src/xkbcomp/xkbcomp.c
index 8518a1d..e6f71c9 100644
--- a/src/xkbcomp/xkbcomp.c
+++ b/src/xkbcomp/xkbcomp.c
@@ -283,36 +283,29 @@ xkb_map_new_from_string(struct xkb_context *ctx,
 }
 
 _X_EXPORT struct xkb_keymap *
-xkb_map_new_from_fd(struct xkb_context *ctx,
-                    int fd,
-                    enum xkb_keymap_format format,
-                    enum xkb_map_compile_flags flags)
+xkb_map_new_from_file(struct xkb_context *ctx,
+                      FILE *file,
+                      enum xkb_keymap_format format,
+                      enum xkb_map_compile_flags flags)
 {
-    XkbFile *file;
-    FILE *fptr;
+    XkbFile *xkb_file;
 
     if (format != XKB_KEYMAP_FORMAT_TEXT_V1) {
         ERROR("unsupported keymap format %d\n", format);
         return NULL;
     }
 
-    if (fd < 0) {
+    if (!file) {
         ERROR("no file specified to generate XKB keymap\n");
-	return NULL;
-    }
-
-    fptr = fdopen(fd, "r");
-    if (!fptr) {
-        ERROR("couldn't associate fd with file pointer\n");
         return NULL;
     }
 
-    if (!XKBParseFile(ctx, fptr, "(unknown file)", &file)) {
+    if (!XKBParseFile(ctx, file, "(unknown file)", &xkb_file)) {
         ERROR("failed to parse input xkb file\n");
         return NULL;
     }
 
-    return compile_keymap(ctx, file);
+    return compile_keymap(ctx, xkb_file);
 }
 
 _X_EXPORT struct xkb_keymap *
diff --git a/test/filecomp.c b/test/filecomp.c
index 5465b2c..7f140f5 100644
--- a/test/filecomp.c
+++ b/test/filecomp.c
@@ -25,34 +25,31 @@ authorization from the authors.
 */
 
 #include <assert.h>
-#include <unistd.h>
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
-#include <fcntl.h>
 #include <limits.h>
-#include <sys/types.h>
-#include <sys/stat.h>
 
 #include "xkbcommon/xkbcommon.h"
 
 static int
 test_file(const char *path)
 {
-    int fd;
+    FILE *file;
     struct xkb_context *context;
     struct xkb_keymap *keymap;
 
-    fd = open(path, O_RDONLY);
-    assert(fd >= 0);
+    file = fopen(path, "r");
+    assert(file != NULL);
 
     context = xkb_context_new(0);
     assert(context);
 
     fprintf(stderr, "\nCompiling path: %s\n", path);
 
-    keymap = xkb_map_new_from_fd(context, fd, XKB_KEYMAP_FORMAT_TEXT_V1, 0);
-    close(fd);
+    keymap = xkb_map_new_from_file(context, file,
+                                   XKB_KEYMAP_FORMAT_TEXT_V1, 0);
+    fclose(file);
 
     if (!keymap) {
         fprintf(stderr, "Failed to compile keymap\n");