alsa/alsa-oss-hg-fixes.diff

185 lines
4.6 KiB
Diff

diff -r 6b42089e67e3 alsa/alsa-oss.c
--- a/alsa/alsa-oss.c Tue Aug 22 14:40:57 2006 +0200
+++ b/alsa/alsa-oss.c Mon Feb 19 12:57:13 2007 +0100
@@ -69,6 +69,7 @@ static int (*_select)(int n, fd_set *rea
static int (*_select)(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
static int (*_poll)(struct pollfd *ufds, unsigned int nfds, int timeout);
static int (*_open)(const char *file, int oflag, ...);
+static int (*_open64)(const char *file, int oflag, ...);
static int (*_close)(int fd);
static ssize_t (*_write)(int fd, const void *buf, size_t n);
static ssize_t (*_read)(int fd, void *buf, size_t n);
@@ -78,6 +79,7 @@ static int (*_munmap)(void* addr, size_t
static int (*_munmap)(void* addr, size_t len);
static FILE *(*_fopen)(const char *path, const char *mode);
+static FILE *(*_fopen64)(const char *path, const char *mode);
typedef struct ops {
int (*close)(int fd);
@@ -242,57 +244,73 @@ static ops_t ops[FD_CLASSES] = {
},
};
-int open(const char *file, int oflag, ...)
-{
- va_list args;
- mode_t mode = 0;
+static int dsp_open_helper(const char *file, int oflag)
+{
int fd;
-
- if (!initialized)
- initialize();
-
- if (oflag & O_CREAT) {
- va_start(args, oflag);
- mode = va_arg(args, mode_t);
- va_end(args);
- }
- if (is_dsp_device(file)) {
- fd = lib_oss_pcm_open(file, oflag);
- if (fd >= 0) {
- int nfds;
- fds[fd] = calloc(sizeof(fd_t), 1);
- if (fds[fd] == NULL) {
- ops[FD_OSS_DSP].close(fd);
- errno = ENOMEM;
- return -1;
- }
- fds[fd]->class = FD_OSS_DSP;
- fds[fd]->oflags = oflag;
- nfds = lib_oss_pcm_poll_fds(fd);
- if (nfds > 0) {
- fds[fd]->poll_fds = nfds;
- poll_fds_add += nfds;
- }
- }
- } else if (is_mixer_device(file)) {
- fd = lib_oss_mixer_open(file, oflag);
- if (fd >= 0) {
- fds[fd] = calloc(sizeof(fd_t), 1);
- if (fds[fd] == NULL) {
- ops[FD_OSS_MIXER].close(fd);
- errno = ENOMEM;
- return -1;
- }
- fds[fd]->class = FD_OSS_MIXER;
- fds[fd]->oflags = oflag;
- }
- } else {
- fd = _open(file, oflag, mode);
- if (fd >= 0)
- assert(fds[fd] == NULL);
+ fd = lib_oss_pcm_open(file, oflag);
+ if (fd >= 0) {
+ int nfds;
+ fds[fd] = calloc(sizeof(fd_t), 1);
+ if (fds[fd] == NULL) {
+ ops[FD_OSS_DSP].close(fd);
+ errno = ENOMEM;
+ return -1;
+ }
+ fds[fd]->class = FD_OSS_DSP;
+ fds[fd]->oflags = oflag;
+ nfds = lib_oss_pcm_poll_fds(fd);
+ if (nfds > 0) {
+ fds[fd]->poll_fds = nfds;
+ poll_fds_add += nfds;
+ }
}
return fd;
}
+
+static int mixer_open_helper(const char *file, int oflag)
+{
+ int fd;
+ fd = lib_oss_mixer_open(file, oflag);
+ if (fd >= 0) {
+ fds[fd] = calloc(sizeof(fd_t), 1);
+ if (fds[fd] == NULL) {
+ ops[FD_OSS_MIXER].close(fd);
+ errno = ENOMEM;
+ return -1;
+ }
+ fds[fd]->class = FD_OSS_MIXER;
+ fds[fd]->oflags = oflag;
+ }
+ return fd;
+}
+
+#define DECL_OPEN(name, callback) \
+int name(const char *file, int oflag, ...) \
+{ \
+ va_list args; \
+ mode_t mode = 0; \
+ int fd; \
+ if (!initialized) \
+ initialize(); \
+ if (oflag & O_CREAT) { \
+ va_start(args, oflag); \
+ mode = va_arg(args, mode_t); \
+ va_end(args); \
+ } \
+ if (is_dsp_device(file)) \
+ fd = dsp_open_helper(file, oflag); \
+ else if (is_mixer_device(file)) \
+ fd = mixer_open_helper(file, oflag); \
+ else { \
+ fd = callback(file, oflag, mode); \
+ if (fd >= 0) \
+ assert(fds[fd] == NULL); \
+ } \
+ return fd; \
+}
+
+DECL_OPEN(open, _open)
+DECL_OPEN(open64, _open64)
int close(int fd)
{
@@ -730,7 +748,7 @@ FILE *fopen64(const char* path, const ch
initialize();
if (!is_dsp_device(path))
- return _fopen(path, mode);
+ return _fopen64(path, mode);
return fake_fopen(path, mode, O_LARGEFILE);
}
@@ -765,19 +783,6 @@ int dup2(int fd, int fd2)
return fcntl(fd, F_DUPFD, fd2);
}
#endif
-
-int open64(const char *file, int oflag, ...)
-{
- va_list args;
- mode_t mode = 0;
-
- if (oflag & O_CREAT) {
- va_start(args, oflag);
- mode = va_arg(args, mode_t);
- va_end(args);
- }
- return open(file, oflag | O_LARGEFILE, mode);
-}
# define strong_alias(name, aliasname) \
extern __typeof (name) aliasname __attribute__ ((alias (#name)));
@@ -809,6 +814,7 @@ static void initialize()
if (!fds)
exit(1);
_open = dlsym(RTLD_NEXT, "open");
+ _open64 = dlsym(RTLD_NEXT, "open64");
_close = dlsym(RTLD_NEXT, "close");
_write = dlsym(RTLD_NEXT, "write");
_read = dlsym(RTLD_NEXT, "read");
@@ -819,5 +825,6 @@ static void initialize()
_select = dlsym(RTLD_NEXT, "select");
_poll = dlsym(RTLD_NEXT, "poll");
_fopen = dlsym(RTLD_NEXT, "fopen");
+ _fopen64 = dlsym(RTLD_NEXT, "fopen64");
initialized = 1;
}