︙ | | |
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
|
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
|
-
+
-
-
-
+
-
-
-
+
-
-
|
_delegate = [delegate retain];
queryData = [OFMutableData dataWithCapacity: 512];
/* Header */
tmp = OF_BSWAP16_IF_LE(_ID.unsignedShortValue);
[queryData addItems: &tmp
[queryData addItems: &tmp count: 2];
count: 2];
/* RD */
tmp = OF_BSWAP16_IF_LE(1u << 8);
[queryData addItems: &tmp
[queryData addItems: &tmp count: 2];
count: 2];
/* QDCOUNT */
tmp = OF_BSWAP16_IF_LE(1);
[queryData addItems: &tmp
[queryData addItems: &tmp count: 2];
count: 2];
/* ANCOUNT, NSCOUNT and ARCOUNT */
[queryData increaseCountBy: 6];
/* Question */
/* QNAME */
for (OFString *component in
|
︙ | | |
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
|
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
|
-
+
-
-
-
+
-
-
|
[queryData addItem: &length8];
[queryData addItems: component.UTF8String
count: length];
}
/* QTYPE */
tmp = OF_BSWAP16_IF_LE(_query.recordType);
[queryData addItems: &tmp
[queryData addItems: &tmp count: 2];
count: 2];
/* QCLASS */
tmp = OF_BSWAP16_IF_LE(_query.DNSClass);
[queryData addItems: &tmp
[queryData addItems: &tmp count: 2];
count: 2];
[queryData makeImmutable];
_queryData = [queryData copy];
objc_autoreleasePoolPop(pool);
} @catch (id e) {
[self release];
|
︙ | | |
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
|
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
|
-
+
-
|
}
context = [[[OFDNSResolverContext alloc]
initWithQuery: query
ID: ID
settings: _settings
delegate: delegate] autorelease];
[self of_sendQueryForContext: context
[self of_sendQueryForContext: context runLoopMode: runLoopMode];
runLoopMode: runLoopMode];
objc_autoreleasePoolPop(pool);
}
- (void)of_contextTimedOut: (OFDNSResolverContext *)context
{
of_run_loop_mode_t runLoopMode = [OFRunLoop currentRunLoop].currentMode;
|
︙ | | |
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
|
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
|
-
+
-
-
+
-
-
+
-
-
+
-
|
context->_TCPSocket = nil;
context->_responseLength = 0;
}
if (context->_nameServersIndex + 1 <
context->_settings->_nameServers.count) {
context->_nameServersIndex++;
[self of_sendQueryForContext: context
[self of_sendQueryForContext: context runLoopMode: runLoopMode];
runLoopMode: runLoopMode];
return;
}
if (++context->_attempt < context->_settings->_maxAttempts) {
context->_nameServersIndex = 0;
[self of_sendQueryForContext: context
[self of_sendQueryForContext: context runLoopMode: runLoopMode];
runLoopMode: runLoopMode];
return;
}
context = [[context retain] autorelease];
[_queries removeObjectForKey: context->_ID];
/*
* Cancel any pending queries, to avoid a send being still pending and
* trying to access the query once it no longer exists.
*/
[_IPv4Socket cancelAsyncRequests];
[_IPv4Socket asyncReceiveIntoBuffer: _buffer
[_IPv4Socket asyncReceiveIntoBuffer: _buffer length: BUFFER_LENGTH];
length: BUFFER_LENGTH];
#ifdef OF_HAVE_IPV6
[_IPv6Socket cancelAsyncRequests];
[_IPv6Socket asyncReceiveIntoBuffer: _buffer
[_IPv6Socket asyncReceiveIntoBuffer: _buffer length: BUFFER_LENGTH];
length: BUFFER_LENGTH];
#endif
exception = [OFDNSQueryFailedException
exceptionWithQuery: context->_query
error: OF_DNS_RESOLVER_ERROR_TIMEOUT];
[context->_delegate resolver: self
|
︙ | | |
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
|
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
|
-
+
-
|
if (queryDataCount > UINT16_MAX)
@throw [OFOutOfRangeException exception];
context->_TCPQueryData = [[OFMutableData alloc]
initWithCapacity: queryDataCount + 2];
tmp = OF_BSWAP16_IF_LE(queryDataCount);
[context->_TCPQueryData addItems: &tmp
[context->_TCPQueryData addItems: &tmp count: sizeof(tmp)];
count: sizeof(tmp)];
[context->_TCPQueryData addItems: context->_queryData.items
count: queryDataCount];
}
[sock asyncWriteData: context->_TCPQueryData];
}
|
︙ | | |
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
|
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
|
-
+
-
|
context->_responseLength = 0;
return nil;
}
if (context->_TCPBuffer == nil)
context->_TCPBuffer = of_alloc(MAX_DNS_RESPONSE_LENGTH, 1);
[sock asyncReadIntoBuffer: context->_TCPBuffer
[sock asyncReadIntoBuffer: context->_TCPBuffer exactLength: 2];
exactLength: 2];
return nil;
}
- (bool)stream: (OFStream *)stream
didReadIntoBuffer: (void *)buffer
length: (size_t)length
exception: (id)exception
|
︙ | | |
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
|
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
|
-
+
-
-
|
if (length != context->_responseLength)
/*
* The connection was closed before we received the entire
* response.
*/
goto done;
[self of_handleResponseBuffer: buffer
[self of_handleResponseBuffer: buffer length: length sender: NULL];
length: length
sender: NULL];
done:
[_TCPQueries removeObjectForKey: context->_TCPSocket];
[context->_TCPSocket release];
context->_TCPSocket = nil;
context->_responseLength = 0;
|
︙ | | |