/* -*- C -*-
 *
 * $HEADER$
 *
 * Moving files
 */

#include <stdio.h>

#include "orte/runtime/runtime.h"
#include "orte/mca/errmgr/errmgr.h"
#include "orte/util/proc_info.h"

#include "orte/mca/filem/filem.h"

int main(int argc, char* argv[])
{
    orte_filem_base_request_t fmreq;
    orte_filem_base_process_set_t *fm;
    orte_filem_base_file_set_t *fs;
    int rc;
    orte_vpid_t i;

    if (argc != 3) {
        fprintf(stderr, "usage: orte_filem <src-file> <dest-file>\n");
        exit(1);
    }

    if (ORTE_SUCCESS != orte_init(&argc, &argv, ORTE_PROC_NON_MPI)) {
        fprintf(stderr, "Failed orte_init\n");
        exit(1);
    }
    
    if (1 == orte_process_info.num_procs) {
        fprintf(stderr, "Must invoke more than one process\n");
        orte_finalize();
        exit(1);
    }

    /* setup the filem request list */
    OBJ_CONSTRUCT(&fmreq, orte_filem_base_request_t);
    /* we want to move the files to the location of
     * every process in this job
     */
    for (i=0; i < orte_process_info.num_procs; i++) {
        if (i != ORTE_PROC_MY_NAME->vpid) {
            fm = OBJ_NEW(orte_filem_base_process_set_t);
            fm->source.jobid = ORTE_PROC_MY_NAME->jobid;
            fm->source.vpid = ORTE_PROC_MY_NAME->vpid;
            fm->sink.jobid = ORTE_PROC_MY_NAME->jobid;;
            fm->sink.vpid = i;
            opal_list_append(&fmreq.process_sets, &fm->super);
        }
    }

    fs = OBJ_NEW(orte_filem_base_file_set_t);
    fs->local_target = strdup(argv[1]);
    fs->remote_target = strdup(argv[2]);
    fs->remote_hint = ORTE_FILEM_HINT_SHARED;
    fs->target_flag = ORTE_FILEM_TYPE_FILE;
    opal_list_append(&fmreq.file_sets, &fs->super);


    /* move files - this blocks until the files have been moved */
    if (ORTE_SUCCESS != (rc = orte_filem.put(&fmreq))) {
        ORTE_ERROR_LOG(rc);
        exit(1);
    }

    if (ORTE_SUCCESS != orte_finalize()) {
        fprintf(stderr, "Failed orte_finalize\n");
        exit(1);
    }
    return 0;
}