Ignore:
Timestamp:
May 12, 2014, 8:58:38 PM (11 years ago)
Author:
Silvan Scherrer
Message:

Samba 3.6: updated vendor to latest version

File:
1 edited

Legend:

Unmodified
Added
Removed
  • vendor/current/source3/libsmb/dsgetdcname.c

    r746 r860  
    322322                                        const struct GUID *domain_guid,
    323323                                        uint32_t flags,
    324                                         const char *site_name,
    325324                                        struct netr_DsRGetDCNameInfo **info_p)
    326325{
     
    395394
    396395        status = dsgetdcname_cache_fetch(mem_ctx, domain_name, domain_guid,
    397                                          flags, site_name, info);
     396                                         flags, info);
    398397        if (!NT_STATUS_IS_OK(status)
    399398            && !NT_STATUS_EQUAL(status, NT_STATUS_NOT_FOUND)) {
     
    10841083
    10851084/********************************************************************
     1085 Internal dsgetdcname.
     1086********************************************************************/
     1087
     1088static 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/********************************************************************
    10861157 dsgetdcname.
    10871158
     
    10971168                     struct netr_DsRGetDCNameInfo **info)
    10981169{
    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;
    11171174
    11181175        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;
    11201181        } 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)) {
    11511196                return status;
    11521197        }
    11531198
    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.