diff Modules/socketmodule.c @ 1039:6aa0ee14ac2e legacy-trunk

Made struct a standard built-in module; added string args to {set,get}sockopt; added gl.gversion().
author Guido van Rossum <guido@python.org>
date Tue, 08 Sep 1992 09:05:33 +0000
parents c156d4960c2b
children d2af6bdcb6d0
line wrap: on
line diff
--- a/Modules/socketmodule.c	Mon Sep 07 15:28:57 1992 +0000
+++ b/Modules/socketmodule.c	Tue Sep 08 09:05:33 1992 +0000
@@ -384,8 +384,10 @@
 }
 
 
-/* s.setsockopt() method */
-/* XXX this works for integer flags only */
+/* s.setsockopt() method.
+   With an integer third argument, sets an integer option.
+   With a string third argument, sets an option from a buffer;
+   use optional built-in module 'struct' to encode the string. */
 
 static object *
 sock_setsockopt(s, args)
@@ -394,12 +396,21 @@
 {
 	int level;
 	int optname;
+	int res;
+	char *buf;
+	int buflen;
 	int flag;
-	int res;
 
-	if (!getargs(args, "(iii)", &level, &optname, &flag))
-		return NULL;
-	res = setsockopt(s->sock_fd, level, optname, &flag, sizeof flag);
+	if (getargs(args, "(iii)", &level, &optname, &flag)) {
+		buf = (char *) &flag;
+		buflen = sizeof flag;
+	}
+	else {
+		err_clear();
+		if (!getargs(args, "(iis#)", &level, &optname, &buf, &buflen))
+			return NULL;
+	}
+	res = setsockopt(s->sock_fd, level, optname, buf, buflen);
 	if (res < 0)
 		return socket_error();
 	INCREF(None);
@@ -407,8 +418,10 @@
 }
 
 
-/* s.getsockopt() method */
-/* XXX this works for integer flags only */
+/* s.getsockopt() method.
+   With two arguments, retrieves an integer option.
+   With a third integer argument, retrieves a string buffer of that size;
+   use optional built-in module 'struct' to decode the string. */
 
 static object *
 sock_getsockopt(s, args)
@@ -417,18 +430,37 @@
 {
 	int level;
 	int optname;
+	int res;
+	object *buf;
+	int buflen;
 	int flag;
-	int flagsize;
-	int res;
 
-	if (!getargs(args, "(ii)", &level, &optname))
+	if (getargs(args, "(ii)", &level, &optname)) {
+		int flag = 0;
+		int flagsize = sizeof flag;
+		res = getsockopt(s->sock_fd, level, optname, &flag, &flagsize);
+		if (res < 0)
+			return socket_error();
+		return newintobject(flag);
+	}
+	err_clear();
+	if (!getargs(args, "(iii)", &level, &optname, &buflen))
 		return NULL;
-	flagsize = sizeof flag;
-	flag = 0;
-	res = getsockopt(s->sock_fd, level, optname, &flag, &flagsize);
-	if (res < 0)
+	if (buflen <= 0 || buflen > 1024) {
+		err_setstr(SocketError, "getsockopt buflen out of range");
+		return NULL;
+	}
+	buf = newsizedstringobject((char *)NULL, buflen);
+	if (buf == NULL)
+		return NULL;
+	res = getsockopt(s->sock_fd, level, optname, getstringvalue(buf),
+			 &buflen);
+	if (res < 0) {
+		DECREF(buf);
 		return socket_error();
-	return newintobject(flag);
+	}
+	resizestring(&buf, buflen);
+	return buf;
 }