@@ -403,7 +403,7 @@ PHP_FUNCTION(dns_check_record)
403
403
#if HAVE_FULL_DNS_FUNCS
404
404
405
405
/* {{{ php_parserr */
406
- static u_char * php_parserr (u_char * cp , querybuf * answer , int type_to_fetch , int store , zval * * subarray )
406
+ static u_char * php_parserr (u_char * cp , querybuf * answer , int type_to_fetch , int store , int raw , zval * * subarray )
407
407
{
408
408
u_short type , class , dlen ;
409
409
u_long ttl ;
@@ -439,6 +439,16 @@ static u_char *php_parserr(u_char *cp, querybuf *answer, int type_to_fetch, int
439
439
array_init (* subarray );
440
440
441
441
add_assoc_string (* subarray , "host" , name , 1 );
442
+ add_assoc_string (* subarray , "class" , "IN" , 1 );
443
+ add_assoc_long (* subarray , "ttl" , ttl );
444
+
445
+ if (raw ) {
446
+ add_assoc_long (* subarray , "type" , type );
447
+ add_assoc_stringl (* subarray , "data" , (char * ) cp , (uint ) dlen , 1 );
448
+ cp += dlen ;
449
+ return cp ;
450
+ }
451
+
442
452
switch (type ) {
443
453
case DNS_T_A :
444
454
add_assoc_string (* subarray , "type" , "A" , 1 );
@@ -679,20 +689,12 @@ static u_char *php_parserr(u_char *cp, querybuf *answer, int type_to_fetch, int
679
689
add_assoc_string (* subarray , "replacement" , name , 1 );
680
690
break ;
681
691
default :
682
- {
683
- char buf [10 ]; /* max length of short + sizeof(id #) */
684
- snprintf (buf , 10 , "id #%hu" , type );
685
- buf [10 - 1 ] = '\0' ;
686
- add_assoc_string (* subarray , "type" , buf , 1 );
687
- add_assoc_stringl (* subarray , "data" , (char * ) cp , (uint ) dlen , 1 );
688
- cp += dlen ;
689
- break ;
690
- }
692
+ zval_ptr_dtor (subarray );
693
+ * subarray = NULL ;
694
+ cp += dlen ;
695
+ break ;
691
696
}
692
697
693
- add_assoc_string (* subarray , "class" , "IN" , 1 );
694
- add_assoc_long (* subarray , "ttl" , ttl );
695
-
696
698
return cp ;
697
699
}
698
700
/* }}} */
@@ -720,8 +722,10 @@ PHP_FUNCTION(dns_get_record)
720
722
u_char * cp = NULL , * end = NULL ;
721
723
int n , qd , an , ns = 0 , ar = 0 ;
722
724
int type , first_query = 1 , store_results = 1 ;
725
+ zend_bool raw = 0 ;
723
726
724
- if (zend_parse_parameters (ZEND_NUM_ARGS () TSRMLS_CC , "s|lzz" , & hostname , & hostname_len , & type_param , & authns , & addtl ) == FAILURE ) {
727
+ if (zend_parse_parameters (ZEND_NUM_ARGS () TSRMLS_CC , "s|lz!z!b" ,
728
+ & hostname , & hostname_len , & type_param , & authns , & addtl , & raw ) == FAILURE ) {
725
729
return ;
726
730
}
727
731
@@ -735,9 +739,17 @@ PHP_FUNCTION(dns_get_record)
735
739
addtl_recs = 1 ;
736
740
}
737
741
738
- if (type_param & ~PHP_DNS_ALL && type_param != PHP_DNS_ANY ) {
739
- php_error_docref (NULL TSRMLS_CC , E_WARNING , "Type '%ld' not supported" , type_param );
740
- RETURN_FALSE ;
742
+ if (!raw ) {
743
+ if ((type_param & ~PHP_DNS_ALL ) && (type_param != PHP_DNS_ANY )) {
744
+ php_error_docref (NULL TSRMLS_CC , E_WARNING , "Type '%ld' not supported" , type_param );
745
+ RETURN_FALSE ;
746
+ }
747
+ } else {
748
+ if ((type_param < 1 ) || (type_param > 0xFFFF )) {
749
+ php_error_docref (NULL TSRMLS_CC , E_WARNING ,
750
+ "Numeric DNS record type must be between 1 and 65535, '%ld' given" , type_param );
751
+ RETURN_FALSE ;
752
+ }
741
753
}
742
754
743
755
/* Initialize the return array */
@@ -748,13 +760,29 @@ PHP_FUNCTION(dns_get_record)
748
760
* store_results is used to skip storing the results retrieved in step
749
761
* NUMTYPES+1 when results were already fetched.
750
762
* - In case of PHP_DNS_ANY we use the directly fetch DNS_T_ANY. (step NUMTYPES+1 )
763
+ * - In case of raw mode, we query only the requestd type instead of looping type by type
764
+ * before going with the additional info stuff.
751
765
*/
752
- for (type = (type_param == PHP_DNS_ANY ? (PHP_DNS_NUM_TYPES + 1 ) : 0 );
766
+
767
+ if (raw ) {
768
+ type = -1 ;
769
+ } else if (type_param == PHP_DNS_ANY ) {
770
+ type = PHP_DNS_NUM_TYPES + 1 ;
771
+ } else {
772
+ type = 0 ;
773
+ }
774
+
775
+ for ( ;
753
776
type < (addtl_recs ? (PHP_DNS_NUM_TYPES + 2 ) : PHP_DNS_NUM_TYPES ) || first_query ;
754
777
type ++
755
778
) {
756
779
first_query = 0 ;
757
780
switch (type ) {
781
+ case -1 : /* raw */
782
+ type_to_fetch = type_param ;
783
+ /* skip over the rest and go directly to additional records */
784
+ type = PHP_DNS_NUM_TYPES - 1 ;
785
+ break ;
758
786
case 0 :
759
787
type_to_fetch = type_param & PHP_DNS_A ? DNS_T_A : 0 ;
760
788
break ;
@@ -846,7 +874,7 @@ PHP_FUNCTION(dns_get_record)
846
874
while (an -- && cp && cp < end ) {
847
875
zval * retval ;
848
876
849
- cp = php_parserr (cp , & answer , type_to_fetch , store_results , & retval );
877
+ cp = php_parserr (cp , & answer , type_to_fetch , store_results , raw , & retval );
850
878
if (retval != NULL && store_results ) {
851
879
add_next_index_zval (return_value , retval );
852
880
}
@@ -859,7 +887,7 @@ PHP_FUNCTION(dns_get_record)
859
887
while (ns -- > 0 && cp && cp < end ) {
860
888
zval * retval = NULL ;
861
889
862
- cp = php_parserr (cp , & answer , DNS_T_ANY , authns != NULL , & retval );
890
+ cp = php_parserr (cp , & answer , DNS_T_ANY , authns != NULL , raw , & retval );
863
891
if (retval != NULL ) {
864
892
add_next_index_zval (authns , retval );
865
893
}
@@ -871,7 +899,7 @@ PHP_FUNCTION(dns_get_record)
871
899
while (ar -- > 0 && cp && cp < end ) {
872
900
zval * retval = NULL ;
873
901
874
- cp = php_parserr (cp , & answer , DNS_T_ANY , 1 , & retval );
902
+ cp = php_parserr (cp , & answer , DNS_T_ANY , 1 , raw , & retval );
875
903
if (retval != NULL ) {
876
904
add_next_index_zval (addtl , retval );
877
905
}
0 commit comments