trying to get HEAD building again. If you want the code
[gd/samba-autobuild/.git] / source3 / nsswitch / winbindd.c
index 0f34924e9da32e1a3dd117b5928226887554f5a5..0860d701d868672d0b10c5bcb5c665814ac56d82 100644 (file)
 #include "winbindd.h"
 
 BOOL opt_nocache = False;
-BOOL opt_dual_daemon = False;
+BOOL opt_dual_daemon = True;
+
+/*****************************************************************************
+ stubb functions 
+****************************************************************************/
+
+void become_root( void )
+{
+       return;
+}
+
+void unbecome_root( void )
+{
+       return;
+}
 
 /* Reload configuration */
 
@@ -52,24 +66,6 @@ static BOOL reload_services_file(BOOL test)
        return(ret);
 }
 
-/*******************************************************************
- Print out all talloc memory info.
-********************************************************************/
-
-void return_all_talloc_info(int msg_type, pid_t src_pid, void *buf, size_t len)
-{
-       TALLOC_CTX *ctx = talloc_init("info context");
-       char *info = NULL;
-
-       if (!ctx)
-               return;
-
-       info = talloc_describe_all(ctx);
-       if (info)
-               DEBUG(10,(info));
-       message_send_pid(src_pid, MSG_TALLOC_USAGE, info, info ? strlen(info) + 1: 0, True);
-       talloc_destroy(ctx);
-}
 
 #if DUMP_CORE
 
@@ -147,7 +143,6 @@ static void winbindd_status(void)
 static void print_winbindd_status(void)
 {
        winbindd_status();
-       winbindd_idmap_status();
        winbindd_cm_status();
 }
 
@@ -155,8 +150,17 @@ static void print_winbindd_status(void)
 
 static void flush_caches(void)
 {
+#if 0
        /* Clear cached user and group enumation info */        
-       wcache_flush_cache();
+       if (!opt_dual_daemon) /* Until we have coherent cache flush. */
+               wcache_flush_cache();
+#endif
+
+       /* We need to invalidate cached user list entries on a SIGHUP 
+           otherwise cached access denied errors due to restrict anonymous
+           hang around until the sequence number changes. */
+
+       wcache_invalidate_cache();
 }
 
 /* Handle the signal by unlinking socket and exiting */
@@ -165,7 +169,7 @@ static void terminate(void)
 {
        pstring path;
 
-       winbindd_idmap_close();
+       idmap_close();
        
        /* Remove socket file */
        snprintf(path, sizeof(path), "%s/%s", 
@@ -198,6 +202,20 @@ static void sighup_handler(int signum)
        sys_select_signal();
 }
 
+/* React on 'smbcontrol winbindd reload-config' in the same way as on SIGHUP*/
+static void msg_reload_services(int msg_type, pid_t src, void *buf, size_t len)
+{
+        /* Flush various caches */
+       flush_caches();
+       reload_services_file(True);
+}
+
+/* React on 'smbcontrol winbindd shutdown' in the same way as on SIGTERM*/
+static void msg_shutdown(int msg_type, pid_t src, void *buf, size_t len)
+{
+       terminate();
+}
+
 struct dispatch_table {
        enum winbindd_cmd cmd;
        enum winbindd_result (*fn)(struct winbindd_cli_state *state);
@@ -265,7 +283,16 @@ static struct dispatch_table dispatch_table[] = {
 
        { WINBINDD_WINS_BYNAME, winbindd_wins_byname, "WINS_BYNAME" },
        { WINBINDD_WINS_BYIP, winbindd_wins_byip, "WINS_BYIP" },
-
+       
+       /* UNIX account management functions */
+       { WINBINDD_CREATE_USER,                 winbindd_create_user,           "CREATE_USER"           },
+       { WINBINDD_CREATE_GROUP,                winbindd_create_group,          "CREATE_GROUP"          },
+       { WINBINDD_ADD_USER_TO_GROUP,           winbindd_add_user_to_group,     "ADD_USER_TO_GROUP"     },
+       { WINBINDD_REMOVE_USER_FROM_GROUP,      winbindd_remove_user_from_group,"REMOVE_USER_FROM_GROUP"},
+       { WINBINDD_SET_USER_PRIMARY_GROUP,      winbindd_set_user_primary_group,"SET_USER_PRIMARY_GROUP"},
+       { WINBINDD_DELETE_USER,                 winbindd_delete_user,           "DELETE_USER"           },
+       { WINBINDD_DELETE_GROUP,                winbindd_delete_group,          "DELETE_GROUP"          },
+       
        /* End of list */
 
        { WINBINDD_NUM_CMDS, NULL, "NONE" }
@@ -306,7 +333,7 @@ static void process_request(struct winbindd_cli_state *state)
 
 /* Process a new connection by adding it to the client connection list */
 
-static void new_connection(int listen_sock, BOOL privilaged)
+static void new_connection(int listen_sock, BOOL privileged)
 {
        struct sockaddr_un sunaddr;
        struct winbindd_cli_state *state;
@@ -337,7 +364,7 @@ static void new_connection(int listen_sock, BOOL privilaged)
 
        state->last_access = time(NULL);        
 
-       state->privilaged = privilaged;
+       state->privileged = privileged;
 
        /* Add to connection list */
        
@@ -658,7 +685,7 @@ static void process_loop(void)
                                                break;
                                        }
                                }
-                               /* new, non-privilaged connection */
+                               /* new, non-privileged connection */
                                new_connection(listen_sock, False);
                        }
             
@@ -672,7 +699,7 @@ static void process_loop(void)
                                                break;
                                        }
                                }
-                               /* new, privilaged connection */
+                               /* new, privileged connection */
                                new_connection(listen_priv_sock, True);
                        }
             
@@ -734,11 +761,8 @@ static void process_loop(void)
                if (do_sighup) {
 
                        DEBUG(3, ("got SIGHUP\n"));
-                        /* Flush various caches */
 
-                       flush_caches();
-                       reload_services_file(True);
+                       msg_reload_services(MSG_SMB_CONF_UPDATED, (pid_t) 0, NULL, 0);
                        do_sighup = False;
                }
 
@@ -749,59 +773,6 @@ static void process_loop(void)
        }
 }
 
-
-/*
-  these are split out from the main winbindd for use by the background daemon
- */
-BOOL winbind_setup_common(void)
-{
-       load_interfaces();
-
-       if (!secrets_init()) {
-
-               DEBUG(0,("Could not initialize domain trust account secrets. Giving up\n"));
-               return False;
-       }
-
-       namecache_enable();     /* Enable netbios namecache */
-
-       /* Check winbindd parameters are valid */
-
-       ZERO_STRUCT(server_state);
-
-       if (!winbindd_param_init())
-               return False;
-
-       /* Winbind daemon initialisation */
-
-       if (!winbindd_idmap_init())
-               return False;
-
-       /* Unblock all signals we are interested in as they may have been
-          blocked by the parent process. */
-
-       BlockSignals(False, SIGINT);
-       BlockSignals(False, SIGQUIT);
-       BlockSignals(False, SIGTERM);
-       BlockSignals(False, SIGUSR1);
-       BlockSignals(False, SIGUSR2);
-       BlockSignals(False, SIGHUP);
-
-       /* Setup signal handlers */
-       
-       CatchSignal(SIGINT, termination_handler);      /* Exit on these sigs */
-       CatchSignal(SIGQUIT, termination_handler);
-       CatchSignal(SIGTERM, termination_handler);
-
-       CatchSignal(SIGPIPE, SIG_IGN);                 /* Ignore sigpipe */
-
-       CatchSignal(SIGUSR2, sigusr2_handler);         /* Debugging sigs */
-       CatchSignal(SIGHUP, sighup_handler);
-
-       return True;
-}
-
-
 /* Main function */
 
 struct winbindd_state server_state;   /* Server state information */
@@ -817,10 +788,9 @@ int main(int argc, char **argv)
                { "stdout", 'S', POPT_ARG_VAL, &log_stdout, True, "Log to stdout" },
                { "foreground", 'F', POPT_ARG_VAL, &Fork, False, "Daemon in foreground mode" },
                { "interactive", 'i', POPT_ARG_NONE, NULL, 'i', "Interactive mode" },
-               { "dual-daemon", 'B', POPT_ARG_VAL, &opt_dual_daemon, True, "Dual daemon mode" },
+               { "single-daemon", 'Y', POPT_ARG_VAL, &opt_dual_daemon, False, "Single daemon mode" },
                { "no-caching", 'n', POPT_ARG_VAL, &opt_nocache, False, "Disable caching" },
                POPT_COMMON_SAMBA
-               POPT_COMMON_CONNECTION
                POPT_TABLEEND
        };
        poptContext pc;
@@ -874,7 +844,7 @@ int main(int argc, char **argv)
        reopen_logs();
 
        DEBUG(1, ("winbindd version %s started.\n", VERSION ) );
-       DEBUGADD( 1, ( "Copyright The Samba Team 2000-2001\n" ) );
+       DEBUGADD( 1, ( "Copyright The Samba Team 2000-2003\n" ) );
 
        if (!reload_services_file(False)) {
                DEBUG(0, ("error opening config file\n"));
@@ -886,11 +856,58 @@ int main(int argc, char **argv)
        if (!init_names())
                exit(1);
 
-       if (!interactive) {
-               become_daemon(Fork);
-               pidfile_create("winbindd");
+       load_interfaces();
+
+       if (!secrets_init()) {
+
+               DEBUG(0,("Could not initialize domain trust account secrets. Giving up\n"));
+               return False;
        }
 
+       /* Enable netbios namecache */
+
+       namecache_enable();
+
+       /* Check winbindd parameters are valid */
+
+       ZERO_STRUCT(server_state);
+
+       if (!winbindd_param_init())
+               return 1;
+
+       /* Winbind daemon initialisation */
+
+       if (!winbindd_upgrade_idmap())
+               return 1;
+
+       if (!idmap_init(lp_idmap_backend()))
+               return 1;
+
+       /* Unblock all signals we are interested in as they may have been
+          blocked by the parent process. */
+
+       BlockSignals(False, SIGINT);
+       BlockSignals(False, SIGQUIT);
+       BlockSignals(False, SIGTERM);
+       BlockSignals(False, SIGUSR1);
+       BlockSignals(False, SIGUSR2);
+       BlockSignals(False, SIGHUP);
+
+       /* Setup signal handlers */
+       
+       CatchSignal(SIGINT, termination_handler);      /* Exit on these sigs */
+       CatchSignal(SIGQUIT, termination_handler);
+       CatchSignal(SIGTERM, termination_handler);
+
+       CatchSignal(SIGPIPE, SIG_IGN);                 /* Ignore sigpipe */
+
+       CatchSignal(SIGUSR2, sigusr2_handler);         /* Debugging sigs */
+       CatchSignal(SIGHUP, sighup_handler);
+
+       if (!interactive)
+               become_daemon(Fork);
+
+       pidfile_create("winbindd");
 
 #if HAVE_SETPGID
        /*
@@ -901,10 +918,6 @@ int main(int argc, char **argv)
                setpgid( (pid_t)0, (pid_t)0);
 #endif
 
-       if (!winbind_setup_common()) {
-               return 1;
-       }
-
        if (opt_dual_daemon) {
                do_dual_daemon();
        }
@@ -915,16 +928,21 @@ int main(int argc, char **argv)
                DEBUG(0, ("unable to initialise messaging system\n"));
                exit(1);
        }
+       
+       /* React on 'smbcontrol winbindd reload-config' in the same way
+          as to SIGHUP signal */
+       message_register(MSG_SMB_CONF_UPDATED, msg_reload_services);
+       message_register(MSG_SHUTDOWN, msg_shutdown);
+       
        poptFreeContext(pc);
 
-       register_msg_pool_usage();
-       message_register(MSG_REQ_TALLOC_USAGE, return_all_talloc_info);
-
+       netsamlogon_cache_init(); /* Non-critical */
+       
        /* Loop waiting for requests */
 
        process_loop();
 
        trustdom_cache_shutdown();
-       uni_group_cache_shutdown();
+
        return 0;
 }