* [lm-sensors] [PATCH 6/6] libsensors: Include the config file name
@ 2009-02-11 16:58 Jean Delvare
0 siblings, 0 replies; only message in thread
From: Jean Delvare @ 2009-02-11 16:58 UTC (permalink / raw)
To: lm-sensors
Include the configuration file name when reporting parse errors.
---
doc/libsensors-API.txt | 4 ++++
lib/access.c | 11 +++++++----
lib/conf-parse.y | 4 ++--
lib/conf.h | 1 +
lib/data.c | 11 ++++++++---
lib/error.c | 23 ++++++++++++++++++++++-
lib/error.h | 21 ++++++++++++++++-----
lib/init.c | 6 +++---
8 files changed, 63 insertions(+), 18 deletions(-)
--- lm-sensors.orig/lib/error.c 2009-02-11 14:19:50.000000000 +0100
+++ lm-sensors/lib/error.c 2009-02-11 15:02:17.000000000 +0100
@@ -1,7 +1,7 @@
/*
error.c - Part of libsensors, a Linux library for reading sensor data.
Copyright (c) 1998, 1999 Frodo Looijaard <frodol@dds.nl>
- Copyright (C) 2007, 2008 Jean Delvare <khali@linux-fr.org>
+ Copyright (C) 2007-2009 Jean Delvare <khali@linux-fr.org>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -25,10 +25,14 @@
#include "general.h"
static void sensors_default_parse_error(const char *err, int lineno);
+static void sensors_default_parse_error_wfn(const char *err,
+ const char *filename, int lineno);
static void sensors_default_fatal_error(const char *proc, const char *err);
void (*sensors_parse_error) (const char *err, int lineno) sensors_default_parse_error;
+void (*sensors_parse_error_wfn) (const char *err, const char *filename,
+ int lineno) = sensors_default_parse_error_wfn;
void (*sensors_fatal_error) (const char *proc, const char *err) sensors_default_fatal_error;
@@ -64,6 +68,23 @@ void sensors_default_parse_error(const c
fprintf(stderr, "Error: %s\n", err);
}
+void sensors_default_parse_error_wfn(const char *err,
+ const char *filename, int lineno)
+{
+ /* If application provided a custom parse error reporting function
+ but not the variant with the filename, fall back to the original
+ variant without the filename, for backwards compatibility. */
+ if (sensors_parse_error != sensors_default_parse_error ||
+ !filename)
+ return sensors_parse_error(err, lineno);
+
+ if (lineno)
+ fprintf(stderr, "Error: File %s, line %d: %s\n", filename,
+ lineno, err);
+ else
+ fprintf(stderr, "Error: File %s: %s\n", filename, err);
+}
+
void sensors_default_fatal_error(const char *proc, const char *err)
{
fprintf(stderr, "Fatal error in `%s': %s\n", proc, err);
--- lm-sensors.orig/lib/error.h 2009-02-11 14:19:50.000000000 +0100
+++ lm-sensors/lib/error.h 2009-02-11 16:23:04.000000000 +0100
@@ -1,7 +1,7 @@
/*
error.h - Part of libsensors, a Linux library for reading sensor data.
Copyright (c) 1998, 1999 Frodo Looijaard <frodol@dds.nl>
- Copyright (C) 2007, 2008 Jean Delvare <khali@linux-fr.org>
+ Copyright (C) 2007-2009 Jean Delvare <khali@linux-fr.org>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -44,11 +44,22 @@ extern "C" {
You may not modify the result! */
const char *sensors_strerror(int errnum);
-/* This function is called when a parse error is detected. Give it a new
- value, and your own function is called instead of the default (which
- prints to stderr). This function may terminate the program, but it
- usually outputs an error and returns. */
+/* These functions are called when a parse error is detected. Give them new
+ values, and your own functions are called instead of the default (which
+ print to stderr). These functions may terminate the program, but they
+ usually output an error and return. The first function is the original
+ one, the second one was added later when support for multiple
+ configuration files was added.
+ The library code now only calls the second function. However, for
+ backwards compatibility, if an application provides a custom handling
+ function for the first function but not the second, then all parse
+ errors will be reported using the first function (that is, the filename
+ is never reported.)
+ Note that filename can be NULL (if filename isn't known) and lineno
+ can be 0 (if the error occurs before the actual parsing starts.) */
extern void (*sensors_parse_error) (const char *err, int lineno);
+extern void (*sensors_parse_error_wfn) (const char *err,
+ const char *filename, int lineno);
/* This function is called when an immediately fatal error (like no
memory left) is detected. Give it a new value, and your own function
--- lm-sensors.orig/doc/libsensors-API.txt 2009-02-11 14:19:50.000000000 +0100
+++ lm-sensors/doc/libsensors-API.txt 2009-02-11 16:21:46.000000000 +0100
@@ -24,6 +24,10 @@ given new feature.
enum sensors_subfeature_type SENSORS_SUBFEATURE_CURR_BEEP
* Added error value for excessive recursion depth
#define SENSORS_ERR_RECURSION 11
+* Added parse error reporting function including the configuration file
+ name
+ extern void (*sensors_parse_error_wfn) (const char *err,
+ const char *filename, int lineno);
0x401 lm-sensors 3.0.2 to 3.0.3
* Added bus type "virtual":
--- lm-sensors.orig/lib/init.c 2009-02-11 15:02:17.000000000 +0100
+++ lm-sensors/lib/init.c 2009-02-11 15:02:17.000000000 +0100
@@ -125,7 +125,7 @@ static int add_config_from_dir(const cha
count = scandir(dir, &namelist, config_file_filter, alphasort);
if (count < 0) {
- sensors_parse_error(strerror(errno), 0);
+ sensors_parse_error_wfn(strerror(errno), NULL, 0);
return -SENSORS_ERR_PARSE;
}
@@ -147,7 +147,7 @@ static int add_config_from_dir(const cha
fclose(input);
} else {
res = -SENSORS_ERR_PARSE;
- sensors_parse_error(strerror(errno), 0);
+ sensors_parse_error_wfn(strerror(errno), path, 0);
}
}
@@ -187,7 +187,7 @@ int sensors_init(FILE *input)
goto exit_cleanup;
} else if (errno != ENOENT) {
- sensors_parse_error(strerror(errno), 0);
+ sensors_parse_error_wfn(strerror(errno), name, 0);
res = -SENSORS_ERR_PARSE;
goto exit_cleanup;
}
--- lm-sensors.orig/lib/data.c 2009-02-11 15:02:17.000000000 +0100
+++ lm-sensors/lib/data.c 2009-02-11 15:02:17.000000000 +0100
@@ -202,7 +202,8 @@ int sensors_parse_bus_id(const char *nam
return 0;
}
-static int sensors_substitute_chip(sensors_chip_name *name, int lineno)
+static int sensors_substitute_chip(sensors_chip_name *name,
+ const char *filename, int lineno)
{
int i, j;
for (i = 0; i < sensors_config_busses_count; i++)
@@ -211,7 +212,8 @@ static int sensors_substitute_chip(senso
break;
if (i = sensors_config_busses_count) {
- sensors_parse_error("Undeclared bus id referenced", lineno);
+ sensors_parse_error_wfn("Undeclared bus id referenced",
+ filename, lineno);
name->bus.nr = SENSORS_BUS_NR_IGNORE;
return -SENSORS_ERR_BUS_NAME;
}
@@ -238,10 +240,12 @@ int sensors_substitute_busses(void)
{
int err, i, j, lineno;
sensors_chip_name_list *chips;
+ const char *filename;
int res = 0;
for (i = sensors_config_chips_subst;
i < sensors_config_chips_count; i++) {
+ filename = sensors_config_chips[i].line.filename;
lineno = sensors_config_chips[i].line.lineno;
chips = &sensors_config_chips[i].chips;
for (j = 0; j < chips->fits_count; j++) {
@@ -250,7 +254,8 @@ int sensors_substitute_busses(void)
if (chips->fits[j].bus.nr = SENSORS_BUS_NR_ANY)
continue;
- err = sensors_substitute_chip(&chips->fits[j], lineno);
+ err = sensors_substitute_chip(&chips->fits[j],
+ filename, lineno);
if (err)
res = err;
}
--- lm-sensors.orig/lib/access.c 2009-02-11 15:02:17.000000000 +0100
+++ lm-sensors/lib/access.c 2009-02-11 16:23:52.000000000 +0100
@@ -1,7 +1,7 @@
/*
access.c - Part of libsensors, a Linux library for reading sensor data.
Copyright (c) 1998, 1999 Frodo Looijaard <frodol@dds.nl>
- Copyright (C) 2007, 2008 Jean Delvare <khali@linux-fr.org>
+ Copyright (C) 2007-2009 Jean Delvare <khali@linux-fr.org>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -511,7 +511,8 @@ static int sensors_do_this_chip_sets(con
subfeature = sensors_lookup_subfeature_name(chip_features,
chip->sets[i].name);
if (!subfeature) {
- sensors_parse_error("Unknown feature name",
+ sensors_parse_error_wfn("Unknown feature name",
+ chip->sets[i].line.filename,
chip->sets[i].line.lineno);
err = -SENSORS_ERR_NO_ENTRY;
continue;
@@ -521,14 +522,16 @@ static int sensors_do_this_chip_sets(con
chip->sets[i].value, 0,
0, &value);
if (res) {
- sensors_parse_error("Error parsing expression",
+ sensors_parse_error_wfn("Error parsing expression",
+ chip->sets[i].line.filename,
chip->sets[i].line.lineno);
err = res;
continue;
}
if ((res = sensors_set_value(name, subfeature->number,
value))) {
- sensors_parse_error("Failed to set value",
+ sensors_parse_error_wfn("Failed to set value",
+ chip->sets[i].line.filename,
chip->sets[i].line.lineno);
err = res;
continue;
--- lm-sensors.orig/lib/conf-parse.y 2009-02-11 15:02:17.000000000 +0100
+++ lm-sensors/lib/conf-parse.y 2009-02-11 15:02:17.000000000 +0100
@@ -332,10 +332,10 @@ chip_name: NAME
void sensors_yyerror(const char *err)
{
if (sensors_lex_error[0]) {
- sensors_parse_error(sensors_lex_error,sensors_yylineno);
+ sensors_parse_error_wfn(sensors_lex_error, sensors_yyfilename, sensors_yylineno);
sensors_lex_error[0] = '\0';
} else
- sensors_parse_error(err,sensors_yylineno);
+ sensors_parse_error_wfn(err, sensors_yyfilename, sensors_yylineno);
}
sensors_expr *malloc_expr(void)
--- lm-sensors.orig/lib/conf.h 2009-02-11 14:19:50.000000000 +0100
+++ lm-sensors/lib/conf.h 2009-02-11 15:02:17.000000000 +0100
@@ -24,6 +24,7 @@
/* This is defined in conf-lex.l */
int sensors_yylex(void);
extern char sensors_lex_error[];
+extern const char *sensors_yyfilename;
extern int sensors_yylineno;
extern FILE *sensors_yyin;
--
Jean Delvare
_______________________________________________
lm-sensors mailing list
lm-sensors@lm-sensors.org
http://lists.lm-sensors.org/mailman/listinfo/lm-sensors
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2009-02-11 16:58 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-02-11 16:58 [lm-sensors] [PATCH 6/6] libsensors: Include the config file name Jean Delvare
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.