* config.c: Added audioop to lists.
* Makefile: change default source directory
* socketmodule.c: added getsockname and getpeername
* bltinmodule.c: corrected typo in type() error message
* Added new built-in functions str() and repr(): repr(x) == `x`;
  str(x) == x if x is a string, otherwise str(x) == repr(x).
* Added joinfields to stropmodule.c (string.join calls joinfields now)
diff --git a/Modules/config.c.in b/Modules/config.c.in
index b2ca0eb..7e67961 100644
--- a/Modules/config.c.in
+++ b/Modules/config.c.in
@@ -136,6 +136,9 @@
 #ifdef USE_AUDIO
 extern void initaudio();
 #endif
+#ifdef USE_AUDIOOP
+extern void initaudioop();
+#endif
 #ifdef USE_CD
 extern void initcd();
 #endif
@@ -242,6 +245,10 @@
 	{"audio",	initaudio},
 #endif
 
+#ifdef USE_AUDIOOP
+	{"audioop",	initaudioop},
+#endif
+
 #ifdef USE_CD
 	{"cd",		initcd},
 #endif
diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c
index b1ab96d..bb451eb 100644
--- a/Modules/socketmodule.c
+++ b/Modules/socketmodule.c
@@ -57,6 +57,8 @@
 - s.getsockopt(level, optname) --> flag
 - s.bind(sockaddr) --> None
 - s.connect(sockaddr) --> None
+- s.getsockname() --> sockaddr
+- s.getpeername() --> sockaddr
 - s.listen(n) --> None
 - s.makefile(mode) --> file object
 - s.recv(nbytes) --> string
@@ -564,6 +566,50 @@
 }
 
 
+/* s.getsockname() method */
+
+static object *
+sock_getsockname(s, args)
+	sockobject *s;
+	object *args;
+{
+	char addrbuf[256];
+	int addrlen, res;
+	if (!getnoarg(args))
+		return NULL;
+	if (!getsockaddrlen(s, &addrlen))
+		return NULL;
+	BGN_SAVE
+	res = getsockname(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
+	END_SAVE
+	if (res < 0)
+		return socket_error();
+	return makesockaddr((struct sockaddr *) addrbuf, addrlen);
+}
+
+
+/* s.getpeername() method */
+
+static object *
+sock_getpeername(s, args)
+	sockobject *s;
+	object *args;
+{
+	char addrbuf[256];
+	int addrlen, res;
+	if (!getnoarg(args))
+		return NULL;
+	if (!getsockaddrlen(s, &addrlen))
+		return NULL;
+	BGN_SAVE
+	res = getpeername(s->sock_fd, (struct sockaddr *) addrbuf, &addrlen);
+	END_SAVE
+	if (res < 0)
+		return socket_error();
+	return makesockaddr((struct sockaddr *) addrbuf, addrlen);
+}
+
+
 /* s.listen(n) method */
 
 static object *
@@ -753,6 +799,8 @@
 	{"close",	sock_close},
 	{"connect",	sock_connect},
 	{"fileno",	sock_fileno},
+	{"getsockname",	sock_getsockname},
+	{"getpeername",	sock_getpeername},
 	{"listen",	sock_listen},
 	{"makefile",	sock_makefile},
 	{"recv",	sock_recv},
diff --git a/Modules/stropmodule.c b/Modules/stropmodule.c
index 835c7db..f00cfc7 100644
--- a/Modules/stropmodule.c
+++ b/Modules/stropmodule.c
@@ -113,6 +113,70 @@
 
 
 static object *
+strop_joinfields(self, args)
+	object *self; /* Not used */
+	object *args;
+{
+	object *seq, *item, *res;
+	object * (*getitem) FPROTO((object *, int));
+	char *sep, *p;
+	int seplen, seqlen, reslen, itemlen, i;
+
+	if (!getargs(args, "(Os#)", &seq, &sep, &seplen))
+		return NULL;
+	if (is_listobject(seq)) {
+		getitem = getlistitem;
+		seqlen = getlistsize(seq);
+	}
+	else if (is_tupleobject(seq)) {
+		getitem = gettupleitem;
+		seqlen = gettuplesize(seq);
+	}
+	else {
+		err_setstr(TypeError, "first argument must be list/tuple");
+		return NULL;
+	}
+	reslen = 0;
+	for (i = 0; i < seqlen; i++) {
+		item = getitem(seq, i);
+		if (!is_stringobject(item)) {
+			err_setstr(TypeError,
+			   "first argument must be list/tuple of strings");
+			return NULL;
+		}
+		if (i > 0)
+			reslen = reslen + seplen;
+		reslen = reslen + getstringsize(item);
+	}
+	if (seqlen == 1) {
+		/* Optimization if there's only one item */
+		item = getitem(seq, 0);
+		INCREF(item);
+		return item;
+	}
+	res = newsizedstringobject((char *)NULL, reslen);
+	if (res == NULL)
+		return NULL;
+	p = getstringvalue(res);
+	for (i = 0; i < seqlen; i++) {
+		item = getitem(seq, i);
+		if (i > 0) {
+			memcpy(p, sep, seplen);
+			p += seplen;
+		}
+		itemlen = getstringsize(item);
+		memcpy(p, getstringvalue(item), itemlen);
+		p += itemlen;
+	}
+	if (p != getstringvalue(res) + reslen) {
+		err_setstr(SystemError, "strop.joinfields: assertion failed");
+		return NULL;
+	}
+	return res;
+}
+
+
+static object *
 strop_index(self, args)
 	object *self; /* Not used */
 	object *args;
@@ -290,6 +354,7 @@
 
 static struct methodlist strop_methods[] = {
 	{"index",	strop_index},
+	{"joinfields",	strop_joinfields},
 	{"lower",	strop_lower},
 	{"split",	strop_split},
 	{"splitfields",	strop_splitfields},
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c
index 18fae5c..a6e02be 100644
--- a/Python/bltinmodule.c
+++ b/Python/bltinmodule.c
@@ -602,12 +602,41 @@
 }
 
 static object *
+builtin_repr(self, v)
+	object *self;
+	object *v;
+{
+	if (v == NULL) {
+		err_badarg();
+		return NULL;
+	}
+	return reprobject(v);
+}
+
+static object *
+builtin_str(self, v)
+	object *self;
+	object *v;
+{
+	if (v == NULL) {
+		err_badarg();
+		return NULL;
+	}
+	if (is_stringobject(v)) {
+		INCREF(v);
+		return v;
+	}
+	else
+		return reprobject(v);
+}
+
+static object *
 builtin_type(self, v)
 	object *self;
 	object *v;
 {
 	if (v == NULL) {
-		err_setstr(TypeError, "type() requres an argument");
+		err_setstr(TypeError, "type() requires an argument");
 		return NULL;
 	}
 	v = (object *)v->ob_type;
@@ -642,7 +671,9 @@
 	{"range",	builtin_range},
 	{"raw_input",	builtin_raw_input},
 	{"reload",	builtin_reload},
+	{"repr",	builtin_repr},
 	{"setattr",	builtin_setattr},
+	{"str",		builtin_str},
 	{"type",	builtin_type},
 	{NULL,		NULL},
 };