On Nov 11, 2005, at 4:42 AM, Curt Arnold wrote:

By implementation, does that mean 'whenever I'd like to use
log4cxx'?  Otherwise, the following block in syslogappender.cpp,
which actually invokes the syslog() function doesn't get entered...



Implementation means log4cxx itself.  Client code (your code)
should not include log4cxx_private.h or define LOG4CXX.


right, this is what  I figured...



---
<syslogappender.cpp>
    261 #ifdef LOG4CXX_HAVE_SYSLOG
    262         if (sw == 0)
    263         {
    264                 std::string sbuf;
    265                 Transcoder::encode(msg, sbuf);
    266
    267                 // use of "%s" to avoid a security hole
    268                  ::syslog(syslogFacility | event->getLevel
()->getSyslogEquivalent(),
    269                         "%s", sbuf.c_str());
    270
    271                 return;
    272         }
    273 #endif
---

As a stopgap, I "#define LOG4CXX 1", and "#include <log4cxx/
private/log4cxx_private.h>" in the "syslogappender.h" header file
before the "LOG4CXX_HAVE_SYSLOG" precompiler variable gets
checked.  I'm assuming there's either something wrong in the way
I'm doing things, or there's something wrong in the header files.

Thanks!
-lev


Both of the actions that you did are directly undoing intentional
checks that check that private implementation details are not
exposed in the public API.  There is a judgement call what is
publicly exposed and what is private, so we could consider moving
some of the feature presence macros into a public header file.


yep... this is what I'd figured.  This precompiler macro is necessary
for me to use syslog (outside of me defining something at compile
time), so a public header file would be good methinks :)

thanks!
-lev

Reply via email to