(* écriture *) let write desc buffer from len = if desc.closed then system_error EINVAL "write" "Closed descriptor"; if len <= 0 then system_error EINVAL "write" "Invalid length"; if desc.pos + len >= max_file_size then system_error EINVAL "write" "Size to long"; let inode = desc.inode in if inode.stats.st_size > max_file_size then system_error EIO "write" "Inconsistent file system"; let rec write start len ret = if len > 0 then begin let block = desc.pos / block_size in let pos' = desc.pos mod block_size in let len' = min len (block_size - pos') in let disk_block = if inode.blocktbl.(block) = 0 then begin inode.blocktbl.(block) <- alloc_block (); bzeros inode.blocktbl.(block) end else bread inode.blocktbl.(block) in write_string buffer start disk_block pos' len'; brelse disk_block; desc.pos <- desc.pos + len'; write (start + len') (len - len') (ret + len') end else ret in let size = write from len 0 in if inode.stats.st_size < desc.pos then inode.stats.st_size <- desc.pos; size;; |