Kaydet (Commit) aee08794 authored tarafından Guido van Rossum's avatar Guido van Rossum

Made struct a standard built-in module; added string args to {set,get}sockopt;

added gl.gversion().
üst 4526f379
...@@ -27,12 +27,13 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ...@@ -27,12 +27,13 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
/* These modules are normally always included, but *may* be taken out */ /* These modules are normally always included, but *may* be taken out */
#define USE_GRP 1 /* Use together with pwd */ #define USE_GRP 1 /* Use together with pwd */
#define USE_MARSHAL 1 /* This is linked anyway */ #define USE_MARSHAL 1 /* This is linked anyway */
#define USE_MATH 1
#define USE_PWD 1 /* Use together with grp */ #define USE_PWD 1 /* Use together with grp */
#define USE_POSIX 1 #define USE_POSIX 1
#define USE_SELECT 1 #define USE_SELECT 1
#define USE_SOCKET 1 #define USE_SOCKET 1
#define USE_STRUCT 1
#define USE_TIME 1 #define USE_TIME 1
#define USE_MATH 1
#include "PROTO.h" #include "PROTO.h"
#include "mymalloc.h" #include "mymalloc.h"
...@@ -318,7 +319,7 @@ struct { ...@@ -318,7 +319,7 @@ struct {
{"stdwin", initstdwin}, {"stdwin", initstdwin},
#endif #endif
#ifdef USE_STRUCT #ifdef USE_STROP
{"strop", initstrop}, {"strop", initstrop},
#endif #endif
......
...@@ -801,6 +801,18 @@ gl_unpackrect(self, args) ...@@ -801,6 +801,18 @@ gl_unpackrect(self, args)
return unpacked; return unpacked;
} }
% gversion
static object *
gl_gversion(self, args)
object *self;
object *args;
{
char buf[20];
gversion(buf);
return newstringobject(buf);
}
/* End of manually written stubs */ /* End of manually written stubs */
%% %%
......
...@@ -384,8 +384,10 @@ sock_allowbroadcast(s, args) ...@@ -384,8 +384,10 @@ sock_allowbroadcast(s, args)
} }
/* s.setsockopt() method */ /* s.setsockopt() method.
/* XXX this works for integer flags only */ 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 * static object *
sock_setsockopt(s, args) sock_setsockopt(s, args)
...@@ -394,12 +396,21 @@ sock_setsockopt(s, args) ...@@ -394,12 +396,21 @@ sock_setsockopt(s, args)
{ {
int level; int level;
int optname; int optname;
int flag;
int res; int res;
char *buf;
int buflen;
int flag;
if (!getargs(args, "(iii)", &level, &optname, &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; return NULL;
res = setsockopt(s->sock_fd, level, optname, &flag, sizeof flag); }
res = setsockopt(s->sock_fd, level, optname, buf, buflen);
if (res < 0) if (res < 0)
return socket_error(); return socket_error();
INCREF(None); INCREF(None);
...@@ -407,8 +418,10 @@ sock_setsockopt(s, args) ...@@ -407,8 +418,10 @@ sock_setsockopt(s, args)
} }
/* s.getsockopt() method */ /* s.getsockopt() method.
/* XXX this works for integer flags only */ 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 * static object *
sock_getsockopt(s, args) sock_getsockopt(s, args)
...@@ -417,18 +430,37 @@ sock_getsockopt(s, args) ...@@ -417,18 +430,37 @@ sock_getsockopt(s, args)
{ {
int level; int level;
int optname; int optname;
int flag;
int flagsize;
int res; int res;
object *buf;
int buflen;
int flag;
if (!getargs(args, "(ii)", &level, &optname)) if (getargs(args, "(ii)", &level, &optname)) {
return NULL; int flag = 0;
flagsize = sizeof flag; int flagsize = sizeof flag;
flag = 0;
res = getsockopt(s->sock_fd, level, optname, &flag, &flagsize); res = getsockopt(s->sock_fd, level, optname, &flag, &flagsize);
if (res < 0) if (res < 0)
return socket_error(); return socket_error();
return newintobject(flag); return newintobject(flag);
}
err_clear();
if (!getargs(args, "(iii)", &level, &optname, &buflen))
return NULL;
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();
}
resizestring(&buf, buflen);
return buf;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment