int tr_open_file_for_writing (const char * filename) { return open_local_file (filename, O_LARGEFILE|O_BINARY|O_CREAT|O_WRONLY); }
int tr_open_file_for_scanning (const char * filename) { return open_local_file (filename, O_LARGEFILE|O_BINARY|O_SEQUENTIAL|O_RDONLY); }
static void process_opens(int fd, short args, void *cbdata) { orte_dfs_request_t *dfs = (orte_dfs_request_t*)cbdata; int rc; opal_buffer_t *buffer; char *scheme, *host, *filename, *hostname; orte_process_name_t daemon; bool found; orte_vpid_t v; /* get the scheme to determine if we can process locally or not */ if (NULL == (scheme = opal_uri_get_scheme(dfs->uri))) { OBJ_RELEASE(dfs); return; } if (0 == strcmp(scheme, "nfs")) { open_local_file(dfs); goto complete; } if (0 != strcmp(scheme, "file")) { /* not yet supported */ orte_show_help("orte_dfs_help.txt", "unsupported-filesystem", true, dfs->uri); if (NULL != dfs->open_cbfunc) { dfs->open_cbfunc(-1, dfs->cbdata); } goto complete; } /* dissect the uri to extract host and filename/path */ if (NULL == (filename = opal_filename_from_uri(dfs->uri, &host))) { goto complete; } /* if the host is our own, then treat it as a local file */ if (NULL == host || 0 == strcmp(host, orte_process_info.nodename) || 0 == strcmp(host, "localhost") || opal_ifislocal(host)) { opal_output_verbose(1, orte_dfs_base.output, "%s file %s on local host", ORTE_NAME_PRINT(ORTE_PROC_MY_NAME), filename); open_local_file(dfs); goto complete; } /* ident the daemon on that host */ daemon.jobid = ORTE_PROC_MY_DAEMON->jobid; found = false; for (v=0; v < orte_process_info.num_daemons; v++) { daemon.vpid = v; /* fetch the hostname where this daemon is located */ if (ORTE_SUCCESS != (rc = orte_db.fetch_pointer(&daemon, ORTE_DB_HOSTNAME, (void**)&hostname, OPAL_STRING))) { ORTE_ERROR_LOG(rc); goto complete; } if (0 == strcmp(host, hostname)) { found = true; break; } } if (!found) { ORTE_ERROR_LOG(ORTE_ERR_NOT_FOUND); goto complete; } opal_output_verbose(1, orte_dfs_base.output, "%s file %s on host %s daemon %s", ORTE_NAME_PRINT(ORTE_PROC_MY_NAME), filename, host, ORTE_NAME_PRINT(&daemon)); /* double-check: if it is our local daemon, then we * treat this as local */ if (daemon.vpid == ORTE_PROC_MY_DAEMON->vpid) { opal_output_verbose(1, orte_dfs_base.output, "%s local file %s on same daemon", ORTE_NAME_PRINT(ORTE_PROC_MY_NAME), filename); open_local_file(dfs); goto complete; } /* add this request to our local list so we can * match it with the returned response when it comes */ dfs->id = req_id++; opal_list_append(&requests, &dfs->super); /* setup a message for the daemon telling * them what file we want to access */ buffer = OBJ_NEW(opal_buffer_t); if (OPAL_SUCCESS != (rc = opal_dss.pack(buffer, &dfs->cmd, 1, ORTE_DFS_CMD_T))) { ORTE_ERROR_LOG(rc); opal_list_remove_item(&requests, &dfs->super); goto complete; } /* pass the request id */ if (OPAL_SUCCESS != (rc = opal_dss.pack(buffer, &dfs->id, 1, OPAL_UINT64))) { ORTE_ERROR_LOG(rc); opal_list_remove_item(&requests, &dfs->super); goto complete; } if (OPAL_SUCCESS != (rc = opal_dss.pack(buffer, &filename, 1, OPAL_STRING))) { ORTE_ERROR_LOG(rc); opal_list_remove_item(&requests, &dfs->super); goto complete; } opal_output_verbose(1, orte_dfs_base.output, "%s sending open file request to %s file %s", ORTE_NAME_PRINT(ORTE_PROC_MY_NAME), ORTE_NAME_PRINT(&daemon), filename); /* send it */ if (0 > (rc = orte_rml.send_buffer_nb(&daemon, buffer, ORTE_RML_TAG_DFS_CMD, 0, orte_rml_send_callback, NULL))) { ORTE_ERROR_LOG(rc); OBJ_RELEASE(buffer); opal_list_remove_item(&requests, &dfs->super); goto complete; } /* don't release it */ return; complete: OBJ_RELEASE(dfs); }