r23346: Fix offline caching with XP/Vista. It was an off-by-one
[tprouty/samba.git] / source / smbd / server.c
index ca54b2471d199fa9a0a73dce9388aca84d3d28be..e95f3cf4a2b803c8a30fd5c1a77cb0d91b32a754 100644 (file)
@@ -87,10 +87,14 @@ struct messaging_context *smbd_messaging_context(void)
  What to do when smb.conf is updated.
  ********************************************************************/
 
-static void smb_conf_updated(int msg_type, struct server_id src,
-                            void *buf, size_t len, void *private_data)
+static void smb_conf_updated(struct messaging_context *msg,
+                            void *private_data,
+                            uint32_t msg_type,
+                            struct server_id server_id,
+                            DATA_BLOB *data)
 {
-       DEBUG(10,("smb_conf_updated: Got message saying smb.conf was updated. Reloading.\n"));
+       DEBUG(10,("smb_conf_updated: Got message saying smb.conf was "
+                 "updated. Reloading.\n"));
        reload_services(False);
 }
 
@@ -99,10 +103,13 @@ static void smb_conf_updated(int msg_type, struct server_id src,
  Delete a statcache entry.
  ********************************************************************/
 
-static void smb_stat_cache_delete(int msg_type, struct server_id src,
-                                 void *buf, size_t len, void *private_data)
+static void smb_stat_cache_delete(struct messaging_context *msg,
+                                 void *private_data,
+                                 uint32_t msg_tnype,
+                                 struct server_id server_id,
+                                 DATA_BLOB *data)
 {
-       const char *name = (const char *)buf;
+       const char *name = (const char *)data->data;
        DEBUG(10,("smb_stat_cache_delete: delete name %s\n", name));
        stat_cache_delete(name);
 }
@@ -150,9 +157,11 @@ static void  killkids(void)
  somewhere else.
 ****************************************************************************/
 
-static void msg_sam_sync(int UNUSED(msg_type), struct server_id UNUSED(pid),
-                        void *UNUSED(buf), size_t UNUSED(len),
-                        void *private_data)
+static void msg_sam_sync(struct messaging_context *msg,
+                        void *private_data,
+                        uint32_t msg_type,
+                        struct server_id server_id,
+                        DATA_BLOB *data)
 {
         DEBUG(10, ("** sam sync message received, ignoring\n"));
 }
@@ -162,15 +171,18 @@ static void msg_sam_sync(int UNUSED(msg_type), struct server_id UNUSED(pid),
  somewhere else.
 ****************************************************************************/
 
-static void msg_sam_repl(int msg_type, struct server_id pid,
-                        void *buf, size_t len, void *private_data)
+static void msg_sam_repl(struct messaging_context *msg,
+                        void *private_data,
+                        uint32_t msg_type,
+                        struct server_id server_id,
+                        DATA_BLOB *data)
 {
         uint32 low_serial;
 
-        if (len != sizeof(uint32))
+        if (data->length != sizeof(low_serial))
                 return;
 
-        low_serial = *((uint32 *)buf);
+        low_serial = *((uint32 *)data->data);
 
         DEBUG(3, ("received sam replication message, serial = 0x%04x\n",
                   low_serial));
@@ -196,38 +208,44 @@ static BOOL open_sockets_inetd(void)
        return True;
 }
 
-static void msg_exit_server(int msg_type, struct server_id src,
-                           void *buf, size_t len, void *private_data)
+static void msg_exit_server(struct messaging_context *msg,
+                           void *private_data,
+                           uint32_t msg_type,
+                           struct server_id server_id,
+                           DATA_BLOB *data)
 {
        DEBUG(3, ("got a SHUTDOWN message\n"));
        exit_server_cleanly(NULL);
 }
 
 #ifdef DEVELOPER
-static void msg_inject_fault(int msg_type, struct server_id src,
-                           void *buf, size_t len, void *private_data)
+static void msg_inject_fault(struct messaging_context *msg,
+                            void *private_data,
+                            uint32_t msg_type,
+                            struct server_id src,
+                            DATA_BLOB *data)
 {
        int sig;
 
-       if (len != sizeof(int)) {
+       if (data->length != sizeof(sig)) {
                
-               DEBUG(0, ("Process %llu sent bogus signal injection request\n",
-                       (unsigned long long)src.pid));
+               DEBUG(0, ("Process %s sent bogus signal injection request\n",
+                         procid_str_static(&src)));
                return;
        }
 
-       sig = *(int *)buf;
+       sig = *(int *)data->data;
        if (sig == -1) {
                exit_server("internal error injected");
                return;
        }
 
 #if HAVE_STRSIGNAL
-       DEBUG(0, ("Process %llu requested injection of signal %d (%s)\n",
-                   (unsigned long long)src.pid, sig, strsignal(sig)));
+       DEBUG(0, ("Process %s requested injection of signal %d (%s)\n",
+                 procid_str_static(&src), sig, strsignal(sig)));
 #else
-       DEBUG(0, ("Process %llu requested injection of signal %d\n",
-                   (unsigned long long)src.pid, sig));
+       DEBUG(0, ("Process %s requested injection of signal %d\n",
+                 procid_str_static(&src), sig));
 #endif
 
        kill(sys_getpid(), sig);
@@ -345,30 +363,38 @@ static BOOL open_sockets_smbd(enum smb_server_mode server_mode, const char *smb_
 
         /* Listen to messages */
 
-        message_register(MSG_SMB_SAM_SYNC, msg_sam_sync, NULL);
-        message_register(MSG_SMB_SAM_REPL, msg_sam_repl, NULL);
-        message_register(MSG_SHUTDOWN, msg_exit_server, NULL);
-        message_register(MSG_SMB_FILE_RENAME, msg_file_was_renamed, NULL);
-       message_register(MSG_SMB_CONF_UPDATED, smb_conf_updated, NULL); 
-       message_register(MSG_SMB_STAT_CACHE_DELETE, smb_stat_cache_delete,
-                        NULL);
+       messaging_register(smbd_messaging_context(), NULL,
+                          MSG_SMB_SAM_SYNC, msg_sam_sync);
+       messaging_register(smbd_messaging_context(), NULL,
+                          MSG_SMB_SAM_REPL, msg_sam_repl);
+       messaging_register(smbd_messaging_context(), NULL,
+                          MSG_SHUTDOWN, msg_exit_server);
+       messaging_register(smbd_messaging_context(), NULL,
+                          MSG_SMB_FILE_RENAME, msg_file_was_renamed);
+       messaging_register(smbd_messaging_context(), NULL,
+                          MSG_SMB_CONF_UPDATED, smb_conf_updated); 
+       messaging_register(smbd_messaging_context(), NULL,
+                          MSG_SMB_STAT_CACHE_DELETE, smb_stat_cache_delete);
+       brl_register_msgs(smbd_messaging_context());
 
 #ifdef DEVELOPER
-       message_register(MSG_SMB_INJECT_FAULT, msg_inject_fault, NULL); 
+       messaging_register(smbd_messaging_context(), NULL,
+                          MSG_SMB_INJECT_FAULT, msg_inject_fault);
 #endif
 
        /* now accept incoming connections - forking a new process
           for each incoming connection */
        DEBUG(2,("waiting for a connection\n"));
        while (1) {
-               fd_set lfds;
+               struct timeval now;
+               fd_set r_fds, w_fds;
                int num;
                
                /* Free up temporary memory from the main smbd. */
                lp_TALLOC_FREE();
 
                /* Ensure we respond to PING and DEBUG messages from the main smbd. */
-               message_dispatch();
+               message_dispatch(smbd_messaging_context());
 
                if (got_sig_cld) {
                        pid_t pid;
@@ -379,10 +405,16 @@ static BOOL open_sockets_smbd(enum smb_server_mode server_mode, const char *smb_
                        }
                }
 
-               memcpy((char *)&lfds, (char *)&listen_set, 
+               memcpy((char *)&r_fds, (char *)&listen_set, 
                       sizeof(listen_set));
+               FD_ZERO(&w_fds);
+               GetTimeOfDay(&now);
 
-               num = sys_select(maxfd+1,&lfds,NULL,NULL,
+               event_add_to_select_args(smbd_event_context(), &now,
+                                        &r_fds, &w_fds, &idle_timeout,
+                                        &maxfd);
+
+               num = sys_select(maxfd+1,&r_fds,&w_fds,NULL,
                                 timeval_is_zero(&idle_timeout) ?
                                 NULL : &idle_timeout);
                
@@ -402,6 +434,14 @@ static BOOL open_sockets_smbd(enum smb_server_mode server_mode, const char *smb_
                        continue;
                }
 
+               if (run_events(smbd_event_context(), num, &r_fds, &w_fds)) {
+                       continue;
+               }
+
+#if 0
+               Deactivated for now, this needs to become a timed event
+               vl
+
                /* If the idle timeout fired and we don't have any connected
                 * users, exit gracefully. We should be running under a process
                 * controller that will restart us if necessry.
@@ -409,6 +449,7 @@ static BOOL open_sockets_smbd(enum smb_server_mode server_mode, const char *smb_
                if (num == 0 && count_all_current_connections() == 0) {
                        exit_server_cleanly("idle timeout");
                }
+#endif
 
                /* check if we need to reload services */
                check_reload(time(NULL));
@@ -422,11 +463,11 @@ static BOOL open_sockets_smbd(enum smb_server_mode server_mode, const char *smb_
 
                        s = -1;
                        for(i = 0; i < num_sockets; i++) {
-                               if(FD_ISSET(fd_listenset[i],&lfds)) {
+                               if(FD_ISSET(fd_listenset[i],&r_fds)) {
                                        s = fd_listenset[i];
                                        /* Clear this so we don't look
                                           at it again. */
-                                       FD_CLR(fd_listenset[i],&lfds);
+                                       FD_CLR(fd_listenset[i],&r_fds);
                                        break;
                                }
                        }
@@ -967,7 +1008,8 @@ extern void build_options(BOOL screen);
        }
 
        /* Setup all the TDB's - including CLEAR_IF_FIRST tdb's. */
-       if (!message_init())
+
+       if (smbd_messaging_context() == NULL)
                exit(1);
 
        /* Initialise the password backed before the global_sam_sid
@@ -1005,7 +1047,7 @@ extern void build_options(BOOL screen);
                 exit(1);
 #endif
 
-       if (!print_backend_init())
+       if (!print_backend_init(smbd_messaging_context()))
                exit(1);
 
        if (!init_guest_info()) {
@@ -1016,7 +1058,7 @@ extern void build_options(BOOL screen);
        /* Setup the main smbd so that we can get messages. */
        /* don't worry about general printing messages here */
 
-       claim_connection(NULL,"",0,True,FLAG_MSG_GENERAL|FLAG_MSG_SMBD);
+       claim_connection(NULL,"",FLAG_MSG_GENERAL|FLAG_MSG_SMBD);
 
        /* only start the background queue daemon if we are 
           running as a daemon -- bad things will happen if
@@ -1071,7 +1113,8 @@ extern void build_options(BOOL screen);
        initialize_async_io_handler();
 
        /* register our message handlers */
-       message_register(MSG_SMB_FORCE_TDIS, msg_force_tdis, NULL);
+       messaging_register(smbd_messaging_context(), NULL,
+                          MSG_SMB_FORCE_TDIS, msg_force_tdis);
 
        if ((lp_keepalive() != 0)
            && !(event_add_idle(smbd_event_context(), NULL,