Add auto-detect of time server. Uses master browser.
[kai/samba.git] / source3 / utils / testparm.c
index 20f36fcffe4d34630bab639c75612b77d13bc0f9..b727f883fde9d69b7cb1758d411327a8cb73ad6f 100644 (file)
@@ -1,6 +1,5 @@
 /* 
-   Unix SMB/Netbios implementation.
-   Version 1.9.
+   Unix SMB/CIFS implementation.
    Test validity of smb.conf
    Copyright (C) Karl Auer 1993, 1994-1998
 
@@ -35,9 +34,7 @@
 #include "includes.h"
 #include "smb.h"
 
-/* these live in util.c */
-extern FILE *dbf;
-extern int DEBUGLEVEL;
+extern BOOL AllowDebugChange;
 
 /***********************************************
  Here we do a set of 'hard coded' checks for bad
@@ -49,12 +46,12 @@ static int do_global_checks(void)
        int ret = 0;
        SMB_STRUCT_STAT st;
 
-       if (lp_security() == SEC_DOMAIN && !lp_encrypted_passwords()) {
+       if (lp_security() >= SEC_DOMAIN && !lp_encrypted_passwords()) {
                printf("ERROR: in 'security=domain' mode the 'encrypt passwords' parameter must also be set to 'true'.\n");
                ret = 1;
        }
 
-       if (lp_wins_support() && *lp_wins_server()) {
+       if (lp_wins_support() && wins_srv_count()) {
                printf("ERROR: both 'wins support = true' and 'wins server = <server>' \
 cannot be set in the smb.conf file. nmbd will abort with this setting.\n");
                ret = 1;
@@ -70,11 +67,17 @@ cannot be set in the smb.conf file. nmbd will abort with this setting.\n");
                ret = 1;
        }
 
+       if (!directory_exist(lp_piddir(), &st)) {
+               printf("ERROR: pid directory %s does not exist\n",
+                      lp_piddir());
+               ret = 1;
+       }
+
        /*
         * Password server sanity checks.
         */
 
-       if((lp_security() == SEC_SERVER || lp_security() == SEC_DOMAIN) && !lp_passwordserver()) {
+       if((lp_security() == SEC_SERVER || lp_security() >= SEC_DOMAIN) && !lp_passwordserver()) {
                pstring sec_setting;
                if(lp_security() == SEC_SERVER)
                        pstrcpy(sec_setting, "server");
@@ -86,6 +89,16 @@ to a valid password server.\n", sec_setting );
                ret = 1;
        }
 
+       
+       /*
+        * Check 'hosts equiv' and 'use rhosts' compatibility with 'hostname lookup' value.
+        */
+
+       if(*lp_hosts_equiv() && !lp_hostname_lookups()) {
+               printf("ERROR: The setting 'hosts equiv = %s' requires that 'hostname lookups = yes'.\n", lp_hosts_equiv());
+               ret = 1;
+       }
+
        /*
         * Password chat sanity checks.
         */
@@ -93,29 +106,37 @@ to a valid password server.\n", sec_setting );
        if(lp_security() == SEC_USER && lp_unix_password_sync()) {
 
                /*
-                * Check that we have a valid lp_passwd_program().
+                * Check that we have a valid lp_passwd_program() if not using pam.
                 */
 
-               if(lp_passwd_program() == NULL) {
-                       printf("ERROR: the 'unix password sync' parameter is set and there is no valid 'passwd program' \
+#ifdef WITH_PAM
+               if (!lp_pam_password_change()) {
+#endif
+
+                       if(lp_passwd_program() == NULL) {
+                               printf("ERROR: the 'unix password sync' parameter is set and there is no valid 'passwd program' \
 parameter.\n" );
-                       ret = 1;
-               } else {
-                       pstring passwd_prog;
-                       pstring truncated_prog;
-                       char *p;
-
-                       pstrcpy( passwd_prog, lp_passwd_program());
-                       p = passwd_prog;
-                       *truncated_prog = '\0';
-                       next_token(&p, truncated_prog, NULL, sizeof(pstring));
-
-                       if(access(truncated_prog, F_OK) == -1) {
-                               printf("ERROR: the 'unix password sync' parameter is set and the 'passwd program' (%s) \
-cannot be executed (error was %s).\n", truncated_prog, strerror(errno) );
                                ret = 1;
+                       } else {
+                               pstring passwd_prog;
+                               pstring truncated_prog;
+                               char *p;
+
+                               pstrcpy( passwd_prog, lp_passwd_program());
+                               p = passwd_prog;
+                               *truncated_prog = '\0';
+                               next_token(&p, truncated_prog, NULL, sizeof(pstring));
+
+                               if(access(truncated_prog, F_OK) == -1) {
+                                       printf("ERROR: the 'unix password sync' parameter is set and the 'passwd program' (%s) \
+cannot be executed (error was %s).\n", truncated_prog, strerror(errno) );
+                                       ret = 1;
+                               }
                        }
+
+#ifdef WITH_PAM
                }
+#endif
 
                if(lp_passwd_chat() == NULL) {
                        printf("ERROR: the 'unix password sync' parameter is set and there is no valid 'passwd chat' \
@@ -137,6 +158,15 @@ via the %%o substitution. With encrypted passwords this is not possible.\n", lp_
                }
        }
 
+       if (strlen(lp_winbind_separator()) != 1) {
+               printf("ERROR: the 'winbind separator' parameter must be a single character.\n");
+               ret = 1;
+       }
+
+       if (*lp_winbind_separator() == '+') {
+               printf("'winbind separator = +' might cause problems with group membership.\n");
+       }
+
        return ret;
 }   
 
@@ -168,12 +198,8 @@ int main(int argc, char *argv[])
 
   *term_code = 0;
 
-  TimeInit();
-
   setup_logging(argv[0],True);
   
-  charset_initialise();
-
   while ((opt = getopt(argc, argv,"shL:t:")) != EOF) {
   switch (opt) {
     case 's':
@@ -200,12 +226,13 @@ int main(int argc, char *argv[])
   argc += (1 - optind);
 
   if ((argc == 1) || (argc == 3))
-    pstrcpy(configfile,CONFIGFILE);
+    pstrcpy(configfile, dyn_CONFIGFILE);
   else if ((argc == 2) || (argc == 4))
     pstrcpy(configfile,argv[optind]);
 
-  dbf = stdout;
+  dbf = x_stdout;
   DEBUGLEVEL = 2;
+  AllowDebugChange = False;
 
   printf("Load smb config files from %s\n",configfile);
 
@@ -229,23 +256,28 @@ int main(int argc, char *argv[])
 
   for (s=0;s<1000;s++) {
     if (VALID_SNUM(s)) {
-      char *deny_list = lp_hostsdeny(s);
-      char *allow_list = lp_hostsallow(s);
+      char **deny_list = lp_hostsdeny(s);
+      char **allow_list = lp_hostsallow(s);
+      int i;
       if(deny_list) {
-        char *hasstar = strchr(deny_list, '*');
-        char *hasquery = strchr(deny_list, '?');
-        if(hasstar || hasquery) {
-          printf("Invalid character %c in hosts deny list %s for service %s.\n",
-                 hasstar ? *hasstar : *hasquery, deny_list, lp_servicename(s) );
+        for (i=0; deny_list[i]; i++) {
+          char *hasstar = strchr_m(deny_list[i], '*');
+          char *hasquery = strchr_m(deny_list[i], '?');
+          if(hasstar || hasquery) {
+            printf("Invalid character %c in hosts deny list (%s) for service %s.\n",
+                 hasstar ? *hasstar : *hasquery, deny_list[i], lp_servicename(s) );
+         }
         }
       }
 
       if(allow_list) {
-        char *hasstar = strchr(allow_list, '*');
-        char *hasquery = strchr(allow_list, '?');
-        if(hasstar || hasquery) {
-          printf("Invalid character %c in hosts allow list %s for service %s.\n",
-                 hasstar ? *hasstar : *hasquery, allow_list, lp_servicename(s) );
+        for (i=0; allow_list[i]; i++) {
+          char *hasstar = strchr_m(allow_list[i], '*');
+          char *hasquery = strchr_m(allow_list[i], '?');
+          if(hasstar || hasquery) {
+            printf("Invalid character %c in hosts allow list (%s) for service %s.\n",
+                 hasstar ? *hasstar : *hasquery, allow_list[i], lp_servicename(s) );
+         }
         }
       }
 
@@ -257,16 +289,13 @@ Level II oplocks can only be set if oplocks are also set.\n",
     }
   }
 
-  if (*term_code)
-    interpret_coding_system(term_code);
-
   if (argc < 3) {
     if (!silent_mode) {
       printf("Press enter to see a dump of your service definitions\n");
       fflush(stdout);
       getc(stdin);
     }
-    lp_dump(stdout,True, lp_numservices(), _dos_to_unix);
+    lp_dump(stdout,True, lp_numservices());
   }
   
   if (argc >= 3) {