summaryrefslogtreecommitdiffstats
path: root/src/H5FDs3comms.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/H5FDs3comms.c')
-rw-r--r--src/H5FDs3comms.c755
1 files changed, 351 insertions, 404 deletions
diff --git a/src/H5FDs3comms.c b/src/H5FDs3comms.c
index 378791c..4a0c007 100644
--- a/src/H5FDs3comms.c
+++ b/src/H5FDs3comms.c
@@ -111,20 +111,26 @@ herr_t H5FD_s3comms_s3r_getsize(s3r_t *handle);
/*************/
/*----------------------------------------------------------------------------
+ *
* Function: curlwritecallback()
*
* Purpose:
+ *
* Function called by CURL to write received data.
+ *
* Writes bytes to `userdata`.
+ *
* Internally manages number of bytes processed.
*
* Return:
+ *
* - Number of bytes processed.
* - Should equal number of bytes passed to callback.
* - Failure will result in curl error: CURLE_WRITE_ERROR.
*
* Programmer: Jacob Smith
* 2017-08-17
+ *
*----------------------------------------------------------------------------
*/
size_t
@@ -147,10 +153,13 @@ curlwritecallback(char *ptr, size_t size, size_t nmemb, void *userdata)
} /* end curlwritecallback() */
/*----------------------------------------------------------------------------
+ *
* Function: H5FD_s3comms_hrb_node_set()
*
* Purpose:
+ *
* Create, insert, modify, and remove elements in a field node list.
+ *
* `name` cannot be null; will return FAIL and list will be unaltered.
*
* Entries are accessed via the lowercase representation of their name:
@@ -162,6 +171,7 @@ curlwritecallback(char *ptr, size_t size, size_t nmemb, void *userdata)
* - NULL, if list is empty
*
* Types of operations:
+ *
* - CREATE
* - If `L` is NULL and `name` and `value` are not NULL,
* a new node is created at `L`, starting a list.
@@ -182,6 +192,7 @@ curlwritecallback(char *ptr, size_t size, size_t nmemb, void *userdata)
* alphabetically by lowercase name.
*
* Return:
+ *
* - SUCCESS: `SUCCEED`
* - List was successfully modified
* - FAILURE: `FAIL`
@@ -191,6 +202,7 @@ curlwritecallback(char *ptr, size_t size, size_t nmemb, void *userdata)
*
* Programmer: Jacob Smith
* 2017-09-22
+ *
*----------------------------------------------------------------------------
*/
herr_t
@@ -210,39 +222,37 @@ H5FD_s3comms_hrb_node_set(hrb_node_t **L, const char *name, const char *value)
FUNC_ENTER_NOAPI_NOINIT
#if S3COMMS_DEBUG
- HDfprintf(stdout, "called H5FD_s3comms_hrb_node_set.\n");
+ HDfprintf(stdout, "called H5FD_s3comms_hrb_node_set.");
HDprintf("NAME: %s\n", name);
HDprintf("VALUE: %s\n", value);
HDprintf("LIST:\n->");
- for (node_ptr = (*L); node_ptr != NULL; node_ptr = node_ptr->next) {
+ for (node_ptr = (*L); node_ptr != NULL; node_ptr = node_ptr->next)
HDfprintf(stdout, "{%s}\n->", node_ptr->cat);
- }
HDprintf("(null)\n");
- fflush(stdout);
+ HDfflush(stdout);
node_ptr = NULL;
#endif
if (name == NULL)
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unable to operate on null name.\n");
-
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unable to operate on null name");
namelen = HDstrlen(name);
/***********************
* PREPARE ALL STRINGS *
**********************/
- /* copy and lowercase name */
+ /* copy and lowercase name
+ */
lowername = (char *)H5MM_malloc(sizeof(char) * (namelen + 1));
if (lowername == NULL)
- HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "cannot make space for lowercase name copy.\n");
-
+ HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "cannot make space for lowercase name copy.");
for (i = 0; i < namelen; i++)
- lowername[i] = (char)tolower((int)name[i]);
-
+ lowername[i] = (char)HDtolower((int)name[i]);
lowername[namelen] = 0;
/* If value supplied, copy name, value, and concatenated "name: value".
- * If NULL, we will be removing a node or doing nothing, so no need for copies
+ * If NULL, we will be removing a node or doing nothing, so no need for
+ * copies
*/
if (value != NULL) {
int ret = 0;
@@ -252,30 +262,27 @@ H5FD_s3comms_hrb_node_set(hrb_node_t **L, const char *name, const char *value)
namecpy = (char *)H5MM_malloc(sizeof(char) * (namelen + 1));
if (namecpy == NULL)
- HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "cannot make space for name copy.\n");
-
+ HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "cannot make space for name copy.");
HDmemcpy(namecpy, name, (namelen + 1));
valuecpy = (char *)H5MM_malloc(sizeof(char) * (valuelen + 1));
if (valuecpy == NULL)
- HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "cannot make space for value copy.\n");
-
+ HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "cannot make space for value copy.");
HDmemcpy(valuecpy, value, (valuelen + 1));
nvcat = (char *)H5MM_malloc(sizeof(char) * catwrite);
if (nvcat == NULL)
- HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "cannot make space for concatenated string.\n");
-
+ HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "cannot make space for concatenated string.");
ret = HDsnprintf(nvcat, catwrite, "%s: %s", name, value);
if (ret < 0 || (size_t)ret > catlen)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "cannot concatenate `%s: %s", name, value);
-
HDassert(catlen == HDstrlen(nvcat));
- /* create new_node, should we need it */
+ /* create new_node, should we need it
+ */
new_node = (hrb_node_t *)H5MM_malloc(sizeof(hrb_node_t));
if (new_node == NULL)
- HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "cannot make space for new set.\n");
+ HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "cannot make space for new set.");
new_node->magic = S3COMMS_HRB_NODE_MAGIC;
new_node->name = NULL;
@@ -290,13 +297,12 @@ H5FD_s3comms_hrb_node_set(hrb_node_t **L, const char *name, const char *value)
***************/
if (*L == NULL) {
- if (value == NULL) {
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "trying to remove node from empty list");
- }
+ if (value == NULL)
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "trying to remove node from empty list")
else {
#if S3COMMS_DEBUG
HDprintf("CREATE NEW\n");
- fflush(stdout);
+ HDfflush(stdout);
#endif
/*******************
* CREATE NEW LIST *
@@ -312,60 +318,64 @@ H5FD_s3comms_hrb_node_set(hrb_node_t **L, const char *name, const char *value)
}
}
- /* sanity-check pointer passed in */
+ /* sanity-check pointer passed in
+ */
HDassert((*L) != NULL);
HDassert((*L)->magic == S3COMMS_HRB_NODE_MAGIC);
node_ptr = (*L);
- /* Check whether to modify/remove first node in list */
- if (strcmp(lowername, node_ptr->lowername) == 0) {
+ /* Check whether to modify/remove first node in list
+ */
+ if (HDstrcmp(lowername, node_ptr->lowername) == 0) {
+
is_looking = FALSE;
if (value == NULL) {
#if S3COMMS_DEBUG
HDprintf("REMOVE HEAD\n");
- fflush(stdout);
+ HDfflush(stdout);
#endif
/***************
* REMOVE HEAD *
***************/
+
*L = node_ptr->next;
#if S3COMMS_DEBUG
HDprintf("FREEING CAT (node)\n");
- fflush(stdout);
+ HDfflush(stdout);
#endif
H5MM_xfree(node_ptr->cat);
#if S3COMMS_DEBUG
HDprintf("FREEING LOWERNAME (node)\n");
- fflush(stdout);
+ HDfflush(stdout);
#endif
H5MM_xfree(node_ptr->lowername);
#if S3COMMS_DEBUG
HDprintf("FREEING NAME (node)\n");
- fflush(stdout);
+ HDfflush(stdout);
#endif
H5MM_xfree(node_ptr->name);
#if S3COMMS_DEBUG
HDprintf("FREEING VALUE (node)\n");
- fflush(stdout);
+ HDfflush(stdout);
#endif
H5MM_xfree(node_ptr->value);
#if S3COMMS_DEBUG
HDprintf("MAGIC OK? %s\n", (node_ptr->magic == S3COMMS_HRB_NODE_MAGIC) ? "YES" : "NO");
- fflush(stdout);
+ HDfflush(stdout);
#endif
HDassert(node_ptr->magic == S3COMMS_HRB_NODE_MAGIC);
node_ptr->magic += 1ul;
#if S3COMMS_DEBUG
HDprintf("FREEING POINTER\n");
- fflush(stdout);
+ HDfflush(stdout);
#endif
H5MM_xfree(node_ptr);
#if S3COMMS_DEBUG
HDprintf("FREEING WORKING LOWERNAME\n");
- fflush(stdout);
+ HDfflush(stdout);
#endif
H5MM_xfree(lowername);
lowername = NULL;
@@ -373,7 +383,7 @@ H5FD_s3comms_hrb_node_set(hrb_node_t **L, const char *name, const char *value)
else {
#if S3COMMS_DEBUG
HDprintf("MODIFY HEAD\n");
- fflush(stdout);
+ HDfflush(stdout);
#endif
/***************
* MODIFY HEAD *
@@ -394,20 +404,21 @@ H5FD_s3comms_hrb_node_set(hrb_node_t **L, const char *name, const char *value)
new_node = NULL;
}
}
- else if (strcmp(lowername, node_ptr->lowername) < 0) {
+ else if (HDstrcmp(lowername, node_ptr->lowername) < 0) {
+
is_looking = FALSE;
- if (value == NULL) {
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "trying to remove a node 'before' head");
- }
+ if (value == NULL)
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "trying to remove a node 'before' head")
else {
#if S3COMMS_DEBUG
HDprintf("PREPEND NEW HEAD\n");
- fflush(stdout);
+ HDfflush(stdout);
#endif
/*******************
* INSERT NEW HEAD *
*******************/
+
new_node->name = namecpy;
new_node->value = valuecpy;
new_node->lowername = lowername;
@@ -420,23 +431,24 @@ H5FD_s3comms_hrb_node_set(hrb_node_t **L, const char *name, const char *value)
/***************
* SEARCH LIST *
***************/
+
while (is_looking) {
if (node_ptr->next == NULL) {
is_looking = FALSE;
- if (value == NULL) {
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "trying to remove absent node");
- }
+ if (value == NULL)
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "trying to remove absent node")
else {
#if S3COMMS_DEBUG
HDprintf("APPEND A NODE\n");
- fflush(stdout);
+ HDfflush(stdout);
#endif
/*******************
* APPEND NEW NODE *
*******************/
- HDassert(strcmp(lowername, node_ptr->lowername) > 0);
+
+ HDassert(HDstrcmp(lowername, node_ptr->lowername) > 0);
new_node->name = namecpy;
new_node->value = valuecpy;
new_node->lowername = lowername;
@@ -444,21 +456,22 @@ H5FD_s3comms_hrb_node_set(hrb_node_t **L, const char *name, const char *value)
node_ptr->next = new_node;
}
}
- else if (strcmp(lowername, node_ptr->next->lowername) < 0) {
+ else if (HDstrcmp(lowername, node_ptr->next->lowername) < 0) {
+
is_looking = FALSE;
- if (value == NULL) {
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "trying to remove absent node");
- }
+ if (value == NULL)
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "trying to remove absent node")
else {
#if S3COMMS_DEBUG
HDprintf("INSERT A NODE\n");
- fflush(stdout);
+ HDfflush(stdout);
#endif
/*******************
* INSERT NEW NODE *
*******************/
- HDassert(strcmp(lowername, node_ptr->lowername) > 0);
+
+ HDassert(HDstrcmp(lowername, node_ptr->lowername) > 0);
new_node->name = namecpy;
new_node->value = valuecpy;
new_node->lowername = lowername;
@@ -467,19 +480,21 @@ H5FD_s3comms_hrb_node_set(hrb_node_t **L, const char *name, const char *value)
node_ptr->next = new_node;
}
}
- else if (strcmp(lowername, node_ptr->next->lowername) == 0) {
+ else if (HDstrcmp(lowername, node_ptr->next->lowername) == 0) {
+
is_looking = FALSE;
if (value == NULL) {
/*****************
* REMOVE A NODE *
*****************/
+
hrb_node_t *tmp = node_ptr->next;
node_ptr->next = tmp->next;
#if S3COMMS_DEBUG
HDprintf("REMOVE A NODE\n");
- fflush(stdout);
+ HDfflush(stdout);
#endif
H5MM_xfree(tmp->cat);
H5MM_xfree(tmp->lowername);
@@ -496,11 +511,12 @@ H5FD_s3comms_hrb_node_set(hrb_node_t **L, const char *name, const char *value)
else {
#if S3COMMS_DEBUG
HDprintf("MODIFY A NODE\n");
- fflush(stdout);
+ HDfflush(stdout);
#endif
/*****************
* MODIFY A NODE *
*****************/
+
node_ptr = node_ptr->next;
H5MM_xfree(node_ptr->name);
H5MM_xfree(node_ptr->value);
@@ -522,6 +538,7 @@ H5FD_s3comms_hrb_node_set(hrb_node_t **L, const char *name, const char *value)
/****************
* KEEP LOOKING *
****************/
+
node_ptr = node_ptr->next;
}
} /* end while is_looking */
@@ -531,16 +548,12 @@ done:
/* clean up */
if (nvcat != NULL)
H5MM_xfree(nvcat);
-
if (namecpy != NULL)
H5MM_xfree(namecpy);
-
if (lowername != NULL)
H5MM_xfree(lowername);
-
if (valuecpy != NULL)
H5MM_xfree(valuecpy);
-
if (new_node != NULL) {
HDassert(new_node->magic == S3COMMS_HRB_NODE_MAGIC);
new_node->magic += 1ul;
@@ -552,9 +565,11 @@ done:
} /* end H5FD_s3comms_hrb_node_set() */
/*----------------------------------------------------------------------------
+ *
* Function: H5FD_s3comms_hrb_destroy()
*
* Purpose:
+ *
* Destroy and free resources _directly_ associated with an HTTP Buffer.
*
* Takes a pointer to pointer to the buffer structure.
@@ -563,6 +578,7 @@ done:
* If buffer or buffer pointer is NULL, there is no effect.
*
* Headers list at `first_header` is not touched.
+ *
* - Programmer should re-use or destroy `first_header` pointer
* (hrb_node_t *) as suits their purposes.
* - Recommend fetching prior to destroy()
@@ -572,6 +588,7 @@ done:
* - Failure to account for this will result in a memory leak.
*
* Return:
+ *
* - SUCCESS: `SUCCEED`
* - successfully released buffer resources
* - if `buf` is NULL or `*buf` is NULL, no effect
@@ -580,6 +597,7 @@ done:
*
* Programmer: Jacob Smith
* 2017-07-21
+ *
*----------------------------------------------------------------------------
*/
herr_t
@@ -596,9 +614,8 @@ H5FD_s3comms_hrb_destroy(hrb_t **_buf)
if (_buf != NULL && *_buf != NULL) {
buf = *_buf;
- if (buf->magic != S3COMMS_HRB_MAGIC) {
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "pointer's magic does not match.\n");
- }
+ if (buf->magic != S3COMMS_HRB_MAGIC)
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "pointer's magic does not match.");
H5MM_xfree(buf->verb);
H5MM_xfree(buf->version);
@@ -613,9 +630,11 @@ done:
} /* end H5FD_s3comms_hrb_destroy() */
/*----------------------------------------------------------------------------
+ *
* Function: H5FD_s3comms_hrb_init_request()
*
* Purpose:
+ *
* Create a new HTTP Request Buffer
*
* All non-null arguments should be null-terminated strings.
@@ -623,17 +642,20 @@ done:
* If `verb` is NULL, defaults to "GET".
* If `http_version` is NULL, defaults to "HTTP/1.1".
*
- * `resource` cannot be NULL; should be string beginning with slash character ('/').
+ * `resource` cannot be NULL; should be string beginning with slash
+ * character ('/').
*
* All strings are copied into the structure, making them safe from
* modification in source strings.
*
* Return:
+ *
* - SUCCESS: pointer to new `hrb_t`
* - FAILURE: `NULL`
*
* Programmer: Jacob Smith
* 2017-07-21
+ *
*----------------------------------------------------------------------------
*/
hrb_t *
@@ -655,12 +677,11 @@ H5FD_s3comms_hrb_init_request(const char *_verb, const char *_resource, const ch
#endif
if (_resource == NULL)
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "resource string cannot be null.\n");
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "resource string cannot be null.");
/* populate valid NULLs with defaults */
if (_verb == NULL)
_verb = "GET";
-
if (_http_version == NULL)
_http_version = "HTTP/1.1";
@@ -668,28 +689,24 @@ H5FD_s3comms_hrb_init_request(const char *_verb, const char *_resource, const ch
request = (hrb_t *)H5MM_malloc(sizeof(hrb_t));
if (request == NULL)
HGOTO_ERROR(H5E_ARGS, H5E_CANTALLOC, NULL, "no space for request structure");
-
request->magic = S3COMMS_HRB_MAGIC;
request->body = NULL;
request->body_len = 0;
request->first_header = NULL;
- /* malloc and copy strings for the structure
- */
+ /* malloc and copy strings for the structure */
reslen = HDstrlen(_resource);
if (_resource[0] == '/') {
res = (char *)H5MM_malloc(sizeof(char) * (reslen + 1));
if (res == NULL)
HGOTO_ERROR(H5E_ARGS, H5E_CANTALLOC, NULL, "no space for resource string");
-
HDmemcpy(res, _resource, (reslen + 1));
}
else {
res = (char *)H5MM_malloc(sizeof(char) * (reslen + 2));
if (res == NULL)
HGOTO_ERROR(H5E_ARGS, H5E_CANTALLOC, NULL, "no space for resource string");
-
*res = '/';
HDmemcpy((&res[1]), _resource, (reslen + 1));
HDassert((reslen + 1) == HDstrlen(res));
@@ -699,14 +716,12 @@ H5FD_s3comms_hrb_init_request(const char *_verb, const char *_resource, const ch
verb = (char *)H5MM_malloc(sizeof(char) * verblen);
if (verb == NULL)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "no space for verb string");
-
HDstrncpy(verb, _verb, verblen);
vrsnlen = HDstrlen(_http_version) + 1;
vrsn = (char *)H5MM_malloc(sizeof(char) * vrsnlen);
if (vrsn == NULL)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "no space for http-version string");
-
HDstrncpy(vrsn, _http_version, vrsnlen);
/* place new copies into structure */
@@ -737,19 +752,24 @@ done:
****************************************************************************/
/*----------------------------------------------------------------------------
+ *
* Function: H5FD_s3comms_s3r_close()
*
* Purpose:
+ *
* Close communications through given S3 Request Handle (`s3r_t`)
* and clean up associated resources.
*
* Return:
+ *
* - SUCCESS: `SUCCEED`
* - FAILURE: `FAIL`
* - fails if handle is null or has invalid magic number
*
+ *
* Programmer: Jacob Smith
* 2017-08-31
+ *
*----------------------------------------------------------------------------
*/
herr_t
@@ -764,10 +784,9 @@ H5FD_s3comms_s3r_close(s3r_t *handle)
#endif
if (handle == NULL)
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "handle cannot be null.\n");
-
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "handle cannot be null.");
if (handle->magic != S3COMMS_S3R_MAGIC)
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "handle has invalid magic.\n");
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "handle has invalid magic.");
curl_easy_cleanup(handle->curlhandle);
@@ -788,18 +807,23 @@ done:
} /* H5FD_s3comms_s3r_close */
/*----------------------------------------------------------------------------
+ *
* Function: H5FD_s3comms_s3r_get_filesize()
*
* Purpose:
+ *
* Retrieve the filesize of an open request handle.
*
* Wrapper "getter" to hide implementation details.
*
+ *
* Return:
+ *
* - SUCCESS: size of file, in bytes, if handle is valid.
* - FAILURE: 0, if handle is NULL or undefined.
*
* Programmer: Jacob Smith 2017-01-14
+ *
*----------------------------------------------------------------------------
*/
size_t
@@ -816,9 +840,11 @@ H5FD_s3comms_s3r_get_filesize(s3r_t *handle)
} /* H5FD_s3comms_s3r_get_filesize */
/*----------------------------------------------------------------------------
+ *
* Function: H5FD_s3comms_s3r_getsize()
*
* Purpose:
+ *
* Get the number of bytes of handle's target resource.
*
* Sets handle and curlhandle with to enact an HTTP HEAD request on file,
@@ -836,11 +862,13 @@ H5FD_s3comms_s3r_get_filesize(s3r_t *handle)
* not to be trusted.
*
* Return:
+ *
* - SUCCESS: `SUCCEED`
* - FAILURE: `FAIL`
*
* Programmer: Jacob Smith
* 2017-08-23
+ *
*----------------------------------------------------------------------------
*/
herr_t
@@ -850,9 +878,9 @@ H5FD_s3comms_s3r_getsize(s3r_t *handle)
CURL * curlh = NULL;
char * end = NULL;
char * headerresponse = NULL;
+ struct s3r_datastruct sds = {S3COMMS_CALLBACK_DATASTRUCT_MAGIC, NULL, 0};
char * start = NULL;
herr_t ret_value = SUCCEED;
- struct s3r_datastruct sds = {S3COMMS_CALLBACK_DATASTRUCT_MAGIC, NULL, 0};
FUNC_ENTER_NOAPI_NOINIT
@@ -861,41 +889,32 @@ H5FD_s3comms_s3r_getsize(s3r_t *handle)
#endif
if (handle == NULL)
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "handle cannot be null.\n");
-
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "handle cannot be null.");
if (handle->magic != S3COMMS_S3R_MAGIC)
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "handle has invalid magic.\n");
-
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "handle has invalid magic.");
if (handle->curlhandle == NULL)
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "handle has bad (null) curlhandle.\n")
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "handle has bad (null) curlhandle.")
/********************
* PREPARE FOR HEAD *
********************/
curlh = handle->curlhandle;
-
if (CURLE_OK != curl_easy_setopt(curlh, CURLOPT_NOBODY, 1L))
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL,
- "error while setting CURL option (CURLOPT_NOBODY). "
- "(placeholder flags)");
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "error while setting CURL option (CURLOPT_NOBODY).");
if (CURLE_OK != curl_easy_setopt(curlh, CURLOPT_HEADERDATA, &sds))
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL,
- "error while setting CURL option (CURLOPT_HEADERDATA). "
- "(placeholder flags)");
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "error while setting CURL option (CURLOPT_HEADERDATA).");
HDassert(handle->httpverb == NULL);
handle->httpverb = (char *)H5MM_malloc(sizeof(char) * 16);
if (handle->httpverb == NULL)
HGOTO_ERROR(H5E_ARGS, H5E_CANTALLOC, FAIL, "unable to allocate space for S3 request HTTP verb");
-
HDmemcpy(handle->httpverb, "HEAD", 5);
headerresponse = (char *)H5MM_malloc(sizeof(char) * CURL_MAX_HTTP_HEADER);
if (headerresponse == NULL)
HGOTO_ERROR(H5E_ARGS, H5E_CANTALLOC, FAIL, "unable to allocate space for curl header response");
-
sds.data = headerresponse;
/*******************
@@ -907,44 +926,40 @@ H5FD_s3comms_s3r_getsize(s3r_t *handle)
* only http metadata will be sent by server and recorded by s3comms
*/
if (FAIL == H5FD_s3comms_s3r_read(handle, 0, 0, NULL))
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "problem in reading during getsize.\n");
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "problem in reading during getsize.");
- if (sds.size > CURL_MAX_HTTP_HEADER) {
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "HTTP metadata buffer overrun\n");
- }
- else if (sds.size == 0) {
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "No HTTP metadata\n");
+ if (sds.size > CURL_MAX_HTTP_HEADER)
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "HTTP metadata buffer overrun")
+ else if (sds.size == 0)
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "No HTTP metadata")
#if S3COMMS_DEBUG
- }
- else {
+ else
HDfprintf(stderr, "GETSIZE: OK\n");
#endif
- }
/******************
* PARSE RESPONSE *
******************/
- start = strstr(headerresponse, "\r\nContent-Length: ");
+ start = HDstrstr(headerresponse, "\r\nContent-Length: ");
if (start == NULL)
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "could not find \"Content-Length\" in response.\n");
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "could not find \"Content-Length\" in response.");
- /* move "start" to beginning of value in line; find end of line
- */
+ /* move "start" to beginning of value in line; find end of line */
start = start + HDstrlen("\r\nContent-Length: ");
- end = strstr(start, "\r\n");
+ end = HDstrstr(start, "\r\n");
if (end == NULL)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "could not find end of content length line");
- /* place null terminator at end of numbers */
+ /* place null terminator at end of numbers
+ */
*end = '\0';
- content_length = strtoumax((const char *)start, NULL, 0);
-
+ content_length = HDstrtoumax((const char *)start, NULL, 0);
if (UINTMAX_MAX > SIZE_MAX && content_length > SIZE_MAX)
- HGOTO_ERROR(H5E_ARGS, H5E_OVERFLOW, FAIL, "content_length overflows size_t\n");
+ HGOTO_ERROR(H5E_ARGS, H5E_OVERFLOW, FAIL, "content_length overflows size_t");
- if (content_length == 0 || errno == ERANGE) /* errno set by strtoumax*/
+ if (content_length == 0 || errno == ERANGE) /* errno set by HDstrtoumax*/
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL,
"could not convert found \"Content-Length\" response (\"%s\")",
start); /* range is null-terminated, remember */
@@ -955,16 +970,11 @@ H5FD_s3comms_s3r_getsize(s3r_t *handle)
* UNDO HEAD SETTINGS *
**********************/
- if (CURLE_OK != curl_easy_setopt(curlh, CURLOPT_NOBODY, NULL)) {
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL,
- "error while setting CURL option (CURLOPT_NOBODY). "
- "(placeholder flags)");
- }
+ if (CURLE_OK != curl_easy_setopt(curlh, CURLOPT_NOBODY, NULL))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "error while setting CURL option (CURLOPT_NOBODY).");
if (CURLE_OK != curl_easy_setopt(curlh, CURLOPT_HEADERDATA, NULL))
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL,
- "error while setting CURL option (CURLOPT_HEADERDATA). "
- "(placeholder flags)");
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "error while setting CURL option (CURLOPT_HEADERDATA).");
done:
H5MM_xfree(headerresponse);
@@ -974,10 +984,13 @@ done:
} /* H5FD_s3comms_s3r_getsize */
/*----------------------------------------------------------------------------
+ *
* Function: H5FD_s3comms_s3r_open()
*
* Purpose:
+ *
* Logically 'open' a file hosted on S3.
+ *
* - create new Request Handle
* - copy supplied url
* - copy authentication info if supplied
@@ -994,6 +1007,7 @@ done:
* Uses `H5FD_s3comms_parse_url()` to validate and parse url input.
*
* Return:
+ *
* - SUCCESS: Pointer to new request handle.
* - FAILURE: NULL
* - occurs if:
@@ -1005,6 +1019,7 @@ done:
*
* Programmer: Jacob Smith
* 2017-09-01
+ *
*----------------------------------------------------------------------------
*/
s3r_t *
@@ -1023,10 +1038,10 @@ H5FD_s3comms_s3r_open(const char *url, const char *region, const char *id, const
#endif
if (url == NULL || url[0] == '\0')
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "url cannot be null.\n");
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "url cannot be null.");
- /* probably a malformed url, but could be internal error */
if (FAIL == H5FD_s3comms_parse_url(url, &purl))
+ /* probably a malformed url, but could be internal error */
HGOTO_ERROR(H5E_ARGS, H5E_CANTCREATE, NULL, "unable to create parsed url structure");
HDassert(purl != NULL); /* if above passes, this must be true */
@@ -1034,7 +1049,7 @@ H5FD_s3comms_s3r_open(const char *url, const char *region, const char *id, const
handle = (s3r_t *)H5MM_malloc(sizeof(s3r_t));
if (handle == NULL)
- HGOTO_ERROR(H5E_ARGS, H5E_CANTALLOC, NULL, "could not malloc space for handle.\n");
+ HGOTO_ERROR(H5E_ARGS, H5E_CANTALLOC, NULL, "could not malloc space for handle.");
handle->magic = S3COMMS_S3R_MAGIC;
handle->purl = purl;
@@ -1049,36 +1064,32 @@ H5FD_s3comms_s3r_open(const char *url, const char *region, const char *id, const
*************************************/
if ((region != NULL && *region != '\0') || (id != NULL && *id != '\0') || (signing_key != NULL)) {
+
/* if one exists, all three must exist */
if (region == NULL || region[0] == '\0')
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "region cannot be null.\n");
-
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "region cannot be null.");
if (id == NULL || id[0] == '\0')
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "secret id cannot be null.\n");
-
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "secret id cannot be null.");
if (signing_key == NULL)
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "signing key cannot be null.\n");
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "signing key cannot be null.");
/* copy strings */
tmplen = HDstrlen(region) + 1;
handle->region = (char *)H5MM_malloc(sizeof(char) * tmplen);
if (handle->region == NULL)
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "could not malloc space for handle region copy.\n");
-
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "could not malloc space for handle region copy.");
HDmemcpy(handle->region, region, tmplen);
tmplen = HDstrlen(id) + 1;
handle->secret_id = (char *)H5MM_malloc(sizeof(char) * tmplen);
if (handle->secret_id == NULL)
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "could not malloc space for handle ID copy.\n");
-
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "could not malloc space for handle ID copy.");
HDmemcpy(handle->secret_id, id, tmplen);
tmplen = SHA256_DIGEST_LENGTH;
handle->signing_key = (unsigned char *)H5MM_malloc(sizeof(unsigned char) * tmplen);
if (handle->signing_key == NULL)
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "could not malloc space for handle key copy.\n");
-
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "could not malloc space for handle key copy.");
HDmemcpy(handle->signing_key, signing_key, tmplen);
} /* if authentication information provided */
@@ -1087,34 +1098,23 @@ H5FD_s3comms_s3r_open(const char *url, const char *region, const char *id, const
************************/
curlh = curl_easy_init();
-
if (curlh == NULL)
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "problem creating curl easy handle!\n");
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "problem creating curl easy handle!");
if (CURLE_OK != curl_easy_setopt(curlh, CURLOPT_HTTPGET, 1L))
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL,
- "error while setting CURL option (CURLOPT_HTTPGET). "
- "(placeholder flags)");
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "error while setting CURL option (CURLOPT_HTTPGET).");
if (CURLE_OK != curl_easy_setopt(curlh, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1))
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL,
- "error while setting CURL option (CURLOPT_HTTP_VERSION). "
- "(placeholder flags)");
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "error while setting CURL option (CURLOPT_HTTP_VERSION).");
if (CURLE_OK != curl_easy_setopt(curlh, CURLOPT_FAILONERROR, 1L))
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL,
- "error while setting CURL option (CURLOPT_FAILONERROR). "
- "(placeholder flags)");
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "error while setting CURL option (CURLOPT_FAILONERROR).");
if (CURLE_OK != curl_easy_setopt(curlh, CURLOPT_WRITEFUNCTION, curlwritecallback))
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL,
- "error while setting CURL option (CURLOPT_WRITEFUNCTION). "
- "(placeholder flags)");
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "error while setting CURL option (CURLOPT_WRITEFUNCTION).");
if (CURLE_OK != curl_easy_setopt(curlh, CURLOPT_URL, url))
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL,
- "error while setting CURL option (CURLOPT_URL). "
- "(placeholder flags)");
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "error while setting CURL option (CURLOPT_URL).");
#if S3COMMS_CURL_VERBOSITY > 1
/* CURL will print (to stdout) information for each operation
@@ -1131,7 +1131,7 @@ H5FD_s3comms_s3r_open(const char *url, const char *region, const char *id, const
*******************/
if (FAIL == H5FD_s3comms_s3r_getsize(handle))
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "problem in H5FD_s3comms_s3r_getsize.\n");
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "problem in H5FD_s3comms_s3r_getsize.");
/*********************
* FINAL PREPARATION *
@@ -1146,17 +1146,14 @@ done:
if (ret_value == NULL) {
if (curlh != NULL)
curl_easy_cleanup(curlh);
-
if (FAIL == H5FD_s3comms_free_purl(purl))
HDONE_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "unable to free parsed url structure")
-
if (handle != NULL) {
H5MM_xfree(handle->region);
H5MM_xfree(handle->secret_id);
H5MM_xfree(handle->signing_key);
if (handle->httpverb != NULL)
H5MM_xfree(handle->httpverb);
-
H5MM_xfree(handle);
}
}
@@ -1165,9 +1162,11 @@ done:
} /* H5FD_s3comms_s3r_open */
/*----------------------------------------------------------------------------
+ *
* Function: H5FD_s3comms_s3r_read()
*
* Purpose:
+ *
* Read file pointed to by request handle, writing specified
* `offset` .. `offset + len` bytes to buffer `dest`.
*
@@ -1194,11 +1193,13 @@ done:
* from server.
*
* Return:
+ *
* - SUCCESS: `SUCCEED`
* - FAILURE: `FAIL`
*
* Programmer: Jacob Smith
* 2017-08-22
+ *
*----------------------------------------------------------------------------
*/
herr_t
@@ -1213,7 +1214,7 @@ H5FD_s3comms_s3r_read(s3r_t *handle, haddr_t offset, size_t len, void *dest)
char * rangebytesstr = NULL;
hrb_t * request = NULL;
int ret = 0; /* working variable to check */
- /* return value of HDsnprintf */
+ /* return value of HDsnprintf */
struct s3r_datastruct *sds = NULL;
herr_t ret_value = SUCCEED;
@@ -1228,17 +1229,13 @@ H5FD_s3comms_s3r_read(s3r_t *handle, haddr_t offset, size_t len, void *dest)
**************************************/
if (handle == NULL)
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "handle cannot be null.\n");
-
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "handle cannot be null.");
if (handle->magic != S3COMMS_S3R_MAGIC)
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "handle has invalid magic.\n");
-
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "handle has invalid magic.");
if (handle->curlhandle == NULL)
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "handle has bad (null) curlhandle.\n")
-
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "handle has bad (null) curlhandle.")
if (handle->purl == NULL)
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "handle has bad (null) url.\n")
-
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "handle has bad (null) url.")
HDassert(handle->purl->magic == S3COMMS_PARSED_URL_MAGIC);
if (offset > handle->filesize || (len + offset) > handle->filesize)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unable to read past EoF")
@@ -1252,15 +1249,14 @@ H5FD_s3comms_s3r_read(s3r_t *handle, haddr_t offset, size_t len, void *dest)
if (dest != NULL) {
sds = (struct s3r_datastruct *)H5MM_malloc(sizeof(struct s3r_datastruct));
if (sds == NULL)
- HGOTO_ERROR(H5E_ARGS, H5E_CANTALLOC, FAIL, "could not malloc destination datastructure.\n");
+ HGOTO_ERROR(H5E_ARGS, H5E_CANTALLOC, FAIL, "could not malloc destination datastructure.");
sds->magic = S3COMMS_CALLBACK_DATASTRUCT_MAGIC;
sds->data = (char *)dest;
sds->size = 0;
if (CURLE_OK != curl_easy_setopt(curlh, CURLOPT_WRITEDATA, sds))
HGOTO_ERROR(H5E_ARGS, H5E_UNINITIALIZED, FAIL,
- "error while setting CURL option (CURLOPT_WRITEDATA). "
- "(placeholder flags)");
+ "error while setting CURL option (CURLOPT_WRITEDATA).");
}
/*********************
@@ -1270,8 +1266,7 @@ H5FD_s3comms_s3r_read(s3r_t *handle, haddr_t offset, size_t len, void *dest)
if (len > 0) {
rangebytesstr = (char *)H5MM_malloc(sizeof(char) * (S3COMMS_MAX_RANGE_STRING_SIZE + 1));
if (rangebytesstr == NULL)
- HGOTO_ERROR(H5E_ARGS, H5E_CANTALLOC, FAIL, "could not malloc range format string.\n");
-
+ HGOTO_ERROR(H5E_ARGS, H5E_CANTALLOC, FAIL, "could not malloc range format string.");
ret = HDsnprintf(rangebytesstr, (S3COMMS_MAX_RANGE_STRING_SIZE),
"bytes=" H5_PRINTF_HADDR_FMT "-" H5_PRINTF_HADDR_FMT, offset, offset + len - 1);
if (ret <= 0 || ret >= S3COMMS_MAX_RANGE_STRING_SIZE)
@@ -1280,8 +1275,7 @@ H5FD_s3comms_s3r_read(s3r_t *handle, haddr_t offset, size_t len, void *dest)
else if (offset > 0) {
rangebytesstr = (char *)H5MM_malloc(sizeof(char) * (S3COMMS_MAX_RANGE_STRING_SIZE + 1));
if (rangebytesstr == NULL)
- HGOTO_ERROR(H5E_ARGS, H5E_CANTALLOC, FAIL, "could not malloc range format string.\n");
-
+ HGOTO_ERROR(H5E_ARGS, H5E_CANTALLOC, FAIL, "could not malloc range format string.");
ret = HDsnprintf(rangebytesstr, (S3COMMS_MAX_RANGE_STRING_SIZE), "bytes=" H5_PRINTF_HADDR_FMT "-",
offset);
if (ret <= 0 || ret >= S3COMMS_MAX_RANGE_STRING_SIZE)
@@ -1293,12 +1287,12 @@ H5FD_s3comms_s3r_read(s3r_t *handle, haddr_t offset, size_t len, void *dest)
*******************/
if (handle->signing_key == NULL) {
- /* Do not authenticate. */
+ /* Do not authenticate. */
if (rangebytesstr != NULL) {
/* Pass in range directly */
char *bytesrange_ptr = NULL; /* pointer past "bytes=" portion */
- bytesrange_ptr = strchr(rangebytesstr, '=');
+ bytesrange_ptr = HDstrchr(rangebytesstr, '=');
HDassert(bytesrange_ptr != NULL);
bytesrange_ptr++; /* move to first char past '=' */
HDassert(*bytesrange_ptr != '\0');
@@ -1309,7 +1303,8 @@ H5FD_s3comms_s3r_read(s3r_t *handle, haddr_t offset, size_t len, void *dest)
}
}
else {
- /* authenticate request */
+ /* authenticate request
+ */
char authorization[512 + 1];
/* 512 := approximate max length...
* 67 <len("AWS4-HMAC-SHA256 Credential=///s3/aws4_request,"
@@ -1337,93 +1332,70 @@ H5FD_s3comms_s3r_read(s3r_t *handle, haddr_t offset, size_t len, void *dest)
signed_headers[0] = 0;
/**** VERIFY INFORMATION EXISTS ****/
- if (handle->region == NULL)
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "handle must have non-null region.\n");
if (handle->secret_id == NULL)
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "handle must have non-null secret_id.\n");
-
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "handle must have non-null secret_id.");
if (handle->signing_key == NULL)
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "handle must have non-null signing_key.\n");
-
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "handle must have non-null signing_key.");
if (handle->httpverb == NULL)
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "handle must have non-null httpverb.\n");
-
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "handle must have non-null httpverb.");
if (handle->purl->host == NULL)
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "handle must have non-null host.\n");
-
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "handle must have non-null host.");
if (handle->purl->path == NULL)
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "handle must have non-null resource.\n");
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "handle must have non-null resource.");
/**** CREATE HTTP REQUEST STRUCTURE (hrb_t) ****/
request = H5FD_s3comms_hrb_init_request((const char *)handle->httpverb,
(const char *)handle->purl->path, "HTTP/1.1");
if (request == NULL)
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "could not allocate hrb_t request.\n");
-
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "could not allocate hrb_t request.");
HDassert(request->magic == S3COMMS_HRB_MAGIC);
now = gmnow();
if (ISO8601NOW(iso8601now, now) != (ISO8601_SIZE - 1))
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "could not format ISO8601 time.\n");
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "could not format ISO8601 time.");
if (FAIL == H5FD_s3comms_hrb_node_set(&headers, "x-amz-date", (const char *)iso8601now))
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unable to set x-amz-date header")
-
if (headers == NULL)
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL,
- "problem building headers list. "
- "(placeholder flags)\n");
-
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "problem building headers list.");
HDassert(headers->magic == S3COMMS_HRB_NODE_MAGIC);
if (FAIL == H5FD_s3comms_hrb_node_set(&headers, "x-amz-content-sha256", (const char *)EMPTY_SHA256))
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unable to set x-amz-content-sha256 header")
-
if (headers == NULL)
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL,
- "problem building headers list. "
- "(placeholder flags)\n");
-
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "problem building headers list.");
HDassert(headers->magic == S3COMMS_HRB_NODE_MAGIC);
if (rangebytesstr != NULL) {
- if (FAIL == H5FD_s3comms_hrb_node_set(&headers, "Range", (const char *)rangebytesstr))
+ if (FAIL == H5FD_s3comms_hrb_node_set(&headers, "Range", rangebytesstr))
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unable to set range header")
-
if (headers == NULL)
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL,
- "problem building headers list. "
- "(placeholder flags)\n");
-
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "problem building headers list.");
HDassert(headers->magic == S3COMMS_HRB_NODE_MAGIC);
}
- if (FAIL == H5FD_s3comms_hrb_node_set(&headers, "Host", (const char *)handle->purl->host))
+ if (FAIL == H5FD_s3comms_hrb_node_set(&headers, "Host", handle->purl->host))
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unable to set host header")
-
if (headers == NULL)
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL,
- "problem building headers list. "
- "(placeholder flags)\n");
-
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "problem building headers list.");
HDassert(headers->magic == S3COMMS_HRB_NODE_MAGIC);
request->first_header = headers;
/**** COMPUTE AUTHORIZATION ****/
- if (FAIL == H5FD_s3comms_aws_canonical_request(buffer1, 512, signed_headers, 48, request))
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "(placeholder flags)\n");
+ /* buffer1 -> canonical request */
+ if (FAIL == H5FD_s3comms_aws_canonical_request(buffer1, 512, signed_headers, 48, request))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "bad canonical request");
/* buffer2->string-to-sign */
if (FAIL == H5FD_s3comms_tostringtosign(buffer2, buffer1, iso8601now, handle->region))
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "(placeholder flags)\n");
-
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "bad string-to-sign");
/* buffer1 -> signature */
if (FAIL == H5FD_s3comms_HMAC_SHA256(handle->signing_key, SHA256_DIGEST_LENGTH, buffer2,
HDstrlen(buffer2), buffer1))
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "(placeholder flags)\n");
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "bad signature");
iso8601now[8] = 0; /* trim to yyyyMMDD */
ret = S3COMMS_FORMAT_CREDENTIAL(buffer2, handle->secret_id, iso8601now, handle->region, "s3");
@@ -1435,18 +1407,13 @@ H5FD_s3comms_s3r_read(s3r_t *handle, haddr_t offset, size_t len, void *dest)
if (ret <= 0 || ret >= 512)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unable to format aws4 authorization string");
- /* append authorization header to http request buffer
- */
+ /* append authorization header to http request buffer */
if (H5FD_s3comms_hrb_node_set(&headers, "Authorization", (const char *)authorization) == FAIL)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unable to set Authorization header")
-
if (headers == NULL)
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL,
- "problem building headers list. "
- "(placeholder flags)\n");
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "problem building headers list.");
- /* update hrb's "first header" pointer
- */
+ /* update hrb's "first header" pointer */
request->first_header = headers;
/**** SET CURLHANDLE HTTP HEADERS FROM GENERATED DATA ****/
@@ -1456,25 +1423,19 @@ H5FD_s3comms_s3r_read(s3r_t *handle, haddr_t offset, size_t len, void *dest)
HDassert(node->magic == S3COMMS_HRB_NODE_MAGIC);
curlheaders = curl_slist_append(curlheaders, (const char *)node->cat);
if (curlheaders == NULL)
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL,
- "could not append header to curl slist. "
- "(placeholder flags)\n");
-
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "could not append header to curl slist.");
node = node->next;
}
/* sanity-check */
- /* above loop was probably never run */
if (curlheaders == NULL)
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "curlheaders was never populated.\n");
+ /* above loop was probably never run */
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "curlheaders was never populated.");
- /* finally, set http headers in curl handle
- */
+ /* finally, set http headers in curl handle */
if (curl_easy_setopt(curlh, CURLOPT_HTTPHEADER, curlheaders) != CURLE_OK)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL,
- "error while setting CURL option "
- "(CURLOPT_HTTPHEADER). (placeholder flags)");
-
+ "error while setting CURL option (CURLOPT_HTTPHEADER).");
} /* end if should authenticate (info provided) */
/*******************
@@ -1498,10 +1459,9 @@ H5FD_s3comms_s3r_read(s3r_t *handle, haddr_t offset, size_t len, void *dest)
if (p_status != CURLE_OK) {
if (CURLE_OK != curl_easy_getinfo(curlh, CURLINFO_RESPONSE_CODE, &httpcode))
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "problem getting response code")
-
HDfprintf(stderr, "CURL ERROR CODE: %d\nHTTP CODE: %d\n", p_status, httpcode);
HDfprintf(stderr, "%s\n", curl_easy_strerror(p_status));
- HGOTO_ERROR(H5E_VFL, H5E_CANTOPENFILE, FAIL, "problem while performing request.\n");
+ HGOTO_ERROR(H5E_VFL, H5E_CANTOPENFILE, FAIL, "problem while performing request.");
}
if (CURLE_OK != curl_easy_setopt(curlh, CURLOPT_ERRORBUFFER, NULL))
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "problem unsetting error buffer")
@@ -1510,16 +1470,15 @@ H5FD_s3comms_s3r_read(s3r_t *handle, haddr_t offset, size_t len, void *dest)
p_status = curl_easy_perform(curlh);
if (p_status != CURLE_OK)
- HGOTO_ERROR(H5E_VFL, H5E_CANTOPENFILE, FAIL, "curl cannot perform request\n")
+ HGOTO_ERROR(H5E_VFL, H5E_CANTOPENFILE, FAIL, "curl cannot perform request")
#endif
#if S3COMMS_DEBUG
if (dest != NULL) {
HDfprintf(stderr, "len: %d\n", (int)len);
HDfprintf(stderr, "CHECKING FOR BUFFER OVERFLOW\n");
- if (sds == NULL) {
+ if (sds == NULL)
HDfprintf(stderr, "sds is NULL!\n");
- }
else {
HDfprintf(stderr, "sds: 0x%lx\n", (long long)sds);
HDfprintf(stderr, "sds->size: %d\n", (int)sds->size);
@@ -1527,13 +1486,13 @@ H5FD_s3comms_s3r_read(s3r_t *handle, haddr_t offset, size_t len, void *dest)
HDfprintf(stderr, "buffer overwrite\n");
}
}
- else {
+ else
HDfprintf(stderr, "performed on entire file\n");
- }
#endif
done:
- /* clean any malloc'd resources */
+ /* clean any malloc'd resources
+ */
if (curlheaders != NULL) {
curl_slist_free_all(curlheaders);
curlheaders = NULL;
@@ -1550,7 +1509,6 @@ done:
while (headers != NULL)
if (FAIL == H5FD_s3comms_hrb_node_set(&headers, headers->name, NULL))
HDONE_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "cannot release header node")
-
HDassert(NULL == headers);
if (FAIL == H5FD_s3comms_hrb_destroy(&request))
HDONE_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "cannot release header request structure")
@@ -1575,17 +1533,21 @@ done:
****************************************************************************/
/*----------------------------------------------------------------------------
+ *
* Function: gmnow()
*
* Purpose:
+ *
* Get the output of `time.h`'s `gmtime()` call while minimizing setup
* clutter where important.
*
* Return:
+ *
* Pointer to resulting `struct tm`,as created by gmtime(time_t * T).
*
* Programmer: Jacob Smith
* 2017-07-12
+ *
*----------------------------------------------------------------------------
*/
struct tm *
@@ -1596,8 +1558,8 @@ gmnow(void)
struct tm *ret_value = NULL;
/* Doctor assert, checks against error in time() */
- if ((time_t)(-1) != time(now_ptr))
- ret_value = gmtime(now_ptr);
+ if ((time_t)(-1) != HDtime(now_ptr))
+ ret_value = HDgmtime(now_ptr);
HDassert(ret_value != NULL);
@@ -1605,9 +1567,11 @@ gmnow(void)
} /* end gmnow() */
/*----------------------------------------------------------------------------
+ *
* Function: H5FD_s3comms_aws_canonical_request()
*
* Purpose:
+ *
* Compose AWS "Canonical Request" (and signed headers string)
* as defined in the REST API documentation.
*
@@ -1616,6 +1580,7 @@ gmnow(void)
* Destination string arguments must be provided with adequate space.
*
* Canonical Request format:
+ *
* <HTTP VERB>"\n"
* <resource path>"\n"
* <query string>"\n"
@@ -1628,6 +1593,7 @@ gmnow(void)
* <hex-string of sha256sum of body> ("e3b0c4429...", e.g.)
*
* Return:
+ *
* - SUCCESS: `SUCCEED`
* - writes canonical request to respective `...dest` strings
* - FAILURE: `FAIL`
@@ -1636,6 +1602,7 @@ gmnow(void)
*
* Programmer: Jacob Smith
* 2017-10-04
+ *
*----------------------------------------------------------------------------
*/
herr_t
@@ -1651,7 +1618,6 @@ H5FD_s3comms_aws_canonical_request(char *canonical_request_dest, int _cr_size, c
size_t cr_len = 0; /* working length of canonical request str */
size_t sh_len = 0; /* working length of signed headers str */
char tmpstr[256 + 1];
-
tmpstr[256] = 0; /* terminating NULL */
/* "query params" refers to the optional element in the URL, e.g.
@@ -1671,80 +1637,75 @@ H5FD_s3comms_aws_canonical_request(char *canonical_request_dest, int _cr_size, c
#endif
if (http_request == NULL)
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "hrb object cannot be null.\n");
-
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "hrb object cannot be null.");
HDassert(http_request->magic == S3COMMS_HRB_MAGIC);
if (canonical_request_dest == NULL)
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "canonical request destination cannot be null.\n");
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "canonical request destination cannot be null.");
if (signed_headers_dest == NULL)
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "signed headers destination cannot be null.\n");
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "signed headers destination cannot be null.");
- /* HTTP verb, resource path, and query string lines
- */
+ /* HTTP verb, resource path, and query string lines */
cr_len = (HDstrlen(http_request->verb) + HDstrlen(http_request->resource) + HDstrlen(query_params) +
(size_t)3); /* three newline chars */
if (cr_len >= cr_size)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not enough space in canonical request");
-
- ret = HDsnprintf(/* TODO: compiler warning */
- canonical_request_dest, (cr_size - 1), "%s\n%s\n%s\n", http_request->verb,
+ /* TODO: compiler warning */
+ ret = HDsnprintf(canonical_request_dest, (cr_size - 1), "%s\n%s\n%s\n", http_request->verb,
http_request->resource, query_params);
if (ret < 0 || (size_t)ret >= cr_size)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unable to compose canonical request first line");
- /* write in canonical headers, building signed headers concurrently
- */
+ /* write in canonical headers, building signed headers concurrently */
node = http_request->first_header; /* assumed sorted */
while (node != NULL) {
+
HDassert(node->magic == S3COMMS_HRB_NODE_MAGIC);
ret = HDsnprintf(tmpstr, 256, "%s:%s\n", node->lowername, node->value);
if (ret < 0 || ret >= 256)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unable to concatenate HTTP header %s:%s",
node->lowername, node->value);
-
cr_len += HDstrlen(tmpstr);
if (cr_len + 1 > cr_size)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not enough space in canonical request");
-
- strcat(canonical_request_dest, tmpstr);
+ HDstrcat(canonical_request_dest, tmpstr);
ret = HDsnprintf(tmpstr, 256, "%s;", node->lowername);
if (ret < 0 || ret >= 256)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unable to append semicolon to lowername %s",
node->lowername);
-
sh_len += HDstrlen(tmpstr);
if (sh_len + 1 > sh_size)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not enough space in signed headers");
-
- strcat(signed_headers_dest, tmpstr);
+ HDstrcat(signed_headers_dest, tmpstr);
node = node->next;
} /* end while node is not NULL */
- /* remove tailing ';' from signed headers sequence */
+ /* remove trailing ';' from signed headers sequence */
signed_headers_dest[HDstrlen(signed_headers_dest) - 1] = '\0';
/* append signed headers and payload hash
* NOTE: at present, no HTTP body is handled, per the nature of
* requests/range-gets
*/
- strcat(canonical_request_dest, "\n");
- strcat(canonical_request_dest, signed_headers_dest);
- strcat(canonical_request_dest, "\n");
- strcat(canonical_request_dest, EMPTY_SHA256);
+ HDstrcat(canonical_request_dest, "\n");
+ HDstrcat(canonical_request_dest, signed_headers_dest);
+ HDstrcat(canonical_request_dest, "\n");
+ HDstrcat(canonical_request_dest, EMPTY_SHA256);
done:
FUNC_LEAVE_NOAPI(ret_value);
} /* end H5FD_s3comms_aws_canonical_request() */
/*----------------------------------------------------------------------------
+ *
* Function: H5FD_s3comms_bytes_to_hex()
*
* Purpose:
+ *
* Produce human-readable hex string [0-9A-F] from sequence of bytes.
*
* For each byte (char), writes two-character hexadecimal representation.
@@ -1758,6 +1719,7 @@ done:
* `msg_len` message length of 0 has no effect.
*
* Return:
+ *
* - SUCCESS: `SUCCEED`
* - hex string written to `dest` (not null-terminated)
* - FAILURE: `FAIL`
@@ -1765,7 +1727,8 @@ done:
* - `msg == NULL`
*
* Programmer: Jacob Smith
- * 2017-07-12 *
+ * 2017-07-12
+ *
*----------------------------------------------------------------------------
*/
herr_t
@@ -1781,17 +1744,15 @@ H5FD_s3comms_bytes_to_hex(char *dest, const unsigned char *msg, size_t msg_len,
#endif
if (dest == NULL)
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "hex destination cannot be null.\n")
-
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "hex destination cannot be null.")
if (msg == NULL)
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "bytes sequence cannot be null.\n")
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "bytes sequence cannot be null.")
for (i = 0; i < msg_len; i++) {
int chars_written = HDsnprintf(&(dest[i * 2]), 3, /* 'X', 'X', '\n' */
(lowercase == TRUE) ? "%02x" : "%02X", msg[i]);
- if (chars_written != 2) {
+ if (chars_written != 2)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "problem while writing hex chars for %c", msg[i]);
- }
}
done:
@@ -1799,18 +1760,22 @@ done:
} /* end H5FD_s3comms_bytes_to_hex() */
/*----------------------------------------------------------------------------
+ *
* Function: H5FD_s3comms_free_purl()
*
* Purpose:
+ *
* Release resources from a parsed_url_t pointer.
*
* If pointer is null, nothing happens.
*
* Return:
+ *
* `SUCCEED` (never fails)
*
* Programmer: Jacob Smith
* 2017-11-01
+ *
*----------------------------------------------------------------------------
*/
herr_t
@@ -1826,19 +1791,14 @@ H5FD_s3comms_free_purl(parsed_url_t *purl)
HDassert(purl->magic == S3COMMS_PARSED_URL_MAGIC);
if (purl->scheme != NULL)
H5MM_xfree(purl->scheme);
-
if (purl->host != NULL)
H5MM_xfree(purl->host);
-
if (purl->port != NULL)
H5MM_xfree(purl->port);
-
if (purl->path != NULL)
H5MM_xfree(purl->path);
-
if (purl->query != NULL)
H5MM_xfree(purl->query);
-
purl->magic += 1ul;
H5MM_xfree(purl);
}
@@ -1847,9 +1807,11 @@ H5FD_s3comms_free_purl(parsed_url_t *purl)
} /* end H5FD_s3comms_free_purl() */
/*----------------------------------------------------------------------------
+ *
* Function: H5FD_s3comms_HMAC_SHA256()
*
* Purpose:
+ *
* Generate Hash-based Message Authentication Checksum using the SHA-256
* hashing algorithm.
*
@@ -1862,6 +1824,7 @@ H5FD_s3comms_free_purl(parsed_url_t *purl)
* `dest` will _not_ be null-terminated by this function.
*
* Return:
+ *
* - SUCCESS: `SUCCEED`
* - hex string written to `dest` (not null-terminated)
* - FAILURE: `FAIL`
@@ -1870,6 +1833,7 @@ H5FD_s3comms_free_purl(parsed_url_t *purl)
*
* Programmer: Jacob Smith
* 2017-07-??
+ *
*----------------------------------------------------------------------------
*/
herr_t
@@ -1891,7 +1855,7 @@ H5FD_s3comms_HMAC_SHA256(const unsigned char *key, size_t key_len, const char *m
HMAC(EVP_sha256(), key, (int)key_len, (const unsigned char *)msg, msg_len, md, &md_len);
- if (H5FD_s3comms_bytes_to_hex(dest, (const unsigned char *)md, (size_t)md_len, TRUE) == FAIL)
+ if (H5FD_s3comms_bytes_to_hex(dest, (const unsigned char *)md, (size_t)md_len, true) == FAIL)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "could not convert to hex string.");
done:
@@ -1899,9 +1863,11 @@ done:
} /* H5FD_s3comms_HMAC_SHA256 */
/*-----------------------------------------------------------------------------
+ *
* Function: H5FD__s3comms_load_aws_creds_from_file()
*
* Purpose:
+ *
* Extract AWS configuration information from a target file.
*
* Given a file and a profile name, e.g. "ros3_vfd_test", attempt to locate
@@ -1931,6 +1897,7 @@ done:
* when reading from multiple files.
*
* Return:
+ *
* + SUCCESS: `SUCCEED`
* + no error. settings may or may not have been loaded.
* + FAILURE: `FAIL`
@@ -1941,6 +1908,7 @@ done:
*
* Programmer: Jacob Smith
* 2018-02-27
+ *
*-----------------------------------------------------------------------------
*/
static herr_t
@@ -1974,34 +1942,29 @@ H5FD__s3comms_load_aws_creds_from_file(FILE *file, const char *profile_name, cha
/* format target line for start of profile */
if (32 < HDsnprintf(profile_line, 32, "[%s]", profile_name))
- HGOTO_ERROR(H5E_ARGS, H5E_CANTCOPY, FAIL, "unable to format profile label");
+ HGOTO_ERROR(H5E_ARGS, H5E_CANTCOPY, FAIL, "unable to format profile label")
/* look for start of profile */
do {
/* clear buffer */
- for (buffer_i = 0; buffer_i < 128; buffer_i++) {
+ for (buffer_i = 0; buffer_i < 128; buffer_i++)
buffer[buffer_i] = 0;
- }
line_buffer = fgets(line_buffer, 128, file);
- if (line_buffer == NULL) { /* reached end of file */
+ if (line_buffer == NULL) /* reached end of file */
goto done;
- }
- } while (strncmp(line_buffer, profile_line, HDstrlen(profile_line)));
+ } while (HDstrncmp(line_buffer, profile_line, HDstrlen(profile_line)));
/* extract credentials from lines */
do {
/* clear buffer */
- for (buffer_i = 0; buffer_i < 128; buffer_i++) {
+ for (buffer_i = 0; buffer_i < 128; buffer_i++)
buffer[buffer_i] = 0;
- }
/* collect a line from file */
line_buffer = fgets(line_buffer, 128, file);
- if (line_buffer == NULL) {
- goto done;
- /* end of file */
- }
+ if (line_buffer == NULL)
+ goto done; /* end of file */
/* loop over names to see if line looks like assignment */
for (setting_i = 0; setting_i < setting_count; setting_i++) {
@@ -2012,7 +1975,7 @@ H5FD__s3comms_load_aws_creds_from_file(FILE *file, const char *profile_name, cha
setting_name = setting_names[setting_i];
setting_name_len = HDstrlen(setting_name);
if (HDsnprintf(line_prefix, 128, "%s=", setting_name) < 0)
- HGOTO_ERROR(H5E_ARGS, H5E_CANTCOPY, FAIL, "unable to format line prefix");
+ HGOTO_ERROR(H5E_ARGS, H5E_CANTCOPY, FAIL, "unable to format line prefix")
/* found a matching name? */
if (!HDstrncmp(line_buffer, line_prefix, setting_name_len + 1)) {
@@ -2028,20 +1991,16 @@ H5FD__s3comms_load_aws_creds_from_file(FILE *file, const char *profile_name, cha
} while (*line_buffer != 0 && *line_buffer != '=');
if (*line_buffer == 0 || *(line_buffer + 1) == 0)
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "incomplete assignment in file");
-
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "incomplete assignment in file")
line_buffer++; /* was pointing at '='; advance */
/* copy line buffer into out pointer */
- if (HDstrncpy(setting_pointers[setting_i], (const char *)line_buffer,
- HDstrlen(line_buffer)) == NULL)
- HGOTO_ERROR(H5E_ARGS, H5E_CANTCOPY, FAIL, "unable to copy line into pointer");
+ HDstrncpy(setting_pointers[setting_i], (const char *)line_buffer, HDstrlen(line_buffer));
/* "trim" tailing whitespace by replacing with null terminator*/
buffer_i = 0;
- while (!isspace(setting_pointers[setting_i][buffer_i])) {
+ while (!HDisspace(setting_pointers[setting_i][buffer_i]))
buffer_i++;
- }
setting_pointers[setting_i][buffer_i] = '\0';
break; /* have read setting; don't compare with others */
@@ -2054,9 +2013,11 @@ done:
} /* end H5FD__s3comms_load_aws_creds_from_file() */
/*----------------------------------------------------------------------------
+ *
* Function: H5FD_s3comms_load_aws_profile()
*
* Purpose :
+ *
* Read aws profile elements from standard location on system and store
* settings in memory.
*
@@ -2070,6 +2031,7 @@ done:
* Settings are stored in the supplied buffers as null-terminated strings.
*
* Return:
+ *
* + SUCCESS: `SUCCEED` (0)
* + no error occurred and all settings were populated
* + FAILURE: `FAIL` (-1)
@@ -2079,6 +2041,7 @@ done:
*
* Programmer: Jacob Smith
* 2018-02-27
+ *
*----------------------------------------------------------------------------
*/
herr_t
@@ -2104,38 +2067,32 @@ H5FD_s3comms_load_aws_profile(const char *profile_name, char *key_id_out, char *
#endif
if (ret < 0 || (size_t)ret >= 117)
HGOTO_ERROR(H5E_ARGS, H5E_CANTCOPY, FAIL, "unable to format home-aws path")
-
ret = HDsnprintf(filepath, 128, "%s%s", awspath, "credentials");
if (ret < 0 || (size_t)ret >= 128)
HGOTO_ERROR(H5E_ARGS, H5E_CANTCOPY, FAIL, "unable to format credentials path")
- credfile = fopen(filepath, "r");
+ credfile = HDfopen(filepath, "r");
if (credfile != NULL) {
if (H5FD__s3comms_load_aws_creds_from_file(credfile, profile_name, key_id_out, secret_access_key_out,
- aws_region_out) == FAIL) {
+ aws_region_out) == FAIL)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unable to load from aws credentials")
- }
- if (fclose(credfile) == EOF)
+ if (HDfclose(credfile) == EOF)
HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, FAIL, "unable to close credentials file")
-
credfile = NULL;
} /* end if credential file opened */
ret = HDsnprintf(filepath, 128, "%s%s", awspath, "config");
if (ret < 0 || (size_t)ret >= 128)
HGOTO_ERROR(H5E_ARGS, H5E_CANTCOPY, FAIL, "unable to format config path")
-
- credfile = fopen(filepath, "r");
+ credfile = HDfopen(filepath, "r");
if (credfile != NULL) {
if (H5FD__s3comms_load_aws_creds_from_file(
credfile, profile_name, (*key_id_out == 0) ? key_id_out : NULL,
(*secret_access_key_out == 0) ? secret_access_key_out : NULL,
- (*aws_region_out == 0) ? aws_region_out : NULL) == FAIL) {
+ (*aws_region_out == 0) ? aws_region_out : NULL) == FAIL)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unable to load from aws config")
- }
- if (fclose(credfile) == EOF)
+ if (HDfclose(credfile) == EOF)
HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, FAIL, "unable to close config file")
-
credfile = NULL;
} /* end if credential file opened */
@@ -2144,18 +2101,19 @@ H5FD_s3comms_load_aws_profile(const char *profile_name, char *key_id_out, char *
ret_value = FAIL;
done:
- if (credfile != NULL) {
- if (fclose(credfile) == EOF) {
+ if (credfile != NULL)
+ if (HDfclose(credfile) == EOF)
HDONE_ERROR(H5E_ARGS, H5E_ARGS, FAIL, "problem error-closing aws configuration file")
- }
- }
+
FUNC_LEAVE_NOAPI(ret_value);
} /* end H5FD_s3comms_load_aws_profile() */
/*----------------------------------------------------------------------------
+ *
* Function: H5FD_s3comms_nlowercase()
*
* Purpose:
+ *
* From string starting at `s`, write `len` characters to `dest`,
* converting all to lowercase.
*
@@ -2165,6 +2123,7 @@ done:
* Provided as convenience.
*
* Return:
+ *
* - SUCCESS: `SUCCEED`
* - upon completion, `dest` is populated
* - FAILURE: `FAIL`
@@ -2172,6 +2131,7 @@ done:
*
* Programmer: Jacob Smith
* 2017-09-18
+ *
*----------------------------------------------------------------------------
*/
herr_t
@@ -2186,13 +2146,13 @@ H5FD_s3comms_nlowercase(char *dest, const char *s, size_t len)
#endif
if (dest == NULL)
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "destination cannot be null.\n");
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "destination cannot be null.");
if (len > 0) {
HDmemcpy(dest, s, len);
do {
len--;
- dest[len] = (char)tolower((int)dest[len]);
+ dest[len] = (char)HDtolower((int)dest[len]);
} while (len > 0);
}
@@ -2201,9 +2161,11 @@ done:
} /* end H5FD_s3comms_nlowercase() */
/*----------------------------------------------------------------------------
+ *
* Function: H5FD_s3comms_parse_url()
*
* Purpose:
+ *
* Parse URL-like string and stuff URL components into
* `parsed_url` structure, if possible.
*
@@ -2217,6 +2179,7 @@ done:
* Empty or absent elements are NULL in new purl structure.
*
* Return:
+ *
* - SUCCESS: `SUCCEED`
* - `purl` pointer is populated
* - FAILURE: `FAIL`
@@ -2225,6 +2188,7 @@ done:
*
* Programmer: Jacob Smith
* 2017-10-30
+ *
*----------------------------------------------------------------------------
*/
herr_t
@@ -2238,7 +2202,7 @@ H5FD_s3comms_parse_url(const char *str, parsed_url_t **_purl)
unsigned int i = 0;
herr_t ret_value = FAIL;
- FUNC_ENTER_NOAPI_NOINIT
+ FUNC_ENTER_NOAPI_NOINIT;
#if S3COMMS_DEBUG
HDprintf("called H5FD_s3comms_parse_url.\n");
@@ -2252,7 +2216,6 @@ H5FD_s3comms_parse_url(const char *str, parsed_url_t **_purl)
purl = (parsed_url_t *)H5MM_malloc(sizeof(parsed_url_t));
if (purl == NULL)
HGOTO_ERROR(H5E_ARGS, H5E_CANTALLOC, FAIL, "can't allocate space for parsed_url_t");
-
purl->magic = S3COMMS_PARSED_URL_MAGIC;
purl->scheme = NULL;
purl->host = NULL;
@@ -2267,26 +2230,24 @@ H5FD_s3comms_parse_url(const char *str, parsed_url_t **_purl)
tmpstr = HDstrchr(curstr, ':');
if (tmpstr == NULL)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid SCHEME construction: probably not URL");
-
len = tmpstr - curstr;
HDassert((0 <= len) && (len < urllen));
/* check for restrictions */
for (i = 0; i < len; i++) {
/* scheme = [a-zA-Z+-.]+ (terminated by ":") */
- if (!isalpha(curstr[i]) && '+' != curstr[i] && '-' != curstr[i] && '.' != curstr[i])
+ if (!HDisalpha(curstr[i]) && '+' != curstr[i] && '-' != curstr[i] && '.' != curstr[i])
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid SCHEME construction");
}
+
/* copy lowercased scheme to structure */
purl->scheme = (char *)H5MM_malloc(sizeof(char) * (size_t)(len + 1));
if (purl->scheme == NULL)
HGOTO_ERROR(H5E_ARGS, H5E_CANTALLOC, FAIL, "can't allocate space for SCHEME");
-
- (void)HDstrncpy(purl->scheme, curstr, (size_t)len);
+ HDstrncpy(purl->scheme, curstr, (size_t)len);
purl->scheme[len] = '\0';
- for (i = 0; i < len; i++) {
- purl->scheme[i] = (char)tolower(purl->scheme[i]);
- }
+ for (i = 0; i < len; i++)
+ purl->scheme[i] = (char)HDtolower(purl->scheme[i]);
/* Skip "://" */
tmpstr += 3;
@@ -2299,9 +2260,9 @@ H5FD_s3comms_parse_url(const char *str, parsed_url_t **_purl)
if (*curstr == '[') {
/* IPv6 */
while (']' != *tmpstr) {
- if (tmpstr == 0) /* end of string reached! */
+ /* end of string reached! */
+ if (tmpstr == 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "reached end of URL: incomplete IPv6 HOST");
-
tmpstr++;
}
tmpstr++;
@@ -2310,24 +2271,20 @@ H5FD_s3comms_parse_url(const char *str, parsed_url_t **_purl)
while (0 != *tmpstr) {
if (':' == *tmpstr || '/' == *tmpstr || '?' == *tmpstr)
break;
-
tmpstr++;
}
} /* end else (IPv4) */
len = tmpstr - curstr;
- if (len == 0) {
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "HOST substring cannot be empty");
- }
- else if (len > urllen) {
+ if (len == 0)
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "HOST substring cannot be empty")
+ else if (len > urllen)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "problem with length of HOST substring");
- }
/* copy host */
purl->host = (char *)H5MM_malloc(sizeof(char) * (size_t)(len + 1));
if (purl->host == NULL)
HGOTO_ERROR(H5E_ARGS, H5E_CANTALLOC, FAIL, "can't allocate space for HOST");
-
- (void)HDstrncpy(purl->host, curstr, (size_t)len);
+ HDstrncpy(purl->host, curstr, (size_t)len);
purl->host[len] = 0;
/*************
@@ -2337,29 +2294,22 @@ H5FD_s3comms_parse_url(const char *str, parsed_url_t **_purl)
if (':' == *tmpstr) {
tmpstr += 1; /* advance past ':' */
curstr = tmpstr;
- while ((0 != *tmpstr) && ('/' != *tmpstr) && ('?' != *tmpstr)) {
+ while ((0 != *tmpstr) && ('/' != *tmpstr) && ('?' != *tmpstr))
tmpstr++;
- }
len = tmpstr - curstr;
- if (len == 0) {
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "PORT element cannot be empty");
- }
- else if (len > urllen) {
+ if (len == 0)
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "PORT element cannot be empty")
+ else if (len > urllen)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "problem with length of PORT substring");
- }
-
- for (i = 0; i < len; i++) {
- if (!isdigit(curstr[i]))
+ for (i = 0; i < len; i++)
+ if (!HDisdigit(curstr[i]))
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "PORT is not a decimal string");
- }
- /* copy port
- */
+ /* copy port */
purl->port = (char *)H5MM_malloc(sizeof(char) * (size_t)(len + 1));
- if (purl->port == NULL) /* cannot malloc */
+ if (purl->port == NULL)
HGOTO_ERROR(H5E_ARGS, H5E_CANTALLOC, FAIL, "can't allocate space for PORT");
-
- (void)HDstrncpy(purl->port, curstr, (size_t)len);
+ HDstrncpy(purl->port, curstr, (size_t)len);
purl->port[len] = 0;
} /* end if PORT element */
@@ -2372,21 +2322,17 @@ H5FD_s3comms_parse_url(const char *str, parsed_url_t **_purl)
tmpstr += 1;
curstr = tmpstr;
- /* seek end of PATH
- */
- while ((0 != *tmpstr) && ('?' != *tmpstr)) {
+ /* seek end of PATH */
+ while ((0 != *tmpstr) && ('?' != *tmpstr))
tmpstr++;
- }
len = tmpstr - curstr;
if (len > urllen)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "problem with length of PATH substring");
-
if (len > 0) {
purl->path = (char *)H5MM_malloc(sizeof(char) * (size_t)(len + 1));
if (purl->path == NULL)
HGOTO_ERROR(H5E_ARGS, H5E_CANTALLOC, FAIL, "can't allocate space for PATH");
- /* cannot malloc path pointer */
- (void)HDstrncpy(purl->path, curstr, (size_t)len);
+ HDstrncpy(purl->path, curstr, (size_t)len);
purl->path[len] = 0;
}
} /* end if PATH element */
@@ -2398,21 +2344,17 @@ H5FD_s3comms_parse_url(const char *str, parsed_url_t **_purl)
if ('?' == *tmpstr) {
tmpstr += 1;
curstr = tmpstr;
- while (0 != *tmpstr) {
+ while (0 != *tmpstr)
tmpstr++;
- }
len = tmpstr - curstr;
- if (len == 0) {
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "QUERY cannot be empty");
- }
- else if (len > urllen) {
+ if (len == 0)
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "QUERY cannot be empty")
+ else if (len > urllen)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "problem with length of QUERY substring");
- }
purl->query = (char *)H5MM_malloc(sizeof(char) * (size_t)(len + 1));
if (purl->query == NULL)
HGOTO_ERROR(H5E_ARGS, H5E_CANTALLOC, FAIL, "can't allocate space for QUERY");
- /* cannot malloc path pointer */
- (void)HDstrncpy(purl->query, curstr, (size_t)len);
+ HDstrncpy(purl->query, curstr, (size_t)len);
purl->query[len] = 0;
} /* end if QUERY exists */
@@ -2427,9 +2369,11 @@ done:
} /* end H5FD_s3comms_parse_url() */
/*----------------------------------------------------------------------------
+ *
* Function: H5FD_s3comms_percent_encode_char()
*
* Purpose:
+ *
* "Percent-encode" utf-8 character `c`, e.g.,
* '$' -> "%24"
* 'ยข' -> "%C2%A2"
@@ -2452,6 +2396,7 @@ done:
* `repr_len`.
*
* Return : SUCCEED/FAIL
+ *
* - SUCCESS: `SUCCEED`
* - percent-encoded representation written to `repr`
* - 'repr' is null-terminated
@@ -2459,6 +2404,7 @@ done:
* - `c` or `repr` was NULL
*
* Programmer: Jacob Smith
+ *
*----------------------------------------------------------------------------
*/
herr_t
@@ -2479,7 +2425,7 @@ H5FD_s3comms_percent_encode_char(char *repr, const unsigned char c, size_t *repr
#endif
if (repr == NULL)
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no destination `repr`.\n")
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no destination `repr`.")
#if S3COMMS_DEBUG
H5FD_s3comms_bytes_to_hex((char *)hex, s, 1, FALSE);
@@ -2498,10 +2444,10 @@ H5FD_s3comms_percent_encode_char(char *repr, const unsigned char c, size_t *repr
chars_written = HDsnprintf(repr, 4, "%%%02X", c);
if (chars_written < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "cannot write char %c", c);
-
} /* end if single-byte unicode char */
else {
- /* multi-byte, multi-percent representation */
+ /* multi-byte, multi-percent representation
+ */
unsigned int acc = 0; /* byte accumulator */
unsigned int k = 0; /* uint character representation */
unsigned int stack_size = 0;
@@ -2513,7 +2459,8 @@ H5FD_s3comms_percent_encode_char(char *repr, const unsigned char c, size_t *repr
k = (unsigned int)c;
*repr_len = 0;
do {
- /* push number onto stack in six-bit slices */
+ /* push number onto stack in six-bit slices
+ */
acc = k;
acc >>= 6; /* cull least */
acc <<= 6; /* six bits */
@@ -2548,7 +2495,6 @@ H5FD_s3comms_percent_encode_char(char *repr, const unsigned char c, size_t *repr
chars_written = HDsnprintf(repr, 4, "%%%02X", (unsigned char)(acc + stack[stack_size]));
if (chars_written < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "cannot write char %c", c);
-
*repr_len += 3;
/************************
@@ -2561,7 +2507,6 @@ H5FD_s3comms_percent_encode_char(char *repr, const unsigned char c, size_t *repr
HDsnprintf(&repr[i * 3 + 3], 4, "%%%02X", (unsigned char)(0x80 + stack[stack_size - 1 - i]));
if (chars_written < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "cannot write char %c", c);
-
*repr_len += 3;
} /* end for each continuation byte */
} /* end else (multi-byte) */
@@ -2573,9 +2518,11 @@ done:
} /* H5FD_s3comms_percent_encode_char */
/*----------------------------------------------------------------------------
+ *
* Function: H5FD_s3comms_signing_key()
*
* Purpose:
+ *
* Create AWS4 "Signing Key" from secret key, AWS region, and timestamp.
*
* Sequentially runs HMAC_SHA256 on strings in specified order,
@@ -2597,6 +2544,7 @@ done:
* Programmer must ensure that `md` is appropriately allocated.
*
* Return:
+ *
* - SUCCESS: `SUCCEED`
* - raw byte data of signing key written to `md`
* - FAILURE: `FAIL`
@@ -2604,6 +2552,7 @@ done:
*
* Programmer: Jacob Smith
* 2017-07-13
+ *
*----------------------------------------------------------------------------
*/
herr_t
@@ -2624,21 +2573,18 @@ H5FD_s3comms_signing_key(unsigned char *md, const char *secret, const char *regi
#endif
if (md == NULL)
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Destination `md` cannot be NULL.\n")
-
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Destination `md` cannot be NULL.")
if (secret == NULL)
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "`secret` cannot be NULL.\n")
-
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "`secret` cannot be NULL.")
if (region == NULL)
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "`region` cannot be NULL.\n")
-
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "`region` cannot be NULL.")
if (iso8601now == NULL)
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "`iso8601now` cannot be NULL.\n")
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "`iso8601now` cannot be NULL.")
AWS4_secret_len = 4 + HDstrlen(secret) + 1;
AWS4_secret = (char *)H5MM_malloc(sizeof(char *) * AWS4_secret_len);
if (AWS4_secret == NULL)
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Could not allocate space.\n")
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Could not allocate space.")
/* prepend "AWS4" to start of the secret key */
ret = HDsnprintf(AWS4_secret, AWS4_secret_len, "%s%s", "AWS4", secret);
@@ -2665,9 +2611,11 @@ done:
} /* end H5FD_s3comms_signing_key() */
/*----------------------------------------------------------------------------
+ *
* Function: H5FD_s3comms_tostringtosign()
*
* Purpose:
+ *
* Get AWS "String to Sign" from Canonical Request, timestamp,
* and AWS "region".
*
@@ -2686,6 +2634,7 @@ done:
* It is left to programmer to ensure `dest` has adequate space.
*
* Return:
+ *
* - SUCCESS: `SUCCEED`
* - "string to sign" written to `dest` and null-terminated
* - FAILURE: `FAIL`
@@ -2694,6 +2643,7 @@ done:
*
* Programmer: Jacob Smith
* 2017-07-??
+ *
*----------------------------------------------------------------------------
*/
herr_t
@@ -2715,20 +2665,16 @@ H5FD_s3comms_tostringtosign(char *dest, const char *req, const char *now, const
#endif
if (dest == NULL)
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "destination buffer cannot be null.\n")
-
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "destination buffer cannot be null.")
if (req == NULL)
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "canonical request cannot be null.\n")
-
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "canonical request cannot be null.")
if (now == NULL)
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Timestring cannot be NULL.\n")
-
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Timestring cannot be NULL.")
if (region == NULL)
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Region cannot be NULL.\n")
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Region cannot be NULL.")
- for (i = 0; i < 128; i++) {
+ for (i = 0; i < 128; i++)
tmp[i] = '\0';
- }
for (i = 0; i < SHA256_DIGEST_LENGTH * 2 + 1; i++) {
checksum[i] = '\0';
hexsum[i] = '\0';
@@ -2752,13 +2698,12 @@ H5FD_s3comms_tostringtosign(char *dest, const char *req, const char *now, const
SHA256((const unsigned char *)req, HDstrlen(req), checksum);
- if (H5FD_s3comms_bytes_to_hex(hexsum, (const unsigned char *)checksum, SHA256_DIGEST_LENGTH, TRUE) ==
+ if (H5FD_s3comms_bytes_to_hex(hexsum, (const unsigned char *)checksum, SHA256_DIGEST_LENGTH, true) ==
FAIL)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "could not create hex string");
- for (i = 0; i < SHA256_DIGEST_LENGTH * 2; i++) {
+ for (i = 0; i < SHA256_DIGEST_LENGTH * 2; i++)
dest[d++] = hexsum[i];
- }
dest[d] = '\0';
@@ -2767,6 +2712,7 @@ done:
} /* end H5ros3_tostringtosign() */
/*----------------------------------------------------------------------------
+ *
* Function: H5FD_s3comms_trim()
*
* Purpose:
@@ -2784,12 +2730,14 @@ done:
* is set to 0.
*
* Return:
+ *
* - SUCCESS: `SUCCEED`
* - FAILURE: `FAIL`
* - `dest == NULL`
*
* Programmer: Jacob Smith
* 2017-09-18
+ *
*----------------------------------------------------------------------------
*/
herr_t
@@ -2805,7 +2753,6 @@ H5FD_s3comms_trim(char *dest, char *s, size_t s_len, size_t *n_written)
if (dest == NULL)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "destination cannot be null.")
-
if (s == NULL)
s_len = 0;
@@ -2813,7 +2760,7 @@ H5FD_s3comms_trim(char *dest, char *s, size_t s_len, size_t *n_written)
/* Find first non-whitespace character from start;
* reduce total length per character.
*/
- while ((s_len > 0) && isspace((unsigned char)s[0]) && s_len > 0) {
+ while ((s_len > 0) && HDisspace((unsigned char)s[0]) && s_len > 0) {
s++;
s_len--;
}
@@ -2825,11 +2772,10 @@ H5FD_s3comms_trim(char *dest, char *s, size_t s_len, size_t *n_written)
if (s_len > 0) {
do {
s_len--;
- } while (isspace((unsigned char)s[s_len]));
+ } while (HDisspace((unsigned char)s[s_len]));
s_len++;
- /* write output into dest
- */
+ /* write output into dest */
HDmemcpy(dest, s, s_len);
}
}
@@ -2841,9 +2787,11 @@ done:
} /* end H5FD_s3comms_trim() */
/*----------------------------------------------------------------------------
+ *
* Function: H5FD_s3comms_uriencode()
*
* Purpose:
+ *
* URIencode (percent-encode) every byte except "[a-zA-Z0-9]-._~".
*
* For each character in source string `_s` from `s[0]` to `s[s_len-1]`,
@@ -2865,6 +2813,7 @@ done:
* `s_len == 0` will have no effect.
*
* Return:
+ *
* - SUCCESS: `SUCCEED`
* - FAILURE: `FAIL`
* - source strings `s` or destination `dest` are NULL
@@ -2872,6 +2821,7 @@ done:
*
* Programmer: Jacob Smith
* 2017-07-??
+ *
*----------------------------------------------------------------------------
*/
herr_t
@@ -2893,7 +2843,6 @@ H5FD_s3comms_uriencode(char *dest, const char *s, size_t s_len, hbool_t encode_s
if (s == NULL)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "source string cannot be NULL");
-
if (dest == NULL)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "destination cannot be NULL");
@@ -2903,10 +2852,9 @@ H5FD_s3comms_uriencode(char *dest, const char *s, size_t s_len, hbool_t encode_s
*/
for (s_off = 0; s_off < s_len; s_off++) {
c = s[s_off];
- if (isalnum(c) || c == '.' || c == '-' || c == '_' || c == '~' ||
- (c == '/' && encode_slash == FALSE)) {
+ if (HDisalnum(c) || c == '.' || c == '-' || c == '_' || c == '~' ||
+ (c == '/' && encode_slash == FALSE))
dest[dest_off++] = c;
- }
else {
hex_off = 0;
if (H5FD_s3comms_percent_encode_char(hex_buffer, (const unsigned char)c, &hex_len) == FAIL) {
@@ -2918,9 +2866,8 @@ H5FD_s3comms_uriencode(char *dest, const char *s, size_t s_len, hbool_t encode_s
hex_buffer, (int)s_off, s);
}
- for (hex_off = 0; hex_off < hex_len; hex_off++) {
+ for (hex_off = 0; hex_off < hex_len; hex_off++)
dest[dest_off++] = hex_buffer[hex_off];
- }
} /* end else (not a regular character) */
} /* end for each character */