static int prv_getMandatoryInfo(lwm2m_object_t * objectP, uint16_t instanceID, lwm2m_server_t * targetP) { lwm2m_data_t * dataP; int size; int64_t value; size = 2; dataP = lwm2m_data_new(size); if (dataP == NULL) return -1; dataP[0].id = LWM2M_SERVER_LIFETIME_ID; dataP[1].id = LWM2M_SERVER_BINDING_ID; if (objectP->readFunc(instanceID, &size, &dataP, objectP) != COAP_205_CONTENT) { lwm2m_data_free(size, dataP); return -1; } if (0 == lwm2m_data_decode_int(dataP, &value) || value < 0 || value >0xFFFFFFFF) // This is an implementation limit { lwm2m_data_free(size, dataP); return -1; } targetP->lifetime = value; targetP->binding = utils_stringToBinding(dataP[1].value.asBuffer.buffer, dataP[1].value.asBuffer.length); lwm2m_data_free(size, dataP); if (targetP->binding == BINDING_UNKNOWN) { return -1; } return 0; }
static int prv_getParameters(multi_option_t * query, char ** nameP, uint32_t * lifetimeP, char ** msisdnP, lwm2m_binding_t * bindingP) { *nameP = NULL; *lifetimeP = 0; *msisdnP = NULL; *bindingP = BINDING_UNKNOWN; while (query != NULL) { if (lwm2m_strncmp((char *)query->data, QUERY_TEMPLATE, QUERY_LENGTH) == 0) { if (*nameP != NULL) goto error; if (query->len == QUERY_LENGTH) goto error; *nameP = (char *)lwm2m_malloc(query->len - QUERY_LENGTH + 1); if (*nameP != NULL) { memcpy(*nameP, query->data + QUERY_LENGTH, query->len - QUERY_LENGTH); (*nameP)[query->len - QUERY_LENGTH] = 0; } } else if (lwm2m_strncmp((char *)query->data, QUERY_SMS, QUERY_SMS_LEN) == 0) { if (*msisdnP != NULL) goto error; if (query->len == QUERY_SMS_LEN) goto error; *msisdnP = (char *)lwm2m_malloc(query->len - QUERY_SMS_LEN + 1); if (*msisdnP != NULL) { memcpy(*msisdnP, query->data + QUERY_SMS_LEN, query->len - QUERY_SMS_LEN); (*msisdnP)[query->len - QUERY_SMS_LEN] = 0; } } else if (lwm2m_strncmp((char *)query->data, QUERY_LIFETIME, QUERY_LIFETIME_LEN) == 0) { int i; if (*lifetimeP != 0) goto error; if (query->len == QUERY_LIFETIME_LEN) goto error; for (i = QUERY_LIFETIME_LEN ; i < query->len ; i++) { if (query->data[i] < '0' || query->data[i] > '9') goto error; *lifetimeP = (*lifetimeP * 10) + (query->data[i] - '0'); } } else if (lwm2m_strncmp((char *)query->data, QUERY_VERSION, QUERY_VERSION_LEN) == 0) { if ((query->len != QUERY_VERSION_FULL_LEN) || (lwm2m_strncmp((char *)query->data, QUERY_VERSION_FULL, QUERY_VERSION_FULL_LEN) != 0)) { goto error; } } else if (lwm2m_strncmp((char *)query->data, QUERY_BINDING, QUERY_BINDING_LEN) == 0) { if (*bindingP != BINDING_UNKNOWN) goto error; if (query->len == QUERY_BINDING_LEN) goto error; *bindingP = utils_stringToBinding(query->data + QUERY_BINDING_LEN, query->len - QUERY_BINDING_LEN); } query = query->next; } return 0; error: if (*nameP != NULL) lwm2m_free(*nameP); if (*msisdnP != NULL) lwm2m_free(*msisdnP); return -1; }