diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/H5F.c | 32 | ||||
-rw-r--r-- | src/H5Fcore.c | 297 | ||||
-rw-r--r-- | src/H5Flow.c | 58 | ||||
-rw-r--r-- | src/H5Fprivate.h | 15 | ||||
-rw-r--r-- | src/H5Fsec2.c | 16 | ||||
-rw-r--r-- | src/H5Fstdio.c | 18 | ||||
-rw-r--r-- | src/Makefile.in | 10 |
7 files changed, 414 insertions, 32 deletions
@@ -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) |