static int32_t oscam_ser_send_ecm(struct s_client *client, ECM_REQUEST *er, uchar *buf) { char *tmp; switch(client->serialdata->oscam_ser_proto) { case P_HSIC: memset(buf, 0, 12); buf[0] = 2; i2b_buf(2, er->caid, buf + 1); i2b_buf(3, er->prid, buf + 3); i2b_buf(2, er->pid, buf + 6); i2b_buf(2, er->srvid, buf + 10); memcpy(buf + 12, er->ecm, er->ecmlen); oscam_ser_send(client, buf, 12 + er->ecmlen); break; case P_BOMBA: oscam_ser_send(client, er->ecm, er->ecmlen); break; case P_DSR95: if(cs_malloc(&tmp, er->ecmlen * 2 + 1)) { if(client->serialdata->dsr9500type == P_DSR_WITHSID) { snprintf((char *)buf, 512, "%c%08X%04X%s%04X\n\r", 3, er->prid, er->caid, cs_hexdump(0, er->ecm, er->ecmlen, tmp, er->ecmlen * 2 + 1), er->srvid); oscam_ser_send(client, buf, (er->ecmlen << 1) + 19); // 1 + 8 + 4 + l*2 + 4 + 2 } else { snprintf((char *)buf, 512, "%c%08X%04X%s\n\r", 3, er->prid, er->caid, cs_hexdump(0, er->ecm, er->ecmlen, tmp, er->ecmlen * 2 + 1)); oscam_ser_send(client, buf, (er->ecmlen << 1) + 15); // 1 + 8 + 4 + l*2 + 2 } free(tmp); } break; case P_ALPHA: buf[0] = 0x80; i2b_buf(2, 2 + er->ecmlen, buf + 1); i2b_buf(2, er->caid, buf + 3); memcpy(buf + 5, er->ecm, er->ecmlen); oscam_ser_send(client, buf, oscam_ser_alpha_convert(buf, 5 + er->ecmlen)); break; } return (0); }
static int32_t oscam_ser_check_ecm(ECM_REQUEST *er, uchar *buf, int32_t l) { int32_t i; struct s_serial_client *serialdata = cur_client()->serialdata; if (l<16) { cs_log(incomplete, l); return(1); } switch(serialdata->connected) { case P_HSIC: er->ecmlen = l-12; er->caid = b2i(2, buf+1 ); er->prid = b2i(3, buf+3 ); er->pid = b2i(2, buf+6 ); er->srvid= b2i(2, buf+10); memcpy(er->ecm, buf+12, er->ecmlen); break; case P_SSSP: er->pid=b2i(2, buf+3); for (i=0; (i<8) && (serialdata->sssp_tab[i].pid!=er->pid); i++); if (i>=serialdata->sssp_num) { cs_debug_mask(D_CLIENT, "illegal request, unknown pid=%04X", er->pid); return(2); } er->ecmlen = l-5; er->srvid= serialdata->sssp_srvid; er->caid = serialdata->sssp_tab[i].caid; er->prid = serialdata->sssp_tab[i].prid; memcpy(er->ecm, buf+5, er->ecmlen); break; case P_BOMBA: er->ecmlen = l; memcpy(er->ecm, buf, er->ecmlen); break; case P_DSR95: buf[l]='\0'; // prepare for trim trim((char *)buf+13); // strip spc, nl, cr ... er->ecmlen = strlen((char *)buf+13)>>1; er->prid=cs_atoi((char *)buf+3, 3, 0); // ignore errors er->caid=cs_atoi((char *)buf+9, 2, 0); // ignore errors if (cs_atob(er->ecm, (char *)buf+13, er->ecmlen)<0) { cs_log("illegal characters in ecm-request"); return(1); } if( serialdata->dsr9500type==P_DSR_WITHSID ) { er->ecmlen -= 2; er->srvid=cs_atoi((char *)buf+13+(er->ecmlen << 1), 2, 0); } break; case P_GS: er->ecmlen = ((buf[3]<<8)|buf[2]) - 6; er->srvid = (buf[5]<<8)|buf[4]; // sid er->caid = (buf[7]<<8)|buf[6]; er->prid = 0; if (er->ecmlen > 256) er->ecmlen = 256; memcpy(er->ecm, buf+10, er->ecmlen); break; case P_ALPHA: l=oscam_ser_alpha_convert(buf, l); er->ecmlen= b2i(2, buf+1 )-2; er->caid = b2i(2, buf+3 ); if ((er->ecmlen!=l-5) || (er->ecmlen>257)) { cs_log(incomplete, l); return(1); } memcpy(er->ecm, buf+5, er->ecmlen); break; case P_GBOX: er->srvid = b2i(2, buf+serialdata->gbox_lens.cat_len+3+3); er->ecmlen = serialdata->gbox_lens.ecm_len+3; memcpy(er->ecm, buf+serialdata->gbox_lens.cat_len+3+serialdata->gbox_lens.pmt_len+3, er->ecmlen); break; } return(0); }