Changeset 271e24a in mainline for uspace/app/hdisk/func_mbr.c
- Timestamp:
- 2013-03-24T00:12:25Z (12 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 30440ed
- Parents:
- ec50ac4a
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/hdisk/func_mbr.c
rec50ac4a r271e24a 33 33 */ 34 34 35 #include <stdio.h> 36 #include <errno.h> 37 #include <sys/types.h> 38 35 39 #include "func_mbr.h" 40 #include "input.h" 36 41 37 int add_mbr_part(tinput_t * in, mbr_parts_t * parts) 42 static int set_mbr_partition(tinput_t * in, mbr_part_t * p); 43 44 45 int add_mbr_part(tinput_t * in, union table_data * data) 38 46 { 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(); 53 50 54 51 set_mbr_partition(in, part); 55 52 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; 57 60 } 58 61 59 int delete_mbr_part(tinput_t * in, part_t * parts)62 int delete_mbr_part(tinput_t * in, union table_data * data) 60 63 { 61 char * str;62 64 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; 67 66 68 67 printf("Number of the partition to delete (counted from 0): "); 68 idx = get_input_size_t(in); 69 69 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); 82 71 if(rc != EOK) { 83 72 printf("Error: something.\n"); … … 88 77 89 78 /** Print current partition scheme */ 90 void print_mbr_partitions(mbr_parts_t * parts)79 int print_mbr_parts(union table_data * data) 91 80 { 92 81 int num = 0; … … 95 84 printf("\t\tBootable:\tStart:\tEnd:\tLength:\tType:\n"); 96 85 97 mbr_part_foreach( parts, it) {86 mbr_part_foreach(data->mbr.parts, it) { 98 87 if (it->type == PT_UNUSED) 99 88 continue; 100 89 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)) 103 92 printf("*"); 104 93 else 105 94 printf(" "); 106 95 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); 108 97 109 98 ++num; 110 } */99 } 111 100 112 101 printf("%d partitions found.\n", num); 102 103 return EOK; 113 104 } 114 105 115 void write_mbr_parts(mbr_parts_t * parts, mbr_t * mbr, service_id_t dev_handle)106 int write_mbr_parts(service_id_t dev_handle, union table_data * data) 116 107 { 117 int rc = mbr_write_partitions( parts,mbr, dev_handle);108 int rc = mbr_write_partitions(data->mbr.parts, data->mbr.mbr, dev_handle); 118 109 if (rc != EOK) { 119 110 printf("Error occured during writing. (ERR: %d)\n", rc); 120 111 } 112 113 return rc; 121 114 } 115 116 117 118 static 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.