rd_t * make_rd(coap_address_t *peer, coap_pdu_t *pdu) { rd_t *rd; unsigned char *data; coap_opt_iterator_t opt_iter; coap_opt_t *etag; rd = rd_new(); if (!rd) { debug("hnd_get_rd: cannot allocate storage for rd\n"); return NULL; } if (coap_get_data(pdu, &rd->data.length, &data)) { rd->data.s = (unsigned char *)coap_malloc(rd->data.length); if (!rd->data.s) { debug("hnd_get_rd: cannot allocate storage for rd->data\n"); rd_delete(rd); return NULL; } memcpy(rd->data.s, data, rd->data.length); } etag = coap_check_option(pdu, COAP_OPTION_ETAG, &opt_iter); if (etag) { rd->etag_len = min(COAP_OPT_LENGTH(etag), sizeof(rd->etag)); memcpy(rd->etag, COAP_OPT_VALUE(etag), rd->etag_len); } return rd; }
void hnd_delete_resource(coap_context_t *ctx, struct coap_resource_t *resource, coap_address_t *peer, coap_pdu_t *request, str *token, coap_pdu_t *response, void *userdata) { rd_t *rd = NULL; HASH_FIND(hh, resources, resource->key, sizeof(coap_key_t), rd); if (rd) { HASH_DELETE(hh, resources, rd); rd_delete(rd); } /* FIXME: link attributes for resource have been created dynamically * using coap_malloc() and must be released. */ coap_delete_resource(ctx, resource->key); response->hdr->code = COAP_RESPONSE_CODE(202); }
static void kp_destroy(mdb_tgt_t *t) { kp_data_t *kp = t->t_data; kp_map_t *kpm, *nkpm; kp_file_t *kpf, *nkpf; if (kp->kp_rap != NULL) rd_delete(kp->kp_rap); for (kpm = kp->kp_map_head; kpm != NULL; kpm = nkpm) { nkpm = kpm->kpm_next; mdb_free(kpm, sizeof (kp_map_t)); } for (kpf = kp->kp_file_head; kpf != NULL; kpf = nkpf) { nkpf = kpf->kpf_next; kp_file_destroy(kpf); } mdb_free(kp->kp_auxv, kp->kp_nauxv * sizeof (auxv_t)); mdb_free(kp, sizeof (kp_data_t)); }