summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/H5PL.c63
-rw-r--r--src/H5PLpublic.h2
-rw-r--r--test/plugin.c53
3 files changed, 74 insertions, 44 deletions
diff --git a/src/H5PL.c b/src/H5PL.c
index 4bf19fc..0957629 100644
--- a/src/H5PL.c
+++ b/src/H5PL.c
@@ -428,19 +428,15 @@ H5PLappend(const char* plugin_path)
if(NULL == plugin_path)
HGOTO_ERROR(H5E_PLUGIN, H5E_CANTALLOC, FAIL, "no path provided")
dl_path = H5MM_strdup(plugin_path);
- if(NULL == dl_path)
+ if(NULL == (dl_path = H5MM_strdup(plugin_path)))
HGOTO_ERROR(H5E_PLUGIN, H5E_CANTALLOC, FAIL, "can't allocate memory for path")
H5PL_EXPAND_ENV_VAR
H5PL_path_table_g[H5PL_num_paths_g] = dl_path;
- dl_path = NULL;
H5PL_num_paths_g++;
done:
- if(dl_path)
- dl_path = (char *)H5MM_xfree(dl_path);
-
FUNC_LEAVE_API(ret_value)
} /* end H5PLappend() */
@@ -466,8 +462,7 @@ H5PLprepend(const char* plugin_path)
HGOTO_ERROR(H5E_PLUGIN, H5E_NOSPACE, FAIL, "too many directories in path for table")
if(NULL == plugin_path)
HGOTO_ERROR(H5E_PLUGIN, H5E_CANTALLOC, FAIL, "no path provided")
- dl_path = H5MM_strdup(plugin_path);
- if(NULL == dl_path)
+ if(NULL == (dl_path = H5MM_strdup(plugin_path)))
HGOTO_ERROR(H5E_PLUGIN, H5E_CANTALLOC, FAIL, "can't allocate memory for path")
H5PL_EXPAND_ENV_VAR
@@ -475,13 +470,9 @@ H5PLprepend(const char* plugin_path)
for (plindex = (unsigned int)H5PL_num_paths_g; plindex > 0; plindex--)
H5PL_path_table_g[plindex] = H5PL_path_table_g[plindex - 1];
H5PL_path_table_g[0] = dl_path;
- dl_path = NULL;
H5PL_num_paths_g++;
done:
- if (dl_path)
- dl_path = (char *)H5MM_xfree(dl_path);
-
FUNC_LEAVE_API(ret_value)
} /* end H5PLprepend() */
@@ -504,8 +495,7 @@ H5PLreplace(const char* plugin_path, unsigned int index)
FUNC_ENTER_API(FAIL)
if(NULL == plugin_path)
HGOTO_ERROR(H5E_PLUGIN, H5E_CANTALLOC, FAIL, "no path provided")
- dl_path = H5MM_strdup(plugin_path);
- if(NULL == dl_path)
+ if(NULL == (dl_path = H5MM_strdup(plugin_path)))
HGOTO_ERROR(H5E_PLUGIN, H5E_CANTALLOC, FAIL, "can't allocate memory for path")
H5PL_EXPAND_ENV_VAR
@@ -513,12 +503,8 @@ H5PLreplace(const char* plugin_path, unsigned int index)
if(H5PL_path_table_g[index])
H5PL_path_table_g[index] = (char *)H5MM_xfree(H5PL_path_table_g[index]);
H5PL_path_table_g[index] = dl_path;
- dl_path = NULL;
done:
- if(dl_path)
- dl_path = (char *)H5MM_xfree(dl_path);
-
FUNC_LEAVE_API(ret_value)
} /* end H5PLreplace() */
@@ -544,8 +530,7 @@ H5PLinsert(const char* plugin_path, unsigned int index)
HGOTO_ERROR(H5E_PLUGIN, H5E_NOSPACE, FAIL, "too many directories in path for table")
if(NULL == plugin_path)
HGOTO_ERROR(H5E_PLUGIN, H5E_CANTALLOC, FAIL, "no path provided")
- dl_path = H5MM_strdup(plugin_path);
- if(NULL == dl_path)
+ if(NULL == (dl_path = H5MM_strdup(plugin_path)))
HGOTO_ERROR(H5E_PLUGIN, H5E_CANTALLOC, FAIL, "can't allocate memory for path")
H5PL_EXPAND_ENV_VAR
@@ -553,13 +538,9 @@ H5PLinsert(const char* plugin_path, unsigned int index)
for(plindex = (unsigned int)H5PL_num_paths_g; plindex > index; plindex--)
H5PL_path_table_g[plindex] = H5PL_path_table_g[plindex - 1];
H5PL_path_table_g[index] = dl_path;
- dl_path = NULL;
H5PL_num_paths_g++;
done:
- if(dl_path)
- dl_path = (char *)H5MM_xfree(dl_path);
-
FUNC_LEAVE_API(ret_value)
} /* end H5PLinsert() */
@@ -602,20 +583,40 @@ done:
*
* Purpose: Query the plugin path at the specified index.
*
- * Return: Non-NULL on success/NULL on failure
+ * Return: Success: The length of path.
+ *
+ * If `pathname' is non-NULL then write up to `size' bytes into that
+ * buffer and always return the length of the pathname.
+ * Otherwise `size' is ignored and the function does not store the pathname,
+ * just returning the number of characters required to store the pathname.
+ * If an error occurs then the buffer pointed to by `pathname' (NULL or non-NULL)
+ * is unchanged and the function returns a negative value.
+ * If a zero is returned for the name's length, then there is no pathname
+ * associated with the index.
*
*-------------------------------------------------------------------------
*/
-const char*
-H5PLget(unsigned int index)
+ssize_t
+H5PLget(unsigned int index, char *pathname/*out*/, size_t size)
{
- char* ret_value = NULL; /* Return value */
+ ssize_t ret_value = FAIL; /* Return value */
+ ssize_t len = 0; /* Length of pathname */
+ char *dl_path = NULL;
- FUNC_ENTER_API(NULL)
+ FUNC_ENTER_API(FAIL)
if(H5PL_num_paths_g == 0)
- HGOTO_ERROR(H5E_PLUGIN, H5E_NOSPACE, NULL, "no directories in table")
- if(NULL == (ret_value = H5PL_path_table_g[index]))
- HGOTO_ERROR(H5E_PLUGIN, H5E_CANTALLOC, NULL, "no directory path at index")
+ HGOTO_ERROR(H5E_PLUGIN, H5E_NOSPACE, FAIL, "no directories in table")
+ if(NULL == (dl_path = H5PL_path_table_g[index]))
+ HGOTO_ERROR(H5E_PLUGIN, H5E_CANTALLOC, FAIL, "no directory path at index")
+ len = HDstrlen(dl_path);
+ if(pathname) {
+ HDstrncpy(pathname, dl_path, MIN((size_t)(len + 1), size));
+ if((size_t)len >= size)
+ pathname[size - 1] = '\0';
+ } /* end if */
+
+ /* Set return value */
+ ret_value = len;
done:
FUNC_LEAVE_API(ret_value)
diff --git a/src/H5PLpublic.h b/src/H5PLpublic.h
index ca46542..5e4dcae 100644
--- a/src/H5PLpublic.h
+++ b/src/H5PLpublic.h
@@ -49,7 +49,7 @@ H5_DLL herr_t H5PLprepend(const char* plugin_path);
H5_DLL herr_t H5PLreplace(const char* plugin_path, unsigned int index);
H5_DLL herr_t H5PLinsert(const char* plugin_path, unsigned int index);
H5_DLL herr_t H5PLremove(unsigned int index);
-H5_DLL const char* H5PLget(unsigned int index);
+H5_DLL ssize_t H5PLget(unsigned int index, char *pathname/*out*/, size_t size);
H5_DLL unsigned int H5PLsize(void);
#ifdef __cplusplus
diff --git a/test/plugin.c b/test/plugin.c
index 359bbdd..19a0ebd 100644
--- a/test/plugin.c
+++ b/test/plugin.c
@@ -744,6 +744,7 @@ test_filter_path_apis(void)
int i;
unsigned int ndx;
herr_t ret;
+ int pathlen = -1;
char pathname[256];
HDputs("Testing access to the filter path table");
@@ -801,18 +802,37 @@ test_filter_path_apis(void)
TEST_ERROR
PASSED();
- TESTING(" get (bounds)");
- HDsprintf(pathname, "%s", H5PLget(0));
+ TESTING(" get (path name)");
+ if ((pathlen = H5PLget(0, NULL, 0)) <= 0) {
+ HDfprintf(stderr," get path 0 length failed\n");
+ TEST_ERROR
+ }
+ HDfprintf(stdout," get path 0 length %d\n", pathlen);
+ if (pathlen != 8) {
+ TEST_ERROR
+ }
+ if ((pathlen = H5PLget(0, pathname, 256)) <= 0) {
+ HDfprintf(stderr," get 0 len: %d : %s\n", pathlen, pathname);
+ TEST_ERROR
+ }
+ HDfprintf(stdout," get path 0 length %d\n", pathlen);
if (strcmp(pathname, "a_path_0") != 0) {
HDfprintf(stderr," get 0: %s\n", pathname);
TEST_ERROR
}
- HDsprintf(pathname, "%s", H5PLget(1));
+ PASSED();
+
+ TESTING(" get (bounds)");
+ if ((pathlen = H5PLget(1, pathname, 256)) <= 0)
+ TEST_ERROR
+ HDfprintf(stdout," get path 1 length %d\n", pathlen);
if (strcmp(pathname, "a_path_1") != 0) {
HDfprintf(stderr," get 1: %s\n", pathname);
TEST_ERROR
}
- HDsprintf(pathname, "%s", H5PLget(15));
+ if ((pathlen = H5PLget(15, pathname, 256)) <= 0)
+ TEST_ERROR
+ HDfprintf(stdout," get path 15 length %d\n", pathlen);
if (strcmp(pathname, "a_path_15") != 0) {
HDfprintf(stderr," get 15: %s\n", pathname);
TEST_ERROR
@@ -820,16 +840,19 @@ test_filter_path_apis(void)
PASSED();
TESTING(" get (bounds exceed)");
- if (H5PLget(16) != NULL)
+ if ((pathlen = H5PLget(16, NULL, 0)) > 0)
TEST_ERROR
PASSED();
+ HDfprintf(stdout," get path 16 length %d\n", pathlen);
TESTING(" remove (verify for prepend)");
/* Remove one path*/
if (H5PLremove(8) < 0) TEST_ERROR
/* Verify that the entries were moved */
- HDsprintf(pathname, "%s", H5PLget(8));
+ if ((pathlen = H5PLget(8, pathname, 256)) <= 0)
+ TEST_ERROR
+ HDfprintf(stdout," get path 8 length %d\n", pathlen);
if (strcmp(pathname, "a_path_9") != 0) {
HDfprintf(stderr," get 8: %s\n", pathname);
TEST_ERROR
@@ -851,12 +874,14 @@ test_filter_path_apis(void)
if (H5PLsize() != 16) TEST_ERROR
/* Verify that the entries were moved */
- HDsprintf(pathname, "%s", H5PLget(8));
+ if (H5PLget(8, pathname, 256) <= 0)
+ TEST_ERROR
if (strcmp(pathname, "a_path_7") != 0) {
HDfprintf(stderr," get 8: %s\n", pathname);
TEST_ERROR
}
- HDsprintf(pathname, "%s", H5PLget(0));
+ if (H5PLget(0, pathname, 256) <= 0)
+ TEST_ERROR
if (strcmp(pathname, "a_path_17") != 0) {
HDfprintf(stderr," get 0: %s\n", pathname);
TEST_ERROR
@@ -885,12 +910,14 @@ test_filter_path_apis(void)
if (H5PLsize() != 16) TEST_ERROR
/* Verify that the entries were not moved */
- HDsprintf(pathname, "%s", H5PLget(0));
+ if (H5PLget(0, pathname, 256) <= 0)
+ TEST_ERROR
if (strcmp(pathname, "a_path_17") != 0) {
HDfprintf(stderr," get 0: %s\n", pathname);
TEST_ERROR
}
- HDsprintf(pathname, "%s", H5PLget(2));
+ if (H5PLget(2, pathname, 256) <= 0)
+ TEST_ERROR
if (strcmp(pathname, "a_path_1") != 0) {
HDfprintf(stderr," get 2: %s\n", pathname);
TEST_ERROR
@@ -902,7 +929,8 @@ test_filter_path_apis(void)
if (H5PLremove(4) < 0) TEST_ERROR
/* Verify that the entries were moved */
- HDsprintf(pathname, "%s", H5PLget(4));
+ if (H5PLget(4, pathname, 256) <= 0)
+ TEST_ERROR
if (strcmp(pathname, "a_path_4") != 0) {
HDfprintf(stderr," get 4: %s\n", pathname);
TEST_ERROR
@@ -921,7 +949,8 @@ test_filter_path_apis(void)
}
/* Verify that the entries were moved */
- HDsprintf(pathname, "%s", H5PLget(4));
+ if (H5PLget(4, pathname, 256) <= 0)
+ TEST_ERROR
if (strcmp(pathname, "a_path_2") != 0){
HDfprintf(stderr," get 4: %s\n", pathname);
TEST_ERROR