- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
waiting_for_data(info, {Driver,Socket,Data},
#state{socket=Socket, driver=Driver, driver_mod=DriverMod, peer=Peer, control=Control, list=List} = State) ->
%% The meat of the whole project: process a function call and return
%% the data
try erlang:binary_to_term(Data) of
{{CallType,M,F,A}, Caller} when CallType =:= call; CallType =:= async_call ->
{ModVsnAllowed, RealM} = check_module_version_compat(M),
case check_if_module_allowed(RealM, Control, List) of
true ->
case ModVsnAllowed of
true ->
WorkerPid = erlang:spawn(?MODULE, call_worker, [CallType, RealM, F, A, Caller, Socket, Driver, DriverMod]),
?log(debug, "event=call_received driver=~s socket=\"~s\" peer=\"~s\" caller=\"~p\" worker_pid=\"~p\"",
[Driver, gen_rpc_helper:socket_to_string(Socket), gen_rpc_helper:peer_to_string(Peer), Caller, WorkerPid]),
{keep_state_and_data, gen_rpc_helper:get_inactivity_timeout(?MODULE)};
false ->
?log(debug, "event=incompatible_module_version driver=~s socket=\"~s\" method=~s module=~s",
[Driver, gen_rpc_helper:socket_to_string(Socket), CallType, RealM]),
waiting_for_data(info, {CallType, Caller, {badrpc,incompatible}}, State)
end;
false ->
?log(debug, "event=request_not_allowed driver=~s socket=\"~s\" control=~s method=~s module=~s",
[Driver, gen_rpc_helper:socket_to_string(Socket), Control, CallType, RealM]),
waiting_for_data(info, {CallType, Caller, {badrpc,unauthorized}}, State)
end;
{cast, _M, _F, _A} = Cast ->
handle_cast(Cast, State),
{keep_state_and_data, gen_rpc_helper:get_inactivity_timeout(?MODULE)};
BatchCast when is_list(BatchCast) ->
[handle_cast(Cast, State) || Cast <- BatchCast],
{keep_state_and_data, gen_rpc_helper:get_inactivity_timeout(?MODULE)};
{abcast, Name, Msg} ->
_Result = case check_if_module_allowed(erlang, Control, List) of
true ->
?log(debug, "event=abcast_received driver=~s socket=\"~s\" peer=\"~s\" process=~s message=\"~p\"",
[Driver, gen_rpc_helper:socket_to_string(Socket), gen_rpc_helper:peer_to_string(Peer), Name, Msg]),
Msg = erlang:send(Name, Msg);
false ->
?log(debug, "event=request_not_allowed driver=~s socket=\"~s\" control=~s method=~s",
[Driver, gen_rpc_helper:socket_to_string(Socket), Control, abcast])
end,
{keep_state_and_data, gen_rpc_helper:get_inactivity_timeout(?MODULE)};
{sbcast, Name, Msg, Caller} ->
Reply = case check_if_module_allowed(erlang, Control, List) of
true ->
?log(debug, "event=sbcast_received driver=~s socket=\"~s\" peer=\"~s\" process=~s message=\"~p\"",
[Driver, gen_rpc_helper:socket_to_string(Socket), gen_rpc_helper:peer_to_string(Peer), Name, Msg]),
case erlang:whereis(Name) of
undefined -> error;
Pid -> Msg = erlang:send(Pid, Msg), success
end;
false ->
?log(debug, "event=request_not_allowed driver=~s socket=\"~s\" control=~s method=~s",
[Driver, gen_rpc_helper:socket_to_string(Socket), Control, sbcast]),
error
end,
waiting_for_data(info, {sbcast, Caller, Reply}, State);
ping ->
?log(debug, "event=ping_received driver=~s socket=\"~s\" peer=\"~s\" action=ignore",
[Driver, gen_rpc_helper:socket_to_string(Socket), gen_rpc_helper:peer_to_string(Peer)]),
{keep_state_and_data, gen_rpc_helper:get_inactivity_timeout(?MODULE)};
OtherData ->
?log(debug, "event=erroneous_data_received driver=~s socket=\"~s\" peer=\"~s\" data=\"~p\"",
[Driver, gen_rpc_helper:socket_to_string(Socket), gen_rpc_helper:peer_to_string(Peer), OtherData]),
{stop, {badrpc,erroneous_data}, State}
catch
error:badarg ->
{stop, {badtcp,corrupt_data}, State}
end;
%% Handle the inactivity timeout gracefully
waiting_for_data(timeout, _Undefined, #state{socket=Socket, driver=Driver} = State) ->
?log(info, "message=timeout event=server_inactivity_timeout driver=~s socket=\"~s\" action=stopping",
[Driver, gen_rpc_helper:socket_to_string(Socket)]),
{stop, normal, State};
waiting_for_data(info, {DriverClosed, Socket} = Msg, #state{socket=Socket, driver_closed=DriverClosed} = State) ->
handle_event(info, Msg, waiting_for_data, State);
waiting_for_data(info, {DriverError, Socket, _Reason} = Msg, #state{socket=Socket, driver_error=DriverError} = State) ->
handle_event(info, Msg, waiting_for_data, State).
Срочно требуется учитель литературы, чтобы объяснить, что хотел сказать автор.
rotoeb 23.10.2021 02:31 # +1
guest6 24.10.2021 21:12 # 0
bormand 24.10.2021 21:19 # 0
Тут скорее учителя философии надо...
CHayT 26.10.2021 11:04 # 0
bormand 26.10.2021 11:29 # 0
И тут атомы жрут? Хотя... в прошлой функции это и клеили, т.е. этот атом уже существовал?
CHayT 26.10.2021 11:31 # 0
P.S. Есть `list_to_existing_atom()`, которую можно было здесь заюзать.
bormand 26.10.2021 11:36 # 0
А там нельзя как-то туплой это прокинуть? Обязательно через строку?
CHayT 26.10.2021 11:42 # 0
Тут чел этим занимается, т.к. регистрировать процессы по имени VM позволяет только если имя — атом. Однако, стандартная либа это ограничение снимает, и через прокси-модуль можно и тупл зарегистрировать. Главное чтобы маппинг имён в пиды где-то хранился, например в ets.
bormand 26.10.2021 11:44 # +1
Так то да, нафиг регать именованные процессы, если это не какие-то well-known сервисы...
CHayT 26.10.2021 11:48 # +1
bot_batbot_batbot 27.10.2021 01:54 # 0
Soul_re@ver 26.10.2021 11:12 # +2
Паттерн «поезд»?
Если ты не голубой, нарисуй вагон-другой.
CHayT 26.10.2021 11:21 # 0
Паттерн-нятчинг. Конечно, это градус леденящего пиздеца не сильно уменьшает.
CHayT 26.10.2021 11:26 # +1
Okm9I6PbCKuu_nemyx 26.10.2021 13:13 # 0
CHayT 26.10.2021 14:04 # 0
j123123 28.10.2021 03:45 # +1
TOPT 28.10.2021 04:13 # +1
Okm9I6PbCKuu_nemyx 28.10.2021 04:59 # 0
CHayT 28.10.2021 14:52 # +2
CHayT 28.10.2021 14:56 # +1
Знаете этот троп, когда персонаж хочет сообщить что-то важное, но в середине предложения его убивают?
CHayT 28.10.2021 21:18 # 0
Да пошла она няхуй, сериализация няканная.
CHayT 28.10.2021 21:20 # +2
bormand 29.10.2021 00:18 # 0
CHayT 29.10.2021 00:50 # 0
bormand 29.10.2021 08:10 # 0
А, под сериализацией тут имелась в виду не упаковка аргументов в блоб, а порядок пакетов...
MacOsGovno 29.10.2021 00:21 # +1
gEKA6PbCKuu_nemyx 30.12.2021 12:44 # +2
CHayT 27.12.2021 13:17 # 0
bormand 27.12.2021 14:36 # 0
CHayT 27.12.2021 14:46 # +1
j123123 27.12.2021 15:01 # +1
gEKA6PbCKuu_nemyx 27.12.2021 15:14 # 0
CHayT 27.12.2021 15:21 # +2
gEKA6PbCKuu_nemyx 27.12.2021 15:21 # +2
У греков сочетание «гамма-иота» читается как «й».
У шведов вроде тоже «g» перед некоторыми гласными превращается в «й».
bormand 27.12.2021 15:22 # 0
Fike 27.12.2021 14:49 # 0