summaryrefslogtreecommitdiff
path: root/source3/smbd/vfs.c
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2001-09-04 19:10:30 +0000
committerJeremy Allison <jra@samba.org>2001-09-04 19:10:30 +0000
commit7e75921e24dc1cca934bc5e4350137292a2f2112 (patch)
treec6dd47eb7ef2ada1eb928ca5d2633bc695568398 /source3/smbd/vfs.c
parentcefa698c725c883c418b915b057e4ef023610a1d (diff)
downloadsamba-7e75921e24dc1cca934bc5e4350137292a2f2112.tar.gz
samba-7e75921e24dc1cca934bc5e4350137292a2f2112.tar.bz2
samba-7e75921e24dc1cca934bc5e4350137292a2f2112.zip
Merge of transfer file code from 2.2, fix for readbraw.
Jeremy. (This used to be commit c05e79453655abb67fd47a2d3dba88b4c5377e35)
Diffstat (limited to 'source3/smbd/vfs.c')
-rw-r--r--source3/smbd/vfs.c96
1 files changed, 16 insertions, 80 deletions
diff --git a/source3/smbd/vfs.c b/source3/smbd/vfs.c
index f5870a3119..fce13bf13d 100644
--- a/source3/smbd/vfs.c
+++ b/source3/smbd/vfs.c
@@ -395,92 +395,28 @@ int vfs_set_filelen(files_struct *fsp, SMB_OFF_T len)
}
/****************************************************************************
- Transfer some data between two file_struct's.
+ Transfer some data (n bytes) between two file_struct's.
****************************************************************************/
-SMB_OFF_T vfs_transfer_file(int in_fd, files_struct *in_fsp,
- int out_fd, files_struct *out_fsp,
- SMB_OFF_T n, char *header, int headlen, int align)
-{
- static char *buf=NULL;
- static int size=0;
- char *buf1,*abuf;
- SMB_OFF_T total = 0;
-
- DEBUG(4,("vfs_transfer_file n=%.0f (head=%d) called\n",(double)n,headlen));
-
- /* Check we have at least somewhere to read from */
-
- SMB_ASSERT((in_fd != -1) || (in_fsp != NULL));
-
- if (size == 0) {
- size = lp_readsize();
- size = MAX(size,1024);
- }
-
- while (!buf && size>0) {
- buf = (char *)Realloc(buf,size+8);
- if (!buf) size /= 2;
- }
-
- if (!buf) {
- DEBUG(0,("Can't allocate transfer buffer!\n"));
- exit(1);
- }
-
- abuf = buf + (align%8);
-
- if (header)
- n += headlen;
-
- while (n > 0)
- {
- int s = (int)MIN(n,(SMB_OFF_T)size);
- int ret,ret2=0;
-
- ret = 0;
-
- if (header && (headlen >= MIN(s,1024))) {
- buf1 = header;
- s = headlen;
- ret = headlen;
- headlen = 0;
- header = NULL;
- } else {
- buf1 = abuf;
- }
+static files_struct *in_fsp;
+static files_struct *out_fsp;
- if (header && headlen > 0)
- {
- ret = MIN(headlen,size);
- memcpy(buf1,header,ret);
- headlen -= ret;
- header += ret;
- if (headlen <= 0) header = NULL;
- }
-
- if (s > ret) {
- ret += in_fsp ?
- in_fsp->conn->vfs_ops.read(in_fsp,in_fsp->fd,buf1+ret,s-ret) : read(in_fd,buf1+ret,s-ret);
- }
+static ssize_t read_fn(int fd, void *buf, size_t len)
+{
+ return in_fsp->conn->vfs_ops.read(in_fsp, fd, buf, len);
+}
- if (ret > 0) {
- if (out_fsp)
- ret2 = out_fsp->conn->vfs_ops.write(out_fsp,out_fsp->fd,buf1,ret);
- else
- ret2= (out_fd != -1) ? write_data(out_fd,buf1,ret) : ret;
- }
+static ssize_t write_fn(int fd, const void *buf, size_t len)
+{
+ return out_fsp->conn->vfs_ops.write(out_fsp, fd, buf, len);
+}
- if (ret2 > 0) total += ret2;
- /* if we can't write then dump excess data */
- if (ret2 != ret)
- vfs_transfer_file(in_fd, in_fsp, -1,NULL,n-(ret+headlen),NULL,0,0);
+SMB_OFF_T vfs_transfer_file(files_struct *in, files_struct *out, SMB_OFF_T n)
+{
+ in_fsp = in;
+ out_fsp = out;
- if (ret <= 0 || ret2 != ret)
- return(total);
- n -= ret;
- }
- return(total);
+ return transfer_file_internal(in_fsp->fd, out_fsp->fd, n, read_fn, write_fn);
}
/*******************************************************************