Changeset 6843a9c in mainline for uspace/srv/locsrv/locsrv.c


Ignore:
Timestamp:
2012-06-29T13:02:14Z (13 years ago)
Author:
Jan Vesely <jano.vesely@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
722912e
Parents:
ba72f2b (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

Trivial conflicts.

File:
1 moved

Legend:

Unmodified
Added
Removed
  • uspace/srv/locsrv/locsrv.c

    rba72f2b r6843a9c  
    5151
    5252#include "category.h"
    53 #include "loc.h"
     53#include "locsrv.h"
    5454
    5555#define NAME          "loc"
    5656#define NULL_SERVICES  256
     57
     58/** Callback session */
     59typedef struct {
     60        link_t cb_sess_list;
     61        async_sess_t *sess;
     62} cb_sess_t;
    5763
    5864LIST_INITIALIZE(services_list);
     
    8692
    8793static FIBRIL_MUTEX_INITIALIZE(callback_sess_mutex);
    88 static async_sess_t *callback_sess = NULL;
     94static LIST_INITIALIZE(callback_sess_list);
    8995
    9096service_id_t loc_create_id(void)
     
    384390         */
    385391        list_initialize(&server->services);
    386 
    387392        link_initialize(&server->servers);
    388393       
     
    608613        size_t act_size;
    609614        loc_service_t *svc;
     615        char *fqn;
    610616       
    611617        if (!async_data_read_receive(&callid, &size)) {
     
    625631        }
    626632       
    627         act_size = str_size(svc->name);
     633        if (asprintf(&fqn, "%s/%s", svc->namespace->name, svc->name) < 0) {
     634                fibril_mutex_unlock(&services_list_mutex);
     635                async_answer_0(callid, ENOMEM);
     636                async_answer_0(iid, ENOMEM);
     637                return;
     638        }
     639       
     640        act_size = str_size(fqn);
    628641        if (act_size > size) {
     642                free(fqn);
    629643                fibril_mutex_unlock(&services_list_mutex);
    630644                async_answer_0(callid, EOVERFLOW);
     
    633647        }
    634648       
    635         sysarg_t retval = async_data_read_finalize(callid, svc->name,
     649        sysarg_t retval = async_data_read_finalize(callid, fqn,
     650            min(size, act_size));
     651        free(fqn);
     652       
     653        fibril_mutex_unlock(&services_list_mutex);
     654       
     655        async_answer_0(iid, retval);
     656}
     657
     658static void loc_service_get_server_name(ipc_callid_t iid, ipc_call_t *icall)
     659{
     660        ipc_callid_t callid;
     661        size_t size;
     662        size_t act_size;
     663        loc_service_t *svc;
     664       
     665        if (!async_data_read_receive(&callid, &size)) {
     666                async_answer_0(callid, EREFUSED);
     667                async_answer_0(iid, EREFUSED);
     668                return;
     669        }
     670       
     671        fibril_mutex_lock(&services_list_mutex);
     672       
     673        svc = loc_service_find_id(IPC_GET_ARG1(*icall));
     674        if (svc == NULL) {
     675                fibril_mutex_unlock(&services_list_mutex);
     676                async_answer_0(callid, ENOENT);
     677                async_answer_0(iid, ENOENT);
     678                return;
     679        }
     680       
     681        if (svc->server == NULL) {
     682                fibril_mutex_unlock(&services_list_mutex);
     683                async_answer_0(callid, EINVAL);
     684                async_answer_0(iid, EINVAL);
     685                return;
     686        }
     687       
     688        act_size = str_size(svc->server->name);
     689        if (act_size > size) {
     690                fibril_mutex_unlock(&services_list_mutex);
     691                async_answer_0(callid, EOVERFLOW);
     692                async_answer_0(iid, EOVERFLOW);
     693                return;
     694        }
     695       
     696        sysarg_t retval = async_data_read_finalize(callid, svc->server->name,
    636697            min(size, act_size));
    637698       
     
    790851}
    791852
    792 /** Find ID for category specified by name.
    793  *
    794  * On success, answer will contain EOK int retval and service ID in arg1.
     853/** Create callback connection.
     854 *
     855 * Create callback connection which will be used to send category change
     856 * events.
     857 *
     858 * On success, answer will contain EOK int retval.
    795859 * On failure, error code will be sent in retval.
    796860 *
     
    798862static void loc_callback_create(ipc_callid_t iid, ipc_call_t *icall)
    799863{
    800         async_sess_t *cb_sess = async_callback_receive(EXCHANGE_SERIALIZE);
     864        cb_sess_t *cb_sess = calloc(1, sizeof(cb_sess_t));
    801865        if (cb_sess == NULL) {
    802866                async_answer_0(iid, ENOMEM);
     
    804868        }
    805869       
     870        async_sess_t *sess = async_callback_receive(EXCHANGE_SERIALIZE);
     871        if (sess == NULL) {
     872                free(cb_sess);
     873                async_answer_0(iid, ENOMEM);
     874                return;
     875        }
     876       
     877        cb_sess->sess = sess;
     878        link_initialize(&cb_sess->cb_sess_list);
     879       
    806880        fibril_mutex_lock(&callback_sess_mutex);
    807         if (callback_sess != NULL) {
    808                 fibril_mutex_unlock(&callback_sess_mutex);
    809                 async_answer_0(iid, EEXIST);
    810                 return;
    811         }
    812        
    813         callback_sess = cb_sess;
     881        list_append(&cb_sess->cb_sess_list, &callback_sess_list);
    814882        fibril_mutex_unlock(&callback_sess_mutex);
    815883       
     
    820888{
    821889        fibril_mutex_lock(&callback_sess_mutex);
    822 
    823         if (callback_sess != NULL) {
    824                 async_exch_t *exch = async_exchange_begin(callback_sess);
     890       
     891        list_foreach(callback_sess_list, link) {
     892                cb_sess_t *cb_sess;
     893               
     894                cb_sess = list_get_instance(link, cb_sess_t, cb_sess_list);
     895               
     896                async_exch_t *exch = async_exchange_begin(cb_sess->sess);
    825897                async_msg_0(exch, LOC_EVENT_CAT_CHANGE);
    826898                async_exchange_end(exch);
    827899        }
    828 
     900       
    829901        fibril_mutex_unlock(&callback_sess_mutex);
    830902}
     
    12691341        categ_dir_add_cat(&cdir, cat);
    12701342
     1343        cat = category_new("iplink");
     1344        categ_dir_add_cat(&cdir, cat);
     1345
    12711346        cat = category_new("keyboard");
    12721347        categ_dir_add_cat(&cdir, cat);
     
    13751450                case LOC_SERVICE_GET_NAME:
    13761451                        loc_service_get_name(callid, &call);
     1452                        break;
     1453                case LOC_SERVICE_GET_SERVER_NAME:
     1454                        loc_service_get_server_name(callid, &call);
    13771455                        break;
    13781456                case LOC_NAMESPACE_GET_ID:
     
    14601538       
    14611539        /* Register location service at naming service */
    1462         if (service_register(SERVICE_LOC) != EOK)
    1463                 return -1;
     1540        int rc = service_register(SERVICE_LOC);
     1541        if (rc != EOK)
     1542                return rc;
    14641543       
    14651544        printf("%s: Accepting connections\n", NAME);
Note: See TracChangeset for help on using the changeset viewer.