Changeset 22fb7ab in mainline
- Timestamp:
- 2015-06-26T16:15:31Z (10 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 28ed0d9
- Parents:
- 1356f85a
- Location:
- uspace
- Files:
-
- 8 added
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/fdisk/fdisk.c
r1356f85a r22fb7ab 43 43 44 44 static bool quit = false; 45 static fdisk_t *fdisk; 45 46 46 47 /** Device menu actions */ … … 88 89 } 89 90 90 rc = fdisk_dev_list_get( &devlist);91 rc = fdisk_dev_list_get(fdisk, &devlist); 91 92 if (rc != EOK) { 92 93 printf("Error getting device list.\n"); … … 207 208 } 208 209 209 for (i = FDL_CREATE_LO; i < FDL_CREATE_HI; i++) {210 for (i = 0; i < LT_LIMIT; i++) { 210 211 rc = fdisk_ltype_format(i, &sltype); 211 212 if (rc != EOK) … … 229 230 } 230 231 231 rc = fdisk_label_create(dev, ( fdisk_label_type_t)sel);232 rc = fdisk_label_create(dev, (label_type_t)sel); 232 233 if (rc != EOK) { 233 234 printf("Error creating label.\n"); … … 505 506 } 506 507 507 rc = fdisk_label_get_info(dev, &linfo);508 if (rc != EOK) {509 printf("Error getting label information.\n");510 goto error;511 }512 513 rc = fdisk_ltype_format(linfo.ltype, &sltype);514 if (rc != EOK) {515 assert(rc == ENOMEM);516 printf("Out of memory.\n");517 goto error;518 }519 520 508 printf("Device: %s, %s\n", sdcap, svcname); 521 printf("Label type: %s\n", sltype);522 free(sltype);523 sltype = NULL;524 509 free(sdcap); 525 510 sdcap = NULL; 511 512 rc = fdisk_label_get_info(dev, &linfo); 513 if (rc != EOK) { 514 printf("Error getting label information.\n"); 515 goto error; 516 } 517 518 switch (linfo.dcnt) { 519 case dc_empty: 520 printf("Disk is empty.\n"); 521 break; 522 case dc_label: 523 rc = fdisk_ltype_format(linfo.ltype, &sltype); 524 if (rc != EOK) { 525 assert(rc == ENOMEM); 526 printf("Out of memory.\n"); 527 goto error; 528 } 529 530 printf("Label type: %s\n", sltype); 531 free(sltype); 532 sltype = NULL; 533 break; 534 case dc_fs: 535 printf("Disk contains a file system.\n"); 536 break; 537 case dc_unknown: 538 printf("Disk contains unknown data.\n"); 539 break; 540 } 526 541 527 542 part = fdisk_part_first(dev); … … 563 578 } 564 579 565 if (linfo. ltype != fdl_none) {580 if (linfo.dcnt == dc_label) { 566 581 rc = nchoice_add(choice, "Create partition", 567 582 (void *)devac_create_part); … … 583 598 } 584 599 585 if (linfo. ltype == fdl_none) {600 if (linfo.dcnt == dc_empty) { 586 601 rc = nchoice_add(choice, "Create label", 587 602 (void *)devac_create_label); … … 616 631 switch ((devac_t)sel) { 617 632 case devac_create_label: 618 rc = fdsk_create_label(dev); 619 if (rc != EOK) 620 goto error; 633 (void) fdsk_create_label(dev); 621 634 break; 622 635 case devac_delete_label: 623 rc = fdsk_delete_label(dev); 624 if (rc != EOK) 625 goto error; 636 (void) fdsk_delete_label(dev); 626 637 break; 627 638 case devac_create_part: 628 rc = fdsk_create_part(dev); 629 if (rc != EOK) 630 goto error; 639 (void) fdsk_create_part(dev); 631 640 break; 632 641 case devac_delete_part: 633 rc = fdsk_delete_part(dev); 634 if (rc != EOK) 635 goto error; 642 (void) fdsk_delete_part(dev); 636 643 break; 637 644 case devac_exit: … … 658 665 int rc; 659 666 667 rc = fdisk_create(&fdisk); 668 if (rc != EOK) { 669 printf("Error initializing Fdisk.\n"); 670 return 1; 671 } 672 660 673 rc = fdsk_dev_sel_choice(&svcid); 661 674 if (rc != EOK) … … 665 678 return 0; 666 679 667 rc = fdisk_dev_open( svcid, &dev);680 rc = fdisk_dev_open(fdisk, svcid, &dev); 668 681 if (rc != EOK) { 669 682 printf("Error opening device.\n"); … … 680 693 681 694 fdisk_dev_close(dev); 695 fdisk_destroy(fdisk); 682 696 683 697 return 0; -
uspace/lib/c/Makefile
r1356f85a r22fb7ab 153 153 generic/stats.c \ 154 154 generic/assert.c \ 155 generic/pio_trace.c 155 generic/pio_trace.c \ 156 generic/vbd.c \ 157 generic/vol.c 156 158 157 159 ifeq ($(CONFIG_RTLD),y) -
uspace/lib/fdisk/include/fdisk.h
r1356f85a r22fb7ab 40 40 #include <types/fdisk.h> 41 41 42 extern int fdisk_dev_list_get(fdisk_dev_list_t **); 42 extern int fdisk_create(fdisk_t **); 43 extern void fdisk_destroy(fdisk_t *); 44 extern int fdisk_dev_list_get(fdisk_t *, fdisk_dev_list_t **); 43 45 extern void fdisk_dev_list_free(fdisk_dev_list_t *); 44 46 extern fdisk_dev_info_t *fdisk_dev_first(fdisk_dev_list_t *); … … 48 50 extern int fdisk_dev_info_capacity(fdisk_dev_info_t *, fdisk_cap_t *); 49 51 50 extern int fdisk_dev_open( service_id_t, fdisk_dev_t **);52 extern int fdisk_dev_open(fdisk_t *, service_id_t, fdisk_dev_t **); 51 53 extern void fdisk_dev_close(fdisk_dev_t *); 52 54 extern int fdisk_dev_get_svcname(fdisk_dev_t *, char **); … … 54 56 55 57 extern int fdisk_label_get_info(fdisk_dev_t *, fdisk_label_info_t *); 56 extern int fdisk_label_create(fdisk_dev_t *, fdisk_label_type_t);58 extern int fdisk_label_create(fdisk_dev_t *, label_type_t); 57 59 extern int fdisk_label_destroy(fdisk_dev_t *); 58 60 … … 68 70 extern int fdisk_cap_format(fdisk_cap_t *, char **); 69 71 extern int fdisk_cap_parse(const char *, fdisk_cap_t *); 70 extern int fdisk_ltype_format( fdisk_label_type_t, char **);72 extern int fdisk_ltype_format(label_type_t, char **); 71 73 extern int fdisk_fstype_format(fdisk_fstype_t, char **); 72 74 -
uspace/lib/fdisk/include/types/fdisk.h
r1356f85a r22fb7ab 40 40 #include <loc.h> 41 41 #include <stdint.h> 42 #include <types/label.h> 43 #include <vol.h> 42 44 43 45 typedef enum { … … 95 97 } fdisk_dev_info_t; 96 98 97 /** Fdisk label type */98 typedef enum {99 /** None */100 fdl_none = 0,101 /** Unknown */102 fdl_unknown,103 /** BIOS Master Boot Record */104 fdl_mbr,105 /** UEFI GUID Partition Table */106 fdl_gpt107 } fdisk_label_type_t;108 109 /** Highest label type + 1 */110 #define FDL_LIMIT (fdl_gpt + 1)111 /** Lowest label type allowed for creation */112 #define FDL_CREATE_LO fdl_mbr113 /** Highest label type allowed for creation + 1 */114 #define FDL_CREATE_HI (fdl_gpt + 1)115 116 99 /** Open fdisk device */ 117 100 typedef struct { 118 /** Label type */ 119 fdisk_label_type_t ltype; 101 /** Fdisk instance */ 102 struct fdisk *fdisk; 103 /** Disk contents */ 104 label_disk_cnt_t dcnt; 105 /** Service ID */ 106 service_id_t sid; 120 107 /** Partitions */ 121 108 list_t parts; /* of fdisk_part_t */ 122 /** Service ID */123 service_id_t sid;124 109 } fdisk_dev_t; 125 110 126 111 typedef struct { 112 /** Disk contents */ 113 label_disk_cnt_t dcnt; 127 114 /** Label type */ 128 fdisk_label_type_t ltype;115 label_type_t ltype; 129 116 } fdisk_label_info_t; 130 117 … … 156 143 } fdisk_part_info_t; 157 144 145 /** Fdisk instance */ 146 typedef struct fdisk { 147 /** Volume service */ 148 vol_t *vol; 149 } fdisk_t; 150 158 151 #endif 159 152 -
uspace/lib/fdisk/src/fdisk.c
r1356f85a r22fb7ab 43 43 #include <stdlib.h> 44 44 #include <str.h> 45 #include <vol.h> 45 46 46 47 static const char *cu_str[] = { … … 68 69 } 69 70 70 int fdisk_dev_list_get(fdisk_dev_list_t **rdevlist) 71 int fdisk_create(fdisk_t **rfdisk) 72 { 73 fdisk_t *fdisk; 74 int rc; 75 76 fdisk = calloc(1, sizeof(fdisk_t)); 77 if (fdisk == NULL) 78 return ENOMEM; 79 80 rc = vol_create(&fdisk->vol); 81 if (rc != EOK) { 82 free(fdisk); 83 return EIO; 84 } 85 86 *rfdisk = fdisk; 87 return EOK; 88 } 89 90 void fdisk_destroy(fdisk_t *fdisk) 91 { 92 vol_destroy(fdisk->vol); 93 free(fdisk); 94 } 95 96 int fdisk_dev_list_get(fdisk_t *fdisk, fdisk_dev_list_t **rdevlist) 71 97 { 72 98 fdisk_dev_list_t *devlist = NULL; 73 99 fdisk_dev_info_t *info; 74 category_id_t disk_cat;75 100 service_id_t *svcs = NULL; 76 101 size_t count, i; … … 83 108 list_initialize(&devlist->devinfos); 84 109 85 rc = loc_category_get_id("disk", &disk_cat, 0); 86 if (rc != EOK) { 87 rc = EIO; 88 goto error; 89 } 90 91 rc = loc_category_get_svcs(disk_cat, &svcs, &count); 110 rc = vol_get_disks(fdisk->vol, &svcs, &count); 92 111 if (rc != EOK) { 93 112 rc = EIO; … … 210 229 } 211 230 212 int fdisk_dev_open( service_id_t sid, fdisk_dev_t **rdev)231 int fdisk_dev_open(fdisk_t *fdisk, service_id_t sid, fdisk_dev_t **rdev) 213 232 { 214 233 fdisk_dev_t *dev; … … 218 237 return ENOMEM; 219 238 220 dev-> ltype = fdl_none;239 dev->fdisk = fdisk; 221 240 dev->sid = sid; 222 241 list_initialize(&dev->parts); … … 271 290 int fdisk_label_get_info(fdisk_dev_t *dev, fdisk_label_info_t *info) 272 291 { 273 info->ltype = dev->ltype; 274 return EOK; 275 } 276 277 int fdisk_label_create(fdisk_dev_t *dev, fdisk_label_type_t ltype) 278 { 279 if (dev->ltype != fdl_none) 280 return EEXISTS; 281 282 dev->ltype = ltype; 283 return EOK; 292 vol_disk_info_t vinfo; 293 int rc; 294 295 rc = vol_disk_info(dev->fdisk->vol, dev->sid, &vinfo); 296 if (rc != EOK) { 297 rc = EIO; 298 goto error; 299 } 300 301 info->dcnt = vinfo.dcnt; 302 info->ltype = vinfo.ltype; 303 return EOK; 304 error: 305 return rc; 306 } 307 308 int fdisk_label_create(fdisk_dev_t *dev, label_type_t ltype) 309 { 310 return vol_label_create(dev->fdisk->vol, dev->sid, ltype); 284 311 } 285 312 … … 287 314 { 288 315 fdisk_part_t *part; 289 290 if (dev->ltype == fdl_none) 291 return ENOENT; 316 int rc; 292 317 293 318 part = fdisk_part_first(dev); … … 297 322 } 298 323 299 dev->ltype = fdl_none; 324 rc = vol_disk_empty(dev->fdisk->vol, dev->sid); 325 if (rc != EOK) 326 return EIO; 327 328 dev->dcnt = dc_empty; 300 329 return EOK; 301 330 } … … 419 448 } 420 449 421 int fdisk_ltype_format( fdisk_label_type_t ltype, char **rstr)450 int fdisk_ltype_format(label_type_t ltype, char **rstr) 422 451 { 423 452 const char *sltype; … … 426 455 sltype = NULL; 427 456 switch (ltype) { 428 case fdl_none: 429 sltype = "None"; 430 break; 431 case fdl_unknown: 432 sltype = "Unknown"; 433 break; 434 case fdl_mbr: 457 case lt_mbr: 435 458 sltype = "MBR"; 436 459 break; 437 case fdl_gpt:460 case lt_gpt: 438 461 sltype = "GPT"; 439 462 break; -
uspace/srv/bd/vbd/vbd.c
r1356f85a r22fb7ab 27 27 */ 28 28 29 /** @addtogroup dnsres29 /** @addtogroup vbd 30 30 * @{ 31 31 */ … … 38 38 #include <io/log.h> 39 39 #include <ipc/services.h> 40 #include <ipc/vbd.h> 40 41 #include <loc.h> 41 42 #include <stdio.h> … … 43 44 #include <task.h> 44 45 46 #include "types/vbd.h" 47 45 48 #define NAME "vbd" 46 49 … … 50 53 { 51 54 int rc; 52 log_msg(LOG_DEFAULT, LVL_ DEBUG, "vbd_init()");55 log_msg(LOG_DEFAULT, LVL_NOTE, "vbd_init()"); 53 56 54 57 async_set_client_connection(vbd_client_conn); … … 70 73 } 71 74 75 static int vbd_disk_add(service_id_t sid) 76 { 77 log_msg(LOG_DEFAULT, LVL_NOTE, "vbd_disk_add(%zu)", sid); 78 return EOK; 79 } 80 81 static int vbd_disk_remove(service_id_t sid) 82 { 83 log_msg(LOG_DEFAULT, LVL_NOTE, "vbd_disk_remove(%zu)", sid); 84 return EOK; 85 } 86 87 static int vbd_disk_info(service_id_t sid, vbd_disk_info_t *info) 88 { 89 log_msg(LOG_DEFAULT, LVL_NOTE, "vbd_disk_info(%zu)", sid); 90 info->ltype = lt_mbr; 91 return EOK; 92 } 93 94 static int vbd_label_create(service_id_t sid, label_type_t ltype) 95 { 96 log_msg(LOG_DEFAULT, LVL_NOTE, "vbd_label_create(%zu, %d)", sid, 97 ltype); 98 return EOK; 99 } 100 101 static int vbd_label_delete(service_id_t sid, label_type_t ltype) 102 { 103 log_msg(LOG_DEFAULT, LVL_NOTE, "vbd_label_delete(%zu, %d)", sid, 104 ltype); 105 return EOK; 106 } 107 108 static void vbd_disk_add_srv(ipc_callid_t iid, ipc_call_t *icall) 109 { 110 service_id_t disk_sid; 111 int rc; 112 113 log_msg(LOG_DEFAULT, LVL_NOTE, "vbd_disk_add_srv()"); 114 115 disk_sid = IPC_GET_ARG1(*icall); 116 rc = vbd_disk_add(disk_sid); 117 async_answer_0(iid, (sysarg_t) rc); 118 } 119 120 static void vbd_disk_remove_srv(ipc_callid_t iid, ipc_call_t *icall) 121 { 122 service_id_t disk_sid; 123 int rc; 124 125 log_msg(LOG_DEFAULT, LVL_NOTE, "vbd_disk_remove_srv()"); 126 127 disk_sid = IPC_GET_ARG1(*icall); 128 rc = vbd_disk_remove(disk_sid); 129 async_answer_0(iid, (sysarg_t) rc); 130 } 131 132 static void vbd_disk_info_srv(ipc_callid_t iid, ipc_call_t *icall) 133 { 134 service_id_t disk_sid; 135 vbd_disk_info_t dinfo; 136 int rc; 137 138 log_msg(LOG_DEFAULT, LVL_NOTE, "vbd_disk_info_srv()"); 139 140 disk_sid = IPC_GET_ARG1(*icall); 141 rc = vbd_disk_info(disk_sid, &dinfo); 142 async_answer_1(iid, (sysarg_t)rc, (sysarg_t)dinfo.ltype); 143 } 144 145 static void vbd_label_create_srv(ipc_callid_t iid, ipc_call_t *icall) 146 { 147 service_id_t disk_sid; 148 label_type_t ltype; 149 int rc; 150 151 log_msg(LOG_DEFAULT, LVL_NOTE, "vbd_label_create_srv()"); 152 153 disk_sid = IPC_GET_ARG1(*icall); 154 ltype = IPC_GET_ARG2(*icall); 155 rc = vbd_label_create(disk_sid, ltype); 156 async_answer_0(iid, (sysarg_t) rc); 157 } 158 159 static void vbd_label_delete_srv(ipc_callid_t iid, ipc_call_t *icall) 160 { 161 service_id_t disk_sid; 162 label_type_t ltype; 163 int rc; 164 165 log_msg(LOG_DEFAULT, LVL_NOTE, "vbd_label_delete_srv()"); 166 167 disk_sid = IPC_GET_ARG1(*icall); 168 ltype = IPC_GET_ARG2(*icall); 169 rc = vbd_label_delete(disk_sid, ltype); 170 async_answer_0(iid, (sysarg_t) rc); 171 } 72 172 73 173 static void vbd_client_conn(ipc_callid_t iid, ipc_call_t *icall, void *arg) 74 174 { 75 log_msg(LOG_DEFAULT, LVL_ DEBUG, "vbd_client_conn()");175 log_msg(LOG_DEFAULT, LVL_NOTE, "vbd_client_conn()"); 76 176 77 177 /* Accept the connection */ … … 90 190 91 191 switch (method) { 192 case VBD_DISK_ADD: 193 vbd_disk_add_srv(callid, &call); 194 break; 195 case VBD_DISK_REMOVE: 196 vbd_disk_remove_srv(callid, &call); 197 break; 198 case VBD_DISK_INFO: 199 vbd_disk_info_srv(callid, &call); 200 break; 201 case VBD_LABEL_CREATE: 202 vbd_label_create_srv(callid, &call); 203 break; 204 case VBD_LABEL_DELETE: 205 vbd_label_delete_srv(callid, &call); 206 break; 92 207 default: 93 208 async_answer_0(callid, EINVAL); -
uspace/srv/volsrv/disk.c
r1356f85a r22fb7ab 42 42 #include <stdlib.h> 43 43 #include <str.h> 44 #include <vbd.h> 44 45 45 46 #include "disk.h" … … 48 49 static int vol_disk_add(service_id_t); 49 50 50 static LIST_INITIALIZE(vol_disks); 51 static LIST_INITIALIZE(vol_disks); /* of vol_disk_t */ 51 52 static FIBRIL_MUTEX_INITIALIZE(vol_disks_lock); 53 static vbd_t *vbd; 52 54 53 55 /** Check for new disk devices */ … … 113 115 114 116 link_initialize(&disk->ldisks); 117 disk->dcnt = dc_empty; 115 118 116 119 return disk; … … 129 132 { 130 133 vol_disk_t *disk; 134 vbd_disk_info_t dinfo; 131 135 int rc; 132 136 … … 147 151 148 152 log_msg(LOG_DEFAULT, LVL_NOTE, "Probe disk %s", disk->svc_name); 149 /* rc = inetcfg_link_add(sid); 150 if (rc != EOK) { 151 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed configuring link " 152 "'%s'.\n", nlink->svc_name); 153 goto error; 154 } 155 */ 153 154 rc = vbd_disk_add(vbd, sid); 155 if (rc == EOK) { 156 log_msg(LOG_DEFAULT, LVL_NOTE, "Disk %s accepted by VBD.", 157 disk->svc_name); 158 159 rc = vbd_disk_info(vbd, sid, &dinfo); 160 if (rc != EOK) { 161 log_msg(LOG_DEFAULT, LVL_NOTE, "Cannot get disk label " 162 "information."); 163 rc = EIO; 164 goto error; 165 } 166 167 disk->dcnt = dc_label; 168 disk->ltype = dinfo.ltype; 169 } else { 170 log_msg(LOG_DEFAULT, LVL_NOTE, "Disk %s not accepted by VBD.", 171 disk->svc_name); 172 disk->dcnt = dc_unknown; 173 } 174 156 175 list_append(&disk->ldisks, &vol_disks); 157 176 … … 168 187 } 169 188 189 int vol_disk_init(void) 190 { 191 int rc; 192 193 rc = vbd_create(&vbd); 194 if (rc != EOK) { 195 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed initializing VBD."); 196 return EIO; 197 } 198 199 return EOK; 200 } 201 170 202 int vol_disk_discovery_start(void) 171 203 { … … 182 214 } 183 215 216 /** Get list of disks as array of service IDs. */ 217 int vol_disk_get_ids(service_id_t *id_buf, size_t buf_size, size_t *act_size) 218 { 219 size_t act_cnt; 220 size_t buf_cnt; 221 222 fibril_mutex_lock(&vol_disks_lock); 223 224 buf_cnt = buf_size / sizeof(service_id_t); 225 226 act_cnt = list_count(&vol_disks); 227 *act_size = act_cnt * sizeof(service_id_t); 228 229 if (buf_size % sizeof(service_id_t) != 0) { 230 fibril_mutex_unlock(&vol_disks_lock); 231 return EINVAL; 232 } 233 234 size_t pos = 0; 235 list_foreach(vol_disks, ldisks, vol_disk_t, disk) { 236 if (pos < buf_cnt) 237 id_buf[pos] = disk->svc_id; 238 pos++; 239 } 240 241 fibril_mutex_unlock(&vol_disks_lock); 242 return EOK; 243 } 244 245 int vol_disk_find_by_id(service_id_t sid, vol_disk_t **rdisk) 246 { 247 list_foreach(vol_disks, ldisks, vol_disk_t, disk) { 248 if (disk->svc_id == sid) { 249 *rdisk = disk; 250 /* XXX Add reference */ 251 return EOK; 252 } 253 } 254 255 return ENOENT; 256 } 257 184 258 /** @} 185 259 */ -
uspace/srv/volsrv/disk.h
r1356f85a r22fb7ab 39 39 40 40 #include <sys/types.h> 41 #include "types/disk.h" 41 42 43 extern int vol_disk_init(void); 42 44 extern int vol_disk_discovery_start(void); 45 extern int vol_disk_get_ids(service_id_t *, size_t, size_t *); 46 extern int vol_disk_find_by_id(service_id_t, vol_disk_t **); 43 47 44 48 #endif -
uspace/srv/volsrv/types/disk.h
r1356f85a r22fb7ab 38 38 #define TYPES_DISK_H_ 39 39 40 #include <types/label.h> 41 40 42 /** Disk */ 41 43 typedef struct { … … 46 48 /** Service name */ 47 49 char *svc_name; 50 /** Disk contents */ 51 label_disk_cnt_t dcnt; 52 /** Label type */ 53 label_type_t ltype; 48 54 } vol_disk_t; 49 55 -
uspace/srv/volsrv/volsrv.c
r1356f85a r22fb7ab 38 38 #include <io/log.h> 39 39 #include <ipc/services.h> 40 #include <ipc/vol.h> 40 41 #include <loc.h> 41 42 #include <stdio.h> … … 54 55 log_msg(LOG_DEFAULT, LVL_DEBUG, "vol_init()"); 55 56 57 rc = vol_disk_init(); 58 if (rc != EOK) 59 return rc; 60 56 61 rc = vol_disk_discovery_start(); 57 62 if (rc != EOK) … … 76 81 } 77 82 83 static void vol_get_disks_srv(ipc_callid_t iid, ipc_call_t *icall) 84 { 85 ipc_callid_t callid; 86 size_t size; 87 size_t act_size; 88 int rc; 89 90 if (!async_data_read_receive(&callid, &size)) { 91 async_answer_0(callid, EREFUSED); 92 async_answer_0(iid, EREFUSED); 93 return; 94 } 95 96 service_id_t *id_buf = (service_id_t *) malloc(size); 97 if (id_buf == NULL) { 98 async_answer_0(callid, ENOMEM); 99 async_answer_0(iid, ENOMEM); 100 return; 101 } 102 103 rc = vol_disk_get_ids(id_buf, size, &act_size); 104 if (rc != EOK) { 105 async_answer_0(callid, rc); 106 async_answer_0(iid, rc); 107 return; 108 } 109 110 sysarg_t retval = async_data_read_finalize(callid, id_buf, size); 111 free(id_buf); 112 113 async_answer_1(iid, retval, act_size); 114 } 115 116 static void vol_disk_info_srv(ipc_callid_t iid, ipc_call_t *icall) 117 { 118 service_id_t sid; 119 vol_disk_t *disk; 120 int rc; 121 122 sid = IPC_GET_ARG1(*icall); 123 rc = vol_disk_find_by_id(sid, &disk); 124 if (rc != EOK) { 125 async_answer_0(iid, ENOENT); 126 return; 127 } 128 129 async_answer_2(iid, rc, disk->dcnt, disk->ltype); 130 } 131 132 static void vol_label_create_srv(ipc_callid_t iid, ipc_call_t *icall) 133 { 134 service_id_t sid; 135 vol_disk_t *disk; 136 label_type_t ltype; 137 int rc; 138 139 sid = IPC_GET_ARG1(*icall); 140 ltype = IPC_GET_ARG2(*icall); 141 142 rc = vol_disk_find_by_id(sid, &disk); 143 if (rc != EOK) { 144 async_answer_0(iid, ENOENT); 145 return; 146 } 147 148 disk->dcnt = dc_label; 149 disk->ltype = ltype; 150 151 async_answer_0(iid, EOK); 152 } 153 154 static void vol_disk_empty_srv(ipc_callid_t iid, ipc_call_t *icall) 155 { 156 service_id_t sid; 157 vol_disk_t *disk; 158 int rc; 159 160 sid = IPC_GET_ARG1(*icall); 161 162 rc = vol_disk_find_by_id(sid, &disk); 163 if (rc != EOK) { 164 async_answer_0(iid, ENOENT); 165 return; 166 } 167 168 disk->dcnt = dc_empty; 169 170 async_answer_0(iid, EOK); 171 } 78 172 79 173 static void vol_client_conn(ipc_callid_t iid, ipc_call_t *icall, void *arg) … … 96 190 97 191 switch (method) { 192 case VOL_GET_DISKS: 193 vol_get_disks_srv(callid, &call); 194 break; 195 case VOL_DISK_INFO: 196 vol_disk_info_srv(callid, &call); 197 break; 198 case VOL_LABEL_CREATE: 199 vol_label_create_srv(callid, &call); 200 break; 201 case VOL_DISK_EMPTY: 202 vol_disk_empty_srv(callid, &call); 203 break; 98 204 default: 99 205 async_answer_0(callid, EINVAL);
Note:
See TracChangeset
for help on using the changeset viewer.