in src/socket_listener_berkeley.c [46:110]
int socketlistener_start(SOCKET_LISTENER_HANDLE socket_listener, ON_SOCKET_ACCEPTED on_socket_accepted, void* callback_context)
{
int result;
if (socket_listener == NULL)
{
LogError("NULL socket_listener");
result = MU_FAILURE;
}
else
{
SOCKET_LISTENER_INSTANCE* socket_listener_instance = (SOCKET_LISTENER_INSTANCE*)socket_listener;
socket_listener_instance->socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (socket_listener_instance->socket == -1)
{
LogError("Creating socket failed");
result = MU_FAILURE;
}
else
{
struct sockaddr_in sa;
socket_listener_instance->on_socket_accepted = on_socket_accepted;
socket_listener_instance->callback_context = callback_context;
sa.sin_family = AF_INET;
sa.sin_port = htons(socket_listener_instance->port);
sa.sin_addr.s_addr = htonl(INADDR_ANY);
int flags;
if ((-1 == (flags = fcntl(socket_listener_instance->socket, F_GETFL, 0))) ||
(fcntl(socket_listener_instance->socket, F_SETFL, flags | O_NONBLOCK) == -1))
{
LogError("Failure: fcntl failure.");
close(socket_listener_instance->socket);
socket_listener_instance->socket = -1;
result = MU_FAILURE;
}
else if (bind(socket_listener_instance->socket, (const struct sockaddr*)&sa, sizeof(sa)) == -1)
{
LogError("bind socket failed");
(void)close(socket_listener_instance->socket);
socket_listener_instance->socket = -1;
result = MU_FAILURE;
}
else
{
if (listen(socket_listener_instance->socket, SOMAXCONN) == -1)
{
LogError("listen on socket failed");
(void)close(socket_listener_instance->socket);
socket_listener_instance->socket = -1;
result = MU_FAILURE;
}
else
{
result = 0;
}
}
}
}
return result;
}