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


Ignore:
Timestamp:
2013-03-24T00:12:25Z (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:
30440ed
Parents:
ec50ac4a
Message:

hdisk - testing libmbr

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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
Note: See TracChangeset for help on using the changeset viewer.