Changeset 700f89e in mainline for uspace/app/hdisk/hdisk.c


Ignore:
Timestamp:
2013-05-02T00:51:28Z (12 years ago)
Author:
Dominik Taborsky (AT DOT) <brembyseznamcz>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
9bda5d90
Parents:
8f6c7785
Message:

libmbr semifinal, hdisk enhancements

File:
1 edited

Legend:

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

    r8f6c7785 r700f89e  
    5353int interact(service_id_t dev_handle);
    5454void print_help(void);
     55void select_table_format(void);
    5556void fill_table_funcs(void);
    5657void free_table(void);
     
    9495                set_table_mbr_parts(parts);
    9596                fill_table_funcs();
    96         } else {
     97                goto interact;
     98        }
     99       
     100       
     101        mbr_free_mbr(mbr);
     102        gpt_t * gpt = gpt_read_gpt_header(dev_handle);
     103       
     104        if(gpt != NULL) {
    97105                table.layout = LYT_GPT;
    98                 mbr_free_mbr(mbr);
    99                 gpt_t * gpt = gpt_read_gpt_header(dev_handle);
    100                 printf("here3\n");
    101                 if(gpt == NULL) {
    102                         printf("Failed to read and parse GPT header. Exiting.\n");
    103                         return -1;
    104                 }
    105106                set_table_gpt(gpt);
    106                 printf("here4\n");
     107               
    107108                gpt_partitions_t * parts = gpt_read_partitions(gpt);
    108                 printf("here5\n");
     109               
    109110                if(parts == NULL) {
    110111                        printf("Failed to read and parse partitions.\n" \
    111112                                   "Creating new partition table.");
    112                         //parts = gpt_alloc_partitions();
     113                        parts = gpt_alloc_partitions();
    113114                }
    114115                set_table_gpt_parts(parts);
    115116                fill_table_funcs();
    116         }
    117 
     117                goto interact;
     118        }
     119        printf("No partition table recognized. Create a new one.\n");
     120        table.layout = LYT_NONE;
     121       
     122interact:
    118123        rc = interact(dev_handle);
    119124       
     
    122127        return rc;
    123128}
    124 
    125 /*
    126 int get_input(tinput_t * in, char ** str)
    127 {
    128         int c;
    129         size_tat
    130 
    131          pos = 0;
    132         size_t size = 256;
    133 
    134         *str = malloc(size * sizeof(char));
    135         if (*str == NULL)
    136                 return ENOMEM;
    137 
    138         while ((c = getchar()) != '\n') {
    139                 if (c >= 32 && c <= 126) {      //a printable character
    140 
    141                         (*str)[pos] = c;
    142                         ++pos;
    143                         putchar(c);
    144 
    145                         if (pos == size) {
    146                                 char * temp = malloc(2 * size * sizeof(char));
    147                                 memcpy(temp, *str, size);
    148                                 free(*str);
    149                                 *str = temp;
    150                                 size *= 2;
    151                         }
    152                 } else if (c == 8) {            //backspace
    153                         (*str)[pos] = 0;
    154                         --pos;
    155                         putchar(c);
    156                 }
    157         }
    158 
    159         putchar('\n');
    160 
    161         (*str)[pos] = 0;
    162 
    163         return EOK;
    164 }
    165 */
    166 
    167129
    168130/** Interact with user */
    169131int interact(service_id_t dev_handle)
    170132{
    171         //int rc;
    172133        int input;
    173134        tinput_t * in;
    174 
     135       
    175136        in = tinput_new();
    176137        if (in == NULL) {
     
    179140        }
    180141        tinput_set_prompt(in, "");
    181 
     142       
    182143        printf("Welcome to hdisk.\nType 'h' for help.\n");
    183 
    184         //printf("# ");
    185         //input = getchar();
    186         //printf("%c\n", input);
    187 
     144       
    188145        while (1) {
    189 
    190146                printf("# ");
    191147                input = getchar();
    192148                printf("%c\n", input);
    193 
    194 
    195                 //rc = tinput_read(in, &str);
    196                 //if (rc == ENOENT) {
    197                         //// User requested exit
    198                         //putchar('\n');
    199                         //return rc;
    200                 //}
    201                 //if (rc != EOK) {
    202                         //printf("Failed reading input. Exiting...\n");
    203                         //return rc;
    204                 //}
    205                 //// Check for empty input.
    206                 //if (str_cmp(str, "") == 0)
    207                         //continue;
    208 
     149               
    209150                switch(input) {
    210151                        case 'a':
     
    217158                                table.extra_funcs(in, dev_handle, &table.data);
    218159                                break;
     160                        case 'f':
     161                                free_table();
     162                                select_table_format(in);
     163                                break;
    219164                        case 'h':
    220165                                print_help();
     166                                break;
     167                        case 'n':
     168                                free_table();
     169                                table.new_table(in);
    221170                                break;
    222171                        case 'p':
     
    233182                                break;
    234183                }
    235                 //printf("# ");
    236                 //input = getchar();
    237                 //printf("%c\n", input);
    238 
    239         }
    240 
     184        }
     185       
    241186end:
    242187        tinput_destroy(in);
    243 
     188       
    244189        return EOK;
    245190}
     
    250195                "\t 'a' \t\t Add partition.\n"
    251196                "\t 'd' \t\t Delete partition.\n"
    252                 "\t 'h' \t\t Prints help. See help for more.\n" \
    253                 "\t 'p' \t\t Prints the table contents.\n" \
    254                 "\t 'w' \t\t Write table to disk.\n" \
    255                 "\t 'q' \t\t Quit.\n" \
     197                "\t 'e' \t\t Extra functions (per table format).\n"
     198                "\t 'f' \t\t Switch the format of the partition table."
     199                "\t 'h' \t\t Prints help. See help for more.\n"
     200                "\t 'n' \t\t Create new partition table (discarding the old one).\n"
     201                "\t 'p' \t\t Prints the table contents.\n"
     202                "\t 'w' \t\t Write table to disk.\n"
     203                "\t 'q' \t\t Quit.\n"
    256204                );
    257205
     206}
     207
     208void select_table_format(tinput_t * in)
     209{
     210        printf("Available formats are: \n"
     211                        "1) MBR\n"
     212                        "2) GPT\n"
     213                );
     214       
     215        uint8_t val = get_input_uint8(in);
     216        switch(val) {
     217                case 0:
     218                        table.layout = LYT_NONE;
     219                        fill_table_funcs();
     220                        break;
     221                case 1:
     222                        table.layout = LYT_MBR;
     223                        fill_table_funcs();
     224                        break;
     225                case 2:
     226                        table.layout = LYT_GPT;
     227                        fill_table_funcs();
     228                        break;
     229        }
    258230}
    259231
     
    264236                        table.add_part = add_mbr_part;
    265237                        table.delete_part = delete_mbr_part;
     238                        table.new_table = new_mbr_table;
    266239                        table.print_parts = print_mbr_parts;
    267240                        table.write_parts = write_mbr_parts;
     
    271244                        table.add_part = add_gpt_part;
    272245                        table.delete_part = delete_gpt_part;
     246                        table.new_table = new_gpt_table;
    273247                        table.print_parts = print_gpt_parts;
    274248                        table.write_parts = write_gpt_parts;
     
    276250                        break;
    277251                default:
     252                        table.add_part = add_none_part;
     253                        table.delete_part = delete_none_part;
     254                        table.new_table = new_none_table;
     255                        table.print_parts = print_none_parts;
     256                        table.write_parts = write_none_parts;
     257                        table.extra_funcs = extra_none_funcs;
    278258                        break;
    279259        }
     
    284264        switch(table.layout) {
    285265                case LYT_MBR:
    286                         mbr_free_partitions(table.data.mbr.parts);
    287                         mbr_free_mbr(table.data.mbr.mbr);
     266                        if (table.data.mbr.parts != NULL) {
     267                                mbr_free_partitions(table.data.mbr.parts);
     268                                table.data.mbr.parts = NULL;
     269                        }
     270                        if (table.data.mbr.mbr != NULL) {
     271                                mbr_free_mbr(table.data.mbr.mbr);
     272                                table.data.mbr.mbr = NULL;
     273                        }
    288274                        break;
    289275                case LYT_GPT:
    290                         gpt_free_partitions(table.data.gpt.parts);
    291                         gpt_free_gpt(table.data.gpt.gpt);
     276                        if (table.data.gpt.parts != NULL) {
     277                                gpt_free_partitions(table.data.gpt.parts);
     278                                table.data.gpt.parts = NULL;
     279                        }
     280                        if (table.data.gpt.gpt != NULL) {
     281                                gpt_free_gpt(table.data.gpt.gpt);
     282                                table.data.gpt.gpt = NULL;
     283                        }
    292284                        break;
    293285                default:
     
    296288}
    297289
     290
     291
Note: See TracChangeset for help on using the changeset viewer.