summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorRobb Matzke <matzke@llnl.gov>1997-10-24 21:03:10 (GMT)
committerRobb Matzke <matzke@llnl.gov>1997-10-24 21:03:10 (GMT)
commit833e82fec5f654c1ed93a6e4e4266f280e20311c (patch)
tree4c1f5d776652cfef707455fbee246af0a5780a80 /src
parente1e488bd4758a0e5b85a8e04052146a93c3e5751 (diff)
downloadhdf5-833e82fec5f654c1ed93a6e4e4266f280e20311c.zip
hdf5-833e82fec5f654c1ed93a6e4e4266f280e20311c.tar.gz
hdf5-833e82fec5f654c1ed93a6e4e4266f280e20311c.tar.bz2
[svn-r134] Changes since 19971023
---------------------- ./config/conclude.in Test work when `.' isn't in $PATH. ./src/H5F.c ./src/H5Fcore.c NEW ./src/H5Flow.c ./src/H5Fprivate.h ./src/H5Fsec2.c ./src/H5Fstdio.c ./src/Makefile.in ./MANIFEST Added the in-core temporary file driver as an exercise to clean up some of the H5F package. It speeds up `testhdf5 -o stab' by 25 percent! If you want to try it you'll need to recompile everything with `-DH5F_LOW_DFLT=H5F_LOW_CORE'. Don't expect testhdf5 to ever work since creating a file, closing it, and then opening it for read-only will fail.
Diffstat (limited to 'src')
-rw-r--r--src/H5F.c32
-rw-r--r--src/H5Fcore.c297
-rw-r--r--src/H5Flow.c58
-rw-r--r--src/H5Fprivate.h15
-rw-r--r--src/H5Fsec2.c16
-rw-r--r--src/H5Fstdio.c18
-rw-r--r--src/Makefile.in10
7 files changed, 414 insertions, 32 deletions
diff --git a/src/H5F.c b/src/H5F.c
index e0b0744..754be9c 100644
--- a/src/H5F.c
+++ b/src/H5F.c
@@ -339,7 +339,7 @@ hbool_t H5Fis_hdf5(const char *filename)
HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, BFAIL); /*no filename specified*/
/* Open the file */
- if (NULL==(f_handle=H5F_low_open (H5F_LOW_DFLT, filename, 0))) {
+ if (NULL==(f_handle=H5F_low_open (H5F_LOW_DFLT, filename, 0, NULL))) {
/* Low-level file open failure */
HGOTO_ERROR(H5E_FILE, H5E_BADFILE, BFAIL);
}
@@ -557,7 +557,6 @@ H5F_open (const H5F_low_class_t *type, const char *name, uintn flags,
H5F_t *f = NULL; /*return value */
H5F_t *ret_value = NULL; /*a copy of `f' */
H5F_t *old = NULL; /*a file already opened */
- struct stat sb; /*file stat info */
H5F_search_t search; /*file search key */
H5F_low_t *fd = NULL; /*low level file desc */
hbool_t empty_file = FALSE; /*is file empty? */
@@ -593,7 +592,7 @@ H5F_open (const H5F_low_class_t *type, const char *name, uintn flags,
* with hard or soft links) it doesn't work to compare files based only on
* their full path name.
*/
- file_exists = (stat (name, &sb)>=0);
+ file_exists = H5F_low_access (type, name, F_OK, &search);
/*
* Open the low-level file (if necessary) and create an H5F_t struct that
@@ -604,17 +603,16 @@ H5F_open (const H5F_low_class_t *type, const char *name, uintn flags,
/* File already exists - CREAT EXCL failed */
HRETURN_ERROR (H5E_FILE, H5E_FILEEXISTS, NULL);
}
- if (access (name, R_OK)<0) {
+ if (!H5F_low_access (type, name, R_OK, NULL)) {
/* File is not readable */
HRETURN_ERROR (H5E_FILE, H5E_READERROR, NULL);
}
- if ((flags & H5F_ACC_WRITE) && access (name, W_OK)<0) {
+ if ((flags & H5F_ACC_WRITE) &&
+ !H5F_low_access (type, name, W_OK, NULL)) {
/* File is not writable */
HRETURN_ERROR (H5E_FILE, H5E_WRITEERROR, NULL);
}
- search.dev = sb.st_dev;
- search.ino = sb.st_ino;
if ((old=H5Asearch_atom (H5_FILE, H5F_compare_files, &search))) {
if (flags & H5F_ACC_TRUNC) {
/* File already open - TRUNC failed */
@@ -622,7 +620,7 @@ H5F_open (const H5F_low_class_t *type, const char *name, uintn flags,
}
if ((flags & H5F_ACC_WRITE) &&
0==(old->shared->flags & H5F_ACC_WRITE)) {
- if (NULL==(fd=H5F_low_open (type, name, H5F_ACC_WRITE))) {
+ if (NULL==(fd=H5F_low_open (type, name, H5F_ACC_WRITE, NULL))) {
/* File cannot be reopened with write access */
HRETURN_ERROR (H5E_FILE, H5E_CANTOPENFILE, NULL);
}
@@ -639,20 +637,19 @@ H5F_open (const H5F_low_class_t *type, const char *name, uintn flags,
/* Can't truncate without write intent */
HRETURN_ERROR (H5E_FILE, H5E_BADVALUE, NULL);
}
- fd = H5F_low_open (type, name, H5F_ACC_WRITE|H5F_ACC_TRUNC);
+ fd = H5F_low_open (type, name, H5F_ACC_WRITE|H5F_ACC_TRUNC, NULL);
if (!fd) {
/* Can't truncate file */
HRETURN_ERROR (H5E_FILE, H5E_CANTCREATE, NULL);
}
f = H5F_new (NULL);
- f->shared->key.dev = sb.st_dev;
- f->shared->key.ino = sb.st_ino;
+ f->shared->key = search;
f->shared->flags = flags;
f->shared->file_handle = fd;
empty_file = TRUE;
} else {
- fd = H5F_low_open (type, name, (flags & H5F_ACC_WRITE));
+ fd = H5F_low_open (type, name, (flags & H5F_ACC_WRITE), NULL);
if (!fd) {
/* Cannot open existing file */
HRETURN_ERROR (H5E_FILE, H5E_CANTOPENFILE, NULL);
@@ -668,18 +665,15 @@ H5F_open (const H5F_low_class_t *type, const char *name, uintn flags,
/* Can't create file without write intent */
HRETURN_ERROR (H5E_FILE, H5E_BADVALUE, NULL);
}
- fd = H5F_low_open (type, name, H5F_ACC_WRITE|H5F_ACC_CREAT|H5F_ACC_EXCL);
+ fd = H5F_low_open (type, name,
+ H5F_ACC_WRITE|H5F_ACC_CREAT|H5F_ACC_EXCL,
+ &search);
if (!fd) {
/* Can't create file */
HRETURN_ERROR (H5E_FILE, H5E_CANTCREATE, NULL);
}
- if (stat (name, &sb)<0) {
- /* Can't stat file - can't get dev or inode */
- HRETURN_ERROR (H5E_FILE, H5E_CANTCREATE, NULL);
- }
f = H5F_new (NULL);
- f->shared->key.dev = sb.st_dev;
- f->shared->key.ino = sb.st_ino;
+ f->shared->key = search;
f->shared->flags = flags;
f->shared->file_handle = fd;
empty_file = TRUE;
diff --git a/src/H5Fcore.c b/src/H5Fcore.c
new file mode 100644
index 0000000..b28a12a
--- /dev/null
+++ b/src/H5Fcore.c
@@ -0,0 +1,297 @@
+/*
+ * Copyright (C) 1997 NCSA
+ * All rights reserved.
+ *
+ * Programmer: Robb Matzke <matzke@llnl.gov>
+ * Wednesday, October 22, 1997
+ *
+ * Purpose: This file implements an in-core temporary file. It's intended
+ * for storing small temporary files such as wrappers generated
+ * on the fly.
+ *
+ * Note: This is mostly an exercise to help clean up parts of the H5F
+ * package since this driver is quite different than the other
+ * low level drivers we have so far.
+ *
+ */
+#include <H5private.h>
+#include <H5Eprivate.h>
+#include <H5Fprivate.h>
+#include <H5MMprivate.h>
+
+#define H5F_CORE_INC 10240 /*amount by which to grow file */
+#define H5F_CORE_DEV 0xffff /*pseudo dev for core until we fix things*/
+
+#define PABLO_MASK H5F_core
+static hbool_t interface_initialize_g = FALSE;
+
+static hbool_t H5F_core_access (const char *name, int mode, H5F_search_t *key);
+static H5F_low_t *H5F_core_open (const char *name, uintn flags, H5F_search_t*);
+static herr_t H5F_core_close (H5F_low_t *lf);
+static herr_t H5F_core_read (H5F_low_t *lf, haddr_t addr, size_t size,
+ uint8 *buf);
+static herr_t H5F_core_write (H5F_low_t *lf, haddr_t addr, size_t size,
+ const uint8 *buf);
+static herr_t H5F_core_flush (H5F_low_t *lf);
+static size_t H5F_core_size (H5F_low_t *lf);
+
+
+const H5F_low_class_t H5F_LOW_CORE[1] = {{
+ H5F_core_access, /* access method */
+ H5F_core_open, /* open method */
+ H5F_core_close, /* close method */
+ H5F_core_read, /* read method */
+ H5F_core_write, /* write method */
+ H5F_core_flush, /* flush method */
+ H5F_core_size, /* file size method */
+}};
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5F_core_access
+ *
+ * Purpose: Determines if the specified file already exists. This driver
+ * doesn't use names, so every call to H5F_core_open() would
+ * create a new file. Therefore, this function always returns
+ * false.
+ *
+ * Return: Success: FALSE
+ *
+ * Failure: FAIL
+ *
+ * Programmer: Robb Matzke
+ * Friday, October 24, 1997
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static hbool_t
+H5F_core_access (const char *name, int mode, H5F_search_t *key)
+{
+ FUNC_ENTER (H5F_core_access, NULL, FAIL);
+ FUNC_LEAVE (FALSE);
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5F_core_open
+ *
+ * Purpose: Opens a temporary file which will exist only in memory. The
+ * NAME argument is unused. The FLAGS are a bit field with
+ * the possible values defined in H5F_low_open().
+ *
+ * Errors:
+ * IO CANTOPENFILE Must creat file with write access.
+ *
+ * Return: Success: Low-level file pointer
+ *
+ * Failure: NULL
+ *
+ * Programmer: Robb Matzke
+ * Wednesday, October 22, 1997
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5F_low_t *
+H5F_core_open (const char *name, uintn flags, H5F_search_t *key)
+{
+ H5F_low_t *lf = NULL;
+ static ino_t ino=0;
+
+ FUNC_ENTER (H5F_core_open, NULL, NULL);
+
+ if (0==(flags & H5F_ACC_WRITE) || 0==(flags & H5F_ACC_CREAT)) {
+ /* must creat file with write access */
+ HRETURN_ERROR (H5E_IO, H5E_CANTOPENFILE, NULL);
+ }
+
+ lf = H5MM_xcalloc (1, sizeof(H5F_low_t));
+ lf->u.core.mem = H5MM_xmalloc (H5F_CORE_INC);
+ lf->u.core.alloc = H5F_CORE_INC;
+ lf->u.core.size = 0;
+
+ if (key) {
+ key->dev = H5F_CORE_DEV;
+ key->ino = ino++;
+ }
+
+ FUNC_LEAVE (lf);
+}
+
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5F_core_close
+ *
+ * Purpose: Closes a file.
+ *
+ * Errors:
+ *
+ * Return: Success: SUCCEED
+ *
+ * Failure: FAIL
+ *
+ * Programmer: Robb Matzke
+ * Wednesday, October 22, 1997
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5F_core_close (H5F_low_t *lf)
+{
+ FUNC_ENTER (H5F_core_close, NULL, FAIL);
+
+ lf->u.core.mem = H5MM_xfree (lf->u.core.mem);
+ lf->u.core.size = 0;
+ lf->u.core.alloc = 0;
+
+ FUNC_LEAVE (SUCCEED);
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5F_core_read
+ *
+ * Purpose: Reads SIZE bytes beginning at address ADDR in file LF and
+ * places them in buffer BUF. Reading past the end of the
+ * file returns zeros instead of failing.
+ *
+ * Errors:
+ *
+ * Return: Success: SUCCEED
+ *
+ * Failure: FAIL
+ *
+ * Programmer: Robb Matzke
+ * Wednesday, October 22, 1997
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5F_core_read (H5F_low_t *lf, haddr_t addr, size_t size, uint8 *buf)
+{
+ size_t n;
+
+ FUNC_ENTER (H5F_core_read, NULL, FAIL);
+
+ if (addr>=lf->u.core.size) {
+ HDmemset (buf, 0, size);
+ } else {
+ n = MIN (size, lf->u.core.size - addr);
+ HDmemcpy (buf, lf->u.core.mem + addr, n);
+ HDmemset (buf+n, 0, size-n);
+ }
+
+ FUNC_LEAVE (SUCCEED);
+}
+
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5F_core_write
+ *
+ * Purpose: Writes SIZE bytes from the beginning of BUF into file LF at
+ * file address ADDR.
+ *
+ * Errors:
+ *
+ * Return: Success: SUCCEED
+ *
+ * Failure: FAIL
+ *
+ * Programmer: Robb Matzke
+ * Wednesday, October 22, 1997
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5F_core_write (H5F_low_t *lf, haddr_t addr, size_t size, const uint8 *buf)
+{
+ FUNC_ENTER (H5F_core_write, NULL, FAIL);
+
+ /* Allocate more space */
+ if (addr+size>lf->u.core.alloc) {
+ lf->u.core.alloc = lf->u.core.alloc + MAX (addr+size-lf->u.core.alloc,
+ H5F_CORE_INC);
+ lf->u.core.mem = H5MM_xrealloc (lf->u.core.mem, lf->u.core.alloc);
+ }
+
+ /* Move EOF marker */
+ if (addr+size>lf->u.core.size) {
+ lf->u.core.size = addr + size;
+ }
+
+ /* Copy data */
+ HDmemcpy (lf->u.core.mem+addr, buf, size);
+
+ FUNC_LEAVE (SUCCEED);
+}
+
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5F_core_flush
+ *
+ * Purpose: Makes sure that all data is flushed. This doesn't apply to
+ * this driver.
+ *
+ * Errors:
+ *
+ * Return: Success: SUCCEED
+ *
+ * Failure: FAIL
+ *
+ * Programmer: Robb Matzke
+ * Wednesday, October 22, 1997
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5F_core_flush (H5F_low_t *lf)
+{
+ FUNC_ENTER (H5F_core_flush, NULL, FAIL);
+
+ /* Not necessary with this driver */
+
+ FUNC_LEAVE (SUCCEED);
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5F_core_size
+ *
+ * Purpose: Returns the current size of the file in bytes.
+ *
+ * Bugs: There is no way to determine if this function failed.
+ *
+ * Errors:
+ *
+ * Return: Success: Size of file in bytes
+ *
+ * Failure: 0
+ *
+ * Programmer: Robb Matzke
+ * Wednesday, October 22, 1997
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static size_t
+H5F_core_size (H5F_low_t *lf)
+{
+ FUNC_ENTER (H5F_core_size, NULL, 0);
+
+ FUNC_LEAVE (lf->u.core.size);
+}
diff --git a/src/H5Flow.c b/src/H5Flow.c
index 2e47629..6a7de9c 100644
--- a/src/H5Flow.c
+++ b/src/H5Flow.c
@@ -15,6 +15,10 @@
#include <H5Fprivate.h>
#include <H5MMprivate.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+
#define PABLO_MASK H5F_low
static hbool_t interface_initialize_g = FALSE;
@@ -41,6 +45,10 @@ static hbool_t interface_initialize_g = FALSE;
* is opened. This allows existing files to be
* overwritten.
*
+ * The KEY argument is initialized with data which is unique to
+ * this file. For unix files, it's the device number and
+ * i-node. Other low level drivers might use data.
+ *
* Errors:
* IO CANTOPENFILE Open failed.
*
@@ -56,7 +64,8 @@ static hbool_t interface_initialize_g = FALSE;
*-------------------------------------------------------------------------
*/
H5F_low_t *
-H5F_low_open (const H5F_low_class_t *type, const char *name, uintn flags)
+H5F_low_open (const H5F_low_class_t *type, const char *name, uintn flags,
+ H5F_search_t *key)
{
H5F_low_t *lf = NULL;
@@ -65,7 +74,7 @@ H5F_low_open (const H5F_low_class_t *type, const char *name, uintn flags)
assert (type && type->open);
assert (name && *name);
- if (NULL==(lf=(type->open)(name, flags))) {
+ if (NULL==(lf=(type->open)(name, flags, key))) {
HRETURN_ERROR (H5E_IO, H5E_CANTOPENFILE, NULL);/*open failed*/
}
lf->type = type;
@@ -232,3 +241,48 @@ H5F_low_size (H5F_low_t *lf)
FUNC_LEAVE (size);
}
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5F_low_access
+ *
+ * Purpose: Sort of like access(2) except it might do special things for
+ * various types of low-level file drivers.
+ *
+ * Return: Success: TRUE or FALSE. If TRUE, then KEY is
+ * initialized with data that makes this file
+ * unique.
+ *
+ * Failure: FAIL
+ *
+ * Programmer: Robb Matzke
+ * Friday, October 24, 1997
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+hbool_t
+H5F_low_access (const H5F_low_class_t *type, const char *name, int mode,
+ H5F_search_t *key)
+{
+ hbool_t ret_value;
+ struct stat sb;
+
+ FUNC_ENTER (H5F_low_size, NULL, 0);
+ assert (type);
+
+ if (type->access) {
+ ret_value = (type->access)(name, mode, key);
+
+ } else {
+ ret_value = (0==access (name, mode));
+ if (key) {
+ stat (name, &sb);
+ key->dev = sb.st_dev;
+ key->ino = sb.st_ino;
+ }
+ }
+
+ FUNC_LEAVE (ret_value);
+}
diff --git a/src/H5Fprivate.h b/src/H5Fprivate.h
index 1a4d286..ae7e75c 100644
--- a/src/H5Fprivate.h
+++ b/src/H5Fprivate.h
@@ -236,7 +236,8 @@ typedef enum {
* Define the low-level file interface.
*/
typedef struct H5F_low_class_t {
- struct H5F_low_t *(*open)(const char*, uintn);
+ hbool_t (*access)(const char*, int, H5F_search_t*);
+ struct H5F_low_t *(*open)(const char*, uintn, H5F_search_t*);
herr_t (*close)(struct H5F_low_t*);
herr_t (*read)(struct H5F_low_t*, haddr_t, size_t, uint8*);
herr_t (*write)(struct H5F_low_t*, haddr_t, size_t, const uint8*);
@@ -261,6 +262,13 @@ typedef struct H5F_low_t {
H5F_fileop_t op; /* Previous file operation */
haddr_t cur; /* Current file position */
} stdio;
+
+ /* In-core temp file */
+ struct {
+ uint8 *mem; /* Mem image of the file */
+ size_t size; /* Current file size */
+ size_t alloc; /* Current size of MEM buffer */
+ } core;
} u;
} H5F_low_t;
@@ -271,6 +279,7 @@ typedef struct H5F_low_t {
#endif
extern const H5F_low_class_t H5F_LOW_SEC2[]; /* Posix section 2 */
extern const H5F_low_class_t H5F_LOW_STDIO[]; /* Posix stdio */
+extern const H5F_low_class_t H5F_LOW_CORE[]; /* In-core temp file */
/*
@@ -381,8 +390,10 @@ herr_t H5F_block_read (H5F_t *f, haddr_t addr, size_t size, void *buf);
herr_t H5F_block_write (H5F_t *f, haddr_t addr, size_t size, void *buf);
/* Functions that operate directly on low-level files */
+hbool_t H5F_low_access (const H5F_low_class_t *type, const char *name,
+ int mode, H5F_search_t *key);
H5F_low_t *H5F_low_open (const H5F_low_class_t *type, const char *name,
- uintn flags);
+ uintn flags, H5F_search_t *key);
H5F_low_t *H5F_low_close (H5F_low_t *lf);
size_t H5F_low_size (H5F_low_t *lf);
herr_t H5F_low_read (H5F_low_t *lf, haddr_t addr, size_t size, uint8 *buf);
diff --git a/src/H5Fsec2.c b/src/H5Fsec2.c
index f58725a..5aa3e31 100644
--- a/src/H5Fsec2.c
+++ b/src/H5Fsec2.c
@@ -19,10 +19,14 @@
#include <H5Fprivate.h>
#include <H5MMprivate.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+
#define PABLO_MASK H5F_sec2
static hbool_t interface_initialize_g = FALSE;
-static H5F_low_t *H5F_sec2_open (const char *name, uintn flags);
+static H5F_low_t *H5F_sec2_open (const char *name, uintn flags, H5F_search_t*);
static herr_t H5F_sec2_close (H5F_low_t *lf);
static herr_t H5F_sec2_read (H5F_low_t *lf, haddr_t addr, size_t size,
uint8 *buf);
@@ -33,6 +37,7 @@ static size_t H5F_sec2_size (H5F_low_t *lf);
const H5F_low_class_t H5F_LOW_SEC2[1] = {{
+ NULL, /* use default access(2) func */
H5F_sec2_open, /* open method */
H5F_sec2_close, /* close method */
H5F_sec2_read, /* read method */
@@ -64,11 +69,12 @@ const H5F_low_class_t H5F_LOW_SEC2[1] = {{
*-------------------------------------------------------------------------
*/
static H5F_low_t *
-H5F_sec2_open (const char *name, uintn flags)
+H5F_sec2_open (const char *name, uintn flags, H5F_search_t *key)
{
uintn oflags;
H5F_low_t *lf = NULL;
int fd;
+ struct stat sb;
FUNC_ENTER (H5F_sec2_open, NULL, NULL);
@@ -86,6 +92,12 @@ H5F_sec2_open (const char *name, uintn flags)
lf->u.sec2.op = H5F_OP_SEEK;
lf->u.sec2.cur = 0;
+ if (key) {
+ fstat (fd, &sb);
+ key->dev = sb.st_dev;
+ key->ino = sb.st_ino;
+ }
+
FUNC_LEAVE (lf);
}
diff --git a/src/H5Fstdio.c b/src/H5Fstdio.c
index d2b868d..cd47f3a 100644
--- a/src/H5Fstdio.c
+++ b/src/H5Fstdio.c
@@ -13,10 +13,15 @@
#include <H5Fprivate.h>
#include <H5MMprivate.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+
#define PABLO_MASK H5F_sec2
static hbool_t interface_initialize_g = FALSE;
-static H5F_low_t *H5F_stdio_open (const char *name, uintn flags);
+static H5F_low_t *H5F_stdio_open (const char *name, uintn flags,
+ H5F_search_t *key);
static herr_t H5F_stdio_close (H5F_low_t *lf);
static herr_t H5F_stdio_read (H5F_low_t *lf, haddr_t addr, size_t size,
uint8 *buf);
@@ -27,6 +32,7 @@ static size_t H5F_stdio_size (H5F_low_t *lf);
const H5F_low_class_t H5F_LOW_STDIO[1] = {{
+ NULL, /* use default access(2) func */
H5F_stdio_open, /* open method */
H5F_stdio_close, /* close method */
H5F_stdio_read, /* read method */
@@ -64,10 +70,11 @@ const H5F_low_class_t H5F_LOW_STDIO[1] = {{
*-------------------------------------------------------------------------
*/
static H5F_low_t *
-H5F_stdio_open (const char *name, uintn flags)
+H5F_stdio_open (const char *name, uintn flags, H5F_search_t *key)
{
H5F_low_t *lf=NULL;
FILE *f=NULL;
+ struct stat sb;
FUNC_ENTER (H5F_stdio_open, NULL, NULL);
@@ -98,6 +105,13 @@ H5F_stdio_open (const char *name, uintn flags)
lf->u.stdio.op = H5F_OP_SEEK;
lf->u.stdio.cur = 0;
+ /* The unique key */
+ if (key) {
+ fstat (fileno (f), &sb);
+ key->dev = sb.st_dev;
+ key->ino = sb.st_ino;
+ }
+
FUNC_LEAVE (lf);
}
diff --git a/src/Makefile.in b/src/Makefile.in
index b61b577..c6f0a27 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -14,11 +14,11 @@ LIB=libhdf5.a
PROGS=debug
# Source and object files for the library (lexicographically)...
-LIB_SRC=H5.c H5A.c H5AC.c H5B.c H5C.c H5D.c H5Dconv.c H5E.c H5F.c H5Fistore.c \
- H5Flow.c H5Fsec2.c H5Fstdio.c H5G.c H5Gent.c H5Gnode.c H5Gshad.c \
- H5Gstab.c H5H.c H5M.c H5MF.c H5MM.c H5O.c H5Ocont.c H5Oistore.c \
- H5Oname.c H5Onull.c H5Osdtyp.c H5Osdim.c H5Ostab.c H5Ostdst.c H5P.c \
- H5T.c H5V.c
+LIB_SRC=H5.c H5A.c H5AC.c H5B.c H5C.c H5D.c H5Dconv.c H5E.c H5F.c H5Fcore.c \
+ H5Fistore.c H5Flow.c H5Fsec2.c H5Fstdio.c H5G.c H5Gent.c H5Gnode.c \
+ H5Gshad.c H5Gstab.c H5H.c H5M.c H5MF.c H5MM.c H5O.c H5Ocont.c \
+ H5Oistore.c H5Oname.c H5Onull.c H5Osdtyp.c H5Osdim.c H5Ostab.c \
+ H5Ostdst.c H5P.c H5T.c H5V.c
LIB_OBJ=$(LIB_SRC:.c=.o)