|
version 1.1.1.2, 2013/10/14 07:51:14
|
version 1.1.1.4, 2021/03/17 00:32:36
|
|
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-2013 Wayne Davison | * Copyright (C) 2003-2020 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 25
|
Line 25
|
| |
|
| extern int am_server; |
extern int am_server; |
| extern int flist_eof; |
extern int flist_eof; |
| |
extern int quiet; |
| extern int need_unsorted_flist; |
extern int need_unsorted_flist; |
| extern int output_needs_newline; |
extern int output_needs_newline; |
| |
extern int stdout_format_has_i; |
| extern struct stats stats; |
extern struct stats stats; |
| extern struct file_list *cur_flist; |
extern struct file_list *cur_flist; |
| |
|
| |
BOOL want_progress_now = False; |
| |
|
| #define PROGRESS_HISTORY_SECS 5 |
#define PROGRESS_HISTORY_SECS 5 |
| |
|
| #ifdef GETPGRP_VOID |
#ifdef GETPGRP_VOID |
|
Line 62 static unsigned long msdiff(struct timeval *t1, struct
|
Line 66 static unsigned long msdiff(struct timeval *t1, struct
|
| * printed for this file, so we should output a newline. (Not |
* printed for this file, so we should output a newline. (Not |
| * necessarily the same as all bytes being received.) |
* necessarily the same as all bytes being received.) |
| **/ |
**/ |
| static void rprint_progress(OFF_T ofs, OFF_T size, struct timeval *now, | static void rprint_progress(OFF_T ofs, OFF_T size, struct timeval *now, int is_last) |
| int is_last) | |
| { |
{ |
| char rembuf[64], eol[128]; |
char rembuf[64], eol[128]; |
| const char *units; |
const char *units; |
|
Line 88 static void rprint_progress(OFF_T ofs, OFF_T size, str
|
Line 91 static void rprint_progress(OFF_T ofs, OFF_T size, str
|
| is_last = 0; |
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))) | |
| diff = 1; |
diff = 1; |
| rate = (double) (ofs - ph_start.ofs) * 1000.0 / diff / 1024.0; |
rate = (double) (ofs - ph_start.ofs) * 1000.0 / diff / 1024.0; |
| /* Switch to total time taken for our last update. */ |
/* Switch to total time taken for our last update. */ |
|
Line 99 static void rprint_progress(OFF_T ofs, OFF_T size, str
|
Line 101 static void rprint_progress(OFF_T ofs, OFF_T size, str
|
| /* 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; |
| rate = (double) (ofs - ph_list[oldest_hpos].ofs) * 1000.0 | rate = (double) (ofs - ph_list[oldest_hpos].ofs) * 1000.0 / diff / 1024.0; |
| / diff / 1024.0; | |
| remain = rate ? (double) (size - ofs) / rate / 1000.0 : 0.0; |
remain = rate ? (double) (size - ofs) / rate / 1000.0 : 0.0; |
| } |
} |
| |
|
|
Line 127 static void rprint_progress(OFF_T ofs, OFF_T size, str
|
Line 128 static void rprint_progress(OFF_T ofs, OFF_T size, str
|
| pct = ofs == size ? 100 : (int) (100.0 * ofs / size); |
pct = ofs == size ? 100 : (int) (100.0 * ofs / size); |
| rprintf(FCLIENT, "\r%15s %3d%% %7.2f%s %s%s", |
rprintf(FCLIENT, "\r%15s %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 && !quiet) { |
| output_needs_newline = 1; |
output_needs_newline = 1; |
| rflush(FCLIENT); |
rflush(FCLIENT); |
| } |
} |
| } |
} |
| |
|
| |
void progress_init(void) |
| |
{ |
| |
if (!am_server && !INFO_GTE(PROGRESS, 1)) { |
| |
struct timeval now; |
| |
gettimeofday(&now, NULL); |
| |
ph_start.time.tv_sec = now.tv_sec; |
| |
ph_start.time.tv_usec = now.tv_usec; |
| |
} |
| |
} |
| |
|
| void set_current_file_index(struct file_struct *file, int ndx) |
void set_current_file_index(struct file_struct *file, int ndx) |
| { |
{ |
| if (!file) |
if (!file) |
|
Line 144 void set_current_file_index(struct file_struct *file,
|
Line 155 void set_current_file_index(struct file_struct *file,
|
| current_file_index -= cur_flist->flist_num; |
current_file_index -= cur_flist->flist_num; |
| } |
} |
| |
|
| |
void instant_progress(const char *fname) |
| |
{ |
| |
/* We only get here if want_progress_now is True */ |
| |
if (!stdout_format_has_i && !INFO_GTE(NAME, 1)) |
| |
rprintf(FINFO, "%s\n", fname); |
| |
end_progress(0); |
| |
want_progress_now = False; |
| |
} |
| |
|
| void end_progress(OFF_T size) |
void end_progress(OFF_T size) |
| { |
{ |
| if (!am_server) { |
if (!am_server) { |
| struct timeval now; |
struct timeval now; |
| gettimeofday(&now, NULL); |
gettimeofday(&now, NULL); |
| if (INFO_GTE(PROGRESS, 2)) { | if (INFO_GTE(PROGRESS, 2) || want_progress_now) { |
| rprint_progress(stats.total_transferred_size, |
rprint_progress(stats.total_transferred_size, |
| stats.total_size, &now, True); |
stats.total_size, &now, True); |
| } else { |
} else { |
|
Line 177 void show_progress(OFF_T ofs, OFF_T size)
|
Line 197 void show_progress(OFF_T ofs, OFF_T size)
|
| |
|
| gettimeofday(&now, NULL); |
gettimeofday(&now, NULL); |
| |
|
| |
if (INFO_GTE(PROGRESS, 2)) { |
| |
ofs = stats.total_transferred_size - size + ofs; |
| |
size = stats.total_size; |
| |
} |
| |
|
| if (!ph_start.time.tv_sec) { |
if (!ph_start.time.tv_sec) { |
| int i; |
int i; |
| |
|
|
Line 212 void show_progress(OFF_T ofs, OFF_T size)
|
Line 237 void show_progress(OFF_T ofs, OFF_T size)
|
| return; |
return; |
| #endif |
#endif |
| |
|
| if (INFO_GTE(PROGRESS, 2)) { | rprint_progress(ofs, size, &now, False); |
| rprint_progress(stats.total_transferred_size, | |
| stats.total_size, &now, False); | |
| } else | |
| rprint_progress(ofs, size, &now, False); | |
| } |
} |