関数 | |
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.c の 37 行で定義されています。
参照先 data_blob_::data・errno・data_blob_::length・sendfile()・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().