Port to Solaris 2.3.
diff --git a/Modules/sunaudiodev.c b/Modules/sunaudiodev.c
index 4e63123..5bd7249 100644
--- a/Modules/sunaudiodev.c
+++ b/Modules/sunaudiodev.c
@@ -30,7 +30,11 @@
 
 #include <stropts.h>
 #include <sys/ioctl.h>
+#ifdef SOLARIS
+#include <multimedia/libaudio.h>
+#else
 #include <sun/audioio.h>
+#endif
 
 /* #define offsetof(str,mem) ((int)(((str *)0)->mem)) */
 
@@ -50,7 +54,7 @@
 
 extern typeobject Sadtype;		/* Really static, forward */
 extern typeobject Sadstatustype;	/* Really static, forward */
-extern sadstatusobject *sads_alloc();	/* Forward */
+static sadstatusobject *sads_alloc();	/* Forward */
 
 static object *SunAudioError;
 
@@ -256,6 +260,24 @@
     return None;
 }
 
+#ifdef SOLARIS
+static object *
+sad_getdev(self, args)
+    sadobject *self;
+    object *args;
+{
+    struct audio_device ad;
+
+    if ( !getargs(args, "") )
+	return 0;
+    if ( ioctl(self->x_fd, AUDIO_GETDEV, &ad) < 0 ) {
+	err_errno(SunAudioError);
+	return NULL;
+    }
+    return mkvalue("(sss)", ad.name, ad.version, ad.config);
+}
+#endif
+
 static object *
 sad_flush(self, args)
     sadobject *self;
@@ -298,6 +320,9 @@
         { "setinfo",	sad_setinfo },
         { "drain",	sad_drain },
         { "flush",	sad_flush },
+#ifdef SOLARIS
+	{ "getdev",	sad_getdev },
+#endif
         { "close",	sad_close },
 	{NULL,		NULL}		/* sentinel */
 };
@@ -345,6 +370,11 @@
 	{ "i_waiting",		T_UBYTE,	OFF(record.waiting) },
 	{ "i_open",		T_UBYTE,	OFF(record.open) ,	 RO},
 	{ "i_active",		T_UBYTE,	OFF(record.active) ,	 RO},
+#ifdef SOLARIS
+	{ "i_buffer_size",	T_UINT,		OFF(record.buffer_size) },
+	{ "i_balance",		T_UBYTE,	OFF(record.balance) },
+	{ "i_avail_ports",	T_UINT,		OFF(record.avail_ports) },
+#endif
 
 	{ "o_sample_rate",	T_UINT,		OFF(play.sample_rate) },
 	{ "o_channels",		T_UINT,		OFF(play.channels) },
@@ -359,6 +389,11 @@
 	{ "o_waiting",		T_UBYTE,	OFF(play.waiting) },
 	{ "o_open",		T_UBYTE,	OFF(play.open) ,	 RO},
 	{ "o_active",		T_UBYTE,	OFF(play.active) ,	 RO},
+#ifdef SOLARIS
+	{ "o_buffer_size",	T_UINT,		OFF(play.buffer_size) },
+	{ "o_balance",		T_UBYTE,	OFF(play.balance) },
+	{ "o_avail_ports",	T_UINT,		OFF(play.avail_ports) },
+#endif
 
 	{ "monitor_gain",	T_UINT,		OFF(monitor_gain) },
         { NULL,                 0,              0},
@@ -382,7 +417,7 @@
 	if (v == NULL) {
 		err_setstr(TypeError,
 			   "can't delete sun audio status attributes");
-		return NULL;
+		return 0;
 	}
 	return setmember((char *)&xp->ai, sads_ml, name, v);
 }