HDFFV-10143 change h5PLget to use buffer like H5Iget_name

This commit is contained in:
Allen Byrne 2017-03-30 14:40:03 -05:00
parent cb222dded2
commit 09e76f7782
3 changed files with 74 additions and 44 deletions

View File

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

View File

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

View File

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