Changeset 271e24a in mainline for uspace/app/hdisk


Ignore:
Timestamp:
2013-03-24T00:12:25Z (13 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

Location:
uspace/app/hdisk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/hdisk/Makefile

    rec50ac4a r271e24a  
    3232        $(LIBBLOCK_PREFIX)/libblock.a $(LIBCLUI_PREFIX)/libclui.a \
    3333        $(LIBC_PREFIX)/libc.a
    34 EXTRA_CFLAGS = -I$(LIBMBR_PREFIX) -I$(LIBBLOCK_PREFIX) -I$(LIBCLUI_PREFIX)
     34EXTRA_CFLAGS = -I$(LIBMBR_PREFIX) -I$(LIBGPT_PREFIX) -I$(LIBBLOCK_PREFIX) -I$(LIBCLUI_PREFIX)
    3535BINARY = hdisk
    3636
     
    3838        hdisk.c \
    3939        func_mbr.c \
    40         func_gpt.c
     40        func_gpt.c \
     41        input.c
    4142
    4243include $(USPACE_PREFIX)/Makefile.common
  • uspace/app/hdisk/func_gpt.c

    rec50ac4a r271e24a  
    3333 */
    3434
     35#include <stdio.h>
     36#include <errno.h>
     37#include <sys/types.h>
     38
    3539#include "func_gpt.h"
     40
     41int add_gpt_part(tinput_t * in, union table_data * data)
     42{
     43        int rc = EOK;
     44       
     45        return rc;
     46}
     47
     48int delete_gpt_part(tinput_t * in, union table_data * data)
     49{
     50        int rc = EOK;
     51       
     52        return rc;
     53}
     54
     55int print_gpt_parts(union table_data * data)
     56{
     57        int rc = EOK;
     58       
     59        return rc;
     60}
     61
     62int write_gpt_parts(service_id_t dev_handle, union table_data * data)
     63{
     64        int rc = EOK;
     65       
     66        return rc;
     67}
     68
  • uspace/app/hdisk/func_gpt.h

    rec50ac4a r271e24a  
    3434
    3535#ifndef __FUNC_GPT_H__
    36 #def    __FUNC_GPT_H__
     36#define __FUNC_GPT_H__
    3737
    38 int add_gpt_part(tinput_t * in, gpt_parts_t * parts);
    39 int delete_gpt_part(tinput_t * in, gpt_parts_t * parts);
    40 extern void print_gpt_partitions(gpt_parts_t * parts);
    41 extern void write_gpt_parts(gpt_parts_t * parts, gpt_t * mbr, service_id_t dev_handle);
     38#include <loc.h>
     39#include <tinput.h>
     40#include <libgpt.h>
     41
     42#include "common.h"
     43
     44extern int add_gpt_part(tinput_t * in, union table_data * data);
     45extern int delete_gpt_part(tinput_t * in, union table_data * data);
     46extern int print_gpt_parts(union table_data * data);
     47extern int write_gpt_parts(service_id_t dev_handle, union table_data * data);
    4248
    4349#endif
  • uspace/app/hdisk/func_mbr.c

    rec50ac4a r271e24a  
    3333 */
    3434
     35#include <stdio.h>
     36#include <errno.h>
     37#include <sys/types.h>
     38
    3539#include "func_mbr.h"
     40#include "input.h"
    3641
    37 int add_mbr_part(tinput_t * in, mbr_parts_t * parts)
     42static int set_mbr_partition(tinput_t * in, mbr_part_t * p);
     43
     44
     45int add_mbr_part(tinput_t * in, union table_data * data)
    3846{
    39         part_t * part = mbr_alloc_partition();
    40 
    41         printf("Primary (p) or logical (l): ");
    42         int input = getchar();
    43 
    44         switch(input) {
    45                 case 'p':
    46                         mbr_set_flag(parts, ST_LOGIC, false);
    47                 case 'l':
    48                         mbr_set_flag(parts, ST_LOGIC, false);
    49                 default:
    50                         printf("Invalid type. Cancelled.");
    51                         return EINVAL;
    52         }
     47        int rc;
     48       
     49        mbr_part_t * part = mbr_alloc_partition();
    5350
    5451        set_mbr_partition(in, part);
    5552
    56         mbr_add_partition(parts, part);
     53        rc = mbr_add_partition(data->mbr.parts, part);
     54        if (rc != EOK) {
     55                printf("Error adding partition.\n");
     56        }
     57       
     58       
     59        return rc;
    5760}
    5861
    59 int delete_mbr_part(tinput_t * in, part_t * parts)
     62int delete_mbr_part(tinput_t * in, union table_data * data)
    6063{
    61         char * str;
    6264        int rc;
    63         part_t * temp = NULL;
    64         part_t * p = parts;
    65         uint32_t i, input = 0;
    66         char * endptr;
     65        size_t idx;
    6766
    6867        printf("Number of the partition to delete (counted from 0): ");
     68        idx = get_input_size_t(in);
    6969
    70         if((rc = get_input(in, &str)) != EOK)
    71                 return rc;
    72 
    73         //convert from string to base 10 number
    74         if(str_uint32_t(str, &endptr, 10, true, &input) != EOK) {
    75                 printf("Invalid value. Canceled.\n");
    76                 return EINVAL;
    77         }
    78 
    79         free(str);
    80 
    81         rc = mbr_remove_partition(parts, input);
     70        rc = mbr_remove_partition(data->mbr.parts, idx);
    8271        if(rc != EOK) {
    8372                printf("Error: something.\n");
     
    8877
    8978/** Print current partition scheme */
    90 void print_mbr_partitions(mbr_parts_t * parts)
     79int print_mbr_parts(union table_data * data)
    9180{
    9281        int num = 0;
     
    9584        printf("\t\tBootable:\tStart:\tEnd:\tLength:\tType:\n");
    9685
    97         mbr_part_foreach(parts, it) {
     86        mbr_part_foreach(data->mbr.parts, it) {
    9887                if (it->type == PT_UNUSED)
    9988                        continue;
    10089
    101                 printf("\t P%d:\t", i);
    102                 if (p->bootable)
     90                printf("\t P%d:\t", num);
     91                if (mbr_get_flag(it, ST_BOOT))
    10392                        printf("*");
    10493                else
    10594                        printf(" ");
    10695
    107                 printf("\t\t%llu\t%llu\t%llu\t%d\n", p->start_addr, p->start_addr + p->length, p->length, p->type);
     96                printf("\t\t%u\t%u\t%u\t%d\n", it->start_addr, it->start_addr + it->length, it->length, it->type);
    10897
    10998                ++num;
    110         }*/
     99        }
    111100
    112101        printf("%d partitions found.\n", num);
     102       
     103        return EOK;
    113104}
    114105
    115 void write_mbr_parts(mbr_parts_t * parts, mbr_t * mbr, service_id_t dev_handle)
     106int write_mbr_parts(service_id_t dev_handle, union table_data * data)
    116107{
    117         int rc = mbr_write_partitions(parts, mbr, dev_handle);
     108        int rc = mbr_write_partitions(data->mbr.parts, data->mbr.mbr, dev_handle);
    118109        if (rc != EOK) {
    119110                printf("Error occured during writing. (ERR: %d)\n", rc);
    120111        }
     112       
     113        return rc;
    121114}
     115
     116
     117
     118static int set_mbr_partition(tinput_t * in, mbr_part_t * p)
     119{
     120        int c;
     121        uint8_t type;
     122       
     123        printf("Primary (p) or logical (l): ");
     124        c = getchar();
     125
     126        switch(c) {
     127                case 'p':
     128                        mbr_set_flag(p, ST_LOGIC, false);
     129                case 'l':
     130                        mbr_set_flag(p, ST_LOGIC, true);
     131                default:
     132                        printf("Invalid type. Cancelled.");
     133                        return EINVAL;
     134        }
     135       
     136        printf("Set type (0-255): ");
     137        type = get_input_uint8(in);
     138
     139        ///TODO: there can only be one bootable partition; let's do it just like fdisk
     140        printf("Bootable? (y/n): ");
     141        c = getchar();
     142        if (c != 'y' && c != 'Y' && c != 'n' && c != 'N') {
     143                printf("Invalid value. Cancelled.");
     144                return EINVAL;
     145        }
     146       
     147        mbr_set_flag(p, ST_BOOT, (c == 'y' || c == 'Y') ? true : false);
     148
     149
     150        uint32_t sa, ea;
     151
     152        printf("Set starting address (number): ");
     153        sa = get_input_uint32(in);
     154
     155        printf("Set end addres (number): ");
     156        ea = get_input_uint32(in);
     157       
     158        if(ea < sa) {
     159                printf("Invalid value. Canceled.\n");
     160                return EINVAL;
     161        }
     162
     163        p->type = type;
     164        p->start_addr = sa;
     165        p->length = ea - sa;
     166
     167        return EOK;
     168}
     169
     170
     171
     172
     173
     174
  • uspace/app/hdisk/func_mbr.h

    rec50ac4a r271e24a  
    3434
    3535#ifndef __FUNC_MBR_H__
    36 #def    __FUNC_MBR_H__
     36#define __FUNC_MBR_H__
    3737
    38 int add_mbr_part(tinput_t * in, mbr_parts_t * parts);
    39 int delete_mbr_part(tinput_t * in, mbr_parts_t * parts);
    40 extern void print_mbr_partitions(mbr_parts_t * parts);
    41 extern void write_mbr_parts(mbr_parts_t * parts, mbr_t * mbr, service_id_t dev_handle);
     38#include <loc.h>
     39#include <tinput.h>
     40#include <libmbr.h>
     41
     42#include "common.h"
     43
     44extern int add_mbr_part(tinput_t * in, union table_data * data);
     45extern int delete_mbr_part(tinput_t * in, union table_data * data);
     46extern int print_mbr_parts(union table_data * data);
     47extern int write_mbr_parts(service_id_t dev_handle, union table_data * data);
    4248
    4349#endif
  • 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.