Changeset 6453e306 in mainline for uspace/app
- Timestamp:
- 2013-12-25T16:09:43Z (12 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- ac36aed
- Parents:
- d51beba3
- Location:
- uspace/app/hdisk
- Files:
-
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/hdisk/common.h
rd51beba3 r6453e306 1 1 /* 2 * Copyright (c) 2012 ,2013 Dominik Taborsky2 * Copyright (c) 2012-2013 Dominik Taborsky 3 3 * All rights reserved. 4 4 * … … 27 27 */ 28 28 29 29 /** @addtogroup hdisk 30 30 * @{ 31 31 */ … … 45 45 } layouts_t; 46 46 47 union label_data{48 mbr_label_t 49 gpt_label_t 50 } ;47 typedef union { 48 mbr_label_t *mbr; 49 gpt_label_t *gpt; 50 } label_data_t; 51 51 52 typedef struct label label_t; 53 54 struct label { 52 typedef struct label { 55 53 layouts_t layout; 56 aoff64_t nblocks;54 aoff64_t blocks; 57 55 service_id_t device; 58 union label_datadata;56 label_data_t data; 59 57 unsigned int alignment; 60 int (* destroy_label)( label_t*);61 int (* add_part) (label_t*, tinput_t *);62 int (* delete_part) (label_t*, tinput_t *);63 int (* new_label) (label_t*);64 int (* print_parts) (label_t*);65 int (* read_parts) (label_t*);66 int (* write_parts) (label_t*);67 int (* extra_funcs) (label_t*, tinput_t *);68 } ;58 int (* destroy_label)(struct label *); 59 int (* add_part)(struct label *, tinput_t *); 60 int (* delete_part)(struct label *, tinput_t *); 61 int (* new_label)(struct label *); 62 int (* print_parts)(struct label *); 63 int (* read_parts)(struct label *); 64 int (* write_parts)(struct label *); 65 int (* extra_funcs)(struct label *, tinput_t *); 66 } label_t; 69 67 70 68 #endif 71 -
uspace/app/hdisk/func_gpt.c
rd51beba3 r6453e306 1 1 /* 2 * Copyright (c) 2012 ,2013 Dominik Taborsky2 * Copyright (c) 2012-2013 Dominik Taborsky 3 3 * All rights reserved. 4 4 * … … 27 27 */ 28 28 29 29 /** @addtogroup hdisk 30 30 * @{ 31 31 */ … … 39 39 #include <sys/types.h> 40 40 #include <sys/typefmt.h> 41 42 41 #include "func_gpt.h" 43 42 #include "input.h" … … 51 50 this->alignment = 1; 52 51 53 this->add_part 54 this->delete_part 52 this->add_part = add_gpt_part; 53 this->delete_part = delete_gpt_part; 55 54 this->destroy_label = destroy_gpt_label; 56 this->new_label 57 this->print_parts 58 this->read_parts 59 this->write_parts 60 this->extra_funcs 55 this->new_label = new_gpt_label; 56 this->print_parts = print_gpt_parts; 57 this->read_parts = read_gpt_parts; 58 this->write_parts = write_gpt_parts; 59 this->extra_funcs = extra_gpt_funcs; 61 60 62 61 return this->new_label(this); … … 65 64 int add_gpt_part(label_t *this, tinput_t *in) 66 65 { 67 gpt_part_t * p= gpt_get_partition(this->data.gpt);68 if (p == NULL) {66 gpt_part_t *partition = gpt_get_partition(this->data.gpt); 67 if (partition == NULL) 69 68 return ENOMEM; 70 } 71 72 return set_gpt_partition(in, p, this); 69 70 return set_gpt_partition(in, partition, this); 73 71 } 74 72 75 73 int delete_gpt_part(label_t *this, tinput_t *in) 76 74 { 77 int rc; 78 size_t idx; 79 80 printf("Number of the partition to delete (counted from 0): "); 81 idx = get_input_size_t(in); 82 83 rc = gpt_remove_partition(this->data.gpt, idx); 75 printf("Index of the partition to delete (counted from 0): "); 76 size_t idx = get_input_size_t(in); 77 78 int rc = gpt_remove_partition(this->data.gpt, idx); 84 79 if (rc == ENOMEM) { 85 printf("Warning: running low on memory, not resizing...\n");80 printf("Warning: Running out on memory, not resizing.\n"); 86 81 return rc; 87 82 } else if (rc == EINVAL) { … … 107 102 int print_gpt_parts(label_t *this) 108 103 { 109 printf("Current partition scheme (GPT)(number of blocks: %" PRIu64 "):\n", this->nblocks);110 printf(" %15s %10s %10s Type: Name:\n", "Start:", "End:", "Length:");104 printf("Current partition scheme: GPT\n"); 105 printf("Number of blocks: %" PRIu64 "\n", this->blocks); 111 106 112 107 size_t i = 0; 113 114 108 gpt_part_foreach (this->data.gpt, iter) { 115 i++;116 117 109 if (gpt_get_part_type(iter) == GPT_PTE_UNUSED) 118 110 continue; 119 111 120 112 if (i % 20 == 0) 121 printf("%15s %10s %10s Type: Name:\n", "Start:", "End:", "Length:");122 113 printf("%15s %10s %10s Type: Name:\n", 114 "Start:", "End:", "Length:"); 123 115 124 116 printf("%3zu %10" PRIu64 " %10" PRIu64 " %10" PRIu64 " %3zu %s\n", 125 i-1, gpt_get_start_lba(iter), gpt_get_end_lba(iter), 126 gpt_get_end_lba(iter) - gpt_get_start_lba(iter), 127 gpt_get_part_type(iter), gpt_get_part_name(iter)); 128 117 i, gpt_get_start_lba(iter), gpt_get_end_lba(iter), 118 gpt_get_end_lba(iter) - gpt_get_start_lba(iter), 119 gpt_get_part_type(iter), gpt_get_part_name(iter)); 120 121 i++; 129 122 } 130 123 … … 134 127 int read_gpt_parts(label_t *this) 135 128 { 136 int rc; 137 138 rc = gpt_read_header(this->data.gpt, this->device); 139 if (rc != EOK) { 140 printf("Error: Reading header failed: %d (%s)\n", rc, str_error(rc)); 129 int rc = gpt_read_header(this->data.gpt, this->device); 130 if (rc != EOK) { 131 printf("Error: Reading header failed: %d (%s)\n", rc, 132 str_error(rc)); 141 133 return rc; 142 134 } … … 144 136 rc = gpt_read_partitions(this->data.gpt); 145 137 if (rc != EOK) { 146 printf("Error: Reading partitions failed: %d (%s)\n", rc, str_error(rc)); 138 printf("Error: Reading partitions failed: %d (%s)\n", rc, 139 str_error(rc)); 147 140 return rc; 148 141 } … … 153 146 int write_gpt_parts(label_t *this) 154 147 { 155 int rc; 156 printf("test1\n"); 157 rc = gpt_write_partitions(this->data.gpt, this->device); 158 if (rc != EOK) { 159 printf("Error: Writing partitions failed: %d (%s)\n", rc, str_error(rc)); 160 return rc; 161 } 162 printf("test2\n"); 148 int rc = gpt_write_partitions(this->data.gpt, this->device); 149 if (rc != EOK) { 150 printf("Error: Writing partitions failed: %d (%s)\n", rc, 151 str_error(rc)); 152 return rc; 153 } 154 163 155 return EOK; 164 156 } … … 170 162 } 171 163 172 static int set_gpt_partition(tinput_t *in, gpt_part_t *p, label_t * this) 173 { 174 int rc; 175 176 uint64_t sa, ea; 177 164 static int set_gpt_partition(tinput_t *in, gpt_part_t *partition, label_t *this) 165 { 178 166 printf("Set starting address: "); 179 sa = get_input_uint64(in); 180 if (this->alignment != 0 && this->alignment != 1 && sa % this->alignment != 0) 167 uint64_t sa = get_input_uint64(in); 168 if ((this->alignment != 0) && (this->alignment != 1) && 169 (sa % this->alignment != 0)) 181 170 sa = gpt_get_next_aligned(sa, this->alignment); 182 171 183 printf("Set end address (max: %" PRIu64 "): ", this-> nblocks);184 ea = get_input_uint64(in);172 printf("Set end address (max: %" PRIu64 "): ", this->blocks); 173 uint64_t ea = get_input_uint64(in); 185 174 186 175 if (ea <= sa) { … … 189 178 } 190 179 191 gpt_set_start_lba(p, sa); 192 gpt_set_end_lba(p, ea); 193 194 /* See global.c from libgpt for all partition types. */ 180 gpt_set_start_lba(partition, sa); 181 gpt_set_end_lba(partition, ea); 182 195 183 printf("Choose type: "); 196 184 print_part_types(); 197 185 printf("Set type (1 for HelenOS System): "); 198 186 size_t idx = get_input_size_t(in); 199 gpt_set_part_type(p, idx); 200 201 gpt_set_random_uuid(p->part_id); 202 187 gpt_set_part_type(partition, idx); 188 189 gpt_set_random_uuid(partition->part_id); 190 191 printf("Name the partition: "); 203 192 char *name; 204 printf("Name the partition: "); 205 rc = get_input_line(in, &name); 193 int rc = get_input_line(in, &name); 206 194 if (rc != EOK) { 207 195 printf("Error reading name: %d (%s)\n", rc, str_error(rc)); … … 209 197 } 210 198 211 gpt_set_part_name(p , name, str_size(name));199 gpt_set_part_name(partition, name, str_size(name)); 212 200 213 201 return EOK; … … 216 204 static void print_part_types(void) 217 205 { 218 int c; 219 int count = 0; 220 const struct partition_type * ptype = gpt_ptypes; 206 unsigned int count = 0; 207 const partition_type_t *ptype = gpt_ptypes; 221 208 222 209 do { 210 printf("%u: %s\n", count, ptype->desc); 211 count++; 212 ptype++; 213 223 214 if (count % 10 == 0) { 224 215 printf("Print (more) partition types? (y/n)\n"); 225 c = getchar();216 int c = getchar(); 226 217 if (c == 'n') 227 218 return; 228 219 } 229 230 printf("%d: %s\n", count, ptype->desc);231 ++count;232 ++ptype;233 220 } while (ptype->guid != NULL); 234 221 } 235 -
uspace/app/hdisk/func_gpt.h
rd51beba3 r6453e306 1 1 /* 2 * Copyright (c) 2012 ,2013 Dominik Taborsky2 * Copyright (c) 2012-2013 Dominik Taborsky 3 3 * All rights reserved. 4 4 * … … 27 27 */ 28 28 29 29 /** @addtogroup hdisk 30 30 * @{ 31 31 */ … … 34 34 35 35 #ifndef __FUNC_GPT_H__ 36 #define 36 #define __FUNC_GPT_H__ 37 37 38 38 #include <loc.h> 39 39 #include <tinput.h> 40 40 #include <libgpt.h> 41 42 41 #include "common.h" 43 42 44 43 extern int construct_gpt_label(label_t *); 45 extern int add_gpt_part 46 extern int delete_gpt_part 44 extern int add_gpt_part(label_t *, tinput_t *); 45 extern int delete_gpt_part(label_t *, tinput_t *); 47 46 extern int destroy_gpt_label(label_t *); 48 extern int new_gpt_label 49 extern int print_gpt_parts 50 extern int read_gpt_parts 51 extern int write_gpt_parts 52 extern int extra_gpt_funcs 47 extern int new_gpt_label(label_t *); 48 extern int print_gpt_parts(label_t *); 49 extern int read_gpt_parts(label_t *); 50 extern int write_gpt_parts(label_t *); 51 extern int extra_gpt_funcs(label_t *, tinput_t *); 53 52 54 53 #endif -
uspace/app/hdisk/func_mbr.c
rd51beba3 r6453e306 1 1 /* 2 * Copyright (c) 2012 ,2013 Dominik Taborsky2 * Copyright (c) 2012-2013 Dominik Taborsky 3 3 * All rights reserved. 4 4 * … … 27 27 */ 28 28 29 29 /** @addtogroup hdisk 30 30 * @{ 31 31 */ … … 37 37 #include <str_error.h> 38 38 #include <sys/types.h> 39 40 39 #include "func_mbr.h" 41 40 #include "input.h" … … 62 61 int add_mbr_part(label_t *this, tinput_t *in) 63 62 { 64 int rc;65 66 mbr_part_t *part = mbr_alloc_partition();67 68 rc = set_mbr_partition(in, part, this);63 mbr_part_t *partition = mbr_alloc_partition(); 64 if (partition == NULL) 65 return ENOMEM; 66 67 int rc = set_mbr_partition(in, partition, this); 69 68 if (rc != EOK) 70 69 return rc; 71 70 72 rc = mbr_add_partition(this->data.mbr, part );73 if (rc != ERR_OK) {71 rc = mbr_add_partition(this->data.mbr, partition); 72 if (rc != ERR_OK) 74 73 printf("Error adding partition: %d\n", rc); 75 }76 74 77 75 return EOK; … … 80 78 int delete_mbr_part(label_t *this, tinput_t *in) 81 79 { 82 int rc; 83 size_t idx; 84 85 printf("Number of the partition to delete (counted from 0): "); 86 idx = get_input_size_t(in); 87 88 if (idx == 0 && errno != EOK) 89 return errno; 90 91 rc = mbr_remove_partition(this->data.mbr, idx); 92 if (rc != EOK) { 80 printf("Index of the partition to delete (counted from 0): "); 81 size_t idx = get_input_size_t(in); 82 83 if ((idx == 0) && (errno != EOK)) 84 return errno; 85 86 int rc = mbr_remove_partition(this->data.mbr, idx); 87 if (rc != EOK) 93 88 printf("Error: partition does not exist?\n"); 94 }95 89 96 90 return EOK; … … 113 107 } 114 108 115 /** Print current partition scheme */116 109 int print_mbr_parts(label_t *this) 117 110 { 118 int num = 0; 119 120 printf("Current partition scheme (MBR)(number of blocks: %" PRIu64 "):\n", this->nblocks); 121 printf("\t\t%10s %10s %10s %10s %7s\n", "Bootable:", "Start:", "End:", "Length:", "Type:"); 122 111 printf("Current partition scheme: MBR\n"); 112 printf("Number of blocks: %" PRIu64 "\n", this->blocks); 113 printf("\t\t%10s %10s %10s %10s %7s\n", 114 "Bootable:", "Start:", "End:", "Length:", "Type:"); 115 116 unsigned int num = 0; 123 117 mbr_part_t *it; 124 125 118 for (it = mbr_get_first_partition(this->data.mbr); it != NULL; 126 119 it = mbr_get_next_partition(this->data.mbr, it)) { … … 128 121 continue; 129 122 130 printf("\tP% d:\t", num);123 printf("\tP%u:\t", num); 131 124 if (mbr_get_flag(it, ST_BOOT)) 132 125 printf("*"); … … 134 127 printf(" "); 135 128 136 printf("\t%10u %10u %10u %7u\n", it->start_addr, it->start_addr + it->length, it->length, it->type); 129 printf("\t%10u %10u %10u %7u\n", it->start_addr, 130 it->start_addr + it->length, it->length, it->type); 137 131 138 132 num++; 139 133 } 140 134 141 printf("% dpartitions found.\n", num);135 printf("%u partitions found.\n", num); 142 136 143 137 return EOK; … … 146 140 int read_mbr_parts(label_t *this) 147 141 { 148 int rc; 149 rc = mbr_read_mbr(this->data.mbr, this->device); 142 int rc = mbr_read_mbr(this->data.mbr, this->device); 150 143 if (rc != EOK) 151 144 return rc; … … 164 157 { 165 158 int rc = mbr_write_partitions(this->data.mbr, this->device); 166 if (rc != EOK) {167 printf("Error occured during writing: ERR: %d: %s\n", rc, str_error(rc));168 }159 if (rc != EOK) 160 printf("Error occured during writing: ERR: %d: %s\n", rc, 161 str_error(rc)); 169 162 170 163 return rc; … … 177 170 } 178 171 179 static int set_mbr_partition(tinput_t *in, mbr_part_t *p, label_t * this) 180 { 181 int c; 182 uint8_t type; 183 172 static int set_mbr_partition(tinput_t *in, mbr_part_t *partition, label_t *this) 173 { 184 174 printf("Primary (p) or logical (l): "); 185 c = getchar();175 int c = getchar(); 186 176 printf("%c\n", c); 187 177 188 178 switch (c) { 189 179 case 'p': 190 mbr_set_flag(p , ST_LOGIC, false);180 mbr_set_flag(partition, ST_LOGIC, false); 191 181 break; 192 182 case 'l': 193 mbr_set_flag(p , ST_LOGIC, true);183 mbr_set_flag(partition, ST_LOGIC, true); 194 184 break; 195 185 default: … … 198 188 } 199 189 200 printf("Set type (0 -255): ");201 type = get_input_uint8(in);202 if ( type == 0 && errno != EOK)203 return errno; 204 205 // /TODO: there can only be one boolabel partition; let's do it just like fdisk190 printf("Set type (0 - 255): "); 191 uint8_t type = get_input_uint8(in); 192 if ((type == 0) && (errno != EOK)) 193 return errno; 194 195 // FIXME: Make sure there is at most one bootable partition 206 196 printf("Bootable? (y/n): "); 207 197 c = getchar(); 208 if ( c != 'y' && c != 'Y' && c != 'n' && c != 'N') {198 if ((c != 'y') && (c != 'Y') && (c != 'n') && (c != 'N')) { 209 199 printf("Invalid value. Cancelled."); 210 200 return EINVAL; 211 201 } 202 212 203 printf("%c\n", c); 213 mbr_set_flag(p, ST_BOOT, (c == 'y' || c == 'Y') ? true : false); 214 215 216 uint32_t sa, ea; 217 204 mbr_set_flag(partition, ST_BOOT, (c == 'y' || c == 'Y') ? true : false); 205 218 206 printf("Set starting address: "); 219 sa = get_input_uint32(in); 220 if (sa == 0 && errno != EOK) 221 return errno; 222 223 if (this->alignment != 0 && this->alignment != 1 && sa % this->alignment != 0) { 207 uint32_t sa = get_input_uint32(in); 208 if ((sa == 0) && (errno != EOK)) 209 return errno; 210 211 if ((this->alignment != 0) && (this->alignment != 1) && 212 (sa % this->alignment != 0)) { 224 213 sa = mbr_get_next_aligned(sa, this->alignment); 225 printf("Starting address was aligned to % u.\n", sa);226 } 227 228 printf("Set end addres (max: %" PRIu64 "): ", this-> nblocks);229 ea = get_input_uint32(in);230 if ( ea == 0 && errno != EOK)214 printf("Starting address was aligned to %" PRIu32 ".\n", sa); 215 } 216 217 printf("Set end addres (max: %" PRIu64 "): ", this->blocks); 218 uint32_t ea = get_input_uint32(in); 219 if ((ea == 0) && (errno != EOK)) 231 220 return errno; 232 221 … … 236 225 } 237 226 238 p->type = type; 239 p->start_addr = sa; 240 p->length = ea - sa; 241 242 return EOK; 243 } 244 245 246 247 248 249 227 partition->type = type; 228 partition->start_addr = sa; 229 partition->length = ea - sa; 230 231 return EOK; 232 } -
uspace/app/hdisk/func_mbr.h
rd51beba3 r6453e306 1 1 /* 2 * Copyright (c) 2012 ,2013 Dominik Taborsky2 * Copyright (c) 2012-2013 Dominik Taborsky 3 3 * All rights reserved. 4 4 * … … 27 27 */ 28 28 29 29 /** @addtogroup hdisk 30 30 * @{ 31 31 */ … … 34 34 35 35 #ifndef __FUNC_MBR_H__ 36 #define 36 #define __FUNC_MBR_H__ 37 37 38 38 #include <loc.h> 39 39 #include <tinput.h> 40 40 #include <libmbr.h> 41 42 41 #include "common.h" 43 42 44 43 extern int construct_mbr_label(label_t *); 45 extern int add_mbr_part 46 extern int delete_mbr_part 44 extern int add_mbr_part(label_t *, tinput_t *); 45 extern int delete_mbr_part(label_t *, tinput_t *); 47 46 extern int destroy_mbr_label(label_t *); 48 extern int new_mbr_label 49 extern int print_mbr_parts 50 extern int read_mbr_parts 51 extern int write_mbr_parts 52 extern int extra_mbr_funcs 47 extern int new_mbr_label(label_t *); 48 extern int print_mbr_parts(label_t *); 49 extern int read_mbr_parts(label_t *); 50 extern int write_mbr_parts(label_t *); 51 extern int extra_mbr_funcs(label_t *, tinput_t *); 53 52 54 53 #endif -
uspace/app/hdisk/func_none.c
rd51beba3 r6453e306 1 1 /* 2 * Copyright (c) 2012 ,2013 Dominik Taborsky2 * Copyright (c) 2012-2013 Dominik Taborsky 3 3 * All rights reserved. 4 4 * … … 27 27 */ 28 28 29 29 /** @addtogroup hdisk 30 30 * @{ 31 31 */ … … 33 33 */ 34 34 35 36 35 #include <errno.h> 37 38 36 #include "func_none.h" 39 37 40 38 static void not_implemented(void); 41 42 39 43 40 int construct_none_label(label_t *this) … … 45 42 this->layout = LYT_NONE; 46 43 47 this->add_part 48 this->delete_part 44 this->add_part = add_none_part; 45 this->delete_part = delete_none_part; 49 46 this->destroy_label = destroy_none_label; 50 this->new_label 51 this->print_parts 52 this->read_parts 53 this->write_parts 54 this->extra_funcs 47 this->new_label = new_none_label; 48 this->print_parts = print_none_parts; 49 this->read_parts = read_none_parts; 50 this->write_parts = write_none_parts; 51 this->extra_funcs = extra_none_funcs; 55 52 56 53 return EOK; 57 54 } 58 55 59 int add_none_part(label_t *this, tinput_t * 56 int add_none_part(label_t *this, tinput_t *in) 60 57 { 61 58 not_implemented(); … … 63 60 } 64 61 65 int delete_none_part(label_t *this, tinput_t * 62 int delete_none_part(label_t *this, tinput_t *in) 66 63 { 67 64 not_implemented(); … … 104 101 } 105 102 106 static void not_implemented( )103 static void not_implemented(void) 107 104 { 108 105 printf("No format selected.\n"); -
uspace/app/hdisk/func_none.h
rd51beba3 r6453e306 1 1 /* 2 * Copyright (c) 2012 ,2013 Dominik Taborsky2 * Copyright (c) 2012-2013 Dominik Taborsky 3 3 * All rights reserved. 4 4 * … … 27 27 */ 28 28 29 29 /** @addtogroup hdisk 30 30 * @{ 31 31 */ … … 34 34 35 35 #ifndef __FUNC_NONE_H__ 36 #define 36 #define __FUNC_NONE_H__ 37 37 38 38 #include <loc.h> 39 39 #include <tinput.h> 40 41 40 #include "common.h" 42 41 43 42 extern int construct_none_label(label_t *); 44 extern int add_none_part 45 extern int delete_none_part 43 extern int add_none_part(label_t *, tinput_t *); 44 extern int delete_none_part(label_t *, tinput_t *); 46 45 extern int destroy_none_label(label_t *); 47 extern int new_none_label 48 extern int print_none_parts 49 extern int read_none_parts 50 extern int write_none_parts 51 extern int extra_none_funcs 46 extern int new_none_label(label_t *); 47 extern int print_none_parts(label_t *); 48 extern int read_none_parts(label_t *); 49 extern int write_none_parts(label_t *); 50 extern int extra_none_funcs(label_t *, tinput_t *); 52 51 53 52 #endif -
uspace/app/hdisk/hdisk.c
rd51beba3 r6453e306 1 1 /* 2 * Copyright (c) 2012 ,2013 Dominik Taborsky2 * Copyright (c) 2012-2013 Dominik Taborsky 3 3 * All rights reserved. 4 4 * … … 27 27 */ 28 28 29 29 /** @addtogroup hdisk 30 30 * @{ 31 31 */ … … 47 47 #include <tinput.h> 48 48 #include <str_error.h> 49 50 49 #include "hdisk.h" 51 50 #include "input.h" … … 54 53 #include "func_none.h" 55 54 56 int interact(void); 57 void print_help(void); 58 void select_label_format(tinput_t *); 59 void construct_label(layouts_t); 60 void free_label(void); 61 int try_read(void); 62 int try_read_mbr(void); 63 int try_read_gpt(void); 64 void set_alignment(tinput_t *); 65 55 static int interact(void); 56 static void print_help(void); 57 static void select_label_format(tinput_t *); 58 static void construct_label(layouts_t); 59 static void free_label(void); 60 static int try_read(void); 61 static int try_read_mbr(void); 62 static int try_read_gpt(void); 63 static void set_alignment(tinput_t *); 66 64 67 65 static label_t label; 68 66 69 int main(int argc, char * * argv)67 int main(int argc, char *argv[]) 70 68 { 71 69 if (argc == 1) { 72 70 printf("Missing argument. Please specify a device to operate on.\n"); 73 return -1; 74 } 75 76 int rc; 71 return 1; 72 } 73 77 74 service_id_t dev_handle; 78 79 rc = loc_service_get_id(argv[1], &dev_handle, IPC_FLAG_BLOCKING); 75 int rc = loc_service_get_id(argv[1], &dev_handle, IPC_FLAG_BLOCKING); 80 76 if (rc != EOK) { 81 77 printf("Unknown device. Exiting.\n"); 82 return -1;78 return 2; 83 79 } 84 80 … … 89 85 if (rc != EOK) { 90 86 printf("Error during libblock init: %d - %s.\n", rc, str_error(rc)); 91 return -1;92 } 93 94 aoff64_t nblocks;95 rc = block_get_nblocks(dev_handle, & nblocks);87 return 3; 88 } 89 90 aoff64_t blocks; 91 rc = block_get_nblocks(dev_handle, &blocks); 96 92 block_fini(dev_handle); 97 93 if (rc != EOK) { 98 printf(LIBMBR_NAME ": Error while getting number of blocks: %d - %s.\n", rc, str_error(rc)); 99 return -1; 100 } 101 102 label.nblocks = nblocks; 94 printf("Error while getting number of blocks: %d - %s.\n", 95 rc, str_error(rc)); 96 return 4; 97 } 98 99 label.blocks = blocks; 103 100 104 101 rc = try_read_mbr(); … … 116 113 117 114 interact: 118 119 rc = interact(); 120 121 return rc; 115 return interact(); 122 116 } 123 117 124 118 /** Interact with user */ 125 int interact() 126 { 127 int input; 128 tinput_t *in; 129 130 in = tinput_new(); 119 int interact(void) 120 { 121 tinput_t *in = tinput_new(); 131 122 if (in == NULL) { 132 123 printf("Failed initing input. Free some memory.\n"); … … 137 128 printf("Welcome to hdisk.\nType 'h' for help.\n"); 138 129 139 while ( 1) {130 while (true) { 140 131 printf("# "); 141 in put = getchar();132 int input = getchar(); 142 133 printf("%c\n", input); 143 134 … … 187 178 end: 188 179 tinput_destroy(in); 189 190 180 return EOK; 191 181 } … … 194 184 { 195 185 printf( 196 "\t 'a' \t\t Add partition.\n" 197 "\t 'd' \t\t Delete partition.\n" 198 "\t 'e' \t\t Extra functions (per label format).\n" 199 "\t 'f' \t\t Switch the format of the partition label.\n" 200 "\t 'h' \t\t Prints help. See help for more.\n" 201 "\t 'l' \t\t Set alignment.\n" 202 "\t 'n' \t\t Create new label (discarding the old one).\n" 203 "\t 'p' \t\t Prints label contents.\n" 204 "\t 'q' \t\t Quit.\n" 205 "\t 'r' \t\t Read label from disk.\n" 206 "\t 'w' \t\t Write label to disk.\n" 207 ); 208 209 } 210 211 void select_label_format(tinput_t * in) 186 "\t 'a' \t\t Add partition.\n" 187 "\t 'd' \t\t Delete partition.\n" 188 "\t 'e' \t\t Extra functions (per label format).\n" 189 "\t 'f' \t\t Switch the format of the partition label.\n" 190 "\t 'h' \t\t Prints help. See help for more.\n" 191 "\t 'l' \t\t Set alignment.\n" 192 "\t 'n' \t\t Create new label (discarding the old one).\n" 193 "\t 'p' \t\t Prints label contents.\n" 194 "\t 'q' \t\t Quit.\n" 195 "\t 'r' \t\t Read label from disk.\n" 196 "\t 'w' \t\t Write label to disk.\n"); 197 } 198 199 void select_label_format(tinput_t *in) 212 200 { 213 201 printf("Available formats are: \n" 214 "1) MBR\n" 215 "2) GPT\n" 216 ); 202 "1) MBR\n" 203 "2) GPT\n"); 217 204 218 205 uint8_t val = get_input_uint8(in); … … 253 240 } 254 241 255 int try_read() 256 { 257 242 int try_read(void) 243 { 258 244 return label.read_parts(&label); 259 245 } 260 246 261 int try_read_mbr( )247 int try_read_mbr(void) 262 248 { 263 249 construct_label(LYT_MBR); … … 265 251 } 266 252 267 int try_read_gpt( )253 int try_read_gpt(void) 268 254 { 269 255 construct_label(LYT_GPT); … … 277 263 printf("Alignment set to %u sectors.\n", label.alignment); 278 264 } 279 280 281 -
uspace/app/hdisk/hdisk.h
rd51beba3 r6453e306 1 1 /* 2 * Copyright (c) 2012 ,2013 Dominik Taborsky2 * Copyright (c) 2012-2013 Dominik Taborsky 3 3 * All rights reserved. 4 4 * … … 27 27 */ 28 28 29 29 /** @addtogroup hdisk 30 30 * @{ 31 31 */ 32 32 /** @file 33 33 */ 34 35 #ifndef __HDISK_H__ 36 #define __HDISK_H__ 34 37 35 38 #include "common.h" … … 38 41 label.layout = LYT_NONE 39 42 43 #endif -
uspace/app/hdisk/input.c
rd51beba3 r6453e306 1 1 /* 2 * Copyright (c) 2012 ,2013 Dominik Taborsky2 * Copyright (c) 2012-2013 Dominik Taborsky 3 3 * All rights reserved. 4 4 * … … 27 27 */ 28 28 29 29 /** @addtogroup hdisk 30 30 * @{ 31 31 */ … … 36 36 #include <errno.h> 37 37 #include <stdlib.h> 38 39 38 #include "input.h" 40 39 41 40 typedef int (*conv_f)(const char *, char **, unsigned int, bool, void *); 42 static int convert(tinput_t * in, conv_f str_f, void * val);43 41 44 int get_input_line(tinput_t * in, char ** str) 42 static int convert(tinput_t *, conv_f, void *); 43 44 int get_input_line(tinput_t *in, char **str) 45 45 { 46 int rc; 47 rc = tinput_read(in, str); 48 if (rc == ENOENT) { 49 /* User requested exit */ 46 int rc = tinput_read(in, str); 47 if (rc == ENOENT) 50 48 return EINTR; 51 } 52 if (rc != EOK) { 53 /* Error in communication with console */ 49 50 if (rc != EOK) 54 51 return rc; 55 }52 56 53 /* Check for empty input. */ 57 54 if (str_cmp(*str, "") == 0) { … … 60 57 return EINVAL; 61 58 } 62 59 63 60 return EOK; 64 61 } 65 62 66 uint8_t get_input_uint8(tinput_t * 63 uint8_t get_input_uint8(tinput_t *in) 67 64 { 68 int rc;69 65 uint32_t val; 70 71 rc = convert(in, (conv_f) str_uint8_t, &val); 72 if (rc != EOK) { 73 errno = rc; 74 return 0; 75 } 76 77 return val; 78 } 79 80 uint32_t get_input_uint32(tinput_t * in) 81 { 82 int rc; 83 uint32_t val; 84 85 rc = convert(in, (conv_f) str_uint32_t, &val); 86 if (rc != EOK) { 87 errno = rc; 88 return 0; 89 } 90 91 return val; 92 } 93 94 uint64_t get_input_uint64(tinput_t * in) 95 { 96 int rc; 97 uint64_t val; 98 99 rc = convert(in, (conv_f) str_uint64_t, &val); 100 if (rc != EOK) { 101 errno = rc; 102 return 0; 103 } 104 105 return val; 106 } 107 108 size_t get_input_size_t(tinput_t * in) 109 { 110 int rc; 111 size_t val; 112 113 rc = convert(in, (conv_f) str_size_t, &val); 66 int rc = convert(in, (conv_f) str_uint8_t, &val); 114 67 if (rc != EOK) { 115 68 errno = rc; … … 121 74 } 122 75 123 static int convert(tinput_t * in, conv_f str_f, void * val)76 uint32_t get_input_uint32(tinput_t *in) 124 77 { 125 int rc; 126 char * str; 78 uint32_t val; 79 int rc = convert(in, (conv_f) str_uint32_t, &val); 80 if (rc != EOK) { 81 errno = rc; 82 return 0; 83 } 127 84 128 rc = get_input_line(in, &str); 85 errno = EOK; 86 return val; 87 } 88 89 uint64_t get_input_uint64(tinput_t *in) 90 { 91 uint64_t val; 92 int rc = convert(in, (conv_f) str_uint64_t, &val); 93 if (rc != EOK) { 94 errno = rc; 95 return 0; 96 } 97 98 errno = EOK; 99 return val; 100 } 101 102 size_t get_input_size_t(tinput_t *in) 103 { 104 size_t val; 105 int rc = convert(in, (conv_f) str_size_t, &val); 106 if (rc != EOK) { 107 errno = rc; 108 return 0; 109 } 110 111 errno = EOK; 112 return val; 113 } 114 115 static int convert(tinput_t *in, conv_f str_f, void *val) 116 { 117 char *str; 118 int rc = get_input_line(in, &str); 129 119 if (rc != EOK) { 130 120 printf("Error reading input.\n"); … … 133 123 134 124 rc = str_f(str, NULL, 10, true, val); 135 if (rc != EOK) {125 if (rc != EOK) 136 126 printf("Invalid value.\n"); 137 }138 127 139 128 free(str); 140 129 return rc; 141 130 } 142 -
uspace/app/hdisk/input.h
rd51beba3 r6453e306 1 1 /* 2 * Copyright (c) 2012 ,2013 Dominik Taborsky2 * Copyright (c) 2012-2013 Dominik Taborsky 3 3 * All rights reserved. 4 4 * … … 27 27 */ 28 28 29 29 /** @addtogroup hdisk 30 30 * @{ 31 31 */ … … 34 34 35 35 #ifndef __INPUT_H__ 36 #define 36 #define __INPUT_H__ 37 37 38 38 #include <tinput.h> 39 39 40 extern int get_input_line(tinput_t * in, char ** str);41 extern uint8_t get_input_uint8(tinput_t * in);42 extern uint32_t get_input_uint32(tinput_t * in);43 extern uint64_t get_input_uint64(tinput_t * in);44 extern size_t get_input_size_t(tinput_t * in);40 extern int get_input_line(tinput_t *, char **); 41 extern uint8_t get_input_uint8(tinput_t *); 42 extern uint32_t get_input_uint32(tinput_t *); 43 extern uint64_t get_input_uint64(tinput_t *); 44 extern size_t get_input_size_t(tinput_t *); 45 45 46 46 #endif
Note:
See TracChangeset
for help on using the changeset viewer.