static void *arm_led_thread_main(void *UNUSED(thread_data)) { uint8_t running = 1; while (running) { LL_ITER iter = ll_iter_create(arm_led_actions); struct s_arm_led *arm_led; while ((arm_led = ll_iter_next(&iter))) { int32_t led, action; time_t now, start; led = arm_led->led; action = arm_led->action; now = time((time_t)0); start = arm_led->start_time; ll_iter_remove_data(&iter); if (action == LED_STOP_THREAD) { running = 0; break; } if (now - start < ARM_LED_TIMEOUT) { arm_switch_led_from_thread(led, action); } } if (running) { sleep(60); } } ll_clear_data(arm_led_actions); pthread_exit(NULL); return NULL; }
int32_t dvbapi_edit_channel_cache(int32_t demux_id, int32_t pidindex, uint8_t add) { struct s_ecmpids *p = &demux[demux_id].ECMpids[pidindex]; struct s_channel_cache *c; LL_ITER it; int32_t count = 0; if(!channel_cache) { channel_cache = ll_create("channel cache"); } it = ll_iter_create(channel_cache); while((c = ll_iter_next(&it))) { if(demux[demux_id].program_number == c->srvid && p->CAID == c->caid && p->ECM_PID == c->pid && (p->PROVID == c->prid || p->PROVID == 0)) { if(add && p->CHID == c->chid) { return 0; //already added } ll_iter_remove_data(&it); count++; } } if(add) { if(!cs_malloc(&c, sizeof(struct s_channel_cache))) { return count; } c->srvid = demux[demux_id].program_number; c->caid = p->CAID; c->pid = p->ECM_PID; c->prid = p->PROVID; c->chid = p->CHID; ll_append(channel_cache, c); #ifdef WITH_DEBUG char buf[ECM_FMT_LEN]; ecmfmt(c->caid, 0, c->prid, c->chid, c->pid, c->srvid, 0, 0, 0, 0, buf, ECM_FMT_LEN, 0, 0); cs_debug_mask(D_DVBAPI, "[DVBAPI] added to channel cache: %s", buf); #endif count++; } return count; }
static int32_t remove_filter(S_COOL_FILTER *filter_handle) { if(ll_count(ll_cool_filter) > 0) { LL_ITER itr = ll_iter_create(ll_cool_filter); S_COOL_FILTER *filter_item; while((filter_item = ll_iter_next(&itr))) { if(filter_item == filter_handle) { ll_iter_remove_data(&itr); return 0; } } } return -1; }
void gbox_add_good_card(struct s_client *cl, uint16_t id_card, uint16_t caid, uint32_t prov, uint16_t sid_ok) { struct gbox_peer *peer = cl->gbox; struct gbox_card *card = NULL; struct gbox_srvid *srvid = NULL; LL_ITER it = ll_iter_create(peer->gbox.cards); while((card = ll_iter_next(&it))) { if(card->peer_id == id_card && card->caid == caid && card->provid == prov) { cl->reader->currenthops = card->dist; LL_ITER it2 = ll_iter_create(card->goodsids); while((srvid = ll_iter_next(&it2))) { if(srvid->sid == sid_ok) { return; // sid_ok is already in the list of goodsids } } LL_ITER it3 = ll_iter_create(card->badsids); while((srvid = ll_iter_next(&it3))) { if(srvid->sid == sid_ok) { ll_iter_remove_data(&it3); // remove sid_ok from badsids break; } } if(!cs_malloc(&srvid, sizeof(struct gbox_srvid))) { return; } srvid->sid = sid_ok; srvid->peer_idcard = id_card; srvid->provid_id = card->provid; cs_debug_mask(D_READER, "GBOX Adding good SID: %04X for CAID: %04X Provider: %04X on CardID: %04X\n", sid_ok, caid, card->provid, id_card); ll_append(card->goodsids, srvid); break; } }//end of ll_iter_next //return dist_c; }
static int32_t remove_chanhandle(S_COOL_CHANHANDLE *handle) { // Find matching channel, if it exists. if(ll_count(ll_cool_chanhandle) > 0) { LL_ITER itr = ll_iter_create(ll_cool_chanhandle); S_COOL_CHANHANDLE *handle_item; while((handle_item = ll_iter_next(&itr))) { if(handle_item == handle) { ll_iter_remove_data(&itr); return 0; } } } return -1; }
int32_t coolapi_remove_filter (int32_t fd, int32_t num) { dmx_t * dmx = find_demux(fd, 0); if(!dmx) { cs_debug_mask(D_DVBAPI, "dmx is NULL!"); return -1; } if(dmx->pid <= 0) return -1; int32_t result, filter_on_channel=0; cs_debug_mask(D_DVBAPI, "removing filter fd=%08x num=%d pid=%04x on channel=%x", fd, num, dmx->pid, (int32_t) dmx->channel); pthread_mutex_lock(&dmx->mutex); if(dmx->filter) { result = cnxt_dmx_channel_detach_filter(dmx->channel, dmx->filter); coolapi_check_error("cnxt_dmx_channel_detach_filter", result); result = cnxt_dmx_close_filter(dmx->filter); coolapi_check_error("cnxt_dmx_close_filter", result); dmx->filter = NULL; result = cnxt_dmx_channel_ctrl(dmx->channel, 0, 0); coolapi_check_error("cnxt_dmx_channel_ctrl", result); } LL_ITER itr = ll_iter_create(ll_cool_filter); S_COOL_FILTER *filter_item; while ((filter_item=ll_iter_next(&itr))) { if (filter_item->channel == (int32_t) dmx->channel) filter_on_channel++; if (filter_item->fd == fd) { ll_iter_remove_data(&itr); filter_on_channel--; } } if (!filter_on_channel) { cs_debug_mask(D_DVBAPI, "closing channel %x", (int32_t) dmx->channel); itr = ll_iter_create(ll_cool_chanhandle); S_COOL_CHANHANDLE *handle_item; while ((handle_item=ll_iter_next(&itr))) { if (handle_item->demux_index == dmx->demux_index && handle_item->pid == dmx->pid) { dmx->buffer1=handle_item->buffer1; dmx->buffer2=handle_item->buffer2; ll_iter_remove_data(&itr); break; } } if (!dmx->buffer1 || !dmx->buffer2) cs_debug_mask(D_DVBAPI, "WARNING: buffer handle not found!"); result = cnxt_dmx_channel_ctrl(dmx->channel, 0, 0); coolapi_check_error("cnxt_dmx_channel_ctrl", result); result = cnxt_dmx_set_channel_pid(dmx->channel, 0x1FFF); coolapi_check_error("cnxt_dmx_set_channel_pid", result); result = cnxt_cbuf_flush (dmx->buffer1, 0); coolapi_check_error("cnxt_cbuf_flush", result); result = cnxt_cbuf_flush (dmx->buffer2, 0); coolapi_check_error("cnxt_cbuf_flush", result); result = cnxt_cbuf_detach(dmx->buffer2, 2, dmx->channel); coolapi_check_error("cnxt_cbuf_detach", result); result = cnxt_dmx_channel_detach(dmx->channel, 0xB, 0, dmx->buffer1); coolapi_check_error("cnxt_dmx_channel_detach", result); result = cnxt_dmx_channel_close(dmx->channel); coolapi_check_error("cnxt_dmx_channel_close", result); result = cnxt_cbuf_close(dmx->buffer2); coolapi_check_error("cnxt_cbuf_close", result); result = cnxt_cbuf_close(dmx->buffer1); coolapi_check_error("cnxt_cbuf_close", result); } if (filter_on_channel) { result = cnxt_dmx_channel_ctrl(dmx->channel, 2, 0); coolapi_check_error("cnxt_dmx_channel_ctrl", result); } pthread_mutex_unlock(&dmx->mutex); dmx->pid = -1; return 0; }
static int32_t cs_check_v(IN_ADDR_T ip, int32_t port, int32_t add, char *info, int32_t acosc_penalty_duration) { int32_t result = 0; bool acosc_enabled = false; #ifdef CS_ANTICASC if(cfg.acosc_enabled) acosc_enabled = true; #endif if(!(cfg.failbantime || acosc_enabled)) { return 0; } if(!cfg.v_list) { cfg.v_list = ll_create("v_list"); } struct timeb (now); cs_ftime(&now); LL_ITER itr = ll_iter_create(cfg.v_list); V_BAN *v_ban_entry; int32_t ftime = cfg.failbantime * 60 * 1000; //run over all banned entries to do housekeeping: while((v_ban_entry = ll_iter_next(&itr))) { // housekeeping: int32_t gone = comp_timeb(&now, &v_ban_entry->v_time); if(((gone >= ftime) && !v_ban_entry->acosc_entry) || (v_ban_entry->acosc_entry && ((gone/1000) >= v_ban_entry->acosc_penalty_dur))) // entry out of time->remove { NULLFREE(v_ban_entry->info); ll_iter_remove_data(&itr); continue; } if(IP_EQUAL(ip, v_ban_entry->v_ip) && port == v_ban_entry->v_port) { result = 1; if(!info) { info = v_ban_entry->info; } else if(!v_ban_entry->info) { v_ban_entry->info = cs_strdup(info); } if(!add) { if(v_ban_entry->v_count >= cfg.failbancount) { if(!v_ban_entry->acosc_entry) { cs_debug_mask(D_TRACE, "failban: banned ip %s:%d - %d seconds left%s%s", cs_inet_ntoa(v_ban_entry->v_ip), v_ban_entry->v_port, (ftime - gone)/1000, info ? ", info: " : "", info ? info : ""); } else { cs_debug_mask(D_TRACE, "failban: banned ip %s:%d - %d seconds left%s%s", cs_inet_ntoa(v_ban_entry->v_ip), v_ban_entry->v_port, (v_ban_entry->acosc_penalty_dur - (gone/1000)), info?", info: ":"", info?info:""); } } else { cs_debug_mask(D_TRACE, "failban: ip %s:%d chance %d of %d%s%s", cs_inet_ntoa(v_ban_entry->v_ip), v_ban_entry->v_port, v_ban_entry->v_count, cfg.failbancount, info ? ", info: " : "", info ? info : ""); v_ban_entry->v_count++; } } else { cs_debug_mask(D_TRACE, "failban: banned ip %s:%d - already exist in list%s%s", cs_inet_ntoa(v_ban_entry->v_ip), v_ban_entry->v_port, info ? ", info: " : "", info ? info : ""); } } } if(add && !result) { if(cs_malloc(&v_ban_entry, sizeof(V_BAN))) { cs_ftime(&v_ban_entry->v_time); v_ban_entry->v_ip = ip; v_ban_entry->v_port = port; v_ban_entry->v_count = 1; v_ban_entry->acosc_entry = false; v_ban_entry->acosc_penalty_dur = 0; if(acosc_penalty_duration > 0) { v_ban_entry->v_count = cfg.failbancount +1; // set it to a higher level v_ban_entry->acosc_entry = true; v_ban_entry->acosc_penalty_dur = acosc_penalty_duration; } if(info) { v_ban_entry->info = cs_strdup(info); } ll_iter_insert(&itr, v_ban_entry); cs_debug_mask(D_TRACE, "failban: ban ip %s:%d with timestamp %ld%s%s", cs_inet_ntoa(v_ban_entry->v_ip), v_ban_entry->v_port, v_ban_entry->v_time.time, info ? ", info: " : "", info ? info : ""); } } return result; }