Addressed more issues raised by splint.

This commit is contained in:
Andrew Wood
2023-09-07 22:59:19 +01:00
parent e7c332ad0b
commit e8dab7daf7
4 changed files with 84 additions and 15 deletions
+2 -1
View File
@@ -129,7 +129,7 @@ struct pvstate_s {
******************/
const char *program_name; /* program name for error reporting */
char cwd[PV_SIZEOF_CWD]; /* current working directory for relative path */
const char *current_file; /* current file being read */
int current_input_file; /* index of current file being read */
int exit_status; /* exit status to give (0=OK) */
/*******************
@@ -288,6 +288,7 @@ void pv_display(pvstate_t, long double, long long, long long);
long pv_transfer(pvstate_t, int, int *, int *, unsigned long long, long *);
void pv_set_buffer_size(unsigned long long, int);
int pv_next_file(pvstate_t, unsigned int, int);
/*@out@*/ const char *pv_current_file_name(pvstate_t);
void pv_write_retry(int, const char *, size_t);
+72 -7
View File
@@ -19,6 +19,7 @@
#include <fcntl.h>
#include <limits.h>
/*@-type@*/
/* splint has trouble with off_t and mode_t throughout this file. */
@@ -249,7 +250,7 @@ unsigned long long pv_calc_total_size(pvstate_t state)
* error). It is an error if the next input file is the same as the file
* stdout is pointing to.
*
* Updates state->current_file in the process.
* Updates state->current_input_file in the process.
*/
int pv_next_file(pvstate_t state, unsigned int filenum, int oldfd)
{
@@ -320,16 +321,20 @@ int pv_next_file(pvstate_t state, unsigned int filenum, int oldfd)
return -1;
}
state->current_file = state->input_files[filenum];
if (0 == strcmp(state->input_files[filenum], "-")) {
state->current_file = "(stdin)";
}
state->current_input_file = filenum;
#ifdef O_DIRECT
/*
* Set or clear O_DIRECT on the file descriptor.
*/
if (0 != fcntl(fd, F_SETFL, (state->direct_io ? O_DIRECT : 0) | fcntl(fd, F_GETFL))) {
debug("%s: %s: %s", state->current_file, "fcntl", strerror(errno));
/*@-compdef@ */
/*
* splint - passed or returned storage is undefined - but at
* this point we know the input file list is been populated,
* so that's OK.
*/
debug("%s: %s: %s", pv_current_file_name(state), "fcntl", strerror(errno));
/*@+compdef@ */
}
/*
* We don't clear direct_io_changed here, to avoid race conditions
@@ -337,9 +342,69 @@ int pv_next_file(pvstate_t state, unsigned int filenum, int oldfd)
*/
#endif /* O_DIRECT */
debug("%s: %d: %s: fd=%d", "next file opened", filenum, state->current_file, fd);
debug("%s: %d: %s: fd=%d", "next file opened", filenum, pv_current_file_name(state), fd);
return fd;
}
/*
* Return the name of the current file. The returned buffer may point to
* internal state and must not be passed to free() or used after "state" is
* freed.
*/
/*@out@*/ const char *pv_current_file_name(pvstate_t state)
{
static char *str_none = NULL;
static char *str_stdin = NULL;
const char *input_file_name = NULL;
/*@-observertrans@ */
/*@-onlytrans@ */
/*@-statictrans@ */
/*
* Here we are doing bad things with regards to whether the returned
* string is an allocated string from the state->input_files array,
* a constant string, or a returned string from gettext(), but it
* has no impact. We explicitly document, above, that the returned
* string expires with the state, and hence switch off the
* associated splint warnings.
*/
if (NULL == str_none)
str_none = _("(none)");
if (NULL == str_stdin)
str_stdin = _("(stdin)");
/* Fallback in case of translation failure. */
if (NULL == str_none)
str_none = "(none)";
if (NULL == str_stdin)
str_stdin = "(stdin)";
if (state->current_input_file < 0)
return str_none;
if ((unsigned int) (state->current_input_file) >= state->input_file_count)
return str_none;
input_file_name = state->input_files[state->current_input_file];
if (NULL == input_file_name)
return str_none;
if (0 == strcmp(input_file_name, "-"))
return str_stdin;
/*@-compdef@ */
return input_file_name;
/*@+compdef@ */
/*
* splint warns about state->input_files being undefined, but we
* know it's been populated fully by the time this function is
* called.
*/
/*@+statictrans@ */
/*@+onlytrans@ */
/*@+observertrans@ */
}
/* EOF */
+1 -1
View File
@@ -56,7 +56,7 @@ pvstate_t pv_state_alloc(const char *program_name)
state->crs_lock_fd = -1;
state->reparse_display = 1;
state->current_file = _("none");
state->current_input_file = -1;
#ifdef HAVE_SPLICE
state->splice_failed_fd = -1;
#endif /* HAVE_SPLICE */
+9 -6
View File
@@ -367,7 +367,7 @@ static int pv__transfer_read(pvstate_t state, int fd, int *eof_in, int *eof_out,
* 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", pv_current_file_name(state), _("read failed"), strerror(errno));
*eof_in = 1;
if (state->write_position >= state->read_position) {
*eof_out = 1;
@@ -382,7 +382,8 @@ static int pv__transfer_read(pvstate_t state, int fd, int *eof_in, int *eof_out,
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", pv_current_file_name(state), _("warning: read errors detected"),
strerror(errno));
state->read_error_warning_shown = 1;
}
@@ -394,7 +395,7 @@ static int pv__transfer_read(pvstate_t state, int fd, int *eof_in, int *eof_out,
* 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", pv_current_file_name(state), _("file is not seekable"), strerror(errno));
*eof_in = 1;
if (state->write_position >= state->read_position) {
*eof_out = 1;
@@ -462,7 +463,8 @@ static int pv__transfer_read(pvstate_t state, int fd, int *eof_in, int *eof_out,
*/
if (EINVAL != errno) {
pv_error(state,
"%s: %s: %s", state->current_file, _("failed to seek past error"), strerror(errno));
"%s: %s: %s", pv_current_file_name(state), _("failed to seek past error"),
strerror(errno));
}
} else {
amount_skipped = skip_offset - orig_offset;
@@ -477,7 +479,7 @@ static int pv__transfer_read(pvstate_t state, int fd, int *eof_in, int *eof_out,
state->read_position += amount_skipped;
if (state->skip_errors < 2) {
pv_error(state, "%s: %s: %ld - %ld (%ld %s)",
state->current_file,
pv_current_file_name(state),
_("skipped past read error"), orig_offset, skip_offset, amount_skipped, _("B"));
}
} else {
@@ -854,7 +856,8 @@ long pv_transfer(pvstate_t state, int fd, int *eof_in, int *eof_out, unsigned lo
/*
* 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", pv_current_file_name(state), _("select call failed"), n,
strerror(errno));
state->exit_status |= 16;