Lots of changes, most minor (fatal() instead of abort(), use of
err_fetch/err_restore and so on).  But...
NOTE: import.c has been rewritten and all the DL stuff is now in the
new file importdl.c.
diff --git a/Python/getargs.c b/Python/getargs.c
index 15cd4e6..1232fd0 100644
--- a/Python/getargs.c
+++ b/Python/getargs.c
@@ -38,7 +38,7 @@
 
 
 /* Forward */
-static int vgetargs1 PROTO((object *, char *, va_list, int));
+static int vgetargs1 PROTO((object *, char *, va_list *, int));
 static void seterror PROTO((int, char *, int *, char *, char *));
 static char *convertitem PROTO((object *, char **, va_list *, int *, char *));
 static char *converttuple PROTO((object *, char **, va_list *,
@@ -68,7 +68,7 @@
 	args = va_arg(va, object *);
 	format = va_arg(va, char *);
 #endif
-	retval = vgetargs1(args, format, va, 1);
+	retval = vgetargs1(args, format, &va, 1);
 	va_end(va);
 	return retval;
 }
@@ -95,7 +95,7 @@
 	args = va_arg(va, object *);
 	format = va_arg(va, char *);
 #endif
-	retval = vgetargs1(args, format, va, 0);
+	retval = vgetargs1(args, format, &va, 0);
 	va_end(va);
 	return retval;
 }
@@ -107,15 +107,23 @@
 	char *format;
 	va_list va;
 {
-	return vgetargs1(args, format, va, 0);
+	va_list lva;
+
+#ifdef VA_LIST_IS_ARRAY
+	memcpy(lva, va, sizeof(va_list));
+#else
+	lva = va;
+#endif
+
+	return vgetargs1(args, format, &lva, 0);
 }
 
 
 static int
-vgetargs1(args, format, va, compat)
+vgetargs1(args, format, p_va, compat)
 	object *args;
 	char *format;
-	va_list va;
+	va_list *p_va;
 	int compat;
 {
 	char msgbuf[256];
@@ -186,7 +194,7 @@
 				err_setstr(TypeError, msgbuf);
 				return 0;
 			}
-			msg = convertitem(args, &format, &va, levels, msgbuf);
+			msg = convertitem(args, &format, p_va, levels, msgbuf);
 			if (msg == NULL)
 				return 1;
 			seterror(levels[0], msg, levels+1, fname, message);
@@ -226,7 +234,7 @@
 	for (i = 0; i < len; i++) {
 		if (*format == '|')
 			format++;
-		msg = convertitem(gettupleitem(args, i), &format, &va,
+		msg = convertitem(gettupleitem(args, i), &format, p_va,
 				 levels, msgbuf);
 		if (msg) {
 			seterror(i+1, msg, levels, fname, message);