implement err.h
valgrind reported invalid reads/writes with glibc err[x]|warn[x] (in glibc printf) when stdio had been redirected in between. define _progname (pointing to argv[0])
This commit is contained in:
parent
864267f238
commit
916757cf4c
@ -49,6 +49,8 @@ extern ucontext_t native_isr_context;
|
|||||||
extern ucontext_t end_context;
|
extern ucontext_t end_context;
|
||||||
extern ucontext_t *_native_cur_ctx, *_native_isr_ctx;
|
extern ucontext_t *_native_cur_ctx, *_native_isr_ctx;
|
||||||
|
|
||||||
|
extern const char *_progname;
|
||||||
|
|
||||||
#ifdef MODULE_UART0
|
#ifdef MODULE_UART0
|
||||||
#include <sys/select.h>
|
#include <sys/select.h>
|
||||||
extern fd_set _native_rfds;
|
extern fd_set _native_rfds;
|
||||||
|
|||||||
@ -41,9 +41,9 @@
|
|||||||
#include "tap.h"
|
#include "tap.h"
|
||||||
|
|
||||||
int (*real_printf)(const char *format, ...);
|
int (*real_printf)(const char *format, ...);
|
||||||
char *argv0;
|
|
||||||
int _native_null_in_pipe[2];
|
int _native_null_in_pipe[2];
|
||||||
int _native_null_out_file;
|
int _native_null_out_file;
|
||||||
|
const char *_progname;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* initialize _native_null_in_pipe to allow for reading from stdin
|
* initialize _native_null_in_pipe to allow for reading from stdin
|
||||||
@ -152,7 +152,7 @@ void daemonize()
|
|||||||
|
|
||||||
void usage_exit()
|
void usage_exit()
|
||||||
{
|
{
|
||||||
real_printf("usage: %s", argv0);
|
real_printf("usage: %s", _progname);
|
||||||
|
|
||||||
#ifdef MODULE_NATIVENET
|
#ifdef MODULE_NATIVENET
|
||||||
real_printf(" <tap interface>");
|
real_printf(" <tap interface>");
|
||||||
@ -189,7 +189,7 @@ __attribute__((constructor)) static void startup(int argc, char **argv)
|
|||||||
*(void **)(&real_write) = dlsym(RTLD_NEXT, "write");
|
*(void **)(&real_write) = dlsym(RTLD_NEXT, "write");
|
||||||
*(void **)(&real_printf) = dlsym(RTLD_NEXT, "printf");
|
*(void **)(&real_printf) = dlsym(RTLD_NEXT, "printf");
|
||||||
|
|
||||||
argv0 = argv[0];
|
_progname = argv[0];
|
||||||
int argp = 1;
|
int argp = 1;
|
||||||
char *stderrtype = "stdio";
|
char *stderrtype = "stdio";
|
||||||
char *stdouttype = "stdio";
|
char *stdouttype = "stdio";
|
||||||
|
|||||||
@ -24,6 +24,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <err.h>
|
#include <err.h>
|
||||||
|
#include <errno.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@ -163,3 +164,80 @@ int vprintf(const char *format, va_list argp)
|
|||||||
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void vwarn(const char *fmt, va_list args)
|
||||||
|
{
|
||||||
|
char *m, *e;
|
||||||
|
|
||||||
|
e = strerror(errno);
|
||||||
|
|
||||||
|
if ((m = make_message(fmt, args)) == NULL) {
|
||||||
|
write(STDERR_FILENO, "malloc\n", 7);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
write(STDERR_FILENO, _progname, strlen(_progname));
|
||||||
|
write(STDERR_FILENO, ": ", 2);
|
||||||
|
write(STDERR_FILENO, m, strlen(m));
|
||||||
|
write(STDERR_FILENO, ": ", 2);
|
||||||
|
write(STDERR_FILENO, e, strlen(e));
|
||||||
|
write(STDERR_FILENO, "\n", 1);
|
||||||
|
free(m);
|
||||||
|
}
|
||||||
|
|
||||||
|
void vwarnx(const char *fmt, va_list args)
|
||||||
|
{
|
||||||
|
char *m;
|
||||||
|
|
||||||
|
if ((m = make_message(fmt, args)) == NULL) {
|
||||||
|
write(STDERR_FILENO, "malloc\n", 7);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
write(STDERR_FILENO, _progname, strlen(_progname));
|
||||||
|
write(STDERR_FILENO, ": ", 2);
|
||||||
|
write(STDERR_FILENO, m, strlen(m));
|
||||||
|
write(STDERR_FILENO, "\n", 1);
|
||||||
|
free(m);
|
||||||
|
}
|
||||||
|
|
||||||
|
void verr(int eval, const char *fmt, va_list args)
|
||||||
|
{
|
||||||
|
vwarn(fmt, args);
|
||||||
|
exit(eval);
|
||||||
|
}
|
||||||
|
|
||||||
|
void verrx(int eval, const char *fmt, va_list args)
|
||||||
|
{
|
||||||
|
vwarnx(fmt, args);
|
||||||
|
exit(eval);
|
||||||
|
}
|
||||||
|
|
||||||
|
void warn(const char *fmt, ...)
|
||||||
|
{
|
||||||
|
va_list argp;
|
||||||
|
va_start(argp, fmt);
|
||||||
|
vwarn(fmt, argp);
|
||||||
|
va_end(argp);
|
||||||
|
}
|
||||||
|
|
||||||
|
void warnx(const char *fmt, ...)
|
||||||
|
{
|
||||||
|
va_list argp;
|
||||||
|
va_start(argp, fmt);
|
||||||
|
vwarnx(fmt, argp);
|
||||||
|
va_end(argp);
|
||||||
|
}
|
||||||
|
|
||||||
|
void err(int eval, const char *fmt, ...)
|
||||||
|
{
|
||||||
|
va_list argp;
|
||||||
|
va_start(argp, fmt);
|
||||||
|
verr(eval, fmt, argp);
|
||||||
|
}
|
||||||
|
|
||||||
|
void errx(int eval, const char *fmt, ...)
|
||||||
|
{
|
||||||
|
va_list argp;
|
||||||
|
va_start(argp, fmt);
|
||||||
|
verrx(eval, fmt, argp);
|
||||||
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user