int opal_dss_unpack_timeval(opal_buffer_t *buffer, void *dest, int32_t *num_vals, opal_data_type_t type) { int32_t i, n; int64_t tmp[2]; struct timeval *desttmp = (struct timeval *) dest, tt; int ret; OPAL_OUTPUT( ( opal_dss_verbose, "opal_dss_unpack_timeval * %d\n", (int)*num_vals ) ); /* check to see if there's enough data in buffer */ if (opal_dss_too_small(buffer, (*num_vals)*sizeof(struct timeval))) { return OPAL_ERR_UNPACK_READ_PAST_END_OF_BUFFER; } /* unpack the data */ for (i = 0; i < (*num_vals); ++i) { n=2; if (OPAL_SUCCESS != (ret = opal_dss_unpack_int64(buffer, tmp, &n, OPAL_INT64))) { return ret; } tt.tv_sec = tmp[0]; tt.tv_usec = tmp[1]; memcpy(&desttmp[i], &tt, sizeof(tt)); } return OPAL_SUCCESS; }
int opal_dss_unpack_time(opal_buffer_t *buffer, void *dest, int32_t *num_vals, opal_data_type_t type) { int32_t i, n; time_t *desttmp = (time_t *) dest, tmp; int ret; uint64_t ui64; /* time_t is a system-dependent size, so cast it * to uint64_t as a generic safe size */ OPAL_OUTPUT( ( opal_dss_verbose, "opal_dss_unpack_time * %d\n", (int)*num_vals ) ); /* check to see if there's enough data in buffer */ if (opal_dss_too_small(buffer, (*num_vals)*(sizeof(uint64_t)))) { return OPAL_ERR_UNPACK_READ_PAST_END_OF_BUFFER; } /* unpack the data */ for (i = 0; i < (*num_vals); ++i) { n=1; if (OPAL_SUCCESS != (ret = opal_dss_unpack_int64(buffer, &ui64, &n, OPAL_UINT64))) { return ret; } tmp = (time_t)ui64; memcpy(&desttmp[i], &tmp, sizeof(tmp)); } return OPAL_SUCCESS; }
int opal_dss_unpack_double(opal_buffer_t *buffer, void *dest, int32_t *num_vals, opal_data_type_t type) { int32_t i, n; double *desttmp = (double*) dest, tmp; int ret; char *convert; OPAL_OUTPUT( ( opal_dss_verbose, "opal_dss_unpack_double * %d\n", (int)*num_vals ) ); /* check to see if there's enough data in buffer */ if (opal_dss_too_small(buffer, (*num_vals)*sizeof(double))) { return OPAL_ERR_UNPACK_READ_PAST_END_OF_BUFFER; } /* unpack the data */ for (i = 0; i < (*num_vals); ++i) { n=1; if (OPAL_SUCCESS != (ret = opal_dss_unpack_string(buffer, &convert, &n, OPAL_STRING))) { return ret; } if (NULL == convert) { return OPAL_ERR_UNPACK_FAILURE; } tmp = strtod(convert, NULL); memcpy(&desttmp[i], &tmp, sizeof(tmp)); free(convert); convert = NULL; } return OPAL_SUCCESS; }
/* * BYTE, CHAR, INT8 */ int opal_dss_unpack_byte(opal_buffer_t *buffer, void *dest, int32_t *num_vals, opal_data_type_t type) { OPAL_OUTPUT( ( opal_dss_verbose, "opal_dss_unpack_byte * %d\n", (int)*num_vals ) ); /* check to see if there's enough data in buffer */ if (opal_dss_too_small(buffer, *num_vals)) { return OPAL_ERR_UNPACK_READ_PAST_END_OF_BUFFER; } /* unpack the data */ memcpy(dest, buffer->unpack_ptr, *num_vals); /* update buffer pointer */ buffer->unpack_ptr += *num_vals; return OPAL_SUCCESS; }
int opal_dss_unpack_int64(opal_buffer_t *buffer, void *dest, int32_t *num_vals, opal_data_type_t type) { int32_t i; uint64_t tmp, *desttmp = (uint64_t*) dest; OPAL_OUTPUT( ( opal_dss_verbose, "opal_dss_unpack_int64 * %d\n", (int)*num_vals ) ); /* check to see if there's enough data in buffer */ if (opal_dss_too_small(buffer, (*num_vals)*sizeof(tmp))) { return OPAL_ERR_UNPACK_READ_PAST_END_OF_BUFFER; } /* unpack the data */ for (i = 0; i < (*num_vals); ++i) { memcpy( &(tmp), buffer->unpack_ptr, sizeof(tmp) ); desttmp[i] = ntoh64(tmp); buffer->unpack_ptr += sizeof(tmp); } return OPAL_SUCCESS; }