Changeset 271e24a in mainline for uspace/app/hdisk/hdisk.c


Ignore:
Timestamp:
2013-03-24T00:12:25Z (11 years ago)
Author:
Dominik Taborsky (AT DOT) <brembyseznamcz>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
30440ed
Parents:
ec50ac4a
Message:

hdisk - testing libmbr

File:
1 edited

Legend:

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

    rec50ac4a r271e24a  
    3838#include <stdio.h>
    3939#include <ipc/services.h>
    40 #include <libblock.h>
     40#include <block.h>
    4141#include <errno.h>
    4242#include <stdlib.h>
     
    4444#include <str.h>
    4545#include <libmbr.h>
     46#include <libgpt.h>
    4647#include <tinput.h>
    4748
     49#include "hdisk.h"
    4850#include "func_mbr.h"
    4951#include "func_gpt.h"
    5052
    51 enum TABLES {
    52         TBL_MBR,
    53         TBL_GPT;
    54 };
    55 
    56 static TABLES table;
    57 
    58 int get_input(tinput_t * in, char ** str);
    59 void interact(mbr_parts_t * partitions, mbr_t * mbr, service_id_t dev_handle);
     53int interact(service_id_t dev_handle);
    6054void print_help(void);
    61 
    62 
    63 int set_primary(tinput_t * in, mbr_parts_t * parts);
    64 int add_logical(tinput_t * in, mbr_parts_t * parts);
    65 int set_mbr_partition(tinput_t * in, mbr_parts_t * p);
     55void fill_table_funcs(void);
     56void free_table(void);
     57
     58static table_t table;
    6659
    6760int main(int argc, char ** argv)
     
    8073                return -1;
    8174        }
    82 
    83         mbr_parts_t * parts = NULL;
    84         gpt_header_t * g_hdr = NULL;
    85         gpt_parts_t * g_parts = NULL;
    86 
     75       
     76        init_table();
     77       
    8778        mbr_t * mbr = mbr_read_mbr(dev_handle);
    8879        if(mbr == NULL) {
    8980                printf("Failed to read the Master Boot Record.\n"       \
    90                            "Either memory allocation or disk access failed.\n");
     81                           "Either memory allocation or disk access failed. Exiting.\n");
    9182                return -1;
    9283        }
    9384
    9485        if(mbr_is_mbr(mbr)) {
    95                 table = TBL_MBR;
    96                 parts = mbr_read_partitions(mbr);
     86                table.layout = LYT_MBR;
     87                set_table_mbr(mbr);
     88                mbr_partitions_t * parts = mbr_read_partitions(mbr);
    9789                if(parts == NULL) {
    9890                        printf("Failed to read and parse partitions.\n" \
    99                                    "Creating new partition table.")
    100                 }
     91                                   "Creating new partition table.");
     92                        parts = mbr_alloc_partitions();
     93                }
     94                set_table_mbr_parts(parts);
     95                fill_table_funcs();
    10196        } else {
    102                 table = TBL_GPT;
    103                 //g_hdr = gpt_read_header();
    104                 //g_parts = gpt_read_partitions();
    105         }
    106 
    107 
    108         rc = interact(partitions, mbr, dev_handle);
    109 
    110         if(gpt) {
    111                 gpt_free_partitions();
    112                 gpt_free_header();
    113         } else {
    114                 mbr_free_partitions(partitions);
     97                table.layout = LYT_GPT;
    11598                mbr_free_mbr(mbr);
    116         }
     99                gpt_t * gpt = gpt_read_gpt_header(dev_handle);
     100                if(gpt == NULL) {
     101                        printf("Failed to read and parse GPT header. Exiting.\n");
     102                        return -1;
     103                }
     104                set_table_gpt(gpt);
     105                gpt_partitions_t * parts = gpt_read_partitions(gpt);
     106                if(parts == NULL) {
     107                        printf("Failed to read and parse partitions.\n" \
     108                                   "Creating new partition table.");
     109                        //parts = gpt_alloc_partitions();
     110                }
     111                set_table_gpt_parts(parts);
     112                fill_table_funcs();
     113        }
     114
     115        rc = interact(dev_handle);
     116
     117        free_table();
    117118
    118119        return rc;
    119120}
    120121
     122/*
    121123int get_input(tinput_t * in, char ** str)
    122124{
     
    158160        return EOK;
    159161}
    160 
    161 //int get_input(tinput_t * in, char ** str)
    162 //{
    163 //      int rc;
    164 //      printf("help1\n");
    165 //      rc = tinput_read(in, str);
    166 //      if (rc == ENOENT) {
    167 //              /* User requested exit */
    168 //              return EINTR;
    169 //      }
    170 //      printf("help2\n");
    171 //      fflush(stdout);
    172 //      if (rc != EOK) {
    173 //              printf("Failed reading input. Cancelling...\n");
    174 //              return rc;
    175 //      }
    176 //      printf("help3\n");
    177 //      fflush(stdout);
    178 //      /* Check for empty input. */
    179 //      if (str_cmp(*str, "") == 0) {
    180 //              printf("Canceled.\n");
    181 //              return EINVAL;
    182 //      }
    183 //      printf("help4\n");
    184 //      fflush(stdout);
    185 //
    186 //      return EOK;
    187 //}
     162*/
     163
    188164
    189165/** Interact with user */
    190 int interact_mbr(mbr_parts_t * partitions, mbr_t * mbr, service_id_t dev_handle)
    191 {
    192         char * str;
     166int interact(service_id_t dev_handle)
     167{
    193168        //int rc;
     169        int input;
    194170        tinput_t * in;
    195171
     
    197173        if (in == NULL) {
    198174                printf("Failed initing input. Free some memory.\n");
    199                 return;
    200         }
    201 
    202         tinput_set_prompt(in, " ");
     175                return ENOMEM;
     176        }
    203177
    204178        printf("Welcome to hdisk.\nType 'h' for help.\n");
    205179
    206180        //printf("# ");
    207         //int input = getchar();
     181        //input = getchar();
    208182        //printf("%c\n", input);
    209183
    210184        while (1) {
    211185
    212                 /*printf("# ");
    213                 int input = getchar();
    214                 printf("%c\n", input);
    215                 */
    216 
    217                 rc = tinput_read(in, &str);
    218                 if (rc == ENOENT) {
    219                         // User requested exit
    220                         putchar('\n');
    221                         return rc;
    222                 }
    223                 if (rc != EOK) {
    224                         printf("Failed reading input. Exiting...\n");
    225                         return rc;
    226                 }
    227                 // Check for empty input.
    228                 if (str_cmp(str, "") == 0)
    229                         continue;
    230 
    231                 switch(*str) {
     186                //printf("# ");
     187                input = getchar();
     188                //printf("%c\n", input);
     189               
     190
     191                //rc = tinput_read(in, &str);
     192                //if (rc == ENOENT) {
     193                        //// User requested exit
     194                        //putchar('\n');
     195                        //return rc;
     196                //}
     197                //if (rc != EOK) {
     198                        //printf("Failed reading input. Exiting...\n");
     199                        //return rc;
     200                //}
     201                //// Check for empty input.
     202                //if (str_cmp(str, "") == 0)
     203                        //continue;
     204
     205                switch(input) {
    232206                        case 'a':
    233                                 add_part(in, partitions);
     207                                table.add_part(in, &table.data);
    234208                                break;
    235209                        case 'd':
    236                                 delete_part(in, partitions);
     210                                table.delete_part(in, &table.data);
    237211                                break;
    238212                        case 'h':
     
    240214                                break;
    241215                        case 'p':
    242                                 print_MBR(partitions);
     216                                table.print_parts(&table.data);
    243217                                break;
    244218                        case 'q':
    245219                                putchar('\n');
    246                                 return;
     220                                goto end;
    247221                        case 'w':
    248                                 write_parts(partitions, mbr, dev_handle);
     222                                table.write_parts(dev_handle, &table.data);
    249223                                break;
    250224                        default:
     
    258232        }
    259233
     234end:
    260235        tinput_destroy(in);
    261236
    262         return;
     237        return EOK;
    263238}
    264239
     
    269244                "\t 'd' \t\t Delete partition.\n"
    270245                "\t 'h' \t\t Prints help. See help for more.\n" \
    271                 "\t 'p' \t\t Prints the MBR contents.\n" \
     246                "\t 'p' \t\t Prints the table contents.\n" \
     247                "\t 'w' \t\t Write table to disk.\n" \
    272248                "\t 'q' \t\t Quit.\n" \
    273249                );
     
    275251}
    276252
    277 //other functions
    278 //FIXME: need error checking after input
    279 int set_primary(tinput_t * in, part_t * parts)
    280 {
    281         char * str;
    282         int rc;
    283         uint32_t input = 5;
    284         part_t * p = parts;
    285         //char c_input[2];
    286         char * endptr;
    287 
    288 //      while (input > 3) {
    289 //              printf("Number of the primary partition to set (0-3): ");
    290 //              str_uint64(fgets(c_input, 1, stdin), &endptr, 10, true, &input);
    291 //              printf("%llu\n", input);
    292 //      }
    293 
    294         if ((rc = get_input(in, &str)) != EOK)
    295                 return rc;
    296 
    297         if (str_uint32_t(str, &endptr, 10, true, &input) != EOK || input > 3) {
    298                 printf("Invalid value. Canceled.\n");
    299                 return EINVAL;
    300         }
    301 
    302         free(str);
    303 
    304         for (; input > 0; --input) {
    305                 p = p->next;
    306         }
    307 
    308         set_partition(in, p);
    309 
    310         return EOK;
    311 }
    312 
    313 int add_logical(tinput_t * in, part_t * parts)
    314 {
    315         int i;
    316         part_t * p = parts;
    317         part_t * ext = NULL;
    318 
    319         //checking primary partitions for extended partition
    320         for (i = 0; i < N_PRIMARY; ++i) {
    321                 if (p->type == PT_EXTENDED) {
    322                         ext = p;
    323                         break;
    324                 }
    325                 p = p->next;
    326         }
    327 
    328         if (ext == NULL) {
    329                 printf("Error: no extended partition.\n");
    330                 return EINVAL;
    331         }
    332 
    333         while (p->next != NULL) {
    334                 p = p->next;
    335         }
    336 
    337         p->next = malloc(sizeof(part_t));
    338         if (p->next == NULL) {
    339                 printf("Error: not enough memory.\n");
    340                 return ENOMEM;
    341         }
    342 
    343         p->next->ebr = malloc(sizeof(br_block_t));
    344         if (p->next->ebr == NULL) {
    345                 printf("Error: not enough memory.\n");
    346                 return ENOMEM;
    347         }
    348 
    349         set_partition(in, p->next);
    350 
    351         return EOK;
    352 }
    353 
    354 int set_mbr_partition(tinput_t * in, part_t * p)
    355 {
    356         char * str;
    357         int rc;
    358         uint8_t type;
    359         char * endptr;
    360 
    361 //      while (type > 255) {
    362 //              printf("Set type (0-255): ");
    363 //              str_uint64(fgets(c_type, 3, stdin), &endptr, 10, true, &type);
    364 //      }
    365 
    366         if ((rc = get_input(in, &str)) != EOK)
    367                 return rc;
    368 
    369         if (str_uint8_t(str, &endptr, 10, true, &type) != EOK) {
    370                 printf("Invalid value. Canceled.\n");
    371                 return EINVAL;
    372         }
    373 
    374         free(str);
    375 
    376         ///TODO: there can only be one bootable partition; let's do it just like fdisk
    377         printf("Bootable? (y/n): ");
    378         int c = getchar();
    379         printf("%c\n", c);
    380         if (c != 'y' && c != 'Y' && c != 'n' && c != 'N') {
    381                 printf("Invalid value. Cancelled.");
    382                 return EINVAL;
    383         }
    384 
    385         uint32_t sa, ea;
    386 
    387         printf("Set starting address (number): ");
    388         //str_uint64(fgets(c_sa, 21, stdin), &endptr, 10, true, &sa);
    389 
    390         if ((rc = get_input(in, &str)) != EOK)
    391                 return rc;
    392 
    393         if(str_uint32_t(str, &endptr, 10, true, &sa) != EOK) {
    394                 printf("Invalid value. Canceled.\n");
    395                 return EINVAL;
    396         }
    397 
    398         free(str);
    399 
    400         printf("Set end addres (number): ");
    401         //str_uint64(fgets(c_len, 21, stdin), &endptr, 10, true, &len);
    402 
    403         if ((rc = get_input(in, &str)) != EOK)
    404                 return rc;
    405 
    406         if(str_uint32_t(str, &endptr, 10, true, &ea) != EOK || ea < sa) {
    407                 printf("Invalid value. Canceled.\n");
    408                 return EINVAL;
    409         }
    410 
    411         free(str);
    412 
    413         p->type = type;
    414         p->bootable = (c == 'y' || c == 'Y') ? true : false;
    415         p->start_addr = sa;
    416         p->length = ea - sa;
    417 
    418         return EOK;
    419 }
    420 
    421 
     253void fill_table_funcs(void)
     254{
     255        switch(table.layout) {
     256                case LYT_MBR:
     257                        table.add_part = add_mbr_part;
     258                        table.delete_part = delete_mbr_part;
     259                        table.print_parts = print_mbr_parts;
     260                        table.write_parts = write_mbr_parts;
     261                        break;
     262                case LYT_GPT:
     263                        table.add_part = add_gpt_part;
     264                        table.delete_part = delete_gpt_part;
     265                        table.print_parts = print_gpt_parts;
     266                        table.write_parts = write_gpt_parts;
     267                        break;
     268                default:
     269                        break;
     270        }
     271}
     272
     273void free_table(void)
     274{
     275        switch(table.layout) {
     276                case LYT_MBR:
     277                        mbr_free_partitions(table.data.mbr.parts);
     278                        mbr_free_mbr(table.data.mbr.mbr);
     279                        break;
     280                case LYT_GPT:
     281                        gpt_free_partitions(table.data.gpt.parts);
     282                        gpt_free_gpt(table.data.gpt.gpt);
     283                        break;
     284                default:
     285                        break;
     286        }
     287}
     288
Note: See TracChangeset for help on using the changeset viewer.