Reformatted with "indent" to a line length of 120.

This commit is contained in:
Andrew Wood
2023-07-29 22:21:32 +01:00
parent 630d92fef6
commit 943c05a8a0
15 changed files with 309 additions and 760 deletions
+2 -4
View File
@@ -72,8 +72,7 @@ int minigetopt(int argc, char **argv, char *optstring)
if (0 == optstring[i]) {
minioptopt = optchar;
if (miniopterr)
fprintf(stderr, "%s: invalid option -- %c\n",
argv[0], optchar);
fprintf(stderr, "%s: invalid option -- %c\n", argv[0], optchar);
return '?';
}
@@ -103,8 +102,7 @@ int minigetopt(int argc, char **argv, char *optstring)
nextchar = 0;
minioptind++;
if (minioptind >= argc) {
fprintf(stderr, "%s: option `-%c' requires an argument\n",
argv[0], optchar);
fprintf(stderr, "%s: option `-%c' requires an argument\n", argv[0], optchar);
return ':';
}
minioptarg = argv[minioptind++];
+2 -4
View File
@@ -33,8 +33,7 @@ void debugging_output_destination(const char *filename)
* Output debugging information to the file specified earlier by a call to
* debugging_output_destination(), if any.
*/
void debugging_output(const char *function, const char *file, int line,
const char *format, ...)
void debugging_output(const char *function, const char *file, int line, const char *format, ...)
{
static bool tried_open = false;
static FILE *debugfptr = NULL;
@@ -72,8 +71,7 @@ void debugging_output(const char *function, const char *file, int line,
}
tbuf[sizeof(tbuf) - 1] = '\0'; /* enforce termination */
(void) fprintf(debugfptr, "[%s] (%d) %s (%s:%d): ", tbuf, getpid(),
function, file, line);
(void) fprintf(debugfptr, "[%s] (%d) %s (%s:%d): ", tbuf, getpid(), function, file, line);
va_start(ap, format);
(void) vfprintf(debugfptr, format, ap); /* flawfinder: ignore */
+15 -33
View File
@@ -72,8 +72,7 @@ int main(int argc, char **argv)
*/
state = pv_state_alloc(opts->program_name);
if (NULL == state) {
fprintf(stderr, "%s: %s: %s\n", opts->program_name,
_("state allocation failed"), strerror(errno));
fprintf(stderr, "%s: %s: %s\n", opts->program_name, _("state allocation failed"), strerror(errno));
opts_free(opts);
debug("%s: %d", "exiting with status", 64);
return 64;
@@ -86,16 +85,14 @@ int main(int argc, char **argv)
FILE *pidfptr;
pidfptr = fopen(opts->pidfile, "w");
if (NULL == pidfptr) {
fprintf(stderr, "%s: %s: %s\n", opts->program_name,
opts->pidfile, strerror(errno));
fprintf(stderr, "%s: %s: %s\n", opts->program_name, opts->pidfile, strerror(errno));
pv_state_free(state);
opts_free(opts);
return 1;
}
fprintf(pidfptr, "%d\n", getpid());
if (0 != fclose(pidfptr)) {
fprintf(stderr, "%s: %s: %s\n", opts->program_name,
opts->pidfile, strerror(errno));
fprintf(stderr, "%s: %s: %s\n", opts->program_name, opts->pidfile, strerror(errno));
}
}
@@ -110,8 +107,7 @@ int main(int argc, char **argv)
/*
* Put our list of files into the PV internal state.
*/
pv_state_inputfiles(state, opts->argc,
(const char **) (opts->argv));
pv_state_inputfiles(state, opts->argc, (const char **) (opts->argv));
if (0 == opts->watch_pid) {
/*
@@ -120,8 +116,7 @@ int main(int argc, char **argv)
*/
if ((0 == opts->size) && (false == opts->linemode)) {
opts->size = pv_calc_total_size(state);
debug("%s: %llu", "no size given - calculated",
opts->size);
debug("%s: %llu", "no size given - calculated", opts->size);
}
/*
@@ -154,13 +149,11 @@ int main(int argc, char **argv)
pv_screensize(&width, &height);
if (0 == opts->width) {
opts->width = width;
debug("%s: %u", "auto-detected terminal width",
width);
debug("%s: %u", "auto-detected terminal width", width);
}
if (0 == opts->height) {
opts->height = height;
debug("%s: %u", "auto-detected terminal height",
height);
debug("%s: %u", "auto-detected terminal height", height);
}
}
@@ -215,8 +208,7 @@ int main(int argc, char **argv)
pv_state_set_format(state, opts->progress, opts->timer, opts->eta,
opts->fineta, opts->rate, opts->average_rate,
opts->bytes, opts->bufpercent,
opts->lastwritten, opts->name);
opts->bytes, opts->bufpercent, opts->lastwritten, opts->name);
#ifdef MAKE_STDOUT_NONBLOCKING
/*
@@ -225,8 +217,7 @@ int main(int argc, char **argv)
* Note that this can cause problems with (broken) applications
* such as dd.
*/
fcntl(STDOUT_FILENO, F_SETFL,
O_NONBLOCK | fcntl(STDOUT_FILENO, F_GETFL));
fcntl(STDOUT_FILENO, F_SETFL, O_NONBLOCK | fcntl(STDOUT_FILENO, F_GETFL));
#endif /* MAKE_STDOUT_NONBLOCKING */
/*
@@ -249,8 +240,7 @@ int main(int argc, char **argv)
t_saved = true;
} else {
fprintf(stderr, "%s: %s: %s\n", opts->program_name,
_("failed to read terminal attributes"),
strerror(errno));
_("failed to read terminal attributes"), strerror(errno));
}
}
t_save = t;
@@ -266,15 +256,12 @@ int main(int argc, char **argv)
pv_sig_init(state);
retcode = pv_watchfd_loop(state);
if (t_needs_reset && pv_in_foreground()) {
(void) tcsetattr(STDERR_FILENO, TCSANOW,
&t_save);
(void) tcsetattr(STDERR_FILENO, TCSANOW, &t_save);
}
if (opts->pidfile != NULL) {
if (0 != remove(opts->pidfile)) {
fprintf(stderr, "%s: %s: %s\n",
opts->program_name,
opts->pidfile,
strerror(errno));
opts->program_name, opts->pidfile, strerror(errno));
}
}
pv_sig_fini(state);
@@ -282,15 +269,12 @@ int main(int argc, char **argv)
pv_sig_init(state);
retcode = pv_watchpid_loop(state);
if (t_needs_reset && pv_in_foreground()) {
(void) tcsetattr(STDERR_FILENO, TCSANOW,
&t_save);
(void) tcsetattr(STDERR_FILENO, TCSANOW, &t_save);
}
if (opts->pidfile != NULL) {
if (0 != remove(opts->pidfile)) {
fprintf(stderr, "%s: %s: %s\n",
opts->program_name,
opts->pidfile,
strerror(errno));
opts->program_name, opts->pidfile, strerror(errno));
}
}
pv_sig_fini(state);
@@ -305,9 +289,7 @@ int main(int argc, char **argv)
}
if (opts->pidfile != NULL) {
if (0 != remove(opts->pidfile)) {
fprintf(stderr, "%s: %s: %s\n",
opts->program_name, opts->pidfile,
strerror(errno));
fprintf(stderr, "%s: %s: %s\n", opts->program_name, opts->pidfile, strerror(errno));
}
}
pv_sig_fini(state);
+19 -47
View File
@@ -95,8 +95,7 @@ opts_t opts_parse(int argc, char **argv)
};
int option_index = 0;
#endif /* HAVE_GETOPT_LONG */
char *short_options =
"hVpteIrab8TA:fnqcWD:s:l0i:w:H:N:F:L:B:CESYKR:P:d:m:"
char *short_options = "hVpteIrab8TA:fnqcWD:s:l0i:w:H:N:F:L:B:CESYKR:P:d:m:"
#ifdef ENABLE_DEBUGGING
"!:"
#endif
@@ -109,9 +108,7 @@ opts_t opts_parse(int argc, char **argv)
opts = calloc(1, sizeof(*opts));
if (!opts) {
fprintf(stderr, "%s: %s: %s\n", argv[0],
_("option structure allocation failed"),
strerror(errno));
fprintf(stderr, "%s: %s: %s\n", argv[0], _("option structure allocation failed"), strerror(errno));
return NULL;
}
@@ -124,8 +121,7 @@ opts_t opts_parse(int argc, char **argv)
opts->argv = calloc((size_t) (argc + 1), sizeof(char *));
if (NULL == opts->argv) {
fprintf(stderr, "%s: %s: %s\n", opts->program_name,
_("option structure argv allocation failed"),
strerror(errno));
_("option structure argv allocation failed"), strerror(errno));
opts_free(opts);
return NULL;
}
@@ -140,9 +136,7 @@ opts_t opts_parse(int argc, char **argv)
do {
#ifdef HAVE_GETOPT_LONG
c = getopt_long(argc, argv,
short_options, long_options,
&option_index);
c = getopt_long(argc, argv, short_options, long_options, &option_index);
#else
c = getopt(argc, argv, short_options);
#endif
@@ -165,22 +159,16 @@ opts_t opts_parse(int argc, char **argv)
case 'B':
case 'R':
case 'm':
if (pv_getnum_check(optarg, PV_NUMTYPE_INTEGER) !=
0) {
fprintf(stderr, "%s: -%c: %s\n",
opts->program_name, c,
_("integer argument expected"));
if (pv_getnum_check(optarg, PV_NUMTYPE_INTEGER) != 0) {
fprintf(stderr, "%s: -%c: %s\n", opts->program_name, c, _("integer argument expected"));
opts_free(opts);
return NULL;
}
break;
case 'i':
case 'D':
if (pv_getnum_check(optarg, PV_NUMTYPE_DOUBLE) !=
0) {
fprintf(stderr, "%s: -%c: %s\n",
opts->program_name, c,
_("numeric argument expected"));
if (pv_getnum_check(optarg, PV_NUMTYPE_DOUBLE) != 0) {
fprintf(stderr, "%s: -%c: %s\n", opts->program_name, c, _("numeric argument expected"));
opts_free(opts);
return NULL;
}
@@ -189,16 +177,12 @@ opts_t opts_parse(int argc, char **argv)
if (sscanf(optarg, "%u:%d", &check_pid, &check_fd)
< 1) {
fprintf(stderr, "%s: -%c: %s\n",
opts->program_name, c,
_
("process ID or pid:fd pair expected"));
opts->program_name, c, _("process ID or pid:fd pair expected"));
opts_free(opts);
return NULL;
}
if (check_pid < 1) {
fprintf(stderr, "%s: -%c: %s\n",
opts->program_name, c,
_("invalid process ID"));
fprintf(stderr, "%s: -%c: %s\n", opts->program_name, c, _("invalid process ID"));
opts_free(opts);
return NULL;
}
@@ -297,9 +281,7 @@ opts_t opts_parse(int argc, char **argv)
} else {
fprintf(stderr, "%s: %s %s: %s\n",
opts->program_name,
_("failed to stat file"),
size_file,
strerror(errno));
_("failed to stat file"), size_file, strerror(errno));
opts_free(opts);
return NULL;
}
@@ -361,8 +343,7 @@ opts_t opts_parse(int argc, char **argv)
opts->watch_pid = 0;
opts->watch_fd = -1;
/* No syntax check here, already done earlier */
(void) sscanf(optarg, "%u:%d", &(opts->watch_pid),
&(opts->watch_fd));
(void) sscanf(optarg, "%u:%d", &(opts->watch_pid), &(opts->watch_fd));
break;
case 'm':
opts->average_rate_window = pv_getnum_ui(optarg);
@@ -374,13 +355,9 @@ opts_t opts_parse(int argc, char **argv)
#endif /* ENABLE_DEBUGGING */
default:
#ifdef HAVE_GETOPT_LONG
fprintf(stderr,
_("Try `%s --help' for more information."),
opts->program_name);
fprintf(stderr, _("Try `%s --help' for more information."), opts->program_name);
#else
fprintf(stderr,
_("Try `%s -h' for more information."),
opts->program_name);
fprintf(stderr, _("Try `%s -h' for more information."), opts->program_name);
#endif
fprintf(stderr, "\n");
opts_free(opts);
@@ -394,40 +371,35 @@ opts_t opts_parse(int argc, char **argv)
|| (opts->skip_errors > 0) || (opts->buffer_size > 0)
|| (opts->rate_limit > 0)) {
fprintf(stderr, "%s: %s\n", opts->program_name,
_
("cannot use line mode or transfer modifier options when watching file descriptors"));
_("cannot use line mode or transfer modifier options when watching file descriptors"));
opts_free(opts);
return NULL;
}
if (opts->cursor) {
fprintf(stderr, "%s: %s\n", opts->program_name,
_
("cannot use cursor positioning when watching file descriptors"));
_("cannot use cursor positioning when watching file descriptors"));
opts_free(opts);
return NULL;
}
if (0 != opts->remote) {
fprintf(stderr, "%s: %s\n", opts->program_name,
_
("cannot use remote control when watching file descriptors"));
_("cannot use remote control when watching file descriptors"));
opts_free(opts);
return NULL;
}
if (optind < argc) {
fprintf(stderr, "%s: %s\n", opts->program_name,
_
("cannot transfer files when watching file descriptors"));
_("cannot transfer files when watching file descriptors"));
opts_free(opts);
return NULL;
}
#ifndef __APPLE__
if (0 != access("/proc/self/fdinfo", X_OK)) {
fprintf(stderr, "%s: -d: %s\n", opts->program_name,
_
("not available on systems without /proc/self/fdinfo"));
_("not available on systems without /proc/self/fdinfo"));
opts_free(opts);
return NULL;
}
+9 -21
View File
@@ -103,8 +103,7 @@ int pv_remote_set(opts_t opts)
* Check that the remote process exists.
*/
if (kill((pid_t) (opts->remote), 0) != 0) {
fprintf(stderr, "%s: %u: %s\n", opts->program_name,
opts->remote, strerror(errno));
fprintf(stderr, "%s: %u: %s\n", opts->program_name, opts->remote, strerror(errno));
return 1;
}
@@ -148,29 +147,25 @@ int pv_remote_set(opts_t opts)
strncpy(msgbuf.name, opts->name, sizeof(msgbuf.name) - 1);
}
if (opts->format != NULL) {
strncpy(msgbuf.format, opts->format,
sizeof(msgbuf.format) - 1);
strncpy(msgbuf.format, opts->format, sizeof(msgbuf.format) - 1);
}
msgid = remote__msgget();
if (msgid < 0) {
fprintf(stderr, "%s: %s\n", opts->program_name,
strerror(errno));
fprintf(stderr, "%s: %s\n", opts->program_name, strerror(errno));
return 1;
}
memset(&qbuf, 0, sizeof(qbuf));
if (msgctl(msgid, IPC_STAT, &qbuf) < 0) {
fprintf(stderr, "%s: %s\n", opts->program_name,
strerror(errno));
fprintf(stderr, "%s: %s\n", opts->program_name, strerror(errno));
return 1;
}
initial_qnum = qbuf.msg_qnum;
if (msgsnd(msgid, &msgbuf, sizeof(msgbuf) - sizeof(long), 0) != 0) {
fprintf(stderr, "%s: %s\n", opts->program_name,
strerror(errno));
fprintf(stderr, "%s: %s\n", opts->program_name, strerror(errno));
return 1;
}
@@ -206,9 +201,7 @@ int pv_remote_set(opts_t opts)
*/
memset(&qbuf, 0, sizeof(qbuf));
if (msgctl(msgid, IPC_STAT, &qbuf) >= 0) {
(void) msgrcv(msgid, &msgbuf,
sizeof(msgbuf) - sizeof(long),
(long) (opts->remote), IPC_NOWAIT);
(void) msgrcv(msgid, &msgbuf, sizeof(msgbuf) - sizeof(long), (long) (opts->remote), IPC_NOWAIT);
/*
* If this leaves nothing on the queue, remove the
* queue, in case we created one for no reason.
@@ -219,8 +212,7 @@ int pv_remote_set(opts_t opts)
}
}
fprintf(stderr, "%s: %u: %s\n", opts->program_name, opts->remote,
_("message not received"));
fprintf(stderr, "%s: %u: %s\n", opts->program_name, opts->remote, _("message not received"));
return 1;
}
@@ -242,9 +234,7 @@ void pv_remote_check(pvstate_t state)
memset(&msgbuf, 0, sizeof(msgbuf));
got =
msgrcv(remote__msgid, &msgbuf, sizeof(msgbuf) - sizeof(long),
getpid(), IPC_NOWAIT);
got = msgrcv(remote__msgid, &msgbuf, sizeof(msgbuf) - sizeof(long), getpid(), IPC_NOWAIT);
if (got < 0) {
/*
* If our queue had been deleted, re-create it.
@@ -265,9 +255,7 @@ void pv_remote_check(pvstate_t state)
msgbuf.eta, msgbuf.fineta, msgbuf.rate,
msgbuf.average_rate,
msgbuf.bytes, msgbuf.bufpercent,
msgbuf.lastwritten,
'\0' ==
msgbuf.name[0] ? NULL : strdup(msgbuf.name));
msgbuf.lastwritten, '\0' == msgbuf.name[0] ? NULL : strdup(msgbuf.name));
if (msgbuf.rate_limit > 0)
pv_state_rate_limit_set(state, msgbuf.rate_limit);
+15 -37
View File
@@ -82,17 +82,14 @@ static void pv_crs_open_lockfile(pvstate_t state, int fd)
ttydev = ttyname(fd);
if (!ttydev) {
if (!state->force) {
pv_error(state, "%s: %s",
_("failed to get terminal name"),
strerror(errno));
pv_error(state, "%s: %s", _("failed to get terminal name"), strerror(errno));
}
/*
* If we don't know our terminal name, we can neither do IPC
* nor make a lock file, so turn off cursor positioning.
*/
state->cursor = 0;
debug("%s",
"ttyname failed - cursor positioning disabled");
debug("%s", "ttyname failed - cursor positioning disabled");
return;
}
@@ -104,9 +101,7 @@ static void pv_crs_open_lockfile(pvstate_t state, int fd)
memset(state->crs_lock_file, 0, PV_SIZEOF_CRS_LOCK_FILE);
(void) pv_snprintf(state->crs_lock_file,
PV_SIZEOF_CRS_LOCK_FILE,
"%s/pv-%s-%i.lock", tmpdir, basename(ttydev),
(int) geteuid());
PV_SIZEOF_CRS_LOCK_FILE, "%s/pv-%s-%i.lock", tmpdir, basename(ttydev), (int) geteuid());
/*
* Pawel Piatek - not everyone has O_NOFOLLOW, e.g. AIX doesn't
@@ -119,9 +114,7 @@ static void pv_crs_open_lockfile(pvstate_t state, int fd)
state->crs_lock_fd = open(state->crs_lock_file, openflags, 0600);
if (state->crs_lock_fd < 0) {
pv_error(state, "%s: %s: %s",
state->crs_lock_file,
_("failed to open lock file"), strerror(errno));
pv_error(state, "%s: %s: %s", state->crs_lock_file, _("failed to open lock file"), strerror(errno));
state->cursor = 0;
return;
}
@@ -154,17 +147,14 @@ static void pv_crs_lock(pvstate_t state, int fd)
lock_fd = state->crs_lock_fd;
}
} else {
pv_error(state, "%s: %s",
_("lock attempt failed"),
strerror(errno));
pv_error(state, "%s: %s", _("lock attempt failed"), strerror(errno));
return;
}
}
}
if (state->crs_lock_fd >= 0) {
debug("%s: %s", state->crs_lock_file,
"terminal lockfile acquired");
debug("%s: %s", state->crs_lock_file, "terminal lockfile acquired");
} else {
debug("%s", "terminal lock acquired");
}
@@ -192,8 +182,7 @@ static void pv_crs_unlock(pvstate_t state, int fd)
(void) fcntl(lock_fd, F_SETLK, &lock);
if (state->crs_lock_fd >= 0) {
debug("%s: %s", state->crs_lock_file,
"terminal lockfile released");
debug("%s: %s", state->crs_lock_file, "terminal lockfile released");
} else {
debug("%s", "terminal lock released");
}
@@ -269,8 +258,7 @@ static int pv_crs_get_ypos(int terminalfd)
debug
("read answerback message from fd %d, length %d - buf = %02X %02X %02X %02X %02X %02X",
terminalfd, got, cpr[0], cpr[1], cpr[2], cpr[3], cpr[4],
cpr[5]);
terminalfd, got, cpr[0], cpr[1], cpr[2], cpr[3], cpr[4], cpr[5]);
#else /* !CURSOR_ANSWERBACK_BYTE_BY_BYTE */
/* Read answerback in one big lump - may fail on Solaris */
@@ -280,8 +268,7 @@ static int pv_crs_get_ypos(int terminalfd)
} else {
debug
("read answerback message from fd %d, length %d - buf = %02X %02X %02X %02X %02X %02X",
terminalfd, r, cpr[0], cpr[1], cpr[2], cpr[3], cpr[4],
cpr[5]);
terminalfd, r, cpr[0], cpr[1], cpr[2], cpr[3], cpr[4], cpr[5]);
}
#endif /* CURSOR_ANSWERBACK_BYTE_BY_BYTE */
@@ -366,8 +353,7 @@ static int pv_crs_ipcinit(pvstate_t state, char *ttyfile, int terminalfd)
if (state->crs_pvcount > 1) {
state->crs_y_start = *(state->crs_y_top);
state->crs_y_lastread = state->crs_y_start;
debug("%s: %d", "not the first to attach - got top y",
state->crs_y_start);
debug("%s: %d", "not the first to attach - got top y", state->crs_y_start);
}
pv_crs_unlock(state, terminalfd);
@@ -395,18 +381,14 @@ void pv_crs_init(pvstate_t state)
ttyfile = ttyname(STDERR_FILENO);
if (!ttyfile) {
debug("%s: %s",
"disabling cursor positioning because ttyname failed",
strerror(errno));
debug("%s: %s", "disabling cursor positioning because ttyname failed", strerror(errno));
state->cursor = 0;
return;
}
fd = open(ttyfile, O_RDWR);
if (fd < 0) {
pv_error(state, "%s: %s: %s",
_("failed to open terminal"), ttyfile,
strerror(errno));
pv_error(state, "%s: %s: %s", _("failed to open terminal"), ttyfile, strerror(errno));
state->cursor = false;
return;
}
@@ -527,15 +509,12 @@ void pv_crs_update(pvstate_t state, const char *str)
* scroll the screen (only if we're the first `pv'), and then move
* our initial Y co-ordinate up.
*/
if (((state->crs_y_start + state->crs_pvmax) >
(int) (state->height))
if (((state->crs_y_start + state->crs_pvmax) > (int) (state->height))
&& (!state->crs_noipc)
) {
int offs;
offs =
((state->crs_y_start + state->crs_pvmax) -
state->height);
offs = ((state->crs_y_start + state->crs_pvmax) - state->height);
state->crs_y_start -= offs;
if (state->crs_y_start < 1)
@@ -550,8 +529,7 @@ void pv_crs_update(pvstate_t state, const char *str)
pv_crs_lock(state, STDERR_FILENO);
memset(pos, 0, sizeof(pos));
(void) pv_snprintf(pos, sizeof(pos), "\033[%u;1H",
state->height);
(void) pv_snprintf(pos, sizeof(pos), "\033[%u;1H", state->height);
pv_write_retry(STDERR_FILENO, pos, strlen(pos));
for (; offs > 0; offs--) {
pv_write_retry(STDERR_FILENO, "\n", 1);
+94 -218
View File
@@ -64,14 +64,12 @@ bool pv_in_foreground(void)
tty_process_group = tcgetpgrp(STDERR_FILENO);
if (tty_process_group == -1 && errno == ENOTTY) {
debug("%s: true: %s", "pv_in_foreground",
"tty_process_group is -1, errno is ENOTTY");
debug("%s: true: %s", "pv_in_foreground", "tty_process_group is -1, errno is ENOTTY");
return true;
}
if (our_process_group == tty_process_group) {
debug("%s: true: %s", "pv_in_foreground",
"our_process_group == tty_process_group");
debug("%s: true: %s", "pv_in_foreground", "our_process_group == tty_process_group");
return true;
}
@@ -121,8 +119,7 @@ static long pv__calc_percentage(long long so_far, const long long total)
* transfer, and how long it's taken so far in seconds, return the estimated
* number of seconds until completion.
*/
static long pv__calc_eta(const long long so_far, const long long total,
const long rate)
static long pv__calc_eta(const long long so_far, const long long total, const long rate)
{
long long amount_left;
@@ -147,8 +144,7 @@ static long pv__calc_eta(const long long so_far, const long long total,
* modified. Further changed after input from Thomas Rachel; changed still
* further after Debian bug #706175.
*/
static void pv__si_prefix(long double *value, char *prefix,
const long double ratio, int is_bytes)
static void pv__si_prefix(long double *value, char *prefix, const long double ratio, int is_bytes)
{
static char *pfx_000 = NULL; /* kilo, mega, etc */
static char *pfx_024 = NULL; /* kibi, mibi, etc */
@@ -231,8 +227,7 @@ static void pv__si_prefix(long double *value, char *prefix,
* parameter (a %s) which will expand to the string described above.
*/
static void pv__sizestr(char *buffer, int bufsize, char *format,
long double amount, char *suffix_basic,
char *suffix_bytes, int is_bytes)
long double amount, char *suffix_basic, char *suffix_bytes, int is_bytes)
{
char sizestr_buffer[256];
char si_prefix[8];
@@ -261,8 +256,7 @@ static void pv__sizestr(char *buffer, int bufsize, char *format,
/* Fix for display of "1.01e+03" instead of "1010" */
if (display_amount > 99.9) {
(void) pv_snprintf(sizestr_buffer, sizeof(sizestr_buffer),
"%4ld%.2s%.16s", (long) display_amount,
si_prefix, suffix);
"%4ld%.2s%.16s", (long) display_amount, si_prefix, suffix);
} else {
/*
* AIX blows up with %4.3Lg%.2s%.16s for some reason, so we
@@ -270,11 +264,8 @@ static void pv__sizestr(char *buffer, int bufsize, char *format,
*/
char str_disp[64];
/* # to get 13.0GB instead of 13GB (#1477) */
(void) pv_snprintf(str_disp, sizeof(str_disp), "%#4.3Lg",
display_amount);
(void) pv_snprintf(sizestr_buffer, sizeof(sizestr_buffer),
"%s%.2s%.16s", str_disp, si_prefix,
suffix);
(void) pv_snprintf(str_disp, sizeof(str_disp), "%#4.3Lg", display_amount);
(void) pv_snprintf(sizestr_buffer, sizeof(sizestr_buffer), "%s%.2s%.16s", str_disp, si_prefix, suffix);
}
(void) pv_snprintf(buffer, bufsize, format, sizestr_buffer);
@@ -301,18 +292,13 @@ static void pv__format_init(pvstate_t state)
state->str_average_rate[0] = 0;
state->str_progress[0] = 0;
state->str_eta[0] = 0;
memset(state->format, 0,
PV_FORMAT_ARRAY_MAX * sizeof(state->format[0]));
memset(state->format, 0, PV_FORMAT_ARRAY_MAX * sizeof(state->format[0]));
if (state->name) {
(void) pv_snprintf(state->str_name,
PV_SIZEOF_STR_NAME, "%9.500s:",
state->name);
(void) pv_snprintf(state->str_name, PV_SIZEOF_STR_NAME, "%9.500s:", state->name);
}
formatstr =
state->format_string ? state->
format_string : state->default_format;
formatstr = state->format_string ? state->format_string : state->default_format;
state->components_used = 0;
@@ -338,8 +324,7 @@ static void pv__format_init(pvstate_t state)
* these segments together.
*/
segment = 0;
for (strpos = 0; formatstr[strpos] != 0 && segment < 99;
strpos++, segment++) {
for (strpos = 0; formatstr[strpos] != 0 && segment < 99; strpos++, segment++) {
if ('%' == formatstr[strpos]) {
unsigned int num;
strpos++;
@@ -351,92 +336,73 @@ static void pv__format_init(pvstate_t state)
}
switch (formatstr[strpos]) {
case 'p':
state->format[segment].string =
state->str_progress;
state->format[segment].string = state->str_progress;
state->format[segment].length = -1;
state->components_used |=
PV_DISPLAY_PROGRESS;
state->components_used |= PV_DISPLAY_PROGRESS;
break;
case 't':
state->format[segment].string =
state->str_timer;
state->format[segment].string = state->str_timer;
state->format[segment].length = 0;
state->components_used |= PV_DISPLAY_TIMER;
break;
case 'e':
state->format[segment].string =
state->str_eta;
state->format[segment].string = state->str_eta;
state->format[segment].length = 0;
state->components_used |= PV_DISPLAY_ETA;
break;
case 'I':
state->format[segment].string =
state->str_fineta;
state->format[segment].string = state->str_fineta;
state->format[segment].length = 0;
state->components_used |=
PV_DISPLAY_FINETA;
state->components_used |= PV_DISPLAY_FINETA;
break;
case 'A':
state->format[segment].string =
state->str_lastoutput;
state->format[segment].string = state->str_lastoutput;
state->format[segment].length = 0;
if (num > PV_SIZEOF_LASTOUTPUT_BUFFER)
num = PV_SIZEOF_LASTOUTPUT_BUFFER;
if (num < 1)
num = 1;
state->lastoutput_length = num;
state->components_used |=
PV_DISPLAY_OUTPUTBUF;
state->components_used |= PV_DISPLAY_OUTPUTBUF;
break;
case 'r':
state->format[segment].string =
state->str_rate;
state->format[segment].string = state->str_rate;
state->format[segment].length = 0;
state->components_used |= PV_DISPLAY_RATE;
break;
case 'a':
state->format[segment].string =
state->str_average_rate;
state->format[segment].string = state->str_average_rate;
state->format[segment].length = 0;
state->components_used |=
PV_DISPLAY_AVERAGERATE;
state->components_used |= PV_DISPLAY_AVERAGERATE;
break;
case 'b':
state->format[segment].string =
state->str_transferred;
state->format[segment].string = state->str_transferred;
state->format[segment].length = 0;
state->components_used |= PV_DISPLAY_BYTES;
break;
case 'T':
state->format[segment].string =
state->str_bufpercent;
state->format[segment].string = state->str_bufpercent;
state->format[segment].length = 0;
state->components_used |=
PV_DISPLAY_BUFPERCENT;
state->components_used |= PV_DISPLAY_BUFPERCENT;
break;
case 'N':
state->format[segment].string =
state->str_name;
state->format[segment].length =
strlen(state->str_name);
state->format[segment].string = state->str_name;
state->format[segment].length = strlen(state->str_name);
state->components_used |= PV_DISPLAY_NAME;
break;
case '%':
/* %% => % */
state->format[segment].string =
&(formatstr[strpos]);
state->format[segment].string = &(formatstr[strpos]);
state->format[segment].length = 1;
break;
case 0:
/* % at end => just % */
state->format[segment].string =
&(formatstr[--strpos]);
state->format[segment].string = &(formatstr[--strpos]);
state->format[segment].length = 1;
break;
default:
/* %z (unknown) => %z */
state->format[segment].string =
&(formatstr[--strpos]);
state->format[segment].string = &(formatstr[--strpos]);
state->format[segment].length = 2;
strpos++;
break;
@@ -447,11 +413,9 @@ static void pv__format_init(pvstate_t state)
if (NULL == searchptr) {
foundlength = strlen(&(formatstr[strpos]));
} else {
foundlength =
searchptr - &(formatstr[strpos]);
foundlength = searchptr - &(formatstr[strpos]);
}
state->format[segment].string =
&(formatstr[strpos]);
state->format[segment].string = &(formatstr[strpos]);
state->format[segment].length = foundlength;
strpos += foundlength - 1;
}
@@ -471,9 +435,7 @@ static long bound_long(long x, long min, long max)
}
/* Update history and current average rate */
static void update_history_avg_rate(pvstate_t state, long long total_bytes,
long double elapsed_sec,
long double rate)
static void update_history_avg_rate(pvstate_t state, long long total_bytes, long double elapsed_sec, long double rate)
{
int first = state->history_first;
int last = state->history_last;
@@ -509,10 +471,8 @@ static void update_history_avg_rate(pvstate_t state, long long total_bytes,
if (first == last) {
state->current_avg_rate = rate;
} else {
long long bytes = (state->history[last].total_bytes -
state->history[first].total_bytes);
long double sec = (state->history[last].elapsed_sec -
state->history[first].elapsed_sec);
long long bytes = (state->history[last].total_bytes - state->history[first].total_bytes);
long double sec = (state->history[last].elapsed_sec - state->history[first].elapsed_sec);
state->current_avg_rate = bytes / sec;
}
}
@@ -535,9 +495,7 @@ static void update_history_avg_rate(pvstate_t state, long long total_bytes,
* NULL.
*/
static const char *pv__format(pvstate_t state,
long double elapsed_sec,
long long bytes_since_last,
long long total_bytes)
long double elapsed_sec, long long bytes_since_last, long long total_bytes)
{
long double time_since_last, rate, average_rate;
long eta;
@@ -569,9 +527,7 @@ static const char *pv__format(pvstate_t state,
rate = state->prev_rate;
state->prev_trans += bytes_since_last;
} else {
rate =
((long double) bytes_since_last +
state->prev_trans) / time_since_last;
rate = ((long double) bytes_since_last + state->prev_trans) / time_since_last;
state->prev_elapsed_sec = elapsed_sec;
state->prev_trans = 0;
}
@@ -591,9 +547,7 @@ static const char *pv__format(pvstate_t state,
if (elapsed_sec < 0.000001)
elapsed_sec = 0.000001;
average_rate =
(((long double) total_bytes) -
((long double) state->initial_offset)) /
(long double) elapsed_sec;
(((long double) total_bytes) - ((long double) state->initial_offset)) / (long double) elapsed_sec;
rate = average_rate;
}
@@ -610,23 +564,19 @@ static const char *pv__format(pvstate_t state,
state->percentage += 2;
if (state->percentage > 199)
state->percentage = 0;
} else if (state->numeric
|| ((state->components_used & PV_DISPLAY_PROGRESS) !=
0)) {
} else if (state->numeric || ((state->components_used & PV_DISPLAY_PROGRESS) != 0)) {
/*
* If we do know the total size, and we're going to show
* the percentage (numeric mode or a progress bar),
* calculate the percentage completion.
*/
state->percentage =
pv__calc_percentage(total_bytes, state->size);
state->percentage = pv__calc_percentage(total_bytes, state->size);
}
/*
* Reallocate output buffer if width changes.
*/
if (state->display_buffer != NULL
&& state->display_buffer_size < (state->width * 2)) {
if (state->display_buffer != NULL && state->display_buffer_size < (state->width * 2)) {
free(state->display_buffer);
state->display_buffer = NULL;
state->display_buffer_size = 0;
@@ -639,12 +589,9 @@ static const char *pv__format(pvstate_t state,
state->display_buffer_size = (2 * state->width) + 80;
if (state->name)
state->display_buffer_size += strlen(state->name);
state->display_buffer =
malloc(state->display_buffer_size + 16);
state->display_buffer = malloc(state->display_buffer_size + 16);
if (NULL == state->display_buffer) {
pv_error(state, "%s: %s",
_("buffer allocation failed"),
strerror(errno));
pv_error(state, "%s: %s", _("buffer allocation failed"), strerror(errno));
state->exit_status |= 64;
return NULL;
}
@@ -665,29 +612,21 @@ static const char *pv__format(pvstate_t state,
numericprefix[0] = 0;
if ((state->components_used & PV_DISPLAY_TIMER) != 0)
(void) pv_snprintf(numericprefix,
sizeof(numericprefix), "%.4Lf ",
elapsed_sec);
(void) pv_snprintf(numericprefix, sizeof(numericprefix), "%.4Lf ", elapsed_sec);
if ((state->components_used & PV_DISPLAY_BYTES) != 0) {
if (state->bits) {
(void) pv_snprintf(state->display_buffer,
state->display_buffer_size,
"%.99s%lld\n",
numericprefix,
8 * total_bytes);
"%.99s%lld\n", numericprefix, 8 * total_bytes);
} else {
(void) pv_snprintf(state->display_buffer,
state->display_buffer_size,
"%.99s%lld\n",
numericprefix,
total_bytes);
"%.99s%lld\n", numericprefix, total_bytes);
}
} else {
(void) pv_snprintf(state->display_buffer,
state->display_buffer_size,
"%.99s%ld\n", numericprefix,
state->percentage);
state->display_buffer_size, "%.99s%ld\n", numericprefix, state->percentage);
}
return state->display_buffer;
@@ -714,14 +653,11 @@ static const char *pv__format(pvstate_t state,
if ((state->components_used & PV_DISPLAY_BYTES) != 0) {
if (state->bits && !state->linemode) {
pv__sizestr(state->str_transferred,
PV_SIZEOF_STR_TRANSFERRED, "%s",
(long double) total_bytes * 8, "",
_("b"), 1);
PV_SIZEOF_STR_TRANSFERRED, "%s", (long double) total_bytes * 8, "", _("b"), 1);
} else {
pv__sizestr(state->str_transferred,
PV_SIZEOF_STR_TRANSFERRED, "%s",
(long double) total_bytes, "", _("B"),
state->linemode ? 0 : 1);
(long double) total_bytes, "", _("B"), state->linemode ? 0 : 1);
}
}
@@ -732,14 +668,10 @@ static const char *pv__format(pvstate_t state,
PV_SIZEOF_STR_BUFPERCENT,
"{%3ld%%}",
pv__calc_percentage
(state->read_position -
state->write_position,
state->buffer_size));
(state->read_position - state->write_position, state->buffer_size));
#ifdef HAVE_SPLICE
if (state->splice_used)
(void) pv_snprintf(state->str_bufpercent,
PV_SIZEOF_STR_BUFPERCENT,
"{%s}", "----");
(void) pv_snprintf(state->str_bufpercent, PV_SIZEOF_STR_BUFPERCENT, "{%s}", "----");
#endif
}
@@ -763,30 +695,23 @@ static const char *pv__format(pvstate_t state,
"%ld:%02ld:%02ld:%02ld",
((long) elapsed_sec) / 86400,
(((long) elapsed_sec) / 3600) %
24,
(((long) elapsed_sec) / 60) %
60, ((long) elapsed_sec) % 60);
24, (((long) elapsed_sec) / 60) % 60, ((long) elapsed_sec) % 60);
} else {
(void) pv_snprintf(state->str_timer,
PV_SIZEOF_STR_TIMER,
"%ld:%02ld:%02ld",
((long) elapsed_sec) / 3600,
(((long) elapsed_sec) / 60) %
60, ((long) elapsed_sec) % 60);
(((long) elapsed_sec) / 60) % 60, ((long) elapsed_sec) % 60);
}
}
/* Rate - set up the display string. */
if ((state->components_used & PV_DISPLAY_RATE) != 0) {
if (state->bits && !state->linemode) {
pv__sizestr(state->str_rate,
PV_SIZEOF_STR_RATE, "[%s]",
8 * rate, "", _("b/s"), 1);
pv__sizestr(state->str_rate, PV_SIZEOF_STR_RATE, "[%s]", 8 * rate, "", _("b/s"), 1);
} else {
pv__sizestr(state->str_rate,
PV_SIZEOF_STR_RATE, "[%s]", rate,
_("/s"), _("B/s"),
state->linemode ? 0 : 1);
PV_SIZEOF_STR_RATE, "[%s]", rate, _("/s"), _("B/s"), state->linemode ? 0 : 1);
}
}
@@ -794,14 +719,11 @@ static const char *pv__format(pvstate_t state,
if ((state->components_used & PV_DISPLAY_AVERAGERATE) != 0) {
if (state->bits && !state->linemode) {
pv__sizestr(state->str_average_rate,
PV_SIZEOF_STR_AVERAGE_RATE,
"[%s]", 8 * average_rate, "", _("b/s"),
1);
PV_SIZEOF_STR_AVERAGE_RATE, "[%s]", 8 * average_rate, "", _("b/s"), 1);
} else {
pv__sizestr(state->str_average_rate,
PV_SIZEOF_STR_AVERAGE_RATE,
"[%s]", average_rate, _("/s"),
_("B/s"), state->linemode ? 0 : 1);
"[%s]", average_rate, _("/s"), _("B/s"), state->linemode ? 0 : 1);
}
}
@@ -821,8 +743,7 @@ static const char *pv__format(pvstate_t state,
&& (state->size > 0)) {
eta =
pv__calc_eta(total_bytes - state->initial_offset,
state->size - state->initial_offset,
state->current_avg_rate);
state->size - state->initial_offset, state->current_avg_rate);
/*
* Bounds check, so we don't overrun the suffix buffer. This
@@ -838,15 +759,11 @@ static const char *pv__format(pvstate_t state,
(void) pv_snprintf(state->str_eta,
PV_SIZEOF_STR_ETA,
"%.16s %ld:%02ld:%02ld:%02ld",
_("ETA"), eta / 86400,
(eta / 3600) % 24,
(eta / 60) % 60, eta % 60);
_("ETA"), eta / 86400, (eta / 3600) % 24, (eta / 60) % 60, eta % 60);
} else {
(void) pv_snprintf(state->str_eta,
PV_SIZEOF_STR_ETA,
"%.16s %ld:%02ld:%02ld",
_("ETA"), eta / 3600,
(eta / 60) % 60, eta % 60);
"%.16s %ld:%02ld:%02ld", _("ETA"), eta / 3600, (eta / 60) % 60, eta % 60);
}
/*
@@ -855,8 +772,7 @@ static const char *pv__format(pvstate_t state,
*/
if (bytes_since_last < 0) {
unsigned int i;
for (i = 0; i < PV_SIZEOF_STR_ETA
&& state->str_eta[i] != '\0'; i++) {
for (i = 0; i < PV_SIZEOF_STR_ETA && state->str_eta[i] != '\0'; i++) {
state->str_eta[i] = ' ';
}
}
@@ -877,8 +793,7 @@ static const char *pv__format(pvstate_t state,
eta =
pv__calc_eta(total_bytes - state->initial_offset,
state->size - state->initial_offset,
state->current_avg_rate);
state->size - state->initial_offset, state->current_avg_rate);
/*
* Bounds check, so we don't overrun the suffix buffer. This
@@ -907,20 +822,15 @@ static const char *pv__format(pvstate_t state,
* by time functions. */
struct tm time = *time_ptr;
(void) pv_snprintf(state->str_fineta,
PV_SIZEOF_STR_FINETA,
"%.16s ", _("ETA"));
(void) pv_snprintf(state->str_fineta, PV_SIZEOF_STR_FINETA, "%.16s ", _("ETA"));
strftime(state->str_fineta +
strlen(state->str_fineta),
PV_SIZEOF_STR_FINETA - 1 -
strlen(state->str_fineta), time_format,
&time);
PV_SIZEOF_STR_FINETA - 1 - strlen(state->str_fineta), time_format, &time);
}
if (!show_eta) {
unsigned int i;
for (i = 0; i < PV_SIZEOF_STR_FINETA
&& state->str_fineta[i] != '\0'; i++) {
for (i = 0; i < PV_SIZEOF_STR_FINETA && state->str_fineta[i] != '\0'; i++) {
state->str_fineta[i] = ' ';
}
}
@@ -936,11 +846,9 @@ static const char *pv__format(pvstate_t state,
if (state->format[segment].length < 0) {
continue;
} else if (state->format[segment].length > 0) {
static_portion_size +=
state->format[segment].length;
static_portion_size += state->format[segment].length;
} else {
static_portion_size +=
strlen(state->format[segment].string);
static_portion_size += strlen(state->format[segment].string);
}
}
@@ -960,56 +868,39 @@ static const char *pv__format(pvstate_t state,
state->percentage = 0;
if (state->percentage > 100000)
state->percentage = 100000;
(void) pv_snprintf(pct, sizeof(pct), "%2ld%%",
state->percentage);
(void) pv_snprintf(pct, sizeof(pct), "%2ld%%", state->percentage);
available_width =
state->width - static_portion_size -
strlen(pct) - 3;
available_width = state->width - static_portion_size - strlen(pct) - 3;
if (available_width < 0)
available_width = 0;
if (available_width >
(int) (PV_SIZEOF_STR_PROGRESS) - 16)
available_width =
PV_SIZEOF_STR_PROGRESS - 16;
if (available_width > (int) (PV_SIZEOF_STR_PROGRESS) - 16)
available_width = PV_SIZEOF_STR_PROGRESS - 16;
for (i = 0;
i <
(available_width * state->percentage) / 100 -
1; i++) {
for (i = 0; i < (available_width * state->percentage) / 100 - 1; i++) {
if (i < available_width)
pv_strlcat(state->str_progress,
"=",
PV_SIZEOF_STR_PROGRESS);
pv_strlcat(state->str_progress, "=", PV_SIZEOF_STR_PROGRESS);
}
if (i < available_width) {
pv_strlcat(state->str_progress, ">",
PV_SIZEOF_STR_PROGRESS);
pv_strlcat(state->str_progress, ">", PV_SIZEOF_STR_PROGRESS);
i++;
}
for (; i < available_width; i++) {
pv_strlcat(state->str_progress, " ",
PV_SIZEOF_STR_PROGRESS);
pv_strlcat(state->str_progress, " ", PV_SIZEOF_STR_PROGRESS);
}
pv_strlcat(state->str_progress, "] ",
PV_SIZEOF_STR_PROGRESS);
pv_strlcat(state->str_progress, pct,
PV_SIZEOF_STR_PROGRESS);
pv_strlcat(state->str_progress, "] ", PV_SIZEOF_STR_PROGRESS);
pv_strlcat(state->str_progress, pct, PV_SIZEOF_STR_PROGRESS);
} else {
int p = state->percentage;
available_width =
state->width - static_portion_size - 5;
available_width = state->width - static_portion_size - 5;
if (available_width < 0)
available_width = 0;
if (available_width >
(int) (PV_SIZEOF_STR_PROGRESS) - 16)
available_width =
PV_SIZEOF_STR_PROGRESS - 16;
if (available_width > (int) (PV_SIZEOF_STR_PROGRESS) - 16)
available_width = PV_SIZEOF_STR_PROGRESS - 16;
debug("available_width: %d", available_width);
@@ -1017,25 +908,19 @@ static const char *pv__format(pvstate_t state,
p = 200 - p;
for (i = 0; i < (available_width * p) / 100; i++) {
if (i < available_width)
pv_strlcat(state->str_progress,
" ",
PV_SIZEOF_STR_PROGRESS);
pv_strlcat(state->str_progress, " ", PV_SIZEOF_STR_PROGRESS);
}
pv_strlcat(state->str_progress, "<=>",
PV_SIZEOF_STR_PROGRESS);
pv_strlcat(state->str_progress, "<=>", PV_SIZEOF_STR_PROGRESS);
for (; i < available_width; i++) {
pv_strlcat(state->str_progress, " ",
PV_SIZEOF_STR_PROGRESS);
pv_strlcat(state->str_progress, " ", PV_SIZEOF_STR_PROGRESS);
}
pv_strlcat(state->str_progress, "]",
PV_SIZEOF_STR_PROGRESS);
pv_strlcat(state->str_progress, "]", PV_SIZEOF_STR_PROGRESS);
}
/*
* If the progress bar won't fit, drop it.
*/
if (strlen(state->str_progress) + static_portion_size >
state->width)
if (strlen(state->str_progress) + static_portion_size > state->width)
state->str_progress[0] = 0;
}
@@ -1050,8 +935,7 @@ static const char *pv__format(pvstate_t state,
if (state->format[segment].length > 0) {
segment_length = state->format[segment].length;
} else {
segment_length =
strlen(state->format[segment].string);
segment_length = strlen(state->format[segment].string);
}
/* Skip empty segments */
if (segment_length == 0)
@@ -1060,19 +944,14 @@ static const char *pv__format(pvstate_t state,
* Truncate segment if it would make the display string
* overflow the buffer
*/
if (segment_length + display_string_length >
state->display_buffer_size - 2)
segment_length =
state->display_buffer_size -
display_string_length - 2;
if (segment_length + display_string_length > state->display_buffer_size - 2)
segment_length = state->display_buffer_size - display_string_length - 2;
if (segment_length < 1)
break;
/* Skip segment if it would make the display too wide */
if (segment_length + display_string_length >
(int) (state->width))
if (segment_length + display_string_length > (int) (state->width))
break;
strncat(state->display_buffer,
state->format[segment].string, segment_length);
strncat(state->display_buffer, state->format[segment].string, segment_length);
display_string_length += segment_length;
}
@@ -1095,8 +974,7 @@ static const char *pv__format(pvstate_t state,
while (--spaces_to_add >= 0) {
spaces[spaces_to_add] = ' ';
}
pv_strlcat(state->display_buffer, spaces,
state->display_buffer_size);
pv_strlcat(state->display_buffer, spaces, state->display_buffer_size);
}
state->prev_width = state->width;
state->prev_length = output_length;
@@ -1116,8 +994,7 @@ static const char *pv__format(pvstate_t state,
*
* In line mode, "sl" and "tot" are in lines, not bytes.
*/
void pv_display(pvstate_t state, long double esec, long long sl,
long long tot)
void pv_display(pvstate_t state, long double esec, long long sl, long long tot)
{
const char *display;
@@ -1148,8 +1025,7 @@ void pv_display(pvstate_t state, long double esec, long long sl,
}
} else {
if (state->force || pv_in_foreground()) {
pv_write_retry(STDERR_FILENO, display,
strlen(display));
pv_write_retry(STDERR_FILENO, display, strlen(display));
pv_write_retry(STDERR_FILENO, "\r", 1);
state->display_visible = true;
}
+12 -31
View File
@@ -67,11 +67,9 @@ unsigned long long pv_calc_total_size(pvstate_t state)
}
if (rc != 0) {
pv_error(state, "%s: %s",
state->input_files[i], strerror(errno));
pv_error(state, "%s: %s", state->input_files[i], strerror(errno));
for (j = i; j < state->input_file_count - 1; j++) {
state->input_files[j] =
state->input_files[j + 1];
state->input_files[j] = state->input_files[j + 1];
}
state->input_file_count--;
i--;
@@ -93,9 +91,7 @@ unsigned long long pv_calc_total_size(pvstate_t state)
total += lseek(fd, 0, SEEK_END);
close(fd);
} else {
pv_error(state, "%s: %s",
state->input_files[i],
strerror(errno));
pv_error(state, "%s: %s", state->input_files[i], strerror(errno));
state->exit_status |= 2;
}
} else if (S_ISREG(sb.st_mode)) {
@@ -120,9 +116,7 @@ unsigned long long pv_calc_total_size(pvstate_t state)
total = lseek(STDOUT_FILENO, 0, SEEK_END);
if (lseek(STDOUT_FILENO, 0, SEEK_SET) != 0) {
pv_error(state, "%s: %s: %s", "(stdout)",
_
("failed to seek to start of output"),
strerror(errno));
_("failed to seek to start of output"), strerror(errno));
state->exit_status |= 2;
}
/*
@@ -165,8 +159,7 @@ unsigned long long pv_calc_total_size(pvstate_t state)
}
if (fd < 0) {
pv_error(state, "%s: %s", state->input_files[i],
strerror(errno));
pv_error(state, "%s: %s", state->input_files[i], strerror(errno));
total = 0;
state->exit_status |= 2;
return total;
@@ -178,9 +171,7 @@ unsigned long long pv_calc_total_size(pvstate_t state)
numread = read(fd, scanbuf, sizeof(scanbuf));
if (numread < 0) {
pv_error(state, "%s: %s",
state->input_files[i],
strerror(errno));
pv_error(state, "%s: %s", state->input_files[i], strerror(errno));
state->exit_status |= 2;
break;
} else if (0 == numread) {
@@ -216,9 +207,7 @@ int pv_next_file(pvstate_t state, int filenum, int oldfd)
if (oldfd > 0) {
if (close(oldfd)) {
pv_error(state, "%s: %s",
_("failed to close file"),
strerror(errno));
pv_error(state, "%s: %s", _("failed to close file"), strerror(errno));
state->exit_status |= 8;
return -1;
}
@@ -240,26 +229,21 @@ int pv_next_file(pvstate_t state, int filenum, int oldfd)
fd = open(state->input_files[filenum], O_RDONLY);
if (fd < 0) {
pv_error(state, "%s: %s: %s",
_("failed to read file"),
state->input_files[filenum],
strerror(errno));
_("failed to read file"), state->input_files[filenum], strerror(errno));
state->exit_status |= 2;
return -1;
}
}
if (fstat(fd, &isb)) {
pv_error(state, "%s: %s: %s",
_("failed to stat file"),
state->input_files[filenum], strerror(errno));
pv_error(state, "%s: %s: %s", _("failed to stat file"), state->input_files[filenum], strerror(errno));
close(fd);
state->exit_status |= 2;
return -1;
}
if (fstat(STDOUT_FILENO, &osb)) {
pv_error(state, "%s: %s",
_("failed to stat output file"), strerror(errno));
pv_error(state, "%s: %s", _("failed to stat output file"), strerror(errno));
close(fd);
state->exit_status |= 2;
return -1;
@@ -281,9 +265,7 @@ int pv_next_file(pvstate_t state, int filenum, int oldfd)
input_file_is_stdout = 0;
if (input_file_is_stdout) {
pv_error(state, "%s: %s",
_("input file is output file"),
state->input_files[filenum]);
pv_error(state, "%s: %s", _("input file is output file"), state->input_files[filenum]);
close(fd);
state->exit_status |= 4;
return -1;
@@ -297,8 +279,7 @@ int pv_next_file(pvstate_t state, int filenum, int oldfd)
/*
* Set or clear O_DIRECT on the file descriptor.
*/
fcntl(fd, F_SETFL,
(state->direct_io ? O_DIRECT : 0) | fcntl(fd, F_GETFL));
fcntl(fd, F_SETFL, (state->direct_io ? O_DIRECT : 0) | fcntl(fd, F_GETFL));
/*
* We don't clear direct_io_changed here, to avoid race conditions
* that could cause the input and output settings to differ.
+48 -114
View File
@@ -94,12 +94,9 @@ int pv_main_loop(pvstate_t state)
next_update.tv_usec = start_time.tv_usec;
if ((state->delay_start > 0)
&& (state->delay_start > state->interval)) {
pv_timeval_add_usec(&next_update,
(long) (1000000.0 *
state->delay_start));
pv_timeval_add_usec(&next_update, (long) (1000000.0 * state->delay_start));
} else {
pv_timeval_add_usec(&next_update,
(long) (1000000.0 * state->interval));
pv_timeval_add_usec(&next_update, (long) (1000000.0 * state->interval));
}
next_ratecheck.tv_sec = start_time.tv_sec;
@@ -121,9 +118,7 @@ int pv_main_loop(pvstate_t state)
/*
* Set or clear O_DIRECT on the output.
*/
fcntl(STDOUT_FILENO, F_SETFL,
(state->direct_io ? O_DIRECT : 0) | fcntl(STDOUT_FILENO,
F_GETFL));
fcntl(STDOUT_FILENO, F_SETFL, (state->direct_io ? O_DIRECT : 0) | fcntl(STDOUT_FILENO, F_GETFL));
state->direct_io_changed = false;
#endif /* O_DIRECT */
@@ -150,11 +145,9 @@ int pv_main_loop(pvstate_t state)
* Check for remote messages from -R every short while
*/
if ((cur_time.tv_sec > next_remotecheck.tv_sec)
|| (cur_time.tv_sec == next_remotecheck.tv_sec
&& cur_time.tv_usec >= next_remotecheck.tv_usec)) {
|| (cur_time.tv_sec == next_remotecheck.tv_sec && cur_time.tv_usec >= next_remotecheck.tv_usec)) {
pv_remote_check(state);
pv_timeval_add_usec(&next_remotecheck,
REMOTE_INTERVAL);
pv_timeval_add_usec(&next_remotecheck, REMOTE_INTERVAL);
}
if (state->pv_sig_abort)
@@ -163,22 +156,15 @@ int pv_main_loop(pvstate_t state)
if (state->rate_limit > 0) {
gettimeofday(&cur_time, NULL);
if ((cur_time.tv_sec > next_ratecheck.tv_sec)
|| (cur_time.tv_sec == next_ratecheck.tv_sec
&& cur_time.tv_usec >=
next_ratecheck.tv_usec)) {
|| (cur_time.tv_sec == next_ratecheck.tv_sec && cur_time.tv_usec >= next_ratecheck.tv_usec)) {
target +=
((long double) (state->rate_limit)) /
(long double) (1000000 /
RATE_GRANULARITY);
long double burstMax =
((long double) (state->rate_limit *
RATE_BURST_WINDOW));
((long double) (state->rate_limit)) / (long double) (1000000 / RATE_GRANULARITY);
long double burstMax = ((long double) (state->rate_limit * RATE_BURST_WINDOW));
if (target > burstMax) {
target = burstMax;
}
pv_timeval_add_usec(&next_ratecheck,
RATE_GRANULARITY);
pv_timeval_add_usec(&next_ratecheck, RATE_GRANULARITY);
}
cansend = target;
}
@@ -188,8 +174,7 @@ int pv_main_loop(pvstate_t state)
* try to write more than we're allowed to.
*/
if ((0 < state->size) && (state->stop_at_size)) {
if (((long) (state->size) <
(total_written + cansend))
if (((long) (state->size) < (total_written + cansend))
|| ((0 == cansend)
&& (0 == state->rate_limit))) {
cansend = state->size - total_written;
@@ -204,9 +189,7 @@ int pv_main_loop(pvstate_t state)
&& (0 >= cansend) && eof_in && eof_out) {
written = 0;
} else {
written =
pv_transfer(state, fd, &eof_in, &eof_out,
cansend, &lineswritten);
written = pv_transfer(state, fd, &eof_in, &eof_out, cansend, &lineswritten);
}
if (written < 0) {
@@ -286,32 +269,25 @@ int pv_main_loop(pvstate_t state)
next_update.tv_sec = start_time.tv_sec;
next_update.tv_usec = start_time.tv_usec;
pv_timeval_add_usec(&next_update,
(long) (1000000.0 *
state->interval));
pv_timeval_add_usec(&next_update, (long) (1000000.0 * state->interval));
}
if ((cur_time.tv_sec < next_update.tv_sec)
|| (cur_time.tv_sec == next_update.tv_sec
&& cur_time.tv_usec < next_update.tv_usec)) {
|| (cur_time.tv_sec == next_update.tv_sec && cur_time.tv_usec < next_update.tv_usec)) {
continue;
}
pv_timeval_add_usec(&next_update,
(long) (1000000.0 * state->interval));
pv_timeval_add_usec(&next_update, (long) (1000000.0 * state->interval));
if (next_update.tv_sec < cur_time.tv_sec) {
next_update.tv_sec = cur_time.tv_sec;
next_update.tv_usec = cur_time.tv_usec;
} else if (next_update.tv_sec == cur_time.tv_sec
&& next_update.tv_usec < cur_time.tv_usec) {
} else if (next_update.tv_sec == cur_time.tv_sec && next_update.tv_usec < cur_time.tv_usec) {
next_update.tv_usec = cur_time.tv_usec;
}
init_time.tv_sec =
start_time.tv_sec + state->pv_sig_toffset.tv_sec;
init_time.tv_usec =
start_time.tv_usec + state->pv_sig_toffset.tv_usec;
init_time.tv_sec = start_time.tv_sec + state->pv_sig_toffset.tv_sec;
init_time.tv_usec = start_time.tv_usec + state->pv_sig_toffset.tv_usec;
if (init_time.tv_usec >= 1000000) {
init_time.tv_sec++;
init_time.tv_usec -= 1000000;
@@ -322,8 +298,7 @@ int pv_main_loop(pvstate_t state)
}
elapsed = cur_time.tv_sec - init_time.tv_sec;
elapsed +=
(cur_time.tv_usec - init_time.tv_usec) / 1000000.0;
elapsed += (cur_time.tv_usec - init_time.tv_usec) / 1000000.0;
if (final_update)
since_last = -1;
@@ -404,8 +379,7 @@ int pv_watchfd_loop(pvstate_t state)
next_update.tv_sec = info.start_time.tv_sec;
next_update.tv_usec = info.start_time.tv_usec;
pv_timeval_add_usec(&next_update,
(long) (1000000.0 * state->interval));
pv_timeval_add_usec(&next_update, (long) (1000000.0 * state->interval));
next_remotecheck.tv_sec = info.start_time.tv_sec;
next_remotecheck.tv_usec = info.start_time.tv_usec;
@@ -420,11 +394,9 @@ int pv_watchfd_loop(pvstate_t state)
* Check for remote messages from -R every short while
*/
if ((cur_time.tv_sec > next_remotecheck.tv_sec)
|| (cur_time.tv_sec == next_remotecheck.tv_sec
&& cur_time.tv_usec >= next_remotecheck.tv_usec)) {
|| (cur_time.tv_sec == next_remotecheck.tv_sec && cur_time.tv_usec >= next_remotecheck.tv_usec)) {
pv_remote_check(state);
pv_timeval_add_usec(&next_remotecheck,
REMOTE_INTERVAL);
pv_timeval_add_usec(&next_remotecheck, REMOTE_INTERVAL);
}
if (state->pv_sig_abort)
@@ -451,8 +423,7 @@ int pv_watchfd_loop(pvstate_t state)
}
if ((cur_time.tv_sec < next_update.tv_sec)
|| (cur_time.tv_sec == next_update.tv_sec
&& cur_time.tv_usec < next_update.tv_usec)) {
|| (cur_time.tv_sec == next_update.tv_sec && cur_time.tv_usec < next_update.tv_usec)) {
struct timeval tv;
tv.tv_sec = 0;
tv.tv_usec = 50000;
@@ -460,22 +431,17 @@ int pv_watchfd_loop(pvstate_t state)
continue;
}
pv_timeval_add_usec(&next_update,
(long) (1000000.0 * state->interval));
pv_timeval_add_usec(&next_update, (long) (1000000.0 * state->interval));
if (next_update.tv_sec < cur_time.tv_sec) {
next_update.tv_sec = cur_time.tv_sec;
next_update.tv_usec = cur_time.tv_usec;
} else if (next_update.tv_sec == cur_time.tv_sec
&& next_update.tv_usec < cur_time.tv_usec) {
} else if (next_update.tv_sec == cur_time.tv_sec && next_update.tv_usec < cur_time.tv_usec) {
next_update.tv_usec = cur_time.tv_usec;
}
init_time.tv_sec =
info.start_time.tv_sec + state->pv_sig_toffset.tv_sec;
init_time.tv_usec =
info.start_time.tv_usec +
state->pv_sig_toffset.tv_usec;
init_time.tv_sec = info.start_time.tv_sec + state->pv_sig_toffset.tv_sec;
init_time.tv_usec = info.start_time.tv_usec + state->pv_sig_toffset.tv_usec;
if (init_time.tv_usec >= 1000000) {
init_time.tv_sec++;
init_time.tv_usec -= 1000000;
@@ -486,8 +452,7 @@ int pv_watchfd_loop(pvstate_t state)
}
elapsed = cur_time.tv_sec - init_time.tv_sec;
elapsed +=
(cur_time.tv_usec - init_time.tv_usec) / 1000000.0;
elapsed += (cur_time.tv_usec - init_time.tv_usec) / 1000000.0;
if (ended)
since_last = -1;
@@ -538,8 +503,7 @@ int pv_watchpid_loop(pvstate_t state)
* it's not there at the start.
*/
if (kill(state->watch_pid, 0) != 0) {
pv_error(state, "%s %u: %s",
_("pid"), state->watch_pid, strerror(errno));
pv_error(state, "%s %u: %s", _("pid"), state->watch_pid, strerror(errno));
state->exit_status |= 2;
return 2;
}
@@ -554,23 +518,15 @@ int pv_watchpid_loop(pvstate_t state)
* Make sure there's a format string, and then insert %N into it if
* it's not present.
*/
original_format_string =
state->format_string ? state->
format_string : state->default_format;
original_format_string = state->format_string ? state->format_string : state->default_format;
if (NULL == strstr(original_format_string, "%N")) {
(void) pv_snprintf(new_format_string,
sizeof(new_format_string), "%%N %s",
original_format_string);
(void) pv_snprintf(new_format_string, sizeof(new_format_string), "%%N %s", original_format_string);
} else {
(void) pv_snprintf(new_format_string,
sizeof(new_format_string), "%s",
original_format_string);
(void) pv_snprintf(new_format_string, sizeof(new_format_string), "%s", original_format_string);
}
new_format_string[sizeof(new_format_string) - 1] = '\0';
state_copy.format_string = NULL;
(void) pv_snprintf(state_copy.default_format,
PV_SIZEOF_DEFAULT_FORMAT,
"%.510s", new_format_string);
(void) pv_snprintf(state_copy.default_format, PV_SIZEOF_DEFAULT_FORMAT, "%.510s", new_format_string);
state_copy.default_format[PV_SIZEOF_DEFAULT_FORMAT - 1] = '\0';
/*
@@ -581,8 +537,7 @@ int pv_watchpid_loop(pvstate_t state)
next_update.tv_sec = cur_time.tv_sec;
next_update.tv_usec = cur_time.tv_usec;
pv_timeval_add_usec(&next_update,
(long) (1000000.0 * state->interval));
pv_timeval_add_usec(&next_update, (long) (1000000.0 * state->interval));
for (idx = 0; idx < FD_SETSIZE; idx++) {
fd_to_idx[idx] = -1;
@@ -600,9 +555,7 @@ int pv_watchpid_loop(pvstate_t state)
if (kill(state->watch_pid, 0) != 0) {
if (first_pass) {
pv_error(state, "%s %u: %s",
_("pid"), state->watch_pid,
strerror(errno));
pv_error(state, "%s %u: %s", _("pid"), state->watch_pid, strerror(errno));
state->exit_status |= 2;
if (NULL != info_array)
free(info_array);
@@ -614,8 +567,7 @@ int pv_watchpid_loop(pvstate_t state)
}
if ((cur_time.tv_sec < next_update.tv_sec)
|| (cur_time.tv_sec == next_update.tv_sec
&& cur_time.tv_usec < next_update.tv_usec)) {
|| (cur_time.tv_sec == next_update.tv_sec && cur_time.tv_usec < next_update.tv_usec)) {
struct timeval tv;
tv.tv_sec = 0;
tv.tv_usec = 50000;
@@ -623,14 +575,12 @@ int pv_watchpid_loop(pvstate_t state)
continue;
}
pv_timeval_add_usec(&next_update,
(long) (1000000.0 * state->interval));
pv_timeval_add_usec(&next_update, (long) (1000000.0 * state->interval));
if (next_update.tv_sec < cur_time.tv_sec) {
next_update.tv_sec = cur_time.tv_sec;
next_update.tv_usec = cur_time.tv_usec;
} else if (next_update.tv_sec == cur_time.tv_sec
&& next_update.tv_usec < cur_time.tv_usec) {
} else if (next_update.tv_sec == cur_time.tv_sec && next_update.tv_usec < cur_time.tv_usec) {
next_update.tv_usec = cur_time.tv_usec;
}
@@ -640,21 +590,16 @@ int pv_watchpid_loop(pvstate_t state)
for (idx = 0; idx < array_length; idx++) {
state_array[idx].width = state->width;
state_array[idx].height = state->height;
pv_watchpid_setname(state,
&(info_array[idx]));
pv_watchpid_setname(state, &(info_array[idx]));
state_array[idx].reparse_display = 1;
}
}
rc = pv_watchpid_scanfds(state, &state_copy,
state->watch_pid, &array_length,
&info_array, &state_array,
fd_to_idx);
state->watch_pid, &array_length, &info_array, &state_array, fd_to_idx);
if (rc != 0) {
if (first_pass) {
pv_error(state, "%s %u: %s",
_("pid"), state->watch_pid,
strerror(errno));
pv_error(state, "%s %u: %s", _("pid"), state->watch_pid, strerror(errno));
state->exit_status |= 2;
if (NULL != info_array)
free(info_array);
@@ -689,8 +634,7 @@ int pv_watchpid_loop(pvstate_t state)
if (pv_watchfd_changed(&(info_array[idx]))) {
fd_to_idx[fd] = -1;
info_array[idx].watch_pid = 0;
debug("%s %d: %s", "fd", fd,
"removing");
debug("%s %d: %s", "fd", fd, "removing");
}
continue;
}
@@ -699,8 +643,7 @@ int pv_watchpid_loop(pvstate_t state)
* Displayable fd - display, or remove if changed
*/
position_now =
pv_watchfd_position(&(info_array[idx]));
position_now = pv_watchfd_position(&(info_array[idx]));
if (position_now < 0) {
fd_to_idx[fd] = -1;
@@ -709,16 +652,11 @@ int pv_watchpid_loop(pvstate_t state)
continue;
}
since_last =
position_now - info_array[idx].position;
since_last = position_now - info_array[idx].position;
info_array[idx].position = position_now;
init_time.tv_sec =
info_array[idx].start_time.tv_sec +
state->pv_sig_toffset.tv_sec;
init_time.tv_usec =
info_array[idx].start_time.tv_usec +
state->pv_sig_toffset.tv_usec;
init_time.tv_sec = info_array[idx].start_time.tv_sec + state->pv_sig_toffset.tv_sec;
init_time.tv_usec = info_array[idx].start_time.tv_usec + state->pv_sig_toffset.tv_usec;
if (init_time.tv_usec >= 1000000) {
init_time.tv_sec++;
init_time.tv_usec -= 1000000;
@@ -729,20 +667,16 @@ int pv_watchpid_loop(pvstate_t state)
}
elapsed = cur_time.tv_sec - init_time.tv_sec;
elapsed +=
(cur_time.tv_usec -
init_time.tv_usec) / 1000000.0;
elapsed += (cur_time.tv_usec - init_time.tv_usec) / 1000000.0;
if (displayed_lines > 0) {
debug("%s", "adding newline");
pv_write_retry(STDERR_FILENO, "\n", 1);
}
debug("%s %d [%d]: %Lf / %Ld / %Ld", "fd", fd, idx,
elapsed, since_last, position_now);
debug("%s %d [%d]: %Lf / %Ld / %Ld", "fd", fd, idx, elapsed, since_last, position_now);
pv_display(&(state_array[idx]), elapsed,
since_last, position_now);
pv_display(&(state_array[idx]), elapsed, since_last, position_now);
displayed_lines++;
}
+1 -2
View File
@@ -52,8 +52,7 @@ unsigned long long pv_getnum_ull(const char *str)
for (; pv__isdigit(str[0]); str++) {
if (decdivisor < 10000) {
decimal = decimal * 10;
decimal +=
(unsigned long long) (str[0] - '0');
decimal += (unsigned long long) (str[0] - '0');
decdivisor = decdivisor * 10;
}
}
+2 -4
View File
@@ -85,10 +85,8 @@ static void pv_sig_cont( __attribute__((unused))
gettimeofday(&tv, NULL);
pv_sig_state->pv_sig_toffset.tv_sec +=
(tv.tv_sec - pv_sig_state->pv_sig_tstp_time.tv_sec);
pv_sig_state->pv_sig_toffset.tv_usec +=
(tv.tv_usec - pv_sig_state->pv_sig_tstp_time.tv_usec);
pv_sig_state->pv_sig_toffset.tv_sec += (tv.tv_sec - pv_sig_state->pv_sig_tstp_time.tv_sec);
pv_sig_state->pv_sig_toffset.tv_usec += (tv.tv_usec - pv_sig_state->pv_sig_tstp_time.tv_usec);
if (pv_sig_state->pv_sig_toffset.tv_usec >= 1000000) {
pv_sig_state->pv_sig_toffset.tv_sec++;
pv_sig_state->pv_sig_toffset.tv_usec -= 1000000;
+5 -11
View File
@@ -24,12 +24,10 @@ static void pv_alloc_history(pvstate_t state)
free(state->history);
state->history = NULL;
state->history =
calloc(state->history_len, sizeof(state->history[0]));
state->history = calloc(state->history_len, sizeof(state->history[0]));
if (NULL == state->history) {
fprintf(stderr, "%s: %s: %s\n", state->program_name,
_("history structure allocation failed"),
strerror(errno));
_("history structure allocation failed"), strerror(errno));
return;
}
@@ -114,9 +112,7 @@ void pv_state_free(pvstate_t state)
void pv_state_set_format(pvstate_t state, bool progress,
bool timer, bool eta,
bool fineta, bool rate,
bool average_rate, bool bytes,
bool bufpercent,
unsigned int lastwritten, const char *name)
bool average_rate, bool bytes, bool bufpercent, unsigned int lastwritten, const char *name)
{
#define PV_ADDFORMAT(x,y) if (x) { \
if (state->default_format[0] != '\0') \
@@ -217,8 +213,7 @@ void pv_state_rate_limit_set(pvstate_t state, unsigned long long val)
state->rate_limit = val;
};
void pv_state_target_buffer_size_set(pvstate_t state,
unsigned long long val)
void pv_state_target_buffer_size_set(pvstate_t state, unsigned long long val)
{
state->target_buffer_size = val;
};
@@ -286,8 +281,7 @@ void pv_state_average_rate_window_set(pvstate_t state, int val)
/*
* Set the array of input files.
*/
void pv_state_inputfiles(pvstate_t state, int input_file_count,
const char **input_files)
void pv_state_inputfiles(pvstate_t state, int input_file_count, const char **input_files)
{
state->input_file_count = input_file_count;
state->input_files = input_files;
+1 -2
View File
@@ -87,8 +87,7 @@ size_t pv_strlcat(char *dst, const char *src, size_t dstsize)
available = dstsize - dstlen;
if (available > 1)
(void) pv_snprintf(dst + dstlen, available, "%.*s",
available - 1, src);
(void) pv_snprintf(dst + dstlen, available, "%.*s", available - 1, src);
return dstlen + srclen;
#endif
+51 -141
View File
@@ -48,10 +48,7 @@ static ssize_t pv__transfer_read_repeated(int fd, void *buf, size_t count)
struct timeval now;
long elapsed_usec;
nread =
read(fd, buf,
count >
MAX_READ_AT_ONCE ? MAX_READ_AT_ONCE : count);
nread = read(fd, buf, count > MAX_READ_AT_ONCE ? MAX_READ_AT_ONCE : count);
if (nread < 0)
return nread;
@@ -63,13 +60,10 @@ static ssize_t pv__transfer_read_repeated(int fd, void *buf, size_t count)
return total_read;
gettimeofday(&now, NULL);
elapsed_usec =
1000000 * (now.tv_sec - start_time.tv_sec) +
(now.tv_usec - start_time.tv_usec);
elapsed_usec = 1000000 * (now.tv_sec - start_time.tv_sec) + (now.tv_usec - start_time.tv_usec);
if (elapsed_usec > TRANSFER_READ_TIMEOUT) {
debug("%s %d: %s (%ld %s)", "fd", fd,
"stopping read - timer expired",
elapsed_usec, "usec elapsed");
"stopping read - timer expired", elapsed_usec, "usec elapsed");
return total_read;
}
@@ -83,8 +77,7 @@ static ssize_t pv__transfer_read_repeated(int fd, void *buf, size_t count)
FD_SET(fd, &readfds);
debug("%s %d: %s (%ld %s, %ld %s)", "fd", fd,
"trying another read after partial buffer fill",
nread, "read", count, "remaining");
"trying another read after partial buffer fill", nread, "read", count, "remaining");
if (select(fd + 1, &readfds, NULL, NULL, &tv) < 1)
break;
@@ -108,8 +101,7 @@ static ssize_t pv__transfer_read_repeated(int fd, void *buf, size_t count)
* We stop retrying if the time elapsed since this function was entered
* reaches TRANSFER_WRITE_TIMEOUT microseconds.
*/
static ssize_t pv__transfer_write_repeated(int fd, void *buf, size_t count,
bool sync_after_write)
static ssize_t pv__transfer_write_repeated(int fd, void *buf, size_t count, bool sync_after_write)
{
struct timeval start_time;
ssize_t total_written;
@@ -124,8 +116,7 @@ static ssize_t pv__transfer_write_repeated(int fd, void *buf, size_t count,
long elapsed_usec;
size_t asked_to_write;
asked_to_write = count >
MAX_WRITE_AT_ONCE ? MAX_WRITE_AT_ONCE : count;
asked_to_write = count > MAX_WRITE_AT_ONCE ? MAX_WRITE_AT_ONCE : count;
nwritten = write(fd, buf, asked_to_write);
@@ -166,13 +157,10 @@ static ssize_t pv__transfer_write_repeated(int fd, void *buf, size_t count,
return total_written;
gettimeofday(&now, NULL);
elapsed_usec =
1000000 * (now.tv_sec - start_time.tv_sec) +
(now.tv_usec - start_time.tv_usec);
elapsed_usec = 1000000 * (now.tv_sec - start_time.tv_sec) + (now.tv_usec - start_time.tv_usec);
if (elapsed_usec > TRANSFER_WRITE_TIMEOUT) {
debug("%s %d: %s (%ld %s)", "fd", fd,
"stopping write - timer expired",
elapsed_usec, "usec elapsed");
"stopping write - timer expired", elapsed_usec, "usec elapsed");
return total_written;
}
@@ -233,9 +221,7 @@ static ssize_t pv__transfer_write_repeated(int fd, void *buf, size_t count,
* sets *eof_in to 1. If all data in the buffer has been written at this
* point, then also sets *eof_out.
*/
static int pv__transfer_read(pvstate_t state, int fd,
int *eof_in, int *eof_out,
unsigned long long allowed)
static int pv__transfer_read(pvstate_t state, int fd, int *eof_in, int *eof_out, unsigned long long allowed)
{
bool do_not_skip_errors;
unsigned long bytes_can_read;
@@ -264,13 +250,11 @@ static int pv__transfer_read(pvstate_t state, int fd,
else
bytes_to_splice = bytes_can_read;
nread = splice(fd, NULL, STDOUT_FILENO, NULL,
bytes_to_splice, SPLICE_F_MORE);
nread = splice(fd, NULL, STDOUT_FILENO, NULL, bytes_to_splice, SPLICE_F_MORE);
state->splice_used = 1;
if ((nread < 0) && (EINVAL == errno)) {
debug("%s %d: %s", "fd", fd,
"splice failed with EINVAL - disabling");
debug("%s %d: %s", "fd", fd, "splice failed with EINVAL - disabling");
state->splice_failed_fd = fd;
state->splice_used = 0;
/*
@@ -304,18 +288,10 @@ static int pv__transfer_read(pvstate_t state, int fd,
}
}
if (0 == state->splice_used) {
nread =
pv__transfer_read_repeated(fd,
state->transfer_buffer +
state->read_position,
bytes_can_read);
nread = pv__transfer_read_repeated(fd, state->transfer_buffer + state->read_position, bytes_can_read);
}
#else
nread =
pv__transfer_read_repeated(fd,
state->transfer_buffer +
state->read_position,
bytes_can_read);
nread = pv__transfer_read_repeated(fd, state->transfer_buffer + state->read_position, bytes_can_read);
#endif /* HAVE_SPLICE */
@@ -360,9 +336,7 @@ static int pv__transfer_read(pvstate_t state, int fd,
*/
if ((EINTR == errno) || (EAGAIN == errno)) {
struct timeval tv;
debug("%s %d: %s: %s", "fd", fd,
"transient error - waiting briefly",
strerror(errno));
debug("%s %d: %s: %s", "fd", fd, "transient error - waiting briefly", strerror(errno));
tv.tv_sec = 0;
tv.tv_usec = 10000;
select(0, NULL, NULL, NULL, &tv);
@@ -382,9 +356,7 @@ static int pv__transfer_read(pvstate_t state, int fd,
* reached the end of this file.
*/
if (do_not_skip_errors) {
pv_error(state, "%s: %s: %s",
state->current_file,
_("read failed"), strerror(errno));
pv_error(state, "%s: %s: %s", state->current_file, _("read failed"), strerror(errno));
*eof_in = 1;
if (state->write_position >= state->read_position) {
*eof_out = 1;
@@ -399,11 +371,7 @@ static int pv__transfer_read(pvstate_t state, int fd,
amount_skipped = -1;
if (!state->read_error_warning_shown) {
pv_error(state, "%s: %s: %s",
state->current_file,
_
("warning: read errors detected"),
strerror(errno));
pv_error(state, "%s: %s: %s", state->current_file, _("warning: read errors detected"), strerror(errno));
state->read_error_warning_shown = 1;
}
@@ -415,9 +383,7 @@ static int pv__transfer_read(pvstate_t state, int fd,
* of the file.
*/
if (0 > orig_offset) {
pv_error(state, "%s: %s: %s",
state->current_file,
_("file is not seekable"), strerror(errno));
pv_error(state, "%s: %s: %s", state->current_file, _("file is not seekable"), strerror(errno));
*eof_in = 1;
if (state->write_position >= state->read_position) {
*eof_out = 1;
@@ -460,8 +426,7 @@ static int pv__transfer_read(pvstate_t state, int fd,
*/
if (skip_offset < 0) {
amount_to_skip = 1;
skip_offset =
lseek(fd, orig_offset + amount_to_skip, SEEK_SET);
skip_offset = lseek(fd, orig_offset + amount_to_skip, SEEK_SET);
}
if (skip_offset < 0) {
@@ -477,11 +442,7 @@ static int pv__transfer_read(pvstate_t state, int fd,
*/
if (EINVAL != errno) {
pv_error(state,
"%s: %s: %s",
state->current_file,
_
("failed to seek past error"),
strerror(errno));
"%s: %s: %s", state->current_file, _("failed to seek past error"), strerror(errno));
}
} else {
amount_skipped = skip_offset - orig_offset;
@@ -492,16 +453,12 @@ static int pv__transfer_read(pvstate_t state, int fd,
* of the transfer buffer, and update the buffer position.
*/
if (amount_skipped > 0) {
memset(state->transfer_buffer +
state->read_position, 0, amount_skipped);
memset(state->transfer_buffer + state->read_position, 0, amount_skipped);
state->read_position += amount_skipped;
if (state->skip_errors < 2) {
pv_error(state, "%s: %s: %ld - %ld (%ld %s)",
state->current_file,
_
("skipped past read error"),
orig_offset,
skip_offset, amount_skipped, _("B"));
_("skipped past read error"), orig_offset, skip_offset, amount_skipped, _("B"));
}
} else {
/*
@@ -530,9 +487,7 @@ static int pv__transfer_read(pvstate_t state, int fd,
* On error, sets *eof_out to 1, sets state->written to -1, and updates
* state->exit_status.
*/
static int pv__transfer_write(pvstate_t state,
int *eof_in, int *eof_out,
long *lineswritten)
static int pv__transfer_write(pvstate_t state, int *eof_in, int *eof_out, long *lineswritten)
{
ssize_t nwritten;
@@ -541,9 +496,7 @@ static int pv__transfer_write(pvstate_t state,
nwritten = pv__transfer_write_repeated(STDOUT_FILENO,
state->transfer_buffer +
state->write_position,
state->to_write,
state->sync_after_write);
state->write_position, state->to_write, state->sync_after_write);
alarm(0);
@@ -565,33 +518,25 @@ static int pv__transfer_write(pvstate_t state,
char *ptr;
long lines = 0;
save =
state->transfer_buffer[state->write_position +
nwritten];
state->transfer_buffer[state->write_position +
nwritten] = 0;
ptr =
(char *) (state->transfer_buffer +
state->write_position - 1);
save = state->transfer_buffer[state->write_position + nwritten];
state->transfer_buffer[state->write_position + nwritten] = 0;
ptr = (char *) (state->transfer_buffer + state->write_position - 1);
if (state->null) {
for (ptr++;
ptr -
(char *) state->transfer_buffer -
state->write_position <
(size_t) nwritten; ptr++) {
state->write_position < (size_t) nwritten; ptr++) {
if (*ptr == '\0')
++lines;
}
} else {
while ((ptr =
strchr((char *) (ptr + 1), '\n')))
while ((ptr = strchr((char *) (ptr + 1), '\n')))
++lines;
}
*lineswritten += lines;
state->transfer_buffer[state->write_position +
nwritten] = save;
state->transfer_buffer[state->write_position + nwritten] = save;
}
state->write_position += nwritten;
@@ -607,20 +552,16 @@ static int pv__transfer_write(pvstate_t state,
new_portion_length = nwritten;
if (new_portion_length > state->lastoutput_length)
new_portion_length =
state->lastoutput_length;
new_portion_length = state->lastoutput_length;
old_portion_length =
state->lastoutput_length - new_portion_length;
old_portion_length = state->lastoutput_length - new_portion_length;
/*
* Make room for the new portion.
*/
if (old_portion_length > 0) {
memmove(state->lastoutput_buffer,
state->lastoutput_buffer +
new_portion_length,
old_portion_length);
state->lastoutput_buffer + new_portion_length, old_portion_length);
}
/*
@@ -628,9 +569,7 @@ static int pv__transfer_write(pvstate_t state,
*/
memcpy(state->lastoutput_buffer +
old_portion_length,
state->transfer_buffer +
state->write_position - new_portion_length,
new_portion_length);
state->transfer_buffer + state->write_position - new_portion_length, new_portion_length);
}
/*
@@ -696,8 +635,7 @@ static int pv__transfer_write(pvstate_t state,
*
* Returns NULL on complete allocation failure.
*/
static unsigned char *pv__allocate_aligned_buffer(int fd,
size_t target_size)
static unsigned char *pv__allocate_aligned_buffer(int fd, size_t target_size)
{
unsigned char *newptr;
@@ -728,9 +666,7 @@ static unsigned char *pv__allocate_aligned_buffer(int fd,
required_alignment = min_alignment;
}
if (0 !=
posix_memalign((void **) (&newptr), required_alignment,
target_size)) {
if (0 != posix_memalign((void **) (&newptr), required_alignment, target_size)) {
newptr = (unsigned char *) malloc(target_size);
}
#else /* ! defined(HAVE_FPATHCONF) && defined(HAVE_POSIX_MEMALIGN) && defined(_PC_REC_XFER_ALIGN) */
@@ -752,8 +688,7 @@ static unsigned char *pv__allocate_aligned_buffer(int fd,
* state->exit_status is updated). In line mode, the number of lines written
* will be put into *lineswritten.
*/
long pv_transfer(pvstate_t state, int fd, int *eof_in, int *eof_out,
unsigned long long allowed, long *lineswritten)
long pv_transfer(pvstate_t state, int fd, int *eof_in, int *eof_out, unsigned long long allowed, long *lineswritten)
{
struct timeval tv;
fd_set readfds;
@@ -771,14 +706,11 @@ long pv_transfer(pvstate_t state, int fd, int *eof_in, int *eof_out,
*/
if (state->direct_io_changed) {
if (!(*eof_in)) {
fcntl(fd, F_SETFL,
(state->direct_io ? O_DIRECT : 0) | fcntl(fd,
F_GETFL));
fcntl(fd, F_SETFL, (state->direct_io ? O_DIRECT : 0) | fcntl(fd, F_GETFL));
}
if (!(*eof_out)) {
fcntl(STDOUT_FILENO, F_SETFL,
(state->direct_io ? O_DIRECT : 0) |
fcntl(STDOUT_FILENO, F_GETFL));
(state->direct_io ? O_DIRECT : 0) | fcntl(STDOUT_FILENO, F_GETFL));
}
state->direct_io_changed = false;
}
@@ -799,14 +731,9 @@ long pv_transfer(pvstate_t state, int fd, int *eof_in, int *eof_out,
* (important if using O_DIRECT).
*/
if (NULL == state->transfer_buffer) {
state->transfer_buffer =
pv__allocate_aligned_buffer(fd,
state->target_buffer_size +
32);
state->transfer_buffer = pv__allocate_aligned_buffer(fd, state->target_buffer_size + 32);
if (NULL == state->transfer_buffer) {
pv_error(state, "%s: %s",
_("buffer allocation failed"),
strerror(errno));
pv_error(state, "%s: %s", _("buffer allocation failed"), strerror(errno));
state->exit_status |= 64;
return -1;
}
@@ -822,10 +749,7 @@ long pv_transfer(pvstate_t state, int fd, int *eof_in, int *eof_out,
*/
if (state->buffer_size < state->target_buffer_size) {
unsigned char *newptr;
newptr =
pv__allocate_aligned_buffer(fd,
state->target_buffer_size +
32);
newptr = pv__allocate_aligned_buffer(fd, state->target_buffer_size + 32);
if (NULL == newptr) {
/*
* Reset target if realloc failed so we don't keep
@@ -834,15 +758,13 @@ long pv_transfer(pvstate_t state, int fd, int *eof_in, int *eof_out,
debug("realloc: %s", strerror(errno));
state->target_buffer_size = state->buffer_size;
} else {
debug("%s: %ld", "buffer resized",
state->buffer_size);
debug("%s: %ld", "buffer resized", state->buffer_size);
/*
* Copy the old buffer contents into the new buffer,
* and free the old one.
*/
if (state->buffer_size > 0)
memcpy(newptr, state->transfer_buffer,
state->buffer_size);
memcpy(newptr, state->transfer_buffer, state->buffer_size);
free(state->transfer_buffer);
state->transfer_buffer = newptr;
state->buffer_size = state->target_buffer_size;
@@ -908,9 +830,7 @@ long pv_transfer(pvstate_t state, int fd, int *eof_in, int *eof_out,
/*
* Any other error is a problem and we must report back.
*/
pv_error(state, "%s: %s: %d: %s",
state->current_file,
_("select call failed"), n, strerror(errno));
pv_error(state, "%s: %s: %d: %s", state->current_file, _("select call failed"), n, strerror(errno));
state->exit_status |= 16;
@@ -926,8 +846,7 @@ long pv_transfer(pvstate_t state, int fd, int *eof_in, int *eof_out,
* NB this can update state->written because of splice().
*/
if (FD_ISSET(fd, &readfds)) {
if (pv__transfer_read
(state, fd, eof_in, eof_out, allowed) == 0)
if (pv__transfer_read(state, fd, eof_in, eof_out, allowed) == 0)
return 0;
}
@@ -943,18 +862,12 @@ long pv_transfer(pvstate_t state, int fd, int *eof_in, int *eof_out,
char *start;
char *end;
save =
state->transfer_buffer[state->write_position +
state->to_write];
state->transfer_buffer[state->write_position +
state->to_write] = 0;
save = state->transfer_buffer[state->write_position + state->to_write];
state->transfer_buffer[state->write_position + state->to_write] = 0;
start =
(char *) (state->transfer_buffer +
state->write_position);
start = (char *) (state->transfer_buffer + state->write_position);
end = strrchr(start, '\n');
state->transfer_buffer[state->write_position +
state->to_write] = save;
state->transfer_buffer[state->write_position + state->to_write] = save;
if (end != NULL) {
state->to_write = (end - start) + 1;
@@ -972,8 +885,7 @@ long pv_transfer(pvstate_t state, int fd, int *eof_in, int *eof_out,
#endif /* HAVE_SPLICE */
&& (state->read_position > state->write_position)
&& (state->to_write > 0)) {
if (pv__transfer_write
(state, eof_in, eof_out, lineswritten) == 0)
if (pv__transfer_write(state, eof_in, eof_out, lineswritten) == 0)
return 0;
}
#ifdef MAXIMISE_BUFFER_FILL
@@ -985,9 +897,7 @@ long pv_transfer(pvstate_t state, int fd, int *eof_in, int *eof_out,
if (state->write_position < state->read_position) {
memmove(state->transfer_buffer,
state->transfer_buffer +
state->write_position,
state->read_position -
state->write_position);
state->write_position, state->read_position - state->write_position);
state->read_position -= state->write_position;
state->write_position = 0;
} else {
+33 -91
View File
@@ -70,9 +70,7 @@ int pv_watchfd_info(pvstate_t state, pvwatchfd_t info, int automatic)
if (kill(info->watch_pid, 0) != 0) {
if (!automatic)
pv_error(state, "%s %u: %s",
_("pid"),
info->watch_pid, strerror(errno));
pv_error(state, "%s %u: %s", _("pid"), info->watch_pid, strerror(errno));
return 1;
}
@@ -82,14 +80,11 @@ int pv_watchfd_info(pvstate_t state, pvwatchfd_t info, int automatic)
PROC_PIDFDVNODEPATHINFO_SIZE);
if (size != PROC_PIDFDVNODEPATHINFO_SIZE) {
pv_error(state, "%s %u: %s %d: %s",
_("pid"),
info->watch_pid,
_("fd"), info->watch_fd, strerror(errno));
_("pid"), info->watch_pid, _("fd"), info->watch_fd, strerror(errno));
return 3;
}
strlcpy(info->file_fdpath, vnodeInfo.pvip.vip_path,
PV_SIZEOF_FILE_FDPATH);
strlcpy(info->file_fdpath, vnodeInfo.pvip.vip_path, PV_SIZEOF_FILE_FDPATH);
info->size = 0;
@@ -97,10 +92,7 @@ int pv_watchfd_info(pvstate_t state, pvwatchfd_t info, int automatic)
if (!automatic)
pv_error(state, "%s %u: %s %d: %s: %s",
_("pid"),
info->watch_pid,
_("fd"),
info->watch_fd, info->file_fdpath,
strerror(errno));
info->watch_pid, _("fd"), info->watch_fd, info->file_fdpath, strerror(errno));
return 3;
}
@@ -109,10 +101,7 @@ int pv_watchfd_info(pvstate_t state, pvwatchfd_t info, int automatic)
pv_error(state, "%s %u: %s %d: %s: %s",
_("pid"),
info->watch_pid,
_("fd"),
info->watch_fd,
info->file_fdpath,
_("not a regular file or block device"));
_("fd"), info->watch_fd, info->file_fdpath, _("not a regular file or block device"));
return 4;
}
@@ -147,27 +136,18 @@ int pv_watchfd_info(pvstate_t state, pvwatchfd_t info, int automatic)
if (kill(info->watch_pid, 0) != 0) {
if (!automatic)
pv_error(state, "%s %u: %s",
_("pid"),
info->watch_pid, strerror(errno));
pv_error(state, "%s %u: %s", _("pid"), info->watch_pid, strerror(errno));
return 1;
}
(void) pv_snprintf(info->file_fdinfo, PV_SIZEOF_FILE_FDINFO,
"/proc/%u/fdinfo/%d", info->watch_pid,
info->watch_fd);
(void) pv_snprintf(info->file_fd, PV_SIZEOF_FILE_FD,
"/proc/%u/fd/%d", info->watch_pid,
info->watch_fd);
"/proc/%u/fdinfo/%d", info->watch_pid, info->watch_fd);
(void) pv_snprintf(info->file_fd, PV_SIZEOF_FILE_FD, "/proc/%u/fd/%d", info->watch_pid, info->watch_fd);
memset(info->file_fdpath, 0, PV_SIZEOF_FILE_FDPATH);
if (readlink
(info->file_fd, info->file_fdpath,
PV_SIZEOF_FILE_FDPATH - 1) < 0) {
if (readlink(info->file_fd, info->file_fdpath, PV_SIZEOF_FILE_FDPATH - 1) < 0) {
if (!automatic)
pv_error(state, "%s %u: %s %d: %s",
_("pid"),
info->watch_pid,
_("fd"), info->watch_fd, strerror(errno));
_("pid"), info->watch_pid, _("fd"), info->watch_fd, strerror(errno));
return 2;
}
@@ -176,10 +156,7 @@ int pv_watchfd_info(pvstate_t state, pvwatchfd_t info, int automatic)
if (!automatic)
pv_error(state, "%s %u: %s %d: %s: %s",
_("pid"),
info->watch_pid,
_("fd"),
info->watch_fd, info->file_fdpath,
strerror(errno));
info->watch_pid, _("fd"), info->watch_fd, info->file_fdpath, strerror(errno));
return 3;
}
@@ -191,10 +168,7 @@ int pv_watchfd_info(pvstate_t state, pvwatchfd_t info, int automatic)
pv_error(state, "%s %u: %s %d: %s: %s",
_("pid"),
info->watch_pid,
_("fd"),
info->watch_fd,
info->file_fdpath,
_("not a regular file or block device"));
_("fd"), info->watch_fd, info->file_fdpath, _("not a regular file or block device"));
return ret;
}
@@ -272,13 +246,11 @@ long long pv_watchfd_position(pvwatchfd_t info)
#ifdef __APPLE__
static int pidfds(pvstate_t state, unsigned int pid,
struct proc_fdinfo **fds, int *count)
static int pidfds(pvstate_t state, unsigned int pid, struct proc_fdinfo **fds, int *count)
{
int size_needed = proc_pidinfo(pid, PROC_PIDLISTFDS, 0, 0, 0);
if (size_needed == -1) {
pv_error(state, "%s: unable to list pid fds: %s", _("pid"),
strerror(errno));
pv_error(state, "%s: unable to list pid fds: %s", _("pid"), strerror(errno));
return -1;
}
@@ -286,8 +258,7 @@ static int pidfds(pvstate_t state, unsigned int pid,
*fds = (struct proc_fdinfo *) malloc(size_needed);
if (*fds == NULL) {
pv_error(state, "%s: alloc failed: %s", _("pid"),
strerror(errno));
pv_error(state, "%s: alloc failed: %s", _("pid"), strerror(errno));
return -1;
}
@@ -306,8 +277,7 @@ static int pidfds(pvstate_t state, unsigned int pid,
*/
int pv_watchpid_scanfds(pvstate_t state, pvstate_t pristine,
unsigned int watch_pid, int *array_length_ptr,
pvwatchfd_t * info_array_ptr,
pvstate_t * state_array_ptr, int *fd_to_idx)
pvwatchfd_t * info_array_ptr, pvstate_t * state_array_ptr, int *fd_to_idx)
{
char fd_dir[512] = { 0, };
int array_length = 0;
@@ -326,8 +296,7 @@ int pv_watchpid_scanfds(pvstate_t state, pvstate_t pristine,
DIR *dptr;
struct dirent *d;
(void) pv_snprintf(fd_dir, sizeof(fd_dir), "/proc/%u/fd",
watch_pid);
(void) pv_snprintf(fd_dir, sizeof(fd_dir), "/proc/%u/fd", watch_pid);
dptr = opendir(fd_dir);
if (NULL == dptr)
@@ -389,14 +358,9 @@ int pv_watchpid_scanfds(pvstate_t state, pvstate_t pristine,
use_idx = array_length - 1;
if (NULL == info_array) {
new_info_array =
malloc(array_length *
sizeof(*info_array));
new_info_array = malloc(array_length * sizeof(*info_array));
} else {
new_info_array =
realloc(info_array,
array_length *
sizeof(*info_array));
new_info_array = realloc(info_array, array_length * sizeof(*info_array));
}
if (NULL == new_info_array)
return 2;
@@ -405,14 +369,9 @@ int pv_watchpid_scanfds(pvstate_t state, pvstate_t pristine,
info_array[use_idx].watch_pid = 0;
if (NULL == state_array) {
new_state_array =
malloc(array_length *
sizeof(*state_array));
new_state_array = malloc(array_length * sizeof(*state_array));
} else {
new_state_array =
realloc(state_array,
array_length *
sizeof(*state_array));
new_state_array = realloc(state_array, array_length * sizeof(*state_array));
}
if (NULL == new_state_array)
return 2;
@@ -421,10 +380,8 @@ int pv_watchpid_scanfds(pvstate_t state, pvstate_t pristine,
*array_length_ptr = array_length;
for (check_idx = 0; check_idx < array_length;
check_idx++) {
state_array[check_idx].name =
info_array[check_idx].display_name;
for (check_idx = 0; check_idx < array_length; check_idx++) {
state_array[check_idx].name = info_array[check_idx].display_name;
state_array[check_idx].reparse_display = 1;
}
}
@@ -434,10 +391,8 @@ int pv_watchpid_scanfds(pvstate_t state, pvstate_t pristine,
/*
* Initialise the details of this new entry.
*/
memcpy(&(state_array[use_idx]), pristine,
sizeof(*pristine));
memset(&(info_array[use_idx]), 0,
sizeof(info_array[use_idx]));
memcpy(&(state_array[use_idx]), pristine, sizeof(*pristine));
memset(&(info_array[use_idx]), 0, sizeof(info_array[use_idx]));
info_array[use_idx].watch_pid = watch_pid;
info_array[use_idx].watch_fd = fd;
@@ -453,9 +408,7 @@ int pv_watchpid_scanfds(pvstate_t state, pvstate_t pristine,
*/
if ((rc != 0) && (rc != 4)) {
info_array[use_idx].watch_pid = 0;
debug("%s %d: %s: %d", "fd", fd,
"lookup failed - marking slot for re-use",
use_idx);
debug("%s %d: %s: %d", "fd", fd, "lookup failed - marking slot for re-use", use_idx);
continue;
}
@@ -466,18 +419,14 @@ int pv_watchpid_scanfds(pvstate_t state, pvstate_t pristine,
* show it.
*/
if (rc != 0) {
debug("%s %d: %s", "fd", fd,
"marking as not displayable");
debug("%s %d: %s", "fd", fd, "marking as not displayable");
info_array[use_idx].watch_fd = -1;
}
state_array[use_idx].size = info_array[use_idx].size;
if (state_array[use_idx].size < 1) {
char *fmt;
while (NULL !=
(fmt =
strstr(state_array[use_idx].default_format,
"%e"))) {
while (NULL != (fmt = strstr(state_array[use_idx].default_format, "%e"))) {
debug("%s", "zero size - removing ETA");
/* strlen-1 here to include trailing NUL */
memmove(fmt, fmt + 2, strlen(fmt) - 1);
@@ -485,8 +434,7 @@ int pv_watchpid_scanfds(pvstate_t state, pvstate_t pristine,
}
}
state_array[use_idx].name =
info_array[use_idx].display_name;
state_array[use_idx].name = info_array[use_idx].display_name;
pv_watchpid_setname(state, &(info_array[use_idx]));
@@ -532,8 +480,7 @@ void pv_watchpid_setname(pvstate_t state, pvwatchfd_t info)
path_length = strlen(info->file_fdpath);
cwd_length = strlen(state->cwd);
if (cwd_length > 0 && path_length > cwd_length) {
if (0 ==
strncmp(info->file_fdpath, state->cwd, cwd_length)) {
if (0 == strncmp(info->file_fdpath, state->cwd, cwd_length)) {
file_fdpath += cwd_length + 1;
path_length -= cwd_length + 1;
}
@@ -542,9 +489,7 @@ void pv_watchpid_setname(pvstate_t state, pvwatchfd_t info)
max_display_length = (state->width / 2) - 6;
if (max_display_length >= path_length) {
(void) pv_snprintf(info->display_name,
PV_SIZEOF_DISPLAY_NAME,
"%4d:%.498s", info->watch_fd,
file_fdpath);
PV_SIZEOF_DISPLAY_NAME, "%4d:%.498s", info->watch_fd, file_fdpath);
} else {
int prefix_length, suffix_length;
@@ -555,13 +500,10 @@ void pv_watchpid_setname(pvstate_t state, pvwatchfd_t info)
PV_SIZEOF_DISPLAY_NAME,
"%4d:%.*s...%.*s",
info->watch_fd, prefix_length,
file_fdpath, suffix_length,
file_fdpath + path_length -
suffix_length);
file_fdpath, suffix_length, file_fdpath + path_length - suffix_length);
}
debug("%s: %d: [%s]", "set name for fd", info->watch_fd,
info->display_name);
debug("%s: %d: [%s]", "set name for fd", info->watch_fd, info->display_name);
}
/* EOF */