3 static int radegast_send(uchar
*buf
)
6 return(send(pfd
, buf
, l
, 0));
9 static int radegast_recv(uchar
*buf
, int l
)
13 if ((n
=recv(pfd
, buf
, l
, 0))>0)
14 client
[cs_idx
].last
=time((time_t *) 0);
18 static void radegast_auth_client(in_addr_t ip
)
21 struct s_auth
*account
;
23 for (ok
=0, p_ip
=cfg
->rad_allowed
; (p_ip
) && (!ok
); p_ip
=p_ip
->next
)
24 ok
=((ip
>=p_ip
->ip
[0]) && (ip
<=p_ip
->ip
[1]));
27 cs_auth_client((struct s_auth
*)0, NULL
);
30 for (ok
=0, account
=cfg
->account
; (cfg
->rad_usr
[0]) && (account
) && (!ok
); account
=account
->next
)
31 if (ok
=(!strcmp(cfg
->rad_usr
, account
->usr
)))
32 if (cs_auth_client(account
, NULL
))
35 cs_auth_client((struct s_auth
*)(-1), NULL
);
38 static int get_request(uchar
*buf
)
41 if ((n
=process_input(buf
, 2, cfg
->cmaxidle
))==2)
43 if ((n
=process_input(buf
+2, buf
[1], 0))>=0)
48 cs_log("WARNING: protocol error (garbage)");
51 cs_ddump(buf
, n
, "received %d bytes from client", n
);
55 static void radegast_send_dcw(ECM_REQUEST
*er
)
60 mbuf
[1]=0x12; // len (overall)
61 mbuf
[2]=0x05; // ACCESS
63 memcpy(mbuf
+4, er
->cw
, 16);
67 mbuf
[1]=0x02; // len (overall)
68 mbuf
[2]=0x04; // NO ACCESS
74 static void radegast_process_ecm(uchar
*buf
, int l
)
79 if (!(er
=get_ecmtask()))
81 for (i
=0; i
<l
; i
+=(sl
+2))
86 case 2: // CAID (upper byte only, oldstyle)
90 er
->caid
=b2i(2, buf
+i
+2);
94 memcpy(er
->ecm
, buf
+i
+2, er
->l
);
96 case 6: // PROVID (ASCII)
97 n
=(sl
>6) ? 3 : (sl
>>1);
98 er
->prid
=cs_atoi(buf
+i
+2+sl
-(n
<<1), n
, 0);
100 case 7: // KEYNR (ASCII), not needed
102 case 8: // ECM PROCESS PID ?? don't know, not needed
107 cs_log("WARNING: ECM-request corrupt");
112 static void radegast_process_unknown(uchar
*buf
)
114 uchar answer
[2]={0x81, 0x00};
115 radegast_send(answer
);
116 cs_log("unknown request %02X, len=%d", buf
[0], buf
[1]);
119 static void radegast_server()
123 radegast_auth_client(client
[cs_idx
].ip
);
124 while ((n
=get_request(mbuf
))>0)
129 radegast_process_ecm(mbuf
+2, mbuf
[1]);
132 radegast_process_unknown(mbuf
);
135 cs_disconnect_client();
138 void module_radegast(struct s_module
*ph
)
141 ptab
.ports
[0].s_port
= cfg
->rad_port
;
143 ph
->ptab
->nports
= 1;
145 strcpy(ph
->desc
, "radegast");
146 ph
->type
=MOD_CONN_TCP
;
149 ph
->s_ip
=cfg
->rad_srvip
;
150 ph
->s_handler
=radegast_server
;
151 ph
->recv
=radegast_recv
;
152 ph
->send_dcw
=radegast_send_dcw
;