Port to Solaris 2.3.
diff --git a/Modules/md5module.c b/Modules/md5module.c
index 8bfbafb..6230cee 100644
--- a/Modules/md5module.c
+++ b/Modules/md5module.c
@@ -41,8 +41,6 @@
 
 #define is_md5object(v)		((v)->ob_type == &MD5type)
 
-static const char initialiser_name[] = "md5";
-
 /* #define MD5_DEBUG */
 
 static md5object *
@@ -207,7 +205,7 @@
 /* List of functions exported by this module */
 
 static struct methodlist md5_functions[] = {
-	{initialiser_name,	MD5_md5},
+	{"md5",			MD5_md5},
 	{NULL,			NULL}		 /* Sentinel */
 };
 
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);
 }
diff --git a/Modules/threadmodule.c b/Modules/threadmodule.c
index f22aa8c..40169a3 100644
--- a/Modules/threadmodule.c
+++ b/Modules/threadmodule.c
@@ -195,7 +195,7 @@
 	func = gettupleitem(args, 0);
 	arg = gettupleitem(args, 1);
 	res = call_object(func, arg);
-	DECREF(arg); /* Matches the INCREF(arg) in thread_start_new_thread */
+	DECREF(args); /* Matches the INCREF(args) in thread_start_new_thread */
 	if (res == NULL) {
 		fprintf(stderr, "Unhandled exception in thread:\n");
 		print_error(); /* From pythonmain.c */