513 return IO_ERROR; |
513 return IO_ERROR; |
514 } |
514 } |
515 |
515 |
516 size_t length = sfd->len; |
516 size_t length = sfd->len; |
517 while(length > 0) { |
517 while(length > 0) { |
|
518 // TODO: remove |
|
519 if(length > sfd->len) { |
|
520 log_ereport(LOG_WARN, "net_fallback_sendfile: length > sfd->len: %zu > %zu", length, sfd->len); |
|
521 free(buf); |
|
522 return IO_ERROR; |
|
523 } |
|
524 |
518 if((r = system_fread(sfd->fd, buf, 4096)) <= 0) { |
525 if((r = system_fread(sfd->fd, buf, 4096)) <= 0) { |
519 break; |
526 break; |
520 } |
527 } |
521 char *write_buf = buf; |
528 char *write_buf = buf; |
522 while(r > 0) { |
529 while(r > 0) { |
523 ssize_t w = fd->write(fd, write_buf, r); |
530 ssize_t w = fd->write(fd, write_buf, r); |
|
531 // TODO: remove |
|
532 if(w > r) { |
|
533 log_ereport(LOG_WARN, "net_fallback_sendfile: w > r, %zd > %zd", w, r); |
|
534 w = 0; |
|
535 } |
|
536 |
524 if(w <= 0) { |
537 if(w <= 0) { |
525 break; |
538 free(buf); |
|
539 fd->io_errno = errno; |
|
540 return IO_ERROR; |
526 } |
541 } |
527 r -= w; |
542 r -= w; |
528 length -= w; |
543 length -= w; |
529 write_buf += w; |
544 write_buf += w; |
530 } |
|
531 if(r > 0) { |
|
532 break; |
|
533 } |
545 } |
534 } |
546 } |
535 free(buf); |
547 free(buf); |
536 if(length > 0) { |
548 if(length > 0) { |
537 fd->io_errno = errno; |
549 fd->io_errno = errno; |