Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/libc/generic/devmap.c

    r1313ee9 r7fcb74c  
    3535#include <async.h>
    3636#include <errno.h>
    37 #include <malloc.h>
    38 #include <bool.h>
    3937
    4038static int devmap_phone_driver = -1;
     
    107105        aid_t req = async_send_2(phone, DEVMAP_DRIVER_REGISTER, 0, 0, &answer);
    108106       
    109         ipcarg_t retval = async_data_write_start(phone, name, str_size(name));
     107        ipcarg_t retval = ipc_data_write_start(phone, name, str_size(name) + 1);
     108       
    110109        if (retval != EOK) {
    111110                async_wait_for(req, NULL);
     
    127126/** Register new device.
    128127 *
    129  * @param namespace Namespace name.
    130  * @param fqdn      Fully qualified device name.
    131  * @param handle    Output: Handle to the created instance of device.
     128 * @param name   Device name.
     129 * @param handle Output: Handle to the created instance of device.
    132130 *
    133131 */
    134 int devmap_device_register(const char *fqdn, dev_handle_t *handle)
     132int devmap_device_register(const char *name, dev_handle_t *handle)
    135133{
    136134        int phone = devmap_get_phone(DEVMAP_DRIVER, IPC_FLAG_BLOCKING);
     
    145143            &answer);
    146144       
    147         ipcarg_t retval = async_data_write_start(phone, fqdn, str_size(fqdn));
     145        ipcarg_t retval = ipc_data_write_start(phone, name, str_size(name) + 1);
     146       
    148147        if (retval != EOK) {
    149148                async_wait_for(req, NULL);
     
    168167}
    169168
    170 int devmap_device_get_handle(const char *fqdn, dev_handle_t *handle, unsigned int flags)
     169int devmap_device_get_handle(const char *name, dev_handle_t *handle, unsigned int flags)
    171170{
    172171        int phone = devmap_get_phone(DEVMAP_CLIENT, flags);
     
    181180            &answer);
    182181       
    183         ipcarg_t retval = async_data_write_start(phone, fqdn, str_size(fqdn));
     182        ipcarg_t retval = ipc_data_write_start(phone, name, str_size(name) + 1);
     183       
    184184        if (retval != EOK) {
    185185                async_wait_for(req, NULL);
     
    202202       
    203203        return retval;
    204 }
    205 
    206 int devmap_namespace_get_handle(const char *name, dev_handle_t *handle, unsigned int flags)
    207 {
    208         int phone = devmap_get_phone(DEVMAP_CLIENT, flags);
    209        
    210         if (phone < 0)
    211                 return phone;
    212        
    213         async_serialize_start();
    214        
    215         ipc_call_t answer;
    216         aid_t req = async_send_2(phone, DEVMAP_NAMESPACE_GET_HANDLE, flags, 0,
    217             &answer);
    218        
    219         ipcarg_t retval = async_data_write_start(phone, name, str_size(name));
    220         if (retval != EOK) {
    221                 async_wait_for(req, NULL);
    222                 async_serialize_end();
    223                 return retval;
    224         }
    225        
    226         async_wait_for(req, &retval);
    227        
    228         async_serialize_end();
    229        
    230         if (retval != EOK) {
    231                 if (handle != NULL)
    232                         *handle = (dev_handle_t) -1;
    233                 return retval;
    234         }
    235        
    236         if (handle != NULL)
    237                 *handle = (dev_handle_t) IPC_GET_ARG1(answer);
    238        
    239         return retval;
    240 }
    241 
    242 devmap_handle_type_t devmap_handle_probe(dev_handle_t handle)
    243 {
    244         int phone = devmap_get_phone(DEVMAP_CLIENT, IPC_FLAG_BLOCKING);
    245        
    246         if (phone < 0)
    247                 return phone;
    248        
    249         ipcarg_t type;
    250         int retval = async_req_1_1(phone, DEVMAP_HANDLE_PROBE, handle, &type);
    251         if (retval != EOK)
    252                 return DEV_HANDLE_NONE;
    253        
    254         return (devmap_handle_type_t) type;
    255204}
    256205
     
    278227       
    279228        ipcarg_t null_id;
    280         int retval = async_req_0_1(phone, DEVMAP_NULL_CREATE, &null_id);
     229        int retval = async_req_0_1(phone, DEVMAP_DEVICE_NULL_CREATE, &null_id);
    281230        if (retval != EOK)
    282231                return -1;
     
    292241                return;
    293242       
    294         async_req_1_0(phone, DEVMAP_NULL_DESTROY, (ipcarg_t) null_id);
    295 }
    296 
    297 static size_t devmap_count_namespaces_internal(int phone)
    298 {
     243        async_req_1_0(phone, DEVMAP_DEVICE_NULL_DESTROY, (ipcarg_t) null_id);
     244}
     245
     246ipcarg_t devmap_device_get_count(void)
     247{
     248        int phone = devmap_get_phone(DEVMAP_CLIENT, IPC_FLAG_BLOCKING);
     249       
     250        if (phone < 0)
     251                return 0;
     252       
    299253        ipcarg_t count;
    300         int retval = async_req_0_1(phone, DEVMAP_GET_NAMESPACE_COUNT, &count);
     254        int retval = async_req_0_1(phone, DEVMAP_DEVICE_GET_COUNT, &count);
    301255        if (retval != EOK)
    302256                return 0;
     
    305259}
    306260
    307 static size_t devmap_count_devices_internal(int phone, dev_handle_t ns_handle)
    308 {
    309         ipcarg_t count;
    310         int retval = async_req_1_1(phone, DEVMAP_GET_DEVICE_COUNT, ns_handle, &count);
     261ipcarg_t devmap_device_get_devices(ipcarg_t count, dev_desc_t *data)
     262{
     263        int phone = devmap_get_phone(DEVMAP_CLIENT, IPC_FLAG_BLOCKING);
     264       
     265        if (phone < 0)
     266                return 0;
     267       
     268        async_serialize_start();
     269       
     270        ipc_call_t answer;
     271        aid_t req = async_send_0(phone, DEVMAP_DEVICE_GET_DEVICES, &answer);
     272       
     273        ipcarg_t retval = ipc_data_read_start(phone, data, count * sizeof(dev_desc_t));
     274       
     275        if (retval != EOK) {
     276                async_wait_for(req, NULL);
     277                async_serialize_end();
     278                return 0;
     279        }
     280       
     281        async_wait_for(req, &retval);
     282       
     283        async_serialize_end();
     284       
    311285        if (retval != EOK)
    312286                return 0;
    313287       
    314         return count;
    315 }
    316 
    317 size_t devmap_count_namespaces(void)
    318 {
    319         int phone = devmap_get_phone(DEVMAP_CLIENT, IPC_FLAG_BLOCKING);
    320        
    321         if (phone < 0)
    322                 return 0;
    323        
    324         return devmap_count_namespaces_internal(phone);
    325 }
    326 
    327 size_t devmap_count_devices(dev_handle_t ns_handle)
    328 {
    329         int phone = devmap_get_phone(DEVMAP_CLIENT, IPC_FLAG_BLOCKING);
    330        
    331         if (phone < 0)
    332                 return 0;
    333        
    334         return devmap_count_devices_internal(phone, ns_handle);
    335 }
    336 
    337 size_t devmap_get_namespaces(dev_desc_t **data)
    338 {
    339         int phone = devmap_get_phone(DEVMAP_CLIENT, IPC_FLAG_BLOCKING);
    340        
    341         if (phone < 0)
    342                 return 0;
    343        
    344         /* Loop until namespaces read succesful */
    345         while (true) {
    346                 size_t count = devmap_count_namespaces_internal(phone);
    347                 if (count == 0)
    348                         return 0;
    349                
    350                 dev_desc_t *devs = (dev_desc_t *) calloc(count, sizeof(dev_desc_t));
    351                 if (devs == NULL)
    352                         return 0;
    353                
    354                 async_serialize_start();
    355                
    356                 ipc_call_t answer;
    357                 aid_t req = async_send_0(phone, DEVMAP_GET_NAMESPACES, &answer);
    358                
    359                 int rc = async_data_read_start(phone, devs, count * sizeof(dev_desc_t));
    360                 if (rc == EOVERFLOW) {
    361                         /*
    362                          * Number of namespaces has changed since
    363                          * the last call of DEVMAP_DEVICE_GET_NAMESPACE_COUNT
    364                          */
    365                         async_serialize_end();
    366                         free(devs);
    367                         continue;
    368                 }
    369                
    370                 if (rc != EOK) {
    371                         async_wait_for(req, NULL);
    372                         async_serialize_end();
    373                         free(devs);
    374                         return 0;
    375                 }
    376                
    377                 ipcarg_t retval;
    378                 async_wait_for(req, &retval);
    379                 async_serialize_end();
    380                
    381                 if (retval != EOK)
    382                         return 0;
    383                
    384                 *data = devs;
    385                 return count;
    386         }
    387 }
    388 
    389 size_t devmap_get_devices(dev_handle_t ns_handle, dev_desc_t **data)
    390 {
    391         int phone = devmap_get_phone(DEVMAP_CLIENT, IPC_FLAG_BLOCKING);
    392        
    393         if (phone < 0)
    394                 return 0;
    395        
    396         /* Loop until namespaces read succesful */
    397         while (true) {
    398                 size_t count = devmap_count_devices_internal(phone, ns_handle);
    399                 if (count == 0)
    400                         return 0;
    401                
    402                 dev_desc_t *devs = (dev_desc_t *) calloc(count, sizeof(dev_desc_t));
    403                 if (devs == NULL)
    404                         return 0;
    405                
    406                 async_serialize_start();
    407                
    408                 ipc_call_t answer;
    409                 aid_t req = async_send_1(phone, DEVMAP_GET_DEVICES, ns_handle, &answer);
    410                
    411                 int rc = async_data_read_start(phone, devs, count * sizeof(dev_desc_t));
    412                 if (rc == EOVERFLOW) {
    413                         /*
    414                          * Number of devices has changed since
    415                          * the last call of DEVMAP_DEVICE_GET_DEVICE_COUNT
    416                          */
    417                         async_serialize_end();
    418                         free(devs);
    419                         continue;
    420                 }
    421                
    422                 if (rc != EOK) {
    423                         async_wait_for(req, NULL);
    424                         async_serialize_end();
    425                         free(devs);
    426                         return 0;
    427                 }
    428                
    429                 ipcarg_t retval;
    430                 async_wait_for(req, &retval);
    431                 async_serialize_end();
    432                
    433                 if (retval != EOK)
    434                         return 0;
    435                
    436                 *data = devs;
    437                 return count;
    438         }
    439 }
     288        return IPC_GET_ARG1(answer);
     289}
Note: See TracChangeset for help on using the changeset viewer.