コード例 #1
0
ファイル: lwresd.c プロジェクト: gosudream/netbsd-src
static void
listener_copysock(ns_lwreslistener_t *oldlistener,
		  ns_lwreslistener_t *newlistener)
{
	newlistener->address = oldlistener->address;
	isc_socket_attach(oldlistener->sock, &newlistener->sock);
}
コード例 #2
0
ファイル: httpd.c プロジェクト: VargMon/netbsd-cvs-mirror
isc_result_t
isc_httpdmgr_create(isc_mem_t *mctx, isc_socket_t *sock, isc_task_t *task,
		    isc_httpdclientok_t *client_ok,
		    isc_httpdondestroy_t *ondestroy, void *cb_arg,
		    isc_timermgr_t *tmgr, isc_httpdmgr_t **httpdp)
{
	isc_result_t result;
	isc_httpdmgr_t *httpd;

	REQUIRE(mctx != NULL);
	REQUIRE(sock != NULL);
	REQUIRE(task != NULL);
	REQUIRE(tmgr != NULL);
	REQUIRE(httpdp != NULL && *httpdp == NULL);

	httpd = isc_mem_get(mctx, sizeof(isc_httpdmgr_t));
	if (httpd == NULL)
		return (ISC_R_NOMEMORY);

	result = isc_mutex_init(&httpd->lock);
	if (result != ISC_R_SUCCESS) {
		isc_mem_put(mctx, httpd, sizeof(isc_httpdmgr_t));
		return (result);
	}
	httpd->mctx = NULL;
	isc_mem_attach(mctx, &httpd->mctx);
	httpd->sock = NULL;
	isc_socket_attach(sock, &httpd->sock);
	httpd->task = NULL;
	isc_task_attach(task, &httpd->task);
	httpd->timermgr = tmgr; /* XXXMLG no attach function? */
	httpd->client_ok = client_ok;
	httpd->ondestroy = ondestroy;
	httpd->cb_arg = cb_arg;

	ISC_LIST_INIT(httpd->running);
	ISC_LIST_INIT(httpd->urls);

	/* XXXMLG ignore errors on isc_socket_listen() */
	result = isc_socket_listen(sock, SOMAXCONN);
	if (result != ISC_R_SUCCESS) {
		UNEXPECTED_ERROR(__FILE__, __LINE__,
				 "isc_socket_listen() failed: %s",
				 isc_result_totext(result));
		goto cleanup;
	}

	(void)isc_socket_filter(sock, "httpready");

	result = isc_socket_accept(sock, task, isc_httpd_accept, httpd);
	if (result != ISC_R_SUCCESS)
		goto cleanup;

	httpd->render_404 = render_404;
	httpd->render_500 = render_500;

	*httpdp = httpd;
	return (ISC_R_SUCCESS);

  cleanup:
	isc_task_detach(&httpd->task);
	isc_socket_detach(&httpd->sock);
	isc_mem_detach(&httpd->mctx);
	(void)isc_mutex_destroy(&httpd->lock);
	isc_mem_put(mctx, httpd, sizeof(isc_httpdmgr_t));
	return (result);
}
コード例 #3
0
isc_result_t
ns_lwdclientmgr_create(ns_lwreslistener_t *listener, unsigned int nclients,
                       isc_taskmgr_t *taskmgr)
{
    ns_lwresd_t *lwresd = listener->manager;
    ns_lwdclientmgr_t *cm;
    ns_lwdclient_t *client;
    unsigned int i;
    isc_result_t result = ISC_R_FAILURE;

    cm = isc_mem_get(lwresd->mctx, sizeof(ns_lwdclientmgr_t));
    if (cm == NULL)
        return (ISC_R_NOMEMORY);

    cm->listener = NULL;
    ns_lwreslistener_attach(listener, &cm->listener);
    cm->mctx = lwresd->mctx;
    cm->sock = NULL;
    isc_socket_attach(listener->sock, &cm->sock);
    cm->view = lwresd->view;
    cm->lwctx = NULL;
    cm->task = NULL;
    cm->flags = 0;
    ISC_LINK_INIT(cm, link);
    ISC_LIST_INIT(cm->idle);
    ISC_LIST_INIT(cm->running);

    if (lwres_context_create(&cm->lwctx, cm->mctx,
                             ns__lwresd_memalloc, ns__lwresd_memfree,
                             LWRES_CONTEXT_SERVERMODE)
            != ISC_R_SUCCESS)
        goto errout;

    for (i = 0; i < nclients; i++) {
        client = isc_mem_get(lwresd->mctx, sizeof(ns_lwdclient_t));
        if (client != NULL) {
            ns_lwdclient_log(50, "created client %p, manager %p",
                             client, cm);
            ns_lwdclient_initialize(client, cm);
        }
    }

    /*
     * If we could create no clients, clean up and return.
     */
    if (ISC_LIST_EMPTY(cm->idle))
        goto errout;

    result = isc_task_create(taskmgr, 0, &cm->task);
    if (result != ISC_R_SUCCESS)
        goto errout;

    /*
     * This MUST be last, since there is no way to cancel an onshutdown...
     */
    result = isc_task_onshutdown(cm->task, lwdclientmgr_shutdown_callback,
                                 cm);
    if (result != ISC_R_SUCCESS)
        goto errout;

    ns_lwreslistener_linkcm(listener, cm);

    return (ISC_R_SUCCESS);

errout:
    client = ISC_LIST_HEAD(cm->idle);
    while (client != NULL) {
        ISC_LIST_UNLINK(cm->idle, client, link);
        isc_mem_put(lwresd->mctx, client, sizeof(*client));
        client = ISC_LIST_HEAD(cm->idle);
    }

    if (cm->task != NULL)
        isc_task_detach(&cm->task);

    if (cm->lwctx != NULL)
        lwres_context_destroy(&cm->lwctx);

    isc_mem_put(lwresd->mctx, cm, sizeof(*cm));
    return (result);
}