r2331: check password script code and example from trunk
[sfrench/samba-autobuild/.git] / source3 / param / loadparm.c
index 6b09faf7bf9bdfba5d26a79c67fde508d2cdb036..24811af37ddf7eb8c91ba378fe1f4a2284dd12dd 100644 (file)
@@ -156,6 +156,7 @@ typedef struct
        char *szAddMachineScript;
        char *szShutdownScript;
        char *szAbortShutdownScript;
+       char *szCheckPasswordScript;
        char *szWINSHook;
        char *szWINSPartners;
        char *szUtmpDir;
@@ -174,8 +175,9 @@ typedef struct
        BOOL bWinbindEnumGroups;
        BOOL bWinbindUseDefaultDomain;
        BOOL bWinbindTrustedDomainsOnly;
+       BOOL bWinbindNestedGroups;
        char *szWinbindBackend;
-       char *szIdmapBackend;
+       char **szIdmapBackend;
        char *szAddShareCommand;
        char *szChangeShareCommand;
        char *szDeleteShareCommand;
@@ -199,7 +201,6 @@ typedef struct
        int lpqcachetime;
        int iMaxSmbdProcesses;
        BOOL bDisableSpoolss;
-       int iTotalPrintJobs;
        int syslog;
        int os_level;
        int enhanced_browsing;
@@ -213,7 +214,6 @@ typedef struct
        int change_notify_timeout;
        int map_to_guest;
        int min_passwd_length;
-       BOOL use_cracklib;
        int oplock_break_wait_time;
        int winbind_cache_time;
        int iLockSpinCount;
@@ -231,8 +231,10 @@ typedef struct
        char *szLdapFilter;
        char *szLdapAdminDn;
        char *szAclCompat;
+       char *szCupsServer;
        int ldap_passwd_sync; 
        int ldap_replication_sleep;
+       int ldap_timeout; /* This is initialised in init_globals */
        BOOL ldap_delete_dn;
        BOOL bMsAddPrinterWizard;
        BOOL bDNSproxy;
@@ -249,6 +251,7 @@ typedef struct
        BOOL bNullPasswords;
        BOOL bObeyPamRestrictions;
        BOOL bLoadPrinters;
+       int PrintcapCacheTime;
        BOOL bLargeReadwrite;
        BOOL bReadRaw;
        BOOL bWriteRaw;
@@ -285,6 +288,8 @@ typedef struct
        BOOL bUnixExtensions;
        BOOL bDisableNetbios;
        BOOL bKernelChangeNotify;
+       BOOL bUseKerberosKeytab;
+       BOOL bDeferSharingViolations;
        int restrict_anonymous;
        int name_cache_timeout;
        int client_signing;
@@ -314,6 +319,7 @@ typedef struct
        char *szPostExec;
        char *szRootPreExec;
        char *szRootPostExec;
+       char *szCupsOptions;
        char *szPrintcommand;
        char *szLpqcommand;
        char *szLprmcommand;
@@ -361,10 +367,9 @@ typedef struct
        int iBlock_size;
        BOOL bPreexecClose;
        BOOL bRootpreexecClose;
-       BOOL bCaseSensitive;
+       int  iCaseSensitive;
        BOOL bCasePreserve;
        BOOL bShortCasePreserve;
-       BOOL bCaseMangle;
        BOOL bHideDotFiles;
        BOOL bHideSpecialFiles;
        BOOL bHideUnReadable;
@@ -409,6 +414,7 @@ typedef struct
        BOOL bUseClientDriver;
        BOOL bDefaultDevmode;
        BOOL bNTAclSupport;
+       BOOL bForceUnknownAclUser;
        BOOL bUseSendfile;
        BOOL bProfileAcls;
        BOOL bMap_acl_inherit;
@@ -437,6 +443,7 @@ static service sDefault = {
        NULL,                   /* szPostExec */
        NULL,                   /* szRootPreExec */
        NULL,                   /* szRootPostExec */
+       NULL,                   /* szCupsOptions */
        NULL,                   /* szPrintcommand */
        NULL,                   /* szLpqcommand */
        NULL,                   /* szLprmcommand */
@@ -484,10 +491,9 @@ static service sDefault = {
        1024,           /* iBlock_size */
        False,                  /* bPreexecClose */
        False,                  /* bRootpreexecClose */
-       False,                  /* case sensitive */
+       Auto,                   /* case sensitive */
        True,                   /* case preserve */
        True,                   /* short case preserve */
-       False,                  /* case mangle */
        True,                   /* bHideDotFiles */
        False,                  /* bHideSpecialFiles */
        False,                  /* bHideUnReadable */
@@ -532,7 +538,8 @@ static service sDefault = {
        False,                  /* bUseClientDriver */
        False,                  /* bDefaultDevmode */
        True,                   /* bNTAclSupport */
-       False,                  /* bUseSendfile */
+       False,                  /* bForceUnknownAclUser */
+       True,                   /* bUseSendfile */
        False,                  /* bProfileAcls */
        False,                  /* bMap_acl_inherit */
        False,                  /* bAfs_Share */
@@ -555,18 +562,18 @@ static int default_server_announce;
 #define NUMPARAMETERS (sizeof(parm_table) / sizeof(struct parm_struct))
 
 /* prototypes for the special type handlers */
-static BOOL handle_include(const char *pszParmValue, char **ptr);
-static BOOL handle_copy(const char *pszParmValue, char **ptr);
-static BOOL handle_netbios_name(const char *pszParmValue, char **ptr);
-static BOOL handle_idmap_uid(const char *pszParmValue, char **ptr);
-static BOOL handle_idmap_gid(const char *pszParmValue, char **ptr);
-static BOOL handle_debug_list( const char *pszParmValue, char **ptr );
-static BOOL handle_workgroup( const char *pszParmValue, char **ptr );
-static BOOL handle_netbios_aliases( const char *pszParmValue, char **ptr );
-static BOOL handle_netbios_scope( const char *pszParmValue, char **ptr );
-static BOOL handle_charset( const char *pszParmValue, char **ptr );
-
-static BOOL handle_acl_compatibility(const char *pszParmValue, char **ptr);
+static BOOL handle_include( int snum, const char *pszParmValue, char **ptr);
+static BOOL handle_copy( int snum, const char *pszParmValue, char **ptr);
+static BOOL handle_netbios_name( int snum, const char *pszParmValue, char **ptr);
+static BOOL handle_idmap_uid( int snum, const char *pszParmValue, char **ptr);
+static BOOL handle_idmap_gid( int snum, const char *pszParmValue, char **ptr);
+static BOOL handle_debug_list( int snum, const char *pszParmValue, char **ptr );
+static BOOL handle_workgroup( int snum, const char *pszParmValue, char **ptr );
+static BOOL handle_netbios_aliases( int snum, const char *pszParmValue, char **ptr );
+static BOOL handle_netbios_scope( int snum, const char *pszParmValue, char **ptr );
+static BOOL handle_charset( int snum, const char *pszParmValue, char **ptr );
+static BOOL handle_acl_compatibility( int snum, const char *pszParmValue, char **ptr);
+static BOOL handle_printing( int snum, const char *pszParmValue, char **ptr);
 
 static void set_server_role(void);
 static void set_default_server_announce_type(void);
@@ -787,7 +794,6 @@ static struct parm_struct parm_table[] = {
        {"hosts equiv", P_STRING, P_GLOBAL, &Globals.szHostsEquiv, NULL, NULL, FLAG_ADVANCED}, 
        {"min passwd length", P_INTEGER, P_GLOBAL, &Globals.min_passwd_length, NULL, NULL, FLAG_ADVANCED}, 
        {"min password length", P_INTEGER, P_GLOBAL, &Globals.min_passwd_length, NULL, NULL, FLAG_ADVANCED}, 
-       {"use cracklib", P_BOOL, P_GLOBAL, &Globals.use_cracklib, NULL, NULL, FLAG_ADVANCED}, 
        {"map to guest", P_ENUM, P_GLOBAL, &Globals.map_to_guest, NULL, enum_map_to_guest, FLAG_ADVANCED}, 
        {"null passwords", P_BOOL, P_GLOBAL, &Globals.bNullPasswords, NULL, NULL, FLAG_ADVANCED}, 
        {"obey pam restrictions", P_BOOL, P_GLOBAL, &Globals.bObeyPamRestrictions, NULL, NULL, FLAG_ADVANCED}, 
@@ -806,6 +812,7 @@ static struct parm_struct parm_table[] = {
        {"passwd chat", P_STRING, P_GLOBAL, &Globals.szPasswdChat, NULL, NULL, FLAG_ADVANCED}, 
        {"passwd chat debug", P_BOOL, P_GLOBAL, &Globals.bPasswdChatDebug, NULL, NULL, FLAG_ADVANCED}, 
        {"passwd chat timeout", P_INTEGER, P_GLOBAL, &Globals.iPasswdChatTimeout, NULL, NULL, FLAG_ADVANCED}, 
+       {"check password script", P_STRING, P_GLOBAL, &Globals.szCheckPasswordScript, NULL, NULL, FLAG_ADVANCED}, 
        {"username map", P_STRING, P_GLOBAL, &Globals.szUsernameMap, NULL, NULL, FLAG_ADVANCED}, 
        {"password level", P_INTEGER, P_GLOBAL, &Globals.pwordlevel, NULL, NULL, FLAG_ADVANCED}, 
        {"username level", P_INTEGER, P_GLOBAL, &Globals.unamelevel, NULL, NULL, FLAG_ADVANCED}, 
@@ -846,6 +853,7 @@ static struct parm_struct parm_table[] = {
        {"force directory mode", P_OCTAL, P_LOCAL, &sDefault.iDir_force_mode, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE}, 
        {"directory security mask", P_OCTAL, P_LOCAL, &sDefault.iDir_Security_mask, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE}, 
        {"force directory security mode", P_OCTAL, P_LOCAL, &sDefault.iDir_Security_force_mode, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE}, 
+       {"force unknown acl user", P_BOOL, P_LOCAL, &sDefault.bForceUnknownAclUser, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE},
        {"inherit permissions", P_BOOL, P_LOCAL, &sDefault.bInheritPerms, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE}, 
        {"inherit acls", P_BOOL, P_LOCAL, &sDefault.bInheritACLS, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE}, 
        {"guest only", P_BOOL, P_LOCAL, &sDefault.bGuest_only, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE}, 
@@ -860,6 +868,7 @@ static struct parm_struct parm_table[] = {
        {"hosts deny", P_LIST, P_LOCAL, &sDefault.szHostsdeny, NULL, NULL, FLAG_GLOBAL | FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT}, 
        {"deny hosts", P_LIST, P_LOCAL, &sDefault.szHostsdeny, NULL, NULL, FLAG_HIDE}, 
        {"preload modules", P_LIST, P_GLOBAL, &Globals.szPreloadModules, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL}, 
+       {"use kerberos keytab", P_BOOL, P_GLOBAL, &Globals.bUseKerberosKeytab, NULL, NULL, FLAG_ADVANCED}, 
 
        {N_("Logging Options"), P_SEP, P_SEPARATOR}, 
 
@@ -889,6 +898,7 @@ static struct parm_struct parm_table[] = {
        {"disable netbios", P_BOOL, P_GLOBAL, &Globals.bDisableNetbios, NULL, NULL, FLAG_ADVANCED}, 
 
        {"acl compatibility", P_STRING, P_GLOBAL, &Globals.szAclCompat, handle_acl_compatibility,  NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
+       { "defer sharing violations", P_BOOL, P_GLOBAL, &Globals.bDeferSharingViolations, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL},
        {"ea support", P_BOOL, P_LOCAL, &sDefault.bEASupport, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
        {"nt acl support", P_BOOL, P_LOCAL, &sDefault.bNTAclSupport, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
        {"nt pipe support", P_BOOL, P_GLOBAL, &Globals.bNTPipeSupport, NULL, NULL, FLAG_ADVANCED}, 
@@ -946,11 +956,14 @@ static struct parm_struct parm_table[] = {
        {"max reported print jobs", P_INTEGER, P_LOCAL, &sDefault.iMaxReportedPrintJobs, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT}, 
        {"max print jobs", P_INTEGER, P_LOCAL, &sDefault.iMaxPrintJobs, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT}, 
        {"load printers", P_BOOL, P_GLOBAL, &Globals.bLoadPrinters, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT}, 
+       {"printcap cache time", P_INTEGER, P_GLOBAL, &Globals.PrintcapCacheTime, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT}, 
        {"printcap name", P_STRING, P_GLOBAL, &Globals.szPrintcapname, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT}, 
        {"printcap", P_STRING, P_GLOBAL, &Globals.szPrintcapname, NULL, NULL, FLAG_HIDE}, 
        {"printable", P_BOOL, P_LOCAL, &sDefault.bPrint_ok, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT}, 
        {"print ok", P_BOOL, P_LOCAL, &sDefault.bPrint_ok, NULL, NULL, FLAG_HIDE}, 
-       {"printing", P_ENUM, P_LOCAL, &sDefault.iPrinting, NULL, enum_printing, FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL}, 
+       {"printing", P_ENUM, P_LOCAL, &sDefault.iPrinting, handle_printing, enum_printing, FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL}, 
+       {"cups options", P_STRING, P_LOCAL, &sDefault.szCupsOptions, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL}, 
+       {"cups server", P_STRING, P_GLOBAL, &Globals.szCupsServer, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL}, 
        {"print command", P_STRING, P_LOCAL, &sDefault.szPrintcommand, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL}, 
        {"disable spoolss", P_BOOL, P_GLOBAL, &Globals.bDisableSpoolss, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL}, 
        {"lpq command", P_STRING, P_LOCAL, &sDefault.szLpqcommand, NULL, NULL, FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL}, 
@@ -976,11 +989,10 @@ static struct parm_struct parm_table[] = {
        {"mangle prefix", P_INTEGER, P_GLOBAL, &Globals.mangle_prefix, NULL, NULL, FLAG_ADVANCED}, 
 
        {"default case", P_ENUM, P_LOCAL, &sDefault.iDefaultCase, NULL, enum_case, FLAG_ADVANCED | FLAG_SHARE}, 
-       {"case sensitive", P_BOOL, P_LOCAL, &sDefault.bCaseSensitive, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
-       {"casesignames", P_BOOL, P_LOCAL, &sDefault.bCaseSensitive, NULL, NULL, FLAG_HIDE}, 
+       {"case sensitive", P_ENUM, P_LOCAL, &sDefault.iCaseSensitive, NULL, enum_bool_auto, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
+       {"casesignames", P_ENUM, P_LOCAL, &sDefault.iCaseSensitive, NULL, enum_bool_auto, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL | FLAG_HIDE}, 
        {"preserve case", P_BOOL, P_LOCAL, &sDefault.bCasePreserve, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
        {"short preserve case", P_BOOL, P_LOCAL, &sDefault.bShortCasePreserve, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
-       {"mangle case", P_BOOL, P_LOCAL, &sDefault.bCaseMangle, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
        {"mangling char", P_CHAR, P_LOCAL, &sDefault.magic_char, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
        {"hide dot files", P_BOOL, P_LOCAL, &sDefault.bHideDotFiles, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
        {"hide special files", P_BOOL, P_LOCAL, &sDefault.bHideSpecialFiles, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL}, 
@@ -1069,17 +1081,18 @@ static struct parm_struct parm_table[] = {
        {"ldap server", P_STRING, P_GLOBAL, &Globals.szLdapServer, NULL, NULL, FLAG_ADVANCED}, 
        {"ldap port", P_INTEGER, P_GLOBAL, &Globals.ldap_port, NULL, NULL, FLAG_ADVANCED}, 
 #endif
-       {"ldap suffix", P_STRING, P_GLOBAL, &Globals.szLdapSuffix, NULL, NULL, FLAG_ADVANCED}, 
-       {"ldap machine suffix", P_STRING, P_GLOBAL, &Globals.szLdapMachineSuffix, NULL, NULL, FLAG_ADVANCED}, 
-       {"ldap user suffix", P_STRING, P_GLOBAL, &Globals.szLdapUserSuffix, NULL, NULL, FLAG_ADVANCED}, 
+       {"ldap admin dn", P_STRING, P_GLOBAL, &Globals.szLdapAdminDn, NULL, NULL, FLAG_ADVANCED}, 
+       {"ldap delete dn", P_BOOL, P_GLOBAL, &Globals.ldap_delete_dn, NULL, NULL, FLAG_ADVANCED}, 
+       {"ldap filter", P_STRING, P_GLOBAL, &Globals.szLdapFilter, NULL, NULL, FLAG_ADVANCED}, 
        {"ldap group suffix", P_STRING, P_GLOBAL, &Globals.szLdapGroupSuffix, NULL, NULL, FLAG_ADVANCED}, 
        {"ldap idmap suffix", P_STRING, P_GLOBAL, &Globals.szLdapIdmapSuffix, NULL, NULL, FLAG_ADVANCED}, 
-       {"ldap filter", P_STRING, P_GLOBAL, &Globals.szLdapFilter, NULL, NULL, FLAG_ADVANCED}, 
-       {"ldap admin dn", P_STRING, P_GLOBAL, &Globals.szLdapAdminDn, NULL, NULL, FLAG_ADVANCED}, 
-       {"ldap ssl", P_ENUM, P_GLOBAL, &Globals.ldap_ssl, NULL, enum_ldap_ssl, FLAG_ADVANCED}, 
+       {"ldap machine suffix", P_STRING, P_GLOBAL, &Globals.szLdapMachineSuffix, NULL, NULL, FLAG_ADVANCED}, 
        {"ldap passwd sync", P_ENUM, P_GLOBAL, &Globals.ldap_passwd_sync, NULL, enum_ldap_passwd_sync, FLAG_ADVANCED}, 
-       {"ldap delete dn", P_BOOL, P_GLOBAL, &Globals.ldap_delete_dn, NULL, NULL, FLAG_ADVANCED}, 
        {"ldap replication sleep", P_INTEGER, P_GLOBAL, &Globals.ldap_replication_sleep, NULL, NULL, FLAG_ADVANCED},
+       {"ldap suffix", P_STRING, P_GLOBAL, &Globals.szLdapSuffix, NULL, NULL, FLAG_ADVANCED}, 
+       {"ldap ssl", P_ENUM, P_GLOBAL, &Globals.ldap_ssl, NULL, enum_ldap_ssl, FLAG_ADVANCED}, 
+       {"ldap timeout", P_INTEGER, P_GLOBAL, &Globals.ldap_timeout, NULL, NULL, FLAG_ADVANCED},
+       {"ldap user suffix", P_STRING, P_GLOBAL, &Globals.szLdapUserSuffix, NULL, NULL, FLAG_ADVANCED}, 
 
        {N_("Miscellaneous Options"), P_SEP, P_SEPARATOR}, 
        {"add share command", P_STRING, P_GLOBAL, &Globals.szAddShareCommand, NULL, NULL, FLAG_ADVANCED}, 
@@ -1108,7 +1121,7 @@ static struct parm_struct parm_table[] = {
        {"remote browse sync", P_STRING, P_GLOBAL, &Globals.szRemoteBrowseSync, NULL, NULL, FLAG_ADVANCED}, 
        {"socket address", P_STRING, P_GLOBAL, &Globals.szSocketAddress, NULL, NULL, FLAG_ADVANCED}, 
        {"homedir map", P_STRING, P_GLOBAL, &Globals.szNISHomeMapName, NULL, NULL, FLAG_ADVANCED}, 
-       {"afs username map", P_USTRING, P_GLOBAL, &Globals.szAfsUsernameMap, NULL, NULL, FLAG_ADVANCED}, 
+       {"afs username map", P_STRING, P_GLOBAL, &Globals.szAfsUsernameMap, NULL, NULL, FLAG_ADVANCED}, 
        {"time offset", P_INTEGER, P_GLOBAL, &extra_time_offset, NULL, NULL, FLAG_ADVANCED}, 
        {"NIS homedir", P_BOOL, P_GLOBAL, &Globals.bNISHomeMap, NULL, NULL, FLAG_ADVANCED}, 
        {"-valid", P_BOOL, P_LOCAL, &sDefault.valid, NULL, NULL, FLAG_HIDE}, 
@@ -1153,7 +1166,7 @@ static struct parm_struct parm_table[] = {
        {N_("Winbind options"), P_SEP, P_SEPARATOR}, 
 
        {"enable rid algorithm", P_BOOL, P_GLOBAL, &Globals.bEnableRidAlgorithm, NULL, NULL, FLAG_DEPRECATED}, 
-       {"idmap backend", P_STRING, P_GLOBAL, &Globals.szIdmapBackend, NULL, NULL, FLAG_ADVANCED}, 
+       {"idmap backend", P_LIST, P_GLOBAL, &Globals.szIdmapBackend, NULL, NULL, FLAG_ADVANCED}, 
        {"idmap uid", P_STRING, P_GLOBAL, &Globals.szIdmapUID, handle_idmap_uid, NULL, FLAG_ADVANCED}, 
        {"winbind uid", P_STRING, P_GLOBAL, &Globals.szIdmapUID, handle_idmap_uid, NULL, FLAG_HIDE}, 
        {"idmap gid", P_STRING, P_GLOBAL, &Globals.szIdmapGID, handle_idmap_gid, NULL, FLAG_ADVANCED}, 
@@ -1168,6 +1181,7 @@ static struct parm_struct parm_table[] = {
        {"winbind enum groups", P_BOOL, P_GLOBAL, &Globals.bWinbindEnumGroups, NULL, NULL, FLAG_ADVANCED}, 
        {"winbind use default domain", P_BOOL, P_GLOBAL, &Globals.bWinbindUseDefaultDomain, NULL, NULL, FLAG_ADVANCED}, 
        {"winbind trusted domains only", P_BOOL, P_GLOBAL, &Globals.bWinbindTrustedDomainsOnly, NULL, NULL, FLAG_ADVANCED}, 
+       {"winbind nested groups", P_BOOL, P_GLOBAL, &Globals.bWinbindNestedGroups, NULL, NULL, FLAG_ADVANCED}, 
 
        {NULL,  P_BOOL,  P_NONE,  NULL,  NULL,  NULL,  0}
 };
@@ -1178,11 +1192,6 @@ static struct parm_struct parm_table[] = {
 
 static void init_printer_values(service *pService)
 {
-       if ( pService == NULL ) {
-               DEBUG(0,("init_printer_values: NULL pointer\n"));
-               return;
-       }
-               
        /* choose defaults depending on the type of printing */
        switch (pService->iPrinting) {
                case PRINT_BSD:
@@ -1191,24 +1200,18 @@ static void init_printer_values(service *pService)
                case PRINT_LPROS2:
                        string_set(&pService->szLpqcommand, "lpq -P'%p'");
                        string_set(&pService->szLprmcommand, "lprm -P'%p' %j");
-                       string_set(&pService->szPrintcommand,
-                                  "lpr -r -P'%p' %s");
+                       string_set(&pService->szPrintcommand, "lpr -r -P'%p' %s");
                        break;
 
                case PRINT_LPRNG:
                case PRINT_PLP:
                        string_set(&pService->szLpqcommand, "lpq -P'%p'");
                        string_set(&pService->szLprmcommand, "lprm -P'%p' %j");
-                       string_set(&pService->szPrintcommand,
-                                  "lpr -r -P'%p' %s");
-                       string_set(&pService->szQueuepausecommand,
-                                  "lpc stop '%p'");
-                       string_set(&pService->szQueueresumecommand,
-                                  "lpc start '%p'");
-                       string_set(&pService->szLppausecommand,
-                                  "lpc hold '%p' %j");
-                       string_set(&pService->szLpresumecommand,
-                                  "lpc release '%p' %j");
+                       string_set(&pService->szPrintcommand, "lpr -r -P'%p' %s");
+                       string_set(&pService->szQueuepausecommand, "lpc stop '%p'");
+                       string_set(&pService->szQueueresumecommand, "lpc start '%p'");
+                       string_set(&pService->szLppausecommand, "lpc hold '%p' %j");
+                       string_set(&pService->szLpresumecommand, "lpc release '%p' %j");
                        break;
 
                case PRINT_CUPS:
@@ -1223,20 +1226,13 @@ static void init_printer_values(service *pService)
 
                        string_set(&Globals.szPrintcapname, "cups");
 #else
-                       string_set(&pService->szLpqcommand,
-                                  "/usr/bin/lpstat -o '%p'");
-                       string_set(&pService->szLprmcommand,
-                                  "/usr/bin/cancel '%p-%j'");
-                       string_set(&pService->szPrintcommand,
-                                  "/usr/bin/lp -d '%p' %s; rm %s");
-                       string_set(&pService->szLppausecommand,
-                                  "lp -i '%p-%j' -H hold");
-                       string_set(&pService->szLpresumecommand,
-                                  "lp -i '%p-%j' -H resume");
-                       string_set(&pService->szQueuepausecommand,
-                                  "/usr/bin/disable '%p'");
-                       string_set(&pService->szQueueresumecommand,
-                                  "/usr/bin/enable '%p'");
+                       string_set(&pService->szLpqcommand, "/usr/bin/lpstat -o '%p'");
+                       string_set(&pService->szLprmcommand, "/usr/bin/cancel '%p-%j'");
+                       string_set(&pService->szPrintcommand, "/usr/bin/lp -d '%p' %s; rm %s");
+                       string_set(&pService->szLppausecommand, "lp -i '%p-%j' -H hold");
+                       string_set(&pService->szLpresumecommand, "lp -i '%p-%j' -H resume");
+                       string_set(&pService->szQueuepausecommand, "/usr/bin/disable '%p'");
+                       string_set(&pService->szQueueresumecommand, "/usr/bin/enable '%p'");
                        string_set(&Globals.szPrintcapname, "lpstat");
 #endif /* HAVE_CUPS */
                        break;
@@ -1245,17 +1241,12 @@ static void init_printer_values(service *pService)
                case PRINT_HPUX:
                        string_set(&pService->szLpqcommand, "lpstat -o%p");
                        string_set(&pService->szLprmcommand, "cancel %p-%j");
-                       string_set(&pService->szPrintcommand,
-                                  "lp -c -d%p %s; rm %s");
-                       string_set(&pService->szQueuepausecommand,
-                                  "disable %p");
-                       string_set(&pService->szQueueresumecommand,
-                                  "enable %p");
+                       string_set(&pService->szPrintcommand, "lp -c -d%p %s; rm %s");
+                       string_set(&pService->szQueuepausecommand, "disable %p");
+                       string_set(&pService->szQueueresumecommand, "enable %p");
 #ifndef HPUX
-                       string_set(&pService->szLppausecommand,
-                                  "lp -i %p-%j -H hold");
-                       string_set(&pService->szLpresumecommand,
-                                  "lp -i %p-%j -H resume");
+                       string_set(&pService->szLppausecommand, "lp -i %p-%j -H hold");
+                       string_set(&pService->szLpresumecommand, "lp -i %p-%j -H resume");
 #endif /* HPUX */
                        break;
 
@@ -1292,6 +1283,13 @@ static void init_globals(void)
 
        if (!done_init) {
                int i;
+
+               /* The logfile can be set before this is invoked. Free it if so. */
+               if (Globals.szLogFile != NULL) {
+                       string_free(&Globals.szLogFile);
+                       Globals.szLogFile = NULL;
+               }
+
                memset((void *)&Globals, '\0', sizeof(Globals));
 
                for (i = 0; parm_table[i].label; i++)
@@ -1302,6 +1300,8 @@ static void init_globals(void)
 
                string_set(&sDefault.fstype, FSTYPE_STRING);
 
+               init_printer_values(&sDefault);
+
                done_init = True;
        }
 
@@ -1367,6 +1367,7 @@ static void init_globals(void)
        Globals.AlgorithmicRidBase = BASE_RID;
 
        Globals.bLoadPrinters = True;
+       Globals.PrintcapCacheTime = 0;
        /* Was 65535 (0xFFFF). 0x4101 matches W2K and causes major speed improvements... */
        /* Discovered by 2 days of pain by Don McCall @ HP :-). */
        Globals.max_xmit = 0x4104;
@@ -1374,7 +1375,6 @@ static void init_globals(void)
        Globals.lpqcachetime = 10;
        Globals.bDisableSpoolss = False;
        Globals.iMaxSmbdProcesses = 0;/* no limit specified */
-       Globals.iTotalPrintJobs = 0;  /* no limit specified */
        Globals.pwordlevel = 0;
        Globals.unamelevel = 0;
        Globals.deadtime = 0;
@@ -1437,7 +1437,6 @@ static void init_globals(void)
 
        Globals.map_to_guest = 0;       /* By Default, "Never" */
        Globals.min_passwd_length = MINPASSWDLENGTH;    /* By Default, 5. */
-       Globals.use_cracklib = False; 
        Globals.oplock_break_wait_time = 0;     /* By Default, 0 msecs. */
        Globals.enhanced_browsing = True; 
        Globals.iLockSpinCount = 3; /* Try 3 times. */
@@ -1453,6 +1452,7 @@ static void init_globals(void)
           a large number of sites (tridge) */
        Globals.bHostnameLookups = False;
 
+       str_list_free(&Globals.szPassdbBackend);
 #ifdef WITH_LDAP_SAMCONFIG
        string_set(&Globals.szLdapServer, "localhost");
        Globals.ldap_port = 636;
@@ -1473,6 +1473,7 @@ static void init_globals(void)
        Globals.ldap_passwd_sync = LDAP_PASSWD_SYNC_OFF;
        Globals.ldap_delete_dn = False;
        Globals.ldap_replication_sleep = 1000; /* wait 1 sec for replication */
+       Globals.ldap_timeout = LDAP_CONNECT_DEFAULT_TIMEOUT;
 
 /* these parameters are set to defaults that are more appropriate
    for the increasing samba install base:
@@ -1508,13 +1509,15 @@ static void init_globals(void)
        string_set(&Globals.szTemplatePrimaryGroup, "nobody");
        string_set(&Globals.szWinbindSeparator, "\\");
        string_set(&Globals.szAclCompat, "");
+       string_set(&Globals.szCupsServer, "");
 
        Globals.winbind_cache_time = 300;       /* 5 minutes */
-       Globals.bWinbindEnableLocalAccounts = True;
+       Globals.bWinbindEnableLocalAccounts = False;
        Globals.bWinbindEnumUsers = True;
        Globals.bWinbindEnumGroups = True;
        Globals.bWinbindUseDefaultDomain = False;
        Globals.bWinbindTrustedDomainsOnly = False;
+       Globals.bWinbindNestedGroups = False;
 
        Globals.bEnableRidAlgorithm = True;
 
@@ -1526,6 +1529,7 @@ static void init_globals(void)
        Globals.client_signing = Auto;
        Globals.server_signing = False;
 
+       Globals.bDeferSharingViolations = True;
        string_set(&Globals.smb_ports, SMB_PORTS);
 }
 
@@ -1618,6 +1622,7 @@ FN_GLOBAL_STRING(lp_configfile, &Globals.szConfigFile)
 FN_GLOBAL_STRING(lp_smb_passwd_file, &Globals.szSMBPasswdFile)
 FN_GLOBAL_STRING(lp_private_dir, &Globals.szPrivateDir)
 FN_GLOBAL_STRING(lp_serverstring, &Globals.szServerString)
+FN_GLOBAL_INTEGER(lp_printcap_cache_time, &Globals.PrintcapCacheTime)
 FN_GLOBAL_STRING(lp_printcapname, &Globals.szPrintcapname)
 FN_GLOBAL_STRING(lp_enumports_cmd, &Globals.szEnumPortsCommand)
 FN_GLOBAL_STRING(lp_addprinter_cmd, &Globals.szAddPrinterCommand)
@@ -1675,6 +1680,8 @@ FN_GLOBAL_STRING(lp_addmachine_script, &Globals.szAddMachineScript)
 FN_GLOBAL_STRING(lp_shutdown_script, &Globals.szShutdownScript)
 FN_GLOBAL_STRING(lp_abort_shutdown_script, &Globals.szAbortShutdownScript)
 
+FN_GLOBAL_STRING(lp_check_password_script, &Globals.szCheckPasswordScript)
+
 FN_GLOBAL_STRING(lp_wins_hook, &Globals.szWINSHook)
 FN_GLOBAL_STRING(lp_wins_partners, &Globals.szWINSPartners)
 FN_GLOBAL_STRING(lp_template_primary_group, &Globals.szTemplatePrimaryGroup)
@@ -1687,8 +1694,9 @@ FN_GLOBAL_BOOL(lp_winbind_enum_users, &Globals.bWinbindEnumUsers)
 FN_GLOBAL_BOOL(lp_winbind_enum_groups, &Globals.bWinbindEnumGroups)
 FN_GLOBAL_BOOL(lp_winbind_use_default_domain, &Globals.bWinbindUseDefaultDomain)
 FN_GLOBAL_BOOL(lp_winbind_trusted_domains_only, &Globals.bWinbindTrustedDomainsOnly)
+FN_GLOBAL_BOOL(lp_winbind_nested_groups, &Globals.bWinbindNestedGroups)
 
-FN_GLOBAL_STRING(lp_idmap_backend, &Globals.szIdmapBackend)
+FN_GLOBAL_LIST(lp_idmap_backend, &Globals.szIdmapBackend)
 FN_GLOBAL_BOOL(lp_enable_rid_algorithm, &Globals.bEnableRidAlgorithm)
 
 #ifdef WITH_LDAP_SAMCONFIG
@@ -1702,6 +1710,7 @@ FN_GLOBAL_INTEGER(lp_ldap_ssl, &Globals.ldap_ssl)
 FN_GLOBAL_INTEGER(lp_ldap_passwd_sync, &Globals.ldap_passwd_sync)
 FN_GLOBAL_BOOL(lp_ldap_delete_dn, &Globals.ldap_delete_dn)
 FN_GLOBAL_INTEGER(lp_ldap_replication_sleep, &Globals.ldap_replication_sleep)
+FN_GLOBAL_INTEGER(lp_ldap_timeout, &Globals.ldap_timeout)
 FN_GLOBAL_STRING(lp_add_share_cmd, &Globals.szAddShareCommand)
 FN_GLOBAL_STRING(lp_change_share_cmd, &Globals.szChangeShareCommand)
 FN_GLOBAL_STRING(lp_delete_share_cmd, &Globals.szDeleteShareCommand)
@@ -1757,6 +1766,8 @@ FN_GLOBAL_BOOL(lp_use_spnego, &Globals.bUseSpnego)
 FN_GLOBAL_BOOL(lp_client_use_spnego, &Globals.bClientUseSpnego)
 FN_GLOBAL_BOOL(lp_hostname_lookups, &Globals.bHostnameLookups)
 FN_GLOBAL_BOOL(lp_kernel_change_notify, &Globals.bKernelChangeNotify)
+FN_GLOBAL_BOOL(lp_use_kerberos_keytab, &Globals.bUseKerberosKeytab)
+FN_GLOBAL_BOOL(lp_defer_sharing_violations, &Globals.bDeferSharingViolations)
 FN_GLOBAL_INTEGER(lp_os_level, &Globals.os_level)
 FN_GLOBAL_INTEGER(lp_max_ttl, &Globals.max_ttl)
 FN_GLOBAL_INTEGER(lp_max_wins_ttl, &Globals.max_wins_ttl)
@@ -1785,7 +1796,6 @@ FN_GLOBAL_INTEGER(lp_machine_password_timeout, &Globals.machine_password_timeout
 FN_GLOBAL_INTEGER(lp_change_notify_timeout, &Globals.change_notify_timeout)
 FN_GLOBAL_INTEGER(lp_map_to_guest, &Globals.map_to_guest)
 FN_GLOBAL_INTEGER(lp_min_passwd_length, &Globals.min_passwd_length)
-FN_GLOBAL_BOOL(lp_use_cracklib, &Globals.use_cracklib)
 FN_GLOBAL_INTEGER(lp_oplock_break_wait_time, &Globals.oplock_break_wait_time)
 FN_GLOBAL_INTEGER(lp_lock_spin_count, &Globals.iLockSpinCount)
 FN_GLOBAL_INTEGER(lp_lock_sleep_time, &Globals.iLockSpinTime)
@@ -1801,6 +1811,8 @@ FN_LOCAL_STRING(lp_username, szUsername)
 FN_LOCAL_LIST(lp_invalid_users, szInvalidUsers)
 FN_LOCAL_LIST(lp_valid_users, szValidUsers)
 FN_LOCAL_LIST(lp_admin_users, szAdminUsers)
+FN_LOCAL_STRING(lp_cups_options, szCupsOptions)
+FN_GLOBAL_STRING(lp_cups_server, &Globals.szCupsServer)
 FN_LOCAL_STRING(lp_printcommand, szPrintcommand)
 FN_LOCAL_STRING(lp_lpqcommand, szLpqcommand)
 FN_LOCAL_STRING(lp_lprmcommand, szLprmcommand)
@@ -1831,10 +1843,9 @@ FN_LOCAL_BOOL(lp_msdfs_root, bMSDfsRoot)
 FN_LOCAL_BOOL(lp_autoloaded, autoloaded)
 FN_LOCAL_BOOL(lp_preexec_close, bPreexecClose)
 FN_LOCAL_BOOL(lp_rootpreexec_close, bRootpreexecClose)
-FN_LOCAL_BOOL(lp_casesensitive, bCaseSensitive)
+FN_LOCAL_INTEGER(lp_casesensitive, iCaseSensitive)
 FN_LOCAL_BOOL(lp_preservecase, bCasePreserve)
 FN_LOCAL_BOOL(lp_shortpreservecase, bShortCasePreserve)
-FN_LOCAL_BOOL(lp_casemangle, bCaseMangle)
 FN_LOCAL_BOOL(lp_hide_dot_files, bHideDotFiles)
 FN_LOCAL_BOOL(lp_hide_special_files, bHideSpecialFiles)
 FN_LOCAL_BOOL(lp_hideunreadable, bHideUnReadable)
@@ -1875,6 +1886,7 @@ FN_LOCAL_BOOL(lp_inherit_acls, bInheritACLS)
 FN_LOCAL_BOOL(lp_use_client_driver, bUseClientDriver)
 FN_LOCAL_BOOL(lp_default_devmode, bDefaultDevmode)
 FN_LOCAL_BOOL(lp_nt_acl_support, bNTAclSupport)
+FN_LOCAL_BOOL(lp_force_unknown_acl_user, bForceUnknownAclUser)
 FN_LOCAL_BOOL(lp_ea_support, bEASupport)
 FN_LOCAL_BOOL(_lp_use_sendfile, bUseSendfile)
 FN_LOCAL_BOOL(lp_profile_acls, bProfileAcls)
@@ -2279,6 +2291,10 @@ static int add_a_service(const service *pservice, const char *name)
        copy_service(ServicePtrs[i], &tservice, NULL);
        if (name)
                string_set(&ServicePtrs[i]->szService, name);
+               
+       DEBUG(8,("add_a_service: Creating snum = %d for %s\n", 
+               i, ServicePtrs[i]->szService));
+               
        return (i);
 }
 
@@ -2315,8 +2331,10 @@ BOOL lp_add_home(const char *pszHomename, int iDefaultService,
 
        ServicePtrs[i]->bBrowseable = sDefault.bBrowseable;
 
+       ServicePtrs[i]->autoloaded = True;
+
        DEBUG(3, ("adding home's share [%s] for user '%s' at '%s'\n", pszHomename, 
-              user, newHomedir));
+              user, ServicePtrs[i]->szPath ));
        
        return (True);
 }
@@ -2522,6 +2540,7 @@ static void copy_service(service * pserviceDest, service * pserviceSource, BOOL
                                        strupper_m(*(char **)dest_ptr);
                                        break;
                                case P_LIST:
+                                       str_list_free((char ***)dest_ptr);
                                        str_list_copy((char ***)dest_ptr, *(const char ***)src_ptr);
                                        break;
                                default:
@@ -2704,7 +2723,7 @@ BOOL lp_file_list_changed(void)
  Note: We must *NOT* use string_set() here as ptr points to global_myname.
 ***************************************************************************/
 
-static BOOL handle_netbios_name(const char *pszParmValue, char **ptr)
+static BOOL handle_netbios_name(int snum, const char *pszParmValue, char **ptr)
 {
        BOOL ret;
        pstring netbios_name;
@@ -2722,7 +2741,7 @@ static BOOL handle_netbios_name(const char *pszParmValue, char **ptr)
        return ret;
 }
 
-static BOOL handle_charset(const char *pszParmValue, char **ptr)
+static BOOL handle_charset(int snum, const char *pszParmValue, char **ptr)
 {
        if (strcmp(*ptr, pszParmValue) != 0) {
                string_set(ptr, pszParmValue);
@@ -2731,7 +2750,7 @@ static BOOL handle_charset(const char *pszParmValue, char **ptr)
        return True;
 }
 
-static BOOL handle_workgroup(const char *pszParmValue, char **ptr)
+static BOOL handle_workgroup(int snum, const char *pszParmValue, char **ptr)
 {
        BOOL ret;
        
@@ -2741,7 +2760,7 @@ static BOOL handle_workgroup(const char *pszParmValue, char **ptr)
        return ret;
 }
 
-static BOOL handle_netbios_scope(const char *pszParmValue, char **ptr)
+static BOOL handle_netbios_scope(int snum, const char *pszParmValue, char **ptr)
 {
        BOOL ret;
        
@@ -2751,8 +2770,9 @@ static BOOL handle_netbios_scope(const char *pszParmValue, char **ptr)
        return ret;
 }
 
-static BOOL handle_netbios_aliases(const char *pszParmValue, char **ptr)
+static BOOL handle_netbios_aliases(int snum, const char *pszParmValue, char **ptr)
 {
+       str_list_free(&Globals.szNetbiosAliases);
        Globals.szNetbiosAliases = str_list_make(pszParmValue, NULL);
        return set_netbios_aliases((const char **)Globals.szNetbiosAliases);
 }
@@ -2761,7 +2781,7 @@ static BOOL handle_netbios_aliases(const char *pszParmValue, char **ptr)
  Handle the include operation.
 ***************************************************************************/
 
-static BOOL handle_include(const char *pszParmValue, char **ptr)
+static BOOL handle_include(int snum, const char *pszParmValue, char **ptr)
 {
        pstring fname;
        pstrcpy(fname, pszParmValue);
@@ -2784,7 +2804,7 @@ static BOOL handle_include(const char *pszParmValue, char **ptr)
  Handle the interpretation of the copy parameter.
 ***************************************************************************/
 
-static BOOL handle_copy(const char *pszParmValue, char **ptr)
+static BOOL handle_copy(int snum, const char *pszParmValue, char **ptr)
 {
        BOOL bRetval;
        int iTemp;
@@ -2865,7 +2885,7 @@ BOOL lp_idmap_gid(gid_t *low, gid_t *high)
 
 /* Do some simple checks on "idmap [ug]id" parameter values */
 
-static BOOL handle_idmap_uid(const char *pszParmValue, char **ptr)
+static BOOL handle_idmap_uid(int snum, const char *pszParmValue, char **ptr)
 {
        uint32 low, high;
 
@@ -2882,7 +2902,7 @@ static BOOL handle_idmap_uid(const char *pszParmValue, char **ptr)
        return True;
 }
 
-static BOOL handle_idmap_gid(const char *pszParmValue, char **ptr)
+static BOOL handle_idmap_gid(int snum, const char *pszParmValue, char **ptr)
 {
        uint32 low, high;
 
@@ -2903,7 +2923,7 @@ static BOOL handle_idmap_gid(const char *pszParmValue, char **ptr)
  Handle the DEBUG level list.
 ***************************************************************************/
 
-static BOOL handle_debug_list( const char *pszParmValueIn, char **ptr )
+static BOOL handle_debug_list( int snum, const char *pszParmValueIn, char **ptr )
 {
        pstring pszParmValue;
 
@@ -2968,7 +2988,7 @@ char *lp_ldap_idmap_suffix(void)
 /***************************************************************************
 ***************************************************************************/
 
-static BOOL handle_acl_compatibility(const char *pszParmValue, char **ptr)
+static BOOL handle_acl_compatibility(int snum, const char *pszParmValue, char **ptr)
 {
        if (strequal(pszParmValue, "auto"))
                string_set(ptr, "");
@@ -2982,6 +3002,47 @@ static BOOL handle_acl_compatibility(const char *pszParmValue, char **ptr)
        return True;
 }
 
+/****************************************************************************
+ set the value for a P_ENUM
+ ***************************************************************************/
+
+static void lp_set_enum_parm( struct parm_struct *parm, const char *pszParmValue,
+                              int *ptr )
+{
+       int i;
+
+       for (i = 0; parm->enum_list[i].name; i++) {
+               if ( strequal(pszParmValue, parm->enum_list[i].name)) {
+                       *ptr = parm->enum_list[i].value;
+                       break;
+               }
+       }
+}
+
+/***************************************************************************
+***************************************************************************/
+
+static BOOL handle_printing(int snum, const char *pszParmValue, char **ptr)
+{
+       static int parm_num = -1;
+       service *s;
+
+       if ( parm_num == -1 )
+               parm_num = map_parameter( "printing" );
+
+       lp_set_enum_parm( &parm_table[parm_num], pszParmValue, (int*)ptr );
+
+       if ( snum < 0 )
+               s = &sDefault;
+       else
+               s = ServicePtrs[snum];
+
+       init_printer_values( s );
+
+       return True;
+}
+
+
 /***************************************************************************
  Initialise a copymap.
 ***************************************************************************/
@@ -3104,7 +3165,7 @@ BOOL lp_do_parameter(int snum, const char *pszParmName, const char *pszParmValue
 
        /* if it is a special case then go ahead */
        if (parm_table[parmnum].special) {
-               parm_table[parmnum].special(pszParmValue, (char **)parm_ptr);
+               parm_table[parmnum].special(snum, pszParmValue, (char **)parm_ptr);
                return (True);
        }
 
@@ -3156,16 +3217,7 @@ BOOL lp_do_parameter(int snum, const char *pszParmName, const char *pszParmValue
                        break;
 
                case P_ENUM:
-                       for (i = 0; parm_table[parmnum].enum_list[i].name; i++) {
-                               if (strequal
-                                   (pszParmValue,
-                                    parm_table[parmnum].enum_list[i].name)) {
-                                       *(int *)parm_ptr =
-                                               parm_table[parmnum].
-                                               enum_list[i].value;
-                                       break;
-                               }
-                       }
+                       lp_set_enum_parm( &parm_table[parmnum], pszParmValue, (int*)parm_ptr );
                        break;
                case P_SEP:
                        break;
@@ -3233,9 +3285,9 @@ static void print_parameter(struct parm_struct *p, void *ptr, FILE * f)
                                char **list = *(char ***)ptr;
                                
                                for (; *list; list++) {
-                                       /* surround strings with whitespace in single quotes */
+                                       /* surround strings with whitespace in double quotes */
                                        if ( strchr_m( *list, ' ' ) )
-                                               fprintf(f, "\'%s\'%s", *list, ((*(list+1))?", ":""));
+                                               fprintf(f, "\"%s\"%s", *list, ((*(list+1))?", ":""));
                                        else
                                                fprintf(f, "%s%s", *list, ((*(list+1))?", ":""));
                                }
@@ -3463,11 +3515,14 @@ static void dump_a_service(service * pService, FILE * f)
        if (pService != &sDefault)
                fprintf(f, "\n[%s]\n", pService->szService);
 
-       for (i = 0; parm_table[i].label; i++)
+       for (i = 0; parm_table[i].label; i++) {
+
                if (parm_table[i].class == P_LOCAL &&
                    parm_table[i].ptr &&
                    (*parm_table[i].label != '-') &&
-                   (i == 0 || (parm_table[i].ptr != parm_table[i - 1].ptr))) {
+                   (i == 0 || (parm_table[i].ptr != parm_table[i - 1].ptr))) 
+               {
+               
                        int pdiff = PTR_DIFF(parm_table[i].ptr, &sDefault);
 
                        if (pService == &sDefault) {
@@ -3486,14 +3541,16 @@ static void dump_a_service(service * pService, FILE * f)
                        print_parameter(&parm_table[i],
                                        ((char *)pService) + pdiff, f);
                        fprintf(f, "\n");
+               }
        }
+
        if (pService->param_opt != NULL) {
                data = pService->param_opt;
                while(data) {
                        fprintf(f, "\t%s = %s\n", data->key, data->value);
                        data = data->next;
                }
-        }
+       }
 }
 
 
@@ -3656,6 +3713,10 @@ void lp_killunused(BOOL (*snumused) (int))
                if (!VALID(i))
                        continue;
 
+               /* don't kill autoloaded services */
+               if ( ServicePtrs[i]->autoloaded )
+                       continue;
+
                if (!snumused || !snumused(i)) {
                        ServicePtrs[i]->valid = False;
                        free_service(ServicePtrs[i]);
@@ -3825,11 +3886,12 @@ BOOL lp_load(const char *pszFname, BOOL global_only, BOOL save_defaults,
        
        /* get the username for substituion -- preference to the current_user_info */
        
-       if ( strlen( current_user_info.smb_name ) != 0 )
+       if ( strlen( current_user_info.smb_name ) != 0 ) {
                username = current_user_info.smb_name;
-       else
+       } else {
                username = sub_get_smb_name();
-               
+       }
+
        standard_sub_basic( username, n2,sizeof(n2) );
 
        add_to_file_list(pszFname, n2);
@@ -3844,8 +3906,7 @@ BOOL lp_load(const char *pszFname, BOOL global_only, BOOL save_defaults,
        init_globals();
        debug_init();
 
-       if (save_defaults)
-       {
+       if (save_defaults) {
                init_locals();
                lp_save_defaults();
        }
@@ -3895,7 +3956,6 @@ BOOL lp_load(const char *pszFname, BOOL global_only, BOOL save_defaults,
        }
 
        init_iconv();
-       init_printer_values(&sDefault);
 
        return (bRetval);
 }
@@ -4215,8 +4275,11 @@ const char *get_called_name(void)
        extern fstring local_machine;
        static fstring called_name;
 
-       if (!*local_machine) {
-               fstrcpy(called_name, get_my_primary_ip());
+       if ( (!*local_machine) ||
+            (client_socket_port() == 445) ) {
+               /* Everybody coming in on 445 should be able to live with the
+                * IP address */
+               fstrcpy(called_name, client_socket_addr());
                DEBUG(8,("get_called_name: assuming that client used IP address [%s] as called name.\n",
                         called_name));
                return called_name;
@@ -4244,5 +4307,33 @@ int lp_maxprintjobs(int snum)
 
 BOOL lp_use_sendfile(int snum)
 {
-       return (_lp_use_sendfile(snum) && !srv_is_signing_active());
+       extern int Protocol;
+       /* Using sendfile blows the brains out of any DOS or Win9x TCP stack... JRA. */
+       if (Protocol < PROTOCOL_NT1) {
+               return False;
+       }
+       return (_lp_use_sendfile(snum) && (get_remote_arch() != RA_WIN95) && !srv_is_signing_active());
+}
+
+/*******************************************************************
+ Turn off sendfile if we find the underlying OS doesn't support it.
+********************************************************************/
+
+void set_use_sendfile(int snum, BOOL val)
+{
+       if (LP_SNUM_OK(snum))
+               ServicePtrs[snum]->bUseSendfile = val;
+       else
+               sDefault.bUseSendfile = val;
+}
+
+/*******************************************************************
+ Turn off storing DOS attributes if this share doesn't support it.
+********************************************************************/
+
+void set_store_dos_attributes(int snum, BOOL val)
+{
+       if (!LP_SNUM_OK(snum))
+               return;
+       ServicePtrs[(snum)]->bStoreDosAttributes = val;
 }