| 622 | } |
| 623 | |
| 624 | enum packet_read_status packet_reader_read(struct packet_reader *reader) |
| 625 | { |
| 626 | if (reader->line_peeked) { |
| 627 | reader->line_peeked = 0; |
| 628 | return reader->status; |
| 629 | } |
| 630 | |
| 631 | if (reader->use_sideband) |
| 632 | reader->options |= PACKET_READ_USE_SIDEBAND; |
| 633 | |
| 634 | /* |
| 635 | * Consume all progress packets until a primary payload packet is |
| 636 | * received |
| 637 | */ |
| 638 | while (1) { |
| 639 | enum sideband_type sideband_type; |
| 640 | reader->status = packet_read_with_status(reader->fd, |
| 641 | &reader->src_buffer, |
| 642 | &reader->src_len, |
| 643 | reader->buffer, |
| 644 | reader->buffer_size, |
| 645 | &reader->pktlen, |
| 646 | reader->options); |
| 647 | if (!reader->use_sideband) |
| 648 | break; |
| 649 | if (demultiplex_sideband(reader->me, reader->status, |
| 650 | reader->buffer, reader->pktlen, 1, |
| 651 | &reader->scratch, &sideband_type)) |
| 652 | break; |
| 653 | } |
| 654 | |
| 655 | if (reader->status == PACKET_READ_NORMAL) |
| 656 | /* Skip the sideband designator if sideband is used */ |
| 657 | reader->line = reader->use_sideband ? |
| 658 | reader->buffer + 1 : reader->buffer; |
| 659 | else |
| 660 | reader->line = NULL; |
| 661 | |
| 662 | return reader->status; |
| 663 | } |
| 664 | |
| 665 | enum packet_read_status packet_reader_peek(struct packet_reader *reader) |
| 666 | { |