Timeout patch
[oscam.git] / oscam-simples.c
blob02de4fd22d480034d22e8c86aa165c8f1a2a81d4
1 #include "globals.h"
3 static AES_KEY aeskey;
5 void aes_set_key(char *key)
7 AES_set_decrypt_key(key, 128, &aeskey);
8 AES_set_encrypt_key(key, 128, &client[cs_idx].aeskey);
11 void aes_decrypt(uchar *buf, int n)
13 int i;
14 for(i=0; i<n; i+=16)
15 AES_decrypt(buf+i, buf+i, &aeskey);
18 void aes_encrypt_idx(int idx, uchar *buf, int n)
20 int i;
21 for(i=0; i<n; i+=16)
22 AES_encrypt(buf+i, buf+i, &client[idx].aeskey);
25 char *remote_txt(void)
27 if (is_server)
28 return("client");
29 else
30 return("remote server");
33 char *trim(txt)
34 char *txt;
36 register int l;
37 register char *p1, *p2;
39 if (*txt==' ')
41 for (p1=p2=txt;
42 (*p1==' ') || (*p1=='\t') || (*p1=='\n') || (*p1=='\r');
43 p1++);
44 while (*p1)
45 *p2++=*p1++;
46 *p2='\0';
48 if ((l=strlen(txt))>0)
49 for (p1=txt+l-1;
50 (*p1==' ') || (*p1=='\t') || (*p1=='\n') || (*p1=='\r');
51 *p1--='\0');
53 return(txt);
56 char *strtolower(char *txt)
58 char *p;
59 for (p=txt; *p; p++)
60 *p=tolower(*p);
61 return(txt);
64 int gethexval(char c)
66 if ((c>='0') && (c<='9')) return(c-'0');
67 if ((c>='A') && (c<='F')) return(c-'A'+10);
68 if ((c>='a') && (c<='f')) return(c-'a'+10);
69 return(-1);
72 int cs_atob(uchar *buf, char *asc, int n)
74 int i, rc;
75 for (i=0; i<n; i++)
77 if ((rc=(gethexval(asc[i<<1])<<4)|gethexval(asc[(i<<1)+1]))&0x100)
78 return(-1);
79 buf[i]=rc;
81 return(n);
84 ulong cs_atoi(char *asc, int l, int val_on_err)
86 int i, n=0;
87 ulong rc=0;
88 for (i=((l-1)<<1), errno=0; (i>=0) && (n<4); i-=2)
90 int b;
91 b=(gethexval(asc[i])<<4) | gethexval(asc[i+1]);
92 if (b<0)
94 errno=EINVAL;
95 rc=(val_on_err) ? 0xFFFFFFFF : 0;
96 break;
98 rc|=b<<(n<<3);
99 n++;
101 return(rc);
104 int byte_atob(char *asc)
106 int rc;
108 if (strlen(trim(asc))!=2)
109 rc=(-1);
110 else
111 if ((rc=(gethexval(asc[0])<<4)|gethexval(asc[1]))&0x100)
112 rc=(-1);
113 return(rc);
116 long word_atob(char *asc)
118 long rc;
120 if (strlen(trim(asc))!=4)
121 rc=(-1);
122 else
124 rc=gethexval(asc[0])<<12 | gethexval(asc[1])<<8 |
125 gethexval(asc[2])<<4 | gethexval(asc[3]);
126 if (rc&0x10000)
127 rc=(-1);
129 return(rc);
132 int key_atob(char *asc, uchar *bin)
134 int i, n1, n2, rc;
135 for (i=rc=0; i<32; i+=2)
137 if ((n1=gethexval(asc[i ]))<0) rc=(-1);
138 if ((n2=gethexval(asc[i+1]))<0) rc=(-1);
139 bin[i>>1]=(n1<<4)+(n2&0xff);
141 return(rc);
144 int key_atob14(char *asc, uchar *bin)
146 int i, n1, n2, rc;
147 for (i=rc=0; i<28; i+=2)
149 if ((n1=gethexval(asc[i ]))<0) rc=(-1);
150 if ((n2=gethexval(asc[i+1]))<0) rc=(-1);
151 bin[i>>1]=(n1<<4)+(n2&0xff);
153 return(rc);
156 char *key_btoa(char *asc, uchar *bin)
158 int i;//, n1, n2, rc;
159 static char buf[33];
160 if (!asc)
161 asc=buf;
162 for (i=0; i<16; i++)
163 sprintf(asc+(i<<1), "%02X", bin[i]);
164 return(asc);
167 char *cs_hexdump(int m, uchar *buf, int n)
169 int i;
170 static char dump[520];
172 dump[i=0]='\0';
173 m=(m)?3:2;
174 if (m*n>=sizeof(dump)) n=(sizeof(dump)/m)-1;
175 while (i<n)
176 sprintf(dump+(m*i++), "%02X%s", *buf++, (m>2)?" ":"");
177 return(dump);
180 static int inet_byteorder=0;
181 in_addr_t cs_inet_order(in_addr_t n)
183 if (!inet_byteorder)
184 inet_byteorder=((inet_addr("1.2.3.4")+1)==inet_addr("1.2.3.5")) ? 1 : 2;
185 switch (inet_byteorder)
187 case 1:
188 break;
189 case 2:
190 n=((n&0xff000000) >> 24 ) |
191 ((n&0x00ff0000) >> 8 ) |
192 ((n&0x0000ff00) << 8 ) |
193 ((n&0x000000ff) << 24 );
194 break;
196 return(n);
199 char *cs_inet_ntoa(in_addr_t n)
201 struct in_addr in;
202 in.s_addr=cs_inet_order(n);
203 return((char *)inet_ntoa(in));
206 in_addr_t cs_inet_addr(char *txt)
208 in_addr_t n;
209 if (!inet_byteorder)
210 inet_byteorder=((inet_addr("1.2.3.4")+1)==inet_addr("1.2.3.5")) ? 1 : 2;
211 switch (inet_byteorder)
213 case 1:
214 n=inet_addr(txt);
215 break;
216 case 2:
217 n=inet_network(txt);
218 break;
220 return(n);
223 ulong b2i(int n, uchar *b)
225 switch(n)
227 case 2:
228 return ((b[0]<<8) | b[1]);
229 case 3:
230 return ((b[0]<<16) | (b[1]<<8) | b[2]);
231 case 4:
232 return ((b[0]<<24) | (b[1]<<16) | (b[2]<<8) | b[3]);
236 ullong b2ll(int n, uchar *b)
238 int i;
239 ullong k=0;
240 for(i=0; i<n; k+=b[i++])
241 k<<=8;
242 return(k);
245 uchar *i2b(int n, ulong i)
247 static uchar b[4];
248 switch(n)
250 case 2:
251 b[0]=(i>> 8) & 0xff;
252 b[1]=(i ) & 0xff;
253 break;
254 case 3:
255 b[0]=(i>>16) & 0xff;
256 b[1]=(i>> 8) & 0xff;
257 b[2]=(i ) & 0xff;
258 case 4:
259 b[0]=(i>>24) & 0xff;
260 b[1]=(i>>16) & 0xff;
261 b[2]=(i>> 8) & 0xff;
262 b[3]=(i ) & 0xff;
263 break;
265 return(b);
268 ulong a2i(char *asc, int bytes)
270 int i, n;
271 ulong rc;
272 for (rc=i=0, n=strlen(trim(asc))-1; i<(abs(bytes)<<1); n--, i++)
273 if (n>=0)
275 int rcl;
276 if ((rcl=gethexval(asc[n]))<0)
278 errno=EINVAL;
279 return(0x1F1F1F);
281 rc|=(rcl<<(i<<2));
283 else
284 if (bytes<0)
285 rc|=(0xf<<(i<<2));
286 errno=0;
287 return(rc);
290 int boundary(int exp, int n)
292 return((((n-1)>>exp)+1)<<exp);
295 void cs_ftime(struct timeb *tp)
297 #ifdef NO_FTIME
298 struct timeval tv;
299 gettimeofday(&tv, (struct timezone *)0);
300 tp->time=tv.tv_sec;
301 tp->millitm=tv.tv_usec/1000;
302 #else
303 ftime(tp);
304 #endif
307 void cs_sleepms(int msec)
309 struct timeval tv;
310 tv.tv_sec = msec / 1000;
311 tv.tv_usec = (msec % 1000) * 1000;
312 select(0, 0, 0, 0, &tv);
315 int bytes_available(int fd)
317 struct pollfd pfds;
318 pfds.fd=fd;
319 pfds.events=POLLIN;
320 pfds.revents=0;
321 if (poll(&pfds, 1, 0)!=1)
322 return(0);
323 else
324 return(((pfds.revents)&POLLIN)==POLLIN);
328 #ifdef OS_CYGWIN32
329 #include <windows.h>
330 void cs_setpriority(int prio)
332 HANDLE WinId;
333 ulong wprio;
334 switch((prio+20)/10)
336 case 0: wprio=REALTIME_PRIORITY_CLASS; break;
337 case 1: wprio=HIGH_PRIORITY_CLASS; break;
338 case 2: wprio=NORMAL_PRIORITY_CLASS; break;
339 default: wprio=IDLE_PRIORITY_CLASS; break;
341 WinId=GetCurrentProcess();
342 SetPriorityClass(WinId, wprio);
344 #else
345 void cs_setpriority(int prio)
347 #ifdef PRIO_PROCESS
348 setpriority(PRIO_PROCESS, 0, prio); // ignore errors
349 #endif
351 #endif