diff options
Diffstat (limited to 'p11p-daemon/src/p11p_server.erl')
-rw-r--r-- | p11p-daemon/src/p11p_server.erl | 58 |
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. |