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); | |
} |
} |