add sockets library, use new type_error function from sockets system calls

This commit is contained in:
Mark Thom
2020-05-05 22:57:06 -06:00
parent 414acda9e0
commit fe05082ddc
2 changed files with 74 additions and 30 deletions

60
src/prolog/lib/sockets.pl Normal file
View 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).

View File

@@ -4112,55 +4112,39 @@ impl MachineState {
}
culprit => {
let culprit = culprit.as_addr(h);
let stub = MachineError::functor_stub(
clause_name!("socket_server_close"),
1,
);
let err = MachineError::type_error(
self.heap.h(),
return Err(self.type_error(
ValidType::TcpListener,
culprit,
);
return Err(self.error_form(err, stub));
clause_name!("socket_server_accept"),
4,
));
}
}
}
culprit => {
let stub = MachineError::functor_stub(
clause_name!("socket_server_accept"),
4,
);
let err = MachineError::type_error(
self.heap.h(),
return Err(self.type_error(
ValidType::TcpListener,
culprit,
);
return Err(self.error_form(err, stub));
clause_name!("socket_server_accept"),
4,
));
}
}
}
&SystemClauseType::SocketServerClose => {
match self.store(self.deref(self[temp_v!(1)])) {
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 => {
let stub = MachineError::functor_stub(
clause_name!("socket_server_close"),
1,
);
let err = MachineError::type_error(
self.heap.h(),
return Err(self.type_error(
ValidType::TcpListener,
culprit,
);
return Err(self.error_form(err, stub));
clause_name!("socket_server_close"),
1,
));
}
}
}