static void xio_l_wrapblock_wrapper_destroy( xio_l_wrapblock_wrapper_t * wrapper) { globus_xio_contact_destroy(&wrapper->ci); if(wrapper->iovec != NULL) { globus_free(wrapper->iovec); } if(wrapper->attr && wrapper->driver && wrapper->driver->attr_destroy_func) { wrapper->driver->attr_destroy_func(wrapper->attr); } globus_free(wrapper); }
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; }
int main( int argc, char ** argv) { int rc = 0; globus_result_t result; char * cs; globus_xio_contact_t parsed_contact; char * new_banner; char * old_banner; GlobusGFSName(main); /* activte globus stuff */ if((rc = globus_module_activate(GLOBUS_COMMON_MODULE)) != GLOBUS_SUCCESS || (rc = globus_module_activate( GLOBUS_GRIDFTP_SERVER_MODULE)) != GLOBUS_SUCCESS) { fprintf(stderr, "Error: Failed to initialize:\n%s", globus_error_print_friendly(globus_error_peek(rc))); goto error_activate; } /* initialize global variables */ globus_mutex_init(&globus_l_gfs_mutex, GLOBUS_NULL); globus_cond_init(&globus_l_gfs_cond, GLOBUS_NULL); globus_l_gfs_signal_init(); globus_libc_printf("Embedded server starting.\n"); globus_mutex_lock(&globus_l_gfs_mutex); { result = globus_gridftp_server_embed_init( &globus_l_gfs_server_handle, argv); if(result != GLOBUS_SUCCESS) { rc = 1; goto error_lock; } /* add our acl module */ globus_gfs_acl_add_module(&globus_gfs_acl_test_module); /* customize some config */ old_banner = globus_gridftp_server_embed_config_get_string( globus_l_gfs_server_handle, "banner"); new_banner = globus_common_create_string( "%s\nEMBEDDED", old_banner); globus_gridftp_server_embed_config_set_ptr( globus_l_gfs_server_handle, "banner", new_banner); globus_free(old_banner); globus_gridftp_server_embed_config_set_int( globus_l_gfs_server_handle, "connections_max", 10); globus_gridftp_server_embed_config_set_int( globus_l_gfs_server_handle, "auth_level", 1 | /* identity check */ 2 | /* file access checks */ 4 | /* disable setuid (not really needed with gridmap disabled)*/ 8); /* disable gridmap lookup */ result = globus_gridftp_server_embed_start( globus_l_gfs_server_handle, globus_l_gfs_event_cb, NULL); if(result != GLOBUS_SUCCESS) { rc = 1; goto error_lock; } globus_l_gfs_server_active = GLOBUS_TRUE; cs = globus_gridftp_server_embed_config_get_string( globus_l_gfs_server_handle, "contact_string"); globus_xio_contact_parse(&parsed_contact, cs); globus_libc_printf( "Server listening on port %s.\n", parsed_contact.port); globus_xio_contact_destroy(&parsed_contact); /* run until we are done */ while(!globus_l_gfs_terminated || globus_l_gfs_server_active) { globus_cond_wait(&globus_l_gfs_cond, &globus_l_gfs_mutex); } } globus_mutex_unlock(&globus_l_gfs_mutex); globus_module_deactivate_all(); GlobusGFSDebugExit(); return 0; error_lock: globus_mutex_unlock(&globus_l_gfs_mutex); error_activate: globus_module_deactivate_all(); GlobusGFSDebugExitWithError(); return rc; }