[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.
This commit is contained in:
Robb Matzke 1997-10-24 16:03:10 -05:00
parent e1e488bd47
commit 833e82fec5
11 changed files with 425 additions and 41 deletions

View File

@ -52,7 +52,7 @@ all: lib progs
# | | |
# | +-------------------------------------+ |
# | | |
# stamp2 Makefile.in |
# stamp2 Makefile.in et al |
# | | |
# | +-----------+ +------+
# +-----------------------------+ | |

View File

@ -24,7 +24,7 @@ test: $(PROGS)
@for test in $(TESTS) dummy; do \
if test $$test != dummy; then \
echo "Testing $$test $(TEST_FLAGS)"; \
$$test $(TEST_FLAGS) || exit 1; \
./$$test $(TEST_FLAGS) || exit 1; \
fi; \
done;

View File

@ -2,9 +2,9 @@
CFLAGS_WARN="-Wall -Wshadow -Wpointer-arith -Wcast-qual -Wwrite-strings -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wnested-externs"
CFLAGS_DEBUG="-g -DH5AC_DEBUG_PROTECT -DH5F_LOW_DFLT=H5F_LOW_STDIO -DH5F_OPT_SEEK -fverbose-asm"
CFLAGS_DEBUG="-g -DH5AC_DEBUG_PROTECT -DH5F_LOW_DFLT=H5F_LOW_STDIO -DH5F_OPT_SEEK=1 -fverbose-asm"
CFLAGS_PROFILE="-pg"
CFLAGS_PRODUCTION="-O3 -UH5AC_DEBUG_PROTECT -DNDEBUG -DH5F_LOW_DFLT=H5F_LOW_STDIO -DH5F_OPT_SEEK -finline-functions -funroll-loops -malign-double -fomit-frame-pointer"
CFLAGS_PRODUCTION="-O3 -UH5AC_DEBUG_PROTECT -DNDEBUG -DH5F_LOW_DFLT=H5F_LOW_STDIO -DH5F_OPT_SEEK=1 -finline-functions -funroll-loops -malign-double -fomit-frame-pointer"
if test "x$CFLAGS" = "x"; then

12
configure vendored
View File

@ -1602,7 +1602,8 @@ if { (eval echo configure:1601: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5;
cat >> confdefs.h <<\EOF
#define HAVE_ATTRIBUTE 1
EOF
echo "$ac_t""yes" 1>&6
echo "$ac_t""yes" 1>&6
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
@ -1612,21 +1613,22 @@ fi
rm -f conftest*
echo $ac_n "checking for __FUNCTION__ extension""... $ac_c" 1>&6
echo "configure:1616: checking for __FUNCTION__ extension" >&5
echo "configure:1617: checking for __FUNCTION__ extension" >&5
cat > conftest.$ac_ext <<EOF
#line 1618 "configure"
#line 1619 "configure"
#include "confdefs.h"
int main() {
int f(void){return __FUNCTION__;}
; return 0; }
EOF
if { (eval echo configure:1625: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
if { (eval echo configure:1626: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
cat >> confdefs.h <<\EOF
#define HAVE_FUNCTION 1
EOF
echo "$ac_t""yes" 1>&6
echo "$ac_t""yes" 1>&6
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5

View File

@ -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;

297
src/H5Fcore.c Normal file
View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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)