summaryrefslogtreecommitdiffstats
path: root/source/nmbd
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2000-09-12 06:13:25 +0000
committerAndrew Tridgell <tridge@samba.org>2000-09-12 06:13:25 +0000
commitf1c49ca7ce56bc39259041a71479e84ebf53eeca (patch)
treedd0c0cf65ffd45f9589654669fdb519abaf82091 /source/nmbd
parent2ebfdd21b3123d7daefeeed4dae6e8bc3a7a7653 (diff)
downloadsamba-f1c49ca7ce56bc39259041a71479e84ebf53eeca.tar.gz
samba-f1c49ca7ce56bc39259041a71479e84ebf53eeca.tar.xz
samba-f1c49ca7ce56bc39259041a71479e84ebf53eeca.zip
- changed the msg_type to be an int instead of an enum so that it is
easier to add new message types to messages.h without breaking old binaries - added a MSG_FORCE_ELECTION message to force nmbd to hold an election
Diffstat (limited to 'source/nmbd')
-rw-r--r--source/nmbd/nmbd.c7
-rw-r--r--source/nmbd/nmbd_elections.c21
-rw-r--r--source/nmbd/nmbd_packets.c11
3 files changed, 25 insertions, 14 deletions
diff --git a/source/nmbd/nmbd.c b/source/nmbd/nmbd.c
index 2da879fc943..914f288001d 100644
--- a/source/nmbd/nmbd.c
+++ b/source/nmbd/nmbd.c
@@ -312,6 +312,9 @@ static void process(void)
{
time_t t = time(NULL);
+ /* check for internal messages */
+ message_dispatch();
+
/*
* Check all broadcast subnets to see if
* we need to run an election on any of them.
@@ -490,9 +493,6 @@ static void process(void)
/* free up temp memory */
lp_talloc_free();
-
- /* check for internal messages */
- message_init();
}
} /* process */
@@ -795,6 +795,7 @@ static void usage(char *pname)
pidfile_create("nmbd");
message_init();
+ message_register(MSG_FORCE_ELECTION, nmbd_message_election);
DEBUG( 3, ( "Opening sockets %d\n", global_nmb_port ) );
diff --git a/source/nmbd/nmbd_elections.c b/source/nmbd/nmbd_elections.c
index be38b572f66..522e268ae71 100644
--- a/source/nmbd/nmbd_elections.c
+++ b/source/nmbd/nmbd_elections.c
@@ -381,3 +381,24 @@ yet registered on subnet %s\n", nmb_namestr(&nmbname), subrec->subnet_name ));
}
return run_any_election;
}
+
+
+
+/****************************************************************************
+process a internal Samba message forcing an election
+***************************************************************************/
+void nmbd_message_election(int msg_type, pid_t src, void *buf, size_t len)
+{
+ struct subnet_record *subrec;
+
+ for (subrec = FIRST_SUBNET; subrec; subrec = NEXT_SUBNET_EXCLUDING_UNICAST(subrec)) {
+ struct work_record *work;
+ for (work = subrec->workgrouplist; work; work = work->next) {
+ if (strequal(work->work_group, global_myworkgroup)) {
+ work->needelection = True;
+ work->ElectionCount=0;
+ work->mst_state = lp_local_master() ? MST_POTENTIAL : MST_NONE;
+ }
+ }
+ }
+}
diff --git a/source/nmbd/nmbd_packets.c b/source/nmbd/nmbd_packets.c
index d1f77fe2d22..50193d53395 100644
--- a/source/nmbd/nmbd_packets.c
+++ b/source/nmbd/nmbd_packets.c
@@ -1759,14 +1759,6 @@ only use %d.\n", (count*2) + 2, FD_SETSIZE));
}
/****************************************************************************
-do any signal triggered processing
-***************************************************************************/
-static void nmbd_async_processing(void)
-{
- message_dispatch();
-}
-
-/****************************************************************************
Listens for NMB or DGRAM packets, and queues them.
return True if the socket is dead
***************************************************************************/
@@ -1826,9 +1818,6 @@ BOOL listen_for_packets(BOOL run_election)
BlockSignals(True, SIGTERM);
if(selrtn == -1) {
- if (errno == EINTR) {
- nmbd_async_processing();
- }
return False;
}