Changes in uspace/srv/loc/loc.c [cce8a83:763e0cd] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/loc/loc.c
rcce8a83 r763e0cd 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; 86 89 87 90 service_id_t loc_create_id(void) … … 533 536 } 534 537 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 535 577 static void loc_service_get_name(ipc_callid_t iid, ipc_call_t *icall) 536 578 { … … 571 613 async_answer_0(iid, retval); 572 614 } 573 574 615 575 616 /** Connect client to the service. … … 728 769 * 729 770 */ 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 */ 730 811 static void loc_category_get_id(ipc_callid_t iid, ipc_call_t *icall) 731 812 { … … 1129 1210 1130 1211 async_answer_0(iid, retval); 1212 1213 loc_category_change_event(); 1131 1214 } 1132 1215 … … 1156 1239 1157 1240 cat = category_new("serial"); 1241 categ_dir_add_cat(&cdir, cat); 1242 1243 cat = category_new("usbhc"); 1158 1244 categ_dir_add_cat(&cdir, cat); 1159 1245 … … 1244 1330 loc_namespace_get_id(callid, &call); 1245 1331 break; 1332 case LOC_CALLBACK_CREATE: 1333 loc_callback_create(callid, &call); 1334 break; 1246 1335 case LOC_CATEGORY_GET_ID: 1247 1336 loc_category_get_id(callid, &call); 1337 break; 1338 case LOC_CATEGORY_GET_NAME: 1339 loc_category_get_name(callid, &call); 1248 1340 break; 1249 1341 case LOC_CATEGORY_GET_SVCS:
Note:
See TracChangeset
for help on using the changeset viewer.