diff options
author | Vailin Choi <vchoi@hdfgroup.org> | 2008-10-03 03:54:23 (GMT) |
---|---|---|
committer | Vailin Choi <vchoi@hdfgroup.org> | 2008-10-03 03:54:23 (GMT) |
commit | 3d008d3756c094fa205770b810fa2719c3e21687 (patch) | |
tree | 46c06c3ad13199c2a415dc8d5c9fc28123aeb83a /src | |
parent | 33ae6a749eaa04ee7ab91d7b63cb430fd4e0fc8f (diff) | |
download | hdf5-3d008d3756c094fa205770b810fa2719c3e21687.zip hdf5-3d008d3756c094fa205770b810fa2719c3e21687.tar.gz hdf5-3d008d3756c094fa205770b810fa2719c3e21687.tar.bz2 |
[svn-r15762] Changes for bug #1247 so that the user can specify the driver
to use when opening the external linked target file.
1. Two new public routines are added to H5Plapl.c as well as
"del/copy/close" callbacks for the property itself.
2. Modify H5L_extern_traverse() to use the fapl set via
H5Pset_elink_fapl() and retrieve via H5Pget_elink_fapl().
3. Add 3 tests to links.c to verify H5Pset/get_elink_fapl().
Also fix the compiler warning for the "if condition" in
H5_build_extpath() of H5system.c.
Diffstat (limited to 'src')
-rw-r--r-- | src/H5Lexternal.c | 40 | ||||
-rw-r--r-- | src/H5Lprivate.h | 5 | ||||
-rw-r--r-- | src/H5Plapl.c | 228 | ||||
-rw-r--r-- | src/H5Ppublic.h | 2 | ||||
-rw-r--r-- | src/H5system.c | 5 |
5 files changed, 257 insertions, 23 deletions
diff --git a/src/H5Lexternal.c b/src/H5Lexternal.c index acd6ee9..d5a441d 100644 --- a/src/H5Lexternal.c +++ b/src/H5Lexternal.c @@ -171,6 +171,14 @@ done: * Vailin Choi, April 2, 2008 * Add handling to search for the target file * See description in RM: H5Lcreate_external + * + * Vailin Choi; Sept. 12th, 2008; bug #1247 + * Retrieve the file access property list identifer that is set + * for link access property via H5Pget_elink_fapl(). + * If the return value is H5P_DEFAULT, the parent's file access + * property is used to H5F_open() the target file; + * Otherwise, the file access property retrieved from H5Pget_elink_fapl() + * is used to H5F_open() the target file. * *------------------------------------------------------------------------- */ @@ -197,6 +205,8 @@ H5L_extern_traverse(const char UNUSED *link_name, hid_t cur_group, char *env_prefix=NULL, *tmp_env_prefix=NULL; char *out_prefix_name=NULL, *pp=NULL; + H5P_genplist_t *fa_plist; /* File access property list pointer */ + H5F_close_degree_t fc_degree = H5F_CLOSE_WEAK; /* File close degree for target file */ FUNC_ENTER_NOAPI(H5L_extern_traverse, FAIL) @@ -219,31 +229,25 @@ H5L_extern_traverse(const char UNUSED *link_name, hid_t cur_group, if(NULL == (plist = H5P_object_verify(lapl_id, H5P_LINK_ACCESS))) HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID") + /* get the fapl_id set for lapl_id if any */ + if(H5P_get(plist, H5L_ACS_ELINK_FAPL_NAME, &fapl_id) < 0) + HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get fapl for links") + /* Get the location for the group holding the external link */ if(H5G_loc(cur_group, &loc) < 0) HGOTO_ERROR(H5E_LINK, H5E_CANTGET, FAIL, "can't get object location") - /* Whatever access properties and intent the user used on the old file, - * use the same ones to open the new file. If this is a bad default, - * users can override this callback using H5Lregister. - */ + /* get the file access mode flags for the parent file */ intent = H5F_INTENT(loc.oloc->file); - if((fapl_id = H5F_get_access_plist(loc.oloc->file, FALSE)) < 0) - HGOTO_ERROR(H5E_LINK, H5E_CANTGET, FAIL, "can't get file access property list") - /* Check for non-"weak" file close degree for parent file */ - if(H5F_GET_FC_DEGREE(loc.oloc->file) != H5F_CLOSE_WEAK) { - H5P_genplist_t *fa_plist; /* Property list pointer */ - H5F_close_degree_t fc_degree = H5F_CLOSE_WEAK; /* File close degree */ + if ((fapl_id == H5P_DEFAULT) && ((fapl_id = H5F_get_access_plist(loc.oloc->file, FALSE)) < 0)) + HGOTO_ERROR(H5E_LINK, H5E_CANTGET, FAIL, "can't get parent's file access property list") - /* Get the plist structure */ - if(NULL == (fa_plist = H5P_object_verify(fapl_id, H5P_FILE_ACCESS))) - HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID") - - /* Set file close degree for new file to "weak" */ - if(H5P_set(fa_plist, H5F_ACS_CLOSE_DEGREE_NAME, &fc_degree) < 0) - HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set file close degree") - } /* end if */ + /* Set file close degree for new file to "weak" */ + if(NULL == (fa_plist = H5P_object_verify(fapl_id, H5P_FILE_ACCESS))) + HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID") + if(H5P_set(fa_plist, H5F_ACS_CLOSE_DEGREE_NAME, &fc_degree) < 0) + HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set file close degree") /* * Start searching for the target file diff --git a/src/H5Lprivate.h b/src/H5Lprivate.h index 6d3811e..cd17a87 100644 --- a/src/H5Lprivate.h +++ b/src/H5Lprivate.h @@ -39,8 +39,9 @@ #define H5L_CRT_INTERMEDIATE_GROUP_NAME "intermediate_group" /* Create intermediate groups flag */ /* ======== Link access property names ======== */ -#define H5L_ACS_NLINKS_NAME "max soft links" /* Number of soft links to traverse */ -#define H5L_ACS_ELINK_PREFIX_NAME "external link prefix" /* External link prefix */ +#define H5L_ACS_NLINKS_NAME "max soft links" /* Number of soft links to traverse */ +#define H5L_ACS_ELINK_PREFIX_NAME "external link prefix" /* External link prefix */ +#define H5L_ACS_ELINK_FAPL_NAME "external link fapl" /* file access property list for external link access */ /****************************/ diff --git a/src/H5Plapl.c b/src/H5Plapl.c index db80148..2b16be2 100644 --- a/src/H5Plapl.c +++ b/src/H5Plapl.c @@ -55,6 +55,13 @@ #define H5L_ACS_ELINK_PREFIX_COPY H5P_lacc_elink_pref_copy #define H5L_ACS_ELINK_PREFIX_CLOSE H5P_lacc_elink_pref_close +/* Definitions for setting fapl of external link access */ +#define H5L_ACS_ELINK_FAPL_SIZE sizeof(hid_t) +#define H5L_ACS_ELINK_FAPL_DEF H5P_DEFAULT +#define H5L_ACS_ELINK_FAPL_DEL H5P_lacc_elink_fapl_del +#define H5L_ACS_ELINK_FAPL_COPY H5P_lacc_elink_fapl_copy +#define H5L_ACS_ELINK_FAPL_CLOSE H5P_lacc_elink_fapl_close + /******************/ /* Local Typedefs */ /******************/ @@ -77,6 +84,10 @@ static herr_t H5P_lacc_elink_pref_del(hid_t prop_id, const char* name, size_t si static herr_t H5P_lacc_elink_pref_copy(const char* name, size_t size, void* value); static herr_t H5P_lacc_elink_pref_close(const char* name, size_t size, void* value); +static herr_t H5P_lacc_elink_fapl_del(hid_t prop_id, const char* name, size_t size, void* value); +static herr_t H5P_lacc_elink_fapl_copy(const char* name, size_t size, void* value); +static herr_t H5P_lacc_elink_fapl_close(const char* name, size_t size, void* value); + /*********************/ /* Package Variables */ @@ -118,14 +129,20 @@ const H5P_libclass_t H5P_CLS_LACC[1] = {{ * * Programmer: Quincey Koziol * October 31, 2006 + * + * Modifications: + * Vailin Choi, Sept. 12th 2008 + * Register the setting of file access property list for link access + * *------------------------------------------------------------------------- */ static herr_t H5P_lacc_reg_prop(H5P_genclass_t *pclass) { - size_t nlinks = H5L_ACS_NLINKS_DEF; /* Default number of soft links to traverse */ + size_t nlinks = H5L_ACS_NLINKS_DEF; /* Default number of soft links to traverse */ char *elink_prefix = H5L_ACS_ELINK_PREFIX_DEF; /* Default external link prefix string */ - herr_t ret_value = SUCCEED; /* Return value */ + hid_t def_fapl_id = H5L_ACS_ELINK_FAPL_DEF; /* Default fapl for external link access */ + herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_NOAPI_NOINIT(H5P_lacc_reg_prop) @@ -139,11 +156,125 @@ H5P_lacc_reg_prop(H5P_genclass_t *pclass) &elink_prefix, NULL, NULL, NULL, H5L_ACS_ELINK_PREFIX_DEL, H5L_ACS_ELINK_PREFIX_COPY, NULL, H5L_ACS_ELINK_PREFIX_CLOSE) < 0) HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class") + /* Register fapl for link access */ + if(H5P_register(pclass, H5L_ACS_ELINK_FAPL_NAME, H5L_ACS_ELINK_FAPL_SIZE, &def_fapl_id, NULL, NULL, NULL, H5L_ACS_ELINK_FAPL_DEL, H5L_ACS_ELINK_FAPL_COPY, NULL, H5L_ACS_ELINK_FAPL_CLOSE) < 0) + HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class") + done: FUNC_LEAVE_NOAPI(ret_value) } /* end H5P_lacc_reg_prop() */ +/*-------------------------------------------------------------------------- + * Function: H5P_lacc_elink_fapl_del + * + * Purpose: Close the FAPL for link access + * + * Return: Success: Non-negative + * Failure: Negative + * + * Programmer: Vailin Choi + * Tuesday, Sept 23, 2008 + * + *-------------------------------------------------------------------------- + */ +/* ARGSUSED */ +static herr_t +H5P_lacc_elink_fapl_del(hid_t UNUSED prop_id, const char UNUSED *name, size_t UNUSED size, void *value) +{ + hid_t l_fapl_id; + herr_t ret_value = SUCCEED; + + FUNC_ENTER_NOAPI(H5P_lacc_elink_fapl_del, FAIL) + + HDassert(value); + + l_fapl_id = (*(const hid_t *)value); + + if((l_fapl_id > H5P_DEFAULT) && (H5I_dec_ref(l_fapl_id, FALSE) < 0)) + HGOTO_ERROR(H5E_ATOM, H5E_CANTRELEASE, FAIL, "unable to close atom for file access property list") + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5P_lacc_elink_fapl_del() */ + + +/*-------------------------------------------------------------------------- + * Function: H5P_lacc_elink_fapl_copy + * + * Purpose: Copy the FAPL for link access + * + * Return: Success: Non-negative + * Failure: Negative + * + * Programmer: Vailin Choi + * Tuesday, Sept 23, 2008 + * + *-------------------------------------------------------------------------- + */ +/* ARGSUSED */ +static herr_t +H5P_lacc_elink_fapl_copy(const char UNUSED *name, size_t UNUSED size, void *value) +{ + hid_t l_fapl_id; + herr_t ret_value = SUCCEED; + + FUNC_ENTER_NOAPI(H5P_lacc_elink_fapl_copy, FAIL) + + HDassert(value); + + l_fapl_id = (*(const hid_t *)value); + + if(l_fapl_id > H5P_DEFAULT) { + H5P_genplist_t *l_fapl_plist; + + if(NULL == (l_fapl_plist = (H5P_genplist_t *)H5P_object_verify(l_fapl_id, H5P_FILE_ACCESS))) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list") + + if(((*(hid_t *)value) = H5P_copy_plist(l_fapl_plist, FALSE)) < 0) + HGOTO_ERROR(H5E_INTERNAL, H5E_CANTINIT, FAIL, "unable to copy file access properties") + } /* end if */ + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5P_lacc_elink_fapl_copy() */ + + +/*-------------------------------------------------------------------------- + * Function: H5P_lacc_elink_fapl_close + * + * Purpose: Close the FAPL for link access + * + * Return: Success: Non-negative + * Failure: Negative + * + * Programmer: Vailin Choi + * Tuesday, Sept 23, 2008 + * + *--------------------------------------------------------------------------- + */ +/* ARGSUSED */ +herr_t +H5P_lacc_elink_fapl_close(const char UNUSED *name, size_t UNUSED size, void *value) +{ + hid_t l_fapl_id; + herr_t ret_value = SUCCEED; + +int ref_count; + FUNC_ENTER_NOAPI(H5P_lacc_elink_fapl_close, FAIL) + + HDassert(value); + + l_fapl_id = (*(const hid_t *)value); + + if((l_fapl_id > H5P_DEFAULT) && (H5I_dec_ref(l_fapl_id, FALSE) < 0)) + HGOTO_ERROR(H5E_ATOM, H5E_CANTRELEASE, FAIL, "unable to close atom for file access property list") + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5P_lacc_elink_fapl_close() */ + + /*------------------------------------------------------------------------- * Function: H5P_lacc_elink_pref_del * @@ -412,3 +543,96 @@ done: FUNC_LEAVE_API(ret_value) } /* end H5Pget_elink_prefix() */ +/*------------------------------------------------------------------------- + * Function: H5Pset_elink_fapl + * + * Purpose: Sets the file access property list for link access + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: + * Vailin Choi; Tuesday, September 12th, 2008 + * + *------------------------------------------------------------------------- + */ +herr_t +H5Pset_elink_fapl(hid_t lapl_id, hid_t fapl_id) +{ + H5P_genplist_t *plist, *l_fapl_plist, *fapl_plist; /* Property list pointer */ + hid_t l_fapl_id, new_fapl_id; + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_API(H5Pset_elink_fapl, FAIL) + H5TRACE2("e", "i*s", lapl_id, fapl_id); + + /* Check arguments */ + if(NULL == (plist = H5P_object_verify(lapl_id, H5P_LINK_ACCESS))) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a link access property list"); + + /* Get the current file access property list for the link access */ + if(H5P_get(plist, H5L_ACS_ELINK_FAPL_NAME, &l_fapl_id) < 0) + HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get fapl") + + /* Close the current file access property list if set */ + if((l_fapl_id > H5P_DEFAULT) && (H5I_dec_ref(l_fapl_id, FALSE) < 0)) + HGOTO_ERROR(H5E_ATOM, H5E_CANTRELEASE, FAIL, "unable to close atom for file access property list") + + if (NULL==(fapl_plist = H5P_object_verify(fapl_id, H5P_FILE_ACCESS))) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file access property list"); + + /* Make a copy of the property list for FAPL_ID */ + if((new_fapl_id = H5P_copy_plist(fapl_plist, FALSE)) < 0) + HGOTO_ERROR(H5E_INTERNAL, H5E_CANTINIT, FAIL, "unable to copy file access properties") + + /* Set the file access property list for the link access */ + if(H5P_set(plist, H5L_ACS_ELINK_FAPL_NAME, &new_fapl_id) < 0) + HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set fapl for link") + +done: + FUNC_LEAVE_API(ret_value) +} /* end H5Pset_elink_fapl() */ + + +/*------------------------------------------------------------------------- + * Function: H5Pget_elink_fapl + * + * Purpose: Gets the file access property list identifier that is + * set for link access property. + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: + * Vailin Choi; Tuesday, September 12th, 2008 + * + *------------------------------------------------------------------------- + */ +hid_t +H5Pget_elink_fapl(hid_t lapl_id) +{ + H5P_genplist_t *plist, *fapl_plist; /* Property list pointer */ + hid_t l_fapl_id; + hid_t ret_value=FAIL; /* Return value */ + + FUNC_ENTER_API(H5Pget_elink_fapl, FAIL) + H5TRACE1("i", "i", lapl_id); + + /* Get the plist structure */ + if(NULL == (plist = H5P_object_verify(lapl_id, H5P_LINK_ACCESS))) + HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID") + + if(H5P_get(plist, H5L_ACS_ELINK_FAPL_NAME, &l_fapl_id) < 0) + HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get fapl for links") + + if(l_fapl_id > H5P_DEFAULT) { + if(NULL==(fapl_plist = H5P_object_verify(l_fapl_id, H5P_FILE_ACCESS))) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file access property list"); + + if((ret_value = H5P_copy_plist(fapl_plist, TRUE)) < 0) + HGOTO_ERROR(H5E_INTERNAL, H5E_CANTINIT, FAIL, "unable to copy file access properties") + } else + ret_value = l_fapl_id; + +done: + FUNC_LEAVE_API(ret_value); +} /* end H5Pget_elink_fapl() */ + diff --git a/src/H5Ppublic.h b/src/H5Ppublic.h index bab5a1a..0e4e8d3 100644 --- a/src/H5Ppublic.h +++ b/src/H5Ppublic.h @@ -374,6 +374,8 @@ H5_DLL herr_t H5Pset_nlinks(hid_t plist_id, size_t nlinks); H5_DLL herr_t H5Pget_nlinks(hid_t plist_id, size_t *nlinks); H5_DLL herr_t H5Pset_elink_prefix(hid_t plist_id, const char *prefix); H5_DLL ssize_t H5Pget_elink_prefix(hid_t plist_id, char *prefix, size_t size); +H5_DLL hid_t H5Pget_elink_fapl(hid_t lapl_id); +H5_DLL herr_t H5Pset_elink_fapl(hid_t lapl_id, hid_t fapl_id); /* Object copy property list (OCPYPL) routines */ H5_DLL herr_t H5Pset_copy_object(hid_t plist_id, unsigned crt_intmd); diff --git a/src/H5system.c b/src/H5system.c index ddb8567..8f91e2f 100644 --- a/src/H5system.c +++ b/src/H5system.c @@ -597,6 +597,9 @@ HDremove_all(const char *fname) * * Programmer: Vailin Choi * April 2, 2008 + * Modifications: 2nd Oct, 2008; Vailin Choi + * Remove compiler warning for "if condition" + * *------------------------------------------------------------------------- */ #define MAX_PATH_LEN 1024 @@ -641,7 +644,7 @@ H5_build_extpath(const char *name, char **extpath/*out*/) * Get current drive * Unix: does not apply */ - } else if (CHECK_ABS_PATH(name) && (drive=HDgetdrive())) { + } else if (CHECK_ABS_PATH(name) && ((drive=HDgetdrive()) != 0)) { sprintf(cwdpath, "%c:%c", (drive+'A'-1), name[0]); retcwd = cwdpath; HDstrcpy(new_name, &name[1]); |