Another bulky set of minor changes.

Note addition of gethostbyaddr() and improved repr() for sockets,
renaming of md5.md5() to md5.new(), and fixing of leaks in threads.
This commit is contained in:
Guido van Rossum 1995-01-02 19:30:30 +00:00
parent 437a0e60ba
commit 3bbc62e9c2
18 changed files with 222 additions and 85 deletions

View file

@ -8,8 +8,8 @@
# === Variables set by makesetup ===
MODOBJS= @MODOBJS@
MODLIBS= @MODLIBS@
MODOBJS= _MODOBJS_
MODLIBS= _MODLIBS_
# === Definitions added by makesetup ===
@ -30,15 +30,18 @@ LIBC= @LIBC@
# Machine-dependent subdirectories
MACHDEP= @MACHDEP@
# Install prefix, may be changed by configure
prefix= /usr/local
# Install prefix for architecture-independent files
prefix= @prefix@
# Install prefix for architecture-dependent files
exec_prefix= @exec_prefix@
# Symbols used for using shared libraries
SO= @SO@
LDSHARED= @LDSHARED@
CCSHARED= @CCSHARED@
LINKFORSHARED= @LINKFORSHARED@
DESTSHARED= $(prefix)/lib/python/$(MACHDEP)
DESTSHARED= $(exec_prefix)/lib/python/$(MACHDEP)
# === Variables that are customizable by hand ===
@ -150,6 +153,7 @@ yuvconvert.o: yuvconvert.c
# Rules to build and install all shared modules
sharedmods: $(SHAREDMODS)
sharedinstall: $(SHAREDMODS)
for i in $(SHAREDMODS); do mv $$i $(DESTSHARED)/$$i; done
for i in dummy $(SHAREDMODS); do \
if test -f $$i; then mv $$i $(DESTSHARED)/$$i; fi; done
# Stuff is appended here by makesetup and make depend

View file

@ -41,6 +41,7 @@ static int quitMainLoop = 0;
static int errorInCmd = 0;
static PyObject *excInCmd;
static PyObject *valInCmd;
static PyObject *trbInCmd;
static PyObject *
Tkinter_Error (v)
@ -55,7 +56,7 @@ PythonCmd_Error (interp)
Tcl_Interp *interp;
{
errorInCmd = 1;
PyErr_GetAndClear (&excInCmd, &valInCmd);
PyErr_Fetch (&excInCmd, &valInCmd, &trbInCmd);
return TCL_ERROR;
}
@ -759,7 +760,7 @@ FileHandler (clientData, mask)
if (res == NULL)
{
errorInCmd = 1;
PyErr_GetAndClear (&excInCmd, &valInCmd);
PyErr_Fetch (&excInCmd, &valInCmd, &trbInCmd);
}
Py_XDECREF (res);
}
@ -964,9 +965,10 @@ TimerHandler (clientData)
if (res == NULL)
{
errorInCmd = 1;
PyErr_GetAndClear (&excInCmd, &valInCmd);
PyErr_Fetch (&excInCmd, &valInCmd, &trbInCmd);
}
Py_DECREF (res);
else
Py_DECREF (res);
}
static PyObject *
@ -1020,7 +1022,8 @@ Tkapp_MainLoop (self, args)
if (errorInCmd)
{
errorInCmd = 0;
PyErr_SetObject (excInCmd, valInCmd);
PyErr_Restore (excInCmd, valInCmd, trbInCmd);
excInCmd = valInCmd = trbInCmd = NULL;
return NULL;
}
Py_INCREF (Py_None);
@ -1173,7 +1176,8 @@ EventHook ()
if (errorInCmd) /* XXX Reset tty */
{
errorInCmd = 0;
PyErr_SetObject (excInCmd, valInCmd);
PyErr_Restore (excInCmd, valInCmd, trbInCmd);
excInCmd = valInCmd = trbInCmd = NULL;
PyErr_Print ();
}
if (tk_NumMainWindows > 0)

View file

@ -239,10 +239,8 @@ newarrayobject(size, descr)
int size;
struct arraydescr *descr;
{
int i;
arrayobject *op;
size_t nbytes;
int itemsize;
if (size < 0) {
err_badcall();
return NULL;
@ -308,7 +306,6 @@ ins1(self, where, v)
int where;
object *v;
{
int i;
char *items;
if (v == NULL) {
err_badcall();
@ -366,7 +363,6 @@ static void
array_dealloc(op)
arrayobject *op;
{
int i;
if (op->ob_item != NULL)
DEL(op->ob_item);
DEL(op);
@ -422,7 +418,6 @@ array_slice(a, ilow, ihigh)
int ilow, ihigh;
{
arrayobject *np;
int i;
if (ilow < 0)
ilow = 0;
else if (ilow > a->ob_size)
@ -447,7 +442,6 @@ array_concat(a, bb)
object *bb;
{
int size;
int i;
arrayobject *np;
if (!is_arrayobject(bb)) {
err_badarg();
@ -475,7 +469,7 @@ array_repeat(a, n)
arrayobject *a;
int n;
{
int i, j;
int i;
int size;
arrayobject *np;
char *p;
@ -504,7 +498,6 @@ array_ass_slice(a, ilow, ihigh, v)
char *item;
int n; /* Size of replacement array */
int d; /* Change in size */
int k; /* Loop index */
#define b ((arrayobject *)v)
if (v == NULL)
n = 0;

View file

@ -136,9 +136,6 @@ int sample;
}
/* End of code taken from sox */
/* ADPCM-3 step variation table */
static float newstep[5] = { 0.8, 0.9, 1.0, 1.75, 1.75 };
/* Intel ADPCM step variation table */
static int indexTable[16] = {
-1, -1, -1, -1, 2, 4, 6, 8,
@ -603,7 +600,7 @@ audioop_cross(self, args)
signed char *cp;
int len, size, val;
int i;
int cross, prevval, ncross;
int prevval, ncross;
if ( !getargs(args, "(s#i)", &cp, &len, &size) )
return 0;
@ -1117,7 +1114,7 @@ audioop_adpcm2lin(self, args)
{
signed char *cp;
signed char *ncp;
int len, size, val, valpred, step, delta, index, sign, vpdiff;
int len, size, valpred, step, delta, index, sign, vpdiff;
object *rv, *str, *state;
int i, inputbuffer, bufferstep;

View file

@ -182,6 +182,7 @@ getpythonpath()
/* -- ADDMODULE MARKER 1 -- */
extern void initmarshal();
extern void initimp();
struct {
char *name;
@ -193,6 +194,9 @@ struct {
/* This module "lives in" with marshal.c */
{"marshal", initmarshal},
/* This lives it with import.c */
{"imp", initimp},
/* These entries are here for sys.builtin_module_names */
{"__main__", NULL},
{"__builtin__", NULL},

View file

@ -133,7 +133,7 @@ imageop_tovideo(self, args)
{
int maxx, maxy, x, y, len;
int i;
unsigned char *cp, *ncp, cdata;
unsigned char *cp, *ncp;
int width;
object *rv;
@ -404,9 +404,8 @@ imageop_mono2grey(self, args)
{
int v0, v1, x, y, len, nlen;
unsigned char *cp, *ncp;
unsigned char ovalue;
object *rv;
int i, bit, value;
int i, bit;
if ( !getargs(args, "(s#iiii)", &cp, &len, &x, &y, &v0, &v1) )
return 0;
@ -444,7 +443,6 @@ imageop_grey22grey(self, args)
{
int x, y, len, nlen;
unsigned char *cp, *ncp;
unsigned char ovalue;
object *rv;
int i, pos, value, nvalue;
@ -482,7 +480,6 @@ imageop_grey42grey(self, args)
{
int x, y, len, nlen;
unsigned char *cp, *ncp;
unsigned char ovalue;
object *rv;
int i, pos, value, nvalue;

View file

@ -28,9 +28,9 @@
#
# Copying Makefile.pre to Makefile:
# - insert an identifying comment at the start
# - replace @MODOBJS@ by the list of objects from Setup (except for
# - replace _MODOBJS_ by the list of objects from Setup (except for
# Setup files after a -n option)
# - replace @MODLIBS@ by the list of libraries from Setup
# - replace _MODLIBS_ by the list of libraries from Setup
# - for each object file mentioned in Setup, append a rule
# '<file>.o: <file>.c; <build commands>' to the end of the Makefile
# - for each module mentioned in Setup, append a rule
@ -227,8 +227,8 @@ sed -e 's/[ ]*#.*//' -e '/^[ ]*$/d' |
echo "1i\\" >$sedf
str="# Generated automatically from $makepre by makesetup."
echo "$str" >>$sedf
echo "s%@MODOBJS@%$OBJS%" >>$sedf
echo "s%@MODLIBS@%$LIBS%" >>$sedf
echo "s%_MODOBJS_%$OBJS%" >>$sedf
echo "s%_MODLIBS_%$LIBS%" >>$sedf
echo "/Definitions added by makesetup/a$NL$NL$DEFS" >>$sedf
sed -f $sedf $makepre >Makefile
cat $rulesf >>Makefile

View file

@ -121,7 +121,9 @@ FUNC1(math_exp, exp)
FUNC1(math_fabs, fabs)
FUNC1(math_floor, floor)
FUNC2(math_fmod, fmod)
#ifdef HAVE_HYPOT
FUNC2(math_hypot, hypot)
#endif
FUNC1(math_log, log)
FUNC1(math_log10, log10)
#ifdef MPW_3_1 /* This hack is needed for MPW 3.1 but not for 3.2 ... */
@ -215,7 +217,9 @@ static struct methodlist math_methods[] = {
{"floor", math_floor},
{"fmod", math_fmod},
{"frexp", math_frexp},
#ifdef HAVE_HYPOT
{"hypot", math_hypot},
#endif
{"ldexp", math_ldexp},
{"log", math_log},
{"log10", math_log10},

View file

@ -161,7 +161,7 @@ static typeobject MD5type = {
/* MD5 functions */
static object *
MD5_md5(self, args)
MD5_new(self, args)
object *self;
object *args;
{
@ -188,7 +188,8 @@ MD5_md5(self, args)
/* List of functions exported by this module */
static struct methodlist md5_functions[] = {
{"md5", (method)MD5_md5},
{"new", (method)MD5_new},
{"md5", (method)MD5_new}, /* Backward compatibility */
{NULL, NULL} /* Sentinel */
};

View file

@ -35,6 +35,7 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#include "allobjects.h"
#include "modsupport.h" /* For getargs() etc. */
#include "rename1.h"
#include <assert.h>
#include <sys/types.h> /* For size_t */
@ -573,14 +574,26 @@ mpz_div_and_mod(a, b)
} /* mpz_div_and_mod() */
static object *
mpz_power(a, b)
mpz_power(a, b, m)
mpzobject *a;
mpzobject *b;
mpzobject *m;
{
mpzobject *z;
int cmpres;
long int longtmp1, longtmp2;
if ((object *)m!=Py_None)
{
mpzobject *z2;
INCREF(Py_None);
z=mpz_power(a, b, (mpzobject *)Py_None);
DECREF(Py_None);
if (z==NULL) return(z);
z2=mpz_remainder(z, m);
DECREF(z);
return((object *)z2);
}
if ((cmpres = mpz_cmp_ui(&b->mpz, (unsigned long int)0)) == 0) {
/* the gnu-mp lib sets pow(0,0) to 0, we to 1 */
@ -1607,6 +1620,7 @@ mpz_repr(v)
#define UF (unaryfunc)
#define BF (binaryfunc)
#define TF (ternaryfunc)
#define IF (inquiry)
#define CF (coercion)
@ -1617,7 +1631,7 @@ static number_methods mpz_as_number = {
BF mpz_divide, /*nb_divide*/
BF mpz_remainder, /*nb_remainder*/
BF mpz_div_and_mod, /*nb_divmod*/
BF mpz_power, /*nb_power*/
TF mpz_power, /*nb_power*/
UF mpz_negative, /*nb_negative*/
UF mpz_positive, /*tp_positive*/
UF mpz_absolute, /*tp_absolute*/
@ -1779,15 +1793,15 @@ initmpz()
/* create some frequently used constants */
if ((mpz_value_zero = newmpzobject()) == NULL)
fatal("initmpz: can't initialize mpz contstants");
fatal("initmpz: can't initialize mpz constants");
mpz_set_ui(&mpz_value_zero->mpz, (unsigned long int)0);
if ((mpz_value_one = newmpzobject()) == NULL)
fatal("initmpz: can't initialize mpz contstants");
fatal("initmpz: can't initialize mpz constants");
mpz_set_ui(&mpz_value_one->mpz, (unsigned long int)1);
if ((mpz_value_mone = newmpzobject()) == NULL)
fatal("initmpz: can't initialize mpz contstants");
fatal("initmpz: can't initialize mpz constants");
mpz_set_si(&mpz_value_mone->mpz, (long)-1);
} /* initmpz() */

View file

@ -78,7 +78,6 @@ parser_parsefile(self, args)
char *filename;
FILE *fp;
node *n = NULL;
int err;
object *res;
if (!getargs(args, "s", &filename))
return NULL;

View file

@ -97,23 +97,22 @@ extern int symlink();
#define MAXPATHLEN 1024
#endif /* MAXPATHLEN */
/* unistd.h defines _POSIX_VERSION on POSIX.1 systems. */
#if defined(DIRENT) || defined(_POSIX_VERSION)
#ifdef HAVE_DIRENT_H
#include <dirent.h>
#define NLENGTH(dirent) (strlen((dirent)->d_name))
#else /* not (DIRENT or _POSIX_VERSION) */
#define NAMLEN(dirent) strlen((dirent)->d_name)
#else
#define dirent direct
#define NLENGTH(dirent) ((dirent)->d_namlen)
#ifdef SYSNDIR
#define NAMLEN(dirent) (dirent)->d_namlen
#ifdef HAVE_SYS_NDIR_H
#include <sys/ndir.h>
#endif /* SYSNDIR */
#ifdef SYSDIR
#endif
#ifdef HAVE_SYS_DIR_H
#include <sys/dir.h>
#endif /* SYSDIR */
#ifdef NDIR
#endif
#ifdef HAVE_NDIR_H
#include <ndir.h>
#endif /* NDIR */
#endif /* not (DIRENT or _POSIX_VERSION) */
#endif
#endif
#ifdef NT
#include <direct.h>
@ -406,7 +405,7 @@ posix_listdir(self, args)
return NULL;
}
while ((ep = readdir(dirp)) != NULL) {
v = newstringobject(ep->d_name);
v = newsizedstringobject(ep->d_name, NAMLEN(ep));
if (v == NULL) {
DECREF(d);
d = NULL;

View file

@ -270,7 +270,7 @@ longimagedata(self, args)
long *starttab, *lengthtab;
FILE *inf;
IMAGE image;
int y, z, pos, len, tablen;
int y, z, tablen;
int xsize, ysize, zsize;
int bpp, rle, cur, badorder;
int rlebuflen;

View file

@ -588,6 +588,7 @@ static void RTR_d_region(r, beg, len, doinit)
(list k1 (logior 1 k2) k3 k4 k5)))*/
/* This is done in set_key() above */
#if 0
/*(defun encrypt-region (beg end key)
"Interactivly encrypt the region"
(interactive "r\nsKey:")
@ -611,6 +612,7 @@ static void decrypt_region(r, region, len)
{
RTR_d_region(r,region,len,TRUE);
}
#endif
/* Rotor methods */
@ -726,7 +728,6 @@ PyRotor_SetKey(self, args)
PyRotorObject *self;
PyObject * args;
{
char *key;
char *string;
if (PyArg_Parse(args,"s",&string))

View file

@ -22,7 +22,7 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
******************************************************************/
/* Signal module -- many thanks to Lance Ellinghouse */
/* Signal module -- many thanks to Lance Ellinghaus */
#include "Python.h"
#include "intrcheck.h"
@ -34,6 +34,11 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#define SIG_ERR ((RETSIGTYPE (*)())-1)
#endif
#ifndef NSIG
#define NSIG (_SIGMAX + 1) /* For QNX */
#endif
/*
NOTES ON THE INTERACTION BETWEEN SIGNALS AND THREADS
@ -119,7 +124,6 @@ PySignal_Alarm(self, args)
PyObject *args;
{
int t;
int rtn;
if (!PyArg_Parse(args, "i", &t))
return (PyObject *)NULL;
/* alarm() returns the number of seconds remaining */
@ -218,7 +222,6 @@ void
initsignal()
{
PyObject *m, *d, *x;
PyObject *b_dict;
int i;
#ifdef WITH_THREAD

View file

@ -38,6 +38,7 @@ This module provides an interface to Berkeley socket IPC.
- socket.gethostname() --> host name (string)
- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
- socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...])
- socket.getservbyname(servername, protocolname) --> port number
- socket.socket(family, type [, proto]) --> new socket object
- family and type constants from <socket.h> are accessed as socket.AF_INET etc.
@ -66,6 +67,7 @@ Socket methods:
- s.setblocking(1 | 0) --> Py_None
- s.shutdown(how) --> Py_None
- s.close() --> Py_None
- repr(s) --> "<socket object, fd=%d, family=%d, type=%d, protocol=%d>"
*/
@ -89,6 +91,11 @@ Socket methods:
#undef AF_UNIX
#endif
#ifndef O_NDELAY
#define O_NDELAY O_NONBLOCK /* For QNX only? */
#endif
/* Here we have some hacks to choose between K&R or ANSI style function
definitions. For NT to build this as an extension module (ie, DLL)
it must be compiled by the C++ compiler, as it takes the address of
@ -177,6 +184,12 @@ typedef struct {
int sock_family; /* Address family, e.g., AF_INET */
int sock_type; /* Socket type, e.g., SOCK_STREAM */
int sock_proto; /* Protocol type, usually 0 */
union sock_addr {
struct sockaddr_in in;
#ifdef AF_UNIX
struct sockaddr_un un;
#endif
} sock_addr;
} PySocketSockObject;
@ -194,7 +207,7 @@ staticforward PyTypeObject PySocketSock_Type;
in NEWOBJ()). */
static PySocketSockObject *
BUILD_FUNC_DEF_4(PySocketSock_New, int, fd, int, family, int, type, int, proto)
BUILD_FUNC_DEF_4(PySocketSock_New,int,fd, int,family, int,type, int,proto)
{
PySocketSockObject *s;
s = PyObject_NEW(PySocketSockObject, &PySocketSock_Type);
@ -215,11 +228,17 @@ BUILD_FUNC_DEF_4(PySocketSock_New, int, fd, int, family, int, type, int, proto)
an error occurred; then an exception is raised. */
static int
BUILD_FUNC_DEF_2(setipaddr, char*, name, struct sockaddr_in *, addr_ret)
BUILD_FUNC_DEF_2(setipaddr, char*,name, struct sockaddr_in *,addr_ret)
{
struct hostent *hp;
int d1, d2, d3, d4;
char ch;
#ifdef HAVE_GETHOSTBYNAME_R
struct hostent hp_allocated;
char buf[1001];
int buf_len = (sizeof buf) - 1;
int errnop;
#endif /* HAVE_GETHOSTBYNAME_R */
if (name[0] == '\0') {
addr_ret->sin_addr.s_addr = INADDR_ANY;
@ -237,11 +256,22 @@ BUILD_FUNC_DEF_2(setipaddr, char*, name, struct sockaddr_in *, addr_ret)
((long) d3 << 8) | ((long) d4 << 0));
return 4;
}
#ifdef HAVE_GETHOSTBYNAME_R
Py_BEGIN_ALLOW_THREADS
hp = gethostbyname(name);
hp = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Py_END_ALLOW_THREADS
#else /* not HAVE_GETHOSTBYNAME_R */
hp = gethostbyname(name);
#endif /* HAVE_GETHOSTBYNAME_R */
if (hp == NULL) {
#ifndef NT
/* Let's get real error message to return */
extern int h_errno;
PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
#else
PyErr_SetString(PySocket_Error, "host not found");
#endif
return -1;
}
memcpy((char *) &addr_ret->sin_addr, hp->h_addr, hp->h_length);
@ -272,7 +302,7 @@ BUILD_FUNC_DEF_1(makeipaddr, struct sockaddr_in *,addr)
/*ARGSUSED*/
static PyObject *
BUILD_FUNC_DEF_2(makesockaddr,struct sockaddr *, addr, int, addrlen)
BUILD_FUNC_DEF_2(makesockaddr,struct sockaddr *,addr, int,addrlen)
{
if (addrlen == 0) {
/* No address -- may be recvfrom() from known socket */
@ -323,36 +353,38 @@ getsockaddrarg,PySocketSockObject *,s, PyObject *,args, struct sockaddr **,addr_
#ifdef AF_UNIX
case AF_UNIX:
{
static struct sockaddr_un addr;
struct sockaddr_un* addr;
char *path;
int len;
addr = (struct sockaddr_un* )&(s->sock_addr).un;
if (!PyArg_Parse(args, "s#", &path, &len))
return 0;
if (len > sizeof addr.sun_path) {
if (len > sizeof addr->sun_path) {
PyErr_SetString(PySocket_Error, "AF_UNIX path too long");
return 0;
}
addr.sun_family = AF_UNIX;
memcpy(addr.sun_path, path, len);
*addr_ret = (struct sockaddr *) &addr;
*len_ret = len + sizeof addr.sun_family;
addr->sun_family = AF_UNIX;
memcpy(addr->sun_path, path, len);
*addr_ret = (struct sockaddr *) addr;
*len_ret = len + sizeof addr->sun_family;
return 1;
}
#endif /* AF_UNIX */
case AF_INET:
{
static struct sockaddr_in addr;
struct sockaddr_in* addr;
char *host;
int port;
addr=(struct sockaddr_in*)&(s->sock_addr).in;
if (!PyArg_Parse(args, "(si)", &host, &port))
return 0;
if (setipaddr(host, &addr) < 0)
if (setipaddr(host, addr) < 0)
return 0;
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
*addr_ret = (struct sockaddr *) &addr;
*len_ret = sizeof addr;
addr->sin_family = AF_INET;
addr->sin_port = htons(port);
*addr_ret = (struct sockaddr *) addr;
*len_ret = sizeof *addr;
return 1;
}
@ -764,7 +796,7 @@ BUILD_FUNC_DEF_2(PySocketSock_recvfrom,PySocketSockObject *,s, PyObject *,args)
#ifndef NT
(ANY *)addrbuf, &addrlen);
#else
(struct sockaddr *)addrbuf, &addrlen);
(struct sockaddr *)addrbuf, &addrlen);
#endif
Py_END_ALLOW_THREADS
if (n < 0)
@ -854,7 +886,7 @@ static PyMethodDef PySocketSock_methods[] = {
{"allowbroadcast", (PyCFunction)PySocketSock_allowbroadcast},
#endif
#ifndef NT
{"setblocking", (PyCFunction)PySocketSock_setblocking},
{"setblocking", (PyCFunction)PySocketSock_setblocking},
#endif
{"setsockopt", (PyCFunction)PySocketSock_setsockopt},
{"getsockopt", (PyCFunction)PySocketSock_getsockopt},
@ -883,7 +915,7 @@ static PyMethodDef PySocketSock_methods[] = {
First close the file description. */
static void
BUILD_FUNC_DEF_1(PySocketSock_dealloc, PySocketSockObject *,s)
BUILD_FUNC_DEF_1(PySocketSock_dealloc,PySocketSockObject *,s)
{
(void) close(s->sock_fd);
PyMem_DEL(s);
@ -899,6 +931,22 @@ BUILD_FUNC_DEF_2(PySocketSock_getattr,PySocketSockObject *,s, char *,name)
}
static PyObject *
BUILD_FUNC_DEF_1(PySocketSock_repr,PySocketSockObject *,s)
{
PyObject *addro;
struct sockaddr *addr;
char buf[512];
object *t, *comma, *v;
int i, len;
sprintf(buf,
"<socket object, fd=%d, family=%d, type=%d, protocol=%d>",
s->sock_fd, s->sock_family, s->sock_type, s->sock_proto);
t = newstringobject(buf);
return t;
}
/* Type object for socket objects. */
static PyTypeObject PySocketSock_Type = {
@ -912,7 +960,7 @@ static PyTypeObject PySocketSock_Type = {
(getattrfunc)PySocketSock_getattr, /*tp_getattr*/
0, /*tp_setattr*/
0, /*tp_compare*/
0, /*tp_repr*/
(reprfunc)PySocketSock_repr, /*tp_repr*/
0, /*tp_as_number*/
0, /*tp_as_sequence*/
0, /*tp_as_mapping*/
@ -954,6 +1002,65 @@ BUILD_FUNC_DEF_2(PySocket_gethostbyname,PyObject *,self, PyObject *,args)
return makeipaddr(&addrbuf);
}
/* Python interface to gethostbyaddr(IP). */
/*ARGSUSED*/
static PyObject *
BUILD_FUNC_DEF_2(PySocket_gethostbyaddr,PyObject *,self, PyObject *, args)
{
struct sockaddr_in addr;
char *ip_num;
struct hostent *h;
int d1,d2,d3,d4;
char ch, **pch;
PyObject *rtn_tuple = (PyObject *)NULL;
PyObject *name_list = (PyObject *)NULL;
PyObject *addr_list = (PyObject *)NULL;
PyObject *tmp;
if (!PyArg_Parse(args, "s", &ip_num))
return NULL;
if (setipaddr(ip_num, &addr) < 0)
return NULL;
h = gethostbyaddr((char *)&addr.sin_addr,
sizeof(addr.sin_addr),
AF_INET);
if (h == NULL) {
#ifndef NT
/* Let's get real error message to return */
extern int h_errno;
PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
#else
PyErr_SetString(PySocket_Error, "host not found");
#endif
return NULL;
}
if ((name_list = PyList_New(0)) == NULL)
goto err;
if ((addr_list = PyList_New(0)) == NULL)
goto err;
for (pch = h->h_aliases; *pch != NULL; pch++) {
tmp = PyString_FromString(*pch);
if (tmp == NULL)
goto err;
PyList_Append(name_list, tmp);
Py_DECREF(tmp);
}
for (pch = h->h_addr_list; *pch != NULL; pch++) {
memcpy((char *) &addr.sin_addr, *pch, h->h_length);
tmp = makeipaddr(&addr);
if (tmp == NULL)
goto err;
PyList_Append(addr_list, tmp);
Py_DECREF(tmp);
}
rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
err:
Py_XDECREF(name_list);
Py_XDECREF(addr_list);
return rtn_tuple;
}
/* Python interface to getservbyname(name).
This only returns the port number, since the other info is already
@ -984,7 +1091,7 @@ BUILD_FUNC_DEF_2(PySocket_getservbyname,PyObject *,self, PyObject *,args)
/*ARGSUSED*/
static PyObject *
BUILD_FUNC_DEF_2(PySocket_socket,PyObject *,self,PyObject *,args)
BUILD_FUNC_DEF_2(PySocket_socket,PyObject *,self, PyObject *,args)
{
PySocketSockObject *s;
int fd, family, type, proto;
@ -1019,7 +1126,7 @@ BUILD_FUNC_DEF_2(PySocket_socket,PyObject *,self,PyObject *,args)
/*ARGSUSED*/
static PyObject *
BUILD_FUNC_DEF_2(PySocket_fromfd,PyObject *,self,PyObject *,args)
BUILD_FUNC_DEF_2(PySocket_fromfd,PyObject *,self, PyObject *,args)
{
PySocketSockObject *s;
int fd, family, type, proto;
@ -1047,6 +1154,7 @@ BUILD_FUNC_DEF_2(PySocket_fromfd,PyObject *,self,PyObject *,args)
static PyMethodDef PySocket_methods[] = {
{"gethostbyname", PySocket_gethostbyname},
{"gethostbyaddr", PySocket_gethostbyaddr},
{"gethostname", PySocket_gethostname},
{"getservbyname", PySocket_getservbyname},
{"socket", PySocket_socket},
@ -1061,7 +1169,7 @@ static PyMethodDef PySocket_methods[] = {
For simplicity, errors (which are unlikely anyway) are ignored. */
static void
BUILD_FUNC_DEF_3(insint,PyObject *,d,char *,name,int,value)
BUILD_FUNC_DEF_3(insint,PyObject *,d, char *,name, int,value)
{
PyObject *v = PyInt_FromLong((long) value);
if (v == NULL) {

View file

@ -205,7 +205,9 @@ t_bootstrap(args_raw)
fprintf(stderr, "Unhandled exception in thread:\n");
print_error(); /* From pythonmain.c */
}
(void) save_thread();
else
DECREF(res);
(void) save_thread(); /* Should always be NULL */
exit_thread();
}
@ -236,9 +238,11 @@ thread_exit_thread(self, args)
object *self; /* Not used */
object *args;
{
object *frame;
if (!getnoarg(args))
return NULL;
(void) save_thread();
frame = save_thread(); /* Should never be NULL */
DECREF(frame);
exit_thread();
for (;;) { } /* Should not be reached */
}

View file

@ -297,8 +297,13 @@ floattime()
#ifdef HAVE_GETTIMEOFDAY
{
struct timeval t;
#ifdef GETTIMEOFDAY_NO_TZ
if (gettimeofday(&t) == 0)
return (double)t.tv_sec + t.tv_usec*0.000001;
#else /* !GETTIMEOFDAY_NO_TZ */
if (gettimeofday(&t, (struct timezone *)NULL) == 0)
return (double)t.tv_sec + t.tv_usec*0.000001;
#endif /* !GETTIMEOFDAY_NO_TZ */
}
#endif /* !HAVE_GETTIMEOFDAY */
{