add sockets library, use new type_error function from sockets system calls
This commit is contained in:
60
src/prolog/lib/sockets.pl
Normal file
60
src/prolog/lib/sockets.pl
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
|
||||||
|
:- module(sockets, [socket_client_open/3,
|
||||||
|
socket_server_open/2,
|
||||||
|
socket_server_accept/4,
|
||||||
|
socket_server_close/1,
|
||||||
|
current_hostname/1]).
|
||||||
|
|
||||||
|
:- use_module(library(error)).
|
||||||
|
:- use_module(library(lists)).
|
||||||
|
:- use_module(library(pairs)).
|
||||||
|
|
||||||
|
|
||||||
|
socket_client_open(Addr, Stream, Options) :-
|
||||||
|
( var(Addr) ->
|
||||||
|
throw(error(instantiation_error, socket_client_open/3))
|
||||||
|
;
|
||||||
|
true
|
||||||
|
),
|
||||||
|
must_be(var, Stream),
|
||||||
|
must_be(list, Options),
|
||||||
|
( Addr = Address:Port,
|
||||||
|
atom(Address),
|
||||||
|
( atom(Port) ; integer(Port) ) ->
|
||||||
|
true
|
||||||
|
;
|
||||||
|
throw(error(type_error(socket_address, Addr), socket_client_open/3))
|
||||||
|
),
|
||||||
|
builtins:parse_stream_options(Options,
|
||||||
|
[Alias, EOFAction, Reposition, Type],
|
||||||
|
socket_client_open/3),
|
||||||
|
'$socket_client_open'(Address, Port, Stream, Alias, EOFAction, Reposition, Type).
|
||||||
|
|
||||||
|
|
||||||
|
socket_server_open(Addr, ServerSocket) :-
|
||||||
|
must_be(var, ServerSocket),
|
||||||
|
( ( integer(Addr) ; var(Addr) ) ->
|
||||||
|
'$socket_server_open'([], Addr, ServerSocket)
|
||||||
|
;
|
||||||
|
Addr = Address:Port,
|
||||||
|
must_be(atom, Address),
|
||||||
|
can_be(integer, Port),
|
||||||
|
'$socket_server_open'(Address, Port, ServerSocket)
|
||||||
|
).
|
||||||
|
|
||||||
|
|
||||||
|
socket_server_accept(ServerSocket, Client, Stream, Options) :-
|
||||||
|
must_be(var, Client),
|
||||||
|
must_be(var, Stream),
|
||||||
|
builtins:parse_stream_options(Options,
|
||||||
|
[Alias, EOFAction, Reposition, Type],
|
||||||
|
socket_server_accept/4),
|
||||||
|
'$socket_server_accept'(ServerSocket, Client, Stream, Alias, EOFAction, Reposition, Type).
|
||||||
|
|
||||||
|
|
||||||
|
socket_server_close(ServerSocket) :-
|
||||||
|
'$socket_server_close'(ServerSocket).
|
||||||
|
|
||||||
|
|
||||||
|
current_hostname(HostName) :-
|
||||||
|
'$current_hostname'(HostName).
|
||||||
@@ -4112,55 +4112,39 @@ impl MachineState {
|
|||||||
}
|
}
|
||||||
culprit => {
|
culprit => {
|
||||||
let culprit = culprit.as_addr(h);
|
let culprit = culprit.as_addr(h);
|
||||||
let stub = MachineError::functor_stub(
|
|
||||||
clause_name!("socket_server_close"),
|
|
||||||
1,
|
|
||||||
);
|
|
||||||
|
|
||||||
let err = MachineError::type_error(
|
return Err(self.type_error(
|
||||||
self.heap.h(),
|
|
||||||
ValidType::TcpListener,
|
ValidType::TcpListener,
|
||||||
culprit,
|
culprit,
|
||||||
);
|
clause_name!("socket_server_accept"),
|
||||||
|
4,
|
||||||
return Err(self.error_form(err, stub));
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
culprit => {
|
culprit => {
|
||||||
let stub = MachineError::functor_stub(
|
return Err(self.type_error(
|
||||||
clause_name!("socket_server_accept"),
|
|
||||||
4,
|
|
||||||
);
|
|
||||||
|
|
||||||
let err = MachineError::type_error(
|
|
||||||
self.heap.h(),
|
|
||||||
ValidType::TcpListener,
|
ValidType::TcpListener,
|
||||||
culprit,
|
culprit,
|
||||||
);
|
clause_name!("socket_server_accept"),
|
||||||
|
4,
|
||||||
return Err(self.error_form(err, stub));
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
&SystemClauseType::SocketServerClose => {
|
&SystemClauseType::SocketServerClose => {
|
||||||
match self.store(self.deref(self[temp_v!(1)])) {
|
match self.store(self.deref(self[temp_v!(1)])) {
|
||||||
Addr::TcpListener(h) => {
|
Addr::TcpListener(h) => {
|
||||||
self.heap[h] = HeapCellValue::Addr(Addr::EmptyList);
|
let closed_tcp_listener = clause_name!("$closed_tcp_listener");
|
||||||
|
self.heap[h] = HeapCellValue::Atom(closed_tcp_listener, None);
|
||||||
}
|
}
|
||||||
culprit => {
|
culprit => {
|
||||||
let stub = MachineError::functor_stub(
|
return Err(self.type_error(
|
||||||
clause_name!("socket_server_close"),
|
|
||||||
1,
|
|
||||||
);
|
|
||||||
|
|
||||||
let err = MachineError::type_error(
|
|
||||||
self.heap.h(),
|
|
||||||
ValidType::TcpListener,
|
ValidType::TcpListener,
|
||||||
culprit,
|
culprit,
|
||||||
);
|
clause_name!("socket_server_close"),
|
||||||
|
1,
|
||||||
return Err(self.error_form(err, stub));
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user