summaryrefslogtreecommitdiff
path: root/p11p-daemon/src/p11p_server_sup.erl
diff options
context:
space:
mode:
Diffstat (limited to 'p11p-daemon/src/p11p_server_sup.erl')
-rw-r--r--p11p-daemon/src/p11p_server_sup.erl42
1 files changed, 42 insertions, 0 deletions
diff --git a/p11p-daemon/src/p11p_server_sup.erl b/p11p-daemon/src/p11p_server_sup.erl
new file mode 100644
index 0000000..15398bc
--- /dev/null
+++ b/p11p-daemon/src/p11p_server_sup.erl
@@ -0,0 +1,42 @@
+-module(p11p_server_sup).
+-behaviour(supervisor).
+
+-export([start_link/0, start_server/0]).
+-export([init/1]).
+
+start_link() ->
+ supervisor:start_link({local, ?MODULE}, ?MODULE, []).
+
+init([]) ->
+ Name = "vtoken0", % FIXME
+ SocketPath = socket_path(mkdir_socket_basepath(), Name),
+ file:delete(SocketPath),
+ % TODO: consider flow control through {active, once}
+ {ok, ListenSocket} = gen_tcp:listen(0, [{ifaddr, {local, SocketPath}},
+ binary]),
+ spawn_link(fun start_server/0),
+ {ok, {{simple_one_for_one, 60, 3600},
+ [{sock_server,
+ {p11p_server, start_link, [ListenSocket]},
+ temporary, 1000, worker, [p11p_server]}
+ ]}}.
+
+start_server() ->
+ supervisor:start_child(?MODULE, []).
+
+%% Private functions.
+mkdir_socket_basepath() ->
+ Path = "/run/user/1000/p11p",
+ ok = case file:make_dir(Path) of
+ ok -> ok;
+ {error, eexist} -> ok;
+ Err ->
+ lager:error("~s: unable to create directory: ~p", [Path, Err]),
+ err
+ end,
+ Path.
+
+-spec socket_path(string(), string()) -> string().
+socket_path(BasePath, Name) ->
+ %%"/run/user/$UID/p11p/$TokenCfg-$UNIXPID"
+ BasePath ++ "/" ++ Name.