Changes in uspace/srv/loc/loc.c [763e0cd:cce8a83] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/loc/loc.c
r763e0cd rcce8a83 84 84 /** Service directory ogranized by categories (yellow pages) */ 85 85 static categ_dir_t cdir; 86 87 static FIBRIL_MUTEX_INITIALIZE(callback_sess_mutex);88 static async_sess_t *callback_sess = NULL;89 86 90 87 service_id_t loc_create_id(void) … … 536 533 } 537 534 538 static void loc_category_get_name(ipc_callid_t iid, ipc_call_t *icall)539 {540 ipc_callid_t callid;541 size_t size;542 size_t act_size;543 category_t *cat;544 545 if (!async_data_read_receive(&callid, &size)) {546 async_answer_0(callid, EREFUSED);547 async_answer_0(iid, EREFUSED);548 return;549 }550 551 fibril_mutex_lock(&cdir.mutex);552 553 cat = category_get(&cdir, IPC_GET_ARG1(*icall));554 if (cat == NULL) {555 fibril_mutex_unlock(&cdir.mutex);556 async_answer_0(callid, ENOENT);557 async_answer_0(iid, ENOENT);558 return;559 }560 561 act_size = str_size(cat->name);562 if (act_size > size) {563 fibril_mutex_unlock(&cdir.mutex);564 async_answer_0(callid, EOVERFLOW);565 async_answer_0(iid, EOVERFLOW);566 return;567 }568 569 sysarg_t retval = async_data_read_finalize(callid, cat->name,570 min(size, act_size));571 572 fibril_mutex_unlock(&cdir.mutex);573 574 async_answer_0(iid, retval);575 }576 577 535 static void loc_service_get_name(ipc_callid_t iid, ipc_call_t *icall) 578 536 { … … 613 571 async_answer_0(iid, retval); 614 572 } 573 615 574 616 575 /** Connect client to the service. … … 769 728 * 770 729 */ 771 static void loc_callback_create(ipc_callid_t iid, ipc_call_t *icall)772 {773 async_sess_t *cb_sess = async_callback_receive(EXCHANGE_SERIALIZE);774 if (cb_sess == NULL) {775 async_answer_0(iid, ENOMEM);776 return;777 }778 779 fibril_mutex_lock(&callback_sess_mutex);780 if (callback_sess != NULL) {781 fibril_mutex_unlock(&callback_sess_mutex);782 async_answer_0(iid, EEXIST);783 return;784 }785 786 callback_sess = cb_sess;787 fibril_mutex_unlock(&callback_sess_mutex);788 789 async_answer_0(iid, EOK);790 }791 792 void loc_category_change_event(void)793 {794 fibril_mutex_lock(&callback_sess_mutex);795 796 if (callback_sess != NULL) {797 async_exch_t *exch = async_exchange_begin(callback_sess);798 async_msg_0(exch, LOC_EVENT_CAT_CHANGE);799 async_exchange_end(exch);800 }801 802 fibril_mutex_unlock(&callback_sess_mutex);803 }804 805 /** Find ID for category specified by name.806 *807 * On success, answer will contain EOK int retval and service ID in arg1.808 * On failure, error code will be sent in retval.809 *810 */811 730 static void loc_category_get_id(ipc_callid_t iid, ipc_call_t *icall) 812 731 { … … 1210 1129 1211 1130 async_answer_0(iid, retval); 1212 1213 loc_category_change_event();1214 1131 } 1215 1132 … … 1239 1156 1240 1157 cat = category_new("serial"); 1241 categ_dir_add_cat(&cdir, cat);1242 1243 cat = category_new("usbhc");1244 1158 categ_dir_add_cat(&cdir, cat); 1245 1159 … … 1330 1244 loc_namespace_get_id(callid, &call); 1331 1245 break; 1332 case LOC_CALLBACK_CREATE:1333 loc_callback_create(callid, &call);1334 break;1335 1246 case LOC_CATEGORY_GET_ID: 1336 1247 loc_category_get_id(callid, &call); 1337 break;1338 case LOC_CATEGORY_GET_NAME:1339 loc_category_get_name(callid, &call);1340 1248 break; 1341 1249 case LOC_CATEGORY_GET_SVCS:
Note:
See TracChangeset
for help on using the changeset viewer.