コード例 #1
0
ファイル: testsockets.c プロジェクト: Ga-vin/apache
static void socket_userdata(abts_case *tc, void *data)
{
    apr_socket_t *sock1, *sock2;
    apr_status_t rv;
    void *user;
    const char *key = "GENERICKEY";

    rv = apr_socket_create(&sock1, AF_INET, SOCK_STREAM, 0, p);
    ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
    rv = apr_socket_create(&sock2, AF_INET, SOCK_STREAM, 0, p);
    ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);

    rv = apr_socket_data_set(sock1, "SOCK1", key, NULL);
    ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
    rv = apr_socket_data_set(sock2, "SOCK2", key, NULL);
    ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);

    rv = apr_socket_data_get(&user, key, sock1);
    ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
    ABTS_STR_EQUAL(tc, "SOCK1", user);
    rv = apr_socket_data_get(&user, key, sock2);
    ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
    ABTS_STR_EQUAL(tc, "SOCK2", user);
}
コード例 #2
0
ファイル: im_ssl.c プロジェクト: cephurs/pkg-nxlog-ce
static void im_ssl_free_input(nx_module_input_t *input)
{
    nx_im_ssl_conf_t *imconf;
    SSL *ssl;

    imconf = (nx_im_ssl_conf_t *) input->module->config;

    if ( input->desc.s != NULL )
    {
	apr_socket_close(input->desc.s);
	nx_module_pollset_remove_socket(input->module, input->desc.s);
	nx_module_remove_events_by_data(input->module, input->desc.s);
	apr_socket_data_set(input->desc.s, NULL, "input", NULL);
	NX_DLIST_REMOVE(imconf->connections, input, link);

	ssl = nx_module_input_data_get(input, "ssl");
	nx_ssl_destroy(&ssl);
	nx_module_input_free(input);
    }
}
コード例 #3
0
ファイル: mod_lisp2.c プロジェクト: mbattyani/mod_lisp
static apr_status_t
open_lisp_socket (lisp_cfg_t * cfg)
{
  apr_sockaddr_t * addr;
  apr_socket_t * socket;

  if ((SERVER_SOCKET (cfg)) != 0)
    {
    if (SERVER_SOCKET_SAFE_P (cfg))
	return (APR_SUCCESS);
      RELAY_ERROR (close_lisp_socket (cfg));
    }

  RELAY_ERROR
    (apr_sockaddr_info_get ((&addr), (cfg->server_address), APR_UNSPEC,
                            (cfg->server_port), 0, socket_pool));

#if (HAVE_APR_1_2_2)
  RELAY_ERROR (apr_socket_create ((&socket), AF_INET, SOCK_STREAM, APR_PROTO_TCP, socket_pool));
#else
  RELAY_ERROR (apr_socket_create ((&socket), AF_INET, SOCK_STREAM, socket_pool));
#endif
  
#if (HAVE_APR_1_2_2)
  RELAY_ERROR (apr_socket_connect (socket, addr));
#else
  RELAY_ERROR (apr_connect (socket, addr));
#endif
  {
    input_buffer_t * buffer
      = (apr_palloc (socket_pool, (sizeof (input_buffer_t))));
    (buffer -> start) = (buffer -> data);
    (buffer -> end) = (buffer -> data);
    RELAY_ERROR (apr_socket_data_set (socket, buffer, "input-buffer", 0));
  }
  (SERVER_SOCKET (cfg)) = socket;
  (SERVER_SOCKET_SAFE_P (cfg)) = 0;
  return (APR_SUCCESS);
}
コード例 #4
0
ファイル: im_ssl.c プロジェクト: cephurs/pkg-nxlog-ce
static void im_ssl_accept(nx_module_t *module)
{
    nx_im_ssl_conf_t *imconf;
    apr_socket_t *sock;
    apr_sockaddr_t *sa;
    char *ipstr;
    nx_module_input_t *input;
    SSL *ssl;
    apr_pool_t *pool = NULL;
    apr_status_t rv;
    nx_exception_t e;

    log_debug("im_ssl_accept");
    
    imconf = (nx_im_ssl_conf_t *) module->config;

    pool = nx_pool_create_child(module->pool);
    try
    {
	if ( (rv = apr_socket_accept(&sock, imconf->listensock, pool)) != APR_SUCCESS )
	{
	    if ( APR_STATUS_IS_EAGAIN(rv) )
	    {
		nx_module_add_poll_event(module);
		apr_pool_destroy(pool);
	    }
	    else
	    {
		throw(rv, "couldn't accept connection on %s:%u (statuscode: %d)",
		      imconf->host, imconf->port, rv);
	    }
	}

	if ( rv == APR_SUCCESS )
	{
	    CHECKERR_MSG(apr_socket_opt_set(sock, APR_SO_NONBLOCK, 1),
			 "couldn't set SO_NONBLOCK on accepted socket");
	    CHECKERR_MSG(apr_socket_timeout_set(sock, 0),
			 "couldn't set socket timeout on accepted socket");
	    CHECKERR_MSG(apr_socket_addr_get(&sa, APR_REMOTE, sock),
			 "couldn't get info on accepted socket");
	    CHECKERR_MSG(apr_sockaddr_ip_get(&ipstr, sa),
			 "couldn't get IP of accepted socket");

	    nx_module_pollset_add_socket(module, imconf->listensock, APR_POLLIN | APR_POLLHUP);
	    
	    ssl = nx_ssl_from_socket(&(imconf->ssl_ctx), sock);
	    ASSERT(ssl != NULL);
	    SSL_set_accept_state(ssl);
	    //SSL_accept(ssl);
    
	    CHECKERR_MSG(apr_socket_opt_set(sock, APR_SO_NONBLOCK, 1),
			 "couldn't set SO_NONBLOCK on accepted socket");
	    CHECKERR_MSG(apr_socket_timeout_set(sock, 0),
			 "couldn't set socket timeout on accepted socket");

	    input = nx_module_input_new(module, pool);
	    input->desc_type = APR_POLL_SOCKET;
	    input->desc.s = sock;
	    input->inputfunc = imconf->inputfunc;
	    ASSERT(input->inputfunc != NULL);
    
	    nx_module_input_data_set(input, "ssl", ssl);
		
	    CHECKERR_MSG(apr_socket_data_set(sock, input, "input", NULL),
			 "couldn't set data on socket");
	    NX_DLIST_INSERT_TAIL(imconf->connections, input, link);
	    nx_module_input_data_set(input, "recv_from_str", ipstr);
	    
	    nx_module_pollset_add_socket(module, sock, APR_POLLIN | APR_POLLHUP);
	    log_info("SSL connection accepted from %s:%u", ipstr, sa->port);
	}
    }
    catch(e)
    {
	apr_pool_destroy(pool);
	rethrow(e);
    }
}
コード例 #5
0
/*! Internal use callback associated with cpe_socket_after_accept().
 *  Handle the accept and put the new accepted socket in the event system.
 */
static apr_status_t
cpe_socket_accept_cb(void *context, apr_pollfd_t *pfd, cpe_event *e)
{
    apr_socket_t           *newsock;
    apr_status_t            rv;
    apr_sockaddr_t         *sockaddr;
    cpe_socket_prepare_ctx *ctx;
    cpe_event              *event;
    char                   *hostip;

    ctx = context;
    assert(ctx != NULL);
    pfd = NULL;
    cpe_event_add(e);

    CHECK(rv = apr_socket_accept(&newsock, ctx->pc_orig_socket, g_cpe_pool));
    rv = apr_socket_addr_get(&sockaddr, APR_REMOTE, newsock);
    if (rv == APR_SUCCESS) {
        apr_sockaddr_ip_get(&hostip, sockaddr);
    } else {
        cpe_log(CPE_ERR, "apr_sock_addr_get: %s", cpe_errmsg(rv));
        cpe_socket_close(newsock);
        return rv;
    }
    if (cpe_increment_peers(ctx) != APR_SUCCESS) {
        cpe_socket_close(newsock);
        cpe_log(CPE_WARN, "rejected connection from %s %d (too many)",
            hostip, sockaddr->port);
        return APR_EGENERAL;
    }
    /* Useless because APR doesn't call the callback on socket close (as
     * documented), but on pool destruction. So for the time being we use
     * our wrapper cpe_socket_close()
     */
    CHECK(apr_socket_data_set(newsock, ctx, "dummykey", cpe_socket_cleanup_cb));

    /* SECURITY: if the user didn't specify an accept filter, accept
     * only connections from localhost
     */
    if (ctx->pc_afilter != NULL) {
        rv = ctx->pc_afilter(sockaddr);
    } else {
        rv = cpe_filter_localhost(sockaddr);
    }
    if (rv != APR_SUCCESS) {
        cpe_socket_close(newsock);
        cpe_log(CPE_WARN, "rejected connection from %s %d (filtered)",
            hostip, sockaddr->port);
        return rv;
    }
    cpe_log(CPE_INFO, "accepted connection from %s %d", hostip,
        sockaddr->port);

    /* Critical for CPE: set the socket non-blocking. */
    apr_socket_opt_set(newsock, APR_SO_NONBLOCK, 1);
    apr_socket_timeout_set(newsock, 0);

    /*
     * Create an event for the new socket and add it to the event system.
     */
    cpe_log(CPE_DEB, "new accepted socket %p, creating event", newsock);
    event = cpe_event_fdesc_create(APR_POLL_SOCKET, ctx->pc_reqevents,
        (apr_descriptor) newsock, 0, ctx->pc_callback, ctx->pc_ctx1);
    if (event == NULL) {
        cpe_log(CPE_ERR, "%s", "cpe_event_fdesc_create fail");
        return APR_EGENERAL;
    }
    CHECK(cpe_event_add(event));
    if (ctx->pc_one_shot_cb != NULL) {
        CHECK(ctx->pc_one_shot_cb(ctx->pc_one_shot_ctx, &event->ev_pollfd, event));
    }
    return rv;
}