Ejemplo n.º 1
0
/**
 * \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);
  }
Ejemplo n.º 2
0
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);
	}
Ejemplo n.º 3
0
/** \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);
  }
Ejemplo n.º 4
0
/** \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));
}