@@ -162,58 +162,6 @@ static int parse_footer(struct reftable_reader *r, uint8_t *footer,
162
162
return err ;
163
163
}
164
164
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
-
217
165
struct table_iter {
218
166
struct reftable_reader * r ;
219
167
uint8_t typ ;
@@ -637,16 +585,68 @@ void reader_close(struct reftable_reader *r)
637
585
FREE_AND_NULL (r -> name );
638
586
}
639
587
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 )
642
590
{
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 );
650
650
}
651
651
return err ;
652
652
}
0 commit comments