Changeset 860 for vendor/current/source3/libsmb/dsgetdcname.c
- Timestamp:
- May 12, 2014, 8:58:38 PM (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
vendor/current/source3/libsmb/dsgetdcname.c
r746 r860 322 322 const struct GUID *domain_guid, 323 323 uint32_t flags, 324 const char *site_name,325 324 struct netr_DsRGetDCNameInfo **info_p) 326 325 { … … 395 394 396 395 status = dsgetdcname_cache_fetch(mem_ctx, domain_name, domain_guid, 397 flags, site_name,info);396 flags, info); 398 397 if (!NT_STATUS_IS_OK(status) 399 398 && !NT_STATUS_EQUAL(status, NT_STATUS_NOT_FOUND)) { … … 1084 1083 1085 1084 /******************************************************************** 1085 Internal dsgetdcname. 1086 ********************************************************************/ 1087 1088 static NTSTATUS dsgetdcname_internal(TALLOC_CTX *mem_ctx, 1089 struct messaging_context *msg_ctx, 1090 const char *domain_name, 1091 const struct GUID *domain_guid, 1092 const char *site_name, 1093 uint32_t flags, 1094 struct netr_DsRGetDCNameInfo **info) 1095 { 1096 NTSTATUS status = NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND; 1097 struct netr_DsRGetDCNameInfo *myinfo = NULL; 1098 bool first = true; 1099 struct netr_DsRGetDCNameInfo *first_info = NULL; 1100 1101 DEBUG(10,("dsgetdcname_internal: domain_name: %s, " 1102 "domain_guid: %s, site_name: %s, flags: 0x%08x\n", 1103 domain_name, 1104 domain_guid ? GUID_string(mem_ctx, domain_guid) : "(null)", 1105 site_name ? site_name : "(null)", flags)); 1106 1107 *info = NULL; 1108 1109 if (!check_allowed_required_flags(flags, site_name)) { 1110 DEBUG(0,("invalid flags specified\n")); 1111 return NT_STATUS_INVALID_PARAMETER; 1112 } 1113 1114 if (flags & DS_FORCE_REDISCOVERY) { 1115 goto rediscover; 1116 } 1117 1118 status = dsgetdcname_cached(mem_ctx, msg_ctx, domain_name, domain_guid, 1119 flags, site_name, &myinfo); 1120 if (NT_STATUS_IS_OK(status)) { 1121 goto done; 1122 } 1123 1124 if (flags & DS_BACKGROUND_ONLY) { 1125 goto done; 1126 } 1127 1128 rediscover: 1129 status = dsgetdcname_rediscover(mem_ctx, msg_ctx, domain_name, 1130 domain_guid, flags, site_name, 1131 &myinfo); 1132 1133 done: 1134 if (!NT_STATUS_IS_OK(status)) { 1135 if (!first) { 1136 *info = first_info; 1137 return NT_STATUS_OK; 1138 } 1139 return status; 1140 } 1141 1142 if (!first) { 1143 TALLOC_FREE(first_info); 1144 } else if (!is_closest_site(myinfo)) { 1145 first = false; 1146 first_info = myinfo; 1147 /* TODO: may use the next_closest_site here */ 1148 site_name = myinfo->client_site_name; 1149 goto rediscover; 1150 } 1151 1152 *info = myinfo; 1153 return NT_STATUS_OK; 1154 } 1155 1156 /******************************************************************** 1086 1157 dsgetdcname. 1087 1158 … … 1097 1168 struct netr_DsRGetDCNameInfo **info) 1098 1169 { 1099 NTSTATUS status = NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND; 1100 struct netr_DsRGetDCNameInfo *myinfo = NULL; 1101 char *query_site = NULL; 1102 bool first = true; 1103 struct netr_DsRGetDCNameInfo *first_info = NULL; 1104 1105 DEBUG(10,("dsgetdcname: domain_name: %s, " 1106 "domain_guid: %s, site_name: %s, flags: 0x%08x\n", 1107 domain_name, 1108 domain_guid ? GUID_string(mem_ctx, domain_guid) : "(null)", 1109 site_name, flags)); 1110 1111 *info = NULL; 1112 1113 if (!check_allowed_required_flags(flags, site_name)) { 1114 DEBUG(0,("invalid flags specified\n")); 1115 return NT_STATUS_INVALID_PARAMETER; 1116 } 1170 NTSTATUS status; 1171 const char *query_site = NULL; 1172 char *ptr_to_free = NULL; 1173 bool retry_query_with_null = false; 1117 1174 1118 1175 if ((site_name == NULL) || (site_name[0] == '\0')) { 1119 query_site = sitename_fetch(domain_name); 1176 ptr_to_free = sitename_fetch(domain_name); 1177 if (ptr_to_free != NULL) { 1178 retry_query_with_null = true; 1179 } 1180 query_site = ptr_to_free; 1120 1181 } else { 1121 query_site = SMB_STRDUP(site_name); 1122 } 1123 1124 if (flags & DS_FORCE_REDISCOVERY) { 1125 goto rediscover; 1126 } 1127 1128 status = dsgetdcname_cached(mem_ctx, msg_ctx, domain_name, domain_guid, 1129 flags, query_site, &myinfo); 1130 if (NT_STATUS_IS_OK(status)) { 1131 goto done; 1132 } 1133 1134 if (flags & DS_BACKGROUND_ONLY) { 1135 goto done; 1136 } 1137 1138 rediscover: 1139 status = dsgetdcname_rediscover(mem_ctx, msg_ctx, domain_name, 1140 domain_guid, flags, query_site, 1141 &myinfo); 1142 1143 done: 1144 SAFE_FREE(query_site); 1145 1146 if (!NT_STATUS_IS_OK(status)) { 1147 if (!first) { 1148 *info = first_info; 1149 return NT_STATUS_OK; 1150 } 1182 query_site = site_name; 1183 } 1184 1185 status = dsgetdcname_internal(mem_ctx, 1186 msg_ctx, 1187 domain_name, 1188 domain_guid, 1189 query_site, 1190 flags, 1191 info); 1192 1193 SAFE_FREE(ptr_to_free); 1194 1195 if (!NT_STATUS_EQUAL(status, NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND)) { 1151 1196 return status; 1152 1197 } 1153 1198 1154 if (!first) {1155 TALLOC_FREE(first_info);1156 } else if (!is_closest_site(myinfo)) {1157 first = false;1158 first_info = myinfo;1159 /* TODO: may use the next_closest_site here */1160 query_site = SMB_STRDUP(myinfo->client_site_name);1161 goto rediscover;1162 }1163 1164 *info = myinfo; 1165 return NT_STATUS_OK;1166 } 1199 /* Should we try again with site_name == NULL ? */ 1200 if (retry_query_with_null) { 1201 status = dsgetdcname_internal(mem_ctx, 1202 msg_ctx, 1203 domain_name, 1204 domain_guid, 1205 NULL, 1206 flags, 1207 info); 1208 } 1209 1210 return status; 1211 }
Note:
See TracChangeset
for help on using the changeset viewer.