diff options
| author | Dirk Engling <erdgeist@erdgeist.org> | 2022-05-16 15:53:39 +0200 |
|---|---|---|
| committer | Dirk Engling <erdgeist@erdgeist.org> | 2022-05-16 15:53:39 +0200 |
| commit | d1ac67f6d73f24a165ccc008440bb8b208ae140f (patch) | |
| tree | 0da0184ec2273ffa6f642ab06e776fcdda9f4ac3 /vchat-client.c | |
| parent | 43b74147212ddc5e619ac17dd1b5967b6b293d8a (diff) | |
Decouple IO openssl's BIO abstraction and split connection and tls handling to allow for other TLS libs
Diffstat (limited to 'vchat-client.c')
| -rwxr-xr-x | vchat-client.c | 46 |
1 files changed, 14 insertions, 32 deletions
diff --git a/vchat-client.c b/vchat-client.c index 0e480be..d6a3db3 100755 --- a/vchat-client.c +++ b/vchat-client.c | |||
| @@ -29,6 +29,7 @@ | |||
| 29 | #include <locale.h> | 29 | #include <locale.h> |
| 30 | 30 | ||
| 31 | #include "vchat.h" | 31 | #include "vchat.h" |
| 32 | #include "vchat-connection.h" | ||
| 32 | #include "vchat-user.h" | 33 | #include "vchat-user.h" |
| 33 | 34 | ||
| 34 | /* version of this module */ | 35 | /* version of this module */ |
| @@ -43,7 +44,6 @@ int status = 1; | |||
| 43 | int ownquit = 0; | 44 | int ownquit = 0; |
| 44 | /* we set this, we DONT want to quit */ | 45 | /* we set this, we DONT want to quit */ |
| 45 | int wantreconnect = 0; | 46 | int wantreconnect = 0; |
| 46 | unsigned int want_tcp_keepalive = 0; | ||
| 47 | 47 | ||
| 48 | static int reconnect_delay = 6; | 48 | static int reconnect_delay = 6; |
| 49 | static time_t reconnect_time = 0; | 49 | static time_t reconnect_time = 0; |
| @@ -51,17 +51,10 @@ static time_t reconnect_time = 0; | |||
| 51 | /* error string to show after exit */ | 51 | /* error string to show after exit */ |
| 52 | char errstr[ERRSTRSIZE] = "\0"; | 52 | char errstr[ERRSTRSIZE] = "\0"; |
| 53 | 53 | ||
| 54 | /* locally global variables */ | ||
| 55 | /* our list of filedescriptors */ | ||
| 56 | static fd_set masterfds; | ||
| 57 | |||
| 58 | /* declaration of configuration array */ | 54 | /* declaration of configuration array */ |
| 59 | #include "vchat-config.h" | 55 | #include "vchat-config.h" |
| 60 | 56 | ||
| 61 | /* servers filedescriptor from vchat-protocol.c */ | 57 | void setnoption (const char *, char *); |
| 62 | extern int serverfd; | ||
| 63 | |||
| 64 | void setnoption (char *, char *); | ||
| 65 | 58 | ||
| 66 | static void parsecfg(char *line) { | 59 | static void parsecfg(char *line) { |
| 67 | int bytes; | 60 | int bytes; |
| @@ -264,7 +257,7 @@ setstroption (confopt option, char *string) | |||
| 264 | 257 | ||
| 265 | /* set-named-option, puts string to variable named by name */ | 258 | /* set-named-option, puts string to variable named by name */ |
| 266 | void | 259 | void |
| 267 | setnoption (char *name, char *string) | 260 | setnoption (const char *name, char *string) |
| 268 | { | 261 | { |
| 269 | int i; | 262 | int i; |
| 270 | #ifdef DEBUG | 263 | #ifdef DEBUG |
| @@ -354,11 +347,8 @@ cleanup (int signal) | |||
| 354 | exitui (); | 347 | exitui (); |
| 355 | /* clear userlist */ | 348 | /* clear userlist */ |
| 356 | ul_clear (); | 349 | ul_clear (); |
| 357 | /* close server connection */ | 350 | vc_disconnect(); |
| 358 | if (serverfd > 0) { | 351 | |
| 359 | close (serverfd); | ||
| 360 | serverfd = -1; | ||
| 361 | } | ||
| 362 | /* inform user if we where killed by signal */ | 352 | /* inform user if we where killed by signal */ |
| 363 | if (signal > 1) | 353 | if (signal > 1) |
| 364 | { | 354 | { |
| @@ -394,12 +384,9 @@ void calleverysecond( void ) { | |||
| 394 | void | 384 | void |
| 395 | eventloop (void) | 385 | eventloop (void) |
| 396 | { | 386 | { |
| 397 | /* get fresh copy of filedescriptor list */ | 387 | int poll_result = vc_poll( 1 /* second timeout */ ); |
| 398 | fd_set readfds = masterfds; | ||
| 399 | struct timeval tv = { 1, 0}; | ||
| 400 | 388 | ||
| 401 | switch (select (serverfd + 2, &readfds, NULL, NULL, &tv)) | 389 | switch (poll_result) { |
| 402 | { | ||
| 403 | case -1: | 390 | case -1: |
| 404 | /* EINTR is most likely a SIGWINCH - ignore for now */ | 391 | /* EINTR is most likely a SIGWINCH - ignore for now */ |
| 405 | if (errno != EINTR) | 392 | if (errno != EINTR) |
| @@ -411,19 +398,19 @@ eventloop (void) | |||
| 411 | writecf (FS_ERR,tmpstr); | 398 | writecf (FS_ERR,tmpstr); |
| 412 | /* see this as an error condition and bail out */ | 399 | /* see this as an error condition and bail out */ |
| 413 | status = 0; | 400 | status = 0; |
| 414 | } | 401 | } |
| 415 | break; | 402 | break; |
| 416 | case 0: | 403 | case 0: |
| 417 | /* time out reached */ | 404 | /* time out reached */ |
| 418 | calleverysecond(); | 405 | calleverysecond(); |
| 419 | break; | 406 | break; |
| 420 | default: | 407 | default: |
| 421 | /* something to read from user & we're logged in or have a cert? */ | 408 | /* something to read from user & we're logged in or have a cert? */ |
| 422 | if (FD_ISSET (0, &readfds) ) | 409 | if (poll_result & 1) |
| 423 | userinput (); | 410 | userinput (); |
| 424 | 411 | ||
| 425 | /* something to read from server? */ | 412 | /* something to read from server? */ |
| 426 | if (serverfd!=-1 && FD_ISSET (serverfd, &readfds)) | 413 | if (poll_result & 2) |
| 427 | networkinput (); | 414 | networkinput (); |
| 428 | break; | 415 | break; |
| 429 | } | 416 | } |
| @@ -511,12 +498,8 @@ main (int argc, char **argv) | |||
| 511 | initui (); | 498 | initui (); |
| 512 | 499 | ||
| 513 | while( status ) { | 500 | while( status ) { |
| 514 | /* add stdin to masterfds */ | ||
| 515 | FD_ZERO (&masterfds); | ||
| 516 | FD_SET (0, &masterfds); | ||
| 517 | |||
| 518 | /* attempt connection */ | 501 | /* attempt connection */ |
| 519 | if (vcconnect (getstroption(CF_SERVERHOST), getstroption(CF_SERVERPORT))) { | 502 | if (vc_connect (getstroption(CF_SERVERHOST), getstroption(CF_SERVERPORT))) { |
| 520 | snprintf (tmpstr, TMPSTRSIZE, "Could not connect to server, %s.", strerror(errno)); | 503 | snprintf (tmpstr, TMPSTRSIZE, "Could not connect to server, %s.", strerror(errno)); |
| 521 | strncpy(errstr,tmpstr,TMPSTRSIZE-2); | 504 | strncpy(errstr,tmpstr,TMPSTRSIZE-2); |
| 522 | errstr[TMPSTRSIZE-2] = '\0'; | 505 | errstr[TMPSTRSIZE-2] = '\0'; |
| @@ -531,8 +514,7 @@ main (int argc, char **argv) | |||
| 531 | } else | 514 | } else |
| 532 | status = 0; | 515 | status = 0; |
| 533 | } else { | 516 | } else { |
| 534 | /* add serverfd to masterfds, reset reconnect delay */ | 517 | /* reset reconnect delay */ |
| 535 | FD_SET (serverfd, &masterfds); | ||
| 536 | reconnect_delay = 6; | 518 | reconnect_delay = 6; |
| 537 | reconnect_time = 0; | 519 | reconnect_time = 0; |
| 538 | } | 520 | } |
| @@ -541,7 +523,7 @@ main (int argc, char **argv) | |||
| 541 | eventloop (); | 523 | eventloop (); |
| 542 | 524 | ||
| 543 | /* sanely close connection to server */ | 525 | /* sanely close connection to server */ |
| 544 | vcdisconnect (); | 526 | vc_disconnect (); |
| 545 | 527 | ||
| 546 | if( !ownquit && ( getintoption( CF_AUTORECONN ) || wantreconnect ) ) | 528 | if( !ownquit && ( getintoption( CF_AUTORECONN ) || wantreconnect ) ) |
| 547 | status = 1; | 529 | status = 1; |
