diff --git a/src/include/pv-internal.h b/src/include/pv-internal.h index 21ea133..c7f547c 100644 --- a/src/include/pv-internal.h +++ b/src/include/pv-internal.h @@ -554,9 +554,6 @@ struct pvdisplay_component_s { bool dynamic; /* whether it can scale with screen size */ }; -void pv_error(char *, ...); -void pv_perror(char *, ...); - int pv_main_loop(pvstate_t); void pv_calculate_transfer_rate(pvtransfercalc_t, readonly_pvtransferstate_t, readonly_pvcontrol_t, readonly_pvdisplay_t, bool); diff --git a/src/include/pv.h b/src/include/pv.h index 131f989..45fc487 100644 --- a/src/include/pv.h +++ b/src/include/pv.h @@ -182,6 +182,17 @@ void pv_nanosleep(long long); */ extern void pv_set_error_prefix(/*@null@ */ const char *); +/* + * Report an error. + */ +extern void pv_error(char *, ...); + +/* + * Report an error, suffixed with the system error message for errno. + */ +extern void pv_perror(char *, ...); + + /* * Create a new state structure, and return it, or 0 (NULL) on error. */ diff --git a/src/main/main.c b/src/main/main.c index 8ba8c0e..7b44b11 100644 --- a/src/main/main.c +++ b/src/main/main.c @@ -60,7 +60,7 @@ static int pv__write_pidfile(opts_t opts) pidfile_tmp_name = malloc(pidfile_tmp_bufsize); if (NULL == pidfile_tmp_name) { - fprintf(stderr, "%s: %s\n", opts->program_name, strerror(errno)); + pv_perror("%s", opts->pidfile); return PV_ERROREXIT_REMOTE_OR_PID; } memset(pidfile_tmp_name, 0, pidfile_tmp_bufsize); @@ -74,7 +74,7 @@ static int pv__write_pidfile(opts_t opts) pidfile_tmp_fd = mkstemp(pidfile_tmp_name); /* flawfinder: ignore */ /*@+unrecog@ */ if (pidfile_tmp_fd < 0) { - fprintf(stderr, "%s: %s: %s\n", opts->program_name, pidfile_tmp_name, strerror(errno)); + pv_perror("%s", pidfile_tmp_name); (void) umask(prev_umask); /* flawfinder: ignore */ free(pidfile_tmp_name); return PV_ERROREXIT_REMOTE_OR_PID; @@ -94,7 +94,7 @@ static int pv__write_pidfile(opts_t opts) pidfile_tmp_fptr = fdopen(pidfile_tmp_fd, "w"); if (NULL == pidfile_tmp_fptr) { - fprintf(stderr, "%s: %s: %s\n", opts->program_name, pidfile_tmp_name, strerror(errno)); + pv_perror("%s", pidfile_tmp_name); (void) close(pidfile_tmp_fd); (void) remove(pidfile_tmp_name); free(pidfile_tmp_name); @@ -103,11 +103,11 @@ static int pv__write_pidfile(opts_t opts) fprintf(pidfile_tmp_fptr, "%d\n", getpid()); if (0 != fclose(pidfile_tmp_fptr)) { - fprintf(stderr, "%s: %s: %s\n", opts->program_name, opts->pidfile, strerror(errno)); + pv_perror("%s", pidfile_tmp_name); } if (rename(pidfile_tmp_name, opts->pidfile) < 0) { - fprintf(stderr, "%s: %s: %s\n", opts->program_name, opts->pidfile, strerror(errno)); + pv_perror("%s", opts->pidfile); (void) remove(pidfile_tmp_name); free(pidfile_tmp_name); return PV_ERROREXIT_REMOTE_OR_PID; @@ -144,7 +144,7 @@ static int pv__set_output(pvstate_t state, opts_t opts, /*@null@ */ const char * * checking that could be done to make this safer. */ if (output_fd < 0) { - fprintf(stderr, "%s: %s: %s\n", opts->program_name, output_file, strerror(errno)); + pv_perror("%s", output_file); return PV_ERROREXIT_ACCESS; } @@ -200,7 +200,7 @@ static int pv__store_and_forward(pvstate_t state, opts_t opts, pvformatoptions_s tmp_fd = mkstemp(tmp_filename); /* flawfinder: ignore */ /*@+unrecog@ */ if (tmp_fd < 0) { - fprintf(stderr, "%s: %s: %s\n", opts->program_name, tmp_filename, strerror(errno)); + pv_perror("%s", tmp_filename); return PV_ERROREXIT_SAF; } (void) close(tmp_fd); @@ -282,7 +282,7 @@ static int pv__store_and_forward(pvstate_t state, opts_t opts, pvformatoptions_s * * As a side effect, "command_fd" is closed. */ -static int pv__run_monitor(const char *program_name, pvstate_t state, pvside_t side, int command_fd, +static int pv__run_monitor(pvstate_t state, pvside_t side, int command_fd, pid_t othermonitor_pid, int othermonitor_read_fd, int othermonitor_write_fd, off_t size, pvformatoptions_s format_options) { @@ -298,7 +298,7 @@ static int pv__run_monitor(const char *program_name, pvstate_t state, pvside_t s /* Replace stdout with the pipe to the command. */ debug("replacing stdout with fd %d", command_fd); if (dup2(command_fd, STDOUT_FILENO) < 0) { - fprintf(stderr, "%s: %s\n", program_name, strerror(errno)); + pv_perror("%s", "dup2"); return PV_ERROREXIT_MONITOR; } break; @@ -306,7 +306,7 @@ static int pv__run_monitor(const char *program_name, pvstate_t state, pvside_t s /* Replace stdin with the pipe from the command. */ debug("replacing stdin with fd %d", command_fd); if (dup2(command_fd, STDIN_FILENO) < 0) { - fprintf(stderr, "%s: %s\n", program_name, strerror(errno)); + pv_perror("%s", "dup2"); return PV_ERROREXIT_MONITOR; } break; @@ -314,7 +314,7 @@ static int pv__run_monitor(const char *program_name, pvstate_t state, pvside_t s /* Close command_fd now it's been duplicated to the appropriate fd. */ if (close(command_fd) < 0) { - fprintf(stderr, "%s: %s\n", program_name, strerror(errno)); + pv_perror("%s", "close"); } /* Copy details of the other monitor into the main state. */ @@ -378,7 +378,7 @@ static int pv__monitor(pvstate_t state, opts_t opts, pvformatoptions_s format_op /* Arguments check. */ if ((NULL == opts->argv) || (opts->argc < 1) || (NULL == opts->argv[0])) { /*@-mustfreefresh@ */ - fprintf(stderr, "%s: -M: %s\n", opts->program_name, _("a command to run must be specified")); + pv_error("-M: %s", _("a command to run must be specified")); return PV_ERROREXIT_MONITOR; /*@+mustfreefresh@ *//* see below about gettext _() calls. */ } @@ -397,7 +397,7 @@ static int pv__monitor(pvstate_t state, opts_t opts, pvformatoptions_s format_op /* Pipe for the input side of the command, if it's to be monitored. */ if ((PV_SIDE_IN == opts->side) || (PV_SIDE_BOTH == opts->side)) { if (0 != pipe(pipefd_cmd_in)) { - fprintf(stderr, "%s: %s\n", opts->program_name, strerror(errno)); + pv_perror("%s", "pipe"); return PV_ERROREXIT_MONITOR; } debug("pipefd_cmd_in[]=(%d,%d)", pipefd_cmd_in[0], pipefd_cmd_in[1]); @@ -406,7 +406,7 @@ static int pv__monitor(pvstate_t state, opts_t opts, pvformatoptions_s format_op /* Pipe for the output side of the command, if it's to be monitored. */ if ((PV_SIDE_OUT == opts->side) || (PV_SIDE_BOTH == opts->side)) { if (0 != pipe(pipefd_cmd_out)) { - fprintf(stderr, "%s: %s\n", opts->program_name, strerror(errno)); + pv_perror("%s", "pipe"); if (-1 != pipefd_cmd_in[0]) (void) close(pipefd_cmd_in[0]); if (-1 != pipefd_cmd_in[1]) @@ -425,7 +425,7 @@ x = 1; \ /* Create a process to run the command. */ command_pid = (pid_t) fork(); if (command_pid < 0) { - fprintf(stderr, "%s: %s\n", opts->program_name, strerror(errno)); + pv_perror("%s", "fork"); close_if_open(pipefd_cmd_in[0]); close_if_open(pipefd_cmd_in[1]); close_if_open(pipefd_cmd_out[0]); @@ -444,7 +444,7 @@ x = 1; \ if (-1 != pipefd_cmd_in[0]) { debug("replacing command stdin with fd %d", pipefd_cmd_in[0]); if (dup2(pipefd_cmd_in[0], STDIN_FILENO) < 0) { - fprintf(stderr, "%s: %s\n", opts->program_name, strerror(errno)); + pv_perror("%s", "dup2"); exit(EXIT_FAILURE); } (void) close(pipefd_cmd_in[0]); @@ -456,7 +456,7 @@ x = 1; \ if (-1 != pipefd_cmd_out[1]) { debug("replacing command stdout with fd %d", pipefd_cmd_out[1]); if (dup2(pipefd_cmd_out[1], STDOUT_FILENO) < 0) { - fprintf(stderr, "%s: %s\n", opts->program_name, strerror(errno)); + pv_perror("%s", "dup2"); exit(EXIT_FAILURE); } (void) close(pipefd_cmd_out[1]); @@ -466,7 +466,7 @@ x = 1; \ /* Execute the command. */ (void) execvp(opts->argv[0], (char *const *) (opts->argv)); /* flawfinder: ignore */ - fprintf(stderr, "%s: %s\n", opts->program_name, strerror(errno)); + pv_perror("%s", "exec"); exit(EXIT_FAILURE); /* @@ -495,7 +495,7 @@ x = 1; \ pipefd_out_to_in[1] = -1; if (PV_SIDE_BOTH == opts->side) { if (0 != pipe(pipefd_in_to_out)) { - fprintf(stderr, "%s: %s\n", opts->program_name, strerror(errno)); + pv_perror("%s", "pipe"); close_if_open(pipefd_cmd_in[1]); close_if_open(pipefd_cmd_out[0]); (void) kill(command_pid, SIGTERM); @@ -503,7 +503,7 @@ x = 1; \ } debug("pipefd_in_to_out[]=(%d,%d)", pipefd_in_to_out[0], pipefd_in_to_out[1]); if (0 != pipe(pipefd_out_to_in)) { - fprintf(stderr, "%s: %s\n", opts->program_name, strerror(errno)); + pv_perror("%s", "pipe"); close_if_open(pipefd_in_to_out[0]); close_if_open(pipefd_in_to_out[1]); close_if_open(pipefd_cmd_in[1]); @@ -524,7 +524,7 @@ x = 1; \ in_monitor_pid = (pid_t) getpid(); out_monitor_pid = (pid_t) fork(); if (out_monitor_pid < 0) { - fprintf(stderr, "%s: %s\n", opts->program_name, strerror(errno)); + pv_perror("%s", "fork"); close_if_open(pipefd_in_to_out[0]); close_if_open(pipefd_in_to_out[1]); close_if_open(pipefd_out_to_in[0]); @@ -546,7 +546,7 @@ x = 1; \ close_if_open(pipefd_out_to_in[0]); retcode = - pv__run_monitor(opts->program_name, state, PV_SIDE_OUT, pipefd_cmd_out[0], in_monitor_pid, + pv__run_monitor(state, PV_SIDE_OUT, pipefd_cmd_out[0], in_monitor_pid, pipefd_in_to_out[0], pipefd_out_to_in[1], opts->size, format_options); /* Close the other ends of the intra-monitor pipes. */ @@ -592,14 +592,14 @@ x = 1; \ /* Close the read end of the "out" pipe. */ close_if_open(pipefd_cmd_out[0]); retcode = - pv__run_monitor(opts->program_name, state, PV_SIDE_IN, pipefd_cmd_in[1], out_monitor_pid, + pv__run_monitor(state, PV_SIDE_IN, pipefd_cmd_in[1], out_monitor_pid, pipefd_out_to_in[0], pipefd_in_to_out[1], opts->size, format_options); break; case PV_SIDE_OUT: /* Close the write end of the "in" pipe. */ close_if_open(pipefd_cmd_in[1]); retcode = - pv__run_monitor(opts->program_name, state, PV_SIDE_OUT, pipefd_cmd_out[0], in_monitor_pid, + pv__run_monitor(state, PV_SIDE_OUT, pipefd_cmd_out[0], in_monitor_pid, pipefd_in_to_out[0], pipefd_out_to_in[1], opts->size, format_options); break; } @@ -610,7 +610,7 @@ x = 1; \ */ if (PV_SIDE_IN == opts->side || PV_SIDE_BOTH == opts->side) { if (close(STDOUT_FILENO) < 0) { - fprintf(stderr, "%s: %s\n", opts->program_name, strerror(errno)); + pv_perror("%s", "close"); } } @@ -672,6 +672,9 @@ int main(int argc, char **argv) #endif #endif + /* Set an initial value for the error message prefix. */ + pv_set_error_prefix(argv[0]); + /* Parse the command line arguments. */ opts = opts_parse(argc >= 0 ? (unsigned int) argc : 0, argv); if (NULL == opts) { @@ -686,12 +689,6 @@ int main(int argc, char **argv) return 0; } - /* Set the error message prefix. */ - /*@-keeptrans@ */ - pv_set_error_prefix(opts->program_name); - /* splint - this function doesn't add an alias or release it. */ - /*@+keeptrans@ */ - /* * Allocate our internal state buffer. */ @@ -704,7 +701,7 @@ int main(int argc, char **argv) * mitigated by the fact that each string is only translated * once. */ - fprintf(stderr, "%s: %s: %s\n", opts->program_name, _("state allocation failed"), strerror(errno)); + pv_perror("%s", _("state allocation failed")); opts_free(opts); debug("%s: %d", "exiting with status", PV_ERROREXIT_MEMORY); pv_set_error_prefix(NULL); @@ -966,7 +963,7 @@ int main(int argc, char **argv) /* Clear up the PID file, if one was written. */ if (opts->pidfile != NULL) { if (0 != remove(opts->pidfile)) { - fprintf(stderr, "%s: %s: %s\n", opts->program_name, opts->pidfile, strerror(errno)); + pv_perror("%s", opts->pidfile); } } diff --git a/src/main/options.c b/src/main/options.c index 4d2ced8..5faa5d5 100644 --- a/src/main/options.c +++ b/src/main/options.c @@ -111,7 +111,7 @@ bool opts_add_file(opts_t opts, const char *filename) opts->argv = realloc(opts->argv, opts->argv_length * sizeof(char *)); /*@+keeptrans@ */ if (NULL == opts->argv) { - fprintf(stderr, "%s: %s\n", opts->program_name, strerror(errno)); + pv_perror("%s", "realloc"); opts->argv_length = 0; opts->argc = 0; return false; @@ -153,7 +153,7 @@ static bool opts_watchfd_add_item(opts_t opts, pid_t pid, int fd) opts->watchfd_fd = realloc(opts->watchfd_fd, opts->watchfd_length * sizeof(int)); /*@+keeptrans@ */ if ((NULL == opts->watchfd_pid) || (NULL == opts->watchfd_fd)) { - fprintf(stderr, "%s: %s\n", opts->program_name, strerror(errno)); + pv_perror("%s", "realloc"); opts->watchfd_length = 0; opts->watchfd_count = 0; return false; @@ -191,7 +191,7 @@ static bool opts_watchfd_processname(opts_t opts, const char *process_name) /* Pipe for communicating with pgrep. */ if (pipe(fds) < 0) { - fprintf(stderr, "%s: %s\n", opts->program_name, strerror(errno)); + pv_perror("%s", "pipe"); return false; } @@ -199,7 +199,7 @@ static bool opts_watchfd_processname(opts_t opts, const char *process_name) pid = (pid_t) fork(); if (pid < 0) { /* Fork failure - error return. */ - fprintf(stderr, "%s: %s\n", opts->program_name, strerror(errno)); + pv_perror("%s", "fork"); (void) close(fds[0]); (void) close(fds[1]); return false; @@ -213,18 +213,18 @@ static bool opts_watchfd_processname(opts_t opts, const char *process_name) nullfd = open("/dev/null", O_RDONLY); /* flawfinder: ignore */ /* flawfinder: /dev/null is trusted. */ if (nullfd < 0) { - fprintf(stderr, "%s: %s: %s\n", opts->program_name, "/dev/null", strerror(errno)); + pv_perror("%s", "/dev/null"); exit(EXIT_FAILURE); } if (dup2(nullfd, STDIN_FILENO) < 0) { - perror("dup2"); + pv_error("%s", "dup2"); exit(EXIT_FAILURE); } (void) close(nullfd); /* Replace stdout with the write end of the pipe. */ if (dup2(fds[1], STDOUT_FILENO) < 0) { - perror("dup2"); + pv_perror("%s", "dup2"); exit(EXIT_FAILURE); } (void) close(fds[1]); @@ -234,7 +234,7 @@ static bool opts_watchfd_processname(opts_t opts, const char *process_name) /* Run pgrep. */ if (execlp("pgrep", "pgrep", process_name, NULL) < 0) { /* flawfinder: ignore */ - perror("pgrep"); + pv_perror("%s", "pgrep"); } /* * flawfinder: deliberately calling pgrep as there isn't a @@ -249,7 +249,7 @@ static bool opts_watchfd_processname(opts_t opts, const char *process_name) /* Open a file stream on the read end of the pipe. */ fptr = fdopen(fds[0], "r"); if (NULL == fptr) { - perror("fdopen"); + pv_perror("%s", "fdopen"); (void) close(fds[0]); return false; } @@ -268,7 +268,7 @@ static bool opts_watchfd_processname(opts_t opts, const char *process_name) /*@+unrecog@ */ if ((line_length < 0) || (NULL == linebuf_ptr)) { if (0 != errno) - perror("getline"); + pv_perror("%s", "getline"); break; } if (line_length < 1) @@ -330,7 +330,7 @@ static bool opts_watchfd_listfile(opts_t opts, const char *filename) * mitigation. */ if (NULL == fptr) { - fprintf(stderr, "%s: -d @: %s: %s\n", opts->program_name, filename, strerror(errno)); + pv_perror("%s", filename); return false; } @@ -348,7 +348,7 @@ static bool opts_watchfd_listfile(opts_t opts, const char *filename) /*@+unrecog@ */ if ((line_length < 0) || (NULL == linebuf_ptr)) { if (0 != errno) - perror("getline"); + pv_perror("%s", filename); break; } @@ -409,8 +409,7 @@ static bool opts_watchfd_parse(opts_t opts, const char *argument, /*@null@ */ co /* Don't allow this syntax in a list file. */ if (NULL != filename) { /*@-mustfreefresh@ *//* see above */ - fprintf(stderr, "%s: -d @: %s:%u: %s\n", - opts->program_name, filename, line, _("list files may not contain @ lines")); + pv_error("%s:%u: %s", filename, line, _("list files may not contain @ lines")); return false; /*@+mustfreefresh@ */ } @@ -430,10 +429,9 @@ static bool opts_watchfd_parse(opts_t opts, const char *argument, /*@null@ */ co if (sscanf(argument, "%u:%d", &parse_pid, &parse_fd) < 1) { /*@-mustfreefresh@ *//* see above */ if (NULL != filename) { - fprintf(stderr, "%s: -d: %s:%u: %s\n", - opts->program_name, filename, line, _("process ID or pid:fd pair expected")); + pv_error("%s:%u: %s: %s", filename, line, argument, _("process ID or pid:fd pair expected")); } else { - fprintf(stderr, "%s: -d: %s\n", opts->program_name, _("process ID or pid:fd pair expected")); + pv_error("%s: %s", argument, _("process ID or pid:fd pair expected")); } return false; /*@+mustfreefresh@ */ @@ -442,10 +440,9 @@ static bool opts_watchfd_parse(opts_t opts, const char *argument, /*@null@ */ co if (parse_pid < 1) { /*@-mustfreefresh@ *//* see above */ if (NULL != filename) { - fprintf(stderr, "%s: -d: %s:%u: %u: %s\n", - opts->program_name, filename, line, parse_pid, _("invalid process ID")); + pv_error("%s:%u: %s: %s", filename, line, argument, _("invalid process ID")); } else { - fprintf(stderr, "%s: -d: %u: %s\n", opts->program_name, parse_pid, _("invalid process ID")); + pv_error("%s: %s", argument, _("invalid process ID")); } return false; /*@+mustfreefresh@ */ @@ -532,8 +529,7 @@ static bool opts_use_size_of_file(opts_t opts, const char *size_file) if (0 != stat_rc) { /*@-mustfreefresh@ *//* see above */ - fprintf(stderr, "%s: %s: %s: %s\n", - opts->program_name, size_file, _("failed to stat file"), strerror(errno)); + pv_perror("%s: %s", size_file, _("failed to stat file")); return false; /*@+mustfreefresh@ */ } @@ -565,7 +561,7 @@ static bool opts_use_size_of_file(opts_t opts, const char *size_file) ); if (rc_nftw < 0) { - fprintf(stderr, "%s: %s: %s\n", opts->program_name, size_file, strerror(errno)); + pv_perror("%s", size_file); return false; } @@ -576,7 +572,7 @@ static bool opts_use_size_of_file(opts_t opts, const char *size_file) /* This was a directory - report an error. */ if (S_ISDIR((mode_t) (sb.st_mode))) { /*@-mustfreefresh@ *//* see above */ - fprintf(stderr, "%s: %s: %s\n", opts->program_name, size_file, _("is a directory")); + pv_error("%s: %s", size_file, _("is a directory")); return false; /*@+mustfreefresh@ */ } @@ -605,8 +601,7 @@ static bool opts_use_size_of_file(opts_t opts, const char *size_file) (sysfs_filename, sizeof(sysfs_filename), "/sys/dev/block/%u:%u/size", major(sb.st_rdev), minor(sb.st_rdev)) < 0) { /*@-mustfreefresh@ *//* see above */ - fprintf(stderr, "%s: %s: %s: %s\n", - opts->program_name, size_file, _("failed to generate sysfs filename"), strerror(errno)); + pv_perror("%s: %s", size_file, _("failed to generate sysfs filename")); return false; /*@+mustfreefresh@ */ } @@ -627,8 +622,7 @@ static bool opts_use_size_of_file(opts_t opts, const char *size_file) /* Read not successful - report the error and return. */ /* NB fclose() comes after the error report, to retain errno. */ /*@-mustfreefresh@ *//* see above */ - fprintf(stderr, "%s: %s: %s: %s\n", - opts->program_name, size_file, _("failed to read sysfs size file"), strerror(errno)); + pv_perror("%s: %s", size_file, _("failed to read sysfs size file")); (void) fclose(sysfs_fptr); return false; /*@+mustfreefresh@ */ @@ -647,8 +641,7 @@ static bool opts_use_size_of_file(opts_t opts, const char *size_file) if (device_fd < 0) { /*@-mustfreefresh@ *//* see above */ - fprintf(stderr, "%s: %s: %s: %s\n", - opts->program_name, size_file, _("failed to open block device"), strerror(errno)); + pv_perror("%s: %s", size_file, _("failed to open block device")); return false; /*@+mustfreefresh@ */ } @@ -657,8 +650,7 @@ static bool opts_use_size_of_file(opts_t opts, const char *size_file) if (device_size < 0) { /*@-mustfreefresh@ *//* see above */ - fprintf(stderr, "%s: %s: %s: %s\n", - opts->program_name, size_file, _("failed to determine size of block device"), strerror(errno)); + pv_perror("%s: %s", size_file, _("failed to determine size of block device")); /* NB close() after reporting error, to preserve errno. */ (void) close(device_fd); return false; @@ -682,6 +674,8 @@ static bool opts_use_size_of_file(opts_t opts, const char *size_file) * Note that the contents of *argv[] (i.e. the command line parameters) * aren't copied anywhere, just the pointers are copied, so make sure the * command line data isn't overwritten or argv[1] free()d or whatever. + * + * Calls pv_set_error_prefix() as a side effect. */ /*@null@ */ /*@only@ */ @@ -763,7 +757,7 @@ opts_t opts_parse(unsigned int argc, char **argv) opts = calloc(1, sizeof(*opts)); if (!opts) { /*@-mustfreefresh@ *//* see above */ - fprintf(stderr, "%s: %s: %s\n", argv[0], _("option structure allocation failed"), strerror(errno)); + pv_perror("%s", _("option structure allocation failed")); return NULL; /*@+mustfreefresh@ */ } @@ -776,12 +770,14 @@ opts_t opts_parse(unsigned int argc, char **argv) opts->program_name = leafptr; } + /* Set the error message prefix to the parsed program name. */ + pv_set_error_prefix(opts->program_name); + opts->argc = 0; opts->argv = calloc((size_t) (argc + 1), sizeof(char *)); if (NULL == opts->argv) { /*@-mustfreefresh@ *//* see above */ - fprintf(stderr, "%s: %s: %s\n", opts->program_name, - _("option structure argv allocation failed"), strerror(errno)); + pv_perror("%s", _("option structure argv allocation failed")); free(opts); /* can't call opts_free as argv is not set */ return NULL; /*@+mustfreefresh@ */ @@ -831,8 +827,7 @@ opts_t opts_parse(unsigned int argc, char **argv) case 'Z': if (!pv_getnum_check(optarg, PV_NUMTYPE_ANY_WITH_SUFFIX)) { /*@-mustfreefresh@ *//* see above */ - fprintf(stderr, "%s: -%c: %s: %s\n", opts->program_name, c, optarg, - _("numeric value not understood")); + pv_error("-%c: %s: %s", c, optarg, _("numeric value not understood")); opts_free(opts); return NULL; /*@+mustfreefresh@ */ @@ -846,8 +841,7 @@ opts_t opts_parse(unsigned int argc, char **argv) case 'm': if (!pv_getnum_check(optarg, PV_NUMTYPE_BARE_INTEGER)) { /*@-mustfreefresh@ *//* see above */ - fprintf(stderr, "%s: -%c: %s: %s\n", opts->program_name, c, optarg, - _("integer argument expected")); + pv_error("-%c: %s: %s", c, optarg, _("integer argument expected")); opts_free(opts); return NULL; /*@+mustfreefresh@ */ @@ -857,8 +851,7 @@ opts_t opts_parse(unsigned int argc, char **argv) case 'D': if (!pv_getnum_check(optarg, PV_NUMTYPE_BARE_DOUBLE)) { /*@-mustfreefresh@ *//* see above */ - fprintf(stderr, "%s: -%c: %s: %s\n", opts->program_name, c, optarg, - _("numeric argument expected")); + pv_error("-%c: %s: %s", c, optarg, _("numeric argument expected")); opts_free(opts); return NULL; /*@+mustfreefresh@ */ @@ -869,8 +862,7 @@ opts_t opts_parse(unsigned int argc, char **argv) /* "-d @FILE" syntax - check FILE exists. */ if (optarg[1] == '\0') { /*@-mustfreefresh@ *//* see above */ - fprintf(stderr, "%s: -%c @: %s\n", - opts->program_name, c, _("missing filename")); + pv_error("-%c @: %s", c, _("missing filename")); opts_free(opts); return NULL; /*@+mustfreefresh@ */ @@ -883,8 +875,7 @@ opts_t opts_parse(unsigned int argc, char **argv) * permissions. */ /*@-mustfreefresh@ *//* see above */ - fprintf(stderr, "%s: -%c @: %s: %s\n", - opts->program_name, c, optarg + 1, strerror(errno)); + pv_perror("-%c @: %s", c, optarg + 1); opts_free(opts); return NULL; /*@+mustfreefresh@ */ @@ -897,8 +888,7 @@ opts_t opts_parse(unsigned int argc, char **argv) */ if (optarg[1] == '\0') { /*@-mustfreefresh@ *//* see above */ - fprintf(stderr, "%s: -%c %c: %s\n", - opts->program_name, c, optarg[0], _("missing process name")); + pv_error("-%c =: %s", c, _("missing process name")); opts_free(opts); return NULL; /*@+mustfreefresh@ */ @@ -909,15 +899,14 @@ opts_t opts_parse(unsigned int argc, char **argv) < 1) { /* "-d PID[:FD]" syntax - check numbers. */ /*@-mustfreefresh@ *//* see above */ - fprintf(stderr, "%s: -%c: %s\n", - opts->program_name, c, _("process ID or pid:fd pair expected")); + pv_error("-%c: %s", c, _("process ID or pid:fd pair expected")); opts_free(opts); return NULL; /*@+mustfreefresh@ */ } if (check_pid < 1) { /*@-mustfreefresh@ *//* see above */ - fprintf(stderr, "%s: -%c: %s\n", opts->program_name, c, _("invalid process ID")); + pv_error("-%c: %s", c, _("invalid process ID")); opts_free(opts); return NULL; /*@+mustfreefresh@ */ @@ -1046,7 +1035,7 @@ opts_t opts_parse(unsigned int argc, char **argv) opts->name1 = opts->name; opts->name = pv_strdup(optarg); if (NULL == opts->name) { - fprintf(stderr, "%s: -N: %s\n", opts->program_name, strerror(errno)); + pv_perror("-%c", c); opts_free(opts); return NULL; } @@ -1054,7 +1043,7 @@ opts_t opts_parse(unsigned int argc, char **argv) case 'u': opts->default_bar_style = pv_strdup(optarg); if (NULL == opts->default_bar_style) { - fprintf(stderr, "%s: -u: %s\n", opts->program_name, strerror(errno)); + pv_perror("-%c", c); opts_free(opts); return NULL; } @@ -1095,7 +1084,7 @@ opts_t opts_parse(unsigned int argc, char **argv) case 'U': opts->store_and_forward_file = pv_strdup(optarg); if (NULL == opts->store_and_forward_file) { - fprintf(stderr, "%s: -U: %s\n", opts->program_name, strerror(errno)); + pv_perror("-%c", c); opts_free(opts); return NULL; } @@ -1112,7 +1101,7 @@ opts_t opts_parse(unsigned int argc, char **argv) case 'P': opts->pidfile = pv_strdup(optarg); if (NULL == opts->pidfile) { - fprintf(stderr, "%s: -P: %s\n", opts->program_name, strerror(errno)); + pv_perror("-%c", c); opts_free(opts); return NULL; } @@ -1121,7 +1110,7 @@ opts_t opts_parse(unsigned int argc, char **argv) opts->format1 = opts->format; opts->format = pv_strdup(optarg); if (NULL == opts->format) { - fprintf(stderr, "%s: -F: %s\n", opts->program_name, strerror(errno)); + pv_perror("-%c", c); opts_free(opts); return NULL; } @@ -1129,7 +1118,7 @@ opts_t opts_parse(unsigned int argc, char **argv) case 'x': opts->extra_display = pv_strdup(optarg); if (NULL == opts->extra_display) { - fprintf(stderr, "%s: -x: %s\n", opts->program_name, strerror(errno)); + pv_perror("-%c", c); opts_free(opts); return NULL; } @@ -1144,7 +1133,7 @@ opts_t opts_parse(unsigned int argc, char **argv) case 'o': opts->output = pv_strdup(optarg); if (NULL == opts->output) { - fprintf(stderr, "%s: -o: %s\n", opts->program_name, strerror(errno)); + pv_perror("-%c", c); opts_free(opts); return NULL; } @@ -1172,8 +1161,7 @@ opts_t opts_parse(unsigned int argc, char **argv) opts->side = PV_SIDE_BOTH; } else { /*@-mustfreefresh@ *//* see above */ - fprintf(stderr, "%s: -M: %s: %s\n", - opts->program_name, optarg, _("invalid side specification")); + pv_error("-M: %s: %s", optarg, _("invalid side specification")); opts_free(opts); return NULL; /*@+mustfreefresh@ */ @@ -1221,8 +1209,8 @@ opts_t opts_parse(unsigned int argc, char **argv) || (opts->skip_errors > 0) || (opts->buffer_size > 0) || (opts->rate_limit > 0)) { /*@-mustfreefresh@ *//* see above */ - fprintf(stderr, "%s: %s\n", opts->program_name, - _("cannot use line mode or transfer modifier options when watching file descriptors")); + pv_error("%s", + _("cannot use line mode or transfer modifier options when watching file descriptors")); opts_free(opts); return NULL; /*@+mustfreefresh@ */ @@ -1230,8 +1218,7 @@ opts_t opts_parse(unsigned int argc, char **argv) if (opts->cursor) { /*@-mustfreefresh@ *//* see above */ - fprintf(stderr, "%s: %s\n", opts->program_name, - _("cannot use cursor positioning when watching file descriptors")); + pv_error("%s", _("cannot use cursor positioning when watching file descriptors")); opts_free(opts); return NULL; /*@+mustfreefresh@ */ @@ -1239,8 +1226,7 @@ opts_t opts_parse(unsigned int argc, char **argv) if (0 != opts->remote) { /*@-mustfreefresh@ *//* see above */ - fprintf(stderr, "%s: %s\n", opts->program_name, - _("cannot use remote control when watching file descriptors")); + pv_error("%s", _("cannot use remote control when watching file descriptors")); opts_free(opts); return NULL; /*@+mustfreefresh@ */ @@ -1248,8 +1234,7 @@ opts_t opts_parse(unsigned int argc, char **argv) if (0 != opts->query) { /*@-mustfreefresh@ *//* see above */ - fprintf(stderr, "%s: %s\n", opts->program_name, - _("cannot use remote query when watching file descriptors")); + pv_error("%s", _("cannot use remote query when watching file descriptors")); opts_free(opts); return NULL; /*@+mustfreefresh@ */ @@ -1257,8 +1242,7 @@ opts_t opts_parse(unsigned int argc, char **argv) if (NULL != opts->output) { /*@-mustfreefresh@ *//* see above */ - fprintf(stderr, "%s: -o: %s\n", opts->program_name, - _("cannot transfer files when watching file descriptors")); + pv_error("-o: %s", _("cannot transfer files when watching file descriptors")); opts_free(opts); return NULL; /*@+mustfreefresh@ */ @@ -1282,8 +1266,7 @@ opts_t opts_parse(unsigned int argc, char **argv) * unlikely to be exploitable. */ /*@-mustfreefresh@ *//* see above */ - fprintf(stderr, "%s: -d: %s\n", opts->program_name, - _("not available on systems without /proc/self/fdinfo")); + pv_error("-d: %s", _("not available on systems without /proc/self/fdinfo")); opts_free(opts); return NULL; /*@+mustfreefresh@ */ @@ -1294,8 +1277,7 @@ opts_t opts_parse(unsigned int argc, char **argv) /* Don't allow -R and -Q together. */ if ((0 != opts->remote) && (0 != opts->query)) { /*@-mustfreefresh@ *//* see above */ - fprintf(stderr, "%s: %s\n", opts->program_name, - _("cannot use remote control and remote query together")); + pv_error("%s", _("cannot use remote control and remote query together")); opts_free(opts); return NULL; /*@+mustfreefresh@ */ @@ -1321,8 +1303,8 @@ opts_t opts_parse(unsigned int argc, char **argv) */ if ((PV_ACTION_MONITOR == opts->action) && ((0 != opts->remote) || (0 != opts->query))) { /*@-mustfreefresh@ *//* see above */ - fprintf(stderr, "%s: %s: %s\n", opts->program_name, 0 != opts->remote ? "-R" : "-Q", - _("monitor mode cannot be specified with this option")); + pv_error("%s: %s", 0 != opts->remote ? "-R" : "-Q", + _("monitor mode cannot be specified with this option")); opts_free(opts); return NULL; /*@+mustfreefresh@ */ @@ -1334,8 +1316,7 @@ opts_t opts_parse(unsigned int argc, char **argv) if ((PV_ACTION_STORE_AND_FORWARD == opts->action && PV_SIDE_NONE != opts->side) || (PV_ACTION_MONITOR == opts->action && NULL != opts->store_and_forward_file)) { /*@-mustfreefresh@ *//* see above */ - fprintf(stderr, "%s: %s\n", opts->program_name, - _("monitor mode cannot be used with store-and-forward")); + pv_error("%s", _("monitor mode cannot be used with store-and-forward")); opts_free(opts); return NULL; /*@+mustfreefresh@ */ @@ -1346,8 +1327,7 @@ opts_t opts_parse(unsigned int argc, char **argv) */ if ((optind < (int) argc) && ((0 != opts->remote) || (0 != opts->query))) { /*@-mustfreefresh@ *//* see above */ - fprintf(stderr, "%s: %s: %s\n", opts->program_name, 0 != opts->remote ? "-R" : "-Q", - _("files cannot be specified with this option")); + pv_error("%s: %s", 0 != opts->remote ? "-R" : "-Q", _("files cannot be specified with this option")); opts_free(opts); return NULL; /*@+mustfreefresh@ */ @@ -1358,7 +1338,7 @@ opts_t opts_parse(unsigned int argc, char **argv) */ if ((PV_ACTION_MONITOR == opts->action) && (optind >= (int) argc)) { /*@-mustfreefresh@ *//* see above */ - fprintf(stderr, "%s: -M: %s\n", opts->program_name, _("a command to run must be specified")); + pv_error("-M: %s", _("a command to run must be specified")); opts_free(opts); return NULL; /*@+mustfreefresh@ */