(* écriture sur un descripteur*) let write desc buffer from len = if desc.inode.stats.st_size > max_file_size then raise (File_system_error "Inconsistant file system"); if desc.flag != O_WRONLY && desc.flag != O_RDWR then raise (File_system_exception "Cannot write on this descriptor"); (* fait en sorte que le bloc n du fichier soit accessible *) (* et ne contienne que des 0 *) let read_block n disk_buffer = if n >= D.block_size - blocktbl_offset then raise (File_system_exception "File too large"); if desc.inode.blocktbl.(n) == 0 then begin desc.inode.blocktbl.(n) <- alloc_block (); Array.fill disk_buffer 0 (D.block_size) 0; D.write desc.inode.blocktbl.(n) disk_buffer 0 end else D.read desc.inode.blocktbl.(n) disk_buffer 0 and update_inode_size () = let new_offset = desc_offset desc in if new_offset > desc.inode.stats.st_size then desc.inode.stats.st_size <- new_offset; write_inode desc.inode in let do_write () = let disk_buffer = Array.create D.block_size 0 in read_block desc.block disk_buffer; let rec write i len = if len != 0 then begin disk_buffer.(desc.pos) <- Char.code buffer.[i]; desc.pos <- desc.pos + 1; if D.block_size == desc.pos then begin D.write desc.inode.blocktbl.(desc.block) disk_buffer 0; desc.block <- desc.block + 1; read_block desc.block disk_buffer; desc.pos <- 0; write (i+1) (len-1) end else write (i+1) (len-1) end in write from len; D.write desc.inode.blocktbl.(desc.block) disk_buffer 0; in if len > 0 then try_finally do_write () update_inode_size ();; |