@@ -609,3 +609,113 @@ diagnostic_pop()
609
609
(void )rmdir (dir2 );
610
610
#endif
611
611
}
612
+
613
+
614
+ struct file_list {
615
+ size_t index ;
616
+ size_t count ;
617
+ char * * paths ;
618
+ };
619
+
620
+ static int32_t track_include_cb (
621
+ zone_parser_t * parser ,
622
+ const char * name ,
623
+ const char * path ,
624
+ void * user_data )
625
+ {
626
+ struct file_list * list = (struct file_list * )user_data ;
627
+
628
+ (void )parser ;
629
+ (void )path ;
630
+
631
+ fprintf (stderr , "INCLUDED: %s (%s)\n" , name , path );
632
+
633
+ if (list -> index >= list -> count )
634
+ return ZONE_SYNTAX_ERROR ;
635
+ if (strcmp (name , list -> paths [list -> index ++ ]) != 0 )
636
+ return ZONE_SYNTAX_ERROR ;
637
+ return 0 ;
638
+ }
639
+
640
+ static int32_t track_accept_cb (
641
+ zone_parser_t * parser ,
642
+ const zone_name_t * owner ,
643
+ uint16_t type ,
644
+ uint16_t class ,
645
+ uint32_t ttl ,
646
+ uint16_t rdlength ,
647
+ const uint8_t * rdata ,
648
+ void * user_data )
649
+ {
650
+ (void )parser ;
651
+ (void )owner ;
652
+ (void )type ;
653
+ (void )class ;
654
+ (void )ttl ;
655
+ (void )rdlength ;
656
+ (void )rdata ;
657
+ (void )user_data ;
658
+ return 0 ;
659
+ }
660
+
661
+ /*!cmocka */
662
+ void track_includes (void * * state )
663
+ {
664
+ char * paths [2 ] = { NULL , NULL };
665
+ FILE * handles [2 ] = { NULL , NULL };
666
+ struct file_list list = { 0 , 2 , paths };
667
+ (void )state ;
668
+
669
+ static const char fmt [] =
670
+ "$INCLUDE \"%s\"\n"
671
+ "example A 192.0.2.1\n" ;
672
+
673
+ diagnostic_push ()
674
+ msvc_diagnostic_ignored (4996 )
675
+ paths [0 ] = get_tempnam (NULL , "zone" );
676
+ assert_non_null (paths [0 ]);
677
+ handles [0 ] = fopen (paths [0 ], "wb" );
678
+ assert_non_null (handles [0 ]);
679
+ paths [1 ] = get_tempnam (NULL , "zone" );
680
+ assert_non_null (paths [1 ]);
681
+ handles [1 ] = fopen (paths [1 ], "wb" );
682
+ assert_non_null (handles [1 ]);
683
+ diagnostic_pop ()
684
+
685
+ fprintf (handles [0 ], fmt , paths [1 ]);
686
+ (void )fflush (handles [0 ]);
687
+ (void )fclose (handles [0 ]);
688
+ fputs ("example A 192.0.2.1\n" , handles [1 ]);
689
+ (void )fflush (handles [1 ]);
690
+ (void )fclose (handles [1 ]);
691
+
692
+ char buf [128 ];
693
+ int len = snprintf (buf , sizeof (buf ), fmt , paths [0 ]);
694
+ assert_true (len > 0 );
695
+
696
+ char * str = malloc ((size_t )len + ZONE_BLOCK_SIZE + 1 );
697
+ assert_non_null (str );
698
+ (void )snprintf (str , (size_t )len + 1 , fmt , paths [0 ]);
699
+
700
+ zone_parser_t parser ;
701
+ zone_options_t options ;
702
+ zone_name_buffer_t name ;
703
+ zone_rdata_buffer_t rdata ;
704
+ zone_buffers_t buffers = { 1 , & name , & rdata };
705
+
706
+ memset (& options , 0 , sizeof (options ));
707
+ options .include .callback = & track_include_cb ;
708
+ options .accept .callback = & track_accept_cb ;
709
+ options .origin .octets = origin ;
710
+ options .origin .length = sizeof (origin );
711
+ options .default_ttl = 3600 ;
712
+ options .default_class = 1 ;
713
+
714
+ int32_t code = zone_parse_string (& parser , & options , & buffers , str , (size_t )len , & list );
715
+ assert_int_equal (code , ZONE_SUCCESS );
716
+ assert_int_equal (list .index , 2 );
717
+
718
+ free (str );
719
+ free (paths [0 ]);
720
+ free (paths [1 ]);
721
+ }
0 commit comments