@@ -796,6 +796,85 @@ rrtype_from_string(const char *name)
796
796
long rrtype ;
797
797
rrtype_descriptor_type * entry ;
798
798
799
+ /* Because this routine is called during zone parse for every record,
800
+ * we optimise for frequently occuring records.
801
+ * Also, we optimise for 'IN' and numbers are not rr types, because
802
+ * during parse this routine is called for every rr class and TTL
803
+ * to determine that it is not an RR type */
804
+ switch (name [0 ]) {
805
+ case 'r' :
806
+ case 'R' :
807
+ if (strcasecmp (name + 1 , "RSIG" ) == 0 ) return TYPE_RRSIG ;
808
+ break ;
809
+ case 'n' :
810
+ case 'N' :
811
+ switch (name [1 ]) {
812
+ case 's' :
813
+ case 'S' :
814
+ switch (name [2 ]) {
815
+ case 0 : return TYPE_NS ;
816
+ case 'e' :
817
+ case 'E' :
818
+ if (strcasecmp (name + 2 , "EC" ) == 0 ) return TYPE_NSEC ;
819
+ if (strcasecmp (name + 2 , "EC3" ) == 0 ) return TYPE_NSEC3 ;
820
+ if (strcasecmp (name + 2 , "EC3PARAM" ) == 0 ) return TYPE_NSEC3PARAM ;
821
+ break ;
822
+ }
823
+ break ;
824
+ }
825
+ break ;
826
+ case 'd' :
827
+ case 'D' :
828
+ switch (name [1 ]) {
829
+ case 's' :
830
+ case 'S' :
831
+ if (name [2 ]== 0 ) return TYPE_DS ;
832
+ break ;
833
+ case 'n' :
834
+ case 'N' :
835
+ if (strcasecmp (name + 2 , "SKEY" ) == 0 ) return TYPE_DNSKEY ;
836
+ break ;
837
+ }
838
+ break ;
839
+ case 'a' :
840
+ case 'A' :
841
+ switch (name [1 ]) {
842
+ case 0 : return TYPE_A ;
843
+ case 'a' :
844
+ case 'A' :
845
+ if (strcasecmp (name + 2 , "AA" ) == 0 ) return TYPE_AAAA ;
846
+ break ;
847
+ }
848
+ break ;
849
+ case 's' :
850
+ case 'S' :
851
+ if (strcasecmp (name + 1 , "OA" ) == 0 ) return TYPE_SOA ;
852
+ break ;
853
+ case 't' :
854
+ case 'T' :
855
+ if (strcasecmp (name + 1 , "XT" ) == 0 ) return TYPE_TXT ;
856
+ break ;
857
+ case '0' :
858
+ case '1' :
859
+ case '2' :
860
+ case '3' :
861
+ case '4' :
862
+ case '5' :
863
+ case '6' :
864
+ case '7' :
865
+ case '8' :
866
+ case '9' :
867
+ return 0 ; /* no RR types start with 0-9 */
868
+ case 'i' :
869
+ case 'I' :
870
+ switch (name [1 ]) {
871
+ case 'n' :
872
+ case 'N' :
873
+ return 0 ; /* 'IN' is a class not a type */
874
+ }
875
+ break ;
876
+ }
877
+
799
878
entry = rrtype_descriptor_by_name (name );
800
879
if (entry ) {
801
880
return entry -> type ;
0 commit comments