#include "fileattr.h"

/*mpi_fileattr_define: Defines the MPI Datatype corresponding to the
                       FileAttr type. Returns 1 on successful
                       definition */ 

int mpi_fileattr_define () {

    struct FileAttr file1;    
    /* length, displacement, and type arrays used to describe an MPI
     * derived type their size reflects the number of components in
     * SparseElt */ 
    int lena[6];
    MPI_Aint loca[6];
    MPI_Datatype typa[6];
    MPI_Aint baseaddress;
    MPI_Address (&file1, &baseaddress);
    lena[0] = PATH_MAX;	/* file1.pathname has length of PATH_MAX
			 * chars */
    if (MPI_Address (&file1.pathname, &loca[0]) != MPI_SUCCESS)
	return MPI_ERR_OTHER;
    loca[0] -= baseaddress;	/* byte address relative to start of
				 * structure */
    typa[0] = MPI_UNSIGNED_CHAR;
    lena[1] = 1;		/* file1.mode has length of 1 unsigned
				 * int */
    if (MPI_Address (&file1.mode, &loca[1]) != MPI_SUCCESS)
	return MPI_ERR_OTHER;
    loca[1] -= baseaddress;	/* byte address relative to start of
				 * structure */
    typa[1] = MPI_UNSIGNED;
    lena[2] = 1;		/* file1.filesize has length of 1
				 * unsigned long int */
    if (MPI_Address (&file1.filesize, &loca[2]) != MPI_SUCCESS)
	return MPI_ERR_OTHER;
    loca[2] -= baseaddress;	/* byte address relative to start of
				 * structure */
    typa[2] = MPI_UNSIGNED_LONG;
    lena[3] = 1;		/* file1.atime has length of 1
				 * unsigned long int */
    if (MPI_Address (&file1.atime, &loca[3]) != MPI_SUCCESS)
	return MPI_ERR_OTHER;
    loca[3] -= baseaddress;	/* byte address relative to start of
				 * structure */
    typa[3] = MPI_UNSIGNED_LONG;
    lena[4] = 1;		/* file1.mtime has length of 1
				 * unsigned long int */
    if (MPI_Address (&file1.mtime, &loca[4]) != MPI_SUCCESS)
	return MPI_ERR_OTHER;
    loca[4] -= baseaddress;	/* byte address relative to start of
				 * structure */
    typa[4] = MPI_UNSIGNED_LONG;
    lena[5] = 1;		/* file1.ctime has length of 1
				 * unsigned long int */
    if (MPI_Address (&file1.ctime, &loca[5]) != MPI_SUCCESS)
	return MPI_ERR_OTHER;
    loca[5] -= baseaddress;	/* byte address relative to start of
				 * structure */
    typa[5] = MPI_UNSIGNED_LONG;
    if (MPI_Type_struct (6, lena, loca, typa, &MPI_FileAttr) != MPI_SUCCESS)
	return MPI_ERR_OTHER;
    if (MPI_Type_commit (&MPI_FileAttr) != MPI_SUCCESS)
	return MPI_ERR_OTHER;
    return MPI_SUCCESS;
}