(* lecture sur un descripteur *) let read 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_RDONLY && desc.flag != O_RDWR then raise (File_system_exception "Cannot read on this descriptor"); if desc_offset desc >= desc.inode.stats.st_size then 0 else let disk_buffer = Array.create D.block_size 0 in D.read desc.inode.blocktbl.(desc.block) disk_buffer 0; let rec read i len j = if len == 0 || desc_offset desc == desc.inode.stats.st_size then j else begin if desc.pos == D.block_size then begin desc.block <- desc.block + 1; if desc.inode.blocktbl.(desc.block) != 0 then D.read desc.inode.blocktbl.(desc.block) disk_buffer 0; desc.pos <- 0 end; if desc.inode.blocktbl.(desc.block) == 0 then buffer.[i] <- Char.chr 0 else buffer.[i] <- Char.chr disk_buffer.(desc.pos); desc.pos <- desc.pos + 1; read (i+1) (len-1) (j+1) end in if len > 0 then read from len 0 else 0;; |