source: trunk/module-radegast.c@ 431

Last change on this file since 431 was 70, checked in by rorothetroll, 11 years ago

csctapi/io_serial.c : fix the serial port read/write wait routine to use select instead of poll

This make them compatible with Mac OS X and now oscamd works on OS X. The same code off course
still works on linux and other unix platforms. I let that code ran for 24h before commiting this code.
If you have any issue let me know and I'llr evert to poll for non compatible machines.

all the others : fix all the warning due to sign difference (mostly uchar versus char). This make the code compile

with -Werror on the more strict version of gcc (which is the case on OS X). I also noticed that in a lot of places
the code use a buffer defined as an uchar * ... and use strings functions (strnXXXX) where some memcpy/memcmp .. function
would have been preferable as we're suposedly manipulation a binary buffer. Anyway I fixed all of them and it now compile
without any warning or error on linux and OS X (and also probably on all the other unices but we will have to try before
adding -Werror on the other platform).

File size: 3.2 KB
Line 
1#include "globals.h"
2
3static int radegast_send(uchar *buf)
4{
5 int l=buf[1]+2;
6 return(send(pfd, buf, l, 0));
7}
8
9static int radegast_recv(uchar *buf, int l)
10{
11 int i, n;
12 if (!pfd) return(-1);
13 if ((n=recv(pfd, buf, l, 0))>0)
14 client[cs_idx].last=time((time_t *) 0);
15 return(n);
16}
17
18static void radegast_auth_client(in_addr_t ip)
19{
20 int ok;
21 struct s_auth *account;
22 struct s_ip *p_ip;
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]));
25 if (!ok)
26 {
27 cs_auth_client((struct s_auth *)0, NULL);
28 cs_exit(0);
29 }
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))
33 cs_exit(0);
34 if (!ok)
35 cs_auth_client((struct s_auth *)(-1), NULL);
36}
37
38static int get_request(uchar *buf)
39{
40 int n, rc=0;
41 if ((n=process_input(buf, 2, cfg->cmaxidle))==2)
42 {
43 if ((n=process_input(buf+2, buf[1], 0))>=0)
44 n+=2;
45 if (n-2==buf[1])
46 rc=n;
47 else
48 cs_log("WARNING: protocol error (garbage)");
49 }
50 if (n>0)
51 cs_ddump(buf, n, "received %d bytes from client", n);
52 return(rc);
53}
54
55static void radegast_send_dcw(ECM_REQUEST *er)
56{
57 mbuf[0]=0x02; // DCW
58 if (er->rc<4)
59 {
60 mbuf[1]=0x12; // len (overall)
61 mbuf[2]=0x05; // ACCESS
62 mbuf[3]=0x10; // len
63 memcpy(mbuf+4, er->cw, 16);
64 }
65 else
66 {
67 mbuf[1]=0x02; // len (overall)
68 mbuf[2]=0x04; // NO ACCESS
69 mbuf[3]=0x00; // len
70 }
71 radegast_send(mbuf);
72}
73
74static void radegast_process_ecm(uchar *buf, int l)
75{
76 int i, n, sl;
77 ECM_REQUEST *er;
78
79 if (!(er=get_ecmtask()))
80 return;
81 for (i=0; i<l; i+=(sl+2))
82 {
83 sl=buf[i+1];
84 switch(buf[i])
85 {
86 case 2: // CAID (upper byte only, oldstyle)
87 er->caid=buf[i+2]<<8;
88 break;
89 case 10: // CAID
90 er->caid=b2i(2, buf+i+2);
91 break;
92 case 3: // ECM DATA
93 er->l=sl;
94 memcpy(er->ecm, buf+i+2, er->l);
95 break;
96 case 6: // PROVID (ASCII)
97 n=(sl>6) ? 3 : (sl>>1);
98 er->prid=cs_atoi((char *) buf+i+2+sl-(n<<1), n, 0);
99 break;
100 case 7: // KEYNR (ASCII), not needed
101 break;
102 case 8: // ECM PROCESS PID ?? don't know, not needed
103 break;
104 }
105 }
106 if (l!=i)
107 cs_log("WARNING: ECM-request corrupt");
108 else
109 get_cw(er);
110}
111
112static void radegast_process_unknown(uchar *buf)
113{
114 uchar answer[2]={0x81, 0x00};
115 radegast_send(answer);
116 cs_log("unknown request %02X, len=%d", buf[0], buf[1]);
117}
118
119static void radegast_server()
120{
121 int n;
122
123 radegast_auth_client(client[cs_idx].ip);
124 while ((n=get_request(mbuf))>0)
125 {
126 switch(mbuf[0])
127 {
128 case 1:
129 radegast_process_ecm(mbuf+2, mbuf[1]);
130 break;
131 default:
132 radegast_process_unknown(mbuf);
133 }
134 }
135 cs_disconnect_client();
136}
137
138void module_radegast(struct s_module *ph)
139{
140 static PTAB ptab;
141 ptab.ports[0].s_port = cfg->rad_port;
142 ph->ptab = &ptab;
143 ph->ptab->nports = 1;
144
145 strcpy(ph->desc, "radegast");
146 ph->type=MOD_CONN_TCP;
147 ph->multi=0;
148 ph->watchdog=1;
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;
153}
Note: See TracBrowser for help on using the repository browser.