void client_check_status(struct s_client *cl) { if (!cl || cl->kill || !cl->init_done) return; switch (cl->typ) { case 'm': case 'c': // Check clients for exceeding cmaxidle by checking cl->last if (!(cl->ncd_keepalive && (get_module(cl)->listenertype & LIS_NEWCAMD)) && cl->last && cfg.cmaxidle && (time(NULL) - cl->last) > (time_t)cfg.cmaxidle) { add_job(cl, ACTION_CLIENT_IDLE, NULL, 0); } break; case 'r': cardreader_checkhealth(cl, cl->reader); break; case 'p': { struct s_reader *rdr = cl->reader; if (!rdr || !rdr->enable || !rdr->active) //reader is disabled or restarting at this moment break; // execute reader do idle on proxy reader after a certain time (rdr->tcp_ito = inactivitytimeout) // disconnect when no keepalive available if ((rdr->tcp_ito && is_cascading_reader(rdr)) || rdr->typ == R_CCCAM) { time_t now = time(NULL); int32_t time_diff = abs(now - rdr->last_check); if (time_diff > 60 || (time_diff > 30 && rdr->typ == R_CCCAM)) { //check 1x per minute or every 30s for cccam add_job(rdr->client, ACTION_READER_IDLE, NULL, 0); rdr->last_check = now; } } break; } } }
void client_check_status(struct s_client *cl) { if(!cl || cl->kill || !cl->init_done) { return; } switch(cl->typ) { case 'm': case 'c': if((get_module(cl)->listenertype & LIS_CCCAM) && cl->last && (time(NULL) - cl->last) > (time_t)12) { add_job(cl, ACTION_CLIENT_IDLE, NULL, 0); } //Check umaxidle to avoid client is killed for inactivity, it has priority than cmaxidle if(!cl->account->umaxidle) break; // Check user for exceeding umaxidle by checking cl->last if(!(cl->ncd_keepalive && (get_module(cl)->listenertype & LIS_NEWCAMD)) && cl->account->umaxidle>0 && cl->last && (time(NULL) - cl->last) > (time_t)cl->account->umaxidle) { add_job(cl, ACTION_CLIENT_IDLE, NULL, 0); } // Check clients for exceeding cmaxidle by checking cl->last if(!(cl->ncd_keepalive && (get_module(cl)->listenertype & LIS_NEWCAMD)) && cl->last && cl->account->umaxidle==-1 && cfg.cmaxidle && (time(NULL) - cl->last) > (time_t)cfg.cmaxidle) { add_job(cl, ACTION_CLIENT_IDLE, NULL, 0); } break; case 'r': cardreader_checkhealth(cl, cl->reader); break; case 'p': { struct s_reader *rdr = cl->reader; if(!rdr || !rdr->enable || !rdr->active) //reader is disabled or restarting at this moment { break; } // execute reader do idle on proxy reader after a certain time (rdr->tcp_ito = inactivitytimeout) // disconnect when no keepalive available if((rdr->tcp_ito && is_cascading_reader(rdr)) || (rdr->typ == R_CCCAM) || (rdr->typ == R_CAMD35) || (rdr->typ == R_CS378X) || (rdr->typ == R_SCAM) || (rdr->tcp_ito != 0 && rdr->typ == R_RADEGAST)) { time_t now = time(NULL); int32_t time_diff = llabs(now - rdr->last_check); if(time_diff > 60 || (time_diff > 12 && (rdr->typ == R_CCCAM || rdr->typ == R_CAMD35 || rdr->typ == R_CS378X)) || ((time_diff > (rdr->tcp_rto?rdr->tcp_rto:60)) && rdr->typ == R_RADEGAST)) //check 1x per minute or every 10s for cccam/camd35 or reconnecttimeout radegast if 0 defaut 60s { add_job(rdr->client, ACTION_READER_IDLE, NULL, 0); rdr->last_check = now; } } break; } } }