3 static int chk_srvid_match(ECM_REQUEST
*er
, SIDTAB
*sidtab
)
10 for (i
=0; (i
<sidtab
->num_caid
) && (!(rc
&1)); i
++)
11 if (er
->caid
==sidtab
->caid
[i
]) rc
|=1;
13 if (!sidtab
->num_provid
)
16 for (i
=0; (i
<sidtab
->num_provid
) && (!(rc
&2)); i
++)
17 if (er
->prid
==sidtab
->provid
[i
]) rc
|=2;
19 if (!sidtab
->num_srvid
)
22 for (i
=0; (i
<sidtab
->num_srvid
) && (!(rc
&4)); i
++)
23 if (er
->srvid
==sidtab
->srvid
[i
]) rc
|=4;
28 int chk_srvid(ECM_REQUEST
*er
, int idx
)
34 if (!client
[idx
].sidtabok
)
36 if (!client
[idx
].sidtabno
) return(1);
39 for (nr
=0, sidtab
=cfg
->sidtab
; sidtab
; sidtab
=sidtab
->next
, nr
++)
40 if (sidtab
->num_caid
| sidtab
->num_provid
| sidtab
->num_srvid
)
42 if ((client
[idx
].sidtabno
&(1<<nr
)) &&
43 (chk_srvid_match(er
, sidtab
)))
45 if ((client
[idx
].sidtabok
&(1<<nr
)) &&
46 (chk_srvid_match(er
, sidtab
)))
52 // server filter for newcamd
53 int chk_sfilter(ECM_REQUEST
*er
, PTAB
*ptab
)
63 pi
= client
[cs_idx
].port_idx
;
65 if (ptab
->nports
&& ptab
->ports
[pi
].ftab
.nfilts
)
67 for( rc
=j
=0; (!rc
) && (j
<ptab
->ports
[pi
].ftab
.nfilts
); j
++ )
69 scaid
= ptab
->ports
[pi
].ftab
.filts
[j
].caid
;
70 if (caid
==0||(caid
!=0 && caid
==scaid
))
72 for( i
=0; (!rc
) && i
<ptab
->ports
[pi
].ftab
.filts
[j
].nprids
; i
++ )
74 sprid
=ptab
->ports
[pi
].ftab
.filts
[j
].prids
[i
];
75 cs_debug("trying server filter %04X:%06X", scaid
, sprid
);
79 cs_debug("%04X:%06X allowed by server filter %04X:%06X",
80 caid
, prid
, scaid
, sprid
);
87 cs_debug("no match, %04X:%06X rejected by server filters", caid
, prid
);
88 if (!er
->rcEx
) er
->rcEx
=(E1_LSERVER
<<4)|E2_IDENT
;
95 static int chk_chid(ECM_REQUEST
*er
, FTAB
*fchid
, char *type
, char *name
)
99 if( (er
->caid
& 0xFF00)!=0x600 ) return 1;
100 if( !er
->chid
) return 1;
101 if( !fchid
->nfilts
) return 1;
103 for( i
=rc
=0; (!rc
) && i
<fchid
->nfilts
; i
++ )
104 if( er
->caid
== fchid
->filts
[i
].caid
)
105 for( j
=0; (!rc
) && j
<fchid
->filts
[i
].nprids
; j
++ )
107 cs_debug("trying %s '%s' CHID filter %04X:%04X",
108 type
, name
, fchid
->filts
[i
].caid
, fchid
->filts
[i
].prids
[j
]);
109 if( er
->chid
== fchid
->filts
[i
].prids
[j
] )
111 cs_debug("%04X:%04X allowed by %s '%s' CHID filter %04X:%04X",
112 er
->caid
, er
->chid
, type
, name
, fchid
->filts
[i
].caid
,
113 fchid
->filts
[i
].prids
[j
]);
118 if( !rc
) cs_debug("no match, %04X:%04X rejected by %s '%s' CHID filter(s)",
119 er
->caid
, er
->chid
, type
, name
);
124 int chk_ufilters(ECM_REQUEST
*er
)
131 if( client
[cs_idx
].ftab
.nfilts
)
133 FTAB
*f
= &client
[cs_idx
].ftab
;
134 for( i
=rc
=0; (!rc
) && (i
<f
->nfilts
); i
++ )
136 ucaid
= f
->filts
[i
].caid
;
137 if( er
->caid
==0 || ucaid
==0 || (er
->caid
!=0 && er
->caid
==ucaid
) )
139 for( j
=rc
=0; (!rc
) && (j
<f
->filts
[i
].nprids
); j
++ )
141 uprid
= f
->filts
[i
].prids
[j
];
142 cs_debug("trying user '%s' filter %04X:%06X",
143 client
[cs_idx
].usr
, ucaid
, uprid
);
144 if( er
->prid
== uprid
)
147 cs_debug("%04X:%06X allowed by user '%s' filter %04X:%06X",
148 er
->caid
, er
->prid
, client
[cs_idx
].usr
, ucaid
, uprid
);
154 cs_debug("no match, %04X:%06X rejected by user '%s' filters",
155 er
->caid
, er
->prid
, client
[cs_idx
].usr
);
156 if( !er
->rcEx
) er
->rcEx
=(E1_USER
<<4)|E2_IDENT
;
161 if( !(rc
=chk_class(er
, &client
[cs_idx
].cltab
, "user", client
[cs_idx
].usr
)) )
162 if( !er
->rcEx
) er
->rcEx
=(E1_USER
<<4)|E2_CLASS
;
163 else if( !(rc
=chk_chid(er
, &client
[cs_idx
].fchid
, "user", client
[cs_idx
].usr
)) )
164 if( !er
->rcEx
) er
->rcEx
=(E1_USER
<<4)|E2_CHID
;
171 int chk_rsfilter(ECM_REQUEST
*er
, int disable_server_filt
)
177 if( disable_server_filt
)
179 cs_debug("%04X:%06X allowed - server filters disabled",
185 caid
= reader
[ridx
].caid
[0];
188 for( i
=0; (!rc
) && (i
<reader
[ridx
].nprov
); i
++ )
190 prid
= (ulong
)((reader
[ridx
].prid
[i
][0]<<16) |
191 (reader
[ridx
].prid
[i
][1]<<8) |
192 (reader
[ridx
].prid
[i
][2]));
193 cs_debug("trying server '%s' filter %04X:%06X",
194 reader
[ridx
].device
, caid
, prid
);
198 cs_debug("%04X:%06X allowed by server '%s' filter %04X:%06X",
199 er
->caid
, er
->prid
, reader
[ridx
].device
, caid
, prid
);
204 cs_debug("no match, %04X:%06X rejected by server '%s' filters",
205 er
->caid
, er
->prid
, reader
[ridx
].device
);
206 if( !er
->rcEx
) er
->rcEx
=(E1_SERVER
<<4)|E2_IDENT
;
213 int chk_rfilter(ECM_REQUEST
*er
, struct s_reader
*rdr
)
219 if( rdr
->ftab
.nfilts
)
221 for( rc
=i
=0; (!rc
) && (i
<rdr
->ftab
.nfilts
); i
++ )
223 caid
= rdr
->ftab
.filts
[i
].caid
;
224 if( (caid
!=0 && caid
==er
->caid
) || caid
==0 )
226 for( j
=0; (!rc
) && (j
<rdr
->ftab
.filts
[i
].nprids
); j
++)
228 prid
= rdr
->ftab
.filts
[i
].prids
[j
];
229 cs_debug("trying reader '%s' filter %04X:%06X",
230 rdr
->label
, caid
, prid
);
234 cs_debug("%04X:%06X allowed by reader '%s' filter %04X:%06X",
235 er
->caid
, er
->prid
, rdr
->label
, caid
, prid
);
241 cs_debug("no match, %04X:%06X rejected by reader '%s' filters",
242 er
->caid
, er
->prid
, rdr
->label
);
250 int chk_avail_reader(ECM_REQUEST
*er
, struct s_reader
*rdr
)
252 if( !chk_rfilter(er
, rdr
) ) {
253 if( !er
->rcEx
) er
->rcEx
=(E1_READER
<<4)|E2_IDENT
;
256 if( !chk_class(er
, &rdr
->cltab
, "reader", rdr
->label
) ) {
257 if( !er
->rcEx
) er
->rcEx
=(E1_READER
<<4)|E2_CLASS
;
260 if( !chk_chid(er
, &rdr
->fchid
, "reader", rdr
->label
) ) {
261 if( !er
->rcEx
) er
->rcEx
=(E1_READER
<<4)|E2_CHID
;
267 if( rdr->qlen>=rdr->maxqlen )
269 cs_log("reader '%s' max. queue length(%d) reached, rejected", rdr->label,
271 if( !er->rcEx ) er->rcEx=(E1_READER<<4)|E2_QUEUE;
275 cs_log("reader '%s' qlen=%d", rdr->label, rdr->qlen);
283 int matching_reader(ECM_REQUEST
*er
, struct s_reader
*rdr
)
285 if (!((rdr
->fd
) && (rdr
->grp
&client
[cs_idx
].grp
))) return(0);
286 if (!chk_srvid(er
, rdr
->cs_idx
))
288 if (!chk_rfilter(er
, rdr
))
290 // if (!er->rcEx) er->rcEx=(E1_READER<<4)|E2_IDENT;
293 if (!chk_class(er
, &rdr
->cltab
, "reader", rdr
->label
))
295 // if (!er->rcEx) er->rcEx=(E1_READER<<4)|E2_CLASS;
298 if (!chk_chid(er
, &rdr
->fchid
, "reader", rdr
->label
))
300 // if (!er->rcEx) er->rcEx=(E1_READER<<4)|E2_CHID;