wrapping a vararg C function (specifically, log() in the kernel)
Ian Lepore
ian at freebsd.org
Thu Dec 18 14:42:03 UTC 2014
On Thu, 2014-12-18 at 15:21 +0100, Luigi Rizzo wrote:
> Hi,
> in the porting of some kernel code to FreeBSD, i need to remap one
> function with a variable number of arguments to the log() function
> from the freebsd kernel.
>
> Normally i would do
>
> #define WARN(x, args...) log(LOG_WARNING, args)
>
> but this does not work in my case because the function is called in
> (many) blocks where there is already a local variable with the same name
>
> bool log;
>
> which is used a ton of times.
>
> I was wondering if there is some C compiler magic i can use to do the
> remapping without going through a macro; I haven't found any direct one,
> though perhaps something like
>
> extern void (*freebsd_log)(int level, const char *fmt, ...);
>
> #define WARN(x, args...) freebsd_log(LOG_WARNING, args)
>
> followed somewhere in a safe place by
>
> freebsd_log = log;
>
> may do the job.
>
> Any other option ?
>
> cheers
> luigi
Normally I'd fix it like:
#define WARN(x,args...) locallog(LOG_WARNING, args)
static inline void
locallog(int lvl, const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
logv(level, fmt, ap);
va_end(ap);
}
But unfortunately we don't have a logv() function. I think maybe we
should have one. :)
-- Ian
More information about the freebsd-current
mailing list