int socketlistener_start()

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;
}