0
0
mirror of https://github.com/darkk/redsocks.git synced 2025-08-25 19:25:30 +00:00

Emit better errors from config file parser

This commit is contained in:
Leonid Evdokimov 2016-03-08 20:14:31 +03:00
parent b322e4a8dd
commit 24a5384e29
7 changed files with 34 additions and 20 deletions

2
base.c
View File

@ -301,7 +301,7 @@ static int base_onexit(parser_section *section)
} }
if (err) if (err)
parser_error(section->context, err); parser_error(section->context, "%s", err);
if (!err) if (!err)
instance.configured = 1; instance.configured = 1;

4
log.c
View File

@ -23,7 +23,7 @@
#include "utils.h" #include "utils.h"
#include "log.h" #include "log.h"
static const char *lowmem = "<Can't print error, not enough memory>"; const char *error_lowmem = "<Can't print error, not enough memory>";
typedef void (*log_func)(const char *file, int line, const char *func, int priority, const char *message, const char *appendix); typedef void (*log_func)(const char *file, int line, const char *func, int priority, const char *message, const char *appendix);
@ -159,7 +159,7 @@ void _log_vwrite(const char *file, int line, const char *func, int do_errno, int
message = (const char*)EVBUFFER_DATA(buff); message = (const char*)EVBUFFER_DATA(buff);
} }
else else
message = lowmem; message = error_lowmem;
log_msg(file, line, func, priority, message, do_errno ? strerror(saved_errno) : NULL); log_msg(file, line, func, priority, message, do_errno ? strerror(saved_errno) : NULL);

2
log.h
View File

@ -8,6 +8,8 @@
#define log_errno(prio, msg...) _log_write(__FILE__, __LINE__, __func__, 1, prio, ## msg) #define log_errno(prio, msg...) _log_write(__FILE__, __LINE__, __func__, 1, prio, ## msg)
#define log_error(prio, msg...) _log_write(__FILE__, __LINE__, __func__, 0, prio, ## msg) #define log_error(prio, msg...) _log_write(__FILE__, __LINE__, __func__, 0, prio, ## msg)
extern const char *error_lowmem;
int log_preopen(const char *dst, bool log_debug, bool log_info); int log_preopen(const char *dst, bool log_debug, bool log_info);
void log_open(); void log_open();

2
main.c
View File

@ -100,7 +100,7 @@ int main(int argc, char **argv)
return EXIT_FAILURE; return EXIT_FAILURE;
} }
parser_context* parser = parser_start(f, NULL); parser_context* parser = parser_start(f);
if (!parser) { if (!parser) {
perror("Not enough memory for parser"); perror("Not enough memory for parser");
return EXIT_FAILURE; return EXIT_FAILURE;

View File

@ -38,7 +38,6 @@ struct parser_context_t {
parser_section *sections; parser_section *sections;
int line; int line;
int error; int error;
parser_errhandler errhandler;
struct { struct {
size_t size; size_t size;
size_t filled; size_t filled;
@ -47,22 +46,33 @@ struct parser_context_t {
}; };
void parser_error(parser_context *context, const char *msg) void parser_error(parser_context *context, const char *fmt, ...)
{ {
context->error = 1; va_list ap;
if (context->errhandler) struct evbuffer *buff = evbuffer_new();
context->errhandler(msg, context->line); const char *msg;
va_start(ap, fmt);
if (buff) {
evbuffer_add_vprintf(buff, fmt, ap);
msg = (const char*)EVBUFFER_DATA(buff);
}
else else
fprintf(stderr, "file parsing error at line %u: %s\n", context->line, msg); msg = error_lowmem;
va_end(ap);
context->error = 1;
fprintf(stderr, "file parsing error at line %u: %s\n", context->line, msg);
if (buff)
evbuffer_free(buff);
} }
parser_context* parser_start(FILE *fd, parser_errhandler errhandler) parser_context* parser_start(FILE *fd)
{ {
parser_context *ret = calloc(1, sizeof(parser_context)); parser_context *ret = calloc(1, sizeof(parser_context));
if (!ret) if (!ret)
return NULL; return NULL;
ret->fd = fd; ret->fd = fd;
ret->errhandler = errhandler;
ret->buffer.size = 128; // should be big enough to fetch whole ``line`` ret->buffer.size = 128; // should be big enough to fetch whole ``line``
ret->buffer.data = malloc(ret->buffer.size); ret->buffer.data = malloc(ret->buffer.size);
if (!ret->buffer.data) { if (!ret->buffer.data) {
@ -322,9 +332,9 @@ static int vp_in_addr(parser_context *context, void *addr, const char *token)
} }
else { else {
if (err == EAI_SYSTEM) if (err == EAI_SYSTEM)
parser_error(context, strerror(errno)); parser_error(context, "unable to resolve %s, error %d (%s)", token, errno, strerror(errno));
else else
parser_error(context, gai_strerror(err)); parser_error(context, "unable to resolve %s, getaddrinfo error %d (%s)", token, err, gai_strerror(err));
return -1; return -1;
} }
} }
@ -533,7 +543,7 @@ int parser_run(parser_context *context)
parser_error(context, "value can't be parsed"); parser_error(context, "value can't be parsed");
} }
else { else {
parser_error(context, "assignment with unknown key"); parser_error(context, "assignment with unknown key <%s>", key_token);
} }
} }
else { else {

View File

@ -38,12 +38,14 @@ struct parser_section_t {
typedef void (*parser_errhandler)(const char *errmsg, int line); parser_context* parser_start(FILE *fd);
parser_context* parser_start(FILE *fd, parser_errhandler errhandler);
void parser_add_section(parser_context *context, parser_section *section); void parser_add_section(parser_context *context, parser_section *section);
int parser_run(parser_context *context); int parser_run(parser_context *context);
void parser_error(parser_context *context, const char *msg); void parser_error(parser_context *context, const char *fmt, ...)
#if defined(__GNUC__)
__attribute__ (( format (printf, 2, 3) ))
#endif
;
void parser_stop(parser_context *context); void parser_stop(parser_context *context);
/* vim:set tabstop=4 softtabstop=4 shiftwidth=4: */ /* vim:set tabstop=4 softtabstop=4 shiftwidth=4: */

View File

@ -187,7 +187,7 @@ static int redsocks_onexit(parser_section *section)
} }
if (err) if (err)
parser_error(section->context, err); parser_error(section->context, "%s", err);
return err ? -1 : 0; return err ? -1 : 0;
} }