padsp: emulate /dev/audio, too

https://bugzilla.redhat.com/show_bug.cgi?id=561262
This commit is contained in:
Lennart Poettering 2010-02-16 02:03:45 +01:00
parent f9b31fe544
commit ff2474e5fc

View file

@ -1458,11 +1458,11 @@ static int real_open(const char *filename, int flags, mode_t mode) {
return _open(filename, flags, mode); return _open(filename, flags, mode);
} }
if (filename && dsp_cloak_enable() && (strcmp(filename, "/dev/dsp") == 0 || strcmp(filename, "/dev/adsp") == 0)) if (filename && dsp_cloak_enable() && (pa_streq(filename, "/dev/dsp") || pa_streq(filename, "/dev/adsp") || pa_streq(filename, "/dev/audio")))
r = dsp_open(flags, &_errno); r = dsp_open(flags, &_errno);
else if (filename && mixer_cloak_enable() && strcmp(filename, "/dev/mixer") == 0) else if (filename && mixer_cloak_enable() && pa_streq(filename, "/dev/mixer"))
r = mixer_open(flags, &_errno); r = mixer_open(flags, &_errno);
else if (filename && sndstat_cloak_enable() && strcmp(filename, "/dev/sndstat") == 0) else if (filename && sndstat_cloak_enable() && pa_streq(filename, "/dev/sndstat"))
r = sndstat_open(flags, &_errno); r = sndstat_open(flags, &_errno);
else { else {
function_exit(); function_exit();
@ -2383,15 +2383,21 @@ int close(int fd) {
return 0; return 0;
} }
static pa_bool_t is_audio_device_node(const char *path) {
return
pa_streq(path, "/dev/dsp") ||
pa_streq(path, "/dev/adsp") ||
pa_streq(path, "/dev/audio") ||
pa_streq(path, "/dev/sndstat") ||
pa_streq(path, "/dev/mixer");
}
int access(const char *pathname, int mode) { int access(const char *pathname, int mode) {
debug(DEBUG_LEVEL_VERBOSE, __FILE__": access(%s)\n", pathname?pathname:"NULL"); debug(DEBUG_LEVEL_VERBOSE, __FILE__": access(%s)\n", pathname?pathname:"NULL");
if (!pathname || if (!pathname ||
(strcmp(pathname, "/dev/dsp") != 0 && !is_audio_device_node(pathname)) {
strcmp(pathname, "/dev/adsp") != 0 &&
strcmp(pathname, "/dev/sndstat") != 0 &&
strcmp(pathname, "/dev/mixer") != 0 )) {
LOAD_ACCESS_FUNC(); LOAD_ACCESS_FUNC();
return _access(pathname, mode); return _access(pathname, mode);
} }
@ -2417,10 +2423,7 @@ int stat(const char *pathname, struct stat *buf) {
if (!pathname || if (!pathname ||
!buf || !buf ||
( strcmp(pathname, "/dev/dsp") != 0 && !is_audio_device_node(pathname)) {
strcmp(pathname, "/dev/adsp") != 0 &&
strcmp(pathname, "/dev/sndstat") != 0 &&
strcmp(pathname, "/dev/mixer") != 0 )) {
debug(DEBUG_LEVEL_VERBOSE, __FILE__": stat(%s)\n", pathname?pathname:"NULL"); debug(DEBUG_LEVEL_VERBOSE, __FILE__": stat(%s)\n", pathname?pathname:"NULL");
LOAD_STAT_FUNC(); LOAD_STAT_FUNC();
return _stat(pathname, buf); return _stat(pathname, buf);
@ -2474,10 +2477,7 @@ int stat64(const char *pathname, struct stat64 *buf) {
if (!pathname || if (!pathname ||
!buf || !buf ||
( strcmp(pathname, "/dev/dsp") != 0 && !is_audio_device_node(pathname)) {
strcmp(pathname, "/dev/adsp") != 0 &&
strcmp(pathname, "/dev/sndstat") != 0 &&
strcmp(pathname, "/dev/mixer") != 0 )) {
LOAD_STAT64_FUNC(); LOAD_STAT64_FUNC();
return _stat64(pathname, buf); return _stat64(pathname, buf);
} }
@ -2519,10 +2519,7 @@ int open64(const char *filename, int flags, ...) {
} }
if (!filename || if (!filename ||
( strcmp(filename, "/dev/dsp") != 0 && !is_audio_device_node(filename)) {
strcmp(filename, "/dev/adsp") != 0 &&
strcmp(filename, "/dev/sndstat") != 0 &&
strcmp(filename, "/dev/mixer") != 0 )) {
LOAD_OPEN64_FUNC(); LOAD_OPEN64_FUNC();
return _open64(filename, flags, mode); return _open64(filename, flags, mode);
} }
@ -2539,10 +2536,7 @@ int __xstat(int ver, const char *pathname, struct stat *buf) {
if (!pathname || if (!pathname ||
!buf || !buf ||
( strcmp(pathname, "/dev/dsp") != 0 && !is_audio_device_node(pathname)) {
strcmp(pathname, "/dev/adsp") != 0 &&
strcmp(pathname, "/dev/sndstat") != 0 &&
strcmp(pathname, "/dev/mixer") != 0 )) {
LOAD_XSTAT_FUNC(); LOAD_XSTAT_FUNC();
return ___xstat(ver, pathname, buf); return ___xstat(ver, pathname, buf);
} }
@ -2562,10 +2556,7 @@ int __xstat64(int ver, const char *pathname, struct stat64 *buf) {
if (!pathname || if (!pathname ||
!buf || !buf ||
( strcmp(pathname, "/dev/dsp") != 0 && !is_audio_device_node(pathname)) {
strcmp(pathname, "/dev/adsp") != 0 &&
strcmp(pathname, "/dev/sndstat") != 0 &&
strcmp(pathname, "/dev/mixer") != 0 )) {
LOAD_XSTAT64_FUNC(); LOAD_XSTAT64_FUNC();
return ___xstat64(ver, pathname, buf); return ___xstat64(ver, pathname, buf);
} }
@ -2591,10 +2582,7 @@ FILE* fopen(const char *filename, const char *mode) {
if (!filename || if (!filename ||
!mode || !mode ||
( strcmp(filename, "/dev/dsp") != 0 && !is_audio_device_node(filename)) {
strcmp(filename, "/dev/adsp") != 0 &&
strcmp(filename, "/dev/sndstat") != 0 &&
strcmp(filename, "/dev/mixer") != 0 )) {
LOAD_FOPEN_FUNC(); LOAD_FOPEN_FUNC();
return _fopen(filename, mode); return _fopen(filename, mode);
} }
@ -2634,10 +2622,7 @@ FILE *fopen64(const char *filename, const char *mode) {
if (!filename || if (!filename ||
!mode || !mode ||
( strcmp(filename, "/dev/dsp") != 0 && !is_audio_device_node(filename)) {
strcmp(filename, "/dev/adsp") != 0 &&
strcmp(filename, "/dev/sndstat") != 0 &&
strcmp(filename, "/dev/mixer") != 0 )) {
LOAD_FOPEN64_FUNC(); LOAD_FOPEN64_FUNC();
return _fopen64(filename, mode); return _fopen64(filename, mode);
} }