diff options
| author | erdgeist <> | 2010-07-30 21:41:50 +0000 |
|---|---|---|
| committer | erdgeist <> | 2010-07-30 21:41:50 +0000 |
| commit | 6dac4efa6181e2696ea112c3f1826f529160ceef (patch) | |
| tree | 0f081ca75b0f35d727314c78c4b0f33fdf93af25 /vchat-client.c | |
| parent | a4b65f17eb73100a3fd4ec1f4de7cee56aa5131b (diff) | |
Can do v6 and reconnect.
Diffstat (limited to 'vchat-client.c')
| -rwxr-xr-x | vchat-client.c | 64 |
1 files changed, 38 insertions, 26 deletions
diff --git a/vchat-client.c b/vchat-client.c index c80e374..b7f993c 100755 --- a/vchat-client.c +++ b/vchat-client.c | |||
| @@ -44,6 +44,8 @@ int status = 1; | |||
| 44 | int ownquit = 0; | 44 | int ownquit = 0; |
| 45 | /* we set this, we DONT want to quit */ | 45 | /* we set this, we DONT want to quit */ |
| 46 | int wantreconnect = 0; | 46 | int wantreconnect = 0; |
| 47 | static int reconnect_delay = 6; | ||
| 48 | static time_t reconnect_time = 0; | ||
| 47 | 49 | ||
| 48 | /* error string to show after exit */ | 50 | /* error string to show after exit */ |
| 49 | char errstr[ERRSTRSIZE] = "\0"; | 51 | char errstr[ERRSTRSIZE] = "\0"; |
| @@ -65,7 +67,7 @@ static void parsecfg(char *line) { | |||
| 65 | char *param=line; | 67 | char *param=line; |
| 66 | char *value=NULL; | 68 | char *value=NULL; |
| 67 | 69 | ||
| 68 | /* handle quotes value is empty, so wecan use it */ | 70 | /* handle quotes value is empty, so we can use it */ |
| 69 | value = strchr(line,'#'); | 71 | value = strchr(line,'#'); |
| 70 | if (value) { /* the line contains a cute little quote */ | 72 | if (value) { /* the line contains a cute little quote */ |
| 71 | value[0]='\0'; /* ignore the rest of the line */ | 73 | value[0]='\0'; /* ignore the rest of the line */ |
| @@ -414,7 +416,8 @@ void calleverysecond( void ) { | |||
| 414 | quitrequest--; | 416 | quitrequest--; |
| 415 | if(outputcountdown && !--outputcountdown) | 417 | if(outputcountdown && !--outputcountdown) |
| 416 | hideout( ); | 418 | hideout( ); |
| 417 | 419 | if( reconnect_time && ( time( NULL ) > reconnect_time ) ) | |
| 420 | status = 0; | ||
| 418 | } | 421 | } |
| 419 | 422 | ||
| 420 | /* this function is called in the master loop */ | 423 | /* this function is called in the master loop */ |
| @@ -425,33 +428,33 @@ eventloop (void) | |||
| 425 | fd_set readfds = masterfds; | 428 | fd_set readfds = masterfds; |
| 426 | struct timeval tv = { 1, 0}; | 429 | struct timeval tv = { 1, 0}; |
| 427 | 430 | ||
| 428 | switch (select (serverfd + 1, &readfds, NULL, NULL, &tv)) | 431 | switch (select (serverfd + 2, &readfds, NULL, NULL, &tv)) |
| 429 | { | 432 | { |
| 430 | case -1: | 433 | case -1: |
| 431 | /* EINTR is most likely a SIGWINCH - ignore for now */ | 434 | /* EINTR is most likely a SIGWINCH - ignore for now */ |
| 432 | if (errno != EINTR) | 435 | if (errno != EINTR) |
| 433 | { | 436 | { |
| 434 | snprintf (tmpstr, TMPSTRSIZE, "Select fails, %s.", strerror(errno)); | 437 | snprintf (tmpstr, TMPSTRSIZE, "Select fails, %s.", strerror(errno)); |
| 435 | strncpy(errstr,tmpstr,TMPSTRSIZE-2); | 438 | strncpy(errstr,tmpstr,TMPSTRSIZE-2); |
| 436 | errstr[TMPSTRSIZE-2] = '\0'; | 439 | errstr[TMPSTRSIZE-2] = '\0'; |
| 437 | strcat(errstr,"\n"); | 440 | strcat(errstr,"\n"); |
| 438 | writecf (FS_ERR,tmpstr); | 441 | writecf (FS_ERR,tmpstr); |
| 439 | /* see this as an error condition and bail out */ | 442 | /* see this as an error condition and bail out */ |
| 440 | status = 0; | 443 | status = 0; |
| 441 | } | 444 | } |
| 442 | break; | 445 | break; |
| 443 | case 0: | 446 | case 0: |
| 444 | /* time out reached */ | 447 | /* time out reached */ |
| 445 | calleverysecond(); | 448 | calleverysecond(); |
| 446 | break; | 449 | break; |
| 447 | default: | 450 | default: |
| 448 | /* something to read from user & we're logged in or have a cert? */ | 451 | /* something to read from user & we're logged in or have a cert? */ |
| 449 | if (FD_ISSET (0, &readfds) && loggedin) | 452 | if (FD_ISSET (0, &readfds) ) |
| 450 | userinput (); | 453 | userinput (); |
| 451 | 454 | ||
| 452 | /* something to read from server? */ | 455 | /* something to read from server? */ |
| 453 | if (FD_ISSET (serverfd, &readfds)) | 456 | if (serverfd!=-1 && FD_ISSET (serverfd, &readfds)) |
| 454 | networkinput (); | 457 | networkinput (); |
| 455 | break; | 458 | break; |
| 456 | } | 459 | } |
| 457 | } | 460 | } |
| @@ -495,7 +498,7 @@ main (int argc, char **argv) | |||
| 495 | #endif | 498 | #endif |
| 496 | 499 | ||
| 497 | switch (pchar) { | 500 | switch (pchar) { |
| 498 | case -1 : cmdsunparsed = 0; break; | 501 | case -1 : cmdsunparsed = 0; break; |
| 499 | case 'C': loadconfig(optarg); break; | 502 | case 'C': loadconfig(optarg); break; |
| 500 | case 'F': setstroption(CF_FORMFILE,optarg); break; | 503 | case 'F': setstroption(CF_FORMFILE,optarg); break; |
| 501 | case 'l': setintoption(CF_USESSL,0); break; | 504 | case 'l': setintoption(CF_USESSL,0); break; |
| @@ -528,21 +531,30 @@ main (int argc, char **argv) | |||
| 528 | initui (); | 531 | initui (); |
| 529 | 532 | ||
| 530 | while( status ) { | 533 | while( status ) { |
| 534 | /* add stdin to masterfds */ | ||
| 535 | FD_ZERO (&masterfds); | ||
| 536 | FD_SET (0, &masterfds); | ||
| 537 | |||
| 531 | /* attempt connection */ | 538 | /* attempt connection */ |
| 532 | if (!vcconnect (getstroption(CF_SERVERHOST), getstroption(CF_SERVERPORT))) { | 539 | if (vcconnect (getstroption(CF_SERVERHOST), getstroption(CF_SERVERPORT))) { |
| 533 | snprintf (tmpstr, TMPSTRSIZE, "Could not connect to server, %s.", | 540 | snprintf (tmpstr, TMPSTRSIZE, "Could not connect to server, %s.", strerror(errno)); |
| 534 | strerror(errno)); | 541 | strncpy(errstr,tmpstr,TMPSTRSIZE-2); |
| 535 | strncpy(errstr,tmpstr,TMPSTRSIZE-2); | 542 | errstr[TMPSTRSIZE-2] = '\0'; |
| 536 | errstr[TMPSTRSIZE-2] = '\0'; | 543 | strcat(errstr,"\n"); |
| 537 | strcat(errstr,"\n"); | 544 | writecf (FS_ERR,tmpstr); |
| 538 | writecf (FS_ERR,tmpstr); | 545 | |
| 539 | /* exit condition */ | 546 | if( getintoption( CF_AUTORECONN ) ) { |
| 540 | status = 0; | 547 | snprintf (tmpstr, TMPSTRSIZE, "reconnecting in %d seconds", reconnect_delay ); |
| 548 | writecf (FS_ERR, tmpstr); | ||
| 549 | reconnect_delay = ( reconnect_delay * 15 ) / 10; | ||
| 550 | reconnect_time = time( NULL ) + reconnect_delay; | ||
| 551 | } else | ||
| 552 | status = 0; | ||
| 541 | } else { | 553 | } else { |
| 542 | /* add stdin & server to masterdfs */ | 554 | /* add serverfd to masterfds, reset reconnect delay */ |
| 543 | FD_ZERO (&masterfds); | ||
| 544 | FD_SET (0, &masterfds); | ||
| 545 | FD_SET (serverfd, &masterfds); | 555 | FD_SET (serverfd, &masterfds); |
| 556 | reconnect_delay = 6; | ||
| 557 | reconnect_time = 0; | ||
| 546 | } | 558 | } |
| 547 | 559 | ||
| 548 | while (status) | 560 | while (status) |
