Changeset 984a9ba in mainline for uspace/lib/hound/src/protocol.c
- Timestamp:
- 2018-07-05T09:34:09Z (7 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 63d46341
- Parents:
- 76f566d
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/hound/src/protocol.c
r76f566d r984a9ba 142 142 async_exchange_end(exch); 143 143 if (ret == EOK) { 144 *id = (hound_context_id_t) IPC_GET_ARG1(call);144 *id = (hound_context_id_t) IPC_GET_ARG1(call); 145 145 } 146 146 … … 384 384 /** Server side implementation of the hound protocol. IPC connection handler. 385 385 * 386 * @param icall_handle Initial call handle 387 * @param icall Pointer to initial call structure. 388 * @param arg (unused) 389 */ 390 void hound_connection_handler(cap_call_handle_t icall_handle, ipc_call_t *icall, 391 void *arg) 392 { 393 hound_context_id_t id; 386 * @param icall Pointer to initial call structure. 387 * @param arg (unused) 388 * 389 */ 390 void hound_connection_handler(ipc_call_t *icall, void *arg) 391 { 392 hound_context_id_t context; 394 393 errno_t ret; 395 394 int flags; … … 399 398 /* Accept connection if there is a valid iface*/ 400 399 if (server_iface) { 401 async_answer_0(icall _handle, EOK);400 async_answer_0(icall, EOK); 402 401 } else { 403 async_answer_0(icall _handle, ENOTSUP);402 async_answer_0(icall, ENOTSUP); 404 403 return; 405 404 } … … 407 406 while (true) { 408 407 ipc_call_t call; 409 cap_call_handle_t chandle = async_get_call(&call); 408 async_get_call(&call); 409 410 410 switch (IPC_GET_IMETHOD(call)) { 411 411 case IPC_M_HOUND_CONTEXT_REGISTER: 412 412 /* check interface functions */ 413 413 if (!server_iface || !server_iface->add_context) { 414 async_answer_0( chandle, ENOTSUP);414 async_answer_0(&call, ENOTSUP); 415 415 break; 416 416 } … … 421 421 ret = async_data_write_accept(&name, true, 0, 0, 0, 0); 422 422 if (ret != EOK) { 423 async_answer_0( chandle, ret);424 break; 425 } 426 427 id= 0;423 async_answer_0(&call, ret); 424 break; 425 } 426 427 context = 0; 428 428 ret = server_iface->add_context(server_iface->server, 429 & id, name, record);429 &context, name, record); 430 430 /** new context should create a copy */ 431 431 free(name); 432 432 if (ret != EOK) { 433 async_answer_0( chandle, ret);433 async_answer_0(&call, ret); 434 434 } else { 435 async_answer_1( chandle, EOK, CAP_HANDLE_RAW(id));435 async_answer_1(&call, EOK, CAP_HANDLE_RAW(context)); 436 436 } 437 437 break; … … 439 439 /* check interface functions */ 440 440 if (!server_iface || !server_iface->rem_context) { 441 async_answer_0( chandle, ENOTSUP);441 async_answer_0(&call, ENOTSUP); 442 442 break; 443 443 } 444 444 445 445 /* get id, 1st param */ 446 id = (cap_handle_t) IPC_GET_ARG1(call);446 context = (hound_context_id_t) IPC_GET_ARG1(call); 447 447 ret = server_iface->rem_context(server_iface->server, 448 id);449 async_answer_0( chandle, ret);448 context); 449 async_answer_0(&call, ret); 450 450 break; 451 451 case IPC_M_HOUND_GET_LIST: 452 452 /* check interface functions */ 453 453 if (!server_iface || !server_iface->get_list) { 454 async_answer_0( chandle, ENOTSUP);454 async_answer_0(&call, ENOTSUP); 455 455 break; 456 456 } … … 480 480 if (count && !sizes) 481 481 ret = ENOMEM; 482 async_answer_1( chandle, ret, count);482 async_answer_1(&call, ret, count); 483 483 484 484 /* We are done */ … … 491 491 492 492 /* Send sizes table */ 493 cap_call_handle_t id;493 ipc_call_t id; 494 494 if (async_data_read_receive(&id, NULL)) { 495 ret = async_data_read_finalize( id, sizes,495 ret = async_data_read_finalize(&id, sizes, 496 496 count * sizeof(size_t)); 497 497 } … … 501 501 for (unsigned i = 0; i < count; ++i) { 502 502 size_t size = str_size(list[i]); 503 cap_call_handle_t id;503 ipc_call_t id; 504 504 if (ret == EOK && 505 505 async_data_read_receive(&id, NULL)) { 506 ret = async_data_read_finalize( id,506 ret = async_data_read_finalize(&id, 507 507 list[i], size); 508 508 } … … 514 514 /* check interface functions */ 515 515 if (!server_iface || !server_iface->connect) { 516 async_answer_0( chandle, ENOTSUP);516 async_answer_0(&call, ENOTSUP); 517 517 break; 518 518 } … … 534 534 free(source); 535 535 free(sink); 536 async_answer_0( chandle, ret);536 async_answer_0(&call, ret); 537 537 break; 538 538 case IPC_M_HOUND_DISCONNECT: 539 539 /* check interface functions */ 540 540 if (!server_iface || !server_iface->disconnect) { 541 async_answer_0( chandle, ENOTSUP);541 async_answer_0(&call, ENOTSUP); 542 542 break; 543 543 } … … 558 558 free(source); 559 559 free(sink); 560 async_answer_0( chandle, ret);560 async_answer_0(&call, ret); 561 561 break; 562 562 case IPC_M_HOUND_STREAM_ENTER: … … 565 565 !server_iface->add_stream || 566 566 !server_iface->rem_stream) { 567 async_answer_0( chandle, ENOTSUP);567 async_answer_0(&call, ENOTSUP); 568 568 break; 569 569 } 570 570 571 571 /* get parameters */ 572 id = (cap_handle_t) IPC_GET_ARG1(call);572 context = (hound_context_id_t) IPC_GET_ARG1(call); 573 573 flags = IPC_GET_ARG2(call); 574 574 const format_convert_t c = { .arg = IPC_GET_ARG3(call) }; … … 582 582 void *stream; 583 583 ret = server_iface->add_stream(server_iface->server, 584 id, flags, f, bsize, &stream);584 context, flags, f, bsize, &stream); 585 585 if (ret != EOK) { 586 async_answer_0( chandle, ret);586 async_answer_0(&call, ret); 587 587 break; 588 588 } 589 589 const bool rec = server_iface->is_record_context( 590 server_iface->server, id);590 server_iface->server, context); 591 591 if (rec) { 592 592 if (server_iface->stream_data_read) { 593 async_answer_0( chandle, EOK);593 async_answer_0(&call, EOK); 594 594 /* start answering read calls */ 595 595 hound_server_write_data(stream); … … 597 597 server_iface->server, stream); 598 598 } else { 599 async_answer_0( chandle, ENOTSUP);599 async_answer_0(&call, ENOTSUP); 600 600 } 601 601 } else { 602 602 if (server_iface->stream_data_write) { 603 async_answer_0( chandle, EOK);603 async_answer_0(&call, EOK); 604 604 /* accept write calls */ 605 605 hound_server_read_data(stream); … … 607 607 server_iface->server, stream); 608 608 } else { 609 async_answer_0( chandle, ENOTSUP);609 async_answer_0(&call, ENOTSUP); 610 610 } 611 611 } … … 614 614 case IPC_M_HOUND_STREAM_DRAIN: 615 615 /* Stream exit/drain is only allowed in stream context*/ 616 async_answer_0( chandle, EINVAL);616 async_answer_0(&call, EINVAL); 617 617 break; 618 618 default: 619 async_answer_0( chandle, ENOTSUP);619 async_answer_0(&call, ENOTSUP); 620 620 return; 621 621 } … … 629 629 static void hound_server_read_data(void *stream) 630 630 { 631 cap_call_handle_t chandle;632 631 ipc_call_t call; 633 632 size_t size = 0; 634 633 errno_t ret_answer = EOK; 634 635 635 /* accept data write or drain */ 636 while (async_data_write_receive _call(&chandle,&call, &size) ||636 while (async_data_write_receive(&call, &size) || 637 637 (IPC_GET_IMETHOD(call) == IPC_M_HOUND_STREAM_DRAIN)) { 638 638 /* check drain first */ … … 641 641 if (server_iface->drain_stream) 642 642 ret = server_iface->drain_stream(stream); 643 async_answer_0( chandle, ret);643 async_answer_0(&call, ret); 644 644 continue; 645 645 } … … 647 647 /* there was an error last time */ 648 648 if (ret_answer != EOK) { 649 async_answer_0( chandle, ret_answer);649 async_answer_0(&call, ret_answer); 650 650 continue; 651 651 } … … 653 653 char *buffer = malloc(size); 654 654 if (!buffer) { 655 async_answer_0( chandle, ENOMEM);655 async_answer_0(&call, ENOMEM); 656 656 continue; 657 657 } 658 const errno_t ret = async_data_write_finalize( chandle, buffer, size);658 const errno_t ret = async_data_write_finalize(&call, buffer, size); 659 659 if (ret == EOK) { 660 660 /* push data to stream */ … … 666 666 EOK : EINVAL; 667 667 668 async_answer_0( chandle, ret);668 async_answer_0(&call, ret); 669 669 } 670 670 … … 676 676 { 677 677 678 cap_call_handle_t chandle;679 678 ipc_call_t call; 680 679 size_t size = 0; 681 680 errno_t ret_answer = EOK; 681 682 682 /* accept data read and drain */ 683 while (async_data_read_receive _call(&chandle,&call, &size) ||683 while (async_data_read_receive(&call, &size) || 684 684 (IPC_GET_IMETHOD(call) == IPC_M_HOUND_STREAM_DRAIN)) { 685 685 /* drain does not make much sense but it is allowed */ … … 688 688 if (server_iface->drain_stream) 689 689 ret = server_iface->drain_stream(stream); 690 async_answer_0( chandle, ret);690 async_answer_0(&call, ret); 691 691 continue; 692 692 } 693 693 /* there was an error last time */ 694 694 if (ret_answer != EOK) { 695 async_answer_0( chandle, ret_answer);695 async_answer_0(&call, ret_answer); 696 696 continue; 697 697 } 698 698 char *buffer = malloc(size); 699 699 if (!buffer) { 700 async_answer_0( chandle, ENOMEM);700 async_answer_0(&call, ENOMEM); 701 701 continue; 702 702 } … … 704 704 if (ret == EOK) { 705 705 ret_answer = 706 async_data_read_finalize( chandle, buffer, size);706 async_data_read_finalize(&call, buffer, size); 707 707 } 708 708 } … … 710 710 EOK : EINVAL; 711 711 712 async_answer_0( chandle, ret);712 async_answer_0(&call, ret); 713 713 } 714 714
Note:
See TracChangeset
for help on using the changeset viewer.