Exemple #1
0
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;
}
Exemple #2
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;
}