source: titan/titan/global.h @ 16991

Last change on this file since 16991 was 16991, checked in by nit, 11 years ago

[titan] add random funktion

File size: 102.5 KB
Line 
1#ifndef GLOBAL_H
2#define GLOBAL_H
3
4int getrandom(int max)
5{
6        srand(time(NULL));
7        return (rand() % max);
8}
9
10//check if swap is in flash(1) or not(0)
11int checkswaplink()
12{
13        int ret = 1;
14        char* tmpstr = NULL;
15
16        tmpstr = realpath("/var/swap", NULL);
17        if(tmpstr != NULL && ostrcmp(tmpstr, "/mnt/swapextensions") != 0)
18                ret = 0;
19
20        free(tmpstr); tmpstr = NULL;
21        return ret;
22}
23
24char* delmountpart(char* filename, int free1)
25{
26        struct mntent ent;
27        FILE *fd = NULL;
28        char* ret = NULL, *buf = NULL, *treffer = NULL, *rpath = NULL;
29        int mntdirlen = 0;
30
31        if(filename == NULL) return NULL;
32
33        buf = malloc(MINMALLOC);
34        if(buf == NULL)
35        {
36                err("no mem");
37                return NULL;
38        }
39
40        rpath = realpath(filename, NULL);
41
42        fd = setmntent("/proc/mounts", "r");
43        if(fd != NULL)
44        {
45                while(getmntent_r(fd, &ent, buf, MINMALLOC) != 0)
46                {
47                        if(ent.mnt_dir != NULL)
48                        {
49                                mntdirlen = strlen(ent.mnt_dir);
50                                if(mntdirlen > 1 && ostrstr(rpath, ent.mnt_dir) == rpath)
51                                {
52                                        if(treffer == NULL || strlen(treffer) < mntdirlen)
53                                        {
54                                                free(treffer); treffer = NULL;
55                                                treffer = ostrcat(ent.mnt_dir, NULL, 0, 0);
56                                        }
57                                }
58                        }
59                }
60        }
61
62        if(treffer != NULL)
63                ret = string_replace(treffer, "", rpath, 0);
64
65        endmntent(fd);
66        if(free1 == 1) free(filename);
67        free(buf);
68        free(treffer);
69        free(rpath);
70        return ret;
71}
72
73char* addmountpart(char* filename, int free1)
74{
75        struct mntent ent;
76        FILE *fd = NULL;
77        char* ret = NULL, *buf = NULL;
78
79        if(filename == NULL) return NULL;
80
81        buf = malloc(MINMALLOC);
82        if(buf == NULL)
83        {
84                err("no mem");
85                return NULL;
86        }
87
88        fd = setmntent("/proc/mounts", "r");
89        if(fd != NULL)
90        {
91                while(getmntent_r(fd, &ent, buf, MINMALLOC))
92                {
93                        if(ent.mnt_dir != NULL && strlen(ent.mnt_dir) > 1)
94                        {
95                                ret = ostrcat(ent.mnt_dir, filename, 0, 0);
96                                if(file_exist(ret))
97                                {
98                                        if(free1 == 1) free(filename);
99                                        endmntent(fd);
100                                        free(buf);
101                                        return ret;
102                                }
103                                free(ret); ret = NULL;
104                        }
105                }
106        }
107
108        endmntent(fd);
109        free(buf);
110        return ret;
111}
112
113struct blacklist* readblacklist(char* filename)
114{
115        char* tmpstr = NULL;
116        struct splitstr* ret = NULL;
117        struct blacklist* newnode = NULL;
118        int count = 0;
119
120        newnode = (struct blacklist*)calloc(1, sizeof(struct blacklist));
121        if(newnode == NULL)
122        {
123                err("no memory");
124                return NULL;
125        }
126
127        tmpstr = readfiletomem(filename, 1);
128        if(tmpstr == NULL)
129        {
130                free(newnode); newnode = NULL;
131                return NULL;
132        }
133
134        ret = strsplit(tmpstr, "\n", &count);
135        if(ret == NULL)
136        {
137                free(tmpstr); tmpstr = NULL;
138                free(newnode); newnode = NULL;
139                return NULL;
140        }
141
142        newnode->count = count;
143        newnode->splitstr = ret;
144        newnode->file = tmpstr;
145
146        return newnode;
147}
148
149void freeblacklist(struct blacklist* node)
150{
151        if(node != NULL)
152        {
153                free(node->file); node->file = NULL;
154                free(node->splitstr); node->splitstr = NULL;
155                node->count = 0;
156                free(node); node = NULL;
157        }
158}
159
160unsigned int gethash(char* str)
161{
162        unsigned int hash = 0;
163        int c = 0;
164
165        if(str == NULL) return 0;
166
167        while((c = *str++))
168                hash = ((hash << 5) + hash) ^ c;
169
170        return hash;
171}
172
173void freeregexstruct(struct regex* node)
174{
175        if(node == NULL) return;
176
177        free(node->match1); node->match1 = NULL;
178        free(node->match2); node->match2 = NULL;
179        free(node->match3); node->match3 = NULL;
180        free(node->match4); node->match4 = NULL;
181        free(node->match5); node->match5 = NULL;
182        free(node->match6); node->match6 = NULL;
183        free(node->match7); node->match7 = NULL;
184        free(node->match8); node->match8 = NULL;
185        free(node->match9); node->match9 = NULL;
186        free(node->match10); node->match10 = NULL;
187
188        free(node); node = NULL;
189}
190
191struct regex* regexstruct(char* regex, char* str)
192{
193        regex_t preg = {NULL};
194        regmatch_t pmatch[11] = {0};
195        size_t rm = 0, i = 0, len = 0;
196        char* ret = NULL;
197        struct regex* node = NULL;
198
199        if(regex == NULL || str == NULL) return NULL;
200
201        rm = regcomp(&preg, regex, REG_EXTENDED);
202        if(rm != 0) //error in regex
203        {
204                regfree(&preg);
205                return NULL;
206        }
207
208        rm = regexec(&preg, str, 11, pmatch, 0);
209        if(rm != 0) //no match
210        {
211                regfree(&preg);
212                return NULL;
213        }
214
215        node = (struct regex*)calloc(1, sizeof(struct regex));
216        if(node == NULL)
217        {
218                err("no mem");
219                regfree(&preg);
220                return NULL;
221        }
222
223        for(i = 1; !rm && i <= preg.re_nsub; i++)
224        {
225                len = pmatch[i].rm_eo - pmatch[i].rm_so;
226                if(len < 1) continue;
227
228                ret = malloc(len + 1);
229                if(ret != NULL)
230                {
231                        memcpy(ret, str + pmatch[i].rm_so, len);
232                        ret[len] = '\0';
233                }
234
235                if(i == 1) node->match1 = ret;
236                else if(i == 2) node->match2 = ret;
237                else if(i == 3) node->match3 = ret;
238                else if(i == 4) node->match4 = ret;
239                else if(i == 5) node->match5 = ret;
240                else if(i == 6) node->match6 = ret;
241                else if(i == 7) node->match7 = ret;
242                else if(i == 8) node->match8 = ret;
243                else if(i == 9) node->match9 = ret;
244                else if(i == 10) node->match10 = ret;
245
246                ret = NULL;
247        }
248
249        regfree(&preg);
250        return node;
251}
252
253char* oregex(char* regex, char* str)
254{
255        regex_t preg = {NULL};
256        regmatch_t pmatch[2] = {0};
257        size_t rm = 0, len = 0;
258        char* ret = NULL;
259
260        if(regex == NULL || str == NULL) return NULL;
261
262        rm = regcomp(&preg, regex, REG_EXTENDED);
263        if(rm != 0) //error in regex
264        {
265                regfree(&preg);
266                return NULL;
267        }
268
269        rm = regexec(&preg, str, 2, pmatch, 0);
270        if(rm != 0) //no match
271        {
272                regfree(&preg);
273                return NULL;
274        }
275
276        len = pmatch[1].rm_eo - pmatch[1].rm_so;
277        if(len < 1)
278        {
279                regfree(&preg);
280                return NULL;
281        }
282
283        ret = malloc(len + 1);
284        if(ret != NULL)
285        {
286                memcpy(ret, str + pmatch[1].rm_so, len);
287                ret[len] = '\0';
288        }
289
290        regfree(&preg);
291        return ret;
292}
293
294int oregexint(char* regex, char* str)
295{
296        int iret = 0;
297        char* ret = NULL;
298
299        ret = oregex(regex, str);
300        if(ret != NULL) iret = atoi(ret);
301        free(ret);
302
303        return iret;
304}
305
306void ckeckkillnetthread()
307{
308//      if(checkbox("ATEMIO510") == 1)
309//      {
310                int count = 0;
311                while(count < 12)
312                {
313                        count++;
314                        sleep(5);
315                        if(status.security == 0)
316                                killnet();
317                        else
318                                count = 12;
319                }
320//      }
321}
322
323int checkreseller()
324{
325        if(checkbox("ATEMIO510") == 0)
326        {
327                printf("ResellerId: skipped\n");
328                printf("boxtype: %s\n", status.boxtype);       
329                return 0;
330        }
331       
332        FILE* fd = NULL;
333        char mtd[10];
334        char* buf = NULL;
335
336        // /dev/mtd0
337        mtd[0] = 0x2f;
338        mtd[1] = 0x64;
339        mtd[2] = 0x65;
340        mtd[3] = 0x76;
341        mtd[4] = 0x2f;
342        mtd[5] = 0x6d;
343        mtd[6] = 0x74;
344        mtd[7] = 0x64;
345        mtd[8] = 0x30;
346        mtd[9] = '\0';
347
348        if((fd = fopen(mtd, "r")) == NULL)
349                return 1;
350
351        buf = malloc(1080);
352        if(buf == NULL)
353        {
354                fclose(fd);
355                return 1;
356        }
357
358        fread(buf, 1080, 1, fd);
359
360        if(checkbox("ATEMIO510") == 1)
361        {
362                if((buf[1072] & 0xff) == 0x25 && (buf[1073] & 0xff) == 0x29 && (buf[1074] & 0xff) == 0x02 && (buf[1075] & 0xff) == 0xA0)
363                {
364                        printf("ResellerId: found (%s) reseller !\n", status.boxtype);
365                        free(buf);
366                        fclose(fd);
367                        return 0;
368                }
369        }
370        else if(checkbox("UFS910") == 1)
371        {
372                if((buf[1072] & 0xff) == 0x03 && (buf[1073] & 0xff) == 0x00 && (buf[1074] & 0xff) == 0x00 && (buf[1075] & 0xff) == 0x00)
373                {
374                        printf("ResellerId: found (%s) reseller !\n", status.boxtype);
375                        free(buf);
376                        fclose(fd);
377                        return 0;
378                }
379        }
380        else if(checkbox("UFS912") == 1)
381        {
382                if((buf[1072] & 0xff) == 0x2d && (buf[1073] & 0xff) == 0x41 && (buf[1074] & 0xff) == 0x04 && (buf[1075] & 0xff) == 0xd2)
383                {
384                        printf("ResellerId: found (%s) reseller !\n", status.boxtype);
385                        free(buf);
386                        fclose(fd);
387                        return 0;
388                }
389        }
390        else if(checkbox("AT7000") == 1)
391        {
392                if((buf[1072] & 0xff) == 0x02 && (buf[1073] & 0xff) == 0x27 && (buf[1074] & 0xff) == 0x12 && (buf[1075] & 0xff) == 0x22)
393                {
394                        printf("ResellerId: found (%s) reseller !\n", status.boxtype);
395                        free(buf);
396                        fclose(fd);
397                        return 0;
398                }
399        }
400        else if(checkbox("AT7500") == 1)
401        {
402                if((buf[1072] & 0xff) == 0x09 && (buf[1073] & 0xff) == 0x00 && (buf[1074] & 0xff) == 0x09 && (buf[1075] & 0xff) == 0x00)
403                {
404                        printf("ResellerId: found (%s) reseller !\n", status.boxtype);
405                        free(buf);
406                        fclose(fd);
407                        return 0;
408                }
409        }
410        else if(checkbox("SKYSAT") == 1)
411        {
412                if((buf[1072] & 0xff) == 0x25 && (buf[1073] & 0xff) == 0x22 && (buf[1074] & 0xff) == 0x00 && (buf[1075] & 0xff) == 0xa0)
413                {
414                        printf("ResellerId: found (%s) reseller !\n", status.boxtype);
415                        free(buf);
416                        fclose(fd);
417                        return 0;
418                }
419        }
420        else
421        {
422                // dummy fpr other boxes
423                printf("ResellerId: check\n");
424                printf("ResellerId1: %x\n", buf[1072]);
425                printf("ResellerId2: %x\n", buf[1073]);
426                printf("ResellerId3: %x\n", buf[1074]);
427                printf("ResellerId4: %x\n", buf[1075]);
428                printf("ResellerId: %x %x %x %x\n", buf[1072], buf[1073], buf[1074], buf[1075]);
429                printf("ResellerId: not supported\n");
430                printf("boxtype: %s\n", status.boxtype);
431                return 1;
432        }
433
434        free(buf);
435        fclose(fd);
436        return 1;
437}
438
439int checkflash()
440{
441        char* tmpstr = NULL;
442        char* cmd = NULL;
443        char* dev = NULL;
444        char* dir = NULL;
445       
446        if((checkbox("UFS910") == 1) || (checkbox("UFS922") == 1) || (checkbox("AT700") == 1) || (checkbox("AT7000") == 1))
447        {
448                dev = ostrcat(dev, "3", 1, 0);
449                dir = ostrcat(dir, "var", 1, 0);               
450        }
451        else if((checkbox("ATEMIO500") == 1) || (checkbox("ATEMIO510") == 1) || (checkbox("IPBOX91") == 1) || (checkbox("IPBOX900") == 1) || (checkbox("IPBOX910") == 1) || (checkbox("IPBOX9000") == 1))
452        {
453                dev = ostrcat(dev, "4", 1, 0);
454                dir = ostrcat(dir, "var", 1, 0);
455        }
456        else if((checkbox("SKYSAT") == 1) || (checkbox("AT7500") == 1))
457        {
458                dev = ostrcat(dev, "2", 1, 0);
459                dir = ostrcat(dir, "boot", 1, 0);
460        }
461        else if(checkbox("UFS912") == 1)
462        {
463                dev = ostrcat(dev, "3", 1, 0);
464                dir = ostrcat(dir, "boot", 1, 0);
465        }
466        else
467        {
468                dev = ostrcat(dev, "9", 1, 0);
469                dir = ostrcat(dir, "var", 1, 0);
470        }
471                                               
472        cmd = ostrcat(cmd, "mount", 1, 0);
473        cmd = ostrcat(cmd, " | ", 1, 0);
474        cmd = ostrcat(cmd, "grep", 1, 0);
475        cmd = ostrcat(cmd, " /dev/", 1, 0);
476        cmd = ostrcat(cmd, "mtdblock", 1, 0);
477        cmd = ostrcat(cmd, dev, 1, 1); 
478        cmd = ostrcat(cmd, " | ", 1, 0);
479        cmd = ostrcat(cmd, "grep", 1, 0);
480        cmd = ostrcat(cmd, " /", 1, 0);
481        cmd = ostrcat(cmd, dir, 1, 0);
482        cmd = ostrcat(cmd, " | ", 1, 0);
483        cmd = ostrcat(cmd, "awk {'print $3'}", 1, 0);
484
485        tmpstr = string_newline(command(cmd));
486        free(cmd), cmd = NULL;
487
488        if(tmpstr == NULL)
489        {
490                free(dir), dir = NULL;
491                return 1;
492        }
493
494        dir = ostrcat("/", dir, 0, 1);
495
496        if(ostrcmp(tmpstr, dir) == 0)
497        {
498                free(dir), dir = NULL;
499                free(tmpstr), tmpstr = NULL;
500                return 0;
501        }
502
503        free(dir), dir = NULL;
504        free(tmpstr), tmpstr = NULL;   
505        return 1;
506}
507
508void getserial()
509{
510/*
511        if(checkbox("ATEMIO510") == 0)
512        {
513                status.security = 0;
514                status.expertmodus = 0;
515                textbox(_("Info"), _("This is a advertising Image !"), _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 1100, 400, 0, 0);   
516                return;
517        }
518*/     
519        char* cpu = NULL;       
520        cpu = getcpuid();
521        if(cpu == NULL) return;
522       
523        char* cpuout = NULL;
524        cpuout = ostrcat(cpuout, cpu, 1, 0);
525
526        char* tmpstr = NULL;
527        tmpstr = ostrcat("Board-ID SerialNr: ", cpu, 0, 0);
528        writesys("/tmp/atemio.log", tmpstr, 1);
529       
530        char* cmd = NULL;
531        cmd = ostrcat(cmd, "/var/backup/atemio.", 1, 0);
532        cmd = ostrcat(cmd, cpu, 1, 0);
533        cmd = ostrcat(cmd, ".log", 1, 0);
534        writesys(cmd, tmpstr, 1);
535        free(tmpstr); tmpstr = NULL;
536        free(cmd); cmd = NULL; 
537       
538        cpu = string_replace("AA040127", "4567846556789906532345642234567876412455678976563421345678987542112345679090087543212345678", cpu, 1);
539        cpu = ostrcat(cpu, "5678420037256789300221667894725456729330004882615552738549732529047625463784500038226662", 1, 0);
540
541        cmd = ostrcat(cmd, "/", 1, 0);
542        cmd = ostrcat(cmd, "var", 1, 0);
543        cmd = ostrcat(cmd, "/", 1, 0);
544        cmd = ostrcat(cmd, "dev", 1, 0);       
545        cmd = ostrcat(cmd, "/", 1, 0);
546        cmd = ostrcat(cmd, "dvb", 1, 0);       
547        cmd = ostrcat(cmd, "/", 1, 0);
548        cmd = ostrcat(cmd, "adapter0", 1, 0);
549        cmd = ostrcat(cmd, "/", 1, 0);
550        cmd = ostrcat(cmd, "dts0", 1, 0);
551        writesys(cmd, cpu, 1);
552        free(cmd), cmd = NULL;
553
554        char* msg = NULL;
555        msg = ostrcat(_("For next OnlineUpdate please contact Atemio and send this Serial Number\nand your Atemio Serial Number !!\n\nBoard-ID SerialNr:"), " ", 0, 0);
556        msg = ostrcat(msg, cpuout, 1, 0);
557        msg = ostrcat(msg, "\n\n", 1, 0);
558        msg = ostrcat(msg, _("Email             info@atemio.de"), 1, 0);
559        textbox(_("Info"), _(msg), _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 1100, 400, 0, 1);       
560        free(msg), msg = NULL;
561
562        //if(status.security == 0)
563        //{
564        //      checkserial(cpuout);
565        //}
566        free(cpuout); cpuout = NULL;
567        free(cpu); cpu = NULL;
568        free(tmpstr); tmpstr = NULL;
569}
570       
571char* getcpuid()
572{
573        char* serial = NULL;
574/*
575        if(checkbox("ATEMIO510") == 0)
576        {
577                status.security = 0;
578                status.expertmodus = 0;
579                return serial;
580        }
581*/
582        char* buffer = NULL;
583        struct inetwork* net = getinetworkbydevice("eth0");
584
585        if(net != NULL)
586        {
587                int mac_int;
588                int mac1_int;
589                int mac2_int;
590       
591                char* mac = NULL;
592                mac = ostrcat(mac, net->mac, 1, 0);
593
594                int count = 0;
595                char* mac1 = NULL;
596                char* mac2 = NULL;
597                char* tmpstr = NULL;
598                tmpstr = ostrcat(mac, NULL, 0, 0);
599
600                struct splitstr* ret = NULL;
601                ret = strsplit(tmpstr, ":", &count);
602
603                if(ret != NULL && count == 6)
604                {
605                        mac1 = ostrcat(mac1, (&ret[0])->part, 1, 0);
606                        mac1 = ostrcat(mac1, (&ret[1])->part, 1, 0);
607                        mac1 = ostrcat(mac1, (&ret[2])->part, 1, 0);
608                        mac2 = ostrcat(mac2, (&ret[3])->part, 1, 0);
609                        mac2 = ostrcat(mac2, (&ret[4])->part, 1, 0);
610                        mac2 = ostrcat(mac2, (&ret[5])->part, 1, 0);
611                }
612
613                free(ret); ret = NULL;
614               
615                if(mac1 != NULL)
616                {
617                        sscanf(mac1, "%X", &mac1_int);
618                        mac1_int = strtol(mac1 , NULL, 16);
619                        free(mac1), mac1 = NULL;
620                }
621       
622                if(mac2 != NULL)
623                {
624                        sscanf(mac2, "%X", &mac2_int);
625                        mac2_int = strtol(mac2 , NULL, 16);
626                        free(mac2), mac2 = NULL;
627                }
628
629                free(tmpstr); tmpstr = NULL;
630                free(mac); mac = NULL;
631       
632                mac_int = mac1_int + mac2_int;
633                int cpuid = 7594;
634                mac_int += cpuid;       
635       
636                buffer = malloc(50);
637                if(buffer == NULL)
638                        return NULL;
639                sprintf(buffer, "%d", mac_int);
640                serial = ostrcat("AA040127", buffer, 0, 0);                             
641                free(buffer);
642        }
643
644        char* cmd1 = NULL;
645        cmd1 = ostrcat(cmd1, "/", 1, 0);
646        cmd1 = ostrcat(cmd1, "var", 1, 0);
647        cmd1 = ostrcat(cmd1, "/", 1, 0);
648        cmd1 = ostrcat(cmd1, "dev", 1, 0);     
649        cmd1 = ostrcat(cmd1, "/", 1, 0);
650        cmd1 = ostrcat(cmd1, "dvb", 1, 0);     
651        cmd1 = ostrcat(cmd1, "/", 1, 0);
652        cmd1 = ostrcat(cmd1, "adapter0", 1, 0);
653        cmd1 = ostrcat(cmd1, "/", 1, 0);
654        cmd1 = ostrcat(cmd1, "dts0", 1, 0);
655
656        if(file_exist(cmd1) == 1)
657        {
658                char* cmd = NULL;
659                cmd = ostrcat(cmd, "cat", 1, 0);
660                cmd = ostrcat(cmd, " ", 1, 0);
661                cmd = ostrcat(cmd, cmd1, 1, 0);
662                               
663                char* serialtmp = NULL;
664                serialtmp = string_newline(command(cmd));
665                free(cmd); cmd = NULL;
666
667                serialtmp = string_replace("4567846556789906532345642234567876412455678976563421345678987542112345679090087543212345678", "AA040127", serialtmp, 1);
668                serialtmp = string_replace("5678420037256789300221667894725456729330004882615552738549732529047625463784500038226662", "", serialtmp, 1);
669                if(ostrcmp(serialtmp, serial) != 0)
670                {
671                        destroy();
672                        exit(100);
673                }
674        }
675        free(cmd1); cmd1 = NULL;
676        return string_newline(serial);
677}
678
679char* gettimeinfo()
680{
681        char* cmd = NULL;
682        cmd = ostrcat(cmd, "cat", 1, 0);
683        cmd = ostrcat(cmd, " /", 1, 0);
684        cmd = ostrcat(cmd, "etc", 1, 0);
685        cmd = ostrcat(cmd, "/", 1, 0); 
686        cmd = ostrcat(cmd, "image-version", 1, 0);
687        cmd = ostrcat(cmd, " | ", 1, 0);       
688        cmd = ostrcat(cmd, "cut", 1, 0);
689        cmd = ostrcat(cmd, " -d= ", 1, 0);
690        cmd = ostrcat(cmd, "-f2", 1, 0);
691        return command(cmd);
692}
693
694char* gettimeinfovar()
695{
696        char* cmd = NULL;
697        cmd = ostrcat(cmd, "cat", 1, 0);
698        cmd = ostrcat(cmd, " /", 1, 0);
699        cmd = ostrcat(cmd, "var", 1, 0);
700        cmd = ostrcat(cmd, "/", 1, 0);
701        cmd = ostrcat(cmd, "etc", 1, 0);
702        cmd = ostrcat(cmd, "/", 1, 0); 
703        cmd = ostrcat(cmd, ".image-version", 1, 0);
704        cmd = ostrcat(cmd, " | ", 1, 0);       
705        cmd = ostrcat(cmd, "cut", 1, 0);
706        cmd = ostrcat(cmd, " -d= ", 1, 0);
707        cmd = ostrcat(cmd, "-f2", 1, 0);
708        return command(cmd);
709}
710
711void checkserial(char* input)
712{
713        if(input == NULL) return;
714       
715        char* authfile = NULL;
716        authfile = gethttp("atemio.dyndns.tv", "/svn/auth/trustlist", 80, NULL, HTTPAUTH, NULL, 0);
717
718        int count = 0;
719        int i;
720        struct splitstr* ret = NULL;
721
722        if(authfile != NULL)
723                ret = strsplit(authfile, "\n", &count);
724
725        int max = count;
726
727        for(i = 0; i < max; i++)
728        {
729                int count1 = 0;
730                struct splitstr* ret1 = NULL;
731                ret1 = strsplit((&ret[i])->part, ",", &count1);
732
733                if(ret1 != NULL && ostrcmp(input, (&ret1[0])->part) == 0)
734                {
735                        status.security = 1;
736                        char* cmd = NULL;
737                        cmd = ostrcat(cmd, "/", 1, 0);
738                        cmd = ostrcat(cmd, "usr", 1, 0);
739                        cmd = ostrcat(cmd, "/", 1, 0);
740                        cmd = ostrcat(cmd, "sbin", 1, 0);
741                        cmd = ostrcat(cmd, "/", 1, 0);                                                                 
742                        cmd = ostrcat(cmd, "inetd", 1, 0);
743                        cmd = ostrcat(cmd, " ", 1, 0);
744                        cmd = ostrcat(cmd, "&", 1, 0);
745                        if(!checkprozess("inetd"))
746                                system(cmd);
747
748                        free(cmd); cmd = NULL;
749                        if(!file_exist("/dev/ttyS0") == 1)
750                                mknod("/dev/ttyS0", S_IFCHR | 0666, makedev(204, 40));
751                        free(ret1); ret1 = NULL;
752                        break;
753                }
754                free(ret1); ret1 = NULL;
755        }
756       
757//      if(checkbox("ATEMIO510") == 1)
758                killnet();
759       
760        free(ret); ret = NULL;
761        free(authfile);
762}
763
764int checkprozess(char* input)
765{
766        char* tmpstr = NULL;
767        char* cmd = NULL;
768        int ret = 0;
769
770        cmd = ostrcat(cmd, "pidof ", 1, 0);
771        cmd = ostrcat(cmd, input, 1, 0);
772        cmd = ostrcat(cmd, " | sed '/^ *$/d' | wc -l", 1, 0);
773//      printf("checkprozess: cmd=%s\n", cmd);
774
775        tmpstr = string_newline(command(cmd));
776//      printf("checkprozess: tmpstr=%s\n", tmpstr);
777
778        free(cmd), cmd = NULL;
779        if(ostrcmp(tmpstr, "0") == 0)
780                ret = 0;
781        else
782                ret = 1;       
783
784//      printf("checkprozess: ret=%d\n", ret);
785        free(tmpstr), tmpstr = NULL;
786        return ret;
787}
788
789void killnet()
790{
791        if(status.security == 1)
792                status.expertmodus = getconfigint("expertmodus", NULL);
793        else
794        {
795                status.expertmodus = 0;
796                char* cmd = NULL;
797                cmd = ostrcat(cmd, "killall", 1, 0);
798                cmd = ostrcat(cmd, " ", 1, 0);
799                cmd = ostrcat(cmd, "-9", 1, 0);
800                cmd = ostrcat(cmd, " ", 1, 0);
801                cmd = ostrcat(cmd, "inetd", 1, 0);
802                cmd = ostrcat(cmd, " ", 1, 0);
803                cmd = ostrcat(cmd, "telnetd", 1, 0);
804                cmd = ostrcat(cmd, " ", 1, 0);
805                cmd = ostrcat(cmd, "vsftpd", 1, 0);
806                cmd = ostrcat(cmd, " ", 1, 0);
807                cmd = ostrcat(cmd, "ftpd", 1, 0);               
808                cmd = ostrcat(cmd, " ", 1, 0);
809                cmd = ostrcat(cmd, "&", 1, 0);
810                system(cmd);
811                free(cmd); cmd = NULL;
812        }
813}
814
815unsigned long getsysinfo()
816{
817        char* tmpstr = NULL;
818        struct utsname info;
819        int i = 0, len = 0;
820        unsigned long ret = 0;
821
822        if(uname(&info) < 0)
823                return 0;
824        else
825        {
826                tmpstr = ostrcat(tmpstr, info.release, 1, 0);
827                tmpstr = ostrcat(tmpstr, " ", 1, 0);
828                tmpstr = ostrcat(tmpstr, info.version, 1, 0);
829
830                if(tmpstr != NULL)
831                {
832                        len = strlen(tmpstr);
833                        for(i = 0; i < len; i++)
834                        {
835                                if(isdigit(tmpstr[i]) && tmpstr[i] != '0' && tmpstr[i] != '1')
836                                        ret *= tmpstr[i];
837                                else
838                                        ret += tmpstr[i];
839                        }
840                }
841                free(tmpstr); tmpstr = NULL;
842        }
843        return ret;
844}
845
846void destroy()
847{
848        FILE* fd = NULL;
849        char mtd[10];
850        char* buf = NULL;
851
852        char* cmd = NULL;
853        cmd = ostrcat(cmd, "/", 1, 0);
854        cmd = ostrcat(cmd, "mnt", 1, 0);
855        cmd = ostrcat(cmd, "/", 1, 0);
856        cmd = ostrcat(cmd, "swapextensions", 1, 0);     
857        cmd = ostrcat(cmd, "/", 1, 0);
858        cmd = ostrcat(cmd, "etc", 1, 0);       
859        cmd = ostrcat(cmd, "/", 1, 0);
860        cmd = ostrcat(cmd, ".vnumber", 1, 0);
861        if(file_exist(cmd) == 0)
862        {
863                FILE* fd = NULL;
864                if((fd = fopen(cmd, "w")) != NULL)
865                        fclose(fd);
866        }
867        free(cmd),cmd = NULL;
868               
869        // /dev/mtd2
870        mtd[0] = 0x2f;
871        mtd[1] = 0x64;
872        mtd[2] = 0x65;
873        mtd[3] = 0x76;
874        mtd[4] = 0x2f;
875        mtd[5] = 0x6d;
876        mtd[6] = 0x74;
877        mtd[7] = 0x64;
878        mtd[8] = 0x32;
879        mtd[9] = '\0';
880               
881        if((fd = fopen(mtd, "w")) == NULL)
882                return;
883               
884        buf = malloc(MINMALLOC);
885        if(buf == NULL)
886        {
887                fclose(fd);
888                return;
889        }
890        memset(buf, 0, MINMALLOC);
891       
892        fwrite(buf, MINMALLOC, 1, fd);
893
894        free(buf);
895        fclose(fd);
896}
897
898int getmaxsat(char* feshortname)
899{
900        char *tmpstr = NULL;
901        int maxsat = 1;
902
903        if(feshortname != NULL)
904        {
905                tmpstr = ostrcat(feshortname, "_maxsat", 0, 0);
906                maxsat = getconfigint(tmpstr, NULL);
907                free(tmpstr); tmpstr = NULL;
908        }
909        if(maxsat < 0) maxsat = 1;
910
911        return maxsat;
912}
913
914void autochangechannelname()
915{
916        uint8_t lastsecnr = 0xff;
917        int secnr = 0;
918        unsigned char* buf = NULL;
919
920        if(status.aktservice->fedev == NULL) return;
921
922        while(secnr <= lastsecnr && secnr <= 256)
923        {
924                buf = dvbgetsdt(status.aktservice->fedev, secnr, 2000000);
925                if(buf != NULL)
926                        findchannel(NULL, buf, &lastsecnr, NULL, NULL, 1);
927                else
928                        break;
929                free(buf); buf = NULL;
930                secnr++;
931        }
932}
933
934//check if emu ist installed, if not it hiddes the menu
935int checkemu()
936{
937        char* tmpstr = NULL;
938
939        tmpstr = command("emu.sh list");
940        if(tmpstr != NULL)
941                return 1;
942
943        return 0;
944}
945
946int checkpluginskip(char* name)
947{
948        if(ostrcmp(name, "3 Wins") == 0) return 1;
949        else if(ostrcmp(name, "CallMonitor") == 0) return 1;
950        else if(ostrcmp(name, "Hello") == 0) return 1;
951        else if(ostrcmp(name, "DLNA") == 0) return 1;
952        else if(ostrcmp(name, "DVD Player") == 0) return 1;
953        else if(ostrcmp(name, "hbbtv Browser") == 0) return 1;         
954        else if(ostrcmp(name, "Imdb") == 0) return 1;
955        else if(ostrcmp(name, "IP-Kammera") == 0) return 1;
956        else if(ostrcmp(name, "Internet Browser") == 0) return 1;
957        else if(ostrcmp(name, "KeyLock") == 0) return 1;
958        else if(ostrcmp(name, "LCD Pearl") == 0) return 1;
959        else if(ostrcmp(name, "Mbox Info") == 0) return 1;
960//      else if(ostrcmp(name, "Media Center") == 0) return 1;
961        else if(ostrcmp(name, "Networkbrowser") == 0) return 1;
962        else if(ostrcmp(name, "News") == 0) return 1;
963        else if(ostrcmp(name, "Optimize") == 0) return 1;
964        else if(ostrcmp(name, "Panel") == 0) return 1;
965        else if(ostrcmp(name, "Permanent Time") == 0) return 1;
966        else if(ostrcmp(name, "RGUI") == 0) return 1;
967        else if(ostrcmp(name, "Script execute") == 0) return 1;
968        else if(ostrcmp(name, "Softcam Panel") == 0) return 1;
969        else if(ostrcmp(name, "Stock") == 0) return 1;
970        else if(ostrcmp(name, "Stop if not used") == 0) return 1;
971        else if(ostrcmp(name, "Streaminfo") == 0) return 1;     
972        else if(ostrcmp(name, "TiTan Mediathek") == 0) return 1;
973        else if(ostrcmp(name, "Titan Media Center") == 0) return 1;
974        else if(ostrcmp(name, "TMDb") == 0) return 1;
975        else if(ostrcmp(name, "TopfieldVFD") == 0) return 1;
976        else if(ostrcmp(name, "Weather") == 0) return 1;
977
978        return 0;
979}
980
981//flag 0: unlock
982//flag 1: lock
983void setskinnodeslocked(int flag)
984{
985        struct skin* node = skin;
986        struct skin* child = NULL;
987        int tmpflag;
988
989        while(node != NULL)
990        {
991                child = node->child;
992                while(child != NULL)
993                {
994                        if(ostrcmp("browser", child->name) == 0) child->locked = flag;
995                        else if(ostrcmp("callmon_main", child->name) == 0) child->locked = flag;
996                        else if(ostrcmp("cinterface", child->name) == 0) child->locked = flag;
997                        else if(ostrcmp("dlna", child->name) == 0) child->locked = flag;
998                        else if(ostrcmp("dvdplayer", child->name) == 0) child->locked = flag;                   
999                        else if(ostrcmp("extensionsmenu", child->name) == 0) child->locked = flag;
1000                        else if(ostrcmp("eraseswap", child->name) == 0) child->locked = flag;
1001                        else if(ostrcmp("hbbtv", child->name) == 0) child->locked = flag;
1002                        else if(ostrcmp("imdb", child->name) == 0) child->locked = flag;
1003                        else if(ostrcmp("instar", child->name) == 0) child->locked = flag;
1004                        else if(ostrcmp("keylock", child->name) == 0) child->locked = flag;
1005                        else if(ostrcmp("lcdpearl1", child->name) == 0) child->locked = flag;
1006                        else if(ostrcmp("lcdsamsung", child->name) == 0) child->locked = flag; 
1007//                      else if(ostrcmp("mediacenter", child->name) == 0) child->locked = flag;
1008                        else if(ostrcmp("mboxinfo", child->name) == 0) child->locked = flag;
1009                        else if(ostrcmp("networkbrowser", child->name) == 0) child->locked = flag;
1010                        else if(ostrcmp("news", child->name) == 0) child->locked = flag;
1011                        else if(ostrcmp("optimize", child->name) == 0) child->locked = flag;
1012                        else if(ostrcmp("panel", child->name) == 0) child->locked = flag;
1013                        else if(ostrcmp("permtime", child->name) == 0) child->locked = flag;
1014                        else if(ostrcmp("plugins", child->name) == 0) child->locked = flag;
1015                        else if(ostrcmp("rgui", child->name) == 0) child->locked = flag;
1016                        else if(ostrcmp("scriptexec", child->name) == 0) child->locked = flag;
1017                        else if(ostrcmp("skinselect", child->name) == 0) child->locked = flag;
1018                        else if(ostrcmp("softcam", child->name) == 0) child->locked = flag;
1019                        else if(ostrcmp("stock", child->name) == 0) child->locked = flag;
1020                        else if(ostrcmp("stopifnotused", child->name) == 0) child->locked = flag;
1021                        else if(ostrcmp("streaminfo", child->name) == 0) child->locked = flag;
1022                        else if(ostrcmp("system_backup", child->name) == 0) child->locked = flag;
1023                        else if(ostrcmp("system_backup_restore", child->name) == 0) child->locked = flag;
1024                        else if(ostrcmp("systemupdatemenu", child->name) == 0) child->locked = flag;
1025                        else if(ostrcmp("tithek", child->name) == 0) child->locked = flag;
1026                        else if(ostrcmp("tmc", child->name) == 0) child->locked = flag;
1027                        else if(ostrcmp("tmdb", child->name) == 0) child->locked = flag;
1028                        else if(ostrcmp("TopfieldVFD", child->name) == 0) child->locked = flag;
1029                        else if(ostrcmp("weather", child->name) == 0) child->locked = flag;
1030                        else if(ostrcmp("wins3", child->name) == 0) child->locked = flag;
1031
1032                        if(status.expertmodus > 9 && status.security == 1)
1033                                tmpflag = 0;
1034                        else
1035                                tmpflag = 1;
1036
1037                        // dont show this menus
1038                        if(ostrcmp("vfdisplay", child->name) == 0) child->locked = tmpflag;
1039                        else if(ostrcmp("savesettings", child->name) == 0) child->locked = tmpflag;
1040                        else if(ostrcmp("scartrecorder", child->name) == 0) child->locked = tmpflag;
1041                        else if(ostrcmp("vfdisplay", child->name) == 0) child->locked = tmpflag;
1042                        else if(ostrcmp("system_update_usb_online", child->name) == 0) child->locked = tmpflag;
1043                        else if(ostrcmp("system_update_usb_tmp", child->name) == 0) child->locked = tmpflag;
1044                        else if(ostrcmp("sambasettings", child->name) == 0) child->locked = tmpflag;
1045                        else if(ostrcmp("nfssettings", child->name) == 0) child->locked = tmpflag;
1046                        else if(ostrcmp("mediaplayer", child->name) == 0) child->locked = tmpflag;
1047                       
1048                        child = child->next;
1049                }
1050                node = node->next;
1051        }
1052}
1053
1054void ckeckskinnodeslockedthread()
1055{
1056        while(status.security == 0)
1057        {
1058                sleep(60);
1059                char* tmpstr2 = NULL;
1060                tmpstr2 = getcpuid();
1061                checkserial(tmpstr2);
1062                free(tmpstr2), tmpstr2 = NULL;
1063        }
1064        if(status.security == 1)
1065        {
1066                setskinnodeslocked(0);
1067        }
1068}
1069
1070int isbase64(char c)
1071{
1072        if((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || c == '+' || c == '/' || c == '=')
1073                return 1;
1074        return 0;
1075}
1076
1077char decodebase64(char c)
1078{
1079        if(c >= 'A' && c <= 'Z') return(c - 'A');
1080        if(c >= 'a' && c <= 'z') return(c - 'a' + 26);
1081        if(c >= '0' && c <= '9') return(c - '0' + 52);
1082        if(c == '+') return(62);
1083        return 63;
1084}
1085
1086int b64dec(char* dest, char* src)
1087{
1088        if(src && *src)
1089        {
1090                char* p = dest;
1091                int k, l = strlen(src) + 1;
1092                char* buf = NULL;
1093
1094                buf = malloc(l);
1095                if(buf == NULL) return 0;
1096
1097                for(k = 0, l = 0; src[k]; k++)
1098                {
1099                        if(isbase64(src[k]))
1100                                buf[l++] = src[k];
1101                }
1102
1103                for(k = 0; k < l; k += 4)
1104                {
1105                        char c1 = 'A', c2 = 'A', c3 = 'A', c4 = 'A';
1106                        char b1 = 0, b2 = 0, b3 = 0, b4 = 0;
1107
1108                        c1 = buf[k];
1109                        if(k + 1 < l)
1110                                c2 = buf[k + 1];
1111                        if(k + 2 < l)
1112                                c3 = buf[k + 2];
1113                        if(k + 3 < l)
1114                                c4 = buf[k + 3];
1115
1116                        b1 = decodebase64(c1);
1117                        b2 = decodebase64(c2);
1118                        b3 = decodebase64(c3);
1119                        b4 = decodebase64(c4);
1120
1121                        *p++ = ((b1 << 2) | (b2 >> 4));
1122
1123                        if(c3 != '=')
1124                                *p++ = (((b2 & 0xf) << 4) | (b3 >> 2));
1125                        if(c4 != '=')
1126                                *p++ = (((b3 & 0x3) << 6) | b4);
1127
1128                }
1129
1130                free(buf);
1131                return(p - dest);
1132        }
1133        return 0;
1134}
1135
1136void changechannellist(struct channel* chnode, char* channellist)
1137{
1138                char* tmpstr = NULL;
1139
1140                if(chnode == NULL || status.aktservice->channel == NULL) return;
1141
1142                status.servicetype = chnode->servicetype;
1143                if(status.servicetype == 0)
1144                {
1145                        if(channellist != NULL)
1146                        {
1147                                tmpstr = ostrcat(channellist, NULL, 0, 0);
1148                                free(status.aktservice->channellist);
1149                                status.aktservice->channellist = tmpstr;
1150                                addconfig("channellist", tmpstr);
1151                        }
1152                        tmpstr = oitoa(status.aktservice->channel->serviceid);
1153                        addconfig("serviceid", tmpstr);
1154                        free(tmpstr); tmpstr = NULL;
1155                        tmpstr = olutoa(status.aktservice->channel->transponderid);
1156                        addconfig("transponderid", tmpstr);
1157                        free(tmpstr); tmpstr = NULL;
1158                }
1159                else
1160                {
1161                        if(channellist != NULL)
1162                        {
1163                                tmpstr = ostrcat(channellist, NULL, 0, 0);
1164                                free(status.aktservice->channellist);
1165                                status.aktservice->channellist = tmpstr;
1166                                addconfig("rchannellist", tmpstr);
1167                        }
1168                        tmpstr = oitoa(status.aktservice->channel->serviceid);
1169                        addconfig("rserviceid", tmpstr);
1170                        free(tmpstr); tmpstr = NULL;
1171                        tmpstr = olutoa(status.aktservice->channel->transponderid);
1172                        addconfig("rtransponderid", tmpstr);
1173                        free(tmpstr); tmpstr = NULL;
1174                }
1175}
1176
1177char* createpiconpath(struct channel* chnode, int flag)
1178{
1179        char* tmpstr = NULL, *tmpnr = NULL;
1180
1181        if(chnode != NULL)
1182        {
1183                tmpstr = ostrcat(tmpstr, getconfig("piconpath", NULL), 1, 0);
1184                if(flag==1)
1185                        tmpstr = ostrcat(tmpstr, "/alternate/", 1, 0);
1186                else
1187                        tmpstr = ostrcat(tmpstr, "/", 1, 0);
1188                tmpnr = oitoa(chnode->serviceid);
1189                tmpstr = ostrcat(tmpstr, tmpnr, 1, 1);
1190                tmpnr = NULL;
1191                tmpstr = ostrcat(tmpstr, "-", 1, 0);
1192                tmpnr = olutoa(chnode->transponderid);
1193                tmpstr = ostrcat(tmpstr, tmpnr, 1, 1);
1194                tmpnr = NULL;
1195                tmpstr = ostrcat(tmpstr, ".png", 1, 0);
1196        }
1197        if(!isfile(tmpstr))
1198        {
1199                free(tmpstr); tmpstr = NULL;
1200                //tmpstr = ostrcat(tmpstr, getconfig("piconpath", NULL), 1, 0);
1201                //tmpstr = ostrcat(tmpstr, "/", 1, 0);
1202                //tmpstr = ostrcat(tmpstr, "default.png", 1, 0);
1203                tmpstr = ostrcat(tmpstr, getconfig("defskinpath", NULL), 1, 0);
1204                tmpstr = ostrcat(tmpstr, "/skin/", 1, 0);
1205                tmpstr = ostrcat(tmpstr, "defpicon.png", 1, 0);
1206        }
1207
1208        return tmpstr;
1209}
1210
1211int checkskin()
1212{
1213        int ret = 0;
1214        char* defskinpath = NULL;
1215        char* defskinconfig = NULL;
1216        char* defskinfile = NULL;
1217
1218        if(file_exist(getconfig("skinpath", NULL)) == 0)
1219                ret = 1;
1220        else if(file_exist(getconfig("skinconfig", NULL)) == 0)
1221                ret = 2;
1222        else if(file_exist(getconfig("skinfile", NULL)) == 0)
1223                ret = 3;
1224
1225        if(ret != 0)
1226        {
1227                err("skin not found code=%d, change to default", ret);
1228
1229                defskinpath = getconfig("defskinpath", NULL);
1230                if(defskinpath != NULL) addconfig("skinpath", defskinpath);
1231                defskinconfig = getconfig("defskinconfig", NULL);
1232                if(defskinconfig != NULL) addconfig("skinconfig", defskinconfig);
1233                defskinfile = getconfig("defskinfile", NULL);
1234                if(defskinfile != NULL) addconfig("skinfile", defskinfile);
1235
1236                ret = 0;
1237                if(file_exist(getconfig("skinpath", NULL)) == 0)
1238                        ret = 1;
1239                else if(file_exist(getconfig("skinconfig", NULL)) == 0)
1240                        ret = 2;
1241                else if(file_exist(getconfig("skinfile", NULL)) == 0)
1242                        ret = 3;
1243        }
1244
1245        if(ret != 0)
1246        {
1247                err("default skin not found code=%d", ret);
1248        }
1249
1250        return ret;
1251}
1252
1253int getaktvideosize()
1254{
1255        //wait 3 sek after zap, befor videsize is valid
1256        //driver takes a little time
1257        if(status.videosizevalid == 1)
1258                return 0;
1259        else if(status.videosizevalid + 3 > time(NULL))
1260                return 1;
1261        else
1262        {
1263#ifndef SIMULATE
1264                if(videoreadqwidth(status.aktservice->videodev) == 0)
1265#endif
1266                        status.videosizevalid = 1;
1267        }
1268
1269        return 1;
1270}
1271
1272int ostrftime(char* buf, int count, char* format, struct tm* t)
1273{
1274        int ret = -1;
1275
1276        if(format != NULL)
1277                ret = strftime(buf, count, format, t);
1278        else
1279                ret = strftime(buf, count, "%d-%m-%Y %H:%M", t);
1280
1281        return ret;
1282}
1283
1284//flag 0 = write all
1285//flag 1 = don't write epg
1286//flag 2 = only write epg
1287int writeallconfig(int flag)
1288{
1289        debug(1000, "in");
1290        char* tmpstr = NULL;
1291        int ret = 0;
1292
1293        if(flag != 2)
1294        {
1295                if(status.writerectimer == 1)
1296                        if(writerectimer(getconfig("rectimerfile", NULL), 0) != 0)
1297                                ret = 1;
1298                if(status.writesat == 1)
1299                        if(writesat(getconfig("satfile", NULL)) != 0)
1300                                ret = 1;
1301                if(status.writeplaylist == 1)
1302                        if(writeallplaylist() != 0)
1303                                ret = 1;
1304                if(status.writemainplaylist == 1)
1305                        if(writemainplaylist(getconfig("playlistfile", NULL)) != 0)
1306                                ret = 1;
1307                if(status.writebouquet == 1)
1308                        if(writeallbouquet() != 0)
1309                                ret = 1;
1310                if(status.writemainbouquet == 1)
1311                        if(writemainbouquet(getconfig("bouquetfile", NULL)) != 0)
1312                                ret = 1;
1313                if(status.writechannel == 1)
1314                        if(writechannel(getconfig("channelfile", NULL)) != 0)
1315                                ret = 1;
1316                if(status.writetransponder == 1)
1317                        if(writetransponder(getconfig("transponderfile", NULL)) != 0)
1318                                ret = 1;
1319                if(status.writeprovider == 1)
1320                        if(writeprovider(getconfig("providerfile", NULL)) != 0)
1321                                ret = 1;
1322                if(status.writeownconfig == 1)
1323                        if(writeownconfig(getconfig("ownconfig", NULL)) != 0)
1324                                ret = 1;
1325                if(status.writeepgscanlist == 1)
1326                        if(writeepgscanlist(getconfig("epgchannelfile", NULL)) != 0)
1327                                ret = 1;
1328                if(status.writercconfig == 1)
1329                        if(writercconfig(getconfig("rcconfig", NULL)) != 0)
1330                                ret = 1;
1331                if(status.writeskinconfig == 1)
1332                        if(writeskinconfig(getconfig("skinconfig", NULL)) != 0)
1333                                ret = 1;
1334                if(status.writeconfig == 1)
1335                        if(writeconfig(status.configfile) != 0)
1336                                ret = 1;
1337                if(status.writemostzap == 1)
1338                        if(writemostzap(getconfig("mostzapfile", NULL)) != 0)
1339                                ret = 1;
1340        }
1341        if((flag == 0 || flag == 2) && time(NULL) > 1072224000) // 01.01.2004
1342        {
1343                tmpstr = createpath(getconfig("epg_path", NULL), "epg.dat");
1344                if(writeepg(tmpstr) != 0)
1345                        ret = 1;
1346                free(tmpstr); tmpstr = NULL;
1347        }
1348
1349        sync();
1350
1351        debug(1000, "out");
1352        return ret;
1353}
1354
1355void initmutex(int flag)
1356{
1357        if(flag == 1)
1358        {
1359                pthread_mutex_init(&status.drawingmutex, NULL);
1360                pthread_mutex_init(&status.rectimermutex, NULL);
1361                pthread_mutex_init(&status.servicemutex, NULL);
1362                pthread_mutex_init(&status.epgmutex, NULL);
1363                pthread_mutex_init(&status.vfdmutex, NULL);
1364                pthread_mutex_init(&status.channelmutex, NULL);
1365                pthread_mutex_init(&status.timerthreadmutex, NULL);
1366                pthread_mutex_init(&status.audiotrackmutex, NULL);
1367                pthread_mutex_init(&status.subtitlemutex, NULL);
1368                pthread_mutex_init(&status.dmxdevmutex, NULL);
1369                pthread_mutex_init(&status.rcmutex, NULL);
1370                pthread_mutex_init(&status.queuemutex, NULL);
1371                pthread_mutex_init(&status.clistmutex, NULL);
1372                pthread_mutex_init(&status.hddmutex, NULL);
1373                pthread_mutex_init(&status.linkedchannelmutex, NULL);
1374                pthread_mutex_init(&status.tsseekmutex, NULL);
1375                pthread_mutex_init(&status.accelfbmutex, NULL);
1376                pthread_mutex_init(&status.mediadbmutex, NULL);
1377        }
1378        else
1379        {
1380                pthread_mutex_destroy(&status.drawingmutex);
1381                pthread_mutex_destroy(&status.rectimermutex);
1382                pthread_mutex_destroy(&status.servicemutex);
1383                pthread_mutex_destroy(&status.epgmutex);
1384                pthread_mutex_destroy(&status.vfdmutex);
1385                pthread_mutex_destroy(&status.channelmutex);
1386                pthread_mutex_destroy(&status.timerthreadmutex);
1387                pthread_mutex_destroy(&status.audiotrackmutex);
1388                pthread_mutex_destroy(&status.subtitlemutex);
1389                pthread_mutex_destroy(&status.dmxdevmutex);
1390                pthread_mutex_destroy(&status.rcmutex);
1391                pthread_mutex_destroy(&status.queuemutex);
1392                pthread_mutex_destroy(&status.clistmutex);
1393                pthread_mutex_destroy(&status.hddmutex);
1394                pthread_mutex_destroy(&status.linkedchannelmutex);
1395                pthread_mutex_destroy(&status.tsseekmutex);
1396                pthread_mutex_destroy(&status.accelfbmutex);
1397                pthread_mutex_destroy(&status.mediadbmutex);
1398        }
1399}
1400
1401int hexit(char c)
1402{
1403        if(c >= '0' && c <= '9')
1404                return c - '0';
1405        if(c >= 'a' && c <= 'f')
1406                return c - 'a' + 10;
1407        if(c >= 'A' && c <= 'F')
1408                return c - 'A' + 10;
1409
1410        return 0;
1411}
1412
1413char* htmlencode(char* from)
1414{
1415        int buflen = 0;
1416        char* buf = NULL, *to = NULL;
1417
1418        buf = malloc(MINMALLOC);
1419        if(buf == NULL)
1420        {
1421                err("no mem");
1422                return NULL;
1423        }
1424        memset(buf, 0, MINMALLOC);
1425        to = buf;
1426
1427        for(buflen = 0; *from != '\0' && buflen < MINMALLOC; ++from)
1428        {
1429                if(isalnum(*from) || strchr("/_.-~", *from) != NULL)
1430                {
1431                        *to = *from;
1432                        ++to;
1433                        ++buflen;
1434                }
1435                else
1436                {
1437                        sprintf(to, "%%%02x", (int)*from & 0xff);
1438                        to += 3;
1439                        buflen += 3;
1440                }
1441        }
1442        *to = '\0';
1443
1444        buf = ostrcat(buf, NULL, 1, 0);
1445        return buf;
1446}
1447
1448void htmldecode(char* to, char* from)
1449{
1450        if(to == NULL || from == NULL) return;
1451
1452        for(; *from != '\0'; ++to, ++from)
1453        {
1454                if(from[0] == '%' && isxdigit(from[1]) && isxdigit(from[2]))
1455                {
1456                        *to = hexit(from[1]) * 16 + hexit(from[2]);
1457                        from += 2;
1458                }
1459                else
1460                        *to = *from;
1461        }
1462        *to = '\0';
1463}
1464
1465void htmldecode2(char* to, char* from)
1466{
1467        if(to == NULL || from == NULL) return;
1468
1469        for(; *from != '\0'; ++to, ++from)
1470        {
1471                if(from[0] == '%' && isxdigit(from[1]) && isxdigit(from[2]) && isxdigit(from[3]) && isxdigit(from[4]))
1472                {
1473                        *to = hexit(from[1]) * 16 + hexit(from[2]) * 16 + hexit(from[3]) * 16 + hexit(from[4]);
1474                        from += 4;
1475                }
1476                else if(from[0] == '%' && isxdigit(from[1]) && isxdigit(from[2]) && isxdigit(from[3]))
1477                {
1478                        *to = hexit(from[1]) * 16 + hexit(from[2]) * 16 + hexit(from[3]);
1479                        from += 3;
1480                }
1481                else if(from[0] == '%' && isxdigit(from[1]) && isxdigit(from[2]))
1482                {
1483                        *to = hexit(from[1]) * 16 + hexit(from[2]);
1484                        from += 2;
1485                }
1486                else
1487                        *to = *from;
1488        }
1489        *to = '\0';
1490}
1491
1492void setosdtransparent(int value)
1493{
1494        int ret = 255;
1495        if(value < 0) value = 0;
1496        if(value > 100) value = 100;
1497
1498        ret -= value * 2.55;
1499
1500        setfbtransparent(ret);
1501}
1502
1503struct tm* olocaltime(time_t *value)
1504{
1505        struct tm *loctime, *loctime1 = NULL;
1506
1507        loctime1 = (struct tm*)malloc(sizeof(struct tm));
1508        if(loctime1 == NULL)
1509        {
1510                err("no mem");
1511                return NULL;
1512        }
1513        loctime = localtime_r(value, loctime1);
1514
1515        return loctime;
1516}
1517
1518int setwakeuptimer(time_t waketime)
1519{
1520        debug(1000, "in");
1521        char* wakeuptimerprog = NULL;
1522        struct tm *loctime = NULL;
1523        char *buf = NULL;
1524        int ret = -1;
1525
1526        wakeuptimerprog = getconfig("wakeuptimerprog", NULL);
1527
1528        if(wakeuptimerprog == NULL)
1529        {
1530                debug(1000, "out -> NULL detect");
1531                return ret;
1532        }
1533
1534        buf = malloc(MINMALLOC);
1535        if(buf == NULL)
1536        {
1537                err("no memory");
1538                return ret;
1539        }
1540
1541        loctime = olocaltime(&waketime);
1542
1543        if(loctime != NULL)
1544                ostrftime(buf, MINMALLOC, wakeuptimerprog, loctime);
1545
1546        if(buf != NULL)
1547        {
1548                debug(100, "set wake up timer (%s)", buf);
1549                ret = system(buf);
1550        }
1551
1552        free(loctime);
1553        free(buf);
1554        debug(1000, "out");
1555        return ret;
1556}
1557
1558int autoresolution()
1559{
1560        debug(1000, "in");
1561        char *hotpluginfo = NULL;
1562        char *value = NULL;
1563
1564        if(getconfig("av_videomode", NULL) != NULL || getconfig("av_colorformat", NULL))
1565                return 1;
1566
1567        hotpluginfo = getconfig("hotpluginfo", NULL);
1568
1569        if(hotpluginfo == NULL)
1570        {
1571                debug(1000, "out -> NULL detect");
1572                return 1;
1573        }
1574
1575        value = readsys(hotpluginfo, 1);
1576        if(value == NULL)
1577        {
1578                debug(1000, "out -> NULL detect");
1579                return 1;
1580        }
1581
1582        if(value[0] == 'y')
1583        {
1584                setvideomode("720p50", 0);
1585                changefbresolution("720p50");
1586                setcolorformat("hdmi_rgb");
1587        }
1588        else
1589        {
1590                setvideomode("576i50", 0);
1591                changefbresolution("576i50");
1592                setcolorformat("rgb");
1593        }
1594
1595        free(value);
1596        debug(1000, "out");
1597        return 0;
1598}
1599
1600//TODO: can remove if new function work
1601/*
1602int writelengthfield(unsigned char *buf, unsigned int len)
1603{
1604        if(len < 127)
1605        {
1606                *buf++ = len;
1607                return 1;
1608        }
1609        else if(len < 256)
1610        {
1611                *buf++ = 0x81;
1612                *buf++ = len;
1613                return 2;
1614        }
1615        else if(len < 65535)
1616        {
1617                *buf++ = 0x82;
1618                *buf++ = len >> 8;
1619                *buf++ = len;
1620                return 3;
1621        }
1622
1623        return 0;
1624}
1625*/
1626
1627size_t writelengthfield(unsigned char * buf, unsigned int len)
1628{
1629        if(buf == NULL) return 0;
1630
1631        if(len < 128)
1632        {
1633                buf[0] = len;
1634                return 1;
1635        }
1636        else
1637        {
1638                unsigned int pos = 0;
1639                unsigned int shiftby = 8;
1640                unsigned char lenfieldsize = 1;
1641
1642                while((len >> shiftby) != 0)
1643                {
1644                        lenfieldsize++;
1645                        shiftby += 8;
1646                }
1647
1648                buf[pos++] = ((1 << 7) | lenfieldsize);
1649
1650                while(shiftby != 0)
1651                {
1652                        shiftby -= 8;
1653                        buf[pos++] = len >> shiftby;
1654                }
1655                return pos;
1656        }
1657}
1658
1659
1660//flag 0: del non alpha/num
1661//flag 1: change all /
1662void delspezchar(char* text, int flag)
1663{
1664        char* tmpstr = text;
1665
1666        while(*tmpstr != '\0')
1667        {
1668                if(flag == 1)
1669                {
1670                        if(tmpstr[0] == '/')
1671                                tmpstr[0] = '-';
1672                }
1673                else
1674                {
1675                        if(!isalnum(tmpstr[0]) && tmpstr[0] != '-' && tmpstr[0] != '.')
1676                                tmpstr[0] = ' ';
1677                }
1678                tmpstr++;
1679        }
1680}
1681
1682void m_lock(pthread_mutex_t *mutex, int flag)
1683{
1684        switch(flag)
1685        {
1686                case 0: debug(900, "drawingmutex lock"); break;
1687                case 1: debug(900, "rectimermutex lock"); break;
1688                case 2: debug(900, "servicemutex lock"); break;
1689                case 3: debug(900, "vfdmutex lock"); break;
1690                case 4: debug(900, "epgmutex lock"); break;
1691                case 5: debug(900, "channelmutex lock"); break;
1692                case 6: debug(900, "timerthreadmutex lock"); break;
1693                case 7: debug(900, "audiotrackmutex lock"); break;
1694                case 8: debug(900, "subtitlemutex lock"); break;
1695                case 9: debug(900, "dmxdevmutex lock"); break;
1696                case 10: debug(900, "rcmutex lock"); break;
1697                case 11: debug(900, "queuemutex lock"); break;
1698                case 12: debug(900, "clistmutex lock"); break;
1699                case 13: debug(900, "hddmutex lock"); break;
1700                case 14: debug(900, "linkedchannelmutex lock"); break;
1701                case 15: debug(900, "tsseekmutex lock"); break;
1702                case 16: debug(900, "accelfbmutex lock"); break;
1703                case 17: debug(900, "mediadbmutex lock"); break;
1704                default: debug(900, "unknown mutex lock"); break;
1705        }
1706        pthread_mutex_lock(mutex);
1707}
1708
1709void m_unlock(pthread_mutex_t *mutex, int flag)
1710{
1711        switch(flag)
1712        {
1713                case 0: debug(900, "drawingmutex unlock"); break;
1714                case 1: debug(900, "rectimermutex unlock"); break;
1715                case 2: debug(900, "servicemutex unlock"); break;
1716                case 3: debug(900, "vfdmutex unlock"); break;
1717                case 4: debug(900, "epgmutex unlock"); break;
1718                case 5: debug(900, "channelmutex unlock"); break;
1719                case 6: debug(900, "timerthreadmutex unlock"); break;
1720                case 7: debug(900, "audiotrackmutex unlock"); break;
1721                case 8: debug(900, "subtitlemutex unlock"); break;
1722                case 9: debug(900, "dmxdevmutex unlock"); break;
1723                case 10: debug(900, "rcmutex unlock"); break;
1724                case 11: debug(900, "queuemutex unlock"); break;
1725                case 12: debug(900, "clistmutex unlock"); break;
1726                case 13: debug(900, "hddmutex unlock"); break;
1727                case 14: debug(900, "linkedchannelmutex unlock"); break;
1728                case 15: debug(900, "tsseekmutex unlock"); break;
1729                case 16: debug(900, "accelfbmutex unlock"); break;
1730                case 17: debug(900, "mediadbmutex unlock"); break;
1731                default: debug(900, "unknown mutex unlock"); break;
1732        }
1733        pthread_mutex_unlock(mutex);
1734}
1735
1736void debugstack(void* address, void* address1)
1737{
1738        void* trace[10];
1739        size_t size;
1740        size = backtrace(trace, 10);
1741
1742        FILE* fd = NULL;
1743        void* akttrace[2];
1744        int i;
1745        char **strings;
1746        char **aktstring;
1747        time_t rawtime;
1748
1749        strings = backtrace_symbols(trace, size);
1750        akttrace[0] = (void*)address1;
1751        akttrace[1] = (void*)address;
1752        aktstring = backtrace_symbols(akttrace, 2); //get fault funktion name
1753
1754        printf("--------------------------------------\n");
1755        printf("Obtaining %zd stack frames:\n\n", size);
1756
1757        for(i = 0; i < size; i++)
1758                printf("%s\n", strings[i]);
1759
1760        printf("\nLast functions:\n\n");
1761        printf("%s\n", aktstring[0]);
1762        printf("%s\n", aktstring[1]);
1763
1764        printf("--------------------------------------\n");
1765
1766        fd = fopen(getconfig("tracelog", NULL), "a");
1767        if(fd != NULL)
1768        {
1769                time(&rawtime);
1770                fprintf(fd, "Date: %s", ctime(&rawtime));
1771                fprintf(fd, "Obtaining %zd stack frames:\n\n", size);
1772                for(i = 1; i < size; i++)
1773                        fprintf(fd, "%s\n", strings[i]);
1774                fprintf(fd, "\nLast functions:\n\n");
1775                fprintf(fd, "%s\n", aktstring[0]);
1776                fprintf(fd, "%s\n", aktstring[1]);
1777                fprintf(fd, "--------------------------------------\n\n");
1778                fclose(fd);
1779                sync();
1780        }
1781        else
1782                perr("open %s", getconfig("tracelog", NULL));
1783
1784        free(strings);
1785        free(aktstring);
1786}
1787
1788int mountauto(const char *file, const char *dir, unsigned long int flag, const void *data)
1789{
1790        int ret = -1;
1791        char* saveptr = NULL, *filesystems = NULL, *tmpfilesystems = NULL, *token = NULL;
1792
1793        filesystems = getconfig("filesystems", NULL);
1794        tmpfilesystems = ostrcat(tmpfilesystems, filesystems, 0, 0);
1795
1796        token = strtok_r(tmpfilesystems, ";", &saveptr);
1797        while(token != NULL)
1798        {
1799                ret = mount(file, dir, token, flag, data);
1800                if(ret == 0) break;
1801                token = strtok_r(NULL, ";", &saveptr);
1802        }
1803
1804        free(tmpfilesystems);
1805        return ret;
1806}
1807
1808int setwaswakuptimer(int value)
1809{
1810        debug(1000, "in");
1811        char *waswakeuptimerdev = NULL, *tmpstr = NULL;
1812        int ret = 0;
1813
1814        waswakeuptimerdev = getconfig("waswakeuptimerdev", NULL);
1815
1816        if(waswakeuptimerdev != NULL)
1817        {
1818                debug(100, "set %s to %d", waswakeuptimerdev, value);
1819                tmpstr = oitoa(value);
1820                ret = writesys(waswakeuptimerdev, tmpstr, 0);
1821                free(tmpstr); tmpstr = NULL;
1822                return ret;
1823        }
1824
1825        debug(1000, "out");
1826        return 0;
1827}
1828
1829int getwaswakuptimer()
1830{
1831        debug(1000, "in");
1832        int ret = 0;
1833        char *waswakeuptimerdev = NULL;
1834        char *value = NULL;
1835
1836        waswakeuptimerdev = getconfig("waswakeuptimerdev", NULL);
1837
1838        if(waswakeuptimerdev == NULL)
1839        {
1840                debug(1000, "out -> NULL detect");
1841                return 0;
1842        }
1843
1844        value = readsys(waswakeuptimerdev, 1);
1845        if(value == NULL)
1846        {
1847                debug(1000, "out -> NULL detect");
1848                return 0;
1849        }
1850
1851        // start from timer
1852        if(atoi(value) == 1) ret = 1;
1853
1854        free(value);
1855        debug(1000, "out");
1856        return ret;
1857}
1858
1859void checkboxstartthread(struct stimerthread* self)
1860{
1861        struct rectimer* node = rectimer;
1862        int timediff = getconfigint("rectimer_timediff", NULL);
1863       
1864        if(self == NULL || node == NULL) return; //no record
1865
1866        debug(400, "boxstart rectimer thread start");
1867
1868        //wait for right time
1869        while(self->aktion != STOP && time(NULL) < 1072224000) // 01.01.2004
1870                sleep(5);
1871
1872        while(node != NULL)
1873        {
1874                if(node->status < 2)
1875                {
1876                        time_t akttime = time(NULL);
1877                        time_t begin = node->begin - getconfigint("wakeuptimerdevdiff", NULL);
1878                        if(begin > akttime - timediff && begin < akttime + timediff)
1879                        {
1880                                debug(400, "found rectimer who has start the box");
1881                                setwaswakuptimer(1);
1882                        }
1883                }
1884                node = node->next;
1885        }
1886
1887        debug(400, "boxstart rectimer thread end");
1888}
1889
1890int setwakeuptimerdev(time_t value)
1891{
1892        debug(1000, "in");
1893        char* wakeuptimerdev, *tmpstr = NULL;
1894        int ret = 0;
1895        int diff = getconfigint("wakeuptimerdevdiff", NULL);
1896
1897        if(value != 0x7FFFFFFF && value - diff > time(NULL))
1898                value -= diff;
1899       
1900        wakeuptimerdev = getconfig("wakeuptimerdev", NULL);
1901
1902        if(wakeuptimerdev != NULL && value >= time(NULL))
1903        {
1904                debug(100, "set %s to %ld", wakeuptimerdev, value);
1905                tmpstr = olutoa(value);
1906                ret = writesys(wakeuptimerdev, tmpstr, 0);
1907                free(tmpstr); tmpstr = NULL;
1908                return ret;
1909        }
1910
1911        debug(1000, "out");
1912        return 0;
1913}
1914
1915int changepolicy()
1916{
1917        debug(1000, "in");
1918        char *tmppolicy = NULL, *tmpstr = NULL;
1919
1920        tmppolicy = getpolicy();
1921
1922        if(!ostrncmp("letterbox", tmppolicy, 8))
1923                tmpstr = ostrcat(tmpstr, "panscan", 1, 0);
1924        else if(!ostrncmp("panscan", tmppolicy, 7))
1925                tmpstr = ostrcat(tmpstr, "non", 1, 0);
1926        else if(!ostrncmp("non", tmppolicy, 3))
1927                tmpstr = ostrcat(tmpstr, "bestfit", 1, 0);
1928        else if(!ostrncmp("bestfit", tmppolicy, 7))
1929                tmpstr = ostrcat(tmpstr, "letterbox", 1, 0);
1930
1931        setpolicy(tmpstr);
1932
1933        free(tmpstr); tmpstr = NULL;
1934        free(tmppolicy); tmppolicy = NULL;
1935        debug(1000, "out");
1936        return 0;
1937}
1938
1939char* getdefaultgw()
1940{
1941        char* name = NULL;
1942        unsigned long def, gw, m;
1943        int flags, ref, use, metric, mtu, win, ir;
1944        struct in_addr ip;
1945
1946        FILE *fd = fopen("/proc/net/route", "r");
1947        if(fd == NULL)
1948                return NULL;
1949
1950        if(fscanf(fd, "%*[^\n]\n") < 0)
1951        {
1952                fclose(fd);
1953                return NULL;
1954        }
1955
1956        name = malloc(64);
1957        if(name == NULL)
1958        {
1959                err("no mem");
1960                return NULL;
1961        }
1962
1963        while(1)
1964        {
1965                int r = fscanf(fd, "%63s%lx%lx%x%d%d%d%lx%d%d%d\n", name, &def, &gw, &flags, &ref, &use, &metric, &m, &mtu, &win, &ir);
1966                if(def == 0) break;
1967                if(r != 11)
1968                {
1969                        fclose(fd);
1970                        free(name);
1971                        return NULL;
1972                }
1973                if(!(flags & 0x0001)) continue; //is interface down
1974        }
1975
1976        fclose(fd);
1977        free(name);
1978
1979        ip.s_addr = gw;
1980        if(def == 0)
1981                return inet_ntoa(ip);
1982
1983        return NULL;
1984}
1985
1986char* changefilenameext(char* filename, char* ext)
1987{
1988        char* newfilename = NULL;
1989        char* zeichen = NULL;
1990
1991        if(filename == NULL) return NULL;
1992
1993        newfilename = ostrcat(filename, NULL, 0, 0);
1994
1995        zeichen = strrchr(newfilename, '.');
1996        if(zeichen != NULL)
1997        {
1998                zeichen[0] = '\0';
1999                newfilename = ostrcat(newfilename, ext, 1, 0);
2000        }
2001
2002        return newfilename;
2003}
2004
2005int cmpfilenameext(char* filename, char* ext)
2006{
2007        char* zeichen = NULL;
2008
2009        if(filename == NULL) return 1;
2010
2011        zeichen = strrchr(filename, '.');
2012        if(zeichen != NULL)
2013        {
2014                if(ostrcasecmp(zeichen, ext) == 0) return 0;
2015        }
2016
2017        return 1;
2018}
2019
2020char* getfilenameext(char* filename)
2021{
2022        char* zeichen = NULL;
2023
2024        if(filename == NULL) return NULL;
2025
2026        zeichen = strrchr(filename, '.');
2027        if(zeichen != NULL)
2028        {
2029                return ostrcat(zeichen + 1, NULL, 0, 0);
2030        }
2031
2032        return NULL;
2033}
2034
2035char* getcurrentdir(char* path)
2036{
2037        char* zeichen = NULL;
2038
2039        if(path == NULL) return NULL;
2040
2041        zeichen = strrchr(path, '/');
2042        if(zeichen != NULL)
2043        {
2044                return ostrcat(zeichen + 1, NULL, 0, 0);
2045        }
2046
2047        return NULL;
2048}
2049
2050char* convert_timesec(int sec)
2051{
2052        int hour = 0, min = 0, seconds = 0;
2053        char* buf = NULL;
2054
2055        buf = malloc(9);
2056        if(buf == NULL)
2057        {
2058                err("no mem");
2059                return NULL;
2060        }
2061
2062        seconds = sec % 60;
2063        min = (sec / 60) % 60;
2064        hour = sec / 3600;
2065
2066        if(seconds < 0) seconds = 0;
2067        if(min < 0) min = 0;
2068        if(hour < 0 || hour > 23)
2069        {
2070                hour = 0;
2071                min = 0;
2072                seconds = 0;
2073        }
2074
2075        snprintf(buf, 9, "%02d:%02d:%02d", hour, min, seconds);
2076
2077        return buf;
2078}
2079
2080int checkdate()
2081{
2082        time_t dvbtime = 0;
2083
2084        if(time(NULL) < 1072224000 || status.timeupdatecount > 3600) // 01.01.2004
2085        {
2086                if(dvbgetdate(&dvbtime, 10000000) == 0) //10 sek
2087                {
2088                        setsystime(&dvbtime);
2089                        status.timeupdatecount = 0;
2090                        return 0;
2091                }
2092                return 1;
2093        }
2094        return 0;
2095}
2096
2097void closeonexec(int fd)
2098{
2099        if(fd > -1)
2100                fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC);
2101}
2102
2103void startthumb(flag)
2104{
2105        if(flag == 1)
2106        {
2107                if(getconfigint("createthumb", NULL) == 1 && status.thumbthread == NULL)
2108                        status.thumbthread = addtimer(&thumbthread, START, 1000, 1, NULL, NULL, NULL);
2109        }
2110        else if(status.thumbthread != NULL)
2111        {
2112                status.thumbthread->aktion = STOP;
2113                status.thumbthread = NULL;
2114        }
2115}
2116
2117void starthttpd(flag)
2118{
2119        if(flag == 1)
2120        {
2121                if(getconfigint("httpdstart", NULL) == 1 && status.httpthread == NULL)
2122                {
2123                        status.httpthread = addtimer(&httpdthreadfunc, START, 10000, -1, NULL, NULL, NULL);
2124                        if(status.httpthread != NULL)
2125                                status.httpthread->flag = setbit(status.httpthread->flag, 0);
2126                }
2127        }
2128        else if(status.httpthread != NULL)
2129        {
2130                status.httpthread->aktion = STOP;
2131                status.httpthread = NULL;
2132        }
2133}
2134
2135void startrguid(flag)
2136{
2137        if(flag == 1)
2138        {
2139                if(getconfigint("rguidstart", NULL) == 1 && status.rguithread == NULL)
2140                {
2141                        status.rguithread = addtimer(&rguidthreadfunc, START, 10000, -1, NULL, NULL, NULL);
2142                        if(status.rguithread != NULL)
2143                                status.rguithread->flag = setbit(status.rguithread->flag, 0);
2144                }
2145        }
2146        else if(status.rguithread != NULL)
2147        {
2148                status.rguithread->aktion = STOP;
2149                status.rguithread = NULL;
2150        }
2151}
2152
2153int checkbox(char* box)
2154{
2155        char* boxversion = NULL;
2156        int ret = 0;
2157
2158        if(status.boxtype == NULL)
2159        {
2160                if(isfile("/etc/model") == 0) return 0;
2161                boxversion = string_toupper(readsys("/etc/model", 1));
2162        }
2163        else
2164                boxversion = status.boxtype;
2165
2166        if(ostrcmp(boxversion, box) == 0)
2167        {
2168                status.boxtype = boxversion;
2169                ret = 1;
2170        }
2171
2172        box = ostrcat(box, "\n", 0, 0);
2173        if(ostrcmp(boxversion, box) == 0)
2174        {
2175                status.boxtype = boxversion;
2176                ret = 1;
2177        }
2178
2179        if(status.boxtype == NULL)
2180                free(boxversion); boxversion = NULL;
2181        free(box); box = NULL;
2182
2183        return ret;
2184}
2185
2186int setoverclockfreq(int mode)
2187{
2188        // mode 0 = Set Standby Freq
2189        // mode 1 = Set Freq
2190
2191        if(ostrcmp(getownconfig("standby_overclock"), "0") == 0)
2192                return 1;
2193
2194        if(isfile("/proc/cpu_frequ/pll0_ndiv_mdiv") == 0)
2195                return 1;
2196
2197        char* tmpstr = NULL;
2198
2199        if(mode == 0)
2200                tmpstr = getownconfig("standby_freq");
2201        else
2202                tmpstr = getownconfig("pll0_ndiv_mdiv");
2203
2204        return writesys("/proc/cpu_frequ/pll0_ndiv_mdiv", tmpstr, 1);
2205}
2206
2207int setsaturation(int value)
2208{
2209        debug(1000, "in");
2210        char* saturationdev;
2211
2212        saturationdev = getconfig("saturationdev", NULL);
2213
2214        if(saturationdev != NULL)
2215        {
2216                debug(100, "set %s to %d", saturationdev, value);
2217                return writesysint(saturationdev, value, 1);
2218        }
2219
2220        debug(1000, "out");
2221        return 0;
2222}
2223
2224int setbrightness(int value)
2225{
2226        debug(1000, "in");
2227        char* brightnessdev;
2228
2229        brightnessdev = getconfig("brightnessdev", NULL);
2230
2231        if(brightnessdev != NULL)
2232        {
2233                debug(100, "set %s to %d", brightnessdev, value);
2234                return writesysint(brightnessdev, value, 1);
2235        }
2236
2237        debug(1000, "out");
2238        return 0;
2239}
2240
2241int setvmpeg(struct dvbdev* node, int posx, int posy, int width, int height)
2242{
2243        debug(1000, "in");
2244        char* vmpegdev = NULL, *tmpstr = NULL, *buf = NULL;
2245        int ret = 0;
2246
2247        if(node == NULL) return 1;
2248        vmpegdev = getconfig("vmpegalldev", NULL);
2249
2250        if(vmpegdev != NULL)
2251        {
2252                buf = malloc(MINMALLOC);
2253                if(buf == NULL)
2254                {
2255                        err("no mem");
2256                        return 1;
2257                }
2258               
2259                tmpstr = malloc(MINMALLOC);
2260                if(tmpstr == NULL)
2261                {
2262                        err("no mem");
2263                        free(buf);
2264                        return 1;
2265                }
2266               
2267                snprintf(buf, MINMALLOC, vmpegdev, node->devnr);
2268                snprintf(tmpstr, MINMALLOC, "%x %x %x %x", posx, posy, width, height);
2269                debug(100, "set %s to %s", buf, tmpstr);
2270                status.tvpic = 1;
2271                ret = writesys(buf, tmpstr, 1);
2272               
2273                free(tmpstr);
2274                free(buf);
2275                return ret;
2276        }
2277
2278        debug(1000, "out");
2279        return 0;
2280}
2281
2282//flag 0: wh = width
2283//flag 1: wh = height
2284int setvmpegrect(struct dvbdev* node, int posx, int posy, int wh, int flag)
2285{
2286        int ret = 0;
2287
2288        if(flag == 0)
2289                ret = setvmpeg(node, posx, posy, wh, wh / 1.4);
2290
2291        if(flag == 1)
2292                ret = setvmpeg(node, posx, posy, wh * 1.3, wh);
2293
2294        return ret;
2295}
2296
2297int resetvmpeg(struct dvbdev* node)
2298{
2299        int ret = 0;
2300               
2301        ret = setvmpeg(node, 0, 0, 0, 0);
2302       
2303        return ret;
2304}
2305
2306void resettvpic()
2307{
2308        if(status.tvpic == 1 && status.aktservice != NULL)
2309        {
2310                status.tvpic = 0;
2311                resetvmpeg(status.aktservice->videodev);
2312        }
2313}
2314
2315int setcontrast(int value)
2316{
2317        debug(1000, "in");
2318        char* contrastdev;
2319
2320        contrastdev = getconfig("contrastdev", NULL);
2321
2322        if(contrastdev != NULL)
2323        {
2324                debug(100, "set %s to %d", contrastdev, value);
2325                return writesysint(contrastdev, value, 1);
2326        }
2327
2328        debug(1000, "out");
2329        return 0;
2330}
2331
2332int settint(int value)
2333{
2334        debug(1000, "in");
2335        char* tintdev;
2336
2337        tintdev = getconfig("tintdev", NULL);
2338
2339        if(tintdev != NULL)
2340        {
2341                debug(100, "set %s to %d", tintdev, value);
2342                return writesysint(tintdev, value, 1);
2343        }
2344
2345        debug(1000, "out");
2346        return 0;
2347}
2348
2349int ozip(char* inbuf, int inlen, char** outbuf, int* outlen, int level)
2350{
2351        int ret = 0;
2352        z_stream stream;
2353
2354        stream.zalloc = Z_NULL;
2355        stream.zfree = Z_NULL;
2356        stream.opaque = Z_NULL;
2357
2358        ret = deflateInit(&stream, level);
2359        if(ret != Z_OK)
2360                return 1;
2361
2362        *outbuf = malloc(inlen);
2363        if(*outbuf == NULL)
2364        {
2365                err("no mem");
2366                (void)deflateEnd(&stream);
2367                return 1;
2368        }
2369
2370        stream.avail_in = inlen;
2371        stream.next_in = (void*)inbuf;
2372
2373        do
2374        {
2375                stream.avail_out = inlen;
2376                stream.next_out = (void*)*outbuf;
2377
2378                ret = deflate(&stream, Z_FINISH);
2379                if(ret == Z_STREAM_ERROR)
2380                {
2381                        free(*outbuf); *outbuf = NULL;
2382                        (void)deflateEnd(&stream);
2383                        return 1;
2384                }
2385
2386        }
2387        while(stream.avail_out == 0);
2388        *outlen = inlen - stream.avail_out;
2389        *outbuf = realloc(*outbuf, *outlen);
2390
2391        (void)deflateEnd(&stream);
2392        return 0;
2393}
2394
2395//flag 0: malloc mem
2396//flag 1: don't malloc mem
2397int ounzip(char* inbuf, int inlen, char** outbuf, int* outlen, int maxbuf, int flag)
2398{
2399        int ret = 0;
2400        z_stream stream;
2401
2402        stream.zalloc = Z_NULL;
2403        stream.zfree = Z_NULL;
2404        stream.opaque = Z_NULL;
2405        stream.avail_in = 0;
2406        stream.next_in = Z_NULL;
2407
2408        ret = inflateInit(&stream);
2409        if(ret != Z_OK)
2410                return 1;
2411
2412        if(flag == 0)
2413        {
2414                *outbuf = malloc(maxbuf);
2415                if(*outbuf == NULL)
2416                {
2417                        err("no mem");
2418                        (void)inflateEnd(&stream);
2419                        return 1;
2420                }
2421        }
2422
2423        stream.avail_in = inlen;
2424        stream.next_in = (void*)inbuf;
2425
2426        do
2427        {
2428                stream.avail_out = maxbuf;
2429                stream.next_out = (void*)*outbuf;
2430
2431                ret = inflate(&stream, Z_NO_FLUSH);
2432                if(ret == Z_NEED_DICT || ret == Z_DATA_ERROR || ret == Z_MEM_ERROR)
2433                {
2434                        free(*outbuf); *outbuf = NULL;
2435                        (void)inflateEnd(&stream);
2436                        return 1;
2437                }
2438
2439        }
2440        while(stream.avail_out == 0);
2441        *outlen = maxbuf - stream.avail_out;
2442        if(flag == 0) *outbuf = realloc(*outbuf, *outlen);
2443
2444        (void)inflateEnd(&stream);
2445        return 0;
2446}
2447
2448void endianswapshort(unsigned short* value)
2449{
2450        *value = (*value >> 8) | (*value << 8);
2451}
2452
2453int rcnumber(int rcret)
2454{
2455        if(rcret == getrcconfigint("rc0", NULL) ||
2456        rcret == getrcconfigint("rc1", NULL) ||
2457        rcret == getrcconfigint("rc2", NULL) ||
2458        rcret == getrcconfigint("rc3", NULL) ||
2459        rcret == getrcconfigint("rc4", NULL) ||
2460        rcret == getrcconfigint("rc5", NULL) ||
2461        rcret == getrcconfigint("rc6", NULL) ||
2462        rcret == getrcconfigint("rc7", NULL) ||
2463        rcret == getrcconfigint("rc8", NULL) ||
2464        rcret == getrcconfigint("rc9", NULL))
2465                return rcret;
2466        else
2467                return -9999;
2468}
2469
2470int delallfiles(char* dir, char* ext)
2471{
2472        struct dirent *dirent = NULL;
2473        DIR *pdir = NULL;
2474        char* tmpstr = NULL;
2475
2476        pdir = opendir(dir);
2477        if(pdir != NULL)
2478        {
2479                while((dirent = readdir(pdir)) != NULL)
2480                {
2481                        if(ostrcmp(".", dirent->d_name) != 0 && ostrcmp("..", dirent->d_name) != 0)
2482                        {
2483                                if(ext == NULL || ostrstr(dirent->d_name, ext) != NULL)
2484                                {
2485                                        tmpstr = ostrcat(dir, "/", 0, 0);
2486                                        tmpstr = ostrcat(tmpstr, dirent->d_name, 1, 0);
2487                                        unlink(tmpstr);
2488                                        free(tmpstr); tmpstr = NULL;
2489                                }
2490                        }
2491                }
2492
2493                closedir(pdir);
2494        }
2495
2496        return 0;
2497}
2498
2499unsigned long getfilecount(char* dir)
2500{
2501        unsigned long count = 0;
2502        struct dirent *dirent = NULL;
2503        DIR *pdir = NULL;
2504
2505        pdir = opendir(dir);
2506        if(pdir != NULL)
2507        {
2508                while((dirent = readdir(pdir)) != NULL)
2509                        count++;
2510
2511                closedir(pdir);
2512        }
2513
2514        return count;
2515}
2516
2517long long getfullspace(char* dir)
2518{
2519        struct statfs64 s;
2520        long long fullsize = 0;
2521
2522        if(statfs64(dir, &s) >= 0)
2523        {
2524                fullsize = s.f_blocks;
2525                fullsize *= s.f_bsize;
2526        }
2527
2528        return fullsize;
2529}
2530
2531long long getfreespace(char* dir)
2532{
2533        struct statfs64 s;
2534        long long freesize = 0;
2535
2536        if(statfs64(dir, &s) >= 0)
2537        {
2538                freesize = s.f_bfree;
2539                freesize *= s.f_bsize;
2540        }
2541
2542        return freesize;
2543}
2544
2545int checkbit(int value, int bitpos)
2546{
2547        int ret = 0;
2548
2549        ret = value & (1 << bitpos) ? 1: 0;
2550        return ret;
2551}
2552
2553int tooglebit(int value, int bitpos)
2554{
2555        value ^= 1 << bitpos;
2556        return value;
2557}
2558
2559int clearbit(int value, int bitpos)
2560{
2561        value &= ~(1 << bitpos);
2562        return value;
2563}
2564
2565int setbit(int value, int bitpos)
2566{
2567        value |= 1 << bitpos;
2568        return value;
2569}
2570
2571int setsystime(time_t* newtime)
2572{
2573        if (stime(newtime))
2574        {
2575                err("can't set system time");
2576                return 1;
2577        }
2578        return 0;
2579}
2580
2581off64_t getfilesize(char* name)
2582{
2583        struct stat64 sbuf;
2584
2585        if(lstat64(name, &sbuf) == -1)
2586                return 0;
2587
2588        return sbuf.st_size;
2589}
2590
2591time_t getfiletime(char* name, int type)
2592{
2593        struct stat64 sbuf;
2594
2595        if(lstat64(name, &sbuf) == -1)
2596                return 0;
2597
2598        switch(type)
2599        {
2600                case 1: return sbuf.st_mtime;
2601                case 2: return sbuf.st_ctime;
2602                default: return sbuf.st_atime;
2603        }
2604}
2605
2606int isfile(char* name)
2607{
2608        struct stat64 sbuf;
2609
2610        if(lstat64(name, &sbuf) == -1)
2611                return 0;
2612
2613        if(S_ISREG(sbuf.st_mode))
2614                return 1;
2615
2616        return 0;
2617}
2618
2619int isdir(char* name)
2620{
2621        struct stat64 sbuf;
2622        char *rpath = NULL;
2623
2624        if(lstat64(name, &sbuf) == -1)
2625                return 0;
2626
2627        if(S_ISDIR(sbuf.st_mode))
2628                return 1;
2629
2630        if(S_ISLNK(sbuf.st_mode))
2631        {
2632                rpath = realpath(name, NULL);
2633                if(lstat64(rpath, &sbuf) == -1)
2634                {
2635                        free(rpath);
2636                        return 0;
2637                }
2638                free(rpath);
2639                if(S_ISDIR(sbuf.st_mode))
2640                        return 1;
2641        }
2642
2643        return 0;
2644}
2645
2646char* getmaxsatstring(int maxsat)
2647{
2648        char* tmpstr = NULL, *tmpnr = NULL;
2649        int i;
2650
2651        tmpstr = ostrcat(tmpstr, "1", 1, 0);
2652        for(i = 2; i <= maxsat; i++)
2653        {
2654                tmpnr = oitoa(i);
2655                tmpstr = ostrcat(tmpstr, "\n", 1, 0);
2656                tmpstr = ostrcat(tmpstr, tmpnr, 1, 1);
2657        }
2658        return tmpstr;
2659}
2660
2661void ostrcatbig(char** value1, char* value2, int* maxlen, int* pos)
2662{
2663//      debug(1000, "in");
2664        int len = 0;
2665
2666        if(value2 == NULL)
2667        {
2668                debug(1000, "out -> NULL detect");
2669                return;
2670        }
2671        len = strlen(value2);
2672
2673        if(len > MINMALLOC)
2674        {
2675                err("string to long");
2676                return;
2677        }
2678
2679        if(*value1 != NULL && maxlen == 0)
2680                *maxlen = strlen(*value1);
2681
2682        if(*value1 == NULL || *pos + len + 1 > *maxlen)
2683        {
2684                *maxlen = *maxlen + (MINMALLOC * 10);
2685                *value1 = realloc(*value1, *maxlen);
2686                if(*value1 == NULL)
2687                {
2688                        err("no memory");
2689                        return;
2690                }
2691        }
2692
2693        memcpy(*value1 + *pos, value2, len + 1);
2694        *pos = *pos + len;
2695
2696        //debug(1000, "out");
2697}
2698
2699char* ostrcat(char* value1, char* value2, int free1, int free2)
2700{
2701//      debug(1000, "in");
2702        int len = 0, len1 = 0, len2 = 0;
2703        char* buf = NULL;
2704
2705        if(value1 == NULL && value2 == NULL) return NULL;
2706
2707        if(value1 != NULL) len1 = strlen(value1);
2708        if(value2 != NULL) len2 = strlen(value2);
2709
2710        len = len1 + len2 + 1;
2711
2712        buf = malloc(len);
2713        if(buf == NULL)
2714        {
2715                err("no memory");
2716                return NULL;
2717        }
2718
2719        if(len1 > 0) memcpy(buf, value1, len1);
2720        if(len2 > 0) memcpy(buf + len1, value2, len2);
2721        buf[len - 1] = '\0';
2722
2723        if(free1 == 1) free(value1);
2724        if(free2 == 1) free(value2);
2725
2726        //helpfull for memleak detect
2727        //if(buf != NULL && strlen(buf) == 0x0b - 0x01)
2728        //      printf("******** memleak string (%s) (%p) ********\n", buf, buf);
2729
2730        //debug(1000, "out");
2731        return buf;
2732}
2733
2734char* olutoa(unsigned long value)
2735{
2736        debug(1000, "in");
2737        char *buf = NULL, *buf1 = NULL;
2738
2739        buf = malloc(MINMALLOC);
2740        if(buf == NULL)
2741        {
2742                err("no memory");
2743                return NULL;
2744        }
2745
2746        sprintf(buf, "%lu", value);
2747        buf1 = ostrcat(buf, NULL, 1, 0);
2748
2749        debug(1000, "out");
2750        return buf1;
2751}
2752
2753char* oitoax(int value)
2754{
2755        debug(1000, "in");
2756        char *buf = NULL, *buf1 = NULL;
2757
2758        buf = malloc(MINMALLOC);
2759        if(buf == NULL)
2760        {
2761                err("no memory");
2762                return NULL;
2763        }
2764
2765        sprintf(buf, "%x", value);
2766        buf1 = ostrcat(buf, NULL, 1, 0);
2767
2768        debug(1000, "out");
2769        return buf1;
2770}
2771
2772char* oitoa(int value)
2773{
2774        debug(1000, "in");
2775        char *buf = NULL, *buf1 = NULL;
2776
2777        buf = malloc(MINMALLOC);
2778        if(buf == NULL)
2779        {
2780                err("no memory");
2781                return NULL;
2782        }
2783
2784        sprintf(buf, "%d", value);
2785        buf1 = ostrcat(buf, NULL, 1, 0);
2786
2787        debug(1000, "out");
2788        return buf1;
2789}
2790
2791char* oitoa64(off64_t value)
2792{
2793        debug(1000, "in");
2794        char *buf = NULL, *buf1 = NULL;
2795
2796        buf = malloc(MINMALLOC);
2797        if(buf == NULL)
2798        {
2799                err("no memory");
2800                return NULL;
2801        }
2802
2803        sprintf(buf, "%lld", value);
2804        buf1 = ostrcat(buf, NULL, 1, 0);
2805
2806        debug(1000, "out");
2807        return buf1;
2808}
2809
2810char* oftoa64(double value, char* count)
2811{
2812        debug(1000, "in");
2813        char *buf = NULL, *buf1 = NULL;
2814        char* tmpstr = NULL;
2815
2816        buf = malloc(MINMALLOC);
2817        if(buf == NULL)
2818        {
2819                err("no memory");
2820                return NULL;
2821        }
2822
2823        tmpstr = ostrcat("%.", count, 0, 0);
2824        tmpstr = ostrcat(tmpstr, "f", 1, 0);
2825
2826        sprintf(buf, tmpstr, value);
2827        buf1 = ostrcat(buf, NULL, 1, 0);
2828
2829        free(tmpstr);
2830        debug(1000, "out");
2831        return buf1;
2832}
2833
2834int ostrncmp(char* value1, char* value2, int count)
2835{
2836        //debug(1000, "in");
2837        int ret = 1;
2838
2839        if(value1 != NULL && value2 != NULL)
2840                ret = strncmp(value1, value2, count);
2841
2842        //debug(1000, "out");
2843        return ret;
2844}
2845
2846int ostrcmp(char* value1, char* value2)
2847{
2848//      debug(1000, "in");
2849        int ret = 1;
2850
2851        if(value1 != NULL && value2 != NULL)
2852                ret = strcmp(value1, value2);
2853
2854//      debug(1000, "out");
2855        return ret;
2856}
2857
2858int ostrcasecmp(char* value1, char* value2)
2859{
2860//      debug(1000, "in");
2861        int ret = 1;
2862
2863        if(value1 != NULL && value2 != NULL)
2864                ret = strcasecmp(value1, value2);
2865
2866//      debug(1000, "out");
2867        return ret;
2868}
2869
2870char* createpath(char* dir, char* file)
2871{
2872        debug(1000, "in");
2873        char *absdir = NULL;
2874        char *pos = NULL;
2875        char* tmpdir = NULL;
2876
2877        if(dir == NULL || file == NULL)
2878        {
2879                debug(1000, "out -> NULL detect");
2880                return NULL;
2881        }
2882
2883        tmpdir = ostrcat(dir, NULL, 0, 0);
2884        if(tmpdir == NULL)
2885        {
2886                debug(1000, "out -> NULL detect");
2887                return NULL;
2888        }
2889
2890        while((tmpdir[strlen(tmpdir) - 1] == '.' && tmpdir[strlen(tmpdir) - 2] != '.') || tmpdir[strlen(tmpdir) - 1] == '/')
2891                tmpdir[strlen(tmpdir) - 1] = '\0';
2892
2893        while(tmpdir[strlen(tmpdir) - 1] == '.' && tmpdir[strlen(tmpdir) - 2] == '.')
2894        {
2895                tmpdir[strlen(tmpdir) - 1] = '\0';
2896                tmpdir[strlen(tmpdir) - 1] = '\0';
2897                if(tmpdir[strlen(tmpdir) - 1] == '/')
2898                        tmpdir[strlen(tmpdir) - 1] = '\0';
2899                pos = strrchr(tmpdir, '/');
2900                if(pos != NULL)
2901                        pos[0] = '\0';
2902        }
2903
2904        absdir = malloc(strlen(tmpdir) + strlen(file) + 2);
2905        if(absdir == NULL)
2906        {
2907                free(tmpdir);
2908                err("no memory");
2909                return NULL;
2910        }
2911
2912        if(strlen(file) > 0 || strlen(tmpdir) == 0)
2913                sprintf(absdir, "%s/%s", tmpdir, file);
2914        else
2915                sprintf(absdir, "%s", tmpdir);
2916
2917        debug(1000, "out");
2918        free(tmpdir);
2919        return absdir;
2920}
2921
2922int settimezone(char* zone)
2923{
2924        debug(1000, "in");
2925        int ret = 0;
2926        char* tmpzone = NULL, *zonepath = NULL;
2927
2928        zonepath = getconfig("zonepath", NULL);
2929        if(zonepath == NULL)
2930        {
2931                err("config zonepath not defined");
2932                return 1;
2933        }
2934
2935        tmpzone = createpath(zonepath, zone);
2936        if(tmpzone == NULL)
2937                return 1;
2938
2939        setenv("TZ", zone, 1);
2940
2941        ret = unlink(getconfig("localtimefile", NULL));
2942        if(ret != 0)
2943                perr("unlink");
2944        ret = symlink(tmpzone, getconfig("localtimefile", NULL));
2945        if(ret != 0)
2946                perr("link");
2947
2948        free(tmpzone);
2949        debug(1000, "out");
2950        return ret;
2951}
2952
2953int delchar(char** text, int pos)
2954{
2955        debug(1000, "in");
2956        char *tmptext = NULL;
2957        int i = 0, y = 0, len = 0;
2958
2959        if(text == NULL || *text == NULL)
2960        {
2961                debug(1000, "out -> NULL detect");
2962                return pos;
2963        }
2964
2965        len = strlen(*text);
2966        if(len == 0) return pos;
2967
2968        tmptext = malloc(strlen(*text));
2969        if(tmptext == NULL)
2970        {
2971                err("no memory");
2972                return pos;
2973        }
2974
2975        for(i = 0; i < strlen(*text); i++)
2976        {
2977                if(i == pos - 1)
2978                        y++;
2979
2980                tmptext[i] = (*text)[y];
2981                y++;
2982        }
2983
2984        if(i > 0) tmptext[i - 1] = '\0';
2985        if(pos >= strlen(tmptext)) pos = strlen(tmptext);
2986
2987        free(*text);
2988        *text = tmptext;
2989        debug(1000, "out");
2990        return pos;
2991}
2992
2993
2994int insertchar(char** text, char zeichen, int pos)
2995{
2996        debug(1000, "in");
2997        char *tmptext = NULL;
2998        int i, y = 0;
2999
3000        if(text == NULL || *text == NULL)
3001        {
3002                debug(1000, "out -> NULL detect");
3003                return pos;
3004        }
3005
3006        tmptext = malloc(strlen(*text) + 2);
3007        if(tmptext == NULL)
3008        {
3009                err("no memory");
3010                return pos;
3011        }
3012
3013        if(strlen(*text) == 0)
3014        {
3015                tmptext[0] = zeichen;
3016                i = 1;
3017                pos = 0;
3018        }
3019        else
3020        {
3021                for(i = 0; i < strlen(*text) + 1; i++)
3022                {
3023                        if(i == pos)
3024                                tmptext[i] = zeichen;
3025                        else
3026                        {
3027                                tmptext[i] = (*text)[y];
3028                                y++;
3029                        }
3030                }
3031        }
3032        tmptext[i] = '\0';
3033
3034        free(*text);
3035        *text = tmptext;
3036        debug(1000, "out");
3037        return pos + 1;
3038}
3039
3040void calctext(char* buf, char* buf1, unsigned int* linecount, unsigned int* pagecount, unsigned int* poscount, int pagelen, int page)
3041{
3042        debug(1000, "in");
3043        unsigned int tmpposcount = 0;
3044
3045        *poscount = 0;
3046        *linecount = 1;
3047        *pagecount = 1;
3048
3049        page--;
3050        if(page < 0) page = 0;
3051
3052        if(buf != NULL)
3053        {
3054                while(*buf != '\0')
3055                {
3056                        if(*buf == '\n')
3057                        {
3058                                if(*(buf + 1) == '\0') break;
3059                                (*linecount)++;
3060
3061                                if(*linecount - 1 == pagelen * page)
3062                                        *poscount = tmpposcount + 1;
3063                        }
3064                        buf++;
3065                        tmpposcount++;
3066                }
3067        }
3068
3069        if(buf1 != NULL)
3070        {
3071                while(*buf1 != '\0')
3072                {
3073                        if(*buf1 == '\n')
3074                        {
3075                                if(*(buf1 + 1) == '\0') break;
3076                                (*linecount)++;
3077
3078                                if(*linecount - 1 == pagelen * page)
3079                                        *poscount = tmpposcount + 1;
3080                        }
3081                        buf1++;
3082                        tmpposcount++;
3083                }
3084        }
3085
3086        if(pagelen > 0)
3087                *pagecount = (int)ceil(((float)*linecount / pagelen));
3088
3089        debug(1000, "out");
3090}
3091
3092int initlocale(char *localepath)
3093{
3094        debug(1000, "in");
3095        setlocale(LC_ALL, "");
3096        if(bindtextdomain(PROGNAME, localepath) == NULL)
3097        {
3098                err("set bindtextdomain");
3099                return 1;
3100        }
3101        if(textdomain(PROGNAME) == NULL)
3102        {
3103                err("set textdomain");
3104                return 1;
3105        }
3106        debug(1000, "out");
3107        return 0;
3108}
3109
3110//for langage you must
3111//mkdir /usr/lib/locale
3112//ln -s %titanpath%/po /usr/lib/locale/po
3113//copy SYS_LC_MESSAGES from other language into LC_MESSAGE
3114int setlang(char *lang)
3115{
3116        debug(1000, "in");
3117        char *ret;
3118
3119        setenv("LANG", lang, 1);
3120        setenv("LANGUAGE", lang, 1);
3121        ret = setlocale(LC_MESSAGES, lang);
3122        if(ret == NULL)
3123        {
3124                err("can't set LC_MESSAGES to %s", lang);
3125                return 1;
3126        }
3127        debug(1000, "out");
3128        return 0;
3129}
3130
3131unsigned long readsysul(const char *filename, int line)
3132{
3133        debug(1000, "in");
3134        int i = 0, len = 0;
3135        unsigned long ret = 0;
3136        FILE *fd = NULL;
3137        char *fileline = NULL;
3138        char *buf1 = NULL;
3139
3140        fileline = malloc(MINMALLOC);
3141        if(fileline == NULL)
3142        {
3143                err("no memory");
3144                return 0;
3145        }
3146
3147        fd = fopen(filename, "r");
3148        if(fd == NULL)
3149        {
3150                perr("can't open %s", filename);
3151                free(fileline);
3152                return 0;
3153        }
3154
3155        for(i = 0; i < line; i++)
3156        {
3157                memset(fileline, 0, MINMALLOC);
3158                fgets(fileline, MINMALLOC, fd);
3159        }
3160
3161        len = strlen(fileline) - 1;
3162        if(len >= 0 && fileline[len] == '\n')
3163                fileline[len] = '\0';
3164        buf1 = ostrcat(fileline, NULL, 1, 0);
3165
3166        fclose(fd);
3167
3168        if(buf1 != NULL)
3169        {
3170                ret = strtoul(buf1, NULL, 10);
3171                free(buf1); buf1 = NULL;
3172        }
3173
3174        debug(1000, "out");
3175        return ret;
3176}
3177
3178
3179char* readsys(const char *filename, int line)
3180{
3181        debug(1000, "in");
3182        int i = 0, len = 0;
3183        FILE *fd = NULL;
3184        char *fileline = NULL;
3185        char *buf1 = NULL;
3186
3187        fileline = malloc(MINMALLOC);
3188        if(fileline == NULL)
3189        {
3190                err("no memory");
3191                return NULL;
3192        }
3193
3194        fd = fopen(filename, "r");
3195        if(fd == NULL)
3196        {
3197                perr("can't open %s", filename);
3198                free(fileline);
3199                return NULL;
3200        }
3201
3202        for(i = 0; i < line; i++)
3203        {
3204                memset(fileline, 0, MINMALLOC);
3205                fgets(fileline, MINMALLOC, fd);
3206        }
3207
3208        len = strlen(fileline) - 1;
3209        if(len >= 0 && fileline[len] == '\n')
3210                fileline[len] = '\0';
3211        buf1 = ostrcat(fileline, NULL, 1, 0);
3212
3213        fclose(fd);
3214
3215        debug(1000, "out");
3216        return buf1;
3217}
3218
3219//flag 0: without \n
3220//flag 1: with \n
3221int writesys(const char *filename, char *value, int flag)
3222{
3223        debug(1000, "in");
3224        FILE *fd = NULL;
3225        char* tmpstr = NULL;
3226        int ret;
3227
3228        if(value == NULL)
3229        {
3230                debug(1000, "out -> NULL detect");
3231                return 1;
3232        }
3233
3234        fd = fopen(filename, "w");
3235        if(fd == NULL)
3236        {
3237                perr("can't open %s", filename);
3238                return 1;
3239        }
3240
3241        if(flag == 1)
3242                tmpstr = ostrcat(value, "\n", 0, 0);
3243        else
3244                tmpstr = ostrcat(value, NULL, 0, 0);
3245
3246        ret = fwrite(tmpstr, strlen(tmpstr), 1, fd);
3247        if(ret != 1)
3248        {
3249                perr("writting to %s", filename);
3250                free(tmpstr);
3251                fclose(fd);
3252                return 1;
3253        }
3254
3255        free(tmpstr);
3256        fclose(fd);
3257        debug(1000, "out");
3258        return 0;
3259}
3260
3261int writesysint(const char *filename, int value, int flag)
3262{
3263        debug(1000, "in");
3264        char* tmpstr = NULL;
3265        int ret = 0;
3266
3267        tmpstr = oitoa(value);
3268        ret = writesys(filename, tmpstr, flag);
3269
3270        free(tmpstr);
3271        debug(1000, "out");
3272        return ret;
3273}
3274
3275char* getdevcontent(char* devconfig)
3276{
3277        debug(1000, "in");
3278        char *dev = NULL;
3279        char *value = NULL;
3280
3281        dev = getconfig(devconfig, NULL);
3282
3283        if(dev == NULL)
3284        {
3285                debug(1000, "out -> NULL detect");
3286                return NULL;
3287        }
3288
3289        value = readsys(dev, 1);
3290        if(value == NULL)
3291        {
3292                debug(1000, "out -> NULL detect");
3293                return NULL;
3294        }
3295
3296        debug(1000, "out");
3297        return value;
3298}
3299
3300char* convertspacetolf(char* value)
3301{
3302        debug(1000, "in");
3303        int i = 0;
3304
3305        while(value[i] != '\0')
3306        {
3307                if(value[i] == ' ')
3308                        value[i] = '\n';
3309                i++;
3310        }
3311
3312        debug(1000, "out");
3313        return value;
3314}
3315
3316char* getcolorformatchoices()
3317{
3318        debug(1000, "in");
3319        char *colorformatchoicesdev = NULL;
3320        char *value = NULL;
3321
3322        colorformatchoicesdev = getconfig("colorformatchoicesdev", NULL);
3323
3324        if(colorformatchoicesdev == NULL)
3325        {
3326                debug(1000, "out -> NULL detect");
3327                return NULL;
3328        }
3329
3330        value = readsys(colorformatchoicesdev, 1);
3331        if(value == NULL)
3332        {
3333                debug(1000, "out -> NULL detect");
3334                return NULL;
3335        }
3336
3337        value = convertspacetolf(value);
3338
3339        debug(1000, "out");
3340        return value;
3341}
3342
3343char* getaudiosourcechoices()
3344{
3345        debug(1000, "in");
3346        char *audiosourcechoicesdev = NULL;
3347        char *value = NULL;
3348
3349        audiosourcechoicesdev = getconfig("audiosourcechoicesdev", NULL);
3350
3351        if(audiosourcechoicesdev == NULL)
3352        {
3353                debug(1000, "out -> NULL detect");
3354                return NULL;
3355        }
3356
3357        value = readsys(audiosourcechoicesdev, 1);
3358        if(value == NULL)
3359        {
3360                debug(1000, "out -> NULL detect");
3361                return NULL;
3362        }
3363
3364        value = convertspacetolf(value);
3365
3366        debug(1000, "out");
3367        return value;
3368}
3369
3370char* getac3choices()
3371{
3372        debug(1000, "in");
3373        char *ac3choicesdev = NULL;
3374        char *value = NULL;
3375
3376        ac3choicesdev = getconfig("ac3choicesdev", NULL);
3377
3378        if(ac3choicesdev == NULL)
3379        {
3380                debug(1000, "out -> NULL detect");
3381                return NULL;
3382        }
3383
3384        value = readsys(ac3choicesdev, 1);
3385        if(value == NULL)
3386        {
3387                debug(1000, "out -> NULL detect");
3388                return NULL;
3389        }
3390
3391        value = convertspacetolf(value);
3392
3393        debug(1000, "out");
3394        return value;
3395}
3396
3397int setciclock(int slotnr, char* value)
3398{
3399        debug(1000, "in");
3400        char* ciclockdev = NULL, *tmpstr = NULL;
3401        int ret = 0;
3402
3403        ciclockdev = getconfig("ciclockdev", NULL);
3404
3405        if(ciclockdev != NULL && value != NULL)
3406        {
3407                tmpstr = malloc(MINMALLOC);
3408                if(tmpstr == NULL)
3409                {
3410                        err("no mem");
3411                        return 1;
3412                }
3413
3414                snprintf(tmpstr, MINMALLOC, ciclockdev, slotnr);
3415                debug(100, "set %s to %s", tmpstr, value);
3416                ret = writesys(tmpstr, value, 0);
3417
3418                free(tmpstr); tmpstr = NULL;
3419                return ret;
3420        }
3421
3422        debug(1000, "out");
3423        return 0;
3424}
3425
3426int setciinput(int slotnr, char* value)
3427{
3428        debug(1000, "in");
3429        char* ciinputdev = NULL, *tmpstr = NULL;
3430        int ret = 0;
3431
3432        ciinputdev = getconfig("ciinputdev", NULL);
3433
3434        if(ciinputdev != NULL && value != NULL)
3435        {
3436                tmpstr = malloc(MINMALLOC);
3437                if(tmpstr == NULL)
3438                {
3439                        err("no mem");
3440                        return 1;
3441                }
3442
3443                snprintf(tmpstr, MINMALLOC, ciinputdev, slotnr);
3444                debug(100, "set %s to %s", tmpstr, value);
3445                ret = writesys(tmpstr, value, 0);
3446
3447                free(tmpstr); tmpstr = NULL;
3448                return ret;
3449        }
3450
3451        debug(1000, "out");
3452        return 0;
3453}
3454
3455int setcisource(int tunernr, char* value)
3456{
3457        debug(1000, "in");
3458        char* cisourcedev = NULL, *tmpstr = NULL;
3459        int ret = 0;
3460
3461        cisourcedev = getconfig("cisourcedev", NULL);
3462
3463        if(cisourcedev != NULL && value != NULL)
3464        {
3465                tmpstr = malloc(MINMALLOC);
3466                if(tmpstr == NULL)
3467                {
3468                        err("no mem");
3469                        return 1;
3470                }
3471
3472                snprintf(tmpstr, MINMALLOC, cisourcedev, tunernr);
3473                debug(100, "set %s to %s", tmpstr, value);
3474                ret = writesys(tmpstr, value, 0);
3475
3476                free(tmpstr); tmpstr = NULL;
3477                return ret;
3478        }
3479
3480        debug(1000, "out");
3481        return 0;
3482}
3483
3484int setinput(char* value)
3485{
3486        debug(1000, "in");
3487        char* inputdev = NULL;
3488        int ret = 0;
3489
3490        inputdev = getconfig("inputdev", NULL);
3491
3492        if(inputdev != NULL && value != NULL)
3493        {
3494                debug(100, "set %s to %s", inputdev, value);
3495                ret = writesys(inputdev, value, 0);
3496                return ret;
3497        }
3498
3499        debug(1000, "out");
3500        return 0;
3501}
3502
3503char* getinput()
3504{
3505        debug(1000, "in");
3506        char *inputdev = NULL;
3507        char *value = NULL;
3508
3509        inputdev = getconfig("inputdev", NULL);
3510
3511        if(inputdev == NULL)
3512        {
3513                debug(1000, "out -> NULL detect");
3514                return NULL;
3515        }
3516
3517        value = readsys(inputdev, 1);
3518        if(value == NULL)
3519        {
3520                debug(1000, "out -> NULL detect");
3521                return NULL;
3522        }
3523
3524        debug(1000, "out");
3525        return value;
3526}
3527
3528int setac3(char* value)
3529{
3530        debug(1000, "in");
3531        char* ac3dev = NULL;
3532        int ret = 0;
3533
3534        ac3dev = getconfig("ac3dev", NULL);
3535
3536        if(ac3dev != NULL && value != NULL)
3537        {
3538                debug(100, "set %s to %s", ac3dev, value);
3539                ret = writesys(ac3dev, value, 0);
3540                if(ret == 0) addconfig("av_ac3mode", value);
3541                return ret;
3542        }
3543
3544        debug(1000, "out");
3545        return 0;
3546}
3547
3548char* getac3()
3549{
3550        debug(1000, "in");
3551        char *ac3dev = NULL;
3552        char *value = NULL;
3553
3554        ac3dev = getconfig("ac3dev", NULL);
3555
3556        if(ac3dev == NULL)
3557        {
3558                debug(1000, "out -> NULL detect");
3559                return NULL;
3560        }
3561
3562        value = readsys(ac3dev, 1);
3563        if(value == NULL)
3564        {
3565                debug(1000, "out -> NULL detect");
3566                return NULL;
3567        }
3568
3569        debug(1000, "out");
3570        return value;
3571}
3572
3573char* getpolicychoices()
3574{
3575        debug(1000, "in");
3576        char *policychoicesdev = NULL;
3577        char *value = NULL;
3578
3579        policychoicesdev = getconfig("policychoicesdev", NULL);
3580
3581        if(policychoicesdev == NULL)
3582        {
3583                debug(1000, "out -> NULL detect");
3584                return NULL;
3585        }
3586
3587        value = readsys(policychoicesdev, 1);
3588        if(value == NULL)
3589        {
3590                debug(1000, "out -> NULL detect");
3591                return NULL;
3592        }
3593
3594        value = convertspacetolf(value);
3595
3596        debug(1000, "out");
3597        return value;
3598}
3599
3600char* getpolicy()
3601{
3602        debug(1000, "in");
3603        char *policydev = NULL;
3604        char *value = NULL;
3605
3606        policydev = getconfig("policydev", NULL);
3607
3608        if(policydev == NULL)
3609        {
3610                debug(1000, "out -> NULL detect");
3611                return NULL;
3612        }
3613
3614        value = readsys(policydev, 1);
3615        if(value == NULL)
3616        {
3617                debug(1000, "out -> NULL detect");
3618                return NULL;
3619        }
3620
3621        debug(1000, "out");
3622        return value;
3623}
3624
3625int setpolicy(char* value)
3626{
3627        debug(1000, "in");
3628        char* policydev;
3629        int ret = 0;
3630
3631        policydev = getconfig("policydev", NULL);
3632
3633        if(policydev != NULL && value != NULL)
3634        {
3635                debug(100, "set %s to %s", policydev, value);
3636                ret = writesys(policydev, value, 0);
3637                if(ret == 0) addconfig("av_policy", value);
3638                return ret;
3639        }
3640
3641        debug(1000, "out");
3642        return 0;
3643}
3644
3645char* getaspectchoices()
3646{
3647        debug(1000, "in");
3648        char *aspectchoicesdev = NULL;
3649        char *value = NULL;
3650
3651        aspectchoicesdev = getconfig("aspectchoicesdev", NULL);
3652
3653        if(aspectchoicesdev == NULL)
3654        {
3655                debug(1000, "out -> NULL detect");
3656                return NULL;
3657        }
3658
3659        value = readsys(aspectchoicesdev, 1);
3660        if(value == NULL)
3661        {
3662                debug(1000, "out -> NULL detect");
3663                return NULL;
3664        }
3665
3666        value = convertspacetolf(value);
3667
3668        debug(1000, "out");
3669        return value;
3670}
3671
3672char* getaspect()
3673{
3674        debug(1000, "in");
3675        char *aspectdev = NULL;
3676        char *value = NULL;
3677
3678        aspectdev = getconfig("aspectdev", NULL);
3679
3680        if(aspectdev == NULL)
3681        {
3682                debug(1000, "out -> NULL detect");
3683                return NULL;
3684        }
3685
3686        value = readsys(aspectdev, 1);
3687        if(value == NULL)
3688        {
3689                debug(1000, "out -> NULL detect");
3690                return NULL;
3691        }
3692
3693        debug(1000, "out");
3694        return value;
3695}
3696
3697int setaspect(char* value)
3698{
3699        debug(1000, "in");
3700        char* aspectdev;
3701        int ret = 0;
3702
3703        aspectdev = getconfig("aspectdev", NULL);
3704
3705        if(aspectdev != NULL && value != NULL)
3706        {
3707                debug(100, "set %s to %s", aspectdev, value);
3708                ret = writesys(aspectdev, value, 0);
3709                if(ret == 0) addconfig("av_aspect", value);
3710                return ret;
3711        }
3712
3713        debug(1000, "out");
3714        return 0;
3715}
3716
3717char* getvideomodechoices()
3718{
3719        debug(1000, "in");
3720        char *videomodechoicesdev = NULL;
3721        char *value = NULL;
3722
3723        videomodechoicesdev = getconfig("videomodechoicesdev", NULL);
3724
3725        if(videomodechoicesdev == NULL)
3726        {
3727                debug(1000, "out -> NULL detect");
3728                return NULL;
3729        }
3730
3731        value = readsys(videomodechoicesdev, 1);
3732        if(value == NULL)
3733        {
3734                debug(1000, "out -> NULL detect");
3735                return NULL;
3736        }
3737
3738        if(status.expertmodus < 10)
3739        {
3740                value = string_replace("1080p60", "", value, 1);
3741                value = string_replace("  ", " ", value, 1);
3742                value = string_replace("1080p59", "", value, 1);
3743                value = string_replace("  ", " ", value, 1);
3744                value = string_replace("1080p30", "", value, 1);
3745                value = string_replace("  ", " ", value, 1);
3746                value = string_replace("1080p25", "", value, 1);
3747                value = string_replace("  ", " ", value, 1);
3748                value = string_replace("1080p24", "", value, 1);
3749                value = string_replace("  ", " ", value, 1);
3750                value = string_replace("1080i60", "", value, 1);
3751                value = string_replace("  ", " ", value, 1);
3752                value = string_replace("720p60", "", value, 1);
3753                value = string_replace("  ", " ", value, 1);
3754        }
3755
3756        value = convertspacetolf(value);
3757
3758        debug(1000, "out");
3759        return value;
3760}
3761
3762char* getmode3dchoices()
3763{
3764        debug(1000, "in");
3765        char *mode3dchoicesdev = NULL;
3766        char *value = NULL;
3767
3768        mode3dchoicesdev = getconfig("mode3dchoicesdev", NULL);
3769
3770        if(mode3dchoicesdev == NULL)
3771        {
3772                return ostrcat("off\nsbs\ntab", "", 0, 0);
3773        }
3774
3775        value = readsys(mode3dchoicesdev, 1);
3776        if(value == NULL)
3777        {
3778                debug(1000, "out -> NULL detect");
3779                return NULL;
3780        }
3781
3782        value = convertspacetolf(value);
3783
3784        debug(1000, "out");
3785        return value;
3786}
3787
3788char* getmode3d()
3789{
3790        debug(1000, "in");
3791        char *mode3ddev = NULL;
3792        char *value = NULL;
3793
3794        mode3ddev = getconfig("mode3ddev", NULL);
3795
3796        if(mode3ddev == NULL)
3797        {
3798                debug(1000, "out -> NULL detect");
3799                return NULL;
3800        }
3801
3802        value = readsys(mode3ddev, 1);
3803        if(value == NULL)
3804        {
3805                debug(1000, "out -> NULL detect");
3806                return NULL;
3807        }
3808
3809        debug(1000, "out");
3810        return value;
3811}
3812
3813int setmode3d(char* value)
3814{
3815        debug(1000, "in");
3816        char* mode3ddev;
3817        int ret = 0;
3818
3819        mode3ddev = getconfig("mode3ddev", NULL);
3820
3821        if(mode3ddev != NULL && value != NULL)
3822        {
3823                debug(100, "set %s to %s", mode3ddev, value);
3824                ret = writesys(mode3ddev, value, 0);
3825                if(ret == 0) addconfig("av_mode3d", value);
3826                return ret;
3827        }
3828
3829        debug(1000, "out");
3830        return 0;
3831}
3832
3833char* getvideomode()
3834{
3835        debug(1000, "in");
3836        char *videomodedev = NULL;
3837        char *value = NULL;
3838
3839        videomodedev = getconfig("videomodedev", NULL);
3840
3841        if(videomodedev == NULL)
3842        {
3843                debug(1000, "out -> NULL detect");
3844                return NULL;
3845        }
3846
3847        value = readsys(videomodedev, 1);
3848        if(value == NULL)
3849        {
3850                debug(1000, "out -> NULL detect");
3851                return NULL;
3852        }
3853
3854        debug(1000, "out");
3855        return value;
3856}
3857
3858void switchvideomode()
3859{
3860        int rcret = 0;
3861        char* tmpstr = NULL;
3862        tmpstr = getvideomode();       
3863        struct skin* playpolicy = getscreen("playpolicy");
3864                       
3865        if(tmpstr != NULL)
3866        {
3867                if(ostrcmp("pal", tmpstr) == 0 || ostrncmp("576", tmpstr, 3) == 0)
3868                {
3869                        setvideomode("720p50", 0);
3870                        changefbresolution("720p50");
3871                        changetext(playpolicy, "720p50");
3872                }
3873                else if(ostrncmp("720", tmpstr, 3) == 0)
3874                {
3875                        setvideomode("1080i50", 0);
3876                        changefbresolution("1080i50");
3877                        changetext(playpolicy, "1080i50");
3878                }
3879                else if(ostrncmp("1080", tmpstr, 4) == 0)
3880                {
3881                        setvideomode("576i50", 0);
3882                        changefbresolution("576i50");
3883                        changetext(playpolicy, "576i50");
3884                }
3885                /*
3886                int ret = textbox(_("Message"), _("Is this Videomode ok ?"), _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 600, 200, 10, 0);
3887                if(ret == 0 || ret == 2)
3888                {
3889                        setvideomode(tmpstr, 0);
3890                        changefbresolution(tmpstr);
3891                }
3892                */
3893                drawscreen(playpolicy, 0, 0);
3894                while(1)
3895                {
3896                        rcret = waitrc(playpolicy, 5000, 0);
3897                        break;
3898                }
3899                clearscreen(playpolicy);
3900        }
3901        free(tmpstr);
3902}
3903
3904//flag 0: write videomode to config
3905//flag 1: don't write videomode to config
3906int setvideomode(char* value, int flag)
3907{
3908        debug(1000, "in");
3909        char* videomodedev;
3910        int ret = 0;
3911
3912        videomodedev = getconfig("videomodedev", NULL);
3913
3914        if(videomodedev != NULL && value != NULL)
3915        {
3916                debug(100, "set %s to %s", videomodedev, value);
3917                ret = writesys(videomodedev, value, 0);
3918                if(ret == 0 && flag == 0) addconfig("av_videomode", value);
3919                return ret;
3920        }
3921
3922        debug(1000, "out");
3923        return 0;
3924}
3925
3926int setcolorformat(char* value)
3927{
3928        debug(1000, "in");
3929        char* colorformatdev;
3930        int ret = 0;
3931
3932        colorformatdev = getconfig("colorformatdev", NULL);
3933
3934        if(colorformatdev != NULL && value != NULL)
3935        {
3936                debug(100, "set %s to %s", colorformatdev, value);
3937                ret = writesys(colorformatdev, value, 0);
3938                if(ret == 0) addconfig("av_colorformat", value);
3939                return ret;
3940        }
3941
3942        debug(1000, "out");
3943        return 0;
3944}
3945
3946char* getcolorformat(int line)
3947{
3948        debug(1000, "in");
3949        char *colorformatdev = NULL;
3950        char *value = NULL;
3951
3952        colorformatdev = getconfig("colorformatdev", NULL);
3953
3954        if(colorformatdev == NULL)
3955        {
3956                debug(1000, "out -> NULL detect");
3957                return NULL;
3958        }
3959
3960        value = readsys(colorformatdev, line);
3961        if(value == NULL)
3962        {
3963                debug(1000, "out -> NULL detect");
3964                return NULL;
3965        }
3966
3967        debug(1000, "out");
3968        return value;
3969}
3970
3971int setaudiosource(char* value)
3972{
3973        debug(1000, "in");
3974        char* audiosourcedev;
3975        int ret = 1;
3976
3977        audiosourcedev = getconfig("audiosourcedev", NULL);
3978
3979        if(audiosourcedev != NULL && value != NULL)
3980        {
3981                debug(100, "set %s to %s", audiosourcedev, value);
3982                ret = writesys(audiosourcedev, value, 0);
3983                if(ret == 0) addconfig("av_audiosource", value);
3984                return ret;
3985        }
3986
3987        debug(1000, "out");
3988        return 0;
3989}
3990
3991char* getaudiosource()
3992{
3993        debug(1000, "in");
3994        char *audiosourcedev = NULL;
3995        char *value = NULL;
3996
3997        audiosourcedev = getconfig("audiosourcedev", NULL);
3998
3999        if(audiosourcedev == NULL)
4000        {
4001                debug(1000, "out -> NULL detect");
4002                return NULL;
4003        }
4004
4005        value = readsys(audiosourcedev, 1);
4006        if(value == NULL)
4007        {
4008                debug(1000, "out -> NULL detect");
4009                return NULL;
4010        }
4011
4012        debug(1000, "out");
4013        return value;
4014}
4015
4016int setprogress(value)
4017{
4018        debug(1000, "in");
4019        char *progressdev;
4020
4021        progressdev = getconfig("progressdev", NULL);
4022
4023        if(progressdev != NULL)
4024        {
4025                debug(100, "set %s to %d",progressdev, value);
4026                return writesysint(progressdev, value, 0);
4027        }
4028
4029        debug(1000, "out");
4030        return 0;
4031}
4032
4033int setmute(int value)
4034{
4035        debug(1000, "in");
4036        char* mutedev;
4037        int tmpvol;
4038
4039        if(value == 2)
4040        {
4041                tmpvol = getvol();
4042                tmpvol = tmpvol * 50 / 100;
4043                setvol(tmpvol);
4044        }
4045        else
4046        {
4047                mutedev = getconfig("mutedev", NULL);
4048
4049                if(mutedev != NULL)
4050                {
4051                        debug(100, "set %s to %d", mutedev, value);
4052                        return writesysint(mutedev, value, 0);
4053                }
4054        }
4055        debug(1000, "out");
4056        return 0;
4057}
4058
4059int setvol(int value)
4060{
4061        debug(1000, "in");
4062        char* voldev;
4063        int ret = 0, tmpvol = value;
4064
4065        voldev = getconfig("voldev", NULL);
4066
4067        if(voldev != NULL)
4068        {
4069                if(value > 100) value = 100;
4070                if(value < 0) value = 0;
4071                value = 63 - value * 63 / 100;
4072                debug(100, "set %s to %d", voldev, value);
4073                ret = writesysint(voldev, value, 0);
4074                if(ret == 0 && status.mute != 2) addconfigint("vol", tmpvol);
4075                return ret;
4076        }
4077
4078        debug(1000, "out");
4079        return 0;
4080}
4081
4082int getvol()
4083{
4084        debug(1000, "in");
4085        char *voldev = NULL;
4086        char *value = NULL;
4087        int tmpvol = 0;
4088
4089        voldev = getconfig("voldev", NULL);
4090
4091        if(voldev == NULL)
4092        {
4093                debug(1000, "out -> NULL detect");
4094                return 0;
4095        }
4096
4097        value = readsys(voldev, 1);
4098        if(value == NULL)
4099        {
4100                debug(1000, "out -> NULL detect");
4101                return 0;
4102        }
4103
4104        tmpvol = atoi(value);
4105        free(value);
4106        tmpvol = 100 - tmpvol * 100 / 63;
4107
4108        debug(1000, "out");
4109        return tmpvol;
4110}
4111
4112void setdebuglevel()
4113{
4114        debug(1000, "in");
4115
4116        debug_level = getconfigint("debuglevel", NULL);
4117        debug(0, "set debug level to %d", debug_level);
4118
4119        debug(1000, "out");
4120}
4121
4122char* getxmlentry(char *line, char *searchstr)
4123{
4124        //debug(1000, "in");
4125        char *buf = NULL, *buf1 = NULL, *buf2 = NULL;
4126
4127        buf = ostrstr(line, searchstr);
4128        if(buf == NULL)
4129        {
4130                //debug(1000, "out -> searchstr=\"%s\" not found in line=\"%s\"", searchstr, line);
4131                return NULL;
4132        }
4133        buf = buf + strlen(searchstr);
4134        if(buf[0] == '"')
4135        {
4136                buf = buf + 1;
4137                buf1 = ostrcat(buf, NULL, 0, 0);
4138                if(buf1 == NULL)
4139                {
4140                        err("ostrcat failed");
4141                        return NULL;
4142                }
4143                buf2 = strchr(buf1, '"');
4144                if(buf2 == NULL)
4145                {
4146                        err("strchr returns NULL");
4147                        free(buf1);
4148                        return NULL;
4149                }
4150                buf2[0] = '\0';
4151        }
4152        else
4153        {
4154                buf1 = ostrcat(buf, NULL, 0, 0);
4155                if(buf1 == NULL)
4156                {
4157                        err("ostrcat failed");
4158                        return NULL;
4159                }
4160                buf2 = strchr(buf1, ' ');
4161                if(buf2 == NULL)
4162                {
4163                        buf2 = ostrstr(buf1, "/>");
4164                        if(buf2 == NULL)
4165                        {
4166                                buf2 = strchr(buf1, '>');
4167                                if(buf2 == NULL)
4168                                {
4169                                        err("strchr returns NULL");
4170                                        free(buf1);
4171                                        return NULL;
4172                                }
4173                        }
4174                }
4175                buf2[0] = '\0';
4176        }
4177        //debug(1000, "out");
4178        return buf1;
4179}
4180
4181char* readfiletomem(const char* filename, int flag)
4182{
4183        debug(1000, "in");
4184        FILE *fd = NULL;
4185        char *fileline = NULL, *buf = NULL, *buf1 = NULL;
4186        int buf1size = 0, buf1oldsize = 0;
4187
4188        fileline = malloc(MINMALLOC);
4189        if(fileline == NULL)
4190        {
4191                err("no memory");
4192                return NULL;
4193        }
4194
4195        fd = fopen(filename, "r");
4196        if(fd == NULL)
4197        {
4198                perr("can't open %s", filename);
4199                free(fileline);
4200                return NULL;
4201        }
4202
4203        while(fgets(fileline, MINMALLOC, fd) != NULL)
4204        {
4205                buf = fileline;
4206
4207                if(flag == 1)
4208                        if(buf[0] == '#' || buf[0] == '\n')
4209                                continue;
4210
4211                buf1oldsize = buf1size;
4212                buf1size += strlen(buf);
4213                buf1 = realloc(buf1, buf1size + 1);
4214                if(buf1 == NULL)
4215                {
4216                        err("no memory");
4217                        free(fileline);
4218                        fclose(fd);
4219                        return NULL;
4220                }
4221
4222                sprintf(buf1 + buf1oldsize, "%s", buf);
4223        }
4224
4225        free(fileline);
4226        fclose(fd);
4227        debug(1000, "out");
4228        return buf1;
4229}
4230
4231char* readeittomem(const char* filename)
4232{
4233        unsigned char byte;
4234        FILE *fil = NULL;
4235        char *zeichen = NULL, *buf = NULL, *buf1 = NULL;
4236        int buf1size = 0, buf1oldsize = 0;
4237        int Beschreibung;
4238  int len;
4239
4240        zeichen = malloc(255);
4241        if(zeichen == NULL)
4242        {
4243                err("no memory");
4244                return NULL;
4245        }
4246        buf = malloc(255);
4247        if(buf == NULL)
4248        {
4249                free(zeichen);
4250                err("no memory");
4251                return NULL;
4252        }
4253
4254        fil = fopen(filename, "r");
4255        if(fil == NULL)
4256        {
4257                err("can't open %s", filename);
4258                free(zeichen);
4259                free(buf);
4260                return NULL;
4261        }
4262        Beschreibung = 0;
4263        fseek(fil, 12, SEEK_SET); //ersten 12 Byte nicht relevant
4264        while(!feof(fil)) {
4265                byte=fgetc(fil);
4266     
4267                if (byte == 0x4D) {
4268                        fseek(fil, 4,SEEK_CUR);
4269                        byte=fgetc(fil);
4270                        len = byte + 0;
4271      byte=fgetc(fil);
4272      fgets(zeichen,len,fil);
4273                        if (byte != 0x05)
4274                                sprintf(buf,"%c%s\n", byte,zeichen);
4275                        else
4276                                sprintf(buf,"%s\n", zeichen);
4277
4278                        buf1oldsize = buf1size;
4279                        buf1size += strlen(buf);
4280                        buf1 = realloc(buf1, buf1size + 1);
4281                        if(buf1 == NULL)
4282                        {
4283                                err("no memory");
4284                                free(zeichen);
4285                                free(buf);
4286                                fclose(fil);
4287                                return NULL;
4288                        }
4289        sprintf(buf1 + buf1oldsize, "%s", buf);
4290       
4291                        //printf("T %s\n", zeichen);
4292                        byte=fgetc(fil);
4293                        len = byte + 0;
4294                        byte=fgetc(fil);
4295                        fgets(zeichen,len,fil);
4296                        if (byte != 0x05)
4297                                sprintf(buf,"%c%s\n\n", byte,zeichen);
4298                        else
4299                                sprintf(buf,"%s\n\n", zeichen);
4300                               
4301                        buf1oldsize = buf1size;
4302                        buf1size += strlen(buf);
4303                        buf1 = realloc(buf1, buf1size + 1);
4304                        if(buf1 == NULL)
4305                        {
4306                                err("no memory");
4307                                free(zeichen);
4308                                free(buf);
4309                                fclose(fil);
4310                                return NULL;
4311                        }
4312        sprintf(buf1 + buf1oldsize, "%s", buf);
4313
4314                }
4315                else if (byte == 0x4E) {
4316                        fseek(fil, 6,SEEK_CUR);
4317                        byte=fgetc(fil);
4318                        len = byte;
4319                        byte=fgetc(fil);
4320                        fgets(zeichen,len,fil);
4321                        if (Beschreibung == 0) {
4322                                if (byte != 0x05)
4323                                        sprintf(buf,"%c%s", byte,zeichen);
4324                                else
4325                                        sprintf(buf,"%s", zeichen);
4326                                Beschreibung = 1;
4327                        }
4328                        else {
4329                                if (byte != 0x05)
4330                                        sprintf(buf,"%c%s", byte,zeichen);
4331                                else
4332                                        sprintf(buf,"%s", zeichen);
4333                        }       
4334
4335                        buf1oldsize = buf1size;
4336                        buf1size += strlen(buf);
4337                        buf1 = realloc(buf1, buf1size + 1);
4338                        if(buf1 == NULL)
4339                        {
4340                                err("no memory");
4341                                free(zeichen);
4342                                free(buf);
4343                                fclose(fil);
4344                                return NULL;
4345                        }
4346        sprintf(buf1 + buf1oldsize, "%s", buf);     
4347                 
4348                } 
4349                else {
4350                        byte=fgetc(fil);
4351                        len= byte;
4352                        fgets(zeichen,len+1,fil);
4353                } 
4354        }
4355        free(zeichen);
4356        free(buf);
4357        fclose(fil);
4358        return buf1;
4359}
4360
4361char* command(char* input)
4362{
4363        debug(1000, "in");
4364        char* tmpstr = NULL, *fileline = NULL;
4365        FILE *iopipe = NULL;
4366       
4367        if(input == NULL) return NULL;
4368
4369        fileline = malloc(MINMALLOC);
4370        if(fileline == NULL)
4371        {
4372                err("no memory");
4373                return NULL;
4374        }
4375
4376        if((iopipe = popen(input, "r")) == NULL)
4377        {
4378                free(fileline);
4379                return NULL;
4380        }
4381
4382        while(!feof(iopipe))
4383        {
4384                if(fgets(fileline, MINMALLOC, iopipe) != NULL)
4385                        tmpstr = ostrcat(tmpstr, fileline, 1, 0);
4386        }
4387
4388        free(fileline);
4389        pclose(iopipe);
4390        debug(1000, "out");
4391        return tmpstr;
4392}
4393
4394char* string_tolower(char *str)
4395{
4396        debug(1000, "in");
4397        int i;
4398
4399        if(str == NULL) return NULL;
4400
4401        for( i = 0; i < strlen(str); i++)
4402                str[i] = tolower(str[i]);
4403
4404        debug(1000, "out");
4405        return str;
4406}
4407
4408char* string_toupper(char *str)
4409{
4410        debug(1000, "in");
4411        int i;
4412
4413        if(str == NULL) return NULL;
4414
4415        for( i = 0; i < strlen(str); i++)
4416                str[i] = toupper(str[i]);
4417
4418        debug(1000, "out");
4419        return str;
4420}
4421
4422char* stringreplacecharonce(char *str, char c1, char c2)
4423{
4424        debug(1000, "in");
4425        int i;
4426
4427        if(str == NULL) return NULL;
4428
4429        for( i = 0; i < strlen(str); i++)
4430        {
4431                if(str[i] == c1)
4432                {
4433                        str[i] = c2;
4434                        break;
4435                }
4436        }
4437
4438        debug(1000, "out");
4439        return str;
4440}
4441
4442char* stringreplacechar(char *str, char c1, char c2)
4443{
4444        debug(1000, "in");
4445        int i;
4446
4447        if(str == NULL) return NULL;
4448
4449        for( i = 0; i < strlen(str); i++)
4450                if(str[i] == c1) str[i] = c2;
4451
4452        debug(1000, "out");
4453        return str;
4454}
4455
4456char* string_removechar(char *str)
4457{
4458        debug(1000, "in");
4459        int i;
4460
4461        if(str == NULL) return NULL;
4462
4463        for( i = 0; i < strlen(str); i++)
4464        {
4465                if(str[i] == '.') str[i] = ' ';
4466                if(str[i] == '-') str[i] = ' ';
4467                if(str[i] == '_') str[i] = ' ';
4468                if(str[i] == '/') str[i] = ' ';
4469        }
4470        debug(1000, "out");
4471        return str;
4472}
4473
4474char* string_withchars2return(char *str)
4475{
4476        debug(1000, "in");
4477        int i;
4478
4479        for( i = 0; i < strlen(str); i++)
4480        {
4481                if(str[i] == ' ') str[i] = '\n';
4482        }
4483
4484        debug(1000, "out");
4485        return str;
4486}
4487
4488char* string_remove_whitechars(char *text)
4489{
4490        debug(1000, "in");
4491        char *p1 = text, *p2 = text;
4492
4493        while(*p1 != '\0')
4494        {
4495                if(*p1 == ' ')
4496                        ++p1;
4497                else
4498                        *p2++ = *p1++;
4499        }
4500        *p2 = '\0';
4501
4502        debug(1000, "out");
4503        return text;
4504}
4505
4506char* strstrip(char *text)
4507{
4508        debug(1000, "in");
4509        char* tmpstr = text;
4510
4511        if(text == NULL) return NULL;
4512        int len = strlen(text);
4513
4514        while(isspace(tmpstr[len - 1])) tmpstr[--len] = '\0';
4515        while(*tmpstr && isspace(*tmpstr)) ++tmpstr, --len;
4516
4517        memmove(text, tmpstr, len + 1);
4518
4519        debug(1000, "out");
4520        return text;
4521}
4522
4523char* string_strip_whitechars(char *text)
4524{
4525        debug(1000, "in");
4526        int i;
4527
4528        if(text == NULL)
4529        {
4530                debug(1000, "out -> NULL detect");
4531                return NULL;
4532        }
4533
4534//      text = string_removechar(text);
4535
4536        for(i = 0; text[i] != '\0'; i++)
4537        {
4538                if(text[i] == ' ' && text[i + 1] == ' ')
4539                {
4540                        int i2 = i + 1;
4541                        for(; text[i2] != '\0'; i2++)
4542                        {
4543                                text[i] = text[i2];
4544                                i++;
4545                        }
4546                        text[i2 - 1] = '\0';
4547                        i = -1;
4548                }
4549        }
4550
4551        debug(1000, "out");
4552        return text;
4553}
4554
4555char* string_replace_remove_last_chars(char *search, char *replace, char *string, int free1)
4556{
4557        debug(1000, "in");
4558        char* searchpos = NULL;
4559        char* tmpstr = NULL;
4560
4561        if(string == NULL || search == NULL)
4562        {
4563                tmpstr = ostrcat(tmpstr, string, 1, 0);
4564                if(free1 == 1) free(string);
4565                return tmpstr;
4566        }
4567
4568        searchpos = ostrstr(string, search);
4569
4570        if(searchpos == NULL)
4571        {
4572                tmpstr = ostrcat(tmpstr, string, 1, 0);
4573                if(free1 == 1) free(string);
4574                return tmpstr;
4575        }
4576
4577        tmpstr = strndup(string, searchpos - string);
4578        if(replace != NULL)
4579                tmpstr = ostrcat(tmpstr, replace, 1, 0);
4580
4581        if(free1 == 1) free(string);
4582
4583        debug(1000, "out");
4584        return tmpstr;
4585}
4586
4587char* string_replace(char *search, char *replace, char *string, int free1)
4588{
4589        debug(1000, "in");
4590        char* searchpos = NULL;
4591        char* tmpstr = NULL;
4592
4593        if(string == NULL || search == NULL)
4594        {
4595                tmpstr = ostrcat(tmpstr, string, 1, 0);
4596                if(free1 == 1) free(string);
4597                return tmpstr;
4598        }
4599
4600        searchpos = ostrstr(string, search);
4601
4602        if(searchpos == NULL)
4603        {
4604                tmpstr = ostrcat(tmpstr, string, 1, 0);
4605                if(free1 == 1) free(string);
4606                return tmpstr;
4607        }
4608
4609        tmpstr = strndup(string, searchpos - string);
4610        if(replace == NULL)
4611                tmpstr = ostrcat(tmpstr, NULL, 1, 0);
4612        else
4613                tmpstr = ostrcat(tmpstr, replace, 1, 0);
4614        tmpstr = ostrcat(tmpstr, string + (searchpos - string) + strlen(search), 1, 0);
4615
4616        if(free1 == 1) free(string);
4617
4618        debug(1000, "out");
4619        return tmpstr;
4620}
4621
4622//flag 0: search full str
4623//flag 1: search only end of string
4624char* ostrrstrcase(char* str, char* search, int len, int flag)
4625{
4626        int slen = 0;
4627        char* tmpstr = NULL;
4628
4629        if(str == NULL || search == NULL) return NULL;
4630
4631        if(len == -1) len = strlen(str);
4632        slen = strlen(search);
4633        if(slen > len) return NULL;
4634
4635        for(tmpstr = str + len - slen; tmpstr >= str; tmpstr--)
4636        {
4637                if(strncasecmp(tmpstr, search, slen) == 0)
4638                        return tmpstr;
4639                if(flag == 1) return NULL;
4640        }
4641
4642        return NULL;
4643}
4644
4645//flag 0: search full str
4646//flag 1: search only end of string
4647char* ostrrstr(char* str, char* search, int len, int flag)
4648{
4649        int slen = 0;
4650        char* tmpstr = NULL;
4651
4652        if(str == NULL || search == NULL) return NULL;
4653
4654        if(len == -1) len = strlen(str);
4655        slen = strlen(search);
4656        if(slen > len) return NULL;
4657
4658        for(tmpstr = str + len - slen; tmpstr >= str; tmpstr--)
4659        {
4660                if(strncmp(tmpstr, search, slen) == 0)
4661                        return tmpstr;
4662                if(flag == 1) return NULL;
4663        }
4664
4665        return NULL;
4666}
4667
4668char* ostrstr(char* str, char* search)
4669{
4670        //debug(1000, "in");
4671        char* ret = NULL;
4672
4673        if(str == NULL || search == NULL) return NULL;
4674        ret = strstr(str, search);
4675
4676        //debug(1000, "out");
4677        return ret;
4678}
4679
4680int file_exist(char* filename)
4681{
4682        debug(1000, "in");
4683        if (access(filename, F_OK) == 0)
4684                return 1;
4685        else
4686                return 0;
4687}
4688
4689char* string_newline(char* str)
4690{
4691        debug(1000, "in");
4692        if(str == NULL) return NULL;
4693
4694        int size = strlen(str);
4695
4696        if(str[size - 1] == '\n')
4697                str[size - 1] = '\0';
4698        debug(1000, "out");
4699        return str;
4700}
4701
4702char* string_quote(char* str)
4703{
4704        debug(1000, "in");
4705        char* tmpstr = NULL;
4706
4707        tmpstr = ostrcat("\"", str, 0, 0);
4708        tmpstr = ostrcat(tmpstr, "\"", 1, 0);
4709        debug(1000, "out");
4710        return tmpstr;
4711}
4712
4713struct splitstr* strsplit(char *str, char *tok, int* count)
4714{
4715        debug(1000, "in");
4716        char *tmpstr = NULL;
4717        struct splitstr *tmparray = NULL;
4718        *count = 0;
4719
4720        if(str == NULL || tok == NULL)
4721                return NULL;
4722
4723        tmpstr = strtok(str, tok);
4724        while(tmpstr != NULL)
4725        {
4726                *count = *count + 1;
4727                tmparray = (struct splitstr*)realloc(tmparray, sizeof(struct splitstr*) * (*count));
4728                if(tmparray == NULL)
4729                        return NULL;
4730                (&tmparray[(*count) - 1])->part = tmpstr;
4731                tmpstr = strtok(NULL, tok);
4732        }
4733
4734        debug(1000, "out");
4735        return tmparray;
4736}
4737
4738char* string_shortname(char *tmpfilename, int mode)
4739{
4740        debug(50, "in %s",tmpfilename);
4741
4742//      char replacelist[] = "avi mkv x264 se disc0 disc1 disc2 disc3 disc4 0disc 1disc 2disc 3disc 4disc season0 season1 season2 season3 season4 season5 season6 season7 season8 season9 hdtv 720p 1080i 1080p uncut cd0 cd1 cd2 cd3 cd4 cd5 cd6 cd7 cd8 cd9 dvd0 dvd1 dvd2 dvd3 dvd4 ac3d ac3 bdrip bluray cam camrip complete custom cut dc directors dl doku dts dvdr dvdrip dvdscr dvdscreener extended french finnish german hd hddvd hddvdrip hdtv int internal int ld limited multi multisubs nordic ntsc pal pl r1 r5 recut remastered repack rip screener se see special.edition sse stv subbed swedish staffel tc telecine telesync ts unrated ws xxx italian";
4743        char* str = NULL;
4744
4745        if (mode==1)
4746        {
4747                char* replacelist = "avi mkv x264 xvid se uncut ac3d ac3hd ac3 bdrip bluray cam camrip complete custom cut dc directors dl doku dts dvdr dvdrip dvdscr dvdscreener ecc extended french finnish german hd hddvd hddvdrip hdtv int internal int ld limited multi multisubs nordic ntsc pal pl r1 r5 recut remastered repack rip screener se see special.edition sse stv subbed swedish staffel tc telecine telesync ts unrated ws xxx italian";
4748                str = ostrcat(str, replacelist, 1, 0);
4749        }
4750        else if (mode==2)
4751        {
4752                char* replacelist = "avi mkv x264 xvid se uncut ac3d ac3hd ac3 bdrip bluray cam camrip complete custom cut dc directors dl doku dts dvdr dvdrip dvdscr dvdscreener ecc extended french finnish german hd hddvd hddvdrip hdtv int internal int ld limited multi multisubs nordic ntsc pal pl r1 r5 recut remastered repack rip screener se see special.edition sse stv subbed swedish staffel tc telecine telesync ts unrated ws xxx italian disc0 disc1 disc2 disc3 disc4 0disc 1disc 2disc 3disc 4disc season0 season1 season2 season3 season4 season5 season6 season7 season8 season9 hdtv 720p 1080i 1080p cd0 cd1 cd2 cd3 cd4 cd5 cd6 cd7 cd8 cd9 dvd0 dvd1 dvd2 dvd3 dvd4";
4753                str = ostrcat(str, replacelist, 1, 0);
4754        }
4755        else
4756        {
4757                char* replacelist = "disc0 disc1 disc2 disc3 disc4 0disc 1disc 2disc 3disc 4disc season0 season1 season2 season3 season4 season5 season6 season7 season8 season9 hdtv 720p 1080i 1080p cd0 cd1 cd2 cd3 cd4 cd5 cd6 cd7 cd8 cd9 dvd0 dvd1 dvd2 dvd3 dvd4";
4758                str = ostrcat(str, replacelist, 1, 0);
4759        }
4760
4761        char* replace = NULL;
4762        struct splitstr* ret1 = NULL;
4763        int count = 0;
4764        int i = 0;
4765        ret1 = strsplit(str, " ", &count);
4766        int max = count - 1;
4767        int first = 1;
4768
4769        for(i = 0; i < max; i++)
4770        {
4771                struct splitstr* ret2 = NULL;
4772                int count2 = 0;
4773                int j = 0;
4774                char *tmpstr = NULL;
4775                tmpstr = ostrcat(tmpstr, tmpfilename, 1, 0);
4776                ret2 = strsplit(tmpstr, " ,.-_", &count2);
4777
4778                for(j = 0; j < count2; j++)
4779                {
4780                        if(j > 0)
4781                        {                                       
4782                                if(ostrcmp((&ret1[i])->part, (&ret2[j])->part) == 0)
4783                                {
4784                                        if (mode==1)
4785                                        {
4786                                                tmpfilename = string_replace((&ret2[j])->part, replace, tmpfilename, 1);
4787                                                continue;
4788                                        }
4789                                        else if (mode==2)
4790                                        {
4791                                                tmpfilename = string_replace_remove_last_chars((&ret2[j])->part, replace, tmpfilename, 1);
4792                                                break;
4793                                        }
4794                                        else
4795                                        {
4796                                                tmpfilename = string_replace((&ret2[j])->part, replace, tmpfilename, 1);
4797                                                continue;
4798                                        }
4799                                }
4800                                else if (first == 1 && mode == 2)
4801                                {
4802//                                      printf("zahl: %s\n", (&ret2[j])->part);
4803                                        int theCharacter = atoi((&ret2[j])->part);
4804                                        if(theCharacter != 0)
4805                                        {
4806//                                              printf("found zahl: %s\n", (&ret2[j])->part);
4807                                                if(theCharacter > 1800 && theCharacter < 2100)
4808                                                {
4809//                                                      printf("found year: %s\n", (&ret2[j])->part);
4810                                                        tmpfilename = string_replace_remove_last_chars((&ret2[j])->part, "", tmpfilename, 1);
4811                                                        break;
4812                                                }
4813                                        }
4814                                }                               
4815                        }
4816                }
4817                free(ret2); ret2 = NULL;
4818                first = 0;
4819                free(tmpstr), tmpstr = NULL;
4820        }
4821
4822        free(ret1); ret1 = NULL;
4823        free(replace); replace = NULL;
4824        free(str); str = NULL;
4825
4826        debug(50, "out %s", tmpfilename);
4827        return tmpfilename;
4828}
4829
4830char* get_uuid(char* device)
4831{
4832        debug(60, "in %s", device);
4833        char* cmd = NULL, *tmpstr = NULL;
4834       
4835        if(device == NULL) return NULL;
4836       
4837        cmd = ostrcat(cmd, "/bin/blkid -w /dev/null -c /dev/null -s UUID /dev/", 1, 0);
4838        cmd = ostrcat(cmd, device, 1, 0);
4839        cmd = ostrcat(cmd, " | cut -d'\"' -f2", 1, 0);
4840
4841        tmpstr = string_newline(command(cmd));
4842
4843        if(ostrcmp(string_newline(tmpstr), "") == 0)
4844        {
4845                free(tmpstr); tmpstr = NULL;
4846        }
4847
4848        debug(60, "out %s", cmd);
4849        free(cmd); cmd = NULL;
4850        return tmpstr;
4851}
4852
4853char* get_label(char* device)
4854{
4855        debug(60, "in %s", device);
4856        char* cmd = NULL, *tmpstr = NULL;
4857
4858        if(device == NULL) return NULL;
4859
4860        cmd = ostrcat(cmd, "/bin/blkid -w /dev/null -c /dev/null -s LABEL /dev/", 1, 0);
4861        cmd = ostrcat(cmd, device, 1, 0);
4862        cmd = ostrcat(cmd, " | cut -d'\"' -f2", 1, 0);
4863
4864        tmpstr = string_newline(command(cmd));
4865
4866        if(tmpstr == NULL)
4867                tmpstr = ostrcat(tmpstr, "NONLABEL", 1, 0);
4868
4869        if(ostrcmp(string_newline(tmpstr), "") == 0)
4870                tmpstr = ostrcat(tmpstr, "NONLABEL", 1, 0);
4871
4872        debug(60, "out %s", cmd);
4873        free(cmd); cmd = NULL;
4874        return tmpstr;
4875}
4876
4877char* get_filesystem(char* device)
4878{
4879        debug(60, "in %s", device);
4880        char* cmd = NULL, *tmpstr = NULL;
4881
4882        if(device == NULL) return NULL;
4883
4884        cmd = ostrcat(cmd, "/bin/blkid -w /dev/null -c /dev/null -s TYPE /dev/", 1, 0);
4885        cmd = ostrcat(cmd, device, 1, 0);
4886        cmd = ostrcat(cmd, " | cut -d'\"' -f2", 1, 0);
4887
4888        tmpstr = string_newline(command(cmd));
4889
4890        if(tmpstr == NULL)
4891                tmpstr = ostrcat(tmpstr, "NONTYPE", 1, 0);
4892
4893        if(ostrcmp(string_newline(tmpstr), "") == 0)
4894                tmpstr = ostrcat(tmpstr, "NONTYPE", 1, 0);
4895
4896        debug(60, "out %s", cmd);
4897        free(cmd); cmd = NULL;
4898        return tmpstr;
4899}
4900
4901//flag 0: convert ip to 000.000.000.000
4902//flag 1: convert ip to 0.0.0.0
4903char* fixip(char* ipinput, int flag)
4904{
4905        debug(60, "in %s", ipinput);
4906        int ret = 0;
4907        char* ipout = NULL;
4908        unsigned char ip[4];
4909       
4910        ip[0] = 0;
4911        ip[1] = 0;
4912        ip[2] = 0;
4913        ip[3] = 0;
4914
4915        if(ipinput == NULL) return NULL;
4916        ret = sscanf(ipinput, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]);
4917        if(ret != 4) return NULL;
4918
4919        ipout = malloc(16);
4920        if(ipout == NULL)
4921        {
4922                err("no mem");
4923                return NULL;
4924        }
4925
4926        if(flag == 1)
4927                snprintf(ipout, 16, "%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]);
4928        else
4929                snprintf(ipout, 16, "%03d.%03d.%03d.%03d", ip[0], ip[1], ip[2], ip[3]);
4930
4931        return ipout;
4932}
4933
4934void setfanspeed(int speed, int aktion)
4935{
4936        char* speedWert = NULL;
4937        char* speedSet = NULL;
4938
4939        if(speed < 0)
4940        {
4941                speedWert = getconfig("fanspeed", NULL);
4942                if(speedWert == NULL)
4943                        speedSet = ostrcat(speedSet, "170", 1, 0);
4944                else
4945                        speedSet = ostrcat(speedSet, speedWert, 1, 0);
4946        }
4947        else
4948        {
4949                if(speed == 0)
4950                        speedSet = ostrcat(speedSet, "115", 1, 0);
4951                else if(speed == 25)
4952                        speedSet = ostrcat(speedSet, "130", 1, 0);
4953                else if(speed == 50)
4954                        speedSet = ostrcat(speedSet, "145", 1, 0);
4955                else if(speed == 75)
4956                        speedSet = ostrcat(speedSet, "155", 1, 0);
4957                else
4958                        speedSet = ostrcat(speedSet, "170", 1, 0);
4959        }
4960
4961        writesys("/proc/stb/fan/fan_ctrl", speedSet, 1);
4962
4963        if(aktion == 1)
4964                addconfig("fanspeed", speedSet);
4965
4966        free(speedSet); speedSet=NULL;
4967}
4968
4969void setaktres()
4970{
4971        int m_width;
4972        char* res = NULL;
4973        char* res_akt = NULL;
4974        char* res_sd = NULL;
4975        int count=1;
4976        int sec = 0;
4977
4978        if(status.restimer == NULL) return;
4979        sec = (int)status.restimer->param1;
4980
4981        if(sec > 0)
4982        {
4983                while(status.restimer->aktion == START && count <= sec)
4984                {
4985                        sleep(1);
4986                        if(status.restimer->aktion != START)
4987                        {
4988                                status.restimer = NULL;
4989                                return;
4990                        }
4991                        count++;
4992                }
4993        }
4994
4995        if(videoreadqwidth(status.aktservice->videodev) == 0)
4996        {
4997                m_width = status.videosize.w;
4998                if (m_width == 720) {
4999                        res_sd = getconfig("av_videomode_autores_sd", NULL);
5000                        if(res_sd == NULL)
5001                                res = ostrcat(res, "576i50", 1, 0);
5002                        else
5003                                res = ostrcat(res, res_sd, 1, 0);
5004                }
5005                else if (m_width == 1280)
5006                        res = ostrcat(res, "720p50", 1, 0);
5007                else if (m_width == 1920)
5008                        res = ostrcat(res, "1080i50", 1, 0);
5009                else
5010                        m_width = 0;
5011                if ( m_width > 0)
5012                {
5013                        res_akt = getvideomode();
5014                        if (ostrcmp(res_akt, res) != 0)
5015                        {
5016                                setvideomode(res, 1);
5017                        changefbresolution(res);
5018                                sleep(1);
5019                                screenautores(res, 5, 0);
5020                        }
5021                }
5022        }
5023        else
5024                textbox(_("Message"), _("ERROR cant read res"), _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 600, 200, 5, 0);
5025
5026        free(res);
5027        res = NULL;
5028        status.restimer = NULL;
5029        return;
5030}
5031
5032char* gettimestamp()
5033{
5034        char* timestamp = NULL;
5035        struct timeval numtime;
5036               
5037        gettimeofday(&numtime, 0);
5038        timestamp = ostrcat(timestamp, olutoa(numtime.tv_sec), 1, 1);
5039        timestamp = ostrcat(timestamp, olutoa(numtime.tv_usec), 1, 1);
5040
5041        return timestamp;
5042}
5043
5044char* string_decode(char* input, int flag)
5045{
5046        if(input == NULL) return input;
5047
5048        while(ostrstr(input, "\\u00") != NULL)
5049        {
5050                debug(210, "input: %s", input);
5051                input = string_replace("\\u00", "%", input, 1);
5052                debug(210, "input: %s", input);
5053        }
5054
5055        while(ostrstr(input, "&amp;") != NULL)
5056        {
5057                debug(210, "input: %s", input);
5058                input = string_replace("&amp;", "und", input, 1);
5059                debug(210, "input: %s", input);
5060        }
5061
5062        while(ostrstr(input, "&gt;") != NULL)
5063        {
5064                debug(210, "input: %s", input);
5065                input = string_replace("&gt;", ">", input, 1);
5066                debug(210, "input: %s", input);
5067        }
5068
5069        while(ostrstr(input, "&lt;") != NULL)
5070        {
5071                debug(210, "input: %s", input);
5072                input = string_replace("&lt;", "<", input, 1);
5073                debug(210, "input: %s", input);
5074        }
5075       
5076        while(ostrstr(input, "&quot;") != NULL)
5077        {
5078                debug(210, "input: %s", input);
5079                input = string_replace("&quot;", "\"", input, 1);
5080                debug(210, "input: %s", input);
5081        }
5082
5083        while(ostrstr(input, "&#x") != NULL)
5084        {
5085                debug(210, "out %s", input);
5086                input = string_replace("&#x", "%", input, 1);
5087                debug(210, "input: %s", input);
5088        }
5089        while(ostrstr(input, "&#") != NULL)
5090        {
5091                debug(210, "input: %s", input);
5092                input = string_replace("&#", "%", input, 1);
5093                debug(210, "input: %s", input);
5094        }
5095       
5096        if(flag == 1)
5097                htmldecode2(input, input);
5098        else
5099                htmldecode(input, input);
5100                       
5101        while(ostrstr(input, ";") != NULL)
5102        {
5103                debug(210, "input: %s", input);
5104                input = string_replace(";", "", input, 1);
5105                debug(210, "input: %s", input);
5106        }
5107
5108        debug(1000, "out");
5109        return input;
5110}
5111
5112char* string_striptags(char* filename)
5113{
5114        debug(1000, "in");
5115        int i, len_filename;
5116
5117        if(filename == NULL) return 0;
5118       
5119        len_filename = strlen(filename);
5120
5121        int skip =0;
5122        for(i = 0; (i) < len_filename; i++)
5123        {
5124                if(filename[i] == '<')
5125                {
5126                        debug(210, "found < in string");
5127                        skip = 1;
5128                }
5129                else if(filename[i] == '>')     
5130                {
5131                        debug(210, "found > in string");
5132                        skip = 0;
5133                        filename[i] = ' ';
5134                }
5135                if(skip == 1)
5136                        filename[i] = ' ';
5137        }       
5138
5139        debug(1000, "out");
5140        return strstrip(filename);     
5141}
5142
5143char* string_resub(char* str, char* str2, char* input, int dir)
5144{
5145        debug(1000, "in");
5146        int len;
5147        char* tmpstr = NULL, *pos = NULL, *pos2 = NULL;
5148
5149        if(str == NULL || str2 == NULL || input == NULL) return NULL;
5150
5151        if(dir == 0)
5152        {
5153                len = strlen(str);
5154                pos = ostrstr(input, str);
5155                if(pos == NULL) return NULL;
5156                pos += len;
5157
5158                pos2 = ostrstr(pos, str2);
5159                if(pos2 == NULL) return NULL;
5160        }
5161        else
5162        {
5163                pos2 = ostrstr(input, str2);
5164                if(pos2 == NULL) return NULL;
5165
5166                len = strlen(str);
5167                pos = ostrrstr(input, str, pos2 - input, 0);
5168                if(pos == NULL) return NULL;
5169                pos += len;
5170        }
5171
5172        tmpstr = strndup(pos, pos2 - pos);
5173
5174        debug(1000, "out");
5175        return strstrip(tmpstr);
5176}
5177
5178char* ostrstrcase(char* str, char* sub)
5179{
5180        size_t len = 0;
5181
5182        if(str == NULL || sub == NULL) return NULL;
5183
5184        len = strlen(sub);
5185        while(*str)
5186        {
5187                if(toupper(*str) == toupper(*sub) && strncasecmp(str, sub, len) == 0)
5188                        return str;     
5189                ++str;
5190        }
5191        return NULL;
5192}
5193
5194#endif
Note: See TracBrowser for help on using the repository browser.