Changes in uspace/srv/hid/rfb/rfb.c [d6ff08a0:870f78c] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/hid/rfb/rfb.c
rd6ff08a0 r870f78c 31 31 #include <stdlib.h> 32 32 #include <fibril_synch.h> 33 #include <inet/addr.h>34 #include <inet/endpoint.h>35 #include <inet/tcp.h>36 33 #include <inttypes.h> 37 34 #include <str.h> … … 41 38 #include <io/log.h> 42 39 40 #include <net/in.h> 41 #include <net/inet.h> 42 #include <net/socket.h> 43 43 44 #include "rfb.h" 44 45 static void rfb_new_conn(tcp_listener_t *, tcp_conn_t *);46 47 static tcp_listen_cb_t listen_cb = {48 .new_conn = rfb_new_conn49 };50 51 static tcp_cb_t conn_cb = {52 .connected = NULL53 };54 45 55 46 /** Buffer for receiving the request. */ … … 62 53 63 54 /** Receive one character (with buffering) */ 64 static int recv_char(tcp_conn_t *conn, char *c) 65 { 66 size_t nrecv; 67 int rc; 68 55 static int recv_char(int fd, char *c) 56 { 69 57 if (rbuf_out == rbuf_in) { 70 58 rbuf_out = 0; 71 59 rbuf_in = 0; 72 60 73 rc = tcp_conn_recv_wait(conn, rbuf, BUFFER_SIZE, &nrecv);74 if (rc != EOK)61 ssize_t rc = recv(fd, rbuf, BUFFER_SIZE, 0); 62 if (rc <= 0) 75 63 return rc; 76 64 77 rbuf_in = nrecv;65 rbuf_in = rc; 78 66 } 79 67 … … 83 71 84 72 /** Receive count characters (with buffering) */ 85 static int recv_chars( tcp_conn_t *conn, char *c, size_t count)73 static int recv_chars(int fd, char *c, size_t count) 86 74 { 87 75 for (size_t i = 0; i < count; i++) { 88 int rc = recv_char( conn, c);76 int rc = recv_char(fd, c); 89 77 if (rc != EOK) 90 78 return rc; … … 94 82 } 95 83 96 static int recv_skip_chars( tcp_conn_t *conn, size_t count)84 static int recv_skip_chars(int fd, size_t count) 97 85 { 98 86 for (size_t i = 0; i < count; i++) { 99 87 char c; 100 int rc = recv_char( conn, &c);88 int rc = recv_char(fd, &c); 101 89 if (rc != EOK) 102 90 return rc; … … 216 204 } 217 205 218 static int recv_message( tcp_conn_t *conn, char type, void *buf, size_t size)206 static int recv_message(int conn_sd, char type, void *buf, size_t size) 219 207 { 220 208 memcpy(buf, &type, 1); 221 return recv_chars(conn , ((char *) buf) + 1, size -1);209 return recv_chars(conn_sd, ((char *) buf) + 1, size -1); 222 210 } 223 211 … … 489 477 } 490 478 491 static int rfb_send_framebuffer_update(rfb_t *rfb, tcp_conn_t *conn, 492 bool incremental) 479 static int rfb_send_framebuffer_update(rfb_t *rfb, int conn_sd, bool incremental) 493 480 { 494 481 fibril_mutex_lock(&rfb->lock); … … 553 540 554 541 if (!rfb->pixel_format.true_color) { 555 int rc = tcp_conn_send(conn, send_palette, send_palette_size);542 int rc = send(conn_sd, send_palette, send_palette_size, 0); 556 543 if (rc != EOK) { 557 544 free(buf); … … 560 547 } 561 548 562 int rc = tcp_conn_send(conn, buf, buf_size);549 int rc = send(conn_sd, buf, buf_size, 0); 563 550 free(buf); 564 551 … … 593 580 } 594 581 595 static void rfb_socket_connection(rfb_t *rfb, tcp_conn_t *conn)582 static void rfb_socket_connection(rfb_t *rfb, int conn_sd) 596 583 { 597 584 /* Version handshake */ 598 int rc = tcp_conn_send(conn, "RFB 003.008\n", 12);585 int rc = send(conn_sd, "RFB 003.008\n", 12, 0); 599 586 if (rc != EOK) { 600 587 log_msg(LOG_DEFAULT, LVL_WARN, "Failed sending server version %d", rc); … … 603 590 604 591 char client_version[12]; 605 rc = recv_chars(conn , client_version, 12);592 rc = recv_chars(conn_sd, client_version, 12); 606 593 if (rc != EOK) { 607 594 log_msg(LOG_DEFAULT, LVL_WARN, "Failed receiving client version: %d", rc); … … 620 607 sec_types[0] = 1; /* length */ 621 608 sec_types[1] = RFB_SECURITY_NONE; 622 rc = tcp_conn_send(conn, sec_types, 2);609 rc = send(conn_sd, sec_types, 2, 0); 623 610 if (rc != EOK) { 624 611 log_msg(LOG_DEFAULT, LVL_WARN, … … 628 615 629 616 char selected_sec_type = 0; 630 rc = recv_char(conn , &selected_sec_type);617 rc = recv_char(conn_sd, &selected_sec_type); 631 618 if (rc != EOK) { 632 619 log_msg(LOG_DEFAULT, LVL_WARN, "Failed receiving security type: %d", rc); … … 639 626 } 640 627 uint32_t security_result = RFB_SECURITY_HANDSHAKE_OK; 641 rc = tcp_conn_send(conn, &security_result, sizeof(uint32_t));628 rc = send(conn_sd, &security_result, sizeof(uint32_t), 0); 642 629 if (rc != EOK) { 643 630 log_msg(LOG_DEFAULT, LVL_WARN, "Failed sending security result: %d", rc); … … 647 634 /* Client init */ 648 635 char shared_flag; 649 rc = recv_char(conn , &shared_flag);636 rc = recv_char(conn_sd, &shared_flag); 650 637 if (rc != EOK) { 651 638 log_msg(LOG_DEFAULT, LVL_WARN, "Failed receiving client init: %d", rc); … … 670 657 memcpy(server_init->name, rfb->name, name_length); 671 658 fibril_mutex_unlock(&rfb->lock); 672 rc = tcp_conn_send(conn, server_init, msg_length);659 rc = send(conn_sd, server_init, msg_length, 0); 673 660 if (rc != EOK) { 674 661 log_msg(LOG_DEFAULT, LVL_WARN, "Failed sending server init: %d", rc); … … 678 665 while (true) { 679 666 char message_type = 0; 680 rc = recv_char(conn , &message_type);667 rc = recv_char(conn_sd, &message_type); 681 668 if (rc != EOK) { 682 669 log_msg(LOG_DEFAULT, LVL_WARN, … … 693 680 switch (message_type) { 694 681 case RFB_CMSG_SET_PIXEL_FORMAT: 695 recv_message(conn , message_type, &spf, sizeof(spf));682 recv_message(conn_sd, message_type, &spf, sizeof(spf)); 696 683 rfb_pixel_format_to_host(&spf.pixel_format, &spf.pixel_format); 697 684 log_msg(LOG_DEFAULT, LVL_DEBUG2, "Received SetPixelFormat message"); … … 703 690 break; 704 691 case RFB_CMSG_SET_ENCODINGS: 705 recv_message(conn , message_type, &se, sizeof(se));692 recv_message(conn_sd, message_type, &se, sizeof(se)); 706 693 rfb_set_encodings_to_host(&se, &se); 707 694 log_msg(LOG_DEFAULT, LVL_DEBUG2, "Received SetEncodings message"); 708 695 for (uint16_t i = 0; i < se.count; i++) { 709 696 int32_t encoding = 0; 710 rc = recv_chars(conn , (char *) &encoding, sizeof(int32_t));697 rc = recv_chars(conn_sd, (char *) &encoding, sizeof(int32_t)); 711 698 if (rc != EOK) 712 699 return; … … 720 707 break; 721 708 case RFB_CMSG_FRAMEBUFFER_UPDATE_REQUEST: 722 recv_message(conn , message_type, &fbur, sizeof(fbur));709 recv_message(conn_sd, message_type, &fbur, sizeof(fbur)); 723 710 rfb_framebuffer_update_request_to_host(&fbur, &fbur); 724 711 log_msg(LOG_DEFAULT, LVL_DEBUG2, 725 712 "Received FramebufferUpdateRequest message"); 726 rfb_send_framebuffer_update(rfb, conn , fbur.incremental);713 rfb_send_framebuffer_update(rfb, conn_sd, fbur.incremental); 727 714 break; 728 715 case RFB_CMSG_KEY_EVENT: 729 recv_message(conn , message_type, &ke, sizeof(ke));716 recv_message(conn_sd, message_type, &ke, sizeof(ke)); 730 717 rfb_key_event_to_host(&ke, &ke); 731 718 log_msg(LOG_DEFAULT, LVL_DEBUG2, "Received KeyEvent message"); 732 719 break; 733 720 case RFB_CMSG_POINTER_EVENT: 734 recv_message(conn , message_type, &pe, sizeof(pe));721 recv_message(conn_sd, message_type, &pe, sizeof(pe)); 735 722 rfb_pointer_event_to_host(&pe, &pe); 736 723 log_msg(LOG_DEFAULT, LVL_DEBUG2, "Received PointerEvent message"); 737 724 break; 738 725 case RFB_CMSG_CLIENT_CUT_TEXT: 739 recv_message(conn , message_type, &cct, sizeof(cct));726 recv_message(conn_sd, message_type, &cct, sizeof(cct)); 740 727 rfb_client_cut_text_to_host(&cct, &cct); 741 728 log_msg(LOG_DEFAULT, LVL_DEBUG2, "Received ClientCutText message"); 742 recv_skip_chars(conn , cct.length);729 recv_skip_chars(conn_sd, cct.length); 743 730 break; 744 731 default: … … 750 737 } 751 738 752 int rfb_listen(rfb_t *rfb, uint16_t port) 753 { 754 tcp_t *tcp = NULL; 755 tcp_listener_t *lst = NULL; 756 inet_ep_t ep; 757 int rc; 758 759 rc = tcp_create(&tcp); 760 if (rc != EOK) { 761 log_msg(LOG_DEFAULT, LVL_ERROR, "Error initializing TCP."); 762 goto error; 763 } 764 765 inet_ep_init(&ep); 766 ep.port = port; 767 768 rc = tcp_listener_create(tcp, &ep, &listen_cb, rfb, &conn_cb, rfb, 769 &lst); 770 if (rc != EOK) { 771 log_msg(LOG_DEFAULT, LVL_ERROR, "Error creating listener."); 772 goto error; 773 } 774 775 rfb->tcp = tcp; 776 rfb->lst = lst; 739 int rfb_listen(rfb_t *rfb, uint16_t port) { 740 struct sockaddr_in addr; 741 742 addr.sin_family = AF_INET; 743 addr.sin_port = htons(port); 744 745 int rc = inet_pton(AF_INET, "127.0.0.1", (void *) 746 &addr.sin_addr.s_addr); 747 if (rc != EOK) { 748 log_msg(LOG_DEFAULT, LVL_ERROR, "Error parsing network address (%s)", 749 str_error(rc)); 750 return rc; 751 } 752 753 int listen_sd = socket(PF_INET, SOCK_STREAM, 0); 754 if (listen_sd < 0) { 755 log_msg(LOG_DEFAULT, LVL_ERROR, "Error creating listening socket (%s)", 756 str_error(listen_sd)); 757 return rc; 758 } 759 760 rc = bind(listen_sd, (struct sockaddr *) &addr, sizeof(addr)); 761 if (rc != EOK) { 762 log_msg(LOG_DEFAULT, LVL_ERROR, "Error binding socket (%s)", 763 str_error(rc)); 764 return rc; 765 } 766 767 rc = listen(listen_sd, 2); 768 if (rc != EOK) { 769 log_msg(LOG_DEFAULT, LVL_ERROR, "listen() failed (%s)", str_error(rc)); 770 return rc; 771 } 772 773 rfb->listen_sd = listen_sd; 777 774 778 775 return EOK; 779 error: 780 tcp_listener_destroy(lst); 781 tcp_destroy(tcp); 782 return rc; 783 } 784 785 static void rfb_new_conn(tcp_listener_t *lst, tcp_conn_t *conn) 786 { 787 rfb_t *rfb = (rfb_t *)tcp_listener_userptr(lst); 788 log_msg(LOG_DEFAULT, LVL_DEBUG, "Connection accepted"); 789 790 rbuf_out = 0; 791 rbuf_in = 0; 792 793 rfb_socket_connection(rfb, conn); 794 } 776 } 777 778 void rfb_accept(rfb_t *rfb) 779 { 780 while (true) { 781 struct sockaddr_in raddr; 782 socklen_t raddr_len = sizeof(raddr); 783 int conn_sd = accept(rfb->listen_sd, (struct sockaddr *) &raddr, 784 &raddr_len); 785 786 if (conn_sd < 0) { 787 log_msg(LOG_DEFAULT, LVL_WARN, "accept() failed (%s)", 788 str_error(conn_sd)); 789 continue; 790 } 791 792 log_msg(LOG_DEFAULT, LVL_DEBUG, "Connection accepted"); 793 794 rbuf_out = 0; 795 rbuf_in = 0; 796 797 rfb_socket_connection(rfb, conn_sd); 798 closesocket(conn_sd); 799 } 800 }
Note:
See TracChangeset
for help on using the changeset viewer.