Changeset e6a78b9 in mainline for uspace/srv/devman/main.c


Ignore:
Timestamp:
2012-06-29T15:31:44Z (12 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
9432f08
Parents:
34ab31c (diff), 0bbd13e (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge mainline changes.

File:
1 edited

Legend:

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

    r34ab31c re6a78b9  
    245245       
    246246        fibril_rwlock_write_lock(&device_tree.rwlock);
    247 
     247       
    248248        if (fun->state == FUN_ON_LINE) {
    249249                fibril_rwlock_write_unlock(&device_tree.rwlock);
     
    259259                        return ENOMEM;
    260260                }
    261 
     261               
    262262                insert_dev_node(&device_tree, dev, fun);
    263263                dev_add_ref(dev);
     
    272272                /* Give one reference over to assign_driver_fibril(). */
    273273                dev_add_ref(dev);
     274               
    274275                /*
    275276                 * Try to find a suitable driver and assign it to the device.  We do
     
    288289                }
    289290                fibril_add_ready(assign_fibril);
    290         } else {
     291        } else
    291292                loc_register_tree_function(fun, &device_tree);
    292         }
    293293       
    294294        fibril_rwlock_write_unlock(&device_tree.rwlock);
     
    855855}
    856856
     857/** Get function driver name. */
     858static void devman_fun_get_driver_name(ipc_callid_t iid, ipc_call_t *icall)
     859{
     860        devman_handle_t handle = IPC_GET_ARG1(*icall);
     861
     862        fun_node_t *fun = find_fun_node(&device_tree, handle);
     863        if (fun == NULL) {
     864                async_answer_0(iid, ENOMEM);
     865                return;
     866        }
     867
     868        ipc_callid_t data_callid;
     869        size_t data_len;
     870        if (!async_data_read_receive(&data_callid, &data_len)) {
     871                async_answer_0(iid, EINVAL);
     872                fun_del_ref(fun);
     873                return;
     874        }
     875
     876        void *buffer = malloc(data_len);
     877        if (buffer == NULL) {
     878                async_answer_0(data_callid, ENOMEM);
     879                async_answer_0(iid, ENOMEM);
     880                fun_del_ref(fun);
     881                return;
     882        }
     883
     884        fibril_rwlock_read_lock(&device_tree.rwlock);
     885
     886        /* Check function state */
     887        if (fun->state == FUN_REMOVED) {
     888                fibril_rwlock_read_unlock(&device_tree.rwlock);
     889                free(buffer);
     890
     891                async_answer_0(data_callid, ENOENT);
     892                async_answer_0(iid, ENOENT);
     893                fun_del_ref(fun);
     894                return;
     895        }
     896
     897        /* Check whether function has a driver */
     898        if (fun->child == NULL || fun->child->drv == NULL) {
     899                fibril_rwlock_read_unlock(&device_tree.rwlock);
     900                free(buffer);
     901
     902                async_answer_0(data_callid, EINVAL);
     903                async_answer_0(iid, EINVAL);
     904                fun_del_ref(fun);
     905                return;
     906        }
     907
     908        size_t sent_length = str_size(fun->child->drv->name);
     909        if (sent_length > data_len) {
     910                sent_length = data_len;
     911        }
     912
     913        async_data_read_finalize(data_callid, fun->child->drv->name,
     914            sent_length);
     915        async_answer_0(iid, EOK);
     916
     917        fibril_rwlock_read_unlock(&device_tree.rwlock);
     918        fun_del_ref(fun);
     919        free(buffer);
     920}
    857921
    858922/** Get device path. */
     
    10831147                        devman_fun_get_name(callid, &call);
    10841148                        break;
     1149                case DEVMAN_FUN_GET_DRIVER_NAME:
     1150                        devman_fun_get_driver_name(callid, &call);
     1151                        break;
    10851152                case DEVMAN_FUN_GET_PATH:
    10861153                        devman_fun_get_path(callid, &call);
     
    11491216                if (dev->pfun->dev != NULL)
    11501217                        driver = dev->pfun->dev->drv;
     1218               
    11511219                fwd_h = dev->pfun->handle;
    11521220        } else if (dev->state == DEVICE_USABLE) {
     
    11541222                driver = dev->drv;
    11551223                assert(driver != NULL);
    1156 
     1224               
    11571225                fwd_h = handle;
    11581226        }
     
    11811249
    11821250        if (fun != NULL) {
    1183                 log_msg(LVL_DEBUG, 
     1251                log_msg(LVL_DEBUG,
    11841252                    "Forwarding request for `%s' function to driver `%s'.",
    11851253                    fun->pathname, driver->name);
    11861254        } else {
    1187                 log_msg(LVL_DEBUG, 
     1255                log_msg(LVL_DEBUG,
    11881256                    "Forwarding request for `%s' device to driver `%s'.",
    11891257                    dev->pfun->pathname, driver->name);
     
    11931261        async_forward_fast(iid, exch, method, fwd_h, 0, IPC_FF_NONE);
    11941262        async_exchange_end(exch);
    1195 
     1263       
    11961264cleanup:
    11971265        if (dev != NULL)
    11981266                dev_del_ref(dev);
     1267       
    11991268        if (fun != NULL)
    12001269                fun_del_ref(fun);
     
    12991368                return false;
    13001369        }
    1301 
     1370       
    13021371        log_msg(LVL_DEBUG, "devman_init - list of drivers has been initialized.");
    1303 
     1372       
    13041373        /* Create root device node. */
    13051374        if (!init_device_tree(&device_tree, &drivers_list)) {
     
    13071376                return false;
    13081377        }
    1309 
     1378       
    13101379        /*
    13111380         * Caution: As the device manager is not a real loc
     
    13221391int main(int argc, char *argv[])
    13231392{
    1324         printf(NAME ": HelenOS Device Manager\n");
    1325 
    1326         if (log_init(NAME, LVL_WARN) != EOK) {
    1327                 printf(NAME ": Error initializing logging subsystem.\n");
    1328                 return -1;
     1393        printf("%s: HelenOS Device Manager\n", NAME);
     1394       
     1395        int rc = log_init(NAME, LVL_WARN);
     1396        if (rc != EOK) {
     1397                printf("%s: Error initializing logging subsystem.\n", NAME);
     1398                return rc;
    13291399        }
    13301400       
     
    13331403        async_set_client_data_destructor(devman_client_data_destroy);
    13341404        async_set_client_connection(devman_connection);
    1335 
     1405       
    13361406        if (!devman_init()) {
    13371407                log_msg(LVL_ERROR, "Error while initializing service.");
    13381408                return -1;
    13391409        }
    1340 
     1410       
    13411411        /* Register device manager at naming service. */
    1342         if (service_register(SERVICE_DEVMAN) != EOK) {
     1412        rc = service_register(SERVICE_DEVMAN);
     1413        if (rc != EOK) {
    13431414                log_msg(LVL_ERROR, "Failed registering as a service.");
    1344                 return -1;
    1345         }
    1346 
    1347         printf(NAME ": Accepting connections.\n");
     1415                return rc;
     1416        }
     1417       
     1418        printf("%s: Accepting connections.\n", NAME);
    13481419        task_retval(0);
    13491420        async_manager();
    1350 
     1421       
    13511422        /* Never reached. */
    13521423        return 0;
Note: See TracChangeset for help on using the changeset viewer.