version 1.1, 2012/02/17 15:09:30
|
version 1.1.1.2, 2013/10/14 07:51:14
|
Line 4
|
Line 4
|
* Copyright (C) 1996-2000 Andrew Tridgell |
* Copyright (C) 1996-2000 Andrew Tridgell |
* Copyright (C) 1996 Paul Mackerras |
* Copyright (C) 1996 Paul Mackerras |
* Copyright (C) 2001, 2002 Martin Pool <mbp@samba.org> |
* Copyright (C) 2001, 2002 Martin Pool <mbp@samba.org> |
* Copyright (C) 2003-2009 Wayne Davison | * Copyright (C) 2003-2013 Wayne Davison |
* |
* |
* This program is free software; you can redistribute it and/or modify |
* This program is free software; you can redistribute it and/or modify |
* it under the terms of the GNU General Public License as published by |
* it under the terms of the GNU General Public License as published by |
Line 21
|
Line 21
|
*/ |
*/ |
|
|
#include "rsync.h" |
#include "rsync.h" |
|
#include "inums.h" |
|
|
extern int am_server; |
extern int am_server; |
|
extern int flist_eof; |
extern int need_unsorted_flist; |
extern int need_unsorted_flist; |
|
extern int output_needs_newline; |
extern struct stats stats; |
extern struct stats stats; |
extern struct file_list *cur_flist; |
extern struct file_list *cur_flist; |
|
|
Line 40 struct progress_history {
|
Line 43 struct progress_history {
|
OFF_T ofs; |
OFF_T ofs; |
}; |
}; |
|
|
int progress_is_active = 0; |
|
|
|
static struct progress_history ph_start; |
static struct progress_history ph_start; |
static struct progress_history ph_list[PROGRESS_HISTORY_SECS]; |
static struct progress_history ph_list[PROGRESS_HISTORY_SECS]; |
static int newest_hpos, oldest_hpos; |
static int newest_hpos, oldest_hpos; |
Line 66 static void rprint_progress(OFF_T ofs, OFF_T size, str
|
Line 67 static void rprint_progress(OFF_T ofs, OFF_T size, str
|
{ |
{ |
char rembuf[64], eol[128]; |
char rembuf[64], eol[128]; |
const char *units; |
const char *units; |
int pct = ofs == size ? 100 : (int) (100.0 * ofs / size); |
|
unsigned long diff; |
unsigned long diff; |
double rate, remain; |
double rate, remain; |
|
int pct; |
|
|
if (is_last) { |
if (is_last) { |
|
int len = snprintf(eol, sizeof eol, |
|
" (xfr#%d, %s-chk=%d/%d)\n", |
|
stats.xferred_files, flist_eof ? "to" : "ir", |
|
stats.num_files - current_file_index - 1, |
|
stats.num_files); |
|
if (INFO_GTE(PROGRESS, 2)) { |
|
static int last_len = 0; |
|
/* Drop \n and pad with spaces if line got shorter. */ |
|
if (last_len < --len) |
|
last_len = len; |
|
eol[last_len] = '\0'; |
|
while (last_len > len) |
|
eol[--last_len] = ' '; |
|
is_last = 0; |
|
} |
/* Compute stats based on the starting info. */ |
/* Compute stats based on the starting info. */ |
if (!ph_start.time.tv_sec |
if (!ph_start.time.tv_sec |
|| !(diff = msdiff(&ph_start.time, now))) |
|| !(diff = msdiff(&ph_start.time, now))) |
Line 79 static void rprint_progress(OFF_T ofs, OFF_T size, str
|
Line 95 static void rprint_progress(OFF_T ofs, OFF_T size, str
|
/* Switch to total time taken for our last update. */ |
/* Switch to total time taken for our last update. */ |
remain = (double) diff / 1000.0; |
remain = (double) diff / 1000.0; |
} else { |
} else { |
|
strlcpy(eol, " ", sizeof eol); |
/* Compute stats based on recent progress. */ |
/* Compute stats based on recent progress. */ |
if (!(diff = msdiff(&ph_list[oldest_hpos].time, now))) |
if (!(diff = msdiff(&ph_list[oldest_hpos].time, now))) |
diff = 1; |
diff = 1; |
Line 106 static void rprint_progress(OFF_T ofs, OFF_T size, str
|
Line 123 static void rprint_progress(OFF_T ofs, OFF_T size, str
|
(int) remain % 60); |
(int) remain % 60); |
} |
} |
|
|
if (is_last) { | output_needs_newline = 0; |
snprintf(eol, sizeof eol, " (xfer#%d, to-check=%d/%d)\n", | pct = ofs == size ? 100 : (int) (100.0 * ofs / size); |
stats.num_transferred_files, | rprintf(FCLIENT, "\r%15s %3d%% %7.2f%s %s%s", |
stats.num_files - current_file_index - 1, | |
stats.num_files); | |
} else | |
strlcpy(eol, "\r", sizeof eol); | |
progress_is_active = 0; | |
rprintf(FCLIENT, "%12s %3d%% %7.2f%s %s%s", | |
human_num(ofs), pct, rate, units, rembuf, eol); |
human_num(ofs), pct, rate, units, rembuf, eol); |
if (!is_last) | if (!is_last) { |
progress_is_active = 1; | output_needs_newline = 1; |
| rflush(FCLIENT); |
| } |
} |
} |
|
|
void set_current_file_index(struct file_struct *file, int ndx) |
void set_current_file_index(struct file_struct *file, int ndx) |
{ |
{ |
if (need_unsorted_flist) | if (!file) |
| current_file_index = cur_flist->used + cur_flist->ndx_start - 1; |
| else if (need_unsorted_flist) |
current_file_index = flist_find(cur_flist, file) + cur_flist->ndx_start; |
current_file_index = flist_find(cur_flist, file) + cur_flist->ndx_start; |
else |
else |
current_file_index = ndx; |
current_file_index = ndx; |
Line 134 void end_progress(OFF_T size)
|
Line 149 void end_progress(OFF_T size)
|
if (!am_server) { |
if (!am_server) { |
struct timeval now; |
struct timeval now; |
gettimeofday(&now, NULL); |
gettimeofday(&now, NULL); |
rprint_progress(size, size, &now, True); | if (INFO_GTE(PROGRESS, 2)) { |
| rprint_progress(stats.total_transferred_size, |
| stats.total_size, &now, True); |
| } else { |
| rprint_progress(size, size, &now, True); |
| memset(&ph_start, 0, sizeof ph_start); |
| } |
} |
} |
memset(&ph_start, 0, sizeof ph_start); |
|
} |
} |
|
|
void show_progress(OFF_T ofs, OFF_T size) |
void show_progress(OFF_T ofs, OFF_T size) |
Line 192 void show_progress(OFF_T ofs, OFF_T size)
|
Line 212 void show_progress(OFF_T ofs, OFF_T size)
|
return; |
return; |
#endif |
#endif |
|
|
rprint_progress(ofs, size, &now, False); | if (INFO_GTE(PROGRESS, 2)) { |
| rprint_progress(stats.total_transferred_size, |
| stats.total_size, &now, False); |
| } else |
| rprint_progress(ofs, size, &now, False); |
} |
} |