r2331: check password script code and example from trunk
[sfrench/samba-autobuild/.git] / source3 / param / loadparm.c
index 107e500a51bff35ff66c02c7ddcdd64ae9d9c257..24811af37ddf7eb8c91ba378fe1f4a2284dd12dd 100644 (file)
@@ -156,6 +156,7 @@ typedef struct
        char *szAddMachineScript;
        char *szShutdownScript;
        char *szAbortShutdownScript;
+       char *szCheckPasswordScript;
        char *szWINSHook;
        char *szWINSPartners;
        char *szUtmpDir;
@@ -176,7 +177,7 @@ typedef struct
        BOOL bWinbindTrustedDomainsOnly;
        BOOL bWinbindNestedGroups;
        char *szWinbindBackend;
-       char *szIdmapBackend;
+       char **szIdmapBackend;
        char *szAddShareCommand;
        char *szChangeShareCommand;
        char *szDeleteShareCommand;
@@ -200,7 +201,6 @@ typedef struct
        int lpqcachetime;
        int iMaxSmbdProcesses;
        BOOL bDisableSpoolss;
-       int iTotalPrintJobs;
        int syslog;
        int os_level;
        int enhanced_browsing;
@@ -234,6 +234,7 @@ typedef struct
        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;
@@ -288,6 +289,7 @@ typedef struct
        BOOL bDisableNetbios;
        BOOL bKernelChangeNotify;
        BOOL bUseKerberosKeytab;
+       BOOL bDeferSharingViolations;
        int restrict_anonymous;
        int name_cache_timeout;
        int client_signing;
@@ -412,12 +414,12 @@ typedef struct
        BOOL bUseClientDriver;
        BOOL bDefaultDevmode;
        BOOL bNTAclSupport;
+       BOOL bForceUnknownAclUser;
        BOOL bUseSendfile;
        BOOL bProfileAcls;
        BOOL bMap_acl_inherit;
        BOOL bAfs_Share;
        BOOL bEASupport;
-       BOOL bDeferSharingViolations;
        param_opt_struct *param_opt;
 
        char dummy[3];          /* for alignment */
@@ -536,12 +538,12 @@ static service sDefault = {
        False,                  /* bUseClientDriver */
        False,                  /* bDefaultDevmode */
        True,                   /* bNTAclSupport */
-       False,                  /* bUseSendfile */
+       False,                  /* bForceUnknownAclUser */
+       True,                   /* bUseSendfile */
        False,                  /* bProfileAcls */
        False,                  /* bMap_acl_inherit */
        False,                  /* bAfs_Share */
        False,                  /* bEASupport */
-       True,                   /* bDeferSharingViolations */
        
        NULL,                   /* Parametric options */
 
@@ -810,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}, 
@@ -850,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}, 
@@ -894,7 +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_LOCAL, &sDefault.bDeferSharingViolations, NULL, 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}, 
@@ -1077,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}, 
@@ -1116,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}, 
@@ -1161,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}, 
@@ -1195,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:
@@ -1227,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;
@@ -1249,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;
 
@@ -1313,6 +1300,8 @@ static void init_globals(void)
 
                string_set(&sDefault.fstype, FSTYPE_STRING);
 
+               init_printer_values(&sDefault);
+
                done_init = True;
        }
 
@@ -1386,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;
@@ -1485,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:
@@ -1523,7 +1512,7 @@ static void init_globals(void)
        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;
@@ -1540,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);
 }
 
@@ -1690,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)
@@ -1704,7 +1696,7 @@ 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
@@ -1718,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)
@@ -1774,6 +1767,7 @@ 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)
@@ -1892,8 +1886,8 @@ 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_defer_sharing_violations, bDeferSharingViolations)
 FN_LOCAL_BOOL(_lp_use_sendfile, bUseSendfile)
 FN_LOCAL_BOOL(lp_profile_acls, bProfileAcls)
 FN_LOCAL_BOOL(lp_map_acl_inherit, bMap_acl_inherit)
@@ -2297,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);
 }
 
@@ -2336,7 +2334,7 @@ BOOL lp_add_home(const char *pszHomename, int iDefaultService,
        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);
 }
@@ -3544,14 +3542,14 @@ static void dump_a_service(service * pService, FILE * f)
                                        ((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;
-                       }
-               }
+       if (pService->param_opt != NULL) {
+               data = pService->param_opt;
+               while(data) {
+                       fprintf(f, "\t%s = %s\n", data->key, data->value);
+                       data = data->next;
+               }
        }
 }
 
@@ -3958,9 +3956,6 @@ BOOL lp_load(const char *pszFname, BOOL global_only, BOOL save_defaults,
        }
 
        init_iconv();
-#if 0  /* JERRY */
-       init_printer_values(&sDefault);
-#endif
 
        return (bRetval);
 }
@@ -4312,7 +4307,24 @@ 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;
 }
 
 /*******************************************************************