source: titan/plugins/multiimage/MultiImage.c @ 38874

Last change on this file since 38874 was 38874, checked in by Stephan, 6 years ago

let error be translated

  • Property svn:executable set to *
File size: 16.4 KB
Line 
1#include "../../titan/struct.h"
2#include "../../titan/debug.h"
3#include "../../titan/header.h"
4
5char pluginname[] = "MultiImage";
6char plugindesc[] = "Start Images from USB device";
7char pluginpic[] = "%pluginpath%/multiimage/MultiImage.png";
8
9int pluginaktiv = 0;
10//int pluginversion = PLUGINVERSION;
11int pluginversion = 999999;
12
13char* imagepath = NULL;
14
15struct stimerthread* Multi_Image_thread = NULL;
16
17char* get_dir(char* path)
18{
19        struct dirent* dirzeiger;
20        char* dirall = NULL;
21        DIR *dir = opendir(path);
22        if (dir != 0)
23        {
24                struct dirent* dirzeiger;
25                while(0 != (dirzeiger = readdir(dir)))
26                {
27                        if(dirzeiger->d_name[0] != '.')
28                        {
29                                dirall = ostrcat(dirall, dirzeiger->d_name, 1, 0);
30                                dirall = ostrcat(dirall, " \n", 1, 0);
31                        }
32                }
33                closedir(dir);
34        }
35        return dirall;
36}
37
38void multiimage_thread()
39{
40        char* cmd = NULL;
41        while (Multi_Image_thread->aktion != STOP)
42        {
43                sleep(3);
44                if(file_exist("/tmp/multiende") == 1)
45                {
46                        textbox(_("Message"), _("INFO\nImage extracted"), _("OK"), getrcconfigint("rcok", NULL), NULL, 0, NULL, 0, NULL, 0, 500, 200, 0, 0);
47                        remove("/tmp/multiende");
48                        break;
49                }
50        }
51        if(Multi_Image_thread->aktion == STOP)
52        {
53                system("killall multi_unpack.sh");
54                system("killall ubireader_extract_files");
55                cmd = ostrcat("rm -r ",imagepath, 0, 0);
56                system(cmd);
57                free(cmd); cmd = NULL;
58
59        }
60        else
61        {
62                if(status.extplugin != NULL)
63                {
64                        free(status.extplugin);
65                        status.extplugin = NULL;
66                }
67                //Aufruf des plugins
68                status.extplugin = ostrcat("MultiImage", NULL, 0, 0);
69                writerc(getrcconfigint("rcexit", NULL));
70        }
71        free(imagepath); imagepath=NULL;
72        Multi_Image_thread = NULL;
73}
74
75
76char* find_multiimage_dev()
77{
78        char* mdev = NULL;
79        char* path = NULL;
80
81        char* pos = NULL;
82        FILE* fd = NULL;
83        char* fileline = NULL;
84        fd = fopen("/proc/partitions", "r");
85        if(fd == NULL)
86        {
87                err("open /proc/partitions");
88                return NULL;
89        }
90        fileline = malloc(MINMALLOC);
91        if(fileline == NULL)
92        {
93                err("no mem");
94                return NULL;
95        }
96        while(fgets(fileline, MINMALLOC, fd) != NULL)
97        {
98                pos = ostrstr(fileline, "sd");
99                if(pos != NULL)
100                {
101                        pos = string_newline(pos);
102                        if(strlen(pos) == 4)
103                        {
104                                path = getconfig("mountpath", NULL);
105                                path = ostrcat(path, "/", 0, 0);
106                                path = ostrcat(path, pos, 1, 0);
107                                path = ostrcat(path, "/", 1, 0);
108                                path = ostrcat(path, "titan_multi", 1, 0);
109                                if(file_exist(path) == 1)
110                                {
111                                        mdev = ostrcat(mdev, pos, 1, 0);
112                                }
113                                free(path); path = NULL;
114                        }
115                }
116                if(mdev != NULL)
117                        break;
118        }
119        free(fileline);
120        fclose(fd);
121
122        return mdev;
123}
124
125
126int no_mdev()
127{
128        char* mdev = NULL;
129        char* path = NULL;
130        char* dirall = NULL;
131        char* cmd = NULL;
132        struct skin* tmp = NULL;
133        int ret = 0;
134        int rcret = 0;
135        int ren = 0;
136
137        struct skin* multipart = getscreen("multipart");
138        struct skin* listbox = getscreennode(multipart, "listbox");
139        struct skin* device = getscreennode(multipart, "device");
140        struct skin* text2 = getscreennode(multipart, "textbox2");
141
142        char* pos = NULL;
143        FILE* fd = NULL;
144        char* fileline = NULL;
145        fd = fopen("/proc/partitions", "r");
146        if(fd == NULL)
147        {
148                err("open /proc/partitions");
149                return 1;
150        }
151        fileline = malloc(MINMALLOC);
152        if(fileline == NULL)
153        {
154                err("no mem");
155                return 1;
156        }
157        while(fgets(fileline, MINMALLOC, fd) != NULL)
158        {
159                pos = ostrstr(fileline, "sd");
160                if(pos != NULL)
161                {
162                        pos = string_newline(pos);
163                        if(strlen(pos) == 4)
164                        {
165                                if(mdev == NULL)
166                                        mdev = ostrcat(mdev, pos, 1, 0);
167                                addchoicebox(device, pos, pos);
168                        }
169                }
170        }
171        free(fileline);
172        fclose(fd);
173        if(mdev == NULL)
174        {
175                textbox("MultiImage", _("No device available"), _("OK"), getrcconfigint("rcok", NULL),NULL, 0, NULL, 0, NULL, 0, 500, 200, 0, 0);
176                return 1;
177        }
178        setchoiceboxselection(device, mdev);
179        path = getconfig("mountpath", NULL);
180        path = ostrcat(path, "/", 0, 0);
181        path = ostrcat(path, mdev, 1, 0);
182
183        dirall = get_dir(path);
184        free(path); path = NULL;
185
186        changetext(text2, dirall);
187        free(dirall); dirall = NULL;
188
189        free(mdev); mdev=NULL;
190
191        drawscreen(multipart, 0, 0);
192        addscreenrc(multipart, listbox);
193        tmp = listbox->select;
194        while(1)
195        {
196                addscreenrc(multipart, tmp);
197                rcret = waitrc(multipart, 2000, 0);
198                tmp = listbox->select;
199                if(rcret == getrcconfigint("rcexit", NULL)) break;
200
201                if((rcret == getrcconfigint("rcleft", NULL) || rcret == getrcconfigint("rcright", NULL)) && listbox->select != NULL && ostrcmp(listbox->select->name, "device") == 0)
202                {
203                        mdev = ostrcat(mdev, device->ret, 1, 0);
204                        path = getconfig("mountpath", NULL);
205                        path = ostrcat(path, "/", 0, 0);
206                        path = ostrcat(path, mdev, 1, 0);
207                        dirall = get_dir(path);
208                        free(path); path = NULL;
209                        changetext(text2, dirall);
210                        free(dirall); dirall = NULL;
211                        free(mdev); mdev = NULL;
212                }
213
214                if(rcret == getrcconfigint("rcred", NULL))
215                {
216                        mdev = ostrcat(mdev, device->ret, 1, 0);
217                        cmd = ostrcat("umount /dev/", mdev, 0, 0);
218                        debug(81, "unmount cmd: %s", cmd);
219                        ret = system(cmd);
220                        free(cmd); cmd = NULL;
221                        break;
222                }
223                if(rcret == getrcconfigint("rcgreen", NULL))
224                {
225                        mdev = ostrcat(mdev, device->ret, 1, 0);
226                        path = getconfig("mountpath", NULL);
227                        path = ostrcat(path, "/", 0, 0);
228                        path = ostrcat(path, mdev, 1, 0);
229
230                        cmd = ostrcat("mount | grep ", mdev, 0, 0);
231                        cmd = ostrcat(cmd, " | grep ext[2,3,4]", 1, 0);
232                        ret = system(cmd);
233                        free(cmd); cmd = NULL;
234                        if(ret == 0)
235                        {
236                                cmd = ostrcat(path, "/", 0, 0);
237                                cmd = ostrcat(cmd, "titan_multi", 1, 0);
238                                mkdir(cmd, 777);
239                                free(cmd); cmd=NULL;
240                                ren = 1;
241                        }
242                        else
243                        {
244                                textbox(_("ERROR"), _("No Linux partition found on this device."), _("OK"), getrcconfigint("rcok", NULL),NULL, 0, NULL, 0, NULL, 0, 600, 200, 0, 0);
245                                ren = 0;
246                        }
247                        free(path); path=NULL;
248                        free(mdev); mdev=NULL;
249                        if(ren == 1)
250                                break;
251                }
252                drawscreen(multipart, 0, 0);
253        }
254        delownerrc(multipart);
255        clearscreen(multipart);
256
257        if(mdev == NULL)
258                return 1;
259
260        if(ren != 1)
261        {
262                if(textbox("MultiImage", _("All data on this device will be deleted!\nOK?"), _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 650, 200, 0, 0) == 2)
263                {
264                        free(mdev); mdev = NULL;
265                        return 1;
266                }
267                //cmd = ostrcat("mkfs.ext2.gui /dev/" , mdev, 0, 0);
268                cmd = ostrcat("mkfs.ext3.gui -T largefile -m0 -O dir_index /dev/" , mdev, 0, 0);
269                debug(81, "format cmd: %s", cmd);
270                ret = system(cmd);
271                free(cmd); cmd = NULL;
272                if(ret != 0)
273                {
274                        textbox(_("Message"), _("ERROR\nPartition could not be created"), _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 500, 200, 0, 0);
275                        return 1;
276                }
277                path = getconfig("mountpath", NULL);
278                path = ostrcat(path, "/", 0, 0);
279                path = ostrcat(path, mdev, 1, 0);
280                cmd = ostrcat("mount /dev/" , mdev, 0, 0);
281                cmd = ostrcat(cmd, " ", 1, 0);
282                cmd = ostrcat(cmd, path, 1, 0);
283                //system(cmd);
284                free(cmd); cmd = NULL;
285                cmd = ostrcat(path, "/", 0, 0);
286                cmd = ostrcat(cmd, "titan_multi", 1, 0);
287                mkdir(cmd, 777);
288                free(cmd); cmd = NULL;
289                free(path); path = NULL;
290                free(mdev); mdev = NULL;
291                system ("echo MultiImage > /dev/vfd");
292        }
293
294        return 0;
295}
296
297// type 1 = install image
298// type 2 = rename image
299int multiimage_install(char* imagefile, char* mdev, int type)
300{
301        int rcret = 0;
302        int rc = 0;
303        char* path = NULL;
304        char* path2 = NULL;
305        char* path3 = NULL;
306        char* cmd = NULL;
307        char* temp = NULL;
308        char* iname = NULL;
309
310        struct skin* tmp = NULL;
311        struct skin* multiinstall = getscreen("multiinstall");
312        struct skin* listbox = getscreennode(multiinstall, "listbox");
313        struct skin* text1 = getscreennode(multiinstall, "text1");
314        struct skin* imagename = getscreennode(multiinstall, "imagename");
315        struct skin* b2 = getscreennode(multiinstall, "b2");
316        if(type == 1)
317        {
318                changetext(b2, _("INSTALL"));
319                changeinput(imagename, "imagename");
320        }
321        if(type == 2)
322        {
323                changetext(b2, _("RENAME"));
324                changeinput(imagename, imagefile);
325        }
326
327        path = getconfig("mountpath", NULL);
328        path = ostrcat(path, "/", 0, 0);
329        path = ostrcat(path, mdev, 1, 0);
330
331        path2 = ostrcat(path, "/", 0, 0);
332        path2 = ostrcat(path2,"titan_multi", 1, 0);
333
334        changetext(text1, imagefile);
335
336
337        drawscreen(multiinstall, 0, 0);
338        addscreenrc(multiinstall, listbox);
339        tmp = listbox->select;
340        while(1)
341        {
342                addscreenrc(multiinstall, tmp);
343                rcret = waitrc(multiinstall, 2000, 0);
344                tmp = listbox->select;
345                if(rcret == getrcconfigint("rcexit", NULL))
346                        break;
347                if(rcret == getrcconfigint("rcred", NULL))
348                {
349                        path3 = ostrcat(path2, "/", 0, 0);
350                        path3 = ostrcat(path3, imagename->ret, 1, 0);
351                        if(file_exist(path3) == 1)
352                        {
353                                free(path3); path3=NULL;
354                                textbox(_("Message"), _("ERROR\nImage already present!"), _("OK"), getrcconfigint("rcok", NULL), NULL, 0, NULL, 0, NULL, 0, 500, 200, 0, 0);
355                                continue;
356                        }
357                        if(type == 1)
358                        {
359                                iname = ostrcat(imagename->ret, NULL, 1, 0);
360                                rc = 1;
361                                break;
362                        }
363                        if(type == 2)
364                        {
365                                temp = ostrcat(path2, "/", 0, 0);
366                                temp = ostrcat(temp, imagefile, 1, 0);
367                                cmd = ostrcat("mv ", temp, 0, 0);
368                                cmd = ostrcat(cmd, " ", 1, 0);
369                                cmd = ostrcat(cmd, path3, 1, 0);
370                                system(cmd);
371                                free(cmd); cmd=NULL;
372                                free(temp); temp=NULL;
373                                rc = 2;
374                                break;
375                        }
376                }
377                drawscreen(multiinstall, 0, 0);
378        }
379        delownerrc(multiinstall);
380        clearscreen(multiinstall);
381        if(rc == 1)
382        {
383                if(imagepath != NULL)
384                        free(imagepath);
385                imagepath = NULL;
386                imagepath = ostrcat(path2, "/", 0, 0);
387                imagepath = ostrcat(imagepath, iname, 1, 0);
388                temp = createpluginpath("/multiimage/ubireader/ubi_reader-master/scripts/ubireader_extract_files", 0);
389                cmd = createpluginpath("/multiimage/multi_unpack.sh", 0);
390                cmd = ostrcat(cmd, " ", 1, 0);
391                cmd = ostrcat(cmd, imagefile, 1, 0);
392                cmd = ostrcat(cmd, " ", 1, 0);
393                cmd = ostrcat(cmd, iname, 1, 0);
394                cmd = ostrcat(cmd, " ", 1, 0);
395                cmd = ostrcat(cmd, path, 1, 0);
396                cmd = ostrcat(cmd, " ", 1, 0);
397                cmd = ostrcat(cmd, temp, 1, 0);
398                cmd = ostrcat(cmd, " &", 1, 0);
399                system(cmd);
400                free(cmd); cmd=NULL;
401                free(temp); temp=NULL;
402                textbox(_("Message"), _("Extracting will take a few minutes ...\n\nProcess is running in background.\nA message will be shown when finished."), _("OK"), getrcconfigint("rcok", NULL), NULL, 0, NULL, 0, NULL, 0, 600, 300, 10, 0);
403                Multi_Image_thread = addtimer(&multiimage_thread, START, 10000, 1, NULL, NULL, NULL);
404        }
405
406        free(path); path=NULL;
407        free(path2); path2=NULL;
408        free(path3); path3=NULL;
409        return rc;
410}
411
412int multiimage_screen(char* mdev)
413{
414        struct skin* tmp = NULL;
415        char* path = NULL;
416        char* cmd = NULL;
417        char* tmpstr = NULL;
418        char* selimage = NULL;
419        struct dirent* dirzeiger;
420        DIR *dir = NULL;
421        int rcret = 0;
422        int rc = 0;
423        int test = 0;
424        int test2 = 0;
425
426        struct skin* multiimage = getscreen("multiimage");
427        struct skin* listbox = getscreennode(multiimage, "listbox");
428        struct skin* images = getscreennode(multiimage, "images");
429        struct skin* chnode1 = NULL;
430
431        path = getconfig("mountpath", NULL);
432        path = ostrcat(path, "/", 0, 0);
433        path = ostrcat(path, mdev, 1, 0);
434        path = ostrcat(path, "/", 1, 0);
435        path = ostrcat(path,"titan_multi", 1, 0);
436
437        delmarkedscreennodes(multiimage, 1);
438        listbox->aktpage = -1;
439        listbox->aktline = 1;
440
441        tmpstr = ostrcat(path, "/", 0, 0);
442        tmpstr = ostrcat(tmpstr, ".multi_image", 1, 0);
443        selimage = readsys(tmpstr, 1);
444        free(tmpstr); tmpstr=NULL;
445
446        test2 = 0;
447        dir = opendir(path);
448        if (dir != 0)
449        {
450                while(0 != (dirzeiger = readdir(dir)))
451                {
452                        if(dirzeiger->d_name[0] != '.')
453                        {
454                                test = 1;
455                                chnode1 = addlistbox(multiimage, listbox, chnode1, 1);
456                                if(chnode1 != NULL)
457                                {
458                                        chnode1->posy = images->posy;
459                                        chnode1->width = images->width;
460                                        chnode1->height = images->height;
461                                        chnode1->bordersize = images->bordersize;
462                                        chnode1->bordercol = images->bordercol;
463                                        chnode1->prozwidth = images->prozwidth;
464                                        chnode1->deaktivcol = images->deaktivcol;
465                                        chnode1->name = ostrcat(dirzeiger->d_name, NULL, 0, 0);
466                                        if(selimage != NULL && ostrcmp(selimage, dirzeiger->d_name) == 0)
467                                        {
468                                                tmpstr = ostrcat(dirzeiger->d_name, "  (selected)", 0, 0);
469                                                changetext(chnode1, tmpstr);
470                                                free(tmpstr); tmpstr=NULL;
471                                                test2 = 1;
472                                        }
473                                        else
474                                                changetext(chnode1, dirzeiger->d_name);
475                                }
476                        }
477                }
478                closedir(dir);
479                free(selimage); selimage = NULL;
480                if(test == 0)
481                        images->hidden = NO;
482                else
483                {
484                        images->hidden = YES;
485                        chnode1 = addlistbox(multiimage, listbox, chnode1, 1);
486                        if(chnode1 != NULL)
487                        {
488                                chnode1->posy = images->posy;
489                                chnode1->width = images->width;
490                                chnode1->height = images->height;
491                                chnode1->bordersize = images->bordersize;
492                                chnode1->bordercol = images->bordercol;
493                                chnode1->prozwidth = images->prozwidth;
494                                chnode1->deaktivcol = images->deaktivcol;
495                                chnode1->name = ostrcat("Flash", NULL, 0, 0);
496                                if(test2 == 0)
497                                        changetext(chnode1, "Flash  (selected)");
498                                else
499                                        changetext(chnode1, "Flash");
500                        }
501                }
502        }
503        drawscreen(multiimage, 0, 0);
504        addscreenrc(multiimage, listbox);
505        tmp = listbox->select;
506        while(1)
507        {
508                addscreenrc(multiimage, tmp);
509                rcret = waitrc(multiimage, 2000, 0);
510                tmp = listbox->select;
511                if(rcret == getrcconfigint("rcok", NULL))
512                {
513                        if(listbox->select != NULL)
514                        {
515                                rc = 1;
516                                tmpstr = ostrcat(path, "/", 0, 0);
517                                tmpstr = ostrcat(tmpstr, ".multi_image", 1, 0);
518                                writesys(tmpstr, listbox->select->name, 0);
519                                free(tmpstr); tmpstr=NULL;
520                                break;
521                        }
522                }
523                if(rcret == getrcconfigint("rcexit", NULL))
524                {
525                         rc = 0;
526                         break;
527                }
528                if(rcret == getrcconfigint("rcred", NULL))
529                {
530                        if(listbox->select != NULL)
531                        {
532                                rc = 1;
533                                cmd = ostrcat(_("Sure to delete Image?\n"), listbox->select->name, 0, 0);
534                                if(textbox("MultiImage", cmd, _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 600, 200, 0, 0) == 1)
535                                {
536                                        free(cmd); cmd= NULL;
537                                        cmd = ostrcat("rm -r " , path, 0, 0);
538                                        cmd = ostrcat(cmd , "/", 1, 0);
539                                        cmd = ostrcat(cmd , listbox->select->name, 1, 0);
540                                        debug(81, "delete cmd: %s", cmd);
541                                        system(cmd);
542                                }
543                                free(cmd); cmd= NULL;
544                                break;
545                        }
546                }
547                if(rcret == getrcconfigint("rcgreen", NULL))
548                {
549                        rc = 2;
550                        break;
551                }
552                if(rcret == getrcconfigint("rcblue", NULL))
553                {
554                        rc = 3;
555                        break;
556                }
557                if(rcret == getrcconfigint("rcyellow", NULL))
558                {
559                        rc = 1;
560                        selimage = ostrcat(listbox->select->name, NULL, 0, 0);
561                        break;
562                }
563                if(rcret == getrcconfigint("rcpower", NULL))
564                {
565                        rc = 4;
566                        break;
567                }
568                drawscreen(multiimage, 0, 0);
569        }
570        delownerrc(multiimage);
571        delmarkedscreennodes(multiimage, 1);
572        clearscreen(multiimage);
573        free(path); path=NULL;
574        if(selimage != NULL)
575        {
576                multiimage_install(selimage, mdev, 2);
577                free(selimage); selimage = NULL;
578        }
579        return rc;
580}
581
582void multi_main(void)
583{
584        char* mdev = NULL;
585        char* imagefile = NULL;
586        int ret = 0;
587
588        mdev = find_multiimage_dev();
589
590        while (mdev == NULL)
591        {
592                if(textbox("MultiImage", _("No MultiImage device found.\nCreate device?"), _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 500, 200, 0, 0) == 2)
593                        return;
594                if(no_mdev() != 0)
595                        return;
596                mdev = find_multiimage_dev();
597        }
598        while(1)
599        {
600                ret = multiimage_screen(mdev);
601
602                if(ret == 0)
603                        break;
604                if(ret == 1)
605                        continue;
606                if(ret == 2)
607                {
608                        textbox(_("Message"), _("The install process will look in /tmp for an image zip file.\nPlease copy the image to /tmp.\nThe filename must not contain blanks."), _("OK"), getrcconfigint("rcok", NULL), NULL, 0, NULL, 0, NULL, 0, 800, 200, 0, 0);
609                        imagefile = screendir("/tmp", "*.zip", NULL, NULL, NULL, NULL, 0, "SELECT", 0, NULL, 0, NULL, 0, 1200, 0, 600, 0, 0);
610                        if(imagefile != NULL)
611                        {
612                                ret = multiimage_install(imagefile, mdev, 1);
613                                free(imagefile); imagefile=NULL;
614                                if(ret == 1)
615                                {
616                                        free(mdev); mdev=NULL;
617                                        return;
618                                }
619                        }
620                }
621                if(ret == 3)
622                {
623                        if(no_mdev() != 0)
624                                continue;
625                        free(mdev); mdev=NULL;
626                        mdev = find_multiimage_dev();
627                }
628                if(ret == 4)
629                {
630                        oshutdown(2, 1);
631                        break;
632                }
633        }
634        free(mdev); mdev=NULL;
635}
636
637
638
639//wird beim laden ausgefuehrt
640void init(void)
641{
642        char* tmpstr = NULL;
643        pluginaktiv = 1;
644
645        tmpstr = createpluginpath("/multiimage/skin.xml", 0);
646        readscreen(tmpstr, 122, 1);
647
648        debug(10, "MultiImage Plugin loaded!!!");
649}
650
651//wird beim entladen ausgefuehrt
652void deinit(void)
653{
654        if(Multi_Image_thread != NULL)
655        {
656                Multi_Image_thread->aktion = STOP;
657                while (Multi_Image_thread != NULL)
658                {
659                        sleep(1);
660                }
661        }
662        pluginaktiv = 0;
663        debug(10, "MultiImage removed !!!");
664        delmarkedscreen(122);
665}
666
667//wird in der Pluginverwaltung bzw Menue ausfeguehrt
668void start(void)
669{
670        if(Multi_Image_thread != NULL)
671        {
672                if(textbox("MultiImage", _("Image creation running!!!\nStop process?"), _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 500, 200, 0, 0) == 2)
673                        return;
674                Multi_Image_thread->aktion = STOP;
675                struct skin* load = getscreen("loading");
676                drawscreen(load, 0, 0);
677                while (Multi_Image_thread != NULL)
678                {
679                        sleep(1);
680                }
681                clearscreen(load);
682        }
683
684        multi_main();
685}
Note: See TracBrowser for help on using the repository browser.