diff options
Diffstat (limited to 'vchat-protocol.c')
| -rwxr-xr-x | vchat-protocol.c | 64 |
1 files changed, 2 insertions, 62 deletions
diff --git a/vchat-protocol.c b/vchat-protocol.c index 0451b77..77e45ec 100755 --- a/vchat-protocol.c +++ b/vchat-protocol.c | |||
| @@ -57,9 +57,6 @@ static void pmnotsent (char *message); | |||
| 57 | /* declaration of server message array */ | 57 | /* declaration of server message array */ |
| 58 | #include "vchat-messages.h" | 58 | #include "vchat-messages.h" |
| 59 | 59 | ||
| 60 | /* status-variable from vchat-client.c | ||
| 61 | * eventloop is done as long as this is true */ | ||
| 62 | extern int status; | ||
| 63 | char *encoding; | 60 | char *encoding; |
| 64 | 61 | ||
| 65 | /* handle a pm not sent error | 62 | /* handle a pm not sent error |
| @@ -577,8 +574,8 @@ usernickchange (char *message) | |||
| 577 | } | 574 | } |
| 578 | 575 | ||
| 579 | /* handle received message from server */ | 576 | /* handle received message from server */ |
| 580 | static void | 577 | void |
| 581 | parsemsg (char *message) | 578 | protocol_parsemsg (char *message) |
| 582 | { | 579 | { |
| 583 | char *str1, *str2; | 580 | char *str1, *str2; |
| 584 | int i; | 581 | int i; |
| @@ -691,60 +688,3 @@ parsemsg (char *message) | |||
| 691 | } | 688 | } |
| 692 | } | 689 | } |
| 693 | 690 | ||
| 694 | /* offset in buffer (for linebreaks at packet borders) */ | ||
| 695 | #define BUFSIZE 4096 | ||
| 696 | static char _buf[BUFSIZE]; | ||
| 697 | static size_t _buf_fill; | ||
| 698 | |||
| 699 | /* get data from servers filedescriptor */ | ||
| 700 | void | ||
| 701 | networkinput (void) | ||
| 702 | { | ||
| 703 | char *endmsg; | ||
| 704 | size_t freebytes = BUFSIZE - _buf_fill; | ||
| 705 | ssize_t bytes = vc_receivemessage(&_buf[_buf_fill], freebytes); | ||
| 706 | |||
| 707 | /* Our tls functions may require retries with handshakes etc, this is signalled by -2 */ | ||
| 708 | if (bytes == -2) | ||
| 709 | return; | ||
| 710 | |||
| 711 | /* Error on the socket read? raise error message, bail out */ | ||
| 712 | if (bytes == -1) { | ||
| 713 | snprintf (tmpstr, TMPSTRSIZE, "Receive fails, %s.", strerror(errno)); | ||
| 714 | snprintf (errstr, ERRSTRSIZE, "Receive fails, %s.\n", strerror(errno)); | ||
| 715 | writecf (FS_ERR,tmpstr); | ||
| 716 | status = 0; | ||
| 717 | return; | ||
| 718 | } | ||
| 719 | |||
| 720 | /* end of file from server? */ | ||
| 721 | if (bytes == 0) { | ||
| 722 | /* inform user, bail out */ | ||
| 723 | writecf (FS_SERV, "* EOF from server."); | ||
| 724 | snprintf (errstr, ERRSTRSIZE, "* EOF from server.\n"); | ||
| 725 | status = 0; | ||
| 726 | return; | ||
| 727 | } | ||
| 728 | |||
| 729 | _buf_fill += bytes; | ||
| 730 | |||
| 731 | /* as long as there are lines .. */ | ||
| 732 | while ((endmsg = memchr(_buf, '\n', _buf_fill)) != NULL) { | ||
| 733 | if (endmsg > _buf) { | ||
| 734 | /* Zero terminate message, optionally chomp CR */ | ||
| 735 | endmsg[0] = 0; | ||
| 736 | if (endmsg[-1] == '\r') | ||
| 737 | endmsg[-1] = 0; | ||
| 738 | /* If terminating and chomping left us with a message, give it to line handler */ | ||
| 739 | if (_buf[0]) { | ||
| 740 | #ifdef DEBUG | ||
| 741 | /* debugging? log network input! */ | ||
| 742 | fprintf (stderr, "<| %s\n", _buf); | ||
| 743 | #endif | ||
| 744 | parsemsg (_buf); | ||
| 745 | } | ||
| 746 | } | ||
| 747 | _buf_fill -= 1 + endmsg - _buf; | ||
| 748 | memmove(_buf, endmsg + 1, _buf_fill); | ||
| 749 | } | ||
| 750 | } | ||
