Re: include/linux/xattr.h: how much userpace visible?

From: Kyle Moffett
Date: Mon Feb 26 2007 - 20:51:21 EST


On Feb 26, 2007, at 19:10:16, H. Peter Anvin wrote:
Christoph Hellwig wrote:
What's the problem of exposing all these APIs unconditionally? glibcs should either use all information from the linux/ headers or nothing at all, but not depend on hiding some bits.

It's not always that simple. In particular, in some files there might be typedefs or structure tags that step on libc's namespace (but are useful to other libcs), but ABI constants that are universally useful.

One way to deal with the particular issue of structure tags which is probably even more useful is:

#if defined(__KERNEL__) || defined(__KERNEL_EXPORT_STRUCTURES)
# define __kstruct_stat stat
#endif

struct __kstruct_stat {
/* ...foo... */
};

... which lets the libc export it into whatever namespace it wants by #defining __kstruct macros accordingly.

Not a bad idea, but it could use some extra error checking to make sure that somebody remembers to "#define __kstruct_foo" before "#include <linux/foo.h>" (perhaps indirectly through linux/bar.h). Maybe something like this (plays nice with the very-basic unifdef parsing too):

#ifdef __KERNEL__
# define __kstruct_stat stat
# define __kstruct_foo foo
# define __kstruct_bar bar
#endif

#ifdef __LINUX_KERNEL_EXPORT
# define __kstruct_stat stat
# define __kstruct_foo foo
# define __kstruct_bar bar
#endif

#ifndef __kstruct_stat
# error "Missing definition of __kstruct_stat, please insert:"
# error " #define __kstruct_stat <name-for-stat-struct>"
# error "into your C file before '#include <linux/foo.h>'"
#endif
struct __kstruct_stat {
}

Someone who wanted to keep the name __kstruct_stat could of course "#define __kstruct_stat __kstruct_stat" easily.

Cheers,
Kyle Moffett

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/