source: titan/titan/global.h @ 30768

Last change on this file since 30768 was 30768, checked in by gost, 9 years ago

[titan] fix cec when no timer record

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