Skip to content
Projeler
Gruplar
Parçacıklar
Yardım
Yükleniyor...
Oturum aç / Kaydol
Gezinmeyi değiştir
C
cpython
Proje
Proje
Ayrıntılar
Etkinlik
Cycle Analytics
Depo (repository)
Depo (repository)
Dosyalar
Kayıtlar (commit)
Dallar (branch)
Etiketler
Katkıda bulunanlar
Grafik
Karşılaştır
Grafikler
Konular (issue)
0
Konular (issue)
0
Liste
Pano
Etiketler
Kilometre Taşları
Birleştirme (merge) Talepleri
0
Birleştirme (merge) Talepleri
0
CI / CD
CI / CD
İş akışları (pipeline)
İşler
Zamanlamalar
Grafikler
Paketler
Paketler
Wiki
Wiki
Parçacıklar
Parçacıklar
Üyeler
Üyeler
Collapse sidebar
Close sidebar
Etkinlik
Grafik
Grafikler
Yeni bir konu (issue) oluştur
İşler
Kayıtlar (commit)
Konu (issue) Panoları
Kenar çubuğunu aç
Batuhan Osman TASKAYA
cpython
Commits
73624e9c
Kaydet (Commit)
73624e9c
authored
Eki 10, 1994
tarafından
Guido van Rossum
Dosyalara gözat
Seçenekler
Dosyalara Gözat
İndir
Eposta Yamaları
Sade Fark
new style
üst
4a91df41
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
279 additions
and
280 deletions
+279
-280
socketmodule.c
Modules/socketmodule.c
+279
-280
No files found.
Modules/socketmodule.c
Dosyayı görüntüle @
73624e9c
...
...
@@ -51,27 +51,25 @@ Interface:
Socket methods:
- s.accept() --> new socket object, sockaddr
- s.setsockopt(level, optname, flag) --> None
- s.setsockopt(level, optname, flag) -->
Py_
None
- s.getsockopt(level, optname) --> flag
- s.bind(sockaddr) --> None
- s.connect(sockaddr) --> None
- s.bind(sockaddr) -->
Py_
None
- s.connect(sockaddr) -->
Py_
None
- s.getsockname() --> sockaddr
- s.getpeername() --> sockaddr
- s.listen(n) --> None
- s.listen(n) -->
Py_
None
- s.makefile(mode) --> file object
- s.recv(nbytes [,flags]) --> string
- s.recvfrom(nbytes [,flags]) --> string, sockaddr
- s.send(string [,flags]) --> nbytes
- s.sendto(string, [flags,] sockaddr) --> nbytes
- s.setblocking(1 | 0) --> None
- s.shutdown(how) --> None
- s.close() --> None
- s.setblocking(1 | 0) -->
Py_
None
- s.shutdown(how) -->
Py_
None
- s.close() -->
Py_
None
*/
#include "allobjects.h"
#include "modsupport.h"
#include "ceval.h"
#include "Python.h"
#include <sys/types.h>
#include "mytime.h"
...
...
@@ -144,28 +142,28 @@ fnname( arg1name, arg2name, arg3name, arg4name ) \
/* Global variable holding the exception type for errors detected
by this module (but not argument type or memory errors, etc.). */
static
object
*
Socket
Error
;
static
PyObject
*
PySocket_
Error
;
/* Convenience function to raise an error according to errno
and return a NULL pointer from a function. */
static
o
bject
*
socket_erro
r
()
static
PyO
bject
*
PySocket_Er
r
()
{
#ifdef NT
if
(
WSAGetLastError
())
{
o
bject
*
v
;
v
=
mkv
alue
(
"(is)"
,
WSAGetLastError
(),
"winsock error"
);
PyO
bject
*
v
;
v
=
Py_BuildV
alue
(
"(is)"
,
WSAGetLastError
(),
"winsock error"
);
if
(
v
!=
NULL
)
{
err_setval
(
Socket
Error
,
v
);
DECREF
(
v
);
PyErr_SetObject
(
PySocket_
Error
,
v
);
Py_
DECREF
(
v
);
}
return
NULL
;
}
else
#endif
return
err_errno
(
Socket
Error
);
return
PyErr_SetFromErrno
(
PySocket_
Error
);
}
...
...
@@ -174,20 +172,20 @@ socket_error()
arguments properly. */
typedef
struct
{
OB
_HEAD
PyObject
_HEAD
int
sock_fd
;
/* Socket file descriptor */
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 */
}
socko
bject
;
}
PySocketSockO
bject
;
/* A forward reference to the Socktype type object.
The Socktype variable contains pointers to various functions,
some of which call newsocobject(), which uses Socktype, so
some of which call newsoc
k
object(), which uses Socktype, so
there has to be a circular reference. */
staticforward
typeobject
Sockt
ype
;
staticforward
PyTypeObject
PySocketSock_T
ype
;
/* Create a new socket object.
...
...
@@ -195,11 +193,11 @@ staticforward typeobject Socktype;
If the creation fails, return NULL and set an exception (implicit
in NEWOBJ()). */
static
socko
bject
*
BUILD_FUNC_DEF_4
(
newsockobject
,
int
,
fd
,
int
,
family
,
int
,
type
,
int
,
proto
)
static
PySocketSockO
bject
*
BUILD_FUNC_DEF_4
(
PySocketSock_New
,
int
,
fd
,
int
,
family
,
int
,
type
,
int
,
proto
)
{
socko
bject
*
s
;
s
=
NEWOBJ
(
sockobject
,
&
Sockt
ype
);
PySocketSockO
bject
*
s
;
s
=
PyObject_NEW
(
PySocketSockObject
,
&
PySocketSock_T
ype
);
if
(
s
!=
NULL
)
{
s
->
sock_fd
=
fd
;
s
->
sock_family
=
family
;
...
...
@@ -239,11 +237,11 @@ BUILD_FUNC_DEF_2(setipaddr, char*, name, struct sockaddr_in *, addr_ret)
((
long
)
d3
<<
8
)
|
((
long
)
d4
<<
0
));
return
4
;
}
BGN_SAVE
Py_BEGIN_ALLOW_THREADS
hp
=
gethostbyname
(
name
);
END_SAVE
Py_END_ALLOW_THREADS
if
(
hp
==
NULL
)
{
err_setstr
(
Socket
Error
,
"host not found"
);
PyErr_SetString
(
PySocket_
Error
,
"host not found"
);
return
-
1
;
}
memcpy
((
char
*
)
&
addr_ret
->
sin_addr
,
hp
->
h_addr
,
hp
->
h_length
);
...
...
@@ -255,7 +253,7 @@ BUILD_FUNC_DEF_2(setipaddr, char*, name, struct sockaddr_in *, addr_ret)
This is always a string of the form 'dd.dd.dd.dd' (with variable
size numbers). */
static
o
bject
*
static
PyO
bject
*
BUILD_FUNC_DEF_1
(
makeipaddr
,
struct
sockaddr_in
*
,
addr
)
{
long
x
=
ntohl
(
addr
->
sin_addr
.
s_addr
);
...
...
@@ -263,7 +261,7 @@ BUILD_FUNC_DEF_1(makeipaddr, struct sockaddr_in *,addr)
sprintf
(
buf
,
"%d.%d.%d.%d"
,
(
int
)
(
x
>>
24
)
&
0xff
,
(
int
)
(
x
>>
16
)
&
0xff
,
(
int
)
(
x
>>
8
)
&
0xff
,
(
int
)
(
x
>>
0
)
&
0xff
);
return
newstringobject
(
buf
);
return
PyString_FromString
(
buf
);
}
...
...
@@ -273,13 +271,13 @@ BUILD_FUNC_DEF_1(makeipaddr, struct sockaddr_in *,addr)
to determine what kind of address it really is. */
/*ARGSUSED*/
static
o
bject
*
static
PyO
bject
*
BUILD_FUNC_DEF_2
(
makesockaddr
,
struct
sockaddr
*
,
addr
,
int
,
addrlen
)
{
if
(
addrlen
==
0
)
{
/* No address -- may be recvfrom() from known socket */
INCREF
(
None
);
return
None
;
Py_INCREF
(
Py_
None
);
return
Py_
None
;
}
switch
(
addr
->
sa_family
)
{
...
...
@@ -287,9 +285,9 @@ BUILD_FUNC_DEF_2(makesockaddr,struct sockaddr *, addr, int, addrlen)
case
AF_INET
:
{
struct
sockaddr_in
*
a
=
(
struct
sockaddr_in
*
)
addr
;
o
bject
*
addr
=
makeipaddr
(
a
);
object
*
ret
=
mkv
alue
(
"Oi"
,
addr
,
ntohs
(
a
->
sin_port
));
XDECREF
(
addr
);
PyO
bject
*
addr
=
makeipaddr
(
a
);
PyObject
*
ret
=
Py_BuildV
alue
(
"Oi"
,
addr
,
ntohs
(
a
->
sin_port
));
Py_
XDECREF
(
addr
);
return
ret
;
}
...
...
@@ -297,14 +295,14 @@ BUILD_FUNC_DEF_2(makesockaddr,struct sockaddr *, addr, int, addrlen)
case
AF_UNIX
:
{
struct
sockaddr_un
*
a
=
(
struct
sockaddr_un
*
)
addr
;
return
newstringobject
(
a
->
sun_path
);
return
PyString_FromString
(
a
->
sun_path
);
}
#endif
/* AF_UNIX */
/* More cases here... */
default:
err_setstr
(
Socket
Error
,
"return unknown socket address type"
);
PyErr_SetString
(
PySocket_
Error
,
"return unknown socket address type"
);
return
NULL
;
}
...
...
@@ -318,7 +316,7 @@ BUILD_FUNC_DEF_2(makesockaddr,struct sockaddr *, addr, int, addrlen)
static
int
BUILD_FUNC_DEF_4
(
getsockaddrarg
,
sockobject
*
,
s
,
o
bject
*
,
args
,
struct
sockaddr
**
,
addr_ret
,
int
*
,
len_ret
)
getsockaddrarg
,
PySocketSockObject
*
,
s
,
PyO
bject
*
,
args
,
struct
sockaddr
**
,
addr_ret
,
int
*
,
len_ret
)
{
switch
(
s
->
sock_family
)
{
...
...
@@ -328,10 +326,10 @@ getsockaddrarg,sockobject *,s, object *,args, struct sockaddr **,addr_ret, int *
static
struct
sockaddr_un
addr
;
char
*
path
;
int
len
;
if
(
!
getargs
(
args
,
"s#"
,
&
path
,
&
len
))
if
(
!
PyArg_Parse
(
args
,
"s#"
,
&
path
,
&
len
))
return
0
;
if
(
len
>
sizeof
addr
.
sun_path
)
{
err_setstr
(
Socket
Error
,
"AF_UNIX path too long"
);
PyErr_SetString
(
PySocket_
Error
,
"AF_UNIX path too long"
);
return
0
;
}
addr
.
sun_family
=
AF_UNIX
;
...
...
@@ -347,7 +345,7 @@ getsockaddrarg,sockobject *,s, object *,args, struct sockaddr **,addr_ret, int *
static
struct
sockaddr_in
addr
;
char
*
host
;
int
port
;
if
(
!
getargs
(
args
,
"(si)"
,
&
host
,
&
port
))
if
(
!
PyArg_Parse
(
args
,
"(si)"
,
&
host
,
&
port
))
return
0
;
if
(
setipaddr
(
host
,
&
addr
)
<
0
)
return
0
;
...
...
@@ -361,7 +359,7 @@ getsockaddrarg,sockobject *,s, object *,args, struct sockaddr **,addr_ret, int *
/* More cases here... */
default:
err_setstr
(
Socket
Error
,
"getsockaddrarg: bad family"
);
PyErr_SetString
(
PySocket_
Error
,
"getsockaddrarg: bad family"
);
return
0
;
}
...
...
@@ -373,7 +371,7 @@ getsockaddrarg,sockobject *,s, object *,args, struct sockaddr **,addr_ret, int *
through len_ret. */
static
int
BUILD_FUNC_DEF_2
(
getsockaddrlen
,
socko
bject
*
,
s
,
int
*
,
len_ret
)
BUILD_FUNC_DEF_2
(
getsockaddrlen
,
PySocketSockO
bject
*
,
s
,
int
*
,
len_ret
)
{
switch
(
s
->
sock_family
)
{
...
...
@@ -394,7 +392,7 @@ BUILD_FUNC_DEF_2(getsockaddrlen,sockobject *,s, int *,len_ret)
/* More cases here... */
default:
err_setstr
(
Socket
Error
,
"getsockaddrarg: bad family"
);
PyErr_SetString
(
PySocket_
Error
,
"getsockaddrarg: bad family"
);
return
0
;
}
...
...
@@ -403,33 +401,33 @@ BUILD_FUNC_DEF_2(getsockaddrlen,sockobject *,s, int *,len_ret)
/* s.accept() method */
static
o
bject
*
BUILD_FUNC_DEF_2
(
sock_accept
,
sockobject
*
,
s
,
o
bject
*
,
args
)
static
PyO
bject
*
BUILD_FUNC_DEF_2
(
PySocketSock_accept
,
PySocketSockObject
*
,
s
,
PyO
bject
*
,
args
)
{
char
addrbuf
[
256
];
int
addrlen
,
newfd
;
o
bject
*
sock
,
*
addr
,
*
res
;
if
(
!
getnoarg
(
args
))
PyO
bject
*
sock
,
*
addr
,
*
res
;
if
(
!
PyArg_NoArgs
(
args
))
return
NULL
;
if
(
!
getsockaddrlen
(
s
,
&
addrlen
))
return
NULL
;
BGN_SAVE
Py_BEGIN_ALLOW_THREADS
newfd
=
accept
(
s
->
sock_fd
,
(
struct
sockaddr
*
)
addrbuf
,
&
addrlen
);
END_SAVE
Py_END_ALLOW_THREADS
if
(
newfd
<
0
)
return
socket_erro
r
();
return
PySocket_Er
r
();
/* Create the new object with unspecified family,
to avoid calls to bind() etc. on it. */
sock
=
(
object
*
)
newsockobject
(
newfd
,
sock
=
(
PyObject
*
)
PySocketSock_New
(
newfd
,
s
->
sock_family
,
s
->
sock_type
,
s
->
sock_proto
);
if
(
sock
==
NULL
)
close
(
newfd
);
addr
=
makesockaddr
((
struct
sockaddr
*
)
addrbuf
,
addrlen
);
res
=
mkv
alue
(
"OO"
,
sock
,
addr
);
XDECREF
(
sock
);
XDECREF
(
addr
);
res
=
Py_BuildV
alue
(
"OO"
,
sock
,
addr
);
Py_
XDECREF
(
sock
);
Py_
XDECREF
(
addr
);
return
res
;
}
...
...
@@ -438,19 +436,19 @@ BUILD_FUNC_DEF_2(sock_accept,sockobject *,s, object *,args)
/* s.allowbroadcast() method */
/* XXX obsolete -- will disappear in next release */
static
o
bject *
BUILD_FUNC_DEF_2(
sock_allowbroadcast,sockobject *,s, o
bject *,args)
static
PyO
bject *
BUILD_FUNC_DEF_2(
PySocketSock_allowbroadcast,PySocketSockObject *,s, PyO
bject *,args)
{
int flag;
int res;
if (!
getargs
(args, "i", &flag))
if (!
PyArg_Parse
(args, "i", &flag))
return NULL;
res = setsockopt(s->sock_fd, SOL_SOCKET, SO_BROADCAST,
(ANY *)&flag, sizeof flag);
if (res < 0)
return
socket_erro
r();
INCREF(
None);
return None;
return
PySocket_Er
r();
Py_INCREF(Py_
None);
return
Py_
None;
}
#endif
...
...
@@ -459,26 +457,26 @@ BUILD_FUNC_DEF_2(sock_allowbroadcast,sockobject *,s, object *,args)
/* s.setblocking(1 | 0) method */
static
o
bject
*
s
ock_setblocking
(
s
,
args
)
socko
bject
*
s
;
o
bject
*
args
;
static
PyO
bject
*
PySocketS
ock_setblocking
(
s
,
args
)
PySocketSockO
bject
*
s
;
PyO
bject
*
args
;
{
int
block
;
int
delay_flag
;
if
(
!
getintarg
(
args
,
&
block
))
if
(
!
PyArg_GetInt
(
args
,
&
block
))
return
NULL
;
BGN_SAVE
Py_BEGIN_ALLOW_THREADS
delay_flag
=
fcntl
(
s
->
sock_fd
,
F_GETFL
,
0
);
if
(
block
)
delay_flag
&=
(
~
O_NDELAY
);
else
delay_flag
|=
O_NDELAY
;
fcntl
(
s
->
sock_fd
,
F_SETFL
,
delay_flag
);
END_SAVE
Py_END_ALLOW_THREADS
INCREF
(
None
);
return
None
;
Py_INCREF
(
Py_
None
);
return
Py_
None
;
}
#endif
...
...
@@ -488,8 +486,8 @@ sock_setblocking(s, args)
With a string third argument, sets an option from a buffer;
use optional built-in module 'struct' to encode the string. */
static
o
bject
*
BUILD_FUNC_DEF_2
(
sock_setsockopt
,
sockobject
*
,
s
,
o
bject
*
,
args
)
static
PyO
bject
*
BUILD_FUNC_DEF_2
(
PySocketSock_setsockopt
,
PySocketSockObject
*
,
s
,
PyO
bject
*
,
args
)
{
int
level
;
int
optname
;
...
...
@@ -498,20 +496,20 @@ BUILD_FUNC_DEF_2(sock_setsockopt,sockobject *,s, object *,args)
int
buflen
;
int
flag
;
if
(
getargs
(
args
,
"(iii)"
,
&
level
,
&
optname
,
&
flag
))
{
if
(
PyArg_Parse
(
args
,
"(iii)"
,
&
level
,
&
optname
,
&
flag
))
{
buf
=
(
char
*
)
&
flag
;
buflen
=
sizeof
flag
;
}
else
{
err_c
lear
();
if
(
!
getargs
(
args
,
"(iis#)"
,
&
level
,
&
optname
,
&
buf
,
&
buflen
))
PyErr_C
lear
();
if
(
!
PyArg_Parse
(
args
,
"(iis#)"
,
&
level
,
&
optname
,
&
buf
,
&
buflen
))
return
NULL
;
}
res
=
setsockopt
(
s
->
sock_fd
,
level
,
optname
,
(
ANY
*
)
buf
,
buflen
);
if
(
res
<
0
)
return
socket_erro
r
();
INCREF
(
None
);
return
None
;
return
PySocket_Er
r
();
Py_INCREF
(
Py_
None
);
return
Py_
None
;
}
...
...
@@ -520,63 +518,63 @@ BUILD_FUNC_DEF_2(sock_setsockopt,sockobject *,s, object *,args)
With a third integer argument, retrieves a string buffer of that size;
use optional built-in module 'struct' to decode the string. */
static
o
bject
*
BUILD_FUNC_DEF_2
(
sock_getsockopt
,
sockobject
*
,
s
,
o
bject
*
,
args
)
static
PyO
bject
*
BUILD_FUNC_DEF_2
(
PySocketSock_getsockopt
,
PySocketSockObject
*
,
s
,
PyO
bject
*
,
args
)
{
int
level
;
int
optname
;
int
res
;
o
bject
*
buf
;
PyO
bject
*
buf
;
int
buflen
;
int
flag
;
if
(
getargs
(
args
,
"(ii)"
,
&
level
,
&
optname
))
{
if
(
PyArg_Parse
(
args
,
"(ii)"
,
&
level
,
&
optname
))
{
int
flag
=
0
;
int
flagsize
=
sizeof
flag
;
res
=
getsockopt
(
s
->
sock_fd
,
level
,
optname
,
(
ANY
*
)
&
flag
,
&
flagsize
);
if
(
res
<
0
)
return
socket_erro
r
();
return
newintobject
(
flag
);
return
PySocket_Er
r
();
return
PyInt_FromLong
(
flag
);
}
err_c
lear
();
if
(
!
getargs
(
args
,
"(iii)"
,
&
level
,
&
optname
,
&
buflen
))
PyErr_C
lear
();
if
(
!
PyArg_Parse
(
args
,
"(iii)"
,
&
level
,
&
optname
,
&
buflen
))
return
NULL
;
if
(
buflen
<=
0
||
buflen
>
1024
)
{
err_setstr
(
Socket
Error
,
"getsockopt buflen out of range"
);
PyErr_SetString
(
PySocket_
Error
,
"getsockopt buflen out of range"
);
return
NULL
;
}
buf
=
newsizedstringobject
((
char
*
)
NULL
,
buflen
);
buf
=
PyString_FromStringAndSize
((
char
*
)
NULL
,
buflen
);
if
(
buf
==
NULL
)
return
NULL
;
res
=
getsockopt
(
s
->
sock_fd
,
level
,
optname
,
(
ANY
*
)
getstringvalue
(
buf
),
&
buflen
);
if
(
res
<
0
)
{
DECREF
(
buf
);
return
socket_erro
r
();
Py_
DECREF
(
buf
);
return
PySocket_Er
r
();
}
resizestring
(
&
buf
,
buflen
);
_PyString_Resize
(
&
buf
,
buflen
);
return
buf
;
}
/* s.bind(sockaddr) method */
static
o
bject
*
BUILD_FUNC_DEF_2
(
sock_bind
,
sockobject
*
,
s
,
o
bject
*
,
args
)
static
PyO
bject
*
BUILD_FUNC_DEF_2
(
PySocketSock_bind
,
PySocketSockObject
*
,
s
,
PyO
bject
*
,
args
)
{
struct
sockaddr
*
addr
;
int
addrlen
;
int
res
;
if
(
!
getsockaddrarg
(
s
,
args
,
&
addr
,
&
addrlen
))
return
NULL
;
BGN_SAVE
Py_BEGIN_ALLOW_THREADS
res
=
bind
(
s
->
sock_fd
,
addr
,
addrlen
);
END_SAVE
Py_END_ALLOW_THREADS
if
(
res
<
0
)
return
socket_erro
r
();
INCREF
(
None
);
return
None
;
return
PySocket_Er
r
();
Py_INCREF
(
Py_
None
);
return
Py_
None
;
}
...
...
@@ -584,67 +582,67 @@ BUILD_FUNC_DEF_2(sock_bind,sockobject *,s, object *,args)
Set the file descriptor to -1 so operations tried subsequently
will surely fail. */
static
o
bject
*
BUILD_FUNC_DEF_2
(
sock_close
,
sockobject
*
,
s
,
o
bject
*
,
args
)
static
PyO
bject
*
BUILD_FUNC_DEF_2
(
PySocketSock_close
,
PySocketSockObject
*
,
s
,
PyO
bject
*
,
args
)
{
if
(
!
getnoarg
(
args
))
if
(
!
PyArg_NoArgs
(
args
))
return
NULL
;
BGN_SAVE
Py_BEGIN_ALLOW_THREADS
(
void
)
close
(
s
->
sock_fd
);
END_SAVE
Py_END_ALLOW_THREADS
s
->
sock_fd
=
-
1
;
INCREF
(
None
);
return
None
;
Py_INCREF
(
Py_
None
);
return
Py_
None
;
}
/* s.connect(sockaddr) method */
static
o
bject
*
BUILD_FUNC_DEF_2
(
sock_connect
,
sockobject
*
,
s
,
o
bject
*
,
args
)
static
PyO
bject
*
BUILD_FUNC_DEF_2
(
PySocketSock_connect
,
PySocketSockObject
*
,
s
,
PyO
bject
*
,
args
)
{
struct
sockaddr
*
addr
;
int
addrlen
;
int
res
;
if
(
!
getsockaddrarg
(
s
,
args
,
&
addr
,
&
addrlen
))
return
NULL
;
BGN_SAVE
Py_BEGIN_ALLOW_THREADS
res
=
connect
(
s
->
sock_fd
,
addr
,
addrlen
);
END_SAVE
Py_END_ALLOW_THREADS
if
(
res
<
0
)
return
socket_erro
r
();
INCREF
(
None
);
return
None
;
return
PySocket_Er
r
();
Py_INCREF
(
Py_
None
);
return
Py_
None
;
}
/* s.fileno() method */
static
o
bject
*
BUILD_FUNC_DEF_2
(
sock_fileno
,
sockobject
*
,
s
,
o
bject
*
,
args
)
static
PyO
bject
*
BUILD_FUNC_DEF_2
(
PySocketSock_fileno
,
PySocketSockObject
*
,
s
,
PyO
bject
*
,
args
)
{
if
(
!
getnoarg
(
args
))
if
(
!
PyArg_NoArgs
(
args
))
return
NULL
;
return
newintobject
((
long
)
s
->
sock_fd
);
return
PyInt_FromLong
((
long
)
s
->
sock_fd
);
}
/* s.getsockname() method */
static
o
bject
*
BUILD_FUNC_DEF_2
(
sock_getsockname
,
sockobject
*
,
s
,
o
bject
*
,
args
)
static
PyO
bject
*
BUILD_FUNC_DEF_2
(
PySocketSock_getsockname
,
PySocketSockObject
*
,
s
,
PyO
bject
*
,
args
)
{
char
addrbuf
[
256
];
int
addrlen
,
res
;
if
(
!
getnoarg
(
args
))
if
(
!
PyArg_NoArgs
(
args
))
return
NULL
;
if
(
!
getsockaddrlen
(
s
,
&
addrlen
))
return
NULL
;
BGN_SAVE
Py_BEGIN_ALLOW_THREADS
res
=
getsockname
(
s
->
sock_fd
,
(
struct
sockaddr
*
)
addrbuf
,
&
addrlen
);
END_SAVE
Py_END_ALLOW_THREADS
if
(
res
<
0
)
return
socket_erro
r
();
return
PySocket_Er
r
();
return
makesockaddr
((
struct
sockaddr
*
)
addrbuf
,
addrlen
);
}
...
...
@@ -652,20 +650,20 @@ BUILD_FUNC_DEF_2(sock_getsockname,sockobject *,s, object *,args)
#ifdef HAVE_GETPEERNAME
/* Cray APP doesn't have this :-( */
/* s.getpeername() method */
static
o
bject
*
BUILD_FUNC_DEF_2
(
sock_getpeername
,
sockobject
*
,
s
,
o
bject
*
,
args
)
static
PyO
bject
*
BUILD_FUNC_DEF_2
(
PySocketSock_getpeername
,
PySocketSockObject
*
,
s
,
PyO
bject
*
,
args
)
{
char
addrbuf
[
256
];
int
addrlen
,
res
;
if
(
!
getnoarg
(
args
))
if
(
!
PyArg_NoArgs
(
args
))
return
NULL
;
if
(
!
getsockaddrlen
(
s
,
&
addrlen
))
return
NULL
;
BGN_SAVE
Py_BEGIN_ALLOW_THREADS
res
=
getpeername
(
s
->
sock_fd
,
(
struct
sockaddr
*
)
addrbuf
,
&
addrlen
);
END_SAVE
Py_END_ALLOW_THREADS
if
(
res
<
0
)
return
socket_erro
r
();
return
PySocket_Er
r
();
return
makesockaddr
((
struct
sockaddr
*
)
addrbuf
,
addrlen
);
}
#endif
/* HAVE_GETPEERNAME */
...
...
@@ -673,22 +671,22 @@ BUILD_FUNC_DEF_2(sock_getpeername,sockobject *,s, object *,args)
/* s.listen(n) method */
static
o
bject
*
BUILD_FUNC_DEF_2
(
sock_listen
,
sockobject
*
,
s
,
o
bject
*
,
args
)
static
PyO
bject
*
BUILD_FUNC_DEF_2
(
PySocketSock_listen
,
PySocketSockObject
*
,
s
,
PyO
bject
*
,
args
)
{
int
backlog
;
int
res
;
if
(
!
getintarg
(
args
,
&
backlog
))
if
(
!
PyArg_GetInt
(
args
,
&
backlog
))
return
NULL
;
BGN_SAVE
Py_BEGIN_ALLOW_THREADS
if
(
backlog
<
1
)
backlog
=
1
;
res
=
listen
(
s
->
sock_fd
,
backlog
);
END_SAVE
Py_END_ALLOW_THREADS
if
(
res
<
0
)
return
socket_erro
r
();
INCREF
(
None
);
return
None
;
return
PySocket_Er
r
();
Py_INCREF
(
Py_
None
);
return
Py_
None
;
}
#ifndef NO_DUP
...
...
@@ -699,44 +697,44 @@ BUILD_FUNC_DEF_2(sock_listen,sockobject *,s, object *,args)
of each other.)
The mode argument specifies 'r' or 'w' passed to fdopen(). */
static
o
bject
*
BUILD_FUNC_DEF_2
(
sock_makefile
,
sockobject
*
,
s
,
o
bject
*
,
args
)
static
PyO
bject
*
BUILD_FUNC_DEF_2
(
PySocketSock_makefile
,
PySocketSockObject
*
,
s
,
PyO
bject
*
,
args
)
{
extern
int
fclose
PROTO
((
FILE
*
));
char
*
mode
;
int
fd
;
FILE
*
fp
;
if
(
!
getargs
(
args
,
"s"
,
&
mode
))
if
(
!
PyArg_Parse
(
args
,
"s"
,
&
mode
))
return
NULL
;
if
((
fd
=
dup
(
s
->
sock_fd
))
<
0
||
(
fp
=
fdopen
(
fd
,
mode
))
==
NULL
)
return
socket_erro
r
();
return
newopenfileobject
(
fp
,
"<socket>"
,
mode
,
fclose
);
return
PySocket_Er
r
();
return
PyFile_FromFile
(
fp
,
"<socket>"
,
mode
,
fclose
);
}
#endif
/* NO_DUP */
/* s.recv(nbytes [,flags]) method */
static
o
bject
*
BUILD_FUNC_DEF_2
(
sock_recv
,
sockobject
*
,
s
,
o
bject
*
,
args
)
static
PyO
bject
*
BUILD_FUNC_DEF_2
(
PySocketSock_recv
,
PySocketSockObject
*
,
s
,
PyO
bject
*
,
args
)
{
int
len
,
n
,
flags
;
o
bject
*
buf
;
PyO
bject
*
buf
;
flags
=
0
;
if
(
!
getargs
(
args
,
"i"
,
&
len
))
{
err_c
lear
();
if
(
!
getargs
(
args
,
"(ii)"
,
&
len
,
&
flags
))
if
(
!
PyArg_Parse
(
args
,
"i"
,
&
len
))
{
PyErr_C
lear
();
if
(
!
PyArg_Parse
(
args
,
"(ii)"
,
&
len
,
&
flags
))
return
NULL
;
}
buf
=
newsizedstringobject
((
char
*
)
0
,
len
);
buf
=
PyString_FromStringAndSize
((
char
*
)
0
,
len
);
if
(
buf
==
NULL
)
return
NULL
;
BGN_SAVE
Py_BEGIN_ALLOW_THREADS
n
=
recv
(
s
->
sock_fd
,
getstringvalue
(
buf
),
len
,
flags
);
END_SAVE
Py_END_ALLOW_THREADS
if
(
n
<
0
)
return
socket_erro
r
();
if
(
resizestring
(
&
buf
,
n
)
<
0
)
return
PySocket_Er
r
();
if
(
_PyString_Resize
(
&
buf
,
n
)
<
0
)
return
NULL
;
return
buf
;
}
...
...
@@ -744,174 +742,174 @@ BUILD_FUNC_DEF_2(sock_recv,sockobject *,s, object *,args)
/* s.recvfrom(nbytes [,flags]) method */
static
o
bject
*
BUILD_FUNC_DEF_2
(
sock_recvfrom
,
sockobject
*
,
s
,
o
bject
*
,
args
)
static
PyO
bject
*
BUILD_FUNC_DEF_2
(
PySocketSock_recvfrom
,
PySocketSockObject
*
,
s
,
PyO
bject
*
,
args
)
{
char
addrbuf
[
256
];
o
bject
*
buf
,
*
addr
,
*
ret
;
PyO
bject
*
buf
,
*
addr
,
*
ret
;
int
addrlen
,
len
,
n
,
flags
;
flags
=
0
;
if
(
!
getargs
(
args
,
"i"
,
&
len
))
{
err_c
lear
();
if
(
!
getargs
(
args
,
"(ii)"
,
&
len
,
&
flags
))
if
(
!
PyArg_Parse
(
args
,
"i"
,
&
len
))
{
PyErr_C
lear
();
if
(
!
PyArg_Parse
(
args
,
"(ii)"
,
&
len
,
&
flags
))
return
NULL
;
}
if
(
!
getsockaddrlen
(
s
,
&
addrlen
))
return
NULL
;
buf
=
newsizedstringobject
((
char
*
)
0
,
len
);
buf
=
PyString_FromStringAndSize
((
char
*
)
0
,
len
);
if
(
buf
==
NULL
)
return
NULL
;
BGN_SAVE
n
=
recvfrom
(
s
->
sock_fd
,
getstringvalue
(
buf
),
len
,
flags
,
Py_BEGIN_ALLOW_THREADS
n
=
recvfrom
(
s
->
sock_fd
,
PyString_AsString
(
buf
),
len
,
flags
,
#ifndef NT
(
ANY
*
)
addrbuf
,
&
addrlen
);
#else
(
struct
sockaddr
*
)
addrbuf
,
&
addrlen
);
#endif
END_SAVE
Py_END_ALLOW_THREADS
if
(
n
<
0
)
return
socket_erro
r
();
if
(
resizestring
(
&
buf
,
n
)
<
0
)
return
PySocket_Er
r
();
if
(
_PyString_Resize
(
&
buf
,
n
)
<
0
)
return
NULL
;
addr
=
makesockaddr
((
struct
sockaddr
*
)
addrbuf
,
addrlen
);
ret
=
mkv
alue
(
"OO"
,
buf
,
addr
);
XDECREF
(
addr
);
XDECREF
(
buf
);
ret
=
Py_BuildV
alue
(
"OO"
,
buf
,
addr
);
Py_
XDECREF
(
addr
);
Py_
XDECREF
(
buf
);
return
ret
;
}
/* s.send(data [,flags]) method */
static
o
bject
*
BUILD_FUNC_DEF_2
(
sock_send
,
sockobject
*
,
s
,
o
bject
*
,
args
)
static
PyO
bject
*
BUILD_FUNC_DEF_2
(
PySocketSock_send
,
PySocketSockObject
*
,
s
,
PyO
bject
*
,
args
)
{
char
*
buf
;
int
len
,
n
,
flags
;
flags
=
0
;
if
(
!
getargs
(
args
,
"s#"
,
&
buf
,
&
len
))
{
err_c
lear
();
if
(
!
getargs
(
args
,
"(s#i)"
,
&
buf
,
&
len
,
&
flags
))
if
(
!
PyArg_Parse
(
args
,
"s#"
,
&
buf
,
&
len
))
{
PyErr_C
lear
();
if
(
!
PyArg_Parse
(
args
,
"(s#i)"
,
&
buf
,
&
len
,
&
flags
))
return
NULL
;
}
BGN_SAVE
Py_BEGIN_ALLOW_THREADS
n
=
send
(
s
->
sock_fd
,
buf
,
len
,
flags
);
END_SAVE
Py_END_ALLOW_THREADS
if
(
n
<
0
)
return
socket_erro
r
();
return
newintobject
((
long
)
n
);
return
PySocket_Er
r
();
return
PyInt_FromLong
((
long
)
n
);
}
/* s.sendto(data, [flags,] sockaddr) method */
static
o
bject
*
BUILD_FUNC_DEF_2
(
sock_sendto
,
sockobject
*
,
s
,
o
bject
*
,
args
)
static
PyO
bject
*
BUILD_FUNC_DEF_2
(
PySocketSock_sendto
,
PySocketSockObject
*
,
s
,
PyO
bject
*
,
args
)
{
o
bject
*
addro
;
PyO
bject
*
addro
;
char
*
buf
;
struct
sockaddr
*
addr
;
int
addrlen
,
len
,
n
,
flags
;
flags
=
0
;
if
(
!
getargs
(
args
,
"(s#O)"
,
&
buf
,
&
len
,
&
addro
))
{
err_c
lear
();
if
(
!
getargs
(
args
,
"(s#iO)"
,
&
buf
,
&
len
,
&
flags
,
&
addro
))
if
(
!
PyArg_Parse
(
args
,
"(s#O)"
,
&
buf
,
&
len
,
&
addro
))
{
PyErr_C
lear
();
if
(
!
PyArg_Parse
(
args
,
"(s#iO)"
,
&
buf
,
&
len
,
&
flags
,
&
addro
))
return
NULL
;
}
if
(
!
getsockaddrarg
(
s
,
addro
,
&
addr
,
&
addrlen
))
return
NULL
;
BGN_SAVE
Py_BEGIN_ALLOW_THREADS
n
=
sendto
(
s
->
sock_fd
,
buf
,
len
,
flags
,
addr
,
addrlen
);
END_SAVE
Py_END_ALLOW_THREADS
if
(
n
<
0
)
return
socket_erro
r
();
return
newintobject
((
long
)
n
);
return
PySocket_Er
r
();
return
PyInt_FromLong
((
long
)
n
);
}
/* s.shutdown(how) method */
static
o
bject
*
BUILD_FUNC_DEF_2
(
sock_shutdown
,
sockobject
*
,
s
,
o
bject
*
,
args
)
static
PyO
bject
*
BUILD_FUNC_DEF_2
(
PySocketSock_shutdown
,
PySocketSockObject
*
,
s
,
PyO
bject
*
,
args
)
{
int
how
;
int
res
;
if
(
!
getintarg
(
args
,
&
how
))
if
(
!
PyArg_GetInt
(
args
,
&
how
))
return
NULL
;
BGN_SAVE
Py_BEGIN_ALLOW_THREADS
res
=
shutdown
(
s
->
sock_fd
,
how
);
END_SAVE
Py_END_ALLOW_THREADS
if
(
res
<
0
)
return
socket_erro
r
();
INCREF
(
None
);
return
None
;
return
PySocket_Er
r
();
Py_INCREF
(
Py_
None
);
return
Py_
None
;
}
/* List of methods for socket objects */
static
struct
methodlist
s
ock_methods
[]
=
{
{
"accept"
,
(
method
)
s
ock_accept
},
static
PyMethodDef
PySocketS
ock_methods
[]
=
{
{
"accept"
,
(
PyCFunction
)
PySocketS
ock_accept
},
#if 0
{"allowbroadcast", (
method)s
ock_allowbroadcast},
{"allowbroadcast", (
PyCFunction)PySocketS
ock_allowbroadcast},
#endif
#ifndef NT
{
"setblocking"
,
(
method
)
s
ock_setblocking
},
{
"setblocking"
,
(
PyCFunction
)
PySocketS
ock_setblocking
},
#endif
{
"setsockopt"
,
(
method
)
s
ock_setsockopt
},
{
"getsockopt"
,
(
method
)
s
ock_getsockopt
},
{
"bind"
,
(
method
)
s
ock_bind
},
{
"close"
,
(
method
)
s
ock_close
},
{
"connect"
,
(
method
)
s
ock_connect
},
{
"fileno"
,
(
method
)
s
ock_fileno
},
{
"getsockname"
,
(
method
)
s
ock_getsockname
},
{
"setsockopt"
,
(
PyCFunction
)
PySocketS
ock_setsockopt
},
{
"getsockopt"
,
(
PyCFunction
)
PySocketS
ock_getsockopt
},
{
"bind"
,
(
PyCFunction
)
PySocketS
ock_bind
},
{
"close"
,
(
PyCFunction
)
PySocketS
ock_close
},
{
"connect"
,
(
PyCFunction
)
PySocketS
ock_connect
},
{
"fileno"
,
(
PyCFunction
)
PySocketS
ock_fileno
},
{
"getsockname"
,
(
PyCFunction
)
PySocketS
ock_getsockname
},
#ifdef HAVE_GETPEERNAME
{
"getpeername"
,
(
method
)
s
ock_getpeername
},
{
"getpeername"
,
(
PyCFunction
)
PySocketS
ock_getpeername
},
#endif
{
"listen"
,
(
method
)
s
ock_listen
},
{
"listen"
,
(
PyCFunction
)
PySocketS
ock_listen
},
#ifndef NO_DUP
{
"makefile"
,
(
method
)
s
ock_makefile
},
{
"makefile"
,
(
PyCFunction
)
PySocketS
ock_makefile
},
#endif
{
"recv"
,
(
method
)
s
ock_recv
},
{
"recvfrom"
,
(
method
)
s
ock_recvfrom
},
{
"send"
,
(
method
)
s
ock_send
},
{
"sendto"
,
(
method
)
s
ock_sendto
},
{
"shutdown"
,
(
method
)
s
ock_shutdown
},
{
"recv"
,
(
PyCFunction
)
PySocketS
ock_recv
},
{
"recvfrom"
,
(
PyCFunction
)
PySocketS
ock_recvfrom
},
{
"send"
,
(
PyCFunction
)
PySocketS
ock_send
},
{
"sendto"
,
(
PyCFunction
)
PySocketS
ock_sendto
},
{
"shutdown"
,
(
PyCFunction
)
PySocketS
ock_shutdown
},
{
NULL
,
NULL
}
/* sentinel */
};
/* Deallocate a socket object in response to the last DECREF().
/* Deallocate a socket object in response to the last
Py_
DECREF().
First close the file description. */
static
void
BUILD_FUNC_DEF_1
(
sock_dealloc
,
socko
bject
*
,
s
)
BUILD_FUNC_DEF_1
(
PySocketSock_dealloc
,
PySocketSockO
bject
*
,
s
)
{
(
void
)
close
(
s
->
sock_fd
);
DEL
(
s
);
PyMem_
DEL
(
s
);
}
/* Return a socket object's named attribute. */
static
o
bject
*
BUILD_FUNC_DEF_2
(
sock_getattr
,
socko
bject
*
,
s
,
char
*
,
name
)
static
PyO
bject
*
BUILD_FUNC_DEF_2
(
PySocketSock_getattr
,
PySocketSockO
bject
*
,
s
,
char
*
,
name
)
{
return
findmethod
(
sock_methods
,
(
o
bject
*
)
s
,
name
);
return
Py_FindMethod
(
PySocketSock_methods
,
(
PyO
bject
*
)
s
,
name
);
}
/* Type object for socket objects. */
static
typeobject
Sockt
ype
=
{
OB_HEAD_INIT
(
&
Typet
ype
)
static
PyTypeObject
PySocketSock_T
ype
=
{
PyObject_HEAD_INIT
(
&
PyType_T
ype
)
0
,
"socket"
,
sizeof
(
socko
bject
),
sizeof
(
PySocketSockO
bject
),
0
,
(
destructor
)
s
ock_dealloc
,
/*tp_dealloc*/
(
destructor
)
PySocketS
ock_dealloc
,
/*tp_dealloc*/
0
,
/*tp_print*/
(
getattrfunc
)
s
ock_getattr
,
/*tp_getattr*/
(
getattrfunc
)
PySocketS
ock_getattr
,
/*tp_getattr*/
0
,
/*tp_setattr*/
0
,
/*tp_compare*/
0
,
/*tp_repr*/
...
...
@@ -924,32 +922,32 @@ static typeobject Socktype = {
/* Python interface to gethostname(). */
/*ARGSUSED*/
static
o
bject
*
BUILD_FUNC_DEF_2
(
socket_gethostname
,
object
*
,
self
,
o
bject
*
,
args
)
static
PyO
bject
*
BUILD_FUNC_DEF_2
(
PySocket_gethostname
,
PyObject
*
,
self
,
PyO
bject
*
,
args
)
{
char
buf
[
1024
];
int
res
;
if
(
!
getnoarg
(
args
))
if
(
!
PyArg_NoArgs
(
args
))
return
NULL
;
BGN_SAVE
Py_BEGIN_ALLOW_THREADS
res
=
gethostname
(
buf
,
(
int
)
sizeof
buf
-
1
);
END_SAVE
Py_END_ALLOW_THREADS
if
(
res
<
0
)
return
socket_erro
r
();
return
PySocket_Er
r
();
buf
[
sizeof
buf
-
1
]
=
'\0'
;
return
newstringobject
(
buf
);
return
PyString_FromString
(
buf
);
}
/* Python interface to gethostbyname(name). */
/*ARGSUSED*/
static
o
bject
*
BUILD_FUNC_DEF_2
(
socket_gethostbyname
,
object
*
,
self
,
o
bject
*
,
args
)
static
PyO
bject
*
BUILD_FUNC_DEF_2
(
PySocket_gethostbyname
,
PyObject
*
,
self
,
PyO
bject
*
,
args
)
{
char
*
name
;
struct
sockaddr_in
addrbuf
;
if
(
!
getargs
(
args
,
"s"
,
&
name
))
if
(
!
PyArg_Parse
(
args
,
"s"
,
&
name
))
return
NULL
;
if
(
setipaddr
(
name
,
&
addrbuf
)
<
0
)
return
NULL
;
...
...
@@ -962,21 +960,21 @@ BUILD_FUNC_DEF_2(socket_gethostbyname,object *,self, object *,args)
known or not useful (like the list of aliases). */
/*ARGSUSED*/
static
o
bject
*
BUILD_FUNC_DEF_2
(
socket_getservbyname
,
object
*
,
self
,
o
bject
*
,
args
)
static
PyO
bject
*
BUILD_FUNC_DEF_2
(
PySocket_getservbyname
,
PyObject
*
,
self
,
PyO
bject
*
,
args
)
{
char
*
name
,
*
proto
;
struct
servent
*
sp
;
if
(
!
getargs
(
args
,
"(ss)"
,
&
name
,
&
proto
))
if
(
!
PyArg_Parse
(
args
,
"(ss)"
,
&
name
,
&
proto
))
return
NULL
;
BGN_SAVE
Py_BEGIN_ALLOW_THREADS
sp
=
getservbyname
(
name
,
proto
);
END_SAVE
Py_END_ALLOW_THREADS
if
(
sp
==
NULL
)
{
err_setstr
(
Socket
Error
,
"service/proto not found"
);
PyErr_SetString
(
PySocket_
Error
,
"service/proto not found"
);
return
NULL
;
}
return
newintobject
((
long
)
ntohs
(
sp
->
s_port
));
return
PyInt_FromLong
((
long
)
ntohs
(
sp
->
s_port
));
}
...
...
@@ -985,23 +983,23 @@ BUILD_FUNC_DEF_2(socket_getservbyname,object *,self, object *,args)
Return a new socket object. */
/*ARGSUSED*/
static
o
bject
*
BUILD_FUNC_DEF_2
(
socket_socket
,
object
*
,
self
,
o
bject
*
,
args
)
static
PyO
bject
*
BUILD_FUNC_DEF_2
(
PySocket_socket
,
PyObject
*
,
self
,
PyO
bject
*
,
args
)
{
socko
bject
*
s
;
PySocketSockO
bject
*
s
;
int
fd
,
family
,
type
,
proto
;
proto
=
0
;
if
(
!
getargs
(
args
,
"(ii)"
,
&
family
,
&
type
))
{
err_c
lear
();
if
(
!
getargs
(
args
,
"(iii)"
,
&
family
,
&
type
,
&
proto
))
if
(
!
PyArg_Parse
(
args
,
"(ii)"
,
&
family
,
&
type
))
{
PyErr_C
lear
();
if
(
!
PyArg_Parse
(
args
,
"(iii)"
,
&
family
,
&
type
,
&
proto
))
return
NULL
;
}
BGN_SAVE
Py_BEGIN_ALLOW_THREADS
fd
=
socket
(
family
,
type
,
proto
);
END_SAVE
Py_END_ALLOW_THREADS
if
(
fd
<
0
)
return
socket_erro
r
();
s
=
newsockobject
(
fd
,
family
,
type
,
proto
);
return
PySocket_Er
r
();
s
=
PySocketSock_New
(
fd
,
family
,
type
,
proto
);
/* If the object can't be created, don't forget to close the
file descriptor again! */
if
(
s
==
NULL
)
...
...
@@ -1011,7 +1009,7 @@ BUILD_FUNC_DEF_2(socket_socket,object *,self,object *,args)
#ifdef SIGPIPE
(
void
)
signal
(
SIGPIPE
,
SIG_IGN
);
#endif
return
(
o
bject
*
)
s
;
return
(
PyO
bject
*
)
s
;
}
#ifndef NO_DUP
...
...
@@ -1020,40 +1018,40 @@ BUILD_FUNC_DEF_2(socket_socket,object *,self,object *,args)
Additional arguments as for socket(). */
/*ARGSUSED*/
static
o
bject
*
BUILD_FUNC_DEF_2
(
socket_fromfd
,
object
*
,
self
,
o
bject
*
,
args
)
static
PyO
bject
*
BUILD_FUNC_DEF_2
(
PySocket_fromfd
,
PyObject
*
,
self
,
PyO
bject
*
,
args
)
{
socko
bject
*
s
;
PySocketSockO
bject
*
s
;
int
fd
,
family
,
type
,
proto
;
proto
=
0
;
if
(
!
getargs
(
args
,
"(iii)"
,
&
fd
,
&
family
,
&
type
))
{
err_c
lear
();
if
(
!
getargs
(
args
,
"(iiii)"
,
&
fd
,
&
family
,
&
type
,
&
proto
))
if
(
!
PyArg_Parse
(
args
,
"(iii)"
,
&
fd
,
&
family
,
&
type
))
{
PyErr_C
lear
();
if
(
!
PyArg_Parse
(
args
,
"(iiii)"
,
&
fd
,
&
family
,
&
type
,
&
proto
))
return
NULL
;
}
/* Dup the fd so it and the socket can be closed independently */
fd
=
dup
(
fd
);
if
(
fd
<
0
)
return
socket_erro
r
();
s
=
newsockobject
(
fd
,
family
,
type
,
proto
);
return
PySocket_Er
r
();
s
=
PySocketSock_New
(
fd
,
family
,
type
,
proto
);
/* From now on, ignore SIGPIPE and let the error checking
do the work. */
#ifdef SIGPIPE
(
void
)
signal
(
SIGPIPE
,
SIG_IGN
);
#endif
return
(
o
bject
*
)
s
;
return
(
PyO
bject
*
)
s
;
}
#endif
/* NO_DUP */
/* List of functions exported by this module. */
static
struct
methodlist
s
ocket_methods
[]
=
{
{
"gethostbyname"
,
s
ocket_gethostbyname
},
{
"gethostname"
,
s
ocket_gethostname
},
{
"getservbyname"
,
s
ocket_getservbyname
},
{
"socket"
,
s
ocket_socket
},
static
PyMethodDef
PyS
ocket_methods
[]
=
{
{
"gethostbyname"
,
PyS
ocket_gethostbyname
},
{
"gethostname"
,
PyS
ocket_gethostname
},
{
"getservbyname"
,
PyS
ocket_getservbyname
},
{
"socket"
,
PyS
ocket_socket
},
#ifndef NO_DUP
{
"fromfd"
,
s
ocket_fromfd
},
{
"fromfd"
,
PyS
ocket_fromfd
},
#endif
{
NULL
,
NULL
}
/* Sentinel */
};
...
...
@@ -1063,16 +1061,16 @@ static struct methodlist socket_methods[] = {
For simplicity, errors (which are unlikely anyway) are ignored. */
static
void
BUILD_FUNC_DEF_3
(
insint
,
o
bject
*
,
d
,
char
*
,
name
,
int
,
value
)
BUILD_FUNC_DEF_3
(
insint
,
PyO
bject
*
,
d
,
char
*
,
name
,
int
,
value
)
{
object
*
v
=
newintobject
((
long
)
value
);
PyObject
*
v
=
PyInt_FromLong
((
long
)
value
);
if
(
v
==
NULL
)
{
/* Don't bother reporting this error */
err_c
lear
();
PyErr_C
lear
();
}
else
{
dictinsert
(
d
,
name
,
v
);
DECREF
(
v
);
PyDict_SetItemString
(
d
,
name
,
v
);
Py_
DECREF
(
v
);
}
}
...
...
@@ -1085,12 +1083,13 @@ BUILD_FUNC_DEF_3(insint,object *,d,char *,name,int,value)
void
initsocket
()
{
object
*
m
,
*
d
;
m
=
initmodule
(
"socket"
,
socket_methods
);
d
=
getmoduledict
(
m
);
SocketError
=
newstringobject
(
"socket.error"
);
if
(
SocketError
==
NULL
||
dictinsert
(
d
,
"error"
,
SocketError
)
!=
0
)
fatal
(
"can't define socket.error"
);
PyObject
*
m
,
*
d
;
m
=
Py_InitModule
(
"socket"
,
PySocket_methods
);
d
=
PyModule_GetDict
(
m
);
PySocket_Error
=
PyString_FromString
(
"socket.error"
);
if
(
PySocket_Error
==
NULL
||
PyDict_SetItemString
(
d
,
"error"
,
PySocket_Error
)
!=
0
)
Py_FatalError
(
"can't define socket.error"
);
insint
(
d
,
"AF_INET"
,
AF_INET
);
#ifdef AF_UNIX
insint
(
d
,
"AF_UNIX"
,
AF_UNIX
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment