diff options
-rw-r--r-- | source3/nmbd/nmbd_mynames.c | 30 | ||||
-rw-r--r-- | source3/param/loadparm.c | 4 |
2 files changed, 34 insertions, 0 deletions
diff --git a/source3/nmbd/nmbd_mynames.c b/source3/nmbd/nmbd_mynames.c index 5ebd42ce87..8fa5439ee3 100644 --- a/source3/nmbd/nmbd_mynames.c +++ b/source3/nmbd/nmbd_mynames.c @@ -114,6 +114,7 @@ BOOL register_my_workgroup_and_names(void) { struct subnet_record *subrec; int i; + const char **cluster_addresses = NULL; for(subrec = FIRST_SUBNET; subrec; subrec = NEXT_SUBNET_INCLUDING_UNICAST(subrec)) { register_my_workgroup_one_subnet(subrec); @@ -145,6 +146,35 @@ BOOL register_my_workgroup_and_names(void) } /* + * add in any cluster addresses. We need to response to these, + * but not listen on them. This allows us to run nmbd on every + * node in the cluster, and have all of them register with a + * WINS server correctly + */ + if (lp_clustering()) { + cluster_addresses = lp_cluster_addresses(); + } + if (cluster_addresses) { + int a, n; + unsigned name_types[] = {0x20, 0x3, 0x0}; + + for (i=0; my_netbios_names(i); i++) { + for(subrec = FIRST_SUBNET; subrec; subrec = subrec->next) { + for (n=0;n<ARRAY_SIZE(name_types);n++) { + struct name_record *namerec; + struct nmb_name nmbname; + make_nmb_name(&nmbname, my_netbios_names(i), name_types[n]); + namerec = find_name_on_subnet(unicast_subnet, &nmbname, FIND_SELF_NAME); + if (namerec == NULL) continue; + for (a=0;cluster_addresses[a];a++) { + add_ip_to_name_record(namerec, *interpret_addr2(cluster_addresses[a])); + } + } + } + } + } + + /* * Add the WORKGROUP<0> and WORKGROUP<1e> group names to the unicast subnet * also for the same reasons. */ diff --git a/source3/param/loadparm.c b/source3/param/loadparm.c index e62eaaf3fb..372cfd529d 100644 --- a/source3/param/loadparm.c +++ b/source3/param/loadparm.c @@ -252,6 +252,7 @@ typedef struct { char *szCupsServer; char *szIPrintServer; char *ctdbdSocket; + char **szClusterAddresses; BOOL clustering; int ldap_passwd_sync; int ldap_replication_sleep; @@ -1046,6 +1047,7 @@ static struct parm_struct parm_table[] = { {"name cache timeout", P_INTEGER, P_GLOBAL, &Globals.name_cache_timeout, NULL, NULL, FLAG_ADVANCED}, {"ctdbd socket", P_STRING, P_GLOBAL, &Globals.ctdbdSocket, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL}, + {"cluster addresses", P_LIST, P_GLOBAL, &Globals.szClusterAddresses, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL}, {"clustering", P_BOOL, P_GLOBAL, &Globals.clustering, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL}, {N_("Printing Options"), P_SEP, P_SEPARATOR}, @@ -1645,6 +1647,7 @@ static void init_globals(BOOL first_time_only) string_set(&Globals.szIPrintServer, ""); string_set(&Globals.ctdbdSocket, ""); + Globals.szClusterAddresses = NULL; Globals.clustering = False; Globals.winbind_cache_time = 300; /* 5 minutes */ @@ -2061,6 +2064,7 @@ FN_LOCAL_STRING(lp_cups_options, szCupsOptions) FN_GLOBAL_STRING(lp_cups_server, &Globals.szCupsServer) FN_GLOBAL_STRING(lp_iprint_server, &Globals.szIPrintServer) FN_GLOBAL_CONST_STRING(lp_ctdbd_socket, &Globals.ctdbdSocket) +FN_GLOBAL_LIST(lp_cluster_addresses, &Globals.szClusterAddresses) FN_GLOBAL_BOOL(lp_clustering, &Globals.clustering); FN_LOCAL_STRING(lp_printcommand, szPrintcommand) FN_LOCAL_STRING(lp_lpqcommand, szLpqcommand) |