[GLUE] Rsync SAMBA_3_2_0 SVN r25598 in order to create the v3-2-test branch.
[samba.git] / source / nmbd / nmbd.c
index 46f209872b03555d4bad081affa96b9e85f12dad..dc03506194b278f422ab59ac2133675e8fec4149 100644 (file)
@@ -7,7 +7,7 @@
    
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
    
    This program is distributed in the hope that it will be useful,
    (at your option) any later version.
    
    This program is distributed in the hope that it will be useful,
@@ -16,8 +16,7 @@
    GNU General Public License for more details.
    
    You should have received a copy of the GNU General Public License
    GNU General Public License for more details.
    
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
    
 */
 
    
 */
 
@@ -49,6 +48,27 @@ BOOL found_lm_clients = False;
 
 time_t StartupTime = 0;
 
 
 time_t StartupTime = 0;
 
+struct event_context *nmbd_event_context(void)
+{
+       static struct event_context *ctx;
+
+       if (!ctx && !(ctx = event_context_init(NULL))) {
+               smb_panic("Could not init nmbd event context");
+       }
+       return ctx;
+}
+
+struct messaging_context *nmbd_messaging_context(void)
+{
+       static struct messaging_context *ctx;
+
+       if (!ctx && !(ctx = messaging_init(NULL, server_id_self(),
+                                          nmbd_event_context()))) {
+               smb_panic("Could not init nmbd messaging context");
+       }
+       return ctx;
+}
+
 /**************************************************************************** **
  Handle a SIGTERM in band.
  **************************************************************************** */
 /**************************************************************************** **
  Handle a SIGTERM in band.
  **************************************************************************** */
@@ -76,8 +96,11 @@ static void terminate(void)
  Handle a SHUTDOWN message from smbcontrol.
  **************************************************************************** */
 
  Handle a SHUTDOWN message from smbcontrol.
  **************************************************************************** */
 
-static void nmbd_terminate(int msg_type, struct process_id src,
-                          void *buf, size_t len, void *private_data)
+static void nmbd_terminate(struct messaging_context *msg,
+                          void *private_data,
+                          uint32_t msg_type,
+                          struct server_id server_id,
+                          DATA_BLOB *data)
 {
        terminate();
 }
 {
        terminate();
 }
@@ -271,33 +294,39 @@ static BOOL reload_nmbd_services(BOOL test)
  * detects that there are no subnets.
  **************************************************************************** */
 
  * detects that there are no subnets.
  **************************************************************************** */
 
-static void msg_reload_nmbd_services(int msg_type, struct process_id src,
-                                    void *buf, size_t len, void *private_data)
+static void msg_reload_nmbd_services(struct messaging_context *msg,
+                                    void *private_data,
+                                    uint32_t msg_type,
+                                    struct server_id server_id,
+                                    DATA_BLOB *data)
 {
        write_browse_list( 0, True );
        dump_all_namelists();
        reload_nmbd_services( True );
        reopen_logs();
        
 {
        write_browse_list( 0, True );
        dump_all_namelists();
        reload_nmbd_services( True );
        reopen_logs();
        
-       if(buf) {
+       if (data->data) {
                /* We were called from process() */
                /* If reload_interfaces() returned True */
                /* we need to shutdown if there are no subnets... */
                /* pass this info back to process() */
                /* We were called from process() */
                /* If reload_interfaces() returned True */
                /* we need to shutdown if there are no subnets... */
                /* pass this info back to process() */
-               *((BOOL*)buf) = reload_interfaces(0);  
+               *((BOOL*)data->data) = reload_interfaces(0);  
        }
 }
 
        }
 }
 
-static void msg_nmbd_send_packet(int msg_type, struct process_id src,
-                                void *buf, size_t len, void *private_data)
+static void msg_nmbd_send_packet(struct messaging_context *msg,
+                                void *private_data,
+                                uint32_t msg_type,
+                                struct server_id src,
+                                DATA_BLOB *data)
 {
 {
-       struct packet_struct *p = (struct packet_struct *)buf;
+       struct packet_struct *p = (struct packet_struct *)data->data;
        struct subnet_record *subrec;
        struct in_addr *local_ip;
 
        DEBUG(10, ("Received send_packet from %d\n", procid_to_pid(&src)));
 
        struct subnet_record *subrec;
        struct in_addr *local_ip;
 
        DEBUG(10, ("Received send_packet from %d\n", procid_to_pid(&src)));
 
-       if (len != sizeof(struct packet_struct)) {
+       if (data->length != sizeof(struct packet_struct)) {
                DEBUG(2, ("Discarding invalid packet length from %d\n",
                          procid_to_pid(&src)));
                return;
                DEBUG(2, ("Discarding invalid packet length from %d\n",
                          procid_to_pid(&src)));
                return;
@@ -352,10 +381,11 @@ static void process(void)
 
        while( True ) {
                time_t t = time(NULL);
 
        while( True ) {
                time_t t = time(NULL);
+               TALLOC_CTX *frame = talloc_stackframe();
 
                /* Check for internal messages */
 
 
                /* Check for internal messages */
 
-               message_dispatch();
+               message_dispatch(nmbd_messaging_context());
 
                /*
                 * Check all broadcast subnets to see if
 
                /*
                 * Check all broadcast subnets to see if
@@ -370,8 +400,10 @@ static void process(void)
                 * (nmbd_packets.c)
                 */
 
                 * (nmbd_packets.c)
                 */
 
-               if(listen_for_packets(run_election))
+               if(listen_for_packets(run_election)) {
+                       TALLOC_FREE(frame);
                        return;
                        return;
+               }
 
                /*
                 * Handle termination inband.
 
                /*
                 * Handle termination inband.
@@ -556,21 +588,29 @@ static void process(void)
                 */
 
                if(reload_after_sighup) {
                 */
 
                if(reload_after_sighup) {
+                       DATA_BLOB blob = data_blob_const(&no_subnets,
+                                                        sizeof(no_subnets));
                        DEBUG( 0, ( "Got SIGHUP dumping debug info.\n" ) );
                        DEBUG( 0, ( "Got SIGHUP dumping debug info.\n" ) );
-                       msg_reload_nmbd_services(MSG_SMB_CONF_UPDATED,
-                                                pid_to_procid(0), (void*) &no_subnets, 0, NULL);
-                       if(no_subnets)
+                       msg_reload_nmbd_services(nmbd_messaging_context(),
+                                                NULL, MSG_SMB_CONF_UPDATED,
+                                                procid_self(), &blob);
+
+                       if(no_subnets) {
+                               TALLOC_FREE(frame);
                                return;
                                return;
+                       }
                        reload_after_sighup = 0;
                }
 
                /* check for new network interfaces */
 
                        reload_after_sighup = 0;
                }
 
                /* check for new network interfaces */
 
-               if(reload_interfaces(t))
+               if(reload_interfaces(t)) {
+                       TALLOC_FREE(frame);
                        return;
                        return;
+               }
 
                /* free up temp memory */
 
                /* free up temp memory */
-                       lp_TALLOC_FREE();
+               TALLOC_FREE(frame);
        }
 }
 
        }
 }
 
@@ -626,6 +666,7 @@ static BOOL open_sockets(BOOL isdaemon, int port)
        poptContext pc;
        static char *p_lmhosts = dyn_LMHOSTSFILE;
        static BOOL no_process_group = False;
        poptContext pc;
        static char *p_lmhosts = dyn_LMHOSTSFILE;
        static BOOL no_process_group = False;
+       int opt;
        struct poptOption long_options[] = {
        POPT_AUTOHELP
        {"daemon", 'D', POPT_ARG_VAL, &is_daemon, True, "Become a daemon(default)" },
        struct poptOption long_options[] = {
        POPT_AUTOHELP
        {"daemon", 'D', POPT_ARG_VAL, &is_daemon, True, "Become a daemon(default)" },
@@ -644,7 +685,15 @@ static BOOL open_sockets(BOOL isdaemon, int port)
        global_nmb_port = NMB_PORT;
 
        pc = poptGetContext("nmbd", argc, argv, long_options, 0);
        global_nmb_port = NMB_PORT;
 
        pc = poptGetContext("nmbd", argc, argv, long_options, 0);
-       while (poptGetNextOpt(pc) != -1) {};
+       while ((opt = poptGetNextOpt(pc)) != -1) {
+               switch (opt) {
+               default:
+                       d_fprintf(stderr, "\nInvalid option %s: %s\n\n",
+                                 poptBadOption(pc, 0), poptStrerror(opt));
+                       poptPrintUsage(pc, stderr, 0);
+                       exit(1);
+               }
+       };
        poptFreeContext(pc);
 
        global_in_nmbd = True;
        poptFreeContext(pc);
 
        global_in_nmbd = True;
@@ -731,6 +780,10 @@ static BOOL open_sockets(BOOL isdaemon, int port)
                setpgid( (pid_t)0, (pid_t)0 );
 #endif
 
                setpgid( (pid_t)0, (pid_t)0 );
 #endif
 
+       if (nmbd_messaging_context() == NULL) {
+               return 1;
+       }
+
 #ifndef SYNC_DNS
        /* Setup the async dns. We do it here so it doesn't have all the other
                stuff initialised and thus chewing memory and sockets */
 #ifndef SYNC_DNS
        /* Setup the async dns. We do it here so it doesn't have all the other
                stuff initialised and thus chewing memory and sockets */
@@ -744,15 +797,19 @@ static BOOL open_sockets(BOOL isdaemon, int port)
        }
 
        pidfile_create("nmbd");
        }
 
        pidfile_create("nmbd");
-       message_init();
-       message_register(MSG_FORCE_ELECTION, nmbd_message_election, NULL);
+       messaging_register(nmbd_messaging_context(), NULL,
+                          MSG_FORCE_ELECTION, nmbd_message_election);
 #if 0
        /* Until winsrepl is done. */
 #if 0
        /* Until winsrepl is done. */
-       message_register(MSG_WINS_NEW_ENTRY, nmbd_wins_new_entry, NULL);
+       messaging_register(nmbd_messaging_context(), NULL,
+                          MSG_WINS_NEW_ENTRY, nmbd_wins_new_entry);
 #endif
 #endif
-       message_register(MSG_SHUTDOWN, nmbd_terminate, NULL);
-       message_register(MSG_SMB_CONF_UPDATED, msg_reload_nmbd_services, NULL);
-       message_register(MSG_SEND_PACKET, msg_nmbd_send_packet, NULL);
+       messaging_register(nmbd_messaging_context(), NULL,
+                          MSG_SHUTDOWN, nmbd_terminate);
+       messaging_register(nmbd_messaging_context(), NULL,
+                          MSG_SMB_CONF_UPDATED, msg_reload_nmbd_services);
+       messaging_register(nmbd_messaging_context(), NULL,
+                          MSG_SEND_PACKET, msg_nmbd_send_packet);
 
        TimeInit();
 
 
        TimeInit();