@@ -162,58 +162,6 @@ static int parse_footer(struct reftable_reader *r, uint8_t *footer,
162162 return err ;
163163}
164164
165- int init_reader (struct reftable_reader * r , struct reftable_block_source * source ,
166- const char * name )
167- {
168- struct reftable_block footer = { NULL };
169- struct reftable_block header = { NULL };
170- int err = 0 ;
171- uint64_t file_size = block_source_size (source );
172-
173- /* Need +1 to read type of first block. */
174- uint32_t read_size = header_size (2 ) + 1 ; /* read v2 because it's larger. */
175- memset (r , 0 , sizeof (struct reftable_reader ));
176-
177- if (read_size > file_size ) {
178- err = REFTABLE_FORMAT_ERROR ;
179- goto done ;
180- }
181-
182- err = block_source_read_block (source , & header , 0 , read_size );
183- if (err != read_size ) {
184- err = REFTABLE_IO_ERROR ;
185- goto done ;
186- }
187-
188- if (memcmp (header .data , "REFT" , 4 )) {
189- err = REFTABLE_FORMAT_ERROR ;
190- goto done ;
191- }
192- r -> version = header .data [4 ];
193- if (r -> version != 1 && r -> version != 2 ) {
194- err = REFTABLE_FORMAT_ERROR ;
195- goto done ;
196- }
197-
198- r -> size = file_size - footer_size (r -> version );
199- r -> source = * source ;
200- r -> name = xstrdup (name );
201- r -> hash_id = 0 ;
202-
203- err = block_source_read_block (source , & footer , r -> size ,
204- footer_size (r -> version ));
205- if (err != footer_size (r -> version )) {
206- err = REFTABLE_IO_ERROR ;
207- goto done ;
208- }
209-
210- err = parse_footer (r , footer .data , header .data );
211- done :
212- reftable_block_done (& footer );
213- reftable_block_done (& header );
214- return err ;
215- }
216-
217165struct table_iter {
218166 struct reftable_reader * r ;
219167 uint8_t typ ;
@@ -637,16 +585,68 @@ void reader_close(struct reftable_reader *r)
637585 FREE_AND_NULL (r -> name );
638586}
639587
640- int reftable_reader_new (struct reftable_reader * * p ,
641- struct reftable_block_source * src , char const * name )
588+ int reftable_reader_new (struct reftable_reader * * out ,
589+ struct reftable_block_source * source , char const * name )
642590{
643- struct reftable_reader * rd = reftable_calloc (1 , sizeof (* rd ));
644- int err = init_reader (rd , src , name );
645- if (err == 0 ) {
646- * p = rd ;
647- } else {
648- block_source_close (src );
649- reftable_free (rd );
591+ struct reftable_block footer = { 0 };
592+ struct reftable_block header = { 0 };
593+ struct reftable_reader * r ;
594+ uint64_t file_size = block_source_size (source );
595+ uint32_t read_size ;
596+ int err ;
597+
598+ REFTABLE_CALLOC_ARRAY (r , 1 );
599+
600+ /*
601+ * We need one extra byte to read the type of first block. We also
602+ * pretend to always be reading v2 of the format because it is larger.
603+ */
604+ read_size = header_size (2 ) + 1 ;
605+ if (read_size > file_size ) {
606+ err = REFTABLE_FORMAT_ERROR ;
607+ goto done ;
608+ }
609+
610+ err = block_source_read_block (source , & header , 0 , read_size );
611+ if (err != read_size ) {
612+ err = REFTABLE_IO_ERROR ;
613+ goto done ;
614+ }
615+
616+ if (memcmp (header .data , "REFT" , 4 )) {
617+ err = REFTABLE_FORMAT_ERROR ;
618+ goto done ;
619+ }
620+ r -> version = header .data [4 ];
621+ if (r -> version != 1 && r -> version != 2 ) {
622+ err = REFTABLE_FORMAT_ERROR ;
623+ goto done ;
624+ }
625+
626+ r -> size = file_size - footer_size (r -> version );
627+ r -> source = * source ;
628+ r -> name = xstrdup (name );
629+ r -> hash_id = 0 ;
630+
631+ err = block_source_read_block (source , & footer , r -> size ,
632+ footer_size (r -> version ));
633+ if (err != footer_size (r -> version )) {
634+ err = REFTABLE_IO_ERROR ;
635+ goto done ;
636+ }
637+
638+ err = parse_footer (r , footer .data , header .data );
639+ if (err )
640+ goto done ;
641+
642+ * out = r ;
643+
644+ done :
645+ reftable_block_done (& footer );
646+ reftable_block_done (& header );
647+ if (err ) {
648+ reftable_free (r );
649+ block_source_close (source );
650650 }
651651 return err ;
652652}
0 commit comments