Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
cpython
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
cpython
Commits
9e80d6f1
Commit
9e80d6f1
authored
Dec 17, 1993
by
Guido van Rossum
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
*** empty log message ***
parent
7565b934
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
123 additions
and
79 deletions
+123
-79
Demo/rpc/MANIFEST
Demo/rpc/MANIFEST
+1
-0
Demo/rpc/README
Demo/rpc/README
+0
-10
Demo/rpc/mountclient.py
Demo/rpc/mountclient.py
+9
-9
Demo/rpc/nfsclient.py
Demo/rpc/nfsclient.py
+6
-6
Demo/rpc/rnusersclient.py
Demo/rpc/rnusersclient.py
+8
-8
Demo/rpc/rpc.py
Demo/rpc/rpc.py
+66
-39
Demo/rpc/test
Demo/rpc/test
+1
-0
Demo/rpc/xdr.py
Demo/rpc/xdr.py
+32
-7
No files found.
Demo/rpc/MANIFEST
View file @
9e80d6f1
...
...
@@ -6,4 +6,5 @@
mountclient.py 1
nfsclient.py 1
rpc.py 1
test 1
xdr.py 1
Demo/rpc/README
View file @
9e80d6f1
...
...
@@ -21,13 +21,3 @@ Other clients are tested similarly.
For hostname, use e.g. wuarchive.wustl.edu or gatekeeper.dec.com (two
hosts that are known to export NFS filesystems with little restrictions).
Note: this was developed using Python 0.9.8beta (not yet released). I
have tried to put in compatibility hacks for Python 0.9.7beta
(available from ftp.cwi.nl) but I cannot guarantee that it will work
-- if it doesn't, let me know and I'll see what I can do. In
particular, if you don't have the built-in module "select", UDP
time-outs and retries won't work.
--Guido van Rossum, CWI, Amsterdam <guido@cwi.nl>
"I don't want *any* spam"
Demo/rpc/mountclient.py
View file @
9e80d6f1
...
...
@@ -74,13 +74,13 @@ class MountUnpacker(Unpacker):
class
PartialMountClient
:
# This method is called by Client.
init
to initialize
# This method is called by Client.
__init__
to initialize
# self.packer and self.unpacker
def
addpackers
(
self
):
self
.
packer
=
MountPacker
()
.
init
()
self
.
unpacker
=
MountUnpacker
(
).
init
(
''
)
self
.
packer
=
MountPacker
()
self
.
unpacker
=
MountUnpacker
(
''
)
# This method is called by Client.
init
to bind the socket
# This method is called by Client.
__init__
to bind the socket
# to a particular network interface and port. We use the
# default network interface, but if we're running as root,
# we want to bind to a reserved port
...
...
@@ -161,14 +161,14 @@ class PartialMountClient:
class
TCPMountClient
(
PartialMountClient
,
TCPClient
):
def
init
(
self
,
host
):
return
TCPClient
.
init
(
self
,
host
,
MOUNTPROG
,
MOUNTVERS
)
def
__init__
(
self
,
host
):
TCPClient
.
__init__
(
self
,
host
,
MOUNTPROG
,
MOUNTVERS
)
class
UDPMountClient
(
PartialMountClient
,
UDPClient
):
def
init
(
self
,
host
):
return
UDPClient
.
init
(
self
,
host
,
MOUNTPROG
,
MOUNTVERS
)
def
__init__
(
self
,
host
):
UDPClient
.
__init__
(
self
,
host
,
MOUNTPROG
,
MOUNTVERS
)
# A little test program for the Mount client. This takes a host as
...
...
@@ -189,7 +189,7 @@ def test():
C
=
UDPMountClient
if
sys
.
argv
[
1
:]:
host
=
sys
.
argv
[
1
]
else
:
host
=
''
mcl
=
C
(
).
init
(
host
)
mcl
=
C
(
host
)
list
=
mcl
.
Export
()
for
item
in
list
:
print
item
...
...
Demo/rpc/nfsclient.py
View file @
9e80d6f1
...
...
@@ -121,12 +121,12 @@ class NFSUnpacker(MountUnpacker):
class
NFSClient
(
UDPClient
):
def
init
(
self
,
host
):
return
UDPClient
.
init
(
self
,
host
,
NFS_PROGRAM
,
NFS_VERSION
)
def
__init__
(
self
,
host
):
UDPClient
.
__init__
(
self
,
host
,
NFS_PROGRAM
,
NFS_VERSION
)
def
addpackers
(
self
):
self
.
packer
=
NFSPacker
()
.
init
()
self
.
unpacker
=
NFSUnpacker
(
).
init
(
''
)
self
.
packer
=
NFSPacker
()
self
.
unpacker
=
NFSUnpacker
(
''
)
def
mkcred
(
self
):
if
self
.
cred
==
None
:
...
...
@@ -183,7 +183,7 @@ def test():
if
sys
.
argv
[
2
:]:
filesys
=
sys
.
argv
[
2
]
else
:
filesys
=
None
from
mountclient
import
UDPMountClient
,
TCPMountClient
mcl
=
TCPMountClient
(
).
init
(
host
)
mcl
=
TCPMountClient
(
host
)
if
filesys
==
None
:
list
=
mcl
.
Export
()
for
item
in
list
:
...
...
@@ -193,7 +193,7 @@ def test():
print
sf
fh
=
sf
[
1
]
if
fh
:
ncl
=
NFSClient
(
).
init
(
host
)
ncl
=
NFSClient
(
host
)
as
=
ncl
.
Getattr
(
fh
)
print
as
list
=
ncl
.
Listdir
(
fh
)
...
...
Demo/rpc/rnusersclient.py
View file @
9e80d6f1
...
...
@@ -37,8 +37,8 @@ class RnusersUnpacker(Unpacker):
class
PartialRnusersClient
:
def
addpackers
(
self
):
self
.
packer
=
RnusersPacker
()
.
init
()
self
.
unpacker
=
RnusersUnpacker
(
).
init
(
''
)
self
.
packer
=
RnusersPacker
()
self
.
unpacker
=
RnusersUnpacker
(
''
)
def
Num
(
self
):
return
self
.
make_call
(
1
,
None
,
None
,
self
.
unpacker
.
unpack_int
)
...
...
@@ -54,14 +54,14 @@ class PartialRnusersClient:
class
RnusersClient
(
PartialRnusersClient
,
UDPClient
):
def
init
(
self
,
host
):
return
UDPClient
.
init
(
self
,
host
,
100002
,
2
)
def
__init__
(
self
,
host
):
UDPClient
.
__init__
(
self
,
host
,
100002
,
2
)
class
BroadcastRnusersClient
(
PartialRnusersClient
,
BroadcastUDPClient
):
def
init
(
self
,
bcastaddr
):
return
BroadcastUDPClient
.
init
(
self
,
bcastaddr
,
100002
,
2
)
def
__init__
(
self
,
bcastaddr
):
BroadcastUDPClient
.
__init__
(
self
,
bcastaddr
,
100002
,
2
)
def
test
():
...
...
@@ -71,7 +71,7 @@ def test():
return
else
:
host
=
sys
.
argv
[
1
]
c
=
RnusersClient
(
).
init
(
host
)
c
=
RnusersClient
(
host
)
list
=
c
.
Names
()
for
(
line
,
name
,
host
,
time
),
idle
in
list
:
line
=
strip0
(
line
)
...
...
@@ -80,7 +80,7 @@ def test():
print
`name`
,
`host`
,
`line`
,
time
,
idle
def
testbcast
():
c
=
BroadcastRnusersClient
(
).
init
(
'<broadcast>'
)
c
=
BroadcastRnusersClient
(
'<broadcast>'
)
def
listit
(
list
,
fromaddr
):
host
,
port
=
fromaddr
print
host
+
'
\
t
:'
,
...
...
Demo/rpc/rpc.py
View file @
9e80d6f1
...
...
@@ -151,7 +151,7 @@ def make_auth_null():
return
''
def
make_auth_unix
(
seed
,
host
,
uid
,
gid
,
groups
):
p
=
Packer
()
.
init
()
p
=
Packer
()
p
.
pack_auth_unix
(
seed
,
host
,
uid
,
gid
,
groups
)
return
p
.
get_buf
()
...
...
@@ -163,14 +163,15 @@ def make_auth_unix_default():
except
ImportError
:
uid
=
gid
=
0
import
time
return
make_auth_unix
(
time
.
time
(),
socket
.
gethostname
(),
uid
,
gid
,
[])
return
make_auth_unix
(
int
(
time
.
time
()),
\
socket
.
gethostname
(),
uid
,
gid
,
[])
# Common base class for clients
class
Client
:
def
init
(
self
,
host
,
prog
,
vers
,
port
):
def
__init__
(
self
,
host
,
prog
,
vers
,
port
):
self
.
host
=
host
self
.
prog
=
prog
self
.
vers
=
vers
...
...
@@ -182,7 +183,6 @@ class Client:
self
.
addpackers
()
self
.
cred
=
None
self
.
verf
=
None
return
self
def
close
(
self
):
self
.
sock
.
close
()
...
...
@@ -201,8 +201,8 @@ class Client:
def
addpackers
(
self
):
# Override this to use derived classes from Packer/Unpacker
self
.
packer
=
Packer
()
.
init
()
self
.
unpacker
=
Unpacker
(
).
init
(
''
)
self
.
packer
=
Packer
()
self
.
unpacker
=
Unpacker
(
''
)
def
make_call
(
self
,
proc
,
args
,
pack_func
,
unpack_func
):
# Don't normally override this (but see Broadcast)
...
...
@@ -244,7 +244,7 @@ class Client:
self
.
verf
=
(
AUTH_NULL
,
make_auth_null
())
return
self
.
verf
def
Null
(
self
):
# Procedure 0 is always like this
def
call_0
(
self
):
# Procedure 0 is always like this
return
self
.
make_call
(
0
,
None
,
None
,
None
)
...
...
@@ -369,11 +369,10 @@ class RawUDPClient(Client):
class
RawBroadcastUDPClient
(
RawUDPClient
):
def
init
(
self
,
bcastaddr
,
prog
,
vers
,
port
):
self
=
RawUDPClient
.
init
(
self
,
bcastaddr
,
prog
,
vers
,
port
)
def
__init__
(
self
,
bcastaddr
,
prog
,
vers
,
port
):
RawUDPClient
.
__init__
(
self
,
bcastaddr
,
prog
,
vers
,
port
)
self
.
reply_handler
=
None
self
.
timeout
=
30
return
self
def
connsocket
(
self
):
# Don't connect -- use sendto
...
...
@@ -495,8 +494,8 @@ class PortMapperUnpacker(Unpacker):
class
PartialPortMapperClient
:
def
addpackers
(
self
):
self
.
packer
=
PortMapperPacker
()
.
init
()
self
.
unpacker
=
PortMapperUnpacker
(
).
init
(
''
)
self
.
packer
=
PortMapperPacker
()
self
.
unpacker
=
PortMapperUnpacker
(
''
)
def
Set
(
self
,
mapping
):
return
self
.
make_call
(
PMAPPROC_SET
,
mapping
,
\
...
...
@@ -526,23 +525,23 @@ class PartialPortMapperClient:
class
TCPPortMapperClient
(
PartialPortMapperClient
,
RawTCPClient
):
def
init
(
self
,
host
):
return
RawTCPClient
.
init
(
self
,
\
def
__init__
(
self
,
host
):
RawTCPClient
.
__init__
(
self
,
\
host
,
PMAP_PROG
,
PMAP_VERS
,
PMAP_PORT
)
class
UDPPortMapperClient
(
PartialPortMapperClient
,
RawUDPClient
):
def
init
(
self
,
host
):
return
RawUDPClient
.
init
(
self
,
\
def
__init__
(
self
,
host
):
RawUDPClient
.
__init__
(
self
,
\
host
,
PMAP_PROG
,
PMAP_VERS
,
PMAP_PORT
)
class
BroadcastUDPPortMapperClient
(
PartialPortMapperClient
,
\
RawBroadcastUDPClient
):
def
init
(
self
,
bcastaddr
):
return
RawBroadcastUDPClient
.
init
(
self
,
\
def
__init__
(
self
,
bcastaddr
):
RawBroadcastUDPClient
.
__init__
(
self
,
\
bcastaddr
,
PMAP_PROG
,
PMAP_VERS
,
PMAP_PORT
)
...
...
@@ -550,36 +549,35 @@ class BroadcastUDPPortMapperClient(PartialPortMapperClient, \
class
TCPClient
(
RawTCPClient
):
def
init
(
self
,
host
,
prog
,
vers
):
pmap
=
TCPPortMapperClient
(
).
init
(
host
)
def
__init__
(
self
,
host
,
prog
,
vers
):
pmap
=
TCPPortMapperClient
(
host
)
port
=
pmap
.
Getport
((
prog
,
vers
,
IPPROTO_TCP
,
0
))
pmap
.
close
()
if
port
==
0
:
raise
RuntimeError
,
'program not registered'
return
RawTCPClient
.
init
(
self
,
host
,
prog
,
vers
,
port
)
RawTCPClient
.
__init__
(
self
,
host
,
prog
,
vers
,
port
)
class
UDPClient
(
RawUDPClient
):
def
init
(
self
,
host
,
prog
,
vers
):
pmap
=
UDPPortMapperClient
(
).
init
(
host
)
def
__init__
(
self
,
host
,
prog
,
vers
):
pmap
=
UDPPortMapperClient
(
host
)
port
=
pmap
.
Getport
((
prog
,
vers
,
IPPROTO_UDP
,
0
))
pmap
.
close
()
if
port
==
0
:
raise
RuntimeError
,
'program not registered'
return
RawUDPClient
.
init
(
self
,
host
,
prog
,
vers
,
port
)
RawUDPClient
.
__init__
(
self
,
host
,
prog
,
vers
,
port
)
class
BroadcastUDPClient
(
Client
):
def
init
(
self
,
bcastaddr
,
prog
,
vers
):
self
.
pmap
=
BroadcastUDPPortMapperClient
(
).
init
(
bcastaddr
)
def
__init__
(
self
,
bcastaddr
,
prog
,
vers
):
self
.
pmap
=
BroadcastUDPPortMapperClient
(
bcastaddr
)
self
.
pmap
.
set_reply_handler
(
self
.
my_reply_handler
)
self
.
prog
=
prog
self
.
vers
=
vers
self
.
user_reply_handler
=
None
self
.
addpackers
()
return
self
def
close
(
self
):
self
.
pmap
.
close
()
...
...
@@ -622,7 +620,7 @@ class BroadcastUDPClient(Client):
class
Server
:
def
init
(
self
,
host
,
prog
,
vers
,
port
):
def
__init__
(
self
,
host
,
prog
,
vers
,
port
):
self
.
host
=
host
# Should normally be '' for default interface
self
.
prog
=
prog
self
.
vers
=
vers
...
...
@@ -631,17 +629,16 @@ class Server:
self
.
bindsocket
()
self
.
host
,
self
.
port
=
self
.
sock
.
getsockname
()
self
.
addpackers
()
return
self
def
register
(
self
):
mapping
=
self
.
prog
,
self
.
vers
,
self
.
prot
,
self
.
port
p
=
TCPPortMapperClient
(
).
init
(
self
.
host
)
p
=
TCPPortMapperClient
(
self
.
host
)
if
not
p
.
Set
(
mapping
):
raise
RuntimeError
,
'register failed'
def
unregister
(
self
):
mapping
=
self
.
prog
,
self
.
vers
,
self
.
prot
,
self
.
port
p
=
TCPPortMapperClient
(
).
init
(
self
.
host
)
p
=
TCPPortMapperClient
(
self
.
host
)
if
not
p
.
Unset
(
mapping
):
raise
RuntimeError
,
'unregister failed'
...
...
@@ -716,8 +713,8 @@ class Server:
def
addpackers
(
self
):
# Override this to use derived classes from Packer/Unpacker
self
.
packer
=
Packer
()
.
init
()
self
.
unpacker
=
Unpacker
(
).
init
(
''
)
self
.
packer
=
Packer
()
self
.
unpacker
=
Unpacker
(
''
)
class
TCPServer
(
Server
):
...
...
@@ -738,10 +735,41 @@ class TCPServer(Server):
call
=
recvrecord
(
sock
)
except
EOFError
:
break
except
socket
.
error
,
msg
:
print
'socket error:'
,
msg
break
reply
=
self
.
handle
(
call
)
if
reply
<>
None
:
if
reply
is
not
None
:
sendrecord
(
sock
,
reply
)
def
forkingloop
(
self
):
# Like loop but uses forksession()
self
.
sock
.
listen
(
0
)
while
1
:
self
.
forksession
(
self
.
sock
.
accept
())
def
forksession
(
self
,
connection
):
# Like session but forks off a subprocess
import
os
# Wait for deceased children
try
:
while
1
:
pid
,
sts
=
os
.
waitpid
(
0
,
1
)
except
os
.
error
:
pass
pid
=
None
try
:
pid
=
os
.
fork
()
if
pid
:
# Parent
connection
[
0
].
close
()
return
# Child
self
.
session
(
connection
)
finally
:
# Make sure we don't fall through in the parent
if
pid
==
0
:
os
.
_exit
(
0
)
class
UDPServer
(
Server
):
...
...
@@ -763,8 +791,7 @@ class UDPServer(Server):
# Simple test program -- dump local portmapper status
def
test
():
pmap
=
UDPPortMapperClient
().
init
(
''
)
pmap
.
Null
()
pmap
=
UDPPortMapperClient
(
''
)
list
=
pmap
.
Dump
()
list
.
sort
()
for
prog
,
vers
,
prot
,
port
in
list
:
...
...
@@ -786,7 +813,7 @@ def testbcast():
def
rh
(
reply
,
fromaddr
):
host
,
port
=
fromaddr
print
host
+
'
\
t
'
+
`reply`
pmap
=
BroadcastUDPPortMapperClient
(
).
init
(
bcastaddr
)
pmap
=
BroadcastUDPPortMapperClient
(
bcastaddr
)
pmap
.
set_reply_handler
(
rh
)
pmap
.
set_timeout
(
5
)
replies
=
pmap
.
Getport
((
100002
,
1
,
IPPROTO_UDP
,
0
))
...
...
@@ -806,7 +833,7 @@ def testsvr():
print
'RPC function 1 called, arg'
,
`arg`
self
.
packer
.
pack_string
(
arg
+
arg
)
#
s
=
S
(
).
init
(
''
,
0x20000000
,
1
,
0
)
s
=
S
(
''
,
0x20000000
,
1
,
0
)
try
:
s
.
unregister
()
except
RuntimeError
,
msg
:
...
...
@@ -830,7 +857,7 @@ def testclt():
return
self
.
make_call
(
1
,
arg
,
\
self
.
packer
.
pack_string
,
\
self
.
unpacker
.
unpack_string
)
c
=
C
(
).
init
(
host
,
0x20000000
,
1
)
c
=
C
(
host
,
0x20000000
,
1
)
print
'making call...'
reply
=
c
.
call_1
(
'hello, world, '
)
print
'call returned'
,
`reply`
Demo/rpc/test
View file @
9e80d6f1
...
...
@@ -7,6 +7,7 @@ $PYTHON -c 'from rpc import test; test()' charon.cwi.nl
$PYTHON -c 'from rpc import testsvr; testsvr()' &
SVR=$!
sleep 2
$PYTHON -c 'from rpc import testclt; testclt()'
kill -2 $SVR
...
...
Demo/rpc/xdr.py
View file @
9e80d6f1
...
...
@@ -12,9 +12,8 @@ Long = type(0L)
class
Packer
:
def
init
(
self
):
def
__init__
(
self
):
self
.
reset
()
return
self
def
reset
(
self
):
self
.
buf
=
''
...
...
@@ -47,6 +46,14 @@ class Packer:
pack_hyper
=
pack_uhyper
def
pack_float
(
self
,
x
):
# XXX
self
.
buf
=
self
.
buf
+
struct
.
pack
(
'f'
,
x
)
def
pack_double
(
self
,
x
):
# XXX
self
.
buf
=
self
.
buf
+
struct
.
pack
(
'd'
,
x
)
def
pack_fstring
(
self
,
n
,
s
):
if
n
<
0
:
raise
ValueError
,
'fstring size must be nonnegative'
...
...
@@ -67,7 +74,7 @@ class Packer:
def
pack_list
(
self
,
list
,
pack_item
):
for
item
in
list
:
self
.
pack_uint
(
1
)
pack_item
(
list
)
pack_item
(
item
)
self
.
pack_uint
(
0
)
def
pack_farray
(
self
,
n
,
list
,
pack_item
):
...
...
@@ -84,9 +91,8 @@ class Packer:
class
Unpacker
:
def
init
(
self
,
data
):
def
__init__
(
self
,
data
):
self
.
reset
(
data
)
return
self
def
reset
(
self
,
data
):
self
.
buf
=
data
...
...
@@ -136,6 +142,24 @@ class Unpacker:
if
x
>=
0x8000000000000000
L
:
x
=
x
-
0x10000000000000000
L
return
x
def
unpack_float
(
self
):
# XXX
i
=
self
.
pos
self
.
pos
=
j
=
i
+
4
data
=
self
.
buf
[
i
:
j
]
if
len
(
data
)
<
4
:
raise
EOFError
return
struct
.
unpack
(
'f'
,
data
)[
0
]
def
unpack_double
(
self
):
# XXX
i
=
self
.
pos
self
.
pos
=
j
=
i
+
8
data
=
self
.
buf
[
i
:
j
]
if
len
(
data
)
<
8
:
raise
EOFError
return
struct
.
unpack
(
'8'
,
data
)[
0
]
def
unpack_fstring
(
self
,
n
):
if
n
<
0
:
raise
ValueError
,
'fstring size must be nonnegative'
...
...
@@ -158,11 +182,12 @@ class Unpacker:
list
=
[]
while
1
:
x
=
self
.
unpack_uint
()
if
not
x
:
break
if
x
==
0
:
break
if
x
<>
1
:
raise
RuntimeError
,
\
'0 or 1 expected, got '
+
`x`
list
.
append
(
unpack_item
())
item
=
unpack_item
()
list
.
append
(
item
)
return
list
def
unpack_farray
(
self
,
n
,
unpack_item
):
...
...
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