summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/nmbd/nmbd_mynames.c30
-rw-r--r--source3/param/loadparm.c4
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)