Revision: 408
          http://vde.svn.sourceforge.net/vde/?rev=408&view=rev
Author:   danielel
Date:     2010-04-29 22:23:15 +0000 (Thu, 29 Apr 2010)

Log Message:
-----------
SIGALRM-based timers removed.

This may solve sourceforge #2866481

Modified Paths:
--------------
    trunk/vde-2/src/vde_cryptcab/vde_cryptcab_client.c
    trunk/vde-2/src/vde_cryptcab/vde_cryptcab_server.c

Modified: trunk/vde-2/src/vde_cryptcab/vde_cryptcab_client.c
===================================================================
--- trunk/vde-2/src/vde_cryptcab/vde_cryptcab_client.c  2010-04-26 17:00:47 UTC 
(rev 407)
+++ trunk/vde-2/src/vde_cryptcab/vde_cryptcab_client.c  2010-04-29 22:23:15 UTC 
(rev 408)
@@ -13,7 +13,7 @@
 #include "cryptcab.h"
 #define KEEPALIVE_INTERVAL 30
 
-static unsigned char may_login = 1, keepalives = 0;
+static unsigned char keepalives = 0;
 static char *remoteusr, *remotehost;
 static unsigned short remoteport;
 static char *plugname, *pre_shared;
@@ -29,12 +29,7 @@
        gettimeofday(&last_out_time, NULL);
 }
 
-static void client_maylogin(int signo)
-{
-       may_login=1;
-}
 
-
 /*
  * Send a login packet. This is the first phase of 4WHS
  */
@@ -46,18 +41,17 @@
 
 static void try_to_login(struct peer *p)
 {
-
-       struct itimerval *old=NULL;
-       struct itimerval nxt={
-               .it_interval={.tv_sec=0, .tv_usec=0},
-               .it_value={.tv_sec=5, .tv_usec=0}
-       };
-       if(!may_login)
+       static struct timeval last_login_time; 
+       struct timeval now;
+       gettimeofday(&now, 0);
+       if (now.tv_sec < last_login_time.tv_sec  || now.tv_sec - 
last_login_time.tv_sec < 5) {
+               vc_printlog(4,"Attempt to login to  %s (udp port %hu): please 
wait, login in progress...",remotehost,remoteport);
                return;
+       }
+               
        vc_printlog(2,"Logging in to %s (udp port %hu)",remotehost,remoteport);
        blowfish_login(p);
-       may_login=0;
-       setitimer(ITIMER_REAL, &nxt, old);
+       gettimeofday(&last_login_time, 0);
 }
 
 
@@ -105,7 +99,10 @@
        memset(ret,0, sizeof(struct peer));     
 
        for(i=0; i<FILENAMESIZE-1;i++){
-               read(fd,&c,1);
+               if (read(fd,&c,1) < 0) {
+                       perror("could not read filename ");
+                       goto failure;
+               }
                c=(c%25);
                //fprintf(stderr,"c=%u\n",c);
                ret->id[i]=(char)('a' + c);
@@ -120,8 +117,10 @@
        }
        memcpy(ret->key,key,16);
        memcpy(ret->iv,iv,8);
-       write(od,key,16);
-       write(od,iv,8);
+       if (write(od,key,16) < 0 || write(od,iv,8) < 0) {
+               perror("Could not write blowfish key");
+               goto failure;
+       }
        close (od);
        vc_printlog(2,"Done."); 
        return ret;
@@ -262,7 +261,6 @@
        struct datagram pkt, pkt_dec;
        struct peer _peer;
        struct peer *p1 = &_peer;
-       struct sigaction sa_timer;
        
        plugname = _plugname;
        remoteusr = _remoteusr;
@@ -275,11 +273,6 @@
 
        memset(&last_out_time,0, sizeof(struct timeval));
 
-       sigemptyset(&sa_timer.sa_mask);
-       sa_timer.sa_handler = client_maylogin;
-       sigaction(SIGALRM, &sa_timer, NULL);
-
-
        if(enc_type == ENC_PRESHARED && (!pre_shared || 
access(pre_shared,R_OK)!=0)){
                vc_printlog(0,"Error accessing pre-shared key %s: 
%s\n",pre_shared,strerror(errno));
                exit(1);

Modified: trunk/vde-2/src/vde_cryptcab/vde_cryptcab_server.c
===================================================================
--- trunk/vde-2/src/vde_cryptcab/vde_cryptcab_server.c  2010-04-26 17:00:47 UTC 
(rev 407)
+++ trunk/vde-2/src/vde_cryptcab/vde_cryptcab_server.c  2010-04-29 22:23:15 UTC 
(rev 408)
@@ -16,11 +16,6 @@
 static char *plugname;
 static enum e_enc_type enc_type = ENC_SSH;
 
-static struct itimerval TIMER = {
-       .it_interval={ .tv_sec=0, .tv_usec=0},
-       .it_value={ .tv_sec=SESSION_TIMEOUT/2, .tv_usec=0 }
-};
-
 /*
  * Add a peer to the main list.
  * Client will have a list of one peer only,
@@ -112,6 +107,10 @@
        struct timeval now;
        char filename[128];
        struct peer *nxt;
+       
+       if (sublist == list) {
+               vc_printlog(4, "Cleaning list of peer from expired 
clients....");
+       }
 
        if(!sublist)
                return NULL;
@@ -176,14 +175,6 @@
  */
 
 static void
-autocleaner(int signo)
-{
-       struct itimerval *old=NULL;
-       list=clean_peerlist(list);
-       setitimer(ITIMER_REAL, &TIMER, old);
-}
-
-static void
 do_exit(int signo){
        vc_printlog(1,"Caught signal, exiting.");
        remove_peerlist(list);
@@ -328,15 +319,17 @@
        pfd[0].events=POLLIN|POLLHUP;
        peerlist = populate_peerlist(pfd);
 
-        do{
-               pollret = poll(pfd,1+numberofpeers(),1000);
-               if(pollret<0){
-                       if(errno==EINTR)
-                               return 0;
-                       perror("poll");
-                       exit(1);
-               }
-       } while (pollret==0);
+       pollret = poll(pfd,1+numberofpeers(),1000);
+       if(pollret<0){
+               if(errno==EINTR)
+                       return 0;
+               perror("poll");
+               exit(1);
+       }
+       if (pollret == 0) {
+               list = clean_peerlist(list);
+               return 0;
+       }
 
   
        for(;;){
@@ -362,9 +355,13 @@
                }
 
                // This increment comes with "static int i" def, to ensure 
fairness among peers.
+               // whenever a loop is complete, try to cleanup old peers from 
list.
                i++;      
-               if(i>numberofpeers())
+               if(i>numberofpeers()) {
+                       list = clean_peerlist(list);    
                        i=1;
+                       return 0;
+               }
 
                if (pfd[i].revents&POLLNVAL || pfd[i].revents&POLLHUP){
                        usleep(10000);
@@ -400,11 +397,8 @@
        sigemptyset(&sa_timer.sa_mask);
        sigemptyset(&sa_exit.sa_mask);
        sa_exit.sa_handler = do_exit;
-       sa_timer.sa_handler = autocleaner;
-       sigaction(SIGALRM, &sa_timer, NULL);
        sigaction(SIGINT, &sa_exit, NULL);
        sigaction(SIGTERM, &sa_exit, NULL);
-       kill(getpid(),SIGALRM);
        
        if(enc_type == ENC_PRESHARED && (!pre_shared || 
access(pre_shared,R_OK)!=0)){
                fprintf(stderr,"Error accessing pre-shared key 
%s\n",pre_shared);


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

------------------------------------------------------------------------------
_______________________________________________
vde-users mailing list
vde-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/vde-users

Reply via email to