modify read() to support arbitrary f_pos