/** * \ingroup msg_file_management * \brief Copy a file to another location on a remote host. * \param file : the file to move * \param host : the remote host where the file has to be copied * \param fullpath : the complete path destination on the remote host * \return If successful, the function returns MSG_OK. Otherwise, it returns * MSG_TASK_CANCELED. */ msg_error_t MSG_file_rcopy (msg_file_t file, msg_host_t host, const char* fullpath) { msg_file_priv_t file_priv = MSG_file_priv(file); sg_size_t read_size; /* Find the host where the file is physically located and read it */ msg_storage_t storage_src =(msg_storage_t) xbt_lib_get_elm_or_null(storage_lib, file_priv->storageId); msg_storage_priv_t storage_priv_src = MSG_storage_priv(storage_src); msg_host_t attached_host = MSG_get_host_by_name(storage_priv_src->hostname); MSG_file_seek(file, 0, SEEK_SET); read_size = simcall_file_read(file_priv->simdata->smx_file, file_priv->size, attached_host); /* Find the real host destination where the file will be physically stored */ xbt_dict_cursor_t cursor = NULL; char *mount_name, *storage_name, *file_mount_name, *host_name_dest; msg_storage_t storage_dest = NULL; msg_host_t host_dest; size_t longest_prefix_length = 0; xbt_dict_t storage_list = simcall_host_get_mounted_storage_list(host); xbt_dict_foreach(storage_list,cursor,mount_name,storage_name){ file_mount_name = (char *) xbt_malloc ((strlen(mount_name)+1)); strncpy(file_mount_name,fullpath,strlen(mount_name)+1); file_mount_name[strlen(mount_name)] = '\0'; if(!strcmp(file_mount_name,mount_name) && strlen(mount_name)>longest_prefix_length){ /* The current mount name is found in the full path and is bigger than the previous*/ longest_prefix_length = strlen(mount_name); storage_dest = (msg_storage_t) xbt_lib_get_elm_or_null(storage_lib, storage_name); } free(file_mount_name); }
boost::unordered_map<std::string, Storage&> &Host::mountedStorages() { if (mounts == NULL) { mounts = new boost::unordered_map<std::string, Storage&> (); xbt_dict_t dict = simcall_host_get_mounted_storage_list(p_inferior); xbt_dict_cursor_t cursor; char *mountname; char *storagename; xbt_dict_foreach(dict, cursor, mountname, storagename) { mounts->insert({mountname, Storage::byName(storagename)}); } xbt_dict_free(&dict); }
/** \ingroup m_host_management * \brief Return the content of mounted storages on an host. * \param host a host * \return a dict containing content (as a dict) of all storages mounted on the host */ xbt_dict_t MSG_host_get_storage_content(msg_host_t host) { xbt_assert((host != NULL), "Invalid parameters"); xbt_dict_t contents = xbt_dict_new_homogeneous(NULL); msg_storage_t storage; char* storage_name; char* mount_name; xbt_dict_cursor_t cursor = NULL; xbt_dict_t storage_list = simcall_host_get_mounted_storage_list(host); xbt_dict_foreach(storage_list,cursor,mount_name,storage_name){ storage = (msg_storage_t)xbt_lib_get_elm_or_null(storage_lib,storage_name); xbt_dict_t content = simcall_storage_get_content(storage); xbt_dict_set(contents,mount_name, content,NULL); }
/** \ingroup m_host_management * \brief Return the list of mount point names on an host. * \param host a host * \return a dict containing all mount point on the host (mount_name => msg_storage_t) */ xbt_dict_t MSG_host_get_mounted_storage_list(msg_host_t host) { xbt_assert((host != NULL), "Invalid parameters"); return (simcall_host_get_mounted_storage_list(host)); }