Ignore:
File:
1 edited

Legend:

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

    r79ae36dd r3ad7b1c  
    3939#include <assert.h>
    4040#include <ipc/services.h>
    41 #include <ns.h>
     41#include <ipc/ns.h>
    4242#include <async.h>
    4343#include <stdio.h>
     
    108108        fibril_mutex_lock(&driver->driver_mutex);
    109109       
    110         if (driver->sess) {
     110        if (driver->phone >= 0) {
    111111                /* We already have a connection to the driver. */
    112112                log_msg(LVL_ERROR, "Driver '%s' already started.\n",
     
    128128                break;
    129129        case DRIVER_RUNNING:
    130                 /* Should not happen since we do not have a connected session */
     130                /* Should not happen since we do not have a connected phone */
    131131                assert(false);
    132132        }
     
    135135        log_msg(LVL_DEBUG, "Creating connection to the `%s' driver.",
    136136            driver->name);
    137         driver->sess = async_callback_receive(EXCHANGE_SERIALIZE);
    138         if (!driver->sess) {
     137        ipc_call_t call;
     138        ipc_callid_t callid = async_get_call(&call);
     139        if (IPC_GET_IMETHOD(call) != IPC_M_CONNECT_TO_ME) {
    139140                fibril_mutex_unlock(&driver->driver_mutex);
     141                async_answer_0(callid, ENOTSUP);
    140142                async_answer_0(iid, ENOTSUP);
    141143                return NULL;
    142144        }
    143145       
     146        /* Remember driver's phone. */
     147        driver->phone = IPC_GET_ARG5(call);
     148       
    144149        fibril_mutex_unlock(&driver->driver_mutex);
    145150       
    146         log_msg(LVL_NOTE,
     151        log_msg(LVL_NOTE, 
    147152            "The `%s' driver was successfully registered as running.",
    148153            driver->name);
    149154       
     155        async_answer_0(callid, EOK);
    150156        async_answer_0(iid, EOK);
    151157       
     
    428434        fibril_add_ready(fid);
    429435       
    430         while (true) {
    431                 ipc_call_t call;
    432                 ipc_callid_t callid = async_get_call(&call);
    433                
    434                 if (!IPC_GET_IMETHOD(call))
    435                         break;
     436        ipc_callid_t callid;
     437        ipc_call_t call;
     438        bool cont = true;
     439        while (cont) {
     440                callid = async_get_call(&call);
    436441               
    437442                switch (IPC_GET_IMETHOD(call)) {
     443                case IPC_M_PHONE_HUNGUP:
     444                        cont = false;
     445                        continue;
    438446                case DEVMAN_ADD_FUNCTION:
    439447                        devman_add_function(callid, &call);
     
    507515}
    508516
    509 /** Find device path by its handle. */
    510 static void devman_get_device_path_by_handle(ipc_callid_t iid,
    511     ipc_call_t *icall)
    512 {
    513         devman_handle_t handle = IPC_GET_ARG1(*icall);
    514 
    515         fun_node_t *fun = find_fun_node(&device_tree, handle);
    516         if (fun == NULL) {
    517                 async_answer_0(iid, ENOMEM);
    518                 return;
    519         }
    520 
    521         ipc_callid_t data_callid;
    522         size_t data_len;
    523         if (!async_data_read_receive(&data_callid, &data_len)) {
    524                 async_answer_0(iid, EINVAL);
    525                 return;
    526         }
    527 
    528         void *buffer = malloc(data_len);
    529         if (buffer == NULL) {
    530                 async_answer_0(data_callid, ENOMEM);
    531                 async_answer_0(iid, ENOMEM);
    532                 return;
    533         }
    534 
    535         size_t sent_length = str_size(fun->pathname);
    536         if (sent_length > data_len) {
    537                 sent_length = data_len;
    538         }
    539 
    540         async_data_read_finalize(data_callid, fun->pathname, sent_length);
    541         async_answer_0(iid, EOK);
    542 
    543         free(buffer);
    544 }
    545 
    546517
    547518/** Function for handling connections from a client to the device manager. */
     
    551522        async_answer_0(iid, EOK);
    552523       
    553         while (true) {
     524        bool cont = true;
     525        while (cont) {
    554526                ipc_call_t call;
    555527                ipc_callid_t callid = async_get_call(&call);
    556528               
    557                 if (!IPC_GET_IMETHOD(call))
    558                         break;
    559                
    560529                switch (IPC_GET_IMETHOD(call)) {
     530                case IPC_M_PHONE_HUNGUP:
     531                        cont = false;
     532                        continue;
    561533                case DEVMAN_DEVICE_GET_HANDLE:
    562534                        devman_function_get_handle(callid, &call);
     
    564536                case DEVMAN_DEVICE_GET_HANDLE_BY_CLASS:
    565537                        devman_function_get_handle_by_class(callid, &call);
    566                         break;
    567                 case DEVMAN_DEVICE_GET_DEVICE_PATH:
    568                         devman_get_device_path_by_handle(callid, &call);
    569538                        break;
    570539                default:
     
    637606                method = DRIVER_CLIENT;
    638607       
    639         if (!driver->sess) {
    640                 log_msg(LVL_ERROR,
    641                     "Could not forward to driver `%s'.", driver->name);
     608        if (driver->phone < 0) {
     609                log_msg(LVL_ERROR,
     610                    "Could not forward to driver `%s' (phone is %d).",
     611                    driver->name, (int) driver->phone);
    642612                async_answer_0(iid, EINVAL);
    643613                return;
     
    653623                    dev->pfun->pathname, driver->name);
    654624        }
    655        
    656         async_exch_t *exch = async_exchange_begin(driver->sess);
    657         async_forward_fast(iid, exch, method, fwd_h, 0, IPC_FF_NONE);
    658         async_exchange_end(exch);
     625
     626        async_forward_fast(iid, driver->phone, method, fwd_h, 0, IPC_FF_NONE);
    659627}
    660628
     
    678646        dev = fun->dev;
    679647       
    680         if ((dev->state != DEVICE_USABLE) || (!dev->drv->sess)) {
     648        if (dev->state != DEVICE_USABLE || dev->drv->phone < 0) {
    681649                async_answer_0(iid, EINVAL);
    682650                return;
    683651        }
    684652       
    685         async_exch_t *exch = async_exchange_begin(dev->drv->sess);
    686         async_forward_fast(iid, exch, DRIVER_CLIENT, fun->handle, 0,
     653        async_forward_fast(iid, dev->drv->phone, DRIVER_CLIENT, fun->handle, 0,
    687654            IPC_FF_NONE);
    688         async_exchange_end(exch);
    689        
    690         log_msg(LVL_DEBUG,
     655        log_msg(LVL_DEBUG,
    691656            "Forwarding devmapper request for `%s' function to driver `%s'.",
    692657            fun->pathname, dev->drv->name);
     
    780745
    781746        printf(NAME ": Accepting connections.\n");
    782         task_retval(0);
    783747        async_manager();
    784748
Note: See TracChangeset for help on using the changeset viewer.