@@ -117,13 +117,17 @@ private function parseAnswer(Message $message)
117117
118118 $ consumed = 0 ;
119119
120- $ length = ord ( substr ( $ message -> data , $ consumed , 1 ));
121- $ consumed += 1 ;
120+ $ mask = 0xc000 ; // 1100000000000000
121+ list ( $ nameOffset ) = array_merge ( unpack ( ' n ' , substr ( $ message -> data , $ consumed , 2 ))) ;
122122
123- if ($ length === 192 ) {
124- $ labels [] = '@ ' ;
125- $ consumed += 3 ;
123+ if ($ nameOffset & $ mask ) {
124+ $ consumed += 2 ;
125+ $ labels [] = $ message ->question [0 ]['name ' ];
126+ // TODO: get proper offset
126127 } else {
128+ $ length = ord (substr ($ message ->data , $ consumed , 1 ));
129+ $ consumed += 1 ;
130+
127131 while ($ length !== 0 ) {
128132 $ labels [] = substr ($ message ->data , $ consumed , $ length );
129133 $ consumed += $ length ;
@@ -144,22 +148,36 @@ private function parseAnswer(Message $message)
144148 list ($ type , $ class ) = array_merge (unpack ('n* ' , substr ($ message ->data , $ consumed , 4 )));
145149 $ consumed += 4 ;
146150
147- list ($ ttl ) = array_merge (unpack ('l ' , substr ($ message ->data , $ consumed , 4 )));
151+ list ($ ttl ) = array_merge (unpack ('N ' , substr ($ message ->data , $ consumed , 4 )));
148152 $ consumed += 4 ;
149153
150154 list ($ rdLength ) = array_merge (unpack ('n ' , substr ($ message ->data , $ consumed , 2 )));
151155 $ consumed += 2 ;
152156
157+ $ rdata = null ;
158+ if (Message::TYPE_A === $ type ) {
159+ $ ip = substr ($ message ->data , $ consumed , $ rdLength );
160+ $ consumed += $ rdLength ;
161+
162+ $ rdata = inet_ntop ($ ip );
163+ }
164+
153165 $ message ->data = substr ($ message ->data , $ consumed ) ?: '' ;
154166
155167 $ record = new Record ();
156168 $ record ->name = implode ('. ' , $ labels );
157169 $ record ->type = $ type ;
158170 $ record ->class = $ class ;
159- $ record ->ttl = $ ttl ;
171+ $ record ->ttl = $ this ->signedLongToUnsignedLong ($ ttl );
172+ $ record ->data = $ rdata ;
160173
161174 $ message ->answer [] = $ record ;
162175
163176 return $ message ;
164177 }
178+
179+ private function signedLongToUnsignedLong ($ i )
180+ {
181+ return $ i & 0x80000000 ? $ i - 0xffffffff : $ i ;
182+ }
165183}
0 commit comments