source: titan/titan/harddisk.h @ 25246

Last change on this file since 25246 was 25246, checked in by obi, 10 years ago

fix harddisk

File size: 30.8 KB
Line 
1#ifndef HARDDISK_H
2#define HARDDISK_H
3
4int checkfilesystemexist(char* filesystem)
5{
6        int ret = 0;
7        char* tmpstr = NULL, *tmpstr1 = NULL;
8
9        tmpstr = readfiletomem("/proc/filesystems", 0);
10
11        tmpstr1 = ostrcat("\t", filesystem, 0, 0);
12        tmpstr1 = ostrcat(tmpstr1, "\n", 0, 0);
13
14        if(ostrstr(tmpstr, tmpstr1) != NULL)
15                ret = 1;
16
17        free(tmpstr); tmpstr = NULL;
18        free(tmpstr1); tmpstr1 = NULL;
19
20        return ret;
21}
22
23char* blocktogb(unsigned long long size)
24{
25        char* buf = NULL;
26
27        buf = malloc(MINMALLOC);
28        if(buf == NULL)
29        {
30                err("no mem");
31                return NULL;
32        }
33        snprintf(buf, MINMALLOC, "%.2f", (float)size / 2 / 1024 / 1024); //size is in 512KB blocks
34        return ostrshrink(buf);
35}
36
37struct hdd* gethdd(char* device)
38{
39        struct hdd *node = hdd;
40
41        while(node != NULL)
42        {
43                if(ostrcmp(node->device, device) == 0)
44                        return node;
45                node = node->next;
46        }
47        debug(100, "hdd not found (device=%s)", device);
48        return NULL;
49}
50
51unsigned long long hddgetsize(char* device, char* partition)
52{
53        char* file = NULL;
54        unsigned long long size = 0;
55
56        file = ostrcat(file , "/sys/block/", 1, 0);
57        file = ostrcat(file , device, 1, 0);
58        if(partition != NULL)
59        {
60                file = ostrcat(file , "/", 1, 0);
61                file = ostrcat(file , partition, 1, 0);
62        }
63        file = ostrcat(file , "/size", 1, 0);
64        size = readsysull(file, 1);
65        debug(80, "file: %s, size: %lu", file, size);
66        free(file); file = NULL;
67
68        return size;
69}
70
71char* hddgetvendor(char* device)
72{
73        char* file = NULL, *vendor = NULL;
74
75        file = ostrcat(file , "/sys/block/", 1, 0);
76        file = ostrcat(file , device, 1, 0);
77        file = ostrcat(file , "/device/vendor", 1, 0);
78        vendor = strstrip(readsys(file, 1));
79        debug(80, "file: %s, vendor: %s", file, vendor);
80        free(file); file = NULL;
81
82        return vendor;
83}
84
85char* hddgetmodel(char* device)
86{
87        char* file = NULL, *model = NULL;
88
89        file = ostrcat(file , "/sys/block/", 1, 0);
90        file = ostrcat(file , device, 1, 0);
91        file = ostrcat(file , "/device/model", 1, 0);
92        model = strstrip(readsys(file, 1));
93        debug(80, "file: %s, model: %s", file, model);
94        free(file); file = NULL;
95
96        return model;
97}
98
99int hddgetremovable(char* device)
100{
101        char* file = NULL;
102        int removable = 0;
103
104        file = ostrcat(file , "/sys/block/", 1, 0);
105        file = ostrcat(file , device, 1, 0);
106        file = ostrcat(file , "/removable", 1, 0);
107        removable = readsysul(file, 1);
108        debug(80, "file: %s, removable: %d", file, removable);
109        free(file); file = NULL;
110
111        return removable;
112}
113
114void screenfilesystem(char* dev)
115{
116        int i, rcret = 0, count = 1;
117        struct skin* screen = getscreen("harddisk_main");
118        struct skin* titletext = getscreennode(screen, "titletext");
119        struct skin* listbox = getscreennode(screen, "listbox");
120        struct skin* tmp = NULL;
121        char* tmpstr = NULL, *tmpstr1 = NULL;
122
123        delmarkedscreennodes(screen, 1);
124        listbox->aktpage = -1;
125        listbox->aktline = 1;
126        changetitle(screen, _("Harddisk Format - Filesystem"));
127        if(titletext != status.skinerr) changetext(titletext, _("Harddisk Format - Filesystem"));
128
129        if(status.expertmodus > 9) count = 5;
130
131        for(i = 0; i < count; i++)
132        {
133                if(i == 0 && checkfilesystemexist("ext3") == 0) continue;
134                else if(i == 1 && checkfilesystemexist("ext4") == 0) continue;
135                else if(i == 2 && checkfilesystemexist("ext2") == 0) continue;
136                else if(i == 3 && checkfilesystemexist("jfs") == 0) continue;
137                else if(i == 4 && checkfilesystemexist("vfat") == 0) continue;
138               
139                tmp = addlistbox(screen, listbox, tmp, 1);
140                if(tmp != NULL)
141                {
142                        if(i == 0) tmpstr = "ext3";
143                        else if(i == 1) tmpstr = "ext4";       
144                        else if(i == 2) tmpstr = "ext2";
145                        else if(i == 3) tmpstr = "jfs";
146                        else if(i == 4) tmpstr = "vfat";
147                        tmpstr1 = ostrcat(tmpstr1, getconfig("skinpath", NULL), 1, 0);
148                        tmpstr1 = ostrcat(tmpstr1, "/skin/", 1, 0);
149                        tmpstr1 = ostrcat(tmpstr1, tmpstr, 1, 0);
150                        tmpstr1 = ostrcat(tmpstr1, ".png", 1, 0);
151
152                        if(!file_exist(tmpstr1))
153                        {
154                                free(tmpstr1); tmpstr1 = NULL;
155                                tmpstr1 = ostrcat(tmpstr1, getconfig("skinpath", NULL), 1, 0);
156                                tmpstr1 = ostrcat(tmpstr1, "/skin/default.png", 1, 0);
157                        }
158                        changepic(tmp, tmpstr1);
159                        free(tmpstr1); tmpstr1 = NULL;
160
161                        changename(tmp, tmpstr);
162                        if(i == 0)
163                        {
164                                tmpstr = ostrcat(tmpstr, " (", 0, 0);
165                                tmpstr = ostrcat(tmpstr, _("default"), 1, 0);
166                                tmpstr = ostrcat(tmpstr, ")", 1, 0);
167                                changetext(tmp, tmpstr);
168                                free(tmpstr); tmpstr = NULL;
169                        }
170                        else
171                                changetext(tmp, tmpstr);
172
173                        tmp->textposx = 120;
174                        tmp->height = 50;
175                        tmp->valign = convertxmlentry("middle", 0);
176                        tmp->hspace = 5;
177                }
178        }
179
180        drawscreen(screen, 0, 0);
181        addscreenrc(screen, listbox);
182
183        while (1)
184        {
185                rcret = waitrc(screen, 0, 0);
186
187                if(rcret==getrcconfigint("rcexit", NULL)) break;
188                if(listbox->select != NULL && rcret==getrcconfigint("rcok", NULL))
189                {
190                        hddformat(dev, listbox->select->name);
191                        break;
192                }
193        }
194        delownerrc(screen);
195        delmarkedscreennodes(screen, 1);
196        clearscreen(screen);
197}
198
199void screenconfigurehdd(char* dev)
200{
201        int i, y = 2, rcret = 0, ret = 0, mode = 0;
202        struct skin* screen = getscreen("harddisk_main");
203        struct skin* titletext = getscreennode(screen, "titletext");
204        struct skin* listbox = getscreennode(screen, "listbox");
205        struct skin* load = getscreen("loading");
206        struct skin* tmp = NULL;
207        char* tmpstr = NULL, *tmpstr1 = NULL, *tmpstr2 = NULL;
208        char* path = NULL;
209
210        delmarkedscreennodes(screen, 1);
211        listbox->aktpage = -1;
212        listbox->aktline = 1;
213        changetitle(screen, _("Harddisk Configure"));
214        if(titletext != status.skinerr) changetext(titletext, _("Harddisk Configure"));
215
216        if(status.expertmodus > 9) y = 8;
217
218        for(i = 0; i < y; i++)
219        {
220                tmp = addlistbox(screen, listbox, tmp, 1);
221                if(tmp != NULL)
222                {
223                        if(i == 0)
224                        {
225                                tmpstr = _("use medium for record");
226                                tmpstr1 = "addrecord";
227                        }
228                        else if(i == 1)
229                        {
230                                tmpstr = _("del medium for record");
231                                tmpstr1 = "delrecord";
232                        }
233                        else if(i == 2)
234                        {
235                                tmpstr = _("use medium for extension");
236                                tmpstr1 = "addext";
237                        }
238                        else if(i == 3)
239                        {
240                                tmpstr = _("del medium for extension");
241                                tmpstr1 = "delext";
242                        }
243                        else if(i == 4)
244                        {
245                                tmpstr = _("use medium for swap");
246                                tmpstr1 = "addswap";
247                        }
248                        else if(i == 5)
249                        {
250                                tmpstr = _("del medium for swap");
251                                tmpstr1 = "delswap";
252                        }
253                        else if(i == 6)
254                        {
255                                tmpstr = _("use medium for backup");
256                                tmpstr1 = "addbackup";
257                        }
258                        else if(i == 7)
259                        {
260                                tmpstr = _("del medium for backup");
261                                tmpstr1 = "delbackup";
262                        }
263                        tmpstr2 = ostrcat(tmpstr2, getconfig("skinpath", NULL), 1, 0);
264                        tmpstr2 = ostrcat(tmpstr2, "/skin/", 1, 0);
265                        tmpstr2 = ostrcat(tmpstr2, tmpstr1, 1, 0);
266                        tmpstr2 = ostrcat(tmpstr2, ".png", 1, 0);
267
268                        if(!file_exist(tmpstr2))
269                        {
270                                free(tmpstr2); tmpstr2 = NULL;
271                                tmpstr2 = ostrcat(tmpstr2, getconfig("skinpath", NULL), 1, 0);
272                                tmpstr2 = ostrcat(tmpstr2, "/skin/default.png", 1, 0);
273                        }
274                        changepic(tmp, tmpstr2);
275                        free(tmpstr2); tmpstr2 = NULL;
276
277                        changetext(tmp, tmpstr);
278                        changename(tmp, tmpstr1);
279                        tmp->textposx = 120;
280                        tmp->height = 50;
281                        tmp->valign = convertxmlentry("middle", 0);
282                        tmp->hspace = 5;
283                }
284        }
285
286        drawscreen(screen, 0, 0);
287        addscreenrc(screen, listbox);
288
289        while (1)
290        {
291                rcret = waitrc(screen, 0, 0);
292
293                if(rcret==getrcconfigint("rcexit",NULL)) break;
294                if(listbox->select != NULL && rcret==getrcconfigint("rcok",NULL))
295                {
296                        path = getconfig("mountpath", NULL);
297                        path = ostrcat(path, "/", 0, 0);
298                        path = ostrcat(path, dev, 1, 0);
299                        path = ostrcat(path, "/", 1, 0);
300
301                        if(ostrcmp(listbox->select->name, "addrecord") == 0)
302                        {
303                                mode = 0;
304                                path = ostrcat(path, "movie", 1, 0);
305                        }
306                        if(ostrcmp(listbox->select->name, "addswap") == 0)
307                        {
308                                mode = 0;
309                                path = ostrcat(path, "swapdir", 1, 0);
310                        }
311                        if(ostrcmp(listbox->select->name, "addext") == 0)
312                        {
313                                mode = 0;
314                                path = ostrcat(path, "swapextensions", 1, 0);
315                        }
316                        if(ostrcmp(listbox->select->name, "addbackup") == 0)
317                        {
318                                mode = 0;
319                                path = ostrcat(path, "backup", 1, 0);
320                        }
321                        if(ostrcmp(listbox->select->name, "delrecord") == 0)
322                        {
323                                mode = 1;
324                                path = ostrcat(path, "movie", 1, 0);
325                        }
326                        if(ostrcmp(listbox->select->name, "delswap") == 0)
327                        {
328                                mode = 1;
329                                path = ostrcat(path, "swapdir", 1, 0);
330                        }
331                        if(ostrcmp(listbox->select->name, "delext") == 0)
332                        {
333                                mode = 1;
334                                path = ostrcat(path, "swapextensions", 1, 0);
335                        }
336                        if(ostrcmp(listbox->select->name, "delbackup") == 0)
337                        {
338                                mode = 1;
339                                path = ostrcat(path, "backup", 1, 0);
340                        }
341
342                        if(mode == 0) ret = mkdir(path, 0777);
343                        if(mode == 1)
344                        {
345                                if(textbox("Message", _("Are you sure you want to delete this directory?"), _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 800, 200, 0, 0) == 1)
346                                {
347                                        ret = rmdir(path);
348                                        if(ret < 0)
349                                        {
350                                                if(textbox("Message", _("Directory has content\nReally delete directory and content?"), _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 800, 200, 0, 0) == 1)
351                                                {
352                                                        drawscreen(load, 0, 0);
353                                                        ret = -1;
354                                                       
355                                                        if(ostrcmp(listbox->select->name, "delswap") == 0)
356                                                                system("hotplug.sh delSwap");
357                                                       
358                                                        char* cmd = NULL;
359                                                        cmd = ostrcat("rm -rf ", path, 0, 0);
360                                                        system(cmd);
361                                                        free(cmd); cmd = NULL;
362                                                        if(file_exist(path) == 0) ret = 0;
363                                                        clearscreen(load);
364                                                }
365                                                else
366                                                        ret = 9999;
367                                        }
368                                }
369                                else
370                                        ret = 9999;
371                        }
372                        free(path); path = NULL;
373                        if(ret < 0)
374                        {
375                                if(mode == 0) perr("mkdir");
376                                if(mode == 1) perr("rmdir");
377                                textbox("Message", _("can't create or delete directory"), _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 800, 200, 5, 0);
378                        }
379                        else if(ret != 9999)
380                        {
381                                textbox("Message", _("succesfull create or delelete directory"), _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 800, 200, 5, 0);
382                                //start hotplug after create/del dir
383                                if(ostrcmp(listbox->select->name, "addrecord") == 0 || ostrcmp(listbox->select->name, "addswap") == 0 || ostrcmp(listbox->select->name, "addext") == 0 || ostrcmp(listbox->select->name, "addbackup") == 0)
384                                {
385                                        drawscreen(load, 0, 0);
386                                        system("hotplug.sh first");
387                                        clearscreen(load);
388                                }
389                                if(ostrcmp(listbox->select->name, "delrecord") == 0)
390                                {
391                                        drawscreen(load, 0, 0);
392                                        system("hotplug.sh delRecord");
393                                        clearscreen(load);
394                                }
395                                if(ostrcmp(listbox->select->name, "delext") == 0)
396                                {
397                                        drawscreen(load, 0, 0);
398                                        system("hotplug.sh delSwapextensions");
399                                        clearscreen(load);
400                                }
401                                if(ostrcmp(listbox->select->name, "delbackup") == 0)
402                                {
403                                        drawscreen(load, 0, 0);
404                                        system("hotplug.sh delBackup");
405                                        clearscreen(load);
406                                }
407                        }
408                        drawscreen(screen, 0, 0);
409                }
410        }
411        delownerrc(screen);
412        delmarkedscreennodes(screen, 1);
413        clearscreen(screen);
414}
415
416void screenharddisk(int mode)
417{
418        struct skin* screen = getscreen("harddisk_main");
419        struct skin* listbox = getscreennode(screen, "listbox");
420        struct skin* titletext = getscreennode(screen, "titletext");
421        struct skin* tmp = NULL;
422        struct hdd* hddnode = NULL;
423        int tmphangtime = 999999, rcret = 0;
424        char* tmpstr = NULL, *tmpstr1 = NULL, *path = NULL;
425
426        addhddall();
427start:
428        tmp = NULL;
429        hddnode = hdd;
430
431        if(hdd == NULL)
432        {
433                textbox(_("Harddisk"), _("sorry found no harddisk"), _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 800, 600, 0, 0);
434                return;
435        }
436
437        status.hangtime = tmphangtime;
438        delmarkedscreennodes(screen, 1);
439        if(mode == 0)
440        {
441                changetitle(screen, _("Harddisk Format - List Devices"));
442                if(titletext != status.skinerr) changetext(titletext, _("Harddisk Format - List Devices"));
443        }
444        else if(mode == 1)
445        {
446                changetitle(screen, _("Harddisk Fsck - List Devices"));
447                if(titletext != status.skinerr) changetext(titletext, _("Harddisk Fsck - List Devices"));
448        }
449        else if(mode == 2)
450        {
451                changetitle(screen, _("Harddisk Configure - List Devices"));
452                if(titletext != status.skinerr) changetext(titletext, _("Harddisk Configure - List Devices"));
453        }
454
455        listbox->aktpage = -1;
456        listbox->aktline = 1;
457
458        while(hddnode != NULL)
459        {
460                if(mode == 2 && hddnode->partition == 0)
461                {
462                        hddnode = hddnode->next;
463                        continue;
464                }
465                tmp = addlistbox(screen, listbox, tmp, 1);
466                if(tmp != NULL)
467                {
468                        if(hddnode->removable == 0)
469                        {
470                                tmpstr = ostrcat(tmpstr, _("HDD "), 1, 0);
471                                tmpstr1 = ostrcat(tmpstr1, getconfig("skinpath", NULL), 1, 0);
472                                tmpstr1 = ostrcat(tmpstr1, "/skin/hdd.png", 1, 0);
473                        }
474                        else
475                        {
476                                tmpstr = ostrcat(tmpstr, _("STICK "), 1, 0);
477                                tmpstr1 = ostrcat(tmpstr1, getconfig("skinpath", NULL), 1, 0);
478                                tmpstr1 = ostrcat(tmpstr1, "/skin/stick.png", 1, 0);
479                        }
480                        if(mode == 2)
481                        {
482                                tmpstr = ostrcat(tmpstr, hddnode->label, 1, 0);
483                                tmpstr = ostrcat(tmpstr, " (", 1, 0);
484                                tmpstr = ostrcat(tmpstr, hddnode->device, 1, 0);
485                                tmpstr = ostrcat(tmpstr, ")", 1, 0);
486
487                                path = getconfig("mountpath", NULL);
488                                path = ostrcat(path, "/", 0, 0);
489                                path = ostrcat(path, hddnode->device, 1, 0);
490                                path = ostrcat(path, "/", 1, 0);
491                                path = ostrcat(path, "swapextensions", 1, 0);
492                                if(file_exist(path) == 1)
493                                {
494                                        tmpstr = ostrcat(tmpstr, " - ", 1, 0);
495                                        tmpstr = ostrcat(tmpstr, _("ext"), 1, 0);
496                                }
497                                free(path); path = NULL;
498
499                                path = getconfig("mountpath", NULL);
500                                path = ostrcat(path, "/", 0, 0);
501                                path = ostrcat(path, hddnode->device, 1, 0);
502                                path = ostrcat(path, "/", 1, 0);
503                                path = ostrcat(path, "swapdir", 1, 0);
504                                if(file_exist(path) == 1)
505                                {
506                                        tmpstr = ostrcat(tmpstr, " - ", 1, 0);
507                                        tmpstr = ostrcat(tmpstr, _("swap"), 1, 0);
508                                }
509                                free(path); path = NULL;
510
511                                path = getconfig("mountpath", NULL);
512                                path = ostrcat(path, "/", 0, 0);
513                                path = ostrcat(path, hddnode->device, 1, 0);
514                                path = ostrcat(path, "/", 1, 0);
515                                path = ostrcat(path, "backup", 1, 0);
516                                if(file_exist(path) == 1)
517                                {
518                                        tmpstr = ostrcat(tmpstr, " - ", 1, 0);
519                                        tmpstr = ostrcat(tmpstr, _("backup"), 1, 0);
520                                }
521                                free(path); path = NULL;
522
523                                path = getconfig("mountpath", NULL);
524                                path = ostrcat(path, "/", 0, 0);
525                                path = ostrcat(path, hddnode->device, 1, 0);
526                                path = ostrcat(path, "/", 1, 0);
527                                path = ostrcat(path, "movie", 1, 0);
528                                if(file_exist(path) == 1)
529                                {
530                                        tmpstr = ostrcat(tmpstr, " - ", 1, 0);
531                                        tmpstr = ostrcat(tmpstr, _("record"), 1, 0);
532                                }
533                                free(path); path = NULL;
534                        }
535                        else
536                        {
537                                tmpstr = ostrcat(tmpstr, "(", 1, 0);
538                                tmpstr = ostrcat(tmpstr, hddnode->device, 1, 0);
539                                tmpstr = ostrcat(tmpstr, "-", 1, 0);
540                                tmpstr = ostrcat(tmpstr, hddnode->label, 1, 0);
541                                tmpstr = ostrcat(tmpstr, "-", 1, 0);
542                                tmpstr = ostrcat(tmpstr, hddnode->filesystem, 1, 0);
543                                tmpstr = ostrcat(tmpstr, ") ", 1, 0);
544                                tmpstr = ostrcat(tmpstr, hddnode->model, 1, 0);
545                                tmpstr = ostrcat(tmpstr, " ", 1, 0);
546                                tmpstr = ostrcat(tmpstr, blocktogb(hddnode->size), 1, 1);
547                                tmpstr = ostrcat(tmpstr, " GB", 1, 0);
548                        }
549                        changetext(tmp, tmpstr);
550                        free(tmpstr); tmpstr = NULL;
551
552                        changename(tmp, hddnode->device);
553                        tmp->textposx = 120;
554                        tmp->height = 50;
555                        tmp->valign = convertxmlentry("middle", 0);
556                        tmp->hspace = 5;
557
558                        if(!file_exist(tmpstr1))
559                        {
560                                free(tmpstr1); tmpstr1 = NULL;
561                                tmpstr1 = ostrcat(tmpstr1, getconfig("skinpath", NULL), 1, 0);
562                                tmpstr1 = ostrcat(tmpstr1, "/skin/default.png", 1, 0);
563                        }
564                        changepic(tmp, tmpstr1);
565                        free(tmpstr1); tmpstr1 = NULL;
566                }
567                hddnode = hddnode->next;
568        }
569
570        drawscreen(screen, 0, 0);
571        addscreenrc(screen, listbox);
572
573        while (1)
574        {
575                rcret = waitrc(screen, 0, 0);
576
577                if(rcret==getrcconfigint("rcexit",NULL)) break;
578                if(listbox->select != NULL && rcret==getrcconfigint("rcok",NULL))
579                {
580                        if(mode == 0)
581                        {
582                                tmpstr = ostrcat(listbox->select->name, NULL, 0, 0);
583                                screenfilesystem(tmpstr);
584                                free(tmpstr); tmpstr = NULL;
585                        }
586                        else if(mode == 1)
587                        {
588                                if(hddfsck(listbox->select->name) == 1)
589                                        continue;
590                        }
591                        else if(mode == 2)
592                        {
593                                tmpstr = ostrcat(listbox->select->name, NULL, 0, 0);
594                                screenconfigurehdd(tmpstr);
595                                free(tmpstr); tmpstr = NULL;
596                                delownerrc(screen);
597                                goto start;
598                        }
599                        break;
600                }
601        }
602
603        delownerrc(screen);
604        delmarkedscreennodes(screen, 1);
605        clearscreen(screen);
606}
607
608void hddformat(char* dev, char* filesystem)
609{
610        int format = 0;
611        int large = 0;
612        int rc = 0;
613        char* cmd = NULL;
614        struct hdd* node = NULL;
615       
616
617        node = gethdd(dev);
618        if(node == NULL) return;
619       
620        if(node->size > 4294967295UL)
621        {       
622                if(!file_exist("/var/bin/parted") && !file_exist("/var/swap/bin/parted") && !file_exist("/mnt/swapextensions/bin/parted"))
623                {
624                        textbox(_("Message"), _("HDD > 2TB unsupported.\nYou must first install plugin parted, then you can use this panel."), _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 800, 200, 0, 0);
625                        return;
626                }
627                large = 1;
628        }
629
630        if(node->partition == 0)
631        {
632                if(textbox(_("Message"), _("Are you sure you want to remove all Partitions\non this device and create a new Partition 1?\nBox reboots after format"), _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 800, 200, 0, 0) == 1)
633                {
634                        cmd = ostrcat("/sbin/parter.sh /dev/" , dev, 0, 0);
635                        cmd = ostrcat(cmd , " create 1 ", 1, 0);
636                        cmd = ostrcat(cmd , filesystem, 1, 0);
637                        if(large == 1)
638                                cmd = ostrcat(cmd , " large", 1, 0);
639
640                        if(!file_exist("/mnt/swapextensions/logs"))
641                                 mkdir("/mnt/swapextensions/logs", 777);
642               
643                        if(file_exist("/etc/.beta") && file_exist("/mnt/swapextensions/logs"))
644                                cmd = ostrcat(cmd, " > /mnt/swapextensions/logs/format_debug.log 2>&1", 1, 0);
645
646                        debug(80, "fdisk create cmd: %s", cmd);
647                        system(cmd);
648                        format = 2;
649                        free(cmd); cmd = NULL;
650                }
651               
652        }
653        else
654        {
655                if(textbox(_("Message"), _("Are you sure you want to format this Partition?\nBox reboots after format"), _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 800, 200, 0, 0) == 1)
656                {
657                        printf("dev: %s\n", dev);
658
659                        char* part = oregex(".*([0-9]{1,2}).*", dev);
660                        printf("part: %s\n", part);
661
662                        char* devname = oregex(".*([a-z]{3}).*", dev);
663                        printf("devname: %s\n", devname);
664
665                        cmd = ostrcat("/sbin/parter.sh /dev/" , devname, 0, 0);
666                        cmd = ostrcat(cmd , " update ", 1, 0);
667                        cmd = ostrcat(cmd , part, 1, 0);
668                        cmd = ostrcat(cmd , " ", 1, 0);
669                        cmd = ostrcat(cmd , filesystem, 1, 0);
670                        free(part), part = NULL;
671                        free(devname), devname = NULL;
672
673                        if(large == 1)
674                                cmd = ostrcat(cmd , " large", 1, 0);
675
676                        if(!file_exist("/mnt/swapextensions/logs"))
677                                 mkdir("/mnt/swapextensions/logs", 777);
678               
679                        if(file_exist("/etc/.beta") && file_exist("/mnt/swapextensions/logs"))
680                                cmd = ostrcat(cmd, " > /mnt/swapextensions/logs/format_debug.log 2>&1", 1, 0);
681
682                        debug(80, "fdisk update cmd: %s", cmd);
683                        system(cmd);
684                        format = 1;
685                        free(cmd); cmd = NULL;
686                }
687        }
688
689        if(format > 0)
690        {
691                int record = 0, ext = 0, swap = 0, backup = 0;
692               
693                if(textbox(_("Message"), _("use medium for record"), _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 800, 200, 0, 0) == 1)
694                        record = 1;
695               
696                if(status.expertmodus > 9)
697                {
698                        if(textbox(_("Message"), _("use medium for extension"), _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 800, 200, 0, 0) == 1)
699                                ext = 1;
700                        if(textbox(_("Message"), _("use medium for swap"), _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 800, 200, 0, 0) == 1)
701                                swap = 1;
702                        if(textbox(_("Message"), _("use medium for backup"), _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 800, 200, 0, 0) == 1)
703                                backup = 1;
704                }
705                       
706       
707                if(ostrcmp(filesystem, "vfat") == 0)
708                        cmd = ostrcat("/sbin/cmd.sh \"mkfs.fat -F 32\" /dev/" , dev, 0, 0);
709                else if(ostrcmp(filesystem, "jfs") == 0)
710                        cmd = ostrcat("/sbin/cmd.sh \"mkfs.jfs -q\" /dev/" , dev, 0, 0);
711                else if(ostrcmp(filesystem, "ext2") == 0)
712                        cmd = ostrcat("/sbin/cmd.sh mkfs.ext2 /dev/" , dev, 0, 0);
713                else if(ostrcmp(filesystem, "ext3") == 0)
714                        cmd = ostrcat("/sbin/cmd.sh \"mkfs.ext3 -T largefile -m0 -O dir_index\" /dev/" , dev, 0, 0);
715                else if(ostrcmp(filesystem, "ext4") == 0)
716                        cmd = ostrcat("/sbin/cmd.sh \"mkfs.ext4 -T largefile -m0 -O dir_index\" /dev/" , dev, 0, 0);
717
718                if(format == 2) cmd = ostrcat(cmd , "1", 1, 0);
719                       
720                if(record == 1)
721                        cmd = ostrcat(cmd , " 1", 1, 0);
722                else
723                        cmd = ostrcat(cmd , " 0", 1, 0);
724                       
725                if(ext == 1)
726                        cmd = ostrcat(cmd , " 1", 1, 0);
727                else
728                        cmd = ostrcat(cmd , " 0", 1, 0);
729                       
730                if(swap == 1)
731                        cmd = ostrcat(cmd , " 1", 1, 0);
732                else
733                        cmd = ostrcat(cmd , " 0", 1, 0);
734                       
735                if(backup == 1)
736                        cmd = ostrcat(cmd , " 1", 1, 0);
737                else
738                        cmd = ostrcat(cmd , " 0", 1, 0);
739
740                if(!file_exist("/mnt/swapextensions/logs"))
741                         mkdir("/mnt/swapextensions/logs", 777);
742
743                if(file_exist("/etc/.beta") && file_exist("/mnt/swapextensions/logs"))
744                        cmd = ostrcat(cmd, " >> /mnt/swapextensions/logs/format_debug.log 2>&1", 1, 0);
745
746                debug(80, "format cmd: %s", cmd);
747                rc = system(cmd);
748                free(cmd); cmd = NULL;
749                if(rc != 0)
750                {
751                        textbox(_("Message"), _("ERROR\npartition could not be created"), _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 800, 200, 0, 0);
752                        return;
753                }
754        }
755}
756
757int hddfsck(char* dev)
758{
759        char* cmd = NULL;
760        struct hdd* node = NULL;
761       
762        node = gethdd(dev);
763        if(node == NULL) return 1;
764        if(node->filesystem == NULL) return 1;
765        debug(80, "device=%s filesystem=%s", dev, node->filesystem);
766
767        if(textbox(_("Message"), _("Are you sure you want to check this Partition?\nBox reboots after check"), _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 800, 200, 0, 0) == 1)
768        {
769                if(ostrcmp(node->filesystem, "vfat") == 0)
770                        cmd = ostrcat("/sbin/cmd.sh \"fsck.fat -a -v\" /dev/" , dev, 0, 0);
771                else if(ostrcmp(node->filesystem, "jfs") == 0)
772                        cmd = ostrcat("/sbin/cmd.sh \"fsck.jfs -f -p\" /dev/" , dev, 0, 0);
773                else if(ostrcmp(node->filesystem, "ext2") == 0)
774                        cmd = ostrcat("/sbin/cmd.sh \"fsck.ext2 -f -p\" /dev/" , dev, 0, 0);
775                else if(ostrcmp(node->filesystem, "ext3") == 0)
776                        cmd = ostrcat("/sbin/cmd.sh \"fsck.ext3 -f -p\" /dev/" , dev, 0, 0);
777
778                if(!file_exist("/mnt/swapextensions/logs"))
779                         mkdir("/mnt/swapextensions/logs", 777);
780       
781                if(file_exist("/etc/.beta") && file_exist("/mnt/swapextensions/logs"))
782                        cmd = ostrcat(cmd, " > /mnt/swapextensions/logs/fsck_debug.log 2>&1", 1, 0);
783
784                debug(80, "fsck cmd: %s", cmd);
785                system(cmd);
786                free(cmd); cmd = NULL;
787        }
788
789  return 0;
790}
791
792void screenharddisksleep()
793{
794       
795        char* sleepWert = NULL;
796        int rcret = 0;
797        struct skin* sleep_config = getscreen("harddisk_main");
798        struct skin* titletext = getscreennode(sleep_config, "titletext");
799        struct skin* listbox = getscreennode(sleep_config, "listbox");
800        struct skin* node = NULL;
801        struct skin* tmp = NULL;
802       
803        /*int m_with = sleep_config->width;
804        int m_height = sleep_config->height;
805        int m_prozwidth = sleep_config->prozwidth;
806        int m_prozheight= sleep_config->prozheight;
807       
808        sleep_config->prozheight = YES;
809        sleep_config->prozwidth = YES;
810        sleep_config->width = 40;
811        sleep_config->height = 30;*/
812
813        delmarkedscreennodes(sleep_config, 1);
814        listbox->aktpage = -1;
815        listbox->aktline = 1;
816        changetitle(sleep_config, _("Harddisk Sleep"));
817        if(titletext != status.skinerr) changetext(titletext, _("Harddisk Sleep"));
818       
819        node = addlistbox(sleep_config, listbox, node, 1);
820        if(node != NULL)
821        {
822                node->type = CHOICEBOX;
823                changetext(node, _("Time to sleep")); changename(node, "timetosleep");
824                addchoicebox(node, "0", _("off"));
825                addchoicebox(node, "300", _("5 min")); addchoicebox(node, "600", _("10 min"));
826                addchoicebox(node, "900", _("15 min")); addchoicebox(node, "3600", _("60 min"));
827       
828                sleepWert = getconfig("timetosleep", NULL);
829                if(sleepWert == NULL)
830                        setchoiceboxselection(node, "0");
831                else
832                        setchoiceboxselection(node, sleepWert);
833        }
834               
835        drawscreen(sleep_config, 0, 0);
836        tmp = listbox->select;
837       
838        while(1)
839        {
840                addscreenrc(sleep_config, tmp);
841                rcret = waitrc(sleep_config, 0, 0);
842                tmp = listbox->select;
843
844                if(rcret == getrcconfigint("rcexit", NULL)) break;
845
846                if(listbox->select != NULL && listbox->select->ret != NULL && rcret == getrcconfigint("rcok", NULL))
847                {
848                        addconfig("timetosleep", listbox->select->ret);
849                        //settimetosleep(atoi(listbox->select->ret));
850                        break;
851                }
852        }
853
854        /*sleep_config->width = m_with;
855        sleep_config->height = m_height;
856        sleep_config->prozheight = m_prozheight;
857        sleep_config->prozwidth = m_prozwidth;*/
858        delmarkedscreennodes(sleep_config, 1);
859        delownerrc(sleep_config);
860        clearscreen(sleep_config);
861}
862
863//flag 0: lock
864//flag 1: no lock
865void delhdd(char* device, int flag)
866{
867        if(flag == 0) m_lock(&status.hddmutex, 13);
868        struct hdd *node = hdd, *prev = hdd;
869       
870        while(node != NULL)
871        {
872                if(ostrcmp(node->device, device) == 0)
873                {
874                        if(node == hdd)
875                        {
876                                hdd = node->next;
877                                if(hdd != NULL)
878                                        hdd->prev = NULL;
879                        }
880                        else
881                        {
882                                prev->next = node->next;
883                                if(node->next != NULL)
884                                        node->next->prev = prev;
885                        }
886
887                        free(node->device); node->device = NULL;
888                        free(node->vendor); node->vendor = NULL;
889                        free(node->model); node->model = NULL;
890                        free(node->label); node->label = NULL;
891                        free(node->uuid); node->uuid = NULL;
892                        free(node->filesystem); node->filesystem = NULL;
893       
894                        free(node);
895                        node = NULL;
896                        break;
897                }
898
899                prev = node;
900                node = node->next;
901        }
902        if(flag == 0) m_unlock(&status.hddmutex, 13);
903}
904
905//flag 0: lock
906//flag 1: no lock
907struct hdd* addhdd(char* device, int partition, unsigned long long size, int removable, char* vendor, char *model, char* label, char* filesystem, char* uuid, int timetosleep, struct hdd* last, int flag)
908{
909        if(flag == 0) m_lock(&status.hddmutex, 13);
910        struct hdd *newnode = NULL, *prev = NULL, *node = hdd;
911
912        newnode = (struct hdd*)malloc(sizeof(struct hdd));     
913        if(newnode == NULL)
914        {
915                err("no memory");
916                if(flag == 0) m_unlock(&status.hddmutex, 13);
917                return NULL;
918        }
919        memset(newnode, 0, sizeof(struct hdd));
920
921        newnode->device = device;
922        newnode->partition = partition;
923        newnode->size = size;
924        newnode->removable = removable;
925        newnode->vendor = vendor;
926        newnode->model = model;
927        newnode->label = label;
928        newnode->uuid = uuid;
929        newnode->filesystem = filesystem;
930        newnode->read = 0;
931        newnode->write = 0;
932        newnode->sleeptime = timetosleep;
933        newnode->notchanged = 0;
934
935        debug(80, "add hdd %s", device);
936       
937        if(last == NULL)
938        {
939                while(node != NULL && strcoll(newnode->device, node->device) > 0)
940                {
941                        prev = node;
942                        node = node->next;
943                }
944        }
945        else
946        {
947                prev = last;
948                node = last->next;
949        }
950
951        if(prev == NULL)
952                hdd = newnode;
953        else
954        {
955                prev->next = newnode;
956                newnode->prev = prev;
957        }
958        newnode->next = node;
959       
960        //show message for new, not configured devices
961        //check only partition 1
962        if(status.standby == 0 && newnode->partition == 1 && ostrstr(newnode->device, "1") != NULL)
963        {
964                char* tmpstr = NULL, *backup = NULL, *movie = NULL, *swapextensions = NULL, *swapfile = NULL, *checkfile = NULL;
965                int newdev = 1, ret = 0;
966               
967                tmpstr = ostrcat("/media/autofs/", newnode->device, 0, 0);
968                checkfile = ostrcat(tmpstr, "/.titandev", 0, 0);
969                if(file_exist(checkfile) == 0)
970                {
971                        backup = ostrcat(tmpstr, "/backup", 0, 0);
972                        movie = ostrcat(tmpstr, "/movie", 0, 0);
973                        swapextensions = ostrcat(tmpstr, "/swapextensions", 0, 0);
974                        swapfile = ostrcat(tmpstr, "/swapfile", 0, 0);
975                       
976                        if(file_exist(movie) == 1 || file_exist(swapextensions)== 1 || file_exist(backup) == 1 || file_exist(swapfile) == 1)
977                                newdev = 0;
978                               
979                        ret = writesys(checkfile, "titan", 1);
980                        if(ret == 0)
981                        {
982                                sync();
983                                if(newdev == 1)
984                                        textbox("Message", _("Found new Stick/HDD.\nYou can configure it in Harddisk Menu."), _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 800, 200, 15, 0);
985                        }
986                }
987                free(tmpstr); tmpstr = NULL;
988                free(backup); backup = NULL;
989                free(movie); movie = NULL;
990                free(swapextensions); swapextensions = NULL;
991                free(swapfile); swapfile = NULL;                               
992                free(checkfile); checkfile = NULL;                             
993        }
994       
995        if(flag == 0) m_unlock(&status.hddmutex, 13);
996        return newnode;
997}
998
999//flag = 0: mutex lock
1000//flag = 1: no mutex lock
1001void freehdd(int flag)
1002{
1003        if(flag == 0) m_lock(&status.hddmutex, 13);
1004        struct hdd *node = hdd, *prev = hdd;
1005
1006        while(node != NULL)
1007        {
1008                prev = node;
1009                node = node->next;
1010                if(prev != NULL)
1011                        delhdd(prev->device, 1);
1012        }
1013        if(flag == 0) m_unlock(&status.hddmutex, 13);
1014}
1015
1016int addhddall()
1017{
1018        m_lock(&status.hddmutex, 13);
1019        FILE* fd = NULL;
1020        FILE* fd2 = NULL;
1021        char* fileline = NULL, *dev = NULL, *pos = NULL, *part = NULL;
1022        char* tmpstr = NULL;
1023        char* tmpstr2 = NULL;
1024        int partition = 0;
1025        int timetosleep = 0;
1026        struct hdd *node = hdd;
1027        struct hdd *nodedev = hdd;
1028        int w1, w2, w3, w4, w5;
1029               
1030        fd = fopen("/proc/partitions", "r");
1031        if(fd == NULL)
1032        {
1033                err("open /proc/partitions");
1034                m_unlock(&status.hddmutex, 13);
1035                return 1;
1036        }
1037
1038        fileline = malloc(MINMALLOC);
1039        if(fileline == NULL)
1040        {
1041                err("no mem");
1042                m_unlock(&status.hddmutex, 13);
1043                return 1;
1044        }
1045
1046        while(fgets(fileline, MINMALLOC, fd) != NULL)
1047        {
1048                pos = ostrstr(fileline, "sd");
1049                if(pos != NULL)
1050                {
1051                        partition = 0;
1052                        part = NULL;
1053                        pos = string_newline(pos);
1054                        if(strlen(pos) == 3)
1055                        {
1056                                free(dev); dev = NULL;
1057                                dev = ostrcat(pos, NULL, 0, 0);
1058                                if(getconfig("timetosleep", NULL) == NULL)
1059                                        timetosleep = 0;
1060                                else
1061                                        timetosleep = atoi(getconfig("timetosleep", NULL));
1062                        }
1063                        if(strlen(pos) == 4)
1064                        {
1065                                part = pos;
1066                                partition = atoi(&pos[3]);
1067                        }
1068                        tmpstr = ostrcat(tmpstr, "#", 1, 0);
1069                        tmpstr = ostrcat(tmpstr, pos, 1, 0);
1070                        //if(gethdd(pos) == NULL)
1071                        nodedev = gethdd(pos);
1072                        if(nodedev == NULL)
1073                                nodedev = addhdd(ostrcat(pos, NULL, 0, 0), partition, hddgetsize(dev, part), hddgetremovable(dev), hddgetvendor(dev), hddgetmodel(dev), get_label(part), get_filesystem(part), get_uuid(part), timetosleep, NULL, 1);
1074                       
1075                        //HDD SleepTimer start
1076                        if(nodedev != NULL) {
1077                                if(nodedev->sleeptime != timetosleep) {
1078                                        nodedev->read = 0;
1079                                        nodedev->write = 0;
1080                                        nodedev->sleeptime = timetosleep;
1081                                        nodedev->notchanged = 0;
1082                                }
1083                                if(strlen(pos) == 3 && timetosleep > 0) {
1084                                        free(tmpstr2);tmpstr2=NULL;
1085                                        tmpstr2 = ostrcat(tmpstr2, "/sys/block/", 1, 0);
1086                                        tmpstr2 = ostrcat(tmpstr2, nodedev->device, 1, 0);
1087                                        tmpstr2 = ostrcat(tmpstr2, "/stat", 1, 0);
1088                                        fd2 = fopen(tmpstr2, "r");
1089                                        if(fd2 != NULL) {
1090                                                fscanf(fd2, "%d%d%d%d%d", &w1,&w2,&w3,&w4,&w5);
1091                                                fclose(fd2);
1092                                                fd2 = NULL;
1093                                                if((nodedev->read != w1) || (nodedev->write != w5)) {
1094                                                        nodedev->read = w1;
1095                                                        nodedev->write = w5;
1096                                                        nodedev->notchanged = 0;
1097                                                } else {
1098                                                        if (nodedev->notchanged < nodedev->sleeptime) {
1099                                                                nodedev->notchanged = nodedev->notchanged + (status.addhddall->delay / 1000);
1100                                                                if (nodedev->notchanged >= nodedev->sleeptime) {
1101                                                                        free(tmpstr2);tmpstr2=NULL;
1102//                                                                      tmpstr2 = ostrcat(tmpstr2, "/sbin/sdparm -C stop /dev/", 1, 0);
1103                                                                        tmpstr2 = ostrcat(tmpstr2, "/sbin//hd-idle -t ", 1, 0);
1104                                                                        tmpstr2 = ostrcat(tmpstr2, nodedev->device, 1, 0);
1105                                                                        system(tmpstr2);
1106                                                                }
1107                                                        }
1108                                                }
1109                                        }
1110                                }
1111                        }
1112                        //HDD SleepTimer end
1113               
1114                }
1115        }
1116
1117        //check for removed devs
1118        while(node != NULL && tmpstr != NULL)
1119        {
1120                if(ostrstr(tmpstr, node->device) == NULL)
1121                {
1122                        debug(80, "remove %s", node->device);
1123                        delhdd(node->device, 1);
1124                }
1125                node = node->next;
1126        }
1127
1128        if(node != NULL && tmpstr == NULL)
1129        {
1130                debug(80, "remove all");
1131                freehdd(1);
1132        }
1133
1134        free(tmpstr);
1135        free(tmpstr2);
1136        free(dev);
1137        free(fileline);
1138        fclose(fd);
1139        m_unlock(&status.hddmutex, 13);
1140        return 0;
1141}
1142
1143#endif
Note: See TracBrowser for help on using the repository browser.