static globus_result_t
globus_l_xio_telnet_accept(
    void *                              driver_server,
    globus_xio_operation_t              accept_op)
{
    globus_result_t                     res;
    globus_l_xio_telnet_attr_t *        attr;
    GlobusXIOName(globus_l_xio_telnet_accept);
   
    res = globus_l_xio_telnet_attr_copy((void **) (void *) &attr, driver_server);
    if(res != GLOBUS_SUCCESS)
    {
        goto error;
    }
    res = globus_xio_driver_pass_accept(
        accept_op, globus_l_xio_telnet_accept_cb, attr);
    if(res != GLOBUS_SUCCESS)
    {
        goto error_pass;
    }
    return GLOBUS_SUCCESS;
error_pass:
    globus_l_xio_telnet_server_destroy(attr);
error:
    return res;
}
/**
 * Accept an HTTP request
 * @ingroup globus_i_xio_http_server
 *
 * Passes the request to the transport driver. In the callback, 
 * the request target information will be generated.
 *
 * @param driver_server
 *     Void * pointing to a server structure. Not used yet.
 * @param accept_op
 *     Operation associated with the accept.
 *
 * @return
 * This function passes the accept to the underlying transport driver,
 * so will return whatever value that driver returns.
 */
globus_result_t
globus_i_xio_http_accept(
    void *                              driver_server,
    globus_xio_operation_t              accept_op)
{
    return globus_xio_driver_pass_accept(accept_op,
            globus_l_xio_http_accept_callback, NULL);
}
static
globus_result_t
globus_l_xio_net_manager_server_accept(
    void *                              driver_server,
    globus_xio_operation_t              op)
{
    globus_result_t                     result = GLOBUS_SUCCESS;
    globus_l_xio_net_manager_server_t  *server = driver_server;
    globus_l_xio_net_manager_link_t    *link = NULL;
    globus_net_manager_attr_t          *new_attr_array = NULL;

    if (! server)
    {
        goto no_server;
    }
    result = globus_net_manager_context_pre_accept(
        server->attr->context,
        server->attr->task_id ? server->attr->task_id : "unset",
        server->transport_name,
        server->local_contact,
        server->attr->attr_array,
        &new_attr_array);

    if (result)
    {
        goto pre_accept_fail;
    }
    link = malloc(sizeof(globus_l_xio_net_manager_link_t));
    if (link == NULL)
    {
        result = GlobusNetManagerErrorMemory("link");
        goto link_malloc_fail;
    }
    link->local_contact = strdup(server->local_contact);
    if (link->local_contact == NULL)
    {
        result = GlobusNetManagerErrorMemory("local_contact");
        goto strdup_local_contact_fail;
    }
    link->remote_contact = NULL;
    if (server->attr)
    {
        result = globus_l_xio_net_manager_attr_copy(
                (void **) &link->attr,
                server->attr);
    }
    else
    {
        result = globus_l_xio_net_manager_attr_init(
                (void **) &link->attr);
    }

    if (result != GLOBUS_SUCCESS)
    {
        goto attr_copy_fail;
    }

    link->transport_name = server->transport_name;
    link->transport_driver = server->transport_driver;

    if (new_attr_array)
    {
        globus_net_manager_attr_array_delete(link->attr->attr_array);
        link->attr->attr_array = new_attr_array;
        new_attr_array = NULL;
    }

no_server:
    result = globus_xio_driver_pass_accept(
            op,
            globus_l_xio_net_manager_server_accept_callback, 
            link);

    if (result != GLOBUS_SUCCESS && link != NULL)
    {
        globus_l_xio_net_manager_attr_destroy(link->attr);
attr_copy_fail:
        free(link->local_contact);
strdup_local_contact_fail:
        free(link);
    }
link_malloc_fail:
pre_accept_fail:
    return result;
}