#include <stdio.h>
#include <unistd.h>
#include <limits.h>
#include "mpi.h"
int main(int argc, char** argv) {
  int me, nproc, *iop, iorank, flag, input;
  char hostname[PATH_MAX];
  MPI_Init(&argc, &argv);
  MPI_Comm_rank(MPI_COMM_WORLD, &me);
  MPI_Comm_size(MPI_COMM_WORLD, &nproc);
  MPI_Comm_get_attr(MPI_COMM_WORLD, MPI_IO, &iop, &flag);
  if(!flag){
    fprintf(stderr, "MPI_Attr_get failed, exiting\n");
    goto exit; 
  }
  if(gethostname(hostname, PATH_MAX) != 0){
    fprintf(stderr, "gethostname failed, exiting\n");
    goto exit; 
  }
  fprintf(stderr, 
          "Clone %3d @ %s got %d in iop (MPI_PROC_NULL == %d, MPI_ANY_SOURCE == %d)\n", 
          me, hostname, *iop, MPI_PROC_NULL, MPI_ANY_SOURCE);
  if(*iop == MPI_PROC_NULL){
    fprintf(stderr, "Noone can do IO!\n");
    goto exit;
  }
  if(*iop == MPI_ANY_SOURCE){
    fprintf(stderr, "Any Clone can IO!\n");
    iorank = nproc - 1;
    *iop =  nproc - 1;
  }

  MPI_Allreduce(iop, &iorank, 1, MPI_INT, MPI_MIN, MPI_COMM_WORLD);

  fprintf(stderr, "Clone %3d iorank = %d!\n", me, iorank);

  MPI_Barrier(MPI_COMM_WORLD);

  if(me == iorank){
    fprintf(stderr, "I'm Clone %3d  and I'm the chosen one to do IO!\n", iorank);
    fprintf(stderr, "Give me a number\n");
    scanf("%d", &input);
    fprintf(stderr, "You gave me %d\n", input);
  }

  MPI_Bcast(&input, 1, MPI_INT, iorank, MPI_COMM_WORLD);

  fprintf(stderr, "Clone %3d input = %d!\n", me, input);

 
 exit:
  MPI_Finalize();
  return 0;
}