Пример #1
0
void *ast_tcptls_server_root(void *data)
{
    struct ast_tcptls_session_args *desc = data;
    int fd;
    struct ast_sockaddr addr;
    struct ast_tcptls_session_instance *tcptls_session;
    pthread_t launched;

    for (;;) {
        int i, flags;

        if (desc->periodic_fn) {
            desc->periodic_fn(desc);
        }
        i = ast_wait_for_input(desc->accept_fd, desc->poll_timeout);
        if (i <= 0) {
            continue;
        }
        fd = ast_accept(desc->accept_fd, &addr);
        if (fd < 0) {
            if ((errno != EAGAIN) && (errno != EWOULDBLOCK) && (errno != EINTR) && (errno != ECONNABORTED)) {
                ast_log(LOG_ERROR, "Accept failed: %s\n", strerror(errno));
                break;
            }
            continue;
        }
        tcptls_session = ao2_alloc(sizeof(*tcptls_session), session_instance_destructor);
        if (!tcptls_session) {
            ast_log(LOG_WARNING, "No memory for new session: %s\n", strerror(errno));
            if (close(fd)) {
                ast_log(LOG_ERROR, "close() failed: %s\n", strerror(errno));
            }
            continue;
        }

        tcptls_session->overflow_buf = ast_str_create(128);
        flags = fcntl(fd, F_GETFL);
        fcntl(fd, F_SETFL, flags & ~O_NONBLOCK);

        tcptls_session->stream = ast_iostream_from_fd(&fd);
        if (!tcptls_session->stream) {
            ast_log(LOG_WARNING, "No memory for new session iostream\n");
            continue;
        }

        tcptls_session->parent = desc;
        ast_sockaddr_copy(&tcptls_session->remote_address, &addr);

        tcptls_session->client = 0;

        /* This thread is now the only place that controls the single ref to tcptls_session */
        if (ast_pthread_create_detached_background(&launched, NULL, handle_tcptls_connection, tcptls_session)) {
            ast_log(LOG_ERROR, "Unable to launch helper thread: %s\n", strerror(errno));
            ast_tcptls_close_session_file(tcptls_session);
            ao2_ref(tcptls_session, -1);
        }
    }
    return NULL;
}
Пример #2
0
int ooSocketAccept (OOSOCKET socket, OOSOCKET *pNewSocket, 
                    char* destAddr, int* destPort) 
{
   struct ast_sockaddr addr;
   char* host = NULL;

   if (socket == OOSOCKET_INVALID) return ASN_E_INVSOCKET;
   if (pNewSocket == 0) return ASN_E_INVPARAM;

   *pNewSocket = ast_accept (socket, &addr);
   if (*pNewSocket <= 0) return ASN_E_INVSOCKET;

   if (destAddr != 0) {
      if ((host = ast_sockaddr_stringify_addr(&addr)) != NULL);
      	strncpy(destAddr, host, strlen(host));
   }
   if (destPort != 0)
      *destPort =  ast_sockaddr_port(&addr);

   return ASN_OK;
}