[BACK]Return to scp.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / ssh

Diff for /src/usr.bin/ssh/scp.c between version 1.98 and 1.99

version 1.98, 2003/01/10 10:29:35 version 1.99, 2003/01/23 14:01:53
Line 86 
Line 86 
   
 int do_cmd(char *host, char *remuser, char *cmd, int *fdin, int *fdout, int argc);  int do_cmd(char *host, char *remuser, char *cmd, int *fdin, int *fdout, int argc);
   
   void bwlimit(int);
   
 /* Struct for addargs */  /* Struct for addargs */
 arglist args;  arglist args;
   
   /* Bandwidth limit */
   off_t limit = 0;
   
 /* Name of current file being transferred. */  /* Name of current file being transferred. */
 char *curfile;  char *curfile;
   
Line 202 
Line 207 
         char *argv[];          char *argv[];
 {  {
         int ch, fflag, tflag, status;          int ch, fflag, tflag, status;
         char *targ;          double speed;
           char *targ, *endp;
         extern char *optarg;          extern char *optarg;
         extern int optind;          extern int optind;
   
Line 213 
Line 219 
         addargs(&args, "-oClearAllForwardings yes");          addargs(&args, "-oClearAllForwardings yes");
   
         fflag = tflag = 0;          fflag = tflag = 0;
         while ((ch = getopt(argc, argv, "dfprtvBCc:i:P:q46S:o:F:")) != -1)          while ((ch = getopt(argc, argv, "dfl:prtvBCc:i:P:q46S:o:F:")) != -1)
                 switch (ch) {                  switch (ch) {
                 /* User-visible flags. */                  /* User-visible flags. */
                 case '4':                  case '4':
Line 233 
Line 239 
                 case 'B':                  case 'B':
                         addargs(&args, "-oBatchmode yes");                          addargs(&args, "-oBatchmode yes");
                         break;                          break;
                   case 'l':
                           speed = strtod(optarg, &endp);
                           if (speed <= 0 || *endp != '\0')
                                   usage();
                           limit = speed * 1024;
                           break;
                 case 'p':                  case 'p':
                         pflag = 1;                          pflag = 1;
                         break;                          break;
Line 562 
Line 574 
                                         haderr = result >= 0 ? EIO : errno;                                          haderr = result >= 0 ? EIO : errno;
                                 statbytes += result;                                  statbytes += result;
                         }                          }
                           if (limit)
                                   bwlimit(amt);
                 }                  }
                 if (showprogress)                  if (showprogress)
                         stop_progress_meter();                          stop_progress_meter();
Line 632 
Line 646 
 }  }
   
 void  void
   bwlimit(int amount)
   {
           static struct timeval bwstart, bwend;
           static int lamt, thresh = 16384;
           u_int64_t wait;
           struct timespec ts, rm;
   
           if (!timerisset(&bwstart)) {
                   gettimeofday(&bwstart, NULL);
                   return;
           }
   
           lamt += amount;
           if (lamt < thresh)
                   return;
   
           gettimeofday(&bwend, NULL);
           timersub(&bwend, &bwstart, &bwend);
           if (!timerisset(&bwend))
                   return;
   
           lamt *= 8;
           wait = (double)1000000L * lamt / limit;
   
           bwstart.tv_sec = wait / 1000000L;
           bwstart.tv_usec = wait % 1000000L;
   
           if (timercmp(&bwstart, &bwend, >)) {
                   timersub(&bwstart, &bwend, &bwend);
   
                   /* Adjust the wait time */
                   if (bwend.tv_sec) {
                           thresh /= 2;
                           if (thresh < 2048)
                                   thresh = 2048;
                   } else if (bwend.tv_usec < 100) {
                           thresh *= 2;
                           if (thresh > 32768)
                                   thresh = 32768;
                   }
   
                   TIMEVAL_TO_TIMESPEC(&bwend, &ts);
                   while (nanosleep(&ts, &rm) == -1) {
                           if (errno != EINTR)
                                   break;
                           ts = rm;
                   }
           }
   
           lamt = 0;
           gettimeofday(&bwstart, NULL);
   }
   
   void
 sink(argc, argv)  sink(argc, argv)
         int argc;          int argc;
         char *argv[];          char *argv[];
Line 828 
Line 896 
                                 cp += j;                                  cp += j;
                                 statbytes += j;                                  statbytes += j;
                         } while (amt > 0);                          } while (amt > 0);
   
                           if (limit)
                                   bwlimit(4096);
   
                         if (count == bp->cnt) {                          if (count == bp->cnt) {
                                 /* Keep reading so we stay sync'd up. */                                  /* Keep reading so we stay sync'd up. */
                                 if (wrerr == NO) {                                  if (wrerr == NO) {
Line 930 
Line 1002 
 {  {
         (void) fprintf(stderr,          (void) fprintf(stderr,
             "usage: scp [-pqrvBC46] [-F config] [-S program] [-P port]\n"              "usage: scp [-pqrvBC46] [-F config] [-S program] [-P port]\n"
             "           [-c cipher] [-i identity] [-o option]\n"              "           [-c cipher] [-i identity] [-l limit] [-o option]\n"
             "           [[user@]host1:]file1 [...] [[user@]host2:]file2\n");              "           [[user@]host1:]file1 [...] [[user@]host2:]file2\n");
         exit(1);          exit(1);
 }  }

Legend:
Removed from v.1.98  
changed lines
  Added in v.1.99