Redhat EL5 glibc: LOG_MAKEPRI macro definition in sys/syslog.h

21/04/2011 - 10:11 von Alex Wanderleit | Report spam
Hallo!

Nach Lektüre der Dokumentation zum syslog C interface
(bspw. http://www.gnu.org/s/hello/manual/l...yslog.html)
soll folgendes funktionieren:

#include <syslog.h>
syslog (LOG_MAKEPRI(LOG_LOCAL1, LOG_ERROR),
"Unable to make network connection to %s. Error=%m", host);

Unter RHEL5 (64bit) befinden sich in /usr/include/sys/syslog.h folgende
Makro definitionen:

...
#define LOG_MAKEPRI(fac, pri) ((fac << 3) | (pri))
...
#define LOG_ERR 3
...
#define LOG_LOCAL1 (17<<3)
...

Wenn jetzt ein Programm das Makro LOG_MAKEPRI verwenden will mit
den zugehörigen mnemonic abbreviations LOG_ERR und LOG_LOCAL1,
dann wird hier ein falscher Wert für facility_priority des syslog
calls errechnet - es wird einmal zu viel mit 8 multipliziert (left shift
3: << 3):

Bsp. LOG_LOCAL1, LOG_ERR:
facility_priority = 17*8*8 = 1088, die Nachricht landet natürlich nicht
in der konfigurierten facility 'local1', sondern eine Fehlermeldung in
/var/log/messages (1088 = 0x440, plus 3 für LOG_ERR --> 0x443):

...
Apr 21 01:02:03 host app[12345]: syslog: unknown facility/priority: 443
...

Abhilfe schafft das Weglassen des LOG_MAKEPRI Makros und ORing der
beiden mnemonics:

syslog ((LOG_LOCAL1 | LOG_ERROR),
"Unable to make network connection to %s. Error=%m", host);


Ist das ein "bug"?
Wem ist er zuzuordnen? glibc? ein RedHat Spezifikum?

Oder gibt es einen Grund für diese Abweichung?

http://fxr.watson.org/fxr/source/sys/syslog.h listet
diverse Linux Varianten mit unterschiedlichen LOG_MAKEPRI
Definitionen:

#define LOG_MAKEPRI(fac, pri) ((fac << 3) | (pri))
#define LOG_MAKEPRI(fac, pri) ((fac) | (pri))

Oder ist LOG_MAKEPRI einfach "deprecated"?

?

Danke,
Alex
 

Lesen sie die antworten

#1 Helmut Schellong
25/04/2011 - 03:36 | Warnen spam
Alex Wanderleit wrote:

Hallo!

Nach Lektüre der Dokumentation zum syslog C interface
(bspw. http://www.gnu.org/s/hello/manual/l...yslog.html)
soll folgendes funktionieren:



[...]

Ist das ein "bug"?
Wem ist er zuzuordnen? glibc? ein RedHat Spezifikum?

Oder gibt es einen Grund für diese Abweichung?

http://fxr.watson.org/fxr/source/sys/syslog.h listet
diverse Linux Varianten mit unterschiedlichen LOG_MAKEPRI
Definitionen:

#define LOG_MAKEPRI(fac, pri) ((fac << 3) | (pri))
#define LOG_MAKEPRI(fac, pri) ((fac) | (pri))

Oder ist LOG_MAKEPRI einfach "deprecated"?




Auf Basis der Sprache C bzw. eines C-Standards sind all diese
Fragen unbeantwortbar.



Mit freundlichen Grüßen
Helmut Schellong
www.schellong.de www.schellong.com www.schellong.biz
http://www.schellong.de/c.htm

Ähnliche fragen