? Makefile.SGI Index: include/proto.h =================================================================== RCS file: /data/cvs/samba/source/include/proto.h,v retrieving revision 1.479.2.50 diff -u -r1.479.2.50 proto.h --- proto.h 1999/05/03 17:33:07 1.479.2.50 +++ proto.h 1999/05/04 01:51:34 @@ -2378,7 +2378,7 @@ SMB_OFF_T seek_file(files_struct *fsp,SMB_OFF_T pos); ssize_t read_file(files_struct *fsp,char *data,SMB_OFF_T pos,size_t n); -ssize_t write_file(files_struct *fsp,char *data,size_t n); +ssize_t write_file(files_struct *fsp,char *data,SMB_OFF_T pos, size_t n); void sync_file(connection_struct *conn, files_struct *fsp); /*The following definitions come from smbd/filename.c */ Index: include/smb.h =================================================================== RCS file: /data/cvs/samba/source/include/smb.h,v retrieving revision 1.221.2.12 diff -u -r1.221.2.12 smb.h --- smb.h 1999/04/10 00:33:38 1.221.2.12 +++ smb.h 1999/05/04 01:51:50 @@ -634,6 +634,10 @@ BOOL is_directory; BOOL directory_delete_on_close; BOOL stat_open; +#ifdef HAVE_ASYNC_IO + BOOL doing_async_write; + .... more to follow here ... +#endif char *fsp_name; } files_struct; Index: smbd/fileio.c =================================================================== RCS file: /data/cvs/samba/source/smbd/fileio.c,v retrieving revision 1.9.2.2 diff -u -r1.9.2.2 fileio.c --- fileio.c 1999/04/10 00:33:38 1.9.2.2 +++ fileio.c 1999/05/04 01:51:53 @@ -96,6 +96,17 @@ } #endif +#ifdef HAVE_ASYNC_IO + /* + * If we're doing an aync write we cannot do a seek + read, + * we must use the async calls. + */ + + if(fsp->doing_async_write) + return read_data_async(fsp, data, pos, n); + +#endif /* HAVE_ASYNC_IO */ + if (seek_file(fsp,pos) == -1) { DEBUG(3,("read_file: Failed to seek to %.0f\n",(double)pos)); return(ret); @@ -103,7 +114,8 @@ if (n > 0) { readret = read(fsp->fd_ptr->fd,data,n); - if (readret > 0) ret += readret; + if (readret > 0) + ret += readret; } return(ret); @@ -114,7 +126,7 @@ write to a file ****************************************************************************/ -ssize_t write_file(files_struct *fsp,char *data,size_t n) +ssize_t write_file(files_struct *fsp,char *data,SMB_OFF_T pos, size_t n) { if (!fsp->can_write) { @@ -132,6 +144,21 @@ } } } + +#ifdef HAVE_ASYNC_IO + { + BOOL scheduled_ok = False; + + if(write_data_async(fsp, data, pos, n, &scheduled_ok) == -1) + return -1; + + if(scheduled_ok) + return n; + } +#endif /* HAVE_ASYNC_IO */ + + if ((pos != -1) && (seek_file(fsp,pos) == -1)) + return -1; return(write_data(fsp->fd_ptr->fd,data,n)); } Index: smbd/open.c =================================================================== RCS file: /data/cvs/samba/source/smbd/open.c,v retrieving revision 1.26.2.12 diff -u -r1.26.2.12 open.c --- open.c 1999/04/10 00:33:39 1.26.2.12 +++ open.c 1999/05/04 01:51:55 @@ -568,7 +568,7 @@ */ if (fsp->print_file && lp_postscript(SNUM(conn)) && fsp->can_write) { DEBUG(3,("Writing postscript line\n")); - write_file(fsp,"%!\n",3); + write_file(fsp,"%!\n",-1,3); } DEBUG(2,("%s opened file %s read=%s write=%s (numopen=%d)\n", Index: smbd/reply.c =================================================================== RCS file: /data/cvs/samba/source/smbd/reply.c,v retrieving revision 1.162.2.39 diff -u -r1.162.2.39 reply.c --- reply.c 1999/04/27 01:23:01 1.162.2.39 +++ reply.c 1999/05/04 01:52:19 @@ -2306,13 +2306,8 @@ if (is_locked(fsp,conn,tcount,startpos, F_WRLCK)) return(ERROR(ERRDOS,ERRlock)); - if (seek_file(fsp,startpos) == -1) { - DEBUG(0,("couldn't seek to %.0f in writebraw\n",(double)startpos)); - return(UNIXERROR(ERRDOS,ERRnoaccess)); - } - if (numtowrite>0) - nwritten = write_file(fsp,data,numtowrite); + nwritten = write_file(fsp,data,startpos,numtowrite); DEBUG(3,("writebraw1 fnum=%d start=%.0f num=%d wrote=%d sync=%d\n", fsp->fnum, (double)startpos, numtowrite, nwritten, write_through)); @@ -2397,16 +2392,13 @@ if (is_locked(fsp,conn,numtowrite,startpos, F_WRLCK)) return(ERROR(ERRDOS,ERRlock)); - if(seek_file(fsp,startpos) == -1) - return(UNIXERROR(ERRDOS,ERRnoaccess)); - /* The special X/Open SMB protocol handling of zero length writes is *NOT* done for this call */ if(numtowrite == 0) nwritten = 0; else - nwritten = write_file(fsp,data,numtowrite); + nwritten = write_file(fsp,data,startpos,numtowrite); if (lp_syncalways(SNUM(conn))) sync_file(conn,fsp); @@ -2450,16 +2442,13 @@ if (is_locked(fsp,conn,numtowrite,startpos, F_WRLCK)) return(ERROR(ERRDOS,ERRlock)); - if(seek_file(fsp,startpos) == -1) - return(UNIXERROR(ERRDOS,ERRnoaccess)); - /* X/Open SMB protocol says that if smb_vwv1 is zero then the file size should be extended or truncated to the size given in smb_vwv[2-3] */ if(numtowrite == 0) nwritten = set_filelen(fsp->fd_ptr->fd, (SMB_OFF_T)startpos); else - nwritten = write_file(fsp,data,numtowrite); + nwritten = write_file(fsp,data,startpos,numtowrite); if (lp_syncalways(SNUM(conn))) sync_file(conn,fsp); @@ -2531,9 +2520,6 @@ if (is_locked(fsp,conn,numtowrite,startpos, F_WRLCK)) return(ERROR(ERRDOS,ERRlock)); - if(seek_file(fsp,startpos) == -1) - return(UNIXERROR(ERRDOS,ERRnoaccess)); - /* X/Open SMB protocol says that, unlike SMBwrite if the length is zero then NO truncation is done, just a write of zero. To truncate a file, @@ -2541,7 +2527,7 @@ if(numtowrite == 0) nwritten = 0; else - nwritten = write_file(fsp,data,numtowrite); + nwritten = write_file(fsp,data,startpos,numtowrite); if(((nwritten == 0) && (numtowrite != 0))||(nwritten < 0)) return(UNIXERROR(ERRDOS,ERRnoaccess)); @@ -2786,10 +2772,7 @@ if (is_locked(fsp,conn,numtowrite,startpos, F_WRLCK)) return(ERROR(ERRDOS,ERRlock)); - if(seek_file(fsp,startpos) == -1) - return(UNIXERROR(ERRDOS,ERRnoaccess)); - - nwritten = write_file(fsp,data,numtowrite); + nwritten = write_file(fsp,data,startpos,numtowrite); set_filetime(conn, fsp->fsp_name,mtime); @@ -3123,7 +3106,7 @@ numtowrite = SVAL(smb_buf(inbuf),1); data = smb_buf(inbuf) + 3; - if (write_file(fsp,data,numtowrite) != numtowrite) + if (write_file(fsp,data,-1,numtowrite) != numtowrite) return(UNIXERROR(ERRDOS,ERRnoaccess)); DEBUG( 3, ( "printwrite fnum=%d num=%d\n", fsp->fnum, numtowrite ) ); @@ -4349,11 +4332,8 @@ if (is_locked(fsp,conn,tcount,startpos,F_WRLCK)) return(ERROR(ERRDOS,ERRlock)); - if(seek_file(fsp,startpos) == -1) - return(UNIXERROR(ERRDOS,ERRnoaccess)); + nwritten = write_file(fsp,data,startpos,numtowrite); - nwritten = write_file(fsp,data,numtowrite); - if(lp_syncalways(SNUM(conn)) || write_through) sync_file(conn,fsp); @@ -4452,20 +4432,8 @@ /* Check for an earlier error */ if(wbms->wr_discard) return -1; /* Just discard the packet */ - - if(seek_file(fsp,startpos) == -1) - { - if(write_through) - { - /* We are returning an error - we can delete the aux struct */ - if (wbms) free((char *)wbms); - fsp->wbmpx_ptr = NULL; - return(UNIXERROR(ERRDOS,ERRnoaccess)); - } - return(CACHE_ERROR(wbms,ERRDOS,ERRnoaccess)); - } - nwritten = write_file(fsp,data,numtowrite); + nwritten = write_file(fsp,data,startpos,numtowrite); if(lp_syncalways(SNUM(conn)) || write_through) sync_file(conn,fsp);