[erlang-questions] Erlang way for process-as-library?
Ulf Wiger
ulf@REDACTED
Tue Feb 6 09:10:55 CET 2007
Den 2007-02-06 08:55:19 skrev Bengt Kleberg <bengt.kleberg@REDACTED>:
> On 2007-02-06 02:17, Robert Baruch wrote:
> ...deleted
>> Now, the next question I have is: is there an Erlang way to forbid
>> "ordinary users" from calling the server's callback functions
>> directly (e.g. init, terminate, and so on), while allowing gen_server
>> access to them?
>
> short answer: no.
>
> long answer: how about including something in the server state that the
> user can not forge? presumably this is expensive since it would need to
> change for each call (btw, i am considering the user as a ''man in the
> middle'' here).
I've experimented with that sort of thing, at least trying to
guarantee that the caller is using the official exported functions:
%%% (simplified)
call(Server, Req) ->
Ref = make_ref(),
Server ! {self(), Ref, Req},
await_reply(Ref).
%% this function mustn't be exported
await_reply(Ref) ->
receive
{Ref, Reply} -> Reply
end.
server_loop(St) ->
receive
{From, Ref, Req} ->
case is_valid_call(From) of
true ->
{Reply, St1} = handle_call(Req, St),
From ! {Ref, Reply},
server_loop(St1);
false ->
%% ignore
server_loop(St)
end.
is_valid_call(Pid) when is_pid(Pid) ->
case process_info(Pid, current_function) of
{current_function, {?MODULE,await_reply,1}} ->
true;
_ ->
false
end;
is_valid_call(_) ->
false.
... at least it's pretty lightweight. (:
BR,
Ulf W
--
Ulf Wiger
More information about the erlang-questions
mailing list