diff options
| author | Dirk Engling <erdgeist@erdgeist.org> | 2022-05-17 15:23:33 +0200 |
|---|---|---|
| committer | Dirk Engling <erdgeist@erdgeist.org> | 2022-05-17 15:23:33 +0200 |
| commit | 34a4541114318a7eda1c96ed58f83cdcd2622207 (patch) | |
| tree | 77d13dae58b6b1a39c14046658d392b7d6b72e69 | |
| parent | 986fb5638542a943a6d9cd0d38d73605a642c55a (diff) | |
Move packet handler and line splitting to vchat-connection.c
| -rwxr-xr-x | vchat-client.c | 2 | ||||
| -rw-r--r-- | vchat-connection.c | 69 | ||||
| -rw-r--r-- | vchat-connection.h | 10 | ||||
| -rwxr-xr-x | vchat-protocol.c | 64 | ||||
| -rwxr-xr-x | vchat.h | 5 |
5 files changed, 73 insertions, 77 deletions
diff --git a/vchat-client.c b/vchat-client.c index d6a3db3..db31c7c 100755 --- a/vchat-client.c +++ b/vchat-client.c | |||
| @@ -411,7 +411,7 @@ eventloop (void) | |||
| 411 | 411 | ||
| 412 | /* something to read from server? */ | 412 | /* something to read from server? */ |
| 413 | if (poll_result & 2) | 413 | if (poll_result & 2) |
| 414 | networkinput (); | 414 | vc_receive (); |
| 415 | break; | 415 | break; |
| 416 | } | 416 | } |
| 417 | } | 417 | } |
diff --git a/vchat-connection.c b/vchat-connection.c index 6b38168..06ea187 100644 --- a/vchat-connection.c +++ b/vchat-connection.c | |||
| @@ -35,6 +35,10 @@ | |||
| 35 | static int serverfd = -1; | 35 | static int serverfd = -1; |
| 36 | unsigned int want_tcp_keepalive = 0; | 36 | unsigned int want_tcp_keepalive = 0; |
| 37 | 37 | ||
| 38 | /* TODO: NEEDS TO GO. status-variable from vchat-client.c | ||
| 39 | * eventloop is done as long as this is true */ | ||
| 40 | extern int status; | ||
| 41 | |||
| 38 | /* Generic tcp connector, blocking */ | 42 | /* Generic tcp connector, blocking */ |
| 39 | static int connect_tcp_socket( const char *server, const char *port ) { | 43 | static int connect_tcp_socket( const char *server, const char *port ) { |
| 40 | struct addrinfo hints, *res, *res0; | 44 | struct addrinfo hints, *res, *res0; |
| @@ -213,10 +217,65 @@ vc_sendmessage (const char *msg) | |||
| 213 | } | 217 | } |
| 214 | } | 218 | } |
| 215 | 219 | ||
| 216 | ssize_t | 220 | /* offset in buffer (for linebreaks at packet borders) */ |
| 217 | vc_receivemessage (char *buffer, size_t size) { | 221 | #define BUFSIZE 4096 |
| 218 | if (getintoption(CF_USESSL)) | 222 | static char _buf[BUFSIZE]; |
| 219 | return vc_tls_receivemessage (buffer, size); | 223 | static size_t _buf_fill; |
| 224 | |||
| 225 | /* get data from servers connection */ | ||
| 226 | void | ||
| 227 | vc_receive (void) | ||
| 228 | { | ||
| 229 | char *endmsg; | ||
| 230 | size_t freebytes = BUFSIZE - _buf_fill; | ||
| 231 | ssize_t bytes; | ||
| 232 | |||
| 233 | if (!getintoption(CF_USESSL)) | ||
| 234 | bytes = read(serverfd, _buf + _buf_fill, freebytes); | ||
| 220 | else | 235 | else |
| 221 | return read(serverfd, buffer, size); | 236 | bytes = vc_tls_receivemessage(_buf + _buf_fill, freebytes); |
| 237 | |||
| 238 | /* Our tls functions may require retries with handshakes etc, this is signalled by -2 */ | ||
| 239 | if (bytes == -2) | ||
| 240 | return; | ||
| 241 | |||
| 242 | /* Error on the socket read? raise error message, bail out */ | ||
| 243 | if (bytes == -1) { | ||
| 244 | snprintf (tmpstr, TMPSTRSIZE, "Receive fails, %s.", strerror(errno)); | ||
| 245 | snprintf (errstr, ERRSTRSIZE, "Receive fails, %s.\n", strerror(errno)); | ||
| 246 | writecf (FS_ERR,tmpstr); | ||
| 247 | status = 0; | ||
| 248 | return; | ||
| 249 | } | ||
| 250 | |||
| 251 | /* end of file from server? */ | ||
| 252 | if (bytes == 0) { | ||
| 253 | /* inform user, bail out */ | ||
| 254 | writecf (FS_SERV, "* EOF from server."); | ||
| 255 | snprintf (errstr, ERRSTRSIZE, "* EOF from server.\n"); | ||
| 256 | status = 0; | ||
| 257 | return; | ||
| 258 | } | ||
| 259 | |||
| 260 | _buf_fill += bytes; | ||
| 261 | |||
| 262 | /* as long as there are lines .. */ | ||
| 263 | while ((endmsg = memchr(_buf, '\n', _buf_fill)) != NULL) { | ||
| 264 | if (endmsg > _buf) { | ||
| 265 | /* Zero terminate message, optionally chomp CR */ | ||
| 266 | endmsg[0] = 0; | ||
| 267 | if (endmsg[-1] == '\r') | ||
| 268 | endmsg[-1] = 0; | ||
| 269 | /* If terminating and chomping left us with a message, give it to line handler */ | ||
| 270 | if (_buf[0]) { | ||
| 271 | #ifdef DEBUG | ||
| 272 | /* debugging? log network input! */ | ||
| 273 | fprintf (stderr, "<| %s\n", _buf); | ||
| 274 | #endif | ||
| 275 | protocol_parsemsg (_buf); | ||
| 276 | } | ||
| 277 | } | ||
| 278 | _buf_fill -= 1 + endmsg - _buf; | ||
| 279 | memmove(_buf, endmsg + 1, _buf_fill); | ||
| 280 | } | ||
| 222 | } | 281 | } |
diff --git a/vchat-connection.h b/vchat-connection.h index 140e467..a56dc29 100644 --- a/vchat-connection.h +++ b/vchat-connection.h | |||
| @@ -2,8 +2,8 @@ | |||
| 2 | 2 | ||
| 3 | #include <stdint.h> | 3 | #include <stdint.h> |
| 4 | 4 | ||
| 5 | int vc_connect(const char *host, const char *port); | 5 | int vc_connect(const char *host, const char *port); |
| 6 | void vc_sendmessage(const char *message); | 6 | void vc_sendmessage(const char *message); |
| 7 | ssize_t vc_receivemessage(char *buffer, size_t size); | 7 | void vc_receive(); |
| 8 | int vc_poll(); | 8 | int vc_poll(); |
| 9 | void vc_disconnect(); | 9 | void vc_disconnect(); |
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 | } | ||
| @@ -142,10 +142,7 @@ void handlequery ( char *line ); | |||
| 142 | 142 | ||
| 143 | /* vchat-protocol.c */ | 143 | /* vchat-protocol.c */ |
| 144 | extern const char *vchat_io_version; | 144 | extern const char *vchat_io_version; |
| 145 | 145 | void protocol_parsemsg (char *message); | |
| 146 | /* network I/O */ | ||
| 147 | void networkinput (void); | ||
| 148 | void networkoutput (char *); | ||
| 149 | 146 | ||
| 150 | /* helpers for vchat-user.c */ | 147 | /* helpers for vchat-user.c */ |
| 151 | void ownjoin (int channel); | 148 | void ownjoin (int channel); |
