Changeset 6e8e4e19 in mainline
- Timestamp:
- 2013-06-16T14:50:59Z (12 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 1c8bfe8
- Parents:
- c9f61150
- Location:
- uspace
- Files:
-
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/hdisk/common.h
rc9f61150 r6e8e4e19 39 39 #include <libgpt.h> 40 40 41 typedef enum { 42 LYT_NONE, 43 LYT_MBR, 44 LYT_GPT, 45 } layouts_t; 46 41 47 union label_data { 42 48 mbr_label_t *mbr; … … 44 50 }; 45 51 52 typedef struct label label_t; 53 54 struct label { 55 layouts_t layout; 56 union label_data data; 57 unsigned int alignment; 58 int (* destroy_label)(label_t *); 59 int (* add_part) (label_t *, tinput_t *); 60 int (* delete_part) (label_t *, tinput_t *); 61 int (* new_label) (label_t *); 62 int (* print_parts) (label_t *); 63 int (* read_parts) (label_t *, service_id_t); 64 int (* write_parts) (label_t *, service_id_t); 65 int (* extra_funcs) (label_t *, tinput_t *, service_id_t); 66 }; 67 46 68 #endif 47 69 -
uspace/app/hdisk/func_gpt.c
rc9f61150 r6e8e4e19 43 43 static int set_gpt_partition(tinput_t *, gpt_part_t *); 44 44 45 int add_gpt_part(tinput_t * in, union label_data * data) 45 46 int construct_gpt_label(label_t *this) 46 47 { 47 gpt_part_t * p = gpt_alloc_partition(data->gpt->parts); 48 this->layout = LYT_GPT; 49 this->alignment = 1; 50 51 this->add_part = add_gpt_part; 52 this->delete_part = delete_gpt_part; 53 this->new_label = new_gpt_label; 54 this->print_parts = print_gpt_parts; 55 this->read_parts = read_gpt_parts; 56 this->write_parts = write_gpt_parts; 57 this->extra_funcs = extra_gpt_funcs; 58 59 return this->new_label(this); 60 } 61 62 int add_gpt_part(label_t *this, tinput_t * in) 63 { 64 gpt_part_t * p = gpt_alloc_partition(this->data.gpt->parts); 48 65 if (p == NULL) { 49 66 return ENOMEM; … … 53 70 } 54 71 55 int delete_gpt_part( tinput_t * in, union label_data * data)72 int delete_gpt_part(label_t *this, tinput_t * in) 56 73 { 57 74 size_t idx; … … 60 77 idx = get_input_size_t(in); 61 78 62 if (gpt_remove_partition( data->gpt->parts, idx) == -1) {79 if (gpt_remove_partition(this->data.gpt->parts, idx) == -1) { 63 80 printf("Warning: running low on memory, not resizing...\n"); 64 81 } … … 67 84 } 68 85 69 int destroy_gpt_label( union label_data *data)86 int destroy_gpt_label(label_t *this) 70 87 { 71 88 return EOK; 72 89 } 73 90 74 int new_gpt_label( union label_data *data)91 int new_gpt_label(label_t *this) 75 92 { 76 data->gpt->gpt = gpt_alloc_gpt_header();77 data->gpt->parts = gpt_alloc_partitions();93 this->data.gpt->gpt = gpt_alloc_gpt_header(); 94 this->data.gpt->parts = gpt_alloc_partitions(); 78 95 return EOK; 79 96 } 80 97 81 int print_gpt_parts( union label_data *data)98 int print_gpt_parts(label_t *this) 82 99 { 83 100 //int rc; … … 87 104 size_t i = 0; 88 105 89 gpt_part_foreach(data->gpt->parts, iter) { 106 gpt_part_foreach(this->data.gpt->parts, iter) { 107 //FIXMEE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 108 if (gpt_get_part_type(iter) == 62) 109 continue; 110 90 111 //printf("\t%10u %10u %10u %3d\n", iter->start_addr, iter->start_addr + iter->length, 91 112 // iter->length, gpt_get_part_type(iter), gpt_get_part_name(iter)); … … 100 121 } 101 122 102 int read_gpt_parts( service_id_t dev_handle, union label_data *data)123 int read_gpt_parts(label_t *this, service_id_t dev_handle) 103 124 { 104 125 return EOK; 105 126 } 106 127 107 int write_gpt_parts( service_id_t dev_handle, union label_data * data)128 int write_gpt_parts(label_t *this, service_id_t dev_handle) 108 129 { 109 130 int rc; 110 131 111 rc = gpt_write_partitions( data->gpt->parts, data->gpt->gpt, dev_handle);132 rc = gpt_write_partitions(this->data.gpt->parts, this->data.gpt->gpt, dev_handle); 112 133 if (rc != EOK) { 113 134 printf("Error: Writing partitions failed: %d (%s)\n", rc, str_error(rc)); … … 115 136 } 116 137 117 rc = gpt_write_gpt_header( data->gpt->gpt, dev_handle);138 rc = gpt_write_gpt_header(this->data.gpt->gpt, dev_handle); 118 139 if (rc != EOK) { 119 140 printf("Error: Writing partitions failed: %d (%s)\n", rc, str_error(rc)); … … 124 145 } 125 146 126 int extra_gpt_funcs( tinput_t * in, service_id_t dev_handle, union label_data * data)147 int extra_gpt_funcs(label_t *this, tinput_t * in, service_id_t dev_handle) 127 148 { 128 149 printf("Not implemented.\n"); -
uspace/app/hdisk/func_gpt.h
rc9f61150 r6e8e4e19 42 42 #include "common.h" 43 43 44 extern int add_gpt_part(tinput_t *, union label_data *); 45 extern int delete_gpt_part(tinput_t *, union label_data *); 46 extern int destroy_gpt_label(union label_data *); 47 extern int new_gpt_label(union label_data *); 48 extern int print_gpt_parts(union label_data *); 49 extern int read_gpt_parts(service_id_t, union label_data *); 50 extern int write_gpt_parts(service_id_t, union label_data *); 51 extern int extra_gpt_funcs(tinput_t *, service_id_t, union label_data *); 44 extern int construct_gpt_label(label_t *); 45 extern int add_gpt_part (label_t *, tinput_t *); 46 extern int delete_gpt_part (label_t *, tinput_t *); 47 extern int destroy_gpt_label(label_t *); 48 extern int new_gpt_label (label_t *); 49 extern int print_gpt_parts (label_t *); 50 extern int read_gpt_parts (label_t *, service_id_t); 51 extern int write_gpt_parts (label_t *, service_id_t); 52 extern int extra_gpt_funcs (label_t *, tinput_t *, service_id_t); 52 53 53 54 #endif -
uspace/app/hdisk/func_mbr.c
rc9f61150 r6e8e4e19 41 41 #include "input.h" 42 42 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) 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) 46 63 { 47 64 int rc; 48 65 49 66 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 != E OK) {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 78 int delete_mbr_part(label_t *this, tinput_t *in) 62 79 { 63 80 int rc; 64 81 size_t idx; 65 82 66 83 printf("Number of the partition to delete (counted from 0): "); 67 84 idx = get_input_size_t(in); … … 70 87 return errno; 71 88 72 rc = mbr_remove_partition( data->mbr, idx);89 rc = mbr_remove_partition(this->data.mbr, idx); 73 90 if(rc != EOK) { 74 91 printf("Error: something.\n"); 75 92 } 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 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) 90 107 return ENOMEM; 91 108 else … … 94 111 95 112 /** Print current partition scheme */ 96 int print_mbr_parts( union label_data *data)113 int print_mbr_parts(label_t *this) 97 114 { 98 115 int num = 0; 99 100 printf("Current partition scheme :\n");116 117 printf("Current partition scheme (MBR):\n"); 101 118 //printf("\t\tBootable:\tStart:\tEnd:\tLength:\tType:\n"); 102 119 printf("\t\t%10s %10s %10s %10s %7s\n", "Bootable:", "Start:", "End:", "Length:", "Type:"); 103 120 104 121 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) { 106 126 if (it->type == PT_UNUSED) 107 127 continue; 108 128 109 129 printf("\tP%d:\t", num); 110 130 if (mbr_get_flag(it, ST_BOOT)) … … 112 132 else 113 133 printf(" "); 114 134 115 135 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 120 140 printf("%d partitions found.\n", num); 121 141 … … 123 143 } 124 144 125 int read_mbr_parts( service_id_t dev_handle, union label_data *data)145 int read_mbr_parts(label_t *this, service_id_t dev_handle) 126 146 { 127 147 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); 130 149 if (rc != EOK) 131 150 return rc; 132 printf("ismbr\n");133 if (!mbr_is_mbr( data->mbr))151 152 if (!mbr_is_mbr(this->data.mbr)) 134 153 return EINVAL; 135 printf("parts\n");136 rc = mbr_read_partitions( data->mbr);154 155 rc = mbr_read_partitions(this->data.mbr); 137 156 if (rc != EOK) 138 157 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 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); 146 165 if (rc != EOK) { 147 166 printf("Error occured during writing: ERR: %d: %s\n", rc, str_error(rc)); … … 151 170 } 152 171 153 int extra_mbr_funcs( tinput_t *in, service_id_t dev_handle, union label_data *data)172 int extra_mbr_funcs(label_t *this, tinput_t *in, service_id_t dev_handle) 154 173 { 155 174 printf("Not implemented.\n"); … … 157 176 } 158 177 159 static int set_mbr_partition(tinput_t *in, mbr_part_t *p )178 static int set_mbr_partition(tinput_t *in, mbr_part_t *p, unsigned int alignment) 160 179 { 161 180 int c; … … 174 193 break; 175 194 default: 176 printf("Invalid type. Cancelled. ");195 printf("Invalid type. Cancelled.\n"); 177 196 return EINVAL; 178 197 } 198 199 printf("ST_LOGIC: %d, %hd\n", mbr_get_flag(p, ST_LOGIC), p->status); 179 200 180 201 printf("Set type (0-255): "); … … 200 221 if (sa == 0 && errno != EOK) 201 222 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 } 202 228 203 229 printf("Set end addres (number): "); … … 206 232 return errno; 207 233 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 208 240 if(ea < sa) { 209 241 printf("Invalid value. Canceled.\n"); -
uspace/app/hdisk/func_mbr.h
rc9f61150 r6e8e4e19 42 42 #include "common.h" 43 43 44 extern int add_mbr_part(tinput_t *, union label_data *); 45 extern int delete_mbr_part(tinput_t *, union label_data *); 46 extern int destroy_mbr_label(union label_data *); 47 extern int new_mbr_label(union label_data *); 48 extern int print_mbr_parts(union label_data *); 49 extern int read_mbr_parts(service_id_t, union label_data *); 50 extern int write_mbr_parts(service_id_t, union label_data *); 51 extern int extra_mbr_funcs(tinput_t *, service_id_t, union label_data *); 44 extern int construct_mbr_label(label_t *); 45 extern int add_mbr_part (label_t *, tinput_t *); 46 extern int delete_mbr_part (label_t *, tinput_t *); 47 extern int destroy_mbr_label(label_t *); 48 extern int new_mbr_label (label_t *); 49 extern int print_mbr_parts (label_t *); 50 extern int read_mbr_parts (label_t *, service_id_t); 51 extern int write_mbr_parts (label_t *, service_id_t); 52 extern int extra_mbr_funcs (label_t *, tinput_t *, service_id_t); 52 53 53 54 #endif -
uspace/app/hdisk/func_none.c
rc9f61150 r6e8e4e19 41 41 42 42 43 int add_none_part(tinput_t *in, union label_data *data) 43 int construct_none_label(label_t *this) 44 { 45 this->layout = LYT_NONE; 46 47 this->add_part = add_none_part; 48 this->delete_part = delete_none_part; 49 this->destroy_label = destroy_none_label; 50 this->new_label = new_none_label; 51 this->print_parts = print_none_parts; 52 this->read_parts = read_none_parts; 53 this->write_parts = write_none_parts; 54 this->extra_funcs = extra_none_funcs; 55 56 return EOK; 57 } 58 59 int add_none_part(label_t *this, tinput_t * in) 44 60 { 45 61 not_implemented(); … … 47 63 } 48 64 49 int delete_none_part( tinput_t *in, union label_data *data)65 int delete_none_part(label_t *this, tinput_t * in) 50 66 { 51 67 not_implemented(); … … 53 69 } 54 70 55 int destroy_none_label(union label_data *data) 71 int destroy_none_label(label_t *this) 72 { 73 return EOK; 74 } 75 76 int new_none_label(label_t *this) 56 77 { 57 78 not_implemented(); … … 59 80 } 60 81 61 int new_none_label(union label_data *data)82 int print_none_parts(label_t *this) 62 83 { 63 84 not_implemented(); … … 65 86 } 66 87 67 int print_none_parts(union label_data *data)88 int read_none_parts(label_t *this, service_id_t dev_handle) 68 89 { 69 90 not_implemented(); … … 71 92 } 72 93 73 int read_none_parts(service_id_t dev_handle, union label_data *data)94 int write_none_parts(label_t *this, service_id_t dev_handle) 74 95 { 75 96 not_implemented(); … … 77 98 } 78 99 79 int write_none_parts(service_id_t dev_handle, union label_data *data) 80 { 81 not_implemented(); 82 return EOK; 83 } 84 85 int extra_none_funcs(tinput_t *in, service_id_t dev_handle, union label_data *data) 100 int extra_none_funcs(label_t *this, tinput_t * in, service_id_t dev_handle) 86 101 { 87 102 not_implemented(); -
uspace/app/hdisk/func_none.h
rc9f61150 r6e8e4e19 41 41 #include "common.h" 42 42 43 extern int add_none_part(tinput_t *, union label_data *); 44 extern int delete_none_part(tinput_t *, union label_data *); 45 extern int destroy_none_label(union label_data *); 46 extern int new_none_label(union label_data *); 47 extern int print_none_parts(union label_data *); 48 extern int read_none_parts(service_id_t, union label_data *); 49 extern int write_none_parts(service_id_t, union label_data *); 50 extern int extra_none_funcs(tinput_t *, service_id_t, union label_data *); 43 extern int construct_none_label(label_t *); 44 extern int add_none_part (label_t *, tinput_t *); 45 extern int delete_none_part (label_t *, tinput_t *); 46 extern int destroy_none_label(label_t *); 47 extern int new_none_label (label_t *); 48 extern int print_none_parts (label_t *); 49 extern int read_none_parts (label_t *, service_id_t); 50 extern int write_none_parts (label_t *, service_id_t); 51 extern int extra_none_funcs (label_t *, tinput_t *, service_id_t); 51 52 52 53 #endif -
uspace/app/hdisk/hdisk.c
rc9f61150 r6e8e4e19 56 56 void print_help(void); 57 57 void select_label_format(tinput_t *); 58 void fill_label_funcs(void);58 void construct_label(layouts_t); 59 59 void free_label(void); 60 60 int try_read(service_id_t); 61 62 int construct_none_label(void);63 64 int construct_mbr_label(void);65 61 int try_read_mbr(service_id_t); 66 67 int construct_gpt_label(void);68 62 int try_read_gpt(service_id_t); 63 void set_alignment(tinput_t *); 69 64 70 65 … … 87 82 } 88 83 89 printf("Init.\n");90 84 init_label(); 91 85 … … 115 109 mbr_free_mbr(mbr);*/ 116 110 117 printf("Try MBR.\n");118 111 rc = try_read_mbr(dev_handle); 119 112 if (rc == EOK) … … 140 133 */ 141 134 142 printf("Try GPT.\n");143 135 rc = try_read_gpt(dev_handle); 144 136 if (rc == EOK) … … 149 141 150 142 interact: 151 printf("interact.\n");143 152 144 rc = interact(dev_handle); 153 145 … … 161 153 { 162 154 int input; 163 tinput_t * 155 tinput_t *in; 164 156 165 157 in = tinput_new(); … … 179 171 switch(input) { 180 172 case 'a': 181 label.add_part(in, &label.data); 182 break; 183 case 'b': 184 label.add_part(in, &label.data); 173 label.add_part(&label, in); 185 174 break; 186 175 case 'd': 187 label.delete_part( in, &label.data);176 label.delete_part(&label, in); 188 177 break; 189 178 case 'e': 190 label.extra_funcs( in, dev_handle, &label.data);179 label.extra_funcs(&label, in, dev_handle); 191 180 break; 192 181 case 'f': … … 197 186 print_help(); 198 187 break; 188 case 'l': 189 set_alignment(in); 190 break; 199 191 case 'n': 192 printf("Discarding label...\n"); 200 193 free_label(); 201 label.new_label(&label .data);194 label.new_label(&label); 202 195 break; 203 196 case 'p': 204 label.print_parts(&label .data);197 label.print_parts(&label); 205 198 break; 206 199 case 'q': 207 200 putchar('\n'); 208 201 goto end; 202 case 'r': 203 label.read_parts(&label, dev_handle); 209 204 case 'w': 210 label.write_parts( dev_handle, &label.data);205 label.write_parts(&label, dev_handle); 211 206 break; 212 207 default: … … 228 223 "\t 'd' \t\t Delete partition.\n" 229 224 "\t 'e' \t\t Extra functions (per label format).\n" 230 "\t 'f' \t\t Switch the format of the partition label. "225 "\t 'f' \t\t Switch the format of the partition label.\n" 231 226 "\t 'h' \t\t Prints help. See help for more.\n" 232 227 "\t 'l' \t\t Set alignment.\n" 233 228 "\t 'n' \t\t Create new label (discarding the old one).\n" 234 229 "\t 'p' \t\t Prints label contents.\n" 230 "\t 'q' \t\t Quit.\n" 231 "\t 'r' \t\t Read label from disk.\n" 235 232 "\t 'w' \t\t Write label to disk.\n" 236 "\t 'q' \t\t Quit.\n"237 233 ); 238 234 … … 244 240 "1) MBR\n" 245 241 "2) GPT\n" 246 242 ); 247 243 248 244 uint8_t val = get_input_uint8(in); … … 250 246 case 0: 251 247 free_label(); 252 label.layout = LYT_NONE; 253 fill_label_funcs(); 248 construct_label(LYT_NONE); 254 249 break; 255 250 case 1: 256 251 free_label(); 257 label.layout = LYT_MBR; 258 fill_label_funcs(); 252 construct_label(LYT_MBR); 259 253 break; 260 254 case 2: 261 255 free_label(); 256 construct_label(LYT_GPT); 257 break; 258 } 259 } 260 261 void construct_label(layouts_t layout) 262 { 263 switch(layout) { 264 case LYT_MBR: 265 label.layout = LYT_MBR; 266 construct_mbr_label(&label); 267 break; 268 case LYT_GPT: 262 269 label.layout = LYT_GPT; 263 fill_label_funcs(); 264 break; 265 } 266 } 267 268 void fill_label_funcs(void) 269 { 270 switch(label.layout) { 271 case LYT_MBR: 272 construct_mbr_label(); 273 break; 274 case LYT_GPT: 275 construct_gpt_label(); 270 construct_gpt_label(&label); 276 271 break; 277 272 default: 278 construct_none_label(); 273 label.layout = LYT_NONE; 274 construct_none_label(&label); 279 275 break; 280 276 } … … 283 279 void free_label(void) 284 280 { 285 /* 286 switch(label.layout) { 287 case LYT_MBR: 288 destroy_mbr_label(&label); 289 break; 290 case LYT_GPT: 291 destroy_gpt_label(&label); 292 break; 293 default: 294 break; 295 } 296 */ 297 298 label.destroy_label(&label.data); 281 label.destroy_label(&label); 299 282 } 300 283 301 284 int try_read(service_id_t dev_handle) 302 285 { 303 fill_label_funcs(); 304 printf("read_parts\n"); 305 return label.read_parts(dev_handle, &label.data); 306 } 307 308 int construct_none_label() 309 { 310 label.add_part = add_none_part; 311 label.delete_part = delete_none_part; 312 label.destroy_label = destroy_none_label; 313 label.new_label = new_none_label; 314 label.print_parts = print_none_parts; 315 label.read_parts = read_none_parts; 316 label.write_parts = write_none_parts; 317 label.extra_funcs = extra_none_funcs; 318 319 return EOK; 320 } 321 322 int construct_mbr_label() 323 { 324 label.add_part = add_mbr_part; 325 label.delete_part = delete_mbr_part; 326 label.destroy_label = destroy_mbr_label; 327 label.new_label = new_mbr_label; 328 label.print_parts = print_mbr_parts; 329 label.read_parts = read_mbr_parts; 330 label.write_parts = write_mbr_parts; 331 label.extra_funcs = extra_mbr_funcs; 332 333 return label.new_label(&label.data); 286 return label.read_parts(&label, dev_handle); 334 287 } 335 288 336 289 int try_read_mbr(service_id_t dev_handle) 337 290 { 338 label.layout = LYT_MBR;291 construct_label(LYT_MBR); 339 292 return try_read(dev_handle); 340 293 } 341 294 342 int construct_gpt_label()343 {344 label.add_part = add_gpt_part;345 label.delete_part = delete_gpt_part;346 label.new_label = new_gpt_label;347 label.print_parts = print_gpt_parts;348 label.read_parts = read_gpt_parts;349 label.write_parts = write_gpt_parts;350 label.extra_funcs = extra_gpt_funcs;351 352 return label.new_label(&label.data);353 }354 355 295 int try_read_gpt(service_id_t dev_handle) 356 296 { 357 label.layout = LYT_GPT;297 construct_label(LYT_GPT); 358 298 return try_read(dev_handle); 359 299 } 360 300 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 301 void set_alignment(tinput_t *in) 302 { 303 printf("Set alignment to sectors: "); 304 label.alignment = get_input_uint32(in); 305 printf("Alignment set to %u sectors.\n", label.alignment); 306 } 307 308 309 310 311 312 313 314 315 316 -
uspace/app/hdisk/hdisk.h
rc9f61150 r6e8e4e19 35 35 #include "common.h" 36 36 37 typedef enum {38 LYT_NONE,39 LYT_MBR,40 LYT_GPT,41 } layouts_t;42 43 typedef struct label {44 layouts_t layout;45 union label_data data;46 int (* add_part) (tinput_t *, union label_data *);47 int (* delete_part) (tinput_t *, union label_data *);48 int (* destroy_label)( union label_data *);49 int (* new_label) ( union label_data *);50 int (* print_parts) ( union label_data *);51 int (* read_parts) (service_id_t, union label_data *);52 int (* write_parts) (service_id_t, union label_data *);53 int (* extra_funcs) (tinput_t *, service_id_t, union label_data *);54 } label_t;55 56 37 #define init_label() \ 57 38 label.layout = LYT_NONE -
uspace/lib/mbr/libmbr.c
rc9f61150 r6e8e4e19 52 52 static int check_encaps(mbr_part_t *, mbr_part_t *); 53 53 static int check_preceeds(mbr_part_t *, mbr_part_t *); 54 static mbr_err_val mbr_add_primary(mbr_label_t *label, mbr_part_t *p); 55 static mbr_err_val mbr_add_logical(mbr_label_t *label, mbr_part_t *p); 54 56 55 57 /** Allocate and initialize mbr_label_t structure */ … … 171 173 mbr_part_t *ext = NULL; 172 174 //mbr_partitions_t *parts; 173 printf("check\n");175 174 176 if (label->parts != NULL) 175 177 mbr_free_partitions(label->parts); 176 printf("check2\n");178 177 179 label->parts = mbr_alloc_partitions(); 178 180 if (label->parts == NULL) { 179 181 return ENOMEM; 180 182 } 181 printf("primary\n");183 182 184 /* Generate the primary partitions */ 183 185 for (i = 0; i < N_PRIMARY; ++i) { 184 186 if (label->mbr->raw_data.pte[i].ptype == PT_UNUSED) 185 187 continue; 186 printf("pcheck1\n");188 187 189 p = mbr_alloc_partition(); 188 190 if (p == NULL) { … … 191 193 return ENOMEM; 192 194 } 193 printf("pcheck2\n");195 194 196 rc_ext = decode_part(&(label->mbr->raw_data.pte[i]), p, 0); 197 printf("p: %d %u %u\n", rc_ext, p->start_addr, p->length); 195 198 mbr_set_flag(p, ST_LOGIC, false); 196 199 rc = mbr_add_partition(label, p); … … 201 204 return EINVAL; 202 205 } 203 printf("pcheck3\n");206 204 207 if (rc_ext) { 205 208 ext = p; 206 label->parts->l_extended = list_nth(&(label->parts->list), i);207 }208 printf("pcheck4\n");209 } 210 printf("logical\n");209 printf("ext: %u %u\n", p->start_addr, p->length); 210 label->parts->l_extended = &p->link; 211 } 212 } 213 211 214 /* Fill in the primary partitions and generate logical ones, if any */ 212 215 rc = decode_logical(label, ext); 213 216 if (rc != EOK) { 214 printf(LIBMBR_NAME ": Error occured during decoding the MBR.\n" \215 LIBMBR_NAME ": Partition list may be incomplete.\n" );217 printf(LIBMBR_NAME ": Error during decoding logical partitions: %d - %s.\n" \ 218 LIBMBR_NAME ": Partition list may be incomplete.\n", rc, str_error(rc)); 216 219 return rc; 217 220 } 218 printf("finish\n");221 219 222 return EOK; 220 223 } … … 243 246 244 247 /* Encoding primary partitions */ 245 for (i = 0; i < label->parts->n_primary; i++) {248 for (i = 0; i < N_PRIMARY; i++) { 246 249 p = list_get_instance(l, mbr_part_t, link); 250 printf("status: %hu\n", p->status); 247 251 encode_part(p, &(label->mbr->raw_data.pte[i]), 0, false); 248 252 l = l->next; … … 256 260 } 257 261 258 if (ext == NULL) 262 if (ext == NULL) { 263 rc = EOK; 259 264 goto end; 265 } 260 266 261 267 uint32_t base = ext->start_addr; 262 mbr_part_t * 268 mbr_part_t *prev_p; 263 269 264 270 /* Note for future changes: Some thought has been put into design … … 284 290 } 285 291 free(tmp); 292 rc = EOK; 286 293 goto end; 287 294 } 288 295 289 296 prev_p = p; 297 298 /* Check EBR addresses 299 * This piece of code saves previous EBR placements from other 300 * software. But if our user modifies the logical partition chain, 301 * we have to fix those placements if needed.*/ 302 link_t *l_ebr = l; 303 link_t *l_iter; 304 mbr_part_t *tmp = mbr_alloc_partition(); 305 tmp->length = 1; 306 while (l_ebr != &(label->parts->list.head)) { 307 p = list_get_instance(l_ebr, mbr_part_t, link); 308 tmp->start_addr = p->ebr_addr; 309 310 l_iter = l; 311 while (l_iter != &(label->parts->list.head)) { 312 /* Checking whether EBR address makes sense. If not, we take a guess. 313 * So far this is simple, we just take the first preceeding sector. 314 * Fdisk always reserves at least 2048 sectors (1MiB), so it can have 315 * the EBR aligned as well as the partition itself. Parted reserves 316 * minimum one sector, like we do. 317 * 318 * Note that we know there is at least one sector free from previous checks. 319 * Also note that the user can set ebr_addr to their liking (if it's valid). */ 320 if (p->ebr_addr < base || p->ebr_addr >= base + ext->length || 321 check_overlap(tmp, list_get_instance(l_iter, mbr_part_t, link))) { 322 p->ebr_addr = p->start_addr - 1; 323 break; 324 } 325 326 l_iter = l_iter->next; 327 } 328 329 l_ebr = l_ebr->next; 330 } 331 mbr_free_partition(tmp); 290 332 291 333 /* Encoding and writing logical partitions */ … … 293 335 p = list_get_instance(l, mbr_part_t, link); 294 336 295 /* Checking whether EBR address makes sense. If not, we take a guess.296 * So far this is simple, we just take the first preceeding sector.297 * Fdisk always reserves at least 2048 sectors (1MiB), so it can have298 * the EBR aligned as well as the partition itself. Parted reserves299 * minimum one sector, like we do.300 *301 * Note that we know there is at least one sector free from previous checks.302 * Also note that the user can set ebr_addr to their liking (if it's valid). */303 if (p->ebr_addr >= p->start_addr || p->ebr_addr <= (prev_p->start_addr + prev_p->length)) {304 p->ebr_addr = p->start_addr - 1;305 DEBUG_PRINT_0(LIBMBR_NAME ": Warning: invalid EBR address.\n");306 }307 337 308 338 encode_part(p, &(p->ebr->pte[0]), p->ebr_addr, false); … … 393 423 mbr_err_val mbr_add_partition(mbr_label_t *label, mbr_part_t *p) 394 424 { 395 int rc; 396 mbr_partitions_t *parts = label->parts; 397 425 int rc1, rc2; 398 426 aoff64_t nblocks; 399 printf("add1.\n");400 rc = block_init(EXCHANGE_ATOMIC, label->device, 512);401 if (rc != EOK) {402 printf(LIBMBR_NAME ": Error while getting number of blocks: %d - %s.\n", rc, str_error(rc));427 428 rc1 = block_init(EXCHANGE_ATOMIC, label->device, 512); 429 if (rc1 != EOK && rc1 != EEXIST) { 430 printf(LIBMBR_NAME ": Error during libblock init: %d - %s.\n", rc1, str_error(rc1)); 403 431 return ERR_LIBBLOCK; 404 432 } 405 printf("add2.\n"); 406 rc = block_get_nblocks(label->device, &nblocks); 407 block_fini(label->device); 408 if (rc != EOK) { 409 printf(LIBMBR_NAME ": Error while getting number of blocks: %d - %s.\n", rc, str_error(rc)); 433 434 rc2 = block_get_nblocks(label->device, &nblocks); 435 436 if (rc1 != EEXIST) 437 block_fini(label->device); 438 439 if (rc2 != EOK) { 440 printf(LIBMBR_NAME ": Error while getting number of blocks: %d - %s.\n", rc2, str_error(rc2)); 410 441 return ERR_LIBBLOCK; 411 442 } 412 printf("add3.\n"); 413 if (mbr_get_flag(p, ST_LOGIC)) { 443 444 if ((aoff64_t) p->start_addr + p->length > nblocks) 445 return ERR_OUT_BOUNDS; 446 447 if (label->parts == NULL) { 448 label->parts = mbr_alloc_partitions(); 449 if (label->parts == NULL) 450 return ENOMEM; //FIXME! merge mbr_err_val into errno.h 451 } 452 453 if (mbr_get_flag(p, ST_LOGIC)) 414 454 /* adding logical partition */ 415 416 /* is there any extended partition? */ 417 if (parts->l_extended == NULL) 418 return ERR_NO_EXTENDED; 419 420 /* is the logical partition inside the extended one? */ 421 mbr_part_t *ext = list_get_instance(parts->l_extended, mbr_part_t, link); 422 if (!check_encaps(p, ext)) 423 return ERR_OUT_BOUNDS; 424 425 /* find a place for the new partition in a sorted linked list */ 426 //mbr_part_t *last = list_get_instance(list_last(&(parts->list)), mbr_part_t, link); 427 mbr_part_t *iter; 428 //uint32_t ebr_space = 1; 429 mbr_part_foreach(parts, iter) { 430 if (mbr_get_flag(iter, ST_LOGIC)) { 431 if (check_overlap(p, iter)) 432 return ERR_OVERLAP; 433 if (check_preceeds(iter, p)) { 434 /* checking if there's at least one sector of space preceeding */ 435 if ((iter->start_addr + iter->length) >= p->start_addr - 1) 436 return ERR_NO_EBR; 437 } else { 438 /* checking if there's at least one sector of space following (for following partitions's EBR) */ 439 if ((p->start_addr + p->length) >= iter->start_addr - 1) 440 return ERR_NO_EBR; 441 } 442 } 443 } 444 445 /* alloc EBR if it's not already there */ 446 if (p->ebr == NULL) { 447 p->ebr = alloc_br(); 448 if (p->ebr == NULL) { 449 return ERR_NOMEM; 450 } 451 } 452 453 /* add it */ 454 list_append(&(p->link), &(parts->list)); 455 parts->n_logical += 1; 456 } else { 455 return mbr_add_logical(label, p); 456 else 457 457 /* adding primary */ 458 459 if (parts->n_primary == 4) { 460 return ERR_PRIMARY_FULL; 461 } 462 463 /* Check if partition makes space for MBR itself. */ 464 if (p->start_addr == 0 || ((aoff64_t) p->start_addr) + p->length >= nblocks) { 465 return ERR_OUT_BOUNDS; 466 } 467 printf("add4.\n"); 468 /* if it's extended, is there any other one? */ 469 if ((p->type == PT_EXTENDED || p->type == PT_EXTENDED_LBA) && parts->l_extended != NULL) { 470 return ERR_EXTENDED_PRESENT; 471 } 472 printf("add5.\n"); 473 /* find a place and add it */ 474 mbr_part_t *iter; 475 mbr_part_t *empty = NULL; 476 mbr_part_foreach(parts, iter) { 477 printf("type: %x\n", iter->type); 478 if (iter->type == PT_UNUSED) { 479 if (empty == NULL) 480 empty = iter; 481 } else if (check_overlap(p, iter)) 482 return ERR_OVERLAP; 483 } 484 printf("add6. %p, %p\n", empty, p); 485 list_insert_after(&(p->link), &(empty->link)); 486 printf("add6.1.\n"); 487 list_remove(&(empty->link)); 488 printf("add6.2.\n"); 489 free(empty); 490 printf("add7.\n"); 491 parts->n_primary += 1; 492 493 if (p->type == PT_EXTENDED || p->type == PT_EXTENDED_LBA) 494 parts->l_extended = &(p->link); 495 } 496 printf("add8.\n"); 497 return ERR_OK; 458 return mbr_add_primary(label, p); 498 459 } 499 460 … … 572 533 void mbr_set_flag(mbr_part_t *p, MBR_FLAGS flag, bool value) 573 534 { 574 uint 8_t status = p->status;535 uint16_t status = p->status; 575 536 576 537 if (value) … … 582 543 } 583 544 584 /** Get next aligned address (in sectors!)*/545 /** Get next aligned address */ 585 546 uint32_t mbr_get_next_aligned(uint32_t addr, unsigned int alignment) 586 547 { 587 548 uint32_t div = addr / alignment; 588 549 return (div + 1) * alignment; 550 } 551 552 list_t * mbr_get_list(mbr_label_t *label) 553 { 554 if (label->parts != NULL) 555 return &(label->parts->list); 556 else 557 return NULL; 558 } 559 560 mbr_part_t * mbr_get_first_partition(mbr_label_t *label) 561 { 562 list_t *list = mbr_get_list(label); 563 if (list != NULL && !list_empty(list)) 564 return list_get_instance(list->head.next, mbr_part_t, link); 565 else 566 return NULL; 567 } 568 569 mbr_part_t * mbr_get_next_partition(mbr_label_t *label, mbr_part_t *p) 570 { 571 list_t *list = mbr_get_list(label); 572 if (list != NULL && &(p->link) != list_last(list)) 573 return list_get_instance(p->link.next, mbr_part_t, link); 574 else 575 return NULL; 589 576 } 590 577 … … 630 617 trgt->type = src->ptype; 631 618 632 /* Checking only 0x80; otherwise writing will fix to 0x00 */ 633 trgt->status = (trgt->status & 0xFF00) | src->status; 619 trgt->status = (trgt->status & 0xFF00) | (uint16_t) src->status; 634 620 635 621 trgt->start_addr = uint32_t_le2host(src->first_lba) + base; … … 694 680 695 681 while (ebr->pte[1].ptype != PT_UNUSED) { 682 696 683 ebr = alloc_br(); 697 684 if (ebr == NULL) { … … 715 702 goto free_ebr_end; 716 703 } 717 718 704 719 705 decode_part(&(ebr->pte[0]), p, addr); … … 762 748 trgt->length = host2uint32_t_le(src->length); 763 749 } 750 751 if (trgt->ptype == PT_UNUSED) 752 memset(trgt, 0, sizeof(pt_entry_t)); 764 753 } else { 765 trgt->status = 0; 766 trgt->first_chs[0] = 0; 767 trgt->first_chs[1] = 0; 768 trgt->first_chs[2] = 0; 769 trgt->ptype = 0; 770 trgt->last_chs[0] = 0; 771 trgt->last_chs[1] = 0; 772 trgt->last_chs[2] = 0; 773 trgt->first_lba = 0; 774 trgt->length = 0; 754 memset(trgt, 0, sizeof(pt_entry_t)); 775 755 } 776 756 } … … 782 762 static int check_overlap(mbr_part_t * p1, mbr_part_t * p2) 783 763 { 784 if (p1->start_addr < p2->start_addr && p1->start_addr + p1->length < p2->start_addr) {764 if (p1->start_addr < p2->start_addr && p1->start_addr + p1->length <= p2->start_addr) { 785 765 return 0; 786 } else if (p1->start_addr > p2->start_addr && p2->start_addr + p2->length < p1->start_addr) {766 } else if (p1->start_addr > p2->start_addr && p2->start_addr + p2->length <= p1->start_addr) { 787 767 return 0; 788 768 } … … 815 795 } 816 796 817 818 819 797 mbr_err_val mbr_add_primary(mbr_label_t *label, mbr_part_t *p) 798 { 799 if (label->parts->n_primary == 4) { 800 return ERR_PRIMARY_FULL; 801 } 802 803 /* Check if partition makes space for MBR itself. */ 804 if (p->start_addr == 0) { 805 return ERR_OUT_BOUNDS; 806 } 807 808 /* if it's extended, is there any other one? */ 809 if ((p->type == PT_EXTENDED || p->type == PT_EXTENDED_LBA) && label->parts->l_extended != NULL) { 810 return ERR_EXTENDED_PRESENT; 811 } 812 813 /* find a place and add it */ 814 mbr_part_t *iter; 815 mbr_part_t *empty = NULL; 816 mbr_part_foreach(label, iter) { 817 if (iter->type == PT_UNUSED) { 818 if (empty == NULL) 819 empty = iter; 820 } else if (check_overlap(p, iter)) 821 return ERR_OVERLAP; 822 } 823 824 list_insert_after(&(p->link), &(empty->link)); 825 list_remove(&(empty->link)); 826 free(empty); 827 828 label->parts->n_primary += 1; 829 830 if (p->type == PT_EXTENDED || p->type == PT_EXTENDED_LBA) 831 label->parts->l_extended = &(p->link); 832 833 return EOK; 834 } 835 836 mbr_err_val mbr_add_logical(mbr_label_t *label, mbr_part_t *p) 837 { 838 /* is there any extended partition? */ 839 if (label->parts->l_extended == NULL) 840 return ERR_NO_EXTENDED; 841 842 /* is the logical partition inside the extended one? */ 843 mbr_part_t *ext = list_get_instance(label->parts->l_extended, mbr_part_t, link); 844 if (!check_encaps(p, ext)) 845 return ERR_OUT_BOUNDS; 846 847 /* find a place for the new partition in a sorted linked list */ 848 bool first_logical = true; 849 mbr_part_t *iter; 850 mbr_part_foreach(label, iter) { 851 if (mbr_get_flag(iter, ST_LOGIC)) { 852 if (check_overlap(p, iter)) 853 return ERR_OVERLAP; 854 if (check_preceeds(iter, p)) { 855 /* checking if there's at least one sector of space preceeding */ 856 if ((iter->start_addr + iter->length) >= p->start_addr - 1) 857 return ERR_NO_EBR; 858 } else if (first_logical){ 859 /* First logical partition's EBR is before every other 860 * logical partition. Thus we don't check if this partition 861 * leaves enough space for it. */ 862 first_logical = false; 863 } else { 864 /* checking if there's at least one sector of space following (for following partitions's EBR) */ 865 if ((p->start_addr + p->length) >= iter->start_addr - 1) 866 return ERR_NO_EBR; 867 } 868 } 869 } 870 871 /* alloc EBR if it's not already there */ 872 if (p->ebr == NULL) { 873 p->ebr = alloc_br(); 874 if (p->ebr == NULL) { 875 return ERR_NOMEM; 876 } 877 } 878 879 /* add it */ 880 list_append(&(p->link), &(label->parts->list)); 881 label->parts->n_logical += 1; 882 883 return EOK; 884 } 885 886 887 -
uspace/lib/mbr/libmbr.h
rc9f61150 r6e8e4e19 213 213 extern void mbr_set_flag(mbr_part_t *, MBR_FLAGS, bool); 214 214 extern uint32_t mbr_get_next_aligned(uint32_t, unsigned int); 215 216 #define mbr_part_foreach(parts, iterator) \ 217 for (iterator = list_get_instance((parts)->list.head.next, mbr_part_t, link); \ 218 iterator != list_get_instance(&((parts)->list.head), mbr_part_t, link); \ 215 extern list_t * mbr_get_list(mbr_label_t *); 216 extern mbr_part_t * mbr_get_first_partition(mbr_label_t *); 217 extern mbr_part_t * mbr_get_next_partition(mbr_label_t *, mbr_part_t *); 218 219 #define mbr_part_foreach(label, iterator) \ 220 for (iterator = list_get_instance((label)->parts->list.head.next, mbr_part_t, link); \ 221 iterator != list_get_instance(&((label)->parts->list.head), mbr_part_t, link); \ 219 222 iterator = list_get_instance(iterator->link.next, mbr_part_t, link)) 220 223
Note:
See TracChangeset
for help on using the changeset viewer.