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 <time.h>
+ 
+ /* 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());

