r13658: More moving around of files:
[bbaumbach/samba-autobuild/.git] / source4 / param / loadparm.c
index 361450821a65ea13915d208c9f464a0f0788b72e..8fc061b53fdbb8910a1e698a5d3e86dd44cb4f63 100644 (file)
  */
 
 #include "includes.h"
+#include "smb.h"
 #include "version.h"
 #include "dynconfig.h"
 #include "pstring.h"
 #include "system/time.h"
 #include "system/iconv.h"
-#include "system/network.h"
-#include "system/printing.h"
 #include "librpc/gen_ndr/ndr_svcctl.h"
 #include "librpc/gen_ndr/ndr_samr.h"
-#include "librpc/gen_ndr/ndr_nbt.h"
+#include "smb_server/smb_server.h"
+#include "libcli/raw/signing.h"
 #include "dlinklist.h"
 #include "param/loadparm.h"
 
 static BOOL bLoaded = False;
 
-#ifndef GLOBAL_NAME
-#define GLOBAL_NAME "global"
-#endif
-
-#ifndef PRINTERS_NAME
-#define PRINTERS_NAME "printers"
-#endif
-
-#ifndef HOMES_NAME
-#define HOMES_NAME "homes"
-#endif
-
 /* some helpful bits */
 #define LP_SNUM_OK(i) (((i) >= 0) && ((i) < iNumServices) && ServicePtrs[(i)]->valid)
 #define VALID(i) ServicePtrs[i]->valid
@@ -141,6 +129,7 @@ typedef struct
        char **server_services;
        char *ntptr_providor;
        char *szWinbindSeparator;
+       char *szWinbinddSocketDirectory;
        BOOL bWinbindSealedPipes;
        char *swat_directory;
        BOOL tls_enabled;
@@ -167,6 +156,8 @@ typedef struct
        int web_port;
        char *socket_options;
        BOOL bWINSsupport;
+       BOOL bWINSdnsProxy;
+       char *szWINSHook; 
        BOOL bLocalMaster;
        BOOL bPreferredMaster;
        BOOL bEncryptPasswords;
@@ -522,6 +513,8 @@ static struct parm_struct parm_table[] = {
        
        {"wins server", P_LIST, P_GLOBAL, &Globals.szWINSservers, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD | FLAG_DEVELOPER},
        {"wins support", P_BOOL, P_GLOBAL, &Globals.bWINSsupport, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD | FLAG_DEVELOPER},
+       {"dns proxy", P_BOOL, P_GLOBAL, &Globals.bWINSdnsProxy, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD | FLAG_DEVELOPER},
+       {"wins hook", P_STRING, P_GLOBAL, &Globals.szWINSHook, NULL, NULL, FLAG_ADVANCED}, 
 
        {"Locking Options", P_SEP, P_SEPARATOR},
        
@@ -555,6 +548,7 @@ static struct parm_struct parm_table[] = {
        {"msdfs root", P_BOOL, P_LOCAL, &sDefault.bMSDfsRoot, NULL, NULL, FLAG_SHARE},
        {"host msdfs", P_BOOL, P_GLOBAL, &Globals.bHostMSDfs, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
        {"winbind separator", P_STRING, P_GLOBAL, &Globals.szWinbindSeparator, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER },
+       {"winbindd socket directory", P_STRING, P_GLOBAL, &Globals.szWinbinddSocketDirectory, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER },
        {"winbind sealed pipes", P_BOOL, P_GLOBAL, &Globals.bWinbindSealedPipes, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER },
 
        {NULL, P_BOOL, P_NONE, NULL, NULL, NULL, 0}
@@ -609,7 +603,7 @@ static void init_globals(void)
        do_parameter("max connections", "-1", NULL);
 
        do_parameter("dcerpc endpoint servers", "epmapper srvsvc wkssvc rpcecho samr netlogon lsarpc spoolss drsuapi winreg dssetup", NULL);
-       do_parameter("server services", "smb rpc nbt wrepl ldap cldap web kdc", NULL);
+       do_parameter("server services", "smb rpc nbt wrepl ldap cldap web kdc winbind", NULL);
        do_parameter("ntptr providor", "simple_ldb", NULL);
        do_parameter("auth methods", "anonymous sam_ignoredomain", NULL);
        do_parameter("private dir", dyn_PRIVATE_DIR, NULL);
@@ -675,10 +669,12 @@ static void init_globals(void)
        do_parameter("PreferredMaster", "Auto", NULL);
        do_parameter("LocalMaster", "True", NULL);
 
-       do_parameter("WINSsupport", "False", NULL);
+       do_parameter("wins support", "False", NULL);
+       do_parameter("dns proxy", "True", NULL);
 
        do_parameter("winbind separator", "\\", NULL);
        do_parameter("winbind sealed pipes", "True", NULL);
+       do_parameter("winbindd socket directory", dyn_WINBINDD_SOCKET_DIR, NULL);
 
        do_parameter("client signing", "Yes", NULL);
        do_parameter("server signing", "auto", NULL);
@@ -703,8 +699,14 @@ static void init_globals(void)
        do_parameter("tls keyfile", "tls/key.pem", NULL);
        do_parameter("tls certfile", "tls/cert.pem", NULL);
        do_parameter("tls cafile", "tls/ca.pem", NULL);
-       do_parameter_var("js include", "%s/js", dyn_LIBDIR);
-       do_parameter_var("setup directory", "%s/setup", dyn_LIBDIR);
+       do_parameter_var("js include", "%s", dyn_JSDIR);
+       do_parameter_var("setup directory", "%s", dyn_SETUPDIR);
+
+       for (i = 0; parm_table[i].label; i++) {
+               if (!(parm_table[i].flags & FLAG_CMDLINE)) {
+                       parm_table[i].flags |= FLAG_DEFAULT;
+               }
+       }
 }
 
 static TALLOC_CTX *lp_talloc;
@@ -823,6 +825,7 @@ FN_GLOBAL_STRING(lp_spoolss_url, &Globals.szSPOOLSS_URL)
 FN_GLOBAL_STRING(lp_wins_config_url, &Globals.szWINS_CONFIG_URL)
 FN_GLOBAL_STRING(lp_wins_url, &Globals.szWINS_URL)
 FN_GLOBAL_CONST_STRING(lp_winbind_separator, &Globals.szWinbindSeparator)
+FN_GLOBAL_CONST_STRING(lp_winbindd_socket_directory, &Globals.szWinbinddSocketDirectory)
 FN_GLOBAL_BOOL(lp_winbind_sealed_pipes, &Globals.bWinbindSealedPipes)
 FN_GLOBAL_STRING(lp_private_dir, &Globals.szPrivateDir)
 FN_GLOBAL_STRING(lp_serverstring, &Globals.szServerString)
@@ -850,6 +853,8 @@ FN_GLOBAL_STRING(lp_panic_action, &Globals.szPanicAction)
 
 FN_GLOBAL_BOOL(lp_disable_netbios, &Globals.bDisableNetbios)
 FN_GLOBAL_BOOL(lp_wins_support, &Globals.bWINSsupport)
+FN_GLOBAL_BOOL(lp_wins_dns_proxy, &Globals.bWINSdnsProxy)
+FN_GLOBAL_STRING(lp_wins_hook, &Globals.szWINSHook)
 FN_GLOBAL_BOOL(lp_local_master, &Globals.bLocalMaster)
 FN_GLOBAL_BOOL(lp_readraw, &Globals.bReadRaw)
 FN_GLOBAL_BOOL(lp_large_readwrite, &Globals.bLargeReadwrite)
@@ -913,7 +918,6 @@ FN_GLOBAL_INTEGER(lp_client_signing, &Globals.client_signing)
 /* local prototypes */
 
 static int map_parameter(const char *pszParmName);
-static BOOL set_boolean(BOOL *pb, const char *pszParmValue);
 static int getservicebyname(const char *pszServiceName,
                            service * pserviceDest);
 static void copy_service(service * pserviceDest,
@@ -1005,7 +1009,7 @@ static BOOL lp_bool(const char *s)
                return False;
        }
        
-       if (!set_boolean(&ret,s)) {
+       if (!set_boolean(s, &ret)) {
                DEBUG(0,("lp_bool(%s): value is not boolean!\n",s));
                return False;
        }
@@ -1374,34 +1378,6 @@ void *lp_parm_ptr(int snum, struct parm_struct *parm)
        return ((char *)ServicePtrs[snum]) + PTR_DIFF(parm->ptr, &sDefault);
 }
 
-/***************************************************************************
- Set a boolean variable from the text value stored in the passed string.
- Returns True in success, False if the passed string does not correctly 
- represent a boolean.
-***************************************************************************/
-
-static BOOL set_boolean(BOOL *pb, const char *pszParmValue)
-{
-       BOOL bRetval;
-
-       bRetval = True;
-       if (strwicmp(pszParmValue, "yes") == 0 ||
-           strwicmp(pszParmValue, "true") == 0 ||
-           strwicmp(pszParmValue, "1") == 0)
-               *pb = True;
-       else if (strwicmp(pszParmValue, "no") == 0 ||
-                   strwicmp(pszParmValue, "False") == 0 ||
-                   strwicmp(pszParmValue, "0") == 0)
-               *pb = False;
-       else {
-               DEBUG(0,
-                     ("ERROR: Badly formed boolean in configuration file: \"%s\".\n",
-                      pszParmValue));
-               bRetval = False;
-       }
-       return (bRetval);
-}
-
 /***************************************************************************
 Find a service by name. Otherwise works like get_service.
 ***************************************************************************/
@@ -1842,7 +1818,10 @@ BOOL lp_do_parameter(int snum, const char *pszParmName, const char *pszParmValue
        switch (parm_table[parmnum].type)
        {
                case P_BOOL:
-                       set_boolean(parm_ptr, pszParmValue);
+                       if (!set_boolean(pszParmValue, parm_ptr)) {
+                               DEBUG(0,("lp_do_parameter(%s): value is not boolean!\n", pszParmValue));
+                               return False;
+                       }
                        break;
 
                case P_INTEGER:
@@ -1884,6 +1863,17 @@ BOOL lp_do_parameter(int snum, const char *pszParmName, const char *pszParmValue
                        break;
        }
 
+       if (parm_table[parmnum].flags & FLAG_DEFAULT) {
+               parm_table[parmnum].flags &= ~FLAG_DEFAULT;
+               /* we have to also unset FLAG_DEFAULT on aliases */
+               for (i=parmnum-1;i>=0 && parm_table[i].ptr == parm_table[parmnum].ptr;i--) {
+                       parm_table[i].flags &= ~FLAG_DEFAULT;
+               }
+               for (i=parmnum+1;i<NUMPARAMETERS && parm_table[i].ptr == parm_table[parmnum].ptr;i++) {
+                       parm_table[i].flags &= ~FLAG_DEFAULT;
+               }
+       }
+
        return (True);
 }
 
@@ -2149,7 +2139,7 @@ static BOOL is_default(int i)
 Display the contents of the global structure.
 ***************************************************************************/
 
-static void dump_globals(FILE *f)
+static void dump_globals(FILE *f, BOOL show_defaults)
 {
        int i;
        struct param_opt *data;
@@ -2160,7 +2150,7 @@ static void dump_globals(FILE *f)
                if (parm_table[i].class == P_GLOBAL &&
                    parm_table[i].ptr &&
                    (i == 0 || (parm_table[i].ptr != parm_table[i - 1].ptr))) {
-                       if (defaults_saved && is_default(i))
+                       if (!show_defaults && (parm_table[i].flags & FLAG_DEFAULT)) 
                                continue;
                        fprintf(f, "\t%s = ", parm_table[i].label);
                        print_parameter(&parm_table[i], parm_table[i].ptr, f);
@@ -2221,6 +2211,35 @@ static void dump_a_service(service * pService, FILE * f)
         }
 }
 
+BOOL lp_dump_a_parameter(int snum, char *parm_name, FILE * f, BOOL isGlobal)
+{
+       service * pService = ServicePtrs[snum];
+       parm_class p_class;
+       unsigned flag = 0;
+       struct parm_struct *parm;
+       void *ptr;
+       if (isGlobal) {
+               p_class = P_GLOBAL;
+               flag = FLAG_GLOBAL;
+       } else
+               p_class = P_LOCAL;
+       
+       parm = lp_parm_struct(parm_name);
+       if (!parm) {
+               return False;
+       }
+       
+       if (isGlobal)
+               ptr = parm->ptr;
+       else
+               ptr = ((char *)pService) +
+                       PTR_DIFF(parm->ptr, &sDefault);
+       
+       print_parameter(parm,
+                       ptr, f);
+       fprintf(f, "\n");
+       return True;
+}
 
 /***************************************************************************
  Return info about the next service  in a service. snum==-1 gives the globals.
@@ -2401,7 +2420,7 @@ BOOL lp_load(void)
 
        bLoaded = True;
 
-       if (Globals.bWINSsupport) {
+       if (!Globals.szWINSservers && Globals.bWINSsupport) {
                lp_do_parameter(-1, "wins server", "127.0.0.1");
        }
 
@@ -2439,7 +2458,7 @@ void lp_dump(FILE *f, BOOL show_defaults, int maxtoprint)
        if (show_defaults)
                defaults_saved = False;
 
-       dump_globals(f);
+       dump_globals(f, show_defaults);
 
        dump_a_service(&sDefault, f);