summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/include/messages.h7
-rw-r--r--source3/include/proto.h9
-rw-r--r--source3/lib/debug.c2
-rw-r--r--source3/lib/messages.c31
-rw-r--r--source3/nmbd/nmbd.c7
-rw-r--r--source3/nmbd/nmbd_elections.c21
-rw-r--r--source3/nmbd/nmbd_packets.c11
-rw-r--r--source3/utils/msgtest.c2
8 files changed, 56 insertions, 34 deletions
diff --git a/source3/include/messages.h b/source3/include/messages.h
index 4bc4014ca0..6ab21e7433 100644
--- a/source3/include/messages.h
+++ b/source3/include/messages.h
@@ -22,6 +22,11 @@
#ifndef _MESSAGES_H_
#define _MESSAGES_H_
-enum message_type {MSG_DEBUG};
+/* general messages */
+#define MSG_DEBUG 1
+#define MSG_PING 2
+
+/* nmbd messages */
+#define MSG_FORCE_ELECTION 1001
#endif
diff --git a/source3/include/proto.h b/source3/include/proto.h
index f12f7e1570..4fc539ef6e 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -59,7 +59,7 @@ uint32 crc32_calc_buffer( char *buffer, uint32 count);
/*The following definitions come from lib/debug.c */
-void debug_message(enum message_type msg_type, pid_t src, void *buf, size_t len);
+void debug_message(int msg_type, pid_t src, void *buf, size_t len);
void debug_message_send(pid_t pid, int level);
void setup_logging(char *pname, BOOL interactive);
void reopen_logs( void );
@@ -153,10 +153,10 @@ void mdfour(unsigned char *out, unsigned char *in, int n);
/*The following definitions come from lib/messages.c */
BOOL message_init(void);
-BOOL message_send_pid(pid_t pid, enum message_type msg_type, void *buf, size_t len);
+BOOL message_send_pid(pid_t pid, int msg_type, void *buf, size_t len);
void message_dispatch(void);
-void message_register(enum message_type msg_type,
- void (*fn)(enum message_type msg_type, pid_t pid, void *buf, size_t len));
+void message_register(int msg_type,
+ void (*fn)(int msg_type, pid_t pid, void *buf, size_t len));
/*The following definitions come from lib/ms_fnmatch.c */
@@ -997,6 +997,7 @@ void check_master_browser_exists(time_t t);
void run_elections(time_t t);
void process_election(struct subnet_record *subrec, struct packet_struct *p, char *buf);
BOOL check_elections(void);
+void nmbd_message_election(int msg_type, pid_t src, void *buf, size_t len);
/*The following definitions come from nmbd/nmbd_incomingdgrams.c */
diff --git a/source3/lib/debug.c b/source3/lib/debug.c
index e67aea7fd3..1a53f4c2a8 100644
--- a/source3/lib/debug.c
+++ b/source3/lib/debug.c
@@ -122,7 +122,7 @@ static size_t format_pos = 0;
/****************************************************************************
receive a "set debug level" message
****************************************************************************/
-void debug_message(enum message_type msg_type, pid_t src, void *buf, size_t len)
+void debug_message(int msg_type, pid_t src, void *buf, size_t len)
{
int level;
memcpy(&level, buf, sizeof(int));
diff --git a/source3/lib/messages.c b/source3/lib/messages.c
index bbda5d71ed..927cb095dd 100644
--- a/source3/lib/messages.c
+++ b/source3/lib/messages.c
@@ -43,7 +43,7 @@ static int received_signal;
struct message_rec {
int msg_version;
- enum message_type msg_type;
+ int msg_type;
pid_t dest;
pid_t src;
size_t len;
@@ -52,8 +52,8 @@ struct message_rec {
/* we have a linked list of dispatch handlers */
static struct dispatch_fns {
struct dispatch_fns *next, *prev;
- enum message_type msg_type;
- void (*fn)(enum message_type msg_type, pid_t pid, void *buf, size_t len);
+ int msg_type;
+ void (*fn)(int msg_type, pid_t pid, void *buf, size_t len);
} *dispatch_fns;
/****************************************************************************
@@ -124,7 +124,7 @@ static BOOL message_notify(pid_t pid)
/****************************************************************************
send a message to a particular pid
****************************************************************************/
-BOOL message_send_pid(pid_t pid, enum message_type msg_type, void *buf, size_t len)
+BOOL message_send_pid(pid_t pid, int msg_type, void *buf, size_t len)
{
TDB_DATA kbuf;
TDB_DATA dbuf;
@@ -150,7 +150,7 @@ BOOL message_send_pid(pid_t pid, enum message_type msg_type, void *buf, size_t l
if (!p) goto failed;
memcpy(p, &rec, sizeof(rec));
- memcpy(p+sizeof(rec), buf, len);
+ if (len > 0) memcpy(p+sizeof(rec), buf, len);
dbuf.dptr = p;
dbuf.dsize = len + sizeof(rec);
@@ -165,7 +165,7 @@ BOOL message_send_pid(pid_t pid, enum message_type msg_type, void *buf, size_t l
memcpy(p, dbuf.dptr, dbuf.dsize);
memcpy(p+dbuf.dsize, &rec, sizeof(rec));
- memcpy(p+dbuf.dsize+sizeof(rec), buf, len);
+ if (len > 0) memcpy(p+dbuf.dsize+sizeof(rec), buf, len);
dbuf.dptr = p;
dbuf.dsize += len + sizeof(rec);
@@ -187,7 +187,7 @@ BOOL message_send_pid(pid_t pid, enum message_type msg_type, void *buf, size_t l
/****************************************************************************
retrieve the next message for the current process
****************************************************************************/
-static BOOL message_recv(enum message_type *msg_type, pid_t *src, void **buf, size_t *len)
+static BOOL message_recv(int *msg_type, pid_t *src, void **buf, size_t *len)
{
TDB_DATA kbuf;
TDB_DATA dbuf;
@@ -207,10 +207,15 @@ static BOOL message_recv(enum message_type *msg_type, pid_t *src, void **buf, si
goto failed;
}
- (*buf) = (void *)malloc(rec.len);
- if (!(*buf)) goto failed;
+ if (rec.len > 0) {
+ (*buf) = (void *)malloc(rec.len);
+ if (!(*buf)) goto failed;
+
+ memcpy(*buf, dbuf.dptr+sizeof(rec), rec.len);
+ } else {
+ *buf = NULL;
+ }
- memcpy(*buf, dbuf.dptr+sizeof(rec), rec.len);
*len = rec.len;
*msg_type = rec.msg_type;
*src = rec.src;
@@ -236,7 +241,7 @@ so you can register multiple handlers for a message
****************************************************************************/
void message_dispatch(void)
{
- enum message_type msg_type;
+ int msg_type;
pid_t src;
void *buf;
size_t len;
@@ -258,8 +263,8 @@ void message_dispatch(void)
/****************************************************************************
register a dispatch function for a particular message type
****************************************************************************/
-void message_register(enum message_type msg_type,
- void (*fn)(enum message_type msg_type, pid_t pid, void *buf, size_t len))
+void message_register(int msg_type,
+ void (*fn)(int msg_type, pid_t pid, void *buf, size_t len))
{
struct dispatch_fns *dfn;
diff --git a/source3/nmbd/nmbd.c b/source3/nmbd/nmbd.c
index 2da879fc94..914f288001 100644
--- a/source3/nmbd/nmbd.c
+++ b/source3/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/source3/nmbd/nmbd_elections.c b/source3/nmbd/nmbd_elections.c
index be38b572f6..522e268ae7 100644
--- a/source3/nmbd/nmbd_elections.c
+++ b/source3/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/source3/nmbd/nmbd_packets.c b/source3/nmbd/nmbd_packets.c
index d1f77fe2d2..50193d5339 100644
--- a/source3/nmbd/nmbd_packets.c
+++ b/source3/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;
}
diff --git a/source3/utils/msgtest.c b/source3/utils/msgtest.c
index c0ced262d7..22d7a9a331 100644
--- a/source3/utils/msgtest.c
+++ b/source3/utils/msgtest.c
@@ -56,7 +56,7 @@
pid = atoi(argv[1]);
level = atoi(argv[2]);
- debug_message_send(pid, level);
+ message_send_pid(pid, MSG_FORCE_ELECTION, NULL, 0);
return (0);
}