/* * unpack all xtlv records from the issue a callback * to set function one call per found tlv record */ int bcm_unpack_xtlv_buf(void *ctx, void *tlv_buf, uint16 buflen, bcm_set_var_from_tlv_cbfn_t *cbfn) { uint16 len; uint16 type; int res = 0; bcm_xtlv_t *ptlv = tlv_buf; int sbuflen = buflen; ASSERT(ptlv); ASSERT(cbfn); while (sbuflen >= 0) { ptlv = tlv_buf; /* tlv header is always packed in LE order */ len = ltoh16(ptlv->len); if (len == 0) /* can't be zero */ break; type = ltoh16(ptlv->id); sbuflen -= (BCM_XTLV_HDR_SIZE + len); /* check for possible buffer overrun */ if (sbuflen < 0) break; if ((res = cbfn(ctx, &tlv_buf, type, len)) != BCME_OK) break; } return res; }
void subscr_get_channel(struct gsm_subscriber *subscr, int type, gsm_cbfn *cbfn, void *param) { struct subscr_request *request; request = talloc(tall_sub_req_ctx, struct subscr_request); if (!request) { if (cbfn) cbfn(GSM_HOOK_RR_PAGING, GSM_PAGING_OOM, NULL, NULL, param); return; } memset(request, 0, sizeof(*request)); request->subscr = subscr_get(subscr); request->channel_type = type; request->cbfn = cbfn; request->param = param; /* * FIXME: We might be able to assign more than one * channel, e.g. voice and SMS submit at the same * time. */ if (!subscr->in_callback && llist_empty(&subscr->requests)) { /* add to the list, send a request */ llist_add_tail(&request->entry, &subscr->requests); subscr_send_paging_request(subscr); } else { /* this will be picked up later, from subscr_put_channel */ llist_add_tail(&request->entry, &subscr->requests); } }
void CarveWalkBlocks( carve_t cv, void (*cbfn)(carve_t, void *, void *), void *cookie ) /*************************************************************************************/ { blk_t * block; for( block = cv->blk_list; block != NULL; block = block->next ) { cbfn( cv, block, cookie ); } }
/*---------------------------------------------------------------------------- * rumavl_foreach - loop through entire tree, using temporary iterator *--------------------------------------------------------------------------*/ extern int rumavl_foreach (RUMAVL *tree, int dir, int (*cbfn)(RUMAVL *, void *, void *), void *udata) { RUMAVL_NODE *node; int retv; void *record; if (cbfn == NULL) return RUMAVL_ERR_INVAL; retv = RUMAVL_ERR_NOENT; node = NULL; while ((node = rumavl_node_next(tree, node, dir, &record)) != NULL){ if ((retv = cbfn(tree, record, udata)) != 0) break; } return retv; }