static bool do_sendfile(Request* request) { Py_ssize_t bytes_sent = portable_sendfile( request->client_fd, request->current_chunk_p /* current_chunk_p stores the file fd */ ); if(bytes_sent == -1) return handle_nonzero_errno(request); return bytes_sent != 0; }
// Return value: // 0: send packet completely // 1: send packet incompletely // -1: send packet error client need closed static int sendPacket(struct client *c, struct sendPacket *packet) { struct slice *data; ssize_t nwritten = 0; struct fileWrapper *file_wrapper; switch (packet->type) { case SLICE: data = &packet->target.slice; while (data->len != 0) { nwritten = writeBulkTo(c->clifd, data); if (nwritten <= 0) break; data->len -= nwritten; data->data += nwritten; } if (nwritten == -1) { return -1; } if (nwritten == 0) { return 1; } break; case FILE_DESCRIPTION: file_wrapper = &packet->target.file; while (file_wrapper->len > 0) { nwritten = portable_sendfile(c->clifd, file_wrapper->fd, file_wrapper->off, file_wrapper->len); if (nwritten == -1) return -1; else if (nwritten == 0) { return 1; } file_wrapper->off += nwritten; file_wrapper->len -= nwritten; } } return 0; }