diff --git a/project.clj b/project.clj index 42cae40..7e03a73 100644 --- a/project.clj +++ b/project.clj @@ -9,6 +9,8 @@ :distribution :repo :comments "same as Clojure"} :min-lein-version "2.0.0" + :jvm-opts ["-Djna.nosys=true"] + :java-source-paths ["src/java"] :profiles {:1.2 {:dependencies [[org.clojure/clojure "1.2.0"]]} :1.3 {:dependencies [[org.clojure/clojure "1.3.0"]]} :1.4 {:dependencies [[org.clojure/clojure "1.4.0"]]} diff --git a/src/java/FILE.java b/src/java/FILE.java new file mode 100644 index 0000000..7b95739 --- /dev/null +++ b/src/java/FILE.java @@ -0,0 +1,5 @@ +package net.n01se.clojure_jna; + +import com.sun.jna.PointerType; + +public class FILE extends PointerType { } diff --git a/src/net/n01se/clojure_jna/libc_utils.clj b/src/net/n01se/clojure_jna/libc_utils.clj index ca02f48..a660912 100644 --- a/src/net/n01se/clojure_jna/libc_utils.clj +++ b/src/net/n01se/clojure_jna/libc_utils.clj @@ -9,10 +9,15 @@ (ns net.n01se.clojure-jna.libc-utils "Convenience wrappers for libc functions. Currently just 'select'" {:author "Chris Houser"} - (:require [net.n01se.clojure-jna :as jna :refer [make-cbuf pointer when-err]])) + (:require [net.n01se.clojure-jna :as jna :refer [make-cbuf pointer when-err]]) + (:import (net.n01se.clojure_jna FILE))) (jna/to-ns libc c [Integer select]) +(def fopen (jna/to-fn FILE c/fopen)) +(def fclose (jna/to-fn Integer c/fclose)) +(def fileno (jna/to-fn Integer c/fileno)) + (defn select "Block for timeout-secs waiting for events on the given file descriptors. Each of readfds, writefds, and exceptfds must be diff --git a/test/net/n01se/clojure_jna/test.clj b/test/net/n01se/clojure_jna/test.clj index f5ce7aa..1c2a6a2 100644 --- a/test/net/n01se/clojure_jna/test.clj +++ b/test/net/n01se/clojure_jna/test.clj @@ -1,5 +1,6 @@ (ns net.n01se.clojure-jna.test (:require [net.n01se.clojure-jna :as jna] + [net.n01se.clojure-jna.libc-utils :as libc-utils :refer [fopen fclose fileno]] [clojure.test :refer [deftest is]])) (deftest test-jna-invoke @@ -13,3 +14,11 @@ (jna/to-ns native-c c [Integer printf, Integer open, Integer close]) (is (= 0 (eval '(native-c/close 0)))) (is (= 14 (eval '(native-c/printf "one %s two\n" "hello"))))) + +(deftest test-select + (let [fp (fopen "project.clj" "r") + fd (fileno (.getPointer fp))] + ; There should be no exceptional events on project.clj... I hope... + (is (= [#{} #{} #{}] (libc-utils/select nil nil [fd] 1)) "select timedout with no events") + (is (= [#{fd} #{} #{}] (libc-utils/select [fd] nil nil 1)) "select indicated that the fd can be read") + (fclose fp)))