From 0461ad7f43fb39efeae0e7ee0b9cc43a6a85b646 Mon Sep 17 00:00:00 2001 From: Raymond Lu Date: Thu, 13 Apr 2000 10:16:20 -0500 Subject: [svn-r2137] Add SRB as a new VFL, add related info into these source codes. --- src/H5F.c | 11 +- src/H5FDsrb.c | 600 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/H5FDsrb.h | 37 ++++ src/H5config.h.in | 17 +- src/H5public.h | 8 +- src/Makefile.in | 14 +- src/hdf5.h | 1 + 7 files changed, 677 insertions(+), 11 deletions(-) create mode 100644 src/H5FDsrb.c create mode 100644 src/H5FDsrb.h diff --git a/src/H5F.c b/src/H5F.c index 5edca8a..b15f3fc 100644 --- a/src/H5F.c +++ b/src/H5F.c @@ -26,9 +26,10 @@ static char RcsId[] = "@(#)$Revision$"; #include /*MPI-2 I/O */ #include /*GASS I/O */ #include /*Grid Storage I/O */ +#include /*SRB I/O */ #include /*multiple files partitioned by mem usage */ -#include /*Posix unbuffered I/O */ -#include /* Standard C buffered I/O */ +#include /*Posix unbuffered I/O */ +#include /* Standard C buffered I/O */ /* Packages needed by this file... */ #include /*library functions */ @@ -170,6 +171,9 @@ H5F_init(void) * * Robb Matzke, 1999-02-19 * Added initialization for the H5I_FILE_CLOSING ID group. + * + * Raymond Lu, April 10, 2000 + * Put SRB into the 'Register predefined file drivers' list. *------------------------------------------------------------------------- */ static herr_t @@ -217,6 +221,9 @@ H5F_init_interface(void) #ifdef H5_HAVE_GRIDSTORAGE if ((status=H5FD_DPSS)<0) goto end_registration; #endif +#ifdef H5_HAVE_SRB + if ((status=H5FD_SRB)<0) goto end_registration; +#endif if ((status=H5FD_CORE)<0) goto end_registration; if ((status=H5FD_MULTI)<0) goto end_registration; #ifdef H5_HAVE_PARALLEL diff --git a/src/H5FDsrb.c b/src/H5FDsrb.c new file mode 100644 index 0000000..51a2fd3 --- /dev/null +++ b/src/H5FDsrb.c @@ -0,0 +1,600 @@ +/* + * Copyright 1999 NCSA + * All rights reserved. + * + * Programmer: Raymond Lu + * Wednesday, April 12, 2000 + * + * Purpose: SRB I/O driver. + */ +#include /*library functions */ +#include /*error handling */ +#include /*files */ +#include /* Core file driver */ +#include /* Memory allocation */ +#include /*property lists */ + + +/* The driver identification number, initialized at runtime */ +static hid_t H5FD_SRB_g = 0; + +#ifdef H5_HAVE_SRB + +#ifdef HAVE_LSEEK64 +# define file_offset_t off64_t +# define file_seek lseek64 +#else +# define file_offset_t off_t +# define file_seek lseek +#endif + +/* + * These macros check for overflow of various quantities. These macros + * assume that file_offset_t is signed and haddr_t and size_t are unsigned. + * + * ADDR_OVERFLOW: Checks whether a file address of type `haddr_t' + * is too large to be represented by the second argument + * of the file seek function. + * + * SIZE_OVERFLOW: Checks whether a buffer size of type `hsize_t' is too + * large to be represented by the `size_t' type. + * + * REGION_OVERFLOW: Checks whether an address and size pair describe data + * which can be addressed entirely by the second + * argument of the file seek function. + */ +#define MAXADDR (((haddr_t)1<<(8*sizeof(file_offset_t)-1))-1) +#define ADDR_OVERFLOW(A) (HADDR_UNDEF==(A) || \ + ((A) & ~(haddr_t)MAXADDR)) +#define SIZE_OVERFLOW(Z) ((Z) & ~(hsize_t)MAXADDR) +#define REGION_OVERFLOW(A,Z) (ADDR_OVERFLOW(A) || SIZE_OVERFLOW(Z) || \ + sizeof(file_offset_t)info; + + FUNC_LEAVE(SUCCEED); +} + +/*------------------------------------------------------------------------- + * Function: H5FD_srb_open + * + * Purpose: Opens a file with name NAME. The FLAGS are a bit field with + * purpose similar to the second argument of open(2) and which + * are defined in H5Fpublic.h. The file access property list + * FAPL_ID contains the properties driver properties and MAXADDR + * is the largest address which this file will be expected to + * access. + * + * Return: Success: A new file pointer. + * + * Failure: NULL + * + * Programmer: Raymond Lu + * April 12, 2000 + * Modifications: + *------------------------------------------------------------------------- + */ +static H5FD_t * +H5FD_srb_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxaddr) +{ + struct srbStat srb_stat; + H5FD_srb_fapl_t *fa=NULL; + H5FD_srb_fapl_t _fa; + H5FD_srb_t *file; + int srb_fid; + + FUNC_ENTER(H5FD_srb_open, FAIL); + + /* Check arguments */ + if (!name || !*name) + HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "invalid file name"); + if (0==maxaddr || HADDR_UNDEF==maxaddr) + HRETURN_ERROR(H5E_ARGS, H5E_BADRANGE, NULL, "bogus maxaddr"); + if (ADDR_OVERFLOW(maxaddr)) + HRETURN_ERROR(H5E_ARGS, H5E_BADRANGE, NULL, "bogus maxaddr"); + + if(H5P_DEFAULT==fapl_id || H5FD_SRB!=H5Pget_driver(fapl_id)) { + memset((void*)&_fa, 0, sizeof(H5FD_srb_fapl_t)); + fa = &_fa; + } + else { + fa = H5Pget_driver_info(fapl_id); + assert(fa); + } + + /* When I come down here, the possible flag values and the correct + * responses are given here :- + * + * 1. H5F_ACC_CREAT | H5F_ACC_RDWR | H5F_ACC_EXCL : The file is + * a new one. Go ahead and open it with srbObjCreate. + * 2. H5F_ACC_CREAT | H5F_ACC_RDWR | H5F_ACC_TRUNC : how do I handle this? + * srbObjCreate doesn't support truncate while srbObjOpen doesn't + * support create. Try to call both srbFileCreate and srbFileOpen! + * 3. H5F_ACC_RDWR | H5F_ACC_TRUNC : Use O_RDWR | O_TRUNC with srbObjOpen. + * 4. H5F_ACC_RDWR : Use O_RDWR with srbObjOpen. + * 5. Flag is not set : Use O_RDONLY with srbObjOpen. + * + * (In srbObjOpen, O_CREATE is not supported. For file creation, use + * srbObjCreate.) + */ + + if((flags & H5F_ACC_CREAT) && (flags & H5F_ACC_RDWR) && + (flags & H5F_ACC_EXCL)) + srb_fid = srbFileCreate(fa->srb_conn, fa->info.storSysType, + fa->info.srbHost, name, fa->info.mode, fa->info.size); + else if((flags & H5F_ACC_CREAT) && (flags & H5F_ACC_RDWR) && + (flags & H5F_ACC_TRUNC)) { + if( (srb_fid = srbFileCreate(fa->srb_conn, fa->info.storSysType, + fa->info.srbHost, name, fa->info.mode, fa->info.size)) < 0 ) { + srb_fid = srbFileOpen(fa->srb_conn, fa->info.storSysType, + fa->info.srbHost, name, O_RDWR|O_TRUNC, fa->info.mode); + } + } + else if((flags & H5F_ACC_RDWR) && (flags & H5F_ACC_TRUNC)) + srb_fid = srbFileOpen(fa->srb_conn, fa->info.storSysType, + fa->info.srbHost, name, O_RDWR|O_TRUNC, fa->info.mode); + else if(flags & H5F_ACC_RDWR) + srb_fid = srbFileOpen(fa->srb_conn, fa->info.storSysType, + fa->info.srbHost, name, O_RDWR, fa->info.mode); + else + srb_fid = srbFileOpen(fa->srb_conn, fa->info.storSysType, + fa->info.srbHost, name, O_RDONLY, fa->info.mode); + + + if(srb_fid < 0) { + fprintf(stderr, "cannot open file %s\n", name); + fprintf(stderr,"%s",clErrorMessage(fa->srb_conn)); + clFinish(fa->srb_conn); + HRETURN_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "cannot open file"); + } + + if(srbFileStat(fa->srb_conn, fa->info.storSysType, fa->info.srbHost, name, + &srb_stat)!=0) { + srbFileClose(fa->srb_conn, srb_fid); + clFinish(fa->srb_conn); + HRETURN_ERROR(H5E_IO, H5E_BADFILE, NULL, "SRB file stat failed"); + } + + if (NULL==(file=H5MM_calloc(sizeof(H5FD_srb_t)))) + HRETURN_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, + "can't allocate file struct"); + + file->fd = srb_fid; + file->eof = srb_stat.st_size; + file->pos = HADDR_UNDEF; + file->srb_conn = fa->srb_conn; + file->info = fa->info; + + FUNC_LEAVE((H5FD_t*)file); +} + +/*------------------------------------------------------------------------- + * Function: H5FD_srb_close + * + * Purpose: Closes a file and srb connection. + * + * Return: Success: Non-negative + * + * Failure: Negative + * + * Programmer: Raymond Lu + * Modification: + *------------------------------------------------------------------------- + */ +static herr_t +H5FD_srb_close(H5FD_t *_file) +{ + H5FD_srb_t *file = (H5FD_srb_t *)_file; + FUNC_ENTER(H5FD_srb_close, FAIL); + + srbFileClose(file->srb_conn, file->fd); + clFinish(file->srb_conn); + + H5MM_xfree(file); + FUNC_LEAVE(SUCCEED); +} + +/*------------------------------------------------------------------------- + * Function: H5FD_srb_get_eoa + * + * Purpose: Gets the end-of-address marker for the file. The EOA marker + * is the first address past the last byte allocated in the + * format address space. + * + * Return: Success: The end-of-address marker. + * + * Failure: HADDR_UNDEF + * + * Programmer: Raymond Lu + * April 12, 2000 + * + * Modifications: + *------------------------------------------------------------------------- + */ +static haddr_t +H5FD_srb_get_eoa(H5FD_t *_file) +{ + H5FD_srb_t *file = (H5FD_srb_t *)_file; + FUNC_ENTER(H5FD_srb_get_eoa, HADDR_UNDEF); + FUNC_LEAVE(file->eoa); +} + +/*------------------------------------------------------------------------- + * Function: H5FD_srb_set_eoa + * + * Purpose: Set the end-of-address marker for the file. This function is + * called shortly after an existing HDF5 file is opened in order + * to tell the driver where the end of the HDF5 data is located. + * + * Return: Success: 0 + * + * Failure: -1 + * + * Programmer: Robb Matzke + * Friday, August 6, 1999 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +static herr_t +H5FD_srb_set_eoa(H5FD_t *_file, haddr_t addr) +{ + H5FD_srb_t *file = (H5FD_srb_t *)_file; + FUNC_ENTER(H5FD_srb_set_eoa, FAIL); + file->eoa = addr; + FUNC_LEAVE(SUCCEED); +} + +/*------------------------------------------------------------------------- + * Function: H5FD_srb_get_eof + * + * Purpose: Gets the end-of-file marker for the file. The EOF marker + * is the real size of the file. + * + * Return: Success: The end-of-address marker. + * + * Failure: HADDR_UNDEF + * + * Programmer: Raymond Lu + * April 12, 2000 + * + * Modifications: + *------------------------------------------------------------------------- + */ +static haddr_t +H5FD_srb_get_eof(H5FD_t *_file) +{ + H5FD_srb_t *file = (H5FD_srb_t *)_file; + FUNC_ENTER(H5FD_srb_get_eof, HADDR_UNDEF); + FUNC_LEAVE(file->eof); +} + +/*------------------------------------------------------------------------- + * Function: H5FD_srb_read + * + * Purpose: Reads SIZE bytes of data from FILE beginning at address ADDR + * into buffer BUF. + * + * Return: Success: Zero. Result is stored in caller-supplied + * buffer BUF. + * + * Failure: -1, Contents of buffer BUF are undefined. + * + * Programmer: Raymond Lu + *------------------------------------------------------------------------- + */ +static herr_t +H5FD_srb_read(H5FD_t *_file, hid_t dxpl_id/*unused*/, haddr_t addr, + hsize_t size, void *buf) +{ + H5FD_srb_t *file = (H5FD_srb_t*)_file; + ssize_t nbytes; + + FUNC_ENTER(H5FD_srb_read, FAIL); + + /* Check for overflow conditions */ + if (HADDR_UNDEF==addr) + HRETURN_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "addr undefined"); + if (REGION_OVERFLOW(addr, size)) + HRETURN_ERROR(H5E_ARGS, H5E_OVERFLOW, FAIL, "addr too large"); + if (addr+size>file->eoa) + HRETURN_ERROR(H5E_ARGS, H5E_OVERFLOW, FAIL, "addr too large"); + + if( addr!=file->pos && + srbFileSeek(file->srb_conn, (int)file->fd, (int)addr, SEEK_SET)<0 ) { + file->pos = HADDR_UNDEF; + srbFileClose(file->srb_conn, file->fd); + clFinish(file->srb_conn); + HRETURN_ERROR(H5E_IO, H5E_SEEKERROR, FAIL, "srb file seek failed"); + } + + /* + * Read data, being careful of interrupted system calls, partial results, + * and the end of the file. + */ + while(size>0) { + if((nbytes=srbFileRead(file->srb_conn, (int)file->fd, (char*)buf, + (int)size))<0) { + file->pos = HADDR_UNDEF; + srbFileClose(file->srb_conn, file->fd); + clFinish(file->srb_conn); + HRETURN_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, + "srb file write failed"); + } + + if (0==nbytes) { + /*end of file but not end of format address space*/ + memset(buf, 0, size); + size = 0; + } + size -= (hsize_t)nbytes; + addr += (haddr_t)nbytes; + buf = (char*)buf + nbytes; + } + + /* Update current position */ + file->pos = addr; + + FUNC_LEAVE(SUCCEED); +} + +/*------------------------------------------------------------------------- + * Function: H5FD_srb_write + * + * Purpose: Writes SIZE bytes of data to FILE beginning at address ADDR + * from buffer BUF. + * + * Return: Success: Zero. + * + * Failure: -1 + * + * Programmer: Raymond Lu + * April 12, 2000 + * Modifications: + *------------------------------------------------------------------------- + */ +static herr_t +H5FD_srb_write(H5FD_t *_file, hid_t dxpl_id/*unused*/, haddr_t addr, + hsize_t size, const void *buf) +{ + H5FD_srb_t *file = (H5FD_srb_t*)_file; + ssize_t nbytes; + + FUNC_ENTER(H5FD_srb_write, FAIL); + + /* Check for overflow conditions */ + if (HADDR_UNDEF==addr) + HRETURN_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "addr undefined"); + if (REGION_OVERFLOW(addr, size)) + HRETURN_ERROR(H5E_ARGS, H5E_OVERFLOW, FAIL, "addr too large"); + if (addr+size>file->eoa) + HRETURN_ERROR(H5E_ARGS, H5E_OVERFLOW, FAIL, "addr too large"); + + if( addr!=file->pos && + srbFileSeek(file->srb_conn, (int)file->fd, (int)addr, SEEK_SET)<0 ) { + file->pos = HADDR_UNDEF; + srbObjClose(file->srb_conn, file->fd); + clFinish(file->srb_conn); + HRETURN_ERROR(H5E_IO, H5E_SEEKERROR, FAIL, "srb file seek failed"); + } + + while(size>0) { + if( (nbytes=srbFileWrite(file->srb_conn, (int)file->fd, (char*)buf, + (int)size)) < 0 ) { + file->pos = HADDR_UNDEF; + srbObjClose(file->srb_conn, file->fd); + clFinish(file->srb_conn); + HRETURN_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, + "srb file write failed"); + } + + size -= (hsize_t)nbytes; + addr += (haddr_t)nbytes; + buf = (const char*)buf + nbytes; + } + + /* Update current position and eof */ + file->pos = addr; + if(file->pos > file->eof) + file->eof = file->pos; + + FUNC_LEAVE(SUCCEED); +} + +/*------------------------------------------------------------------------- + * Function: H5FD_srb_flush + * + * Purpose: Makes sure that all data is on disk. + * + * Return: Success: Non-negative + * + * Failure: Negative + * + * Programmer: Raymond Lu + * April 12, 2000 + *------------------------------------------------------------------------- + */ +static herr_t +H5FD_srb_flush(H5FD_t *_file) +{ + H5FD_srb_t *file = (H5FD_srb_t*)_file; + + /*why H5FD_family_flush?*/ + FUNC_ENTER(H5FD_family_flush, FAIL); + if(srbFileSync(file->srb_conn, file->fd) != 0) { + srbFileClose(file->srb_conn, file->fd); + clFinish(file->srb_conn); + HRETURN_ERROR(H5E_IO, H5E_SEEKERROR, FAIL, "srb file sync failed"); + } + + FUNC_LEAVE(SUCCEED); +} + +#endif /* H5_HAVE_SRB */ diff --git a/src/H5FDsrb.h b/src/H5FDsrb.h new file mode 100644 index 0000000..66358b6 --- /dev/null +++ b/src/H5FDsrb.h @@ -0,0 +1,37 @@ +/* + * Copyright 1999 NCSA + * All rights reserved. + * + * Programmer: Raymond Lu + * Wednesday, April 12, 2000 + * Purpose: The public header file for the SRB driver. + */ +#ifndef H5FDsrb_H +#define H5FDsrb_H + +#include +#include + +#ifdef H5_HAVE_SRB + +#define H5FD_SRB (H5FD_srb_init()) + +typedef struct SRB_Info { /* Define the SRB info object. */ + char *srbHost; /* SRB host address of server */ + char *srbPort; /* SRB host port number */ + char *srbAuth; /* SRB Authentication-password */ + int storSysType; /* Storage Type: 0=Unix, 1=UniTree, 2=HPSS, + * 3=FTP, 4=HTTP */ + int mode; /* File mode-Unix access mode */ + int size; /* File Size-Only valid for HPSS, -1 is default */ +} SRB_Info; + +__DLL__ hid_t H5FD_srb_init(void); +__DLL__ herr_t H5Pset_fapl_srb(hid_t fapl_id, SRB_Info info); +__DLL__ herr_t H5Pget_fapl_srb(hid_t fapl_id, SRB_Info *info); + +#else +#define H5FD_SRB (-1) +#endif /* H5_HAVE_SRB */ + +#endif /* H5FDsrb_H */ diff --git a/src/H5config.h.in b/src/H5config.h.in index 66aa9ed..3de81c1 100644 --- a/src/H5config.h.in +++ b/src/H5config.h.in @@ -80,7 +80,10 @@ /* Define if we have Globus GASS support */ #undef HAVE_GASS -/* Define if we have Globus Grid Storage support */ +/* Define if we have SRB support */ +#undef HAVE_SRB + +/* Define if we have Globus Grid Storage support */ #undef HAVE_GRIDSTORAGE /* The number of bytes in a __int64. */ @@ -278,6 +281,9 @@ /* Define if you have the header file. */ #undef HAVE_SETJMP_H +/* Define if you have the header file. */ +#undef HAVE_SRBCLIENT_H + /* Define if you have the header file. */ #undef HAVE_STDDEF_H @@ -314,12 +320,18 @@ /* Define if you have the header file. */ #undef HAVE_ZLIB_H +/* Define if you have the SrbClient library (-lSrbClient). */ +#undef HAVE_LIBSRBCLIENT + /* Define if you have the crypto library (-lcrypto). */ #undef HAVE_LIBCRYPTO /* Define if you have the df library (-ldf). */ #undef HAVE_LIBDF +/* Define if you have the elf library (-lelf). */ +#undef HAVE_LIBELF + /* Define if you have the globus_common library (-lglobus_common). */ #undef HAVE_LIBGLOBUS_COMMON @@ -383,6 +395,9 @@ /* Define if you have the silo library (-lsilo). */ #undef HAVE_LIBSILO +/* Define if you have the socket library (-lsocket). */ +#undef HAVE_LIBSOCKET + /* Define if you have the ssl library (-lssl). */ #undef HAVE_LIBSSL diff --git a/src/H5public.h b/src/H5public.h index 9f25925..bbe7ef0 100644 --- a/src/H5public.h +++ b/src/H5public.h @@ -37,16 +37,20 @@ static char RcsId[] = "@(#)$Revision$"; #endif #ifdef H5_HAVE_PARALLEL # include -#ifndef MPI_FILE_NULL /*MPIO may be defined in mpi.h already*/ +#ifndef MPI_FILE_NULL /*MPIO may be defined in mpi.h already */ # include #endif #endif -#ifdef H5_HAVE_GASS +#ifdef H5_HAVE_GASS /*for Globus GASS I/O */ #include "globus_common.h" #include "globus_gass_file.h" #endif +#ifdef H5_HAVE_SRB /*for SRB I/O */ +#include +#endif + #include /* Version numbers */ diff --git a/src/Makefile.in b/src/Makefile.in index c36a0f2..c411ec3 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -21,12 +21,13 @@ CLEAN=libhdf5.settings ## Source and object files for the library (lexicographically)... LIB_SRC=H5.c H5A.c H5AC.c H5B.c H5D.c H5E.c H5F.c H5Farray.c H5Fistore.c \ H5FD.c H5FDsec2.c H5FDfamily.c H5FDmpio.c H5FDcore.c H5FDdpss.c \ - H5FDmulti.c H5FDgass.c H5FDstdio.c H5FL.c H5G.c H5Gent.c H5Gnode.c \ + H5FDmulti.c H5FDgass.c H5FDsrb.c H5FDstdio.c H5G.c H5Gent.c H5Gnode.c \ H5Gstab.c H5HG.c H5HL.c H5I.c H5MF.c H5MM.c H5O.c H5Oattr.c H5Ocomp.c \ H5Ocont.c H5Odtype.c H5Oefl.c H5Ofill.c H5Olayout.c H5Omtime.c H5Oname.c \ H5Onull.c H5Osdspace.c H5Oshared.c H5Ostab.c H5P.c H5R.c H5RA.c H5S.c \ H5Sall.c H5Shyper.c H5Smpio.c H5Snone.c H5Spoint.c H5Sselect.c H5T.c \ - H5Tbit.c H5Tconv.c H5Tinit.c H5Tvlen.c H5V.c H5Z.c H5Zdeflate.c + H5Tbit.c H5Tconv.c H5Tinit.c H5Tvlen.c H5TB.c H5V.c H5Z.c H5Zdeflate.c + LIB_OBJ=$(LIB_SRC:.c=.lo) @@ -36,10 +37,11 @@ MOSTLYCLEAN=H5detect.o H5detect.lo H5detect H5Tinit.o H5Tinit.lo H5Tinit.c ## Public header files (to be installed)... PUB_HDR=H5public.h H5Apublic.h H5ACpublic.h H5Bpublic.h H5Dpublic.h \ H5Epublic.h H5Fpublic.h H5FDpublic.h H5FDdpss.h H5FDfamily.h H5FDgass.h \ - H5FDmpio.h H5FDsec2.h H5FDcore.h H5FDmulti.h H5FDstdio.h H5Gpublic.h \ - H5HGpublic.h H5HLpublic.h H5Ipublic.h H5MMpublic.h H5Opublic.h H5Ppublic.h \ - H5Rpublic.h H5RApublic.h H5Spublic.h H5Tpublic.h H5Zpublic.h H5pubconf.h \ - hdf5.h H5api_adpt.h + H5FDmpio.h H5FDsec2.h H5FDsrb.h H5FDcore.h H5FDmulti.h H5FDstdio.h \ + H5Gpublic.h H5HGpublic.h H5HLpublic.h H5Ipublic.h H5MMpublic.h \ + H5Opublic.h H5Ppublic.h H5Rpublic.h H5RApublic.h H5Spublic.h H5Tpublic.h \ + H5Zpublic.h H5pubconf.h hdf5.h H5api_adpt.h + ## Other header files (not to be installed)... PRIVATE_HDR=H5private.h H5Aprivate.h H5Apkg.h H5ACprivate.h H5Bprivate.h \ diff --git a/src/hdf5.h b/src/hdf5.h index 4ad3b9e..217d7e0 100644 --- a/src/hdf5.h +++ b/src/hdf5.h @@ -45,6 +45,7 @@ #include /* Parallel files using MPI-2 I/O */ #include /* POSIX unbuffered file I/O */ #include /* Standard C buffered I/O */ +#include /* Remote access using SRB */ #include /* Remote files using GASS I/O */ #include /* Remote access using Storage Client API */ #include /* Usage-partitioned file family */ -- cgit v0.12