Changeset 52f2c89 in mainline for uspace/app/hdisk/func_mbr.c


Ignore:
Timestamp:
2013-06-24T22:29:44Z (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:
9bdfde73
Parents:
44c4886 (diff), 6317b33 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

hdisk, libmbr and libgpt updates

File:
1 edited

Legend:

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

    r44c4886 r52f2c89  
    4141#include "input.h"
    4242
    43 static int set_mbr_partition(tinput_t *in, mbr_part_t *p);
    44 
    45 int add_mbr_part(tinput_t *in, union label_data *data)
     43static int set_mbr_partition(tinput_t *in, mbr_part_t *p, unsigned int alignment);
     44
     45int construct_mbr_label(label_t *this)
     46{
     47        this->layout = LYT_MBR;
     48        this->alignment = 1;
     49       
     50        this->add_part      = add_mbr_part;
     51        this->delete_part   = delete_mbr_part;
     52        this->destroy_label = destroy_mbr_label;
     53        this->new_label     = new_mbr_label;
     54        this->print_parts   = print_mbr_parts;
     55        this->read_parts    = read_mbr_parts;
     56        this->write_parts   = write_mbr_parts;
     57        this->extra_funcs   = extra_mbr_funcs;
     58       
     59        return this->new_label(this);
     60}
     61
     62int add_mbr_part(label_t *this, tinput_t *in)
    4663{
    4764        int rc;
    4865       
    4966        mbr_part_t *part = mbr_alloc_partition();
    50 
    51         set_mbr_partition(in, part);
    52 
    53         rc = mbr_add_partition(data->mbr, part);
    54         if (rc != EOK) {
    55                 printf("Error adding partition.\n");
    56         }
    57        
    58         return EOK;
    59 }
    60 
    61 int delete_mbr_part(tinput_t *in, union label_data *data)
     67       
     68        set_mbr_partition(in, part, this->alignment);
     69       
     70        rc = mbr_add_partition(this->data.mbr, part);
     71        if (rc != ERR_OK) {
     72                printf("Error adding partition: %d\n", rc);
     73        }
     74       
     75        return EOK;
     76}
     77
     78int delete_mbr_part(label_t *this, tinput_t *in)
    6279{
    6380        int rc;
    6481        size_t idx;
    65 
     82       
    6683        printf("Number of the partition to delete (counted from 0): ");
    6784        idx = get_input_size_t(in);
     
    7087                return errno;
    7188       
    72         rc = mbr_remove_partition(data->mbr, idx);
     89        rc = mbr_remove_partition(this->data.mbr, idx);
    7390        if(rc != EOK) {
    7491                printf("Error: something.\n");
    7592        }
    76 
    77         return EOK;
    78 }
    79 
    80 int destroy_mbr_label(union label_data *data)
    81 {
    82         mbr_free_label(data->mbr);
    83         return EOK;
    84 }
    85 
    86 int new_mbr_label(union label_data *data)
    87 {
    88         data->mbr = mbr_alloc_label();
    89         if (data->mbr == NULL)
     93       
     94        return EOK;
     95}
     96
     97int destroy_mbr_label(label_t *this)
     98{
     99        mbr_free_label(this->data.mbr);
     100        return EOK;
     101}
     102
     103int new_mbr_label(label_t *this)
     104{
     105        this->data.mbr = mbr_alloc_label();
     106        if (this->data.mbr == NULL)
    90107                return ENOMEM;
    91108        else
     
    94111
    95112/** Print current partition scheme */
    96 int print_mbr_parts(union label_data *data)
     113int print_mbr_parts(label_t *this)
    97114{
    98115        int num = 0;
    99 
    100         printf("Current partition scheme:\n");
     116       
     117        printf("Current partition scheme (MBR):\n");
    101118        //printf("\t\tBootable:\tStart:\tEnd:\tLength:\tType:\n");
    102119        printf("\t\t%10s  %10s %10s %10s %7s\n", "Bootable:", "Start:", "End:", "Length:", "Type:");
    103120       
    104121        mbr_part_t *it;
    105         mbr_part_foreach(data->mbr->parts, it) {
     122        //mbr_part_foreach(data->mbr, it) {
     123       
     124        for (it = mbr_get_first_partition(this->data.mbr); it != NULL;
     125             it = mbr_get_next_partition(this->data.mbr, it), ++num) {
    106126                if (it->type == PT_UNUSED)
    107127                        continue;
    108 
     128               
    109129                printf("\tP%d:\t", num);
    110130                if (mbr_get_flag(it, ST_BOOT))
     
    112132                else
    113133                        printf(" ");
    114 
     134               
    115135                printf("\t%10u %10u %10u %7u\n", it->start_addr, it->start_addr + it->length, it->length, it->type);
    116 
    117                 ++num;
    118         }
    119 
     136               
     137                //++num;
     138        }
     139       
    120140        printf("%d partitions found.\n", num);
    121141       
     
    123143}
    124144
    125 int read_mbr_parts(service_id_t dev_handle, union label_data *data)
     145int read_mbr_parts(label_t *this, service_id_t dev_handle)
    126146{
    127147        int rc;
    128         printf("mbr\n");
    129         rc = mbr_read_mbr(data->mbr, dev_handle);
     148        rc = mbr_read_mbr(this->data.mbr, dev_handle);
    130149        if (rc != EOK)
    131150                return rc;
    132         printf("ismbr\n");
    133         if (!mbr_is_mbr(data->mbr))
     151       
     152        if (!mbr_is_mbr(this->data.mbr))
    134153                return EINVAL;
    135         printf("parts\n");
    136         rc = mbr_read_partitions(data->mbr);
     154       
     155        rc = mbr_read_partitions(this->data.mbr);
    137156        if (rc != EOK)
    138157                return rc;
    139         printf("end\n");
    140         return EOK;
    141 }
    142 
    143 int write_mbr_parts(service_id_t dev_handle, union label_data *data)
    144 {
    145         int rc = mbr_write_partitions(data->mbr, dev_handle);
     158       
     159        return EOK;
     160}
     161
     162int write_mbr_parts(label_t *this, service_id_t dev_handle)
     163{
     164        int rc = mbr_write_partitions(this->data.mbr, dev_handle);
    146165        if (rc != EOK) {
    147166                printf("Error occured during writing: ERR: %d: %s\n", rc, str_error(rc));
     
    151170}
    152171
    153 int extra_mbr_funcs(tinput_t *in, service_id_t dev_handle, union label_data *data)
     172int extra_mbr_funcs(label_t *this, tinput_t *in, service_id_t dev_handle)
    154173{
    155174        printf("Not implemented.\n");
     
    157176}
    158177
    159 static int set_mbr_partition(tinput_t *in, mbr_part_t *p)
     178static int set_mbr_partition(tinput_t *in, mbr_part_t *p, unsigned int alignment)
    160179{
    161180        int c;
     
    174193                        break;
    175194                default:
    176                         printf("Invalid type. Cancelled.");
     195                        printf("Invalid type. Cancelled.\n");
    177196                        return EINVAL;
    178197        }
     198       
     199        printf("ST_LOGIC: %d, %hd\n", mbr_get_flag(p, ST_LOGIC), p->status);
    179200       
    180201        printf("Set type (0-255): ");
     
    200221        if (sa == 0 && errno != EOK)
    201222                return errno;
     223       
     224        if (alignment != 0 && alignment != 1) {
     225                sa = mbr_get_next_aligned(sa, alignment);
     226                printf("Starting address was aligned to %u.\n", sa);
     227        }
    202228
    203229        printf("Set end addres (number): ");
     
    206232                return errno;
    207233       
     234        /* Align ending address, not in use */
     235        /*if (alignment != 0 && alignment != 1) {
     236                ea = mbr_get_next_aligned(ea, alignment) - alignment;
     237                printf("Starting address was aligned to %u.\n", ea);
     238        }*/
     239       
    208240        if(ea < sa) {
    209241                printf("Invalid value. Canceled.\n");
Note: See TracChangeset for help on using the changeset viewer.