- changed the msg_type to be an int instead of an enum so that it is
authorAndrew Tridgell <tridge@samba.org>
Tue, 12 Sep 2000 06:13:25 +0000 (06:13 +0000)
committerAndrew Tridgell <tridge@samba.org>
Tue, 12 Sep 2000 06:13:25 +0000 (06:13 +0000)
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
(This used to be commit f1c49ca7ce56bc39259041a71479e84ebf53eeca)

source3/include/messages.h
source3/include/proto.h
source3/lib/debug.c
source3/lib/messages.c
source3/nmbd/nmbd.c
source3/nmbd/nmbd_elections.c
source3/nmbd/nmbd_packets.c
source3/utils/msgtest.c

index 4bc4014ca0e1967b7443bd190f727702a6c6080c..6ab21e7433300e87e7bfc214f4be92b0c72bd338 100644 (file)
 #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
index f12f7e1570b5b031eecd0d20663d8bbb6e01c338..4fc539ef6eb9de00061ef010ce31ea757da748ad 100644 (file)
@@ -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  */
 
index e67aea7fd3e26bf6a4d2b1d86d0b1d0795f77f7b..1a53f4c2a82e42deaa05b2b2a6a16e085ace4d6b 100644 (file)
@@ -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));
index bbda5d71ed144037df136874a0f5fda2543eba87..927cb095ddf8b0420a7c52ce4d1379fc5e1c27be 100644 (file)
@@ -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;
 
index 2da879fc94332acb104c3d98733a241558b0573f..914f288001d84775a935fc36f458c025439f8daa 100644 (file)
@@ -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 ) );
 
index be38b572f666687667f19f294c0196b563f7ef4d..522e268ae7174da74dbf0bde7d2a442d3a8d0d6e 100644 (file)
@@ -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;
+                       }
+               }
+       }
+}
index d1f77fe2d22efcadb7ae00a703b6a68c61ef2dee..50193d533956b135d3be6e1dc243c75f2daf99d5 100644 (file)
@@ -1758,14 +1758,6 @@ only use %d.\n", (count*2) + 2, FD_SETSIZE));
   return False;
 }
 
-/****************************************************************************
-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;
   }
 
index c0ced262d7680f0c699c71bd15bf739a2ac2f60e..22d7a9a331d7a34a917c560f246fbd9c616454e8 100644 (file)
@@ -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);
 }