| vfs_read#(FD, USER, DIRS, FILES, ASYNCED; BUF, N, ERR, OF) {if N ≤ # BUF then {ERR := ESUCCESS; if ¬ FD ∈ OF then ERR := EBADFD else if OF[FD].mode ≠ MODE_R ∧ OF[FD].mode ≠ MODE_RW then ERR := EBADFD else choose INODE with true in {afs_iget#(OF[FD].ino, DIRS, FILES, ASYNCED; INODE, ERR); if ERR = ESUCCESS then if INODE.directory then ERR := EISDIR else let START = OF[FD].pos, END = OF[FD].pos + N, TOTAL = 0 in if START ≤ INODE.size then {let DONE = false in vfs_read_loop#(START, END, INODE, DONE, DIRS, FILES, ASYNCED; BUF, TOTAL, ERR); if TOTAL ≠ 0 then ERR := ESUCCESS; OF[FD].pos := OF[FD].pos + TOTAL; N := TOTAL} else N := 0}} else abort } |