El 25/09/15 a les 00:10, Antti Kantee ha escrit:
Let me put it this way: the sys/soundcard.h that libossaudio installs redefines
ioctl so that it catches the ioctl calls before they go hit the kernel. How
does that work with a stock soundcard.h from somewhere else? Is there some
indirection in your stack somewhere that I'm not aware of?
No indirection, it's simpler than that!
Take for example:
switch (com) {
case SNDCTL_DSP_RESET:
retval = ioctl(fd, AUDIO_FLUSH, 0);
if (retval < 0)
return retval;
break;
ossaudio.c is built using system-wide <sys/soundcard.h>. In turn, the ioctl
constant definitions in <sys/soundcard.h> use the system-wide _IOC macros.
At the same time, ossaudio.c is built using the NetBSD version of sys/audioio.h,
which in turn uses _IOC macros by the NetBSD version of sys/ioccom.h [1].
So in the example above, the "case SNDCTL_DSP_RESET" statement is using
system-wide ABI (both in the sense of system-wide <sys/soundcard.h> and
in the sense of system-wide _IOC), whereas the "ioctl(fd, AUDIO_FLUSH, 0)"
example is using NetBSD ABI (in both senses too).
[1] Note: both files are modified to avoid namespace collision, see
https://github.com/robertmillan/rumposs/commit/dd5596f20126e54b723d312ba5ad182747a38b9b
The reason I'm trying to find alternate solutions is that I find manually
sprinkling ifdefs into the switch quite ugly and fragile and would rather see a
cleaner solution. Another way to work around that problem is figure out how to
use some sort of translator before the switch so that the primary code path
doesn't get polluted with ifdefs ... or to find someone who's not bothered by
ifdefs to commit your patch :/
Are you concerned with all ifdefs or just with the ones that get inside
"if () {}" statements? I think the later could possibly be replaced with
ifndef/define before the switch. Does this look better to you?
--
Robert Millan