summaryrefslogtreecommitdiff
path: root/p11p-daemon/src/p11p_server.erl
diff options
context:
space:
mode:
Diffstat (limited to 'p11p-daemon/src/p11p_server.erl')
-rw-r--r--p11p-daemon/src/p11p_server.erl58
1 files changed, 58 insertions, 0 deletions
diff --git a/p11p-daemon/src/p11p_server.erl b/p11p-daemon/src/p11p_server.erl
new file mode 100644
index 0000000..726e97b
--- /dev/null
+++ b/p11p-daemon/src/p11p_server.erl
@@ -0,0 +1,58 @@
+%% Create an AF_UNIX socket and accept connections. On connect, spawn
+%% a p11p_server process.
+
+%% FIXME: Run _one_ socket per instance of this server!
+
+-module(p11p_server).
+-behaviour(gen_server).
+
+%% API.
+-export([start_link/1]).
+
+%% Genserver callbacks.
+-export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2,
+ code_change/3]).
+
+%% Records and types.
+-include("p11p_defs.hrl").
+-record(state, {socket :: gen_tcp:socket()}).
+
+%% API.
+-spec start_link(gen_tcp:socket()) -> {ok, pid()} | {error, term()}.
+start_link(Socket) ->
+ gen_server:start_link(?MODULE, Socket, []).
+
+%% Genserver callbacks.
+init(Socket) ->
+ gen_server:cast(self(), accept), % Perform accept in gen-server loop.
+ {ok, #state{socket = Socket}}.
+
+handle_call(Request, _From, State) ->
+ lager:debug("Unhandled call: ~p~n", [Request]),
+ {reply, unhandled, State}.
+
+handle_cast(accept, State = #state{socket = ListenSocket}) ->
+ {ok, Sock} = gen_tcp:accept(ListenSocket),
+ %% TODO: authz
+ lager:debug("new connection accepted: ~p", [Sock]),
+ p11p_server_sup:start_server(), % New acceptor.
+ {noreply, State#state{socket = Sock}};
+handle_cast(Request, State) ->
+ lager:debug("Unhandled cast: ~p~n", [Request]),
+ {noreply, State}.
+
+handle_info({tcp, _Socket, Data}, State) ->
+ lager:debug("~p: received: ~s", [self(), Data]),
+ {noreply, State};
+handle_info(Info, State) ->
+ lager:debug("Unhandled info: ~p~n", [Info]),
+ {noreply, State}.
+
+terminate(_Reason, #state{socket = Socket}) ->
+ gen_tcp:close(Socket), % FIXME: correct?
+ ok.
+
+code_change(_OldVersion, State, _Extra) ->
+ {ok, State}.
+
+%% Private functions.