void NBS_pollDetach(NBS self) { if (self->pm == NULL) return; PollMgr_detach(self->pm, self->sockR, &NBS_pollCb, self); if (self->sockR != self->sockW) { PollMgr_detach(self->pm, self->sockW, &NBS_pollCb, self); } self->pm = NULL; }
void CcnLAC_dtor(CcnLAC self) { if (self->pm != NULL) PollMgr_detach(self->pm, ccn_get_connection_fd(self->ccnh), &CcnLAC_initPollCb, self); if (self->nbs != NULL) NBS_pollDetach(self->nbs); ccn_destroy(&(self->ccnh)); if (self->ccnbor != NULL) CcnbOR_dtor(self->ccnbor); free(self); }
void CcnLAC_initPollCb(void* pself, PollMgrEvt evt, struct pollfd* fd) { CcnLAC self = (CcnLAC)pself; switch (evt) { case PollMgrEvt_prepare: CcnH_pollPrepare(self->ccnh, fd); break; case PollMgrEvt_result: CcnH_pollRun(self->ccnh, fd); break; case PollMgrEvt_error: self->error = true; PollMgr_detach(self->pm, ccn_get_connection_fd(self->ccnh), &CcnLAC_initPollCb, self); break; } }
enum ccn_upcall_res CcnLAC_fetchFaceidCb(struct ccn_closure* selfp, enum ccn_upcall_kind kind, struct ccn_upcall_info* info) { CcnLAC self = (CcnLAC)selfp->data; switch (kind) { case CCN_UPCALL_FINAL: { free(selfp); return CCN_UPCALL_RESULT_OK; } case CCN_UPCALL_INTEREST_TIMED_OUT: { return CCN_UPCALL_RESULT_REEXPRESS; } case CCN_UPCALL_CONTENT_UNVERIFIED: case CCN_UPCALL_CONTENT_KEYMISSING: case CCN_UPCALL_CONTENT_RAW: case CCN_UPCALL_CONTENT: { struct ccn_forwarding_entry* fe = NULL; const unsigned char* fe_ccnb = NULL; size_t fe_ccnb_size = 0; int res = ccn_content_get_value(info->content_ccnb, info->pco->offset[CCN_PCO_E], info->pco, &fe_ccnb, &fe_ccnb_size); if (res == 0) fe = ccn_forwarding_entry_parse(fe_ccnb, fe_ccnb_size); if (fe != NULL) { self->faceid = fe->faceid; ccn_forwarding_entry_destroy(&fe); } else { self->error = true; } PollMgr_detach(self->pm, ccn_get_connection_fd(self->ccnh), &CcnLAC_initPollCb, self); void* emptyPDU = malloc(CCN_EMPTY_PDU_LENGTH); memcpy(emptyPDU, CCN_EMPTY_PDU, CCN_EMPTY_PDU_LENGTH); NBS_write(self->nbs, emptyPDU, 0, CCN_EMPTY_PDU_LENGTH, NULL); NBS_pollAttach(self->nbs, self->pm); return CCN_UPCALL_RESULT_OK; } default: { return CCN_UPCALL_RESULT_ERR; } } }
void CcnCC_pollDetach(CcnCC self, PollMgr pm) { PollMgr_detach(pm, ccn_get_connection_fd(self->ccnh), &CcnCC_pollCb, self); }