source: titan/titan/global.h @ 30765

Last change on this file since 30765 was 30765, checked in by nit, 9 years ago

clean

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) return; //no record
1840
1841        while(node != NULL)
1842        {
1843                if(node->status < 2)
1844                {
1845                        time_t akttime = time(NULL);
1846                        time_t begin = node->begin - getconfigint("wakeuptimerdevdiff", NULL);
1847
1848                        debug(400, "begin=%ld akttime1=%ld akttime2=%ld", begin, akttime - timediff, akttime + timediff);
1849
1850                        if(begin > akttime - timediff && begin < akttime + timediff)
1851                        {
1852                                debug(400, "found rectimer who has start the box");
1853                                setwaswakuptimer(1);
1854                                setcecstandby(1);
1855                                test = 1;
1856                        }
1857                }
1858                node = node->next;
1859        }
1860        if(test == 0)
1861                setcecstandby(0);
1862}
1863
1864int setwakeuptimerdev(time_t value)
1865{
1866        char* wakeuptimerdev, *tmpstr = NULL;
1867        int ret = 0;
1868        int diff = getconfigint("wakeuptimerdevdiff", NULL);
1869
1870        if(value != 0x7FFFFFFF && value - diff > time(NULL))
1871                value -= diff;
1872
1873#ifdef MIPSEL   
1874        value += 7200;
1875#endif
1876       
1877        wakeuptimerdev = getconfig("wakeuptimerdev", NULL);
1878
1879        if(wakeuptimerdev != NULL && value >= time(NULL))
1880        {
1881                debug(10, "set %s to %ld", wakeuptimerdev, value);
1882                tmpstr = olutoa(value);
1883                ret = writesys(wakeuptimerdev, tmpstr, 0);
1884                free(tmpstr); tmpstr = NULL;
1885                return ret;
1886        }
1887
1888        return 0;
1889}
1890
1891int setrtctime(int value)
1892{
1893        char *rtctimedev = NULL, *tmpstr = NULL;
1894        int ret = 0;
1895
1896        value += 7200;
1897
1898        rtctimedev = getconfig("rtctimedev", NULL);
1899
1900        if(rtctimedev != NULL)
1901        {
1902                debug(10, "set %s to %d", rtctimedev, value);
1903                tmpstr = oitoa(value);
1904                ret = writesys(rtctimedev, tmpstr, 0);
1905                free(tmpstr); tmpstr = NULL;
1906                return ret;
1907        }
1908
1909        return 0;
1910}
1911
1912int changepolicy()
1913{
1914        char *tmppolicy = NULL, *tmpstr = NULL;
1915
1916        tmppolicy = getpolicy();
1917
1918        if(!ostrncmp("letterbox", tmppolicy, 8))
1919                tmpstr = ostrcat(tmpstr, "panscan", 1, 0);
1920        else if(!ostrncmp("panscan", tmppolicy, 7))
1921                tmpstr = ostrcat(tmpstr, "non", 1, 0);
1922        else if(!ostrncmp("non", tmppolicy, 3))
1923                tmpstr = ostrcat(tmpstr, "bestfit", 1, 0);
1924        else if(!ostrncmp("bestfit", tmppolicy, 7))
1925                tmpstr = ostrcat(tmpstr, "letterbox", 1, 0);
1926
1927        setpolicy(tmpstr);
1928
1929        free(tmpstr); tmpstr = NULL;
1930        free(tmppolicy); tmppolicy = NULL;
1931        return 0;
1932}
1933
1934char* getmac(char* dev)
1935{
1936        int sock = -1, i = 0;
1937        struct ifreq buf;
1938        char* tmpstr = NULL;
1939        char tmpbuf[4] = {};
1940
1941        if(dev == NULL) return NULL;
1942
1943        sock = socket(PF_INET, SOCK_DGRAM, 0);
1944        if(sock >= 0)
1945        {
1946                memset(&buf, 0x00, sizeof(buf));
1947                strcpy(buf.ifr_name, dev);
1948                ioctl(sock, SIOCGIFHWADDR, &buf);
1949                close(sock);
1950
1951                for(i = 0; i < 6; i++)
1952                {
1953                        snprintf(tmpbuf, 4, "%.2X:", (unsigned char)buf.ifr_hwaddr.sa_data[i]);
1954                        tmpstr = ostrcat(tmpstr, tmpbuf, 1, 0);
1955                }
1956                if(tmpbuf != NULL)
1957                        tmpstr[strlen(tmpstr) - 1] = '\0';
1958        }
1959
1960        return tmpstr;
1961}
1962
1963char* getdefaultgw()
1964{
1965        char* name = NULL;
1966        unsigned long def, gw, m;
1967        int flags, ref, use, metric, mtu, win, ir;
1968        struct in_addr ip;
1969
1970        FILE *fd = fopen("/proc/net/route", "r");
1971        if(fd == NULL)
1972                return NULL;
1973
1974        if(fscanf(fd, "%*[^\n]\n") < 0)
1975        {
1976                fclose(fd);
1977                return NULL;
1978        }
1979
1980        name = malloc(64);
1981        if(name == NULL)
1982        {
1983                err("no mem");
1984                return NULL;
1985        }
1986
1987        while(1)
1988        {
1989                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);
1990                if(def == 0) break;
1991                if(r != 11)
1992                {
1993                        fclose(fd);
1994                        free(name);
1995                        return NULL;
1996                }
1997                if(!(flags & 0x0001)) continue; //is interface down
1998        }
1999
2000        fclose(fd);
2001        free(name);
2002
2003        ip.s_addr = gw;
2004        if(def == 0)
2005                return inet_ntoa(ip);
2006
2007        return NULL;
2008}
2009
2010char* changefilenameext(char* filename, char* ext)
2011{
2012        char* newfilename = NULL;
2013        char* zeichen = NULL;
2014
2015        if(filename == NULL) return NULL;
2016
2017        newfilename = ostrcat(filename, NULL, 0, 0);
2018
2019        zeichen = strrchr(newfilename, '.');
2020        if(zeichen != NULL)
2021        {
2022                zeichen[0] = '\0';
2023                newfilename = ostrcat(newfilename, ext, 1, 0);
2024        }
2025
2026        return newfilename;
2027}
2028
2029int cmpfilenameext(char* filename, char* ext)
2030{
2031        char* zeichen = NULL;
2032
2033        if(filename == NULL) return 1;
2034
2035        zeichen = strrchr(filename, '.');
2036        if(zeichen != NULL)
2037        {
2038                if(ostrcasecmp(zeichen, ext) == 0) return 0;
2039        }
2040
2041        return 1;
2042}
2043
2044char* getfilenameext(char* filename)
2045{
2046        char* zeichen = NULL;
2047
2048        if(filename == NULL) return NULL;
2049
2050        zeichen = strrchr(filename, '.');
2051        if(zeichen != NULL)
2052        {
2053                return ostrcat(zeichen + 1, NULL, 0, 0);
2054        }
2055
2056        return NULL;
2057}
2058
2059char* getfilenamepng(char* filename)
2060{
2061        char* tmpstr = NULL;
2062
2063        if(filename == NULL) return NULL;
2064       
2065        if(!filelistflt(".avi .dat .divx .flv .mkv .m4v .mp4 .mov .mpg .mpeg .mts .m2ts .trp .ts .vdr .vob .wmv .rm", filename))
2066                tmpstr = ostrcat("movie", NULL, 0, 0);
2067        else if(!filelistflt(".mp3 .flac .ogg .wma .ra .wav", filename))
2068                tmpstr = ostrcat("musik", NULL, 0, 0);
2069        else if(!filelistflt(".jpg .png", filename))
2070                tmpstr = ostrcat("picture", NULL, 0, 0);
2071        else
2072                tmpstr = ostrcat(getfilenameext(filename), NULL, 1, 0);
2073
2074        if(tmpstr != NULL)
2075        {
2076                return tmpstr;
2077        }
2078
2079        return NULL;
2080}
2081
2082char* getcurrentdir(char* path)
2083{
2084        char* zeichen = NULL;
2085
2086        if(path == NULL) return NULL;
2087
2088        zeichen = strrchr(path, '/');
2089        if(zeichen != NULL)
2090        {
2091                return ostrcat(zeichen + 1, NULL, 0, 0);
2092        }
2093
2094        return NULL;
2095}
2096
2097char* convert_timesec(int sec)
2098{
2099        int hour = 0, min = 0, seconds = 0;
2100        char* buf = NULL;
2101
2102        buf = malloc(9);
2103        if(buf == NULL)
2104        {
2105                err("no mem");
2106                return NULL;
2107        }
2108
2109        seconds = sec % 60;
2110        min = (sec / 60) % 60;
2111        hour = sec / 3600;
2112
2113        if(seconds < 0) seconds = 0;
2114        if(min < 0) min = 0;
2115        if(hour < 0 || hour > 23)
2116        {
2117                hour = 0;
2118                min = 0;
2119                seconds = 0;
2120        }
2121
2122        snprintf(buf, 9, "%02d:%02d:%02d", hour, min, seconds);
2123
2124        return buf;
2125}
2126
2127int checkdate()
2128{
2129        time_t dvbtime = 0;
2130
2131        if(time(NULL) < 1072224000 || status.timeupdatecount > 3600) // 01.01.2004
2132        {
2133                if(dvbgetdate(&dvbtime, 10000000) == 0) //10 sek
2134                {
2135                        setsystime(&dvbtime);
2136                        status.timeupdatecount = 0;
2137                        return 0;
2138                }
2139                return 1;
2140        }
2141        return 0;
2142}
2143
2144void closeonexec(int fd)
2145{
2146        if(fd > -1)
2147                fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC);
2148}
2149
2150void startnewsletter(flag)
2151{
2152        if(flag == 1)
2153        {
2154                if(getconfigint("newsletter", NULL) == 1 && status.newsletterthread == NULL)
2155                        status.newsletterthread = addtimer(&newsletterthreadfunc, START, 1000, 1, NULL, NULL, NULL);
2156        }
2157        else if(status.newsletterthread != NULL)
2158        {
2159                status.newsletterthread->aktion = STOP;
2160                status.newsletterthread = NULL;
2161        }
2162}
2163
2164void startthumb(flag)
2165{
2166        if(flag == 1)
2167        {
2168                if(getconfigint("createthumb", NULL) == 1 && status.thumbthread == NULL)
2169                        status.thumbthread = addtimer(&thumbthread, START, 1000, 1, NULL, NULL, NULL);
2170        }
2171        else if(status.thumbthread != NULL)
2172        {
2173                status.thumbthread->aktion = STOP;
2174                status.thumbthread = NULL;
2175        }
2176}
2177
2178void starthttpd(flag)
2179{
2180        if(flag == 1)
2181        {
2182                if(getconfigint("httpdstart", NULL) == 1 && status.httpthread == NULL)
2183                {
2184                        status.httpthread = addtimer(&httpdthreadfunc, START, 10000, -1, NULL, NULL, NULL);
2185                        if(status.httpthread != NULL)
2186                                status.httpthread->flag = setbit(status.httpthread->flag, 0);
2187                }
2188        }
2189        else if(status.httpthread != NULL)
2190        {
2191                status.httpthread->aktion = STOP;
2192                status.httpthread = NULL;
2193        }
2194}
2195
2196void startrguid(flag)
2197{
2198        if(flag == 1)
2199        {
2200                if(getconfigint("rguidstart", NULL) == 1 && status.rguithread == NULL)
2201                {
2202                        status.rguithread = addtimer(&rguidthreadfunc, START, 10000, -1, NULL, NULL, NULL);
2203                        if(status.rguithread != NULL)
2204                                status.rguithread->flag = setbit(status.rguithread->flag, 0);
2205                }
2206        }
2207        else if(status.rguithread != NULL)
2208        {
2209                status.rguithread->aktion = STOP;
2210                status.rguithread = NULL;
2211        }
2212}
2213
2214int setoverclockfreq(int mode)
2215{
2216        // mode 0 = Set Standby Freq
2217        // mode 1 = Set Freq
2218
2219        if(ostrcmp(getownconfig("standby_overclock"), "0") == 0)
2220                return 1;
2221
2222        if(isfile("/proc/cpu_frequ/pll0_ndiv_mdiv") == 0)
2223                return 1;
2224
2225        char* tmpstr = NULL;
2226
2227        if(mode == 0)
2228                tmpstr = getownconfig("standby_freq");
2229        else
2230                tmpstr = getownconfig("pll0_ndiv_mdiv");
2231
2232        return writesys("/proc/cpu_frequ/pll0_ndiv_mdiv", tmpstr, 1);
2233}
2234
2235/*
2236int checkdev(char* dev)
2237{
2238        char* cmd = NULL;
2239        cmd = ostrcat(cmd, "cat ", 1, 0);
2240        cmd = ostrcat(cmd, dev, 1, 0);
2241
2242        char* tmpstr = NULL;
2243        tmpstr = string_newline(command(cmd));
2244        free(cmd), cmd = NULL;
2245
2246        if(tmpstr == NULL)
2247        {
2248                return 0;
2249        }
2250
2251        if(ostrcmp(tmpstr, "Segmentation fault") == 0)
2252        {
2253                return 0;
2254        }
2255       
2256        free(tmpstr), tmpstr = NULL;
2257        return 1;
2258}
2259*/
2260
2261int setsaturation(int value)
2262{
2263        char* saturationdev;
2264
2265        saturationdev = getconfig("saturationdev", NULL);
2266
2267        if(saturationdev != NULL /*&& checkdev(saturationdev)*/)
2268        {
2269                debug(100, "set %s to %d", saturationdev, value);
2270                return writesysint(saturationdev, value, 1);
2271        }
2272
2273        return 0;
2274}
2275
2276int setbrightness(int value)
2277{
2278        char* brightnessdev;
2279
2280        brightnessdev = getconfig("brightnessdev", NULL);
2281
2282        if(brightnessdev != NULL /*&& checkdev(brightnessdev)*/)
2283        {
2284                debug(100, "set %s to %d", brightnessdev, value);
2285                return writesysint(brightnessdev, value, 1);
2286        }
2287
2288        return 0;
2289}
2290
2291int setcontrast(int value)
2292{
2293        char* contrastdev;
2294
2295        contrastdev = getconfig("contrastdev", NULL);
2296
2297        if(contrastdev != NULL /*&& checkdev(contrastdev)*/)
2298        {
2299                debug(100, "set %s to %d", contrastdev, value);
2300                return writesysint(contrastdev, value, 1);
2301        }
2302
2303        return 0;
2304}
2305
2306int settint(int value)
2307{
2308        char* tintdev;
2309
2310        tintdev = getconfig("tintdev", NULL);
2311
2312        if(tintdev != NULL /*&& checkdev(tintdev)*/)
2313        {
2314                debug(100, "set %s to %d", tintdev, value);
2315                return writesysint(tintdev, value, 1);
2316        }
2317
2318        return 0;
2319}
2320
2321int ozip(char* inbuf, int inlen, char** outbuf, int* outlen, int level)
2322{
2323        int ret = 0;
2324        z_stream stream;
2325       
2326        if(inbuf == NULL || outbuf == NULL || inlen == 0) return 1;
2327
2328        stream.zalloc = Z_NULL;
2329        stream.zfree = Z_NULL;
2330        stream.opaque = Z_NULL;
2331        stream.avail_in = 0;
2332        stream.next_in = Z_NULL;
2333        stream.avail_out = 0;
2334        stream.next_out = Z_NULL;
2335
2336        ret = deflateInit(&stream, level);
2337        if(ret != Z_OK)
2338                return 1;
2339
2340        *outbuf = malloc(inlen);
2341        if(*outbuf == NULL)
2342        {
2343                err("no mem");
2344                (void)deflateEnd(&stream);
2345                return 1;
2346        }
2347
2348        stream.avail_in = inlen;
2349        stream.next_in = (void*)inbuf;
2350 
2351        do
2352        {
2353                stream.avail_out = inlen;
2354                stream.next_out = (void*)*outbuf;
2355
2356                ret = deflate(&stream, Z_FINISH);
2357                if(ret == Z_STREAM_ERROR)
2358                {
2359                        free(*outbuf); *outbuf = NULL;
2360                        (void)deflateEnd(&stream);
2361                        return 1;
2362                }
2363        }
2364        while(stream.avail_out == 0);
2365       
2366        char* tmpoutbuf = *outbuf;     
2367        *outlen = inlen - stream.avail_out;
2368        *outbuf = realloc(*outbuf, *outlen);
2369        if(*outbuf == NULL)
2370        {
2371                if(*outlen > 0)
2372                {
2373                        err("no mem"); 
2374                        free(tmpoutbuf);
2375                }
2376                *outlen = 0;
2377                (void)deflateEnd(&stream);
2378                return 1;
2379        }       
2380
2381        (void)deflateEnd(&stream);
2382        return 0;
2383}
2384
2385//flag 0: malloc mem
2386//flag 1: don't malloc mem
2387//flag 2: malloc mem (gzip)
2388//flag 3: don't malloc mem (gzip)
2389int ounzip(char* inbuf, int inlen, char** outbuf, int* outlen, int maxbuf, int flag)
2390{
2391        int ret = 0;
2392        z_stream stream;
2393       
2394        if(inbuf == NULL || outbuf == NULL || maxbuf == 0) return 1;
2395        if(flag == 1 && *outbuf == NULL) return 1;
2396
2397        stream.zalloc = Z_NULL;
2398        stream.zfree = Z_NULL;
2399        stream.opaque = Z_NULL;
2400        stream.avail_in = 0;
2401        stream.next_in = Z_NULL;
2402        stream.avail_out = 0;
2403        stream.next_out = Z_NULL;
2404
2405        if(flag == 2 || flag == 3)
2406        {
2407                ret = inflateInit2(&stream, 16 + MAX_WBITS);
2408                if(flag == 2) flag = 0;
2409                else if(flag == 3) flag = 1;
2410        }
2411        else
2412                ret = inflateInit(&stream);
2413        if(ret != Z_OK)
2414                return 1;
2415
2416        if(flag == 0)
2417        {
2418                *outbuf = malloc(maxbuf);
2419                if(*outbuf == NULL)
2420                {
2421                        err("no mem");
2422                        (void)inflateEnd(&stream);
2423                        return 1;
2424                }
2425        }
2426
2427        stream.avail_in = inlen;
2428        stream.next_in = (void*)inbuf;
2429
2430        int round = 0;
2431        do
2432        {
2433                stream.avail_out = maxbuf;
2434               
2435                if(flag == 0 && round > 0)
2436                {
2437                        char* tmpoutbuf = *outbuf;
2438                        *outbuf = realloc(*outbuf, maxbuf * (round + 1));
2439                        if(*outbuf == NULL)
2440                        {
2441                                err("no mem");
2442                                free(tmpoutbuf);
2443                                (void)inflateEnd(&stream);
2444                                return 1;
2445                        }
2446                        stream.next_out = (void*)(*outbuf) + maxbuf * round;
2447                }
2448                else
2449                        stream.next_out = (void*)*outbuf;
2450
2451                ret = inflate(&stream, Z_NO_FLUSH);
2452                if(ret == Z_NEED_DICT || ret == Z_DATA_ERROR || ret == Z_MEM_ERROR)
2453                {
2454                        if(flag == 0)
2455                        {
2456                                free(*outbuf);
2457                                *outbuf = NULL;
2458                        }                               
2459                        (void)inflateEnd(&stream);
2460                        return 1;
2461                }
2462
2463                round++;
2464        }
2465        while(stream.avail_out == 0);
2466       
2467        if(flag == 0)
2468        {
2469                char* tmpoutbuf = *outbuf;
2470                *outlen = (maxbuf * round) - stream.avail_out;
2471                *outbuf = realloc(*outbuf, *outlen);
2472                if(*outbuf == NULL)
2473                {
2474                        err("no mem");
2475                        if(*outlen > 0) free(tmpoutbuf);
2476                        *outlen = 0;
2477                        (void)inflateEnd(&stream);
2478                        return 1;
2479                }       
2480        }
2481        else
2482                *outlen = maxbuf - stream.avail_out;                   
2483
2484        (void)inflateEnd(&stream);
2485        return 0;
2486}
2487
2488void endianswapshort(unsigned short* value)
2489{
2490        *value = (*value >> 8) | (*value << 8);
2491}
2492
2493int rcnumber(int rcret)
2494{
2495        if(rcret == getrcconfigint("rc0", NULL) ||
2496        rcret == getrcconfigint("rc1", NULL) ||
2497        rcret == getrcconfigint("rc2", NULL) ||
2498        rcret == getrcconfigint("rc3", NULL) ||
2499        rcret == getrcconfigint("rc4", NULL) ||
2500        rcret == getrcconfigint("rc5", NULL) ||
2501        rcret == getrcconfigint("rc6", NULL) ||
2502        rcret == getrcconfigint("rc7", NULL) ||
2503        rcret == getrcconfigint("rc8", NULL) ||
2504        rcret == getrcconfigint("rc9", NULL))
2505                return rcret;
2506        else
2507                return -9999;
2508}
2509
2510int checkdirext(char* dir, char* ext)
2511{
2512        struct dirent *dirent = NULL;
2513        DIR *pdir = NULL;
2514
2515        pdir = opendir(dir);
2516        if(pdir != NULL)
2517        {
2518                while((dirent = readdir(pdir)) != NULL)
2519                {
2520                        if(ostrcmp(".", dirent->d_name) != 0 && ostrcmp("..", dirent->d_name) != 0)
2521                        {
2522                                if(ostrstr(dirent->d_name, ext) != NULL)
2523                                {
2524                                        closedir(pdir);
2525                                        return 1;
2526                                }
2527                        }
2528                }
2529
2530                closedir(pdir);
2531        }
2532
2533        return 0;
2534}
2535
2536int delallfiles(char* dir, char* ext)
2537{
2538        struct dirent *dirent = NULL;
2539        DIR *pdir = NULL;
2540        char* tmpstr = NULL;
2541
2542        pdir = opendir(dir);
2543        if(pdir != NULL)
2544        {
2545                while((dirent = readdir(pdir)) != NULL)
2546                {
2547                        if(ostrcmp(".", dirent->d_name) != 0 && ostrcmp("..", dirent->d_name) != 0)
2548                        {
2549                                if(ext == NULL || ostrstr(dirent->d_name, ext) != NULL)
2550                                {
2551                                        tmpstr = ostrcat(dir, "/", 0, 0);
2552                                        tmpstr = ostrcat(tmpstr, dirent->d_name, 1, 0);
2553                                        unlink(tmpstr);
2554                                        free(tmpstr); tmpstr = NULL;
2555                                }
2556                        }
2557                }
2558
2559                closedir(pdir);
2560        }
2561
2562        return 0;
2563}
2564
2565unsigned long getfilecount(char* dir)
2566{
2567        unsigned long count = 0;
2568        struct dirent *dirent = NULL;
2569        DIR *pdir = NULL;
2570
2571        pdir = opendir(dir);
2572        if(pdir != NULL)
2573        {
2574                while((dirent = readdir(pdir)) != NULL)
2575                        count++;
2576
2577                closedir(pdir);
2578        }
2579
2580        return count;
2581}
2582
2583int getfiletype(char* filename)
2584{
2585        struct stat64 s;
2586
2587        if(filename == NULL) return -1;
2588
2589        if(stat64(filename, &s) >= 0)
2590        {
2591                if(S_ISREG(s.st_mode)) return DT_REG;
2592                if(S_ISDIR(s.st_mode)) return DT_DIR;
2593                if(S_ISCHR(s.st_mode)) return DT_CHR;
2594                if(S_ISBLK(s.st_mode)) return DT_BLK;
2595                if(S_ISFIFO(s.st_mode)) return DT_FIFO;
2596                if(S_ISLNK(s.st_mode)) return DT_LNK;
2597        }
2598
2599        return DT_UNKNOWN;
2600}
2601
2602int getlfiletype(char* filename)
2603{
2604        struct stat64 s;
2605
2606        if(filename == NULL) return -1;
2607
2608        if(lstat64(filename, &s) >= 0)
2609        {
2610                if(S_ISREG(s.st_mode)) return DT_REG;
2611                if(S_ISDIR(s.st_mode)) return DT_DIR;
2612                if(S_ISCHR(s.st_mode)) return DT_CHR;
2613                if(S_ISBLK(s.st_mode)) return DT_BLK;
2614                if(S_ISFIFO(s.st_mode)) return DT_FIFO;
2615                if(S_ISLNK(s.st_mode)) return DT_LNK;
2616        }
2617
2618        return DT_UNKNOWN;
2619}
2620
2621unsigned long long getfullspace(char* dir)
2622{
2623        struct statfs64 s;
2624        unsigned long long fullsize = 0;
2625
2626        if(statfs64(dir, &s) >= 0)
2627        {
2628                fullsize = s.f_blocks;
2629                fullsize *= s.f_bsize;
2630        }
2631
2632        return fullsize;
2633}
2634
2635unsigned long long getfreespace(char* dir)
2636{
2637        struct statfs64 s;
2638        unsigned long long freesize = 0;
2639
2640        if(statfs64(dir, &s) >= 0)
2641        {
2642                freesize = s.f_bfree;
2643                freesize *= s.f_bsize;
2644        }
2645
2646        return freesize;
2647}
2648
2649int checkbit(int value, int bitpos)
2650{
2651        int ret = 0;
2652
2653        ret = value & (1 << bitpos) ? 1: 0;
2654        return ret;
2655}
2656
2657int tooglebit(int value, int bitpos)
2658{
2659        value ^= 1 << bitpos;
2660        return value;
2661}
2662
2663int clearbit(int value, int bitpos)
2664{
2665        value &= ~(1 << bitpos);
2666        return value;
2667}
2668
2669int setbit(int value, int bitpos)
2670{
2671        value |= 1 << bitpos;
2672        return value;
2673}
2674
2675int setsystime(time_t* newtime)
2676{
2677        if (stime(newtime))
2678        {
2679                err("can't set system time");
2680                return 1;
2681        }
2682        return 0;
2683}
2684
2685off64_t getfilesize(char* name)
2686{
2687        struct stat64 sbuf;
2688
2689        if(lstat64(name, &sbuf) == -1)
2690                return 0;
2691
2692        return sbuf.st_size;
2693}
2694
2695time_t getfiletime(char* name, int type)
2696{
2697        struct stat64 sbuf;
2698
2699        if(lstat64(name, &sbuf) == -1)
2700                return 0;
2701
2702        switch(type)
2703        {
2704                case 1: return sbuf.st_mtime;
2705                case 2: return sbuf.st_ctime;
2706                default: return sbuf.st_atime;
2707        }
2708}
2709
2710int isfile(char* name)
2711{
2712        struct stat64 sbuf;
2713
2714        if(lstat64(name, &sbuf) == -1)
2715                return 0;
2716
2717        if(S_ISREG(sbuf.st_mode))
2718                return 1;
2719
2720        return 0;
2721}
2722
2723int isdir(char* name)
2724{
2725        struct stat64 sbuf;
2726        char *rpath = NULL;
2727
2728        if(lstat64(name, &sbuf) == -1)
2729                return 0;
2730
2731        if(S_ISDIR(sbuf.st_mode))
2732                return 1;
2733
2734        if(S_ISLNK(sbuf.st_mode))
2735        {
2736                rpath = realpath(name, NULL);
2737                if(lstat64(rpath, &sbuf) == -1)
2738                {
2739                        free(rpath);
2740                        return 0;
2741                }
2742                free(rpath);
2743                if(S_ISDIR(sbuf.st_mode))
2744                        return 1;
2745        }
2746
2747        return 0;
2748}
2749
2750char* getmaxsatstring(int maxsat)
2751{
2752        char* tmpstr = NULL, *tmpnr = NULL;
2753        int i;
2754
2755        tmpstr = ostrcat(tmpstr, "1", 1, 0);
2756        for(i = 2; i <= maxsat; i++)
2757        {
2758                tmpnr = oitoa(i);
2759                tmpstr = ostrcat(tmpstr, "\n", 1, 0);
2760                tmpstr = ostrcat(tmpstr, tmpnr, 1, 1);
2761        }
2762        return tmpstr;
2763}
2764
2765void ostrcatbig(char** value1, char* value2, int* maxlen, int* pos)
2766{
2767        int len = 0;
2768
2769        if(value2 == NULL)
2770                return;
2771
2772        len = strlen(value2) + 1;
2773
2774        if(*value1 != NULL && maxlen == 0)
2775                *maxlen = strlen(*value1);
2776
2777        if(*value1 == NULL || *pos + len > *maxlen)
2778        {
2779                *maxlen = *maxlen + len + (MINMALLOC * 10);
2780                *value1 = realloc(*value1, *maxlen);
2781                if(*value1 == NULL)
2782                {
2783                        err("no mem");
2784                        return;
2785                }
2786        }
2787
2788        memcpy(*value1 + *pos, value2, len);
2789        *pos = *pos + (len - 1);
2790}
2791
2792char* ostrshrink(char* value)
2793{
2794        int len = 0;
2795        char* buf = NULL;
2796
2797        if(value == NULL) return NULL;
2798
2799        len = strlen(value);
2800        if(len == 0) return value;
2801
2802        buf = malloc(len + 1);
2803        if(buf == NULL)
2804                return value;
2805
2806        memcpy(buf, value, len);
2807        free(value);
2808        buf[len] = '\0';
2809
2810        return buf;
2811}
2812
2813char* ostrcat(char* value1, char* value2, int free1, int free2)
2814{
2815        int len = 0, len1 = 0, len2 = 0;
2816        char* buf = NULL;
2817
2818        if(value1 == NULL && value2 == NULL) return NULL;
2819
2820        if(value1 != NULL) len1 = strlen(value1);
2821        if(value2 != NULL) len2 = strlen(value2);
2822
2823        len = len1 + len2 + 1;
2824
2825        if(free1 == 1)
2826                buf = realloc(value1, len);
2827        else
2828                buf = malloc(len);
2829        if(buf == NULL)
2830        {
2831                if(free1 == 1) free(value1);
2832                if(free2 == 1) free(value2);
2833                return NULL;
2834        }
2835
2836        if(free1 == 0 && len1 > 0) memcpy(buf, value1, len1);
2837        if(len2 > 0) memcpy(buf + len1, value2, len2);
2838        buf[len - 1] = '\0';
2839
2840        if(free2 == 1) free(value2);
2841
2842        //helpfull for memleak detect
2843        //if(buf != NULL && strlen(buf) == 0x0b - 0x01)
2844        //      printf("******** memleak string (%s) (%p) ********\n", buf, buf);
2845
2846        return buf;
2847}
2848
2849char* ollutoa(uint64_t value)
2850{
2851        char *buf = NULL;
2852
2853        buf = malloc(MINMALLOC);
2854        if(buf == NULL)
2855        {
2856                err("no mem");
2857                return NULL;
2858        }
2859
2860        sprintf(buf, "%llu", value);
2861        buf = ostrshrink(buf);
2862
2863        return buf;
2864}
2865
2866char* olutoa(unsigned long value)
2867{
2868        char *buf = NULL;
2869
2870        buf = malloc(MINMALLOC);
2871        if(buf == NULL)
2872        {
2873                err("no mem");
2874                return NULL;
2875        }
2876
2877        sprintf(buf, "%lu", value);
2878        buf = ostrshrink(buf);
2879
2880        return buf;
2881}
2882
2883char* oitoax(int value)
2884{
2885        char *buf = NULL;
2886
2887        buf = malloc(MINMALLOC);
2888        if(buf == NULL)
2889        {
2890                err("no mem");
2891                return NULL;
2892        }
2893
2894        sprintf(buf, "%x", value);
2895        buf = ostrshrink(buf);
2896
2897        return buf;
2898}
2899
2900char* oitoa(int value)
2901{
2902        char *buf = NULL;
2903
2904        buf = malloc(MINMALLOC);
2905        if(buf == NULL)
2906        {
2907                err("no mem");
2908                return NULL;
2909        }
2910
2911        sprintf(buf, "%d", value);
2912        buf = ostrshrink(buf);
2913
2914        return buf;
2915}
2916
2917char* oitoa64(off64_t value)
2918{
2919        char *buf = NULL;
2920
2921        buf = malloc(MINMALLOC);
2922        if(buf == NULL)
2923        {
2924                err("no mem");
2925                return NULL;
2926        }
2927
2928        sprintf(buf, "%lld", value);
2929        buf = ostrshrink(buf);
2930
2931        return buf;
2932}
2933
2934char* oftoa64(double value, char* count)
2935{
2936        char *buf = NULL;
2937        char* tmpstr = NULL;
2938
2939        buf = malloc(MINMALLOC);
2940        if(buf == NULL)
2941        {
2942                err("no mem");
2943                return NULL;
2944        }
2945
2946        tmpstr = ostrcat("%.", count, 0, 0);
2947        tmpstr = ostrcat(tmpstr, "f", 1, 0);
2948
2949        sprintf(buf, tmpstr, value);
2950        buf = ostrshrink(buf);
2951
2952        free(tmpstr);
2953        return buf;
2954}
2955
2956int ostrncmp(char* value1, char* value2, int count)
2957{
2958        int ret = 1;
2959
2960        if(value1 != NULL && value2 != NULL)
2961                ret = strncmp(value1, value2, count);
2962
2963        return ret;
2964}
2965
2966int ostrcmp(char* value1, char* value2)
2967{
2968        int ret = 1;
2969
2970        if(value1 != NULL && value2 != NULL)
2971                ret = strcmp(value1, value2);
2972
2973        return ret;
2974}
2975
2976int ostrcasecmp(char* value1, char* value2)
2977{
2978        int ret = 1;
2979
2980        if(value1 != NULL && value2 != NULL)
2981                ret = strcasecmp(value1, value2);
2982
2983        return ret;
2984}
2985
2986char* createpath(char* dir, char* file)
2987{
2988        char *absdir = NULL;
2989        char *pos = NULL;
2990        char* tmpdir = NULL;
2991
2992        if(dir == NULL || file == NULL)
2993        {
2994                err("NULL detect");
2995                return NULL;
2996        }
2997
2998        tmpdir = ostrcat(dir, NULL, 0, 0);
2999        if(tmpdir == NULL)
3000        {
3001                err("NULL detect");
3002                return NULL;
3003        }
3004
3005        while((tmpdir[strlen(tmpdir) - 1] == '.' && tmpdir[strlen(tmpdir) - 2] != '.') || tmpdir[strlen(tmpdir) - 1] == '/')
3006                tmpdir[strlen(tmpdir) - 1] = '\0';
3007
3008        while(tmpdir[strlen(tmpdir) - 1] == '.' && tmpdir[strlen(tmpdir) - 2] == '.')
3009        {
3010                tmpdir[strlen(tmpdir) - 1] = '\0';
3011                tmpdir[strlen(tmpdir) - 1] = '\0';
3012                if(tmpdir[strlen(tmpdir) - 1] == '/')
3013                        tmpdir[strlen(tmpdir) - 1] = '\0';
3014                pos = strrchr(tmpdir, '/');
3015                if(pos != NULL)
3016                        pos[0] = '\0';
3017        }
3018
3019        absdir = malloc(strlen(tmpdir) + strlen(file) + 2);
3020        if(absdir == NULL)
3021        {
3022                free(tmpdir);
3023                err("no mem");
3024                return NULL;
3025        }
3026
3027        if(strlen(file) > 0 || strlen(tmpdir) == 0)
3028                sprintf(absdir, "%s/%s", tmpdir, file);
3029        else
3030                sprintf(absdir, "%s", tmpdir);
3031
3032        free(tmpdir);
3033        return absdir;
3034}
3035
3036int settimezone(char* zone)
3037{
3038        int ret = 0;
3039        char* tmpzone = NULL, *zonepath = NULL;
3040
3041        zonepath = getconfig("zonepath", NULL);
3042        if(zonepath == NULL)
3043        {
3044                err("config zonepath not defined");
3045                return 1;
3046        }
3047
3048        tmpzone = createpath(zonepath, zone);
3049        if(tmpzone == NULL)
3050                return 1;
3051
3052        setenv("TZ", zone, 1);
3053
3054        ret = unlink(getconfig("localtimefile", NULL));
3055        if(ret != 0)
3056                perr("unlink");
3057        ret = symlink(tmpzone, getconfig("localtimefile", NULL));
3058        if(ret != 0)
3059                perr("link");
3060
3061        free(tmpzone);
3062        return ret;
3063}
3064
3065int delchar(char** text, int pos)
3066{
3067        char *tmptext = NULL;
3068        int i = 0, y = 0, len = 0;
3069
3070        if(text == NULL || *text == NULL)
3071                return pos;
3072
3073        len = strlen(*text);
3074        if(len == 0) return pos;
3075
3076        tmptext = malloc(strlen(*text));
3077        if(tmptext == NULL)
3078        {
3079                err("no mem");
3080                return pos;
3081        }
3082
3083        for(i = 0; i < strlen(*text); i++)
3084        {
3085                if(i == pos - 1)
3086                        y++;
3087
3088                tmptext[i] = (*text)[y];
3089                y++;
3090        }
3091
3092        if(i > 0) tmptext[i - 1] = '\0';
3093        if(pos >= strlen(tmptext)) pos = strlen(tmptext);
3094
3095        free(*text);
3096        *text = tmptext;
3097        return pos;
3098}
3099
3100
3101int insertchar(char** text, char zeichen, int pos)
3102{
3103        char *tmptext = NULL;
3104        int i, y = 0;
3105
3106        if(text == NULL || *text == NULL)
3107                return pos;
3108
3109        tmptext = malloc(strlen(*text) + 2);
3110        if(tmptext == NULL)
3111        {
3112                err("no mem");
3113                return pos;
3114        }
3115
3116        if(strlen(*text) == 0)
3117        {
3118                tmptext[0] = zeichen;
3119                i = 1;
3120                pos = 0;
3121        }
3122        else
3123        {
3124                for(i = 0; i < strlen(*text) + 1; i++)
3125                {
3126                        if(i == pos)
3127                                tmptext[i] = zeichen;
3128                        else
3129                        {
3130                                tmptext[i] = (*text)[y];
3131                                y++;
3132                        }
3133                }
3134        }
3135        tmptext[i] = '\0';
3136
3137        free(*text);
3138        *text = tmptext;
3139        return pos + 1;
3140}
3141
3142void calctext(char* buf, char* buf1, unsigned int* linecount, unsigned int* pagecount, unsigned int* poscount, int pagelen, int page)
3143{
3144        unsigned int tmpposcount = 0;
3145        unsigned int pagepagelen = 0;
3146
3147        *poscount = 0;
3148        *linecount = 1;
3149        *pagecount = 1;
3150
3151        page--;
3152        if(page < 0) page = 0;
3153        pagepagelen = pagelen * page;
3154
3155        if(buf != NULL)
3156        {
3157                while(*buf != '\0')
3158                {
3159                        if(*buf == '\n')
3160                        {
3161                                if(*(buf + 1) == '\0') break;
3162                                (*linecount)++;
3163
3164                                if(*linecount - 1 == pagepagelen)
3165                                        *poscount = tmpposcount + 1;
3166                        }
3167                        buf++;
3168                        tmpposcount++;
3169                }
3170        }
3171
3172        if(buf1 != NULL)
3173        {
3174                while(*buf1 != '\0')
3175                {
3176                        if(*buf1 == '\n')
3177                        {
3178                                if(*(buf1 + 1) == '\0') break;
3179                                (*linecount)++;
3180
3181                                if(*linecount - 1 == pagepagelen)
3182                                        *poscount = tmpposcount + 1;
3183                        }
3184                        buf1++;
3185                        tmpposcount++;
3186                }
3187        }
3188
3189        if(pagelen > 0)
3190                *pagecount = (int)ceil(((float)*linecount / pagelen));
3191}
3192
3193int initlocale(char *localepath)
3194{
3195        setlocale(LC_ALL, "");
3196        if(bindtextdomain(PROGNAME, localepath) == NULL)
3197        {
3198                err("set bindtextdomain");
3199                return 1;
3200        }
3201        if(textdomain(PROGNAME) == NULL)
3202        {
3203                err("set textdomain");
3204                return 1;
3205        }
3206        return 0;
3207}
3208
3209//for langage you must
3210//mkdir /usr/lib/locale
3211//ln -s %titanpath%/po /usr/lib/locale/po
3212//copy SYS_LC_MESSAGES from other language into LC_MESSAGE
3213int setlang(char *lang)
3214{
3215        char *ret;
3216
3217        setenv("LANG", lang, 1);
3218        setenv("LANGUAGE", lang, 1);
3219        ret = setlocale(LC_MESSAGES, lang);
3220        if(ret == NULL)
3221        {
3222                err("can't set LC_MESSAGES to %s", lang);
3223                return 1;
3224        }
3225        return 0;
3226}
3227
3228unsigned long readsysul(const char *filename, int line)
3229{
3230        int i = 0, len = 0;
3231        unsigned long ret = 0;
3232        FILE *fd = NULL;
3233        char *fileline = NULL;
3234        char *buf1 = NULL;
3235
3236        fileline = malloc(MINMALLOC);
3237        if(fileline == NULL)
3238        {
3239                err("no mem");
3240                return 0;
3241        }
3242
3243        fd = fopen(filename, "r");
3244        if(fd == NULL)
3245        {
3246                perr("can't open %s", filename);
3247                free(fileline);
3248                return 0;
3249        }
3250
3251        for(i = 0; i < line; i++)
3252        {
3253                memset(fileline, 0, MINMALLOC);
3254                fgets(fileline, MINMALLOC, fd);
3255        }
3256
3257        len = strlen(fileline) - 1;
3258        if(len >= 0 && fileline[len] == '\n')
3259                fileline[len] = '\0';
3260        buf1 = ostrshrink(fileline);
3261
3262        fclose(fd);
3263
3264        if(buf1 != NULL)
3265        {
3266                ret = strtoul(buf1, NULL, 10);
3267                free(buf1); buf1 = NULL;
3268        }
3269
3270        return ret;
3271}
3272
3273unsigned long long readsysull(const char *filename, int line)
3274{
3275        int i = 0, len = 0;
3276        unsigned long long ret = 0;
3277        FILE *fd = NULL;
3278        char *fileline = NULL;
3279        char *buf1 = NULL;
3280
3281        fileline = malloc(MINMALLOC);
3282        if(fileline == NULL)
3283        {
3284                err("no mem");
3285                return 0;
3286        }
3287
3288        fd = fopen(filename, "r");
3289        if(fd == NULL)
3290        {
3291                perr("can't open %s", filename);
3292                free(fileline);
3293                return 0;
3294        }
3295
3296        for(i = 0; i < line; i++)
3297        {
3298                memset(fileline, 0, MINMALLOC);
3299                fgets(fileline, MINMALLOC, fd);
3300        }
3301
3302        len = strlen(fileline) - 1;
3303        if(len >= 0 && fileline[len] == '\n')
3304                fileline[len] = '\0';
3305        buf1 = ostrshrink(fileline);
3306
3307        fclose(fd);
3308
3309        if(buf1 != NULL)
3310        {
3311                ret = strtoull(buf1, NULL, 10);
3312                free(buf1); buf1 = NULL;
3313        }
3314
3315        return ret;
3316}
3317
3318char* readsys(const char *filename, int line)
3319{
3320        int i = 0, len = 0;
3321        FILE *fd = NULL;
3322        char *fileline = NULL;
3323        char *buf1 = NULL;
3324
3325        fileline = malloc(MINMALLOC);
3326        if(fileline == NULL)
3327        {
3328                err("no mem");
3329                return NULL;
3330        }
3331
3332        fd = fopen(filename, "r");
3333        if(fd == NULL)
3334        {
3335                perr("can't open %s", filename);
3336                free(fileline);
3337                return NULL;
3338        }
3339
3340        for(i = 0; i < line; i++)
3341        {
3342                memset(fileline, 0, MINMALLOC);
3343                fgets(fileline, MINMALLOC, fd);
3344        }
3345
3346        len = strlen(fileline) - 1;
3347        if(len >= 0 && fileline[len] == '\n')
3348                fileline[len] = '\0';
3349        buf1 = ostrshrink(fileline);
3350
3351        fclose(fd);
3352        return buf1;
3353}
3354
3355//flag 0: without \n
3356//flag 1: with \n
3357//flag 2: append without \n
3358//flag 3: append with \n
3359int writesys(const char *filename, char *value, int flag)
3360{
3361        FILE *fd = NULL;
3362        char* tmpstr = NULL;
3363        int ret;
3364
3365        if(value == NULL)
3366        {
3367                err("NULL detect");
3368                return 1;
3369        }
3370
3371        if(flag == 2 || flag == 3)
3372                fd = fopen(filename, "a");
3373        else
3374                fd = fopen(filename, "w");
3375        if(fd == NULL)
3376        {
3377                perr("can't open %s", filename);
3378                return 1;
3379        }
3380
3381        if(flag == 1 || flag == 3)
3382                tmpstr = ostrcat(value, "\n", 0, 0);
3383        else
3384                tmpstr = ostrcat(value, NULL, 0, 0);
3385
3386        ret = fwrite(tmpstr, strlen(tmpstr), 1, fd);
3387        if(ret != 1)
3388        {
3389                perr("writting to %s", filename);
3390                free(tmpstr);
3391                fclose(fd);
3392                return 1;
3393        }
3394
3395        free(tmpstr);
3396        fclose(fd);
3397        return 0;
3398}
3399
3400//flag 0: without \n
3401//flag 1: with \n
3402//flag 2: append without \n
3403//flag 3: append with \n
3404int writesysint(const char *filename, int value, int flag)
3405{
3406        char* tmpstr = NULL;
3407        int ret = 0;
3408
3409        tmpstr = oitoa(value);
3410        ret = writesys(filename, tmpstr, flag);
3411
3412        free(tmpstr);
3413        return ret;
3414}
3415
3416char* getdevcontent(char* devconfig)
3417{
3418        char *dev = NULL;
3419        char *value = NULL;
3420
3421        dev = getconfig(devconfig, NULL);
3422
3423        if(dev == NULL)
3424        {
3425                err("NULL detect");
3426                return NULL;
3427        }
3428
3429        value = readsys(dev, 1);
3430        if(value == NULL)
3431        {
3432                err("NULL detect");
3433                return NULL;
3434        }
3435
3436        return value;
3437}
3438
3439char* convertspacetolf(char* value)
3440{
3441        int i = 0;
3442
3443        while(value[i] != '\0')
3444        {
3445                if(value[i] == ' ')
3446                        value[i] = '\n';
3447                i++;
3448        }
3449
3450        return value;
3451}
3452
3453//flag 0: all
3454//flag 1: hdmi
3455//flag 2: not hdmi
3456char* getcolorformatchoices(int flag)
3457{
3458        char *colorformatchoicesdev = NULL;
3459        char *value = NULL;
3460
3461        colorformatchoicesdev = getconfig("colorformatchoicesdev", NULL);
3462
3463        if(colorformatchoicesdev == NULL)
3464        {
3465                err("NULL detect");
3466                return NULL;
3467        }
3468
3469        value = readsys(colorformatchoicesdev, 1);
3470        if(value == NULL)
3471        {
3472                err("NULL detect");
3473                return NULL;
3474        }
3475       
3476        if(flag == 1)
3477        {
3478                value = string_replace("rgb", NULL, value, 1);
3479                value = string_replace("  ", " ", value, 1);
3480                value = string_replace("cvbs", NULL, value, 1);
3481                value = string_replace("  ", " ", value, 1);
3482                value = string_replace("svideo", NULL, value, 1);
3483                value = string_replace("  ", " ", value, 1);
3484                value = string_replace("yuv", NULL, value, 1);
3485                value = string_replace("  ", " ", value, 1);
3486        }
3487        else if(flag == 2)
3488        {
3489                value = string_replace("hdmi_rgb", NULL, value, 1);
3490                value = string_replace("  ", " ", value, 1);
3491                value = string_replace("hdmi_yuv", NULL, value, 1);
3492                value = string_replace("  ", " ", value, 1);
3493                value = string_replace("hdmi_422", NULL, value, 1);
3494                value = string_replace("  ", " ", value, 1);
3495        }
3496
3497        value = strstrip(value);
3498        value = convertspacetolf(value);
3499
3500        return value;
3501}
3502
3503char* getaudiosourcechoices()
3504{
3505        char *audiosourcechoicesdev = NULL;
3506        char *value = NULL;
3507
3508        audiosourcechoicesdev = getconfig("audiosourcechoicesdev", NULL);
3509
3510        if(audiosourcechoicesdev == NULL)
3511        {
3512                err("NULL detect");
3513                return NULL;
3514        }
3515
3516        value = readsys(audiosourcechoicesdev, 1);
3517        if(value == NULL)
3518        {
3519                err("NULL detect");
3520                return NULL;
3521        }
3522
3523        value = convertspacetolf(value);
3524
3525        return value;
3526}
3527
3528char* getac3choices()
3529{
3530        char *ac3choicesdev = NULL;
3531        char *value = NULL;
3532
3533        ac3choicesdev = getconfig("ac3choicesdev", NULL);
3534
3535        if(ac3choicesdev == NULL)
3536        {
3537                err("NULL detect");
3538                return NULL;
3539        }
3540
3541        value = readsys(ac3choicesdev, 1);
3542        if(value == NULL)
3543        {
3544                err("NULL detect");
3545                return NULL;
3546        }
3547
3548        value = convertspacetolf(value);
3549
3550        return value;
3551}
3552
3553char* getaacchoices()
3554{
3555        char *aacchoicesdev = NULL;
3556        char *value = NULL;
3557
3558        aacchoicesdev = getconfig("aacchoicesdev", NULL);
3559
3560        if(aacchoicesdev == NULL)
3561        {
3562                err("NULL detect");
3563                return NULL;
3564        }
3565
3566        value = readsys(aacchoicesdev, 1);
3567        if(value == NULL)
3568        {
3569                err("NULL detect");
3570                return NULL;
3571        }
3572
3573        value = convertspacetolf(value);
3574
3575        return value;
3576}
3577
3578int setciclock(int slotnr, char* value)
3579{
3580        char* ciclockdev = NULL, *tmpstr = NULL;
3581        int ret = 0;
3582
3583        ciclockdev = getconfig("ciclockdev", NULL);
3584
3585        if(ciclockdev != NULL && value != NULL)
3586        {
3587                tmpstr = malloc(MINMALLOC);
3588                if(tmpstr == NULL)
3589                {
3590                        err("no mem");
3591                        return 1;
3592                }
3593
3594                snprintf(tmpstr, MINMALLOC, ciclockdev, slotnr);
3595                debug(100, "set %s to %s", tmpstr, value);
3596                ret = writesys(tmpstr, value, 0);
3597
3598                free(tmpstr); tmpstr = NULL;
3599                return ret;
3600        }
3601
3602        return 0;
3603}
3604
3605//routes stream from tuner to ci or ci to ci
3606int setciinput(int slotnr, char* value)
3607{
3608        char* ciinputdev = NULL, *tmpstr = NULL;
3609        int ret = 0;
3610
3611        ciinputdev = getconfig("ciinputdev", NULL);
3612
3613        if(ciinputdev != NULL && value != NULL)
3614        {
3615                tmpstr = malloc(MINMALLOC);
3616                if(tmpstr == NULL)
3617                {
3618                        err("no mem");
3619                        return 1;
3620                }
3621
3622                snprintf(tmpstr, MINMALLOC, ciinputdev, slotnr);
3623                debug(100, "set %s to %s", tmpstr, value);
3624                ret = writesys(tmpstr, value, 0);
3625
3626                free(tmpstr); tmpstr = NULL;
3627                return ret;
3628        }
3629
3630        return 0;
3631}
3632
3633//routes stream from tuner or ci to linux
3634int setcisource(int tunernr, char* value)
3635{
3636        char* cisourcedev = NULL, *tmpstr = NULL;
3637        int ret = 0;
3638
3639        cisourcedev = getconfig("cisourcedev", NULL);
3640
3641        if(cisourcedev != NULL && value != NULL)
3642        {
3643                tmpstr = malloc(MINMALLOC);
3644                if(tmpstr == NULL)
3645                {
3646                        err("no mem");
3647                        return 1;
3648                }
3649
3650                snprintf(tmpstr, MINMALLOC, cisourcedev, tunernr);
3651                debug(100, "set %s to %s", tmpstr, value);
3652                ret = writesys(tmpstr, value, 0);
3653
3654                free(tmpstr); tmpstr = NULL;
3655                return ret;
3656        }
3657
3658        return 0;
3659}
3660
3661int setinput(char* value)
3662{
3663        char* inputdev = NULL;
3664        int ret = 0;
3665
3666        inputdev = getconfig("inputdev", NULL);
3667
3668        if(inputdev != NULL && value != NULL)
3669        {
3670                debug(100, "set %s to %s", inputdev, value);
3671                ret = writesys(inputdev, value, 0);
3672                return ret;
3673        }
3674
3675        return 0;
3676}
3677
3678char* getinput()
3679{
3680        char *inputdev = NULL;
3681        char *value = NULL;
3682
3683        inputdev = getconfig("inputdev", NULL);
3684
3685        if(inputdev == NULL)
3686        {
3687                err("NULL detect");
3688                return NULL;
3689        }
3690
3691        value = readsys(inputdev, 1);
3692        if(value == NULL)
3693        {
3694                err("NULL detect");
3695                return NULL;
3696        }
3697
3698        return value;
3699}
3700
3701int setac3(char* value)
3702{
3703        char* ac3dev = NULL;
3704        int ret = 0;
3705
3706        ac3dev = getconfig("ac3dev", NULL);
3707
3708        if(ac3dev != NULL && value != NULL)
3709        {
3710                debug(100, "set %s to %s", ac3dev, value);
3711                ret = writesys(ac3dev, value, 0);
3712                if(ret == 0) addconfig("av_ac3mode", value);
3713                return ret;
3714        }
3715
3716        return 0;
3717}
3718
3719int setaac(char* value)
3720{
3721        char* aacdev = NULL;
3722        int ret = 0;
3723
3724        aacdev = getconfig("aacdev", NULL);
3725
3726        if(aacdev != NULL && value != NULL)
3727        {
3728                debug(100, "set %s to %s", aacdev, value);
3729                ret = writesys(aacdev, value, 0);
3730                if(ret == 0) addconfig("av_aacmode", value);
3731                return ret;
3732        }
3733
3734        return 0;
3735}
3736
3737char* getac3()
3738{
3739        char *ac3dev = NULL;
3740        char *value = NULL;
3741
3742        ac3dev = getconfig("ac3dev", NULL);
3743
3744        if(ac3dev == NULL)
3745        {
3746                err("NULL detect");
3747                return NULL;
3748        }
3749
3750        value = readsys(ac3dev, 1);
3751        if(value == NULL)
3752        {
3753                err("NULL detect");
3754                return NULL;
3755        }
3756
3757        return value;
3758}
3759
3760char* getaac()
3761{
3762        char *aacdev = NULL;
3763        char *value = NULL;
3764
3765        aacdev = getconfig("aacdev", NULL);
3766
3767        if(aacdev == NULL)
3768        {
3769                err("NULL detect");
3770                return NULL;
3771        }
3772
3773        value = readsys(aacdev, 1);
3774        if(value == NULL)
3775        {
3776                err("NULL detect");
3777                return NULL;
3778        }
3779
3780        return value;
3781}
3782
3783int setaudiodelaybitstream(char* value)
3784{
3785        char* audiodelaybitstreamdev = NULL;
3786        int ret = 0;
3787
3788        audiodelaybitstreamdev = getconfig("audiodelaybitstreamdev", NULL);
3789
3790        if(audiodelaybitstreamdev != NULL && value != NULL)
3791        {
3792                debug(100, "set %s to %s", audiodelaybitstreamdev, value);
3793                ret = writesys(audiodelaybitstreamdev, value, 0);
3794                if(ret == 0) addconfig("audiodelaybitstream", value);
3795                return ret;
3796        }
3797
3798        return 0;
3799}
3800
3801char* getaudiodelaybitstream()
3802{
3803        char *audiodelaybitstreamdev = NULL;
3804        char *value = NULL;
3805
3806        audiodelaybitstreamdev = getconfig("audiodelaybitstreamdev", NULL);
3807
3808        if(audiodelaybitstreamdev == NULL)
3809        {
3810                err("NULL detect");
3811                return NULL;
3812        }
3813
3814        value = readsys(audiodelaybitstreamdev, 1);
3815        if(value == NULL)
3816        {
3817                err("NULL detect");
3818                return NULL;
3819        }
3820
3821        return value;
3822}
3823
3824char* getpolicychoices()
3825{
3826        char *policychoicesdev = NULL;
3827        char *value = NULL;
3828
3829        policychoicesdev = getconfig("policychoicesdev", NULL);
3830
3831        if(policychoicesdev == NULL)
3832        {
3833                err("NULL detect");
3834                return NULL;
3835        }
3836
3837        value = readsys(policychoicesdev, 1);
3838        if(value == NULL)
3839        {
3840                err("NULL detect");
3841                return NULL;
3842        }
3843
3844        value = convertspacetolf(value);
3845
3846        return value;
3847}
3848
3849char* getpolicy()
3850{
3851        char *policydev = NULL;
3852        char *value = NULL;
3853
3854        policydev = getconfig("policydev", NULL);
3855
3856        if(policydev == NULL)
3857        {
3858                err("NULL detect");
3859                return NULL;
3860        }
3861
3862        value = readsys(policydev, 1);
3863        if(value == NULL)
3864        {
3865                err("NULL detect");
3866                return NULL;
3867        }
3868
3869        return value;
3870}
3871
3872int setpolicy(char* value)
3873{
3874        char* policydev;
3875        int ret = 0;
3876
3877        policydev = getconfig("policydev", NULL);
3878
3879        if(policydev != NULL && value != NULL)
3880        {
3881                debug(100, "set %s to %s", policydev, value);
3882                ret = writesys(policydev, value, 0);
3883                if(ret == 0) addconfig("av_policy", value);
3884                return ret;
3885        }
3886
3887        return 0;
3888}
3889
3890char* getaspectchoices()
3891{
3892        char *aspectchoicesdev = NULL;
3893        char *value = NULL;
3894
3895        aspectchoicesdev = getconfig("aspectchoicesdev", NULL);
3896
3897        if(aspectchoicesdev == NULL)
3898        {
3899                err("NULL detect");
3900                return NULL;
3901        }
3902
3903        value = readsys(aspectchoicesdev, 1);
3904        if(value == NULL)
3905        {
3906                err("NULL detect");
3907                return NULL;
3908        }
3909
3910        value = convertspacetolf(value);
3911
3912        return value;
3913}
3914
3915char* getaspect()
3916{
3917        char *aspectdev = NULL;
3918        char *value = NULL;
3919
3920        aspectdev = getconfig("aspectdev", NULL);
3921
3922        if(aspectdev == NULL)
3923        {
3924                err("NULL detect");
3925                return NULL;
3926        }
3927
3928        value = readsys(aspectdev, 1);
3929        if(value == NULL)
3930        {
3931                err("NULL detect");
3932                return NULL;
3933        }
3934
3935        return value;
3936}
3937
3938int setaspect(char* value)
3939{
3940        char* aspectdev;
3941        int ret = 0;
3942
3943        aspectdev = getconfig("aspectdev", NULL);
3944
3945        if(aspectdev != NULL && value != NULL)
3946        {
3947                debug(100, "set %s to %s", aspectdev, value);
3948                ret = writesys(aspectdev, value, 0);
3949                if(ret == 0)
3950                {
3951                        addconfig("av_aspect", value);
3952
3953                        //set policy new after change aspect
3954                        char* tmpstr = getpolicy();
3955                        setpolicy(tmpstr);
3956                        free(tmpstr); tmpstr = NULL;
3957                }
3958                return ret;
3959        }
3960
3961        return 0;
3962}
3963
3964char* getvideomodechoices()
3965{
3966        char *videomodechoicesdev = NULL;
3967        char *value = NULL;
3968
3969        videomodechoicesdev = getconfig("videomodechoicesdev", NULL);
3970
3971        if(videomodechoicesdev == NULL)
3972        {
3973                err("NULL detect");
3974                return NULL;
3975        }
3976
3977        value = readsys(videomodechoicesdev, 1);
3978        if(value == NULL)
3979        {
3980                err("NULL detect");
3981                return NULL;
3982        }
3983
3984        value = string_replace("pal", NULL, value, 1);
3985        value = string_replace("  ", " ", value, 1);
3986
3987        if(status.mcaktiv == 0)
3988        {
3989                value = string_replace("1080p60", NULL, value, 1);
3990                value = string_replace("  ", " ", value, 1);
3991                value = string_replace("1080p59", NULL, value, 1);
3992                value = string_replace("  ", " ", value, 1);
3993                value = string_replace("1080p30", NULL, value, 1);
3994                value = string_replace("  ", " ", value, 1);
3995                value = string_replace("1080p29", NULL, value, 1);
3996                value = string_replace("  ", " ", value, 1);
3997                value = string_replace("1080p25", NULL, value, 1);
3998                value = string_replace("  ", " ", value, 1);
3999                value = string_replace("1080p24", NULL, value, 1);
4000                value = string_replace("  ", " ", value, 1);
4001                value = string_replace("1080p23", NULL, value, 1);
4002                value = string_replace("  ", " ", value, 1);
4003                value = string_replace("1080i60", NULL, value, 1);
4004                value = string_replace("  ", " ", value, 1);
4005                value = string_replace("1080i59", 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("720p60", NULL, value, 1);
4010                value = string_replace("  ", " ", value, 1);
4011                value = string_replace("576p50", NULL, value, 1);
4012                value = string_replace("  ", " ", value, 1);
4013                value = string_replace("1280x1024_75", NULL, value, 1);
4014                value = string_replace("  ", " ", value, 1);
4015                value = string_replace("1280x1024_70", NULL, value, 1);
4016                value = string_replace("  ", " ", value, 1);
4017                value = string_replace("1280x1024_60", NULL, value, 1);
4018                value = string_replace("  ", " ", value, 1);
4019                value = string_replace("1600x1200_60", NULL, value, 1);
4020                value = string_replace("  ", " ", value, 1);
4021                value = string_replace("1024x768_100", NULL, value, 1);
4022                value = string_replace("  ", " ", value, 1);
4023                value = string_replace("1024x768_90", NULL, value, 1);
4024                value = string_replace("  ", " ", value, 1);
4025                value = string_replace("1024x768_75", NULL, value, 1);
4026                value = string_replace("  ", " ", value, 1);
4027                value = string_replace("1024x768_70", NULL, value, 1);
4028                value = string_replace("  ", " ", value, 1);
4029                value = string_replace("1024x768_60", NULL, value, 1);
4030                value = string_replace("  ", " ", value, 1);
4031        }
4032
4033        value = strstrip(value);
4034        value = convertspacetolf(value);
4035
4036        return value;
4037}
4038
4039char* getmode3dchoices()
4040{
4041        char *mode3dchoicesdev = NULL;
4042        char *value = NULL;
4043
4044        mode3dchoicesdev = getconfig("mode3dchoicesdev", NULL);
4045
4046        if(mode3dchoicesdev == NULL)
4047        {
4048                return ostrcat("off\nsbs\ntab", "", 0, 0);
4049        }
4050
4051        value = readsys(mode3dchoicesdev, 1);
4052        if(value == NULL)
4053        {
4054                err("NULL detect");
4055                return NULL;
4056        }
4057
4058        value = convertspacetolf(value);
4059
4060        return value;
4061}
4062
4063char* getmode3d()
4064{
4065        char *mode3ddev = NULL;
4066        char *value = NULL;
4067
4068        mode3ddev = getconfig("mode3ddev", NULL);
4069
4070        if(mode3ddev == NULL)
4071        {
4072                err("NULL detect");
4073                return NULL;
4074        }
4075
4076        value = readsys(mode3ddev, 1);
4077        if(value == NULL)
4078        {
4079                err("NULL detect");
4080                return NULL;
4081        }
4082
4083        return value;
4084}
4085
4086int setmode3d(char* value)
4087{
4088        char* mode3ddev;
4089        int ret = 0;
4090
4091        mode3ddev = getconfig("mode3ddev", NULL);
4092
4093        if(mode3ddev != NULL && value != NULL)
4094        {
4095                debug(100, "set %s to %s", mode3ddev, value);
4096                ret = writesys(mode3ddev, value, 0);
4097                if(ret == 0) addconfig("av_mode3d", value);
4098                return ret;
4099        }
4100
4101        return 0;
4102}
4103
4104char* getvideomode()
4105{
4106        char *videomodedev = NULL;
4107        char *value = NULL;
4108
4109        videomodedev = getconfig("videomodedev", NULL);
4110
4111        if(videomodedev == NULL)
4112        {
4113                err("NULL detect");
4114                return NULL;
4115        }
4116
4117        value = readsys(videomodedev, 1);
4118        if(value == NULL)
4119        {
4120                err("NULL detect");
4121                return NULL;
4122        }
4123
4124        return value;
4125}
4126
4127void switchvideomode()
4128{
4129        int rcret = 0;
4130        char* tmpstr = NULL, *tmpstr2 = NULL, *tmpstr3 = NULL;
4131        tmpstr = getvideomode();       
4132        struct skin* playpolicy = getscreen("playpolicy");
4133        tmpstr2 = getcolorformat(2);
4134               
4135        if(tmpstr != NULL)
4136        {
4137                if((ostrcmp("pal", tmpstr) == 0 || ostrncmp("576", tmpstr, 3) == 0) && ostrncmp("yuv", tmpstr2, 3) == 0)
4138                {
4139                        setvideomode("720p50", 0);
4140                        changefbresolution("720p50", 0);
4141                        changetext(playpolicy, "720p50 (rgb)");
4142                        writevfdmenu("720p50 (rgb)");
4143                        setcolorformat("rgb", 1);
4144                        unlink("/var/etc/.scart");
4145                }
4146                else if((ostrcmp("pal", tmpstr) == 0 || ostrncmp("576", tmpstr, 3) == 0) && ostrncmp("rgb", tmpstr2, 3) == 0)
4147                {
4148                        setvideomode("720p50", 0);
4149                        changefbresolution("720p50", 0);
4150                        changetext(playpolicy, "720p50 (yuv)");
4151                        writevfdmenu("720p50 (yuv)");
4152                        setcolorformat("yuv", 1);
4153                        unlink("/var/etc/.scart");
4154                }
4155                else if(ostrncmp("720", tmpstr, 3) == 0)
4156                {
4157                        setvideomode("1080i50", 0);
4158                        changefbresolution("1080i50", 0);
4159                        tmpstr3 = ostrcat("1080i50 (", tmpstr2, 0, 0);
4160                        tmpstr3 = ostrcat(tmpstr3, ")", 1, 0);
4161                        changetext(playpolicy, tmpstr3);
4162                        writevfdmenu(tmpstr3);
4163                        unlink("/var/etc/.scart");                     
4164                }
4165                else if(ostrncmp("1080", tmpstr, 4) == 0)
4166                {
4167                        setvideomode("576i50", 0);
4168                        changefbresolution("576i50", 0);
4169                        changetext(playpolicy, "576i50 (rgb)");
4170                        writevfdmenu("576i50 (rgb)");
4171                        setcolorformat("rgb", 1);
4172                        writesys("/var/etc/.scart", "0", 0);
4173                }
4174                /*
4175                int ret = textbox(_("Message"), _("Is this Videomode ok ?"), _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 600, 200, 10, 0);
4176                if(ret == 1 || ret == 2)
4177                {
4178                        setvideomode(tmpstr, 0);
4179                        changefbresolution(tmpstr, 0);
4180                }
4181                */
4182                drawscreen(playpolicy, 0, 0);
4183                while(1)
4184                {
4185                        rcret = waitrc(playpolicy, 5000, 0);
4186                        break;
4187                }
4188                clearscreen(playpolicy);
4189        }
4190        free(tmpstr);
4191        free(tmpstr2);
4192        free(tmpstr3);
4193}
4194
4195//flag 0: write videomode to config
4196//flag 1: don't write videomode to config
4197int setvideomode(char* value, int flag)
4198{
4199        char* videomodedev;
4200        int ret = 0;
4201
4202        videomodedev = getconfig("videomodedev", NULL);
4203
4204        if(videomodedev != NULL && value != NULL)
4205        {
4206                debug(100, "set %s to %s", videomodedev, value);
4207                ret = writesys(videomodedev, value, 0);
4208                if(ret == 0 && flag == 0) addconfig("av_videomode", value);
4209                return ret;
4210        }
4211
4212        return 0;
4213}
4214
4215//flag 0 = hdmi
4216//flag 1 = scart
4217int setcolorformat(char* value, int flag)
4218{
4219        char* colorformatdev;
4220        int ret = 0;
4221
4222        colorformatdev = getconfig("colorformatdev", NULL);
4223
4224        if(colorformatdev != NULL && value != NULL)
4225        {
4226                debug(100, "set %s to %s", colorformatdev, value);
4227                ret = writesys(colorformatdev, value, 0);
4228                if(ret == 0)
4229                {
4230                        if(flag == 0)
4231                                addconfig("av_colorformat", value);
4232                        else
4233                                addconfig("av_colorformatscart", value);
4234                }
4235                return ret;
4236        }
4237
4238        return 0;
4239}
4240
4241char* getcolorformat(int line)
4242{
4243        char *colorformatdev = NULL;
4244        char *value = NULL;
4245
4246        colorformatdev = getconfig("colorformatdev", NULL);
4247
4248        if(colorformatdev == NULL)
4249        {
4250                err("NULL detect");
4251                return NULL;
4252        }
4253
4254        value = readsys(colorformatdev, line);
4255        if(value == NULL)
4256        {
4257                err("NULL detect");
4258                return NULL;
4259        }
4260
4261        return value;
4262}
4263
4264int setaudiosource(char* value)
4265{
4266        char* audiosourcedev;
4267        int ret = 1;
4268
4269        audiosourcedev = getconfig("audiosourcedev", NULL);
4270
4271        if(audiosourcedev != NULL && value != NULL)
4272        {
4273                debug(100, "set %s to %s", audiosourcedev, value);
4274                ret = writesys(audiosourcedev, value, 0);
4275                if(ret == 0) addconfig("av_audiosource", value);
4276                return ret;
4277        }
4278
4279        return 0;
4280}
4281
4282char* getaudiosource()
4283{
4284        char *audiosourcedev = NULL;
4285        char *value = NULL;
4286
4287        audiosourcedev = getconfig("audiosourcedev", NULL);
4288
4289        if(audiosourcedev == NULL)
4290        {
4291                err("NULL detect");
4292                return NULL;
4293        }
4294
4295        value = readsys(audiosourcedev, 1);
4296        if(value == NULL)
4297        {
4298                err("NULL detect");
4299                return NULL;
4300        }
4301
4302        return value;
4303}
4304
4305char* getsataswitch()
4306{
4307        char *sataswitchdev = NULL;
4308        char *value = NULL;
4309
4310        sataswitchdev = getconfig("sataswitchdev", NULL);
4311
4312        if(sataswitchdev == NULL)
4313        {
4314                err("NULL detect");
4315                return NULL;
4316        }
4317
4318        value = readsys(sataswitchdev, 1);
4319        if(value == NULL)
4320        {
4321                err("NULL detect");
4322                return NULL;
4323        }
4324
4325        return value;
4326}
4327
4328int setsataswitch(char* value)
4329{
4330        char* sataswitchdev;
4331        int ret = 1;
4332
4333        sataswitchdev = getconfig("sataswitchdev", NULL);
4334
4335        if(sataswitchdev != NULL && value != NULL)
4336        {
4337                debug(100, "set %s to %s", sataswitchdev, value);
4338                ret = writesys(sataswitchdev, value, 0);
4339                return ret;
4340        }
4341
4342        return 0;
4343}
4344
4345int setprogress(value)
4346{
4347        char *progressdev;
4348
4349        progressdev = getconfig("progressdev", NULL);
4350
4351        if(progressdev != NULL)
4352        {
4353                debug(100, "set %s to %d",progressdev, value);
4354                return writesysint(progressdev, value, 0);
4355        }
4356
4357        return 0;
4358}
4359
4360int setmute(int value)
4361{
4362        char* mutedev;
4363        int tmpvol, ret = 0;
4364
4365        //don't set mute 2x
4366        if(value == 1 && status.mute == 1) return 0;
4367
4368//      printf("mute value: %d\n", value);
4369
4370        if(value == 2)
4371        {
4372                tmpvol = getvol();
4373                tmpvol = tmpvol * 50 / 100;
4374                status.mute = value;
4375                setvol(tmpvol);
4376        }
4377        else
4378        {
4379                mutedev = getconfig("mutedev", NULL);
4380
4381                if(mutedev != NULL)
4382                {
4383                        debug(100, "set %s to %d", mutedev, value);
4384                        //if(status.volautochangevalue != 0 && value == 0) setvol(getvol());
4385                        ret = writesysint(mutedev, value, 0);
4386                        if(ret == 0) status.mute = value;
4387                        if(status.volautochangevalue != 0 && value == 0) setvol(getvol());
4388//                      if(value == 1)
4389//                      {
4390//                              printf("mute\n");
4391//                              system("amixer -c 1 set HDMI mute &");
4392//                              system("amixer -c 1 set Analog mute &");
4393//                              system("amixer -c 1 set SPDIF mute &");
4394//                              sleep(1);
4395//                      }
4396//                      else
4397//                      {
4398//                              printf("unmute\n");
4399//                              system("amixer -c 1 set HDMI unmute &");
4400//                              system("amixer -c 1 set Analog unmute &");
4401//                              system("amixer -c 1 set SPDIF unmute &");
4402//                      }
4403
4404                        return ret;
4405                }
4406        }
4407        return 0;
4408}
4409
4410int setvol(int value)
4411{
4412        char* voldev;
4413        int ret = 0, tmpvol = value;
4414
4415        voldev = getconfig("voldev", NULL);
4416       
4417        if(voldev != NULL)
4418        {
4419                if(value > 100) value = 100;
4420                if(value < 0) value = 0;
4421                if(status.volautochangevalue != 0 && value != 0)
4422                {
4423                        if(status.volautochange == 0)
4424                                value = value - (status.volautochangevalue * value / 100);
4425                }
4426                value = 63 - value * 63 / 100;
4427                debug(100, "set %s to %d", voldev, value);
4428                ret = 0;
4429                if(status.mute == 1)
4430                        status.volmute = value;
4431                else
4432                {
4433                        status.volmute = -1;
4434                        ret = writesysint(voldev, value, 0);
4435
4436#ifdef MIPSEL
4437                        struct dvbdev *audionode = NULL;
4438                        int openaudio = 0;
4439       
4440                        if(ret == 0 && status.aktservice != NULL)
4441                        {
4442                                if(status.aktservice->audiodev == NULL)
4443                                {
4444                                        audionode = audioopen(0); //we must open the audio device for change volume in external player
4445                                        openaudio = 1;
4446                                }
4447                                else
4448                                        audionode = status.aktservice->audiodev;
4449               
4450                                if(ret == 0 && audionode != NULL)
4451                                        ret = setmixer(audionode, value, value);
4452                               
4453                                if(openaudio == 1)
4454                                        audioclose(audionode, -1);
4455                        }
4456#else
4457                        if(ret == 0 && status.aktservice != NULL)
4458                                ret = setmixer(status.aktservice->audiodev, value, value);
4459#endif
4460                }
4461                if(ret == 0 && status.mute != 2) addconfigint("vol", tmpvol);
4462                return ret;
4463        }
4464
4465        return 0;
4466}
4467
4468int getvol()
4469{
4470        char *voldev = NULL;
4471        char *value = NULL;
4472        int tmpvol = -1;
4473
4474        voldev = getconfig("voldev", NULL);
4475
4476        if(voldev == NULL)
4477        {
4478                err("NULL detect");
4479                return 0;
4480        }
4481        if(status.volmute == -1)
4482                value = readsys(voldev, 1);
4483        else
4484                tmpvol = status.volmute;
4485        if(value == NULL && tmpvol == -1)
4486        {
4487                err("NULL detect");
4488                return 0;
4489        }
4490        if(status.volmute == -1)
4491                tmpvol = atoi(value);
4492        free(value);
4493        tmpvol = 100 - tmpvol * 100 / 63;
4494        if(status.volautochangevalue != 0)
4495        {
4496                if(status.volautochange == 0 && status.volautochangevalue < 100)
4497                        tmpvol = tmpvol + ((tmpvol * status.volautochangevalue) / (100 - status.volautochangevalue));
4498        }
4499        return tmpvol;
4500}
4501
4502void setdebuglevel()
4503{
4504        debug_level = getconfigint("debuglevel", NULL);
4505        debug(0, "set debug level to %d", debug_level);
4506}
4507
4508char* getxmlentry(char *line, char *searchstr)
4509{
4510        char *buf = NULL, *buf1 = NULL, *buf2 = NULL;
4511
4512        buf = ostrstr(line, searchstr);
4513        if(buf == NULL)
4514                return NULL;
4515
4516        buf = buf + strlen(searchstr);
4517        if(buf[0] == '"')
4518        {
4519                buf = buf + 1;
4520                buf2 = strchr(buf, '"');
4521                if(buf2 == NULL)
4522                {
4523                        err("strchr returns NULL");
4524                        return NULL;
4525                }
4526                buf1 = strndup(buf, buf2 - buf);
4527                if(buf1 == NULL)
4528                {
4529                        err("strndup failed");
4530                        return NULL;
4531                }
4532        }
4533        else
4534        {
4535                buf2 = strchr(buf, ' ');
4536                if(buf2 == NULL)
4537                {
4538                        buf2 = ostrstr(buf, "/>");
4539                        if(buf2 == NULL)
4540                        {
4541                                buf2 = strchr(buf, '>');
4542                                if(buf2 == NULL)
4543                                {
4544                                        err("strchr returns NULL");
4545                                        return NULL;
4546                                }
4547                        }
4548                }
4549                buf1 = strndup(buf, buf2 - buf);
4550                if(buf1 == NULL)
4551                {
4552                        err("strndup failed");
4553                        return NULL;
4554                }
4555        }
4556
4557        return buf1;
4558}
4559
4560char* readbintomem(const char* filename, size_t size)
4561{
4562        FILE *fd = NULL;
4563        char *fileline = NULL;
4564
4565        fileline = calloc(1, size + 1);
4566        if(fileline == NULL)
4567        {
4568                err("no mem");
4569                return NULL;
4570        }
4571
4572        fd = fopen(filename, "rb");
4573        if(fd == NULL)
4574        {
4575                perr("can't open %s", filename);
4576                free(fileline);
4577                return NULL;
4578        }
4579
4580        fread(fileline, size, 1, fd);
4581
4582        fclose(fd);
4583        return fileline;
4584}
4585
4586char* readfiletomem(const char* filename, int flag)
4587{
4588        FILE *fd = NULL;
4589        char *fileline = NULL, *buf = NULL, *tmpbuf = NULL;
4590        int bufsize = 0, bufoldsize = 0;
4591
4592        fileline = malloc(MINMALLOC);
4593        if(fileline == NULL)
4594        {
4595                err("no mem");
4596                return NULL;
4597        }
4598
4599        fd = fopen(filename, "r");
4600        if(fd == NULL)
4601        {
4602                perr("can't open %s", filename);
4603                free(fileline);
4604                return NULL;
4605        }
4606
4607        while(fgets(fileline, MINMALLOC, fd) != NULL)
4608        {
4609                if(flag == 1)
4610                        if(fileline[0] == '#' || fileline[0] == '\n')
4611                                continue;
4612
4613                bufoldsize = bufsize;
4614                bufsize += strlen(fileline);
4615                tmpbuf = buf;   buf = realloc(buf, bufsize + 1);
4616                if(buf == NULL)
4617                {
4618                        err("no mem");
4619                        free(fileline);
4620                        free(tmpbuf);
4621                        fclose(fd);
4622                        return NULL;
4623                }
4624
4625                sprintf(buf + bufoldsize, "%s", fileline);
4626        }
4627
4628        free(fileline);
4629        fclose(fd);
4630        return buf;
4631}
4632
4633char* readeittomem(const char* filename)
4634{
4635        unsigned char byte;
4636        FILE *fil = NULL;
4637        char *zeichen = NULL, *buf = NULL, *buf1 = NULL, *tmpbuf1 = NULL;
4638        int buf1size = 0, buf1oldsize = 0;
4639        int Beschreibung;
4640        int len;
4641
4642        zeichen = malloc(255);
4643        if(zeichen == NULL)
4644        {
4645                err("no mem");
4646                return NULL;
4647        }
4648        buf = malloc(255);
4649        if(buf == NULL)
4650        {
4651                free(zeichen);
4652                err("no mem");
4653                return NULL;
4654        }
4655
4656        fil = fopen(filename, "r");
4657        if(fil == NULL)
4658        {
4659                err("can't open %s", filename);
4660                free(zeichen);
4661                free(buf);
4662                return NULL;
4663        }
4664        Beschreibung = 0;
4665        fseek(fil, 12, SEEK_SET); //ersten 12 Byte nicht relevant
4666        while(!feof(fil))
4667        {
4668                byte = fgetc(fil);
4669
4670                if(byte == 0x4D)
4671                {
4672                        fseek(fil, 4,SEEK_CUR);
4673                        byte = fgetc(fil);
4674                        len = byte + 0;
4675                        byte = fgetc(fil);
4676                        fgets(zeichen, len, fil);
4677                        if(byte != 0x05)
4678                                sprintf(buf, "%c%s\n", byte, zeichen);
4679                        else
4680                                sprintf(buf, "%s\n", zeichen);
4681
4682                        buf1oldsize = buf1size;
4683                        buf1size += strlen(buf);
4684                        tmpbuf1 = buf1; buf1 = realloc(buf1, buf1size + 1);
4685                        if(buf1 == NULL)
4686                        {
4687                                err("no mem");
4688                                free(zeichen);
4689                                free(buf);
4690                                free(tmpbuf1);
4691                                fclose(fil);
4692                                return NULL;
4693                        }
4694                        sprintf(buf1 + buf1oldsize, "%s", buf);
4695
4696                        //printf("T %s\n", zeichen);
4697                        byte = fgetc(fil);
4698                        len = byte + 0;
4699                        byte = fgetc(fil);
4700                        fgets(zeichen, len, fil);
4701                        if(byte != 0x05)
4702                                sprintf(buf,"%c%s\n\n", byte, zeichen);
4703                        else
4704                                sprintf(buf,"%s\n\n", zeichen);
4705                               
4706                        buf1oldsize = buf1size;
4707                        buf1size += strlen(buf);
4708                        tmpbuf1 = buf1; buf1 = realloc(buf1, buf1size + 1);
4709                        if(buf1 == NULL)
4710                        {
4711                                err("no mem");
4712                                free(zeichen);
4713                                free(buf);
4714                                free(tmpbuf1);
4715                                fclose(fil);
4716                                return NULL;
4717                        }
4718                        sprintf(buf1 + buf1oldsize, "%s", buf);
4719
4720                }
4721                else if(byte == 0x4E)
4722                {
4723                        fseek(fil, 6, SEEK_CUR);
4724                        byte = fgetc(fil);
4725                        len = byte;
4726                        byte = fgetc(fil);
4727                        fgets(zeichen, len, fil);
4728                        if(Beschreibung == 0)
4729                        {
4730                                if(byte != 0x05)
4731                                        sprintf(buf, "%c%s", byte, zeichen);
4732                                else
4733                                        sprintf(buf, "%s", zeichen);
4734                                Beschreibung = 1;
4735                        }
4736                        else
4737                        {
4738                                if(byte != 0x05)
4739                                        sprintf(buf, "%c%s", byte, zeichen);
4740                                else
4741                                        sprintf(buf, "%s", zeichen);
4742                        }       
4743
4744                        buf1oldsize = buf1size;
4745                        buf1size += strlen(buf);
4746                        tmpbuf1 = buf1; buf1 = realloc(buf1, buf1size + 1);
4747                        if(buf1 == NULL)
4748                        {
4749                                err("no mem");
4750                                free(zeichen);
4751                                free(buf);
4752                                free(tmpbuf1);
4753                                fclose(fil);
4754                                return NULL;
4755                        }
4756                        sprintf(buf1 + buf1oldsize, "%s", buf);     
4757
4758                }
4759                else
4760                {
4761                        byte = fgetc(fil);
4762                        len= byte;
4763                        fgets(zeichen, len + 1, fil);
4764                } 
4765        }
4766        free(zeichen);
4767        free(buf);
4768        fclose(fil);
4769        return buf1;
4770}
4771
4772char* command(char* input)
4773{
4774        int maxlen = 0, pos = 0;
4775        char* tmpstr = NULL, *fileline = NULL;
4776        FILE *iopipe = NULL;
4777       
4778        if(input == NULL) return NULL;
4779
4780        fileline = malloc(MINMALLOC);
4781        if(fileline == NULL)
4782        {
4783                err("no mem");
4784                return NULL;
4785        }
4786
4787        if((iopipe = popen(input, "r")) == NULL)
4788        {
4789                free(fileline);
4790                return NULL;
4791        }
4792
4793        while(!feof(iopipe))
4794        {
4795                if(fgets(fileline, MINMALLOC, iopipe) != NULL)
4796                        ostrcatbig(&tmpstr, fileline, &maxlen, &pos);
4797        }
4798       
4799        if(pos > 0)
4800        {
4801                char* tmp = tmpstr;
4802                tmpstr = realloc(tmpstr, pos + 1);
4803                if(tmpstr == NULL)
4804                        tmpstr = tmp;
4805        }
4806
4807        free(fileline);
4808        pclose(iopipe);
4809        return tmpstr;
4810}
4811
4812char* string_tolower(char *str)
4813{
4814/*
4815        char *p1 = str;
4816
4817        if(str == NULL) return NULL;
4818
4819        while(*p1 != '\0')
4820                *p1++ = tolower(*p1);
4821       
4822        return str;
4823*/
4824        if(str == NULL) return NULL;
4825
4826        int i=0;
4827        while (str[i])
4828        {
4829                str[i] = tolower(str[i]);
4830                i++;
4831        }
4832        return str;
4833}
4834
4835char* string_toupper(char *str)
4836{
4837/*
4838        char *p1 = str;
4839
4840        if(str == NULL) return NULL;
4841
4842        while(*p1 != '\0')
4843                *p1++ = toupper(*p1);
4844       
4845*/
4846        if(str == NULL) return NULL;
4847
4848        int i=0;
4849        while (str[i])
4850        {
4851                str[i] = toupper(str[i]);
4852                i++;
4853        }
4854        return str;
4855}
4856
4857char* stringreplacecharonce(char *str, char c1, char c2)
4858{
4859        char *p1 = str;
4860
4861        if(str == NULL) return NULL;
4862
4863        while(*p1 != '\0')
4864        {
4865                if(*p1 == c1)
4866                {
4867                        *p1 = c2;
4868                        break;                 
4869                }                       
4870                p1++;
4871        }
4872
4873        return str;
4874}
4875
4876char* stringreplacechar(char *str, char c1, char c2)
4877{
4878        char *p1 = str;
4879
4880        if(str == NULL) return NULL;
4881
4882        while(*p1 != '\0')
4883        {
4884                if(*p1 == c1) *p1 = c2;
4885                p1++;
4886        }
4887
4888        return str;
4889}
4890
4891
4892char* string_removechar(char *str)
4893{
4894        char *p1 = str;
4895
4896        if(str == NULL) return NULL;
4897
4898        while(*p1 != '\0')
4899        {
4900                if(*p1 == '.') *p1 = ' ';
4901                else if(*p1 == '-') *p1 = ' ';
4902                else if(*p1 == '_') *p1 = ' ';
4903                else if(*p1 == '/') *p1 = ' ';
4904                p1++;
4905        }
4906
4907        return str;
4908}
4909
4910char* string_withchars2return(char *str)
4911{
4912        char *p1 = str;
4913
4914        if(str == NULL) return NULL;
4915
4916        while(*p1 != '\0')
4917        {
4918                if(*p1 == ' ') *p1 = '\n';
4919                p1++;
4920        }
4921
4922        return str;
4923}
4924
4925char* string_remove_whitechars(char *text)
4926{
4927        char *p1 = text, *p2 = text;
4928
4929        if(text == NULL) return NULL;
4930
4931        while(*p1 != '\0')
4932        {
4933                if(*p1 == ' ')
4934                        ++p1;
4935                else
4936                        *p2++ = *p1++;
4937        }
4938        *p2 = '\0';
4939
4940        return text;
4941}
4942
4943char* strstrip(char *text)
4944{
4945        char* tmpstr = text;
4946
4947        if(text == NULL) return NULL;
4948        int len = strlen(text);
4949
4950        while(isspace(tmpstr[len - 1])) tmpstr[--len] = '\0';
4951        while(*tmpstr && isspace(*tmpstr)) ++tmpstr, --len;
4952
4953        if(text != tmpstr) memmove(text, tmpstr, len + 1);
4954
4955        return text;
4956}
4957
4958char* string_strip_whitechars(char *text)
4959{
4960        char *p1 = text, *p2 = text;
4961
4962        if(text == NULL)
4963                return NULL;
4964
4965        while(*p1 != '\0')
4966        {
4967                if(*p1 == ' ' && *(p1 + 1) == ' ')
4968                        ++p1;
4969                else
4970                        *p2++ = *p1++;
4971        }
4972        *p2 = '\0';
4973
4974        return text;
4975}
4976
4977char* string_replace_all(char *search, char *replace, char *string, int free1)
4978{
4979        char* tmpstr = NULL;
4980        char* searchpos = NULL;
4981
4982        if(string == NULL || search == NULL)
4983        {
4984                tmpstr = ostrcat(tmpstr, string, 1, 0);
4985                if(free1 == 1) free(string);
4986                return tmpstr;
4987        }
4988
4989        searchpos = strstr(string, search);
4990        if(searchpos == NULL)
4991        {
4992                tmpstr = ostrcat(tmpstr, string, 1, 0);
4993                if(free1 == 1) free(string);
4994                return tmpstr;
4995        }
4996
4997        int count = 0;
4998        int stringlen = strlen(string);
4999        int searchlen = strlen(search);
5000        int replacelen = strlen(replace);
5001
5002        while(searchpos != NULL)
5003        {
5004                count++;
5005                searchpos = strstr(searchpos + searchlen, search);
5006        }
5007
5008        int len = stringlen - (searchlen * count) + (replacelen * count);
5009        tmpstr = calloc(1, len + 1);
5010        if(tmpstr == NULL)
5011        {
5012                err("no mem");
5013                tmpstr = ostrcat(tmpstr, string, 1, 0);
5014                if(free1 == 1) free(string);
5015                return tmpstr;
5016        }
5017
5018        len = 0;       
5019        char* str = string;
5020        char* tmp = tmpstr;
5021        searchpos = strstr(str, search);
5022        while(searchpos != NULL)
5023        {
5024                len = searchpos - str;
5025                memcpy(tmp, str, len);
5026                memcpy(tmp + len, replace, replacelen);
5027                tmp += len + replacelen;
5028                str += len + searchlen;
5029                searchpos = strstr(str, search);
5030        }
5031        memcpy(tmp, str, strlen(str));
5032
5033        if(free1 == 1) free(string);
5034
5035        return tmpstr;
5036}
5037
5038char* string_replace_remove_last_chars(char *search, char *replace, char *string, int free1)
5039{
5040        char* searchpos = NULL;
5041        char* tmpstr = NULL;
5042
5043        if(string == NULL || search == NULL)
5044        {
5045                tmpstr = ostrcat(tmpstr, string, 1, 0);
5046                if(free1 == 1) free(string);
5047                return tmpstr;
5048        }
5049
5050        searchpos = ostrstr(string, search);
5051
5052        if(searchpos == NULL)
5053        {
5054                tmpstr = ostrcat(tmpstr, string, 1, 0);
5055                if(free1 == 1) free(string);
5056                return tmpstr;
5057        }
5058
5059        tmpstr = strndup(string, searchpos - string);
5060        if(replace != NULL)
5061                tmpstr = ostrcat(tmpstr, replace, 1, 0);
5062
5063        if(free1 == 1) free(string);
5064
5065        return tmpstr;
5066}
5067
5068char* string_replace(char *search, char *replace, char *string, int free1)
5069{
5070        char* searchpos = NULL;
5071        char* tmpstr = NULL;
5072
5073        if(string == NULL || search == NULL)
5074        {
5075                tmpstr = ostrcat(tmpstr, string, 1, 0);
5076                if(free1 == 1) free(string);
5077                return tmpstr;
5078        }
5079
5080        searchpos = ostrstr(string, search);
5081
5082        if(searchpos == NULL)
5083        {
5084                tmpstr = ostrcat(tmpstr, string, 1, 0);
5085                if(free1 == 1) free(string);
5086                return tmpstr;
5087        }
5088
5089        tmpstr = strndup(string, searchpos - string);
5090        if(replace != NULL)
5091                tmpstr = ostrcat(tmpstr, replace, 1, 0);
5092        tmpstr = ostrcat(tmpstr, string + (searchpos - string) + strlen(search), 1, 0);
5093
5094        if(free1 == 1) free(string);
5095
5096        return tmpstr;
5097}
5098
5099//flag 0: search full str
5100//flag 1: search only end of string
5101char* ostrrstrcase(char* str, char* search, int len, int flag)
5102{
5103        int slen = 0;
5104        char* tmpstr = NULL;
5105
5106        if(str == NULL || search == NULL) return NULL;
5107
5108        if(len == -1) len = strlen(str);
5109        slen = strlen(search);
5110        if(slen > len) return NULL;
5111
5112        for(tmpstr = str + len - slen; tmpstr >= str; tmpstr--)
5113        {
5114                if(strncasecmp(tmpstr, search, slen) == 0)
5115                        return tmpstr;
5116                if(flag == 1) return NULL;
5117        }
5118
5119        return NULL;
5120}
5121
5122//flag 0: search full str
5123//flag 1: search only end of string
5124char* ostrrstr(char* str, char* search, int len, int flag)
5125{
5126        int slen = 0;
5127        char* tmpstr = NULL;
5128
5129        if(str == NULL || search == NULL) return NULL;
5130
5131        if(len == -1) len = strlen(str);
5132        slen = strlen(search);
5133        if(slen > len) return NULL;
5134
5135        for(tmpstr = str + len - slen; tmpstr >= str; tmpstr--)
5136        {
5137                if(strncmp(tmpstr, search, slen) == 0)
5138                        return tmpstr;
5139                if(flag == 1) return NULL;
5140        }
5141
5142        return NULL;
5143}
5144
5145char* ostrstr(char* str, char* search)
5146{
5147        char* ret = NULL;
5148
5149        if(str == NULL || search == NULL) return NULL;
5150        ret = strstr(str, search);
5151
5152        return ret;
5153}
5154
5155int file_exist(char* filename)
5156{
5157        if(access(filename, F_OK) == 0)
5158                return 1;
5159        else
5160                return 0;
5161}
5162
5163char* string_newline(char* str)
5164{
5165        if(str == NULL) return NULL;
5166
5167        int size = strlen(str);
5168
5169        if(str[size - 1] == '\n')
5170                str[size - 1] = '\0';
5171
5172        return str;
5173}
5174
5175char* string_quote(char* str)
5176{
5177        char* tmpstr = NULL;
5178
5179        tmpstr = ostrcat("\"", str, 0, 0);
5180        tmpstr = ostrcat(tmpstr, "\"", 1, 0);
5181
5182        return tmpstr;
5183}
5184
5185struct splitstr* strsplit(char *str, char *tok, int* count)
5186{
5187        char *tmpstr = NULL;
5188        struct splitstr *array = NULL, *tmparray = NULL;
5189        *count = 0;
5190
5191        if(str == NULL || tok == NULL)
5192                return NULL;
5193
5194        tmpstr = strtok(str, tok);
5195        while(tmpstr != NULL)
5196        {
5197                *count = *count + 1;
5198                tmparray = array; array = (struct splitstr*)realloc(array, sizeof(struct splitstr*) * (*count));
5199                if(array == NULL)
5200                {
5201                        err("no mem");
5202                        free(tmparray);
5203                        return NULL;
5204                }
5205               
5206                (&array[(*count) - 1])->part = tmpstr;
5207                tmpstr = strtok(NULL, tok);
5208        }
5209
5210        return array;
5211}
5212
5213char* string_shortname(char *tmpfilename, int mode)
5214{
5215        debug(50, "in %s", tmpfilename);
5216
5217//      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";
5218        char* str = NULL;
5219
5220        if(mode==1)
5221        {
5222                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";
5223                str = ostrcat(str, replacelist, 1, 0);
5224        }
5225        else if(mode==2)
5226        {
5227                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";
5228                str = ostrcat(str, replacelist, 1, 0);
5229        }
5230        else
5231        {
5232                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";
5233                str = ostrcat(str, replacelist, 1, 0);
5234        }
5235
5236        char* replace = NULL;
5237        struct splitstr* ret1 = NULL;
5238        int count = 0;
5239        int i = 0;
5240        ret1 = strsplit(str, " ", &count);
5241        int max = count - 1;
5242        int first = 1;
5243
5244        for(i = 0; i < max; i++)
5245        {
5246                struct splitstr* ret2 = NULL;
5247                int count2 = 0;
5248                int j = 0;
5249                char *tmpstr = NULL;
5250                tmpstr = ostrcat(tmpstr, tmpfilename, 1, 0);
5251                ret2 = strsplit(tmpstr, " ,.-_", &count2);
5252
5253                for(j = 0; j < count2; j++)
5254                {
5255                        if(j > 0)
5256                        {                                       
5257                                if(ostrcmp((&ret1[i])->part, (&ret2[j])->part) == 0)
5258                                {
5259                                        if(mode==1)
5260                                        {
5261                                                tmpfilename = string_replace((&ret2[j])->part, replace, tmpfilename, 1);
5262                                                continue;
5263                                        }
5264                                        else if(mode==2)
5265                                        {
5266                                                tmpfilename = string_replace_remove_last_chars((&ret2[j])->part, replace, tmpfilename, 1);
5267                                                //break;
5268                                                continue;
5269                                        }
5270                                        else
5271                                        {
5272                                                tmpfilename = string_replace((&ret2[j])->part, replace, tmpfilename, 1);
5273                                                continue;
5274                                        }
5275                                }
5276                                else if(first == 1 && mode == 2)
5277                                {
5278//                                      printf("zahl: %s\n", (&ret2[j])->part);
5279                                        int theCharacter = atoi((&ret2[j])->part);
5280                                        if(theCharacter != 0)
5281                                        {
5282//                                              printf("found zahl: %s\n", (&ret2[j])->part);
5283                                                if(theCharacter > 1800 && theCharacter < 2100)
5284                                                {
5285//                                                      printf("found year: %s\n", (&ret2[j])->part);
5286                                                        tmpfilename = string_replace_remove_last_chars((&ret2[j])->part, "", tmpfilename, 1);
5287                                                        break;
5288                                                }
5289                                        }
5290                                }                               
5291                        }
5292                }
5293                free(ret2); ret2 = NULL;
5294                first = 0;
5295                free(tmpstr), tmpstr = NULL;
5296        }
5297
5298        free(ret1); ret1 = NULL;
5299        free(replace); replace = NULL;
5300        free(str); str = NULL;
5301
5302        debug(50, "out %s", tmpfilename);
5303        return tmpfilename;
5304}
5305
5306char* get_uuid(char* device)
5307{
5308        debug(60, "in %s", device);
5309        char* cmd = NULL, *tmpstr = NULL;
5310       
5311        if(device == NULL) return NULL;
5312#ifdef MIPSEL           
5313        cmd = ostrcat(cmd, "blkid -w /dev/null -c /dev/null -s UUID /dev/", 1, 0);
5314#else
5315        cmd = ostrcat(cmd, "/bin/blkid -w /dev/null -c /dev/null -s UUID /dev/", 1, 0);
5316#endif
5317        cmd = ostrcat(cmd, device, 1, 0);
5318        cmd = ostrcat(cmd, " | cut -d'\"' -f2", 1, 0);
5319
5320        tmpstr = string_newline(command(cmd));
5321
5322        if(ostrcmp(string_newline(tmpstr), "") == 0)
5323        {
5324                free(tmpstr); tmpstr = NULL;
5325        }
5326
5327        debug(60, "out %s", cmd);
5328        free(cmd); cmd = NULL;
5329        return tmpstr;
5330}
5331
5332char* get_label(char* device)
5333{
5334        debug(60, "in %s", device);
5335        char* cmd = NULL, *tmpstr = NULL;
5336
5337        if(device == NULL) return NULL;
5338#ifdef MIPSEL
5339        cmd = ostrcat(cmd, "blkid -w /dev/null -c /dev/null -s LABEL /dev/", 1, 0);
5340#else
5341        cmd = ostrcat(cmd, "/bin/blkid -w /dev/null -c /dev/null -s LABEL /dev/", 1, 0);
5342#endif 
5343        cmd = ostrcat(cmd, device, 1, 0);
5344        cmd = ostrcat(cmd, " | cut -d'\"' -f2", 1, 0);
5345
5346        tmpstr = string_newline(command(cmd));
5347
5348        if(tmpstr == NULL)
5349                tmpstr = ostrcat(tmpstr, "NONLABEL", 1, 0);
5350
5351        if(ostrcmp(string_newline(tmpstr), "") == 0)
5352                tmpstr = ostrcat(tmpstr, "NONLABEL", 1, 0);
5353
5354        debug(60, "out %s", cmd);
5355        free(cmd); cmd = NULL;
5356        return tmpstr;
5357}
5358
5359char* get_filesystem(char* device)
5360{
5361        debug(60, "in %s", device);
5362        char* cmd = NULL, *tmpstr = NULL;
5363
5364        if(device == NULL) return NULL;
5365#ifdef MIPSEL
5366        cmd = ostrcat(cmd, "blkid -w /dev/null -c /dev/null -s TYPE /dev/", 1, 0);
5367#else
5368        cmd = ostrcat(cmd, "/bin/blkid -w /dev/null -c /dev/null -s TYPE /dev/", 1, 0);
5369#endif
5370        cmd = ostrcat(cmd, device, 1, 0);
5371        cmd = ostrcat(cmd, " | cut -d'\"' -f2", 1, 0);
5372
5373        tmpstr = string_newline(command(cmd));
5374
5375        if(tmpstr == NULL)
5376                tmpstr = ostrcat(tmpstr, "NONTYPE", 1, 0);
5377
5378        if(ostrcmp(string_newline(tmpstr), "") == 0)
5379                tmpstr = ostrcat(tmpstr, "NONTYPE", 1, 0);
5380
5381        debug(60, "out %s", cmd);
5382        free(cmd); cmd = NULL;
5383        return tmpstr;
5384}
5385
5386//flag 0: convert ip to 000.000.000.000
5387//flag 1: convert ip to 0.0.0.0
5388char* fixip(char* ipinput, int flag)
5389{
5390        debug(60, "in %s", ipinput);
5391        int ret = 0;
5392        char* ipout = NULL;
5393        unsigned char ip[4];
5394       
5395        ip[0] = 0;
5396        ip[1] = 0;
5397        ip[2] = 0;
5398        ip[3] = 0;
5399
5400        if(ipinput == NULL) return NULL;
5401        ret = sscanf(ipinput, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]);
5402        if(ret != 4) return NULL;
5403
5404        ipout = malloc(16);
5405        if(ipout == NULL)
5406        {
5407                err("no mem");
5408                return NULL;
5409        }
5410
5411        if(flag == 1)
5412                snprintf(ipout, 16, "%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]);
5413        else
5414                snprintf(ipout, 16, "%03d.%03d.%03d.%03d", ip[0], ip[1], ip[2], ip[3]);
5415
5416        return ipout;
5417}
5418
5419void setfanspeed(int speed, int aktion)
5420{
5421        char* speedWert = NULL;
5422        char* speedSet = NULL;
5423        int base = 0;
5424
5425        if(checkbox("UFS922") == 1)
5426                base = 100;
5427        else
5428                base = -15;
5429               
5430
5431        if(speed < 0)
5432        {
5433                if(speed == -1)
5434                        speedWert = getconfig("fanspeed", NULL);
5435                else
5436                        speedWert = getconfig("fanspeedstandby", NULL);
5437                if(speedWert == NULL)
5438                        speedSet = ostrcat(speedSet, oitoa(base + 70), 1, 1);
5439                else
5440                        speedSet = ostrcat(speedSet, speedWert, 1, 0);
5441        }
5442        else
5443        {
5444                if(speed == 0)
5445                        speedSet = ostrcat(speedSet, oitoa(base + 15), 1, 1);
5446                else if(speed == 25)
5447                        speedSet = ostrcat(speedSet, oitoa(base + 30), 1, 1);
5448                else if(speed == 50)
5449                        speedSet = ostrcat(speedSet, oitoa(base + 45), 1, 1);
5450                else if(speed == 75)
5451                        speedSet = ostrcat(speedSet, oitoa(base + 55), 1, 1);
5452                else
5453                        speedSet = ostrcat(speedSet, oitoa(base + 70), 1, 1);
5454        }
5455
5456        if(checkbox("UFS922") == 1)
5457                writesys("/proc/stb/fan/fan_ctrl", speedSet, 1);
5458        else
5459                writesys("/proc/stb/fp/fan_pwm", speedSet, 1);
5460
5461        if(aktion == 1)
5462                addconfig("fanspeed", speedSet);
5463        else if(aktion == 2)
5464                addconfig("fanspeedstandby", speedSet);
5465
5466        free(speedSet); speedSet=NULL;
5467}
5468
5469void setaktres()
5470{
5471        int m_width = 0;
5472        char* res = NULL;
5473        char* res_akt = NULL;
5474        char* res_sd = NULL;
5475        int count = 1;
5476        int sec = 0;
5477
5478        m_lock(&status.setaktresmutex, 23);
5479
5480        if(status.restimer == NULL)
5481                goto end;
5482
5483        sec = (int)status.restimer->param1;
5484
5485        if(sec > 0)
5486        {
5487                while(status.restimer->aktion == START && count <= (sec * 10))
5488                {
5489                        usleep(100000);
5490                        if(status.restimer->aktion != START)
5491                                goto end;
5492                        count++;
5493                }
5494        }
5495        if(status.restimer->aktion != START) goto end;
5496
5497        if(videoreadqwidth(status.aktservice->videodev) == 0)
5498        {
5499                if(status.restimer->aktion != START) goto end;
5500                m_width = status.videosize.w;
5501                if(m_width == 720)
5502                {
5503                        res_sd = getconfig("av_videomode_autores_sd", NULL);
5504                        if(res_sd == NULL)
5505                                res = ostrcat(res, "576i50", 1, 0);
5506                        else
5507                                res = ostrcat(res, res_sd, 1, 0);
5508                }
5509                else if (m_width == 1280)
5510                        res = ostrcat(res, "720p50", 1, 0);
5511                else if (m_width == 1920)
5512                        res = ostrcat(res, "1080i50", 1, 0);
5513                else
5514                        m_width = 0;
5515
5516                if(m_width > 0)
5517                {
5518                        if(status.restimer->aktion != START) goto end;
5519                        res_akt = getvideomode();
5520                        if(status.restimer->aktion != START) goto end;
5521                        if(ostrcmp(res_akt, res) != 0)
5522                        {
5523                                if(status.restimer->aktion != START) goto end;
5524                                setvideomode(res, 1);
5525                                changefbresolution(res, 1);
5526/*
5527                                if(status.restimer->aktion != START) goto end;
5528
5529                                count = 0;
5530                                while(status.restimer->aktion == START && count < 10)
5531                                {
5532                                        usleep(100000);
5533                                        if(status.restimer->aktion != START)
5534                                                goto end;
5535                                        count++;
5536                                }
5537
5538                                if(status.restimer->aktion != START) goto end;
5539*/
5540                                screenautores(res, 5, 0);
5541                        }
5542                }
5543        }
5544        else
5545        {
5546                if(status.restimer->aktion != START) goto end;
5547                textbox(_("Message"), _("ERROR cant read res"), _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 600, 200, 5, 0);
5548        }
5549
5550end:
5551        free(res); res = NULL;
5552        status.restimer = NULL;
5553        m_unlock(&status.setaktresmutex, 23);
5554        return;
5555}
5556
5557char* gettimestamp()
5558{
5559        char* timestamp = NULL;
5560        struct timeval numtime;
5561               
5562        gettimeofday(&numtime, 0);
5563        timestamp = ostrcat(timestamp, olutoa(numtime.tv_sec), 1, 1);
5564        timestamp = ostrcat(timestamp, olutoa(numtime.tv_usec), 1, 1);
5565
5566        return timestamp;
5567}
5568
5569char* string_decode(char* input, int flag)
5570{
5571        if(input == NULL) return input;
5572
5573        while(ostrstr(input, "\\u00") != NULL)
5574        {
5575                debug(210, "input: %s", input);
5576                input = string_replace("\\u00", "%", input, 1);
5577                debug(210, "input: %s", input);
5578        }
5579
5580        while(ostrstr(input, "&amp;") != NULL)
5581        {
5582                debug(210, "input: %s", input);
5583                input = string_replace("&amp;", "und", input, 1);
5584                debug(210, "input: %s", input);
5585        }
5586
5587        while(ostrstr(input, "&gt;") != NULL)
5588        {
5589                debug(210, "input: %s", input);
5590                input = string_replace("&gt;", ">", input, 1);
5591                debug(210, "input: %s", input);
5592        }
5593
5594        while(ostrstr(input, "&lt;") != NULL)
5595        {
5596                debug(210, "input: %s", input);
5597                input = string_replace("&lt;", "<", input, 1);
5598                debug(210, "input: %s", input);
5599        }
5600       
5601        while(ostrstr(input, "&quot;") != NULL)
5602        {
5603                debug(210, "input: %s", input);
5604                input = string_replace("&quot;", "\"", input, 1);
5605                debug(210, "input: %s", input);
5606        }
5607
5608        while(ostrstr(input, "&#x") != NULL)
5609        {
5610                debug(210, "out %s", input);
5611                input = string_replace("&#x", "%", input, 1);
5612                debug(210, "input: %s", input);
5613        }
5614       
5615        while(ostrstr(input, "&#") != NULL)
5616        {
5617                debug(210, "input: %s", input);
5618                input = string_replace("&#", "%", input, 1);
5619                debug(210, "input: %s", input);
5620        }
5621       
5622        if(flag == 1)
5623                htmldecode2(input, input);
5624        else
5625                htmldecode(input, input);
5626                       
5627        while(ostrstr(input, ";") != NULL)
5628        {
5629                debug(210, "input: %s", input);
5630                input = string_replace(";", NULL, input, 1);
5631                debug(210, "input: %s", input);
5632        }
5633
5634        return input;
5635}
5636
5637char* string_deltags(char* str)
5638{
5639        int i = 0, y = 0, len = 0;
5640
5641        if(str == NULL) return 0;
5642
5643        len = strlen(str);
5644
5645        int skip = 0;
5646        for(i = 0; i < len; i++)
5647        {
5648                if(str[i] == '<')
5649                        skip = 1;
5650                else if(str[i] == '>')
5651                        skip = 0;
5652
5653                if(skip == 0 && str[i] != '>')
5654                {
5655                        str[y] = str[i];
5656                        y++;
5657                }
5658        }
5659        str[y] = '\0';
5660
5661        return str;
5662}
5663
5664char* string_striptags(char* str)
5665{
5666        int i = 0, len = 0;
5667
5668        if(str == NULL) return 0;
5669       
5670        len = strlen(str);
5671
5672        int skip = 0;
5673        for(i = 0; i < len; i++)
5674        {
5675                if(str[i] == '<')
5676                        skip = 1;
5677                else if(str[i] == '>')
5678                {
5679                        skip = 0;
5680                        str[i] = ' ';
5681                }
5682                if(skip == 1)
5683                        str[i] = ' ';
5684        }       
5685
5686        return strstrip(str);
5687}
5688
5689char* string_resub(char* str, char* str2, char* input, int dir)
5690{
5691        char* tmpstr = NULL, *pos = NULL, *pos2 = NULL;
5692
5693        if(str == NULL || str2 == NULL || input == NULL) return NULL;
5694
5695        if(dir == 0)
5696        {
5697                pos = ostrstr(input, str);
5698                if(pos == NULL) return NULL;
5699                pos += strlen(str);
5700
5701                pos2 = ostrstr(pos, str2);
5702                if(pos2 == NULL) return NULL;
5703        }
5704        else
5705        {
5706                pos2 = ostrstr(input, str2);
5707                if(pos2 == NULL) return NULL;
5708
5709                pos = ostrrstr(input, str, pos2 - input, 0);
5710                if(pos == NULL) return NULL;
5711                pos += strlen(str);
5712        }
5713
5714        tmpstr = strndup(pos, pos2 - pos);
5715
5716        return strstrip(tmpstr);
5717}
5718
5719char* ostrstrcase(char* str, char* sub)
5720{
5721        size_t len = 0;
5722
5723        if(str == NULL || sub == NULL) return NULL;
5724
5725        len = strlen(sub);
5726        while(*str)
5727        {
5728                if(toupper(*str) == toupper(*sub) && strncasecmp(str, sub, len) == 0)
5729                        return str;     
5730                ++str;
5731        }
5732        return NULL;
5733}
5734
5735//flag 0: convert port to 00021
5736//flag 1: convert port to 21
5737char* fixport(char* input, int flag)
5738{
5739        char* tmpstr = NULL;
5740
5741        if(flag == 0)
5742        {
5743                int plen = strlen(input);
5744                if(plen < 5)
5745                {
5746                        int i;
5747                        for(i = 0; i < 5 - plen; i++)
5748                                tmpstr = ostrcat(tmpstr, "0", 1, 0);
5749                }
5750                tmpstr = ostrcat(tmpstr, input, 1, 0);         
5751        }
5752        else
5753        {
5754                while (*input && *input == '0')
5755                input++;
5756       
5757                tmpstr = ostrcat(tmpstr, input, 1, 0);         
5758        }
5759        return tmpstr;
5760}
5761
5762//flag 0: Mon > Montag
5763//flag 1: Mon > Mon
5764char* translate_time(char* input, int flag)
5765{
5766        char* tmpstr = NULL;
5767        if(input == NULL) return tmpstr;
5768        tmpstr = ostrcat(tmpstr, input, 1, 1); 
5769
5770        if(flag == 0)
5771        {
5772                tmpstr = string_replace_all("Mon", _("Monday"), tmpstr, 1);
5773                tmpstr = string_replace_all("Tue", _("Tuesday"), tmpstr, 1);
5774                tmpstr = string_replace_all("Wed", _("Wednesday"), tmpstr, 1);
5775                tmpstr = string_replace_all("Thu", _("Thursday"), tmpstr, 1);
5776                tmpstr = string_replace_all("Fri", _("Friday"), tmpstr, 1);
5777                tmpstr = string_replace_all("Sat", _("Saturday"), tmpstr, 1);
5778                tmpstr = string_replace_all("Sun", _("Sunday"), tmpstr, 1);
5779        }
5780        else
5781        {       
5782                tmpstr = string_replace("Mon", _("Mon"), tmpstr, 1);
5783                tmpstr = string_replace("Tue", _("Tue"), tmpstr, 1);
5784                tmpstr = string_replace("Wed", _("Wed"), tmpstr, 1);
5785                tmpstr = string_replace("Thu", _("Thu"), tmpstr, 1);
5786                tmpstr = string_replace("Fri", _("Fri"), tmpstr, 1);
5787                tmpstr = string_replace("Sat", _("Sat"), tmpstr, 1);
5788                tmpstr = string_replace("Sun", _("Sun"), tmpstr, 1);
5789        }
5790
5791        return tmpstr;
5792}
5793
5794char* gethypridtunerchoices(int dev)
5795{
5796        char *hypridtunerchoices = NULL;
5797        char *value = NULL;
5798        char *tmpstr = NULL;
5799        char *tmpstr1 = NULL;
5800        char *tmpstr2 = NULL;
5801        char *tmpstr3 = NULL;
5802        char* start = NULL;
5803
5804        hypridtunerchoices = getconfig("hypridtunerchoices", NULL);
5805
5806        if(hypridtunerchoices == NULL)
5807        {
5808                err("NULL detect");
5809                return NULL;
5810        }
5811
5812        tmpstr = readfiletomem(hypridtunerchoices, 1);
5813        if(tmpstr == NULL)
5814        {
5815                err("NULL detect");
5816                return NULL;
5817        }
5818
5819        start = ostrcat("NIM Socket ", oitoa(dev), 0, 0);
5820        start = ostrcat(start, ":", 1, 0);
5821
5822        tmpstr1 = string_resub(start, "I2C_Device", tmpstr, 0);
5823        tmpstr2 = string_resub("Mode ", ":", tmpstr1, 0);
5824        tmpstr3 = oregex(".*Mode ([0-9]{1}):.*", tmpstr1);
5825
5826        if(tmpstr2 != NULL)
5827                value = ostrcat(tmpstr2, "\n", 0, 0);
5828        if(tmpstr3 != NULL)
5829                value = ostrcat(value, tmpstr3, 1, 0);
5830
5831        free(start), start = NULL;
5832        free(tmpstr), tmpstr = NULL;
5833        free(tmpstr1), tmpstr1 = NULL;
5834        free(tmpstr2), tmpstr2 = NULL;
5835        free(tmpstr3), tmpstr3 = NULL;
5836
5837        return value;
5838}
5839
5840char* gethypridtunerchoicesvalue(int dev)
5841{
5842        char* hypridtunerchoices = NULL, *value = NULL, *tmpstr = NULL, *tmpstr1 = NULL, *tmpstr2 = NULL, *hypridlist = NULL, *start = NULL;
5843
5844        hypridtunerchoices = getconfig("hypridtunerchoices", NULL);
5845
5846        if(hypridtunerchoices == NULL)
5847        {
5848                err("NULL detect");
5849                return NULL;
5850        }
5851
5852        tmpstr = readfiletomem(hypridtunerchoices, 1);
5853        if(tmpstr == NULL)
5854        {
5855                err("NULL detect");
5856                return NULL;
5857        }
5858
5859        start = ostrcat("NIM Socket ", oitoa(dev), 0, 0);
5860        start = ostrcat(start, ":", 1, 0);
5861        tmpstr1 = string_resub(start, "I2C_Device", tmpstr, 0);
5862        free(start), start = NULL;
5863
5864        hypridlist = gethypridtunerchoices(dev);
5865
5866        int count = 0;
5867        int i = 0;
5868        struct splitstr* ret1 = NULL;
5869        ret1 = strsplit(hypridlist, "\n", &count);
5870
5871        if(ret1 != NULL)
5872        {
5873                int max = count;
5874                for(i = 0; i < max; i++)
5875                {
5876                        start = ostrcat("Mode ", ret1[i].part, 0, 0);
5877                        start = ostrcat(start, ":", 1, 0);
5878                        tmpstr2 = string_resub(start, "\n", tmpstr1, 0);
5879               
5880                        if(i > 0)
5881                                value = ostrcat(value, "\n", 1, 0);
5882               
5883                        if(tmpstr2 != NULL)
5884                                value = ostrcat(value, tmpstr2, 1, 0);
5885                               
5886                        free(tmpstr2), tmpstr2 = NULL;
5887                        free(start), start = NULL;
5888                }
5889        }
5890        free(ret1), ret1 = NULL;                       
5891        free(tmpstr1), tmpstr1 = NULL;
5892        free(hypridlist), hypridlist = NULL;
5893
5894        return value;
5895}
5896
5897char* gethypridtunerchoicesvaluename(int dev, char* hyprid)
5898{
5899        char* hypridtunerchoices = NULL, *value = NULL, *tmpstr = NULL, *tmpstr1 = NULL, *tmpstr2 = NULL, *start = NULL;
5900
5901        hypridtunerchoices = getconfig("hypridtunerchoices", NULL);
5902
5903        if(hypridtunerchoices == NULL)
5904        {
5905                err("NULL detect");
5906                return NULL;
5907        }
5908
5909        tmpstr = readfiletomem(hypridtunerchoices, 1);
5910        if(tmpstr == NULL)
5911        {
5912                err("NULL detect");
5913                return NULL;
5914        }
5915
5916        start = ostrcat("NIM Socket ", oitoa(dev), 0, 0);
5917        start = ostrcat(start, ":", 1, 0);
5918        tmpstr1 = string_resub(start, "I2C_Device", tmpstr, 0);
5919        free(start), start = NULL;
5920
5921        start = ostrcat("Mode ", hyprid, 0, 0);
5922        start = ostrcat(start, ":", 1, 0);
5923
5924        tmpstr2 = string_resub(start, "\n", tmpstr1, 0);
5925       
5926        if(tmpstr2 != NULL)
5927                value = ostrcat(value, tmpstr2, 1, 0);
5928
5929        free(tmpstr1), tmpstr1 = NULL;
5930        free(tmpstr2), tmpstr2 = NULL;
5931        free(start), start = NULL;
5932
5933        return value;
5934}
5935
5936int sethypridtuner(int dev, char* value)
5937{
5938        char* buf = NULL, *hypridtuner = NULL, *tmpstr = NULL;
5939        int ret = 0;
5940
5941        hypridtuner = getconfig("hypridtuner", NULL);
5942       
5943        if(hypridtuner != NULL)
5944        {
5945                buf = malloc(MINMALLOC);
5946                if(buf == NULL)
5947                {
5948                        err("no memory");
5949                        return 0;
5950                }
5951        }
5952
5953        sprintf(buf, hypridtuner, dev);
5954        if(buf != NULL)
5955        {
5956                printf("set %s to %s\n", buf, value);
5957                ret = writesys(buf, value, 0);
5958                free(tmpstr); tmpstr = NULL;
5959                return ret;
5960        }
5961
5962        return 0;
5963}
5964
5965int phpkit_userauth(char* link, char* user, char* pass)
5966{
5967        debug(99, "phpkit user: %s", user);
5968        debug(99, "phpkit pass: %s", pass);     
5969        debug(99, "phpkit url: %s", link);
5970
5971        int skip = 0;
5972        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;
5973
5974        tmplink = ostrcat(link, NULL, 0, 0);
5975
5976        tmphost = string_replace("http://", "", tmplink, 0);
5977        free(tmplink) , tmplink = NULL;
5978
5979        if(tmphost != NULL)
5980                pos = strchr(tmphost, '/');
5981        if(pos != NULL)
5982        {
5983                pos[0] = '\0';
5984                path = pos + 1;
5985        }
5986
5987        tmppath = ostrcat("/", path, 0, 0);
5988
5989        send = ostrcat(send, "GET ", 1, 0);
5990        send = ostrcat(send, tmppath, 1, 0);
5991        send = ostrcat(send, " HTTP/1.1\r\nHost: ", 1, 0);     
5992        send = ostrcat(send, tmphost, 1, 0);
5993        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);       
5994        debug(99, "#############################################################################################################");
5995        debug(99, "send1: %s", send);
5996        debug(99, "#############################################################################################################");
5997
5998        tmpstr = gethttpreal(tmphost, tmppath, 80, NULL, NULL, NULL, 0, send, NULL, 5000, 1);
5999        debug(99, "tmpstr: %s", tmpstr);
6000
6001        free(send), send = NULL;
6002        free(tmpstr), tmpstr = NULL;
6003
6004        if(user == NULL || pass == NULL || link == NULL) return 1;
6005
6006        hash = ostrcat("login=1&user=", user, 0, 0);
6007        hash = ostrcat(hash, "&userpw=", 1, 0);
6008        hash = ostrcat(hash, pass, 1, 1);
6009        hashlen = oitoa(strlen(hash));
6010       
6011        send = ostrcat(send, "POST ", 1, 0);
6012        send = ostrcat(send, tmppath, 1, 0);
6013        send = ostrcat(send, " HTTP/1.1\r\nContent-Length: ", 1, 0);
6014        send = ostrcat(send, hashlen, 1, 0);
6015        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);
6016        send = ostrcat(send, tmphost, 1, 0);
6017        send = ostrcat(send, "\r\nCookie: pageredir=", 1, 0);
6018        send = ostrcat(send, cookie1, 1, 0);
6019        send = ostrcat(send, "; PHPSESSID=", 1, 0);     
6020        send = ostrcat(send, cookie2, 1, 0);
6021        send = ostrcat(send, "\r\nContent-Type: application/x-www-form-urlencoded\r\n\r\n", 1, 0);     
6022        send = ostrcat(send, hash, 1, 0);
6023        free(hash); hash = NULL;
6024        free(hashlen); hashlen = NULL;
6025
6026        debug(99, "#############################################################################################################");
6027        debug(99, "send1: %s", send);
6028        debug(99, "#############################################################################################################");
6029
6030        tmpstr = gethttpreal(tmphost, tmppath, 80, NULL, NULL, NULL, 0, send, NULL, 5000, 1);
6031        debug(99, "tmpstr: %s", tmpstr);
6032
6033        free(cookie1); cookie1 = NULL;
6034        free(cookie2); cookie2 = NULL;
6035        free(tmphost); tmphost = NULL;
6036        free(send); send = NULL;
6037        free(ip); ip = NULL;
6038        if(tmpstr == NULL) skip = 1;
6039        free(tmpstr); tmpstr = NULL;
6040        if(skip == 1) return 1;
6041        return 0;
6042}
6043
6044void changetunername(struct skin* tunernode, int adapter, int devnr, char* name, char* fehyprid)
6045{
6046        char* tmpnr = NULL, *tmpstr = NULL;
6047        tmpnr = oitoa(adapter);
6048        tmpstr = ostrcat(_("Tuner "), tmpnr, 0, 1);
6049        tmpstr = ostrcat(tmpstr, "/", 1, 0);
6050        tmpnr = oitoa(devnr);
6051        tmpstr = ostrcat(tmpstr, tmpnr, 1, 1);
6052        tmpstr = ostrcat(tmpstr, ": ", 1, 0);
6053        tmpstr = ostrcat(tmpstr, name, 1, 0);
6054        if(fehyprid != NULL)
6055        {
6056                tmpstr = ostrcat(tmpstr, " (", 1, 0);
6057                tmpstr = ostrcat(tmpstr, _("Multituner adjustable"), 1, 0);
6058                tmpstr = ostrcat(tmpstr, ")", 1, 0);
6059        }
6060        changetext(tunernode, tmpstr);
6061        free(tmpstr); tmpstr = NULL;
6062}
6063
6064char* gethypridtunername(int dev, char* hyprid)
6065{
6066        char* hypridtunerchoices = NULL, *value = NULL, *tmpstr = NULL, *tmpstr1 = NULL, *tmpstr2 = NULL, *start = NULL;
6067
6068        hypridtunerchoices = getconfig("hypridtunerchoices", NULL);
6069
6070        if(hypridtunerchoices == NULL)
6071        {
6072                err("NULL detect");
6073                return NULL;
6074        }
6075
6076        tmpstr = readfiletomem(hypridtunerchoices, 1);
6077        if(tmpstr == NULL)
6078        {
6079                err("NULL detect");
6080                return NULL;
6081        }
6082
6083        start = ostrcat("NIM Socket ", oitoa(dev), 0, 0);
6084        start = ostrcat(start, ":", 1, 0);
6085        tmpstr1 = string_resub(start, "I2C_Device", tmpstr, 0);
6086        free(start), start = NULL;
6087
6088        tmpstr2 = string_resub("Name: ", "\n", tmpstr1, 0);
6089       
6090        if(tmpstr2 != NULL)
6091                value = ostrcat(value, tmpstr2, 1, 0);
6092
6093        free(tmpstr1), tmpstr1 = NULL;
6094        free(tmpstr2), tmpstr2 = NULL;
6095        free(start), start = NULL;
6096
6097        return value;
6098}
6099
6100void convertsettings()
6101{
6102        struct menulist* mlist = NULL, *mbox = NULL;
6103        struct skin* load = getscreen("loading");
6104        int flag = 0, ret = 0;
6105        char* tmpstr = NULL;
6106
6107        addmenulist(&mlist, "Create Transponder (Sat)", _("Create Transponder (Sat)"), NULL, 0, 0);
6108        addmenulist(&mlist, "Create Transponder (Cable)", _("Create Transponder (Cable)"), NULL, 0, 0);
6109        addmenulist(&mlist, "Create Transponder (Terrestrial)", _("Create Transponder (Terrestrial)"), NULL, 0, 0);
6110        addmenulist(&mlist, "Create Transponder (All)", _("Create Transponder (All)"), NULL, 0, 0);
6111
6112        mbox = menulistbox(mlist, "createsettings", _("Select Your Serach Modus"), NULL, NULL, NULL, 1, 0);
6113        if(mbox != NULL) tmpstr = mbox->name;
6114
6115        if(ostrcmp(tmpstr, "Create Transponder (Sat)") == 0)
6116                flag = 0;
6117        else if(ostrcmp(tmpstr, "Create Transponder (Cable)") == 0)
6118                flag = 1;
6119        else if(ostrcmp(tmpstr, "Create Transponder (Terrestrial)") == 0)
6120                flag = 2;
6121        else if(ostrcmp(tmpstr, "Create Transponder (All)") == 0)
6122                flag = 3;
6123        else
6124        {
6125                freemenulist(mlist, 1); mlist = NULL;
6126                return;
6127        }
6128
6129        freemenulist(mlist, 1); mlist = NULL;
6130
6131        drawscreen(load, 0, 0);
6132
6133        if(flag == 0)
6134        {
6135                ret = converte2settings(0);
6136                if(ret == 0) return;
6137                system("cp -a /tmp/satellites.sat /mnt/settings/satellites");
6138                system("cp -a /tmp/transponder.sat /mnt/settings/transponder");
6139        }
6140        else if(flag == 1)
6141        {
6142                ret = converte2settings(1);
6143                if(ret == 0) return;
6144                system("cp -a /tmp/satellites.cable /mnt/settings/satellites");
6145                system("cp -a /tmp/transponder.cable /mnt/settings/transponder");
6146        }
6147        else if(flag == 2)
6148        {
6149                converte2settings(2);
6150                system("cp -a /tmp/satellites.ter /mnt/settings/satellites");
6151                system("cp -a /tmp/transponder.ter /mnt/settings/transponder");
6152        }
6153        else if(flag == 3)
6154        {
6155                ret = converte2settings(0);
6156                if(ret == 0) return;
6157                ret = converte2settings(1);
6158                if(ret == 0) return;
6159                ret = converte2settings(2);
6160                if(ret == 0) return;
6161                system("cp -a /tmp/satellites.sat /mnt/settings/satellites");
6162                system("cp -a /tmp/transponder.sat /mnt/settings/transponder");
6163
6164                system("cat /tmp/satellites.cable >> /mnt/settings/satellites");
6165                system("cat /tmp/transponder.cable >> /mnt/settings/transponder");
6166
6167                system("cat /tmp/satellites.ter >> /mnt/settings/satellites");
6168                system("cat /tmp/transponder.ter >> /mnt/settings/transponder");
6169        }
6170
6171//      free(tmpstr), tmpstr = NULL;
6172        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)
6173        {       
6174                //write only config file
6175                system("sync");
6176                writeallconfig(3);
6177                oshutdown(2,2);
6178                system("init 6");
6179        }
6180}
6181
6182// flag 0 = sat
6183// flag 1 = cable
6184// flag 2 = ter
6185int converte2settings(int flag)
6186{
6187        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;
6188        int incount = 0;
6189       
6190        if(flag == 0)
6191        {
6192                system("rm -rf /tmp/transponder.sat");
6193                system("rm -rf /tmp/satellites.sat");
6194                system("cp -a /var/etc/tuxbox/satellites.xml /tmp/satellites.xml");
6195                start = ostrcat("<sat ", NULL, 0, 0);
6196                end = ostrcat("</sat>", NULL, 0, 0);
6197                filename = ostrcat("/tmp/satellites.xml", NULL, 0, 0);
6198                path = ostrcat("/transponder/satellites.xml", NULL, 0, 0);
6199                transponderfile = ostrcat("/tmp/transponder.sat", NULL, 0, 0);
6200                satfile = ostrcat("/tmp/satellites.sat", NULL, 0, 0);
6201                fetype = ostrcat("0", NULL, 0, 0);
6202        }
6203        else if(flag == 1)
6204        {
6205                system("rm -rf /tmp/transponder.cable");
6206                system("rm -rf /tmp/satellites.cable");
6207                system("cp -a /var/etc/tuxbox/cables.xml /tmp/cables.xml");
6208                start = ostrcat("<cable ", NULL, 0, 0);
6209                end = ostrcat("</cable>", NULL, 0, 0);
6210                filename = ostrcat("/tmp/cables.xml", NULL, 0, 0);
6211                path = ostrcat("/transponder/cables.xml", NULL, 0, 0);
6212                transponderfile = ostrcat("/tmp/transponder.cable", NULL, 0, 0);
6213                satfile = ostrcat("/tmp/satellites.cable", NULL, 0, 0);
6214                fetype = ostrcat("1", NULL, 0, 0);
6215                incount = 4999;
6216        }
6217        else if(flag == 2)
6218        {
6219                system("rm -rf /tmp/transponder.ter");
6220                system("rm -rf /tmp/satellites.ter");
6221                system("cp -a /var/etc/tuxbox/terrestrial.xml /tmp/terrestrial.xml");
6222                start = ostrcat("<terrestrial ", NULL, 0, 0);
6223                end = ostrcat("</terrestrial>", NULL, 0, 0);
6224                filename = ostrcat("/tmp/terrestrial.xml", NULL, 0, 0);
6225                path = ostrcat("/transponder/terrestrial.xml", NULL, 0, 0);
6226                transponderfile = ostrcat("/tmp/transponder.ter", NULL, 0, 0);
6227                satfile = ostrcat("/tmp/satellites.ter", NULL, 0, 0);
6228                fetype = ostrcat("2", NULL, 0, 0);
6229                incount = 9999;
6230        }
6231
6232        if(!file_exist(filename))
6233                gethttp("atemio.dyndns.tv", path, 80, filename, HTTPAUTH, 5000, NULL, 0);
6234
6235        char* tmptext = NULL;
6236        tmptext = ostrcat(_("Error: Transponder Source file not found"), "\nfilename: ", 0, 0);
6237        tmptext = ostrcat(tmptext, transponderfile, 1, 0);
6238
6239        if(!file_exist(filename))
6240        {
6241                textbox(_("Message"), tmptext, _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 1000, 200, 0, 0);
6242                free(tmptext), tmptext = NULL;
6243                free(path), path = NULL;
6244                free(filename), filename = NULL;
6245                free(satfile), satfile = NULL;
6246                free(fetype), fetype = NULL;
6247                free(start), start = NULL;
6248                free(end), end = NULL;
6249                free(transponderfile), transponderfile = NULL;
6250                return 0;
6251        }
6252        free(tmptext), tmptext = NULL;
6253
6254        buf = readfiletomem(filename, 1);
6255        if(buf == NULL)
6256        {
6257                printf("buf: %s\n", buf);       
6258                tmptext = ostrcat(_("Error: Transponder Source file no data"), "\nfilename: ", 0, 0);
6259                tmptext = ostrcat(tmptext, transponderfile, 1, 0);
6260                textbox(_("Message"), tmptext, _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 1000, 200, 0, 0);
6261                free(tmptext), tmptext = NULL;
6262                free(path), path = NULL;
6263                free(filename), filename = NULL;
6264                free(satfile), satfile = NULL;
6265                free(fetype), fetype = NULL;
6266                free(start), start = NULL;
6267                free(end), end = NULL;
6268                free(transponderfile), transponderfile = NULL;
6269                return 0;
6270        }
6271       
6272//      writesys("/tmp/convert.log", buf, 1);
6273
6274        while(ostrstr(buf, start) != NULL)
6275        {
6276                incount++;
6277                tmpstr = string_resub(start, end, buf, 0);
6278                tmpstr1 = ostrcat(tmpstr, NULL, 0, 0);
6279               
6280                //printf("name: %s\n", getxmlentry(ret1[i].part, "name="));
6281                //printf("position: %s\n", getxmlentry(ret1[i].part, "position="));
6282               
6283                name = getxmlentry(tmpstr, "name=");
6284                if(flag == 0)
6285                        orbitalpos = getxmlentry(tmpstr, "position=");
6286                else
6287                        orbitalpos = ostrcat(oitoa(incount), NULL, 1, 0);
6288                       
6289                flags = getxmlentry(tmpstr, "flags=");
6290                //string_decode(name, 0);
6291                name = string_replace_all("&amp;", "und", name, 1);
6292       
6293                line = ostrcat(line, name, 1, 0); // name
6294                line = ostrcat(line, "#", 1, 0);
6295//              line = ostrcat(line, flags, 1, 0); // flag
6296// 0 for all sat/ter/cab ???
6297                line = ostrcat(line, "0", 1, 0);
6298                line = ostrcat(line, "#", 1, 0);
6299                line = ostrcat(line, orbitalpos, 1, 0); // orbitalpos
6300                line = ostrcat(line, "#", 1, 0);
6301                line = ostrcat(line, fetype, 1, 0); // fetype
6302                printf("%s: %s\n", satfile, line);
6303                writesys(satfile, line, 3);
6304                free(line), line = NULL;
6305                               
6306                int count = 0;
6307
6308                int i = 0;
6309                struct splitstr* ret1 = NULL;
6310                ret1 = strsplit(tmpstr1, "\n", &count);
6311                if(ret1 != NULL)
6312                {
6313                        int max = count;
6314                        for(i = 0; i < max; i++)
6315                        {
6316                                if(i == 0) continue;
6317                                line = ostrcat(line, "0", 1, 0); // id
6318                                line = ostrcat(line, "#", 1, 0);
6319
6320                                line = ostrcat(line, fetype, 1, 0); // fetype
6321                                line = ostrcat(line, "#", 1, 0);
6322
6323                                if(ostrstr((ret1[i]).part, "frequency=") != NULL)
6324                                        line = ostrcat(line, getxmlentry(ret1[i].part, "frequency="), 1, 0); // frequency
6325                                else
6326                                        line = ostrcat(line, "-1", 1, 0);
6327                                line = ostrcat(line, "#", 1, 0);
6328
6329                                if(ostrstr((ret1[i]).part, "polarization=") != NULL)
6330                                        line = ostrcat(line, getxmlentry(ret1[i].part, "polarization="), 1, 0); // polarization
6331                                else
6332                                        line = ostrcat(line, "-1", 1, 0); // polarization
6333
6334                                line = ostrcat(line, "#", 1, 0);
6335                                if(orbitalpos != NULL)
6336                                        line = ostrcat(line, orbitalpos, 1, 0); // orbitalpos
6337                                else
6338                                        line = ostrcat(line, "-1", 1, 0); // orbitalpos
6339                                line = ostrcat(line, "#", 1, 0);
6340
6341                                if(ostrstr((ret1[i]).part, "symbol_rate=") != NULL)
6342                                        line = ostrcat(line, getxmlentry(ret1[i].part, "symbol_rate="), 1, 0); // symbolrate
6343                                else
6344                                        line = ostrcat(line, "-1", 1, 0);
6345                                line = ostrcat(line, "#", 1, 0);
6346
6347                                if(ostrstr((ret1[i]).part, "modulation=") != NULL)
6348                                        line = ostrcat(line, getxmlentry(ret1[i].part, "modulation="), 1, 0); // modulation
6349                                else
6350                                {
6351                                        if(flag == 2)
6352                                                line = ostrcat(line, "3", 1, 0);
6353                                        else
6354                                                line = ostrcat(line, "0", 1, 0);
6355                                }
6356                                line = ostrcat(line, "#", 1, 0);
6357
6358                                if(ostrstr((ret1[i]).part, "fec_inner=") != NULL)
6359                                        line = ostrcat(line, getxmlentry(ret1[i].part, "fec_inner="), 1, 0); // fec
6360                                else
6361                                {
6362                                        if(flag == 2)
6363                                                line = ostrcat(line, "5", 1, 0);
6364                                        else
6365                                                line = ostrcat(line, "0", 1, 0);
6366                                }
6367                                line = ostrcat(line, "#", 1, 0);
6368
6369                                if(checkbox("UFS910") == 1)
6370                                        line = ostrcat(line, "1", 1, 0); // pilot
6371                                else
6372                                        line = ostrcat(line, "2", 1, 0); // pilot
6373                                line = ostrcat(line, "#", 1, 0);
6374
6375                                if(checkbox("UFS910") == 1)
6376                                        line = ostrcat(line, "0", 1, 0); // rolloff
6377                                else
6378                                        line = ostrcat(line, "3", 1, 0); // rolloff
6379                                line = ostrcat(line, "#", 1, 0);
6380
6381                                line = ostrcat(line, "2", 1, 0); // inversion
6382                                line = ostrcat(line, "#", 1, 0);
6383
6384                                if(ostrstr((ret1[i]).part, "system=") != NULL)
6385                                        line = ostrcat(line, getxmlentry(ret1[i].part, "system="), 1, 0); // system
6386                                else
6387                                        line = ostrcat(line, "0", 1, 0); // system
6388                                line = ostrcat(line, "\n", 1, 0);
6389                        }
6390                }
6391       
6392                tmpstr2 = ostrcat(start, tmpstr, 0, 0);
6393       
6394                buf = string_replace(tmpstr2, NULL, buf, 1);
6395       
6396        //      outfile = ostrcat("/tmp/convert.", oitoa(incount), 0, 1);
6397        //      outfile = ostrcat(outfile, ".log", 1, 0);       
6398        //      writesys(outfile, buf, 2);
6399        //      writesys("/tmp/convert.log", buf, 3);
6400       
6401                writesys(transponderfile, line, 2);
6402                free(line), line = NULL;
6403       
6404                free(tmpstr), tmpstr = NULL;   
6405                free(tmpstr1), tmpstr1 = NULL;
6406                free(tmpstr2), tmpstr2 = NULL;
6407                free(ret1), ret1 = NULL;
6408                free(name), name = NULL;
6409                free(orbitalpos), orbitalpos = NULL;
6410                free(flags), flags = NULL;
6411                free(outfile), outfile = NULL; 
6412        }
6413
6414        free(path), path = NULL;
6415        free(filename), filename = NULL;
6416        free(satfile), satfile = NULL;
6417        free(transponderfile), transponderfile = NULL;
6418               
6419        free(buf), buf = NULL;
6420        free(start), start = NULL;
6421        free(end), end = NULL;
6422        free(fetype), fetype = NULL;
6423                       
6424        return 1;
6425}
6426
6427void createfav()
6428{
6429        struct skin* load = getscreen("loading");
6430        drawscreen(load, 0, 0);
6431
6432        system("rm -rf /mnt/settings/bouquets*");
6433        system("cp -a /etc/titan.restore/mnt/settings/bouquets* /mnt/settings");
6434
6435        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)
6436        {
6437                //write only config file
6438                system("sync");
6439                writeallconfig(3);
6440                oshutdown(2,2);
6441                system("init 6");
6442        }
6443}
6444
6445char* system_infos(int mode)
6446{
6447        char* tmpstr = NULL, *tmpstr1 = NULL, *tmpstr2 = NULL;
6448
6449        if(mode == 0)
6450        {
6451                tmpstr1 = ostrcat("Date = ", "", 0, 0);
6452                tmpstr1 = ostrcat(tmpstr1, gettime(NULL, "%d %B %Y"), 1, 1);
6453                tmpstr = ostrcat(tmpstr, tmpstr1, 1, 1);
6454
6455                tmpstr1 = ostrcat("\nTime = ", "", 0, 0);
6456                tmpstr1 = ostrcat(tmpstr1, gettime(NULL, "%H:%M:%S"), 1, 1);
6457                tmpstr = ostrcat(tmpstr, tmpstr1, 1, 1);
6458               
6459                tmpstr1 = ostrcat("\nUptime = ", "", 0, 0);
6460                tmpstr2 = command("uptime");
6461                if(tmpstr2 != NULL) tmpstr2 = strtok(tmpstr2, ",");
6462                tmpstr1 = ostrcat(tmpstr1, tmpstr2, 1, 1);
6463                tmpstr = ostrcat(tmpstr, tmpstr1, 1, 1);
6464
6465                tmpstr1 = ostrcat("\nBoxtype = ", "", 0, 0);
6466                tmpstr2 = string_toupper(command("cat /etc/model"));
6467                tmpstr1 = ostrcat(tmpstr1, tmpstr2, 1, 1);
6468                tmpstr = ostrcat(tmpstr, tmpstr1, 1, 1);
6469
6470                tmpstr1 = ostrcat("\nLoad = ", "", 0, 0);
6471                tmpstr2 = command("cat /proc/loadavg");
6472                tmpstr1 = ostrcat(tmpstr1, tmpstr2, 1, 1);
6473                tmpstr = ostrcat(tmpstr, tmpstr1, 1, 1);
6474        }
6475
6476        if(mode == 1)
6477        {
6478                system("ls /media/usb/* >/dev/null");
6479                system("ls /media/net/* >/dev/null");
6480                system("ls /var/swap/* >/dev/null");
6481                system("ls /mnt/swapextension/* >/dev/null");
6482                system("ls /var/backup/* >/dev/null");
6483                system("ls /media/hdd/* >/dev/null");
6484                tmpstr = command("df -h");
6485        }
6486
6487        if(mode == 2)
6488                tmpstr = command("cat /proc/version");
6489
6490        if(mode == 3)
6491        {
6492                system("ls /media/usb/* >/dev/null");
6493                system("ls /media/net/* >/dev/null");
6494                system("ls /var/swap/* >/dev/null");
6495                system("ls /mnt/swapextension/* >/dev/null");
6496                system("ls /var/backup/* >/dev/null");
6497                system("ls /media/hdd/* >/dev/null");
6498                tmpstr = command("mount");
6499        }
6500
6501        if(mode == 4)
6502        {
6503                tmpstr1 = command("ifconfig");
6504                tmpstr2 = command("route -n");
6505                tmpstr = ostrcat(tmpstr1, tmpstr2, 1, 1);
6506        }
6507
6508        if(mode == 5)
6509                tmpstr = command("free");
6510
6511        return tmpstr;
6512}
6513
6514char* system_infos_sysinfo(int mode)
6515{
6516        char* tmpstr = NULL;
6517
6518        if(mode == 0)
6519                tmpstr = command("cat /proc/cpuinfo | sed 's/\t\t/\t/'");
6520        else if(mode == 1)
6521                tmpstr = command("cat /proc/meminfo");
6522        else if(mode == 2)
6523                tmpstr = command("cat /proc/mtd");
6524        else if(mode == 3)
6525                tmpstr = command("cat /proc/modules");
6526        else if(mode == 4)
6527                tmpstr = command("cat /proc/devices");
6528        else if(mode == 5)
6529        {
6530                char* tmpstr1 = NULL, **tmpstr2 = NULL, **tmpstr3 = NULL;
6531                int i = 0, ii = 0;
6532                char* swap[] = {"Name: ", "Type: ", "Size: ", "Used: ", "Prio: "};
6533
6534                tmpstr1 = command("cat /proc/swaps | sed 's/\t/ /g; s/[ ]* / /g'");
6535                tmpstr2 = str_split(tmpstr1, "\n");
6536                if(tmpstr2 != NULL)
6537                {
6538                        free(tmpstr2[0]); tmpstr2[0] = NULL;
6539
6540                        for(i = 1; tmpstr2[i] != NULL; i++)
6541                        {
6542                                tmpstr3 = str_split(tmpstr2[i], " ");
6543                                if(tmpstr3 != NULL)
6544                                {
6545
6546                                        for(ii = 0; tmpstr3[ii] != NULL; ii++)
6547                                        {
6548                                                tmpstr = ostrcat(tmpstr, swap[ii], 1, 0);
6549                                                tmpstr = ostrcat(tmpstr, tmpstr3[ii], 1, 1);
6550                                                tmpstr = ostrcat(tmpstr, "\n", 1, 0);
6551                                        }
6552                                }
6553
6554                                tmpstr = ostrcat(tmpstr, "\n", 1, 0);
6555                                free(tmpstr2[i]); tmpstr2[i] = NULL;
6556                                free(tmpstr3); tmpstr3 = NULL;
6557                        }
6558                }
6559
6560                free(tmpstr3); tmpstr3 = NULL;
6561                free(tmpstr2); tmpstr2 = NULL;
6562                free(tmpstr1); tmpstr1 = NULL;
6563        }
6564        else if(mode == 6)
6565                tmpstr = command("top -b -n1");
6566        else if(mode == 7)
6567                tmpstr = command("ps");
6568        else if(mode == 8)
6569                tmpstr = command("cat /proc/bus/usb/devices");
6570
6571        return tmpstr;
6572}
6573
6574char* system_logs(int mode)
6575{
6576        char* tmpstr = NULL, *tmpstr1 = NULL, *tmpstr2 = NULL, *tmpstr3 = NULL, *path = NULL, *boxversion = NULL;
6577
6578        if(mode == 0)
6579        {
6580                tmpstr1 = readfiletomem("/etc/motd", 0);
6581                if(tmpstr1 != NULL) tmpstr2 = strstr(tmpstr1, "wElc0me");
6582                tmpstr3 = readfiletomem("/etc/imageinfo", 0);
6583                if(tmpstr2 == NULL)
6584                        tmpstr = ostrcat(tmpstr3, NULL, 1, 0);
6585                else
6586                        tmpstr = ostrcat(tmpstr2, tmpstr3, 1, 1);
6587        }
6588        else if(mode == 1)
6589        {
6590                if(isfile("/etc/model") == 0) return NULL;
6591                boxversion = string_tolower(readsys("/etc/model", 1));
6592
6593//              if(file_exist("/etc/.beta"))
6594                        path = ostrcat(path, "/svn/image-beta/changelog.", 1, 0);
6595//              else
6596//                      path = ostrcat(path, "/svn/image/changelog.", 1, 0);
6597
6598                path = ostrcat(path, boxversion, 1, 0);
6599                path = ostrcat(path, ".titan", 1, 0);
6600
6601//              if(file_exist("/etc/.beta"))
6602                        tmpstr1 = gethttp("beta.dyndns.tv", path, 80, NULL, HTTPAUTH, 5000, NULL, 0);
6603//              else
6604//                      tmpstr1 = gethttp("atemio.dyndns.tv", path, 80, NULL, HTTPAUTH, 5000, NULL, 0);
6605
6606                tmpstr = readfromlinetoline(tmpstr1, 37, 537, 1);
6607        }
6608        else if(mode == 2)
6609        {
6610//              if(file_exist("/etc/.beta"))
6611                        path = ostrcat(path, "/svn/image-beta/changelog.git", 1, 0);
6612//              else
6613//                      path = ostrcat(path, "/svn/image/changelog.git", 1, 0);
6614
6615//              if(file_exist("/etc/.beta"))
6616                        tmpstr1 = gethttp("beta.dyndns.tv", path, 80, NULL, HTTPAUTH, 5000, NULL, 0);
6617//              else
6618//                      tmpstr1 = gethttp("atemio.dyndns.tv", path, 80, NULL, HTTPAUTH, 5000, NULL, 0);
6619
6620                tmpstr = readfromlinetoline(tmpstr1, 0, 500, 1);
6621        }
6622        else if(mode == 3)
6623        {
6624                tmpstr = readfiletomem(getconfig("tracelog", NULL), 0);
6625        }
6626
6627        free(path), path = NULL;
6628        free(boxversion), boxversion = NULL;
6629//      free(tmpstr1), tmpstr1 = NULL;
6630//      free(tmpstr2), tmpstr2 = NULL;
6631//      free(tmpstr3), tmpstr3 = NULL;
6632
6633        return tmpstr;
6634}
6635
6636char* getabout()
6637{
6638        char* text = NULL, *tmpstr = NULL, *imgversion = NULL;
6639        struct dvbdev* dvbnode = dvbdev;
6640
6641        if(isfile(getconfig("imagenamefile", NULL))     != 0)
6642                imgversion = readsys(getconfig("imagenamefile", NULL), 1);
6643        else
6644                imgversion = ostrcat("unknown", NULL, 0, 0);
6645
6646        text = ostrcat(_("Image"), ": ", 0, 0);
6647        text = ostrcat(text, PROGNAME, 1, 0);
6648        text = ostrcat(text, "\n", 1, 0);
6649        text = ostrcat(text, _("Version"), 1, 0);
6650        text = ostrcat(text, ": ", 1, 0);
6651        text = ostrcat(text, OVERSION, 1, 0);
6652        text = ostrcat(text, "\n", 1, 0);
6653        text = ostrcat(text, _("Installed:"), 1, 0);
6654        text = ostrcat(text, " ", 1, 0);
6655        text = ostrcat(text, imgversion, 1, 1);
6656        text = ostrcat(text, "\n", 1, 0);
6657        text = ostrcat(text, _("Copyright"), 1, 0);
6658        text = ostrcat(text, ": ", 1, 0);
6659        text = ostrcat(text, COPYRIGHT, 1, 0);
6660        text = ostrcat(text, "\n\n", 1, 0);
6661               
6662        while(dvbnode != NULL)
6663        {
6664                if(dvbnode->type == FRONTENDDEV && dvbnode->feinfo != NULL)
6665                {
6666                        text = ostrcat(text, _("Tuner"), 1, 0);
6667                        text = ostrcat(text, ": ", 1, 0);
6668                        if(dvbnode->feinfo->name != NULL)
6669                                text = ostrcat(text, dvbnode->feinfo->name, 1, 0);
6670                        else
6671                                text = ostrcat(text, _("unknown"), 1, 0);
6672                        text = ostrcat(text, "\n", 1, 0);
6673                        text = ostrcat(text, _("Tunertype"), 1, 0);
6674                        text = ostrcat(text, ": ", 1, 0);
6675
6676                        tmpstr = fegettypestr(dvbnode);
6677                        text = ostrcat(text, tmpstr, 1, 1);
6678                        text = ostrcat(text, "\n\n", 1, 0);
6679                }
6680                dvbnode = dvbnode->next;
6681        }
6682       
6683        char* flog = readfiletomem("/tmp/.firmware.log", 0);
6684        text = ostrcat(text, flog, 1, 1);
6685
6686        return text;
6687}
6688
6689char* getimgnamereal()
6690{
6691        char* tmpstr = NULL;
6692
6693        tmpstr = readfiletomem(getconfig("imagenamefile", NULL), 1);
6694
6695        return tmpstr;
6696}
6697
6698#endif
Note: See TracBrowser for help on using the repository browser.