Changeset 6317b33 in mainline for uspace/app
- Timestamp:
- 2013-06-25T00:29:00Z (12 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 52f2c89
- Parents:
- cb328ab (diff), 1c8bfe8 (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. - Location:
- uspace/app/hdisk
- Files:
-
- 9 edited
-
common.h (modified) (2 diffs)
-
func_gpt.c (modified) (4 diffs)
-
func_gpt.h (modified) (1 diff)
-
func_mbr.c (modified) (10 diffs)
-
func_mbr.h (modified) (1 diff)
-
func_none.c (modified) (7 diffs)
-
func_none.h (modified) (1 diff)
-
hdisk.c (modified) (12 diffs)
-
hdisk.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/hdisk/common.h
rcb328ab r6317b33 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
rcb328ab r6317b33 34 34 35 35 #include <stdio.h> 36 #include <str.h> 36 37 #include <errno.h> 37 38 #include <str_error.h> … … 43 44 static int set_gpt_partition(tinput_t *, gpt_part_t *); 44 45 45 int add_gpt_part(tinput_t * in, union label_data * data) 46 { 47 gpt_part_t * p = gpt_alloc_partition(data->gpt->parts); 46 47 int construct_gpt_label(label_t *this) 48 { 49 this->layout = LYT_GPT; 50 this->alignment = 1; 51 52 this->add_part = add_gpt_part; 53 this->delete_part = delete_gpt_part; 54 this->new_label = new_gpt_label; 55 this->print_parts = print_gpt_parts; 56 this->read_parts = read_gpt_parts; 57 this->write_parts = write_gpt_parts; 58 this->extra_funcs = extra_gpt_funcs; 59 60 return this->new_label(this); 61 } 62 63 int add_gpt_part(label_t *this, tinput_t *in) 64 { 65 gpt_part_t * p = gpt_get_partition(this->data.gpt); 48 66 if (p == NULL) { 49 67 return ENOMEM; 50 68 } 51 69 52 70 return set_gpt_partition(in, p); 53 71 } 54 72 55 int delete_gpt_part(tinput_t * in, union label_data * data) 56 { 73 int delete_gpt_part(label_t *this, tinput_t *in) 74 { 75 int rc; 57 76 size_t idx; 58 77 59 78 printf("Number of the partition to delete (counted from 0): "); 60 79 idx = get_input_size_t(in); 61 62 if (gpt_remove_partition(data->gpt->parts, idx) == -1) { 80 81 rc = gpt_remove_partition(this->data.gpt, idx); 82 if (rc != EOK) { 63 83 printf("Warning: running low on memory, not resizing...\n"); 64 } 65 66 return EOK; 67 } 68 69 int destroy_gpt_label(union label_data *data) 70 { 71 return EOK; 72 } 73 74 int new_gpt_label(union label_data *data) 75 { 76 data->gpt->gpt = gpt_alloc_gpt_header(); 77 data->gpt->parts = gpt_alloc_partitions(); 78 return EOK; 79 } 80 81 int print_gpt_parts(union label_data *data) 84 return rc; 85 } 86 87 return EOK; 88 } 89 90 int destroy_gpt_label(label_t *this) 91 { 92 gpt_free_label(this->data.gpt); 93 return EOK; 94 } 95 96 int new_gpt_label(label_t *this) 97 { 98 this->data.gpt = gpt_alloc_label(); 99 return EOK; 100 } 101 102 int print_gpt_parts(label_t *this) 82 103 { 83 104 //int rc; … … 87 108 size_t i = 0; 88 109 89 gpt_part_foreach(data->gpt->parts, iter) { 110 gpt_part_foreach(this->data.gpt, iter) { 111 i++; 112 //FIXMEE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 113 if (gpt_get_part_type(iter) == GPT_PTE_UNUSED) 114 continue; 115 116 if (i % 20 == 0) 117 printf("%15s %10s %10s Type: Name:\n", "Start:", "End:", "Length:"); 118 90 119 //printf("\t%10u %10u %10u %3d\n", iter->start_addr, iter->start_addr + iter->length, 91 120 // iter->length, gpt_get_part_type(iter), gpt_get_part_name(iter)); 92 printf("%3u \t%10llu %10llu %10llu %3d %s\n", i, gpt_get_start_lba(iter), gpt_get_end_lba(iter),121 printf("%3u %10llu %10llu %10llu %3d %s\n", i-1, gpt_get_start_lba(iter), gpt_get_end_lba(iter), 93 122 gpt_get_end_lba(iter) - gpt_get_start_lba(iter), gpt_get_part_type(iter), 94 123 gpt_get_part_name(iter)); 95 i++; 96 } 97 124 } 125 98 126 //return rc; 99 127 return EOK; 100 128 } 101 129 102 int read_gpt_parts(service_id_t dev_handle, union label_data *data) 103 { 104 return EOK; 105 } 106 107 int write_gpt_parts(service_id_t dev_handle, union label_data * data) 108 { 109 int rc; 110 111 rc = gpt_write_partitions(data->gpt->parts, data->gpt->gpt, dev_handle); 130 int read_gpt_parts(label_t *this, service_id_t dev_handle) 131 { 132 int rc; 133 134 rc = gpt_read_header(this->data.gpt, dev_handle); 135 if (rc != EOK) { 136 printf("Error: Reading header failed: %d (%s)\n", rc, str_error(rc)); 137 return rc; 138 } 139 140 rc = gpt_read_partitions(this->data.gpt); 141 if (rc != EOK) { 142 printf("Error: Reading partitions failed: %d (%s)\n", rc, str_error(rc)); 143 return rc; 144 } 145 146 return EOK; 147 } 148 149 int write_gpt_parts(label_t *this, service_id_t dev_handle) 150 { 151 int rc; 152 153 rc = gpt_write_partitions(this->data.gpt, dev_handle); 112 154 if (rc != EOK) { 113 155 printf("Error: Writing partitions failed: %d (%s)\n", rc, str_error(rc)); 114 156 return rc; 115 157 } 116 117 rc = gpt_write_ gpt_header(data->gpt->gpt, dev_handle);118 if (rc != EOK) { 119 printf("Error: Writing partitionsfailed: %d (%s)\n", rc, str_error(rc));120 return rc; 121 } 122 123 return EOK; 124 } 125 126 int extra_gpt_funcs( tinput_t * in, service_id_t dev_handle, union label_data * data)158 159 rc = gpt_write_header(this->data.gpt, dev_handle); 160 if (rc != EOK) { 161 printf("Error: Writing header failed: %d (%s)\n", rc, str_error(rc)); 162 return rc; 163 } 164 165 return EOK; 166 } 167 168 int extra_gpt_funcs(label_t *this, tinput_t *in, service_id_t dev_handle) 127 169 { 128 170 printf("Not implemented.\n"); … … 130 172 } 131 173 132 static int set_gpt_partition(tinput_t * in, gpt_part_t *p)133 { 134 //int rc;135 174 static int set_gpt_partition(tinput_t *in, gpt_part_t *p) 175 { 176 int rc; 177 136 178 uint64_t sa, ea; 137 179 138 180 printf("Set starting address (number): "); 139 181 sa = get_input_uint64(in); 140 182 141 183 printf("Set end addres (number): "); 142 184 ea = get_input_uint64(in); 143 185 144 186 if (ea <= sa) { 145 187 printf("Invalid value.\n"); 146 188 return EINVAL; 147 189 } 148 149 150 //p->start_addr = sa; 190 151 191 gpt_set_start_lba(p, sa); 152 //p->length = ea - sa;153 192 gpt_set_end_lba(p, ea); 154 155 return EOK; 156 } 157 193 194 195 char *name; 196 rc = get_input_line(in, &name); 197 if (rc != EOK) { 198 printf("Error reading name: %d (%s)\n", rc, str_error(rc)); 199 return rc; 200 } 201 202 gpt_set_part_name(p, name, str_size(name)); 203 204 return EOK; 205 } 206 -
uspace/app/hdisk/func_gpt.h
rcb328ab r6317b33 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
rcb328ab r6317b33 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
rcb328ab r6317b33 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
rcb328ab r6317b33 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
rcb328ab r6317b33 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
rcb328ab r6317b33 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 * in;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
rcb328ab r6317b33 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
Note:
See TracChangeset
for help on using the changeset viewer.
