source: titan/titan/network.h @ 45606

Last change on this file since 45606 was 45606, checked in by obi, 8 months ago

readd ipsec

File size: 32.6 KB
Line 
1#ifndef NETWORK_H
2#define NETWORK_H
3
4int readwlan(const char* filename, char** type, char** ssid, char** key)
5{
6        FILE *fd = NULL;
7        char *fileline = NULL, *tmpstr = NULL;
8
9        fileline = malloc(MINMALLOC);
10        if(fileline == NULL)
11        {
12                err("no memory");
13                return 1;
14        }
15
16        fd = fopen(filename, "r");
17        if(fd == NULL)
18        {
19                perr("can't open %s", filename);
20                free(fileline);
21                return 1;
22        }
23
24        while(fgets(fileline, MINMALLOC, fd) != NULL)
25        {
26                if(fileline[0] == '#' || fileline[0] == '\n')
27                        continue;
28                if(fileline[strlen(fileline) - 1] == '\n')
29                        fileline[strlen(fileline) - 1] = '\0';
30                if(fileline[strlen(fileline) - 1] == '\r')
31                        fileline[strlen(fileline) - 1] = '\0';
32
33                tmpstr = ostrstrcase(fileline, "proto=");
34                if(tmpstr != NULL)
35                {
36                        tmpstr += 6;
37                        if(ostrcmp(tmpstr, "WPA") == 0)
38                        {
39                                free(*type); *type = NULL;
40                                *type = ostrcat("2", NULL, 0, 0);
41                        }
42                        if(ostrcmp(tmpstr, "RSN") == 0)
43                        {
44                                free(*type); *type = NULL;
45                                *type = ostrcat("3", NULL, 0, 0);
46                        }
47                }
48                tmpstr = ostrstrcase(fileline, "ssid=\"");
49                if(tmpstr != NULL)
50                {
51                        tmpstr += 6;
52                        if(tmpstr != NULL)
53                        {
54                                tmpstr[strlen(tmpstr) -1] = '\0';
55                                free(*ssid); *ssid = NULL;
56                                *ssid = ostrcat(tmpstr, NULL, 0, 0);
57                        }
58                }
59                tmpstr = ostrstrcase(fileline, "psk=\"");
60                if(tmpstr != NULL)
61                {
62                        tmpstr += 5;
63                        if(tmpstr != NULL)
64                        {
65                                tmpstr[strlen(tmpstr) -1] = '\0';
66                                free(*key); *key = NULL;
67                                *key = ostrcat(tmpstr, NULL, 0, 0);
68                        }
69                }
70                tmpstr = ostrstrcase(fileline, "wep_key0=");
71                if(tmpstr != NULL)
72                {
73                        tmpstr += 9;
74                        if(tmpstr != NULL)
75                        {
76                                tmpstr[strlen(tmpstr)] = '\0';
77                                free(*key); *key = NULL;
78                                *key = ostrcat(tmpstr, NULL, 0, 0);
79                                free(*type); *type = NULL;
80                                *type = ostrcat("1", NULL, 0, 0);
81                        }
82                }
83        }
84
85        free(fileline);
86        fclose(fd);
87        return 0;
88}
89
90int writewlan(const char* filename, int type, char* ssid, char* key)
91{
92        char* savesettings = NULL;
93
94        char* tmpstr = "\nkey_mgmt=NONE\nscan_ssid=1";
95
96        if(type == 1) //WEP
97                tmpstr = "\nkey_mgmt=NONE\nscan_ssid=1\nwep_tx_keyidx=0\nwep_key0=";
98        if(type == 2) //WPA
99                tmpstr = "\nkey_mgmt=WPA-PSK\nscan_ssid=1\nproto=WPA\npsk=";
100        if(type == 3) //WPA2
101                tmpstr = "\nkey_mgmt=WPA-PSK\nscan_ssid=1\nproto=RSN\npsk=";
102
103        savesettings = ostrcat("ctrl_interface=DIR=/var/run/wpa_supplicant\nnetwork={\nssid=\"", NULL, 0, 0);
104        savesettings = ostrcat(savesettings, ssid, 1, 0);
105        savesettings = ostrcat(savesettings, "\"", 1, 0);
106        savesettings = ostrcat(savesettings, tmpstr, 1, 0);
107
108        if(type == 2 || type == 3)
109                savesettings = ostrcat(savesettings, "\"", 1, 0);
110        if(type == 1 || type == 2 || type == 3)
111                savesettings = ostrcat(savesettings, key, 1, 0);
112        if(type == 2 || type == 3)
113                savesettings = ostrcat(savesettings, "\"", 1, 0);
114
115        savesettings = ostrcat(savesettings, "\n}", 1, 0);
116
117        FILE* fd = fopen(filename, "w");
118        if(fd)
119        {
120                fprintf(fd, "%s\n", savesettings);
121                fclose(fd);
122        }
123        free(savesettings); savesettings = NULL;
124
125        return 0;
126}
127
128int writeinterfaces()
129{
130        char* savesettings = NULL;
131        struct inetwork* net = inetwork;
132
133        savesettings = ostrcat(savesettings, "# automatically generated by titan\n", 1, 0);
134        savesettings = ostrcat(savesettings, "# do NOT change manually!\n", 1, 0);
135        savesettings = ostrcat(savesettings, "\n", 1, 0);
136        savesettings = ostrcat(savesettings, "auto lo\n", 1, 0);
137        savesettings = ostrcat(savesettings, "iface lo inet loopback\n", 1, 0);
138
139        while(net != NULL)
140        {
141                if(ostrncmp(net->device, "lo", 2) == 0)
142                {
143                        net = net->next;
144                        continue;
145                }
146                if(net->type == 0 && (net->ip == NULL || ostrcmp(net->ip, "000.000.000.000") == 0))
147                {
148                        net = net->next;
149                        continue;
150                }
151
152                savesettings = ostrcat(savesettings, "\n", 1, 0);
153                savesettings = ostrcat(savesettings, "auto ", 1, 0);
154                savesettings = ostrcat(savesettings, net->device, 1, 0);
155                savesettings = ostrcat(savesettings, "\n", 1, 0);
156
157                savesettings = ostrcat(savesettings, "iface ", 1, 0);
158                savesettings = ostrcat(savesettings, net->device, 1, 0);
159
160                if(net->type == 1)
161                        savesettings = ostrcat(savesettings, " inet dhcp\n", 1, 0);
162                else if(net->type == 2)
163#ifdef OEBUILD
164                        savesettings = ostrcat(savesettings, " inet manual\n", 1, 0);
165#else
166                        savesettings = ostrcat(savesettings, " inet off\n", 1, 0);
167#endif
168                else
169                {
170                        savesettings = ostrcat(savesettings, " inet static\n", 1, 0);
171
172                        savesettings = ostrcat(savesettings, "\taddress ", 1, 0);
173                        savesettings = ostrcat(savesettings, fixip(net->ip, 1), 1, 1);
174                        if(net->netmask != NULL && ostrcmp(net->netmask, "000.000.000.000") != 0)
175                        {
176                                savesettings = ostrcat(savesettings, "\n\tnetmask ", 1, 0);
177                                savesettings = ostrcat(savesettings, fixip(net->netmask, 1), 1, 1);
178                        }
179
180                        if(status.gateway != NULL && ostrcmp(status.gateway, "000.000.000.000") != 0)
181                        {
182                                savesettings = ostrcat(savesettings, "\n\tgateway ", 1, 0);
183                                savesettings = ostrcat(savesettings, fixip(status.gateway, 1), 1, 1);
184                        }
185                        savesettings = ostrcat(savesettings, "\n", 1, 0);
186                }
187#ifdef OEBUILD
188                if(ostrncmp(net->device, "wlan", 4) == 0)
189                {
190                        savesettings = ostrcat(savesettings, "\n\tpre-up wpa_supplicant -i", 1, 0);
191                        savesettings = ostrcat(savesettings, net->device, 1, 0);
192                        savesettings = ostrcat(savesettings, " -c/mnt/network/wpa_supplicant.conf -B -dd -Dwext || true", 1, 0);
193//                      savesettings = ostrcat(savesettings, " -c/mnt/network/wpa_supplicant.", 1, 0);
194//                      savesettings = ostrcat(savesettings, net->device, 1, 0);
195//                      savesettings = ostrcat(savesettings, ".conf -B -dd -Dwext || true", 1, 0);
196
197                        savesettings = ostrcat(savesettings, "\n\tpre-down wpa_cli -i", 1, 0);
198                        savesettings = ostrcat(savesettings, net->device, 1, 0);
199                        savesettings = ostrcat(savesettings, " terminate || true", 1, 0);
200                }
201#endif
202                int dnscount = 0;
203                if(net->type == 0)
204                {
205                        char* savedns = NULL;
206                        if(status.dnsserver1 != NULL && ostrcmp(status.dnsserver1, "000.000.000.000") != 0)
207                        {
208                                dnscount = 1;
209                                savedns = ostrcat(savedns, "nameserver ", 1, 0);
210                                savedns = ostrcat(savedns, fixip(status.dnsserver1, 1), 1, 1);
211                        }
212
213                        if(status.dnsserver2 != NULL && ostrcmp(status.dnsserver2, "000.000.000.000") != 0)
214                        {
215                                dnscount = 2;
216                                savedns = ostrcat(savedns, "\n", 1, 0);
217                                savedns = ostrcat(savedns, "nameserver ", 1, 0);
218                                savedns = ostrcat(savedns, fixip(status.dnsserver2, 1), 1, 1);
219                        }
220
221                        if(savedns != NULL)
222                        {
223                                debug(55, "[NETWORK] save resolv.conf: %s\n", savedns);
224
225                                savedns = ostrcat(savedns, "\n", 1, 0);
226                                if(dnscount == 1)
227                                        savedns = ostrcat(savedns, "options timeout:3 attempts:1", 1, 0);
228                                else
229                                        savedns = ostrcat(savedns, "options timeout:2 attempts:1", 1, 0);
230
231
232                                FILE* fd1 = fopen("/mnt/network/resolv.conf", "w");
233                                if(fd1)
234                                {
235                                        fprintf(fd1, "%s\n", savedns);
236                                        fclose(fd1);
237                                }
238                                free(savedns); savedns = NULL;
239                        }
240                }
241                net = net->next;
242        }
243
244        debug(55, "[NETWORK] save interfaces:\n %s", savesettings);
245
246        FILE* fd = fopen("/mnt/network/interfaces", "w");
247        if(fd)
248        {
249                fprintf(fd, "%s\n", savesettings);
250                fclose(fd);
251        }
252        free(savesettings); savesettings = NULL;
253
254        return 0;
255}
256
257void screennetwork_test()
258{
259        int rcret = 0;
260        struct skin* network = getscreen("network_test");
261        struct skin* internet = getscreennode(network, "internet");
262        struct skin* lan = getscreennode(network, "lan");
263        char* tmpstr = NULL;
264
265        drawscreen(network, 0, 0);
266        addscreenrc(network, lan);
267        while(1)
268        {
269                rcret = waitrc(network, 0, 0);
270
271                if(rcret == getrcconfigint("rcexit", NULL)) break;
272                if(rcret == getrcconfigint("rcred", NULL))
273                {
274                        changetext(lan, _("Wait"));
275                        changetext(internet, _("Wait"));
276                        drawscreen(network, 0, 0);
277
278                        tmpstr = ostrcat(tmpstr, "ping -c1 -W1 ", 1, 0);
279                        tmpstr = ostrcat(tmpstr, fixip(status.gateway, 1), 1, 0);
280                        if(system(tmpstr) == 0)
281                                changetext(lan, _("OK"));
282                        else
283                                changetext(lan, _("ERROR"));
284                        free(tmpstr); tmpstr=NULL;
285
286                        tmpstr = ostrcat(tmpstr, "ping -c1 -W1 ", 1, 0);
287                        tmpstr = ostrcat(tmpstr, "www.google.de", 1, 0);
288                        if(system(tmpstr) == 0)
289                                changetext(internet, _("OK"));
290                        else
291                                changetext(internet, _("ERROR"));
292                        free(tmpstr); tmpstr=NULL;
293                        drawscreen(network, 0, 0);
294                }
295        }
296        delownerrc(network);
297        clearscreen(network);
298}
299
300void screennetwork(int mode)
301{
302        textbox(_("Network"), _("comming soon..."), _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 800, 600, 0, 0);
303}
304
305//flag 0 and 1: other message
306//flag 2: no msg and no info
307void screennetwork_restart(struct inetwork *net, int flag)
308{
309        struct skin* load = getscreen("loading");
310        char* tmpstr = NULL, *cmd = NULL;
311
312        if(flag == 0)
313                tmpstr = ostrcat(_("Restart Network ?"), NULL, 0, 0);
314        else if(flag == 1)
315                tmpstr = ostrcat(_("Aktivate new network config ?"), NULL, 0, 0);
316
317        if(flag == 2 || textbox(_("Network"), tmpstr, _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 600, 200, 0, 0) == 1)
318        {
319                debug(10, "%s", tmpstr);
320                free(tmpstr), tmpstr = NULL;
321
322                drawscreen(load, 0, 0);
323                if(net == NULL)
324                {
325                        net = inetwork;
326                        while(net != NULL)
327                        {
328                                if(net->flag == 1)
329                                {
330#ifdef OEBUILD
331                                        cmd = ostrcat(cmd, "/etc/init.d/networking restart", 1, 0);
332#else
333                                        cmd = ostrcat(cmd, "/etc/init.d/networking -i ", 1, 0);
334                                        cmd = ostrcat(cmd, net->device, 1, 0);
335                                        cmd = ostrcat(cmd, " restart", 1, 0);
336#endif
337                                        tmpstr = ostrcat(tmpstr, command(cmd), 1, 1);
338                                        tmpstr = ostrcat(tmpstr, "\n\n", 1, 0);
339                                        free(cmd); cmd = NULL;
340                                }
341                                net = net->next;
342                        }
343                }
344                else
345                {
346#ifdef OEBUILD
347                        cmd = ostrcat(cmd, "/etc/init.d/networking restart", 1, 0);
348#else
349                        cmd = ostrcat(cmd, "/etc/init.d/networking -i ", 1, 0);
350                        cmd = ostrcat(cmd, net->device, 1, 0);
351                        cmd = ostrcat(cmd, " restart", 1, 0);
352#endif
353                        tmpstr = ostrcat(tmpstr, command(cmd), 1, 1);
354                        free(cmd); cmd = NULL;
355                }
356
357                addinetworkall(NULL);
358                clearscreen(load);
359
360                if(flag != 2)
361                        textbox(_("Restart Network"), tmpstr, _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 800, 600, 0, 0);
362                free(tmpstr); tmpstr = NULL;
363        }
364}
365
366void nethidden(struct skin* ipaddress, struct skin* netmask, struct skin* gateway, struct skin* dnsserver1, struct skin* dnsserver2, int type)
367{
368        ipaddress->hidden = type;
369        netmask->hidden = type;
370        gateway->hidden = type;
371        dnsserver1->hidden = type;
372        dnsserver2->hidden = type;
373}
374
375void screennetwork_adapterext(int mode, char* interface)
376{
377        int rcret = 0;
378        struct skin* network = getscreen("network");
379        struct skin* listbox = getscreennode(network, "listbox");
380        struct skin* type = getscreennode(network, "type");
381        struct skin* ipaddress = getscreennode(network, "ipaddress");
382        struct skin* netmask = getscreennode(network, "netmask");
383        struct skin* gateway = getscreennode(network, "gateway");
384        struct skin* dnsserver1 = getscreennode(network, "dnsserver1");
385        struct skin* dnsserver2 = getscreennode(network, "dnsserver2");
386        struct inetwork* net = getinetworkbydevice(interface);
387        struct skin* wol = getscreennode(network, "wol");
388
389        struct skin* tmp = NULL;
390
391        if(net == NULL)
392                return;
393
394        char* tmp_ipaddress = ostrcat(net->ip, NULL, 0, 0);
395        char* tmp_netmask = ostrcat(net->netmask, NULL, 0, 0);;
396        char* tmp_gateway = ostrcat(status.gateway, NULL, 0, 0);;
397        char* tmp_dnsserver1 = ostrcat(status.dnsserver1, NULL, 0, 0);;
398        char* tmp_dnsserver2 = ostrcat(status.dnsserver2, NULL, 0, 0);;
399        int tmp_type = net->type;
400
401        changemask(ipaddress, "000.000.000.000");
402        changeinput(ipaddress, net->ip);
403
404        changemask(netmask, "000.000.000.000");
405        changeinput(netmask, net->netmask);
406
407        changemask(gateway, "000.000.000.000");
408        changeinput(gateway, status.gateway);
409
410        changemask(dnsserver1, "000.000.000.000");
411        changeinput(dnsserver1, status.dnsserver1);
412
413        changemask(dnsserver2, "000.000.000.000");
414        changeinput(dnsserver2, status.dnsserver2);
415
416        addchoicebox(type, "1", _("dhcp"));
417        addchoicebox(type, "0", _("static"));
418        addchoicebox(type, "2", _("off"));
419
420        addchoicebox(wol, "0", _("disable"));
421        addchoicebox(wol, "1", _("enable"));
422        setchoiceboxselection(wol, getconfig("wol", NULL));
423
424        if(ostrcmp(interface, "eth0") != 0 || file_exist("/proc/stb/fp/wol") == 0)
425                wol->hidden = YES;
426        else
427                wol->hidden = NO;
428
429        if(net->type == 1)
430        {
431                setchoiceboxselection(type, "1");
432                nethidden(ipaddress, netmask, gateway, dnsserver1, dnsserver2, YES);
433        }
434        else if(net->type == 2)
435        {
436                setchoiceboxselection(type, "2");
437                nethidden(ipaddress, netmask, gateway, dnsserver1, dnsserver2, YES);
438        }
439        else
440        {
441                setchoiceboxselection(type, "0");
442                nethidden(ipaddress, netmask, gateway, dnsserver1, dnsserver2, NO);
443        }
444
445        listbox->aktline = 1;
446
447        drawscreen(network, 0, 0);
448        addscreenrc(network, listbox);
449
450        int save = 0;
451
452        tmp = listbox->select;
453        while(1)
454        {
455                addscreenrc(network, tmp);
456                rcret = waitrc(network, 0, 0);
457                tmp = listbox->select;
458
459                if(rcret == getrcconfigint("rcexit", NULL)) break;
460                if(rcret == getrcconfigint("rcok", NULL))
461                {
462                        if(textbox(_("Message"), _("save network settings ?"), _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 600, 200, 0, 0) == 1)
463                        {
464                                debug(10, "save network settings");
465                                save = 1;
466                                break;
467                        }
468                        drawscreen(network, 0, 0);
469                }
470
471                if(listbox->select != NULL)
472                {
473                        if(ostrcmp(listbox->select->name, "type") == 0)
474                        {
475                                if(atoi(listbox->select->ret) == 0)
476                                        nethidden(ipaddress, netmask, gateway, dnsserver1, dnsserver2, NO);
477                                else
478                                        nethidden(ipaddress, netmask, gateway, dnsserver1, dnsserver2, YES);
479
480                                drawscreen(network, 0, 0);
481                                tmp_type = atoi(listbox->select->ret);
482                        }
483                        else if(ostrcmp(listbox->select->name, "ipaddress") == 0)
484                        {
485                                free(tmp_ipaddress);
486                                tmp_ipaddress = ostrcat(listbox->select->ret, NULL, 0, 0);
487                        }
488                        else if(ostrcmp(listbox->select->name, "netmask") == 0)
489                        {
490                                free(tmp_netmask);
491                                tmp_netmask = ostrcat(listbox->select->ret, NULL, 0, 0);
492                        }
493                        else if(ostrcmp(listbox->select->name, "gateway") == 0)
494                        {
495                                free(tmp_gateway);
496                                tmp_gateway = ostrcat(listbox->select->ret, NULL, 0, 0);
497                        }
498                        else if(ostrcmp(listbox->select->name, "dnsserver1") == 0)
499                        {
500                                free(tmp_dnsserver1);
501                                tmp_dnsserver1 = ostrcat(listbox->select->ret, NULL, 0, 0);
502                        }
503                        else if(ostrcmp(listbox->select->name, "dnsserver2") == 0)
504                        {
505                                free(tmp_dnsserver2);
506                                tmp_dnsserver2 = ostrcat(listbox->select->ret, NULL, 0, 0);
507                        }
508                }
509        }
510
511        if(save == 1)
512        {
513                if(ostrcmp(interface, "eth0") == 0 && file_exist("/proc/stb/fp/wol") != 0)
514                {
515                        addconfig("wol",wol->ret);
516                        if(getconfigint("wol", NULL) == 1)
517                                system("echo enable > /proc/stb/fp/wol");
518                        else
519                                system("echo disable > /proc/stb/fp/wol");
520                }
521
522                debug(55, "save settings");
523                debug(55, "type: %i", tmp_type);
524                debug(55, "ipaddress: %s", tmp_ipaddress);
525                debug(55, "netmask: %s", tmp_netmask);
526                debug(55, "gateway: %s", tmp_gateway);
527                debug(55, "dnsserver1: %s", tmp_dnsserver1);
528                debug(55, "dnsserver2: %s", tmp_dnsserver2);
529
530                if(ostrcmp(net->ip, tmp_ipaddress) != 0)
531                {
532                        free(net->ip);
533                        net->ip = ostrcat(tmp_ipaddress, NULL, 0, 0);
534                }
535                if(ostrcmp(net->netmask, tmp_netmask) != 0)
536                {
537                        free(net->netmask);
538                        net->netmask = ostrcat(tmp_netmask, NULL, 0, 0);
539                }
540                if(ostrcmp(status.gateway, tmp_gateway) != 0)
541                {
542                        free(status.gateway);
543                        status.gateway = ostrcat(tmp_gateway, NULL, 0, 0);
544                }
545                if(ostrcmp(status.dnsserver1, tmp_dnsserver1) != 0)
546                {
547                        free(status.dnsserver1);
548                        status.dnsserver1 = ostrcat(tmp_dnsserver1, NULL, 0, 0);
549                }
550                if(ostrcmp(status.dnsserver2, tmp_dnsserver2) != 0)
551                {
552                        free(status.dnsserver2);
553                        status.dnsserver2 = ostrcat(tmp_dnsserver2, NULL, 0, 0);
554                }
555
556                if(tmp_type != 0)
557                {
558                        free(net->ip);
559                        net->ip = ostrcat("000.000.000.000", NULL, 0, 0);
560                        free(net->netmask);
561                        net->netmask = ostrcat("000.000.000.000", NULL, 0, 0);
562                }
563
564                net->type = tmp_type;
565
566                writeinterfaces();
567                screennetwork_restart(net, 1);
568        }
569
570        free(tmp_ipaddress);
571        free(tmp_netmask);
572        free(tmp_gateway);
573        free(tmp_dnsserver1);
574        free(tmp_dnsserver2);
575
576        delownerrc(network);
577        clearscreen(network);
578}
579
580void screenhostname()
581{
582        int ret = 0;
583        char* hostname = NULL, *newhostname = NULL, *cmd = NULL;
584
585        hostname = command("hostname");
586        hostname = strstrip(hostname);
587        newhostname = textinput(NULL, hostname);
588        newhostname = strstrip(newhostname);
589
590        if(newhostname != NULL && strlen(newhostname) > 0)
591        {
592                ret = writesys("/mnt/network/hostname", newhostname, 1);
593                if(ret == 0)
594                {
595                        cmd = ostrcat(cmd, "hostname \"", 1, 0);
596                        cmd = ostrcat(cmd, newhostname, 1, 0);
597                        cmd = ostrcat(cmd, "\"", 1, 0);
598                        ret = system(cmd);
599                }
600        }
601
602        if(ret != 0)
603                        textbox(_("Message"), _("Can't change hostname !"), _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 600, 200, 0, 0);
604
605        free(cmd); cmd = NULL;
606        free(hostname); hostname = NULL;
607        free(newhostname); newhostname = NULL;
608}
609
610void screennetwork_adapter()
611{
612        int rcret = 0, mode = 0;
613        struct skin* interfacelist = getscreen("interfacelist");
614        struct skin* listbox = getscreennode(interfacelist, "listbox");
615        struct inetwork* inetworknode = NULL;
616        struct skin* tmp = NULL;
617        char* tmpstr = NULL;
618
619start:
620        tmp = NULL;
621        listbox->aktpage = -1;
622        listbox->aktline = 1;
623        listbox->select = NULL;
624        inetworknode = inetwork;
625
626        while(inetworknode != NULL)
627        {
628                if(ostrncmp(inetworknode->device, "lo", 2) == 0)
629                {
630                        inetworknode = inetworknode->next;
631                        continue;
632                }
633                tmp = addlistbox(interfacelist, listbox, tmp, 1);
634                if(tmp != NULL)
635                {
636                        tmpstr = ostrcat(inetworknode->device, " (", 0, 0);
637                        printf("inetworknode->device: %s inetworknode->ip: %s inetworknode->type: %d\n", inetworknode->device, inetworknode->ip, inetworknode->type);
638                        if(inetworknode->type == 2)
639                                tmpstr = ostrcat(tmpstr, _("disable"), 1, 0);
640                        else
641                                tmpstr = ostrcat(tmpstr, inetworknode->ip, 1, 0);
642                        tmpstr = ostrcat(tmpstr, ")", 1, 0);
643                        changetext(tmp, tmpstr);
644                        free(tmpstr); tmpstr = NULL;
645                        tmp->handle = inetworknode->device;
646                }
647                inetworknode = inetworknode->next;
648        }
649
650        drawscreen(interfacelist, 0, 0);
651        addscreenrc(interfacelist, listbox);
652
653        tmp = listbox->select;
654        while(1)
655        {
656                addscreenrc(interfacelist, tmp);
657                rcret = waitrc(interfacelist, 0, 0);
658                tmp = listbox->select;
659
660                if(rcret == getrcconfigint("rcexit", NULL)) break;
661                if(listbox->select != NULL)
662                {
663                        if(rcret == getrcconfigint("rcred", NULL))
664                        {
665                                clearscreen(interfacelist);
666                                screennetwork_adapterext(mode, listbox->select->handle);
667
668                                delmarkedscreennodes(interfacelist, 1);
669                                goto start;
670                        }
671                        if(rcret == getrcconfigint("rcgreen", NULL))
672                        {
673                                screenhostname();
674                                drawscreen(interfacelist, 0, 0);
675                        }
676                }
677        }
678
679        delmarkedscreennodes(interfacelist, 1);
680        delownerrc(interfacelist);
681        clearscreen(interfacelist);
682}
683
684int wlanstart()
685{
686        int ret = 0;
687#ifndef OEBUILD
688        system("killall wpa_supplicant; sleep 2; killall -9 wpa_supplicant");
689        ret = system("wlan.sh");
690#endif
691
692        addinetworkall(NULL);
693
694        return ret;
695}
696
697void screennetwork_wlan()
698{
699        int rcret = -1, scan = 0, ret = 0;
700        struct skin* wlan = getscreen("wlansettings");
701        struct skin* listbox = getscreennode(wlan, "listbox");
702        struct skin* startmode = getscreennode(wlan, "startmode");
703        struct skin* ssid = getscreennode(wlan, "ssid");
704        struct skin* type = getscreennode(wlan, "type");
705        struct skin* key = getscreennode(wlan, "key");
706        struct skin* b3 = getscreennode(wlan, "b3");
707        struct skin* b4 = getscreennode(wlan, "b4");
708        struct skin* b5 = getscreennode(wlan, "b5");
709        struct skin* b6 = getscreennode(wlan, "b6");
710        struct skin* b7 = getscreennode(wlan, "b7");
711        struct skin* load = getscreen("loading");
712        struct inetwork* net = NULL;
713        struct skin* tmp = NULL, *tmp1 = NULL, *tmp2 = NULL;
714        char* tmpstr = NULL;
715
716        char* wtype = NULL, *wssid = NULL, *wkey = NULL;
717
718        readwlan("/mnt/network/wpa_supplicant.conf", &wtype, &wssid, &wkey);
719
720        addchoicebox(startmode, "n", _("no"));
721        addchoicebox(startmode, "y", _("yes"));
722        setchoiceboxselection(startmode, getownconfig("wlan"));
723
724        changeinput(ssid, wssid);
725        free(wssid); wssid = NULL;
726
727        addchoicebox(type, "0", _("NONE"));
728        addchoicebox(type, "1", _("WEP"));
729        addchoicebox(type, "2", _("WPA"));
730        addchoicebox(type, "3", _("WPA2"));
731        setchoiceboxselection(type, wtype);
732        free(wtype); wtype = NULL;
733
734        changeinput(key, wkey);
735        free(wkey); wkey = NULL;
736
737        drawscreen(wlan, 0, 0);
738        addscreenrc(wlan, listbox);
739
740        tmp = listbox->select;
741        tmp2 = listbox->select;
742        while(1)
743        {
744                if(scan == 0) addscreenrc(wlan, tmp);
745                rcret = waitrc(wlan, 1000, 0);
746                if(scan == 0) tmp = listbox->select;
747
748                if(rcret == getrcconfigint("rcexit", NULL))
749                {
750                        if(scan == 1)
751                        {
752                                scan = 0;
753                                delmarkedscreennodes(wlan, 1);
754                                startmode->hidden = NO;
755                                ssid->hidden = NO;
756                                type->hidden = NO;
757                                key->hidden = NO;
758                                b3->hidden = NO;
759                                b4->hidden = NO;
760                                b5->hidden = NO;
761                                b6->hidden = NO;
762                                b7->hidden = NO;
763                                listbox->select = NULL;
764                                listbox->aktline = 1;
765                                listbox->aktpage = -1;
766                                tmp = tmp2;
767                                drawscreen(wlan, 0, 0);
768                        }
769                        else
770                                break;
771                }
772
773                if(rcret == getrcconfigint("rcok", NULL) || (scan == 0 && rcret == getrcconfigint("rcgreen", NULL)))
774                {
775                        if(scan == 1)
776                        {
777                                if(listbox->select != NULL)
778                                {
779                                        ssid->linecount = 0;
780                                        ssid->pagecount = 0;
781                                        ssid->poscount = 0;
782                                        ssid->aktpage = 0;
783                                        ssid->aktline = 0;
784                                        changeinput(ssid, listbox->select->text);
785                                }
786                                scan = 0;
787                                delmarkedscreennodes(wlan, 1);
788                                startmode->hidden = NO;
789                                ssid->hidden = NO;
790                                type->hidden = NO;
791                                key->hidden = NO;
792                                b3->hidden = NO;
793                                b4->hidden = NO;
794                                b5->hidden = NO;
795                                b6->hidden = NO;
796                                b7->hidden = NO;
797                                listbox->select = NULL;
798                                listbox->aktline = 1;
799                                listbox->aktpage = -1;
800                                tmp = tmp2;
801                                drawscreen(wlan, 0, 0);
802                        }
803                        else
804                        {
805                                int tmptype = 0;
806                                if(type->ret != NULL) tmptype = atoi(type->ret);
807                                writewlan("/mnt/network/wpa_supplicant.conf", tmptype, ssid->ret, key->ret);
808                                if(startmode->ret != NULL) addownconfig("wlan", startmode->ret);
809                                if(rcret == getrcconfigint("rcok", NULL))
810                                {
811                                        net = getinetworkbydevice("eth0");
812                                        if(net != NULL && net->type != 2)
813                                        {
814                                                if(textbox(_("Message"), _("deaktivate ethernet interface ?"), _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 600, 200, 0, 0) == 1)
815                                                {
816                                                        net->type = 2; //deaktivate
817                                                        writeinterfaces();
818                                                        system("ip addr flush dev eth0 scope global");
819                                                        screennetwork_restart(net, 2);
820                                                }
821                                        }
822
823                                        if(textbox(_("Message"), _("Start Wlan ?"), _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 600, 200, 0, 0) == 1)
824                                        {
825                                                drawscreen(load, 0, 0);
826                                                ret = wlanstart();
827                                                clearscreen(load);
828
829                                                if(ret == 0)
830                                                {
831                                                        net = getinetworkfirstwlan();
832                                                        if(net != NULL)
833                                                        {
834                                                                net->type = 1; //dhcp
835                                                                screennetwork_adapterext(0, net->device);
836                                                        }
837                                                }
838                                        }
839                                        break;
840                                }
841                        }
842                        if(rcret == getrcconfigint("rcgreen", NULL))
843                        {
844                                drawscreen(load, 0, 0);
845                                ret = wlanstart();
846                                clearscreen(load);
847                                if(ret == 0)
848                                {
849                                        textbox(_("Message"), _("WLAN started.\n You can now configure the new interface."), _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 600, 200, 10, 0);
850                                        screennetwork_restart(NULL, 0);
851                                }
852                                else
853                                        textbox(_("Message"), _("WLAN not started,\nPlease check your config."), _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 600, 200, 10, 0);
854                                drawscreen(wlan, 0, 0);
855                        }
856                }
857
858                if(rcret == getrcconfigint("rcred", NULL) && scan == 0)
859                {
860                        tmp1 = NULL;
861                        scan = 1;
862                        startmode->hidden = YES;
863                        ssid->hidden = YES;
864                        type->hidden = YES;
865                        key->hidden = YES;
866                        b3->hidden = YES;
867                        b4->hidden = YES;
868                        b5->hidden = YES;
869                        b6->hidden = YES;
870                        b7->hidden = YES;
871                        listbox->select = NULL;
872                        listbox->aktline = 1;
873                        listbox->aktpage = -1;
874                        tmp1 = addlistbox(wlan, listbox, tmp1, 1);
875                        if(tmp1 != NULL)
876                                changetext(tmp1, _("searching..."));
877                        drawscreen(wlan, 0, 0);
878#ifndef OEBUILD
879                        system("wlan.sh notstart");
880#endif
881                        tmpstr = command("iwlist scanning | grep 'ESSID:' | sed 's/ESSID:\\\"\\\"/ESSID:\\\"unknown\\\"/' | sed 's/[ ]*ESSID://' | tr -d \\\"");
882
883                        tmp1 = NULL;
884                        delmarkedscreennodes(wlan, 1);
885                        if(tmpstr != NULL)
886                        {
887                                int count = 0, i = 0;
888                                struct splitstr* splitret = NULL;
889
890                                splitret = strsplit(tmpstr, "\n", &count);
891                                for(i = 0; i < count; i++)
892                                {
893                                        tmp1 = addlistbox(wlan, listbox, tmp1, 1);
894                                        if(tmp1 != NULL)
895                                                changetext(tmp1, (&splitret[i])->part);
896                                }
897                                free(splitret); splitret = NULL;
898                                free(tmpstr); tmpstr = NULL;
899                        }
900                        drawscreen(wlan, 0, 0);
901                }
902
903                if(rcret == getrcconfigint("rcyellow", NULL) && scan == 0)
904                {
905                        drawscreen(load, 0, 0);
906                        system("killall wpa_supplicant; sleep 2; killall -9 wpa_supplicant");
907                        clearscreen(load);
908                        textbox(_("Message"), _("WLAN now stopped"), _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 600, 200, 10, 0);
909                        drawscreen(wlan, 0, 0);
910                }
911
912                if(rcret == getrcconfigint("rcblue", NULL) && scan == 0)
913                {
914                        tmpstr = readfiletomem("/tmp/wlan.log", 0);
915                        textbox(_("WLAN LOG"), tmpstr, _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 800, 600, 0, 0);
916                        free(tmpstr); tmpstr = NULL;
917                        drawscreen(wlan, 0, 0);
918                }
919
920                if(rcret == getrcconfigint("rcinfo", NULL) && scan == 0)
921                {
922                        ret = WEXITSTATUS(system("check_wlan_driver.sh > /tmp/check_wlan_driver"));
923                        if(ret == 0)
924                        {
925                                tmpstr = readfiletomem("/tmp/check_wlan_driver", 0);
926                                tmpstr = ostrcat(_("Found Wlan Stick and driver for: "), tmpstr, 0, 1);
927                        }
928                        else if(ret == 1)
929                        {
930                                tmpstr = readfiletomem("/tmp/check_wlan_driver", 0);
931                                tmpstr = ostrcat(_("Found Wlan Stick but no driver\nPlease install driver: "), tmpstr, 0, 1);
932                        }
933                        else
934                                tmpstr = ostrcat(_("Wlan Stick not found"), tmpstr, 0, 1);
935
936                        unlink("/tmp/check_wlan_driver");
937                        textbox(_("WLAN Info"), tmpstr, _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 600, 200, 0, 0);
938                        free(tmpstr); tmpstr = NULL;
939                        drawscreen(wlan, 0, 0);
940                }
941
942                if(rcret == RCTIMEOUT)
943                        drawscreen(wlan, 0, 0);
944        }
945
946        delmarkedscreennodes(wlan, 1);
947        delownerrc(wlan);
948        clearscreen(wlan);
949}
950
951void screennetwork_password()
952{
953        int rcret = 0;
954        char* tmpstr = NULL;
955        char* ret = NULL;
956        char* cmd = NULL;
957
958        struct skin* password = getscreen("passwordsettings");
959        struct skin* listbox = getscreennode(password, "listbox");     
960        struct skin* rootpass = getscreennode(password, "rootpass");
961        struct skin* tmp = NULL;
962
963        changemask(rootpass, "****");
964        if(getconfig("rootpass", NULL) == NULL)
965                changeinput(rootpass, getconfig("rootpass", NULL));
966        else
967                changeinput(rootpass, "****");
968
969        drawscreen(password, 0, 0);
970        addscreenrc(password, listbox);
971
972        tmp = listbox->select;
973        while(1)
974        {
975                addscreenrc(password, tmp);
976                rcret = waitrc(password, 0, 0);
977                tmp = listbox->select;
978
979                if(rcret == getrcconfigint("rcexit", NULL)) break;
980                if(rcret == getrcconfigint("rcok", NULL))
981                {
982                        if(rootpass->ret != NULL && ostrcmp(rootpass->ret, "****") != 0)
983                        {
984                                //echo -e "linuxpassword\nlinuxpassword" | passwd root
985                                cmd = ostrcat("echo -e \"", rootpass->ret, 0, 0);
986                                cmd = ostrcat(cmd, "\\n", 1, 0);
987                                cmd = ostrcat(cmd, rootpass->ret, 1, 0);
988                                cmd = ostrcat(cmd, "\" | passwd root", 1, 0);
989                                printf("cmd: %s\n", cmd);
990
991                                tmpstr = command(cmd);
992                                printf("tmpstr: %s\n", tmpstr);
993                                textbox(_("Message"), tmpstr, _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 800, 400, 10, 0);
994                                free(cmd), cmd = NULL;
995                                free(tmpstr), tmpstr = NULL;
996
997                                debug(99, "rootpass: write");
998                                debug(99, "rootpass: %s", rootpass->ret);
999                                addconfigscreen("rootpass", rootpass);
1000                        }
1001                        else
1002                        {
1003                                debug(99, "rootpass: skipped");
1004                        }
1005                        writeallconfig(1);
1006
1007                        debug(99, "rootpass read: %s", getconfig("rootpass", NULL));
1008
1009                        break;
1010                }
1011        }
1012        delownerrc(password);
1013        clearscreen(password);
1014}
1015
1016void screennetwork_ipsec()
1017{
1018        int rcret = 0;
1019        char* tmpstr = NULL;
1020        char* ret = NULL;
1021        char* cmd = NULL;
1022        char* user = NULL;
1023        char* pass = NULL;
1024        char* dyndns = NULL;
1025        char* rekey = NULL;
1026        char* psk = NULL;
1027        char* name = NULL;
1028        char* id = NULL;
1029
1030        struct skin* ipsec = getscreen("ipsecsettings");
1031        struct skin* listbox = getscreennode(ipsec, "listbox");
1032        struct skin* skin_name = getscreennode(ipsec, "name");
1033        struct skin* skin_user = getscreennode(ipsec, "user");
1034        struct skin* skin_pass = getscreennode(ipsec, "pass");
1035        struct skin* skin_psk = getscreennode(ipsec, "psk");
1036        struct skin* skin_dyndns = getscreennode(ipsec, "dyndns");
1037        struct skin* skin_id = getscreennode(ipsec, "id");
1038        struct skin* skin_rekey = getscreennode(ipsec, "rekey");
1039        struct skin* tmp = NULL;
1040
1041        if(!file_exist("/mnt/network/ipsec.conf"))
1042                system("cp /etc/titan.restore/mnt/network/ipsec.conf /mnt/network/ipsec.conf");
1043
1044        if(!file_exist("/mnt/network/ipsec.secret"))
1045                system("cp /etc/titan.restore/mnt/network/ipsec.secret /mnt/network/ipsec.secret");
1046
1047        name = string_newline(command("cat /mnt/network/ipsec.conf | grep -v '^#' | grep -v %default | sed -nr 's/.*conn ([^ ]+).*/\\1/p'"));
1048        user = string_newline(command("cat /mnt/network/ipsec.conf | grep -v '^#' | sed -nr 's/.*xauth_identity=([^=]+).*/\\1/p'"));
1049        pass = string_newline(command("cat /mnt/network/ipsec.secrets | grep -v '^#' | sed -nr 's/.*: XAUTH \"([^\"]+)\".*/\\1/p'"));
1050        dyndns = string_newline(command("cat /mnt/network/ipsec.conf | grep -v '^#' | sed -nr 's/.*right=([^=]+).*/\\1/p'"));
1051        rekey = string_newline(command("cat /mnt/network/ipsec.conf | grep -v '^#' | sed -nr 's/.*rekey=([^=]+).*/\\1/p'"));
1052        psk = string_newline(command("cat /mnt/network/ipsec.secrets | grep -v '^#' | sed -nr 's/.*%any : PSK \"([^\"]+)\".*/\\1/p'"));
1053        id = string_newline(command("cat /mnt/network/ipsec.conf | grep -v '^#' | sed -nr 's/.*leftid=keyid:([^:]+).*/\\1/p'"));
1054
1055        printf("name: %s\n", name);
1056        printf("user: %s\n", user);
1057        printf("pass: %s\n", pass);
1058        printf("dyndns: %s\n", dyndns);
1059        printf("rekey: %s\n", rekey);
1060        printf("psk: %s\n", psk);
1061        printf("id: %s\n", id);
1062
1063        changemask(skin_name, "abcdefghijklmnopqrstuvwxyz");
1064        changeinput(skin_name, name);
1065
1066        changemask(skin_user, "abcdefghijklmnopqrstuvwxyz");
1067        changeinput(skin_user, user);
1068
1069        changemask(skin_pass, "abcdefghijklmnopqrstuvwxyz");
1070        changeinput(skin_pass, pass);
1071
1072        changemask(skin_dyndns, "abcdefghijklmnopqrstuvwxyz");
1073        changeinput(skin_dyndns, dyndns);
1074
1075        changemask(skin_psk, "abcdefghijklmnopqrstuvwxyz");
1076        changeinput(skin_psk, psk);
1077
1078        changemask(skin_id, "abcdefghijklmnopqrstuvwxyz");
1079        changeinput(skin_id, id);
1080
1081        addchoicebox(skin_rekey, "no", _("no"));
1082        addchoicebox(skin_rekey, "yes", _("yes"));
1083        setchoiceboxselection(skin_rekey, rekey);
1084
1085        drawscreen(ipsec, 0, 0);
1086        addscreenrc(ipsec, listbox);
1087
1088        tmp = listbox->select;
1089        while(1)
1090        {
1091                addscreenrc(ipsec, tmp);
1092                rcret = waitrc(ipsec, 0, 0);
1093                tmp = listbox->select;
1094
1095                if(rcret == getrcconfigint("rcexit", NULL)) break;
1096                if(rcret == getrcconfigint("rcok", NULL))
1097                {
1098                        if(skin_name->ret != NULL)
1099                        {
1100                                cmd = ostrcat("cat /mnt/network/ipsec.conf | sed 's/.*conn $%.*/conn ", skin_name->ret, 0, 0);
1101                                cmd = ostrcat(cmd,"/'", 1, 0);
1102                                printf("cmd: %s\n", cmd);
1103                                system(cmd);
1104                                free(cmd), cmd = NULL;
1105                        }
1106
1107                        if(skin_user->ret != NULL)
1108                        {
1109                                cmd = ostrcat("cat /mnt/network/ipsec.conf | sed 's/.*xauth_identity=.*/xauth_identity=", skin_user->ret, 0, 0);
1110                                cmd = ostrcat(cmd,"/'", 1, 0);
1111                                printf("cmd: %s\n", cmd);
1112                                system(cmd);
1113                                free(cmd), cmd = NULL;
1114                        }
1115
1116                        if(skin_id->ret != NULL)
1117                        {
1118                                cmd = ostrcat("cat /mnt/network/ipsec.conf | sed 's/.*leftid=keyid:.*/leftid=keyid:", skin_id->ret, 0, 0);
1119                                cmd = ostrcat(cmd,"/'", 1, 0);
1120                                printf("cmd: %s\n", cmd);
1121                                system(cmd);
1122                                free(cmd), cmd = NULL;
1123                        }
1124
1125                        if(skin_dyndns->ret != NULL)
1126                        {
1127                                cmd = ostrcat("cat /mnt/network/ipsec.conf | sed 's/.*right=.*/right=", skin_dyndns->ret, 0, 0);
1128                                cmd = ostrcat(cmd,"/'", 1, 0);
1129                                printf("cmd: %s\n", cmd);
1130                                system(cmd);
1131                                free(cmd), cmd = NULL;
1132                        }
1133
1134                        if(skin_rekey->ret != NULL)
1135                        {
1136                                cmd = ostrcat("cat /mnt/network/ipsec.conf | sed 's/.*rekey=.*/rekey=", skin_rekey->ret, 0, 0);
1137                                cmd = ostrcat(cmd,"/'", 1, 0);
1138                                printf("cmd: %s\n", cmd);
1139                                system(cmd);
1140                                free(cmd), cmd = NULL;
1141                        }
1142
1143                        if(skin_pass->ret != NULL)
1144                        {
1145                                cmd = ostrcat("cat /mnt/network/ipsec.secrets | sed 's/.*: XAUTH \".*/: XAUTH \"", skin_pass->ret, 0, 0);
1146                                cmd = ostrcat(cmd,"\"/'", 1, 0);
1147                                printf("cmd: %s\n", cmd);
1148                                system(cmd);
1149                                free(cmd), cmd = NULL;
1150                        }
1151
1152                        if(skin_psk->ret != NULL)
1153                        {
1154                                cmd = ostrcat("cat /mnt/network/ipsec.secrets | sed 's/%any : PSK \".*/%any : PSK \"", skin_psk->ret, 0, 0);
1155                                cmd = ostrcat(cmd,"\"/'", 1, 0);
1156                                printf("cmd: %s\n", cmd);
1157                                system(cmd);
1158                                free(cmd), cmd = NULL;
1159                        }
1160
1161                        if(skin_user->ret != NULL)
1162                        {
1163                                cmd = ostrcat("cat /mnt/network/ipsec.secrets | sed 's/.* : XAUTH/", skin_user->ret, 0, 0);
1164                                cmd = ostrcat(cmd," : XAUTH/'", 1, 0);
1165                                printf("cmd: %s\n", cmd);
1166                                system(cmd);
1167                                free(cmd), cmd = NULL;
1168                        }
1169
1170                        debug(99, "name: %s", skin_name->ret);
1171                        debug(99, "user: %s", skin_user->ret);
1172                        debug(99, "pass: %s", skin_pass->ret);
1173                        debug(99, "dyndns: %s", skin_dyndns->ret);
1174                        debug(99, "psk: %s", skin_psk->ret);
1175                        debug(99, "id: %s", skin_id->ret);
1176                        debug(99, "rekey: %s", skin_rekey->ret);
1177
1178                        break;
1179                }
1180        }
1181        delownerrc(ipsec);
1182        clearscreen(ipsec);
1183}
1184
1185#endif
Note: See TracBrowser for help on using the repository browser.