Changeset 5571

Show
Ignore:
Timestamp:
07/18/12 14:39:04 (7 years ago)
Author:
cmatthew
Message:

Added truncate systemcall, test for it, and fuse support.

Location:
seattle/branches/nacl_repy
Files:
1 added
2 modified

Legend:

Unmodified
Added
Removed
  • seattle/branches/nacl_repy/fuse/lind_fuse.py

    r5569 r5571  
    452452 
    453453        def ftruncate(self, len): 
    454             return -errno["ENOSYS"] 
     454            try: 
     455                trunc = lind.ftruncate_syscall(self.fd, len) 
     456            except lind.SyscallError, e: 
     457                return -errno[e[1]] 
     458            return trunc 
    455459 
    456460        def lock(self, cmd, owner, **kw): 
  • seattle/branches/nacl_repy/seattlelib/lind_fs_calls.py

    r5563 r5571  
    17091709    persist_metadata(METADATAFILENAME) 
    17101710    filesystemmetadatalock.release() 
     1711 
     1712 
     1713#### FTRUNCATE #### 
     1714 
     1715 
     1716def ftruncate_syscall(fd, new_len): 
     1717  """ 
     1718    http://linux.die.net/man/2/ftruncate 
     1719  """ 
     1720   
     1721 
     1722  # check the fd 
     1723  if fd not in filedescriptortable and fd >= STARTINGFD: 
     1724    raise SyscallError("dup_syscall","EBADF","Invalid old file descriptor.") 
     1725 
     1726  # Acquire the fd lock... 
     1727  desc = filedescriptortable[fd] 
     1728  desc['lock'].acquire(True) 
     1729 
     1730  try:  
     1731 
     1732        # we will need the file size in a moment, but also need to check the type 
     1733    try: 
     1734      inode = desc['inode'] 
     1735    except KeyError: 
     1736      raise SyscallError("lseek_syscall","ESPIPE","This is a socket, not a file.") 
     1737     
     1738     
     1739    filesize = filesystemmetadata['inodetable'][inode]['size'] 
     1740 
     1741    if filesize < new_len: 
     1742      # we must pad with zeros 
     1743      blankbytecount = new_len - filesize  
     1744      fileobjecttable[inode].writeat('\0'*blankbytecount,filesize) 
     1745       
     1746    else: 
     1747      # we must cut 
     1748      to_save = fileobjecttable[inode].readat(new_len,0) 
     1749      fileobjecttable[inode].close() 
     1750      # remove the old file 
     1751      removefile(FILEDATAPREFIX+str(inode)) 
     1752      # make a new blank one 
     1753      fileobjecttable[inode] = openfile(FILEDATAPREFIX+str(inode),True) 
     1754 
     1755      fileobjecttable[inode].writeat(to_save, 0) 
     1756 
     1757       
     1758    filesystemmetadata['inodetable'][inode]['size'] = new_len 
     1759         
     1760  finally: 
     1761    desc['lock'].release()  
     1762 
     1763  return 0