source: titan/titan/httpd.h @ 30030

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

fix

File size: 19.5 KB
Line 
1#ifndef HTTPD_H
2#define HTTPD_H
3
4char* getmimetype(char* name, char* mime)
5{
6        char* dot;
7
8        if(mime != NULL) return mime;
9        if(name == NULL) return "text/html";
10
11        dot = strrchr( name, '.' );
12        if(dot == NULL || strcmp(dot, ".html") == 0 || strcmp(dot, ".htm") == 0)
13                return "text/html";
14        if(strcmp(dot, ".jpg") == 0 || strcmp( dot, ".jpeg" ) == 0)
15                return "image/jpeg";
16        if(strcmp(dot, ".gif") == 0)
17                return "image/gif";
18        if(strcmp(dot, ".png") == 0)
19                return "image/png";
20        if(strcmp(dot, ".css") == 0)
21                return "text/css";
22        if(strcmp(dot, ".au") == 0)
23                return "audio/basic";
24        if(strcmp(dot, ".wav") == 0)
25                return "audio/wav";
26        if(strcmp(dot, ".avi") == 0)
27                return "video/x-msvideo";
28        if(strcmp(dot, ".mov") == 0 || strcmp(dot, ".qt" ) == 0)
29                return "video/quicktime";
30        if(strcmp(dot, ".mpeg") == 0 || strcmp(dot, ".mpe" ) == 0)
31                return "video/mpeg";
32        if(strcmp(dot, ".ts") == 0)
33                return "video/MP2T";   
34        if(strcmp(dot, ".vrml") == 0 || strcmp(dot, ".wrl" ) == 0)
35                return "model/vrml";
36        if(strcmp(dot, ".midi") == 0 || strcmp(dot, ".mid" ) == 0)
37                return "audio/midi";
38        if(strcmp(dot, ".mp3") == 0)
39                return "audio/mpeg";
40        if(strcmp(dot, ".ogg") == 0)
41                return "application/ogg";
42        if(strcmp(dot, ".pac") == 0)
43                return "application/x-ns-proxy-autoconfig";
44
45        return "text/html";
46}
47
48char* createheader(off64_t len, char* filename, char* mime, char* ext, int code, int auth)
49{
50        char* header = NULL, *buf = NULL;
51        time_t now = time(NULL);
52
53        buf = malloc(100);
54        if(buf == NULL)
55        {
56                err("no mem");
57                return NULL;
58        }
59
60        if(auth == 1) code=401;
61        switch(code)
62        {
63                case 200:
64                        header = ostrcat(header, "HTTP/1.1 200 OK\r\n", 1, 0);
65                        break;
66                case 302:
67                        header = ostrcat(header, "HTTP/1.1 302 Found\r\n", 1, 0);
68                        break;
69                case 401:
70                        header = ostrcat(header, "HTTP/1.1 401 Unauthorized\r\n", 1, 0);
71                        break;
72                case 500:
73                        header = ostrcat(header, "HTTP/1.1 500 Internal Server Error\r\n", 1, 0);
74                        break;
75        }
76
77        snprintf(buf, 99, "Server: %s\r\n", PROGNAME);
78        header = ostrcat(header, buf, 1, 0);
79
80        if(auth == 1)
81        {
82                snprintf(buf, 99, "WWW-Authenticate: Basic realm=\"Contol Panel\"\r\n");
83                header = ostrcat(header, buf, 1, 0);
84        }
85
86        strftime(buf, 99, "Date: %a, %d %b %Y %H:%M:%S GMT\r\n", gmtime(&now));
87        header = ostrcat(header, buf, 1, 0);
88
89        header = ostrcat(header, "Content-Type: ", 1, 0);
90        header = ostrcat(header, getmimetype(filename, mime), 1, 0);
91        header = ostrcat(header, "\r\n", 1, 0);
92
93        if(auth == 1) len = 0;
94        snprintf(buf, 99, "Content-Length: %lld\r\n", len);
95        header = ostrcat(header, buf, 1, 0);
96
97        strftime(buf, 99, "Expires: %a, %d %b %Y %H:%M:%S GMT\r\n", gmtime(&now));
98        header = ostrcat(header, buf, 1, 0);
99
100        if(filename != NULL)
101        {
102                now = getfiletime(filename, 1);
103                strftime(buf, 99, "Last-Modified: %a, %d %b %Y %H:%M:%S GMT\r\n", gmtime(&now));
104                header = ostrcat(header, buf, 1, 0);
105        }
106
107        if(ext != NULL)
108        {
109                header = ostrcat(header, ext, 1, 0);
110                header = ostrcat(header, "\r\n", 1, 0);
111        }
112
113        header = ostrcat(header, "Connection: close\r\n", 1, 0);
114        header = ostrcat(header, "\r\n", 1, 0);
115
116        free(buf);
117        return header;
118}
119
120void senderror(int* connfd, char* title, char* text, int auth, int fmt)
121{
122        char* buf = NULL, *header = NULL;;
123
124        if(fmt == 0)
125        {
126                buf = ostrcat(buf, "<html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><link rel=stylesheet type=text/css href=titan.css><title>Error ", 1, 0);
127                buf = ostrcat(buf, title, 1, 0);
128                buf = ostrcat(buf, "</title></head><body class=body><font class=error>Error - ", 1, 0);
129                buf = ostrcat(buf, text, 1, 0);
130                buf = ostrcat(buf, "</font></body></html>", 1, 0);
131        }
132        else
133        {
134                buf = ostrcat(buf, "Error: ", 1, 0);
135                buf = ostrcat(buf, text, 1, 0);
136        }
137
138        header = createheader(strlen(buf), NULL, NULL, NULL, 500, auth);
139
140        socksend(connfd, (unsigned char*)header, strlen(header), 5000 * 1000);
141        socksend(connfd, (unsigned char*)buf, strlen(buf), 5000 * 1000);
142
143        free(header);
144        free(buf);
145}
146
147void checkquery(int* connfd, char* query, int auth, int fmt)
148{
149        char* buf = NULL, *header = NULL, *param = NULL;
150        char* ext = NULL, *mime = NULL;
151        int buflen = 0, onlyheader = 0, code = 200;
152
153        //create param
154        param = strchr(query, '&');
155        if(param != NULL)
156                *param++ = '\0';
157
158        if(ostrcmp(query, "getbouquetepg") == 0)
159        {
160                m_lock(&status.waitrcmutex, 24);
161                buf = webgetbouquetepg(param, fmt);
162                m_unlock(&status.waitrcmutex, 24);
163        }
164        else if(ostrcmp(query, "getchannellock") == 0)
165        {
166                m_lock(&status.waitrcmutex, 24);
167                buf = webgetchannellock(param, fmt);
168                m_unlock(&status.waitrcmutex, 24);
169        }
170        else if(ostrcmp(query, "getsysteminfo") == 0)
171                buf = webgetsysteminfo(fmt);
172        else if(ostrcmp(query, "getrccodes") == 0)
173                buf = webgetrccodes(fmt);
174        else if(ostrcmp(query, "getmute") == 0)
175                buf = webgetmute(fmt);
176        else if(ostrcmp(query, "getrecsteampath") == 0)
177                buf = webgetrecsteampath(fmt);
178        else if(ostrcmp(query, "getvol") == 0)
179                buf = webgetvol(fmt);
180        else if(ostrcmp(query, "sendrc") == 0)
181                buf = websendrc(param, fmt);
182        else if(ostrcmp(query, "getrectimer") == 0)
183        {
184                m_lock(&status.waitrcmutex, 24);
185                buf = webgetrectimer(param, 0, fmt);
186                m_unlock(&status.waitrcmutex, 24);
187        }
188        else if(ostrcmp(query, "addrectimer") == 0)
189        {
190                m_lock(&status.waitrcmutex, 24);
191                buf = webaddrectimer(param, fmt);
192                m_unlock(&status.waitrcmutex, 24);
193        }
194        else if(ostrcmp(query, "delrectimer") == 0)
195        {
196                m_lock(&status.waitrcmutex, 24);
197                buf = webdelrectimer(param, fmt);
198                m_unlock(&status.waitrcmutex, 24);
199        }
200        else if(ostrcmp(query, "editrectimer") == 0)
201        {
202                m_lock(&status.waitrcmutex, 24);
203                buf = webeditrectimer(param, fmt);
204                m_unlock(&status.waitrcmutex, 24);
205        }
206        else if(ostrcmp(query, "rectimercheck") == 0)
207        {
208                m_lock(&status.waitrcmutex, 24);
209                buf = webrectimercheck(param, fmt);
210                m_unlock(&status.waitrcmutex, 24);
211        }
212        else if(ostrcmp(query, "rectimersend") == 0)
213        {
214                m_lock(&status.waitrcmutex, 24);
215                buf = webrectimersend(param, fmt);
216                m_unlock(&status.waitrcmutex, 24);
217        }
218        else if(ostrcmp(query, "getrectimerarchive") == 0)
219        {
220                m_lock(&status.waitrcmutex, 24);
221                buf = webgetrectimer(param, 1, fmt);
222                m_unlock(&status.waitrcmutex, 24);
223        }
224        else if(ostrcmp(query, "adjust") == 0)
225        {
226                buf = webadjust(param, fmt);
227        }
228        else if(ostrcmp(query, "adjustsend") == 0)
229        {
230                buf = webadjustsend(param, fmt);
231        }
232        else if(ostrcmp(query, "setvol") == 0)
233                buf = websetvol(param, fmt);
234        else if(ostrcmp(query, "setmute") == 0)
235                buf = websetmute(param, fmt);
236        else if(ostrcmp(query, "getbouquet") == 0)
237        {
238                m_lock(&status.waitrcmutex, 24);
239                buf = webgetbouquet(fmt);
240                m_unlock(&status.waitrcmutex, 24);
241        }
242        else if(ostrcmp(query, "getsat") == 0)
243        {
244                m_lock(&status.waitrcmutex, 24);
245                buf = webgetsat(fmt);
246                m_unlock(&status.waitrcmutex, 24);
247        }
248        else if(ostrcmp(query, "getprovider") == 0)
249        {
250                m_lock(&status.waitrcmutex, 24);
251                buf = webgetprovider(fmt);
252                m_unlock(&status.waitrcmutex, 24);
253        }
254        else if(ostrcmp(query, "getaz") == 0)
255                buf = webgetaz(fmt);
256        else if(ostrcmp(query, "getconfig") == 0)
257                buf = webgetconfig(fmt);
258        else if(ostrcmp(query, "getchannelpage") == 0)
259        {
260                m_lock(&status.waitrcmutex, 24);
261                buf = webgetchannelpage(param, fmt);
262                m_unlock(&status.waitrcmutex, 24);
263        }
264        else if(ostrcmp(query, "getallchannel") == 0)
265        {
266                m_lock(&status.waitrcmutex, 24);
267                buf = webgetchannel(0, 0, 1, fmt);
268                m_unlock(&status.waitrcmutex, 24);
269        }
270        else if(ostrcmp(query, "getbouquetchannel") == 0)
271        {
272                m_lock(&status.waitrcmutex, 24);
273                buf = webgetbouquetchannel(param, fmt);
274                m_unlock(&status.waitrcmutex, 24);
275        }
276        else if(ostrcmp(query, "getcommand") == 0 && param != NULL)
277        {
278                m_lock(&status.waitrcmutex, 24);
279                buf = webgetcommand(param, fmt);
280                m_unlock(&status.waitrcmutex, 24);
281        }
282        else if(ostrcmp(query, "gethelpchoices") == 0)
283        {
284                m_lock(&status.waitrcmutex, 24);
285                buf = webgethelpchoices(fmt);
286                m_unlock(&status.waitrcmutex, 24);
287        }
288        else if(ostrcmp(query, "gettestpage") == 0 && param != NULL)
289        {
290                m_lock(&status.waitrcmutex, 24);
291                buf = webgettestpage(param, fmt);
292                m_unlock(&status.waitrcmutex, 24);
293        }
294        else if(ostrcmp(query, "gethelp") == 0 && param != NULL)
295        {
296                m_lock(&status.waitrcmutex, 24);
297                buf = webgethelp(param, fmt);
298                m_unlock(&status.waitrcmutex, 24);
299        }
300        else if(ostrcmp(query, "getsatchannel") == 0 && param != NULL)
301        {
302                m_lock(&status.waitrcmutex, 24);
303                buf = webgetchannel(atoi(param), 1, 1, fmt);
304                m_unlock(&status.waitrcmutex, 24);
305        }
306        else if(ostrcmp(query, "getproviderchannel") == 0 && param != NULL)
307        {
308                m_lock(&status.waitrcmutex, 24);
309                buf = webgetchannel(atoi(param), 2, 1, fmt);
310                m_unlock(&status.waitrcmutex, 24);
311        }
312        else if(ostrcmp(query, "getazchannel") == 0 && param != NULL)
313        {
314                m_lock(&status.waitrcmutex, 24);
315                buf = webgetchannel(atoi(param), 3, 1, fmt);
316                m_unlock(&status.waitrcmutex, 24);
317        }
318        else if(ostrcmp(query, "switch") == 0)
319                buf = webswitch(param, fmt);
320        else if(ostrcmp(query, "getaktservice") == 0)
321        {
322                m_lock(&status.waitrcmutex, 24);
323                buf = webgetaktservice(fmt);
324                m_unlock(&status.waitrcmutex, 24);
325        }
326        else if(ostrcmp(query, "getservice") == 0)
327        {
328                m_lock(&status.waitrcmutex, 24);
329                buf = webgetservice(param, fmt);
330                m_unlock(&status.waitrcmutex, 24);
331        }
332        else if(ostrcmp(query, "getepg") == 0)
333        {
334                m_lock(&status.waitrcmutex, 24);
335                buf = webgetepg(param, fmt);
336                m_unlock(&status.waitrcmutex, 24);
337        }
338        else if(ostrcmp(query, "getmovieepg") == 0)
339        {
340                m_lock(&status.waitrcmutex, 24);
341                buf = webgetmovieepg(param, getconfig("rec_streampath", NULL), 1, fmt);
342                m_unlock(&status.waitrcmutex, 24);
343        }
344        else if(ostrcmp(query, "getsingleepg") == 0)
345        {
346                m_lock(&status.waitrcmutex, 24);
347                buf = webgetsingleepg(param, fmt);
348                m_unlock(&status.waitrcmutex, 24);
349        }
350        else if(ostrcmp(query, "getgmultiepg") == 0)
351        {
352                m_lock(&status.waitrcmutex, 24);
353                buf = webgetgmultiepg(param, fmt);
354                m_unlock(&status.waitrcmutex, 24);
355        }
356        else if(query != NULL && ostrstr(query, "getepgsearch") == query)
357        {
358                m_lock(&status.waitrcmutex, 24);
359                buf = webgetepgsearch(query, param, fmt);
360                m_unlock(&status.waitrcmutex, 24);
361        }
362        else if(ostrcmp(query, "getsignal") == 0)
363                buf = webgetsignal(fmt);
364        else if(ostrcmp(query, "getmoviefilelist") == 0)
365        {
366                if(fmt == 0)
367                        buf = webgetfilelist(param, "getmoviefilelist", "delmoviefile", getconfig("rec_streampath", NULL), "*.avi *.dat *.divx *.flv *.mkv *.m4v *.mp4 *.mov *.mpg *.mpeg *.mts *.m2ts *.trp *.ts *.vdr *.vob *.wmv *.rm", 31, fmt);
368                else
369                        buf = webgetfilelist(param, "getmoviefilelist", "delmoviefile", getconfig("rec_streampath", NULL), "*.avi *.dat *.divx *.flv *.mkv *.m4v *.mp4 *.mov *.mpg *.mpeg *.mts *.m2ts *.trp *.ts *.vdr *.vob *.wmv *.rm *.wav *.mp3", 31, fmt);
370       
371        }
372        else if(ostrcmp(query, "delmoviefile") == 0)
373        {
374                if(fmt == 0)
375                        buf = webdelfile(param, "getmoviefilelist", "delmoviefile", getconfig("rec_streampath", NULL), "*.avi *.dat *.divx *.flv *.mkv *.m4v *.mp4 *.mov *.mpg *.mpeg *.mts *.m2ts *.trp *.ts *.vdr *.vob *.wmv *.rm", 31, fmt);
376                else
377                        buf = webdelfile(param, "getmoviefilelist", "delmoviefile", getconfig("rec_streampath", NULL), "*.avi *.dat *.divx *.flv *.mkv *.m4v *.mp4 *.mov *.mpg *.mpeg *.mts *.m2ts *.trp *.ts *.vdr *.vob *.wmv *.rm *.wav *.mp3", 31, fmt);
378        }
379        else if(ostrcmp(query, "getm3u") == 0)
380        {
381                buf = webgetm3u(param, *connfd, fmt);
382                if(fmt == 0)
383                {
384                        ext = "Content-Disposition: attachment; filename=stream.m3u";
385                        mime = "audio/x-mpegurl";
386                }
387        }
388        else if(ostrcmp(query, "getvideo") == 0)
389                buf = webgetvideo(param, *connfd, fmt);
390        else if(ostrcmp(query, "videoplay") == 0 || ostrcmp(query, "videoplay=") == 0)
391                buf = webvideo(param, fmt);
392        else if(ostrcmp(query, "getdrawcount") == 0)
393                buf = webgetdrawcount(param, fmt);
394        else if(ostrcmp(query, "getshoot") == 0)
395        {
396                webgetshoot(param, fmt);
397                if(fmt == 0)
398                {
399                        ext = "Location: shoot.html";
400                        onlyheader = 1;
401                        code = 302;
402                }
403                else
404                        buf = ostrcat("shoot.html", NULL, 0, 0);
405        }
406        else if(query != NULL && ostrstr(query, "poweroff") == query)
407                oshutdown(1, 1);
408        else if(query != NULL && ostrstr(query, "restart") == query)
409                oshutdown(2, 1);
410        else if(query != NULL && ostrstr(query, "guirestart") == query)
411                oshutdown(3, 1);
412        else if(query != NULL && ostrstr(query, "standby") == query)
413        {
414                status.standby = 2;
415                addtimer(&screenstandby, START, 1000, 1, NULL, NULL, NULL);
416        }
417        else if(query != NULL && ostrstr(query, "boxstatus") == query)
418        {
419                if(status.standby > 0)
420                {
421                        if(fmt == 0)
422                                sendoktext(connfd, "standby", auth);
423                        else
424                                buf = ostrcat("standby", NULL, 0, 0);
425                }
426                else
427                {
428                        if(fmt == 0)
429                                sendoktext(connfd, "running", auth);
430                        else
431                                buf = ostrcat("running", NULL, 0, 0);
432                }
433        }
434        else if(query != NULL && ostrstr(query, "mutestatus") == query)
435        {
436                if(status.mute > 0)
437                {
438                        if(fmt == 0)
439                                sendoktext(connfd, "muteon", auth);
440                        else
441                                buf = ostrcat("muteon", NULL, 0, 0);
442                }
443                else
444                {
445                        if(fmt == 0)
446                                sendoktext(connfd, "muteoff", auth);
447                        else
448                                buf = ostrcat("muteoff", NULL, 0, 0);
449                }
450        }
451        else if(query != NULL && ostrstr(query, "message") == query)
452                buf = websendmessage(query, fmt);
453               
454        if(buf != NULL || onlyheader == 1)
455        {
456                if(buflen == 0 && onlyheader == 0) buflen = strlen(buf);
457
458                header = createheader(buflen, NULL, mime, ext, code, auth);
459                socksend(connfd, (unsigned char*)header, strlen(header), 5000 * 1000);
460                if(onlyheader == 0 && auth == 0)
461                        socksend(connfd, (unsigned char*)buf, buflen, 5000 * 1000);
462        }
463        else
464                senderror(connfd, "query", "Error in query string", auth, fmt);
465
466        free(header);
467        free(buf);
468}
469
470void gotdata(int* connfd)
471{
472        int ret = 0, filefd = -1, auth = 0;
473        unsigned char* buf = NULL;
474        char* tmpstr = NULL, *tmpstr1 = NULL, *filename = NULL, *fullfilename = NULL, *header = NULL, *query = NULL;
475
476        buf = malloc(MINMALLOC);
477        if(buf == NULL)
478        {
479                err("no mem");
480                sockclose(connfd);
481                return;
482        }
483        memset(buf, 0, MINMALLOC);
484
485        debug(250, "get client data");
486
487        //read one line
488        unsigned char* pbuf = buf;
489        while(pbuf - buf < MINMALLOC)
490        {
491                unsigned char c;
492
493                ret = sockreceive(connfd, &c, 1, 5000 * 1000);
494                if(ret != 0)
495                {
496                        debug(250, "no client data in buffer");
497                        break;
498                }
499
500                *pbuf = c;
501                if(buf != NULL && (ostrstr((char*)buf, "\n\n") != NULL || ostrstr((char*)buf, "\r\n\r\n") != NULL))
502                        break;
503                pbuf++;
504        }
505
506        if(buf != NULL)
507        {
508                tmpstr = ostrstr((char*)buf, "GET /");
509                tmpstr1 = ostrstr((char*)buf, "Authorization: Basic ");
510        }
511
512        //Auth Password
513        if(status.httpauth != NULL)
514        {
515                if(tmpstr1 != NULL)
516                {
517                        tmpstr1 += 21;
518                        char* tmpstr3 = malloc(255);
519                        if(tmpstr3 != NULL)
520                        {
521                                int l = b64dec(tmpstr3, tmpstr1);
522                                if(l < 255) tmpstr3[l] = '\0';
523                        }
524                        if(ostrncmp(tmpstr3, status.httpauth, strlen(status.httpauth)) != 0)
525                        {
526                                //not ok:
527                                tmpstr1 = NULL;
528                        }
529                        free(tmpstr3); tmpstr3 = NULL;
530                }
531       
532                if(tmpstr1 == NULL) auth = 1;
533        }
534
535        if(tmpstr != NULL)
536        {
537                tmpstr += 4;
538
539                filename = malloc(MINMALLOC);
540                if(filename == NULL)
541                {
542                        err("no mem");
543                        sockclose(connfd);
544                        free(buf); buf = NULL;
545                        tmpstr = NULL;
546                        return;
547                }
548                memset(filename, 0, MINMALLOC);
549
550                ret = sscanf(tmpstr, "%s", filename);
551                if(ret == 1)
552                {
553                        if(ostrstr(filename, "query?rectimersend") != NULL)
554                                stringreplacechar(filename, '+', ' ');
555                        if(ostrstr(filename, "query?rectimercheck") != NULL)
556                                stringreplacechar(filename, '+', ' ');
557                        htmldecode(filename, filename);
558                       
559                        if(ostrstr(filename, "xmessage") == filename + 1  || ostrstr(filename, "/cgi-bin/xmessage") == filename )
560                        {       
561                                xmessage(filename);
562                                sendoktext(connfd, "ok", 0);
563                                //senderror(connfd, "ok", "ok", 0, 0);
564                                free(buf); buf = NULL;
565                                free(filename); filename = NULL;
566                                tmpstr = NULL;
567                                return;
568                        }
569
570                        //create query
571                        query = strchr(filename, '?');
572                        if(query != NULL)
573                        {
574                                *query++ = '\0';
575                                debug(250, "httpd query=%s", query);
576                        }
577
578                        //queryraw
579                        if(ostrcmp(filename, "/queryraw") == 0 && query != NULL)
580                        {
581                                checkquery(connfd, query, auth, 1);
582                                free(buf); buf = NULL;
583                                free(filename); filename = NULL;
584                                tmpstr = NULL;
585                                return;
586                        }
587
588                        //query
589                        if(ostrcmp(filename, "/query") == 0 && query != NULL)
590                        {
591                                checkquery(connfd, query, auth, 0);
592                                free(buf); buf = NULL;
593                                free(filename); filename = NULL;
594                                tmpstr = NULL;
595                                return;
596                        }
597
598                        //create index.html
599                        if(filename[strlen(filename) - 1] == '/')
600                                filename = ostrcat(filename, "index.html", 1, 0);
601
602                        debug(250, "httpd filename=%s", filename);
603
604                        if(ostrstr(filename, "/movie/") != NULL)
605                                fullfilename = ostrcat(filename, NULL, 0, 0);
606                        else
607                                fullfilename = ostrcat(getconfig("httpdpath", NULL), filename, 0, 0);
608                        filefd = open(fullfilename, O_RDONLY | O_LARGEFILE);
609                        if(filefd < 0)
610                        {
611                                perr("open filename=%s", fullfilename);
612                                senderror(connfd, "Open File", "Can't open File", auth, 0);
613                                free(fullfilename); fullfilename = NULL;
614                                free(buf); buf = NULL;
615                                free(filename); filename = NULL;
616                                tmpstr = NULL;
617                                return;
618                        }
619                       
620                        debug(250, "sende OK response to client");
621                        char* rpath = realpath(fullfilename, NULL);
622                        header = createheader(getfilesize(rpath), fullfilename, NULL, NULL, 200, auth);
623                        free(rpath); rpath = NULL;
624                        free(fullfilename); fullfilename = NULL;
625                        ret = socksend(connfd, (unsigned char*)header, strlen(header), 5000 * 1000);
626                        free(header); header = NULL;
627
628                        if(ret != 0)
629                        {
630                                sockclose(connfd);
631                                free(buf); buf = NULL;
632                                free(filename); filename = NULL;
633                                tmpstr = NULL;
634                                return;
635                        }
636
637                        //TODO:
638                        int readret = 1;
639                        while(readret > 0 && auth == 0)
640                        {
641                                readret = dvbreadfd(filefd, buf, 0, MINMALLOC, 1000, 0);
642                                if(readret > 0)
643                                        socksend(connfd, buf, readret, 5000 * 1000);
644                        }
645                }
646        }
647
648        close(filefd);
649        free(buf); buf = NULL;
650        free(filename); filename = NULL;
651        tmpstr = NULL;
652}
653
654int newconn(int* streamfd, int* connfd)
655{
656        int i, fd = -1;
657
658        fd = sockaccept(streamfd, 1);
659        if(fd < 0) return -1;
660
661        for(i = 0; i < MAXHTTPDCONN; i++)
662        {
663                if(connfd[i] < 0)
664                {
665                        connfd[i] = fd;
666                        debug(250, "accept httpd connection fd=%d", fd);
667                        fd = -1;
668                        break;
669                }
670        }
671
672        if(fd != -1)
673        {
674                debug(250, "all connections in use");
675                sockclose(&fd);
676                return -1;
677        }
678
679        return 0;
680}
681
682void httpdthreadfunc(struct stimerthread* timernode)
683{
684        struct timeval timeout;
685        fd_set rfds;
686        int i, ret = 0, streamfd = -1, connfd[MAXHTTPDCONN], maxfd = -1;
687
688        if(timernode == NULL) return;
689        debug(250, "Starting httpd thread");
690
691        for(i = 0; i < MAXHTTPDCONN; i++)
692                connfd[i] = -1;
693
694        while(timernode->aktion != STOP)
695        {
696                if(streamfd < 0)
697                {
698                        sockportcreate(&streamfd, getconfigint("httpdport", NULL), MAXHTTPDCONN);
699                        if(streamfd < 0) break;
700                        maxfd = streamfd;
701
702                        //set nonblocking
703                        fcntl(streamfd, F_SETFL, fcntl(streamfd, F_GETFL) | O_NONBLOCK);
704                }
705
706                timeout.tv_sec = 1;
707                timeout.tv_usec = 0;
708
709                FD_ZERO(&rfds);
710                FD_SET(streamfd, &rfds);
711
712                for(i = 0; i < MAXHTTPDCONN; i++)
713                {
714                        if(connfd[i] > -1)
715                        {
716                                FD_SET(connfd[i], &rfds);
717                                if(connfd[i] > maxfd) maxfd = connfd[i];
718                        }
719                }
720
721                ret = TEMP_FAILURE_RETRY(select(maxfd + 1, &rfds , NULL, NULL, &timeout));
722
723                if(ret < 0)
724                {
725                        perr("httpd listen socket fd=%d", maxfd);
726                        sleep(1);
727                        continue;
728                }
729                if(ret == 0) continue; //timeout
730
731                if(FD_ISSET(streamfd, &rfds))
732                {
733                        ret = newconn(&streamfd, connfd);
734                        if(ret < 0) continue;
735                }
736
737                for(i = 0; i < MAXHTTPDCONN; i++)
738                {
739                        if(connfd[i] > -1 && FD_ISSET(connfd[i], &rfds))
740                                gotdata(&connfd[i]);
741                }
742        }
743
744        debug(250, "Stopping httpd thread");
745        sockclose(&streamfd);
746        for(i = 0; i < MAXHTTPDCONN; i++)
747                sockclose(&connfd[i]);
748
749        return;
750}
751
752void sendoktext(int* connfd, char* text, int auth)
753{
754        char* buf = NULL;
755        char* header = NULL;
756        buf = webcreatehead(buf, NULL, 1);
757        buf = ostrcat(buf, "<tr><td align=center valign=top><font class=biglabel><br><br>", 1, 0);
758        buf = ostrcat(buf, text, 1, 0);
759        buf = ostrcat(buf, "</font></td></tr>", 1, 0);
760        buf = webcreatetail(buf, 1);
761        int buflen = strlen(buf);
762        header = createheader(buflen, NULL, NULL, NULL, 200, auth);
763        socksend(connfd, (unsigned char*)header, strlen(header), 5000 * 1000);
764        if(auth == 0)
765                socksend(connfd, (unsigned char*)buf, buflen, 5000 * 1000);
766        free(buf); buf=NULL;
767        free(header); header=NULL;
768}
769
770#endif
Note: See TracBrowser for help on using the repository browser.