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


Ignore:
Timestamp:
2011-04-02T12:49:33Z (14 years ago)
Author:
Matus Dekanek <smekideki@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
8123695a
Parents:
a9c7c6f (diff), 969585f (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 with usb/development

File:
1 edited

Legend:

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

    ra9c7c6f rc6ba274  
    4343#include <stdio.h>
    4444#include <errno.h>
     45#include <str_error.h>
    4546#include <bool.h>
    4647#include <fibril_synch.h>
     
    5152#include <sys/stat.h>
    5253#include <ctype.h>
     54#include <io/log.h>
    5355#include <ipc/devman.h>
    5456#include <ipc/driver.h>
     
    7173        driver_t *driver = NULL;
    7274
    73         printf(NAME ": devman_driver_register \n");
     75        log_msg(LVL_DEBUG, "devman_driver_register");
    7476       
    7577        iid = async_get_call(&icall);
     
    8890        }
    8991
    90         printf(NAME ": the %s driver is trying to register by the service.\n",
     92        log_msg(LVL_DEBUG, "The `%s' driver is trying to register.",
    9193            drv_name);
    9294       
     
    9597       
    9698        if (driver == NULL) {
    97                 printf(NAME ": no driver named %s was found.\n", drv_name);
     99                log_msg(LVL_ERROR, "No driver named `%s' was found.", drv_name);
    98100                free(drv_name);
    99101                drv_name = NULL;
     
    106108       
    107109        /* Create connection to the driver. */
    108         printf(NAME ":  creating connection to the %s driver.\n", driver->name);
     110        log_msg(LVL_DEBUG, "Creating connection to the `%s' driver.",
     111            driver->name);
    109112        ipc_call_t call;
    110113        ipc_callid_t callid = async_get_call(&call);
     
    118121        set_driver_phone(driver, IPC_GET_ARG5(call));
    119122       
    120         printf(NAME ": the %s driver was successfully registered as running.\n",
     123        log_msg(LVL_NOTE,
     124            "The `%s' driver was successfully registered as running.",
    121125            driver->name);
    122126       
     
    142146        callid = async_get_call(&call);
    143147        if (DEVMAN_ADD_MATCH_ID != IPC_GET_IMETHOD(call)) {
    144                 printf(NAME ": ERROR: devman_receive_match_id - invalid "
    145                     "protocol.\n");
     148                log_msg(LVL_ERROR,
     149                    "Invalid protocol when trying to receive match id.");
    146150                async_answer_0(callid, EINVAL);
    147151                delete_match_id(match_id);
     
    150154       
    151155        if (match_id == NULL) {
    152                 printf(NAME ": ERROR: devman_receive_match_id - failed to "
    153                     "allocate match id.\n");
     156                log_msg(LVL_ERROR, "Failed to allocate match id.");
    154157                async_answer_0(callid, ENOMEM);
    155158                return ENOMEM;
     
    165168        if (rc != EOK) {
    166169                delete_match_id(match_id);
    167                 printf(NAME ": devman_receive_match_id - failed to receive "
    168                     "match id string.\n");
     170                log_msg(LVL_ERROR, "Failed to receive match id string: %s.",
     171                    str_error(rc));
    169172                return rc;
    170173        }
     
    172175        list_append(&match_id->link, &match_ids->ids);
    173176       
    174         printf(NAME ": received match id '%s', score = %d \n",
     177        log_msg(LVL_DEBUG, "Received match id `%s', score %d.",
    175178            match_id->id, match_id->score);
    176179        return rc;
     
    228231        if (ftype != fun_inner && ftype != fun_exposed) {
    229232                /* Unknown function type */
    230                 printf(NAME ": Error, unknown function type provided by driver!\n");
     233                log_msg(LVL_ERROR,
     234                    "Unknown function type %d provided by driver.",
     235                    (int) ftype);
    231236
    232237                fibril_rwlock_write_unlock(&tree->rwlock);
     
    243248        }
    244249       
     250        /* Check that function with same name is not there already. */
     251        if (find_fun_node_in_device(pdev, fun_name) != NULL) {
     252                fibril_rwlock_write_unlock(&tree->rwlock);
     253                async_answer_0(callid, EEXISTS);
     254                printf(NAME ": Warning, driver tried to register `%s' twice.\n",
     255                    fun_name);
     256                free(fun_name);
     257                return;
     258        }
     259
    245260        fun_node_t *fun = create_fun_node();
    246261        if (!insert_fun_node(&device_tree, fun, fun_name, pdev)) {
     
    265280        fibril_rwlock_write_unlock(&tree->rwlock);
    266281       
    267         printf(NAME ": devman_add_function %s\n", fun->pathname);
     282        log_msg(LVL_DEBUG, "devman_add_function(fun=\"%s\")", fun->pathname);
    268283       
    269284        devman_receive_match_ids(match_count, &fun->match_ids);
     
    347362        devmap_register_class_dev(class_info);
    348363       
    349         printf(NAME ": function'%s' added to class '%s', class name '%s' was "
    350             "asigned to it\n", fun->pathname, class_name, class_info->dev_name);
     364        log_msg(LVL_NOTE, "Function `%s' added to class `%s' as `%s'.",
     365            fun->pathname, class_name, class_info->dev_name);
    351366
    352367        async_answer_0(callid, EOK);
     
    363378       
    364379        initialize_running_driver(driver, &device_tree);
    365         printf(NAME ": the %s driver was successfully initialized. \n",
     380        log_msg(LVL_DEBUG, "The `%s` driver was successfully initialized.",
    366381            driver->name);
    367382        return 0;
     
    385400        fid_t fid = fibril_create(init_running_drv, driver);
    386401        if (fid == 0) {
    387                 printf(NAME ": Error creating fibril for the initialization of "
    388                     "the newly registered running driver.\n");
     402                log_msg(LVL_ERROR, "Failed to create initialization fibril " \
     403                    "for driver `%s'.", driver->name);
    389404                return;
    390405        }
     
    438453}
    439454
     455/** Find handle for the device instance identified by device class name. */
     456static void devman_function_get_handle_by_class(ipc_callid_t iid,
     457    ipc_call_t *icall)
     458{
     459        char *classname;
     460        char *devname;
     461
     462        int rc = async_data_write_accept((void **) &classname, true, 0, 0, 0, 0);
     463        if (rc != EOK) {
     464                async_answer_0(iid, rc);
     465                return;
     466        }
     467        rc = async_data_write_accept((void **) &devname, true, 0, 0, 0, 0);
     468        if (rc != EOK) {
     469                free(classname);
     470                async_answer_0(iid, rc);
     471                return;
     472        }
     473
     474
     475        fun_node_t *fun = find_fun_node_by_class(&class_list,
     476            classname, devname);
     477
     478        free(classname);
     479        free(devname);
     480
     481        if (fun == NULL) {
     482                async_answer_0(iid, ENOENT);
     483                return;
     484        }
     485
     486        async_answer_1(iid, EOK, fun->handle);
     487}
     488
    440489
    441490/** Function for handling connections from a client to the device manager. */
     
    457506                        devman_function_get_handle(callid, &call);
    458507                        break;
     508                case DEVMAN_DEVICE_GET_HANDLE_BY_CLASS:
     509                        devman_function_get_handle_by_class(callid, &call);
     510                        break;
    459511                default:
    460512                        async_answer_0(callid, ENOENT);
     
    484536         */
    485537        if (dev == NULL) {
    486                 printf(NAME ": devman_forward error - no device or function with "
    487                     "handle %" PRIun " was found.\n", handle);
     538                log_msg(LVL_ERROR, "IPC forwarding failed - no device or "
     539                    "function with handle %" PRIun " was found.", handle);
    488540                async_answer_0(iid, ENOENT);
    489541                return;
     
    491543
    492544        if (fun == NULL && !drv_to_parent) {
    493                 printf(NAME ": devman_forward error - cannot connect to "
    494                     "handle %" PRIun ", refers to a device.\n", handle);
     545                log_msg(LVL_ERROR, NAME ": devman_forward error - cannot "
     546                    "connect to handle %" PRIun ", refers to a device.",
     547                    handle);
    495548                async_answer_0(iid, ENOENT);
    496549                return;
     
    513566       
    514567        if (driver == NULL) {
    515                 printf(NAME ": devman_forward error - the device %" PRIun \
    516                     " (%s) is not in usable state.\n",
     568                log_msg(LVL_ERROR, "IPC forwarding refused - " \
     569                    "the device %" PRIun "(%s) is not in usable state.",
    517570                    handle, dev->pfun->pathname);
    518571                async_answer_0(iid, ENOENT);
     
    527580       
    528581        if (driver->phone <= 0) {
    529                 printf(NAME ": devman_forward: cound not forward to driver %s ",
    530                     driver->name);
    531                 printf("the driver's phone is %" PRIun ").\n", driver->phone);
     582                log_msg(LVL_ERROR,
     583                    "Could not forward to driver `%s' (phone is %d).",
     584                    driver->name, (int) driver->phone);
    532585                async_answer_0(iid, EINVAL);
    533586                return;
     
    535588
    536589        if (fun != NULL) {
    537                 printf(NAME ": devman_forward: forward connection to function %s to "
    538                     "driver %s.\n", fun->pathname, driver->name);
     590                log_msg(LVL_DEBUG,
     591                    "Forwarding request for `%s' function to driver `%s'.",
     592                    fun->pathname, driver->name);
    539593        } else {
    540                 printf(NAME ": devman_forward: forward connection to device %s to "
    541                     "driver %s.\n", dev->pfun->pathname, driver->name);
     594                log_msg(LVL_DEBUG,
     595                    "Forwarding request for `%s' device to driver `%s'.",
     596                    dev->pfun->pathname, driver->name);
    542597        }
    543598
     
    571626        async_forward_fast(iid, dev->drv->phone, DRIVER_CLIENT, fun->handle, 0,
    572627            IPC_FF_NONE);
    573         printf(NAME ": devman_connection_devmapper: forwarded connection to "
    574             "device %s to driver %s.\n", fun->pathname, dev->drv->name);
     628        log_msg(LVL_DEBUG,
     629            "Forwarding devmapper request for `%s' function to driver `%s'.",
     630            fun->pathname, dev->drv->name);
    575631}
    576632
     
    607663static bool devman_init(void)
    608664{
    609         printf(NAME ": devman_init - looking for available drivers.\n");
     665        log_msg(LVL_DEBUG, "devman_init - looking for available drivers.");
    610666       
    611667        /* Initialize list of available drivers. */
     
    613669        if (lookup_available_drivers(&drivers_list,
    614670            DRIVER_DEFAULT_STORE) == 0) {
    615                 printf(NAME " no drivers found.");
     671                log_msg(LVL_FATAL, "No drivers found.");
    616672                return false;
    617673        }
    618674
    619         printf(NAME ": devman_init  - list of drivers has been initialized.\n");
     675        log_msg(LVL_DEBUG, "devman_init - list of drivers has been initialized.");
    620676
    621677        /* Create root device node. */
    622678        if (!init_device_tree(&device_tree, &drivers_list)) {
    623                 printf(NAME " failed to initialize device tree.");
     679                log_msg(LVL_FATAL, "Failed to initialize device tree.");
    624680                return false;
    625681        }
     
    642698        printf(NAME ": HelenOS Device Manager\n");
    643699
     700        if (log_init(NAME, LVL_ERROR) != EOK) {
     701                printf(NAME ": Error initializing logging subsystem.\n");
     702                return -1;
     703        }
     704
    644705        if (!devman_init()) {
    645                 printf(NAME ": Error while initializing service\n");
     706                log_msg(LVL_ERROR, "Error while initializing service.");
    646707                return -1;
    647708        }
     
    651712
    652713        /* Register device manager at naming service. */
    653         if (service_register(SERVICE_DEVMAN) != EOK)
     714        if (service_register(SERVICE_DEVMAN) != EOK) {
     715                log_msg(LVL_ERROR, "Failed registering as a service.");
    654716                return -1;
    655 
    656         printf(NAME ": Accepting connections\n");
     717        }
     718
     719        printf(NAME ": Accepting connections.\n");
    657720        async_manager();
    658721
Note: See TracChangeset for help on using the changeset viewer.