lib/sendfile.c

ソースコードを見る。

関数

ssize_t sys_sendfile (int tofd, int fromfd, const DATA_BLOB *header, SMB_OFF_T offset, size_t count)
int32 sendfile (int out_fd, int in_fd, int32 *offset, uint32 count)


関数

ssize_t sys_sendfile ( int  tofd,
int  fromfd,
const DATA_BLOB header,
SMB_OFF_T  offset,
size_t  count 
)

sendfile.c37 行で定義されています。

参照先 data_blob_::dataerrnodata_blob_::lengthsendfile()sys_send()total.

参照元 vfswrap_sendfile().

00038 {
00039         size_t total=0;
00040         ssize_t ret;
00041         size_t hdr_len = 0;
00042 
00043         /*
00044          * Send the header first.
00045          * Use MSG_MORE to cork the TCP output until sendfile is called.
00046          */
00047 
00048         if (header) {
00049                 hdr_len = header->length;
00050                 while (total < hdr_len) {
00051                         ret = sys_send(tofd, header->data + total,hdr_len - total, MSG_MORE);
00052                         if (ret == -1)
00053                                 return -1;
00054                         total += ret;
00055                 }
00056         }
00057 
00058         total = count;
00059         while (total) {
00060                 ssize_t nwritten;
00061                 do {
00062 #if defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(HAVE_OFF64_T) && defined(HAVE_SENDFILE64)
00063                         nwritten = sendfile64(tofd, fromfd, &offset, total);
00064 #else
00065                         nwritten = sendfile(tofd, fromfd, &offset, total);
00066 #endif
00067                 } while (nwritten == -1 && errno == EINTR);
00068                 if (nwritten == -1) {
00069                         if (errno == ENOSYS) {
00070                                 /* Ok - we're in a world of pain here. We just sent
00071                                  * the header, but the sendfile failed. We have to
00072                                  * emulate the sendfile at an upper layer before we
00073                                  * disable it's use. So we do something really ugly.
00074                                  * We set the errno to a strange value so we can detect
00075                                  * this at the upper level and take care of it without
00076                                  * layer violation. JRA.
00077                                  */
00078                                 errno = EINTR; /* Normally we can never return this. */
00079                         }
00080                         return -1;
00081                 }
00082                 if (nwritten == 0)
00083                         return -1; /* I think we're at EOF here... */
00084                 total -= nwritten;
00085         }
00086         return count + hdr_len;
00087 }

int32 sendfile ( int  out_fd,
int  in_fd,
int32 *  offset,
uint32  count 
)

参照元 sys_sendfile().


Sambaに対してSat Aug 29 21:23:37 2009に生成されました。  doxygen 1.4.7