Changeset 1db5669 in mainline for uspace/srv/devman/client_conn.c
- Timestamp:
- 2013-09-11T12:35:55Z (11 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 48bd6f4, 4c9b28a
- Parents:
- cd3b380
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/devman/client_conn.c
rcd3b380 r1db5669 1 1 /* 2 2 * Copyright (c) 2010 Lenka Trochtova 3 * Copyright (c) 2013 Jiri Svoboda 3 4 * All rights reserved. 4 5 * … … 269 270 } 270 271 272 /** Get handle for parent function of a device. */ 273 static void devman_dev_get_parent(ipc_callid_t iid, ipc_call_t *icall) 274 { 275 dev_node_t *dev; 276 277 fibril_rwlock_read_lock(&device_tree.rwlock); 278 279 dev = find_dev_node_no_lock(&device_tree, IPC_GET_ARG1(*icall)); 280 if (dev == NULL || dev->state == DEVICE_REMOVED) { 281 fibril_rwlock_read_unlock(&device_tree.rwlock); 282 async_answer_0(iid, ENOENT); 283 return; 284 } 285 286 if (dev->pfun == NULL) { 287 fibril_rwlock_read_unlock(&device_tree.rwlock); 288 async_answer_0(iid, ENOENT); 289 return; 290 } 291 292 async_answer_1(iid, EOK, dev->pfun->handle); 293 294 fibril_rwlock_read_unlock(&device_tree.rwlock); 295 } 296 271 297 static void devman_dev_get_functions(ipc_callid_t iid, ipc_call_t *icall) 272 298 { … … 425 451 426 452 if (!async_data_read_receive(&callid, &size)) { 427 async_answer_0(callid, EREFUSED);428 453 async_answer_0(iid, EREFUSED); 429 454 return; … … 449 474 async_answer_1(iid, retval, act_size); 450 475 } 476 477 static void devman_driver_get_devices(ipc_callid_t iid, ipc_call_t *icall) 478 { 479 ipc_callid_t callid; 480 size_t size; 481 size_t act_size; 482 int rc; 483 484 if (!async_data_read_receive(&callid, &size)) { 485 async_answer_0(iid, EREFUSED); 486 return; 487 } 488 489 driver_t *drv = driver_find(&drivers_list, IPC_GET_ARG1(*icall)); 490 if (drv == NULL) { 491 async_answer_0(callid, ENOENT); 492 async_answer_0(iid, ENOENT); 493 return; 494 } 495 496 devman_handle_t *hdl_buf = (devman_handle_t *) malloc(size); 497 if (hdl_buf == NULL) { 498 async_answer_0(callid, ENOMEM); 499 async_answer_0(iid, ENOMEM); 500 return; 501 } 502 503 rc = driver_get_devices(drv, hdl_buf, size, &act_size); 504 if (rc != EOK) { 505 fibril_rwlock_read_unlock(&device_tree.rwlock); 506 async_answer_0(callid, rc); 507 async_answer_0(iid, rc); 508 return; 509 } 510 511 sysarg_t retval = async_data_read_finalize(callid, hdl_buf, size); 512 free(hdl_buf); 513 514 async_answer_1(iid, retval, act_size); 515 } 516 451 517 452 518 /** Find driver by name. */ … … 563 629 devman_function_get_handle(callid, &call); 564 630 break; 631 case DEVMAN_DEV_GET_PARENT: 632 devman_dev_get_parent(callid, &call); 633 break; 565 634 case DEVMAN_DEV_GET_FUNCTIONS: 566 635 devman_dev_get_functions(callid, &call); … … 589 658 case DEVMAN_GET_DRIVERS: 590 659 devman_get_drivers(callid, &call); 660 break; 661 case DEVMAN_DRIVER_GET_DEVICES: 662 devman_driver_get_devices(callid, &call); 591 663 break; 592 664 case DEVMAN_DRIVER_GET_HANDLE:
Note:
See TracChangeset
for help on using the changeset viewer.