Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/hdisk/hdisk.c

    ra2aa81cb r9bda5d90  
    5353#include "func_none.h"
    5454
    55 int interact(service_id_t);
     55int interact(service_id_t dev_handle);
    5656void print_help(void);
    57 void select_label_format(tinput_t *);
    58 void fill_label_funcs(void);
    59 void free_label(void);
    60 int try_read(service_id_t);
    61 
    62 int construct_none_label(void);
    63 
    64 int construct_mbr_label(void);
    65 int try_read_mbr(service_id_t);
    66 
    67 int construct_gpt_label(void);
    68 int try_read_gpt(service_id_t);
    69 
    70 
    71 static label_t label;
     57void select_table_format(tinput_t * in);
     58void fill_table_funcs(void);
     59void free_table(void);
     60
     61static table_t table;
    7262
    7363int main(int argc, char ** argv)
    7464{
    7565        if (argc == 1) {
    76                 printf("Missing argument. Please specify a device to operate on.\n");
    77                 return -1;
    78         }
    79        
     66                printf("I'd like to have an argument, please.\n");
     67                return 1;
     68        }
     69
    8070        int rc;
    8171        service_id_t dev_handle;
    82        
     72
    8373        rc = loc_service_get_id(argv[1], &dev_handle, IPC_FLAG_BLOCKING);
    8474        if (rc != EOK) {
     
    8676                return -1;
    8777        }
    88        
    89         printf("Init.\n");
    90         init_label();
    91        
    92         /*
     78
     79        init_table();
     80
    9381        mbr_t * mbr = mbr_read_mbr(dev_handle);
    9482        if(mbr == NULL) {
     
    9987
    10088        if(mbr_is_mbr(mbr)) {
    101                 label.layout = LYT_MBR;
    102                 set_label_mbr(mbr);
     89                table.layout = LYT_MBR;
     90                set_table_mbr(mbr);
    10391                mbr_partitions_t * parts = mbr_read_partitions(mbr);
    10492                if(parts == NULL) {
     
    10795                        parts = mbr_alloc_partitions();
    10896                }
    109                 set_label_mbr_parts(parts);
    110                 fill_label_funcs();
     97                set_table_mbr_parts(parts);
     98                fill_table_funcs();
    11199                goto interact;
    112100        }
    113101       
    114102       
    115         mbr_free_mbr(mbr);*/
    116        
    117         printf("Try MBR.\n");
    118         rc = try_read_mbr(dev_handle);
    119         if (rc == EOK)
    120                 goto interact;
    121        
    122         /*
     103        mbr_free_mbr(mbr);
    123104        gpt_t * gpt = gpt_read_gpt_header(dev_handle);
    124105       
    125106        if(gpt != NULL) {
    126                 label.layout = LYT_GPT;
    127                 set_label_gpt(gpt);
     107                table.layout = LYT_GPT;
     108                set_table_gpt(gpt);
    128109               
    129110                gpt_partitions_t * parts = gpt_read_partitions(gpt);
     
    134115                        parts = gpt_alloc_partitions();
    135116                }
    136                 set_label_gpt_parts(parts);
    137                 fill_label_funcs();
     117                set_table_gpt_parts(parts);
     118                fill_table_funcs();
    138119                goto interact;
    139120        }
    140         */
    141        
    142         printf("Try GPT.\n");
    143         rc = try_read_gpt(dev_handle);
    144         if (rc == EOK)
    145                 goto interact;
    146        
    147         printf("No label recognized. Create a new one.\n");
    148         label.layout = LYT_NONE;
     121        printf("No partition table recognized. Create a new one.\n");
     122        table.layout = LYT_NONE;
    149123       
    150124interact:
    151         printf("interact.\n");
    152125        rc = interact(dev_handle);
    153126       
    154         free_label();
     127        free_table();
    155128       
    156129        return rc;
     
    179152                switch(input) {
    180153                        case 'a':
    181                                 label.add_part(in, &label.data);
    182                                 break;
    183                         case 'b':
    184                                 label.add_part(in, &label.data);
     154                                table.add_part(in, &table.data);
    185155                                break;
    186156                        case 'd':
    187                                 label.delete_part(in, &label.data);
     157                                table.delete_part(in, &table.data);
    188158                                break;
    189159                        case 'e':
    190                                 label.extra_funcs(in, dev_handle, &label.data);
     160                                table.extra_funcs(in, dev_handle, &table.data);
    191161                                break;
    192162                        case 'f':
    193                                 free_label();
    194                                 select_label_format(in);
     163                                free_table();
     164                                select_table_format(in);
    195165                                break;
    196166                        case 'h':
     
    198168                                break;
    199169                        case 'n':
    200                                 free_label();
    201                                 label.new_label(&label.data);
     170                                free_table();
     171                                table.new_table(in, &table.data);
    202172                                break;
    203173                        case 'p':
    204                                 label.print_parts(&label.data);
     174                                table.print_parts(&table.data);
    205175                                break;
    206176                        case 'q':
     
    208178                                goto end;
    209179                        case 'w':
    210                                 label.write_parts(dev_handle, &label.data);
     180                                table.write_parts(dev_handle, &table.data);
    211181                                break;
    212182                        default:
     
    227197                "\t 'a' \t\t Add partition.\n"
    228198                "\t 'd' \t\t Delete partition.\n"
    229                 "\t 'e' \t\t Extra functions (per label format).\n"
    230                 "\t 'f' \t\t Switch the format of the partition label."
     199                "\t 'e' \t\t Extra functions (per table format).\n"
     200                "\t 'f' \t\t Switch the format of the partition table."
    231201                "\t 'h' \t\t Prints help. See help for more.\n"
    232                 "\t 'l' \t\t Set alignment.\n"
    233                 "\t 'n' \t\t Create new label (discarding the old one).\n"
    234                 "\t 'p' \t\t Prints label contents.\n"
    235                 "\t 'w' \t\t Write label to disk.\n"
     202                "\t 'n' \t\t Create new partition table (discarding the old one).\n"
     203                "\t 'p' \t\t Prints the table contents.\n"
     204                "\t 'w' \t\t Write table to disk.\n"
    236205                "\t 'q' \t\t Quit.\n"
    237206                );
     
    239208}
    240209
    241 void select_label_format(tinput_t * in)
     210void select_table_format(tinput_t * in)
    242211{
    243212        printf("Available formats are: \n"
     
    249218        switch(val) {
    250219                case 0:
    251                         free_label();
    252                         label.layout = LYT_NONE;
    253                         fill_label_funcs();
     220                        table.layout = LYT_NONE;
     221                        fill_table_funcs();
    254222                        break;
    255223                case 1:
    256                         free_label();
    257                         label.layout = LYT_MBR;
    258                         fill_label_funcs();
     224                        table.layout = LYT_MBR;
     225                        fill_table_funcs();
    259226                        break;
    260227                case 2:
    261                         free_label();
    262                         label.layout = LYT_GPT;
    263                         fill_label_funcs();
    264                         break;
    265         }
    266 }
    267 
    268 void fill_label_funcs(void)
    269 {
    270         switch(label.layout) {
     228                        table.layout = LYT_GPT;
     229                        fill_table_funcs();
     230                        break;
     231        }
     232}
     233
     234void fill_table_funcs(void)
     235{
     236        switch(table.layout) {
    271237                case LYT_MBR:
    272                         construct_mbr_label();
     238                        table.add_part = add_mbr_part;
     239                        table.delete_part = delete_mbr_part;
     240                        table.new_table = new_mbr_table;
     241                        table.print_parts = print_mbr_parts;
     242                        table.write_parts = write_mbr_parts;
     243                        table.extra_funcs = extra_mbr_funcs;
    273244                        break;
    274245                case LYT_GPT:
    275                         construct_gpt_label();
     246                        table.add_part = add_gpt_part;
     247                        table.delete_part = delete_gpt_part;
     248                        table.new_table = new_gpt_table;
     249                        table.print_parts = print_gpt_parts;
     250                        table.write_parts = write_gpt_parts;
     251                        table.extra_funcs = extra_gpt_funcs;
    276252                        break;
    277253                default:
    278                         construct_none_label();
    279                         break;
    280         }
    281 }
    282 
    283 void free_label(void)
    284 {
    285         /*
    286         switch(label.layout) {
     254                        table.add_part = add_none_part;
     255                        table.delete_part = delete_none_part;
     256                        table.new_table = new_none_table;
     257                        table.print_parts = print_none_parts;
     258                        table.write_parts = write_none_parts;
     259                        table.extra_funcs = extra_none_funcs;
     260                        break;
     261        }
     262}
     263
     264void free_table(void)
     265{
     266        switch(table.layout) {
    287267                case LYT_MBR:
    288                         destroy_mbr_label(&label);
     268                        if (table.data.mbr.parts != NULL) {
     269                                mbr_free_partitions(table.data.mbr.parts);
     270                                table.data.mbr.parts = NULL;
     271                        }
     272                        if (table.data.mbr.mbr != NULL) {
     273                                mbr_free_mbr(table.data.mbr.mbr);
     274                                table.data.mbr.mbr = NULL;
     275                        }
    289276                        break;
    290277                case LYT_GPT:
    291                         destroy_gpt_label(&label);
     278                        if (table.data.gpt.parts != NULL) {
     279                                gpt_free_partitions(table.data.gpt.parts);
     280                                table.data.gpt.parts = NULL;
     281                        }
     282                        if (table.data.gpt.gpt != NULL) {
     283                                gpt_free_gpt(table.data.gpt.gpt);
     284                                table.data.gpt.gpt = NULL;
     285                        }
    292286                        break;
    293287                default:
    294288                        break;
    295289        }
    296         */
    297        
    298         label.destroy_label(&label.data);
    299 }
    300 
    301 int try_read(service_id_t dev_handle)
    302 {
    303         fill_label_funcs();
    304         printf("read_parts\n");
    305         return label.read_parts(dev_handle, &label.data);
    306 }
    307 
    308 int construct_none_label()
    309 {
    310         label.add_part      = add_none_part;
    311         label.delete_part   = delete_none_part;
    312         label.destroy_label = destroy_none_label;
    313         label.new_label     = new_none_label;
    314         label.print_parts   = print_none_parts;
    315         label.read_parts    = read_none_parts;
    316         label.write_parts   = write_none_parts;
    317         label.extra_funcs   = extra_none_funcs;
    318        
    319         return EOK;
    320 }
    321 
    322 int construct_mbr_label()
    323 {
    324         label.add_part      = add_mbr_part;
    325         label.delete_part   = delete_mbr_part;
    326         label.destroy_label = destroy_mbr_label;
    327         label.new_label     = new_mbr_label;
    328         label.print_parts   = print_mbr_parts;
    329         label.read_parts    = read_mbr_parts;
    330         label.write_parts   = write_mbr_parts;
    331         label.extra_funcs   = extra_mbr_funcs;
    332        
    333         return label.new_label(&label.data);
    334 }
    335 
    336 int try_read_mbr(service_id_t dev_handle)
    337 {
    338         label.layout = LYT_MBR;
    339         return try_read(dev_handle);
    340 }
    341 
    342 int construct_gpt_label()
    343 {
    344         label.add_part    = add_gpt_part;
    345         label.delete_part = delete_gpt_part;
    346         label.new_label   = new_gpt_label;
    347         label.print_parts = print_gpt_parts;
    348         label.read_parts  = read_gpt_parts;
    349         label.write_parts = write_gpt_parts;
    350         label.extra_funcs = extra_gpt_funcs;
    351        
    352         return label.new_label(&label.data);
    353 }
    354 
    355 int try_read_gpt(service_id_t dev_handle)
    356 {
    357         label.layout = LYT_GPT;
    358         return try_read(dev_handle);
    359 }
    360 
    361 
    362 
    363 
    364 
    365 
    366 
    367 
    368 
    369 
    370 
    371 
    372 
    373 
    374 
    375 
    376 
    377 
    378 
    379 
    380 
    381 
    382 
    383 
    384 
    385 
     290}
     291
     292
     293
Note: See TracChangeset for help on using the changeset viewer.