source: titan/titan/epgscan.h @ 14868

Last change on this file since 14868 was 14868, checked in by nit, 12 years ago

[titan] fix segfault in epgscan

File size: 8.2 KB
Line 
1#ifndef EPGSCAN_H
2#define EPGSCAN_H
3
4void epgscanlistclearscantime()
5{
6        struct epgscanlist *node = epgscanlist;
7
8        while(node != NULL)
9        {
10                node->scantime = 0;
11                node = node->next;
12        }
13}
14
15struct epgscanlist* getepgscanlistbytransponder(unsigned long transponderid)
16{
17        //debug(1000, "in");
18        struct epgscanlist *node = epgscanlist;
19
20        while(node != NULL)
21        {
22                if(node->transponderid == transponderid)
23                {
24                        //debug(1000, "out");
25                        return node;
26                }
27
28                node = node->next;
29        }
30        debug(100, "epgscanlist not found (transponderid=%lu)", transponderid);
31        return NULL;
32}
33
34void epgscanlistthread(struct stimerthread* self)
35{
36        struct epgscanlist* node = epgscanlist, *tmpepgscannode = NULL;
37        struct dvbdev* fenode = NULL;
38        struct channel* chnode = NULL;
39        char* tmpstr = NULL;
40        FILE* fd = NULL;
41       
42        debug(400, "epgscan thread start");
43       
44        fd = fopen(EPGSCANLOG, "w");
45        if(fd == NULL)
46        {
47                perr("can't open %s", EPGSCANLOG);
48        }
49        else
50        {
51                tmpstr = ostrcat("epgscan thread start ", gettime(NULL, "%d-%m-%Y %H:%M"), 0, 1);
52                if(tmpstr != NULL) fprintf(fd, "%s\n", tmpstr);
53                free(tmpstr); tmpstr = NULL;
54        }
55
56        if(status.standby == 0)
57        {
58                if(status.epglistmode == 0 || status.epglistmode == 2)
59                {
60                        if(fd != NULL) fprintf(fd, "epgscan not configured to scan idle tuner\n");
61                        goto end;
62                }
63        }
64        else if(getconfig("epg_refreshtime", NULL) == NULL)
65        {
66                if(fd != NULL) fprintf(fd, "epgscan not configured to scan in standby\n");
67                goto end;
68        }
69
70        //wait for right time
71        while(self->aktion != STOP && time(NULL) < 1072224000) // 01.01.2004
72                usleep(1 * 1000000);
73               
74        debug(400, "epgscan time ok");
75        if(fd != NULL) fprintf(fd, "epgscan time ok\n");
76
77        while(node != NULL && self->aktion != STOP)
78        {
79                chnode = getchannel(node->serviceid, node->transponderid);
80                if(chnode == NULL || chnode == status.aktservice->channel)
81                {
82                        debug(400, "epgscan channel not found sid=%d, tid=%lu", node->serviceid, node->transponderid);
83                        if(fd != NULL) fprintf(fd, "epgscan channel not found sid=%d, tid=%lu\n", node->serviceid, node->transponderid);
84                        node = node->next;
85                        continue;
86                }
87
88                tmpepgscannode = getepgscanlistbytransponder(node->transponderid);
89                if(tmpepgscannode != NULL && tmpepgscannode->scantime != 0)
90                {
91                        debug(400, "epgscan transponer already scanned tid=%lu", node->transponderid);
92                        if(fd != NULL) fprintf(fd, "epgscan transponer already scanned tid=%lu\n", node->transponderid);
93                        node = node->next;
94                        continue;
95                }
96
97                if(status.standby > 0)
98                        fenode = fegetfree(chnode->transponder, 0, NULL);
99                else
100                        fenode = fegetfree(chnode->transponder, 2, NULL);
101                if(fenode == NULL || (status.standby == 0 && fenode == status.aktservice->fedev))
102                {
103                        debug(400, "epgscan no free frontend found");
104                        if(fd != NULL) fprintf(fd, "epgscan no free frontend found\n");
105                        node = node->next;
106                        continue;
107                }
108
109                if(fenode->felock == 0)
110                {
111                        //frontend tune
112                        if(fenode->feinfo->type == FE_QPSK)
113                        {
114                                feset(fenode, chnode->transponder);
115                                fetunedvbs(fenode, chnode->transponder);
116                        }
117                        else if(fenode->feinfo->type == FE_QAM)
118                                fetunedvbc(fenode, chnode->transponder);
119                        else if(fenode->feinfo->type == FE_OFDM)
120                                fetunedvbt(fenode, chnode->transponder);
121                        else
122                        {
123                                debug(400, "epgscan unknown frontend");
124                                if(fd != NULL) fprintf(fd, "epgscan unknown frontend\n");
125                                node = node->next;
126                                continue;
127                        }
128
129                        int festatus = fewait(fenode);
130                        if(festatus != 0)
131                        {
132                                debug(400, "epgscan frontend tune failed");
133                                if(fd != NULL) fprintf(fd, "epgscan frontend tune failed\n");
134                                node = node->next;
135                                continue;
136                        }
137
138                        if(chnode->name != NULL)
139                        {
140                                debug(400, "epgscan scanning channel=%s, sid=%d, tid=%lu, frontend=%s", chnode->name, chnode->serviceid, chnode->transponderid, fenode->feshortname);
141                                if(fd != NULL) fprintf(fd, "epgscan scanning channel=%s, sid=%d, tid=%lu, frontend=%s\n", chnode->name, chnode->serviceid, chnode->transponderid, fenode->feshortname);
142                        }
143                        readeit(self, chnode, fenode, 1);
144                        node->scantime = time(NULL);
145                }
146                else
147                {
148                        debug(400, "epgscan frontend locked frontend=%s", fenode->feshortname);
149                        if(fd != NULL) fprintf(fd, "epgscan frontend locked frontend=%s\n", fenode->feshortname);
150                }
151
152                node = node->next;
153        }
154       
155        //write only epg
156        writeallconfig(2);
157
158end:
159        status.epgscanlistthread = NULL;
160        epgscanlistclearscantime();
161       
162        if(fd != NULL)
163        {
164                fprintf(fd, "epgscan thread end\n");
165                fclose(fd);
166        }
167        debug(400, "epgscan thread end");
168}
169
170struct epgscanlist* addepgscanlist(char *line, int count, struct epgscanlist* last)
171{
172        //debug(1000, "in");
173        struct epgscanlist *newnode = NULL, *prev = NULL, *node = epgscanlist;
174        int ret = 0;
175
176        newnode = (struct epgscanlist*)malloc(sizeof(struct epgscanlist));     
177        if(newnode == NULL)
178        {
179                err("no memory");
180                return NULL;
181        }
182
183        memset(newnode, 0, sizeof(struct epgscanlist));
184        status.writeepgscanlist = 1;
185
186        ret = sscanf(line, "%d#%lu", &newnode->serviceid, &newnode->transponderid);
187        if(ret != 2)
188        {
189                if(count > 0)
190                {
191                        err("epgscanlist line %d not ok", count);
192                }
193                else
194                {
195                        err("add epgscanlist");
196                }
197                free(newnode);
198                return NULL;
199        }
200
201        if(getchannel(newnode->serviceid, newnode->transponderid) == NULL)
202        {
203                err("epgscanlist line %d not ok (channel not found)", count);
204                free(newnode);
205                return NULL;
206        }
207
208        if(last == NULL)
209        {
210                while(node != NULL)
211                {
212                        prev = node;
213                        node = node->next;
214                }
215        }
216        else
217        {
218                prev = last;
219                node = last->next;
220        }
221
222        if(prev == NULL)
223                epgscanlist = newnode;
224        else
225        {
226                prev->next = newnode;
227                newnode->prev = prev;
228        }
229        newnode->next = node;
230        if(node != NULL) node->prev = newnode;
231
232        //debug(1000, "out");
233        return newnode;
234}
235
236int readepgscanlist(const char* filename)
237{
238        debug(1000, "in");
239        FILE *fd = NULL;
240        char *fileline = NULL;
241        int linecount = 0;
242        struct epgscanlist* last = NULL, *tmplast = NULL;
243
244        fileline = malloc(MINMALLOC);
245        if(fileline == NULL)
246        {
247                err("no memory");
248                return 1;
249        }
250
251        fd = fopen(filename, "r");
252        if(fd == NULL)
253        {
254                perr("can't open %s", filename);
255                free(fileline);
256                return 1;
257        }
258
259        while(fgets(fileline, MINMALLOC, fd) != NULL)
260        {
261                if(fileline[0] == '#' || fileline[0] == '\n')
262                        continue;
263                if(fileline[strlen(fileline) - 1] == '\n')
264                        fileline[strlen(fileline) - 1] = '\0';
265                if(fileline[strlen(fileline) - 1] == '\r')
266                        fileline[strlen(fileline) - 1] = '\0';
267
268                linecount++;
269
270                if(last == NULL) last = tmplast;
271                last = addepgscanlist(fileline, linecount, last);
272                if(last != NULL) tmplast = last;
273        }
274
275        status.writeepgscanlist = 0;
276        free(fileline);
277        fclose(fd);
278        return 0;
279}
280
281int delepgscanlist(int serviceid, unsigned long transponderid)
282{
283        debug(1000, "in");
284        int ret = 1;
285        struct epgscanlist *node = epgscanlist, *prev = epgscanlist;
286
287        while(node != NULL)
288        {
289                if(node->serviceid == serviceid && node->transponderid == transponderid)
290                {
291                        status.writeepgscanlist = 1;
292                        if(node == epgscanlist)
293                        {
294                                epgscanlist = node->next;
295                                if(epgscanlist != NULL)
296                                        epgscanlist->prev = NULL;
297                        }
298                        else
299                        {
300                                prev->next = node->next;
301                                if(node->next != NULL)
302                                        node->next->prev = prev;
303                        }
304
305                        free(node);
306                        node = NULL;
307                        ret = 0;
308                        break;
309                }
310
311                prev = node;
312                node = node->next;
313        }
314        debug(1000, "out");
315        return ret;
316}
317
318struct epgscanlist* getepgscanlist(int serviceid, unsigned long transponderid)
319{
320        //debug(1000, "in");
321        struct epgscanlist *node = epgscanlist;
322
323        while(node != NULL)
324        {
325                if(node->serviceid == serviceid && node->transponderid == transponderid)
326                {
327                        //debug(1000, "out");
328                        return node;
329                }
330
331                node = node->next;
332        }
333        debug(100, "epgscanlist not found (serviceid=%d, transponderid=%lu)", serviceid, transponderid);
334        return NULL;
335}
336
337void freeepgscanlist()
338{
339        debug(1000, "in");
340        struct epgscanlist *node = epgscanlist, *prev = epgscanlist;
341
342        while(node != NULL)
343        {
344                prev = node;
345                node = node->next;
346                if(prev != NULL)
347                        delepgscanlist(prev->serviceid, prev->transponderid);
348        }
349        debug(1000, "out");
350}
351
352int writeepgscanlist(const char *filename)
353{
354        debug(1000, "in");
355        FILE *fd = NULL;
356        struct epgscanlist *node = epgscanlist;
357        int ret = 0;
358
359        fd = fopen(filename, "w");
360        if(fd == NULL)
361        {
362                perr("can't open %s", filename);
363                return 1;
364        }
365
366        while(node != NULL)
367        {
368                ret = fprintf(fd, "%d#%lu\n", node->serviceid, node->transponderid);
369                if(ret < 0)
370                {
371                        perr("writting file %s", filename);
372                }
373                node = node->next;
374        }
375
376        fclose(fd);
377        debug(1000, "out");
378        return 0;
379}
380
381#endif
Note: See TracBrowser for help on using the repository browser.