From: David Mulder Date: Thu, 17 Mar 2022 17:15:23 +0000 (-0600) Subject: smbd: Move fake_sendfile to smb2_reply.c X-Git-Tag: tevent-0.12.0~104 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=01ee69a958bf671c324d0ccb59205cfc83cb0b4d;p=thirdparty%2Fsamba.git smbd: Move fake_sendfile to smb2_reply.c Signed-off-by: David Mulder Reviewed-by: Jeremy Allison --- diff --git a/source3/smbd/proto.h b/source3/smbd/proto.h index a9500064292..caa5df3485a 100644 --- a/source3/smbd/proto.h +++ b/source3/smbd/proto.h @@ -928,8 +928,6 @@ void reply_ulogoffX(struct smb_request *req); void reply_mknew(struct smb_request *req); void reply_ctemp(struct smb_request *req); void reply_unlink(struct smb_request *req); -ssize_t fake_sendfile(struct smbXsrv_connection *xconn, files_struct *fsp, - off_t startpos, size_t nread); ssize_t sendfile_short_send(struct smbXsrv_connection *xconn, files_struct *fsp, ssize_t nread, @@ -1036,6 +1034,8 @@ NTSTATUS unlink_internals(connection_struct *conn, struct smb_request *req, uint32_t dirtype, struct smb_filename *smb_fname); +ssize_t fake_sendfile(struct smbXsrv_connection *xconn, files_struct *fsp, + off_t startpos, size_t nread); /* The following definitions come from smbd/seal.c */ diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c index 757133320d0..1785e95d4dc 100644 --- a/source3/smbd/reply.c +++ b/source3/smbd/reply.c @@ -2446,66 +2446,6 @@ static void fail_readraw(void) exit_server_cleanly(errstr); } -/**************************************************************************** - Fake (read/write) sendfile. Returns -1 on read or write fail. -****************************************************************************/ - -ssize_t fake_sendfile(struct smbXsrv_connection *xconn, files_struct *fsp, - off_t startpos, size_t nread) -{ - size_t bufsize; - size_t tosend = nread; - char *buf; - - if (nread == 0) { - return 0; - } - - bufsize = MIN(nread, 65536); - - if (!(buf = SMB_MALLOC_ARRAY(char, bufsize))) { - return -1; - } - - while (tosend > 0) { - ssize_t ret; - size_t cur_read; - - cur_read = MIN(tosend, bufsize); - ret = read_file(fsp,buf,startpos,cur_read); - if (ret == -1) { - SAFE_FREE(buf); - return -1; - } - - /* If we had a short read, fill with zeros. */ - if (ret < cur_read) { - memset(buf + ret, '\0', cur_read - ret); - } - - ret = write_data(xconn->transport.sock, buf, cur_read); - if (ret != cur_read) { - int saved_errno = errno; - /* - * Try and give an error message saying what - * client failed. - */ - DEBUG(0, ("write_data failed for client %s. " - "Error %s\n", - smbXsrv_connection_dbg(xconn), - strerror(saved_errno))); - SAFE_FREE(buf); - errno = saved_errno; - return -1; - } - tosend -= cur_read; - startpos += cur_read; - } - - SAFE_FREE(buf); - return (ssize_t)nread; -} - /**************************************************************************** Deal with the case of sendfile reading less bytes from the file than requested. Fill with zeros (all we can do). Returns 0 on success diff --git a/source3/smbd/smb2_reply.c b/source3/smbd/smb2_reply.c index 138bb8d3cb2..a74524d43ce 100644 --- a/source3/smbd/smb2_reply.c +++ b/source3/smbd/smb2_reply.c @@ -890,3 +890,63 @@ NTSTATUS unlink_internals(connection_struct *conn, return close_file_free(req, &fsp, NORMAL_CLOSE); } + +/**************************************************************************** + Fake (read/write) sendfile. Returns -1 on read or write fail. +****************************************************************************/ + +ssize_t fake_sendfile(struct smbXsrv_connection *xconn, files_struct *fsp, + off_t startpos, size_t nread) +{ + size_t bufsize; + size_t tosend = nread; + char *buf; + + if (nread == 0) { + return 0; + } + + bufsize = MIN(nread, 65536); + + if (!(buf = SMB_MALLOC_ARRAY(char, bufsize))) { + return -1; + } + + while (tosend > 0) { + ssize_t ret; + size_t cur_read; + + cur_read = MIN(tosend, bufsize); + ret = read_file(fsp,buf,startpos,cur_read); + if (ret == -1) { + SAFE_FREE(buf); + return -1; + } + + /* If we had a short read, fill with zeros. */ + if (ret < cur_read) { + memset(buf + ret, '\0', cur_read - ret); + } + + ret = write_data(xconn->transport.sock, buf, cur_read); + if (ret != cur_read) { + int saved_errno = errno; + /* + * Try and give an error message saying what + * client failed. + */ + DEBUG(0, ("write_data failed for client %s. " + "Error %s\n", + smbXsrv_connection_dbg(xconn), + strerror(saved_errno))); + SAFE_FREE(buf); + errno = saved_errno; + return -1; + } + tosend -= cur_read; + startpos += cur_read; + } + + SAFE_FREE(buf); + return (ssize_t)nread; +}