Added passing open options down to the port.
authorStanislaw Klekot <dozzie@jarowit.net>
Thu, 5 Oct 2017 22:43:28 +0000 (00:43 +0200)
committerStanislaw Klekot <dozzie@jarowit.net>
Thu, 5 Oct 2017 22:43:28 +0000 (00:43 +0200)
c_src/gen_inotify_drv.c
src/gen_inotify.erl

index 7520163..cc86691 100644 (file)
@@ -265,6 +265,16 @@ ErlDrvSSizeT cdrv_control(ErlDrvData drv_data, unsigned int command,
   ErlDrvTermData caller;
 
   switch (command) {
+    case 0: // initialize port {{{
+      if (len != 2)
+        return -1;
+
+      //context->recursive = buf[0]; // TODO: implement me
+      context->real_path = buf[1];
+
+      return 0;
+    // }}}
+
     case 1: // add/update watch {{{
       if (len < 5) // uint32_t + at least one character for filename
         return -1;
index f07de21..bbce92c 100644 (file)
@@ -69,17 +69,56 @@ open() ->
 
 -spec open(Options :: [Option]) ->
   {ok, handle()} | {error, badarg | system_limit | posix()}
-  when Option :: recursive.
+  when Option :: recursive | real_path.
+
+open(Options) ->
+  case build_open_options_data(Options) of
+    {ok, OptData} ->
+      try open_port({spawn_driver, ?DRIVER_NAME}, [binary]) of
+        Handle ->
+          port_control(Handle, 0, OptData),
+          {ok, Handle}
+      catch
+        error:Reason ->
+          {error, Reason}
+      end;
+    {error, badarg} ->
+      {error, badarg}
+  end.
 
-open(_Options) ->
-  try open_port({spawn_driver, ?DRIVER_NAME}, [binary]) of
-    Handle ->
-      {ok, Handle}
+%%----------------------------------------------------------
+%% build_open_options_data() {{{
+
+%% @doc Translate list of options to a `port_control(Port,0,_)' request
+%%   payload.
+
+-spec build_open_options_data(Options :: [Option]) ->
+  {ok, {Recursive :: boolean(), UseRealPath :: boolean()}} | {error, badarg}
+  when Option :: recursive | real_path.
+
+build_open_options_data(Options) ->
+  DefaultOptions = {false, false}, % `{Recursive, UseRealPath}'
+  try lists:foldr(fun add_open_option/2, DefaultOptions, Options) of
+    {false, false} -> {ok, <<0:8, 0:8>>};
+    {true,  false} -> {ok, <<1:8, 0:8>>};
+    {false, true}  -> {ok, <<0:8, 1:8>>};
+    {true,  true}  -> {ok, <<1:8, 1:8>>}
   catch
-    error:Reason ->
-      {error, Reason}
+    _:_ -> {error, badarg}
   end.
 
+%% @doc Workhorse for {@link build_open_options_data/1}.
+
+-spec add_open_option(Option, {boolean(), boolean()}) ->
+  {boolean(), boolean()}
+  when Option :: recursive | real_path.
+
+add_open_option(recursive, {_Recursive, UseRealPath}) -> {true, UseRealPath};
+add_open_option(real_path, {Recursive, _UseRealPath}) -> {Recursive, true}.
+
+%% }}}
+%%----------------------------------------------------------
+
 %% @doc Close a handle.
 
 -spec close(handle()) ->