All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH pynfs 1/3] remove trailing whitespace
@ 2021-05-24 14:42 Petr Vorel
  2021-05-24 14:42 ` [PATCH pynfs 2/3] server: Allow to print JSON format Petr Vorel
  2021-05-24 14:42 ` [PATCH pynfs 3/3] server: Add test code to JSON and XML output Petr Vorel
  0 siblings, 2 replies; 5+ messages in thread
From: Petr Vorel @ 2021-05-24 14:42 UTC (permalink / raw)
  To: linux-nfs; +Cc: Petr Vorel, J . Bruce Fields, Yong Sun (Sero)

Signed-off-by: Petr Vorel <pvorel@suse.cz>
---
 nfs4.0/nfs4acl.py        |  9 +++--
 nfs4.0/nfs4client.py     |  4 +--
 nfs4.0/nfs4lib.py        | 78 ++++++++++++++++++++--------------------
 nfs4.0/nfs4server.py     | 18 +++++-----
 nfs4.0/nfs4state.py      | 54 ++++++++++++++--------------
 nfs4.0/testserver.py     | 18 +++++-----
 nfs4.1/config.py         |  2 +-
 nfs4.1/fs.py             |  8 ++---
 nfs4.1/locking.py        |  8 ++---
 nfs4.1/nfs4client.py     | 22 ++++++------
 nfs4.1/nfs4commoncode.py | 12 +++----
 nfs4.1/nfs4lib.py        | 16 ++++-----
 nfs4.1/nfs4proxy.py      |  2 +-
 nfs4.1/nfs4server.py     | 56 ++++++++++++++---------------
 nfs4.1/nfs4state.py      | 12 +++----
 nfs4.1/setup.py          |  5 ++-
 nfs4.1/testclient.py     | 24 ++++++-------
 nfs4.1/testmod.py        | 15 ++++----
 nfs4.1/testserver.py     | 16 ++++-----
 rpc/rpc.py               | 14 ++++----
 rpc/setup.py             |  5 ++-
 showresults.py           |  4 +--
 xdr/setup.py             |  3 +-
 xdr/xdrgen.py            | 36 +++++++++----------
 24 files changed, 218 insertions(+), 223 deletions(-)

diff --git a/nfs4.0/nfs4acl.py b/nfs4.0/nfs4acl.py
index b7f033e..69e0d0b 100644
--- a/nfs4.0/nfs4acl.py
+++ b/nfs4.0/nfs4acl.py
@@ -2,7 +2,7 @@
 # nfs4acl.py - some useful acl code
 #
 # Written by Fred Isaman <iisaman@citi.umich.edu>
-# Copyright (C) 2004 University of Michigan, Center for 
+# Copyright (C) 2004 University of Michigan, Center for
 #                    Information Technology Integration
 #
 
@@ -87,7 +87,7 @@ def acl2mode(acl):
     for ace in short:
         if perms[ace.who] is not None: continue
         if ace.type == ALLOWED:
-            bits = 0 
+            bits = 0
             for mode, bit in modes:
                 if mode & ace.access_mask == mode:
                     bits |= bit
@@ -103,7 +103,7 @@ def acl2mode(acl):
         if perms[key] is None:
             perm[keys] = 0
     return perms["OWNER@"]*0o100 + perms["GROUP@"]*0o10 + perms["EVERYONE@"]
-        
+
 def maps_to_posix(acl):
     """Raises ACLError if acl does not map to posix """
 
@@ -147,7 +147,7 @@ def chk_triple(mask, allow, deny, flags, not_mask):
         raise ACLError("Triple mask does not have required flags  %x" % flags)
     if not_mask != mask.access_mask:
         raise ACLError("Triple mask is not same as a previous mask")
-    
+
 def chk_everyone(acl, flags):
     if len(acl) != 2:
         raise ACLError("Had %i ACEs left when called chk_everyone" % len(acl))
@@ -216,4 +216,3 @@ def printableacl(acl):
                (type_str[ace.type], ace.flag, ace.access_mask, ace.who)
     #print("leaving printableacl with out = %s" % out)
     return out
-    
diff --git a/nfs4.0/nfs4client.py b/nfs4.0/nfs4client.py
index d3d6e88..bc714d3 100755
--- a/nfs4.0/nfs4client.py
+++ b/nfs4.0/nfs4client.py
@@ -4,7 +4,7 @@
 # nfs4client.py - NFS4 interactive client in python
 #
 # Written by Fred Isaman   <iisaman@citi.umich.edu>
-# Copyright (C) 2006 University of Michigan, Center for 
+# Copyright (C) 2006 University of Michigan, Center for
 #                    Information Technology Integration
 #
 
@@ -126,6 +126,6 @@ def main(server):
     c = PyShell(server)
     c.interact("Try COMPOUND([PUTROOTFH()])")
     print("Goodbye!")
-        
+
 if __name__ == "__main__":
     main(sys.argv[1])
diff --git a/nfs4.0/nfs4lib.py b/nfs4.0/nfs4lib.py
index 905f8f4..934def3 100644
--- a/nfs4.0/nfs4lib.py
+++ b/nfs4.0/nfs4lib.py
@@ -2,24 +2,24 @@
 # nfs4lib.py - NFS4 library for Python
 #
 # Requires python 3.2
-# 
+#
 # Written by Fred Isaman <iisaman@citi.umich.edu>
-# Copyright (C) 2004 University of Michigan, Center for 
+# Copyright (C) 2004 University of Michigan, Center for
 #                    Information Technology Integration
 #
 # Based on version
 # Written by Peter Astrand <peter@cendio.se>
 # Copyright (C) 2001 Cendio Systems AB (http://www.cendio.se)
-# 
+#
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; version 2 of the License. 
-# 
+# the Free Software Foundation; version 2 of the License.
+#
 # This program is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 # GNU General Public License for more details.
-# 
+#
 # You should have received a copy of the GNU General Public License
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
@@ -72,7 +72,7 @@ class UnexpectedCompoundRes(NFSException):
     """The COMPOUND procedure returned OK, but had unexpected data"""
     def __init__(self, msg=""):
         self.msg = msg
-    
+
     def __str__(self):
         if self.msg:
             return "Unexpected COMPOUND result: %s" % self.msg
@@ -83,7 +83,7 @@ class InvalidCompoundRes(NFSException):
     """The COMPOUND return is invalid, ie response is not to spec"""
     def __init__(self, msg=""):
         self.msg = msg
-    
+
     def __str__(self):
         if self.msg:
             return "Invalid COMPOUND result: %s" % self.msg
@@ -105,8 +105,8 @@ class FancyNFS4Packer(nfs4_pack.NFS4Packer):
             data = dict2fattr(data)
         return data
 
-    # def pack_dirlist4(self): 
-        
+    # def pack_dirlist4(self):
+
 class FancyNFS4Unpacker(nfs4_pack.NFS4Unpacker):
     def filter_bitmap4(self, data):
         """Put bitmap into single long, instead of array of 32bit chunks"""
@@ -121,7 +121,7 @@ class FancyNFS4Unpacker(nfs4_pack.NFS4Unpacker):
         """Return as dict, instead of opaque attrlist"""
         return fattr2dict(data)
 
-    
+
     def filter_dirlist4(self, data):
         """Return as simple list, instead of strange chain structure"""
         e = data.entries
@@ -133,8 +133,8 @@ class FancyNFS4Unpacker(nfs4_pack.NFS4Unpacker):
             array.append(e[0])
         data.entries = array
         return data
-        
-        
+
+
 # STUB
 class CBServer(rpc.RPCServer):
     def __init__(self, client):
@@ -165,8 +165,8 @@ class CBServer(rpc.RPCServer):
             OP_CB_GETATTR: 0,
             OP_CB_RECALL: 0,
             #OP_CB_ILLEGAL: 0,
-            }            
-        
+            }
+
     def set_cb_recall(self, cbid, funct, ret):
         self.recall_lock.acquire()
         self.recall_funct[cbid] = funct
@@ -209,7 +209,7 @@ class CBServer(rpc.RPCServer):
             return rpc.GARBAGE_ARGS, b''
         else:
             return rpc.SUCCESS, b''
-    
+
     def handle_1(self, data, cred):
         """Deal with CB_COMPOUND"""
         print("*****CB received COMPOUND******")
@@ -223,7 +223,7 @@ class CBServer(rpc.RPCServer):
         self.nfs4packer.reset()
         self.nfs4packer.pack_CB_COMPOUND4res(cmp4res)
         return rpc.SUCCESS, self.nfs4packer.get_buffer()
-            
+
     def O_CB_Compound(self):
         tag = b''
         try:
@@ -247,7 +247,7 @@ class CBServer(rpc.RPCServer):
             if ok != NFS4_OK:
                 break
         return ok, results, tag
-        
+
     # FIXME
     def O_CB_GetAttr(self, op, cbid):
         print("******* CB_Getattr *******")
@@ -272,7 +272,7 @@ class CBServer(rpc.RPCServer):
         self.recall_return[cbid] = NFS4_OK
         self.recall_lock.release()
         return res
-            
+
 # STUB
 AuthSys = rpc.SecAuthSys(0,b'jupiter',103558,100,[])
 
@@ -527,12 +527,12 @@ class NFS4Client(rpc.RPCClient):
         res = self.compound(ops)
         check_result(res)
         return res.resarray[-1].switch.switch.object
-    
+
     def do_readdir(self, file, cookie=0, cookieverf = b'', attr_request=[],
                    dircount=4096, maxcount=4096):
         # Since we may not get whole directory listing in one readdir request,
         # loop until we do. For each request result, create a flat list
-        # with <entry4> objects. 
+        # with <entry4> objects.
         attrs = list2bitmap(attr_request)
         cookie = 0
         cookieverf = b''
@@ -553,7 +553,7 @@ class NFS4Client(rpc.RPCClient):
                 else:
                     break
             entry = reply.entries[0]
-            # Loop over all entries in result. 
+            # Loop over all entries in result.
             while 1:
                 entry.attrdict = entry.attrs
                 entry.count = count
@@ -648,7 +648,7 @@ class NFS4Client(rpc.RPCClient):
             # There was no delegation granted, so clean up recall info
             self.cb_server.clear_cb_recall(self.cbid)
         return res
-        
+
     def open_file(self, owner, path=None,
                   access=OPEN4_SHARE_ACCESS_READ,
                   deny=OPEN4_SHARE_DENY_WRITE,
@@ -706,7 +706,7 @@ class NFS4Client(rpc.RPCClient):
             check_result(res)
             stateid = res.resarray[-1].switch.switch.open_stateid
         return (fhandle, stateid)
-        
+
 
     def create_confirm(self, owner, path=None, attrs={FATTR4_MODE: 0o644},
                        access=OPEN4_SHARE_ACCESS_BOTH,
@@ -726,7 +726,7 @@ class NFS4Client(rpc.RPCClient):
         res = self.open_file(owner, path, access, deny)
         check_result(res, "Opening file %s" % _getname(owner, path))
         return self.confirm(owner, res)
-        
+
 ##     def xxxopen_claim_prev(self, owner, fh, seqid=None,
 ##                        check=None, error=NFS4_OK, msg=''):
 ##         # Set defaults
@@ -778,7 +778,7 @@ class NFS4Client(rpc.RPCClient):
             res.count = res.resarray[-1].switch.switch.count
             res.committed = res.resarray[-1].switch.switch.committed
         return res
-    
+
     def read_file(self, file, offset=0, count=2048, stateid=stateid4(0, b'')):
         ops =  self.use_obj(file)
         ops += [op4.read(stateid, offset, count)]
@@ -794,7 +794,7 @@ class NFS4Client(rpc.RPCClient):
         """Lock the file in fh using owner for the first time
 
         file can be either a fh or a path"""
-        
+
         if lockowner is None:
             lockowner = b"lockowner_%f" % time.time()
         if openseqid is None: openseqid = self.get_seqid(openowner)
@@ -838,7 +838,7 @@ class NFS4Client(rpc.RPCClient):
         test_owner = lock_owner4(self.clientid, tester)
         ops += [op4.lockt(type, offset, len, test_owner)]
         return self.compound(ops)
-                  
+
     def close_file(self, owner, fh, stateid, seqid=None):
         """close the given file"""
         if seqid is None: seqid = self.get_seqid(owner)
@@ -898,22 +898,22 @@ def get_attr_name(bitnum):
     """Return string corresponding to attribute bitnum"""
     return get_bitnumattr_dict().get(bitnum, "Unknown_%r" % bitnum)
 
-_cache_attrbitnum = {} 
+_cache_attrbitnum = {}
 def get_attrbitnum_dict():
     """Get dictionary with attribute bit positions.
 
     Note: This function uses introspection. It assumes an entry
-    in nfs4_const.py is an attribute iff it is named FATTR4_<something>. 
+    in nfs4_const.py is an attribute iff it is named FATTR4_<something>.
 
     Returns {"type": 1, "fh_expire_type": 2,  "change": 3 ...}
     """
-    
+
     if _cache_attrbitnum:
         return _cache_attrbitnum
     for name in dir(nfs4_const):
         if name.startswith("FATTR4_"):
             value = getattr(nfs4_const, name)
-            # Sanity checking. Must be integer. 
+            # Sanity checking. Must be integer.
             assert(type(value) is int)
             attrname = name[7:].lower()
             _cache_attrbitnum[attrname] = value
@@ -922,9 +922,9 @@ def get_attrbitnum_dict():
 _cache_bitnumattr = {}
 def get_bitnumattr_dict():
     """Get dictionary with attribute bit positions.
-    
+
     Note: This function uses introspection. It assumes an entry
-    in nfs4_const.py is an attribute iff it is named FATTR4_<something>. 
+    in nfs4_const.py is an attribute iff it is named FATTR4_<something>.
     Returns { 1: "type", 2: "fh_expire_type", 3: "change", ...}
     """
 
@@ -933,7 +933,7 @@ def get_bitnumattr_dict():
     for name in dir(nfs4_const):
         if name.startswith("FATTR4_"):
             value = getattr(nfs4_const, name)
-            # Sanity checking. Must be integer. 
+            # Sanity checking. Must be integer.
             assert(type(value) is int)
             attrname = name[7:].lower()
             _cache_bitnumattr[value] = attrname
@@ -949,7 +949,7 @@ def get_attrpackers(packer):
     dict = get_attrbitnum_dict()
     for name in dir(nfs4_pack.NFS4Packer):
         if name.startswith("pack_fattr4_"):
-            # pack_fattr4 is 12 chars. 
+            # pack_fattr4 is 12 chars.
             attrname = name[12:]
             out[dict[attrname]] = getattr(packer, name)
     return out
@@ -964,7 +964,7 @@ def get_attrunpacker(unpacker):
     attrunpackers = {}
     for name in dir(FancyNFS4Unpacker):
         if name.startswith("unpack_fattr4_"):
-            # unpack_fattr4_ is 14 chars. 
+            # unpack_fattr4_ is 14 chars.
             attrname = name[14:]
             bitnum = get_attrbitnum_dict()[attrname]
             attrunpackers[bitnum] = getattr(unpacker, name)
@@ -977,7 +977,7 @@ _cache_attrpackers = get_attrpackers(_cache_packer)
 def dict2fattr(dict):
     """Convert a dictionary of form {numb:value} to a fattr4 object.
 
-    Returns a fattr4 object.  
+    Returns a fattr4 object.
     """
 
     attrs = sorted(dict.keys())
@@ -993,7 +993,7 @@ def dict2fattr(dict):
         packerfun(value)
         attr_vals += packer.get_buffer()
     attrmask = list2bitmap(attrs)
-    return fattr4(attrmask, attr_vals); 
+    return fattr4(attrmask, attr_vals);
 
 def fattr2dict(obj):
     """Convert a fattr4 object to a dictionary with attribute name and values.
diff --git a/nfs4.0/nfs4server.py b/nfs4.0/nfs4server.py
index 3cf6ec2..2dbad30 100755
--- a/nfs4.0/nfs4server.py
+++ b/nfs4.0/nfs4server.py
@@ -4,7 +4,7 @@
 #
 # Written by Martin Murray <mmurray@deepthought.org>
 # and        Fred Isaman   <iisaman@citi.umich.edu>
-# Copyright (C) 2001 University of Michigan, Center for 
+# Copyright (C) 2001 University of Michigan, Center for
 #                    Information Technology Integration
 #
 
@@ -62,7 +62,7 @@ def verify_utf8(str):
         return True
     except UnicodeError:
         return False
-            
+
 def access2string(access):
     ret = []
     if access & ACCESS4_READ:
@@ -119,7 +119,7 @@ class NFS4Server(rpc.RPCServer):
             return rpc.GARBAGE_ARGS, ''
         else:
             return rpc.SUCCESS, ''
-    
+
     def handle_1(self, data, cred):
         self.nfs4unpacker.reset(data)
         print
@@ -129,7 +129,7 @@ class NFS4Server(rpc.RPCServer):
             self.nfs4unpacker.done()
         except XDRError:
             print(repr(self.nfs4unpacker.get_buffer()))
-            
+
             raise
             return rpc.GARBAGE_ARGS, ''
         cmp4res = COMPOUND4res(ok, tag, results)
@@ -175,7 +175,7 @@ class NFS4Server(rpc.RPCServer):
             return NFS4ERR_MINOR_VERS_MISMATCH, [], tag
         if not verify_utf8(tag):
             return NFS4ERR_INVAL, [], tag
-        self.prep_client()            
+        self.prep_client()
         results = []
         ok = NFS4_OK
         for op in cmp4args.argarray:
@@ -278,7 +278,7 @@ class NFS4Server(rpc.RPCServer):
     # FIXME: have it actually do something
     def op_delegpurge(self, op):
         return simple_error(NFS4ERR_NOTSUPP)
-    
+
     # FIXME: have it actually do something
     def op_delegreturn(self, op):
         return simple_error(NFS4ERR_NOTSUPP)
@@ -402,7 +402,7 @@ class NFS4Server(rpc.RPCServer):
     def op_lookup(self, op):
         print("  CURRENT FILEHANDLE %s" % repr(self.curr_fh))
         print("  REQUESTED OBJECT %s" % op.oplookup.objname)
-        
+
         if not self.curr_fh:
             return simple_error(NFS4ERR_NOFILEHANDLE)
         if self.curr_fh.get_type() == NF4LNK:
@@ -595,7 +595,7 @@ class NFS4Server(rpc.RPCServer):
         # check access!
         if not op.opputfh.object in self.fhcache:
             return simple_error(NFS4ERR_BADHANDLE)
-        self.curr_fh = self.fhcache[op.opputfh.object] 
+        self.curr_fh = self.fhcache[op.opputfh.object]
         return simple_error(NFS4_OK)
 
     def op_putpubfh(self, op):
@@ -898,7 +898,7 @@ class NFS4Server(rpc.RPCServer):
         self.state.unconfirmed.remove(x=entry2.x)
         self.state.reset_seqid(c)
         return simple_error(NFS4_OK)
-            
+
     def op_verify(self, op):
         print("  CURRENT FILEHANDLE %s" % repr(self.curr_fh))
         if not self.curr_fh:
diff --git a/nfs4.0/nfs4state.py b/nfs4.0/nfs4state.py
index 8aca178..ca40172 100755
--- a/nfs4.0/nfs4state.py
+++ b/nfs4.0/nfs4state.py
@@ -233,7 +233,7 @@ class NFSServerState:
                 owner.lastseqid = None
         except KeyError:
             pass
-        
+
     def check_seqid(self, obj, seqid, mustexist=True, open_confirm=False):
         """Check that seqid against stored one for obj.
 
@@ -276,7 +276,7 @@ class NFSServerState:
         if mod32(lastseq + 1) == seqid:
             return
         raise NFS4Error(NFS4ERR_BAD_SEQID)
-    
+
     def advance_seqid(self, owner, op, args, cfh=None):
         """Advance stored seqid for owner, if appropriate. Cache the rest.
 
@@ -416,7 +416,7 @@ class NFSServerState:
             self.next_id += 1
             self.state[id] = self.StateIDInfo(fh, info)
             return id
-            
+
     def __owner2info(self, owner, allownew=False):
         """Returns info for given owner.
 
@@ -476,7 +476,7 @@ class NFSServerState:
     def __getowner(self, id):
         """Returns owner associated with given id"""
         return self.state[id].owner.owner
-        
+
     def __check_clientid(self, clientid):
         """Checks that clientid is not stale"""
         if clientid / 0x100000000 != unpacknumber(self.instance):
@@ -497,7 +497,7 @@ class NFSServerState:
             self.confirmed.renew(clientid)
         except KeyError:
             raise NFS4Error(NFS4ERR_EXPIRED)
-        
+
     def new_lockowner(self, openowner):
         """Use openowner data to create a new lock owner"""
         if openowner.lock_seqid != 0:
@@ -547,8 +547,8 @@ class NFSServerState:
             return True
         else:
             return False
-                
-        
+
+
     def __testlock(self, fh, ids, type, offset, end):
         """Raise NFS4ERR_DENIED if conflicting lock exists"""
         deny = fh.state.testlock(ids, type, offset, end)
@@ -675,7 +675,7 @@ class NFSServerState:
                     del self.state[id]
             del self.openowners[clientid]
 
-        
+
 #########################################################################
 
 
@@ -727,7 +727,7 @@ class NFSFileState:
         """Change 3 bit internal value to 2 bit external"""
         if value & 4: return 3
         else: return value & 3
-        
+
     def downshares(self, id, access, deny):
         """Downgrade shares.  access == deny == 0 removes shares completely"""
         if id not in self.shares:
@@ -879,7 +879,7 @@ class NFSFileState:
         for lock in list[:]:
             if lock.overlaps(start, end):
                 list.remove(lock)
-        
+
 #########################################################################
 
 class NFSFileHandle:
@@ -901,31 +901,31 @@ class NFSFileHandle:
 
     def __repr__(self):
         return "<NFSFileHandle(%s): %s>" % (self.get_fhclass(), str(self))
-    
+
     def __str__(self):
         return self.name
-            
+
     def supported_access(self, client):
         raise "Implement supported_access()"
-        
+
     def evaluate_access(self, client):
         raise "Implement evaluate_access()"
 
     def get_attributes(self, attrlist=None):
         raise "Implement get_attributes"
-                
+
     def get_directory(self):
-        raise "Implement get_directory"                
+        raise "Implement get_directory"
 
     def get_type(self):
         raise "Implement get_type"
-    
+
     def read(self, offset, count):
         raise "Implement read"
 
     def write(self, offset, data):
         raise "Implement write"
-        
+
     def link(self, target):
         raise "Implement link"
 
@@ -1214,7 +1214,7 @@ class VirtualHandle(NFSFileHandle):
             raise "hardlink called with non-directory self"
         if file.fattr4_type == NF4DIR:
             raise "hardlink to a directory"
-        
+
         self.__link(file, newname)
 
     def __link(self, file, newname):
@@ -1243,7 +1243,7 @@ class VirtualHandle(NFSFileHandle):
         if self.fattr4_type == NF4DIR:
             return len(self.dirent) == 0
         raise "is_empty() called on non-dir"
-        
+
     def read(self, offset, count):
         if self.fattr4_type != NF4REG:
             raise "read called on non file!"
@@ -1272,7 +1272,7 @@ class VirtualHandle(NFSFileHandle):
         self.fattr4_size = len(self.dirent)
         self.fattr4_time_modify = converttime()
         self.fattr4_time_metadata = converttime()
-    
+
     def rename(self, oldfh, oldname, newname): # self = newfh
         file = oldfh.dirent[oldname]
         self.__link(file, newname)
@@ -1291,7 +1291,7 @@ class VirtualHandle(NFSFileHandle):
             return self.dirent.verifier
         else:
             raise "getdirverf called on non directory."
-        
+
     def read_link(self):
         if self.fattr4_type != NF4LNK:
             raise "read_link called on non NF4LNK."
@@ -1338,7 +1338,7 @@ class HardHandle(NFSFileHandle):
         self.file = file
         self.dirent = None
         self.mtime = 0
-        
+
     def do_lookupp(self):
         return self.parent
 
@@ -1361,7 +1361,7 @@ class HardHandle(NFSFileHandle):
                     ret_dict[attr] = fsid4(0, 0)
             elif attr == FATTR4_LEASE_TIME:
                     ret_dict[attr] = 1700
-            elif attr == FATTR4_FILEID: 
+            elif attr == FATTR4_FILEID:
                     ret_dict[attr] = stat_struct.st_ino
             elif attr == FATTR4_MAXFILESIZE:
                     ret_dict[attr] = 1000000
@@ -1378,7 +1378,7 @@ class HardHandle(NFSFileHandle):
             elif attr == FATTR4_OWNER_GROUP:
                     ret_dict[attr] = stat_struct.st_gid
             elif attr == FATTR4_RAWDEV:
-                    ret_dict[attr] = specdata4(0, 0) 
+                    ret_dict[attr] = specdata4(0, 0)
             elif attr == FATTR4_TIME_ACCESS:
                     ret_dict[attr] = nfstime4(stat_struct.st_atime, 0);
             elif attr == FATTR4_TIME_MODIFY:
@@ -1387,7 +1387,7 @@ class HardHandle(NFSFileHandle):
 
     def get_fhclass(self):
         return "hard"
-    
+
         def get_link(self):
                 return os.readlink(self.file)
 
@@ -1426,7 +1426,7 @@ class HardHandle(NFSFileHandle):
         for i in self.oldfiles:
             del self.dirent[i]
         return self.dirent.values()
-        
+
     def read_link(self):
         return os.readlink(self.file)
 
@@ -1435,7 +1435,7 @@ class HardHandle(NFSFileHandle):
         fh.seek(offset)
         fh.write(data)
         fh.close()
-        return len(data) 
+        return len(data)
 
 # This seems to be only used now by O_Readdir...can we get rid of it?
 ## class NFSClientHandle:
diff --git a/nfs4.0/testserver.py b/nfs4.0/testserver.py
index 801142e..0ef010a 100755
--- a/nfs4.0/testserver.py
+++ b/nfs4.0/testserver.py
@@ -2,24 +2,24 @@
 # nfs4stest.py - nfsv4 server tester
 #
 # Requires python 3.2
-# 
+#
 # Written by Fred Isaman <iisaman@citi.umich.edu>
-# Copyright (C) 2004 University of Michigan, Center for 
+# Copyright (C) 2004 University of Michigan, Center for
 #                    Information Technology Integration
 #
 # Based on pynfs
 # Written by Peter Astrand <peter@cendio.se>
 # Copyright (C) 2001 Cendio Systems AB (http://www.cendio.se)
-# 
+#
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; version 2 of the License. 
-# 
+# the Free Software Foundation; version 2 of the License.
+#
 # This program is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 # GNU General Public License for more details.
-# 
+#
 # You should have received a copy of the GNU General Public License
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
@@ -112,7 +112,7 @@ def scan_options(p):
                  help="Force test dependencies to be run, "
                  "even if not requested on command line")
     p.add_option_group(g)
-    
+
     g = OptionGroup(p, "Test output options",
                     "These options affect how test results are shown.")
     g.add_option("-v", "--verbose", action="store_true", default=False,
@@ -227,7 +227,7 @@ def printflags(list):
     for s in list:
         if s not in command_names:
             print(s)
-    
+
 def main():
     nfail = -1
     p = OptionParser("%prog SERVER:/PATH [options] flags|testcodes\n"
@@ -316,7 +316,7 @@ def main():
                 (opt.security, str(valid.keys())))
     opt.flavor = valid[opt.security]
     opt.service = {'krb5':1, 'krb5i':2, 'krb5p':3}.get(opt.security, 0)
-               
+
     # Make sure args are valid
     opt.args = []
     for a in args:
diff --git a/nfs4.1/config.py b/nfs4.1/config.py
index 8779fe1..3777e31 100644
--- a/nfs4.1/config.py
+++ b/nfs4.1/config.py
@@ -116,7 +116,7 @@ class MetaConfig(type):
         for i, attr in enumerate(attrs):
             setattr(cls, attr.name, property(make_get(i), make_set(i),
                                              None, attr.comment))
-        
+
 class ServerConfig(object):
     __metaclass__ = MetaConfig
     attrs =  [ConfigLine("allow_null_data", False,
diff --git a/nfs4.1/fs.py b/nfs4.1/fs.py
index e8d413e..7f690bb 100644
--- a/nfs4.1/fs.py
+++ b/nfs4.1/fs.py
@@ -176,7 +176,7 @@ class FSObject(object):
         self.lock = RWLock(name=str(id))
         self.seek_lock = Lock("SeekLock")
         self.current_layout = None
-        self.covered_by = None # If this is a mountpoint for fs, equals fs.root 
+        self.covered_by = None # If this is a mountpoint for fs, equals fs.root
         # XXX Need to write to disk here?
         self._init_hook()
 
@@ -760,7 +760,7 @@ class ConfigObj(FSObject):
     def exists(self, name):
         """Returns True if name is in the dir"""
         log_o.log(5, "FSObject.exists(%r)" % name)
-        # HACK - build a fake client 
+        # HACK - build a fake client
         class Fake(object):
             def __init__(self):
                 self.clientid = 0
@@ -911,7 +911,7 @@ class ConfigFS(FileSystem):
         else:
             # Is a directory.  Tree is currently set up like:
             #                       config (1)
-            #        ______________/ /   \  \______________      
+            #        ______________/ /   \  \______________
             #       /               /     \                \
             # actions (8)   serverwide (2)  perclient (3)  ops (4)
             #
@@ -1292,7 +1292,7 @@ class BlockLayoutFS(FileSystem):
 
     def _make_files(self, dev):
         # STUB - hard code some test files with various properties
-        
+
         # These will use test_layout_dict to get id to layout mapping
         princ = nfs4lib.NFS4Principal("root", system=True)
         bs = self.fattr4_layout_blksize
diff --git a/nfs4.1/locking.py b/nfs4.1/locking.py
index 1dc428f..238fdad 100644
--- a/nfs4.1/locking.py
+++ b/nfs4.1/locking.py
@@ -2,7 +2,7 @@ from __future__ import with_statement
 import threading
 
 
-DEBUG = False # Note this only affects locks at creation 
+DEBUG = False # Note this only affects locks at creation
 
 class Counter(object):
     def __init__(self, first_value=0, name="counter"):
@@ -62,7 +62,7 @@ class _DebugLock(object):
         self.lock = threading.Lock()
         self.name = name
 
-    
+
     @_collect_acq_data()
     def acquire(self):
         self.lock.acquire()
@@ -86,7 +86,7 @@ class _RWLock(object):
     """
     # NOTE - in case of read-only filesystem, want acquire/release to
     # revert to NOPs, while acquire-write should raise error.
-    
+
     def __init__(self):
         self._cond = threading.Condition()
         self._write_lock = threading.Lock()
@@ -171,7 +171,7 @@ class _RWLockVerbose(_RWLock):
     """
     # NOTE - in case of read-only filesystem, want acquire/release to
     # revert to NOPs, while acquire-write should raise error.
-    
+
     def __init__(self, name=""):
         super(_RWLockVerbose, self).__init__()
         self.name = "RWLock_%s" % name
diff --git a/nfs4.1/nfs4client.py b/nfs4.1/nfs4client.py
index df573d6..c9d8775 100644
--- a/nfs4.1/nfs4client.py
+++ b/nfs4.1/nfs4client.py
@@ -99,7 +99,7 @@ class NFS4Client(rpc.Client, rpc.Server):
                 [ nfs_opnum4[a.argop].lower()[3:] for a in args[0] ],
                 nfsstat4[res.status])
         return res
-    
+
     def listen(self, xid, pipe=None, timeout=10.0):
         if pipe is None:
             pipe = self.c1
@@ -167,7 +167,7 @@ class NFS4Client(rpc.Client, rpc.Server):
             log_cb.info("Replay...sending data")
             data = e.cache.data
         return rpc.SUCCESS, data, getattr(env, "notify", None)
-        
+
     def check_utf8str_cs(self, str):
         # XXX combine code with server
         # STUB - raises NFS4Error if appropriate.
@@ -234,7 +234,7 @@ class NFS4Client(rpc.Client, rpc.Server):
         if funct is None:
             return
         funct(arg, env)
-        
+
     def posthook(self, arg, env, res=None):
         """Call the function post_<opname>_<clientid> if it exists"""
         if env.session is None:
@@ -246,7 +246,7 @@ class NFS4Client(rpc.Client, rpc.Server):
         if funct is None:
             return res
         return funct(arg, env, res)
-        
+
     def op_cb_sequence(self, arg, env):
         log_cb.info("In CB_SEQUENCE")
         if env.index != 0:
@@ -430,18 +430,18 @@ class ClientRecord(object):
         else:
             # Add hook
             setattr(self.c, hook_name, funct)
-        
+
     def cb_pre_hook(self, op_num, funct=None):
         if op_num == OP_CB_SEQUENCE:
             raise RuntimeError("Hook depends on session info from CB_SEQUENCE")
         self._cb_hook("pre", nfs_cb_opnum4[op_num][3:].lower(), funct)
-        
+
     def cb_post_hook(self, op_num, funct=None):
         self._cb_hook("post", nfs_cb_opnum4[op_num][3:].lower(), funct)
-        
+
 # XXX FIXME - this is for Slot code, put in reuasable spot if this works
-from nfs4server import Slot        
-from nfs4server import Channel as RecvChannel 
+from nfs4server import Slot
+from nfs4server import Channel as RecvChannel
 
 class SendChannel(object):
     def __init__(s, attrs):
@@ -464,7 +464,7 @@ class SendChannel(object):
             raise RuntimeError("Out of slots")
         finally:
             self.lock.release()
-                
+
 class SessionRecord(object):
     def __init__(self, csr, client):
         self.sessionid = csr.csr_sessionid
@@ -515,7 +515,7 @@ class SessionRecord(object):
                              kwargs.pop("cache_this", False))
         slot = self.fore_channel.slots[seq_op.sa_slotid]
         return slot, seq_op
- 
+
     def compound_async(self, ops, **kwargs):
         slot, seq_op = self._prepare_compound(kwargs)
         slot.xid = self.c.compound_async([seq_op] + ops, **kwargs)
diff --git a/nfs4.1/nfs4commoncode.py b/nfs4.1/nfs4commoncode.py
index 24c4650..bba5a69 100644
--- a/nfs4.1/nfs4commoncode.py
+++ b/nfs4.1/nfs4commoncode.py
@@ -47,7 +47,7 @@ def %(encode_status)s_by_name(name, status, *args, **kwargs):
         raise
         pass
     raise RuntimeError("Problem with name %%r" %% name)
-        
+
 def %(encode_status)s(status, *args, **kwargs):
     """Called from function op_<name>, encodes the operations response.
 
@@ -63,7 +63,7 @@ def %(encode_status)s(status, *args, **kwargs):
 class %(CompoundArgResults)s(object):
     size = property(lambda s: s._base_len + nfs4lib.xdrlen(s._env.tag))
     tag = property(lambda s: s.prefix + s._env.tag)
-    
+
     def __init__(self, env, prefix=b""):
         self.status = NFS4_OK # Generally == self.results[-1].status
         self.results = [] # Array of nfs_resop4 structures
@@ -106,7 +106,7 @@ class %(PairedResults)s(object):
         #        self.cache = self.reply[0:1] + [NFS4ERR_RETRY_UNCACHED_REP]
         #                        ^
         #                         \should be SEQ
-        
+
         # STUB - do size checking on self.reply
         if self.env.caching or self.env.index == 0:
             self.cache.append(result)
@@ -122,7 +122,7 @@ class %(PairedResults)s(object):
         self.reply.status = self.cache.status = status
         if tag is not None:
             self.env.tag = tag
-        
+
     # Generally make class behave like self.reply
     def __getitem__(self, key):
         return self.reply[key]
@@ -132,7 +132,7 @@ class %(PairedResults)s(object):
 
 class %(CompoundState)s(object):
     """ We hold here all the interim state the server needs to remember
-    
+
     as it handles each operation in turn.
     """
     def __init__(self, args, cred):
@@ -172,7 +172,7 @@ class %(CompoundState)s(object):
         """Pull security triple of (OID, QOP, service) from cred"""
         # STUB
         return 0
-    
+
     def get_connection(self, cred):
         """Pull connection id from credential"""
         return cred.connection
diff --git a/nfs4.1/nfs4lib.py b/nfs4.1/nfs4lib.py
index 5eada23..b1a247b 100644
--- a/nfs4.1/nfs4lib.py
+++ b/nfs4.1/nfs4lib.py
@@ -100,7 +100,7 @@ def set_attrbit_dicts():
     """Set global dictionaries manipulating attribute bit positions.
 
     Note: This function uses introspection. It assumes an entry
-    in nfs4_const.py is an attribute iff it is named FATTR4_<something>. 
+    in nfs4_const.py is an attribute iff it is named FATTR4_<something>.
 
     Returns {"type": 1, "fh_expire_type": 2,  "change": 3 ...}
             { 1: "type", 2: "fh_expire_type", 3: "change", ...}
@@ -111,7 +111,7 @@ def set_attrbit_dicts():
     for name in dir(xdrdef.nfs4_const):
         if name.startswith("FATTR4_"):
             value = getattr(xdrdef.nfs4_const, name)
-            # Sanity checking. Must be integer. 
+            # Sanity checking. Must be integer.
             assert(type(value) is int)
             attrname = name[7:].lower()
             attr2bitnum[attrname] = value
@@ -172,7 +172,7 @@ class UnexpectedCompoundRes(NFSException):
     """The COMPOUND procedure returned OK, but had unexpected data"""
     def __init__(self, msg=""):
         self.msg = msg
-    
+
     def __str__(self):
         if self.msg:
             return "Unexpected COMPOUND result: %s" % self.msg
@@ -183,7 +183,7 @@ class InvalidCompoundRes(NFSException):
     """The COMPOUND return is invalid, ie response is not to spec"""
     def __init__(self, msg=""):
         self.msg = msg
-    
+
     def __str__(self):
         if self.msg:
             return "Invalid COMPOUND result: %s" % self.msg
@@ -242,11 +242,11 @@ class FancyNFS4Unpacker(NFS4Unpacker):
             list.append(e)
         data.entries = list
         return data
-            
+
 def dict2fattr(dict):
     """Convert a dictionary of form {numb:value} to a fattr4 object.
 
-    Returns a fattr4 object.  
+    Returns a fattr4 object.
     """
 
     attrs = sorted(dict.keys())
@@ -259,7 +259,7 @@ def dict2fattr(dict):
         getattr(packer, bitnum2packer[bitnum])(value)
         attr_vals += packer.get_buffer()
     attrmask = list2bitmap(attrs)
-    return xdrdef.nfs4_type.fattr4(attrmask, attr_vals); 
+    return xdrdef.nfs4_type.fattr4(attrmask, attr_vals);
 
 def fattr2dict(obj):
     """Convert a fattr4 object to a dictionary with attribute name and values.
@@ -648,7 +648,7 @@ class AttrConfig(object):
         self._f = (kind=="obj")
         self._s = (kind=="serv")
         self._fs = (kind=="fs")
-    
+
 from xdrdef.nfs4_const import *
 
 A = AttrConfig
diff --git a/nfs4.1/nfs4proxy.py b/nfs4.1/nfs4proxy.py
index dd870d9..1b935fa 100755
--- a/nfs4.1/nfs4proxy.py
+++ b/nfs4.1/nfs4proxy.py
@@ -235,7 +235,7 @@ class NFS4Proxy(rpc.Server):
         log.debug("Proxy sent:")
         log.debug(repr(args))
         calldata = packer.get_buffer()
-        try:    
+        try:
             ret_data = self.forward_call(calldata, callback)
         except rpc.RPCTimeout:
             log.critical("Error: cannot connect to destination server")
diff --git a/nfs4.1/nfs4server.py b/nfs4.1/nfs4server.py
index 9422481..f56806e 100755
--- a/nfs4.1/nfs4server.py
+++ b/nfs4.1/nfs4server.py
@@ -109,7 +109,7 @@ class Recording(object):
     """Store RPC traffic for client"""
     def __init__(self):
         self.reset()
-        
+
     def add(self, call, reply):
         """Add call and reply strings to records"""
         if self.on:
@@ -121,7 +121,7 @@ class Recording(object):
             queue = collections.deque()
             self.queues[stamp] = queue
         self.queue = queue
-        
+
     def reset(self):
         self.stamp = "default"
         self.on = False
@@ -198,15 +198,15 @@ class StateProtection(object):
                                   handles)
             rv.spr_ssv_info = info
         return rv
-            
-        
-        
+
+
+
 class ClientList(object):
     """Manage mapping of clientids to server data.
 
     Handles the handing out of clientids, the mapping of
     client supplied ownerid to server supplied clientid, and
-    the mapping of either to ClientRecords, where all of the 
+    the mapping of either to ClientRecords, where all of the
     server's state data related to the client can be accessed.
     """
     def __init__(self):
@@ -240,7 +240,7 @@ class ClientList(object):
         """
         c = ClientRecord(self._nextid, arg, principal, security=security)
         if c.ownerid in self._data:
-            raise RuntimeError("ownerid %r already in ClientList" % 
+            raise RuntimeError("ownerid %r already in ClientList" %
                                c.ownerid)
         # STUB - want to limit size of _nextid to < 2**32, to
         # accomodate ConfigFS, which embeds clientid into fileid.
@@ -271,7 +271,7 @@ class VerboseDict(dict):
         if self.config.debug_state:
             log_41.info("+++ Removing client.state[%r]" % key)
         dict.__delitem__(self, key)
-        
+
 class ClientRecord(object):
     """The server's representation of a client and its state"""
     def __init__(self, id, arg, principal, mech=None, security=None):
@@ -289,7 +289,7 @@ class ClientRecord(object):
         self._next = 1 # counter for generating unique stateid 'other'
         self._handle_ctr = Counter(name="ssv_handle_counter")
         self._lock = Lock("Client")
-        
+
     def update(self, arg, principal):
         """Update properties of client based on EXCHANGE_ID arg"""
         if self.confirmed:
@@ -320,7 +320,7 @@ class ClientRecord(object):
         str = "handle_%i:%i" % (self.clientid, self._handle_ctr.next())
         self.security[rpc.RPCSEC_GSS]._add_context(self.protection.context, str)
         return str
-        
+
     def get_new_other(self):
         self._lock.acquire()
         # NOTE we are only using 8 bytes of 12
@@ -332,7 +332,7 @@ class ClientRecord(object):
     def __hash__(self):
         """Guarantee this can be used as dict key"""
         return hash(self.clientid)
-    
+
     def renew_lease(self):
         self.lastused = time.time()
 
@@ -446,15 +446,15 @@ class Channel(object):
         """Bind the connection to the channel"""
         if connection not in self.connections:
             self.connections.append(connection)
-                              
-        
+
+
 class Cache(object):
     def __init__(self, data=None):
         self.data = data
         self.valid = threading.Event() # XXX Is anyone waiting on this?
         if data is not None:
             self.valid.set()
-            
+
 class Slot(object):
     def __init__(self, index, default=default_replay_slot):
         self.id = index
@@ -798,7 +798,7 @@ class NFS4Server(rpc.Server):
             raise NFS4Error(NFS4ERR_INVAL, tag="Empty component")
         if '/' in str:
             raise NFS4Error(NFS4ERR_BADCHAR)
-    
+
     def op_compound(self, args, cred):
         env = CompoundState(args, cred)
         env.is_ds = self.is_ds
@@ -912,8 +912,8 @@ class NFS4Server(rpc.Server):
         res = SEQUENCE4resok(session.sessionid, slot.seqid, arg.sa_slotid,
                              arg.sa_highest_slotid, channel.maxrequests, 0)
         return encode_status(NFS4_OK, res)
-        
-               
+
+
     def op_create_session(self, arg, env):
         # This implements draft22
         check_session(env, unique=True)
@@ -1003,7 +1003,7 @@ class NFS4Server(rpc.Server):
         digest = protect.context.hmac(p.get_buffer(), SSV4_SUBKEY_MIC_T2I)
         res = SET_SSV4resok(digest)
         return encode_status(NFS4_OK, res)
-            
+
     def op_exchange_id(self, arg, env):
         # This implements draft21
         check_session(env, unique=True)
@@ -1041,7 +1041,7 @@ class NFS4Server(rpc.Server):
             elif not c.confirmed:
                 if update:
                     # Case 7
-                    return encode_status(NFS4ERR_NOENT, 
+                    return encode_status(NFS4ERR_NOENT,
                                          msg="Client not confirmed")
                 else:
                     # Case 4
@@ -1271,7 +1271,7 @@ class NFS4Server(rpc.Server):
         env.cfh = env.sfh
         env.cid = env.sid
         return encode_status(NFS4_OK)
-    
+
     def op_create(self, arg, env):
         check_session(env)
         check_cfh(env)
@@ -1360,7 +1360,7 @@ class NFS4Server(rpc.Server):
                                  open_claim_type4[claim_type])
         # emulate switch(claim_type)
         try:
-            func = getattr(self, 
+            func = getattr(self,
                            "open_%s" % open_claim_type4[claim_type].lower())
         except AttributeError:
             return encode_status(NFS4ERR_NOTSUPP, msg="Unsupported claim type")
@@ -1388,7 +1388,7 @@ class NFS4Server(rpc.Server):
         self.check_component(arg.claim.file) # XXX Done as part of lookup?
         # BUG - file locking needs to be fixed
         old_change = env.cfh.fattr4_change
-        existing = env.cfh.lookup(arg.claim.file, env.session.client, 
+        existing = env.cfh.lookup(arg.claim.file, env.session.client,
                                   env.principal)
         if arg.openhow.opentype == OPEN4_CREATE:
             # STUB - all sort of new stuff to add here
@@ -1551,7 +1551,7 @@ class NFS4Server(rpc.Server):
             p = nfs4lib.FancyNFS4Packer()
             p.pack_entry4(e)
             return len(p.get_buffer())
-            
+
         offset = 3 # index offset used to avoid reserved cookies
         check_session(env)
         check_cfh(env)
@@ -1841,7 +1841,7 @@ class NFS4Server(rpc.Server):
         with find_state(env, arg.deleg_stateid, allow_0=False) as state:
             state.delegreturn()
         return encode_status(NFS4_OK)
-    
+
     def op_getdevicelist(self, arg, env): # STUB
         check_session(env)
         check_cfh(env)
@@ -1931,7 +1931,7 @@ class NFS4Server(rpc.Server):
         else:
             state = layoutreturn_stateid(False)
         return encode_status(NFS4_OK, state)
-    
+
     def op_illegal(self, arg, env):
         return encode_status(NFS4ERR_OP_ILLEGAL)
 
@@ -1973,7 +1973,7 @@ class NFS4Server(rpc.Server):
     def ctrl_illegal(self, arg):
         #print("ILLEGAL")
         return xdrdef.sctrl_const.CTRLSTAT_ILLEGAL, xdrdef.sctrl_type.resdata_t(arg.ctrlop)
-        
+
     def op_setclientid(self, arg, env):
         return encode_status(NFS4ERR_NOTSUPP)
 
@@ -1996,7 +1996,7 @@ class NFS4Server(rpc.Server):
 
     def fsid2fs(self, fsid):
         return self._fsids[fsid]
-        
+
     def cb_compound_async(self, args, prog, credinfo=None, pipe=None, tag=None):
         if tag is None:
             tag = "Default callback tag"
@@ -2031,7 +2031,7 @@ class NFS4Server(rpc.Server):
             data = p.unpack_CB_COMPOUND4res()
         log_41.info(data)
         return data
-    
+
     def cb_null_listen(self, xid, pipe, timeout=5.0):
         header, data = pipe.listen(xid, timeout)
         log_41.info("Received CB_NULL reply")
diff --git a/nfs4.1/nfs4state.py b/nfs4.1/nfs4state.py
index f2cad04..e57b90a 100644
--- a/nfs4.1/nfs4state.py
+++ b/nfs4.1/nfs4state.py
@@ -60,7 +60,7 @@ def find_state(env, stateid, allow_0=True, allow_bypass=False):
             raise NFS4Error(NFS4ERR_BAD_STATEID, tag="stateid not known")
         if state.file != env.cfh:
             raise NFS4Error(NFS4ERR_BAD_STATEID,
-                            tag="cfh %r does not match stateid %r" % 
+                            tag="cfh %r does not match stateid %r" %
                             (state.file.fh, env.cfh.fh))
     state.lock.acquire()
     # It is possible that while waiting to get the lock, the state has been
@@ -747,7 +747,7 @@ class DelegEntry(StateTableEntry):
             # BUG deal with this
             raise RuntimeError
         # NOTE that we come in w/o state lock...when should we grab it?
-        # ANSWER - we care about self.status, which can be set to 
+        # ANSWER - we care about self.status, which can be set to
         # INVALID anytime by deleg_return
         slot = session.channel_back.choose_slot()
         seq_op = op4.cb_sequence(session.sessionid, slot.get_seqid(),
@@ -760,9 +760,9 @@ class DelegEntry(StateTableEntry):
             return
         # All sorts of STUBBINESS here
         pipe = session.channel_back.connections[0]
-        xid = dispatcher.cb_compound_async([seq_op, recall_op], 
+        xid = dispatcher.cb_compound_async([seq_op, recall_op],
                                            session.cb_prog, pipe=pipe)
-        # Note it is possible that self.invalid is True, but don't 
+        # Note it is possible that self.invalid is True, but don't
         # want to take the lock
         self.status = CB_SENT
         res = dispatcher.cb_listen(xid, pipe)
@@ -823,13 +823,13 @@ class ByteEntry(StateTableEntry):
 #         list = self.locklist
 #         if not list:
 #             list.append(ByteLock(type, start, end))
-#             return 
+#             return
 #         i = 0
 #         while (list and list[i].end < start):
 #             i += 1
 #         list.insert(i, ByteLock(type, start, end))
 #         # Merge adjacent locks
-#         # Really want range(i+1, i-1, -1), but need to account for list edges 
+#         # Really want range(i+1, i-1, -1), but need to account for list edges
 #         for i in range(min(i+1, len(list)-1), max(1,i)-1, -1):
 #             if i > 0 and list[i].start == list[i-1].end + 1 and \
 #                list[i].type == list[i-1].type:
diff --git a/nfs4.1/setup.py b/nfs4.1/setup.py
index 37b99a0..e13170e 100644
--- a/nfs4.1/setup.py
+++ b/nfs4.1/setup.py
@@ -54,11 +54,11 @@ class build_py(_build_py):
 setup(name = "nfs4",
       version = "0.0.0", # import this?
       package_dir = {"nfs4" : ""},
-      packages = ["nfs4", "nfs4.server41tests"], 
+      packages = ["nfs4", "nfs4.server41tests"],
       description = "NFS version 4.1 tools and tests",
       long_description = DESCRIPTION,
       cmdclass = {"build_py": build_py},
-      
+
       # These will be the same
       author = "Fred Isaman",
       author_email = "iisaman@citi.umich.edu",
@@ -66,6 +66,5 @@ setup(name = "nfs4",
       maintainer_email = "iisaman@citi.umich.edu",
       url = "http://www.citi.umich.edu/projects/nfsv4/pynfs/",
       license = "GPL"
-      
       )
 
diff --git a/nfs4.1/testclient.py b/nfs4.1/testclient.py
index dd68bda..87cdb30 100755
--- a/nfs4.1/testclient.py
+++ b/nfs4.1/testclient.py
@@ -2,20 +2,20 @@
 # nfs4stest.py - nfsv4 server tester
 #
 # Requires python 3.2
-# 
+#
 # Written by Fred Isaman <iisaman@citi.umich.edu>
-# Copyright (C) 2004 University of Michigan, Center for 
+# Copyright (C) 2004 University of Michigan, Center for
 #                    Information Technology Integration
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; version 2 of the License. 
-# 
+# the Free Software Foundation; version 2 of the License.
+#
 # This program is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 # GNU General Public License for more details.
-# 
+#
 # You should have received a copy of the GNU General Public License
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
@@ -49,12 +49,12 @@ def scan_options(p):
     .nocleanup = (False)
     .outfile   = (None)
     .debug_fail = (False)
-    
+
     .security = (sys)
 
     .force   = (False)
     .rundeps = (False)
-    
+
     .verbose  = (False)
     .showpass = (True)
     .showwarn = (True)
@@ -70,7 +70,7 @@ def scan_options(p):
     .usefile   = (None)
     .usedir    = (None)
     .usespecial= (None)
-    
+
     """
     p.add_option("--showflags", action="store_true", default=False,
                  help="Print a list of all possible flags and exit")
@@ -90,7 +90,7 @@ def scan_options(p):
 ##     g.add_option("--security", default='sys',
 ##                  help="Choose security flavor such as krb5i [sys]")
 ##     p.add_option_group(g)
-    
+
     g = OptionGroup(p, "Test selection options",
                     "These options affect how flags are interpreted.")
     g.add_option("--force", action="store_true", default=False,
@@ -99,7 +99,7 @@ def scan_options(p):
                  help="Force test dependencies to be run, "
                  "even if not requested on command line")
     p.add_option_group(g)
-    
+
     g = OptionGroup(p, "Test output options",
                     "These options affect how test results are shown")
     g.add_option("-v", "--verbose", action="store_true", default=False,
@@ -207,7 +207,7 @@ def printflags(list):
     for s in list:
         if s not in command_names:
             print(s)
-    
+
 def main():
     p = OptionParser("%prog SERVER:/PATH [options] flags|testcodes\n"
                      "       %prog --help\n"
@@ -275,7 +275,7 @@ def main():
 ##                 (opt.security, str(valid.keys())))
 ##     opt.flavor = valid[opt.security]
 ##     opt.service = {'krb5':1, 'krb5i':2, 'krb5p':3}.get(opt.security, 0)
-               
+
     # Make sure args are valid
     opt.args = []
     for a in args:
diff --git a/nfs4.1/testmod.py b/nfs4.1/testmod.py
index 6285758..e368853 100644
--- a/nfs4.1/testmod.py
+++ b/nfs4.1/testmod.py
@@ -1,9 +1,9 @@
 # testmod.py - run tests from a suite
 #
 # Requires python 3.2
-# 
+#
 # Written by Fred Isaman <iisaman@citi.umich.edu>
-# Copyright (C) 2004 University of Michigan, Center for 
+# Copyright (C) 2004 University of Michigan, Center for
 #                    Information Technology Integration
 #
 from __future__ import print_function
@@ -194,7 +194,7 @@ class Test(object):
             out += ' ' + w
             lout += lw + 1
         return out
-            
+
     def fail(self, msg):
         raise FailureException(msg)
 
@@ -275,14 +275,14 @@ class Environment(object):
     def shutDown(self):
         """Run after each test"""
         pass
-        
+
 def _run_filter(test, options):
     """Returns True if test should be run, False if it should be skipped"""
     return True
 
 def runtests(tests, options, environment, runfilter=_run_filter):
     """tests is an array of test objects, to be run in order
-    
+
     (as much as possible)
     """
     for t in tests:
@@ -307,7 +307,7 @@ def _runtree(t, options, environment, runfilter=_run_filter):
     for dep in t.dependencies:
         if dep.result == DEP_FUNCT:
             if (not options.force) and (not dep(t, environment)):
-                t.result = Result(TEST_OMIT, 
+                t.result = Result(TEST_OMIT,
                                   "Dependency function %s failed" %
                                   dep.__name__)
                 return
@@ -322,7 +322,7 @@ def _runtree(t, options, environment, runfilter=_run_filter):
             return
         elif (not options.force) and \
                  (dep.result in [TEST_OMIT, TEST_FAIL, TEST_NOTSUP]):
-            t.result = Result(TEST_OMIT, 
+            t.result = Result(TEST_OMIT,
                               "Dependency %s had status %s." % \
                               (dep, dep.result))
             return
@@ -421,7 +421,6 @@ def createtests(testdir):
                 t.dependencies.append(funct)
     return tests, flag_dict, used_codes
 
-                 
 def printresults(tests, opts, file=None):
     NOTRUN, OMIT, SKIP, FAIL, WARN, PASS = range(6)
     count = [0] * 6
diff --git a/nfs4.1/testserver.py b/nfs4.1/testserver.py
index 3cecfdc..d3c44c7 100755
--- a/nfs4.1/testserver.py
+++ b/nfs4.1/testserver.py
@@ -2,24 +2,24 @@
 # nfs4stest.py - nfsv4 server tester
 #
 # Requires python 3.2
-# 
+#
 # Written by Fred Isaman <iisaman@citi.umich.edu>
-# Copyright (C) 2004 University of Michigan, Center for 
+# Copyright (C) 2004 University of Michigan, Center for
 #                    Information Technology Integration
 #
 # Based on pynfs
 # Written by Peter Astrand <peter@cendio.se>
 # Copyright (C) 2001 Cendio Systems AB (http://www.cendio.se)
-# 
+#
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; version 2 of the License. 
-# 
+# the Free Software Foundation; version 2 of the License.
+#
 # This program is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 # GNU General Public License for more details.
-# 
+#
 # You should have received a copy of the GNU General Public License
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
@@ -95,7 +95,7 @@ def scan_options(p):
                  help="Force test dependencies to be run, "
                  "even if not requested on command line")
     p.add_option_group(g)
-    
+
     g = OptionGroup(p, "Test output options",
                     "These options affect how test results are shown.")
     g.add_option("-v", "--verbose", action="store_true", default=False,
@@ -215,7 +215,7 @@ def printflags(list):
     for s in list:
         if s not in command_names:
             print(s)
-    
+
 def main():
     p = OptionParser("%prog SERVER:/PATH [options] flags|testcodes\n"
                      "       %prog --help\n"
diff --git a/rpc/rpc.py b/rpc/rpc.py
index 4a454d7..4d1eb09 100644
--- a/rpc/rpc.py
+++ b/rpc/rpc.py
@@ -122,7 +122,7 @@ class FancyRPCPacker(rpc_pack.RPCPacker):
                          py_data.proc,
                          self._filter_opaque_auth(py_data.cred),
                          py_data.verf)
-        
+
 ###################################################
 
 class DeferredData(object):
@@ -144,7 +144,7 @@ class DeferredData(object):
         self.data = None
         self._exception = None
         self.msg = msg # Data that thread calling fill might need
-        
+
     def wait(self, timeout=10):
         """Wait for data to be filled in"""
         self._filled.wait(timeout)
@@ -458,7 +458,7 @@ class ConnectionHandler(object):
 
         # Create internal server for alarm system to connect to
         self.s = self.expose((LOOPBACK, 0), socket.AF_INET, False)
-        
+
         # Set up alarm system, which is how other threads inform the polling
         # thread that data is ready to be sent out
         # NOTE that there are TWO sockets associated with alarm, one
@@ -643,7 +643,7 @@ class ConnectionHandler(object):
 
     def _event_rpc_call(self, msg, msg_data, pipe):
         """Deal with an incoming RPC CALL.
-        
+
         msg is unpacked header, with length fields added.
         msg_data is raw procedure data.
         """
@@ -785,7 +785,7 @@ class ConnectionHandler(object):
 
         # For AUTH_SYS:
         #    check machinename, mode - again how is accept list set on server?
-        
+
         # For GSS:
         #   illegal enum values should return AUTH_BADCRED
         #      this will be noticed by XDR unpack failing, which means
@@ -877,7 +877,7 @@ class ConnectionHandler(object):
             # A list of all sockets we have open, indexed by fileno
             self.sockets[s.fileno()] = s
         return s
-            
+
     def make_call_function(self, pipe, procedure, prog, vers):
         def call(data, credinfo, proc=None, timeout=15.0):
             if proc is None:
@@ -887,7 +887,7 @@ class ConnectionHandler(object):
             # XXX STUB - do header checking
             return header, data
         return call
-    
+
     def listen(self, pipe, xid):
         # STUB - should be overwritten by subclass
         header, data = pipe.listen(xid)
diff --git a/rpc/setup.py b/rpc/setup.py
index 7297099..99dad5a 100644
--- a/rpc/setup.py
+++ b/rpc/setup.py
@@ -46,11 +46,11 @@ class build_py(_build_py):
 setup(name = "rpc",
       version = "0.0.0", # import this?
       package_dir = {"rpc" : ""},
-      packages = ["rpc"], 
+      packages = ["rpc"],
       description = "GSS enabled RPC client and server",
       long_description = DESCRIPTION,
       cmdclass = {"build_py": build_py},
-      
+
       # These will be the same
       author = "Fred Isaman",
       author_email = "iisaman@citi.umich.edu",
@@ -58,6 +58,5 @@ setup(name = "rpc",
       maintainer_email = "iisaman@citi.umich.edu",
       url = "http://www.citi.umich.edu/projects/nfsv4/pynfs/",
       license = "GPL"
-      
       )
 
diff --git a/showresults.py b/showresults.py
index 5abd72a..944db40 100755
--- a/showresults.py
+++ b/showresults.py
@@ -2,9 +2,9 @@
 # showresults.py - redisplay results from nfsv4 server tester output file
 #
 # Requires python 3.2
-# 
+#
 # Written by Fred Isaman <iisaman@citi.umich.edu>
-# Copyright (C) 2004 University of Michigan, Center for 
+# Copyright (C) 2004 University of Michigan, Center for
 #                    Information Technology Integration
 #
 
diff --git a/xdr/setup.py b/xdr/setup.py
index e8af152..3acb8a2 100644
--- a/xdr/setup.py
+++ b/xdr/setup.py
@@ -12,7 +12,7 @@ Add stuff here.
 
 setup(name = "xdrgen",
       version = "0.0.0", # import this?
-      py_modules = ["xdrgen"], 
+      py_modules = ["xdrgen"],
       scripts = ["xdrgen.py"], # FIXME - make small script that calls module
       description = "Generate python code from .x files",
       long_description = DESCRIPTION,
@@ -25,6 +25,5 @@ setup(name = "xdrgen",
       maintainer_email = "iisaman@citi.umich.edu",
       url = "http://www.citi.umich.edu/projects/nfsv4/pynfs/",
       license = "GPL"
-      
       )
 
diff --git a/xdr/xdrgen.py b/xdr/xdrgen.py
index 130f364..6064586 100755
--- a/xdr/xdrgen.py
+++ b/xdr/xdrgen.py
@@ -1,22 +1,22 @@
 #!/usr/bin/env python3
 # rpcgen.py - A Python RPC protocol compiler
-# 
+#
 # Written by Fred Isaman <iisaman@citi.umich.edu>
-# Copyright (C) 2004 University of Michigan, Center for 
+# Copyright (C) 2004 University of Michigan, Center for
 #                    Information Technology Integration
 #
 # Based on version written by Peter Astrand <peter@cendio.se>
 # Copyright (C) 2001 Cendio Systems AB (http://www.cendio.se)
-# 
+#
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; version 2 of the License. 
-# 
+# the Free Software Foundation; version 2 of the License.
+#
 # This program is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 # GNU General Public License for more details.
-# 
+#
 # You should have received a copy of the GNU General Public License
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
@@ -25,7 +25,7 @@
 # Note <something>_list means zero or more of <something>.
 #
 # TODO:
-# Code generation for programs and procedures. 
+# Code generation for programs and procedures.
 #
 
 ##########################################################################
@@ -209,7 +209,7 @@
         practice is to wrap arguments into a structure.
 """
 # Spec above allows the following problems:
-# typedef void; 
+# typedef void;
 # typedef enum <enum_body> ID[5];  <---Not a problem
 # typedef enum <enum_body> ID<>;   <---Not a problem
 
@@ -243,7 +243,7 @@ keywords = ("bool", "case", "const", "default", "double", "quadruple",
 # Required by lex.  Each token also allows a function t_<token>.
 tokens = tuple([t.upper() for t in keywords]) + (
     "ID", "CONST10", "CONST8", "CONST16",
-    # ( ) [ ] { } 
+    # ( ) [ ] { }
     "LPAREN", "RPAREN", "LBRACKET", "RBRACKET", "LBRACE", "RBRACE",
     # ; : < > * = ,
     "SEMI", "COLON", "LT", "GT", "STAR", "EQUALS", "COMMA"
@@ -320,7 +320,7 @@ def p_specification(t):
     '''specification : definition_list'''
 
 def p_definition_list(t):
-    '''definition_list : definition definition_list 
+    '''definition_list : definition definition_list
                        | empty'''
 
 def p_definition(t):
@@ -536,17 +536,17 @@ def p_struct_body(t):
     t[0] = t[2]
 
 def p_declaration_list_1(t):
-    '''declaration_list : declaration SEMI''' 
+    '''declaration_list : declaration SEMI'''
     t[0] = [t[1]]
 
 def p_declaration_list_2(t):
-    '''declaration_list : declaration SEMI declaration_list''' 
+    '''declaration_list : declaration SEMI declaration_list'''
     t[0] = [t[1]] + t[3]
 
 def p_enum_body(t):
     '''enum_body : LBRACE enum_constant_list RBRACE'''
     # Returns a list of const_info
-    t[0] = t[2] 
+    t[0] = t[2]
 
 def p_enum_constant(t):
     '''enum_constant : ID EQUALS value'''
@@ -809,7 +809,7 @@ class Info(object):
             newdata = "%s.%s" % (data, self.id)
         if self.array:
             newdata = data
-            subheader = "%sdef pack_one_%s(self, data):\n" % (prefix, self.id) 
+            subheader = "%sdef pack_one_%s(self, data):\n" % (prefix, self.id)
             varindent = indent
             if self.fixed:
                 array = "%sself.pack_farray(%s, data, pack_one_%s)\n" % \
@@ -835,7 +835,7 @@ class Info(object):
             newdata = "%s.%s" % (data, self.id)
         if self.array:
             subheader = "%sdef unpack_one_%s(self, data):\n" % \
-                        (prefix, self.id) 
+                        (prefix, self.id)
             varindent = indent
             array = "%s%sreturn data\n" % (prefix, varindent)
             if self.fixed:
@@ -1385,7 +1385,7 @@ class %sUnpacker(xdrlib.Unpacker):
 """ % ("%s", indent, indent2, indent2, indent2)
 
 known_basics = {"int" : "pack_int",
-                #"enum" : "pack_enum", 
+                #"enum" : "pack_enum",
                 "uint" : "pack_uint",
                 "unsigned" : "pack_uint",
                 "hyper" : "pack_hyper",
@@ -1393,8 +1393,8 @@ known_basics = {"int" : "pack_int",
                 "float" : "pack_float",
                 "double" : "pack_double",
                 # Note: xdrlib.py does not have a
-                # pack_quadruple currently. 
-                "quadruple" : "pack_double", 
+                # pack_quadruple currently.
+                "quadruple" : "pack_double",
                 "bool" : "pack_bool",
                 "opaque": "pack_opaque",
                 "string": "pack_string"}
-- 
2.31.1


^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2021-05-25 14:32 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-05-24 14:42 [PATCH pynfs 1/3] remove trailing whitespace Petr Vorel
2021-05-24 14:42 ` [PATCH pynfs 2/3] server: Allow to print JSON format Petr Vorel
2021-05-25 14:10   ` J. Bruce Fields
2021-05-25 14:32     ` Petr Vorel
2021-05-24 14:42 ` [PATCH pynfs 3/3] server: Add test code to JSON and XML output Petr Vorel

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.