ssize_t read_file(files_struct *fsp,char *data,SMB_OFF_T pos,size_t n) { ssize_t ret=0,readret; /* you can't read from print files */ if (fsp->print_file) { errno = EBADF; return -1; } /* * Serve from write cache if we can. */ if(read_from_write_cache(fsp, data, pos, n)) { fsp->fh->pos = pos + n; fsp->fh->position_information = fsp->fh->pos; return n; } flush_write_cache(fsp, READ_FLUSH); fsp->fh->pos = pos; if (n > 0) { #ifdef DMF_FIX int numretries = 3; tryagain: readret = SMB_VFS_PREAD(fsp,data,n,pos); if (readret == -1) { if ((errno == EAGAIN) && numretries) { DEBUG(3,("read_file EAGAIN retry in 10 seconds\n")); (void)sleep(10); --numretries; goto tryagain; } return -1; } #else /* NO DMF fix. */ readret = SMB_VFS_PREAD(fsp,data,n,pos); if (readret == -1) { return -1; } #endif if (readret > 0) { ret += readret; } } DEBUG(10,("read_file (%s): pos = %.0f, size = %lu, returned %lu\n", fsp_str_dbg(fsp), (double)pos, (unsigned long)n, (long)ret)); fsp->fh->pos += ret; fsp->fh->position_information = fsp->fh->pos; return(ret); }
ssize_t read_file(files_struct *fsp,char *data,off_t pos,size_t n) { ssize_t ret = 0; /* you can't read from print files */ if (fsp->print_file) { errno = EBADF; return -1; } /* * Serve from write cache if we can. */ if(read_from_write_cache(fsp, data, pos, n)) { fsp->fh->pos = pos + n; fsp->fh->position_information = fsp->fh->pos; return n; } flush_write_cache(fsp, READ_FLUSH); fsp->fh->pos = pos; if (n > 0) { ret = SMB_VFS_PREAD(fsp,data,n,pos); if (ret == -1) { return -1; } } DEBUG(10,("read_file (%s): pos = %.0f, size = %lu, returned %lu\n", fsp_str_dbg(fsp), (double)pos, (unsigned long)n, (long)ret)); fsp->fh->pos += ret; fsp->fh->position_information = fsp->fh->pos; return(ret); }