Ignore:
File:
1 edited

Legend:

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

    r6e8e4e19 ra2aa81cb  
    4141#include "input.h"
    4242
    43 static int set_mbr_partition(tinput_t *in, mbr_part_t *p, unsigned int alignment);
    44 
    45 int 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 
    62 int add_mbr_part(label_t *this, tinput_t *in)
     43static int set_mbr_partition(tinput_t *in, mbr_part_t *p);
     44
     45int add_mbr_part(tinput_t *in, union label_data *data)
    6346{
    6447        int rc;
    6548       
    6649        mbr_part_t *part = mbr_alloc_partition();
    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 
    78 int delete_mbr_part(label_t *this, tinput_t *in)
     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
     61int delete_mbr_part(tinput_t *in, union label_data *data)
    7962{
    8063        int rc;
    8164        size_t idx;
    82        
     65
    8366        printf("Number of the partition to delete (counted from 0): ");
    8467        idx = get_input_size_t(in);
     
    8770                return errno;
    8871       
    89         rc = mbr_remove_partition(this->data.mbr, idx);
     72        rc = mbr_remove_partition(data->mbr, idx);
    9073        if(rc != EOK) {
    9174                printf("Error: something.\n");
    9275        }
    93        
    94         return EOK;
    95 }
    96 
    97 int destroy_mbr_label(label_t *this)
    98 {
    99         mbr_free_label(this->data.mbr);
    100         return EOK;
    101 }
    102 
    103 int new_mbr_label(label_t *this)
    104 {
    105         this->data.mbr = mbr_alloc_label();
    106         if (this->data.mbr == NULL)
     76
     77        return EOK;
     78}
     79
     80int destroy_mbr_label(union label_data *data)
     81{
     82        mbr_free_label(data->mbr);
     83        return EOK;
     84}
     85
     86int new_mbr_label(union label_data *data)
     87{
     88        data->mbr = mbr_alloc_label();
     89        if (data->mbr == NULL)
    10790                return ENOMEM;
    10891        else
     
    11194
    11295/** Print current partition scheme */
    113 int print_mbr_parts(label_t *this)
     96int print_mbr_parts(union label_data *data)
    11497{
    11598        int num = 0;
    116        
    117         printf("Current partition scheme (MBR):\n");
     99
     100        printf("Current partition scheme:\n");
    118101        //printf("\t\tBootable:\tStart:\tEnd:\tLength:\tType:\n");
    119102        printf("\t\t%10s  %10s %10s %10s %7s\n", "Bootable:", "Start:", "End:", "Length:", "Type:");
    120103       
    121104        mbr_part_t *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) {
     105        mbr_part_foreach(data->mbr->parts, it) {
    126106                if (it->type == PT_UNUSED)
    127107                        continue;
    128                
     108
    129109                printf("\tP%d:\t", num);
    130110                if (mbr_get_flag(it, ST_BOOT))
     
    132112                else
    133113                        printf(" ");
    134                
     114
    135115                printf("\t%10u %10u %10u %7u\n", it->start_addr, it->start_addr + it->length, it->length, it->type);
    136                
    137                 //++num;
    138         }
    139        
     116
     117                ++num;
     118        }
     119
    140120        printf("%d partitions found.\n", num);
    141121       
     
    143123}
    144124
    145 int read_mbr_parts(label_t *this, service_id_t dev_handle)
     125int read_mbr_parts(service_id_t dev_handle, union label_data *data)
    146126{
    147127        int rc;
    148         rc = mbr_read_mbr(this->data.mbr, dev_handle);
     128        printf("mbr\n");
     129        rc = mbr_read_mbr(data->mbr, dev_handle);
    149130        if (rc != EOK)
    150131                return rc;
    151        
    152         if (!mbr_is_mbr(this->data.mbr))
     132        printf("ismbr\n");
     133        if (!mbr_is_mbr(data->mbr))
    153134                return EINVAL;
    154        
    155         rc = mbr_read_partitions(this->data.mbr);
     135        printf("parts\n");
     136        rc = mbr_read_partitions(data->mbr);
    156137        if (rc != EOK)
    157138                return rc;
    158        
    159         return EOK;
    160 }
    161 
    162 int write_mbr_parts(label_t *this, service_id_t dev_handle)
    163 {
    164         int rc = mbr_write_partitions(this->data.mbr, dev_handle);
     139        printf("end\n");
     140        return EOK;
     141}
     142
     143int write_mbr_parts(service_id_t dev_handle, union label_data *data)
     144{
     145        int rc = mbr_write_partitions(data->mbr, dev_handle);
    165146        if (rc != EOK) {
    166147                printf("Error occured during writing: ERR: %d: %s\n", rc, str_error(rc));
     
    170151}
    171152
    172 int extra_mbr_funcs(label_t *this, tinput_t *in, service_id_t dev_handle)
     153int extra_mbr_funcs(tinput_t *in, service_id_t dev_handle, union label_data *data)
    173154{
    174155        printf("Not implemented.\n");
     
    176157}
    177158
    178 static int set_mbr_partition(tinput_t *in, mbr_part_t *p, unsigned int alignment)
     159static int set_mbr_partition(tinput_t *in, mbr_part_t *p)
    179160{
    180161        int c;
     
    193174                        break;
    194175                default:
    195                         printf("Invalid type. Cancelled.\n");
     176                        printf("Invalid type. Cancelled.");
    196177                        return EINVAL;
    197178        }
    198        
    199         printf("ST_LOGIC: %d, %hd\n", mbr_get_flag(p, ST_LOGIC), p->status);
    200179       
    201180        printf("Set type (0-255): ");
     
    221200        if (sa == 0 && errno != EOK)
    222201                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         }
    228202
    229203        printf("Set end addres (number): ");
     
    232206                return errno;
    233207       
    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        
    240208        if(ea < sa) {
    241209                printf("Invalid value. Canceled.\n");
Note: See TracChangeset for help on using the changeset viewer.