summaryrefslogtreecommitdiffstats
path: root/src/H5Olink.c
diff options
context:
space:
mode:
authorQuincey Koziol <koziol@hdfgroup.org>2006-10-02 10:24:03 (GMT)
committerQuincey Koziol <koziol@hdfgroup.org>2006-10-02 10:24:03 (GMT)
commita6f6462541cc57364586f770131e2ea074d63492 (patch)
tree0debf502fb7d66f9f470edb935a62223945960d4 /src/H5Olink.c
parent9bc29ea538b9ce2013a8cde5be230c18cf052009 (diff)
downloadhdf5-a6f6462541cc57364586f770131e2ea074d63492.zip
hdf5-a6f6462541cc57364586f770131e2ea074d63492.tar.gz
hdf5-a6f6462541cc57364586f770131e2ea074d63492.tar.bz2
[svn-r12700] Alert:
File format is not stable, don't keep files produced! Description: First stage of checkins modifying the format of groups to support creation order. Implement "dense" storage for links in groups. Try to clarify some of the symbols for the H5L API. Add the H5Pset_latest_format() flag for FAPLs, to choose to use the newest file format options (including "dense" link storage in groups) Add the H5Pset_track_creation_order() flag for GCPLs, to enable creation order tracking in groups (although no index on creation order yet). Remove --enable-group-revision configure flag, as file format issues are now handled in a backwardly/forwardly compatible way. Clean up lots of compiler warnings and other minor formatting issues. Tested on: FreeBSD/32 4.11 (sleipnir) w/threadsafe Linux/32 2.4 (heping) w/FORTRAN & C++ Linux/64 2.4 (mir) w/enable-v1.6 compa Mac OSX/32 10.4.8 (amazon) AIX 5.3 (copper) w/parallel & FORTRAN
Diffstat (limited to 'src/H5Olink.c')
-rw-r--r--src/H5Olink.c340
1 files changed, 126 insertions, 214 deletions
diff --git a/src/H5Olink.c b/src/H5Olink.c
index 039184d..7d2b694 100644
--- a/src/H5Olink.c
+++ b/src/H5Olink.c
@@ -20,24 +20,24 @@
*
* Purpose: Link messages.
*
- * Modifications:
- *
*-------------------------------------------------------------------------
*/
+#define H5G_PACKAGE /*suppress error about including H5Gpkg */
#define H5O_PACKAGE /*suppress error about including H5Opkg */
#include "H5private.h" /* Generic Functions */
#include "H5Eprivate.h" /* Error handling */
#include "H5FLprivate.h" /* Free lists */
+#include "H5Gpkg.h" /* Groups */
#include "H5MMprivate.h" /* Memory management */
#include "H5Opkg.h" /* Object headers */
-#ifdef H5_GROUP_REVISION
/* PRIVATE PROTOTYPES */
static void *H5O_link_decode(H5F_t *f, hid_t dxpl_id, const uint8_t *p);
static herr_t H5O_link_encode(H5F_t *f, uint8_t *p, const void *_mesg);
+static void *H5O_link_copy(const void *_mesg, void *_dest, unsigned update_flags);
static size_t H5O_link_size(const H5F_t *f, const void *_mesg);
static herr_t H5O_link_reset(void *_mesg);
static herr_t H5O_link_free(void *_mesg);
@@ -46,8 +46,8 @@ static herr_t H5O_link_pre_copy_file(H5F_t *file_src, const H5O_msg_class_t *typ
void *mesg_src, hbool_t *deleted, const H5O_copy_t *cpy_info, void *udata);
static void *H5O_link_copy_file(H5F_t *file_src, void *native_src,
H5F_t *file_dst, hid_t dxpl_id, H5O_copy_t *cpy_info, void *udata);
-static herr_t H5O_link_post_copy_file(const H5O_loc_t *parent_src_oloc, const void *mesg_src, H5O_loc_t *dst_oloc,
- void *mesg_dst, hbool_t *modified, hid_t dxpl_id, H5O_copy_t *cpy_info);
+static herr_t H5O_link_post_copy_file(const H5O_loc_t *src_oloc, const void *mesg_src, H5O_loc_t *dst_oloc,
+ void *mesg_dst, hid_t dxpl_id, H5O_copy_t *cpy_info);
static herr_t H5O_link_debug(H5F_t *f, hid_t dxpl_id, const void *_mesg,
FILE * stream, int indent, int fwidth);
@@ -75,12 +75,12 @@ const H5O_msg_class_t H5O_MSG_LINK[1] = {{
/* Current version of link information */
#define H5O_LINK_VERSION 1
-#endif /* H5_GROUP_REVISION */
+/* Flags for link flag encoding */
+#define H5O_LINK_FLAG_HAS_CORDER 0x01
/* Declare a free list to manage the H5O_link_t struct */
H5FL_DEFINE_STATIC(H5O_link_t);
-#ifdef H5_GROUP_REVISION
/*-------------------------------------------------------------------------
* Function: H5O_link_decode
@@ -96,16 +96,14 @@ H5FL_DEFINE_STATIC(H5O_link_t);
* koziol@ncsa.uiuc.edu
* Aug 29 2005
*
- * Modifications:
- *
*-------------------------------------------------------------------------
*/
static void *
H5O_link_decode(H5F_t *f, hid_t UNUSED dxpl_id, const uint8_t *p)
{
H5O_link_t *lnk = NULL; /* Pointer to link message */
- uint16_t len; /* Length of a string in the message */
- uint32_t tmp_time; /* Temporary copy of the time */
+ size_t len; /* Length of a string in the message */
+ unsigned char link_flags; /* Flags for encoding link info */
void *ret_value; /* Return value */
FUNC_ENTER_NOAPI_NOINIT(H5O_link_decode)
@@ -122,14 +120,23 @@ H5O_link_decode(H5F_t *f, hid_t UNUSED dxpl_id, const uint8_t *p)
if(NULL == (lnk = H5FL_CALLOC(H5O_link_t)))
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+ /* Get the encoding flags for the link */
+ link_flags = *p++;
+
/* Get the type of the link */
lnk->type = *p++;
- if(lnk->type < H5L_LINK_HARD || lnk->type > H5L_LINK_MAX)
+ if(lnk->type < H5L_TYPE_HARD || lnk->type > H5L_TYPE_MAX)
HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, NULL, "bad link type")
/* Get the link creation time from the file */
- UINT32DECODE(p, tmp_time)
- lnk->ctime = (time_t)tmp_time;
+ if(link_flags & H5O_LINK_FLAG_HAS_CORDER) {
+ INT64DECODE(p, lnk->corder)
+ lnk->corder_valid = TRUE;
+ } /* end if */
+ else {
+ lnk->corder = 0;
+ lnk->corder_valid = FALSE;
+ } /* end else */
/* Get the link name's character set */
lnk->cset = (H5T_cset_t)*p++;
@@ -137,10 +144,10 @@ H5O_link_decode(H5F_t *f, hid_t UNUSED dxpl_id, const uint8_t *p)
HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, NULL, "bad cset type")
/* Get the link's name */
- UINT16DECODE(p, len)
+ UINT32DECODE(p, len)
if(len == 0)
HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, NULL, "invalid name length")
- if(NULL == (lnk->name = H5MM_malloc((size_t)len + 1)))
+ if(NULL == (lnk->name = H5MM_malloc(len + 1)))
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
HDmemcpy(lnk->name, p, len);
lnk->name[len] = '\0';
@@ -148,12 +155,12 @@ H5O_link_decode(H5F_t *f, hid_t UNUSED dxpl_id, const uint8_t *p)
/* Get the appropriate information for each type of link */
switch(lnk->type) {
- case H5L_LINK_HARD:
+ case H5L_TYPE_HARD:
/* Get the address of the object the link points to */
H5F_addr_decode(f, &p, &(lnk->u.hard.addr));
break;
- case H5L_LINK_SOFT:
+ case H5L_TYPE_SOFT:
/* Get the link value */
UINT16DECODE(p, len)
if(len == 0)
@@ -167,7 +174,7 @@ H5O_link_decode(H5F_t *f, hid_t UNUSED dxpl_id, const uint8_t *p)
/* User-defined links */
default:
- if(lnk->type < H5L_LINK_UD_MIN || lnk->type > H5L_LINK_MAX)
+ if(lnk->type < H5L_TYPE_UD_MIN || lnk->type > H5L_TYPE_MAX)
HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, NULL, "unknown link type")
/* A UD link. Get the user-supplied data */
@@ -185,16 +192,16 @@ H5O_link_decode(H5F_t *f, hid_t UNUSED dxpl_id, const uint8_t *p)
} /* end switch */
/* Set return value */
- ret_value=lnk;
+ ret_value = lnk;
done:
if(ret_value == NULL)
if(lnk != NULL) {
if(lnk->name != NULL)
H5MM_xfree(lnk->name);
- if(lnk->type == H5L_LINK_SOFT && lnk->u.soft.name != NULL)
+ if(lnk->type == H5L_TYPE_SOFT && lnk->u.soft.name != NULL)
H5MM_xfree(lnk->u.soft.name);
- if(lnk->type >= H5L_LINK_UD_MIN && lnk->u.ud.size > 0 && lnk->u.ud.udata != NULL)
+ if(lnk->type >= H5L_TYPE_UD_MIN && lnk->u.ud.size > 0 && lnk->u.ud.udata != NULL)
H5MM_xfree(lnk->u.ud.udata);
H5FL_FREE(H5O_link_t, lnk);
} /* end if */
@@ -214,16 +221,14 @@ done:
* koziol@ncsa.uiuc.edu
* Aug 29 2005
*
- * Modifications:
- *
*-------------------------------------------------------------------------
*/
static herr_t
H5O_link_encode(H5F_t *f, uint8_t *p, const void *_mesg)
{
const H5O_link_t *lnk = (const H5O_link_t *) _mesg;
- uint16_t len; /* Length of a string in the message */
- uint32_t tmp_time; /* Temporary copy of the time */
+ size_t len; /* Length of a string in the message */
+ unsigned char link_flags; /* Flags for encoding link info */
FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5O_link_encode)
@@ -235,31 +240,35 @@ H5O_link_encode(H5F_t *f, uint8_t *p, const void *_mesg)
/* encode */
*p++ = H5O_LINK_VERSION;
+ /* The encoding flags for the link */
+ link_flags = lnk->corder_valid ? H5O_LINK_FLAG_HAS_CORDER : 0;
+ *p++ = link_flags;
+
/* Store the type of the link */
*p++ = lnk->type;
- /* Store the link creation time from the file */
- tmp_time = lnk->ctime;
- UINT32ENCODE(p, tmp_time)
+ /* Store the link creation order in the file, if its valid */
+ if(lnk->corder_valid)
+ INT64ENCODE(p, lnk->corder)
/* Store the link name's character set */
*p++ = (uint8_t)lnk->cset;
/* Store the link's name */
- len = (uint16_t)HDstrlen(lnk->name);
+ len = HDstrlen(lnk->name);
HDassert(len > 0);
- UINT16ENCODE(p, len)
+ UINT32ENCODE(p, (uint32_t)len)
HDmemcpy(p, lnk->name, len);
p += len;
/* Store the appropriate information for each type of link */
switch(lnk->type) {
- case H5L_LINK_HARD:
+ case H5L_TYPE_HARD:
/* Store the address of the object the link points to */
H5F_addr_encode(f, &p, lnk->u.hard.addr);
break;
- case H5L_LINK_SOFT:
+ case H5L_TYPE_SOFT:
/* Store the link value */
len = (uint16_t)HDstrlen(lnk->u.soft.name);
HDassert(len > 0);
@@ -270,7 +279,7 @@ H5O_link_encode(H5F_t *f, uint8_t *p, const void *_mesg)
/* User-defined links */
default:
- HDassert(lnk->type >= H5L_LINK_UD_MIN && lnk->type <= H5L_LINK_MAX);
+ HDassert(lnk->type >= H5L_TYPE_UD_MIN && lnk->type <= H5L_TYPE_MAX);
/* Store the user-supplied data, however long it is */
len = (uint16_t)lnk->u.ud.size;
@@ -285,7 +294,6 @@ H5O_link_encode(H5F_t *f, uint8_t *p, const void *_mesg)
FUNC_LEAVE_NOAPI(SUCCEED)
} /* end H5O_link_encode() */
-#endif /* H5_GROUP_REVISION */
/*-------------------------------------------------------------------------
@@ -302,11 +310,9 @@ H5O_link_encode(H5F_t *f, uint8_t *p, const void *_mesg)
* koziol@ncsa.uiuc.edu
* Aug 29 2005
*
- * Modifications:
- *
*-------------------------------------------------------------------------
*/
-void *
+static void *
H5O_link_copy(const void *_mesg, void *_dest, unsigned UNUSED update_flags)
{
const H5O_link_t *lnk = (const H5O_link_t *) _mesg;
@@ -315,35 +321,40 @@ H5O_link_copy(const void *_mesg, void *_dest, unsigned UNUSED update_flags)
FUNC_ENTER_NOAPI_NOINIT(H5O_link_copy)
- /* check args */
+ /* Check args */
HDassert(lnk);
if(!dest && NULL == (dest = H5FL_MALLOC(H5O_link_t)))
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
- /* copy */
+ /* Copy static information */
*dest = *lnk;
+
+ /* Duplicate the link's name */
HDassert(lnk->name);
- dest->name = H5MM_xstrdup(lnk->name);
- if(lnk->type == H5L_LINK_SOFT)
- dest->u.soft.name = H5MM_xstrdup(lnk->u.soft.name);
- else if(lnk->type >= H5L_LINK_UD_MIN) {
- if(lnk->u.ud.size > 0)
- {
+ if(NULL == (dest->name = H5MM_xstrdup(lnk->name)))
+ HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "can't duplicate link name")
+
+ /* Copy other information needed for different link types */
+ if(lnk->type == H5L_TYPE_SOFT) {
+ if(NULL == (dest->u.soft.name = H5MM_xstrdup(lnk->u.soft.name)))
+ HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "can't duplicate soft link value")
+ } /* end if */
+ else if(lnk->type >= H5L_TYPE_UD_MIN) {
+ if(lnk->u.ud.size > 0) {
if(NULL == (dest->u.ud.udata = H5MM_malloc(lnk->u.ud.size)))
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
HDmemcpy(dest->u.ud.udata, lnk->u.ud.udata, lnk->u.ud.size);
- }
- }/* end if */
+ } /* end if */
+ } /* end if */
/* Set return value */
- ret_value=dest;
+ ret_value = dest;
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5O_link_copy() */
-#ifdef H5_GROUP_REVISION
/*-------------------------------------------------------------------------
* Function: H5O_link_size
*
@@ -371,25 +382,26 @@ H5O_link_size(const H5F_t *f, const void *_mesg)
/* Set return value */
ret_value = 1 + /* Version */
+ 1 + /* Link encoding flags */
1 + /* Link type */
- 4 + /* Creation time */
+ (lnk->corder_valid ? 8 : 0) + /* Creation order */
1 + /* Character set */
- 2 + /* Name length */
+ 4 + /* Name length */
HDstrlen(lnk->name); /* Name */
/* Add the appropriate length for each type of link */
switch(lnk->type) {
- case H5L_LINK_HARD:
+ case H5L_TYPE_HARD:
ret_value += H5F_SIZEOF_ADDR(f);
break;
- case H5L_LINK_SOFT:
+ case H5L_TYPE_SOFT:
ret_value += 2 + /* Link value length */
HDstrlen(lnk->u.soft.name); /* Link value */
break;
default: /* Default is user-defined link type */
- HDassert(lnk->type >= H5L_LINK_UD_MIN);
+ HDassert(lnk->type >= H5L_TYPE_UD_MIN);
ret_value += 2 + /* User-defined data size */
lnk->u.ud.size; /* User-defined data */
break;
@@ -421,13 +433,11 @@ H5O_link_reset(void *_mesg)
if(lnk) {
/* Free information for link (but don't free link pointer) */
- if(lnk->type == H5L_LINK_SOFT)
+ if(lnk->type == H5L_TYPE_SOFT)
lnk->u.soft.name = H5MM_xfree(lnk->u.soft.name);
- else if (lnk->type >= H5L_LINK_UD_MIN) {
+ else if (lnk->type >= H5L_TYPE_UD_MIN) {
if(lnk->u.ud.size > 0)
- {
- lnk->u.ud.udata = H5MM_xfree(lnk->u.ud.udata);
- }
+ lnk->u.ud.udata = H5MM_xfree(lnk->u.ud.udata);
} /* end if */
lnk->name = H5MM_xfree(lnk->name);
} /* end if */
@@ -489,8 +499,8 @@ H5O_link_delete(H5F_t *f, hid_t dxpl_id, const void *_mesg, hbool_t adj_link)
HDassert(f);
HDassert(lnk);
- /* Decrement reference count to the object, for hard links */
- if(lnk->type == H5L_LINK_HARD) {
+ /* Decrement reference count to the object (if requested), for hard links */
+ if(lnk->type == H5L_TYPE_HARD && adj_link) {
H5O_loc_t oloc;
/* Construct object location for object, in order to decrement it's ref count */
@@ -499,10 +509,9 @@ H5O_link_delete(H5F_t *f, hid_t dxpl_id, const void *_mesg, hbool_t adj_link)
HDassert(H5F_addr_defined(lnk->u.hard.addr));
oloc.addr = lnk->u.hard.addr;
- /* Decrement the ref count for the object, if requested */
- if(adj_link)
- if(H5O_link(&oloc, -1, dxpl_id)<0)
- HGOTO_ERROR(H5E_OHDR, H5E_CANTFREE, FAIL, "unable to decrement object link count")
+ /* Decrement the ref count for the object */
+ if(H5O_link(&oloc, -1, dxpl_id) < 0)
+ HGOTO_ERROR(H5E_OHDR, H5E_CANTFREE, FAIL, "unable to decrement object link count")
} /* end if */
done:
@@ -566,56 +575,25 @@ static void *
H5O_link_copy_file(H5F_t UNUSED *file_src, void *native_src, H5F_t UNUSED *file_dst,
hid_t UNUSED dxpl_id, H5O_copy_t UNUSED *cpy_info, void UNUSED *udata)
{
- H5O_link_t *link_src = (H5O_link_t *) native_src;
- H5O_link_t *link_dst = NULL;
- void *ret_value; /* Return value */
+ H5O_link_t *link_src = (H5O_link_t *)native_src;
+ H5O_link_t *link_dst = NULL;
+ void *ret_value; /* Return value */
FUNC_ENTER_NOAPI_NOINIT(H5O_link_copy_file)
/* check args */
HDassert(link_src);
- HDassert(file_dst);
HDassert(cpy_info);
HDassert(cpy_info->max_depth < 0 || cpy_info->curr_depth < cpy_info->max_depth);
- /* Allocate space for the destination stab */
- if(NULL == (link_dst = H5FL_MALLOC(H5O_link_t)))
- HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
-
- /* Copy top-level information */
- *link_dst = *link_src;
-
- /* Deep copy the link's name */
- if(NULL == (link_dst->name = H5MM_xstrdup(link_src->name)))
- HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
-
- /* "Deep copy" other information for each kind of link */
- switch(link_src->type) {
- case H5L_LINK_HARD:
- /* Set link's address undefined here, will be fixed up in "post copy" callback */
- link_dst->u.hard.addr = HADDR_UNDEF;
- break;
-
- case H5L_LINK_SOFT:
- /* Copy the soft link's value */
- if(NULL == (link_dst->u.soft.name = H5MM_xstrdup(link_src->u.soft.name)))
- HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
- break;
+ /* Sanity check source link type */
+ if(link_src->type > H5L_TYPE_SOFT && link_src->type < H5L_TYPE_UD_MIN)
+ HGOTO_ERROR(H5E_SYM, H5E_BADVALUE, NULL, "unrecognized built-in link type")
- default:
- if(link_src->type >= H5L_LINK_UD_MIN)
- {
- /* Copy the user-defined link's user data if it exists */
- if(link_src->u.ud.size > 0)
- {
- if(NULL == (link_dst->u.ud.udata = H5MM_malloc(link_src->u.ud.size)))
- HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
- HDmemcpy(link_dst->u.ud.udata, link_src->u.ud.udata, link_src->u.ud.size);
- }
- }
- else
- HGOTO_ERROR(H5E_SYM, H5E_BADVALUE, NULL, "unrecognized link type")
- } /* end switch */
+ /* Allocate "blank" link for destination */
+ /* (values will be filled in during 'post copy' operation) */
+ if(NULL == (link_dst = H5FL_CALLOC(H5O_link_t)))
+ HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
/* Set return value */
ret_value = link_dst;
@@ -623,7 +601,7 @@ H5O_link_copy_file(H5F_t UNUSED *file_src, void *native_src, H5F_t UNUSED *file_
done:
if(!ret_value)
if(link_dst)
- H5FL_FREE(H5O_link_t, link_dst);
+ H5O_link_free(link_dst);
FUNC_LEAVE_NOAPI(ret_value)
} /* H5O_link_copy_file() */
@@ -642,13 +620,12 @@ done:
*-------------------------------------------------------------------------
*/
static herr_t
-H5O_link_post_copy_file(const H5O_loc_t *parent_src_oloc, const void *mesg_src, H5O_loc_t *dst_oloc, void *mesg_dst,
- hbool_t *modified, hid_t dxpl_id, H5O_copy_t *cpy_info)
+H5O_link_post_copy_file(const H5O_loc_t *src_oloc, const void *mesg_src,
+ H5O_loc_t *dst_oloc, void *mesg_dst, hid_t dxpl_id, H5O_copy_t *cpy_info)
{
- H5O_link_t *link_src = (H5O_link_t *)mesg_src; /* Casting away const OK... -QAK */
- H5O_link_t tmp_link_src;
- H5O_link_t *link_dst = (H5O_link_t *)mesg_dst;
- herr_t ret_value = SUCCEED; /* Return value */
+ const H5O_link_t *link_src = (const H5O_link_t *)mesg_src;
+ H5O_link_t *link_dst = (H5O_link_t *)mesg_dst;
+ herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_NOAPI_NOINIT(H5O_link_post_copy_file)
@@ -658,82 +635,13 @@ H5O_link_post_copy_file(const H5O_loc_t *parent_src_oloc, const void *mesg_src,
HDassert(H5F_addr_defined(dst_oloc->addr));
HDassert(dst_oloc->file);
HDassert(link_dst);
- HDassert(modified && *modified == FALSE);
HDassert(cpy_info);
HDassert(cpy_info->max_depth < 0 || cpy_info->curr_depth < cpy_info->max_depth);
- /* Expand soft link */
- if(H5L_LINK_SOFT == link_src->type && cpy_info->expand_soft_link) {
- H5G_stat_t statbuf; /* Information about object pointed to by soft link */
- H5G_loc_t grp_loc; /* Group location for parent of soft link */
- H5G_name_t grp_path; /* Path for parent of soft link */
-
- /* Make a temporary copy, so that it will not change the info in the cache */
- HDmemcpy(&tmp_link_src, link_src, sizeof(H5O_link_t));
- link_src = &tmp_link_src;
-
- /* Set up group location for soft link to start in */
- H5G_name_reset(&grp_path);
- grp_loc.path = &grp_path;
- grp_loc.oloc = (H5O_loc_t *)parent_src_oloc; /* Casting away const OK... -QAK */
-
- /* Check if the object pointed by the soft link exists in the source file */
- /* (It would be more efficient to make a specialized traversal callback,
- * but this is good enough for now... -QAK)
- */
- if(H5G_get_objinfo(&grp_loc, link_src->u.soft.name, TRUE, &statbuf, H5AC_ind_dxpl_id) >= 0) {
- /* Convert temp. copy of source soft link to hard link */
-#if H5_SIZEOF_UINT64_T > H5_SIZEOF_LONG
- link_src->u.hard.addr = (((haddr_t)statbuf.objno[1]) << (8 * sizeof(long))) | (haddr_t)statbuf.objno[0];
-#else
- link_src->u.hard.addr = statbuf.objno[0];
-#endif
- link_src->type = H5L_LINK_HARD;
-
- /* Convert destination link to hard link */
- link_dst->type = H5L_LINK_HARD;
- link_dst->u.soft.name = H5MM_xfree(link_dst->u.soft.name);
- } /* end if */
- } /* if ((H5G_CACHED_SLINK == src_ent->type)... */
-
- /* Additional "deep copy" for each kind of link */
- switch(link_src->type) {
- case H5L_LINK_HARD:
- /* Copy the object pointed to */
- {
- H5O_loc_t src_oloc; /* Temporary object location for source object */
- H5O_loc_t new_oloc; /* Temporary object location for source object */
-
- /* Build temporary object location for source */
- H5O_loc_reset(&src_oloc);
- src_oloc.file = parent_src_oloc->file;
- HDassert(H5F_addr_defined(link_src->u.hard.addr));
- src_oloc.addr = link_src->u.hard.addr;
-
- /* Build temporary object location for destination */
- H5O_loc_reset(&new_oloc);
- new_oloc.file = dst_oloc->file;
-
- /* Copy the shared object from source to destination */
- if(H5O_copy_header_map(&src_oloc, &new_oloc, dxpl_id, cpy_info, TRUE) < 0)
- HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, FAIL, "unable to copy object")
-
- /* Update link information with new destination object's address */
- link_dst->u.hard.addr = new_oloc.addr;
-
- /* Indicate that the destination message was modified */
- *modified = TRUE;
- } /* end case */
- break;
-
- case H5L_LINK_SOFT:
- case H5L_LINK_EXTERNAL:
- HGOTO_DONE(SUCCEED)
- break;
-
- default:
- HGOTO_ERROR(H5E_SYM, H5E_BADVALUE, FAIL, "unrecognized link type")
- } /* end switch */
+ /* Copy the link (and the object it points to) */
+ if(H5G_link_copy_file(dst_oloc->file, dxpl_id, link_src, src_oloc, link_dst,
+ cpy_info) < 0)
+ HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, FAIL, "unable to copy link")
done:
FUNC_LEAVE_NOAPI(ret_value)
@@ -751,19 +659,16 @@ done:
* koziol@ncsa.uiuc.edu
* Aug 29 2005
*
- * Modifications:
- *
*-------------------------------------------------------------------------
*/
static herr_t
H5O_link_debug(H5F_t UNUSED *f, hid_t UNUSED dxpl_id, const void *_mesg, FILE * stream,
int indent, int fwidth)
{
- const H5O_link_t *lnk = (const H5O_link_t *) _mesg;
- struct tm *tm;
- char buf[128];
+ const H5O_link_t *lnk = (const H5O_link_t *) _mesg;
+ herr_t ret_value = SUCCEED; /* Return value */
- FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5O_link_debug)
+ FUNC_ENTER_NOAPI_NOINIT(H5O_link_debug)
/* check args */
HDassert(f);
@@ -773,15 +678,14 @@ H5O_link_debug(H5F_t UNUSED *f, hid_t UNUSED dxpl_id, const void *_mesg, FILE *
HDassert(fwidth >= 0);
HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
- "Link Type:", (lnk->type == H5L_LINK_HARD ? "Hard" :
- (lnk->type == H5L_LINK_SOFT ? "Soft" :
- (lnk->type == H5L_LINK_EXTERNAL ? "External" :
- (lnk->type >= H5L_LINK_UD_MIN ? "User-defined" : "Unknown")))));
+ "Link Type:", (lnk->type == H5L_TYPE_HARD ? "Hard" :
+ (lnk->type == H5L_TYPE_SOFT ? "Soft" :
+ (lnk->type == H5L_TYPE_EXTERNAL ? "External" :
+ (lnk->type >= H5L_TYPE_UD_MIN ? "User-defined" : "Unknown")))));
- tm = HDlocaltime(&(lnk->ctime));
- HDstrftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S %Z", tm);
- HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
- "Creation Time:", buf);
+ if(lnk->corder_valid)
+ HDfprintf(stream, "%*s%-*s %a\n", indent, "", fwidth,
+ "Creation Order:", lnk->corder);
HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
"Link Name Character Set:", (lnk->cset == H5T_CSET_ASCII ?
@@ -789,31 +693,39 @@ H5O_link_debug(H5F_t UNUSED *f, hid_t UNUSED dxpl_id, const void *_mesg, FILE *
HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
"Link Name:", lnk->name);
+ /* Display link-specific information */
switch(lnk->type) {
- case H5L_LINK_HARD:
+ case H5L_TYPE_HARD:
HDfprintf(stream, "%*s%-*s %a\n", indent, "", fwidth,
"Object address:", lnk->u.hard.addr);
break;
- case H5L_LINK_SOFT:
+ case H5L_TYPE_SOFT:
HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
"Link Value:", lnk->u.soft.name);
break;
- case H5L_LINK_EXTERNAL:
- {
- char * objname = (char *) lnk->u.ud.udata + (HDstrlen(lnk->u.ud.udata) + 1);
- HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
- "Link File Name:", lnk->u.ud.udata);
- HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
- "Link Object Name:", objname);
- }
-
default:
+ if(lnk->type >= H5L_TYPE_UD_MIN) {
+ if(lnk->type == H5L_TYPE_EXTERNAL) {
+ const char * objname = (const char *)lnk->u.ud.udata + (HDstrlen(lnk->u.ud.udata) + 1);
+
+ HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+ "External File Name:", lnk->u.ud.udata);
+ HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+ "External Object Name:", objname);
+ } /* end if */
+ else {
+ HDfprintf(stream, "%*s%-*s %Zu\n", indent, "", fwidth,
+ "User-Defined Link Size:", lnk->u.ud.size);
+ } /* end else */
+ } /* end if */
+ else
+ HGOTO_ERROR(H5E_SYM, H5E_BADVALUE, FAIL, "unrecognized link type")
break;
} /* end switch */
- FUNC_LEAVE_NOAPI(SUCCEED)
+done:
+ FUNC_LEAVE_NOAPI(ret_value)
} /* end H5O_link_debug() */
-#endif /* H5_GROUP_REVISION */