1 #define MODULE_LOG_PREFIX "constcw"
3 //FIXME Not checked on threadsafety yet; after checking please remove this line
6 #include "oscam-client.h"
9 #include "oscam-string.h"
11 static int32_t pserver
;
13 int32_t constcw_file_available(void)
17 fp
= fopen(cur_client()->reader
->device
, "r");
20 cs_log("ERROR: Can't open %s (errno=%d %s)", cur_client()->reader
->device
, errno
, strerror(errno
));
27 int32_t constcw_analyse_file(uint16_t c_caid
, uint32_t c_prid
, uint16_t c_sid
, uint16_t c_pmtpid
, uint32_t c_vpid
, uint16_t c_ecmpid
, uint8_t *dcw
)
29 //CAID:PROVIDER:SID:PMTPID:ECMPID:VPID:XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX
32 uint32_t caid
, provid
, sid
, vpid
, pmtpid
, ecmpid
;
35 fp
= fopen(cur_client()->reader
->device
, "r");
38 cs_log("ERROR: Can't open %s (errno=%d %s)", cur_client()->reader
->device
, errno
, strerror(errno
));
42 cs_log("Searching CW for CAID %04X PROVID %06X SRVID %04X ECMPID %04X PMTPID %04X VPID %04X", c_caid
, c_prid
, c_sid
, c_ecmpid
, c_pmtpid
, c_vpid
);
44 while(fgets(token
, sizeof(token
), fp
))
46 if(token
[0] == '#') { continue; }
48 int ret
= sscanf(token
, "%4x:%6x:%4x:%4x:%4x::%2x %2x %2x %2x %2x %2x %2x %2x %2x %2x %2x %2x %2x %2x %2x %2x", &caid
, &provid
, &sid
, &pmtpid
, &ecmpid
,
49 &cw
[0], &cw
[1], &cw
[2], &cw
[3], &cw
[4], &cw
[5], &cw
[6], &cw
[7],
50 &cw
[8], &cw
[9], &cw
[10], &cw
[11], &cw
[12], &cw
[13], &cw
[14], &cw
[15]);
53 ret
= sscanf(token
, "%4x:%6x:%4x:%4x:%4x:%4x:%2x %2x %2x %2x %2x %2x %2x %2x %2x %2x %2x %2x %2x %2x %2x %2x", &caid
, &provid
, &sid
, &pmtpid
, &ecmpid
, &vpid
,
54 &cw
[0], &cw
[1], &cw
[2], &cw
[3], &cw
[4], &cw
[5], &cw
[6], &cw
[7],
55 &cw
[8], &cw
[9], &cw
[10], &cw
[11], &cw
[12], &cw
[13], &cw
[14], &cw
[15]);
56 if(ret
!= 22) continue;
59 //cs_log("Line found: %s", token);
60 if(c_caid
== caid
&& c_sid
== sid
&& (!provid
|| provid
== c_prid
) && (!pmtpid
|| !c_pmtpid
|| pmtpid
== c_pmtpid
) && (!vpid
|| !c_vpid
|| vpid
== c_vpid
)
61 && (!ecmpid
|| !c_ecmpid
|| ecmpid
== c_ecmpid
))
65 for(i
= 0; i
< 16; ++i
)
66 { dcw
[i
] = (uint8_t) cw
[i
]; }
67 cs_log("Entry found: %04X@%06X:%04X:%04X:%04X:%04X:%s", caid
, provid
, sid
, pmtpid
, ecmpid
, vpid
, cs_hexdump(1, dcw
, 16, token
, sizeof(token
)));
75 //************************************************************************************************************************
76 //* client/server common functions
77 //************************************************************************************************************************
78 static int32_t constcw_recv(struct s_client
*client
, uint8_t *buf
, int32_t l
)
82 if(!client
->udp_fd
) { return (-9); }
83 ret
= read(client
->udp_fd
, buf
, l
);
84 if(ret
< 1) { return (-1); }
85 client
->last
= time(NULL
);
89 //************************************************************************************************************************
91 //************************************************************************************************************************
92 int32_t constcw_client_init(struct s_client
*client
)
97 if(socketpair(PF_LOCAL
, SOCK_STREAM
, 0, fdp
))
99 cs_log("ERROR: Socket creation failed: %s", strerror(errno
));
102 client
->udp_fd
= fdp
[0];
105 memset((char *) &client
->udp_sa
, 0, sizeof(client
->udp_sa
));
106 SIN_GET_FAMILY(client
->udp_sa
) = AF_INET
;
108 // Oscam has no reader.au in s_reader like ki's mpcs ;)
109 // reader[ridx].au = 0;
110 // cs_log("local reader: %s (file: %s) constant cw au=0", reader[ridx].label, reader[ridx].device);
111 cs_log("Local reader: %s (file: %s)", client
->reader
->label
, client
->reader
->device
);
113 client
->pfd
= client
->udp_fd
;
115 if(constcw_file_available())
117 client
->reader
->tcp_connected
= 2;
118 client
->reader
->card_status
= CARD_INSERTED
;
124 static int32_t constcw_send_ecm(struct s_client
*client
, ECM_REQUEST
*er
)
127 struct s_reader
*rdr
= client
->reader
;
131 // Check if DCW exist in the files
132 //cs_log("Searching ConstCW for ECM: %04X@%06X:%04X (%d)", er->caid, er->prid, er->srvid, er->l);
134 if(constcw_analyse_file(er
->caid
, er
->prid
, er
->srvid
, er
->pmtpid
, er
->vpid
, er
->pid
, cw
) == 0)
136 write_ecm_answer(rdr
, er
, E_NOTFOUND
, (E1_READER
<< 4 | E2_SID
), NULL
, NULL
, 0, NULL
);
140 write_ecm_answer(rdr
, er
, E_FOUND
, 0, cw
, NULL
, 0, NULL
);
148 static int32_t constcw_recv_chk(struct s_client
*UNUSED(client
), uint8_t *UNUSED(dcw
), int32_t *rc
, uint8_t *UNUSED(buf
), int32_t UNUSED(n
))
158 void module_constcw(struct s_module
*ph
)
160 ph
->desc
= "constcw";
161 ph
->type
= MOD_NO_CONN
;
162 ph
->listenertype
= LIS_CONSTCW
;
163 ph
->recv
= constcw_recv
;
165 ph
->c_init
= constcw_client_init
;
166 ph
->c_recv_chk
= constcw_recv_chk
;
167 ph
->c_send_ecm
= constcw_send_ecm
;