s3-param: Make lp_name_resolve_order() return a list
authorAndrew Bartlett <abartlet@samba.org>
Wed, 18 Jul 2012 05:19:15 +0000 (15:19 +1000)
committerAndrew Bartlett <abartlet@samba.org>
Thu, 19 Jul 2012 06:02:32 +0000 (08:02 +0200)
This allows this parameter, one of the few with differing declarations
between the loadparm systems, to be brought into common.

Andrew Bartlett

Pair-Programmed-With: Andrew Tridgell <tridge@samba.org>

lib/param/loadparm.c
lib/param/param_functions.c
source3/client/client.c
source3/include/proto.h
source3/libsmb/dsgetdcname.c
source3/libsmb/namequery.c
source3/param/loadparm.c
source3/utils/smbpasswd.c

index f6156bd0e0207cb8c31590beac364d31c08c3857..d5f370e80f89a8a5e072c1e32cd946dc598d7fc2 100644 (file)
@@ -1526,7 +1526,6 @@ static struct loadparm_context *global_loadparm_context;
 FN_GLOBAL_BOOL(readraw, bReadRaw)
 FN_GLOBAL_BOOL(unicode, bUnicode)
 FN_GLOBAL_BOOL(writeraw, bWriteRaw)
-FN_GLOBAL_LIST(name_resolve_order, szNameResolveOrder)
 FN_GLOBAL_LIST(smb_ports, smb_ports)
 FN_GLOBAL_STRING(cachedir, szCacheDir)
 FN_GLOBAL_STRING(socket_address, szSocketAddress)
index 914150a337196a0a922b1a0c2231727e275ae095..c2bd63105aad9ed3ae1de057fe0514abd3843650 100644 (file)
@@ -349,6 +349,7 @@ FN_GLOBAL_LIST(dns_update_command, szDNSUpdateCommand)
 FN_GLOBAL_LIST(eventlog_list, szEventLogs)
 FN_GLOBAL_LIST(init_logon_delayed_hosts, szInitLogonDelayedHosts)
 FN_GLOBAL_LIST(interfaces, szInterfaces)
+FN_GLOBAL_LIST(name_resolve_order, szNameResolveOrder)
 FN_GLOBAL_LIST(netbios_aliases, szNetbiosAliases)
 FN_GLOBAL_LIST(nsupdate_command, szNSUpdateCommand)
 FN_GLOBAL_LIST(preload_modules, szPreloadModules)
index 821bd0a32e10a1772d107f09e4e462db61c4c5a0..28fc30aeb44b004d74ed373febc60ce7330f759a 100644 (file)
@@ -5540,7 +5540,7 @@ static int do_message_op(struct user_auth_info *a_info)
        }
 
        if(new_name_resolve_order)
-               lp_set_name_resolve_order(new_name_resolve_order);
+               lp_set_cmdline("name resolve order", new_name_resolve_order);
 
        if (!tar_type && !query_host && !service && !message) {
                poptPrintUsage(pc, stderr, 0);
index f551c255904be39cf6bceeca0b3d78f9a552ea57..769a300403c5ddc62ea4de170367f25d16b32b47 100644 (file)
@@ -900,7 +900,7 @@ NTSTATUS internal_resolve_name(const char *name,
                                const char *sitename,
                                struct ip_service **return_iplist,
                                int *return_count,
-                               const char *resolve_order);
+                               const char **resolve_order);
 bool resolve_name(const char *name,
                struct sockaddr_storage *return_ss,
                int name_type,
@@ -1034,7 +1034,7 @@ char *lp_auto_services(TALLOC_CTX *ctx);
 char *lp_passwd_program(TALLOC_CTX *ctx);
 char *lp_passwd_chat(TALLOC_CTX *ctx);
 const char *lp_passwordserver(void);
-const char *lp_name_resolve_order(void);
+const char **lp_name_resolve_order(void);
 const char *lp_netbios_scope(void);
 const char *lp_netbios_name(void);
 const char *lp_workgroup(void);
@@ -1472,7 +1472,6 @@ bool lp_preferred_master(void);
 void lp_remove_service(int snum);
 void lp_copy_service(int snum, const char *new_name);
 int lp_default_server_announce(void);
-void lp_set_name_resolve_order(const char *new_order);
 const char *lp_printername(TALLOC_CTX *ctx, int snum);
 void lp_set_logfile(const char *name);
 int lp_maxprintjobs(int snum);
index 02f4bc928dd8564d8003edacd8e5be458615e004..028a31b617f3805c09a310d376656bee9822af97 100644 (file)
@@ -478,6 +478,7 @@ static NTSTATUS discover_dc_netbios(TALLOC_CTX *mem_ctx,
        int i;
        struct ip_service_name *dclist = NULL;
        int count;
+       static const char *resolve_order[] = { "lmhosts", "wins", "bcast", NULL };
 
        *returned_dclist = NULL;
        *returned_count = 0;
@@ -492,7 +493,7 @@ static NTSTATUS discover_dc_netbios(TALLOC_CTX *mem_ctx,
 
        status = internal_resolve_name(domain_name, name_type, NULL,
                                       &iplist, &count,
-                                      "lmhosts wins bcast");
+                                      resolve_order);
        if (!NT_STATUS_IS_OK(status)) {
                DEBUG(10,("discover_dc_netbios: failed to find DC\n"));
                return status;
index 4c05e4f4189c2540b9c6d0edfaaf69e1cb55974c..e4dda166591aaf71a3356e734bc89bfa9521dcc0 100644 (file)
@@ -2584,10 +2584,9 @@ NTSTATUS internal_resolve_name(const char *name,
                                const char *sitename,
                                struct ip_service **return_iplist,
                                int *return_count,
-                               const char *resolve_order)
+                               const char **resolve_order)
 {
-       char *tok;
-       const char *ptr;
+       const char *tok;
        NTSTATUS status = NT_STATUS_UNSUCCESSFUL;
        int i;
        TALLOC_CTX *frame = NULL;
@@ -2640,21 +2639,22 @@ NTSTATUS internal_resolve_name(const char *name,
 
        /* set the name resolution order */
 
-       if (strcmp( resolve_order, "NULL") == 0) {
+       if (resolve_order && strcmp(resolve_order[0], "NULL") == 0) {
                DEBUG(8,("internal_resolve_name: all lookups disabled\n"));
                return NT_STATUS_INVALID_PARAMETER;
        }
 
-       if (!resolve_order[0]) {
-               ptr = "host";
-       } else {
-               ptr = resolve_order;
+       if (!resolve_order || !resolve_order[0]) {
+               static const char *host_order[] = { "host", NULL };
+               resolve_order = host_order;
        }
 
        /* iterate through the name resolution backends */
 
        frame = talloc_stackframe();
-       while (next_token_talloc(frame, &ptr, &tok, LIST_SEP)) {
+       for (i=0; resolve_order[i]; i++) {
+               tok = resolve_order[i];
+
                if((strequal(tok, "host") || strequal(tok, "hosts"))) {
                        status = resolve_hosts(name, name_type, return_iplist,
                                               return_count);
@@ -2963,12 +2963,12 @@ bool get_pdc_ip(const char *domain, struct sockaddr_storage *pss)
        struct ip_service *ip_list = NULL;
        int count = 0;
        NTSTATUS status = NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND;
-
+       static const char *ads_order[] = { "ads", NULL };
        /* Look up #1B name */
 
        if (lp_security() == SEC_ADS) {
                status = internal_resolve_name(domain, 0x1b, NULL, &ip_list,
-                                              &count, "ads");
+                                              &count, ads_order);
        }
 
        if (!NT_STATUS_IS_OK(status) || count == 0) {
@@ -3009,7 +3009,7 @@ static NTSTATUS get_dc_list(const char *domain,
                        enum dc_lookup_type lookup_type,
                        bool *ordered)
 {
-       char *resolve_order = NULL;
+       const char **resolve_order = NULL;
        char *saf_servername = NULL;
        char *pserver = NULL;
        const char *p;
@@ -3040,27 +3040,30 @@ static NTSTATUS get_dc_list(const char *domain,
           are disabled and ads_only is True, then set the string to
           NULL. */
 
-       resolve_order = talloc_strdup(ctx, lp_name_resolve_order());
+       resolve_order = lp_name_resolve_order();
        if (!resolve_order) {
                status = NT_STATUS_NO_MEMORY;
                goto out;
        }
-       strlower_m(resolve_order);
        if (lookup_type == DC_ADS_ONLY)  {
-               if (strstr( resolve_order, "host")) {
-                       resolve_order = talloc_strdup(ctx, "ads");
+               if (str_list_check_ci(resolve_order, "host")) {
+                       static const char *ads_order[] = { "ads", NULL };
+                       resolve_order = ads_order;
 
                        /* DNS SRV lookups used by the ads resolver
                           are already sorted by priority and weight */
                        *ordered = true;
                } else {
-                        resolve_order = talloc_strdup(ctx, "NULL");
+                       /* this is quite bizarre! */
+                       static const char *null_order[] = { "NULL", NULL };
+                        resolve_order = null_order;
                }
        } else if (lookup_type == DC_KDC_ONLY) {
+               static const char *kdc_order[] = { "kdc", NULL };
                /* DNS SRV lookups used by the ads/kdc resolver
                   are already sorted by priority and weight */
                *ordered = true;
-               resolve_order = talloc_strdup(ctx, "kdc");
+               resolve_order = kdc_order;
        }
        if (!resolve_order) {
                status = NT_STATUS_NO_MEMORY;
@@ -3281,10 +3284,9 @@ NTSTATUS get_sorted_dc_list( const char *domain,
        *count = 0;
 
        DEBUG(8,("get_sorted_dc_list: attempting lookup "
-               "for name %s (sitename %s) using [%s]\n",
+               "for name %s (sitename %s)\n",
                domain,
-               sitename ? sitename : "NULL",
-               (ads_only ? "ads" : lp_name_resolve_order())));
+                sitename ? sitename : "NULL"));
 
        if (ads_only) {
                lookup_type = DC_ADS_ONLY;
index 5486b0a92f07ff9e22438383426ea2f33a7da76b..4c21d5032f93f97b3282a423366679bafe9c598c 100644 (file)
@@ -1749,7 +1749,7 @@ static struct parm_struct parm_table[] = {
        },
        {
                .label          = "name resolve order",
-               .type           = P_STRING,
+               .type           = P_LIST,
                .p_class        = P_GLOBAL,
                .offset         = GLOBAL_VAR(szNameResolveOrder),
                .special        = NULL,
@@ -4730,7 +4730,7 @@ static void init_globals(bool reinit_globals)
        string_set(&Globals.szLogonHome, "\\\\%N\\%U");
        string_set(&Globals.szLogonPath, "\\\\%N\\%U\\profile");
 
-       string_set(&Globals.szNameResolveOrder, "lmhosts wins host bcast");
+       Globals.szNameResolveOrder = (const char **)str_list_make_v3(NULL, "lmhosts wins host bcast", NULL);
        string_set(&Globals.szPasswordServer, "*");
 
        Globals.AlgorithmicRidBase = BASE_RID;
@@ -5109,7 +5109,6 @@ int lp_cups_encrypt(void)
 
 /* These functions remain in source3/param for now */
 
-FN_GLOBAL_CONST_STRING(name_resolve_order, szNameResolveOrder)
 FN_GLOBAL_CONST_STRING(smb_ports, smb_ports)
 FN_GLOBAL_INTEGER(security, security)
 FN_GLOBAL_INTEGER(usershare_max_shares, iUsershareMaxShares)
@@ -9149,16 +9148,6 @@ void lp_copy_service(int snum, const char *new_name)
        }
 }
 
-
-/***********************************************************
- Set the global name resolution order (used in smbclient).
-************************************************************/
-
-void lp_set_name_resolve_order(const char *new_order)
-{
-       string_set(&Globals.szNameResolveOrder, new_order);
-}
-
 const char *lp_printername(TALLOC_CTX *ctx, int snum)
 {
        const char *ret = lp__printername(talloc_tos(), snum);
index 43edab24eeda2ae595f1e85c4f5621bed9579dd3..f845147da484ff514ceec3e53f2c570281fd8a6b 100644 (file)
@@ -153,7 +153,7 @@ static int process_options(int argc, char **argv, int local_flags)
                        fstrcpy(ldap_secret, optarg);
                        break;
                case 'R':
-                       lp_set_name_resolve_order(optarg);
+                       lp_set_cmdline("name resolve order", optarg);
                        break;
                case 'D':
                        lp_set_cmdline("log level", optarg);