Exemplo n.º 1
0
static
globus_result_t
globus_l_xio_telnet_server_init(
    void *                              driver_attr,
    const globus_xio_contact_t *        contact_info,
    globus_xio_operation_t              op)
{
    globus_result_t                     res;
    globus_l_xio_telnet_attr_t *        attr;
    GlobusXIOName(globus_l_xio_telnet_server_init);

    res = globus_l_xio_telnet_attr_copy((void **) (void *) &attr, driver_attr);
    if(res != GLOBUS_SUCCESS)
    {
        goto error;
    }
    res = globus_xio_driver_pass_server_init(op, contact_info, attr);
    if(res != GLOBUS_SUCCESS)
    {
        goto error_pass;
    }
    return GLOBUS_SUCCESS;
error_pass:
    globus_l_xio_telnet_server_destroy(attr);
error:
    return res;
}
static
globus_result_t
globus_l_xio_net_manager_server_init(
    void *                              driver_attr,
    const globus_xio_contact_t         *contact_info,
    globus_xio_operation_t              op)
{
    globus_result_t                     result = GLOBUS_SUCCESS;
    globus_net_manager_attr_t          *transport_attrs = NULL,
                                       *new_attrs = NULL;
    globus_l_xio_net_manager_server_t  *server = NULL;
    char                               *new_contact_string = NULL;
    globus_xio_contact_t                new_contact_info = {NULL};

    if (!driver_attr)
    {
        result = globus_xio_driver_pass_server_init(
            op,
            contact_info,
            NULL);

        goto no_attr;
    }
    server = malloc(sizeof(globus_l_xio_net_manager_server_t));
    if (!server)
    {
        result = GlobusNetManagerErrorMemory("server");
        goto server_malloc_fail;
    }
    server->transport_driver = globus_xio_operation_get_transport_user_driver(
            op);

    result = globus_xio_driver_attr_cntl(
            op,
            server->transport_driver,
            GLOBUS_XIO_GET_DRIVER_NAME,
            &server->transport_name);
    if (result)
    {
        goto get_driver_name_fail;
    }
    result = globus_l_xio_net_manager_attr_copy(
            (void **)&server->attr, driver_attr);
    if (result)
    {
        goto copy_attr_fail;
    }
    
    result = globus_l_xio_net_manager_get_attr_array(
            op,
            server->transport_driver,
            server->transport_name,
            &transport_attrs);
    if (result)
    {
        goto get_attr_array_fail;
    }

    result = globus_net_manager_context_post_listen(
        server->attr->context,
        server->attr->task_id ? server->attr->task_id : "unset",
        server->transport_name,
        contact_info->unparsed,
        transport_attrs,
        &new_contact_string,
        &new_attrs);
    if (result)
    {
        goto post_listen_fail;
    }

    if (new_contact_string)
    {
        server->local_contact = new_contact_string;
        new_contact_string = NULL;
        result = globus_xio_contact_parse(
                &new_contact_info,
                new_contact_string);
        if (result)
        {
            goto parse_contact_fail;
        }
    }
    else
    {
        server->local_contact = strdup(contact_info->unparsed);
        if (server->local_contact == NULL)
        {
            result = GlobusNetManagerErrorMemory("local_contact");
            goto strdup_contact_fail;
        }
    }
    if (new_attrs)
    {
        result = globus_l_xio_net_manager_transport_attr_apply(op, new_attrs);
        if (result)
        {
            goto apply_attr_fail;
        }
    }

    result = globus_xio_driver_pass_server_init(
        op,
        new_contact_info.unparsed ? &new_contact_info : contact_info,
        server);

apply_attr_fail:
    globus_xio_contact_destroy(&new_contact_info);
    if (result)
    {
        free(server->local_contact);
    }
strdup_contact_fail:
parse_contact_fail:
    free(new_contact_string);
    globus_net_manager_attr_array_delete(new_attrs);
post_listen_fail:
    globus_net_manager_attr_array_delete(transport_attrs);
get_attr_array_fail:
    if (result)
    {
        globus_l_xio_net_manager_attr_destroy(server->attr);
copy_attr_fail:
get_driver_name_fail:
        free(server);
    }
server_malloc_fail:
no_attr:
    return result;
}