Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support listen() for tcp wrapper #2763

Merged
merged 2 commits into from
Feb 24, 2023
Merged

Conversation

stevenengler
Copy link
Contributor

@stevenengler stevenengler commented Feb 23, 2023

The logic generally follows the logic from src/main/host/syscall/socket.c.

SysCallReturn syscallhandler_listen(SysCallHandler* sys,
const SysCallArgs* args) {
int sockfd = args->args[0].as_i64;
int backlog = args->args[1].as_i64;
trace("trying to listen on socket %i", sockfd);
/* Get and validate the TCP socket. */
TCP* tcp_desc = NULL;
int errcode =
_syscallhandler_validateTCPSocketHelper(sys, sockfd, &tcp_desc);
if (errcode < 0) {
return syscallreturn_makeDoneErrno(-errcode);
}
utility_debugAssert(tcp_desc);
/* only listen on the socket if it is not used for other functions */
if (!tcp_isListeningAllowed(tcp_desc)) {
debug("Cannot listen on previously used socket %i", sockfd);
return syscallreturn_makeDoneErrno(EOPNOTSUPP);
}
/* if we are already listening, just update the backlog and return 0. */
if (tcp_isValidListener(tcp_desc)) {
trace("Socket %i already set up as a listener; updating backlog", sockfd);
tcp_updateServerBacklog(tcp_desc, backlog);
return syscallreturn_makeDoneU64(0);
}
/* We are allowed to listen but not already listening, start now. */
if (!legacysocket_isBound((LegacySocket*)tcp_desc)) {
/* Implicit bind: bind to all interfaces at an ephemeral port. */
trace("Implicitly binding listener socket %i", sockfd);
errcode =
_syscallhandler_bindHelper(sys, (LegacySocket*)tcp_desc, htonl(INADDR_ANY), 0, 0, 0);
if (errcode < 0) {
return syscallreturn_makeDoneErrno(-errcode);
}
}
tcp_enterServerMode(
tcp_desc, _syscallhandler_getHost(sys), _syscallhandler_getProcess(sys), backlog);
return syscallreturn_makeDoneU64(0);
}

@stevenengler stevenengler self-assigned this Feb 23, 2023
@github-actions github-actions bot added the Component: Main Composing the core Shadow executable label Feb 23, 2023
@stevenengler stevenengler merged commit 82353d9 into shadow:main Feb 24, 2023
@stevenengler stevenengler deleted the wrap-tcp-rust branch February 24, 2023 00:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Component: Main Composing the core Shadow executable
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants