source: titan/titan/multiboot.h @ 44550

Last change on this file since 44550 was 44198, checked in by gost, 4 years ago

fix

  • Property svn:executable set to *
File size: 11.5 KB
Line 
1#ifndef MULTIBOOT_H
2#define MULTIBOOT_H
3
4int install_image(char* part)
5{
6        char* imagedir = NULL;
7        char* point = NULL;
8        char* command = NULL;
9               
10        imagedir = screendir("/tmp", "*.bz2 *.zip", NULL, NULL, NULL, NULL, 0, "SELECT", 0, NULL, 0, NULL, 0, 1200, 0, 600, 0, 0);
11        if(imagedir == NULL)
12                return 2;
13       
14        printf("----> imagedir: %s\n", imagedir);
15        if(cmpfilenameext(imagedir, ".zip") == 0)
16        {
17                command = ostrcat("unzip ", imagedir, 0, 0);
18                command = ostrcat(command, " -d /tmp -j -o", 1, 0);
19                printf("----> unzip command: %s\n", command);
20                system(command);
21                free(command); command = NULL;
22                command = ostrcat("rm ", imagedir, 0, 0);
23                system(command);
24                free(command); command = NULL;
25                free(imagedir); imagedir = NULL;
26                imagedir = ostrcat("/tmp/rootfs.tar.bz2", NULL, 0, 0);
27        }
28               
29        point = strrchr(imagedir,'/');
30        if(point == NULL)
31                return 0;
32        point[0] = '\0';
33        command = ostrcat("ofgwrite -m", part, 0, 0);
34        command = ostrcat(command, " ", 1, 0);
35        command = ostrcat(command, imagedir, 1, 0);
36        printf("----> install command: %s\n", command);
37        int merksec = status.sec;
38        status.sec = 0; //deaktiviere Spinner
39        system(command);
40        status.sec = merksec;
41        free(imagedir); imagedir = NULL;
42        free(command); command = NULL;
43        return 1;
44}
45
46char* getmultinames(int part)
47{
48        FILE *datei;
49  char *line = NULL;
50  char *pos = NULL;
51  char *link = NULL;
52  char *data = NULL;
53  char *cmd  = NULL;
54  char *wert = NULL;
55  char *idir = NULL;
56 
57  line = malloc(MINMALLOC);
58        if(line == NULL)
59        {
60                //err("no mem");
61                return NULL;
62        }
63 
64  if(part == 1)
65  {
66        if(islink("/dev/block/by-name/linuxrootfs"))
67        {
68                link = ostrcat("/dev/block/by-name/linuxrootfs", NULL, 0, 0);
69                data = ostrcat("/tmp/multi/linuxrootfs1/etc/issue", NULL, 0, 0);
70                idir = ostrcat("/tmp/multi/linuxrootfs1", NULL, 0, 0);
71        }
72        else
73        {
74                if(checkchipset("HI3798MV200") == 1)
75                {
76                        link = ostrcat("/dev/block/by-name/userdata", NULL, 0, 0);
77                        data = ostrcat("/tmp/multi/linuxrootfs1/etc/issue", NULL, 0, 0);
78                        idir = ostrcat("/tmp/multi/linuxrootfs1", NULL, 0, 0);
79                }
80                else
81                {
82                        link = ostrcat("/dev/block/by-name/rootfs1", NULL, 0, 0);
83                        data = ostrcat("/tmp/multi/etc/issue", NULL, 0, 0);
84                        idir = ostrcat("/tmp/multi/etc", NULL, 0, 0);
85                }
86        }
87  }
88  else if(part == 2)
89  {
90        if(islink("/dev/block/by-name/userdata"))
91        {
92                link = ostrcat("/dev/block/by-name/userdata", NULL, 0, 0);
93                data = ostrcat("/tmp/multi/linuxrootfs2/etc/issue", NULL, 0, 0);
94                idir = ostrcat("/tmp/multi/linuxrootfs2", NULL, 0, 0);
95        }
96        else
97        {
98                link = ostrcat("/dev/block/by-name/rootfs2", NULL, 0, 0);
99                data = ostrcat("/tmp/multi/etc/issue", NULL, 0, 0);
100                idir = ostrcat("/tmp/multi/etc", NULL, 0, 0);
101        }
102  }
103  else if(part == 3)
104  {
105        if(islink("/dev/block/by-name/userdata"))
106        {
107                link = ostrcat("/dev/block/by-name/userdata", NULL, 0, 0);
108                data = ostrcat("/tmp/multi/linuxrootfs3/etc/issue", NULL, 0, 0);
109                idir = ostrcat("/tmp/multi/linuxrootfs3", NULL, 0, 0);
110        }
111        else
112        {
113                link = ostrcat("/dev/block/by-name/rootfs3", NULL, 0, 0);
114                data = ostrcat("/tmp/multi/etc/issue", NULL, 0, 0);
115                idir = ostrcat("/tmp/multi/etc", NULL, 0, 0);
116        }
117  }
118  else if(part == 4)
119  {
120        if(islink("/dev/block/by-name/userdata"))
121        {
122                link = ostrcat("/dev/block/by-name/userdata", NULL, 0, 0);
123                data = ostrcat("/tmp/multi/linuxrootfs4/etc/issue", NULL, 0, 0);
124                idir = ostrcat("/tmp/multi/linuxrootfs4", NULL, 0, 0);
125                }
126                else
127        {
128                link = ostrcat("/dev/block/by-name/rootfs4", NULL, 0, 0);
129                data = ostrcat("/tmp/multi/etc/issue", NULL, 0, 0);
130                idir = ostrcat("/tmp/multi/etc", NULL, 0, 0);
131        }
132        }
133 
134  system("mkdir /tmp/multi");
135  if(islink(link))
136  {
137                cmd = ostrcat("mount ", link, 0, 0);
138                cmd = ostrcat(cmd, " /tmp/multi", 1, 0);
139                if(part == 1) wert = ostrcat("1-", NULL, 0, 0);
140                if(part == 2) wert = ostrcat("2-", NULL, 0, 0);
141                if(part == 3) wert = ostrcat("3-", NULL, 0, 0);
142                if(part == 4) wert = ostrcat("4-", NULL, 0, 0);
143                if( system(cmd) != -1)
144                {
145                        if(file_exist(idir))
146                        {
147                                datei = fopen (data, "r");
148                                if(datei != NULL)
149                                        {
150                                                fgets(line, 50, datei);
151                                                if(ostrstr(line, "opennfr") == NULL)
152                                                {
153                                                        fgets(line, 50, datei);
154                                                }
155                                                pos = strstr(line, "\\n");
156                                                if(pos != NULL)
157                                                {
158                                                        pos[0] = '\0';
159                                                        //printf ("line: %s\n", line);
160                                                        wert = ostrcat(wert, line, 1, 0);
161                                                }
162                                                fclose (datei);
163                                        }
164                                        else
165                                        wert = ostrcat(wert, "unknown", 1, 0);
166                                        system("umount /tmp/multi");
167                                }
168                                else
169                                {
170                                        wert = ostrcat(wert, "free", 1, 0);
171                                        system("umount /tmp/multi");
172                                }
173                        }
174                        else
175                                wert = ostrcat(wert, "free", 1, 0);
176                        free(cmd);
177        }
178        else
179                wert = ostrcat("can not be determined", NULL, 0, 0);
180        system("rmdir /tmp/multi");
181
182        free(link);
183        free(data);
184        free(line);
185        free(idir);
186       
187        return wert;
188}
189
190void screenmultiboot(void)
191{
192        int rcret = 0;
193       
194        DIR *dir;
195        struct dirent * member;
196        char *tmpstr = NULL;
197        char *tmpstr2 = NULL;
198        char *tmpstr3 = NULL;
199        char *ownpart = NULL;
200        char *instpart = NULL;
201        char *ownpartname = NULL;
202        char *partname = NULL;
203        int neustart = 0;
204        int ret = 0;
205        int end = 0;
206        int part = 0;
207       
208        struct skin* screen = getscreen("multiboot");
209        struct skin* listbox = getscreennode(screen, "listbox");
210        struct skin* partitions = getscreennode(screen, "partitions");
211
212        while(end == 0)
213        {
214                changechoiceboxvalue(partitions, NULL);
215               
216                if(checkchipset("HI3798MV200") == 1)
217                {
218                        tmpstr = readsys("/boot/STARTUP", 2);
219                        tmpstr2 = ostrstr(tmpstr, "rootsubdir");
220                        if(tmpstr2 != NULL)
221                        {
222                                tmpstr2[23] = '\0';
223                                ownpart = ostrcat(tmpstr2+22, NULL, 0, 0);
224                                printf("----> own part: %s\n", ownpart);
225                        }
226                }
227                else
228                {
229                        tmpstr = readsys("/boot/STARTUP", 1);
230                        tmpstr2 = ostrstr(tmpstr, "kernel");
231                        if(tmpstr2 != NULL)
232                        {
233                                tmpstr2[7] = '\0';
234                                ownpart = ostrcat(tmpstr2+6, NULL, 0, 0);
235                        }
236                }
237         free(tmpstr); tmpstr = NULL;
238         tmpstr2 = NULL;               
239               
240                dir = opendir("/boot"); /* oeffne aktuelles Verzeichnis */
241                if (dir)
242                {
243                        if(islink("/dev/block/by-name/linuxrootfs"))
244                                part = 1;
245                        else if(islink("/dev/block/by-name/rootfs1"))
246                                part = 1;
247                        else if(islink("/dev/block/by-name/linuxkernel1"))
248                                part = 1;
249                               
250                        while (0 != (member = readdir(dir)))
251                        {
252                        if(ostrcmp(".", member->d_name) != 0 && ostrcmp("..", member->d_name) != 0 && ostrcmp("STARTUP", member->d_name) != 0)
253                                {
254                                if(checkchipset("HI3798MV200") == 1)
255                                        {
256                                        if(ostrstr(member->d_name, "STARTUP_LINUX") != NULL)
257                                        {
258                                                tmpstr = ostrcat("/boot/", member->d_name, 0, 0);
259                                                tmpstr2 = readsys(tmpstr, 2);
260                                                tmpstr3 = ostrstr(tmpstr2, "rootsubdir");
261                                                if(tmpstr3 != NULL)
262                                                {
263                                                        tmpstr3[23] = '\0';
264                                                        if(ostrcmp(ownpart, tmpstr3+22) == 0)
265                                                        {
266                                                                ownpartname = ostrcat(member->d_name, NULL, 0, 0);
267                                                                printf("----> own: %s\n", ownpartname);
268                                                        }
269                                                }
270                                                if(part > 0 && part < 5)
271                                                {
272                                                        partname = getmultinames(part);
273                                                        addchoicebox(partitions, member->d_name, partname);
274                                                        free(partname); partname = NULL;
275                                                        part = part + 1;
276                                                }
277                                                else
278                                                        addchoicebox(partitions, member->d_name, member->d_name);
279                                        }
280                                        else
281                                                continue;
282                                }
283                                else
284                                {
285                                        tmpstr = ostrcat("/boot/", member->d_name, 0, 0);
286                                        tmpstr2 = readsys(tmpstr, 1);
287                                        tmpstr3 = ostrstr(tmpstr2, "kernel");
288                                        if(tmpstr3 != NULL)
289                                        {
290                                                tmpstr3[7] = '\0';
291                                                if(ostrcmp(ownpart, tmpstr3+6) == 0)
292                                                {
293                                                        ownpartname = ostrcat(member->d_name, NULL, 0, 0);
294                                                        printf("----> own: %s\n", ownpartname);
295                                                }
296                                                if(part > 0 && part < 5)
297                                                {
298                                                        partname = getmultinames(part);
299                                                        addchoicebox(partitions, member->d_name, partname);
300                                                        free(partname); partname = NULL;
301                                                        part = part + 1;
302                                                }
303                                                else
304                                                        addchoicebox(partitions, member->d_name, member->d_name);
305                                        }
306                                }               
307                                free(tmpstr); tmpstr = NULL;
308                                free(tmpstr2); tmpstr2 = NULL;
309                                tmpstr3 = NULL;
310                        }
311                        }
312                        closedir(dir);
313                        setchoiceboxselection(partitions, ownpartname);
314                }
315
316       
317       
318                drawscreen(screen, 0, 0);
319                addscreenrc(screen, listbox);
320       
321                struct skin* tmp = NULL;
322                tmp = listbox->select;
323
324                while(1)
325                {
326                        addscreenrc(screen, tmp);
327                        rcret = waitrc(screen, 0, 0);
328                        tmp = listbox->select;
329                        if(rcret == getrcconfigint("rcexit", NULL))
330                        {
331                                end = 1;
332                                break;
333                        }
334                        if(rcret == getrcconfigint("rcok", NULL))
335                        {
336                                tmpstr = ostrcat("cp /boot/", partitions->ret, 0, 0);
337                                if(checkchipset("HI3798MV200") == 1)
338                                        tmpstr = ostrcat(tmpstr, " /boot/STARTUP", 1, 0);
339                                else
340                                        tmpstr = ostrcat(tmpstr, " /boot/startup", 1, 0);
341                                printf("----> activate startup: %s\n", tmpstr);
342                                system(tmpstr);
343                                free(tmpstr); tmpstr = NULL;
344                                if(textbox("MultiBoot", _("Do you want to start now the selected image?"), _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 650, 200, 0, 0) == 1)
345                                        neustart = 1;
346                                else
347                                        neustart = 0;
348                                end = 1;
349                                break;
350                        }
351                        if(rcret == getrcconfigint("rcred", NULL))
352                        {
353                                tmpstr = ostrcat("/boot/", partitions->ret, 0, 0);
354                                if(checkchipset("HI3798MV200") == 1)
355                                {
356                                        tmpstr2 = readsys(tmpstr, 2);
357                                        tmpstr3 = ostrstr(tmpstr2, "rootsubdir");
358                                if(tmpstr3 != NULL)
359                                {
360                                                tmpstr3[23] = '\0';
361                                                instpart = ostrcat(tmpstr3+22, NULL, 0, 0);
362                                }
363                        }
364                                else
365                                {
366                                        tmpstr2 = readsys(tmpstr, 1);
367                                        tmpstr3 = ostrstr(tmpstr2, "kernel");
368                                        if(tmpstr3 != NULL)
369                                        {
370                                                tmpstr3[7] = '\0';
371                                                instpart = ostrcat(tmpstr3+6, NULL, 0, 0);
372                                        }
373                                }
374                                free(tmpstr); tmpstr = NULL;
375                                free(tmpstr2); tmpstr2 = NULL;
376                                tmpstr3 = NULL;                 
377                               
378                                if(ostrcmp(ownpartname, partitions->ret) == 0)
379                                {
380                                        if(textbox("MultiBoot", _("You have chosen the active image\nDo you really want to overwrite this?"), _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 650, 200, 0, 0) == 1)
381                                                ret = install_image(instpart);
382                                        else
383                                                ret = 2;
384                                }
385                                else
386                                {
387                                        if(textbox("MultiBoot", _("Do you really want to overwrite the chosen image?"), _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 650, 200, 0, 0) == 1)
388                                                ret = install_image(instpart);
389                                        else
390                                                ret = 2;
391                                }       
392                                if(ret == 1)
393                                        textbox("MultiBoot", _("The image was successfully installed"), _("OK"), getrcconfigint("rcok", NULL), NULL, 0, NULL, 0, NULL, 0, 650, 200, 0, 0);     
394                                if(ret == 0)
395                                        textbox("MultiBoot", _("ERROR: The installation ends with error"), _("OK"), getrcconfigint("rcok", NULL), NULL, 0, NULL, 0, NULL, 0, 650, 200, 0, 0);                           
396                                ret = 0;
397                                free(instpart); instpart = NULL;
398                                break;
399                        }
400                        if(rcret == getrcconfigint("rcgreen", NULL))
401                        {
402                                textbox("MultiBoot", _("Renaming is not available at the moment."), _("OK"), getrcconfigint("rcok", NULL), NULL, 0, NULL, 0, NULL, 0, 650, 200, 0, 0);
403                                /*tmpstr = screeninputhelp(partitions->ret, 0, 0, 0);
404                                if(tmpstr != NULL)
405                                {
406                                        tmpstr = ostrcat("/boot/", tmpstr, 0, 1);
407                                        tmpstr2 = ostrcat("/boot/", partitions->ret, 0, 0);
408                                        tmpstr3 = ostrcat("mv ", tmpstr2, 0, 0);
409                                        tmpstr3 = ostrcat(tmpstr3, " ", 1, 0);
410                                        tmpstr3 = ostrcat(tmpstr3, tmpstr, 1, 0);
411                                        system(tmpstr3);
412                                        free(tmpstr); tmpstr = NULL;
413                                        free(tmpstr2); tmpstr2 = NULL;
414                                        free(tmpstr3); tmpstr3 = NULL;
415                                        break;
416                                }*/
417                        }
418                }
419                delownerrc(screen);
420                clearscreen(screen);
421                free(ownpart); ownpart = NULL;
422                free(ownpartname); ownpartname = NULL;
423        }
424        if(neustart == 1)
425                oshutdown(2, 1);
426}
427
428
429#endif         
430       
431       
Note: See TracBrowser for help on using the repository browser.