source: titan/titan/global.h @ 32867

Last change on this file since 32867 was 32867, checked in by obi, 8 years ago

fix

File size: 144.0 KB
Line 
1#ifndef GLOBAL_H
2#define GLOBAL_H
3
4//flag 0: video+gui+freez
5//flag 1: video+gui
6//flag 2: video
7//flag 3: gui
8void screenshoot(int flag)
9{
10        char* cmd = NULL;
11        if(flag == 0 || flag == 2)
12        {
13                videofreeze(status.aktservice->videodev);
14                sleep(1);
15        }
16
17        if(flag == 0 || flag == 1)
18                cmd = ostrcat("grab -j 100 -r 960", NULL, 0, 0);
19        else if(flag == 2)
20                cmd = ostrcat("grab -v -j 100 -r 960", NULL, 0, 0);
21        else if(flag == 3)
22                cmd = ostrcat("grab -o -j 100 -r 960", NULL, 0, 0);
23
24        if(cmd != NULL)
25                system(cmd);
26
27        if(flag == 0 || flag == 2)
28                videocontinue(status.aktservice->videodev);
29       
30        free(cmd), cmd = NULL;
31}
32
33//flag 0: playerstart
34//flag 1: playerstop
35void set_player_sound(int flag)
36{
37#ifdef SH4
38        char* vol = NULL, *cmd = NULL;
39
40        if(flag == 0)
41                vol = ostrcat(getconfig("vol_playerstart", NULL), NULL, 0, 0);
42        else if(flag == 1)
43                vol = ostrcat(getconfig("vol_playerstop", NULL), NULL, 0, 0);
44
45        cmd = ostrcat("amixer -c 1 set Analog playback '", vol, 0, 0);
46        if(status.mute == 1)
47                cmd = ostrcat(cmd, "%' mute &", 1, 0);
48        else
49                cmd = ostrcat(cmd, "%' unmute &", 1, 0);
50        system(cmd);
51        free(cmd), cmd = NULL;
52
53        cmd = ostrcat("amixer -c 1 set SPDIF playback '", vol, 0, 0);
54        if(status.mute == 1)
55                cmd = ostrcat(cmd, "%' mute &", 1, 0);
56        else
57                cmd = ostrcat(cmd, "%' unmute &", 1, 0);
58        system(cmd);
59        free(cmd), cmd = NULL;
60
61        cmd = ostrcat("amixer -c 1 set HDMI playback '", vol, 0, 0);
62        if(status.mute == 1)
63                cmd = ostrcat(cmd, "%' mute &", 1, 0);
64        else
65                cmd = ostrcat(cmd, "%' unmute &", 1, 0);
66        system(cmd);
67        free(cmd), cmd = NULL;
68        free(vol), vol = NULL;
69#endif
70}
71
72//flag 0: with wait message
73//flag 1: without wait message
74void waitmsgbar(int sec, int exit, char* text, int flag)
75{
76        if(sec < 1) return;
77        int maxsec = sec, rcret = -1;
78       
79        char* tmpstr = NULL;
80        struct skin* waitmsgbar = getscreen("waitmsgbar");
81        struct skin* load = getscreen("loading");
82       
83        waitmsgbar->progresssize = 0;
84        if(text == NULL)
85                tmpstr = ostrcat("0%", NULL, 0, 0);
86        else
87                tmpstr = ostrcat(text, " (0%)", 0, 0);
88        changetext(waitmsgbar, tmpstr);
89        free(tmpstr); tmpstr = NULL;
90       
91        if(flag == 0) drawscreen(load, 0, 0);
92       
93        while(sec > 0)
94        {
95                drawscreen(waitmsgbar, 0, 0);
96               
97                if(exit == 0)
98                        sleep(1);
99                else
100                {
101                        rcret = waitrc(0, 1000, 0);
102                        if(rcret == getrcconfigint("rcexit", NULL))
103                                break;
104                               
105                        if(rcret != RCTIMEOUT) continue;
106                }
107               
108                sec--;
109                waitmsgbar->progresssize = ((maxsec - sec) * 100) / maxsec;
110               
111                if(text == NULL)
112                        tmpstr = ostrcat(oitoa(waitmsgbar->progresssize), "%", 1, 0);
113                else
114                {
115                        tmpstr = ostrcat(text, " (", 0, 0);
116                        tmpstr = ostrcat(tmpstr, oitoa(waitmsgbar->progresssize), 1, 1);
117                        tmpstr = ostrcat(tmpstr, "%)", 1, 0);
118                }
119                changetext(waitmsgbar, tmpstr);
120                free(tmpstr); tmpstr = NULL;
121        }
122       
123        free(tmpstr); tmpstr = NULL;
124        if(flag == 0) clearscreen(load);
125        clearscreen(waitmsgbar);
126        drawscreen(skin, 0, 0);
127}
128
129//flag 0: get pluginpath an add text
130//flag 1: get pluginpath and change "%pluginpath%/"
131char* createpluginpath(char* text, int flag)
132{
133        char* tmpstr = NULL;
134        if(text == NULL) return NULL;
135       
136        if(flag == 0)
137        {
138          tmpstr = ostrcat(getconfig("pluginpath", NULL), text, 0, 0);
139          if(file_exist(tmpstr) == 1) return tmpstr;
140         
141          free(tmpstr); tmpstr = NULL;
142          tmpstr = ostrcat(getconfig("pluginpath1", NULL), text, 0, 0);
143          if(file_exist(tmpstr) == 1) return tmpstr;
144         
145          free(tmpstr); tmpstr = NULL;
146          tmpstr = ostrcat(getconfig("pluginpath2", NULL), text, 0, 0);
147          if(file_exist(tmpstr) == 1) return tmpstr;
148        }
149        else
150        {
151                if(strlen(text) < 13) return NULL;
152               
153                tmpstr = ostrcat(getconfig("pluginpath", NULL), &text[12], 0, 0);
154                if(file_exist(tmpstr) == 1) return tmpstr;
155               
156                free(tmpstr); tmpstr = NULL;
157                tmpstr = ostrcat(getconfig("pluginpath1", NULL), &text[12], 0, 0);
158                if(file_exist(tmpstr) == 1) return tmpstr;
159               
160                free(tmpstr); tmpstr = NULL;
161                tmpstr = ostrcat(getconfig("pluginpath2", NULL), &text[12], 0, 0);
162                if(file_exist(tmpstr) == 1) return tmpstr;
163        }
164       
165        free(tmpstr); tmpstr = NULL;
166        return NULL;
167}
168
169int osystem(char* cmd, int timeout)
170{
171        int ret = 0;
172        char* tmpstr = NULL;
173
174        tmpstr = ostrcat(tmpstr, "timeout -t ", 1, 0);
175        tmpstr = ostrcat(tmpstr, oitoa(timeout), 1, 1);
176        tmpstr = ostrcat(tmpstr, " -s 9 ", 1, 0);
177        tmpstr = ostrcat(tmpstr, cmd, 1, 0);
178        ret = system(tmpstr);
179        free(tmpstr); tmpstr = NULL;
180
181        return ret;
182}
183
184int wlanlinkquality()
185{
186        char dev[20];
187        int tmp = 0, linkquality = 0;
188        FILE *fd = NULL;
189        char *fileline = NULL;
190
191        struct inetwork* wlandev = getinetworkfirstwlan();
192        if(wlandev == NULL) return 0;
193
194        fileline = malloc(MINMALLOC);
195        if(fileline == NULL)
196        {
197                err("no mem");
198                return 0;
199        }
200
201        fd = fopen("/proc/net/wireless", "r");
202        if(fd == NULL)
203        {
204                perr("can't open /proc/net/wireless");
205                free(fileline);
206                return 0;
207        }
208
209        while(fgets(fileline, MINMALLOC, fd) != NULL)
210        {
211                if(ostrstr(fileline, wlandev->device) != NULL)
212                        sscanf(fileline, "%[^:]: %d %d", dev, &tmp, &linkquality);
213        }
214
215        free(fileline);
216        fclose(fd);
217        return linkquality;
218}
219
220char* getispip()
221{
222        char* tmpstr = NULL;
223        char* ip = NULL;
224        tmpstr = gethttp("checkip.dyndns.org", "", 80, NULL, NULL, 10000, NULL, 0);
225
226        if(oregex(".*<body>Current IP Address: ([0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3})</body>.*", tmpstr))
227        {
228                ip = oregex(".*<body>Current IP Address: ([0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3})</body>.*", tmpstr);
229        }
230        free(tmpstr), tmpstr = NULL;
231        return ip;
232}
233
234//flag 0: leave standby
235//flag 1: set standby
236int setcecstandby(int flag)
237{
238        if(getconfigint("usecec", NULL) == 1 || getconfigint("cec_on", NULL) == 1)
239        {
240#ifndef MIPSEL         
241                if(flag == 0)
242                        writesys("/proc/stb/cec/onetouchplay", "0", 1);
243                else
244                {
245                        char* tmpstr = readsys("/proc/stb/cec/state_cecaddress", 1);
246                        char* tmpstr1 = readsys("/proc/stb/cec/state_activesource", 1);
247
248                        if(ostrcmp(tmpstr, tmpstr1) == 0)
249                                writesys("/proc/stb/cec/systemstandby", "0", 1);
250
251                        free(tmpstr); tmpstr = NULL;
252                        free(tmpstr1); tmpstr1 = NULL;
253                }
254#else
255                if(flag == 0)
256                        cecwakeup();
257                else
258                        cecstandby();
259#endif
260        }
261
262        return 0;
263}
264
265char* mask(char* input, int count, char* maskchar)
266{
267        char* tmpstr = NULL;
268        int i = 0;
269
270        tmpstr = ostrcat(input, NULL, 1, 0);
271
272        if(tmpstr != NULL)
273        {
274                int len = strlen(tmpstr);
275                for(i = 0; i < count - len; i++)
276                        tmpstr = ostrcat(maskchar, tmpstr, 0, 1);
277        }
278        else
279        {
280                for(i = 0; i < count; i++)
281                        tmpstr = ostrcat(maskchar, tmpstr, 0, 1);       
282        }
283
284        return tmpstr;
285}
286
287int checkinternet()
288{
289        int skip = 0, i = 0;
290        char* tmp = NULL, *cmd = NULL;
291
292        cmd = ostrcat(cmd, "google.de", 1, 0);
293
294        //if(system(cmd) != 0)
295        for(i = 0; i < 3; i++)
296        {
297                free(tmp); tmp = NULL;
298                tmp = gethttp(cmd, "/", 80, NULL, NULL, 5000, NULL, 0);
299                if(tmp != NULL) break;
300        }
301        if(tmp == NULL)
302                skip = 1;
303
304        free(tmp); tmp = NULL;
305        free(cmd), cmd = NULL;
306
307        return skip;
308}
309
310int checkpng(char* filename)
311{
312        FILE* fd = NULL;
313        int ret = 0;
314        png_bytep sig = NULL;
315
316        fd = fopen(filename, "rb");
317        if(fd == NULL)
318        {
319                perr("open file %s", filename);
320                return 0;
321        }
322
323        sig = malloc(8);
324        if(sig == NULL)
325        {
326                err("no mem");
327                fclose(fd);
328                return 0;
329        }
330
331        fread(sig, 1, 8, fd);
332        ret = png_check_sig(sig, 8);
333        if(ret == 0)
334        {
335                free(sig);
336                fclose(fd);
337                return 0;
338        }
339
340        free(sig);
341        fclose(fd);
342        return 1;
343}
344
345char **str_split(char *string, char *delim)
346{
347        char **tokens = NULL;
348        char *working = NULL;
349        char *token = NULL;
350        int idx = 0;
351       
352        if(string == NULL) return NULL;
353
354        tokens = malloc(sizeof(char*) * MAXTOKENS);
355        if(tokens == NULL)
356                return NULL;
357
358        working = malloc(sizeof(char) * strlen(string) + 1);
359        if(working == NULL)
360                return NULL;
361
362         /* to make sure, copy string to a safe place */
363        strcpy(working, string);
364        for(idx = 0; idx < MAXTOKENS; idx++)
365                tokens[idx] = NULL;
366
367        token = strtok(working, delim);
368        idx = 0;
369
370        /* always keep the last entry NULL termindated */
371        while(idx < (MAXTOKENS - 1) && token != NULL)
372        {
373                tokens[idx] = malloc(sizeof(char) * strlen(token) + 1);
374                if(tokens[idx] != NULL)
375                {
376                        strcpy(tokens[idx], token);
377                        idx++;
378                        token = strtok(NULL, delim);
379                }
380        }
381
382        free(working);
383        return tokens;
384}
385
386char* readfromlinetoline(char* str, int start, int end, int flag)
387{
388        if(str == NULL) return str;
389
390        char* tmpstr = NULL;
391        int count = 0;
392        int i = 0;
393        struct splitstr* ret = NULL;
394        ret = strsplit(str, "\n", &count);
395
396        for(i = 0; i < count; i++)
397        {
398                if(i >= start && i <= end)
399                {
400                        tmpstr = ostrcat(tmpstr, (&ret[i])->part, 1, 0);
401                        tmpstr = ostrcat(tmpstr, "\n", 1, 0);
402                }
403        }
404        free(ret), ret = NULL;
405
406        if(flag == 1)
407        {
408                free(str), str = NULL;
409        }
410        return tmpstr; 
411}
412
413char* ltostr(char* str, long val, unsigned base)
414{
415        ldiv_t r;
416
417        if(base > 36 || str == NULL)
418                return NULL;
419
420        if(val < 0) *str++ = '-';
421        r = ldiv(labs(val), base);
422
423        if(r.quot > 0) str = ltostr(str, r.quot, base);
424
425        *str++ = "0123456789abcdefghijklmnopqrstuvwxyz"[(int)r.rem];
426        *str = '\0';
427        return str;
428}
429
430char* oltostr(long val, unsigned base)
431{
432        char* str = NULL;
433
434        str = calloc(1, MINMALLOC);
435        if(str == NULL)
436        {
437                err("no mem");
438                return NULL;
439        }
440
441        ltostr(str, val, base);
442
443        return ostrshrink(str);
444}
445
446char* unhexlify(char *hexstr)
447{
448        int len = 0, tmpint = 0;
449        char *p, *q, *binstr = NULL;
450
451        if(hexstr == NULL) return NULL;
452
453        len = strlen(hexstr);
454        if(len == 0 || len % 2 != 0) return NULL;
455
456        binstr = calloc(1, (len / 2) + 1);
457        if(binstr == NULL)
458        {
459                err("no mem");
460                return NULL;
461        }
462
463        for(p = hexstr, q = binstr; *p; p += 2, q++)
464        {
465                sscanf(p, "%2x", &tmpint);
466                *q = tmpint;
467        }
468
469        return binstr;
470}
471
472int getsupermagic(char* filename)
473{
474        struct statfs64 s;
475
476        if(statfs64(filename, &s) >= 0)
477                return s.f_type;
478
479        return 0;
480}
481
482int getrandom(int max)
483{
484        srand(time(NULL));
485        return (rand() % max);
486}
487
488char* delmountpart(char* filename, int free1)
489{
490        struct mntent ent;
491        FILE *fd = NULL;
492        char* ret = NULL, *buf = NULL, *treffer = NULL, *rpath = NULL;
493        int mntdirlen = 0;
494
495        if(filename == NULL) return NULL;
496
497        buf = malloc(MINMALLOC);
498        if(buf == NULL)
499        {
500                err("no mem");
501                return NULL;
502        }
503       
504        rpath = realpath(filename, NULL);
505        if(rpath == NULL) return NULL;
506
507        fd = setmntent("/proc/mounts", "r");
508        if(fd != NULL)
509        {
510                while(getmntent_r(fd, &ent, buf, MINMALLOC) != 0)
511                {
512                        if(ent.mnt_dir != NULL)
513                        {
514                                mntdirlen = strlen(ent.mnt_dir);
515                                if(mntdirlen > 1 && ostrstr(rpath, ent.mnt_dir) == rpath)
516                                {
517                                        if(treffer == NULL || strlen(treffer) < mntdirlen)
518                                        {
519                                                free(treffer); treffer = NULL;
520                                                treffer = ostrcat(ent.mnt_dir, NULL, 0, 0);
521                                        }
522                                }
523                        }
524                }
525        }
526
527        if(treffer != NULL)
528                ret = string_replace(treffer, NULL, rpath, 0);
529
530        endmntent(fd);
531        if(free1 == 1) free(filename);
532        free(buf);
533        free(treffer);
534        free(rpath);
535        return ret;
536}
537
538char* addmountpart(char* filename, int free1)
539{
540        struct mntent ent;
541        FILE *fd = NULL;
542        char* ret = NULL, *buf = NULL;
543
544        if(filename == NULL) return NULL;
545
546        buf = malloc(MINMALLOC);
547        if(buf == NULL)
548        {
549                err("no mem");
550                return NULL;
551        }
552
553        fd = setmntent("/proc/mounts", "r");
554        if(fd != NULL)
555        {
556                while(getmntent_r(fd, &ent, buf, MINMALLOC))
557                {
558                        if(ent.mnt_dir != NULL && strlen(ent.mnt_dir) > 1)
559                        {
560                                ret = ostrcat(ent.mnt_dir, filename, 0, 0);
561                                if(file_exist(ret))
562                                {
563                                        if(free1 == 1) free(filename);
564                                        endmntent(fd);
565                                        free(buf);
566                                        return ret;
567                                }
568                                free(ret); ret = NULL;
569                        }
570                }
571        }
572
573        endmntent(fd);
574        free(buf);
575        return ret;
576}
577
578unsigned int gethash(char* str)
579{
580        unsigned int hash = 0;
581        int c = 0;
582
583        if(str == NULL) return 0;
584
585        while((c = *str++))
586                hash = ((hash << 5) + hash) ^ c;
587
588        return hash;
589}
590
591void freeregexstruct(struct regex* node)
592{
593        if(node == NULL) return;
594
595        free(node->match1); node->match1 = NULL;
596        free(node->match2); node->match2 = NULL;
597        free(node->match3); node->match3 = NULL;
598        free(node->match4); node->match4 = NULL;
599        free(node->match5); node->match5 = NULL;
600        free(node->match6); node->match6 = NULL;
601        free(node->match7); node->match7 = NULL;
602        free(node->match8); node->match8 = NULL;
603        free(node->match9); node->match9 = NULL;
604        free(node->match10); node->match10 = NULL;
605
606        free(node); node = NULL;
607}
608
609struct regex* regexstruct(char* regex, char* str)
610{
611        regex_t preg = {NULL};
612        regmatch_t pmatch[11] = {{0}};
613        size_t rm = 0, i = 0, len = 0;
614        char* ret = NULL;
615        struct regex* node = NULL;
616
617        if(regex == NULL || str == NULL) return NULL;
618
619        rm = regcomp(&preg, regex, REG_EXTENDED);
620        if(rm != 0) //error in regex
621        {
622                regfree(&preg);
623                return NULL;
624        }
625
626        rm = regexec(&preg, str, 11, pmatch, 0);
627        if(rm != 0) //no match
628        {
629                regfree(&preg);
630                return NULL;
631        }
632
633        node = (struct regex*)calloc(1, sizeof(struct regex));
634        if(node == NULL)
635        {
636                err("no mem");
637                regfree(&preg);
638                return NULL;
639        }
640
641        for(i = 1; !rm && i <= preg.re_nsub; i++)
642        {
643                len = pmatch[i].rm_eo - pmatch[i].rm_so;
644                if(len < 1) continue;
645
646                ret = malloc(len + 1);
647                if(ret != NULL)
648                {
649                        memcpy(ret, str + pmatch[i].rm_so, len);
650                        ret[len] = '\0';
651                }
652
653                if(i == 1) node->match1 = ret;
654                else if(i == 2) node->match2 = ret;
655                else if(i == 3) node->match3 = ret;
656                else if(i == 4) node->match4 = ret;
657                else if(i == 5) node->match5 = ret;
658                else if(i == 6) node->match6 = ret;
659                else if(i == 7) node->match7 = ret;
660                else if(i == 8) node->match8 = ret;
661                else if(i == 9) node->match9 = ret;
662                else if(i == 10) node->match10 = ret;
663
664                ret = NULL;
665        }
666
667        regfree(&preg);
668        return node;
669}
670
671char* oregex(char* regex, char* str)
672{
673        regex_t preg = {NULL};
674        regmatch_t pmatch[2] = {{0}};
675        size_t rm = 0, len = 0;
676        char* ret = NULL;
677
678        if(regex == NULL || str == NULL) return NULL;
679
680        rm = regcomp(&preg, regex, REG_EXTENDED);
681        if(rm != 0) //error in regex
682        {
683                regfree(&preg);
684                return NULL;
685        }
686
687        rm = regexec(&preg, str, 2, pmatch, 0);
688        if(rm != 0) //no match
689        {
690                regfree(&preg);
691                return NULL;
692        }
693
694        len = pmatch[1].rm_eo - pmatch[1].rm_so;
695        if(len < 1)
696        {
697                regfree(&preg);
698                return NULL;
699        }
700
701        ret = malloc(len + 1);
702        if(ret != NULL)
703        {
704                memcpy(ret, str + pmatch[1].rm_so, len);
705                ret[len] = '\0';
706        }
707
708        regfree(&preg);
709        return ret;
710}
711
712int oregexint(char* regex, char* str)
713{
714        int iret = 0;
715        char* ret = NULL;
716
717        ret = oregex(regex, str);
718        if(ret != NULL) iret = atoi(ret);
719        free(ret);
720
721        return iret;
722}
723
724struct splitstr* oregexsplit(char* regex, char *str, char *tok, int* count)
725{
726        char *tmpstr = NULL;
727        struct splitstr *array = NULL, *tmparray = NULL;
728        *count = 0;
729
730        if(str == NULL || tok == NULL)
731                return NULL;
732
733        tmpstr = strtok(str, tok);
734        while(tmpstr != NULL)
735        {
736                *count = *count + 1;
737                tmparray = array; array = (struct splitstr*)realloc(array, sizeof(struct splitstr*) * (*count));
738                if(array == NULL)
739                {
740                        err("no mem");
741                        free(tmparray);
742                        return NULL;
743                }
744     
745                (&array[(*count) - 1])->part = oregex(regex, tmpstr);
746                tmpstr = strtok(NULL, tok);
747        }
748
749        return array;
750}
751
752void freeoregexsplit(struct splitstr* tmparray, int len)
753{
754        if(tmparray == NULL) return;
755        int i = 0;
756       
757        for(i = 0; i < len; i++)
758        {
759                free(tmparray[i].part);
760                tmparray[i].part = NULL;
761        }
762       
763        free(tmparray);
764}
765
766int getmaxsat(char* feshortname)
767{
768        char *tmpstr = NULL;
769        int maxsat = 1;
770
771        if(feshortname != NULL)
772        {
773                tmpstr = ostrcat(feshortname, "_maxsat", 0, 0);
774                maxsat = getconfigint(tmpstr, NULL);
775                free(tmpstr); tmpstr = NULL;
776        }
777        if(maxsat < 0) maxsat = 1;
778
779        return maxsat;
780}
781
782void autochangechannelname()
783{
784        uint8_t lastsecnr = 0xff;
785        int secnr = 0;
786        unsigned char* buf = NULL;
787
788        if(status.aktservice->fedev == NULL) return;
789
790        while(secnr <= lastsecnr && secnr <= 256)
791        {
792                buf = dvbgetsdt(status.aktservice->fedev, secnr, 2000000);
793                if(buf != NULL)
794                        findchannel(status.aktservice->fedev, NULL, buf, &lastsecnr, NULL, NULL, 1, 1);
795                else
796                        break;
797                free(buf); buf = NULL;
798                secnr++;
799        }
800}
801
802int isbase64(char c)
803{
804        if((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || c == '+' || c == '/' || c == '=')
805                return 1;
806        return 0;
807}
808
809char decodebase64(char c)
810{
811        if(c >= 'A' && c <= 'Z') return(c - 'A');
812        if(c >= 'a' && c <= 'z') return(c - 'a' + 26);
813        if(c >= '0' && c <= '9') return(c - '0' + 52);
814        if(c == '+') return(62);
815        return 63;
816}
817
818int b64dec(char* dest, char* src)
819{
820        if(src && *src)
821        {
822                char* p = dest;
823                int k, l = strlen(src) + 1;
824                char* buf = NULL;
825
826                buf = malloc(l);
827                if(buf == NULL) return 0;
828
829                for(k = 0, l = 0; src[k]; k++)
830                {
831                        if(isbase64(src[k]))
832                                buf[l++] = src[k];
833                }
834
835                for(k = 0; k < l; k += 4)
836                {
837                        char c1 = 'A', c2 = 'A', c3 = 'A', c4 = 'A';
838                        char b1 = 0, b2 = 0, b3 = 0, b4 = 0;
839
840                        c1 = buf[k];
841                        if(k + 1 < l)
842                                c2 = buf[k + 1];
843                        if(k + 2 < l)
844                                c3 = buf[k + 2];
845                        if(k + 3 < l)
846                                c4 = buf[k + 3];
847
848                        b1 = decodebase64(c1);
849                        b2 = decodebase64(c2);
850                        b3 = decodebase64(c3);
851                        b4 = decodebase64(c4);
852
853                        *p++ = ((b1 << 2) | (b2 >> 4));
854
855                        if(c3 != '=')
856                                *p++ = (((b2 & 0xf) << 4) | (b3 >> 2));
857                        if(c4 != '=')
858                                *p++ = (((b3 & 0x3) << 6) | b4);
859
860                }
861
862                free(buf);
863                return(p - dest);
864        }
865        return 0;
866}
867
868void changechannellist(struct channel* chnode, char* channellist)
869{
870                char* tmpstr = NULL;
871
872                if(chnode == NULL || status.aktservice->channel == NULL) return;
873
874                if(chnode->servicetype != 99) status.servicetype = chnode->servicetype;
875                if(status.servicetype == 0)
876                {
877                        if(channellist != NULL)
878                        {
879                                tmpstr = ostrcat(channellist, NULL, 0, 0);
880                                free(status.aktservice->channellist);
881                                status.aktservice->channellist = tmpstr;
882                                addconfig("channellist", tmpstr);
883                        }
884                        tmpstr = oitoa(status.aktservice->channel->serviceid);
885                        addconfig("serviceid", tmpstr);
886                        free(tmpstr); tmpstr = NULL;
887                        tmpstr = ollutoa(status.aktservice->channel->transponderid);
888                        addconfig("transponderid", tmpstr);
889                        free(tmpstr); tmpstr = NULL;
890                }
891                else
892                {
893                        if(channellist != NULL)
894                        {
895                                tmpstr = ostrcat(channellist, NULL, 0, 0);
896                                free(status.aktservice->channellist);
897                                status.aktservice->channellist = tmpstr;
898                                addconfig("rchannellist", tmpstr);
899                        }
900                        tmpstr = oitoa(status.aktservice->channel->serviceid);
901                        addconfig("rserviceid", tmpstr);
902                        free(tmpstr); tmpstr = NULL;
903                        tmpstr = ollutoa(status.aktservice->channel->transponderid);
904                        addconfig("rtransponderid", tmpstr);
905                        free(tmpstr); tmpstr = NULL;
906                }
907}
908
909//flag 0: normal picons
910//flag 1: alternate picons
911char* createpiconpath(struct channel* chnode, int flag)
912{
913        char* tmpstr = NULL, *picon = NULL;
914
915        if(chnode != NULL)
916        {
917                picon = ostrcat("/", oitoa(chnode->serviceid), 0, 1);
918                picon = ostrcat(picon, "-", 1, 0);
919                picon = ostrcat(picon, ollutoa(chnode->transponderid), 1, 1);
920                picon = ostrcat(picon, ".png", 1, 0);
921
922                if(flag == 1)
923                        tmpstr = ostrcat("/mnt/swapextensions/usr/local/share/titan/picons/alternate", picon, 0, 0);
924                else
925                        tmpstr = ostrcat("/mnt/swapextensions/usr/local/share/titan/picons", picon, 0, 0);
926                if(isfile(tmpstr))
927                {
928                        free(picon);
929                        return tmpstr;
930                }
931               
932                free(tmpstr); tmpstr = NULL;
933                if(flag == 1)
934                        tmpstr = ostrcat("/var/swap/usr/local/share/titan/picons/alternate", picon, 0, 0);
935                else
936                        tmpstr = ostrcat("/var/swap/usr/local/share/titan/picons", picon, 0, 0);
937                if(isfile(tmpstr))
938                {
939                        free(picon);
940                        return tmpstr;
941                }
942               
943                free(tmpstr); tmpstr = NULL;
944                if(flag == 1)
945                        tmpstr = ostrcat("/var/usr/local/share/titan/picons/alternate", picon, 0, 0);
946                else
947                        tmpstr = ostrcat("/var/usr/local/share/titan/picons", picon, 0, 0);
948                if(isfile(tmpstr))
949                {
950                        free(picon);
951                        return tmpstr;
952                }
953        }
954       
955        free(tmpstr); tmpstr = NULL;
956        tmpstr = ostrcat(tmpstr, getconfig("defskinpath", NULL), 1, 0);
957        tmpstr = ostrcat(tmpstr, "/skin/", 1, 0);
958        tmpstr = ostrcat(tmpstr, "defpicon.png", 1, 0);
959
960        free(picon);
961        return tmpstr;
962}
963
964int checkskin()
965{
966        int ret = 0;
967        char* defskinpath = NULL;
968        char* defskinconfig = NULL;
969        char* defskinfile = NULL;
970
971        if(file_exist(getconfig("skinpath", NULL)) == 0)
972                ret = 1;
973        else if(file_exist(getconfig("skinconfig", NULL)) == 0)
974                ret = 2;
975        else if(file_exist(getconfig("skinfile", NULL)) == 0)
976                ret = 3;
977
978        if(ret != 0)
979        {
980                err("skin not found code=%d, change to default", ret);
981
982                defskinpath = getconfig("defskinpath", NULL);
983                if(defskinpath != NULL) addconfig("skinpath", defskinpath);
984                defskinconfig = getconfig("defskinconfig", NULL);
985                if(defskinconfig != NULL) addconfig("skinconfig", defskinconfig);
986                defskinfile = getconfig("defskinfile", NULL);
987                if(defskinfile != NULL) addconfig("skinfile", defskinfile);
988
989                ret = 0;
990                if(file_exist(getconfig("skinpath", NULL)) == 0)
991                        ret = 1;
992                else if(file_exist(getconfig("skinconfig", NULL)) == 0)
993                        ret = 2;
994                else if(file_exist(getconfig("skinfile", NULL)) == 0)
995                        ret = 3;
996        }
997
998        if(ret != 0)
999        {
1000                err("default skin not found code=%d", ret);
1001        }
1002
1003        return ret;
1004}
1005
1006int getaktvideosize()
1007{
1008        //wait 3 sek after zap, befor videsize is valid
1009        //driver takes a little time
1010        if(status.videosizevalid == 1)
1011                return 0;
1012        else if(status.videosizevalid + 3 > time(NULL))
1013                return 1;
1014        else
1015        {
1016#ifndef SIMULATE
1017                if(videoreadqwidth(status.aktservice->videodev) == 0)
1018#endif
1019                {
1020                        status.videosizevalid = 1;
1021                        return 0;
1022                }
1023        }
1024
1025        return 1;
1026}
1027
1028int ostrftime(char* buf, int count, char* format, struct tm* t)
1029{
1030        int ret = -1;
1031
1032        if(buf == NULL || t == NULL) return ret;
1033
1034        if(format != NULL)
1035                ret = strftime(buf, count, format, t);
1036        else
1037                ret = strftime(buf, count, "%d-%m-%Y %H:%M", t);
1038
1039        return ret;
1040}
1041
1042//flag 0 = write all
1043//flag 1 = don't write epg
1044//flag 2 = only write epg
1045//flag 3 = only write config
1046int writeallconfig(int flag)
1047{
1048        char* tmpstr = NULL;
1049        int ret = 0;
1050
1051        if(flag == 0 || flag == 1)
1052        {
1053                if(status.writerectimer == 1)
1054                        if(writerectimer(getconfig("rectimerfile", NULL), 0) != 0)
1055                                ret = 1;
1056                if(status.writesat == 1)
1057                        if(writesat(getconfig("satfile", NULL)) != 0)
1058                                ret = 1;
1059                if(status.writeplaylist == 1)
1060                        if(writeallplaylist() != 0)
1061                                ret = 1;
1062                if(status.writemainplaylist == 1)
1063                        if(writemainplaylist(getconfig("playlistfile", NULL)) != 0)
1064                                ret = 1;
1065                if(status.writebouquet == 1)
1066                        if(writeallbouquet() != 0)
1067                                ret = 1;
1068                if(status.writemainbouquet == 1)
1069                        if(writemainbouquet(getconfig("bouquetfile", NULL)) != 0)
1070                                ret = 1;
1071                if(status.writechannel == 1)
1072                        if(writechannel(getconfig("channelfile", NULL)) != 0)
1073                                ret = 1;
1074                if(status.writetransponder == 1)
1075                        if(writetransponder(getconfig("transponderfile", NULL)) != 0)
1076                                ret = 1;
1077                if(status.writeprovider == 1)
1078                        if(writeprovider(getconfig("providerfile", NULL)) != 0)
1079                                ret = 1;
1080                if(status.writeownconfig == 1)
1081                        if(writeownconfig(getconfig("ownconfig", NULL)) != 0)
1082                                ret = 1;
1083                if(status.writeepgscanlist == 1)
1084                        if(writeepgscanlist(getconfig("epgchannelfile", NULL)) != 0)
1085                                ret = 1;
1086                if(status.writercconfig == 1)
1087                        if(writercconfig(getconfig("rcconfig", NULL)) != 0)
1088                                ret = 1;
1089                if(status.writeskinconfig == 1)
1090                        if(writeskinconfig(getconfig("skinconfig", NULL)) != 0)
1091                                ret = 1;
1092                if(status.writemostzap == 1)
1093                        if(writemostzap(getconfig("mostzapfile", NULL)) != 0)
1094                                ret = 1;
1095                if(status.writelastsubtitle == 1)
1096                        if(writelastsubtitle(getconfig("lastsubtitle", NULL)) != 0)
1097                                ret = 1;
1098                if(status.writechannelslot == 1)
1099                        if(writechannelslot(getconfig("channelslotfile", NULL)) != 0)
1100                                ret = 1;
1101        }
1102        if(flag == 0 || flag == 1 || flag == 3)
1103        {
1104                if(status.writeconfig == 1)
1105                {
1106                        addconfigint("vol", getvol());
1107                        if(writeconfig(status.configfile) != 0)
1108                                ret = 1;
1109                }
1110        }
1111        if((flag == 0 || flag == 2) && time(NULL) > 1072224000) // 01.01.2004
1112        {
1113                tmpstr = createpath(getconfig("epg_path", NULL), "epg.dat");
1114                if(writeepg(tmpstr) != 0)
1115                        ret = 1;
1116                free(tmpstr); tmpstr = NULL;
1117        }
1118
1119        sync();
1120
1121        return ret;
1122}
1123
1124void* writeallconfigthread0()
1125{
1126        writeallconfig(0);
1127        pthread_exit(NULL);
1128}
1129
1130void* writeallconfigthread1()
1131{
1132        writeallconfig(1);
1133        pthread_exit(NULL);
1134}
1135
1136void initmutex(int flag)
1137{
1138        if(flag == 1)
1139        {
1140                pthread_mutex_init(&status.drawingmutex, NULL);
1141                pthread_mutex_init(&status.rectimermutex, NULL);
1142                pthread_mutex_init(&status.servicemutex, NULL);
1143                pthread_mutex_init(&status.epgmutex, NULL);
1144                pthread_mutex_init(&status.vfdmutex, NULL);
1145                pthread_mutex_init(&status.channelmutex, NULL);
1146                pthread_mutex_init(&status.timerthreadmutex, NULL);
1147                pthread_mutex_init(&status.audiotrackmutex, NULL);
1148                pthread_mutex_init(&status.subtitlemutex, NULL);
1149                pthread_mutex_init(&status.dmxdevmutex, NULL);
1150                pthread_mutex_init(&status.rcmutex, NULL);
1151                pthread_mutex_init(&status.queuemutex, NULL);
1152                pthread_mutex_init(&status.clistmutex, NULL);
1153                pthread_mutex_init(&status.hddmutex, NULL);
1154                pthread_mutex_init(&status.linkedchannelmutex, NULL);
1155                pthread_mutex_init(&status.tsseekmutex, NULL);
1156                pthread_mutex_init(&status.accelfbmutex, NULL);
1157                pthread_mutex_init(&status.mediadbmutex, NULL);
1158                pthread_mutex_init(&status.oldentrymutex, NULL);
1159                pthread_mutex_init(&status.newslettermutex, NULL);
1160                pthread_mutex_init(&status.tithekmutex, NULL);
1161                pthread_mutex_init(&status.inetworkmutex, NULL);
1162                pthread_mutex_init(&status.textboxmutex, NULL);
1163                pthread_mutex_init(&status.setaktresmutex, NULL);
1164                pthread_mutex_init(&status.waitrcmutex, NULL);
1165                pthread_mutex_init(&status.oledmutex, NULL);
1166        }
1167        else
1168        {
1169                pthread_mutex_destroy(&status.drawingmutex);
1170                pthread_mutex_destroy(&status.rectimermutex);
1171                pthread_mutex_destroy(&status.servicemutex);
1172                pthread_mutex_destroy(&status.epgmutex);
1173                pthread_mutex_destroy(&status.vfdmutex);
1174                pthread_mutex_destroy(&status.channelmutex);
1175                pthread_mutex_destroy(&status.timerthreadmutex);
1176                pthread_mutex_destroy(&status.audiotrackmutex);
1177                pthread_mutex_destroy(&status.subtitlemutex);
1178                pthread_mutex_destroy(&status.dmxdevmutex);
1179                pthread_mutex_destroy(&status.rcmutex);
1180                pthread_mutex_destroy(&status.queuemutex);
1181                pthread_mutex_destroy(&status.clistmutex);
1182                pthread_mutex_destroy(&status.hddmutex);
1183                pthread_mutex_destroy(&status.linkedchannelmutex);
1184                pthread_mutex_destroy(&status.tsseekmutex);
1185                pthread_mutex_destroy(&status.accelfbmutex);
1186                pthread_mutex_destroy(&status.mediadbmutex);
1187                pthread_mutex_destroy(&status.oldentrymutex);
1188                pthread_mutex_destroy(&status.newslettermutex);
1189                pthread_mutex_destroy(&status.tithekmutex);
1190                pthread_mutex_destroy(&status.inetworkmutex);
1191                pthread_mutex_destroy(&status.textboxmutex);
1192                pthread_mutex_destroy(&status.setaktresmutex);
1193                pthread_mutex_destroy(&status.waitrcmutex);
1194                pthread_mutex_destroy(&status.oledmutex);
1195        }
1196}
1197
1198int hexit(char c)
1199{
1200        if(c >= '0' && c <= '9')
1201                return c - '0';
1202        if(c >= 'a' && c <= 'f')
1203                return c - 'a' + 10;
1204        if(c >= 'A' && c <= 'F')
1205                return c - 'A' + 10;
1206
1207        return 0;
1208}
1209
1210char* htmlencode(char* from)
1211{
1212        int buflen = 0;
1213        char* buf = NULL, *to = NULL;
1214
1215        buf = calloc(1, MINMALLOC);
1216        if(buf == NULL)
1217        {
1218                err("no mem");
1219                return NULL;
1220        }
1221        to = buf;
1222
1223        for(buflen = 0; *from != '\0' && buflen < MINMALLOC; ++from)
1224        {
1225                if(isalnum(*from) || strchr("/_.-~", *from) != NULL)
1226                {
1227                        *to = *from;
1228                        ++to;
1229                        ++buflen;
1230                }
1231                else
1232                {
1233                        sprintf(to, "%%%02x", (int)*from & 0xff);
1234                        to += 3;
1235                        buflen += 3;
1236                }
1237        }
1238        *to = '\0';
1239
1240        buf = ostrshrink(buf);
1241        return buf;
1242}
1243
1244void htmldecode(char* to, char* from)
1245{
1246        if(to == NULL || from == NULL) return;
1247
1248        for(; *from != '\0'; ++to, ++from)
1249        {
1250                if(from[0] == '%' && isxdigit(from[1]) && isxdigit(from[2]))
1251                {
1252                        *to = hexit(from[1]) * 16 + hexit(from[2]);
1253                        from += 2;
1254                }
1255                else
1256                        *to = *from;
1257        }
1258        *to = '\0';
1259}
1260
1261void htmldecode2(char* to, char* from)
1262{
1263        if(to == NULL || from == NULL) return;
1264
1265        for(; *from != '\0'; ++to, ++from)
1266        {
1267                if(from[0] == '%' && isxdigit(from[1]) && isxdigit(from[2]) && isxdigit(from[3]) && isxdigit(from[4]))
1268                {
1269                        *to = hexit(from[1]) * 16 + hexit(from[2]) * 16 + hexit(from[3]) * 16 + hexit(from[4]);
1270                        from += 4;
1271                }
1272                else if(from[0] == '%' && isxdigit(from[1]) && isxdigit(from[2]) && isxdigit(from[3]))
1273                {
1274                        *to = hexit(from[1]) * 16 + hexit(from[2]) * 16 + hexit(from[3]);
1275                        from += 3;
1276                }
1277                else if(from[0] == '%' && isxdigit(from[1]) && isxdigit(from[2]))
1278                {
1279                        *to = hexit(from[1]) * 16 + hexit(from[2]);
1280                        from += 2;
1281                }
1282                else
1283                        *to = *from;
1284        }
1285        *to = '\0';
1286}
1287
1288void htmldecode3(char* to, char* from)
1289{
1290        if(to == NULL || from == NULL) return;
1291
1292        for(; *from != '\0'; ++to, ++from)
1293        {
1294                if(from[0] == '\\' && from[1] == 'u' && isxdigit(from[2]) && isxdigit(from[3]) && isxdigit(from[4]) && isxdigit(from[5]) && isxdigit(from[6]) && isxdigit(from[7]))
1295                {
1296                        *to = hexit(from[2]) * 1048576 + hexit(from[3]) * 65536 + hexit(from[4]) * 4096 + hexit(from[5]) * 256 + hexit(from[6]) * 16 + hexit(from[7]);
1297                        from += 7;
1298                }
1299                if(from[0] == '\\' && from[1] == 'u' && isxdigit(from[2]) && isxdigit(from[3]) && isxdigit(from[4]) && isxdigit(from[5]))
1300                {
1301                        *to = hexit(from[2]) * 4096 + hexit(from[3]) * 256 + hexit(from[4]) * 16 + hexit(from[5]);
1302                        from += 5;
1303                }
1304                else
1305                        *to = *from;
1306        }
1307        *to = '\0';
1308}
1309
1310void setosdtransparent(int value)
1311{
1312        int ret = 255;
1313        if(value < 0) value = 0;
1314        if(value > 100) value = 100;
1315
1316        ret -= value * 2.55;
1317
1318        setfbtransparent(ret);
1319}
1320
1321struct tm* olocaltime(time_t *value)
1322{
1323        struct tm *loctime, *loctime1 = NULL;
1324
1325        loctime1 = (struct tm*)malloc(sizeof(struct tm));
1326        if(loctime1 == NULL)
1327        {
1328                err("no mem");
1329                return NULL;
1330        }
1331        loctime = localtime_r(value, loctime1);
1332
1333        return loctime;
1334}
1335
1336int setwakeuptimer(time_t waketime)
1337{
1338        char* wakeuptimerprog = NULL;
1339        struct tm *loctime = NULL;
1340        char *buf = NULL;
1341        int ret = -1;
1342
1343        wakeuptimerprog = getconfig("wakeuptimerprog", NULL);
1344
1345        if(wakeuptimerprog == NULL)
1346        {
1347                err("NULL detect");
1348                return ret;
1349        }
1350
1351        buf = malloc(MINMALLOC);
1352        if(buf == NULL)
1353        {
1354                err("no mem");
1355                return ret;
1356        }
1357
1358        loctime = olocaltime(&waketime);
1359
1360        if(loctime != NULL)
1361                ostrftime(buf, MINMALLOC, wakeuptimerprog, loctime);
1362
1363        if(buf != NULL)
1364        {
1365                debug(10, "set wake up timer (%s)", buf);
1366                ret = system(buf);
1367        }
1368
1369        free(loctime);
1370        free(buf);
1371        return ret;
1372}
1373
1374int autoresolution()
1375{
1376        char *hotpluginfo = NULL;
1377        char *value = NULL;
1378
1379        if(getconfig("av_videomode", NULL) != NULL || getconfig("av_colorformat", NULL))
1380                return 1;
1381
1382        hotpluginfo = getconfig("hotpluginfo", NULL);
1383
1384        if(hotpluginfo == NULL)
1385        {
1386                err("NULL detect");
1387                return 1;
1388        }
1389
1390        value = readsys(hotpluginfo, 1);
1391        if(value == NULL)
1392        {
1393                err("NULL detect");
1394                return 1;
1395        }
1396
1397        if(value[0] == 'y')
1398        {
1399                setvideomode("720p50", 0);
1400                changefbresolution("720p50", 0);
1401                setcolorformat("hdmi_rgb", 0);
1402        }
1403        else
1404        {
1405                setvideomode("576i50", 0);
1406                changefbresolution("576i50", 0);
1407                setcolorformat("rgb", 1);
1408        }
1409
1410        free(value);
1411        return 0;
1412}
1413
1414//TODO: can remove if new function work
1415/*
1416int writelengthfield(unsigned char *buf, unsigned int len)
1417{
1418        if(len < 127)
1419        {
1420                *buf++ = len;
1421                return 1;
1422        }
1423        else if(len < 256)
1424        {
1425                *buf++ = 0x81;
1426                *buf++ = len;
1427                return 2;
1428        }
1429        else if(len < 65535)
1430        {
1431                *buf++ = 0x82;
1432                *buf++ = len >> 8;
1433                *buf++ = len;
1434                return 3;
1435        }
1436
1437        return 0;
1438}
1439*/
1440
1441size_t writelengthfield(unsigned char * buf, unsigned int len)
1442{
1443        if(buf == NULL) return 0;
1444
1445        if(len < 128)
1446        {
1447                buf[0] = len;
1448                return 1;
1449        }
1450        else
1451        {
1452                unsigned int pos = 0;
1453                unsigned int shiftby = 8;
1454                unsigned char lenfieldsize = 1;
1455
1456                while((len >> shiftby) != 0)
1457                {
1458                        lenfieldsize++;
1459                        shiftby += 8;
1460                }
1461
1462                buf[pos++] = ((1 << 7) | lenfieldsize);
1463
1464                while(shiftby != 0)
1465                {
1466                        shiftby -= 8;
1467                        buf[pos++] = len >> shiftby;
1468                }
1469                return pos;
1470        }
1471}
1472
1473//flag 0: del non alpha/num
1474//flag 1: change all /
1475//flag 2: change all non filename conform chars
1476//flag 3: replace non alpha/num with _
1477void delspezchar(char* text, int flag)
1478{
1479        char* tmpstr = text;
1480
1481        if(text == NULL) return;
1482
1483        while(*tmpstr != '\0')
1484        {
1485                if(flag == 1 || flag == 2)
1486                {
1487                        if(tmpstr[0] == '/') tmpstr[0] = '-';
1488                        if(flag == 2)
1489                        {
1490                                if(tmpstr[0] == 'Â') tmpstr[0] = '-';
1491                                if(tmpstr[0] == '<') tmpstr[0] = '-';
1492                                if(tmpstr[0] == '>') tmpstr[0] = '-';
1493                                if(tmpstr[0] == ':') tmpstr[0] = '-';
1494                                if(tmpstr[0] == '"') tmpstr[0] = '-';
1495                                if(tmpstr[0] == '\\') tmpstr[0] = '-';
1496                                if(tmpstr[0] == '|') tmpstr[0] = '-';
1497                                if(tmpstr[0] == '*') tmpstr[0] = '-';
1498                                if(tmpstr[0] == '?') tmpstr[0] = '-';
1499                                if(tmpstr[0] == '[') tmpstr[0] = '-';
1500                                if(tmpstr[0] == ']') tmpstr[0] = '-';
1501                                if(tmpstr[0] == '=') tmpstr[0] = '-';
1502                                if(tmpstr[0] == '%') tmpstr[0] = '-';
1503                                if(tmpstr[0] == '$') tmpstr[0] = '-';
1504                                if(tmpstr[0] == ',') tmpstr[0] = '-';
1505                                if(tmpstr[0] == ';') tmpstr[0] = '-';
1506                                if(tmpstr[0] == '~') tmpstr[0] = '-';
1507                        }
1508                }
1509                else if(flag == 3)
1510                {
1511                        if(!isalnum(tmpstr[0]) && tmpstr[0] != '-')
1512                                tmpstr[0] = '_';
1513                }
1514                else
1515                {
1516                        if(!isalnum(tmpstr[0]) && tmpstr[0] != '-' && tmpstr[0] != '.')
1517                                tmpstr[0] = ' ';
1518                }
1519                tmpstr++;
1520        }
1521}
1522
1523void m_lock(pthread_mutex_t *mutex, int flag)
1524{
1525        switch(flag)
1526        {
1527                case 0: debug(900, "drawingmutex lock"); break;
1528                case 1: debug(900, "rectimermutex lock"); break;
1529                case 2: debug(900, "servicemutex lock"); break;
1530                case 3: debug(900, "vfdmutex lock"); break;
1531                case 4: debug(900, "epgmutex lock"); break;
1532                case 5: debug(900, "channelmutex lock"); break;
1533                case 6: debug(900, "timerthreadmutex lock"); break;
1534                case 7: debug(900, "audiotrackmutex lock"); break;
1535                case 8: debug(900, "subtitlemutex lock"); break;
1536                case 9: debug(900, "dmxdevmutex lock"); break;
1537                case 10: debug(900, "rcmutex lock"); break;
1538                case 11: debug(900, "queuemutex lock"); break;
1539                case 12: debug(900, "clistmutex lock"); break;
1540                case 13: debug(900, "hddmutex lock"); break;
1541                case 14: debug(900, "linkedchannelmutex lock"); break;
1542                case 15: debug(900, "tsseekmutex lock"); break;
1543                case 16: debug(900, "accelfbmutex lock"); break;
1544                case 17: debug(900, "mediadbmutex lock"); break;
1545                case 18: debug(900, "oldentrymutex lock"); break;
1546                case 19: debug(900, "newslettermutex lock"); break;
1547                case 20: debug(900, "tithekmutex lock"); break;
1548                case 21: debug(900, "inetworkmutex lock"); break;
1549                case 22: debug(900, "textboxmutex lock"); break;
1550                case 23: debug(900, "setaktresmutex lock"); break;
1551                case 24: debug(900, "waitrcmutex lock"); break;
1552                case 25: debug(900, "oledmutex lock"); break;
1553                default: debug(900, "unknown mutex lock"); break;
1554        }
1555        pthread_mutex_lock(mutex);
1556}
1557
1558void m_unlock(pthread_mutex_t *mutex, int flag)
1559{
1560        switch(flag)
1561        {
1562                case 0: debug(900, "drawingmutex unlock"); break;
1563                case 1: debug(900, "rectimermutex unlock"); break;
1564                case 2: debug(900, "servicemutex unlock"); break;
1565                case 3: debug(900, "vfdmutex unlock"); break;
1566                case 4: debug(900, "epgmutex unlock"); break;
1567                case 5: debug(900, "channelmutex unlock"); break;
1568                case 6: debug(900, "timerthreadmutex unlock"); break;
1569                case 7: debug(900, "audiotrackmutex unlock"); break;
1570                case 8: debug(900, "subtitlemutex unlock"); break;
1571                case 9: debug(900, "dmxdevmutex unlock"); break;
1572                case 10: debug(900, "rcmutex unlock"); break;
1573                case 11: debug(900, "queuemutex unlock"); break;
1574                case 12: debug(900, "clistmutex unlock"); break;
1575                case 13: debug(900, "hddmutex unlock"); break;
1576                case 14: debug(900, "linkedchannelmutex unlock"); break;
1577                case 15: debug(900, "tsseekmutex unlock"); break;
1578                case 16: debug(900, "accelfbmutex unlock"); break;
1579                case 17: debug(900, "mediadbmutex unlock"); break;
1580                case 18: debug(900, "oldentrymutex unlock"); break;
1581                case 19: debug(900, "newslettermutex unlock"); break;
1582                case 20: debug(900, "tithekmutex unlock"); break;
1583                case 21: debug(900, "inetworkmutex unlock"); break;
1584                case 22: debug(900, "textboxmutex unlock"); break;
1585                case 23: debug(900, "setaktresmutex unlock"); break;
1586                case 24: debug(900, "waitrcmutex unlock"); break;
1587                case 25: debug(900, "oledmutex unlock"); break;
1588                default: debug(900, "unknown mutex unlock"); break;
1589        }
1590        pthread_mutex_unlock(mutex);
1591}
1592
1593void debugstack(int sig, void* address, void* address1)
1594{
1595        Dl_info info, info1;
1596        void* trace[20];
1597        size_t size;
1598        size = backtrace(trace, 20);
1599
1600        FILE* fd = NULL;
1601        void* akttrace[2];
1602        int i = 0;
1603        char **strings;
1604        char **aktstring;
1605        time_t rawtime;
1606#ifdef BETA
1607        int y = 0;
1608        Dl_info info2;
1609#endif
1610
1611        char* imgversion = NULL;
1612        struct stimerthread* tnode = NULL;
1613
1614        if(isfile(getconfig("imagenamefile", NULL))     != 0)
1615                imgversion = readsys(getconfig("imagenamefile", NULL), 1);
1616        else
1617                imgversion = ostrcat("unknown", NULL, 0, 0);
1618
1619        tnode = gettimerbythread(pthread_self());
1620        if(tnode != NULL)
1621                dladdr(tnode->func, &info);
1622
1623        dladdr(address, &info1);
1624
1625        strings = backtrace_symbols(trace, size);
1626        akttrace[0] = (void*)address1;
1627        akttrace[1] = (void*)address;
1628        aktstring = backtrace_symbols(akttrace, 2); //get fault funktion name
1629
1630        fprintf(stderr, "--------------------------------------\n");
1631        fprintf(stderr, "Box: %s\n", getboxtype());
1632        fprintf(stderr, "Image: %s\n", imgversion);
1633        fprintf(stderr, "Signal: %d (%s)\n", sig, strsignal(sig));
1634        if(info1.dli_fname != NULL)
1635                fprintf(stderr, "Error in File: %s\n", info1.dli_fname);
1636        fprintf(stderr, "MainThread: %x\n", (unsigned int)status.mainthread);
1637        if(tnode != NULL && info.dli_sname != NULL)
1638                fprintf(stderr, "Error in Thread: %x (%s)\n", (unsigned int)pthread_self(), info.dli_sname);
1639        else
1640                fprintf(stderr, "Error in Thread: %x\n", (unsigned int)pthread_self());
1641       
1642        fprintf(stderr, "\nObtaining %zd stack frames:\n\n", size);
1643        for(i = 0; i < size; i++)
1644                fprintf(stderr, "%s\n", strings[i]);
1645
1646        fprintf(stderr, "\nLast functions:\n\n");
1647        fprintf(stderr, "%s\n", aktstring[0]);
1648        fprintf(stderr, "%s\n", aktstring[1]);
1649
1650#ifdef BETA     
1651        for(i = 0; i < MAXSTACKTRACE; i++)
1652        {
1653                if(stacktrace[i].pos > 0)
1654                {
1655                        fprintf(stderr, "\nObtaining %d Thread Stack frames [%p]:\n\n", stacktrace[i].pos, (void*)stacktrace[i].thread);
1656                        for(y = stacktrace[i].pos - 1; y >= 0; y--)
1657                        {
1658                                dladdr(stacktrace[i].func[y], &info2);
1659        fprintf(stderr, "%s(%s) [%p]\n", info2.dli_fname, info2.dli_sname, stacktrace[i].func[y]);
1660                        }
1661                }
1662        }
1663#endif
1664
1665        fprintf(stderr, "--------------------------------------\n");
1666
1667        char* logdir = ostrcat(getconfig("tracelog", NULL), NULL, 0, 0);
1668        if(logdir != NULL)
1669        {
1670                char* tmplogdir = dirname(logdir);
1671                if(tmplogdir != NULL)
1672                {
1673                        if(!file_exist(tmplogdir))   
1674                                mkdir(tmplogdir, 0777);
1675                }
1676                free(logdir); logdir = NULL;
1677        }
1678       
1679        //del file if greater 100KB
1680        if(getfilesize(getconfig("tracelog", NULL)) > 102400)
1681                unlink(getconfig("tracelog", NULL));
1682                       
1683        fd = fopen(getconfig("tracelog", NULL), "a");
1684        if(fd != NULL)
1685        {
1686                time(&rawtime);
1687                fprintf(fd, "Date: %s", ctime(&rawtime));
1688                fprintf(fd, "Box: %s\n", getboxtype());
1689                fprintf(fd, "Image: %s\n", imgversion);
1690                fprintf(fd, "Signal: %d (%s)\n", sig, strsignal(sig));
1691                if(info1.dli_fname != NULL)
1692                        fprintf(fd, "Error in File: %s\n", info1.dli_fname);
1693                fprintf(fd, "MainThread: %x\n", (unsigned int)status.mainthread);
1694                if(tnode != NULL && info.dli_sname != NULL)
1695                        fprintf(fd, "Error in Thread: %x (%s)\n", (unsigned int)pthread_self(), info.dli_sname);
1696                else
1697                        fprintf(fd, "Error in Thread: %x\n", (unsigned int)pthread_self());
1698                       
1699                fprintf(fd, "\nObtaining %zd stack frames:\n\n", size);
1700                for(i = 0; i < size; i++)
1701                        fprintf(fd, "%s\n", strings[i]);
1702                       
1703                fprintf(fd, "\nLast functions:\n\n");
1704                fprintf(fd, "%s\n", aktstring[0]);
1705                fprintf(fd, "%s\n", aktstring[1]);
1706
1707#ifdef BETA             
1708                for(i = 0; i < MAXSTACKTRACE; i++)
1709                {
1710                        if(stacktrace[i].pos > 0)
1711                        {
1712                                fprintf(fd, "\nObtaining %d Thread Stack frames [%p]:\n\n", stacktrace[i].pos, (void*)stacktrace[i].thread);
1713                                for(y = stacktrace[i].pos - 1; y >= 0; y--)
1714                                {
1715                                        dladdr(stacktrace[i].func[y], &info2);
1716                fprintf(fd, "%s(%s) [%p]\n", info2.dli_fname, info2.dli_sname, stacktrace[i].func[y]);
1717                                }
1718                        }
1719                }
1720#endif
1721               
1722                fprintf(fd, "--------------------------------------\n\n");
1723                fclose(fd);
1724                sync();
1725        }
1726        else
1727                perr("open %s", getconfig("tracelog", NULL));
1728
1729        free(imgversion);
1730        free(strings);
1731        free(aktstring);
1732}
1733
1734int mountauto(const char *file, const char *dir, unsigned long int flag, const void *data)
1735{
1736        int ret = -1;
1737        char* saveptr = NULL, *filesystems = NULL, *tmpfilesystems = NULL, *token = NULL;
1738
1739        filesystems = getconfig("filesystems", NULL);
1740        tmpfilesystems = ostrcat(tmpfilesystems, filesystems, 0, 0);
1741
1742        token = strtok_r(tmpfilesystems, ";", &saveptr);
1743        while(token != NULL)
1744        {
1745                ret = mount(file, dir, token, flag, data);
1746                if(ret == 0) break;
1747                token = strtok_r(NULL, ";", &saveptr);
1748        }
1749
1750        free(tmpfilesystems);
1751        return ret;
1752}
1753
1754int setwaswakuptimer(int value)
1755{
1756        char *waswakeuptimerdev = NULL, *tmpstr = NULL;
1757        int ret = 0;
1758
1759        waswakeuptimerdev = getconfig("waswakeuptimerdev", NULL);
1760
1761        if(waswakeuptimerdev != NULL)
1762        {
1763                debug(100, "set %s to %d", waswakeuptimerdev, value);
1764                tmpstr = oitoa(value);
1765                ret = writesys(waswakeuptimerdev, tmpstr, 0);
1766                free(tmpstr); tmpstr = NULL;
1767                return ret;
1768        }
1769
1770        return 0;
1771}
1772
1773int getwaswakuptimer()
1774{
1775        int ret = 0;
1776        char *waswakeuptimerdev = NULL;
1777        char *value = NULL;
1778
1779        waswakeuptimerdev = getconfig("waswakeuptimerdev", NULL);
1780
1781        if(waswakeuptimerdev == NULL)
1782        {
1783                err("NULL detect");
1784                return 0;
1785        }
1786
1787        value = readsys(waswakeuptimerdev, 1);
1788        if(value == NULL)
1789        {
1790                err("NULL detect");
1791                return 0;
1792        }
1793
1794        // start from timer
1795        if(atoi(value) == 1) ret = 1;
1796
1797        free(value);
1798        return ret;
1799}
1800
1801int getrtctime()
1802{
1803        int ret = 0;
1804        char *rtctimedev = NULL;
1805        char *value = NULL;
1806
1807        rtctimedev = getconfig("rtctimedev", NULL);
1808
1809        if(rtctimedev == NULL)
1810        {
1811                err("NULL detect");
1812                return 0;
1813        }
1814
1815        value = readsys(rtctimedev, 1);
1816        if(value == NULL)
1817        {
1818                err("NULL detect");
1819                return 0;
1820        }
1821
1822        // start from timer
1823        if(atoi(value) == 1) ret = 1;
1824
1825        free(value);
1826        return ret;
1827}
1828
1829void checkboxstart()
1830{
1831        struct rectimer* node = rectimer;
1832        int timediff = getconfigint("rectimer_timediff", NULL);
1833        int test = 0;
1834       
1835        if(node == NULL)
1836        {
1837                setcecstandby(0);
1838                return;                                                 //no record
1839        }
1840
1841        while(node != NULL)
1842        {
1843                if(node->status < 2 || node->status == 4)
1844                {
1845                        time_t akttime = time(NULL);
1846                        time_t begin = node->begin - getconfigint("wakeuptimerdevdiff", NULL);
1847
1848                        debug(400, "begin=%ld akttime1=%ld akttime2=%ld", begin, akttime - timediff, akttime + timediff);
1849
1850                        if(begin > akttime - timediff && begin < akttime + timediff)
1851                        {
1852                                debug(400, "found rectimer who has start the box");
1853                                setwaswakuptimer(1);
1854                                setcecstandby(1);
1855                                test = 1;
1856                        }
1857                }
1858                node = node->next;
1859        }
1860        if(test == 0)
1861                setcecstandby(0);
1862}
1863
1864int setwakeuptimerdev(time_t value)
1865{
1866        char* wakeuptimerdev, *tmpstr = NULL;
1867        int ret = 0;
1868        int diff = getconfigint("wakeuptimerdevdiff", NULL);
1869
1870        if(value != 0x7FFFFFFF && value - diff > time(NULL))
1871                value -= diff;
1872
1873        wakeuptimerdev = getconfig("wakeuptimerdev", NULL);
1874
1875        if(wakeuptimerdev != NULL && value >= time(NULL))
1876        {
1877                debug(10, "set %s to %ld", wakeuptimerdev, value);
1878                tmpstr = olutoa(value);
1879                ret = writesys(wakeuptimerdev, tmpstr, 0);
1880                free(tmpstr); tmpstr = NULL;
1881                return ret;
1882        }
1883
1884        return 0;
1885}
1886
1887int setrtctime(int value)
1888{
1889        char *rtctimedev = NULL, *tmpstr = NULL;
1890        int ret = 0;
1891
1892        value += 7200;
1893
1894        rtctimedev = getconfig("rtctimedev", NULL);
1895
1896        if(rtctimedev != NULL)
1897        {
1898                debug(10, "set %s to %d", rtctimedev, value);
1899                tmpstr = oitoa(value);
1900                ret = writesys(rtctimedev, tmpstr, 0);
1901                free(tmpstr); tmpstr = NULL;
1902                return ret;
1903        }
1904
1905        return 0;
1906}
1907
1908int changepolicy()
1909{
1910        char *tmppolicy = NULL, *tmpstr = NULL;
1911
1912        tmppolicy = getpolicy();
1913
1914#ifdef MIPSEL
1915        char *aspect = NULL;
1916        aspect = getaspect();
1917
1918        if(!ostrncmp("16:9", aspect, 4))
1919        {
1920                if(ostrcmp("16:9_set_bestfit_to_policy_show_justscale", tmppolicy) == 0)
1921                        tmpstr = ostrcat("16:9_set_letterbox_to_policy_show_panscan", NULL, 0, 0);
1922                else if(ostrcmp("16:9_set_letterbox_to_policy_show_panscan", tmppolicy) == 0)
1923                        tmpstr = ostrcat("16:9_set_panscan_to_policy_show_pillarbox", NULL, 0, 0);
1924                else if(ostrcmp("16:9_set_panscan_to_policy_show_pillarbox", tmppolicy) == 0)
1925                        tmpstr = ostrcat("16:9_set_bestfit_to_policy_show_justscale", NULL, 0, 0);
1926
1927        }
1928        else
1929        {
1930                if(ostrcmp("4:3_set_bestfit_to_policy2_show_justscale", tmppolicy) == 0)
1931                        tmpstr = ostrcat("4:3_set_letterbox_to_policy2_show_letterbox", NULL, 0, 0);
1932                else if(ostrcmp("4:3_set_letterbox_to_policy2_show_letterbox", tmppolicy) == 0)
1933                        tmpstr = ostrcat("4:3_set_panscan_to_policy2_show_panscan", NULL, 0, 0);
1934                else if(ostrcmp("16:9_set_panscan_to_policy_show_pillarbox", tmppolicy) == 0)
1935                        tmpstr = ostrcat("4:3_set_bestfit_to_policy2_show_justscale", NULL, 0, 0);
1936        }
1937
1938#else
1939        if(!ostrncmp("letterbox", tmppolicy, 8))
1940                tmpstr = ostrcat(tmpstr, "panscan", 1, 0);
1941        else if(!ostrncmp("panscan", tmppolicy, 7))
1942                tmpstr = ostrcat(tmpstr, "non", 1, 0);
1943        else if(!ostrncmp("non", tmppolicy, 3))
1944                tmpstr = ostrcat(tmpstr, "bestfit", 1, 0);
1945        else if(!ostrncmp("bestfit", tmppolicy, 7))
1946                tmpstr = ostrcat(tmpstr, "letterbox", 1, 0);
1947#endif
1948
1949        setpolicy(tmpstr);
1950
1951        free(tmpstr); tmpstr = NULL;
1952        free(tmppolicy); tmppolicy = NULL;
1953        return 0;
1954}
1955
1956char* getmac(char* dev)
1957{
1958        int sock = -1, i = 0;
1959        struct ifreq buf;
1960        char* tmpstr = NULL;
1961        char tmpbuf[4] = {};
1962
1963        if(dev == NULL) return NULL;
1964
1965        sock = socket(PF_INET, SOCK_DGRAM, 0);
1966        if(sock >= 0)
1967        {
1968                memset(&buf, 0x00, sizeof(buf));
1969                strcpy(buf.ifr_name, dev);
1970                ioctl(sock, SIOCGIFHWADDR, &buf);
1971                close(sock);
1972
1973                for(i = 0; i < 6; i++)
1974                {
1975                        snprintf(tmpbuf, 4, "%.2X:", (unsigned char)buf.ifr_hwaddr.sa_data[i]);
1976                        tmpstr = ostrcat(tmpstr, tmpbuf, 1, 0);
1977                }
1978                if(tmpbuf != NULL)
1979                        tmpstr[strlen(tmpstr) - 1] = '\0';
1980        }
1981
1982        return tmpstr;
1983}
1984
1985char* getdefaultgw()
1986{
1987        char* name = NULL;
1988        unsigned long def, gw, m;
1989        int flags, ref, use, metric, mtu, win, ir;
1990        struct in_addr ip;
1991
1992        FILE *fd = fopen("/proc/net/route", "r");
1993        if(fd == NULL)
1994                return NULL;
1995
1996        if(fscanf(fd, "%*[^\n]\n") < 0)
1997        {
1998                fclose(fd);
1999                return NULL;
2000        }
2001
2002        name = malloc(64);
2003        if(name == NULL)
2004        {
2005                err("no mem");
2006                return NULL;
2007        }
2008
2009        while(1)
2010        {
2011                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);
2012                if(def == 0) break;
2013                if(r != 11)
2014                {
2015                        fclose(fd);
2016                        free(name);
2017                        return NULL;
2018                }
2019                if(!(flags & 0x0001)) continue; //is interface down
2020        }
2021
2022        fclose(fd);
2023        free(name);
2024
2025        ip.s_addr = gw;
2026        if(def == 0)
2027                return inet_ntoa(ip);
2028
2029        return NULL;
2030}
2031
2032char* changefilenameext(char* filename, char* ext)
2033{
2034        char* newfilename = NULL;
2035        char* zeichen = NULL;
2036
2037        if(filename == NULL) return NULL;
2038
2039        newfilename = ostrcat(filename, NULL, 0, 0);
2040
2041        zeichen = strrchr(newfilename, '.');
2042        if(zeichen != NULL)
2043        {
2044                zeichen[0] = '\0';
2045                newfilename = ostrcat(newfilename, ext, 1, 0);
2046        }
2047
2048        return newfilename;
2049}
2050
2051int cmpfilenameext(char* filename, char* ext)
2052{
2053        char* zeichen = NULL;
2054
2055        if(filename == NULL) return 1;
2056
2057        zeichen = strrchr(filename, '.');
2058        if(zeichen != NULL)
2059        {
2060                if(ostrcasecmp(zeichen, ext) == 0) return 0;
2061        }
2062
2063        return 1;
2064}
2065
2066char* getfilenameext(char* filename)
2067{
2068        char* zeichen = NULL;
2069
2070        if(filename == NULL) return NULL;
2071
2072        zeichen = strrchr(filename, '.');
2073        if(zeichen != NULL)
2074        {
2075                return ostrcat(zeichen + 1, NULL, 0, 0);
2076        }
2077
2078        return NULL;
2079}
2080
2081char* getfilenamepng(char* filename)
2082{
2083        char* tmpstr = NULL;
2084
2085        if(filename == NULL) return NULL;
2086       
2087        if(!filelistflt(".avi .dat .divx .flv .mkv .m4v .mp4 .mov .mpg .mpeg .mts .m2ts .trp .ts .vdr .vob .wmv .rm", filename))
2088                tmpstr = ostrcat("movie", NULL, 0, 0);
2089        else if(!filelistflt(".mp3 .flac .ogg .wma .ra .wav", filename))
2090                tmpstr = ostrcat("musik", NULL, 0, 0);
2091        else if(!filelistflt(".jpg .png", filename))
2092                tmpstr = ostrcat("picture", NULL, 0, 0);
2093        else
2094                tmpstr = ostrcat(getfilenameext(filename), NULL, 1, 0);
2095
2096        if(tmpstr != NULL)
2097        {
2098                return tmpstr;
2099        }
2100
2101        return NULL;
2102}
2103
2104char* getcurrentdir(char* path)
2105{
2106        char* zeichen = NULL;
2107
2108        if(path == NULL) return NULL;
2109
2110        zeichen = strrchr(path, '/');
2111        if(zeichen != NULL)
2112        {
2113                return ostrcat(zeichen + 1, NULL, 0, 0);
2114        }
2115
2116        return NULL;
2117}
2118
2119char* convert_timesec(int sec)
2120{
2121        int hour = 0, min = 0, seconds = 0;
2122        char* buf = NULL;
2123
2124        buf = malloc(9);
2125        if(buf == NULL)
2126        {
2127                err("no mem");
2128                return NULL;
2129        }
2130
2131        seconds = sec % 60;
2132        min = (sec / 60) % 60;
2133        hour = sec / 3600;
2134
2135        if(seconds < 0) seconds = 0;
2136        if(min < 0) min = 0;
2137        if(hour < 0 || hour > 23)
2138        {
2139                hour = 0;
2140                min = 0;
2141                seconds = 0;
2142        }
2143
2144        snprintf(buf, 9, "%02d:%02d:%02d", hour, min, seconds);
2145
2146        return buf;
2147}
2148
2149int checkdate()
2150{
2151        time_t dvbtime = 0;
2152
2153        if(time(NULL) < 1072224000 || status.timeupdatecount > 3600) // 01.01.2004
2154        {
2155                if(dvbgetdate(&dvbtime, 10000000) == 0) //10 sek
2156                {
2157                        setsystime(&dvbtime);
2158#ifdef MIPSEL
2159                        setrtctimemips();
2160#endif
2161                        status.timeupdatecount = 0;
2162                        return 0;
2163                }
2164                return 1;
2165        }
2166        return 0;
2167}
2168
2169void closeonexec(int fd)
2170{
2171        if(fd > -1)
2172                fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC);
2173}
2174
2175void startnewsletter(flag)
2176{
2177        if(flag == 1)
2178        {
2179                if(getconfigint("newsletter", NULL) == 1 && status.newsletterthread == NULL)
2180                        status.newsletterthread = addtimer(&newsletterthreadfunc, START, 1000, 1, NULL, NULL, NULL);
2181        }
2182        else if(status.newsletterthread != NULL)
2183        {
2184                status.newsletterthread->aktion = STOP;
2185                status.newsletterthread = NULL;
2186        }
2187}
2188
2189void startthumb(flag)
2190{
2191        if(flag == 1)
2192        {
2193                if(getconfigint("createthumb", NULL) == 1 && status.thumbthread == NULL)
2194                        status.thumbthread = addtimer(&thumbthread, START, 1000, 1, NULL, NULL, NULL);
2195        }
2196        else if(status.thumbthread != NULL)
2197        {
2198                status.thumbthread->aktion = STOP;
2199                status.thumbthread = NULL;
2200        }
2201}
2202
2203void starthttpd(flag)
2204{
2205        if(flag == 1)
2206        {
2207                if(getconfigint("httpdstart", NULL) == 1 && status.httpthread == NULL)
2208                {
2209                        status.httpthread = addtimer(&httpdthreadfunc, START, 10000, -1, NULL, NULL, NULL);
2210                        if(status.httpthread != NULL)
2211                                status.httpthread->flag = setbit(status.httpthread->flag, 0);
2212                }
2213        }
2214        else if(status.httpthread != NULL)
2215        {
2216                status.httpthread->aktion = STOP;
2217                status.httpthread = NULL;
2218        }
2219}
2220
2221void startrguid(flag)
2222{
2223        if(flag == 1)
2224        {
2225                if(getconfigint("rguidstart", NULL) == 1 && status.rguithread == NULL)
2226                {
2227                        status.rguithread = addtimer(&rguidthreadfunc, START, 10000, -1, NULL, NULL, NULL);
2228                        if(status.rguithread != NULL)
2229                                status.rguithread->flag = setbit(status.rguithread->flag, 0);
2230                }
2231        }
2232        else if(status.rguithread != NULL)
2233        {
2234                status.rguithread->aktion = STOP;
2235                status.rguithread = NULL;
2236        }
2237}
2238
2239int setoverclockfreq(int mode)
2240{
2241        // mode 0 = Set Standby Freq
2242        // mode 1 = Set Freq
2243
2244        if(ostrcmp(getownconfig("standby_overclock"), "0") == 0)
2245                return 1;
2246
2247        if(isfile("/proc/cpu_frequ/pll0_ndiv_mdiv") == 0)
2248                return 1;
2249
2250        char* tmpstr = NULL;
2251
2252        if(mode == 0)
2253                tmpstr = getownconfig("standby_freq");
2254        else
2255                tmpstr = getownconfig("pll0_ndiv_mdiv");
2256
2257        return writesys("/proc/cpu_frequ/pll0_ndiv_mdiv", tmpstr, 1);
2258}
2259
2260/*
2261int checkdev(char* dev)
2262{
2263        char* cmd = NULL;
2264        cmd = ostrcat(cmd, "cat ", 1, 0);
2265        cmd = ostrcat(cmd, dev, 1, 0);
2266
2267        char* tmpstr = NULL;
2268        tmpstr = string_newline(command(cmd));
2269        free(cmd), cmd = NULL;
2270
2271        if(tmpstr == NULL)
2272        {
2273                return 0;
2274        }
2275
2276        if(ostrcmp(tmpstr, "Segmentation fault") == 0)
2277        {
2278                return 0;
2279        }
2280       
2281        free(tmpstr), tmpstr = NULL;
2282        return 1;
2283}
2284*/
2285
2286int setsaturation(int value)
2287{
2288        char* saturationdev;
2289
2290        saturationdev = getconfig("saturationdev", NULL);
2291
2292        if(saturationdev != NULL /*&& checkdev(saturationdev)*/)
2293        {
2294                debug(100, "set %s to %d", saturationdev, value);
2295                return writesysint(saturationdev, value, 1);
2296        }
2297
2298        return 0;
2299}
2300
2301int setbrightness(int value)
2302{
2303        char* brightnessdev;
2304
2305        brightnessdev = getconfig("brightnessdev", NULL);
2306
2307        if(brightnessdev != NULL /*&& checkdev(brightnessdev)*/)
2308        {
2309                debug(100, "set %s to %d", brightnessdev, value);
2310                return writesysint(brightnessdev, value, 1);
2311        }
2312
2313        return 0;
2314}
2315
2316int setcontrast(int value)
2317{
2318        char* contrastdev;
2319
2320        contrastdev = getconfig("contrastdev", NULL);
2321
2322        if(contrastdev != NULL /*&& checkdev(contrastdev)*/)
2323        {
2324                debug(100, "set %s to %d", contrastdev, value);
2325                return writesysint(contrastdev, value, 1);
2326        }
2327
2328        return 0;
2329}
2330
2331int settint(int value)
2332{
2333        char* tintdev;
2334
2335        tintdev = getconfig("tintdev", NULL);
2336
2337        if(tintdev != NULL /*&& checkdev(tintdev)*/)
2338        {
2339                debug(100, "set %s to %d", tintdev, value);
2340                return writesysint(tintdev, value, 1);
2341        }
2342
2343        return 0;
2344}
2345
2346int ozip(char* inbuf, int inlen, char** outbuf, int* outlen, int level)
2347{
2348        int ret = 0;
2349        z_stream stream;
2350       
2351        if(inbuf == NULL || outbuf == NULL || inlen == 0) return 1;
2352
2353        stream.zalloc = Z_NULL;
2354        stream.zfree = Z_NULL;
2355        stream.opaque = Z_NULL;
2356        stream.avail_in = 0;
2357        stream.next_in = Z_NULL;
2358        stream.avail_out = 0;
2359        stream.next_out = Z_NULL;
2360
2361        ret = deflateInit(&stream, level);
2362        if(ret != Z_OK)
2363                return 1;
2364
2365        *outbuf = malloc(inlen);
2366        if(*outbuf == NULL)
2367        {
2368                err("no mem");
2369                (void)deflateEnd(&stream);
2370                return 1;
2371        }
2372
2373        stream.avail_in = inlen;
2374        stream.next_in = (void*)inbuf;
2375 
2376        do
2377        {
2378                stream.avail_out = inlen;
2379                stream.next_out = (void*)*outbuf;
2380
2381                ret = deflate(&stream, Z_FINISH);
2382                if(ret == Z_STREAM_ERROR)
2383                {
2384                        free(*outbuf); *outbuf = NULL;
2385                        (void)deflateEnd(&stream);
2386                        return 1;
2387                }
2388        }
2389        while(stream.avail_out == 0);
2390       
2391        char* tmpoutbuf = *outbuf;     
2392        *outlen = inlen - stream.avail_out;
2393        *outbuf = realloc(*outbuf, *outlen);
2394        if(*outbuf == NULL)
2395        {
2396                if(*outlen > 0)
2397                {
2398                        err("no mem"); 
2399                        free(tmpoutbuf);
2400                }
2401                *outlen = 0;
2402                (void)deflateEnd(&stream);
2403                return 1;
2404        }       
2405
2406        (void)deflateEnd(&stream);
2407        return 0;
2408}
2409
2410//flag 0: malloc mem
2411//flag 1: don't malloc mem
2412//flag 2: malloc mem (gzip)
2413//flag 3: don't malloc mem (gzip)
2414int ounzip(char* inbuf, int inlen, char** outbuf, int* outlen, int maxbuf, int flag)
2415{
2416        int ret = 0;
2417        z_stream stream;
2418       
2419        if(inbuf == NULL || outbuf == NULL || maxbuf == 0) return 1;
2420        if(flag == 1 && *outbuf == NULL) return 1;
2421
2422        stream.zalloc = Z_NULL;
2423        stream.zfree = Z_NULL;
2424        stream.opaque = Z_NULL;
2425        stream.avail_in = 0;
2426        stream.next_in = Z_NULL;
2427        stream.avail_out = 0;
2428        stream.next_out = Z_NULL;
2429
2430        if(flag == 2 || flag == 3)
2431        {
2432                ret = inflateInit2(&stream, 16 + MAX_WBITS);
2433                if(flag == 2) flag = 0;
2434                else if(flag == 3) flag = 1;
2435        }
2436        else
2437                ret = inflateInit(&stream);
2438        if(ret != Z_OK)
2439                return 1;
2440
2441        if(flag == 0)
2442        {
2443                *outbuf = malloc(maxbuf);
2444                if(*outbuf == NULL)
2445                {
2446                        err("no mem");
2447                        (void)inflateEnd(&stream);
2448                        return 1;
2449                }
2450        }
2451
2452        stream.avail_in = inlen;
2453        stream.next_in = (void*)inbuf;
2454
2455        int round = 0;
2456        do
2457        {
2458                stream.avail_out = maxbuf;
2459               
2460                if(flag == 0 && round > 0)
2461                {
2462                        char* tmpoutbuf = *outbuf;
2463                        *outbuf = realloc(*outbuf, maxbuf * (round + 1));
2464                        if(*outbuf == NULL)
2465                        {
2466                                err("no mem");
2467                                free(tmpoutbuf);
2468                                (void)inflateEnd(&stream);
2469                                return 1;
2470                        }
2471                        stream.next_out = (void*)(*outbuf) + maxbuf * round;
2472                }
2473                else
2474                        stream.next_out = (void*)*outbuf;
2475
2476                ret = inflate(&stream, Z_NO_FLUSH);
2477                if(ret == Z_NEED_DICT || ret == Z_DATA_ERROR || ret == Z_MEM_ERROR)
2478                {
2479                        if(flag == 0)
2480                        {
2481                                free(*outbuf);
2482                                *outbuf = NULL;
2483                        }                               
2484                        (void)inflateEnd(&stream);
2485                        return 1;
2486                }
2487
2488                round++;
2489        }
2490        while(stream.avail_out == 0);
2491       
2492        if(flag == 0)
2493        {
2494                char* tmpoutbuf = *outbuf;
2495                *outlen = (maxbuf * round) - stream.avail_out;
2496                *outbuf = realloc(*outbuf, *outlen);
2497                if(*outbuf == NULL)
2498                {
2499                        err("no mem");
2500                        if(*outlen > 0) free(tmpoutbuf);
2501                        *outlen = 0;
2502                        (void)inflateEnd(&stream);
2503                        return 1;
2504                }       
2505        }
2506        else
2507                *outlen = maxbuf - stream.avail_out;                   
2508
2509        (void)inflateEnd(&stream);
2510        return 0;
2511}
2512
2513void endianswapshort(unsigned short* value)
2514{
2515        *value = (*value >> 8) | (*value << 8);
2516}
2517
2518int rcnumber(int rcret)
2519{
2520        if(rcret == getrcconfigint("rc0", NULL) ||
2521        rcret == getrcconfigint("rc1", NULL) ||
2522        rcret == getrcconfigint("rc2", NULL) ||
2523        rcret == getrcconfigint("rc3", NULL) ||
2524        rcret == getrcconfigint("rc4", NULL) ||
2525        rcret == getrcconfigint("rc5", NULL) ||
2526        rcret == getrcconfigint("rc6", NULL) ||
2527        rcret == getrcconfigint("rc7", NULL) ||
2528        rcret == getrcconfigint("rc8", NULL) ||
2529        rcret == getrcconfigint("rc9", NULL))
2530                return rcret;
2531        else
2532                return -9999;
2533}
2534
2535int checkdirext(char* dir, char* ext)
2536{
2537        struct dirent *dirent = NULL;
2538        DIR *pdir = NULL;
2539
2540        pdir = opendir(dir);
2541        if(pdir != NULL)
2542        {
2543                while((dirent = readdir(pdir)) != NULL)
2544                {
2545                        if(ostrcmp(".", dirent->d_name) != 0 && ostrcmp("..", dirent->d_name) != 0)
2546                        {
2547                                if(ostrstr(dirent->d_name, ext) != NULL)
2548                                {
2549                                        closedir(pdir);
2550                                        return 1;
2551                                }
2552                        }
2553                }
2554
2555                closedir(pdir);
2556        }
2557
2558        return 0;
2559}
2560
2561int delallfiles(char* dir, char* ext)
2562{
2563        struct dirent *dirent = NULL;
2564        DIR *pdir = NULL;
2565        char* tmpstr = NULL;
2566
2567        pdir = opendir(dir);
2568        if(pdir != NULL)
2569        {
2570                while((dirent = readdir(pdir)) != NULL)
2571                {
2572                        if(ostrcmp(".", dirent->d_name) != 0 && ostrcmp("..", dirent->d_name) != 0)
2573                        {
2574                                if(ext == NULL || ostrstr(dirent->d_name, ext) != NULL)
2575                                {
2576                                        tmpstr = ostrcat(dir, "/", 0, 0);
2577                                        tmpstr = ostrcat(tmpstr, dirent->d_name, 1, 0);
2578                                        unlink(tmpstr);
2579                                        free(tmpstr); tmpstr = NULL;
2580                                }
2581                        }
2582                }
2583
2584                closedir(pdir);
2585        }
2586
2587        return 0;
2588}
2589
2590unsigned long getfilecount(char* dir)
2591{
2592        unsigned long count = 0;
2593        struct dirent *dirent = NULL;
2594        DIR *pdir = NULL;
2595
2596        pdir = opendir(dir);
2597        if(pdir != NULL)
2598        {
2599                while((dirent = readdir(pdir)) != NULL)
2600                        count++;
2601
2602                closedir(pdir);
2603        }
2604
2605        return count;
2606}
2607
2608int getfiletype(char* filename)
2609{
2610        struct stat64 s;
2611
2612        if(filename == NULL) return -1;
2613
2614        if(stat64(filename, &s) >= 0)
2615        {
2616                if(S_ISREG(s.st_mode)) return DT_REG;
2617                if(S_ISDIR(s.st_mode)) return DT_DIR;
2618                if(S_ISCHR(s.st_mode)) return DT_CHR;
2619                if(S_ISBLK(s.st_mode)) return DT_BLK;
2620                if(S_ISFIFO(s.st_mode)) return DT_FIFO;
2621                if(S_ISLNK(s.st_mode)) return DT_LNK;
2622        }
2623
2624        return DT_UNKNOWN;
2625}
2626
2627int getlfiletype(char* filename)
2628{
2629        struct stat64 s;
2630
2631        if(filename == NULL) return -1;
2632
2633        if(lstat64(filename, &s) >= 0)
2634        {
2635                if(S_ISREG(s.st_mode)) return DT_REG;
2636                if(S_ISDIR(s.st_mode)) return DT_DIR;
2637                if(S_ISCHR(s.st_mode)) return DT_CHR;
2638                if(S_ISBLK(s.st_mode)) return DT_BLK;
2639                if(S_ISFIFO(s.st_mode)) return DT_FIFO;
2640                if(S_ISLNK(s.st_mode)) return DT_LNK;
2641        }
2642
2643        return DT_UNKNOWN;
2644}
2645
2646unsigned long long getfullspace(char* dir)
2647{
2648        struct statfs64 s;
2649        unsigned long long fullsize = 0;
2650
2651        if(statfs64(dir, &s) >= 0)
2652        {
2653                fullsize = s.f_blocks;
2654                fullsize *= s.f_bsize;
2655        }
2656
2657        return fullsize;
2658}
2659
2660unsigned long long getfreespace(char* dir)
2661{
2662        struct statfs64 s;
2663        unsigned long long freesize = 0;
2664
2665        if(statfs64(dir, &s) >= 0)
2666        {
2667                freesize = s.f_bfree;
2668                freesize *= s.f_bsize;
2669        }
2670
2671        return freesize;
2672}
2673
2674int checkbit(int value, int bitpos)
2675{
2676        int ret = 0;
2677
2678        ret = value & (1 << bitpos) ? 1: 0;
2679        return ret;
2680}
2681
2682int tooglebit(int value, int bitpos)
2683{
2684        value ^= 1 << bitpos;
2685        return value;
2686}
2687
2688int clearbit(int value, int bitpos)
2689{
2690        value &= ~(1 << bitpos);
2691        return value;
2692}
2693
2694int setbit(int value, int bitpos)
2695{
2696        value |= 1 << bitpos;
2697        return value;
2698}
2699
2700int setsystime(time_t* newtime)
2701{
2702        if (stime(newtime))
2703        {
2704                err("can't set system time");
2705                return 1;
2706        }
2707        return 0;
2708}
2709
2710off64_t getfilesize(char* name)
2711{
2712        struct stat64 sbuf;
2713
2714        if(lstat64(name, &sbuf) == -1)
2715                return 0;
2716
2717        return sbuf.st_size;
2718}
2719
2720time_t getfiletime(char* name, int type)
2721{
2722        struct stat64 sbuf;
2723
2724        if(lstat64(name, &sbuf) == -1)
2725                return 0;
2726
2727        switch(type)
2728        {
2729                case 1: return sbuf.st_mtime;
2730                case 2: return sbuf.st_ctime;
2731                default: return sbuf.st_atime;
2732        }
2733}
2734
2735int isfile(char* name)
2736{
2737        struct stat64 sbuf;
2738
2739        if(lstat64(name, &sbuf) == -1)
2740                return 0;
2741
2742        if(S_ISREG(sbuf.st_mode))
2743                return 1;
2744
2745        return 0;
2746}
2747
2748int isdir(char* name)
2749{
2750        struct stat64 sbuf;
2751        char *rpath = NULL;
2752
2753        if(lstat64(name, &sbuf) == -1)
2754                return 0;
2755
2756        if(S_ISDIR(sbuf.st_mode))
2757                return 1;
2758
2759        if(S_ISLNK(sbuf.st_mode))
2760        {
2761                rpath = realpath(name, NULL);
2762                if(lstat64(rpath, &sbuf) == -1)
2763                {
2764                        free(rpath);
2765                        return 0;
2766                }
2767                free(rpath);
2768                if(S_ISDIR(sbuf.st_mode))
2769                        return 1;
2770        }
2771
2772        return 0;
2773}
2774
2775char* getmaxsatstring(int maxsat)
2776{
2777        char* tmpstr = NULL, *tmpnr = NULL;
2778        int i;
2779
2780        tmpstr = ostrcat(tmpstr, "1", 1, 0);
2781        for(i = 2; i <= maxsat; i++)
2782        {
2783                tmpnr = oitoa(i);
2784                tmpstr = ostrcat(tmpstr, "\n", 1, 0);
2785                tmpstr = ostrcat(tmpstr, tmpnr, 1, 1);
2786        }
2787        return tmpstr;
2788}
2789
2790void ostrcatbig(char** value1, char* value2, int* maxlen, int* pos)
2791{
2792        int len = 0;
2793
2794        if(value2 == NULL)
2795                return;
2796
2797        len = strlen(value2) + 1;
2798
2799        if(*value1 != NULL && maxlen == 0)
2800                *maxlen = strlen(*value1);
2801
2802        if(*value1 == NULL || *pos + len > *maxlen)
2803        {
2804                *maxlen = *maxlen + len + (MINMALLOC * 10);
2805                *value1 = realloc(*value1, *maxlen);
2806                if(*value1 == NULL)
2807                {
2808                        err("no mem");
2809                        return;
2810                }
2811        }
2812
2813        memcpy(*value1 + *pos, value2, len);
2814        *pos = *pos + (len - 1);
2815}
2816
2817char* ostrshrink(char* value)
2818{
2819        int len = 0;
2820        char* buf = NULL;
2821
2822        if(value == NULL) return NULL;
2823
2824        len = strlen(value);
2825        if(len == 0) return value;
2826
2827        buf = malloc(len + 1);
2828        if(buf == NULL)
2829                return value;
2830
2831        memcpy(buf, value, len);
2832        free(value);
2833        buf[len] = '\0';
2834
2835        return buf;
2836}
2837
2838char* ostrcat(char* value1, char* value2, int free1, int free2)
2839{
2840        int len = 0, len1 = 0, len2 = 0;
2841        char* buf = NULL;
2842
2843        if(value1 == NULL && value2 == NULL) return NULL;
2844
2845        if(value1 != NULL) len1 = strlen(value1);
2846        if(value2 != NULL) len2 = strlen(value2);
2847
2848        len = len1 + len2 + 1;
2849
2850        if(free1 == 1)
2851                buf = realloc(value1, len);
2852        else
2853                buf = malloc(len);
2854        if(buf == NULL)
2855        {
2856                if(free1 == 1) free(value1);
2857                if(free2 == 1) free(value2);
2858                return NULL;
2859        }
2860
2861        if(free1 == 0 && len1 > 0) memcpy(buf, value1, len1);
2862        if(len2 > 0) memcpy(buf + len1, value2, len2);
2863        buf[len - 1] = '\0';
2864
2865        if(free2 == 1) free(value2);
2866
2867        //helpfull for memleak detect
2868        //if(buf != NULL && strlen(buf) == 0x0b - 0x01)
2869        //      printf("******** memleak string (%s) (%p) ********\n", buf, buf);
2870
2871        return buf;
2872}
2873
2874char* ollutoa(uint64_t value)
2875{
2876        char *buf = NULL;
2877
2878        buf = malloc(MINMALLOC);
2879        if(buf == NULL)
2880        {
2881                err("no mem");
2882                return NULL;
2883        }
2884
2885        sprintf(buf, "%llu", value);
2886        buf = ostrshrink(buf);
2887
2888        return buf;
2889}
2890
2891char* olutoa(unsigned long value)
2892{
2893        char *buf = NULL;
2894
2895        buf = malloc(MINMALLOC);
2896        if(buf == NULL)
2897        {
2898                err("no mem");
2899                return NULL;
2900        }
2901
2902        sprintf(buf, "%lu", value);
2903        buf = ostrshrink(buf);
2904
2905        return buf;
2906}
2907
2908char* oitoax(int value)
2909{
2910        char *buf = NULL;
2911
2912        buf = malloc(MINMALLOC);
2913        if(buf == NULL)
2914        {
2915                err("no mem");
2916                return NULL;
2917        }
2918
2919        sprintf(buf, "%x", value);
2920        buf = ostrshrink(buf);
2921
2922        return buf;
2923}
2924
2925char* oitoa(int value)
2926{
2927        char *buf = NULL;
2928
2929        buf = malloc(MINMALLOC);
2930        if(buf == NULL)
2931        {
2932                err("no mem");
2933                return NULL;
2934        }
2935
2936        sprintf(buf, "%d", value);
2937        buf = ostrshrink(buf);
2938
2939        return buf;
2940}
2941
2942char* oitoa64(off64_t value)
2943{
2944        char *buf = NULL;
2945
2946        buf = malloc(MINMALLOC);
2947        if(buf == NULL)
2948        {
2949                err("no mem");
2950                return NULL;
2951        }
2952
2953        sprintf(buf, "%lld", value);
2954        buf = ostrshrink(buf);
2955
2956        return buf;
2957}
2958
2959char* oftoa64(double value, char* count)
2960{
2961        char *buf = NULL;
2962        char* tmpstr = NULL;
2963
2964        buf = malloc(MINMALLOC);
2965        if(buf == NULL)
2966        {
2967                err("no mem");
2968                return NULL;
2969        }
2970
2971        tmpstr = ostrcat("%.", count, 0, 0);
2972        tmpstr = ostrcat(tmpstr, "f", 1, 0);
2973
2974        sprintf(buf, tmpstr, value);
2975        buf = ostrshrink(buf);
2976
2977        free(tmpstr);
2978        return buf;
2979}
2980
2981int ostrncmp(char* value1, char* value2, int count)
2982{
2983        int ret = 1;
2984
2985        if(value1 != NULL && value2 != NULL)
2986                ret = strncmp(value1, value2, count);
2987
2988        return ret;
2989}
2990
2991int ostrcmp(char* value1, char* value2)
2992{
2993        int ret = 1;
2994
2995        if(value1 != NULL && value2 != NULL)
2996                ret = strcmp(value1, value2);
2997
2998        return ret;
2999}
3000
3001int ostrcasecmp(char* value1, char* value2)
3002{
3003        int ret = 1;
3004
3005        if(value1 != NULL && value2 != NULL)
3006                ret = strcasecmp(value1, value2);
3007
3008        return ret;
3009}
3010
3011char* createpath(char* dir, char* file)
3012{
3013        char *absdir = NULL;
3014        char *pos = NULL;
3015        char* tmpdir = NULL;
3016
3017        if(dir == NULL || file == NULL)
3018        {
3019                err("NULL detect");
3020                return NULL;
3021        }
3022
3023        tmpdir = ostrcat(dir, NULL, 0, 0);
3024        if(tmpdir == NULL)
3025        {
3026                err("NULL detect");
3027                return NULL;
3028        }
3029
3030        while((tmpdir[strlen(tmpdir) - 1] == '.' && tmpdir[strlen(tmpdir) - 2] != '.') || tmpdir[strlen(tmpdir) - 1] == '/')
3031                tmpdir[strlen(tmpdir) - 1] = '\0';
3032
3033        while(tmpdir[strlen(tmpdir) - 1] == '.' && tmpdir[strlen(tmpdir) - 2] == '.')
3034        {
3035                tmpdir[strlen(tmpdir) - 1] = '\0';
3036                tmpdir[strlen(tmpdir) - 1] = '\0';
3037                if(tmpdir[strlen(tmpdir) - 1] == '/')
3038                        tmpdir[strlen(tmpdir) - 1] = '\0';
3039                pos = strrchr(tmpdir, '/');
3040                if(pos != NULL)
3041                        pos[0] = '\0';
3042        }
3043
3044        absdir = malloc(strlen(tmpdir) + strlen(file) + 2);
3045        if(absdir == NULL)
3046        {
3047                free(tmpdir);
3048                err("no mem");
3049                return NULL;
3050        }
3051
3052        if(strlen(file) > 0 || strlen(tmpdir) == 0)
3053                sprintf(absdir, "%s/%s", tmpdir, file);
3054        else
3055                sprintf(absdir, "%s", tmpdir);
3056
3057        free(tmpdir);
3058        return absdir;
3059}
3060
3061int settimezone(char* zone)
3062{
3063        int ret = 0;
3064        char* tmpzone = NULL, *zonepath = NULL;
3065
3066        zonepath = getconfig("zonepath", NULL);
3067        if(zonepath == NULL)
3068        {
3069                err("config zonepath not defined");
3070                return 1;
3071        }
3072
3073        tmpzone = createpath(zonepath, zone);
3074        if(tmpzone == NULL)
3075                return 1;
3076
3077        setenv("TZ", zone, 1);
3078
3079        ret = unlink(getconfig("localtimefile", NULL));
3080        if(ret != 0)
3081                perr("unlink");
3082        ret = symlink(tmpzone, getconfig("localtimefile", NULL));
3083        if(ret != 0)
3084                perr("link");
3085
3086        free(tmpzone);
3087        return ret;
3088}
3089
3090int delchar(char** text, int pos)
3091{
3092        char *tmptext = NULL;
3093        int i = 0, y = 0, len = 0;
3094
3095        if(text == NULL || *text == NULL)
3096                return pos;
3097
3098        len = strlen(*text);
3099        if(len == 0) return pos;
3100
3101        tmptext = malloc(strlen(*text));
3102        if(tmptext == NULL)
3103        {
3104                err("no mem");
3105                return pos;
3106        }
3107
3108        for(i = 0; i < strlen(*text); i++)
3109        {
3110                if(i == pos - 1)
3111                        y++;
3112
3113                tmptext[i] = (*text)[y];
3114                y++;
3115        }
3116
3117        if(i > 0) tmptext[i - 1] = '\0';
3118        if(pos >= strlen(tmptext)) pos = strlen(tmptext);
3119
3120        free(*text);
3121        *text = tmptext;
3122        return pos;
3123}
3124
3125
3126int insertchar(char** text, char zeichen, int pos)
3127{
3128        char *tmptext = NULL;
3129        int i, y = 0;
3130
3131        if(text == NULL || *text == NULL)
3132                return pos;
3133
3134        tmptext = malloc(strlen(*text) + 2);
3135        if(tmptext == NULL)
3136        {
3137                err("no mem");
3138                return pos;
3139        }
3140
3141        if(strlen(*text) == 0)
3142        {
3143                tmptext[0] = zeichen;
3144                i = 1;
3145                pos = 0;
3146        }
3147        else
3148        {
3149                for(i = 0; i < strlen(*text) + 1; i++)
3150                {
3151                        if(i == pos)
3152                                tmptext[i] = zeichen;
3153                        else
3154                        {
3155                                tmptext[i] = (*text)[y];
3156                                y++;
3157                        }
3158                }
3159        }
3160        tmptext[i] = '\0';
3161
3162        free(*text);
3163        *text = tmptext;
3164        return pos + 1;
3165}
3166
3167void calctext(char* buf, char* buf1, unsigned int* linecount, unsigned int* pagecount, unsigned int* poscount, int pagelen, int page)
3168{
3169        unsigned int tmpposcount = 0;
3170        unsigned int pagepagelen = 0;
3171
3172        *poscount = 0;
3173        *linecount = 1;
3174        *pagecount = 1;
3175
3176        page--;
3177        if(page < 0) page = 0;
3178        pagepagelen = pagelen * page;
3179
3180        if(buf != NULL)
3181        {
3182                while(*buf != '\0')
3183                {
3184                        if(*buf == '\n')
3185                        {
3186                                if(*(buf + 1) == '\0') break;
3187                                (*linecount)++;
3188
3189                                if(*linecount - 1 == pagepagelen)
3190                                        *poscount = tmpposcount + 1;
3191                        }
3192                        buf++;
3193                        tmpposcount++;
3194                }
3195        }
3196
3197        if(buf1 != NULL)
3198        {
3199                while(*buf1 != '\0')
3200                {
3201                        if(*buf1 == '\n')
3202                        {
3203                                if(*(buf1 + 1) == '\0') break;
3204                                (*linecount)++;
3205
3206                                if(*linecount - 1 == pagepagelen)
3207                                        *poscount = tmpposcount + 1;
3208                        }
3209                        buf1++;
3210                        tmpposcount++;
3211                }
3212        }
3213
3214        if(pagelen > 0)
3215                *pagecount = (int)ceil(((float)*linecount / pagelen));
3216}
3217
3218int initlocale(char *localepath)
3219{
3220        setlocale(LC_ALL, "");
3221        if(bindtextdomain(PROGNAME, localepath) == NULL)
3222        {
3223                err("set bindtextdomain");
3224                return 1;
3225        }
3226        if(textdomain(PROGNAME) == NULL)
3227        {
3228                err("set textdomain");
3229                return 1;
3230        }
3231        return 0;
3232}
3233
3234//for langage you must
3235//mkdir /usr/lib/locale
3236//ln -s %titanpath%/po /usr/lib/locale/po
3237//copy SYS_LC_MESSAGES from other language into LC_MESSAGE
3238int setlang(char *lang)
3239{
3240        char *ret;
3241
3242        setenv("LANG", lang, 1);
3243        setenv("LANGUAGE", lang, 1);
3244        ret = setlocale(LC_MESSAGES, lang);
3245        if(ret == NULL)
3246        {
3247                err("can't set LC_MESSAGES to %s", lang);
3248                return 1;
3249        }
3250        return 0;
3251}
3252
3253unsigned long readsysul(const char *filename, int line)
3254{
3255        int i = 0, len = 0;
3256        unsigned long ret = 0;
3257        FILE *fd = NULL;
3258        char *fileline = NULL;
3259        char *buf1 = NULL;
3260
3261        fileline = malloc(MINMALLOC);
3262        if(fileline == NULL)
3263        {
3264                err("no mem");
3265                return 0;
3266        }
3267
3268        fd = fopen(filename, "r");
3269        if(fd == NULL)
3270        {
3271                perr("can't open %s", filename);
3272                free(fileline);
3273                return 0;
3274        }
3275
3276        for(i = 0; i < line; i++)
3277        {
3278                memset(fileline, 0, MINMALLOC);
3279                fgets(fileline, MINMALLOC, fd);
3280        }
3281
3282        len = strlen(fileline) - 1;
3283        if(len >= 0 && fileline[len] == '\n')
3284                fileline[len] = '\0';
3285        buf1 = ostrshrink(fileline);
3286
3287        fclose(fd);
3288
3289        if(buf1 != NULL)
3290        {
3291                ret = strtoul(buf1, NULL, 10);
3292                free(buf1); buf1 = NULL;
3293        }
3294
3295        return ret;
3296}
3297
3298unsigned long long readsysull(const char *filename, int line)
3299{
3300        int i = 0, len = 0;
3301        unsigned long long ret = 0;
3302        FILE *fd = NULL;
3303        char *fileline = NULL;
3304        char *buf1 = NULL;
3305
3306        fileline = malloc(MINMALLOC);
3307        if(fileline == NULL)
3308        {
3309                err("no mem");
3310                return 0;
3311        }
3312
3313        fd = fopen(filename, "r");
3314        if(fd == NULL)
3315        {
3316                perr("can't open %s", filename);
3317                free(fileline);
3318                return 0;
3319        }
3320
3321        for(i = 0; i < line; i++)
3322        {
3323                memset(fileline, 0, MINMALLOC);
3324                fgets(fileline, MINMALLOC, fd);
3325        }
3326
3327        len = strlen(fileline) - 1;
3328        if(len >= 0 && fileline[len] == '\n')
3329                fileline[len] = '\0';
3330        buf1 = ostrshrink(fileline);
3331
3332        fclose(fd);
3333
3334        if(buf1 != NULL)
3335        {
3336                ret = strtoull(buf1, NULL, 10);
3337                free(buf1); buf1 = NULL;
3338        }
3339
3340        return ret;
3341}
3342
3343char* readsys(const char *filename, int line)
3344{
3345        int i = 0, len = 0;
3346        FILE *fd = NULL;
3347        char *fileline = NULL;
3348        char *buf1 = NULL;
3349
3350        fileline = malloc(MINMALLOC);
3351        if(fileline == NULL)
3352        {
3353                err("no mem");
3354                return NULL;
3355        }
3356
3357        fd = fopen(filename, "r");
3358        if(fd == NULL)
3359        {
3360                perr("can't open %s", filename);
3361                free(fileline);
3362                return NULL;
3363        }
3364
3365        for(i = 0; i < line; i++)
3366        {
3367                memset(fileline, 0, MINMALLOC);
3368                fgets(fileline, MINMALLOC, fd);
3369        }
3370
3371        len = strlen(fileline) - 1;
3372        if(len >= 0 && fileline[len] == '\n')
3373                fileline[len] = '\0';
3374        buf1 = ostrshrink(fileline);
3375
3376        fclose(fd);
3377        return buf1;
3378}
3379
3380//flag 0: without \n
3381//flag 1: with \n
3382//flag 2: append without \n
3383//flag 3: append with \n
3384int writesys(const char *filename, char *value, int flag)
3385{
3386        FILE *fd = NULL;
3387        char* tmpstr = NULL;
3388        int ret;
3389
3390        if(value == NULL)
3391        {
3392                err("NULL detect");
3393                return 1;
3394        }
3395
3396        if(flag == 2 || flag == 3)
3397                fd = fopen(filename, "a");
3398        else
3399                fd = fopen(filename, "w");
3400        if(fd == NULL)
3401        {
3402                perr("can't open %s", filename);
3403                return 1;
3404        }
3405
3406        if(flag == 1 || flag == 3)
3407                tmpstr = ostrcat(value, "\n", 0, 0);
3408        else
3409                tmpstr = ostrcat(value, NULL, 0, 0);
3410
3411        ret = fwrite(tmpstr, strlen(tmpstr), 1, fd);
3412        if(ret != 1)
3413        {
3414                perr("writting to %s", filename);
3415                free(tmpstr);
3416                fclose(fd);
3417                return 1;
3418        }
3419
3420        free(tmpstr);
3421        fclose(fd);
3422        return 0;
3423}
3424
3425//flag 0: without \n
3426//flag 1: with \n
3427//flag 2: append without \n
3428//flag 3: append with \n
3429int writesysint(const char *filename, int value, int flag)
3430{
3431        char* tmpstr = NULL;
3432        int ret = 0;
3433
3434        tmpstr = oitoa(value);
3435        ret = writesys(filename, tmpstr, flag);
3436
3437        free(tmpstr);
3438        return ret;
3439}
3440
3441char* getdevcontent(char* devconfig)
3442{
3443        char *dev = NULL;
3444        char *value = NULL;
3445
3446        dev = getconfig(devconfig, NULL);
3447
3448        if(dev == NULL)
3449        {
3450                err("NULL detect");
3451                return NULL;
3452        }
3453
3454        value = readsys(dev, 1);
3455        if(value == NULL)
3456        {
3457                err("NULL detect");
3458                return NULL;
3459        }
3460
3461        return value;
3462}
3463
3464char* convertspacetolf(char* value)
3465{
3466        int i = 0;
3467
3468        while(value[i] != '\0')
3469        {
3470                if(value[i] == ' ')
3471                        value[i] = '\n';
3472                i++;
3473        }
3474
3475        return value;
3476}
3477
3478//flag 0: all
3479//flag 1: hdmi
3480//flag 2: not hdmi
3481char* getcolorformatchoices(int flag)
3482{
3483        char *colorformatchoicesdev = NULL;
3484        char *value = NULL;
3485
3486        colorformatchoicesdev = getconfig("colorformatchoicesdev", NULL);
3487
3488        if(colorformatchoicesdev == NULL)
3489        {
3490                err("NULL detect");
3491                return NULL;
3492        }
3493
3494        value = readsys(colorformatchoicesdev, 1);
3495        if(value == NULL)
3496        {
3497                err("NULL detect");
3498                return NULL;
3499        }
3500       
3501        if(flag == 1)
3502        {
3503                value = string_replace("rgb", NULL, value, 1);
3504                value = string_replace("  ", " ", value, 1);
3505                value = string_replace("cvbs", NULL, value, 1);
3506                value = string_replace("  ", " ", value, 1);
3507                value = string_replace("svideo", NULL, value, 1);
3508                value = string_replace("  ", " ", value, 1);
3509                value = string_replace("yuv", NULL, value, 1);
3510                value = string_replace("  ", " ", value, 1);
3511        }
3512        else if(flag == 2)
3513        {
3514                value = string_replace("hdmi_rgb", NULL, value, 1);
3515                value = string_replace("  ", " ", value, 1);
3516                value = string_replace("hdmi_yuv", NULL, value, 1);
3517                value = string_replace("  ", " ", value, 1);
3518                value = string_replace("hdmi_422", NULL, value, 1);
3519                value = string_replace("  ", " ", value, 1);
3520        }
3521
3522        value = strstrip(value);
3523        value = convertspacetolf(value);
3524
3525        return value;
3526}
3527
3528char* getaudiosourcechoices()
3529{
3530        char *audiosourcechoicesdev = NULL;
3531        char *value = NULL;
3532
3533        audiosourcechoicesdev = getconfig("audiosourcechoicesdev", NULL);
3534
3535        if(audiosourcechoicesdev == NULL)
3536        {
3537                err("NULL detect");
3538                return NULL;
3539        }
3540
3541        value = readsys(audiosourcechoicesdev, 1);
3542        if(value == NULL)
3543        {
3544                err("NULL detect");
3545                return NULL;
3546        }
3547
3548        value = convertspacetolf(value);
3549
3550        return value;
3551}
3552
3553char* getac3choices()
3554{
3555        char *ac3choicesdev = NULL;
3556        char *value = NULL;
3557
3558        ac3choicesdev = getconfig("ac3choicesdev", NULL);
3559
3560        if(ac3choicesdev == NULL)
3561        {
3562                err("NULL detect");
3563                return NULL;
3564        }
3565
3566        value = readsys(ac3choicesdev, 1);
3567        if(value == NULL)
3568        {
3569                err("NULL detect");
3570                return NULL;
3571        }
3572
3573        value = convertspacetolf(value);
3574
3575        return value;
3576}
3577
3578char* getaacchoices()
3579{
3580        char *aacchoicesdev = NULL;
3581        char *value = NULL;
3582
3583        aacchoicesdev = getconfig("aacchoicesdev", NULL);
3584
3585        if(aacchoicesdev == NULL)
3586        {
3587                err("NULL detect");
3588                return NULL;
3589        }
3590
3591        value = readsys(aacchoicesdev, 1);
3592        if(value == NULL)
3593        {
3594                err("NULL detect");
3595                return NULL;
3596        }
3597
3598        value = convertspacetolf(value);
3599
3600        return value;
3601}
3602
3603char* getwsschoices()
3604{
3605        char *wsschoicesdev = NULL;
3606        char *value = NULL;
3607
3608        wsschoicesdev = getconfig("wsschoicesdev", NULL);
3609
3610        if(wsschoicesdev == NULL)
3611        {
3612                err("NULL detect");
3613                return NULL;
3614        }
3615
3616        value = readsys(wsschoicesdev, 1);
3617        if(value == NULL)
3618        {
3619                err("NULL detect");
3620                return NULL;
3621        }
3622
3623        value = convertspacetolf(value);
3624
3625        return value;
3626}
3627
3628int setciclock(int slotnr, char* value)
3629{
3630        char* ciclockdev = NULL, *tmpstr = NULL;
3631        int ret = 0;
3632
3633        ciclockdev = getconfig("ciclockdev", NULL);
3634
3635        if(ciclockdev != NULL && value != NULL)
3636        {
3637                tmpstr = malloc(MINMALLOC);
3638                if(tmpstr == NULL)
3639                {
3640                        err("no mem");
3641                        return 1;
3642                }
3643
3644                snprintf(tmpstr, MINMALLOC, ciclockdev, slotnr);
3645                debug(100, "set %s to %s", tmpstr, value);
3646                ret = writesys(tmpstr, value, 0);
3647
3648                free(tmpstr); tmpstr = NULL;
3649                return ret;
3650        }
3651
3652        return 0;
3653}
3654
3655//routes stream from tuner to ci or ci to ci
3656int setciinput(int slotnr, char* value)
3657{
3658        char* ciinputdev = NULL, *tmpstr = NULL;
3659        int ret = 0;
3660
3661        ciinputdev = getconfig("ciinputdev", NULL);
3662
3663        if(ciinputdev != NULL && value != NULL)
3664        {
3665                tmpstr = malloc(MINMALLOC);
3666                if(tmpstr == NULL)
3667                {
3668                        err("no mem");
3669                        return 1;
3670                }
3671
3672                snprintf(tmpstr, MINMALLOC, ciinputdev, slotnr);
3673                debug(100, "set %s to %s", tmpstr, value);
3674                ret = writesys(tmpstr, value, 0);
3675
3676                free(tmpstr); tmpstr = NULL;
3677                return ret;
3678        }
3679
3680        return 0;
3681}
3682
3683//routes stream from tuner or ci to linux
3684int setcisource(int tunernr, char* value)
3685{
3686        char* cisourcedev = NULL, *tmpstr = NULL;
3687        int ret = 0;
3688
3689        cisourcedev = getconfig("cisourcedev", NULL);
3690
3691        if(cisourcedev != NULL && value != NULL)
3692        {
3693                tmpstr = malloc(MINMALLOC);
3694                if(tmpstr == NULL)
3695                {
3696                        err("no mem");
3697                        return 1;
3698                }
3699
3700                snprintf(tmpstr, MINMALLOC, cisourcedev, tunernr);
3701                debug(100, "set %s to %s", tmpstr, value);
3702                ret = writesys(tmpstr, value, 0);
3703
3704                free(tmpstr); tmpstr = NULL;
3705                return ret;
3706        }
3707
3708        return 0;
3709}
3710
3711int setinput(char* value)
3712{
3713        char* inputdev = NULL;
3714        int ret = 0;
3715
3716        inputdev = getconfig("inputdev", NULL);
3717
3718        if(inputdev != NULL && value != NULL)
3719        {
3720                debug(100, "set %s to %s", inputdev, value);
3721                ret = writesys(inputdev, value, 0);
3722                return ret;
3723        }
3724
3725        return 0;
3726}
3727
3728char* getinput()
3729{
3730        char *inputdev = NULL;
3731        char *value = NULL;
3732
3733        inputdev = getconfig("inputdev", NULL);
3734
3735        if(inputdev == NULL)
3736        {
3737                err("NULL detect");
3738                return NULL;
3739        }
3740
3741        value = readsys(inputdev, 1);
3742        if(value == NULL)
3743        {
3744                err("NULL detect");
3745                return NULL;
3746        }
3747
3748        return value;
3749}
3750
3751int setac3(char* value)
3752{
3753        char* ac3dev = NULL;
3754        int ret = 0;
3755
3756        ac3dev = getconfig("ac3dev", NULL);
3757
3758        if(ac3dev != NULL && value != NULL)
3759        {
3760                debug(100, "set %s to %s", ac3dev, value);
3761                ret = writesys(ac3dev, value, 0);
3762                if(ret == 0) addconfig("av_ac3mode", value);
3763                return ret;
3764        }
3765
3766        return 0;
3767}
3768
3769int setaac(char* value)
3770{
3771        char* aacdev = NULL;
3772        int ret = 0;
3773
3774        aacdev = getconfig("aacdev", NULL);
3775
3776        if(aacdev != NULL && value != NULL)
3777        {
3778                debug(100, "set %s to %s", aacdev, value);
3779                ret = writesys(aacdev, value, 0);
3780                if(ret == 0) addconfig("av_aacmode", value);
3781                return ret;
3782        }
3783
3784        return 0;
3785}
3786
3787int setwss(char* value)
3788{
3789        char* wssdev = NULL;
3790        int ret = 0;
3791
3792        wssdev = getconfig("wssdev", NULL);
3793
3794        if(wssdev != NULL && value != NULL)
3795        {
3796                debug(100, "set %s to %s", wssdev, value);
3797                ret = writesys(wssdev, value, 0);
3798                if(ret == 0) addconfig("av_wssmode", value);
3799                return ret;
3800        }
3801        else if(wssdev != NULL && value == NULL)
3802        {
3803                debug(100, "set %s to %s", wssdev, "auto");
3804                ret = writesys(wssdev, "auto", 0);
3805                return ret;
3806        }
3807
3808        return 0;
3809}
3810
3811char* getac3()
3812{
3813        char *ac3dev = NULL;
3814        char *value = NULL;
3815
3816        ac3dev = getconfig("ac3dev", NULL);
3817
3818        if(ac3dev == NULL)
3819        {
3820                err("NULL detect");
3821                return NULL;
3822        }
3823
3824        value = readsys(ac3dev, 1);
3825        if(value == NULL)
3826        {
3827                err("NULL detect");
3828                return NULL;
3829        }
3830
3831        return value;
3832}
3833
3834char* getaac()
3835{
3836        char *aacdev = NULL;
3837        char *value = NULL;
3838
3839        aacdev = getconfig("aacdev", NULL);
3840
3841        if(aacdev == NULL)
3842        {
3843                err("NULL detect");
3844                return NULL;
3845        }
3846
3847        value = readsys(aacdev, 1);
3848        if(value == NULL)
3849        {
3850                err("NULL detect");
3851                return NULL;
3852        }
3853
3854        return value;
3855}
3856
3857char* getwss()
3858{
3859        char *wssdev = NULL;
3860        char *value = NULL;
3861
3862        wssdev = getconfig("wssdev", NULL);
3863
3864        if(wssdev == NULL)
3865        {
3866                err("NULL detect");
3867                return NULL;
3868        }
3869
3870        value = readsys(wssdev, 1);
3871        if(value == NULL)
3872        {
3873                err("NULL detect");
3874                return NULL;
3875        }
3876
3877        return value;
3878}
3879
3880int setaudiodelaybitstream(char* value)
3881{
3882        char* audiodelaybitstreamdev = NULL;
3883        int ret = 0;
3884
3885        audiodelaybitstreamdev = getconfig("audiodelaybitstreamdev", NULL);
3886
3887        if(audiodelaybitstreamdev != NULL && value != NULL)
3888        {
3889                debug(100, "set %s to %s", audiodelaybitstreamdev, value);
3890                ret = writesys(audiodelaybitstreamdev, value, 0);
3891                if(ret == 0) addconfig("audiodelaybitstream", value);
3892                return ret;
3893        }
3894
3895        return 0;
3896}
3897
3898char* getaudiodelaybitstream()
3899{
3900        char *audiodelaybitstreamdev = NULL;
3901        char *value = NULL;
3902
3903        audiodelaybitstreamdev = getconfig("audiodelaybitstreamdev", NULL);
3904
3905        if(audiodelaybitstreamdev == NULL)
3906        {
3907                err("NULL detect");
3908                return NULL;
3909        }
3910
3911        value = readsys(audiodelaybitstreamdev, 1);
3912        if(value == NULL)
3913        {
3914                err("NULL detect");
3915                return NULL;
3916        }
3917
3918        return value;
3919}
3920
3921char* getpolicychoices()
3922{
3923        char *policychoicesdev = NULL;
3924        char *value = NULL;
3925
3926        policychoicesdev = getconfig("policychoicesdev", NULL);
3927
3928        if(policychoicesdev == NULL)
3929        {
3930                err("NULL detect");
3931                return NULL;
3932        }
3933
3934        value = readsys(policychoicesdev, 1);
3935        if(value == NULL)
3936        {
3937                err("NULL detect");
3938                return NULL;
3939        }
3940
3941#ifdef MIPSEL
3942        free(value), value = NULL;
3943        value = ostrcat("16:9_set_bestfit_to_policy_show_justscale 16:9_set_letterbox_to_policy_show_panscan 16:9_set_panscan_to_policy_show_pillarbox 4:3_set_bestfit_to_policy2_show_justscale 4:3_set_letterbox_to_policy2_show_letterbox 4:3_set_panscan_to_policy2_show_panscan", NULL, 0, 0);
3944#endif
3945
3946        value = convertspacetolf(value);
3947
3948        return value;
3949}
3950
3951char* getpolicy()
3952{
3953        char *policydev = NULL;
3954        char *value = NULL;
3955
3956        policydev = getconfig("policydev", NULL);
3957
3958        if(policydev == NULL)
3959        {
3960                err("NULL detect");
3961                return NULL;
3962        }
3963
3964        value = readsys(policydev, 1);
3965
3966#ifdef MIPSEL
3967        char *aspect = NULL;
3968        aspect = getaspect();
3969        if(!ostrncmp("16:9", aspect, 4))
3970        {
3971                if(ostrcmp("bestfit", value) == 0)
3972                {
3973                        free(value), value = NULL;
3974                        value = ostrcat("16:9_set_bestfit_to_policy_show_justscale", NULL, 0, 0);
3975                }
3976                else if(ostrcmp("letterbox", value) == 0)
3977                {
3978                        free(value), value = NULL;
3979                        value = ostrcat("16:9_set_letterbox_to_policy_show_panscan", NULL, 0, 0);
3980                }
3981                else if(ostrcmp("panscan", value) == 0)
3982                {
3983                        free(value), value = NULL;
3984                        value = ostrcat("16:9_set_panscan_to_policy_show_pillarbox", NULL, 0, 0);
3985                }
3986        }
3987        else
3988        {
3989                policydev = getconfig("policy2dev", NULL);
3990                value = readsys(policydev, 1);
3991
3992                if(ostrcmp("bestfit", value) == 0)
3993                {
3994                        free(value), value = NULL;
3995                        value = ostrcat("4:3_set_bestfit_to_policy2_show_justscale", NULL, 0, 0);
3996                }
3997                else if(ostrcmp("letterbox", value) == 0)
3998                {
3999                        free(value), value = NULL;
4000                        value = ostrcat("4:3_set_letterbox_to_policy2_show_letterbox", NULL, 0, 0);
4001                }
4002                else if(ostrcmp("panscan", value) == 0)
4003                {
4004                        free(value), value = NULL;
4005                        value = ostrcat("4:3_set_panscan_to_policy2_show_panscan", NULL, 0, 0);
4006                }
4007        }
4008        free(aspect), aspect = NULL;
4009
4010#endif
4011
4012        if(value == NULL)
4013        {
4014                err("NULL detect");
4015                return NULL;
4016        }
4017
4018        return value;
4019}
4020
4021int setpolicy(char* value)
4022{
4023        char* policydev, *tmpstr = NULL;
4024        int ret = 0;
4025
4026        policydev = getconfig("policydev", NULL);
4027
4028        if(policydev != NULL && value != NULL)
4029        {
4030                debug(10, "set %s to %s", policydev, value);
4031                tmpstr = ostrcat(value, NULL, 0, 0);
4032
4033#ifdef MIPSEL
4034                if(ostrcmp("16:9_set_bestfit_to_policy_show_justscale", tmpstr) == 0)
4035                {
4036                        free(tmpstr), tmpstr = NULL;
4037                        tmpstr = ostrcat("bestfit", NULL, 0, 0);
4038                        setaspect("set_16:9");
4039                }
4040                else if(ostrcmp("16:9_set_letterbox_to_policy_show_panscan", tmpstr) == 0)
4041                {
4042                        free(tmpstr), tmpstr = NULL;
4043                        tmpstr = ostrcat("letterbox", NULL, 0, 0);
4044                        setaspect("set_16:9");
4045                }
4046                else if(ostrcmp("16:9_set_panscan_to_policy_show_pillarbox", tmpstr) == 0)
4047                {
4048                        free(tmpstr), tmpstr = NULL;
4049                        tmpstr = ostrcat("panscan", NULL, 0, 0);
4050                        setaspect("set_16:9");
4051                }                       
4052                else if(ostrcmp("4:3_set_bestfit_to_policy2_show_justscale", tmpstr) == 0)
4053                {
4054                        policydev = getconfig("policy2dev", NULL);
4055                        free(tmpstr), tmpstr = NULL;
4056                        tmpstr = ostrcat("bestfit", NULL, 0, 0);
4057                        setaspect("set_4:3");
4058                }
4059                else if(ostrcmp("4:3_set_letterbox_to_policy2_show_letterbox", tmpstr) == 0)
4060                {
4061                        policydev = getconfig("policy2dev", NULL);
4062                        free(tmpstr), tmpstr = NULL;
4063                        tmpstr = ostrcat("letterbox", NULL, 0, 0);
4064                        setaspect("set_4:3");
4065                }
4066                else if(ostrcmp("4:3_set_panscan_to_policy2_show_panscan", tmpstr) == 0)
4067                {
4068                        policydev = getconfig("policy2dev", NULL);
4069                        free(tmpstr), tmpstr = NULL;
4070                        tmpstr = ostrcat("panscan", NULL, 0, 0);
4071                        setaspect("set_4:3");
4072                }
4073#endif
4074                debug(10, "set change %s to %s", policydev, tmpstr);
4075                ret = writesys(policydev, tmpstr, 0);
4076
4077                if(ret == 0) addconfig("av_policy", value);
4078
4079                free(tmpstr), tmpstr = NULL;
4080                return ret;
4081        }
4082
4083        return 0;
4084}
4085
4086char* getaspectchoices()
4087{
4088        char *aspectchoicesdev = NULL;
4089        char *value = NULL;
4090
4091        aspectchoicesdev = getconfig("aspectchoicesdev", NULL);
4092
4093        if(aspectchoicesdev == NULL)
4094        {
4095                err("NULL detect");
4096                return NULL;
4097        }
4098
4099        value = readsys(aspectchoicesdev, 1);
4100        if(value == NULL)
4101        {
4102                err("NULL detect");
4103                return NULL;
4104        }
4105
4106        value = convertspacetolf(value);
4107
4108        return value;
4109}
4110
4111char* getaspect()
4112{
4113        char *aspectdev = NULL;
4114        char *value = NULL;
4115
4116        aspectdev = getconfig("aspectdev", NULL);
4117
4118        if(aspectdev == NULL)
4119        {
4120                err("NULL detect");
4121                return NULL;
4122        }
4123
4124        value = readsys(aspectdev, 1);
4125        if(value == NULL)
4126        {
4127                err("NULL detect");
4128                return NULL;
4129        }
4130
4131        return value;
4132}
4133
4134int setaspect(char* value)
4135{
4136        char* aspectdev;
4137        int ret = 0;
4138
4139        aspectdev = getconfig("aspectdev", NULL);
4140
4141        if(aspectdev != NULL && value != NULL)
4142        {
4143                debug(10, "set %s to %s", aspectdev, value);
4144
4145                if(!ostrncmp("set_", value, 4))
4146                {
4147                        char* tmpstr = NULL;
4148                        tmpstr = ostrcat(value, NULL, 0, 0);
4149                        tmpstr = string_replace("set_", "", tmpstr, 1);
4150                        debug(10, "change %s to %s", aspectdev, tmpstr);
4151                        ret = writesys(aspectdev, tmpstr, 0);
4152                        if(ret == 0) addconfig("av_aspect", tmpstr);
4153                        free(tmpstr); tmpstr = NULL;
4154                        return ret;
4155                }
4156                else
4157                {
4158                        ret = writesys(aspectdev, value, 0);
4159
4160                        if(ret == 0)
4161                        {
4162                                addconfig("av_aspect", value);
4163       
4164                                //set policy new after change aspect
4165                                char* tmpstr = getpolicy();
4166                                setpolicy(tmpstr);
4167                                free(tmpstr); tmpstr = NULL;
4168                        }
4169                }
4170                return ret;
4171        }
4172
4173        return 0;
4174}
4175
4176char* getvideomodechoices()
4177{
4178        char *videomodechoicesdev = NULL;
4179        char *value = NULL;
4180
4181        videomodechoicesdev = getconfig("videomodechoicesdev", NULL);
4182
4183        if(videomodechoicesdev == NULL)
4184        {
4185                err("NULL detect");
4186                return NULL;
4187        }
4188
4189        value = readsys(videomodechoicesdev, 1);
4190        if(value == NULL)
4191        {
4192                err("NULL detect");
4193                return NULL;
4194        }
4195
4196        value = string_replace("pal", NULL, value, 1);
4197        value = string_replace("  ", " ", value, 1);
4198
4199        if(status.mcaktiv == 0)
4200        {
4201                value = string_replace("1080p60", NULL, value, 1);
4202                value = string_replace("  ", " ", value, 1);
4203                value = string_replace("1080p59", NULL, value, 1);
4204                value = string_replace("  ", " ", value, 1);
4205                value = string_replace("1080p30", NULL, value, 1);
4206                value = string_replace("  ", " ", value, 1);
4207                value = string_replace("1080p29", NULL, value, 1);
4208                value = string_replace("  ", " ", value, 1);
4209                value = string_replace("1080p25", NULL, value, 1);
4210                value = string_replace("  ", " ", value, 1);
4211                value = string_replace("1080p24", NULL, value, 1);
4212                value = string_replace("  ", " ", value, 1);
4213                value = string_replace("1080p23", NULL, value, 1);
4214                value = string_replace("  ", " ", value, 1);
4215                value = string_replace("1080i60", NULL, value, 1);
4216                value = string_replace("  ", " ", value, 1);
4217                value = string_replace("1080i59", NULL, value, 1);
4218                value = string_replace("  ", " ", value, 1);
4219                value = string_replace("1080i60", NULL, value, 1);
4220                value = string_replace("  ", " ", value, 1);
4221                value = string_replace("720p60", NULL, value, 1);
4222                value = string_replace("  ", " ", value, 1);
4223                value = string_replace("576p50", NULL, value, 1);
4224                value = string_replace("  ", " ", value, 1);
4225                value = string_replace("1280x1024_75", NULL, value, 1);
4226                value = string_replace("  ", " ", value, 1);
4227                value = string_replace("1280x1024_70", NULL, value, 1);
4228                value = string_replace("  ", " ", value, 1);
4229                value = string_replace("1280x1024_60", NULL, value, 1);
4230                value = string_replace("  ", " ", value, 1);
4231                value = string_replace("1600x1200_60", NULL, value, 1);
4232                value = string_replace("  ", " ", value, 1);
4233                value = string_replace("1024x768_100", NULL, value, 1);
4234                value = string_replace("  ", " ", value, 1);
4235                value = string_replace("1024x768_90", NULL, value, 1);
4236                value = string_replace("  ", " ", value, 1);
4237                value = string_replace("1024x768_75", NULL, value, 1);
4238                value = string_replace("  ", " ", value, 1);
4239                value = string_replace("1024x768_70", NULL, value, 1);
4240                value = string_replace("  ", " ", value, 1);
4241                value = string_replace("1024x768_60", NULL, value, 1);
4242                value = string_replace("  ", " ", value, 1);
4243        }
4244
4245        value = strstrip(value);
4246        value = convertspacetolf(value);
4247
4248        return value;
4249}
4250
4251char* getmode3dchoices()
4252{
4253        char *mode3dchoicesdev = NULL;
4254        char *value = NULL;
4255
4256        mode3dchoicesdev = getconfig("mode3dchoicesdev", NULL);
4257
4258        if(mode3dchoicesdev == NULL)
4259        {
4260                return ostrcat("off\nsbs\ntab", "", 0, 0);
4261        }
4262
4263        value = readsys(mode3dchoicesdev, 1);
4264        if(value == NULL)
4265        {
4266                err("NULL detect");
4267                return NULL;
4268        }
4269
4270        value = convertspacetolf(value);
4271
4272        return value;
4273}
4274
4275char* getmode3d()
4276{
4277        char *mode3ddev = NULL;
4278        char *value = NULL;
4279
4280        mode3ddev = getconfig("mode3ddev", NULL);
4281
4282        if(mode3ddev == NULL)
4283        {
4284                err("NULL detect");
4285                return NULL;
4286        }
4287
4288        value = readsys(mode3ddev, 1);
4289        if(value == NULL)
4290        {
4291                err("NULL detect");
4292                return NULL;
4293        }
4294
4295        return value;
4296}
4297
4298int setmode3d(char* value)
4299{
4300        char* mode3ddev;
4301        int ret = 0;
4302
4303        mode3ddev = getconfig("mode3ddev", NULL);
4304
4305        if(mode3ddev != NULL && value != NULL)
4306        {
4307                debug(100, "set %s to %s", mode3ddev, value);
4308                ret = writesys(mode3ddev, value, 0);
4309                if(ret == 0) addconfig("av_mode3d", value);
4310                return ret;
4311        }
4312
4313        return 0;
4314}
4315
4316char* getvideomode()
4317{
4318        char *videomodedev = NULL;
4319        char *value = NULL;
4320
4321        videomodedev = getconfig("videomodedev", NULL);
4322
4323        if(videomodedev == NULL)
4324        {
4325                err("NULL detect");
4326                return NULL;
4327        }
4328
4329        value = readsys(videomodedev, 1);
4330        if(value == NULL)
4331        {
4332                err("NULL detect");
4333                return NULL;
4334        }
4335
4336        return value;
4337}
4338
4339void switchvideomode()
4340{
4341        int rcret = 0;
4342        char* tmpstr = NULL, *tmpstr2 = NULL, *tmpstr3 = NULL;
4343        tmpstr = getvideomode();       
4344        struct skin* playpolicy = getscreen("playpolicy");
4345        tmpstr2 = getcolorformat(2);
4346               
4347        if(tmpstr != NULL)
4348        {
4349                if((ostrcmp("pal", tmpstr) == 0 || ostrncmp("576", tmpstr, 3) == 0) && ostrncmp("yuv", tmpstr2, 3) == 0)
4350                {
4351                        setvideomode("720p50", 0);
4352                        changefbresolution("720p50", 0);
4353                        changetext(playpolicy, "720p50 (rgb)");
4354                        writevfdmenu("720p50 (rgb)");
4355                        setcolorformat("rgb", 1);
4356                        unlink("/var/etc/.scart");
4357                }
4358                else if((ostrcmp("pal", tmpstr) == 0 || ostrncmp("576", tmpstr, 3) == 0) && ostrncmp("rgb", tmpstr2, 3) == 0)
4359                {
4360                        setvideomode("720p50", 0);
4361                        changefbresolution("720p50", 0);
4362                        changetext(playpolicy, "720p50 (yuv)");
4363                        writevfdmenu("720p50 (yuv)");
4364                        setcolorformat("yuv", 1);
4365                        unlink("/var/etc/.scart");
4366                }
4367                else if(ostrncmp("720", tmpstr, 3) == 0)
4368                {
4369                        setvideomode("1080i50", 0);
4370                        changefbresolution("1080i50", 0);
4371                        tmpstr3 = ostrcat("1080i50 (", tmpstr2, 0, 0);
4372                        tmpstr3 = ostrcat(tmpstr3, ")", 1, 0);
4373                        changetext(playpolicy, tmpstr3);
4374                        writevfdmenu(tmpstr3);
4375                        unlink("/var/etc/.scart");                     
4376                }
4377                else if(ostrncmp("1080", tmpstr, 4) == 0)
4378                {
4379                        setvideomode("576i50", 0);
4380                        changefbresolution("576i50", 0);
4381                        changetext(playpolicy, "576i50 (rgb)");
4382                        writevfdmenu("576i50 (rgb)");
4383                        setcolorformat("rgb", 1);
4384                        writesys("/var/etc/.scart", "0", 0);
4385                }
4386                /*
4387                int ret = textbox(_("Message"), _("Is this Videomode ok ?"), _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 600, 200, 10, 0);
4388                if(ret == 1 || ret == 2)
4389                {
4390                        setvideomode(tmpstr, 0);
4391                        changefbresolution(tmpstr, 0);
4392                }
4393                */
4394                drawscreen(playpolicy, 0, 0);
4395                while(1)
4396                {
4397                        rcret = waitrc(playpolicy, 5000, 0);
4398                        break;
4399                }
4400                clearscreen(playpolicy);
4401        }
4402        free(tmpstr);
4403        free(tmpstr2);
4404        free(tmpstr3);
4405}
4406
4407//flag 0: write videomode to config
4408//flag 1: don't write videomode to config
4409int setvideomode(char* value, int flag)
4410{
4411        char* videomodedev;
4412        int ret = 0;
4413
4414        videomodedev = getconfig("videomodedev", NULL);
4415
4416        if(videomodedev != NULL && value != NULL)
4417        {
4418                debug(100, "set %s to %s", videomodedev, value);
4419                ret = writesys(videomodedev, value, 0);
4420                if(ret == 0 && flag == 0) addconfig("av_videomode", value);
4421                return ret;
4422        }
4423
4424        return 0;
4425}
4426
4427//flag 0 = hdmi
4428//flag 1 = scart
4429int setcolorformat(char* value, int flag)
4430{
4431        char* colorformatdev;
4432        int ret = 0;
4433
4434        colorformatdev = getconfig("colorformatdev", NULL);
4435
4436        if(colorformatdev != NULL && value != NULL)
4437        {
4438                debug(100, "set %s to %s", colorformatdev, value);
4439                ret = writesys(colorformatdev, value, 0);
4440                if(ret == 0)
4441                {
4442                        if(flag == 0)
4443                                addconfig("av_colorformat", value);
4444                        else
4445                                addconfig("av_colorformatscart", value);
4446                }
4447                return ret;
4448        }
4449
4450        return 0;
4451}
4452
4453char* getcolorformat(int line)
4454{
4455        char *colorformatdev = NULL;
4456        char *value = NULL;
4457
4458        colorformatdev = getconfig("colorformatdev", NULL);
4459
4460        if(colorformatdev == NULL)
4461        {
4462                err("NULL detect");
4463                return NULL;
4464        }
4465
4466        value = readsys(colorformatdev, line);
4467        if(value == NULL)
4468        {
4469                err("NULL detect");
4470                return NULL;
4471        }
4472
4473        return value;
4474}
4475
4476int setaudiosource(char* value)
4477{
4478        char* audiosourcedev;
4479        int ret = 1;
4480
4481        audiosourcedev = getconfig("audiosourcedev", NULL);
4482
4483        if(audiosourcedev != NULL && value != NULL)
4484        {
4485                debug(100, "set %s to %s", audiosourcedev, value);
4486                ret = writesys(audiosourcedev, value, 0);
4487                if(ret == 0) addconfig("av_audiosource", value);
4488                return ret;
4489        }
4490
4491        return 0;
4492}
4493
4494char* getaudiosource()
4495{
4496        char *audiosourcedev = NULL;
4497        char *value = NULL;
4498
4499        audiosourcedev = getconfig("audiosourcedev", NULL);
4500
4501        if(audiosourcedev == NULL)
4502        {
4503                err("NULL detect");
4504                return NULL;
4505        }
4506
4507        value = readsys(audiosourcedev, 1);
4508        if(value == NULL)
4509        {
4510                err("NULL detect");
4511                return NULL;
4512        }
4513
4514        return value;
4515}
4516
4517char* getsataswitch()
4518{
4519        char *sataswitchdev = NULL;
4520        char *value = NULL;
4521
4522        sataswitchdev = getconfig("sataswitchdev", NULL);
4523
4524        if(sataswitchdev == NULL)
4525        {
4526                err("NULL detect");
4527                return NULL;
4528        }
4529
4530        value = readsys(sataswitchdev, 1);
4531        if(value == NULL)
4532        {
4533                err("NULL detect");
4534                return NULL;
4535        }
4536
4537        return value;
4538}
4539
4540int setsataswitch(char* value)
4541{
4542        char* sataswitchdev;
4543        int ret = 1;
4544
4545        sataswitchdev = getconfig("sataswitchdev", NULL);
4546
4547        if(sataswitchdev != NULL && value != NULL)
4548        {
4549                debug(100, "set %s to %s", sataswitchdev, value);
4550                ret = writesys(sataswitchdev, value, 0);
4551                return ret;
4552        }
4553
4554        return 0;
4555}
4556
4557int setprogress(value)
4558{
4559        char *progressdev;
4560
4561        progressdev = getconfig("progressdev", NULL);
4562
4563        if(progressdev != NULL)
4564        {
4565                debug(100, "set %s to %d",progressdev, value);
4566                return writesysint(progressdev, value, 0);
4567        }
4568
4569        return 0;
4570}
4571
4572int setmute(int value)
4573{
4574        char* mutedev;
4575        int tmpvol, ret = 0;
4576
4577        //don't set mute 2x
4578        if(value == 1 && status.mute == 1) return 0;
4579
4580//      printf("mute value: %d\n", value);
4581
4582        if(value == 2)
4583        {
4584                tmpvol = getvol();
4585                tmpvol = tmpvol * 50 / 100;
4586                status.mute = value;
4587                setvol(tmpvol);
4588        }
4589        else
4590        {
4591                mutedev = getconfig("mutedev", NULL);
4592
4593                if(mutedev != NULL)
4594                {
4595                        debug(100, "set %s to %d", mutedev, value);
4596                        //if(status.volautochangevalue != 0 && value == 0) setvol(getvol());
4597#ifdef MIPSEL
4598                        struct dvbdev *audionode = NULL;
4599                        int openaudio = 0;
4600                        if(status.aktservice != NULL)
4601                        {
4602                                if(status.aktservice->audiodev == NULL)
4603                                {
4604                                        audionode = audioopen(0); //we must open the audio device for set mute in external player
4605                                        openaudio = 1;
4606                                }
4607                                else
4608                                        audionode = status.aktservice->audiodev;
4609                        }
4610                        ret = audiosetmute(audionode, value);
4611                        if(openaudio == 1)
4612                                audioclose(audionode, -1);
4613#else
4614                        ret = writesysint(mutedev, value, 0);
4615#endif
4616               
4617                        if(ret == 0) status.mute = value;
4618                        if(status.volautochangevalue != 0 && value == 0) setvol(getvol());
4619//                      if(value == 1)
4620//                      {
4621//                              printf("mute\n");
4622//                              system("amixer -c 1 set HDMI mute &");
4623//                              system("amixer -c 1 set Analog mute &");
4624//                              system("amixer -c 1 set SPDIF mute &");
4625//                              sleep(1);
4626//                      }
4627//                      else
4628//                      {
4629//                              printf("unmute\n");
4630//                              system("amixer -c 1 set HDMI unmute &");
4631//                              system("amixer -c 1 set Analog unmute &");
4632//                              system("amixer -c 1 set SPDIF unmute &");
4633//                      }
4634
4635                        return ret;
4636                }
4637        }
4638        return 0;
4639}
4640
4641int setvol(int value)
4642{
4643        char* voldev;
4644        int ret = 0, tmpvol = value;
4645
4646        voldev = getconfig("voldev", NULL);
4647       
4648        if(voldev != NULL)
4649        {
4650                if(value > 100) value = 100;
4651                if(value < 0) value = 0;
4652                if(status.volautochangevalue != 0 && value != 0)
4653                {
4654                        if(status.volautochange == 0)
4655                                value = value - (status.volautochangevalue * value / 100);
4656                }
4657                value = 63 - value * 63 / 100;
4658                debug(100, "set %s to %d", voldev, value);
4659                ret = 0;
4660                if(status.mute == 1)
4661                        status.volmute = value;
4662                else
4663                {
4664                        status.volmute = -1;
4665                        ret = writesysint(voldev, value, 0);
4666
4667#ifdef MIPSEL
4668                        struct dvbdev *audionode = NULL;
4669                        int openaudio = 0;
4670       
4671                        if(ret == 0 && status.aktservice != NULL)
4672                        {
4673                                if(status.aktservice->audiodev == NULL)
4674                                {
4675                                        audionode = audioopen(0); //we must open the audio device for change volume in external player
4676                                        openaudio = 1;
4677                                }
4678                                else
4679                                        audionode = status.aktservice->audiodev;
4680               
4681                                if(ret == 0 && audionode != NULL)
4682                                        ret = setmixer(audionode, value, value);
4683                               
4684                                if(openaudio == 1)
4685                                        audioclose(audionode, -1);
4686                        }
4687#else
4688                        if(ret == 0 && status.aktservice != NULL)
4689                                ret = setmixer(status.aktservice->audiodev, value, value);
4690#endif
4691                }
4692                if(ret == 0 && status.mute != 2) addconfigint("vol", tmpvol);
4693                return ret;
4694        }
4695
4696        return 0;
4697}
4698
4699int getvol()
4700{
4701        char *voldev = NULL;
4702        char *value = NULL;
4703        int tmpvol = -1;
4704
4705        voldev = getconfig("voldev", NULL);
4706
4707        if(voldev == NULL)
4708        {
4709                err("NULL detect");
4710                return 0;
4711        }
4712        if(status.volmute == -1)
4713                value = readsys(voldev, 1);
4714        else
4715                tmpvol = status.volmute;
4716        if(value == NULL && tmpvol == -1)
4717        {
4718                err("NULL detect");
4719                return 0;
4720        }
4721        if(status.volmute == -1)
4722                tmpvol = atoi(value);
4723        free(value);
4724        tmpvol = 100 - tmpvol * 100 / 63;
4725        if(status.volautochangevalue != 0)
4726        {
4727                if(status.volautochange == 0 && status.volautochangevalue < 100)
4728                        tmpvol = tmpvol + ((tmpvol * status.volautochangevalue) / (100 - status.volautochangevalue));
4729        }
4730        return tmpvol;
4731}
4732
4733void setdebuglevel()
4734{
4735        debug_level = getconfigint("debuglevel", NULL);
4736        debug(0, "set debug level to %d", debug_level);
4737}
4738
4739char* getxmlentry(char *line, char *searchstr)
4740{
4741        char *buf = NULL, *buf1 = NULL, *buf2 = NULL;
4742
4743        buf = ostrstr(line, searchstr);
4744        if(buf == NULL)
4745                return NULL;
4746
4747        buf = buf + strlen(searchstr);
4748        if(buf[0] == '"')
4749        {
4750                buf = buf + 1;
4751                buf2 = strchr(buf, '"');
4752                if(buf2 == NULL)
4753                {
4754                        err("strchr returns NULL");
4755                        return NULL;
4756                }
4757                buf1 = strndup(buf, buf2 - buf);
4758                if(buf1 == NULL)
4759                {
4760                        err("strndup failed");
4761                        return NULL;
4762                }
4763        }
4764        else
4765        {
4766                buf2 = strchr(buf, ' ');
4767                if(buf2 == NULL)
4768                {
4769                        buf2 = ostrstr(buf, "/>");
4770                        if(buf2 == NULL)
4771                        {
4772                                buf2 = strchr(buf, '>');
4773                                if(buf2 == NULL)
4774                                {
4775                                        err("strchr returns NULL");
4776                                        return NULL;
4777                                }
4778                        }
4779                }
4780                buf1 = strndup(buf, buf2 - buf);
4781                if(buf1 == NULL)
4782                {
4783                        err("strndup failed");
4784                        return NULL;
4785                }
4786        }
4787
4788        return buf1;
4789}
4790
4791char* readbintomem(const char* filename, size_t size)
4792{
4793        FILE *fd = NULL;
4794        char *fileline = NULL;
4795
4796        fileline = calloc(1, size + 1);
4797        if(fileline == NULL)
4798        {
4799                err("no mem");
4800                return NULL;
4801        }
4802
4803        fd = fopen(filename, "rb");
4804        if(fd == NULL)
4805        {
4806                perr("can't open %s", filename);
4807                free(fileline);
4808                return NULL;
4809        }
4810
4811        fread(fileline, size, 1, fd);
4812
4813        fclose(fd);
4814        return fileline;
4815}
4816
4817char* readfiletomem(const char* filename, int flag)
4818{
4819        FILE *fd = NULL;
4820        char *fileline = NULL, *buf = NULL, *tmpbuf = NULL;
4821        int bufsize = 0, bufoldsize = 0;
4822
4823        fileline = malloc(MINMALLOC);
4824        if(fileline == NULL)
4825        {
4826                err("no mem");
4827                return NULL;
4828        }
4829
4830        fd = fopen(filename, "r");
4831        if(fd == NULL)
4832        {
4833                perr("can't open %s", filename);
4834                free(fileline);
4835                return NULL;
4836        }
4837
4838        while(fgets(fileline, MINMALLOC, fd) != NULL)
4839        {
4840                if(flag == 1)
4841                        if(fileline[0] == '#' || fileline[0] == '\n')
4842                                continue;
4843
4844                bufoldsize = bufsize;
4845                bufsize += strlen(fileline);
4846                tmpbuf = buf;   buf = realloc(buf, bufsize + 1);
4847                if(buf == NULL)
4848                {
4849                        err("no mem");
4850                        free(fileline);
4851                        free(tmpbuf);
4852                        fclose(fd);
4853                        return NULL;
4854                }
4855
4856                sprintf(buf + bufoldsize, "%s", fileline);
4857        }
4858
4859        free(fileline);
4860        fclose(fd);
4861        return buf;
4862}
4863
4864char* readeittomem(const char* filename)
4865{
4866        unsigned char byte;
4867        FILE *fil = NULL;
4868        char *zeichen = NULL, *buf = NULL, *buf1 = NULL, *tmpbuf1 = NULL;
4869        int buf1size = 0, buf1oldsize = 0;
4870        int Beschreibung;
4871        int len;
4872
4873        zeichen = malloc(255);
4874        if(zeichen == NULL)
4875        {
4876                err("no mem");
4877                return NULL;
4878        }
4879        buf = malloc(255);
4880        if(buf == NULL)
4881        {
4882                free(zeichen);
4883                err("no mem");
4884                return NULL;
4885        }
4886
4887        fil = fopen(filename, "r");
4888        if(fil == NULL)
4889        {
4890                err("can't open %s", filename);
4891                free(zeichen);
4892                free(buf);
4893                return NULL;
4894        }
4895        Beschreibung = 0;
4896        fseek(fil, 12, SEEK_SET); //ersten 12 Byte nicht relevant
4897        while(!feof(fil))
4898        {
4899                byte = fgetc(fil);
4900
4901                if(byte == 0x4D)
4902                {
4903                        fseek(fil, 4,SEEK_CUR);
4904                        byte = fgetc(fil);
4905                        len = byte + 0;
4906                        byte = fgetc(fil);
4907                        fgets(zeichen, len, fil);
4908                        if(byte != 0x05)
4909                                sprintf(buf, "%c%s\n", byte, zeichen);
4910                        else
4911                                sprintf(buf, "%s\n", zeichen);
4912
4913                        buf1oldsize = buf1size;
4914                        buf1size += strlen(buf);
4915                        tmpbuf1 = buf1; buf1 = realloc(buf1, buf1size + 1);
4916                        if(buf1 == NULL)
4917                        {
4918                                err("no mem");
4919                                free(zeichen);
4920                                free(buf);
4921                                free(tmpbuf1);
4922                                fclose(fil);
4923                                return NULL;
4924                        }
4925                        sprintf(buf1 + buf1oldsize, "%s", buf);
4926
4927                        //printf("T %s\n", zeichen);
4928                        byte = fgetc(fil);
4929                        len = byte + 0;
4930                        byte = fgetc(fil);
4931                        fgets(zeichen, len, fil);
4932                        if(byte != 0x05)
4933                                sprintf(buf,"%c%s\n\n", byte, zeichen);
4934                        else
4935                                sprintf(buf,"%s\n\n", zeichen);
4936                               
4937                        buf1oldsize = buf1size;
4938                        buf1size += strlen(buf);
4939                        tmpbuf1 = buf1; buf1 = realloc(buf1, buf1size + 1);
4940                        if(buf1 == NULL)
4941                        {
4942                                err("no mem");
4943                                free(zeichen);
4944                                free(buf);
4945                                free(tmpbuf1);
4946                                fclose(fil);
4947                                return NULL;
4948                        }
4949                        sprintf(buf1 + buf1oldsize, "%s", buf);
4950
4951                }
4952                else if(byte == 0x4E)
4953                {
4954                        fseek(fil, 6, SEEK_CUR);
4955                        byte = fgetc(fil);
4956                        len = byte;
4957                        byte = fgetc(fil);
4958                        fgets(zeichen, len, fil);
4959                        if(Beschreibung == 0)
4960                        {
4961                                if(byte != 0x05)
4962                                        sprintf(buf, "%c%s", byte, zeichen);
4963                                else
4964                                        sprintf(buf, "%s", zeichen);
4965                                Beschreibung = 1;
4966                        }
4967                        else
4968                        {
4969                                if(byte != 0x05)
4970                                        sprintf(buf, "%c%s", byte, zeichen);
4971                                else
4972                                        sprintf(buf, "%s", zeichen);
4973                        }       
4974
4975                        buf1oldsize = buf1size;
4976                        buf1size += strlen(buf);
4977                        tmpbuf1 = buf1; buf1 = realloc(buf1, buf1size + 1);
4978                        if(buf1 == NULL)
4979                        {
4980                                err("no mem");
4981                                free(zeichen);
4982                                free(buf);
4983                                free(tmpbuf1);
4984                                fclose(fil);
4985                                return NULL;
4986                        }
4987                        sprintf(buf1 + buf1oldsize, "%s", buf);     
4988
4989                }
4990                else
4991                {
4992                        byte = fgetc(fil);
4993                        len= byte;
4994                        fgets(zeichen, len + 1, fil);
4995                } 
4996        }
4997        free(zeichen);
4998        free(buf);
4999        fclose(fil);
5000        return buf1;
5001}
5002
5003char* command(char* input)
5004{
5005        int maxlen = 0, pos = 0;
5006        char* tmpstr = NULL, *fileline = NULL;
5007        FILE *iopipe = NULL;
5008       
5009        if(input == NULL) return NULL;
5010
5011        fileline = malloc(MINMALLOC);
5012        if(fileline == NULL)
5013        {
5014                err("no mem");
5015                return NULL;
5016        }
5017
5018        if((iopipe = popen(input, "r")) == NULL)
5019        {
5020                free(fileline);
5021                return NULL;
5022        }
5023
5024        while(!feof(iopipe))
5025        {
5026                if(fgets(fileline, MINMALLOC, iopipe) != NULL)
5027                        ostrcatbig(&tmpstr, fileline, &maxlen, &pos);
5028        }
5029       
5030        if(pos > 0)
5031        {
5032                char* tmp = tmpstr;
5033                tmpstr = realloc(tmpstr, pos + 1);
5034                if(tmpstr == NULL)
5035                        tmpstr = tmp;
5036        }
5037
5038        free(fileline);
5039        pclose(iopipe);
5040        return tmpstr;
5041}
5042
5043char* string_tolower(char *str)
5044{
5045/*
5046        char *p1 = str;
5047
5048        if(str == NULL) return NULL;
5049
5050        while(*p1 != '\0')
5051                *p1++ = tolower(*p1);
5052       
5053        return str;
5054*/
5055        if(str == NULL) return NULL;
5056
5057        int i=0;
5058        while (str[i])
5059        {
5060                str[i] = tolower(str[i]);
5061                i++;
5062        }
5063        return str;
5064}
5065
5066char* string_toupper(char *str)
5067{
5068/*
5069        char *p1 = str;
5070
5071        if(str == NULL) return NULL;
5072
5073        while(*p1 != '\0')
5074                *p1++ = toupper(*p1);
5075       
5076*/
5077        if(str == NULL) return NULL;
5078
5079        int i=0;
5080        while (str[i])
5081        {
5082                str[i] = toupper(str[i]);
5083                i++;
5084        }
5085        return str;
5086}
5087
5088char* stringreplacecharonce(char *str, char c1, char c2)
5089{
5090        char *p1 = str;
5091
5092        if(str == NULL) return NULL;
5093
5094        while(*p1 != '\0')
5095        {
5096                if(*p1 == c1)
5097                {
5098                        *p1 = c2;
5099                        break;                 
5100                }                       
5101                p1++;
5102        }
5103
5104        return str;
5105}
5106
5107char* stringreplacechar(char *str, char c1, char c2)
5108{
5109        char *p1 = str;
5110
5111        if(str == NULL) return NULL;
5112
5113        while(*p1 != '\0')
5114        {
5115                if(*p1 == c1) *p1 = c2;
5116                p1++;
5117        }
5118
5119        return str;
5120}
5121
5122
5123char* string_removechar(char *str)
5124{
5125        char *p1 = str;
5126
5127        if(str == NULL) return NULL;
5128
5129        while(*p1 != '\0')
5130        {
5131                if(*p1 == '.') *p1 = ' ';
5132                else if(*p1 == '-') *p1 = ' ';
5133                else if(*p1 == '_') *p1 = ' ';
5134                else if(*p1 == '/') *p1 = ' ';
5135                p1++;
5136        }
5137
5138        return str;
5139}
5140
5141char* string_withchars2return(char *str)
5142{
5143        char *p1 = str;
5144
5145        if(str == NULL) return NULL;
5146
5147        while(*p1 != '\0')
5148        {
5149                if(*p1 == ' ') *p1 = '\n';
5150                p1++;
5151        }
5152
5153        return str;
5154}
5155
5156char* string_remove_whitechars(char *text)
5157{
5158        char *p1 = text, *p2 = text;
5159
5160        if(text == NULL) return NULL;
5161
5162        while(*p1 != '\0')
5163        {
5164                if(*p1 == ' ')
5165                        ++p1;
5166                else
5167                        *p2++ = *p1++;
5168        }
5169        *p2 = '\0';
5170
5171        return text;
5172}
5173
5174char* strstrip(char *text)
5175{
5176        char* tmpstr = text;
5177
5178        if(text == NULL) return NULL;
5179        int len = strlen(text);
5180
5181        while(isspace(tmpstr[len - 1])) tmpstr[--len] = '\0';
5182        while(*tmpstr && isspace(*tmpstr)) ++tmpstr, --len;
5183
5184        if(text != tmpstr) memmove(text, tmpstr, len + 1);
5185
5186        return text;
5187}
5188
5189char* string_strip_whitechars(char *text)
5190{
5191        char *p1 = text, *p2 = text;
5192
5193        if(text == NULL)
5194                return NULL;
5195
5196        while(*p1 != '\0')
5197        {
5198                if(*p1 == ' ' && *(p1 + 1) == ' ')
5199                        ++p1;
5200                else
5201                        *p2++ = *p1++;
5202        }
5203        *p2 = '\0';
5204
5205        return text;
5206}
5207
5208char* string_replace_all(char *search, char *replace, char *string, int free1)
5209{
5210        char* tmpstr = NULL;
5211        char* searchpos = NULL;
5212
5213        if(string == NULL || search == NULL)
5214        {
5215                tmpstr = ostrcat(tmpstr, string, 1, 0);
5216                if(free1 == 1) free(string);
5217                return tmpstr;
5218        }
5219
5220        searchpos = strstr(string, search);
5221        if(searchpos == NULL)
5222        {
5223                tmpstr = ostrcat(tmpstr, string, 1, 0);
5224                if(free1 == 1) free(string);
5225                return tmpstr;
5226        }
5227
5228        int count = 0;
5229        int stringlen = strlen(string);
5230        int searchlen = strlen(search);
5231        int replacelen = strlen(replace);
5232
5233        while(searchpos != NULL)
5234        {
5235                count++;
5236                searchpos = strstr(searchpos + searchlen, search);
5237        }
5238
5239        int len = stringlen - (searchlen * count) + (replacelen * count);
5240        tmpstr = calloc(1, len + 1);
5241        if(tmpstr == NULL)
5242        {
5243                err("no mem");
5244                tmpstr = ostrcat(tmpstr, string, 1, 0);
5245                if(free1 == 1) free(string);
5246                return tmpstr;
5247        }
5248
5249        len = 0;       
5250        char* str = string;
5251        char* tmp = tmpstr;
5252        searchpos = strstr(str, search);
5253        while(searchpos != NULL)
5254        {
5255                len = searchpos - str;
5256                memcpy(tmp, str, len);
5257                memcpy(tmp + len, replace, replacelen);
5258                tmp += len + replacelen;
5259                str += len + searchlen;
5260                searchpos = strstr(str, search);
5261        }
5262        memcpy(tmp, str, strlen(str));
5263
5264        if(free1 == 1) free(string);
5265
5266        return tmpstr;
5267}
5268
5269char* string_replace_remove_last_chars(char *search, char *replace, char *string, int free1)
5270{
5271        char* searchpos = NULL;
5272        char* tmpstr = NULL;
5273
5274        if(string == NULL || search == NULL)
5275        {
5276                tmpstr = ostrcat(tmpstr, string, 1, 0);
5277                if(free1 == 1) free(string);
5278                return tmpstr;
5279        }
5280
5281        searchpos = ostrstr(string, search);
5282
5283        if(searchpos == NULL)
5284        {
5285                tmpstr = ostrcat(tmpstr, string, 1, 0);
5286                if(free1 == 1) free(string);
5287                return tmpstr;
5288        }
5289
5290        tmpstr = strndup(string, searchpos - string);
5291        if(replace != NULL)
5292                tmpstr = ostrcat(tmpstr, replace, 1, 0);
5293
5294        if(free1 == 1) free(string);
5295
5296        return tmpstr;
5297}
5298
5299char* string_replace(char *search, char *replace, char *string, int free1)
5300{
5301        char* searchpos = NULL;
5302        char* tmpstr = NULL;
5303
5304        if(string == NULL || search == NULL)
5305        {
5306                tmpstr = ostrcat(tmpstr, string, 1, 0);
5307                if(free1 == 1) free(string);
5308                return tmpstr;
5309        }
5310
5311        searchpos = ostrstr(string, search);
5312
5313        if(searchpos == NULL)
5314        {
5315                tmpstr = ostrcat(tmpstr, string, 1, 0);
5316                if(free1 == 1) free(string);
5317                return tmpstr;
5318        }
5319
5320        tmpstr = strndup(string, searchpos - string);
5321        if(replace != NULL)
5322                tmpstr = ostrcat(tmpstr, replace, 1, 0);
5323        tmpstr = ostrcat(tmpstr, string + (searchpos - string) + strlen(search), 1, 0);
5324
5325        if(free1 == 1) free(string);
5326
5327        return tmpstr;
5328}
5329
5330//flag 0: search full str
5331//flag 1: search only end of string
5332char* ostrrstrcase(char* str, char* search, int len, int flag)
5333{
5334        int slen = 0;
5335        char* tmpstr = NULL;
5336
5337        if(str == NULL || search == NULL) return NULL;
5338
5339        if(len == -1) len = strlen(str);
5340        slen = strlen(search);
5341        if(slen > len) return NULL;
5342
5343        for(tmpstr = str + len - slen; tmpstr >= str; tmpstr--)
5344        {
5345                if(strncasecmp(tmpstr, search, slen) == 0)
5346                        return tmpstr;
5347                if(flag == 1) return NULL;
5348        }
5349
5350        return NULL;
5351}
5352
5353//flag 0: search full str
5354//flag 1: search only end of string
5355char* ostrrstr(char* str, char* search, int len, int flag)
5356{
5357        int slen = 0;
5358        char* tmpstr = NULL;
5359
5360        if(str == NULL || search == NULL) return NULL;
5361
5362        if(len == -1) len = strlen(str);
5363        slen = strlen(search);
5364        if(slen > len) return NULL;
5365
5366        for(tmpstr = str + len - slen; tmpstr >= str; tmpstr--)
5367        {
5368                if(strncmp(tmpstr, search, slen) == 0)
5369                        return tmpstr;
5370                if(flag == 1) return NULL;
5371        }
5372
5373        return NULL;
5374}
5375
5376char* ostrstr(char* str, char* search)
5377{
5378        char* ret = NULL;
5379
5380        if(str == NULL || search == NULL) return NULL;
5381        ret = strstr(str, search);
5382
5383        return ret;
5384}
5385
5386int file_exist(char* filename)
5387{
5388        if(access(filename, F_OK) == 0)
5389                return 1;
5390        else
5391                return 0;
5392}
5393
5394char* string_newline(char* str)
5395{
5396        if(str == NULL) return NULL;
5397
5398        int size = strlen(str);
5399
5400        if(str[size - 1] == '\n')
5401                str[size - 1] = '\0';
5402
5403        return str;
5404}
5405
5406char* string_quote(char* str)
5407{
5408        char* tmpstr = NULL;
5409
5410        tmpstr = ostrcat("\"", str, 0, 0);
5411        tmpstr = ostrcat(tmpstr, "\"", 1, 0);
5412
5413        return tmpstr;
5414}
5415
5416struct splitstr* strsplit(char *str, char *tok, int* count)
5417{
5418        char *tmpstr = NULL;
5419        struct splitstr *array = NULL, *tmparray = NULL;
5420        *count = 0;
5421
5422        if(str == NULL || tok == NULL)
5423                return NULL;
5424
5425        tmpstr = strtok(str, tok);
5426        while(tmpstr != NULL)
5427        {
5428                *count = *count + 1;
5429                tmparray = array; array = (struct splitstr*)realloc(array, sizeof(struct splitstr*) * (*count));
5430                if(array == NULL)
5431                {
5432                        err("no mem");
5433                        free(tmparray);
5434                        return NULL;
5435                }
5436               
5437                (&array[(*count) - 1])->part = tmpstr;
5438                tmpstr = strtok(NULL, tok);
5439        }
5440
5441        return array;
5442}
5443
5444char* string_shortname(char *tmpfilename, int mode)
5445{
5446        debug(50, "in %s", tmpfilename);
5447
5448//      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";
5449        char* str = NULL;
5450
5451        if(mode==1)
5452        {
5453                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 sse stv subbed swedish staffel tc telecine telesync ts unrated ws xxx italian";
5454                str = ostrcat(str, replacelist, 1, 0);
5455        }
5456        else if(mode==2)
5457        {
5458                char* replacelist = "1080i 1080p 720p ac3 ac3d ac3hd avi bdrip bluray cam camrip complete custom cut dat dc directors divx dl doku dts dvdr dvdrip dvdscr dvdscreener ecc ed extended finnish flv french german hd hddvd hddvdrip hdtv int internal ld limited linedubbed m2ts m4v md mkv mov mp4 mpeg mpg mts multi multisubs nordic ntsc pal pl proper r1 r3 r5 recut remastered repack rip rm screener se sse staffel stv subbed svcd swedish tc telecine telesync trp ts uc uncut unrated ur vcd vdr vob wmv ws x264 xvid xxx";
5459                str = ostrcat(str, replacelist, 1, 0);
5460        }
5461        else
5462        {
5463                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";
5464                str = ostrcat(str, replacelist, 1, 0);
5465        }
5466
5467        char* replace = NULL;
5468        struct splitstr* ret1 = NULL;
5469        int count = 0;
5470        int i = 0;
5471        ret1 = strsplit(str, " ", &count);
5472        int max = count - 1;
5473        int first = 1;
5474
5475        for(i = 0; i < max; i++)
5476        {
5477                struct splitstr* ret2 = NULL;
5478                int count2 = 0;
5479                int j = 0;
5480                char *tmpstr = NULL;
5481                tmpstr = ostrcat(tmpstr, tmpfilename, 1, 0);
5482                ret2 = strsplit(tmpstr, " ,.-_", &count2);
5483
5484                for(j = 0; j < count2; j++)
5485                {
5486                        if(j > 0)
5487                        {                                       
5488                                if(ostrcmp((&ret1[i])->part, (&ret2[j])->part) == 0)
5489                                {
5490                                        if(mode==1)
5491                                        {
5492                                                tmpfilename = string_replace((&ret2[j])->part, replace, tmpfilename, 1);
5493                                                continue;
5494                                        }
5495                                        else if(mode==2)
5496                                        {
5497                                                tmpfilename = string_replace_remove_last_chars((&ret2[j])->part, replace, tmpfilename, 1);
5498                                                //break;
5499                                                continue;
5500                                        }
5501                                        else
5502                                        {
5503                                                tmpfilename = string_replace((&ret2[j])->part, replace, tmpfilename, 1);
5504                                                continue;
5505                                        }
5506                                }
5507                                else if(first == 1 && mode == 2)
5508                                {
5509//                                      printf("zahl: %s\n", (&ret2[j])->part);
5510                                        int theCharacter = atoi((&ret2[j])->part);
5511                                        if(theCharacter != 0)
5512                                        {
5513//                                              printf("found zahl: %s\n", (&ret2[j])->part);
5514                                                if(theCharacter > 1800 && theCharacter < 2100)
5515                                                {
5516//                                                      printf("found year: %s\n", (&ret2[j])->part);
5517                                                        tmpfilename = string_replace_remove_last_chars((&ret2[j])->part, "", tmpfilename, 1);
5518                                                        break;
5519                                                }
5520                                        }
5521                                }                               
5522                        }
5523                }
5524                free(ret2); ret2 = NULL;
5525                first = 0;
5526                free(tmpstr), tmpstr = NULL;
5527        }
5528
5529        free(ret1); ret1 = NULL;
5530        free(replace); replace = NULL;
5531        free(str); str = NULL;
5532
5533        debug(50, "out %s", tmpfilename);
5534        return tmpfilename;
5535}
5536
5537char* get_uuid(char* device)
5538{
5539        debug(60, "in %s", device);
5540        char* cmd = NULL, *tmpstr = NULL;
5541       
5542        if(device == NULL) return NULL;
5543#ifdef MIPSEL           
5544        cmd = ostrcat(cmd, "blkid -w /dev/null -c /dev/null -s UUID /dev/", 1, 0);
5545#else
5546        cmd = ostrcat(cmd, "/bin/blkid -w /dev/null -c /dev/null -s UUID /dev/", 1, 0);
5547#endif
5548        cmd = ostrcat(cmd, device, 1, 0);
5549        cmd = ostrcat(cmd, " | cut -d'\"' -f2", 1, 0);
5550
5551        tmpstr = string_newline(command(cmd));
5552
5553        if(ostrcmp(string_newline(tmpstr), "") == 0)
5554        {
5555                free(tmpstr); tmpstr = NULL;
5556        }
5557
5558        debug(60, "out %s", cmd);
5559        free(cmd); cmd = NULL;
5560        return tmpstr;
5561}
5562
5563char* get_label(char* device)
5564{
5565        debug(60, "in %s", device);
5566        char* cmd = NULL, *tmpstr = NULL;
5567
5568        if(device == NULL) return NULL;
5569#ifdef MIPSEL
5570        cmd = ostrcat(cmd, "blkid -w /dev/null -c /dev/null -s LABEL /dev/", 1, 0);
5571#else
5572        cmd = ostrcat(cmd, "/bin/blkid -w /dev/null -c /dev/null -s LABEL /dev/", 1, 0);
5573#endif 
5574        cmd = ostrcat(cmd, device, 1, 0);
5575        cmd = ostrcat(cmd, " | cut -d'\"' -f2", 1, 0);
5576
5577        tmpstr = string_newline(command(cmd));
5578
5579        if(tmpstr == NULL)
5580                tmpstr = ostrcat(tmpstr, "NONLABEL", 1, 0);
5581
5582        if(ostrcmp(string_newline(tmpstr), "") == 0)
5583                tmpstr = ostrcat(tmpstr, "NONLABEL", 1, 0);
5584
5585        debug(60, "out %s", cmd);
5586        free(cmd); cmd = NULL;
5587        return tmpstr;
5588}
5589
5590char* get_filesystem(char* device)
5591{
5592        debug(60, "in %s", device);
5593        char* cmd = NULL, *tmpstr = NULL;
5594
5595        if(device == NULL) return NULL;
5596#ifdef MIPSEL
5597        cmd = ostrcat(cmd, "blkid -w /dev/null -c /dev/null -s TYPE /dev/", 1, 0);
5598#else
5599        cmd = ostrcat(cmd, "/bin/blkid -w /dev/null -c /dev/null -s TYPE /dev/", 1, 0);
5600#endif
5601        cmd = ostrcat(cmd, device, 1, 0);
5602        cmd = ostrcat(cmd, " | cut -d'\"' -f2", 1, 0);
5603
5604        tmpstr = string_newline(command(cmd));
5605
5606        if(tmpstr == NULL)
5607                tmpstr = ostrcat(tmpstr, "NONTYPE", 1, 0);
5608
5609        if(ostrcmp(string_newline(tmpstr), "") == 0)
5610                tmpstr = ostrcat(tmpstr, "NONTYPE", 1, 0);
5611
5612        debug(60, "out %s", cmd);
5613        free(cmd); cmd = NULL;
5614        return tmpstr;
5615}
5616
5617//flag 0: convert ip to 000.000.000.000
5618//flag 1: convert ip to 0.0.0.0
5619char* fixip(char* ipinput, int flag)
5620{
5621        debug(60, "in %s", ipinput);
5622        int ret = 0;
5623        char* ipout = NULL;
5624        unsigned char ip[4];
5625       
5626        ip[0] = 0;
5627        ip[1] = 0;
5628        ip[2] = 0;
5629        ip[3] = 0;
5630
5631        if(ipinput == NULL) return NULL;
5632        ret = sscanf(ipinput, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]);
5633        if(ret != 4) return NULL;
5634
5635        ipout = malloc(16);
5636        if(ipout == NULL)
5637        {
5638                err("no mem");
5639                return NULL;
5640        }
5641
5642        if(flag == 1)
5643                snprintf(ipout, 16, "%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]);
5644        else
5645                snprintf(ipout, 16, "%03d.%03d.%03d.%03d", ip[0], ip[1], ip[2], ip[3]);
5646
5647        return ipout;
5648}
5649
5650void setfanspeed(int speed, int aktion)
5651{
5652        char* speedWert = NULL;
5653        char* speedSet = NULL;
5654        int base = 0;
5655
5656        if(checkbox("UFS922") == 1)
5657                base = 100;
5658        else
5659                base = -15;
5660               
5661
5662        if(speed < 0)
5663        {
5664                if(speed == -1)
5665                        speedWert = getconfig("fanspeed", NULL);
5666                else
5667                        speedWert = getconfig("fanspeedstandby", NULL);
5668                if(speedWert == NULL)
5669                        speedSet = ostrcat(speedSet, oitoa(base + 70), 1, 1);
5670                else
5671                        speedSet = ostrcat(speedSet, speedWert, 1, 0);
5672        }
5673        else
5674        {
5675                if(speed == 0)
5676                        speedSet = ostrcat(speedSet, oitoa(base + 15), 1, 1);
5677                else if(speed == 25)
5678                        speedSet = ostrcat(speedSet, oitoa(base + 30), 1, 1);
5679                else if(speed == 50)
5680                        speedSet = ostrcat(speedSet, oitoa(base + 45), 1, 1);
5681                else if(speed == 75)
5682                        speedSet = ostrcat(speedSet, oitoa(base + 55), 1, 1);
5683                else
5684                        speedSet = ostrcat(speedSet, oitoa(base + 70), 1, 1);
5685        }
5686
5687        if(checkbox("UFS922") == 1)
5688                writesys("/proc/stb/fan/fan_ctrl", speedSet, 1);
5689        else
5690                writesys("/proc/stb/fp/fan_pwm", speedSet, 1);
5691
5692        if(aktion == 1)
5693                addconfig("fanspeed", speedSet);
5694        else if(aktion == 2)
5695                addconfig("fanspeedstandby", speedSet);
5696
5697        free(speedSet); speedSet=NULL;
5698}
5699
5700void setaktres()
5701{
5702        int m_width = 0;
5703        char* res = NULL;
5704        char* res_akt = NULL;
5705        char* res_sd = NULL;
5706        int count = 1;
5707        int sec = 0;
5708
5709        m_lock(&status.setaktresmutex, 23);
5710
5711        if(status.restimer == NULL)
5712                goto end;
5713
5714        sec = (int)status.restimer->param1;
5715
5716        if(sec > 0)
5717        {
5718                while(status.restimer->aktion == START && count <= (sec * 10))
5719                {
5720                        usleep(100000);
5721                        if(status.restimer->aktion != START)
5722                                goto end;
5723                        count++;
5724                }
5725        }
5726        if(status.restimer->aktion != START) goto end;
5727
5728        if(videoreadqwidth(status.aktservice->videodev) == 0)
5729        {
5730                if(status.restimer->aktion != START) goto end;
5731                m_width = status.videosize.w;
5732                if(m_width == 720)
5733                {
5734                        res_sd = getconfig("av_videomode_autores_sd", NULL);
5735                        if(res_sd == NULL)
5736                                res = ostrcat(res, "576i50", 1, 0);
5737                        else
5738                                res = ostrcat(res, res_sd, 1, 0);
5739                }
5740                else if (m_width == 1280)
5741                        res = ostrcat(res, "720p50", 1, 0);
5742                else if (m_width == 1920)
5743                        res = ostrcat(res, "1080i50", 1, 0);
5744                else
5745                        m_width = 0;
5746
5747                if(m_width > 0)
5748                {
5749                        if(status.restimer->aktion != START) goto end;
5750                        res_akt = getvideomode();
5751                        if(status.restimer->aktion != START) goto end;
5752                        if(ostrcmp(res_akt, res) != 0)
5753                        {
5754                                if(status.restimer->aktion != START) goto end;
5755                                setvideomode(res, 1);
5756                                changefbresolution(res, 1);
5757/*
5758                                if(status.restimer->aktion != START) goto end;
5759
5760                                count = 0;
5761                                while(status.restimer->aktion == START && count < 10)
5762                                {
5763                                        usleep(100000);
5764                                        if(status.restimer->aktion != START)
5765                                                goto end;
5766                                        count++;
5767                                }
5768
5769                                if(status.restimer->aktion != START) goto end;
5770*/
5771                                screenautores(res, 5, 0);
5772                        }
5773                }
5774        }
5775        else
5776        {
5777                if(status.restimer->aktion != START) goto end;
5778                if(status.servicetype == 0)
5779                        textbox(_("Message"), _("ERROR cant read res"), _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 600, 200, 5, 0);
5780        }
5781
5782end:
5783        free(res); res = NULL;
5784        status.restimer = NULL;
5785        m_unlock(&status.setaktresmutex, 23);
5786        return;
5787}
5788
5789char* gettimestamp()
5790{
5791        char* timestamp = NULL;
5792        struct timeval numtime;
5793               
5794        gettimeofday(&numtime, 0);
5795        timestamp = ostrcat(timestamp, olutoa(numtime.tv_sec), 1, 1);
5796        timestamp = ostrcat(timestamp, olutoa(numtime.tv_usec), 1, 1);
5797
5798        return timestamp;
5799}
5800
5801char* string_decode(char* input, int flag)
5802{
5803        if(input == NULL) return input;
5804
5805        while(ostrstr(input, "\\u00") != NULL)
5806        {
5807                debug(210, "input: %s", input);
5808                input = string_replace("\\u00", "%", input, 1);
5809                debug(210, "input: %s", input);
5810        }
5811
5812        while(ostrstr(input, "&amp;") != NULL)
5813        {
5814                debug(210, "input: %s", input);
5815                input = string_replace("&amp;", "und", input, 1);
5816                debug(210, "input: %s", input);
5817        }
5818
5819        while(ostrstr(input, "&gt;") != NULL)
5820        {
5821                debug(210, "input: %s", input);
5822                input = string_replace("&gt;", ">", input, 1);
5823                debug(210, "input: %s", input);
5824        }
5825
5826        while(ostrstr(input, "&lt;") != NULL)
5827        {
5828                debug(210, "input: %s", input);
5829                input = string_replace("&lt;", "<", input, 1);
5830                debug(210, "input: %s", input);
5831        }
5832       
5833        while(ostrstr(input, "&quot;") != NULL)
5834        {
5835                debug(210, "input: %s", input);
5836                input = string_replace("&quot;", "\"", input, 1);
5837                debug(210, "input: %s", input);
5838        }
5839
5840        while(ostrstr(input, "&#x") != NULL)
5841        {
5842                debug(210, "out %s", input);
5843                input = string_replace("&#x", "%", input, 1);
5844                debug(210, "input: %s", input);
5845        }
5846       
5847        while(ostrstr(input, "&#") != NULL)
5848        {
5849                debug(210, "input: %s", input);
5850                input = string_replace("&#", "%", input, 1);
5851                debug(210, "input: %s", input);
5852        }
5853       
5854        if(flag == 1)
5855                htmldecode2(input, input);
5856        else
5857                htmldecode(input, input);
5858                       
5859        while(ostrstr(input, ";") != NULL)
5860        {
5861                debug(210, "input: %s", input);
5862                input = string_replace(";", NULL, input, 1);
5863                debug(210, "input: %s", input);
5864        }
5865
5866        return input;
5867}
5868
5869char* string_deltags(char* str)
5870{
5871        int i = 0, y = 0, len = 0;
5872
5873        if(str == NULL) return 0;
5874
5875        len = strlen(str);
5876
5877        int skip = 0;
5878        for(i = 0; i < len; i++)
5879        {
5880                if(str[i] == '<')
5881                        skip = 1;
5882                else if(str[i] == '>')
5883                        skip = 0;
5884
5885                if(skip == 0 && str[i] != '>')
5886                {
5887                        str[y] = str[i];
5888                        y++;
5889                }
5890        }
5891        str[y] = '\0';
5892
5893        return str;
5894}
5895
5896char* string_striptags(char* str)
5897{
5898        int i = 0, len = 0;
5899
5900        if(str == NULL) return 0;
5901       
5902        len = strlen(str);
5903
5904        int skip = 0;
5905        for(i = 0; i < len; i++)
5906        {
5907                if(str[i] == '<')
5908                        skip = 1;
5909                else if(str[i] == '>')
5910                {
5911                        skip = 0;
5912                        str[i] = ' ';
5913                }
5914                if(skip == 1)
5915                        str[i] = ' ';
5916        }       
5917
5918        return strstrip(str);
5919}
5920
5921char* string_resub(char* str, char* str2, char* input, int dir)
5922{
5923        char* tmpstr = NULL, *pos = NULL, *pos2 = NULL;
5924
5925        if(str == NULL || str2 == NULL || input == NULL) return NULL;
5926
5927        if(dir == 0)
5928        {
5929                pos = ostrstr(input, str);
5930                if(pos == NULL) return NULL;
5931                pos += strlen(str);
5932
5933                pos2 = ostrstr(pos, str2);
5934                if(pos2 == NULL) return NULL;
5935        }
5936        else
5937        {
5938                pos2 = ostrstr(input, str2);
5939                if(pos2 == NULL) return NULL;
5940
5941                pos = ostrrstr(input, str, pos2 - input, 0);
5942                if(pos == NULL) return NULL;
5943                pos += strlen(str);
5944        }
5945
5946        tmpstr = strndup(pos, pos2 - pos);
5947
5948        return strstrip(tmpstr);
5949}
5950
5951char* ostrstrcase(char* str, char* sub)
5952{
5953        size_t len = 0;
5954
5955        if(str == NULL || sub == NULL) return NULL;
5956
5957        len = strlen(sub);
5958        while(*str)
5959        {
5960                if(toupper(*str) == toupper(*sub) && strncasecmp(str, sub, len) == 0)
5961                        return str;     
5962                ++str;
5963        }
5964        return NULL;
5965}
5966
5967//flag 0: convert port to 00021
5968//flag 1: convert port to 21
5969char* fixport(char* input, int flag)
5970{
5971        char* tmpstr = NULL;
5972
5973        if(flag == 0)
5974        {
5975                int plen = strlen(input);
5976                if(plen < 5)
5977                {
5978                        int i;
5979                        for(i = 0; i < 5 - plen; i++)
5980                                tmpstr = ostrcat(tmpstr, "0", 1, 0);
5981                }
5982                tmpstr = ostrcat(tmpstr, input, 1, 0);         
5983        }
5984        else
5985        {
5986                while (*input && *input == '0')
5987                input++;
5988       
5989                tmpstr = ostrcat(tmpstr, input, 1, 0);         
5990        }
5991        return tmpstr;
5992}
5993
5994//flag 0: Mon > Montag
5995//flag 1: Mon > Mon
5996char* translate_time(char* input, int flag)
5997{
5998        char* tmpstr = NULL;
5999        if(input == NULL) return tmpstr;
6000        tmpstr = ostrcat(tmpstr, input, 1, 1); 
6001
6002        if(flag == 0)
6003        {
6004                tmpstr = string_replace_all("Mon", _("Monday"), tmpstr, 1);
6005                tmpstr = string_replace_all("Tue", _("Tuesday"), tmpstr, 1);
6006                tmpstr = string_replace_all("Wed", _("Wednesday"), tmpstr, 1);
6007                tmpstr = string_replace_all("Thu", _("Thursday"), tmpstr, 1);
6008                tmpstr = string_replace_all("Fri", _("Friday"), tmpstr, 1);
6009                tmpstr = string_replace_all("Sat", _("Saturday"), tmpstr, 1);
6010                tmpstr = string_replace_all("Sun", _("Sunday"), tmpstr, 1);
6011        }
6012        else
6013        {       
6014                tmpstr = string_replace("Mon", _("Mon"), tmpstr, 1);
6015                tmpstr = string_replace("Tue", _("Tue"), tmpstr, 1);
6016                tmpstr = string_replace("Wed", _("Wed"), tmpstr, 1);
6017                tmpstr = string_replace("Thu", _("Thu"), tmpstr, 1);
6018                tmpstr = string_replace("Fri", _("Fri"), tmpstr, 1);
6019                tmpstr = string_replace("Sat", _("Sat"), tmpstr, 1);
6020                tmpstr = string_replace("Sun", _("Sun"), tmpstr, 1);
6021        }
6022
6023        return tmpstr;
6024}
6025
6026char* gethypridtunerchoices(int dev)
6027{
6028        char *hypridtunerchoices = NULL;
6029        char *value = NULL;
6030        char *tmpstr = NULL;
6031        char *tmpstr1 = NULL;
6032        char *tmpstr2 = NULL;
6033        char *tmpstr3 = NULL;
6034        char* start = NULL;
6035
6036        hypridtunerchoices = getconfig("hypridtunerchoices", NULL);
6037
6038        if(hypridtunerchoices == NULL)
6039        {
6040                err("NULL detect");
6041                return NULL;
6042        }
6043
6044        tmpstr = readfiletomem(hypridtunerchoices, 1);
6045        if(tmpstr == NULL)
6046        {
6047                err("NULL detect");
6048                return NULL;
6049        }
6050
6051        start = ostrcat("NIM Socket ", oitoa(dev), 0, 0);
6052        start = ostrcat(start, ":", 1, 0);
6053
6054        tmpstr1 = string_resub(start, "I2C_Device", tmpstr, 0);
6055        tmpstr2 = string_resub("Mode ", ":", tmpstr1, 0);
6056        tmpstr3 = oregex(".*Mode ([0-9]{1}):.*", tmpstr1);
6057
6058        if(tmpstr2 != NULL)
6059                value = ostrcat(tmpstr2, "\n", 0, 0);
6060        if(tmpstr3 != NULL)
6061                value = ostrcat(value, tmpstr3, 1, 0);
6062
6063        free(start), start = NULL;
6064        free(tmpstr), tmpstr = NULL;
6065        free(tmpstr1), tmpstr1 = NULL;
6066        free(tmpstr2), tmpstr2 = NULL;
6067        free(tmpstr3), tmpstr3 = NULL;
6068
6069        return value;
6070}
6071
6072char* gethypridtunerchoicesvalue(int dev)
6073{
6074        char* hypridtunerchoices = NULL, *value = NULL, *tmpstr = NULL, *tmpstr1 = NULL, *tmpstr2 = NULL, *hypridlist = NULL, *start = NULL;
6075
6076        hypridtunerchoices = getconfig("hypridtunerchoices", NULL);
6077
6078        if(hypridtunerchoices == NULL)
6079        {
6080                err("NULL detect");
6081                return NULL;
6082        }
6083
6084        tmpstr = readfiletomem(hypridtunerchoices, 1);
6085        if(tmpstr == NULL)
6086        {
6087                err("NULL detect");
6088                return NULL;
6089        }
6090
6091        start = ostrcat("NIM Socket ", oitoa(dev), 0, 0);
6092        start = ostrcat(start, ":", 1, 0);
6093        tmpstr1 = string_resub(start, "I2C_Device", tmpstr, 0);
6094        free(start), start = NULL;
6095
6096        hypridlist = gethypridtunerchoices(dev);
6097
6098        int count = 0;
6099        int i = 0;
6100        struct splitstr* ret1 = NULL;
6101        ret1 = strsplit(hypridlist, "\n", &count);
6102
6103        if(ret1 != NULL)
6104        {
6105                int max = count;
6106                for(i = 0; i < max; i++)
6107                {
6108                        start = ostrcat("Mode ", ret1[i].part, 0, 0);
6109                        start = ostrcat(start, ":", 1, 0);
6110                        tmpstr2 = string_resub(start, "\n", tmpstr1, 0);
6111               
6112                        if(i > 0)
6113                                value = ostrcat(value, "\n", 1, 0);
6114               
6115                        if(tmpstr2 != NULL)
6116                                value = ostrcat(value, tmpstr2, 1, 0);
6117                               
6118                        free(tmpstr2), tmpstr2 = NULL;
6119                        free(start), start = NULL;
6120                }
6121        }
6122        free(ret1), ret1 = NULL;                       
6123        free(tmpstr1), tmpstr1 = NULL;
6124        free(hypridlist), hypridlist = NULL;
6125
6126        return value;
6127}
6128
6129char* gethypridtunerchoicesvaluename(int dev, char* hyprid)
6130{
6131        char* hypridtunerchoices = NULL, *value = NULL, *tmpstr = NULL, *tmpstr1 = NULL, *tmpstr2 = NULL, *start = NULL;
6132
6133        hypridtunerchoices = getconfig("hypridtunerchoices", NULL);
6134
6135        if(hypridtunerchoices == NULL)
6136        {
6137                err("NULL detect");
6138                return NULL;
6139        }
6140
6141        tmpstr = readfiletomem(hypridtunerchoices, 1);
6142        if(tmpstr == NULL)
6143        {
6144                err("NULL detect");
6145                return NULL;
6146        }
6147
6148        start = ostrcat("NIM Socket ", oitoa(dev), 0, 0);
6149        start = ostrcat(start, ":", 1, 0);
6150        tmpstr1 = string_resub(start, "I2C_Device", tmpstr, 0);
6151        free(start), start = NULL;
6152
6153        start = ostrcat("Mode ", hyprid, 0, 0);
6154        start = ostrcat(start, ":", 1, 0);
6155
6156        tmpstr2 = string_resub(start, "\n", tmpstr1, 0);
6157       
6158        if(tmpstr2 != NULL)
6159                value = ostrcat(value, tmpstr2, 1, 0);
6160
6161        free(tmpstr1), tmpstr1 = NULL;
6162        free(tmpstr2), tmpstr2 = NULL;
6163        free(start), start = NULL;
6164
6165        return value;
6166}
6167
6168int sethypridtuner(int dev, char* value)
6169{
6170        char* buf = NULL, *hypridtuner = NULL, *tmpstr = NULL;
6171        int ret = 0;
6172
6173        hypridtuner = getconfig("hypridtuner", NULL);
6174       
6175        if(hypridtuner != NULL)
6176        {
6177                buf = malloc(MINMALLOC);
6178                if(buf == NULL)
6179                {
6180                        err("no memory");
6181                        return 0;
6182                }
6183        }
6184
6185        sprintf(buf, hypridtuner, dev);
6186        if(buf != NULL)
6187        {
6188                printf("set %s to %s\n", buf, value);
6189                ret = writesys(buf, value, 0);
6190                free(tmpstr); tmpstr = NULL;
6191                return ret;
6192        }
6193
6194        return 0;
6195}
6196
6197int phpkit_userauth(char* link, char* user, char* pass)
6198{
6199        debug(99, "phpkit user: %s", user);
6200        debug(99, "phpkit pass: %s", pass);     
6201        debug(99, "phpkit url: %s", link);
6202
6203        int skip = 0;
6204        char* ip = NULL, *tmphost = NULL, *tmppath = NULL, *tmpstr = NULL, *send = NULL, *hash = NULL, *cookie1 = NULL, *cookie2 = NULL, *tmplink = NULL, *pos = NULL, *path = NULL, *hashlen = NULL;
6205
6206        tmplink = ostrcat(link, NULL, 0, 0);
6207
6208        tmphost = string_replace("http://", "", tmplink, 0);
6209        free(tmplink) , tmplink = NULL;
6210
6211        if(tmphost != NULL)
6212                pos = strchr(tmphost, '/');
6213        if(pos != NULL)
6214        {
6215                pos[0] = '\0';
6216                path = pos + 1;
6217        }
6218
6219        tmppath = ostrcat("/", path, 0, 0);
6220
6221        send = ostrcat(send, "GET ", 1, 0);
6222        send = ostrcat(send, tmppath, 1, 0);
6223        send = ostrcat(send, " HTTP/1.1\r\nHost: ", 1, 0);     
6224        send = ostrcat(send, tmphost, 1, 0);
6225        send = ostrcat(send, "\r\nUser-Agent: Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.99 Safari/535.1\r\nConnection: close\r\nAccept-Encoding: gzip\r\n\r\n", 1, 0);       
6226        debug(99, "#############################################################################################################");
6227        debug(99, "send1: %s", send);
6228        debug(99, "#############################################################################################################");
6229
6230        tmpstr = gethttpreal(tmphost, tmppath, 80, NULL, NULL, NULL, 0, send, NULL, 5000, 1);
6231        debug(99, "tmpstr: %s", tmpstr);
6232
6233        free(send), send = NULL;
6234        free(tmpstr), tmpstr = NULL;
6235
6236        if(user == NULL || pass == NULL || link == NULL) return 1;
6237
6238        hash = ostrcat("login=1&user=", user, 0, 0);
6239        hash = ostrcat(hash, "&userpw=", 1, 0);
6240        hash = ostrcat(hash, pass, 1, 1);
6241        hashlen = oitoa(strlen(hash));
6242       
6243        send = ostrcat(send, "POST ", 1, 0);
6244        send = ostrcat(send, tmppath, 1, 0);
6245        send = ostrcat(send, " HTTP/1.1\r\nContent-Length: ", 1, 0);
6246        send = ostrcat(send, hashlen, 1, 0);
6247        send = ostrcat(send, "\r\nAccept-Encoding: gzip\r\nConnection: close\r\nUser-Agent: Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.99 Safari/535.1\r\nHost: ", 1, 0);
6248        send = ostrcat(send, tmphost, 1, 0);
6249        send = ostrcat(send, "\r\nCookie: pageredir=", 1, 0);
6250        send = ostrcat(send, cookie1, 1, 0);
6251        send = ostrcat(send, "; PHPSESSID=", 1, 0);     
6252        send = ostrcat(send, cookie2, 1, 0);
6253        send = ostrcat(send, "\r\nContent-Type: application/x-www-form-urlencoded\r\n\r\n", 1, 0);     
6254        send = ostrcat(send, hash, 1, 0);
6255        free(hash); hash = NULL;
6256        free(hashlen); hashlen = NULL;
6257
6258        debug(99, "#############################################################################################################");
6259        debug(99, "send1: %s", send);
6260        debug(99, "#############################################################################################################");
6261
6262        tmpstr = gethttpreal(tmphost, tmppath, 80, NULL, NULL, NULL, 0, send, NULL, 5000, 1);
6263        debug(99, "tmpstr: %s", tmpstr);
6264
6265        free(cookie1); cookie1 = NULL;
6266        free(cookie2); cookie2 = NULL;
6267        free(tmphost); tmphost = NULL;
6268        free(send); send = NULL;
6269        free(ip); ip = NULL;
6270        if(tmpstr == NULL) skip = 1;
6271        free(tmpstr); tmpstr = NULL;
6272        if(skip == 1) return 1;
6273        return 0;
6274}
6275
6276void changetunername(struct skin* tunernode, int adapter, int devnr, char* name, char* fehyprid)
6277{
6278        char* tmpnr = NULL, *tmpstr = NULL;
6279        tmpnr = oitoa(adapter);
6280        tmpstr = ostrcat(_("Tuner "), tmpnr, 0, 1);
6281        tmpstr = ostrcat(tmpstr, "/", 1, 0);
6282        tmpnr = oitoa(devnr);
6283        tmpstr = ostrcat(tmpstr, tmpnr, 1, 1);
6284        tmpstr = ostrcat(tmpstr, ": ", 1, 0);
6285        tmpstr = ostrcat(tmpstr, name, 1, 0);
6286        if(fehyprid != NULL)
6287        {
6288                tmpstr = ostrcat(tmpstr, " (", 1, 0);
6289                tmpstr = ostrcat(tmpstr, _("Multituner adjustable"), 1, 0);
6290                tmpstr = ostrcat(tmpstr, ")", 1, 0);
6291        }
6292        changetext(tunernode, tmpstr);
6293        free(tmpstr); tmpstr = NULL;
6294}
6295
6296char* gethypridtunername(int dev, char* hyprid)
6297{
6298        char* hypridtunerchoices = NULL, *value = NULL, *tmpstr = NULL, *tmpstr1 = NULL, *tmpstr2 = NULL, *start = NULL;
6299
6300        hypridtunerchoices = getconfig("hypridtunerchoices", NULL);
6301
6302        if(hypridtunerchoices == NULL)
6303        {
6304                err("NULL detect");
6305                return NULL;
6306        }
6307
6308        tmpstr = readfiletomem(hypridtunerchoices, 1);
6309        if(tmpstr == NULL)
6310        {
6311                err("NULL detect");
6312                return NULL;
6313        }
6314
6315        start = ostrcat("NIM Socket ", oitoa(dev), 0, 0);
6316        start = ostrcat(start, ":", 1, 0);
6317        tmpstr1 = string_resub(start, "I2C_Device", tmpstr, 0);
6318        free(start), start = NULL;
6319
6320        tmpstr2 = string_resub("Name: ", "\n", tmpstr1, 0);
6321       
6322        if(tmpstr2 != NULL)
6323                value = ostrcat(value, tmpstr2, 1, 0);
6324
6325        free(tmpstr1), tmpstr1 = NULL;
6326        free(tmpstr2), tmpstr2 = NULL;
6327        free(start), start = NULL;
6328
6329        return value;
6330}
6331
6332void convertsettings()
6333{
6334        struct menulist* mlist = NULL, *mbox = NULL;
6335        struct skin* load = getscreen("loading");
6336        int flag = 0, ret = 0;
6337        char* tmpstr = NULL;
6338
6339        addmenulist(&mlist, "Create Transponder (Sat)", _("Create Transponder (Sat)"), NULL, 0, 0);
6340        addmenulist(&mlist, "Create Transponder (Cable)", _("Create Transponder (Cable)"), NULL, 0, 0);
6341        addmenulist(&mlist, "Create Transponder (Terrestrial)", _("Create Transponder (Terrestrial)"), NULL, 0, 0);
6342        addmenulist(&mlist, "Create Transponder (All)", _("Create Transponder (All)"), NULL, 0, 0);
6343
6344        mbox = menulistbox(mlist, "createsettings", _("Select Your Serach Modus"), NULL, NULL, NULL, 1, 0);
6345        if(mbox != NULL) tmpstr = mbox->name;
6346
6347        if(ostrcmp(tmpstr, "Create Transponder (Sat)") == 0)
6348                flag = 0;
6349        else if(ostrcmp(tmpstr, "Create Transponder (Cable)") == 0)
6350                flag = 1;
6351        else if(ostrcmp(tmpstr, "Create Transponder (Terrestrial)") == 0)
6352                flag = 2;
6353        else if(ostrcmp(tmpstr, "Create Transponder (All)") == 0)
6354                flag = 3;
6355        else
6356        {
6357                freemenulist(mlist, 1); mlist = NULL;
6358                return;
6359        }
6360
6361        freemenulist(mlist, 1); mlist = NULL;
6362
6363        drawscreen(load, 0, 0);
6364
6365        if(flag == 0)
6366        {
6367                ret = converte2settings(0);
6368                if(ret == 0) return;
6369                system("cp -a /tmp/satellites.sat /mnt/settings/satellites");
6370                system("cp -a /tmp/transponder.sat /mnt/settings/transponder");
6371        }
6372        else if(flag == 1)
6373        {
6374                ret = converte2settings(1);
6375                if(ret == 0) return;
6376                system("cp -a /tmp/satellites.cable /mnt/settings/satellites");
6377                system("cp -a /tmp/transponder.cable /mnt/settings/transponder");
6378        }
6379        else if(flag == 2)
6380        {
6381                converte2settings(2);
6382                system("cp -a /tmp/satellites.ter /mnt/settings/satellites");
6383                system("cp -a /tmp/transponder.ter /mnt/settings/transponder");
6384        }
6385        else if(flag == 3)
6386        {
6387                ret = converte2settings(0);
6388                if(ret == 0) return;
6389                ret = converte2settings(1);
6390                if(ret == 0) return;
6391                ret = converte2settings(2);
6392                if(ret == 0) return;
6393                system("cp -a /tmp/satellites.sat /mnt/settings/satellites");
6394                system("cp -a /tmp/transponder.sat /mnt/settings/transponder");
6395
6396                system("cat /tmp/satellites.cable >> /mnt/settings/satellites");
6397                system("cat /tmp/transponder.cable >> /mnt/settings/transponder");
6398
6399                system("cat /tmp/satellites.ter >> /mnt/settings/satellites");
6400                system("cat /tmp/transponder.ter >> /mnt/settings/transponder");
6401        }
6402
6403//      free(tmpstr), tmpstr = NULL;
6404        if(textbox(_("Message"), _("Transponder/Satellite Convert done, please use channel search on next Boot.\nYour System will reboot !"), _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 1000, 200, 0, 0) == 1)
6405        {       
6406                //write only config file
6407                system("sync");
6408                writeallconfig(3);
6409                oshutdown(2,2);
6410                system("init 6");
6411        }
6412}
6413
6414// flag 0 = sat
6415// flag 1 = cable
6416// flag 2 = ter
6417int converte2settings(int flag)
6418{
6419        char* path = NULL, *buf = NULL, *tmpstr = NULL, *tmpstr1 = NULL, *tmpstr2 = NULL, *line = NULL, *name = NULL, *orbitalpos = NULL, *fetype = NULL, *flags = NULL, *outfile = NULL, *start = NULL, *end = NULL, *filename = NULL, *transponderfile = NULL, *satfile = NULL;
6420        int incount = 0;
6421       
6422        if(flag == 0)
6423        {
6424                system("rm -rf /tmp/transponder.sat");
6425                system("rm -rf /tmp/satellites.sat");
6426                system("cp -a /var/etc/tuxbox/satellites.xml /tmp/satellites.xml");
6427                start = ostrcat("<sat ", NULL, 0, 0);
6428                end = ostrcat("</sat>", NULL, 0, 0);
6429                filename = ostrcat("/tmp/satellites.xml", NULL, 0, 0);
6430                path = ostrcat("/transponder/satellites.xml", NULL, 0, 0);
6431                transponderfile = ostrcat("/tmp/transponder.sat", NULL, 0, 0);
6432                satfile = ostrcat("/tmp/satellites.sat", NULL, 0, 0);
6433                fetype = ostrcat("0", NULL, 0, 0);
6434        }
6435        else if(flag == 1)
6436        {
6437                system("rm -rf /tmp/transponder.cable");
6438                system("rm -rf /tmp/satellites.cable");
6439                system("cp -a /var/etc/tuxbox/cables.xml /tmp/cables.xml");
6440                start = ostrcat("<cable ", NULL, 0, 0);
6441                end = ostrcat("</cable>", NULL, 0, 0);
6442                filename = ostrcat("/tmp/cables.xml", NULL, 0, 0);
6443                path = ostrcat("/transponder/cables.xml", NULL, 0, 0);
6444                transponderfile = ostrcat("/tmp/transponder.cable", NULL, 0, 0);
6445                satfile = ostrcat("/tmp/satellites.cable", NULL, 0, 0);
6446                fetype = ostrcat("1", NULL, 0, 0);
6447                incount = 4999;
6448        }
6449        else if(flag == 2)
6450        {
6451                system("rm -rf /tmp/transponder.ter");
6452                system("rm -rf /tmp/satellites.ter");
6453                system("cp -a /var/etc/tuxbox/terrestrial.xml /tmp/terrestrial.xml");
6454                start = ostrcat("<terrestrial ", NULL, 0, 0);
6455                end = ostrcat("</terrestrial>", NULL, 0, 0);
6456                filename = ostrcat("/tmp/terrestrial.xml", NULL, 0, 0);
6457                path = ostrcat("/transponder/terrestrial.xml", NULL, 0, 0);
6458                transponderfile = ostrcat("/tmp/transponder.ter", NULL, 0, 0);
6459                satfile = ostrcat("/tmp/satellites.ter", NULL, 0, 0);
6460                fetype = ostrcat("2", NULL, 0, 0);
6461                incount = 9999;
6462        }
6463
6464        if(!file_exist(filename))
6465                gethttp("atemio.dyndns.tv", path, 80, filename, HTTPAUTH, 5000, NULL, 0);
6466
6467        char* tmptext = NULL;
6468        tmptext = ostrcat(_("Error: Transponder Source file not found"), "\nfilename: ", 0, 0);
6469        tmptext = ostrcat(tmptext, transponderfile, 1, 0);
6470
6471        if(!file_exist(filename))
6472        {
6473                textbox(_("Message"), tmptext, _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 1000, 200, 0, 0);
6474                free(tmptext), tmptext = NULL;
6475                free(path), path = NULL;
6476                free(filename), filename = NULL;
6477                free(satfile), satfile = NULL;
6478                free(fetype), fetype = NULL;
6479                free(start), start = NULL;
6480                free(end), end = NULL;
6481                free(transponderfile), transponderfile = NULL;
6482                return 0;
6483        }
6484        free(tmptext), tmptext = NULL;
6485
6486        buf = readfiletomem(filename, 1);
6487        if(buf == NULL)
6488        {
6489                printf("buf: %s\n", buf);       
6490                tmptext = ostrcat(_("Error: Transponder Source file no data"), "\nfilename: ", 0, 0);
6491                tmptext = ostrcat(tmptext, transponderfile, 1, 0);
6492                textbox(_("Message"), tmptext, _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 1000, 200, 0, 0);
6493                free(tmptext), tmptext = NULL;
6494                free(path), path = NULL;
6495                free(filename), filename = NULL;
6496                free(satfile), satfile = NULL;
6497                free(fetype), fetype = NULL;
6498                free(start), start = NULL;
6499                free(end), end = NULL;
6500                free(transponderfile), transponderfile = NULL;
6501                return 0;
6502        }
6503       
6504//      writesys("/tmp/convert.log", buf, 1);
6505
6506        while(ostrstr(buf, start) != NULL)
6507        {
6508                incount++;
6509                tmpstr = string_resub(start, end, buf, 0);
6510                tmpstr1 = ostrcat(tmpstr, NULL, 0, 0);
6511               
6512                //printf("name: %s\n", getxmlentry(ret1[i].part, "name="));
6513                //printf("position: %s\n", getxmlentry(ret1[i].part, "position="));
6514               
6515                name = getxmlentry(tmpstr, "name=");
6516                if(flag == 0)
6517                        orbitalpos = getxmlentry(tmpstr, "position=");
6518                else
6519                        orbitalpos = ostrcat(oitoa(incount), NULL, 1, 0);
6520                       
6521                flags = getxmlentry(tmpstr, "flags=");
6522                //string_decode(name, 0);
6523                name = string_replace_all("&amp;", "und", name, 1);
6524       
6525                line = ostrcat(line, name, 1, 0); //name
6526                line = ostrcat(line, "#", 1, 0);
6527//              line = ostrcat(line, flags, 1, 0); //flag
6528// 0 for all sat/ter/cab ???
6529                line = ostrcat(line, "0", 1, 0);
6530                line = ostrcat(line, "#", 1, 0);
6531                line = ostrcat(line, orbitalpos, 1, 0); //orbitalpos
6532                line = ostrcat(line, "#", 1, 0);
6533                line = ostrcat(line, fetype, 1, 0); //fetype
6534                printf("%s: %s\n", satfile, line);
6535                writesys(satfile, line, 3);
6536                free(line), line = NULL;
6537                               
6538                int count = 0;
6539
6540                int i = 0;
6541                struct splitstr* ret1 = NULL;
6542                ret1 = strsplit(tmpstr1, "\n", &count);
6543                if(ret1 != NULL)
6544                {
6545                        int max = count;
6546                        for(i = 0; i < max; i++)
6547                        {
6548                                if(i == 0) continue;
6549                                line = ostrcat(line, "0", 1, 0); //id
6550                                line = ostrcat(line, "#", 1, 0);
6551
6552                                line = ostrcat(line, fetype, 1, 0); //fetype
6553                                line = ostrcat(line, "#", 1, 0);
6554
6555                                if(ostrstr((ret1[i]).part, "frequency=") != NULL)
6556                                        line = ostrcat(line, getxmlentry(ret1[i].part, "frequency="), 1, 0); //frequency
6557                                else
6558                                        line = ostrcat(line, "-1", 1, 0);
6559                                line = ostrcat(line, "#", 1, 0);
6560
6561                                if(ostrstr((ret1[i]).part, "polarization=") != NULL)
6562                                        line = ostrcat(line, getxmlentry(ret1[i].part, "polarization="), 1, 0); //polarization
6563                                else
6564                                        line = ostrcat(line, "-1", 1, 0); //polarization
6565
6566                                line = ostrcat(line, "#", 1, 0);
6567                                if(orbitalpos != NULL)
6568                                        line = ostrcat(line, orbitalpos, 1, 0); //orbitalpos
6569                                else
6570                                        line = ostrcat(line, "-1", 1, 0); //orbitalpos
6571                                line = ostrcat(line, "#", 1, 0);
6572
6573                                if(ostrstr((ret1[i]).part, "symbol_rate=") != NULL)
6574                                        line = ostrcat(line, getxmlentry(ret1[i].part, "symbol_rate="), 1, 0); //symbolrate
6575                                else
6576                                        line = ostrcat(line, "-1", 1, 0);
6577                                line = ostrcat(line, "#", 1, 0);
6578
6579                                if(ostrstr((ret1[i]).part, "modulation=") != NULL)
6580                                        line = ostrcat(line, getxmlentry(ret1[i].part, "modulation="), 1, 0); //modulation
6581                                else
6582                                {
6583                                        if(flag == 2)
6584                                                line = ostrcat(line, "3", 1, 0);
6585                                        else
6586                                                line = ostrcat(line, "0", 1, 0);
6587                                }
6588                                line = ostrcat(line, "#", 1, 0);
6589
6590                                if(ostrstr((ret1[i]).part, "fec_inner=") != NULL)
6591                                        line = ostrcat(line, getxmlentry(ret1[i].part, "fec_inner="), 1, 0); //fec
6592                                else
6593                                {
6594                                        if(flag == 2)
6595                                                line = ostrcat(line, "5", 1, 0);
6596                                        else
6597                                                line = ostrcat(line, "0", 1, 0);
6598                                }
6599                                line = ostrcat(line, "#", 1, 0);
6600
6601                                if(checkbox("UFS910") == 1)
6602                                        line = ostrcat(line, "1", 1, 0); //pilot
6603                                else
6604                                        line = ostrcat(line, "2", 1, 0); //pilot
6605                                line = ostrcat(line, "#", 1, 0);
6606
6607                                if(checkbox("UFS910") == 1)
6608                                        line = ostrcat(line, "0", 1, 0); //rolloff
6609                                else
6610                                        line = ostrcat(line, "3", 1, 0); //rolloff
6611                                line = ostrcat(line, "#", 1, 0);
6612
6613                                line = ostrcat(line, "2", 1, 0); //inversion
6614                                line = ostrcat(line, "#", 1, 0);
6615
6616                                if(ostrstr((ret1[i]).part, "system=") != NULL)
6617                                        line = ostrcat(line, getxmlentry(ret1[i].part, "system="), 1, 0); //system
6618                                else
6619                                        line = ostrcat(line, "0", 1, 0); //system
6620                                line = ostrcat(line, "\n", 1, 0);
6621                        }
6622                }
6623       
6624                tmpstr2 = ostrcat(start, tmpstr, 0, 0);
6625       
6626                buf = string_replace(tmpstr2, NULL, buf, 1);
6627       
6628        //      outfile = ostrcat("/tmp/convert.", oitoa(incount), 0, 1);
6629        //      outfile = ostrcat(outfile, ".log", 1, 0);       
6630        //      writesys(outfile, buf, 2);
6631        //      writesys("/tmp/convert.log", buf, 3);
6632       
6633                writesys(transponderfile, line, 2);
6634                free(line), line = NULL;
6635       
6636                free(tmpstr), tmpstr = NULL;   
6637                free(tmpstr1), tmpstr1 = NULL;
6638                free(tmpstr2), tmpstr2 = NULL;
6639                free(ret1), ret1 = NULL;
6640                free(name), name = NULL;
6641                free(orbitalpos), orbitalpos = NULL;
6642                free(flags), flags = NULL;
6643                free(outfile), outfile = NULL; 
6644        }
6645
6646        free(path), path = NULL;
6647        free(filename), filename = NULL;
6648        free(satfile), satfile = NULL;
6649        free(transponderfile), transponderfile = NULL;
6650               
6651        free(buf), buf = NULL;
6652        free(start), start = NULL;
6653        free(end), end = NULL;
6654        free(fetype), fetype = NULL;
6655                       
6656        return 1;
6657}
6658
6659void createfav()
6660{
6661        struct skin* load = getscreen("loading");
6662        drawscreen(load, 0, 0);
6663
6664        system("rm -rf /mnt/settings/bouquets*");
6665        system("cp -a /etc/titan.restore/mnt/settings/bouquets* /mnt/settings");
6666
6667        if(textbox(_("Message"), _("Standard favorites have been successfully applied.\nYour System will reboot !"), _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 1000, 200, 0, 0) == 1)
6668        {
6669                //write only config file
6670                system("sync");
6671                writeallconfig(3);
6672                oshutdown(2,2);
6673                system("init 6");
6674        }
6675}
6676
6677char* system_infos(int mode)
6678{
6679        char* tmpstr = NULL, *tmpstr1 = NULL, *tmpstr2 = NULL;
6680
6681        if(mode == 0)
6682        {
6683                tmpstr1 = ostrcat("Date = ", "", 0, 0);
6684                tmpstr1 = ostrcat(tmpstr1, gettime(NULL, "%d %B %Y"), 1, 1);
6685                tmpstr = ostrcat(tmpstr, tmpstr1, 1, 1);
6686
6687                tmpstr1 = ostrcat("\nTime = ", "", 0, 0);
6688                tmpstr1 = ostrcat(tmpstr1, gettime(NULL, "%H:%M:%S"), 1, 1);
6689                tmpstr = ostrcat(tmpstr, tmpstr1, 1, 1);
6690               
6691                tmpstr1 = ostrcat("\nUptime = ", "", 0, 0);
6692                tmpstr2 = command("uptime");
6693                if(tmpstr2 != NULL) tmpstr2 = strtok(tmpstr2, ",");
6694                tmpstr1 = ostrcat(tmpstr1, tmpstr2, 1, 1);
6695                tmpstr = ostrcat(tmpstr, tmpstr1, 1, 1);
6696
6697                tmpstr1 = ostrcat("\nBoxtype = ", "", 0, 0);
6698                tmpstr2 = string_toupper(command("cat /etc/model"));
6699                tmpstr1 = ostrcat(tmpstr1, tmpstr2, 1, 1);
6700                tmpstr = ostrcat(tmpstr, tmpstr1, 1, 1);
6701
6702                tmpstr1 = ostrcat("\nLoad = ", "", 0, 0);
6703                tmpstr2 = command("cat /proc/loadavg");
6704                tmpstr1 = ostrcat(tmpstr1, tmpstr2, 1, 1);
6705                tmpstr = ostrcat(tmpstr, tmpstr1, 1, 1);
6706        }
6707
6708        if(mode == 1)
6709        {
6710                system("ls /media/usb/* >/dev/null");
6711                system("ls /media/net/* >/dev/null");
6712                system("ls /var/swap/* >/dev/null");
6713                system("ls /mnt/swapextension/* >/dev/null");
6714                system("ls /var/backup/* >/dev/null");
6715                system("ls /media/hdd/* >/dev/null");
6716                tmpstr = command("df -h");
6717        }
6718
6719        if(mode == 2)
6720                tmpstr = command("cat /proc/version");
6721
6722        if(mode == 3)
6723        {
6724                system("ls /media/usb/* >/dev/null");
6725                system("ls /media/net/* >/dev/null");
6726                system("ls /var/swap/* >/dev/null");
6727                system("ls /mnt/swapextension/* >/dev/null");
6728                system("ls /var/backup/* >/dev/null");
6729                system("ls /media/hdd/* >/dev/null");
6730                tmpstr = command("mount");
6731        }
6732
6733        if(mode == 4)
6734        {
6735                tmpstr1 = command("ifconfig");
6736                tmpstr2 = command("route -n");
6737                tmpstr = ostrcat(tmpstr1, tmpstr2, 1, 1);
6738        }
6739
6740        if(mode == 5)
6741                tmpstr = command("free");
6742
6743        return tmpstr;
6744}
6745
6746char* system_infos_sysinfo(int mode)
6747{
6748        char* tmpstr = NULL;
6749
6750        if(mode == 0)
6751                tmpstr = command("cat /proc/cpuinfo | sed 's/\t\t/\t/'");
6752        else if(mode == 1)
6753                tmpstr = command("cat /proc/meminfo");
6754        else if(mode == 2)
6755                tmpstr = command("cat /proc/mtd");
6756        else if(mode == 3)
6757                tmpstr = command("cat /proc/modules");
6758        else if(mode == 4)
6759                tmpstr = command("cat /proc/devices");
6760        else if(mode == 5)
6761        {
6762                char* tmpstr1 = NULL, **tmpstr2 = NULL, **tmpstr3 = NULL;
6763                int i = 0, ii = 0;
6764                char* swap[] = {"Name: ", "Type: ", "Size: ", "Used: ", "Prio: "};
6765
6766                tmpstr1 = command("cat /proc/swaps | sed 's/\t/ /g; s/[ ]* / /g'");
6767                tmpstr2 = str_split(tmpstr1, "\n");
6768                if(tmpstr2 != NULL)
6769                {
6770                        free(tmpstr2[0]); tmpstr2[0] = NULL;
6771
6772                        for(i = 1; tmpstr2[i] != NULL; i++)
6773                        {
6774                                tmpstr3 = str_split(tmpstr2[i], " ");
6775                                if(tmpstr3 != NULL)
6776                                {
6777
6778                                        for(ii = 0; tmpstr3[ii] != NULL; ii++)
6779                                        {
6780                                                tmpstr = ostrcat(tmpstr, swap[ii], 1, 0);
6781                                                tmpstr = ostrcat(tmpstr, tmpstr3[ii], 1, 1);
6782                                                tmpstr = ostrcat(tmpstr, "\n", 1, 0);
6783                                        }
6784                                }
6785
6786                                tmpstr = ostrcat(tmpstr, "\n", 1, 0);
6787                                free(tmpstr2[i]); tmpstr2[i] = NULL;
6788                                free(tmpstr3); tmpstr3 = NULL;
6789                        }
6790                }
6791
6792                free(tmpstr3); tmpstr3 = NULL;
6793                free(tmpstr2); tmpstr2 = NULL;
6794                free(tmpstr1); tmpstr1 = NULL;
6795        }
6796        else if(mode == 6)
6797                tmpstr = command("top -b -n1");
6798        else if(mode == 7)
6799                tmpstr = command("ps");
6800        else if(mode == 8)
6801                tmpstr = command("cat /proc/bus/usb/devices");
6802
6803        return tmpstr;
6804}
6805
6806char* system_logs(int mode)
6807{
6808        char* tmpstr = NULL, *tmpstr1 = NULL, *tmpstr2 = NULL, *tmpstr3 = NULL, *path = NULL, *boxversion = NULL;
6809
6810        if(mode == 0)
6811        {
6812                tmpstr1 = readfiletomem("/etc/motd", 0);
6813                if(tmpstr1 != NULL) tmpstr2 = strstr(tmpstr1, "wElc0me");
6814                tmpstr3 = readfiletomem("/etc/imageinfo", 0);
6815                if(tmpstr2 == NULL)
6816                        tmpstr = ostrcat(tmpstr3, NULL, 1, 0);
6817                else
6818                        tmpstr = ostrcat(tmpstr2, tmpstr3, 1, 1);
6819        }
6820        else if(mode == 1)
6821        {
6822                if(isfile("/etc/model") == 0) return NULL;
6823                boxversion = string_tolower(readsys("/etc/model", 1));
6824
6825//              if(file_exist("/etc/.beta"))
6826                        path = ostrcat(path, "/svn/image-beta/changelog.", 1, 0);
6827//              else
6828//                      path = ostrcat(path, "/svn/image/changelog.", 1, 0);
6829
6830                path = ostrcat(path, boxversion, 1, 0);
6831                path = ostrcat(path, ".titan", 1, 0);
6832
6833//              if(file_exist("/etc/.beta"))
6834                        tmpstr1 = gethttp("beta.dyndns.tv", path, 80, NULL, HTTPAUTH, 5000, NULL, 0);
6835//              else
6836//                      tmpstr1 = gethttp("atemio.dyndns.tv", path, 80, NULL, HTTPAUTH, 5000, NULL, 0);
6837
6838                tmpstr = readfromlinetoline(tmpstr1, 37, 537, 1);
6839        }
6840        else if(mode == 2)
6841        {
6842//              if(file_exist("/etc/.beta"))
6843#ifdef MIPSEL
6844                        path = ostrcat(path, "/svn/image-beta/changelog.git.mipsel", 1, 0);
6845#else
6846                        path = ostrcat(path, "/svn/image-beta/changelog.git.sh4", 1, 0);
6847#endif
6848//              else
6849//                      path = ostrcat(path, "/svn/image/changelog.git", 1, 0);
6850
6851//              if(file_exist("/etc/.beta"))
6852                        tmpstr1 = gethttp("beta.dyndns.tv", path, 80, NULL, HTTPAUTH, 5000, NULL, 0);
6853//              else
6854//                      tmpstr1 = gethttp("atemio.dyndns.tv", path, 80, NULL, HTTPAUTH, 5000, NULL, 0);
6855
6856                tmpstr = readfromlinetoline(tmpstr1, 0, 500, 1);
6857        }
6858        else if(mode == 3)
6859        {
6860                tmpstr = readfiletomem(getconfig("tracelog", NULL), 0);
6861        }
6862
6863        free(path), path = NULL;
6864        free(boxversion), boxversion = NULL;
6865//      free(tmpstr1), tmpstr1 = NULL;
6866//      free(tmpstr2), tmpstr2 = NULL;
6867//      free(tmpstr3), tmpstr3 = NULL;
6868
6869        return tmpstr;
6870}
6871
6872char* getabout()
6873{
6874        char* text = NULL, *tmpstr = NULL, *imgversion = NULL;
6875        struct dvbdev* dvbnode = dvbdev;
6876
6877        if(isfile(getconfig("imagenamefile", NULL))     != 0)
6878                imgversion = readsys(getconfig("imagenamefile", NULL), 1);
6879        else
6880                imgversion = ostrcat("unknown", NULL, 0, 0);
6881
6882        text = ostrcat(_("Image"), ": ", 0, 0);
6883        text = ostrcat(text, PROGNAME, 1, 0);
6884        text = ostrcat(text, "\n", 1, 0);
6885        text = ostrcat(text, _("Version"), 1, 0);
6886        text = ostrcat(text, ": ", 1, 0);
6887        text = ostrcat(text, OVERSION, 1, 0);
6888        text = ostrcat(text, "\n", 1, 0);
6889        text = ostrcat(text, _("Installed:"), 1, 0);
6890        text = ostrcat(text, " ", 1, 0);
6891        text = ostrcat(text, imgversion, 1, 1);
6892        text = ostrcat(text, "\n", 1, 0);
6893        text = ostrcat(text, _("Copyright"), 1, 0);
6894        text = ostrcat(text, ": ", 1, 0);
6895        text = ostrcat(text, COPYRIGHT, 1, 0);
6896        text = ostrcat(text, "\n\n", 1, 0);
6897               
6898        while(dvbnode != NULL)
6899        {
6900                if(dvbnode->type == FRONTENDDEV && dvbnode->feinfo != NULL)
6901                {
6902                        text = ostrcat(text, _("Tuner"), 1, 0);
6903                        text = ostrcat(text, ": ", 1, 0);
6904                        if(dvbnode->feinfo->name != NULL)
6905                                text = ostrcat(text, dvbnode->feinfo->name, 1, 0);
6906                        else
6907                                text = ostrcat(text, _("unknown"), 1, 0);
6908                        text = ostrcat(text, "\n", 1, 0);
6909                        text = ostrcat(text, _("Tunertype"), 1, 0);
6910                        text = ostrcat(text, ": ", 1, 0);
6911
6912                        tmpstr = fegettypestr(dvbnode);
6913                        text = ostrcat(text, tmpstr, 1, 1);
6914                        text = ostrcat(text, "\n\n", 1, 0);
6915                }
6916                dvbnode = dvbnode->next;
6917        }
6918       
6919        char* flog = readfiletomem("/tmp/.firmware.log", 0);
6920        text = ostrcat(text, flog, 1, 1);
6921
6922        return text;
6923}
6924
6925char* getimgnamereal()
6926{
6927        char* tmpstr = NULL;
6928
6929        tmpstr = readfiletomem(getconfig("imagenamefile", NULL), 1);
6930
6931        return tmpstr;
6932}
6933
6934char* getmoviedev()
6935{
6936        char* tmpstr = NULL, *buf = NULL;
6937
6938        tmpstr = readfiletomem("/tmp/.moviedev", 1);
6939        printf("tmpstr: %s\n", tmpstr);
6940
6941        buf = oregex("sd([a-z]{1,1}).*", tmpstr);
6942        printf("buf: %s\n", buf);
6943
6944        free(tmpstr), tmpstr = NULL;
6945
6946        return buf;
6947}
6948
6949void wakeup_record_device()
6950{
6951        char* cmd = NULL, *dev = NULL;
6952
6953        dev = getmoviedev();
6954        if(dev == NULL)
6955                cmd = ostrcat("ls -al ", getconfig("rec_path", NULL), 0, 0);
6956        else
6957                cmd = ostrcat("sdparm -C START /dev/sd", dev, 0, 0);
6958
6959//      cmd = ostrcat(cmd, " >/dev/null", 1, 0);
6960        printf("cmd: %s\n", cmd);
6961        system(cmd);
6962        free(dev), dev = NULL;
6963        free(cmd), cmd = NULL;
6964}
6965
6966#endif
Note: See TracBrowser for help on using the repository browser.