[Mono-devel-list] problems with Syscall.syslog
Jonathan Pryor
jonpryor at vt.edu
Wed Jun 29 08:13:09 EDT 2005
On Tue, 2005-06-28 at 16:18 +0400, Vorobiev Maksim wrote:
> Good day.
>
> But it still has a problem in map.c for function int
> Mono_Posix_FromSyslogFacility (int x, int *r).
> It checks for constants via &-mask: search for first occurrence. The
> next code:
> if ((x & Mono_Posix_SyslogFacility_LOG_USRE) ==
> Mono_Posix_SyslogFacility_LOG_USRE)
> #ifdef LOG_USRE
> *r |= LOG_USRE;
> #else /* def LOG_USRE */
> {errno = EINVAL; return -1;}
>
> will be TRUE for all constants, which ends with "8"
> (Mono_Posix_SyslogFacility_LOG_DAEMON and so on - "even ones").
Obviously I need to be in less of a hurry. :-)
I also need to read these constants better -- I originally thought that
all the shifting would prevent collisions, and that SyslogFacility was
obviously a [Flags] enum, but the shifts are really to prevent
collisions with SyslogOptions. I should have read the constants better.
Oops.
> Here
> should be another way for testing. BTW, why to look throght all possible
> constants? Since these are not flags, where could be only one possible
> value. So, function should return after first found. And IMHO test
> should be performed like this:
>
> if ((x & Mono_Posix_SyslogFacility_ALL) ==
> Mono_Posix_SyslogFacility_LOG_USRE)
> #ifdef LOG_USRE
> {*r = LOG_USRE;return 0;}
> #else /* def LOG_USRE */
> {errno = EINVAL; return -1;}
>
> Where Mono_Posix_SyslogFacility_ALL = Mono_Posix_SyslogFacility_LOG_KERN
> | Mono_Posix_SyslogFacility_LOG_USRE | ....
The `(x & VAL) == VAL' pattern is only required for [Flags] enums.
Normal enums use the pattern `x == VAL' (see the generated code for the
Error and SyslogLevel enums), so the introduction of a _ALL value isn't
necessary, just the removal of [Flags].
Regardless, I've fixed the definition of SyslogFacility, and make-map
now ignores [Obsolete]ed enum values in r46718 and r46719.
- Jon
More information about the Mono-devel-list
mailing list