Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/devman/main.c

    r7beb220 rd0dd7b5  
    497497}
    498498
    499 /** Get device name. */
    500 static void devman_fun_get_name(ipc_callid_t iid, ipc_call_t *icall)
     499/** Find device path by its handle. */
     500static void devman_get_device_path_by_handle(ipc_callid_t iid,
     501    ipc_call_t *icall)
    501502{
    502503        devman_handle_t handle = IPC_GET_ARG1(*icall);
     
    522523        }
    523524
    524         size_t sent_length = str_size(fun->name);
    525         if (sent_length > data_len) {
    526                 sent_length = data_len;
    527         }
    528 
    529         async_data_read_finalize(data_callid, fun->name, sent_length);
    530         async_answer_0(iid, EOK);
    531 
    532         free(buffer);
    533 }
    534 
    535 
    536 /** Get device path. */
    537 static void devman_fun_get_path(ipc_callid_t iid, ipc_call_t *icall)
    538 {
    539         devman_handle_t handle = IPC_GET_ARG1(*icall);
    540 
    541         fun_node_t *fun = find_fun_node(&device_tree, handle);
    542         if (fun == NULL) {
    543                 async_answer_0(iid, ENOMEM);
    544                 return;
    545         }
    546 
    547         ipc_callid_t data_callid;
    548         size_t data_len;
    549         if (!async_data_read_receive(&data_callid, &data_len)) {
    550                 async_answer_0(iid, EINVAL);
    551                 return;
    552         }
    553 
    554         void *buffer = malloc(data_len);
    555         if (buffer == NULL) {
    556                 async_answer_0(data_callid, ENOMEM);
    557                 async_answer_0(iid, ENOMEM);
    558                 return;
    559         }
    560 
    561525        size_t sent_length = str_size(fun->pathname);
    562526        if (sent_length > data_len) {
     
    568532
    569533        free(buffer);
    570 }
    571 
    572 static void devman_dev_get_functions(ipc_callid_t iid, ipc_call_t *icall)
    573 {
    574         ipc_callid_t callid;
    575         size_t size;
    576         size_t act_size;
    577         int rc;
    578        
    579         if (!async_data_read_receive(&callid, &size)) {
    580                 async_answer_0(callid, EREFUSED);
    581                 async_answer_0(iid, EREFUSED);
    582                 return;
    583         }
    584        
    585         fibril_rwlock_read_lock(&device_tree.rwlock);
    586        
    587         dev_node_t *dev = find_dev_node_no_lock(&device_tree,
    588             IPC_GET_ARG1(*icall));
    589         if (dev == NULL) {
    590                 fibril_rwlock_read_unlock(&device_tree.rwlock);
    591                 async_answer_0(callid, ENOENT);
    592                 async_answer_0(iid, ENOENT);
    593                 return;
    594         }
    595        
    596         devman_handle_t *hdl_buf = (devman_handle_t *) malloc(size);
    597         if (hdl_buf == NULL) {
    598                 fibril_rwlock_read_unlock(&device_tree.rwlock);
    599                 async_answer_0(callid, ENOMEM);
    600                 async_answer_0(iid, ENOMEM);
    601                 return;
    602         }
    603        
    604         rc = dev_get_functions(&device_tree, dev, hdl_buf, size, &act_size);
    605         if (rc != EOK) {
    606                 fibril_rwlock_read_unlock(&device_tree.rwlock);
    607                 async_answer_0(callid, rc);
    608                 async_answer_0(iid, rc);
    609                 return;
    610         }
    611        
    612         fibril_rwlock_read_unlock(&device_tree.rwlock);
    613        
    614         sysarg_t retval = async_data_read_finalize(callid, hdl_buf, size);
    615         free(hdl_buf);
    616        
    617         async_answer_1(iid, retval, act_size);
    618 }
    619 
    620 
    621 /** Get handle for child device of a function. */
    622 static void devman_fun_get_child(ipc_callid_t iid, ipc_call_t *icall)
    623 {
    624         fun_node_t *fun;
    625        
    626         fibril_rwlock_read_lock(&device_tree.rwlock);
    627        
    628         fun = find_fun_node(&device_tree, IPC_GET_ARG1(*icall));
    629         if (fun == NULL) {
    630                 fibril_rwlock_read_unlock(&device_tree.rwlock);
    631                 async_answer_0(iid, ENOENT);
    632                 return;
    633         }
    634        
    635         if (fun->child == NULL) {
    636                 fibril_rwlock_read_unlock(&device_tree.rwlock);
    637                 async_answer_0(iid, ENOENT);
    638                 return;
    639         }
    640        
    641         async_answer_1(iid, EOK, fun->child->handle);
    642        
    643         fibril_rwlock_read_unlock(&device_tree.rwlock);
    644534}
    645535
     
    676566                        devman_function_get_handle(callid, &call);
    677567                        break;
    678                 case DEVMAN_DEV_GET_FUNCTIONS:
    679                         devman_dev_get_functions(callid, &call);
    680                         break;
    681                 case DEVMAN_FUN_GET_CHILD:
    682                         devman_fun_get_child(callid, &call);
    683                         break;
    684                 case DEVMAN_FUN_GET_NAME:
    685                         devman_fun_get_name(callid, &call);
    686                         break;
    687                 case DEVMAN_FUN_GET_PATH:
    688                         devman_fun_get_path(callid, &call);
     568                case DEVMAN_DEVICE_GET_DEVICE_PATH:
     569                        devman_get_device_path_by_handle(callid, &call);
    689570                        break;
    690571                case DEVMAN_FUN_SID_TO_HANDLE:
Note: See TracChangeset for help on using the changeset viewer.