$NetBSD$

--- src/utils/padsp.c.orig	2009-09-18 20:21:44.000000000 +0000
+++ src/utils/padsp.c
@@ -49,6 +49,9 @@
 #ifdef __linux__
 #include <linux/sockios.h>
 #endif
+#ifdef __NetBSD__
+#include <sys/param.h>
+#endif
 
 #include <pulse/pulseaudio.h>
 #include <pulse/gccmacro.h>
@@ -60,6 +63,10 @@
 # define SIOCINQ FIONREAD
 #endif
 
+#if !defined(SNDCTL_DSP_GETODELAY)
+# define SNDCTL_DSP_GETODELAY _IOR ('P', 23, int)
+#endif
+
 /* make sure gcc doesn't redefine open and friends as macros */
 #undef open
 #undef open64
@@ -115,7 +122,11 @@ static pthread_mutex_t func_mutex = PTHR
 
 static PA_LLIST_HEAD(fd_info, fd_infos) = NULL;
 
+#ifdef __NetBSD__
+static int (*_ioctl)(int, u_long, void *) = NULL;
+#else
 static int (*_ioctl)(int, int, void*) = NULL;
+#endif
 static int (*_close)(int) = NULL;
 static int (*_open)(const char *, int, mode_t) = NULL;
 static FILE* (*_fopen)(const char *path, const char *mode) = NULL;
@@ -141,6 +152,15 @@ static inline fnptr dlsym_fn(void *handl
     return (fnptr) (long) dlsym(handle, symbol);
 }
 
+#ifdef __NetBSD__
+#define LOAD_IOCTL_FUNC() \
+do { \
+    pthread_mutex_lock(&func_mutex); \
+    if (!_ioctl)  \
+        _ioctl = (int (*)(int, u_long, void*)) dlsym_fn(RTLD_NEXT, "ioctl"); \
+    pthread_mutex_unlock(&func_mutex); \
+} while(0)
+#else
 #define LOAD_IOCTL_FUNC() \
 do { \
     pthread_mutex_lock(&func_mutex); \
@@ -148,6 +168,7 @@ do { \
         _ioctl = (int (*)(int, int, void*)) dlsym_fn(RTLD_NEXT, "ioctl"); \
     pthread_mutex_unlock(&func_mutex); \
 } while(0)
+#endif
 
 #define LOAD_OPEN_FUNC() \
 do { \
@@ -181,11 +202,16 @@ do { \
     pthread_mutex_unlock(&func_mutex); \
 } while(0)
 
+#ifdef __NetBSD__
+#define STAT_FUNC "__stat30"
+#else
+#define STAT_FUNC "stat"
+#endif
 #define LOAD_STAT_FUNC() \
 do { \
     pthread_mutex_lock(&func_mutex); \
     if (!_stat) \
-        _stat = (int (*)(const char *, struct stat *)) dlsym_fn(RTLD_NEXT, "stat"); \
+        _stat = (int (*)(const char *, struct stat *)) dlsym_fn(RTLD_NEXT, STAT_FUNC); \
     pthread_mutex_unlock(&func_mutex); \
 } while(0)
 
@@ -1458,7 +1484,8 @@ static int real_open(const char *filenam
         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() && (strcmp(filename, "/dev/dsp") == 0 || strcmp(filename, "/dev/adsp") == 0 ||
+      strcmp(filename, "/dev/sound") == 0 || strcmp(filename, "/dev/audio") == 0))
         r = dsp_open(flags, &_errno);
     else if (filename && mixer_cloak_enable() && strcmp(filename, "/dev/mixer") == 0)
         r = mixer_open(flags, &_errno);
@@ -2224,6 +2251,7 @@ static int dsp_ioctl(fd_info *i, unsigne
             break;
         }
 
+#ifndef __sun
         case SOUND_PCM_READ_RATE:
             debug(DEBUG_LEVEL_NORMAL, __FILE__": SOUND_PCM_READ_RATE\n");
 
@@ -2247,7 +2275,7 @@ static int dsp_ioctl(fd_info *i, unsigne
             *(int*) argp = pa_sample_size(&i->sample_spec)*8;
             pa_threaded_mainloop_unlock(i->mainloop);
             break;
-
+#endif
         case SNDCTL_DSP_GETOPTR: {
             count_info *info;
 
@@ -2317,21 +2345,35 @@ fail:
     return ret;
 }
 
-#ifdef sun
+/* NetBSD < 6 and 6.99.0 - 6.99.6 used a different ioctl() definition */
+#if defined(__NetBSD__) && (__NetBSD_Version__ < 600000000 ||  \
+    (__NetBSD_Version__ > 699000000 && __NetBSD_Version__ < 699000700) )
+# define OLD_NETBSD_IOCTL_CALL
+#endif
+
+#ifdef __sun
 int ioctl(int fd, int request, ...) {
+#elif defined(OLD_NETBSD_IOCTL_CALL)
+int ioctl(int fd, u_long request, void *_argp) {
 #else
 int ioctl(int fd, unsigned long request, ...) {
 #endif
     fd_info *i;
+#if !defined(OLD_NETBSD_IOCTL_CALL)
     va_list args;
+#endif
     void *argp;
     int r, _errno = 0;
 
     debug(DEBUG_LEVEL_VERBOSE, __FILE__": ioctl()\n");
 
+#if defined(OLD_NETBSD_IOCTL_CALL)
+    argp = _argp;
+#else
     va_start(args, request);
     argp = va_arg(args, void *);
     va_end(args);
+#endif
 
     if (!function_enter()) {
         LOAD_IOCTL_FUNC();
@@ -2390,6 +2432,8 @@ int access(const char *pathname, int mod
     if (!pathname ||
         (strcmp(pathname, "/dev/dsp") != 0 &&
          strcmp(pathname, "/dev/adsp") != 0 &&
+	 strcmp(pathname, "/dev/sound") != 0 &&
+	 strcmp(pathname, "/dev/audio") != 0 &&
          strcmp(pathname, "/dev/sndstat") != 0 &&
          strcmp(pathname, "/dev/mixer") != 0 )) {
         LOAD_ACCESS_FUNC();
@@ -2418,6 +2462,8 @@ int stat(const char *pathname, struct st
     if (!pathname ||
         !buf ||
         ( strcmp(pathname, "/dev/dsp") != 0 &&
+	  strcmp(pathname, "/dev/sound") != 0 &&
+	  strcmp(pathname, "/dev/audio") != 0 &&
           strcmp(pathname, "/dev/adsp") != 0 &&
           strcmp(pathname, "/dev/sndstat") != 0 &&
           strcmp(pathname, "/dev/mixer") != 0 )) {
@@ -2475,6 +2521,8 @@ int stat64(const char *pathname, struct 
     if (!pathname ||
         !buf ||
         ( strcmp(pathname, "/dev/dsp") != 0 &&
+	  strcmp(pathname, "/dev/sound") != 0 &&
+	  strcmp(pathname, "/dev/audio") != 0 &&
           strcmp(pathname, "/dev/adsp") != 0 &&
           strcmp(pathname, "/dev/sndstat") != 0 &&
           strcmp(pathname, "/dev/mixer") != 0 )) {
@@ -2520,6 +2568,8 @@ int open64(const char *filename, int fla
 
     if (!filename ||
         ( strcmp(filename, "/dev/dsp") != 0 &&
+	  strcmp(filename, "/dev/sound") != 0 &&
+	  strcmp(filename, "/dev/audio") != 0 &&
           strcmp(filename, "/dev/adsp") != 0 &&
           strcmp(filename, "/dev/sndstat") != 0 &&
           strcmp(filename, "/dev/mixer") != 0 )) {
@@ -2540,6 +2590,8 @@ int __xstat(int ver, const char *pathnam
     if (!pathname ||
         !buf ||
         ( strcmp(pathname, "/dev/dsp") != 0 &&
+	  strcmp(pathname, "/dev/sound") != 0 &&
+	  strcmp(pathname, "/dev/audio") != 0 &&
           strcmp(pathname, "/dev/adsp") != 0 &&
           strcmp(pathname, "/dev/sndstat") != 0 &&
           strcmp(pathname, "/dev/mixer") != 0 )) {
@@ -2563,6 +2615,8 @@ int __xstat64(int ver, const char *pathn
     if (!pathname ||
         !buf ||
         ( strcmp(pathname, "/dev/dsp") != 0 &&
+	  strcmp(pathname, "/dev/sound") != 0 &&
+	  strcmp(pathname, "/dev/audio") != 0 &&
           strcmp(pathname, "/dev/adsp") != 0 &&
           strcmp(pathname, "/dev/sndstat") != 0 &&
           strcmp(pathname, "/dev/mixer") != 0 )) {
@@ -2592,6 +2646,8 @@ FILE* fopen(const char *filename, const 
     if (!filename ||
         !mode ||
         ( strcmp(filename, "/dev/dsp") != 0 &&
+	  strcmp(filename, "/dev/sound") != 0 &&
+	  strcmp(filename, "/dev/audio") != 0 &&
           strcmp(filename, "/dev/adsp") != 0 &&
           strcmp(filename, "/dev/sndstat") != 0 &&
           strcmp(filename, "/dev/mixer") != 0 )) {
@@ -2635,6 +2691,8 @@ FILE *fopen64(const char *filename, cons
     if (!filename ||
         !mode ||
         ( strcmp(filename, "/dev/dsp") != 0 &&
+	  strcmp(filename, "/dev/sound") != 0 &&
+	  strcmp(filename, "/dev/audio") != 0 &&
           strcmp(filename, "/dev/adsp") != 0 &&
           strcmp(filename, "/dev/sndstat") != 0 &&
           strcmp(filename, "/dev/mixer") != 0 )) {
