diff -cr stunnel-4.04/src/client.c stunnel-4.04.per_connection_bandwidth_cap/src/client.c *** stunnel-4.04/src/client.c Wed Jan 1 14:04:39 2003 --- stunnel-4.04.per_connection_bandwidth_cap/src/client.c Fri Mar 21 22:26:54 2003 *************** *** 301,306 **** --- 301,326 ---- return 0; /* OK */ } + /* needed for struct timespec, which is needed for delay_init and delay */ + #include + + /* delays and delay_init are used to implement a per connection speed limit */ + struct timespec delays[BUFFSIZE+1]; + + void delay_init(void) + { + // sleep 100000 nanoseconds per byte, so 10,000 bytes/second max + const unsigned long sleep_nanoseconds_per_byte = 50000L; + const unsigned long nanoseconds_per_second = 1000000000L; + int i; + unsigned long nanoseconds = 0; + for (i = 0; i <= BUFFSIZE; i++) { + delays[i].tv_sec = (time_t)(nanoseconds / nanoseconds_per_second); + delays[i].tv_nsec = nanoseconds % nanoseconds_per_second; + nanoseconds += sleep_nanoseconds_per_byte; + } + } + static int transfer(CLI *c) { /* transfer data */ fd_set rd_set, wr_set; int num, err, fdno; *************** *** 390,395 **** --- 410,416 ---- check_SSL_pending=1; c->ssl_ptr-=num; c->sock_bytes+=num; + delay(num); if(!ssl_rd && !c->ssl_ptr) { shutdown(c->sock_wfd->fd, SHUT_WR); log(LOG_DEBUG, *************** *** 414,419 **** --- 435,441 ---- memmove(c->sock_buff, c->sock_buff+num, c->sock_ptr-num); c->sock_ptr-=num; c->ssl_bytes+=num; + delay(num); if(!sock_rd && !c->sock_ptr && ssl_wr) { SSL_shutdown(c->ssl); /* Send close_notify */ log(LOG_DEBUG, diff -cr stunnel-4.04/src/prototypes.h stunnel-4.04.per_connection_bandwidth_cap/src/prototypes.h *** stunnel-4.04/src/prototypes.h Wed Jan 1 09:33:54 2003 --- stunnel-4.04.per_connection_bandwidth_cap/src/prototypes.h Fri Mar 21 22:22:35 2003 *************** *** 278,283 **** --- 278,287 ---- int pem_passwd_cb(char *, int, int, void *); #endif + /* stuff added to implement bandwidth limiting */ + void delay_init(void); + #define delay(num) (void)nanosleep(&delays[num], NULL) + #endif /* defined PROTOTYPES_H */ /* End of prototypes.h */ diff -cr stunnel-4.04/src/stunnel.c stunnel-4.04.per_connection_bandwidth_cap/src/stunnel.c *** stunnel-4.04/src/stunnel.c Sun Jan 12 10:46:55 2003 --- stunnel-4.04.per_connection_bandwidth_cap/src/stunnel.c Fri Mar 21 22:21:23 2003 *************** *** 79,84 **** --- 79,85 ---- struct stat st; /* buffer for stat */ sthreads_init(); /* initialize critical sections & SSL callbacks */ + delay_init(); parse_config(arguments); log_open(); log(LOG_NOTICE, "%s", stunnel_info());