2 Unix SMB/CIFS implementation.
3 Parameter loading functions
4 Copyright (C) Karl Auer 1993-1998
6 Largely re-written by Andrew Tridgell, September 1994
8 Copyright (C) Simo Sorce 2001
9 Copyright (C) Alexander Bokovoy 2002
11 This program is free software; you can redistribute it and/or modify
12 it under the terms of the GNU General Public License as published by
13 the Free Software Foundation; either version 2 of the License, or
14 (at your option) any later version.
16 This program is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 GNU General Public License for more details.
21 You should have received a copy of the GNU General Public License
22 along with this program; if not, write to the Free Software
23 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
29 * This module provides suitable callback functions for the params
30 * module. It builds the internal table of service details which is
31 * then used by the rest of the server.
35 * 1) add it to the global or service structure definition
36 * 2) add it to the parm_table
37 * 3) add it to the list of available functions (eg: using FN_GLOBAL_STRING())
38 * 4) If it's a global then initialise it in init_globals. If a local
39 * (ie. service) parameter then initialise it in the sDefault structure
43 * The configuration file is processed sequentially for speed. It is NOT
44 * accessed randomly as happens in 'real' Windows. For this reason, there
45 * is a fair bit of sequence-dependent code here - ie., code which assumes
46 * that certain things happen before others. In particular, the code which
47 * happens at the boundary between sections is delicately poised, so be
54 BOOL in_client = False; /* Not in the client by default */
57 extern userdom_struct current_user_info;
58 extern pstring user_socket_options;
59 extern pstring global_myname;
60 pstring global_scope = "";
63 #define GLOBAL_NAME "global"
67 #define PRINTERS_NAME "printers"
71 #define HOMES_NAME "homes"
74 /* some helpful bits */
75 #define LP_SNUM_OK(i) (((i) >= 0) && ((i) < iNumServices) && ServicePtrs[(i)]->valid)
76 #define VALID(i) ServicePtrs[i]->valid
78 int keepalive = DEFAULT_KEEPALIVE;
79 BOOL use_getwd_cache = True;
81 extern int extra_time_offset;
83 static BOOL defaults_saved = False;
86 * This structure describes global (ie., server-wide) parameters.
93 char *display_charset;
95 char *szEnumPortsCommand;
96 char *szAddPrinterCommand;
97 char *szDeletePrinterCommand;
102 char *szDefaultService;
106 char *szServerString;
107 char *szAutoServices;
108 char *szPasswdProgram;
112 char *szSMBPasswdFile;
114 char **szPassdbBackend;
116 char *szPasswordServer;
117 char *szSocketOptions;
126 char **szWINSservers;
128 char *szRemoteAnnounce;
129 char *szRemoteBrowseSync;
130 char *szSocketAddress;
131 char *szNISHomeMapName;
132 char *szAnnounceVersion; /* This is initialised in init_globals */
133 char **szNetbiosAliases;
134 char *szDomainOtherSIDs;
135 char *szNameResolveOrder;
137 char *szAddUserScript;
138 char *szDelUserScript;
139 char *szAddGroupScript;
140 char *szDelGroupScript;
141 char *szAddUserToGroupScript;
142 char *szDelUserFromGroupScript;
143 char *szSetPrimaryGroupScript;
144 char *szAddMachineScript;
145 char *szShutdownScript;
146 char *szAbortShutdownScript;
148 char *szWINSPartners;
157 char *szNonUnixAccountRange;
158 BOOL bAlgorithmicRidBase;
159 char *szTemplateHomedir;
160 char *szTemplateShell;
161 char *szWinbindSeparator;
162 BOOL bWinbindEnumUsers;
163 BOOL bWinbindEnumGroups;
164 BOOL bWinbindUseDefaultDomain;
165 char *szAddShareCommand;
166 char *szChangeShareCommand;
167 char *szDeleteShareCommand;
168 char *szGuestaccount;
169 char *szManglingMethod;
184 BOOL paranoid_server_security;
187 int iMaxSmbdProcesses;
188 BOOL bDisableSpoolss;
192 int enhanced_browsing;
199 int announce_as; /* This is initialised in init_globals */
200 int machine_password_timeout;
201 int change_notify_timeout;
204 int min_passwd_length;
205 int oplock_break_wait_time;
206 int winbind_cache_time;
209 char *szLdapMachineSuffix;
210 char *szLdapUserSuffix;
211 #ifdef WITH_LDAP_SAMCONFIG
219 int ldap_passwd_sync;
220 BOOL bMsAddPrinterWizard;
225 BOOL bPreferredMaster;
228 BOOL bEncryptPasswords;
232 BOOL bObeyPamRestrictions;
234 BOOL bLargeReadwrite;
237 BOOL bReadPrediction;
243 BOOL bBindInterfacesOnly;
244 BOOL bPamPasswordChange;
245 BOOL bUnixPasswdSync;
246 BOOL bPasswdChatDebug;
250 BOOL bNTStatusSupport;
253 BOOL bAllowTrustedDomains;
256 BOOL bDebugHiresTimestamp;
260 BOOL bHideLocalUsers;
263 BOOL bHostnameLookups;
265 BOOL bUnixExtensions;
266 BOOL bDisableNetbios;
267 int restrict_anonymous;
268 int name_cache_timeout;
272 static global Globals;
277 * This structure describes a single service.
286 char **szInvalidUsers;
294 char *szRootPostExec;
295 char *szPrintcommand;
298 char *szLppausecommand;
299 char *szLpresumecommand;
300 char *szQueuepausecommand;
301 char *szQueueresumecommand;
311 char *szVetoOplockFiles;
317 char **printer_admin;
320 char *szVfsObjectFile;
327 int iCreate_force_mode;
329 int iSecurity_force_mode;
332 int iDir_Security_mask;
333 int iDir_Security_force_mode;
337 int iOplockContentionLimit;
341 BOOL bRootpreexecClose;
344 BOOL bShortCasePreserve;
347 BOOL bHideSpecialFiles;
348 BOOL bHideUnReadable;
349 BOOL bHideUnWriteableFiles;
371 BOOL bStrictAllocate;
375 BOOL bDeleteReadonly;
377 BOOL bDeleteVetoFiles;
380 BOOL bDosFiletimeResolution;
381 BOOL bFakeDirCreateTimes;
386 BOOL bUseClientDriver;
387 BOOL bDefaultDevmode;
392 char dummy[3]; /* for alignment */
397 /* This is a default service used to prime a services structure */
398 static service sDefault = {
400 False, /* not autoloaded */
401 NULL, /* szService */
403 NULL, /* szUsername */
404 NULL, /* szInvalidUsers */
405 NULL, /* szValidUsers */
406 NULL, /* szAdminUsers */
408 NULL, /* szInclude */
409 NULL, /* szPreExec */
410 NULL, /* szPostExec */
411 NULL, /* szRootPreExec */
412 NULL, /* szRootPostExec */
413 NULL, /* szPrintcommand */
414 NULL, /* szLpqcommand */
415 NULL, /* szLprmcommand */
416 NULL, /* szLppausecommand */
417 NULL, /* szLpresumecommand */
418 NULL, /* szQueuepausecommand */
419 NULL, /* szQueueresumecommand */
420 NULL, /* szPrintername */
421 NULL, /* szDontdescend */
422 NULL, /* szHostsallow */
423 NULL, /* szHostsdeny */
424 NULL, /* szMagicScript */
425 NULL, /* szMagicOutput */
426 NULL, /* szMangledMap */
427 NULL, /* szVetoFiles */
428 NULL, /* szHideFiles */
429 NULL, /* szVetoOplockFiles */
431 NULL, /* force user */
432 NULL, /* force group */
434 NULL, /* writelist */
435 NULL, /* printer admin */
438 NULL, /* vfs object */
439 NULL, /* vfs options */
441 0, /* iMinPrintSpace */
442 1000, /* iMaxPrintJobs */
443 0, /* iWriteCacheSize */
444 0744, /* iCreate_mask */
445 0000, /* iCreate_force_mode */
446 0777, /* iSecurity_mask */
447 0, /* iSecurity_force_mode */
448 0755, /* iDir_mask */
449 0000, /* iDir_force_mode */
450 0777, /* iDir_Security_mask */
451 0, /* iDir_Security_force_mode */
452 0, /* iMaxConnections */
453 CASE_LOWER, /* iDefaultCase */
454 DEFAULT_PRINTING, /* iPrinting */
455 2, /* iOplockContentionLimit */
457 1024, /* iBlock_size */
458 False, /* bPreexecClose */
459 False, /* bRootpreexecClose */
460 False, /* case sensitive */
461 True, /* case preserve */
462 True, /* short case preserve */
463 False, /* case mangle */
464 True, /* bHideDotFiles */
465 False, /* bHideSpecialFiles */
466 False, /* bHideUnReadable */
467 False, /* bHideUnWriteableFiles */
468 True, /* bBrowseable */
469 True, /* bAvailable */
470 True, /* bRead_only */
471 True, /* bNo_set_dir */
472 False, /* bGuest_only */
473 False, /* bGuest_ok */
474 False, /* bPrint_ok */
475 False, /* bMap_system */
476 False, /* bMap_hidden */
477 True, /* bMap_archive */
479 True, /* bStrictLocking */
480 True, /* bPosixLocking */
481 True, /* bShareModes */
483 True, /* bLevel2OpLocks */
484 False, /* bOnlyUser */
485 True, /* bMangledNames */
486 True, /* bWidelinks */
487 True, /* bSymlinks */
488 False, /* bSyncAlways */
489 False, /* bStrictAllocate */
490 False, /* bStrictSync */
491 '~', /* magic char */
493 False, /* bDeleteReadonly */
494 False, /* bFakeOplocks */
495 False, /* bDeleteVetoFiles */
496 False, /* bDosFilemode */
497 False, /* bDosFiletimes */
498 False, /* bDosFiletimeResolution */
499 False, /* bFakeDirCreateTimes */
500 True, /* bBlockingLocks */
501 False, /* bInheritPerms */
502 False, /* bInheritACLS */
503 False, /* bMSDfsRoot */
504 False, /* bUseClientDriver */
505 False, /* bDefaultDevmode */
506 True, /* bNTAclSupport */
507 False, /* bUseSendfile */
508 False, /* bProfileAcls */
513 /* local variables */
514 static service **ServicePtrs = NULL;
515 static int iNumServices = 0;
516 static int iServiceIndex = 0;
517 static BOOL bInGlobalSection = True;
518 static BOOL bGlobalOnly = False;
519 static int server_role;
520 static int default_server_announce;
522 #define NUMPARAMETERS (sizeof(parm_table) / sizeof(struct parm_struct))
524 /* prototypes for the special type handlers */
525 static BOOL handle_include(char *pszParmValue, char **ptr);
526 static BOOL handle_copy(char *pszParmValue, char **ptr);
527 static BOOL handle_vfs_object(char *pszParmValue, char **ptr);
528 static BOOL handle_source_env(char *pszParmValue, char **ptr);
529 static BOOL handle_netbios_name(char *pszParmValue, char **ptr);
530 static BOOL handle_winbind_uid(char *pszParmValue, char **ptr);
531 static BOOL handle_winbind_gid(char *pszParmValue, char **ptr);
532 static BOOL handle_non_unix_account_range(char *pszParmValue, char **ptr);
533 static BOOL handle_debug_list( char *pszParmValue, char **ptr );
535 static BOOL handle_ldap_machine_suffix ( char *pszParmValue, char **ptr );
536 static BOOL handle_ldap_user_suffix ( char *pszParmValue, char **ptr );
537 static BOOL handle_ldap_suffix ( char *pszParmValue, char **ptr );
539 static void set_server_role(void);
540 static void set_default_server_announce_type(void);
542 static struct enum_list enum_protocol[] = {
543 {PROTOCOL_NT1, "NT1"},
544 {PROTOCOL_LANMAN2, "LANMAN2"},
545 {PROTOCOL_LANMAN1, "LANMAN1"},
546 {PROTOCOL_CORE, "CORE"},
547 {PROTOCOL_COREPLUS, "COREPLUS"},
548 {PROTOCOL_COREPLUS, "CORE+"},
552 static struct enum_list enum_security[] = {
553 {SEC_SHARE, "SHARE"},
555 {SEC_SERVER, "SERVER"},
556 {SEC_DOMAIN, "DOMAIN"},
563 static struct enum_list enum_printing[] = {
564 {PRINT_SYSV, "sysv"},
566 {PRINT_HPUX, "hpux"},
570 {PRINT_LPRNG, "lprng"},
571 {PRINT_SOFTQ, "softq"},
572 {PRINT_CUPS, "cups"},
574 {PRINT_LPROS2, "os2"},
576 {PRINT_TEST, "test"},
578 #endif /* DEVELOPER */
582 static struct enum_list enum_ldap_ssl[] = {
583 {LDAP_SSL_ON, "Yes"},
584 {LDAP_SSL_ON, "yes"},
587 {LDAP_SSL_OFF, "no"},
588 {LDAP_SSL_OFF, "No"},
589 {LDAP_SSL_OFF, "off"},
590 {LDAP_SSL_OFF, "Off"},
591 {LDAP_SSL_START_TLS, "start tls"},
592 {LDAP_SSL_START_TLS, "Start_tls"},
596 static struct enum_list enum_ldap_passwd_sync[] = {
597 {LDAP_PASSWD_SYNC_ON, "Yes"},
598 {LDAP_PASSWD_SYNC_ON, "yes"},
599 {LDAP_PASSWD_SYNC_ON, "on"},
600 {LDAP_PASSWD_SYNC_ON, "On"},
601 {LDAP_PASSWD_SYNC_OFF, "no"},
602 {LDAP_PASSWD_SYNC_OFF, "No"},
603 {LDAP_PASSWD_SYNC_OFF, "off"},
604 {LDAP_PASSWD_SYNC_OFF, "Off"},
605 #ifdef LDAP_EXOP_X_MODIFY_PASSWD
606 {LDAP_PASSWD_SYNC_ONLY, "Only"},
607 {LDAP_PASSWD_SYNC_ONLY, "only"},
608 #endif /* LDAP_EXOP_X_MODIFY_PASSWD */
612 /* Types of machine we can announce as. */
613 #define ANNOUNCE_AS_NT_SERVER 1
614 #define ANNOUNCE_AS_WIN95 2
615 #define ANNOUNCE_AS_WFW 3
616 #define ANNOUNCE_AS_NT_WORKSTATION 4
618 static struct enum_list enum_announce_as[] = {
619 {ANNOUNCE_AS_NT_SERVER, "NT"},
620 {ANNOUNCE_AS_NT_SERVER, "NT Server"},
621 {ANNOUNCE_AS_NT_WORKSTATION, "NT Workstation"},
622 {ANNOUNCE_AS_WIN95, "win95"},
623 {ANNOUNCE_AS_WFW, "WfW"},
627 static struct enum_list enum_case[] = {
628 {CASE_LOWER, "lower"},
629 {CASE_UPPER, "upper"},
633 static struct enum_list enum_bool_auto[] = {
644 /* Client-side offline caching policy types */
645 #define CSC_POLICY_MANUAL 0
646 #define CSC_POLICY_DOCUMENTS 1
647 #define CSC_POLICY_PROGRAMS 2
648 #define CSC_POLICY_DISABLE 3
650 static struct enum_list enum_csc_policy[] = {
651 {CSC_POLICY_MANUAL, "manual"},
652 {CSC_POLICY_DOCUMENTS, "documents"},
653 {CSC_POLICY_PROGRAMS, "programs"},
654 {CSC_POLICY_DISABLE, "disable"},
659 Do you want session setups at user level security with a invalid
660 password to be rejected or allowed in as guest? WinNT rejects them
661 but it can be a pain as it means "net view" needs to use a password
663 You have 3 choices in the setting of map_to_guest:
665 "Never" means session setups with an invalid password
666 are rejected. This is the default.
668 "Bad User" means session setups with an invalid password
669 are rejected, unless the username does not exist, in which case it
670 is treated as a guest login
672 "Bad Password" means session setups with an invalid password
673 are treated as a guest login
675 Note that map_to_guest only has an effect in user or server
679 static struct enum_list enum_map_to_guest[] = {
680 {NEVER_MAP_TO_GUEST, "Never"},
681 {MAP_TO_GUEST_ON_BAD_USER, "Bad User"},
682 {MAP_TO_GUEST_ON_BAD_PASSWORD, "Bad Password"},
686 /* Note: We do not initialise the defaults union - it is not allowed in ANSI C
688 * Note: We have a flag called FLAG_DEVELOPER but is not used at this time, it
689 * is implied in current control logic. This may change at some later time. A
690 * flag value of 0 means - show as development option only.
692 * The FLAG_HIDE is explicit. Paramters set this way do NOT appear in any edit
693 * screen in SWAT. This is used to exclude parameters as well as to squash all
694 * parameters that have been duplicated by pseudonyms.
696 static struct parm_struct parm_table[] = {
697 {"Base Options", P_SEP, P_SEPARATOR},
699 {"dos charset", P_STRING, P_GLOBAL, &Globals.dos_charset, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
700 {"unix charset", P_STRING, P_GLOBAL, &Globals.unix_charset, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
701 {"display charset", P_STRING, P_GLOBAL, &Globals.display_charset, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
702 {"comment", P_STRING, P_LOCAL, &sDefault.comment, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT | FLAG_DEVELOPER},
703 {"path", P_STRING, P_LOCAL, &sDefault.szPath, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT | FLAG_DEVELOPER},
704 {"directory", P_STRING, P_LOCAL, &sDefault.szPath, NULL, NULL, FLAG_HIDE},
705 {"workgroup", P_USTRING, P_GLOBAL, &Globals.szWorkGroup, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD | FLAG_DEVELOPER},
706 {"realm", P_USTRING, P_GLOBAL, &Globals.szRealm, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD | FLAG_DEVELOPER},
707 {"ADS server", P_STRING, P_GLOBAL, &Globals.szADSserver, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD | FLAG_DEVELOPER},
708 {"netbios name", P_UGSTRING, P_GLOBAL, global_myname, handle_netbios_name, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD | FLAG_DEVELOPER},
709 {"netbios aliases", P_LIST, P_GLOBAL, &Globals.szNetbiosAliases, NULL, NULL, FLAG_ADVANCED | FLAG_WIZARD | FLAG_DEVELOPER},
710 {"netbios scope", P_UGSTRING, P_GLOBAL, global_scope, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
711 {"server string", P_STRING, P_GLOBAL, &Globals.szServerString, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_DEVELOPER},
712 {"interfaces", P_LIST, P_GLOBAL, &Globals.szInterfaces, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD | FLAG_DEVELOPER},
713 {"bind interfaces only", P_BOOL, P_GLOBAL, &Globals.bBindInterfacesOnly, NULL, NULL, FLAG_ADVANCED | FLAG_WIZARD | FLAG_DEVELOPER},
715 {"Security Options", P_SEP, P_SEPARATOR},
717 {"security", P_ENUM, P_GLOBAL, &Globals.security, NULL, enum_security, FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD | FLAG_DEVELOPER},
718 {"auth methods", P_LIST, P_GLOBAL, &Globals.AuthMethods, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD | FLAG_DEVELOPER},
719 {"encrypt passwords", P_BOOL, P_GLOBAL, &Globals.bEncryptPasswords, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD | FLAG_DEVELOPER},
720 {"update encrypted", P_BOOL, P_GLOBAL, &Globals.bUpdateEncrypt, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_DEVELOPER},
721 {"allow trusted domains", P_BOOL, P_GLOBAL, &Globals.bAllowTrustedDomains, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
722 {"hosts equiv", P_STRING, P_GLOBAL, &Globals.szHostsEquiv, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
723 {"min passwd length", P_INTEGER, P_GLOBAL, &Globals.min_passwd_length, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
724 {"min password length", P_INTEGER, P_GLOBAL, &Globals.min_passwd_length, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
725 {"map to guest", P_ENUM, P_GLOBAL, &Globals.map_to_guest, NULL, enum_map_to_guest, FLAG_ADVANCED | FLAG_DEVELOPER},
726 {"null passwords", P_BOOL, P_GLOBAL, &Globals.bNullPasswords, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
727 {"obey pam restrictions", P_BOOL, P_GLOBAL, &Globals.bObeyPamRestrictions, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
728 {"password server", P_STRING, P_GLOBAL, &Globals.szPasswordServer, NULL, NULL, FLAG_ADVANCED | FLAG_WIZARD | FLAG_DEVELOPER},
729 {"smb passwd file", P_STRING, P_GLOBAL, &Globals.szSMBPasswdFile, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
730 {"private dir", P_STRING, P_GLOBAL, &Globals.szPrivateDir, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
731 {"passdb backend", P_LIST, P_GLOBAL, &Globals.szPassdbBackend, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
732 {"sam backend", P_LIST, P_GLOBAL, &Globals.szSamBackend, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
733 {"non unix account range", P_STRING, P_GLOBAL, &Globals.szNonUnixAccountRange, handle_non_unix_account_range, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
734 {"algorithmic rid base", P_INTEGER, P_GLOBAL, &Globals.bAlgorithmicRidBase, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
735 {"root directory", P_STRING, P_GLOBAL, &Globals.szRootdir, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
736 {"root dir", P_STRING, P_GLOBAL, &Globals.szRootdir, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
737 {"root", P_STRING, P_GLOBAL, &Globals.szRootdir, NULL, NULL, FLAG_HIDE | FLAG_DEVELOPER},
738 {"guest account", P_STRING, P_GLOBAL, &Globals.szGuestaccount, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_DEVELOPER},
740 {"pam password change", P_BOOL, P_GLOBAL, &Globals.bPamPasswordChange, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
741 {"passwd program", P_STRING, P_GLOBAL, &Globals.szPasswdProgram, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
742 {"passwd chat", P_STRING, P_GLOBAL, &Globals.szPasswdChat, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
743 {"passwd chat debug", P_BOOL, P_GLOBAL, &Globals.bPasswdChatDebug, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
744 {"username map", P_STRING, P_GLOBAL, &Globals.szUsernameMap, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER | FLAG_DEVELOPER},
745 {"password level", P_INTEGER, P_GLOBAL, &Globals.pwordlevel, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
746 {"username level", P_INTEGER, P_GLOBAL, &Globals.unamelevel, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
747 {"unix password sync", P_BOOL, P_GLOBAL, &Globals.bUnixPasswdSync, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
748 {"restrict anonymous", P_INTEGER, P_GLOBAL, &Globals.restrict_anonymous, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
749 {"lanman auth", P_BOOL, P_GLOBAL, &Globals.bLanmanAuth, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
750 {"ntlm auth", P_BOOL, P_GLOBAL, &Globals.bNTLMAuth, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
752 {"username", P_STRING, P_LOCAL, &sDefault.szUsername, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
753 {"user", P_STRING, P_LOCAL, &sDefault.szUsername, NULL, NULL, FLAG_HIDE},
754 {"users", P_STRING, P_LOCAL, &sDefault.szUsername, NULL, NULL, FLAG_HIDE},
756 {"invalid users", P_LIST, P_LOCAL, &sDefault.szInvalidUsers, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
757 {"valid users", P_LIST, P_LOCAL, &sDefault.szValidUsers, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
758 {"admin users", P_LIST, P_LOCAL, &sDefault.szAdminUsers, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
759 {"read list", P_LIST, P_LOCAL, &sDefault.readlist, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
760 {"write list", P_LIST, P_LOCAL, &sDefault.writelist, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
761 {"printer admin", P_LIST, P_LOCAL, &sDefault.printer_admin, NULL, NULL, FLAG_GLOBAL | FLAG_PRINT},
762 {"force user", P_STRING, P_LOCAL, &sDefault.force_user, NULL, NULL, FLAG_SHARE},
763 {"force group", P_STRING, P_LOCAL, &sDefault.force_group, NULL, NULL, FLAG_SHARE},
764 {"group", P_STRING, P_LOCAL, &sDefault.force_group, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
766 {"read only", P_BOOL, P_LOCAL, &sDefault.bRead_only, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE},
767 {"write ok", P_BOOLREV, P_LOCAL, &sDefault.bRead_only, NULL, NULL, FLAG_HIDE},
768 {"writeable", P_BOOLREV, P_LOCAL, &sDefault.bRead_only, NULL, NULL, FLAG_HIDE},
769 {"writable", P_BOOLREV, P_LOCAL, &sDefault.bRead_only, NULL, NULL, FLAG_HIDE},
771 {"create mask", P_OCTAL, P_LOCAL, &sDefault.iCreate_mask, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
772 {"create mode", P_OCTAL, P_LOCAL, &sDefault.iCreate_mask, NULL, NULL, FLAG_GLOBAL},
773 {"force create mode", P_OCTAL, P_LOCAL, &sDefault.iCreate_force_mode, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
774 {"security mask", P_OCTAL, P_LOCAL, &sDefault.iSecurity_mask, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
775 {"force security mode", P_OCTAL, P_LOCAL, &sDefault.iSecurity_force_mode, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
776 {"directory mask", P_OCTAL, P_LOCAL, &sDefault.iDir_mask, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
777 {"directory mode", P_OCTAL, P_LOCAL, &sDefault.iDir_mask, NULL, NULL, FLAG_GLOBAL},
778 {"force directory mode", P_OCTAL, P_LOCAL, &sDefault.iDir_force_mode, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
779 {"directory security mask", P_OCTAL, P_LOCAL, &sDefault.iDir_Security_mask, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
780 {"force directory security mode", P_OCTAL, P_LOCAL, &sDefault.iDir_Security_force_mode, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE},
781 {"inherit permissions", P_BOOL, P_LOCAL, &sDefault.bInheritPerms, NULL, NULL, FLAG_SHARE},
782 {"inherit acls", P_BOOL, P_LOCAL, &sDefault.bInheritACLS, NULL, NULL, FLAG_SHARE},
783 {"guest only", P_BOOL, P_LOCAL, &sDefault.bGuest_only, NULL, NULL, FLAG_SHARE},
784 {"only guest", P_BOOL, P_LOCAL, &sDefault.bGuest_only, NULL, NULL, FLAG_HIDE},
786 {"guest ok", P_BOOL, P_LOCAL, &sDefault.bGuest_ok, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT | FLAG_DEVELOPER},
787 {"public", P_BOOL, P_LOCAL, &sDefault.bGuest_ok, NULL, NULL, FLAG_HIDE},
789 {"only user", P_BOOL, P_LOCAL, &sDefault.bOnlyUser, NULL, NULL, FLAG_SHARE},
790 {"hosts allow", P_LIST, P_LOCAL, &sDefault.szHostsallow, NULL, NULL, FLAG_GLOBAL | FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT | FLAG_DEVELOPER},
791 {"allow hosts", P_LIST, P_LOCAL, &sDefault.szHostsallow, NULL, NULL, FLAG_HIDE},
792 {"hosts deny", P_LIST, P_LOCAL, &sDefault.szHostsdeny, NULL, NULL, FLAG_GLOBAL | FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT | FLAG_DEVELOPER},
793 {"deny hosts", P_LIST, P_LOCAL, &sDefault.szHostsdeny, NULL, NULL, FLAG_HIDE},
795 {"Logging Options", P_SEP, P_SEPARATOR},
797 {"log level", P_STRING, P_GLOBAL, &Globals.szLogLevel, handle_debug_list, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
798 {"debuglevel", P_STRING, P_GLOBAL, &Globals.szLogLevel, handle_debug_list, NULL, FLAG_HIDE},
799 {"syslog", P_INTEGER, P_GLOBAL, &Globals.syslog, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
800 {"syslog only", P_BOOL, P_GLOBAL, &Globals.bSyslogOnly, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
801 {"log file", P_STRING, P_GLOBAL, &Globals.szLogFile, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
803 {"max log size", P_INTEGER, P_GLOBAL, &Globals.max_log_size, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
804 {"timestamp logs", P_BOOL, P_GLOBAL, &Globals.bTimestampLogs, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
805 {"debug timestamp", P_BOOL, P_GLOBAL, &Globals.bTimestampLogs, NULL, NULL, FLAG_DEVELOPER},
806 {"debug hires timestamp", P_BOOL, P_GLOBAL, &Globals.bDebugHiresTimestamp, NULL, NULL, FLAG_DEVELOPER},
807 {"debug pid", P_BOOL, P_GLOBAL, &Globals.bDebugPid, NULL, NULL, FLAG_DEVELOPER},
808 {"debug uid", P_BOOL, P_GLOBAL, &Globals.bDebugUid, NULL, NULL, FLAG_DEVELOPER},
810 {"Protocol Options", P_SEP, P_SEPARATOR},
812 {"smb ports", P_STRING, P_GLOBAL, &Globals.smb_ports, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
813 {"protocol", P_ENUM, P_GLOBAL, &Globals.maxprotocol, NULL, enum_protocol, FLAG_ADVANCED | FLAG_DEVELOPER},
814 {"large readwrite", P_BOOL, P_GLOBAL, &Globals.bLargeReadwrite, NULL, NULL, FLAG_DEVELOPER},
815 {"max protocol", P_ENUM, P_GLOBAL, &Globals.maxprotocol, NULL, enum_protocol, FLAG_DEVELOPER},
816 {"min protocol", P_ENUM, P_GLOBAL, &Globals.minprotocol, NULL, enum_protocol, FLAG_DEVELOPER},
817 {"unicode", P_BOOL, P_GLOBAL, &Globals.bUnicode, NULL, NULL, FLAG_DEVELOPER},
818 {"read bmpx", P_BOOL, P_GLOBAL, &Globals.bReadbmpx, NULL, NULL, FLAG_DEVELOPER},
819 {"read raw", P_BOOL, P_GLOBAL, &Globals.bReadRaw, NULL, NULL, FLAG_DEVELOPER},
820 {"write raw", P_BOOL, P_GLOBAL, &Globals.bWriteRaw, NULL, NULL, FLAG_DEVELOPER},
821 {"disable netbios", P_BOOL, P_GLOBAL, &Globals.bDisableNetbios, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
823 {"nt pipe support", P_BOOL, P_GLOBAL, &Globals.bNTPipeSupport, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
824 {"nt acl support", P_BOOL, P_LOCAL, &sDefault.bNTAclSupport, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE | FLAG_ADVANCED | FLAG_WIZARD},
825 {"nt status support", P_BOOL, P_GLOBAL, &Globals.bNTStatusSupport, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
826 {"profile acls", P_BOOL, P_LOCAL, &sDefault.bProfileAcls, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE | FLAG_ADVANCED | FLAG_WIZARD},
828 {"announce version", P_STRING, P_GLOBAL, &Globals.szAnnounceVersion, NULL, NULL, FLAG_DEVELOPER},
829 {"announce as", P_ENUM, P_GLOBAL, &Globals.announce_as, NULL, enum_announce_as, FLAG_DEVELOPER},
830 {"max mux", P_INTEGER, P_GLOBAL, &Globals.max_mux, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
831 {"max xmit", P_INTEGER, P_GLOBAL, &Globals.max_xmit, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
833 {"name resolve order", P_STRING, P_GLOBAL, &Globals.szNameResolveOrder, NULL, NULL, FLAG_ADVANCED | FLAG_WIZARD | FLAG_DEVELOPER},
834 {"max ttl", P_INTEGER, P_GLOBAL, &Globals.max_ttl, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
835 {"max wins ttl", P_INTEGER, P_GLOBAL, &Globals.max_wins_ttl, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
836 {"min wins ttl", P_INTEGER, P_GLOBAL, &Globals.min_wins_ttl, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
837 {"time server", P_BOOL, P_GLOBAL, &Globals.bTimeServer, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
838 {"unix extensions", P_BOOL, P_GLOBAL, &Globals.bUnixExtensions, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
839 {"use spnego", P_BOOL, P_GLOBAL, &Globals.bUseSpnego, NULL, NULL, FLAG_DEVELOPER},
841 {"Tuning Options", P_SEP, P_SEPARATOR},
843 {"block size", P_INTEGER, P_LOCAL, &sDefault.iBlock_size, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
844 {"change notify timeout", P_INTEGER, P_GLOBAL, &Globals.change_notify_timeout, NULL, NULL, FLAG_DEVELOPER},
845 {"deadtime", P_INTEGER, P_GLOBAL, &Globals.deadtime, NULL, NULL, FLAG_DEVELOPER},
846 {"getwd cache", P_BOOL, P_GLOBAL, &use_getwd_cache, NULL, NULL, FLAG_DEVELOPER},
847 {"keepalive", P_INTEGER, P_GLOBAL, &keepalive, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
849 {"lpq cache time", P_INTEGER, P_GLOBAL, &Globals.lpqcachetime, NULL, NULL, FLAG_DEVELOPER},
850 {"max smbd processes", P_INTEGER, P_GLOBAL, &Globals.iMaxSmbdProcesses, NULL, NULL, FLAG_DEVELOPER},
851 {"max connections", P_INTEGER, P_LOCAL, &sDefault.iMaxConnections, NULL, NULL, FLAG_SHARE},
852 {"paranoid server security", P_BOOL, P_GLOBAL, &Globals.paranoid_server_security, NULL, NULL, FLAG_DEVELOPER},
853 {"max disk size", P_INTEGER, P_GLOBAL, &Globals.maxdisksize, NULL, NULL, FLAG_DEVELOPER},
854 {"max open files", P_INTEGER, P_GLOBAL, &Globals.max_open_files, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
855 {"min print space", P_INTEGER, P_LOCAL, &sDefault.iMinPrintSpace, NULL, NULL, FLAG_PRINT},
856 {"read size", P_INTEGER, P_GLOBAL, &Globals.ReadSize, NULL, NULL, FLAG_DEVELOPER},
858 {"socket options", P_GSTRING, P_GLOBAL, user_socket_options, NULL, NULL, FLAG_DEVELOPER},
859 {"stat cache size", P_INTEGER, P_GLOBAL, &Globals.stat_cache_size, NULL, NULL, FLAG_DEVELOPER},
860 {"strict allocate", P_BOOL, P_LOCAL, &sDefault.bStrictAllocate, NULL, NULL, FLAG_SHARE},
861 {"strict sync", P_BOOL, P_LOCAL, &sDefault.bStrictSync, NULL, NULL, FLAG_SHARE},
862 {"sync always", P_BOOL, P_LOCAL, &sDefault.bSyncAlways, NULL, NULL, FLAG_SHARE},
863 {"use mmap", P_BOOL, P_GLOBAL, &Globals.bUseMmap, NULL, NULL, FLAG_DEVELOPER},
864 {"use sendfile", P_BOOL, P_LOCAL, &sDefault.bUseSendfile, NULL, NULL, FLAG_SHARE},
865 {"hostname lookups", P_BOOL, P_GLOBAL, &Globals.bHostnameLookups, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
866 {"write cache size", P_INTEGER, P_LOCAL, &sDefault.iWriteCacheSize, NULL, NULL, FLAG_SHARE},
868 {"name cache timeout", P_INTEGER, P_GLOBAL, &Globals.name_cache_timeout, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
870 {"Printing Options", P_SEP, P_SEPARATOR},
872 {"total print jobs", P_INTEGER, P_GLOBAL, &Globals.iTotalPrintJobs, NULL, NULL, FLAG_PRINT},
873 {"max print jobs", P_INTEGER, P_LOCAL, &sDefault.iMaxPrintJobs, NULL, NULL, FLAG_PRINT},
874 {"load printers", P_BOOL, P_GLOBAL, &Globals.bLoadPrinters, NULL, NULL, FLAG_PRINT},
875 {"printcap name", P_STRING, P_GLOBAL, &Globals.szPrintcapname, NULL, NULL, FLAG_PRINT | FLAG_DEVELOPER},
876 {"printcap", P_STRING, P_GLOBAL, &Globals.szPrintcapname, NULL, NULL, FLAG_HIDE},
877 {"printable", P_BOOL, P_LOCAL, &sDefault.bPrint_ok, NULL, NULL, FLAG_PRINT},
878 {"print ok", P_BOOL, P_LOCAL, &sDefault.bPrint_ok, NULL, NULL, FLAG_HIDE},
879 {"printing", P_ENUM, P_LOCAL, &sDefault.iPrinting, NULL, enum_printing, FLAG_PRINT | FLAG_GLOBAL},
880 {"print command", P_STRING, P_LOCAL, &sDefault.szPrintcommand, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
881 {"disable spoolss", P_BOOL, P_GLOBAL, &Globals.bDisableSpoolss, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
882 {"lpq command", P_STRING, P_LOCAL, &sDefault.szLpqcommand, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
883 {"lprm command", P_STRING, P_LOCAL, &sDefault.szLprmcommand, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
884 {"lppause command", P_STRING, P_LOCAL, &sDefault.szLppausecommand, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
885 {"lpresume command", P_STRING, P_LOCAL, &sDefault.szLpresumecommand, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
886 {"queuepause command", P_STRING, P_LOCAL, &sDefault.szQueuepausecommand, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
887 {"queueresume command", P_STRING, P_LOCAL, &sDefault.szQueueresumecommand, NULL, NULL, FLAG_PRINT | FLAG_GLOBAL},
889 {"enumports command", P_STRING, P_GLOBAL, &Globals.szEnumPortsCommand, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
890 {"addprinter command", P_STRING, P_GLOBAL, &Globals.szAddPrinterCommand, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
891 {"deleteprinter command", P_STRING, P_GLOBAL, &Globals.szDeletePrinterCommand, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
892 {"show add printer wizard", P_BOOL, P_GLOBAL, &Globals.bMsAddPrinterWizard, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
893 {"os2 driver map", P_STRING, P_GLOBAL, &Globals.szOs2DriverMap, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
895 {"printer name", P_STRING, P_LOCAL, &sDefault.szPrintername, NULL, NULL, FLAG_PRINT},
896 {"printer", P_STRING, P_LOCAL, &sDefault.szPrintername, NULL, NULL, FLAG_HIDE},
897 {"use client driver", P_BOOL, P_LOCAL, &sDefault.bUseClientDriver, NULL, NULL, FLAG_PRINT},
898 {"default devmode", P_BOOL, P_LOCAL, &sDefault.bDefaultDevmode, NULL, NULL, FLAG_PRINT},
900 {"Filename Handling", P_SEP, P_SEPARATOR},
901 {"strip dot", P_BOOL, P_GLOBAL, &Globals.bStripDot, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
902 {"mangling method", P_STRING, P_GLOBAL, &Globals.szManglingMethod, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
903 {"mangle prefix", P_INTEGER, P_GLOBAL, &Globals.mangle_prefix, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
905 {"mangled stack", P_INTEGER, P_GLOBAL, &Globals.mangled_stack, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
906 {"default case", P_ENUM, P_LOCAL, &sDefault.iDefaultCase, NULL, enum_case, FLAG_SHARE},
907 {"case sensitive", P_BOOL, P_LOCAL, &sDefault.bCaseSensitive, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
908 {"casesignames", P_BOOL, P_LOCAL, &sDefault.bCaseSensitive, NULL, NULL, FLAG_HIDE},
909 {"preserve case", P_BOOL, P_LOCAL, &sDefault.bCasePreserve, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
910 {"short preserve case", P_BOOL, P_LOCAL, &sDefault.bShortCasePreserve, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
911 {"mangle case", P_BOOL, P_LOCAL, &sDefault.bCaseMangle, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
912 {"mangling char", P_CHAR, P_LOCAL, &sDefault.magic_char, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
913 {"hide dot files", P_BOOL, P_LOCAL, &sDefault.bHideDotFiles, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
914 {"hide special files", P_BOOL, P_LOCAL, &sDefault.bHideSpecialFiles, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
915 {"hide unreadable", P_BOOL, P_LOCAL, &sDefault.bHideUnReadable, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
916 {"hide unwriteable files", P_BOOL, P_LOCAL, &sDefault.bHideUnWriteableFiles, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
917 {"delete veto files", P_BOOL, P_LOCAL, &sDefault.bDeleteVetoFiles, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
918 {"veto files", P_STRING, P_LOCAL, &sDefault.szVetoFiles, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL },
919 {"hide files", P_STRING, P_LOCAL, &sDefault.szHideFiles, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL },
920 {"veto oplock files", P_STRING, P_LOCAL, &sDefault.szVetoOplockFiles, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL },
921 {"map system", P_BOOL, P_LOCAL, &sDefault.bMap_system, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
922 {"map hidden", P_BOOL, P_LOCAL, &sDefault.bMap_hidden, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
923 {"map archive", P_BOOL, P_LOCAL, &sDefault.bMap_archive, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
924 {"mangled names", P_BOOL, P_LOCAL, &sDefault.bMangledNames, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
925 {"mangled map", P_STRING, P_LOCAL, &sDefault.szMangledMap, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
926 {"stat cache", P_BOOL, P_GLOBAL, &Globals.bStatCache, NULL, NULL, FLAG_DEVELOPER},
928 {"Domain Options", P_SEP, P_SEPARATOR},
930 {"machine password timeout", P_INTEGER, P_GLOBAL, &Globals.machine_password_timeout, NULL, NULL, FLAG_ADVANCED | FLAG_WIZARD | FLAG_DEVELOPER},
932 {"Logon Options", P_SEP, P_SEPARATOR},
934 {"add user script", P_STRING, P_GLOBAL, &Globals.szAddUserScript, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
935 {"delete user script", P_STRING, P_GLOBAL, &Globals.szDelUserScript, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
936 {"add group script", P_STRING, P_GLOBAL, &Globals.szAddGroupScript, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
937 {"delete group script", P_STRING, P_GLOBAL, &Globals.szDelGroupScript, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
938 {"add user to group script", P_STRING, P_GLOBAL, &Globals.szAddUserToGroupScript, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
939 {"delete user from group script", P_STRING, P_GLOBAL, &Globals.szDelUserFromGroupScript, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
940 {"set primary group script", P_STRING, P_GLOBAL, &Globals.szSetPrimaryGroupScript, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
941 {"add machine script", P_STRING, P_GLOBAL, &Globals.szAddMachineScript, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
942 {"shutdown script", P_STRING, P_GLOBAL, &Globals.szShutdownScript, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
943 {"abort shutdown script", P_STRING, P_GLOBAL, &Globals.szAbortShutdownScript, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
945 {"logon script", P_STRING, P_GLOBAL, &Globals.szLogonScript, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
946 {"logon path", P_STRING, P_GLOBAL, &Globals.szLogonPath, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
947 {"logon drive", P_STRING, P_GLOBAL, &Globals.szLogonDrive, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
948 {"logon home", P_STRING, P_GLOBAL, &Globals.szLogonHome, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
949 {"domain logons", P_BOOL, P_GLOBAL, &Globals.bDomainLogons, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
951 {"Browse Options", P_SEP, P_SEPARATOR},
953 {"os level", P_INTEGER, P_GLOBAL, &Globals.os_level, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_DEVELOPER},
954 {"lm announce", P_ENUM, P_GLOBAL, &Globals.lm_announce, NULL, enum_bool_auto, FLAG_ADVANCED | FLAG_DEVELOPER},
955 {"lm interval", P_INTEGER, P_GLOBAL, &Globals.lm_interval, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
956 {"preferred master", P_ENUM, P_GLOBAL, &Globals.bPreferredMaster, NULL, enum_bool_auto, FLAG_BASIC | FLAG_ADVANCED | FLAG_DEVELOPER},
957 {"prefered master", P_ENUM, P_GLOBAL, &Globals.bPreferredMaster, NULL, enum_bool_auto, FLAG_HIDE},
958 {"local master", P_BOOL, P_GLOBAL, &Globals.bLocalMaster, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_DEVELOPER},
959 {"domain master", P_ENUM, P_GLOBAL, &Globals.bDomainMaster, NULL, enum_bool_auto, FLAG_BASIC | FLAG_ADVANCED | FLAG_DEVELOPER},
960 {"browse list", P_BOOL, P_GLOBAL, &Globals.bBrowseList, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
961 {"browseable", P_BOOL, P_LOCAL, &sDefault.bBrowseable, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT | FLAG_DEVELOPER},
962 {"browsable", P_BOOL, P_LOCAL, &sDefault.bBrowseable, NULL, NULL, FLAG_HIDE},
963 {"enhanced browsing", P_BOOL, P_GLOBAL, &Globals.enhanced_browsing, NULL, NULL, FLAG_DEVELOPER | FLAG_ADVANCED},
965 {"WINS Options", P_SEP, P_SEPARATOR},
966 {"dns proxy", P_BOOL, P_GLOBAL, &Globals.bDNSproxy, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
967 {"wins proxy", P_BOOL, P_GLOBAL, &Globals.bWINSproxy, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
969 {"wins server", P_LIST, P_GLOBAL, &Globals.szWINSservers, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD | FLAG_DEVELOPER},
970 {"wins support", P_BOOL, P_GLOBAL, &Globals.bWINSsupport, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD | FLAG_DEVELOPER},
971 {"wins hook", P_STRING, P_GLOBAL, &Globals.szWINSHook, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
972 {"wins partners", P_STRING, P_GLOBAL, &Globals.szWINSPartners, NULL, NULL, FLAG_ADVANCED | FLAG_WIZARD | FLAG_DEVELOPER},
974 {"Locking Options", P_SEP, P_SEPARATOR},
976 {"blocking locks", P_BOOL, P_LOCAL, &sDefault.bBlockingLocks, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
977 {"csc policy", P_ENUM, P_LOCAL, &sDefault.iCSCPolicy, NULL, enum_csc_policy, FLAG_SHARE | FLAG_GLOBAL},
978 {"fake oplocks", P_BOOL, P_LOCAL, &sDefault.bFakeOplocks, NULL, NULL, FLAG_SHARE},
979 {"kernel oplocks", P_BOOL, P_GLOBAL, &Globals.bKernelOplocks, NULL, NULL, FLAG_GLOBAL},
980 {"locking", P_BOOL, P_LOCAL, &sDefault.bLocking, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
981 {"lock spin count", P_INTEGER, P_GLOBAL, &Globals.iLockSpinCount, NULL, NULL, FLAG_GLOBAL},
982 {"lock spin time", P_INTEGER, P_GLOBAL, &Globals.iLockSpinTime, NULL, NULL, FLAG_GLOBAL},
984 {"oplocks", P_BOOL, P_LOCAL, &sDefault.bOpLocks, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
985 {"level2 oplocks", P_BOOL, P_LOCAL, &sDefault.bLevel2OpLocks, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
986 {"oplock break wait time", P_INTEGER, P_GLOBAL, &Globals.oplock_break_wait_time, NULL, NULL, FLAG_GLOBAL},
987 {"oplock contention limit", P_INTEGER, P_LOCAL, &sDefault.iOplockContentionLimit, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
988 {"posix locking", P_BOOL, P_LOCAL, &sDefault.bPosixLocking, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
989 {"strict locking", P_BOOL, P_LOCAL, &sDefault.bStrictLocking, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
990 {"share modes", P_BOOL, P_LOCAL, &sDefault.bShareModes, NULL, NULL, FLAG_SHARE|FLAG_GLOBAL},
992 {"Ldap Options", P_SEP, P_SEPARATOR},
994 #ifdef WITH_LDAP_SAMCONFIG
995 {"ldap server", P_STRING, P_GLOBAL, &Globals.szLdapServer, NULL, NULL, 0},
996 {"ldap port", P_INTEGER, P_GLOBAL, &Globals.ldap_port, NULL, NULL, 0},
998 {"ldap suffix", P_STRING, P_GLOBAL, &Globals.szLdapSuffix, handle_ldap_suffix, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
999 {"ldap machine suffix", P_STRING, P_GLOBAL, &Globals.szLdapMachineSuffix, handle_ldap_machine_suffix, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
1000 {"ldap user suffix", P_STRING, P_GLOBAL, &Globals.szLdapUserSuffix, handle_ldap_user_suffix, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
1001 {"ldap filter", P_STRING, P_GLOBAL, &Globals.szLdapFilter, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
1002 {"ldap admin dn", P_STRING, P_GLOBAL, &Globals.szLdapAdminDn, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
1003 {"ldap ssl", P_ENUM, P_GLOBAL, &Globals.ldap_ssl, NULL, enum_ldap_ssl, FLAG_ADVANCED | FLAG_DEVELOPER},
1004 {"ldap passwd sync", P_ENUM, P_GLOBAL, &Globals.ldap_passwd_sync, NULL, enum_ldap_passwd_sync, FLAG_ADVANCED | FLAG_DEVELOPER},
1006 {"Miscellaneous Options", P_SEP, P_SEPARATOR},
1007 {"add share command", P_STRING, P_GLOBAL, &Globals.szAddShareCommand, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
1008 {"change share command", P_STRING, P_GLOBAL, &Globals.szChangeShareCommand, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
1009 {"delete share command", P_STRING, P_GLOBAL, &Globals.szDeleteShareCommand, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
1011 {"config file", P_STRING, P_GLOBAL, &Globals.szConfigFile, NULL, NULL, FLAG_HIDE},
1012 {"preload", P_STRING, P_GLOBAL, &Globals.szAutoServices, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
1013 {"auto services", P_STRING, P_GLOBAL, &Globals.szAutoServices, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
1014 {"lock dir", P_STRING, P_GLOBAL, &Globals.szLockDir, NULL, NULL, FLAG_HIDE},
1015 {"lock directory", P_STRING, P_GLOBAL, &Globals.szLockDir, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
1016 {"pid directory", P_STRING, P_GLOBAL, &Globals.szPidDir, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
1018 {"utmp directory", P_STRING, P_GLOBAL, &Globals.szUtmpDir, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
1019 {"wtmp directory", P_STRING, P_GLOBAL, &Globals.szWtmpDir, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
1020 {"utmp", P_BOOL, P_GLOBAL, &Globals.bUtmp, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
1023 {"default service", P_STRING, P_GLOBAL, &Globals.szDefaultService, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
1024 {"default", P_STRING, P_GLOBAL, &Globals.szDefaultService, NULL, NULL, FLAG_DEVELOPER},
1025 {"message command", P_STRING, P_GLOBAL, &Globals.szMsgCommand, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
1026 {"dfree command", P_STRING, P_GLOBAL, &Globals.szDfree, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
1027 {"remote announce", P_STRING, P_GLOBAL, &Globals.szRemoteAnnounce, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
1028 {"remote browse sync", P_STRING, P_GLOBAL, &Globals.szRemoteBrowseSync, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
1029 {"socket address", P_STRING, P_GLOBAL, &Globals.szSocketAddress, NULL, NULL, FLAG_DEVELOPER},
1030 {"homedir map", P_STRING, P_GLOBAL, &Globals.szNISHomeMapName, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
1031 {"time offset", P_INTEGER, P_GLOBAL, &extra_time_offset, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
1032 {"NIS homedir", P_BOOL, P_GLOBAL, &Globals.bNISHomeMap, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
1033 {"-valid", P_BOOL, P_LOCAL, &sDefault.valid, NULL, NULL, FLAG_HIDE},
1035 {"copy", P_STRING, P_LOCAL, &sDefault.szCopy, handle_copy, NULL, FLAG_HIDE},
1036 {"include", P_STRING, P_LOCAL, &sDefault.szInclude, handle_include, NULL, FLAG_HIDE},
1037 {"exec", P_STRING, P_LOCAL, &sDefault.szPreExec, NULL, NULL, FLAG_SHARE | FLAG_PRINT},
1038 {"preexec", P_STRING, P_LOCAL, &sDefault.szPreExec, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
1040 {"preexec close", P_BOOL, P_LOCAL, &sDefault.bPreexecClose, NULL, NULL, FLAG_SHARE},
1041 {"postexec", P_STRING, P_LOCAL, &sDefault.szPostExec, NULL, NULL, FLAG_SHARE | FLAG_PRINT},
1042 {"root preexec", P_STRING, P_LOCAL, &sDefault.szRootPreExec, NULL, NULL, FLAG_SHARE | FLAG_PRINT},
1043 {"root preexec close", P_BOOL, P_LOCAL, &sDefault.bRootpreexecClose, NULL, NULL, FLAG_SHARE},
1044 {"root postexec", P_STRING, P_LOCAL, &sDefault.szRootPostExec, NULL, NULL, FLAG_SHARE | FLAG_PRINT},
1045 {"available", P_BOOL, P_LOCAL, &sDefault.bAvailable, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT},
1046 {"volume", P_STRING, P_LOCAL, &sDefault.volume, NULL, NULL, FLAG_SHARE },
1047 {"fstype", P_STRING, P_LOCAL, &sDefault.fstype, NULL, NULL, FLAG_SHARE},
1048 {"set directory", P_BOOLREV, P_LOCAL, &sDefault.bNo_set_dir, NULL, NULL, FLAG_SHARE},
1049 {"source environment", P_STRING, P_GLOBAL, &Globals.szSourceEnv, handle_source_env, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
1050 {"wide links", P_BOOL, P_LOCAL, &sDefault.bWidelinks, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
1051 {"follow symlinks", P_BOOL, P_LOCAL, &sDefault.bSymlinks, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
1052 {"dont descend", P_STRING, P_LOCAL, &sDefault.szDontdescend, NULL, NULL, FLAG_SHARE},
1053 {"magic script", P_STRING, P_LOCAL, &sDefault.szMagicScript, NULL, NULL, FLAG_SHARE},
1054 {"magic output", P_STRING, P_LOCAL, &sDefault.szMagicOutput, NULL, NULL, FLAG_SHARE},
1055 {"delete readonly", P_BOOL, P_LOCAL, &sDefault.bDeleteReadonly, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
1056 {"dos filemode", P_BOOL, P_LOCAL, &sDefault.bDosFilemode, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
1057 {"dos filetimes", P_BOOL, P_LOCAL, &sDefault.bDosFiletimes, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
1058 {"dos filetime resolution", P_BOOL, P_LOCAL, &sDefault.bDosFiletimeResolution, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
1060 {"fake directory create times", P_BOOL, P_LOCAL, &sDefault.bFakeDirCreateTimes, NULL, NULL, FLAG_SHARE | FLAG_GLOBAL},
1061 {"panic action", P_STRING, P_GLOBAL, &Globals.szPanicAction, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
1062 {"hide local users", P_BOOL, P_GLOBAL, &Globals.bHideLocalUsers, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
1064 {"VFS module options", P_SEP, P_SEPARATOR},
1066 {"vfs object", P_STRING, P_LOCAL, &sDefault.szVfsObjectFile, handle_vfs_object, NULL, FLAG_SHARE},
1067 {"vfs options", P_STRING, P_LOCAL, &sDefault.szVfsOptions, NULL, NULL, FLAG_SHARE},
1068 {"vfs path", P_STRING, P_LOCAL, &sDefault.szVfsPath, NULL, NULL, FLAG_SHARE},
1071 {"msdfs root", P_BOOL, P_LOCAL, &sDefault.bMSDfsRoot, NULL, NULL, FLAG_SHARE},
1072 {"host msdfs", P_BOOL, P_GLOBAL, &Globals.bHostMSDfs, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
1074 {"Winbind options", P_SEP, P_SEPARATOR},
1076 {"winbind uid", P_STRING, P_GLOBAL, &Globals.szWinbindUID, handle_winbind_uid, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
1077 {"winbind gid", P_STRING, P_GLOBAL, &Globals.szWinbindGID, handle_winbind_gid, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
1078 {"template homedir", P_STRING, P_GLOBAL, &Globals.szTemplateHomedir, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
1079 {"template shell", P_STRING, P_GLOBAL, &Globals.szTemplateShell, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
1080 {"winbind separator", P_STRING, P_GLOBAL, &Globals.szWinbindSeparator, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
1081 {"winbind cache time", P_INTEGER, P_GLOBAL, &Globals.winbind_cache_time, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
1082 {"winbind enum users", P_BOOL, P_GLOBAL, &Globals.bWinbindEnumUsers, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
1083 {"winbind enum groups", P_BOOL, P_GLOBAL, &Globals.bWinbindEnumGroups, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
1084 {"winbind use default domain", P_BOOL, P_GLOBAL, &Globals.bWinbindUseDefaultDomain, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
1086 {NULL, P_BOOL, P_NONE, NULL, NULL, NULL, 0}
1090 /***************************************************************************
1091 Initialise the sDefault parameter structure for the printer values.
1092 ***************************************************************************/
1093 static void init_printer_values(void)
1095 /* choose defaults depending on the type of printing */
1096 switch (sDefault.iPrinting)
1102 string_set(&sDefault.szLpqcommand, "lpq -P'%p'");
1103 string_set(&sDefault.szLprmcommand, "lprm -P'%p' %j");
1104 string_set(&sDefault.szPrintcommand,
1105 "lpr -r -P'%p' %s");
1110 string_set(&sDefault.szLpqcommand, "lpq -P'%p'");
1111 string_set(&sDefault.szLprmcommand, "lprm -P'%p' %j");
1112 string_set(&sDefault.szPrintcommand,
1113 "lpr -r -P'%p' %s");
1114 string_set(&sDefault.szQueuepausecommand,
1116 string_set(&sDefault.szQueueresumecommand,
1118 string_set(&sDefault.szLppausecommand,
1119 "lpc hold '%p' %j");
1120 string_set(&sDefault.szLpresumecommand,
1121 "lpc release '%p' %j");
1126 string_set(&sDefault.szLpqcommand, "");
1127 string_set(&sDefault.szLprmcommand, "");
1128 string_set(&sDefault.szPrintcommand, "");
1129 string_set(&sDefault.szLppausecommand, "");
1130 string_set(&sDefault.szLpresumecommand, "");
1131 string_set(&sDefault.szQueuepausecommand, "");
1132 string_set(&sDefault.szQueueresumecommand, "");
1134 string_set(&Globals.szPrintcapname, "cups");
1136 string_set(&sDefault.szLpqcommand,
1137 "/usr/bin/lpstat -o '%p'");
1138 string_set(&sDefault.szLprmcommand,
1139 "/usr/bin/cancel '%p-%j'");
1140 string_set(&sDefault.szPrintcommand,
1141 "/usr/bin/lp -d '%p' %s; rm %s");
1142 string_set(&sDefault.szLppausecommand,
1143 "lp -i '%p-%j' -H hold");
1144 string_set(&sDefault.szLpresumecommand,
1145 "lp -i '%p-%j' -H resume");
1146 string_set(&sDefault.szQueuepausecommand,
1147 "/usr/bin/disable '%p'");
1148 string_set(&sDefault.szQueueresumecommand,
1149 "/usr/bin/enable '%p'");
1150 string_set(&Globals.szPrintcapname, "lpstat");
1151 #endif /* HAVE_CUPS */
1156 string_set(&sDefault.szLpqcommand, "lpstat -o%p");
1157 string_set(&sDefault.szLprmcommand, "cancel %p-%j");
1158 string_set(&sDefault.szPrintcommand,
1159 "lp -c -d%p %s; rm %s");
1160 string_set(&sDefault.szQueuepausecommand,
1162 string_set(&sDefault.szQueueresumecommand,
1165 string_set(&sDefault.szLppausecommand,
1166 "lp -i %p-%j -H hold");
1167 string_set(&sDefault.szLpresumecommand,
1168 "lp -i %p-%j -H resume");
1173 string_set(&sDefault.szLpqcommand, "lpq -P%p");
1174 string_set(&sDefault.szLprmcommand, "lprm -P%p %j");
1175 string_set(&sDefault.szPrintcommand, "lp -r -P%p %s");
1179 string_set(&sDefault.szLpqcommand, "qstat -l -d%p");
1180 string_set(&sDefault.szLprmcommand,
1181 "qstat -s -j%j -c");
1182 string_set(&sDefault.szPrintcommand,
1183 "lp -d%p -s %s; rm %s");
1184 string_set(&sDefault.szLppausecommand,
1185 "qstat -s -j%j -h");
1186 string_set(&sDefault.szLpresumecommand,
1187 "qstat -s -j%j -r");
1192 string_set(&sDefault.szPrintcommand, "vlp print %p %s");
1193 string_set(&sDefault.szLpqcommand, "vlp lpq %p");
1194 string_set(&sDefault.szLprmcommand, "vlp lprm %p %j");
1195 string_set(&sDefault.szLppausecommand, "vlp lppause %p %j");
1196 string_set(&sDefault.szLpresumecommand, "vlp lpresum %p %j");
1197 string_set(&sDefault.szQueuepausecommand, "vlp queuepause %p");
1198 string_set(&sDefault.szQueueresumecommand, "vlp queueresume %p");
1200 #endif /* DEVELOPER */
1205 /***************************************************************************
1206 Initialise the global parameter structure.
1207 ***************************************************************************/
1208 static void init_globals(void)
1210 static BOOL done_init = False;
1216 memset((void *)&Globals, '\0', sizeof(Globals));
1218 for (i = 0; parm_table[i].label; i++)
1219 if ((parm_table[i].type == P_STRING ||
1220 parm_table[i].type == P_USTRING) &&
1222 string_set(parm_table[i].ptr, "");
1224 string_set(&sDefault.fstype, FSTYPE_STRING);
1226 init_printer_values();
1232 DEBUG(3, ("Initialising global parameters\n"));
1234 string_set(&Globals.szSMBPasswdFile, dyn_SMB_PASSWD_FILE);
1235 string_set(&Globals.szPrivateDir, dyn_PRIVATE_DIR);
1237 /* use the new 'hash2' method by default, with a prefix of 1 */
1238 string_set(&Globals.szManglingMethod, "hash2");
1239 Globals.mangle_prefix = 1;
1241 string_set(&Globals.szGuestaccount, GUEST_ACCOUNT);
1243 /* using UTF8 by default allows us to support all chars */
1244 string_set(&Globals.unix_charset, "UTF8");
1246 /* Use codepage 850 as a default for the dos character set */
1247 string_set(&Globals.dos_charset, "CP850");
1250 * Allow the default PASSWD_CHAT to be overridden in local.h.
1252 string_set(&Globals.szPasswdChat, DEFAULT_PASSWD_CHAT);
1253 string_set(&Globals.szWorkGroup, WORKGROUP);
1254 string_set(&Globals.szPasswdProgram, "");
1255 string_set(&Globals.szPrintcapname, PRINTCAP_NAME);
1256 string_set(&Globals.szPidDir, dyn_PIDDIR);
1257 string_set(&Globals.szLockDir, dyn_LOCKDIR);
1258 string_set(&Globals.szSocketAddress, "0.0.0.0");
1259 pstrcpy(s, "Samba ");
1260 pstrcat(s, VERSION);
1261 string_set(&Globals.szServerString, s);
1262 slprintf(s, sizeof(s) - 1, "%d.%d", DEFAULT_MAJOR_VERSION,
1263 DEFAULT_MINOR_VERSION);
1264 string_set(&Globals.szAnnounceVersion, s);
1266 pstrcpy(user_socket_options, DEFAULT_SOCKET_OPTIONS);
1268 string_set(&Globals.szLogonDrive, "");
1269 /* %N is the NIS auto.home server if -DAUTOHOME is used, else same as %L */
1270 string_set(&Globals.szLogonHome, "\\\\%N\\%U");
1271 string_set(&Globals.szLogonPath, "\\\\%N\\%U\\profile");
1273 string_set(&Globals.szNameResolveOrder, "lmhosts wins host bcast");
1274 string_set(&Globals.szPasswordServer, "*");
1276 Globals.bAlgorithmicRidBase = BASE_RID;
1278 Globals.bLoadPrinters = True;
1279 Globals.mangled_stack = 50;
1280 /* Was 65535 (0xFFFF). 0x4101 matches W2K and causes major speed improvements... */
1281 /* Discovered by 2 days of pain by Don McCall @ HP :-). */
1282 Globals.max_xmit = 0x4104;
1283 Globals.max_mux = 50; /* This is *needed* for profile support. */
1284 Globals.lpqcachetime = 10;
1285 Globals.bDisableSpoolss = False;
1286 Globals.iMaxSmbdProcesses = 0;/* no limit specified */
1287 Globals.iTotalPrintJobs = 0; /* no limit specified */
1288 Globals.pwordlevel = 0;
1289 Globals.unamelevel = 0;
1290 Globals.deadtime = 0;
1291 Globals.bLargeReadwrite = True;
1292 Globals.max_log_size = 5000;
1293 Globals.max_open_files = MAX_OPEN_FILES;
1294 Globals.maxprotocol = PROTOCOL_NT1;
1295 Globals.minprotocol = PROTOCOL_CORE;
1296 Globals.security = SEC_USER;
1297 Globals.paranoid_server_security = True;
1298 Globals.bEncryptPasswords = True;
1299 Globals.bUpdateEncrypt = False;
1300 Globals.bReadRaw = True;
1301 Globals.bWriteRaw = True;
1302 Globals.bReadPrediction = False;
1303 Globals.bReadbmpx = False;
1304 Globals.bNullPasswords = False;
1305 Globals.bObeyPamRestrictions = False;
1306 Globals.bStripDot = False;
1308 Globals.bSyslogOnly = False;
1309 Globals.bTimestampLogs = True;
1310 string_set(&Globals.szLogLevel, "0");
1311 Globals.bDebugHiresTimestamp = False;
1312 Globals.bDebugPid = False;
1313 Globals.bDebugUid = False;
1314 Globals.max_ttl = 60 * 60 * 24 * 3; /* 3 days default. */
1315 Globals.max_wins_ttl = 60 * 60 * 24 * 6; /* 6 days default. */
1316 Globals.min_wins_ttl = 60 * 60 * 6; /* 6 hours default. */
1317 Globals.machine_password_timeout = 60 * 60 * 24 * 7; /* 7 days default. */
1318 Globals.change_notify_timeout = 60; /* 1 minute default. */
1319 Globals.ReadSize = 16 * 1024;
1320 Globals.lm_announce = 2; /* = Auto: send only if LM clients found */
1321 Globals.lm_interval = 60;
1322 Globals.stat_cache_size = 50; /* Number of stat translations we'll keep */
1323 Globals.announce_as = ANNOUNCE_AS_NT_SERVER;
1324 #if (defined(HAVE_NETGROUP) && defined(WITH_AUTOMOUNT))
1325 Globals.bNISHomeMap = False;
1326 #ifdef WITH_NISPLUS_HOME
1327 string_set(&Globals.szNISHomeMapName, "auto_home.org_dir");
1329 string_set(&Globals.szNISHomeMapName, "auto.home");
1332 Globals.bTimeServer = False;
1333 Globals.bBindInterfacesOnly = False;
1334 Globals.bUnixPasswdSync = False;
1335 Globals.bPamPasswordChange = False;
1336 Globals.bPasswdChatDebug = False;
1337 Globals.bUnicode = True; /* Do unicode on the wire by default */
1338 Globals.bNTPipeSupport = True; /* Do NT pipes by default. */
1339 Globals.bNTStatusSupport = True; /* Use NT status by default. */
1340 Globals.bStatCache = True; /* use stat cache by default */
1341 Globals.restrict_anonymous = 0;
1342 Globals.bLanmanAuth = True; /* Do use the LanMan hash if it is available */
1343 Globals.bNTLMAuth = True; /* Do use NTLMv1 if it is available (otherwise NTLMv2) */
1344 Globals.map_to_guest = 0; /* By Default, "Never" */
1345 Globals.min_passwd_length = MINPASSWDLENGTH; /* By Default, 5. */
1346 Globals.oplock_break_wait_time = 0; /* By Default, 0 msecs. */
1347 Globals.enhanced_browsing = True;
1348 Globals.iLockSpinCount = 3; /* Try 2 times. */
1349 Globals.iLockSpinTime = 10; /* usec. */
1350 #ifdef MMAP_BLACKLIST
1351 Globals.bUseMmap = False;
1353 Globals.bUseMmap = True;
1355 Globals.bUnixExtensions = False;
1357 /* hostname lookups can be very expensive and are broken on
1358 a large number of sites (tridge) */
1359 Globals.bHostnameLookups = False;
1361 #ifdef WITH_LDAP_SAMCONFIG
1362 string_set(&Globals.szLdapServer, "localhost");
1363 Globals.ldap_port = 636;
1364 Globals.szPassdbBackend = str_list_make("ldapsam unixsam", NULL);
1366 Globals.szPassdbBackend = str_list_make("smbpasswd unixsam", NULL);
1367 #endif /* WITH_LDAP_SAMCONFIG */
1369 string_set(&Globals.szLdapSuffix, "");
1370 string_set(&Globals.szLdapMachineSuffix, "");
1371 string_set(&Globals.szLdapUserSuffix, "");
1373 string_set(&Globals.szLdapFilter, "(&(uid=%u)(objectclass=sambaAccount))");
1374 string_set(&Globals.szLdapAdminDn, "");
1375 Globals.ldap_ssl = LDAP_SSL_ON;
1376 Globals.ldap_passwd_sync = LDAP_PASSWD_SYNC_OFF;
1378 /* these parameters are set to defaults that are more appropriate
1379 for the increasing samba install base:
1381 as a member of the workgroup, that will possibly become a
1382 _local_ master browser (lm = True). this is opposed to a forced
1383 local master browser startup (pm = True).
1385 doesn't provide WINS server service by default (wsupp = False),
1386 and doesn't provide domain master browser services by default, either.
1390 Globals.bMsAddPrinterWizard = True;
1391 Globals.bPreferredMaster = Auto; /* depending on bDomainMaster */
1392 Globals.os_level = 20;
1393 Globals.bLocalMaster = True;
1394 Globals.bDomainMaster = Auto; /* depending on bDomainLogons */
1395 Globals.bDomainLogons = False;
1396 Globals.bBrowseList = True;
1397 Globals.bWINSsupport = False;
1398 Globals.bWINSproxy = False;
1400 Globals.bDNSproxy = True;
1402 /* this just means to use them if they exist */
1403 Globals.bKernelOplocks = True;
1405 Globals.bAllowTrustedDomains = True;
1407 string_set(&Globals.szTemplateShell, "/bin/false");
1408 string_set(&Globals.szTemplateHomedir, "/home/%D/%U");
1409 string_set(&Globals.szWinbindSeparator, "\\");
1411 Globals.winbind_cache_time = 15;
1412 Globals.bWinbindEnumUsers = True;
1413 Globals.bWinbindEnumGroups = True;
1414 Globals.bWinbindUseDefaultDomain = False;
1416 Globals.name_cache_timeout = 660; /* In seconds */
1418 Globals.bUseSpnego = True;
1420 string_set(&Globals.smb_ports, SMB_PORTS);
1423 static TALLOC_CTX *lp_talloc;
1425 /******************************************************************* a
1426 free up temporary memory - called from the main loop
1427 ********************************************************************/
1428 void lp_talloc_free(void)
1432 talloc_destroy(lp_talloc);
1436 /*******************************************************************
1437 convenience routine to grab string parameters into temporary memory
1438 and run standard_sub_basic on them. The buffers can be written to by
1439 callers without affecting the source string.
1440 ********************************************************************/
1441 static char *lp_string(const char *s)
1443 size_t len = s ? strlen(s) : 0;
1446 /* The follow debug is useful for tracking down memory problems
1447 especially if you have an inner loop that is calling a lp_*()
1448 function that returns a string. Perhaps this debug should be
1449 present all the time? */
1452 DEBUG(10, ("lp_string(%s)\n", s));
1456 lp_talloc = talloc_init_named("lp_talloc");
1458 ret = (char *)talloc(lp_talloc, len + 100); /* leave room for substitution */
1466 StrnCpy(ret, s, len);
1468 if (trim_string(ret, "\"", "\"")) {
1469 if (strchr(ret,'"') != NULL)
1470 StrnCpy(ret, s, len);
1473 standard_sub_basic(current_user_info.smb_name,ret,len+100);
1479 In this section all the functions that are used to access the
1480 parameters from the rest of the program are defined
1483 #define FN_GLOBAL_STRING(fn_name,ptr) \
1484 char *fn_name(void) {return(lp_string(*(char **)(ptr) ? *(char **)(ptr) : ""));}
1485 #define FN_GLOBAL_CONST_STRING(fn_name,ptr) \
1486 const char *fn_name(void) {return(*(const char **)(ptr) ? *(const char **)(ptr) : "");}
1487 #define FN_GLOBAL_LIST(fn_name,ptr) \
1488 char **fn_name(void) {return(*(char ***)(ptr));}
1489 #define FN_GLOBAL_BOOL(fn_name,ptr) \
1490 BOOL fn_name(void) {return(*(BOOL *)(ptr));}
1491 #define FN_GLOBAL_CHAR(fn_name,ptr) \
1492 char fn_name(void) {return(*(char *)(ptr));}
1493 #define FN_GLOBAL_INTEGER(fn_name,ptr) \
1494 int fn_name(void) {return(*(int *)(ptr));}
1496 #define FN_LOCAL_STRING(fn_name,val) \
1497 char *fn_name(int i) {return(lp_string((LP_SNUM_OK(i) && ServicePtrs[(i)]->val) ? ServicePtrs[(i)]->val : sDefault.val));}
1498 #define FN_LOCAL_CONST_STRING(fn_name,val) \
1499 const char *fn_name(int i) {return (const char *)((LP_SNUM_OK(i) && ServicePtrs[(i)]->val) ? ServicePtrs[(i)]->val : sDefault.val);}
1500 #define FN_LOCAL_LIST(fn_name,val) \
1501 char **fn_name(int i) {return(LP_SNUM_OK(i)? ServicePtrs[(i)]->val : sDefault.val);}
1502 #define FN_LOCAL_BOOL(fn_name,val) \
1503 BOOL fn_name(int i) {return(LP_SNUM_OK(i)? ServicePtrs[(i)]->val : sDefault.val);}
1504 #define FN_LOCAL_CHAR(fn_name,val) \
1505 char fn_name(int i) {return(LP_SNUM_OK(i)? ServicePtrs[(i)]->val : sDefault.val);}
1506 #define FN_LOCAL_INTEGER(fn_name,val) \
1507 int fn_name(int i) {return(LP_SNUM_OK(i)? ServicePtrs[(i)]->val : sDefault.val);}
1509 FN_GLOBAL_STRING(lp_smb_ports, &Globals.smb_ports)
1510 FN_GLOBAL_STRING(lp_dos_charset, &Globals.dos_charset)
1511 FN_GLOBAL_STRING(lp_unix_charset, &Globals.unix_charset)
1512 FN_GLOBAL_STRING(lp_display_charset, &Globals.display_charset)
1513 FN_GLOBAL_STRING(lp_logfile, &Globals.szLogFile)
1514 FN_GLOBAL_STRING(lp_configfile, &Globals.szConfigFile)
1515 FN_GLOBAL_STRING(lp_smb_passwd_file, &Globals.szSMBPasswdFile)
1516 FN_GLOBAL_STRING(lp_private_dir, &Globals.szPrivateDir)
1517 FN_GLOBAL_STRING(lp_serverstring, &Globals.szServerString)
1518 FN_GLOBAL_STRING(lp_printcapname, &Globals.szPrintcapname)
1519 FN_GLOBAL_STRING(lp_enumports_cmd, &Globals.szEnumPortsCommand)
1520 FN_GLOBAL_STRING(lp_addprinter_cmd, &Globals.szAddPrinterCommand)
1521 FN_GLOBAL_STRING(lp_deleteprinter_cmd, &Globals.szDeletePrinterCommand)
1522 FN_GLOBAL_STRING(lp_os2_driver_map, &Globals.szOs2DriverMap)
1523 FN_GLOBAL_STRING(lp_lockdir, &Globals.szLockDir)
1524 FN_GLOBAL_STRING(lp_piddir, &Globals.szPidDir)
1525 FN_GLOBAL_STRING(lp_mangling_method, &Globals.szManglingMethod)
1526 FN_GLOBAL_INTEGER(lp_mangle_prefix, &Globals.mangle_prefix)
1528 FN_GLOBAL_STRING(lp_utmpdir, &Globals.szUtmpDir)
1529 FN_GLOBAL_STRING(lp_wtmpdir, &Globals.szWtmpDir)
1530 FN_GLOBAL_BOOL(lp_utmp, &Globals.bUtmp)
1532 FN_GLOBAL_STRING(lp_rootdir, &Globals.szRootdir)
1533 FN_GLOBAL_STRING(lp_source_environment, &Globals.szSourceEnv)
1534 FN_GLOBAL_STRING(lp_defaultservice, &Globals.szDefaultService)
1535 FN_GLOBAL_STRING(lp_msg_command, &Globals.szMsgCommand)
1536 FN_GLOBAL_STRING(lp_dfree_command, &Globals.szDfree)
1537 FN_GLOBAL_STRING(lp_hosts_equiv, &Globals.szHostsEquiv)
1538 FN_GLOBAL_STRING(lp_auto_services, &Globals.szAutoServices)
1539 FN_GLOBAL_STRING(lp_passwd_program, &Globals.szPasswdProgram)
1540 FN_GLOBAL_STRING(lp_passwd_chat, &Globals.szPasswdChat)
1541 FN_GLOBAL_STRING(lp_passwordserver, &Globals.szPasswordServer)
1542 FN_GLOBAL_STRING(lp_name_resolve_order, &Globals.szNameResolveOrder)
1543 FN_GLOBAL_STRING(lp_workgroup, &Globals.szWorkGroup)
1544 FN_GLOBAL_STRING(lp_realm, &Globals.szRealm)
1545 FN_GLOBAL_STRING(lp_ads_server, &Globals.szADSserver)
1546 FN_GLOBAL_STRING(lp_username_map, &Globals.szUsernameMap)
1547 FN_GLOBAL_CONST_STRING(lp_logon_script, &Globals.szLogonScript)
1548 FN_GLOBAL_CONST_STRING(lp_logon_path, &Globals.szLogonPath)
1549 FN_GLOBAL_CONST_STRING(lp_logon_drive, &Globals.szLogonDrive)
1550 FN_GLOBAL_CONST_STRING(lp_logon_home, &Globals.szLogonHome)
1551 FN_GLOBAL_STRING(lp_remote_announce, &Globals.szRemoteAnnounce)
1552 FN_GLOBAL_STRING(lp_remote_browse_sync, &Globals.szRemoteBrowseSync)
1553 FN_GLOBAL_LIST(lp_wins_server_list, &Globals.szWINSservers)
1554 FN_GLOBAL_LIST(lp_interfaces, &Globals.szInterfaces)
1555 FN_GLOBAL_STRING(lp_socket_address, &Globals.szSocketAddress)
1556 FN_GLOBAL_STRING(lp_nis_home_map_name, &Globals.szNISHomeMapName)
1557 static FN_GLOBAL_STRING(lp_announce_version, &Globals.szAnnounceVersion)
1558 FN_GLOBAL_LIST(lp_netbios_aliases, &Globals.szNetbiosAliases)
1559 FN_GLOBAL_LIST(lp_passdb_backend, &Globals.szPassdbBackend)
1560 FN_GLOBAL_LIST(lp_sam_backend, &Globals.szSamBackend)
1561 FN_GLOBAL_STRING(lp_panic_action, &Globals.szPanicAction)
1562 FN_GLOBAL_STRING(lp_adduser_script, &Globals.szAddUserScript)
1563 FN_GLOBAL_STRING(lp_deluser_script, &Globals.szDelUserScript)
1565 FN_GLOBAL_CONST_STRING(lp_guestaccount, &Globals.szGuestaccount)
1566 FN_GLOBAL_STRING(lp_addgroup_script, &Globals.szAddGroupScript)
1567 FN_GLOBAL_STRING(lp_delgroup_script, &Globals.szDelGroupScript)
1568 FN_GLOBAL_STRING(lp_addusertogroup_script, &Globals.szAddUserToGroupScript)
1569 FN_GLOBAL_STRING(lp_deluserfromgroup_script, &Globals.szDelUserFromGroupScript)
1570 FN_GLOBAL_STRING(lp_setprimarygroup_script, &Globals.szSetPrimaryGroupScript)
1572 FN_GLOBAL_STRING(lp_addmachine_script, &Globals.szAddMachineScript)
1574 FN_GLOBAL_STRING(lp_shutdown_script, &Globals.szShutdownScript)
1575 FN_GLOBAL_STRING(lp_abort_shutdown_script, &Globals.szAbortShutdownScript)
1577 FN_GLOBAL_STRING(lp_wins_hook, &Globals.szWINSHook)
1578 FN_GLOBAL_STRING(lp_wins_partners, &Globals.szWINSPartners)
1579 FN_GLOBAL_STRING(lp_template_homedir, &Globals.szTemplateHomedir)
1580 FN_GLOBAL_STRING(lp_template_shell, &Globals.szTemplateShell)
1581 FN_GLOBAL_STRING(lp_winbind_separator, &Globals.szWinbindSeparator)
1582 FN_GLOBAL_BOOL(lp_winbind_enum_users, &Globals.bWinbindEnumUsers)
1583 FN_GLOBAL_BOOL(lp_winbind_enum_groups, &Globals.bWinbindEnumGroups)
1584 FN_GLOBAL_BOOL(lp_winbind_use_default_domain, &Globals.bWinbindUseDefaultDomain)
1586 #ifdef WITH_LDAP_SAMCONFIG
1587 FN_GLOBAL_STRING(lp_ldap_server, &Globals.szLdapServer)
1588 FN_GLOBAL_INTEGER(lp_ldap_port, &Globals.ldap_port)
1590 FN_GLOBAL_STRING(lp_ldap_suffix, &Globals.szLdapSuffix)
1591 FN_GLOBAL_STRING(lp_ldap_machine_suffix, &Globals.szLdapMachineSuffix)
1592 FN_GLOBAL_STRING(lp_ldap_user_suffix, &Globals.szLdapUserSuffix)
1593 FN_GLOBAL_STRING(lp_ldap_filter, &Globals.szLdapFilter)
1594 FN_GLOBAL_STRING(lp_ldap_admin_dn, &Globals.szLdapAdminDn)
1595 FN_GLOBAL_INTEGER(lp_ldap_ssl, &Globals.ldap_ssl)
1596 FN_GLOBAL_INTEGER(lp_ldap_passwd_sync, &Globals.ldap_passwd_sync)
1597 FN_GLOBAL_STRING(lp_add_share_cmd, &Globals.szAddShareCommand)
1598 FN_GLOBAL_STRING(lp_change_share_cmd, &Globals.szChangeShareCommand)
1599 FN_GLOBAL_STRING(lp_delete_share_cmd, &Globals.szDeleteShareCommand)
1601 FN_GLOBAL_BOOL(lp_disable_netbios, &Globals.bDisableNetbios)
1602 FN_GLOBAL_BOOL(lp_ms_add_printer_wizard, &Globals.bMsAddPrinterWizard)
1603 FN_GLOBAL_BOOL(lp_dns_proxy, &Globals.bDNSproxy)
1604 FN_GLOBAL_BOOL(lp_wins_support, &Globals.bWINSsupport)
1605 FN_GLOBAL_BOOL(lp_we_are_a_wins_server, &Globals.bWINSsupport)
1606 FN_GLOBAL_BOOL(lp_wins_proxy, &Globals.bWINSproxy)
1607 FN_GLOBAL_BOOL(lp_local_master, &Globals.bLocalMaster)
1608 FN_GLOBAL_BOOL(lp_domain_logons, &Globals.bDomainLogons)
1609 FN_GLOBAL_BOOL(lp_load_printers, &Globals.bLoadPrinters)
1610 FN_GLOBAL_BOOL(lp_readprediction, &Globals.bReadPrediction)
1611 FN_GLOBAL_BOOL(lp_readbmpx, &Globals.bReadbmpx)
1612 FN_GLOBAL_BOOL(lp_readraw, &Globals.bReadRaw)
1613 FN_GLOBAL_BOOL(lp_large_readwrite, &Globals.bLargeReadwrite)
1614 FN_GLOBAL_BOOL(lp_writeraw, &Globals.bWriteRaw)
1615 FN_GLOBAL_BOOL(lp_null_passwords, &Globals.bNullPasswords)
1616 FN_GLOBAL_BOOL(lp_obey_pam_restrictions, &Globals.bObeyPamRestrictions)
1617 FN_GLOBAL_BOOL(lp_strip_dot, &Globals.bStripDot)
1618 FN_GLOBAL_BOOL(lp_encrypted_passwords, &Globals.bEncryptPasswords)
1619 FN_GLOBAL_BOOL(lp_update_encrypted, &Globals.bUpdateEncrypt)
1620 FN_GLOBAL_BOOL(lp_syslog_only, &Globals.bSyslogOnly)
1621 FN_GLOBAL_BOOL(lp_timestamp_logs, &Globals.bTimestampLogs)
1622 FN_GLOBAL_BOOL(lp_debug_hires_timestamp, &Globals.bDebugHiresTimestamp)
1623 FN_GLOBAL_BOOL(lp_debug_pid, &Globals.bDebugPid)
1624 FN_GLOBAL_BOOL(lp_debug_uid, &Globals.bDebugUid)
1625 FN_GLOBAL_BOOL(lp_browse_list, &Globals.bBrowseList)
1626 FN_GLOBAL_BOOL(lp_nis_home_map, &Globals.bNISHomeMap)
1627 static FN_GLOBAL_BOOL(lp_time_server, &Globals.bTimeServer)
1628 FN_GLOBAL_BOOL(lp_bind_interfaces_only, &Globals.bBindInterfacesOnly)
1629 FN_GLOBAL_BOOL(lp_pam_password_change, &Globals.bPamPasswordChange)
1630 FN_GLOBAL_BOOL(lp_unix_password_sync, &Globals.bUnixPasswdSync)
1631 FN_GLOBAL_BOOL(lp_passwd_chat_debug, &Globals.bPasswdChatDebug)
1632 FN_GLOBAL_BOOL(lp_unicode, &Globals.bUnicode)
1633 FN_GLOBAL_BOOL(lp_nt_pipe_support, &Globals.bNTPipeSupport)
1634 FN_GLOBAL_BOOL(lp_nt_status_support, &Globals.bNTStatusSupport)
1635 FN_GLOBAL_BOOL(lp_stat_cache, &Globals.bStatCache)
1636 FN_GLOBAL_BOOL(lp_allow_trusted_domains, &Globals.bAllowTrustedDomains)
1637 FN_GLOBAL_INTEGER(lp_restrict_anonymous, &Globals.restrict_anonymous)
1638 FN_GLOBAL_BOOL(lp_lanman_auth, &Globals.bLanmanAuth)
1639 FN_GLOBAL_BOOL(lp_ntlm_auth, &Globals.bNTLMAuth)
1640 FN_GLOBAL_BOOL(lp_host_msdfs, &Globals.bHostMSDfs)
1641 FN_GLOBAL_BOOL(lp_kernel_oplocks, &Globals.bKernelOplocks)
1642 FN_GLOBAL_BOOL(lp_enhanced_browsing, &Globals.enhanced_browsing)
1643 FN_GLOBAL_BOOL(lp_use_mmap, &Globals.bUseMmap)
1644 FN_GLOBAL_BOOL(lp_unix_extensions, &Globals.bUnixExtensions)
1645 FN_GLOBAL_BOOL(lp_use_spnego, &Globals.bUseSpnego)
1646 FN_GLOBAL_BOOL(lp_hostname_lookups, &Globals.bHostnameLookups)
1647 FN_GLOBAL_INTEGER(lp_os_level, &Globals.os_level)
1648 FN_GLOBAL_INTEGER(lp_max_ttl, &Globals.max_ttl)
1649 FN_GLOBAL_INTEGER(lp_max_wins_ttl, &Globals.max_wins_ttl)
1650 FN_GLOBAL_INTEGER(lp_min_wins_ttl, &Globals.min_wins_ttl)
1651 FN_GLOBAL_INTEGER(lp_max_log_size, &Globals.max_log_size)
1652 FN_GLOBAL_INTEGER(lp_max_open_files, &Globals.max_open_files)
1653 FN_GLOBAL_INTEGER(lp_maxxmit, &Globals.max_xmit)
1654 FN_GLOBAL_INTEGER(lp_maxmux, &Globals.max_mux)
1655 FN_GLOBAL_INTEGER(lp_passwordlevel, &Globals.pwordlevel)
1656 FN_GLOBAL_INTEGER(lp_usernamelevel, &Globals.unamelevel)
1657 FN_GLOBAL_INTEGER(lp_readsize, &Globals.ReadSize)
1658 FN_GLOBAL_INTEGER(lp_deadtime, &Globals.deadtime)
1659 FN_GLOBAL_INTEGER(lp_maxprotocol, &Globals.maxprotocol)
1660 FN_GLOBAL_INTEGER(lp_minprotocol, &Globals.minprotocol)
1661 FN_GLOBAL_INTEGER(lp_security, &Globals.security)
1662 FN_GLOBAL_LIST(lp_auth_methods, &Globals.AuthMethods)
1663 FN_GLOBAL_BOOL(lp_paranoid_server_security, &Globals.paranoid_server_security)
1664 FN_GLOBAL_INTEGER(lp_maxdisksize, &Globals.maxdisksize)
1665 FN_GLOBAL_INTEGER(lp_lpqcachetime, &Globals.lpqcachetime)
1666 FN_GLOBAL_INTEGER(lp_max_smbd_processes, &Globals.iMaxSmbdProcesses)
1667 FN_GLOBAL_INTEGER(lp_disable_spoolss, &Globals.bDisableSpoolss)
1668 FN_GLOBAL_INTEGER(lp_totalprintjobs, &Globals.iTotalPrintJobs)
1669 FN_GLOBAL_INTEGER(lp_syslog, &Globals.syslog)
1670 static FN_GLOBAL_INTEGER(lp_announce_as, &Globals.announce_as)
1671 FN_GLOBAL_INTEGER(lp_lm_announce, &Globals.lm_announce)
1672 FN_GLOBAL_INTEGER(lp_lm_interval, &Globals.lm_interval)
1673 FN_GLOBAL_INTEGER(lp_machine_password_timeout, &Globals.machine_password_timeout)
1674 FN_GLOBAL_INTEGER(lp_change_notify_timeout, &Globals.change_notify_timeout)
1675 FN_GLOBAL_INTEGER(lp_stat_cache_size, &Globals.stat_cache_size)
1676 FN_GLOBAL_INTEGER(lp_map_to_guest, &Globals.map_to_guest)
1677 FN_GLOBAL_INTEGER(lp_min_passwd_length, &Globals.min_passwd_length)
1678 FN_GLOBAL_INTEGER(lp_oplock_break_wait_time, &Globals.oplock_break_wait_time)
1679 FN_GLOBAL_INTEGER(lp_lock_spin_count, &Globals.iLockSpinCount)
1680 FN_GLOBAL_INTEGER(lp_lock_sleep_time, &Globals.iLockSpinTime)
1681 FN_LOCAL_STRING(lp_preexec, szPreExec)
1682 FN_LOCAL_STRING(lp_postexec, szPostExec)
1683 FN_LOCAL_STRING(lp_rootpreexec, szRootPreExec)
1684 FN_LOCAL_STRING(lp_rootpostexec, szRootPostExec)
1685 FN_LOCAL_STRING(lp_servicename, szService)
1686 FN_LOCAL_CONST_STRING(lp_const_servicename, szService)
1687 FN_LOCAL_STRING(lp_pathname, szPath)
1688 FN_LOCAL_STRING(lp_dontdescend, szDontdescend)
1689 FN_LOCAL_STRING(lp_username, szUsername)
1690 FN_LOCAL_LIST(lp_invalid_users, szInvalidUsers)
1691 FN_LOCAL_LIST(lp_valid_users, szValidUsers)
1692 FN_LOCAL_LIST(lp_admin_users, szAdminUsers)
1693 FN_LOCAL_STRING(lp_printcommand, szPrintcommand)
1694 FN_LOCAL_STRING(lp_lpqcommand, szLpqcommand)
1695 FN_LOCAL_STRING(lp_lprmcommand, szLprmcommand)
1696 FN_LOCAL_STRING(lp_lppausecommand, szLppausecommand)
1697 FN_LOCAL_STRING(lp_lpresumecommand, szLpresumecommand)
1698 FN_LOCAL_STRING(lp_queuepausecommand, szQueuepausecommand)
1699 FN_LOCAL_STRING(lp_queueresumecommand, szQueueresumecommand)
1700 static FN_LOCAL_STRING(_lp_printername, szPrintername)
1701 FN_LOCAL_LIST(lp_hostsallow, szHostsallow)
1702 FN_LOCAL_LIST(lp_hostsdeny, szHostsdeny)
1703 FN_LOCAL_STRING(lp_magicscript, szMagicScript)
1704 FN_LOCAL_STRING(lp_magicoutput, szMagicOutput)
1705 FN_LOCAL_STRING(lp_comment, comment)
1706 FN_LOCAL_STRING(lp_force_user, force_user)
1707 FN_LOCAL_STRING(lp_force_group, force_group)
1708 FN_LOCAL_LIST(lp_readlist, readlist)
1709 FN_LOCAL_LIST(lp_writelist, writelist)
1710 FN_LOCAL_LIST(lp_printer_admin, printer_admin)
1711 FN_LOCAL_STRING(lp_fstype, fstype)
1712 FN_LOCAL_STRING(lp_vfsobj, szVfsObjectFile)
1713 FN_LOCAL_STRING(lp_vfs_options, szVfsOptions)
1714 FN_LOCAL_STRING(lp_vfs_path, szVfsPath)
1715 static FN_LOCAL_STRING(lp_volume, volume)
1716 FN_LOCAL_STRING(lp_mangled_map, szMangledMap)
1717 FN_LOCAL_STRING(lp_veto_files, szVetoFiles)
1718 FN_LOCAL_STRING(lp_hide_files, szHideFiles)
1719 FN_LOCAL_STRING(lp_veto_oplocks, szVetoOplockFiles)
1720 FN_LOCAL_BOOL(lp_msdfs_root, bMSDfsRoot)
1721 FN_LOCAL_BOOL(lp_autoloaded, autoloaded)
1722 FN_LOCAL_BOOL(lp_preexec_close, bPreexecClose)
1723 FN_LOCAL_BOOL(lp_rootpreexec_close, bRootpreexecClose)
1724 FN_LOCAL_BOOL(lp_casesensitive, bCaseSensitive)
1725 FN_LOCAL_BOOL(lp_preservecase, bCasePreserve)
1726 FN_LOCAL_BOOL(lp_shortpreservecase, bShortCasePreserve)
1727 FN_LOCAL_BOOL(lp_casemangle, bCaseMangle)
1728 FN_LOCAL_BOOL(lp_hide_dot_files, bHideDotFiles)
1729 FN_LOCAL_BOOL(lp_hide_special_files, bHideSpecialFiles)
1730 FN_LOCAL_BOOL(lp_hideunreadable, bHideUnReadable)
1731 FN_LOCAL_BOOL(lp_hideunwriteable_files, bHideUnWriteableFiles)
1732 FN_LOCAL_BOOL(lp_browseable, bBrowseable)
1733 FN_LOCAL_BOOL(lp_readonly, bRead_only)
1734 FN_LOCAL_BOOL(lp_no_set_dir, bNo_set_dir)
1735 FN_LOCAL_BOOL(lp_guest_ok, bGuest_ok)
1736 FN_LOCAL_BOOL(lp_guest_only, bGuest_only)
1737 FN_LOCAL_BOOL(lp_print_ok, bPrint_ok)
1738 FN_LOCAL_BOOL(lp_map_hidden, bMap_hidden)
1739 FN_LOCAL_BOOL(lp_map_archive, bMap_archive)
1740 FN_LOCAL_BOOL(lp_locking, bLocking)
1741 FN_LOCAL_BOOL(lp_strict_locking, bStrictLocking)
1742 FN_LOCAL_BOOL(lp_posix_locking, bPosixLocking)
1743 FN_LOCAL_BOOL(lp_share_modes, bShareModes)
1744 FN_LOCAL_BOOL(lp_oplocks, bOpLocks)
1745 FN_LOCAL_BOOL(lp_level2_oplocks, bLevel2OpLocks)
1746 FN_LOCAL_BOOL(lp_onlyuser, bOnlyUser)
1747 FN_LOCAL_BOOL(lp_manglednames, bMangledNames)
1748 FN_LOCAL_BOOL(lp_widelinks, bWidelinks)
1749 FN_LOCAL_BOOL(lp_symlinks, bSymlinks)
1750 FN_LOCAL_BOOL(lp_syncalways, bSyncAlways)
1751 FN_LOCAL_BOOL(lp_strict_allocate, bStrictAllocate)
1752 FN_LOCAL_BOOL(lp_strict_sync, bStrictSync)
1753 FN_LOCAL_BOOL(lp_map_system, bMap_system)
1754 FN_LOCAL_BOOL(lp_delete_readonly, bDeleteReadonly)
1755 FN_LOCAL_BOOL(lp_fake_oplocks, bFakeOplocks)
1756 FN_LOCAL_BOOL(lp_recursive_veto_delete, bDeleteVetoFiles)
1757 FN_LOCAL_BOOL(lp_dos_filemode, bDosFilemode)
1758 FN_LOCAL_BOOL(lp_dos_filetimes, bDosFiletimes)
1759 FN_LOCAL_BOOL(lp_dos_filetime_resolution, bDosFiletimeResolution)
1760 FN_LOCAL_BOOL(lp_fake_dir_create_times, bFakeDirCreateTimes)
1761 FN_LOCAL_BOOL(lp_blocking_locks, bBlockingLocks)
1762 FN_LOCAL_BOOL(lp_inherit_perms, bInheritPerms)
1763 FN_LOCAL_BOOL(lp_inherit_acls, bInheritACLS)
1764 FN_LOCAL_BOOL(lp_use_client_driver, bUseClientDriver)
1765 FN_LOCAL_BOOL(lp_default_devmode, bDefaultDevmode)
1766 FN_LOCAL_BOOL(lp_nt_acl_support, bNTAclSupport)
1767 FN_LOCAL_BOOL(lp_use_sendfile, bUseSendfile)
1768 FN_LOCAL_BOOL(lp_profile_acls, bProfileAcls)
1769 FN_LOCAL_INTEGER(lp_create_mask, iCreate_mask)
1770 FN_LOCAL_INTEGER(lp_force_create_mode, iCreate_force_mode)
1771 FN_LOCAL_INTEGER(lp_security_mask, iSecurity_mask)
1772 FN_LOCAL_INTEGER(lp_force_security_mode, iSecurity_force_mode)
1773 FN_LOCAL_INTEGER(lp_dir_mask, iDir_mask)
1774 FN_LOCAL_INTEGER(lp_force_dir_mode, iDir_force_mode)
1775 FN_LOCAL_INTEGER(lp_dir_security_mask, iDir_Security_mask)
1776 FN_LOCAL_INTEGER(lp_force_dir_security_mode, iDir_Security_force_mode)
1777 FN_LOCAL_INTEGER(lp_max_connections, iMaxConnections)
1778 FN_LOCAL_INTEGER(lp_defaultcase, iDefaultCase)
1779 FN_LOCAL_INTEGER(lp_minprintspace, iMinPrintSpace)
1780 FN_LOCAL_INTEGER(lp_printing, iPrinting)
1781 FN_LOCAL_INTEGER(lp_oplock_contention_limit, iOplockContentionLimit)
1782 FN_LOCAL_INTEGER(lp_csc_policy, iCSCPolicy)
1783 FN_LOCAL_INTEGER(lp_write_cache_size, iWriteCacheSize)
1784 FN_LOCAL_INTEGER(lp_block_size, iBlock_size)
1785 FN_LOCAL_CHAR(lp_magicchar, magic_char)
1786 FN_GLOBAL_INTEGER(lp_winbind_cache_time, &Globals.winbind_cache_time)
1787 FN_GLOBAL_BOOL(lp_hide_local_users, &Globals.bHideLocalUsers)
1788 FN_GLOBAL_BOOL(lp_algorithmic_rid_base, &Globals.bAlgorithmicRidBase)
1789 FN_GLOBAL_INTEGER(lp_name_cache_timeout, &Globals.name_cache_timeout)
1791 typedef struct _param_opt_struct param_opt_struct;
1792 struct _param_opt_struct {
1795 param_opt_struct *prev, *next;
1798 static param_opt_struct *param_opt = NULL;
1800 /* Return parametric option from given service. Type is a part of option before ':' */
1801 /* Parametric option has following syntax: 'Type: option = value' */
1802 /* Returned value is allocated in 'lp_talloc' context */
1803 char *lp_parm_string(const char *servicename, const char *type, const char *option)
1805 param_opt_struct *data;
1808 if (param_opt != NULL) {
1809 ZERO_STRUCT(vfskey);
1810 pstr_sprintf(vfskey, "%s:%s:%s", (servicename==NULL) ? "global" : servicename,
1814 if (strcmp(data->key, vfskey) == 0) {
1815 return lp_string(data->value);
1819 /* Try to fetch the same option but from globals */
1820 pstr_sprintf(vfskey, "global:%s:%s", type, option);
1823 if (strcmp(data->key, vfskey) == 0) {
1824 return lp_string(data->value);
1833 /* local prototypes */
1835 static int map_parameter(char *pszParmName);
1836 static BOOL set_boolean(BOOL *pb, char *pszParmValue);
1837 static int getservicebyname(const char *pszServiceName,
1838 service * pserviceDest);
1839 static void copy_service(service * pserviceDest,
1840 service * pserviceSource, BOOL *pcopymapDest);
1841 static BOOL service_ok(int iService);
1842 static BOOL do_parameter(char *pszParmName, char *pszParmValue);
1843 static BOOL do_section(char *pszSectionName);
1844 static void init_copymap(service * pservice);
1847 /***************************************************************************
1848 initialise a service to the defaults
1849 ***************************************************************************/
1850 static void init_service(service * pservice)
1852 memset((char *)pservice, '\0', sizeof(service));
1853 copy_service(pservice, &sDefault, NULL);
1857 /***************************************************************************
1858 free the dynamically allocated parts of a service struct
1859 ***************************************************************************/
1860 static void free_service(service * pservice)
1866 if (pservice->szService)
1868 ("free_service: Freeing service %s\n",
1869 pservice->szService));
1871 string_free(&pservice->szService);
1872 SAFE_FREE(pservice->copymap);
1874 for (i = 0; parm_table[i].label; i++)
1876 if ((parm_table[i].type == P_STRING ||
1877 parm_table[i].type == P_USTRING) &&
1878 parm_table[i].class == P_LOCAL)
1879 string_free((char **)
1880 (((char *)pservice) +
1881 PTR_DIFF(parm_table[i].ptr, &sDefault)));
1882 else if (parm_table[i].type == P_LIST &&
1883 parm_table[i].class == P_LOCAL)
1884 str_list_free((char ***)
1885 (((char *)pservice) +
1886 PTR_DIFF(parm_table[i].ptr, &sDefault)));
1890 ZERO_STRUCTP(pservice);
1893 /***************************************************************************
1894 add a new service to the services array initialising it with the given
1896 ***************************************************************************/
1897 static int add_a_service(const service * pservice, const char *name)
1901 int num_to_alloc = iNumServices + 1;
1903 tservice = *pservice;
1905 /* it might already exist */
1908 i = getservicebyname(name, NULL);
1913 /* find an invalid one */
1914 for (i = 0; i < iNumServices; i++)
1915 if (!ServicePtrs[i]->valid)
1918 /* if not, then create one */
1919 if (i == iNumServices)
1923 tsp = (service **) Realloc(ServicePtrs,
1928 DEBUG(0,("add_a_service: failed to enlarge ServicePtrs!\n"));
1933 ServicePtrs[iNumServices] =
1934 (service *) malloc(sizeof(service));
1936 if (!ServicePtrs[iNumServices]) {
1937 DEBUG(0,("add_a_service: out of memory!\n"));
1944 free_service(ServicePtrs[i]);
1946 ServicePtrs[i]->valid = True;
1948 init_service(ServicePtrs[i]);
1949 copy_service(ServicePtrs[i], &tservice, NULL);
1952 string_set(&ServicePtrs[i]->szService, name);
1957 /***************************************************************************
1958 add a new home service, with the specified home directory, defaults coming
1960 ***************************************************************************/
1961 BOOL lp_add_home(const char *pszHomename, int iDefaultService,
1962 const char *user, const char *pszHomedir)
1967 i = add_a_service(ServicePtrs[iDefaultService], pszHomename);
1972 if (!(*(ServicePtrs[iDefaultService]->szPath))
1973 || strequal(ServicePtrs[iDefaultService]->szPath, lp_pathname(-1))) {
1974 pstrcpy(newHomedir, pszHomedir);
1976 pstrcpy(newHomedir, lp_pathname(iDefaultService));
1977 string_sub(newHomedir,"%H", pszHomedir, sizeof(newHomedir));
1980 string_set(&ServicePtrs[i]->szPath, newHomedir);
1982 if (!(*(ServicePtrs[i]->comment)))
1985 slprintf(comment, sizeof(comment) - 1,
1986 "Home directory of %s", user);
1987 string_set(&ServicePtrs[i]->comment, comment);
1989 ServicePtrs[i]->bAvailable = sDefault.bAvailable;
1990 ServicePtrs[i]->bBrowseable = sDefault.bBrowseable;
1993 ("adding home's share [%s] for user '%s' at '%s'\n", pszHomename,
1999 /***************************************************************************
2000 add a new service, based on an old one.
2001 ***************************************************************************/
2002 int lp_add_service(const char *pszService, int iDefaultService)
2004 return (add_a_service(ServicePtrs[iDefaultService], pszService));
2008 /***************************************************************************
2010 ***************************************************************************/
2011 static BOOL lp_add_ipc(char *ipc_name, BOOL guest_ok)
2014 int i = add_a_service(&sDefault, ipc_name);
2019 slprintf(comment, sizeof(comment) - 1,
2020 "IPC Service (%s)", Globals.szServerString);
2022 string_set(&ServicePtrs[i]->szPath, tmpdir());
2023 string_set(&ServicePtrs[i]->szUsername, "");
2024 string_set(&ServicePtrs[i]->comment, comment);
2025 string_set(&ServicePtrs[i]->fstype, "IPC");
2026 ServicePtrs[i]->iMaxConnections = 0;
2027 ServicePtrs[i]->bAvailable = True;
2028 ServicePtrs[i]->bRead_only = True;
2029 ServicePtrs[i]->bGuest_only = False;
2030 ServicePtrs[i]->bGuest_ok = guest_ok;
2031 ServicePtrs[i]->bPrint_ok = False;
2032 ServicePtrs[i]->bBrowseable = sDefault.bBrowseable;
2034 DEBUG(3, ("adding IPC service\n"));
2039 /***************************************************************************
2040 add a new printer service, with defaults coming from service iFrom.
2041 ***************************************************************************/
2042 BOOL lp_add_printer(const char *pszPrintername, int iDefaultService)
2044 const char *comment = "From Printcap";
2045 int i = add_a_service(ServicePtrs[iDefaultService], pszPrintername);
2050 /* note that we do NOT default the availability flag to True - */
2051 /* we take it from the default service passed. This allows all */
2052 /* dynamic printers to be disabled by disabling the [printers] */
2053 /* entry (if/when the 'available' keyword is implemented!). */
2055 /* the printer name is set to the service name. */
2056 string_set(&ServicePtrs[i]->szPrintername, pszPrintername);
2057 string_set(&ServicePtrs[i]->comment, comment);
2058 ServicePtrs[i]->bBrowseable = sDefault.bBrowseable;
2059 /* Printers cannot be read_only. */
2060 ServicePtrs[i]->bRead_only = False;
2061 /* No share modes on printer services. */
2062 ServicePtrs[i]->bShareModes = False;
2063 /* No oplocks on printer services. */
2064 ServicePtrs[i]->bOpLocks = False;
2065 /* Printer services must be printable. */
2066 ServicePtrs[i]->bPrint_ok = True;
2068 DEBUG(3, ("adding printer service %s\n", pszPrintername));
2070 update_server_announce_as_printserver();
2075 /***************************************************************************
2076 Map a parameter's string representation to something we can use.
2077 Returns False if the parameter string is not recognised, else TRUE.
2078 ***************************************************************************/
2079 static int map_parameter(char *pszParmName)
2083 if (*pszParmName == '-')
2086 for (iIndex = 0; parm_table[iIndex].label; iIndex++)
2087 if (strwicmp(parm_table[iIndex].label, pszParmName) == 0)
2090 /* Warn only if it isn't parametric option */
2091 if (strchr(pszParmName, ':') == NULL)
2092 DEBUG(0, ("Unknown parameter encountered: \"%s\"\n", pszParmName));
2093 /* We do return 'fail' for parametric options as well because they are
2094 stored in different storage
2100 /***************************************************************************
2101 Set a boolean variable from the text value stored in the passed string.
2102 Returns True in success, False if the passed string does not correctly
2103 represent a boolean.
2104 ***************************************************************************/
2105 static BOOL set_boolean(BOOL *pb, char *pszParmValue)
2110 if (strwicmp(pszParmValue, "yes") == 0 ||
2111 strwicmp(pszParmValue, "true") == 0 ||
2112 strwicmp(pszParmValue, "1") == 0)
2115 if (strwicmp(pszParmValue, "no") == 0 ||
2116 strwicmp(pszParmValue, "False") == 0 ||
2117 strwicmp(pszParmValue, "0") == 0)
2122 ("ERROR: Badly formed boolean in configuration file: \"%s\".\n",
2129 /***************************************************************************
2130 Find a service by name. Otherwise works like get_service.
2131 ***************************************************************************/
2132 static int getservicebyname(const char *pszServiceName, service * pserviceDest)
2136 for (iService = iNumServices - 1; iService >= 0; iService--)
2137 if (VALID(iService) &&
2138 strwicmp(ServicePtrs[iService]->szService, pszServiceName) == 0)
2140 if (pserviceDest != NULL)
2141 copy_service(pserviceDest, ServicePtrs[iService], NULL);
2150 /***************************************************************************
2151 Copy a service structure to another
2153 If pcopymapDest is NULL then copy all fields
2154 ***************************************************************************/
2155 static void copy_service(service * pserviceDest,
2156 service * pserviceSource, BOOL *pcopymapDest)
2159 BOOL bcopyall = (pcopymapDest == NULL);
2161 for (i = 0; parm_table[i].label; i++)
2162 if (parm_table[i].ptr && parm_table[i].class == P_LOCAL &&
2163 (bcopyall || pcopymapDest[i]))
2165 void *def_ptr = parm_table[i].ptr;
2167 ((char *)pserviceSource) + PTR_DIFF(def_ptr,
2170 ((char *)pserviceDest) + PTR_DIFF(def_ptr,
2173 switch (parm_table[i].type)
2177 *(BOOL *)dest_ptr = *(BOOL *)src_ptr;
2183 *(int *)dest_ptr = *(int *)src_ptr;
2187 *(char *)dest_ptr = *(char *)src_ptr;
2191 string_set(dest_ptr,
2196 string_set(dest_ptr,
2198 strupper(*(char **)dest_ptr);
2201 str_list_copy((char ***)dest_ptr, *(char ***)src_ptr);
2210 init_copymap(pserviceDest);
2211 if (pserviceSource->copymap)
2212 memcpy((void *)pserviceDest->copymap,
2213 (void *)pserviceSource->copymap,
2214 sizeof(BOOL) * NUMPARAMETERS);
2218 /***************************************************************************
2219 Check a service for consistency. Return False if the service is in any way
2220 incomplete or faulty, else True.
2221 ***************************************************************************/
2222 static BOOL service_ok(int iService)
2227 if (ServicePtrs[iService]->szService[0] == '\0')
2230 ("The following message indicates an internal error:\n"));
2231 DEBUG(0, ("No service name in service entry.\n"));
2235 /* The [printers] entry MUST be printable. I'm all for flexibility, but */
2236 /* I can't see why you'd want a non-printable printer service... */
2237 if (strwicmp(ServicePtrs[iService]->szService, PRINTERS_NAME) == 0) {
2238 if (!ServicePtrs[iService]->bPrint_ok) {
2240 ("WARNING: [%s] service MUST be printable!\n",
2241 ServicePtrs[iService]->szService));
2242 ServicePtrs[iService]->bPrint_ok = True;
2244 /* [printers] service must also be non-browsable. */
2245 if (ServicePtrs[iService]->bBrowseable)
2246 ServicePtrs[iService]->bBrowseable = False;
2249 if (ServicePtrs[iService]->szPath[0] == '\0' &&
2250 strwicmp(ServicePtrs[iService]->szService, HOMES_NAME) != 0)
2253 ("No path in service %s - using %s\n",
2254 ServicePtrs[iService]->szService, tmpdir()));
2255 string_set(&ServicePtrs[iService]->szPath, tmpdir());
2258 /* If a service is flagged unavailable, log the fact at level 0. */
2259 if (!ServicePtrs[iService]->bAvailable)
2260 DEBUG(1, ("NOTE: Service %s is flagged unavailable.\n",
2261 ServicePtrs[iService]->szService));
2266 static struct file_lists
2268 struct file_lists *next;
2275 /*******************************************************************
2276 keep a linked list of all config files so we know when one has changed
2277 it's date and needs to be reloaded
2278 ********************************************************************/
2279 static void add_to_file_list(const char *fname, const char *subfname)
2281 struct file_lists *f = file_lists;
2285 if (f->name && !strcmp(f->name, fname))
2292 f = (struct file_lists *)malloc(sizeof(file_lists[0]));
2295 f->next = file_lists;
2296 f->name = strdup(fname);
2302 f->subfname = strdup(subfname);
2309 f->modtime = file_modtime(subfname);
2311 time_t t = file_modtime(subfname);
2317 /*******************************************************************
2318 check if a config file has changed date
2319 ********************************************************************/
2320 BOOL lp_file_list_changed(void)
2322 struct file_lists *f = file_lists;
2323 DEBUG(6, ("lp_file_list_changed()\n"));
2329 pstrcpy(n2, f->name);
2330 standard_sub_basic(current_user_info.smb_name, n2,sizeof(n2));
2332 DEBUGADD(6, ("file %s -> %s last mod_time: %s\n",
2333 f->name, n2, ctime(&f->modtime)));
2335 mod_time = file_modtime(n2);
2337 if (mod_time && ((f->modtime != mod_time) || (f->subfname == NULL) || (strcmp(n2, f->subfname) != 0))) {
2339 ("file %s modified: %s\n", n2,
2341 f->modtime = mod_time;
2342 SAFE_FREE(f->subfname);
2343 f->subfname = strdup(n2);
2351 /***************************************************************************
2352 Run standard_sub_basic on netbios name... needed because global_myname
2353 is not accessed through any lp_ macro.
2354 Note: We must *NOT* use string_set() here as ptr points to global_myname.
2355 ***************************************************************************/
2357 static BOOL handle_netbios_name(char *pszParmValue, char **ptr)
2359 pstring netbios_name;
2361 pstrcpy(netbios_name, pszParmValue);
2363 standard_sub_basic(current_user_info.smb_name, netbios_name,sizeof(netbios_name));
2364 strupper(netbios_name);
2366 pstrcpy(global_myname, netbios_name);
2369 ("handle_netbios_name: set global_myname to: %s\n",
2375 /***************************************************************************
2376 Do the work of sourcing in environment variable/value pairs.
2377 ***************************************************************************/
2379 static BOOL source_env(char **lines)
2386 for (i = 0; lines[i]; i++)
2388 char *line = lines[i];
2390 if ((len = strlen(line)) == 0)
2393 if (line[len - 1] == '\n')
2396 if ((varval = malloc(len + 1)) == NULL)
2398 DEBUG(0, ("source_env: Not enough memory!\n"));
2402 DEBUG(4, ("source_env: Adding to environment: %s\n", line));
2403 strncpy(varval, line, len);
2406 p = strchr_m(line, (int)'=');
2409 DEBUG(4, ("source_env: missing '=': %s\n", line));
2416 ("source_env: Failed to put environment variable %s\n",
2424 ("source_env: getting var %s = %s\n", line,
2428 DEBUG(4, ("source_env: returning successfully\n"));
2432 /***************************************************************************
2433 Handle the source environment operation
2434 ***************************************************************************/
2436 static BOOL handle_source_env(char *pszParmValue, char **ptr)
2443 pstrcpy(fname, pszParmValue);
2445 standard_sub_basic(current_user_info.smb_name, fname,sizeof(fname));
2447 string_set(ptr, pszParmValue);
2449 DEBUG(4, ("handle_source_env: checking env type\n"));
2452 * Filename starting with '|' means popen and read from stdin.
2457 lines = file_lines_pload(p + 1, NULL);
2461 lines = file_lines_load(fname, NULL);
2467 ("handle_source_env: Failed to open file %s, Error was %s\n",
2468 fname, strerror(errno)));
2472 result = source_env(lines);
2473 file_lines_free(lines);
2478 /***************************************************************************
2479 handle the interpretation of the vfs object parameter
2480 *************************************************************************/
2481 static BOOL handle_vfs_object(char *pszParmValue, char **ptr)
2483 /* Set string value */
2485 string_set(ptr, pszParmValue);
2487 /* Do any other initialisation required for vfs. Note that
2488 anything done here may have linking repercussions in nmbd. */
2494 /***************************************************************************
2495 handle the include operation
2496 ***************************************************************************/
2498 static BOOL handle_include(char *pszParmValue, char **ptr)
2501 pstrcpy(fname, pszParmValue);
2503 standard_sub_basic(current_user_info.smb_name, fname,sizeof(fname));
2505 add_to_file_list(pszParmValue, fname);
2507 string_set(ptr, fname);
2509 if (file_exist(fname, NULL))
2510 return (pm_process(fname, do_section, do_parameter));
2512 DEBUG(2, ("Can't find include file %s\n", fname));
2518 /***************************************************************************
2519 handle the interpretation of the copy parameter
2520 ***************************************************************************/
2521 static BOOL handle_copy(char *pszParmValue, char **ptr)
2525 service serviceTemp;
2527 string_set(ptr, pszParmValue);
2529 init_service(&serviceTemp);
2533 DEBUG(3, ("Copying service from service %s\n", pszParmValue));
2535 if ((iTemp = getservicebyname(pszParmValue, &serviceTemp)) >= 0)
2537 if (iTemp == iServiceIndex)
2540 ("Can't copy service %s - unable to copy self!\n",
2545 copy_service(ServicePtrs[iServiceIndex],
2547 ServicePtrs[iServiceIndex]->copymap);
2553 DEBUG(0, ("Unable to copy service - source not found: %s\n",
2558 free_service(&serviceTemp);
2562 /***************************************************************************
2563 Handle winbind/non unix account uid and gid allocation parameters. The format of these
2568 winbind uid = 1000-1999
2569 winbind gid = 700-899
2571 We only do simple parsing checks here. The strings are parsed into useful
2572 structures in the winbind daemon code.
2574 ***************************************************************************/
2576 /* Some lp_ routines to return winbind [ug]id information */
2578 static uid_t winbind_uid_low, winbind_uid_high;
2579 static gid_t winbind_gid_low, winbind_gid_high;
2580 static uint32 non_unix_account_low, non_unix_account_high;
2582 BOOL lp_winbind_uid(uid_t *low, uid_t *high)
2584 if (winbind_uid_low == 0 || winbind_uid_high == 0)
2588 *low = winbind_uid_low;
2591 *high = winbind_uid_high;
2596 BOOL lp_winbind_gid(gid_t *low, gid_t *high)
2598 if (winbind_gid_low == 0 || winbind_gid_high == 0)
2602 *low = winbind_gid_low;
2605 *high = winbind_gid_high;
2610 BOOL lp_non_unix_account_range(uint32 *low, uint32 *high)
2612 if (non_unix_account_low == 0 || non_unix_account_high == 0)
2616 *low = non_unix_account_low;
2619 *high = non_unix_account_high;
2624 /* Do some simple checks on "winbind [ug]id" parameter values */
2626 static BOOL handle_winbind_uid(char *pszParmValue, char **ptr)
2630 if (sscanf(pszParmValue, "%u-%u", &low, &high) != 2 || high < low)
2635 string_set(ptr, pszParmValue);
2637 winbind_uid_low = low;
2638 winbind_uid_high = high;
2643 static BOOL handle_winbind_gid(char *pszParmValue, char **ptr)
2647 if (sscanf(pszParmValue, "%u-%u", &low, &high) != 2 || high < low)
2652 string_set(ptr, pszParmValue);
2654 winbind_gid_low = low;
2655 winbind_gid_high = high;
2660 /* Do some simple checks on "non unix account range" parameter values */
2662 static BOOL handle_non_unix_account_range(char *pszParmValue, char **ptr)
2666 if (sscanf(pszParmValue, "%u-%u", &low, &high) != 2 || high < low)
2671 string_set(ptr, pszParmValue);
2673 non_unix_account_low = low;
2674 non_unix_account_high = high;
2679 /***************************************************************************
2680 Handle the DEBUG level list
2681 ***************************************************************************/
2682 static BOOL handle_debug_list( char *pszParmValueIn, char **ptr )
2684 pstring pszParmValue;
2686 pstrcpy(pszParmValue, pszParmValueIn);
2687 string_set(ptr, pszParmValueIn);
2688 return debug_parse_levels( pszParmValue );
2691 /***************************************************************************
2692 Handle the ldap machine suffix option
2693 ***************************************************************************/
2694 static BOOL handle_ldap_machine_suffix( char *pszParmValue, char **ptr)
2698 pstrcpy(suffix, pszParmValue);
2700 if (! *Globals.szLdapSuffix ) {
2701 string_set( ptr, suffix );
2705 if (! strstr(suffix, Globals.szLdapSuffix) ) {
2706 if ( *pszParmValue )
2707 pstrcat(suffix, ",");
2708 pstrcat(suffix, Globals.szLdapSuffix);
2710 string_set( ptr, suffix );
2714 /***************************************************************************
2715 Handle the ldap user suffix option
2716 ***************************************************************************/
2717 static BOOL handle_ldap_user_suffix( char *pszParmValue, char **ptr)
2721 pstrcpy(suffix, pszParmValue);
2723 if (! *Globals.szLdapSuffix ) {
2724 string_set( ptr, suffix );
2728 if (! strstr(suffix, Globals.szLdapSuffix) ) {
2729 if ( *pszParmValue )
2730 pstrcat(suffix, ",");
2731 pstrcat(suffix, Globals.szLdapSuffix);
2733 string_set( ptr, suffix );
2737 /***************************************************************************
2738 Handle setting ldap suffix and determines whether ldap machine suffix needs
2740 ***************************************************************************/
2741 static BOOL handle_ldap_suffix( char *pszParmValue, char **ptr)
2744 pstring user_suffix;
2745 pstring machine_suffix;
2747 pstrcpy(suffix, pszParmValue);
2749 if (! *Globals.szLdapMachineSuffix )
2750 string_set(&Globals.szLdapMachineSuffix, suffix);
2751 if (! *Globals.szLdapUserSuffix )
2752 string_set(&Globals.szLdapUserSuffix, suffix);
2754 if (! strstr(Globals.szLdapMachineSuffix, suffix)) {
2755 pstrcpy(machine_suffix, Globals.szLdapMachineSuffix);
2756 if ( *Globals.szLdapMachineSuffix )
2757 pstrcat(machine_suffix, ",");
2758 pstrcat(machine_suffix, suffix);
2759 string_set(&Globals.szLdapMachineSuffix, machine_suffix);
2762 if (! strstr(Globals.szLdapUserSuffix, suffix)) {
2763 pstrcpy(user_suffix, Globals.szLdapUserSuffix);
2764 if ( *Globals.szLdapUserSuffix )
2765 pstrcat(user_suffix, ",");
2766 pstrcat(user_suffix, suffix);
2767 string_set(&Globals.szLdapUserSuffix, user_suffix);
2770 string_set(ptr, suffix);
2774 /***************************************************************************
2775 initialise a copymap
2776 ***************************************************************************/
2777 static void init_copymap(service * pservice)
2780 SAFE_FREE(pservice->copymap);
2781 pservice->copymap = (BOOL *)malloc(sizeof(BOOL) * NUMPARAMETERS);
2782 if (!pservice->copymap)
2784 ("Couldn't allocate copymap!! (size %d)\n",
2785 (int)NUMPARAMETERS));
2787 for (i = 0; i < NUMPARAMETERS; i++)
2788 pservice->copymap[i] = True;
2792 /***************************************************************************
2793 return the local pointer to a parameter given the service number and the
2794 pointer into the default structure
2795 ***************************************************************************/
2796 void *lp_local_ptr(int snum, void *ptr)
2798 return (void *)(((char *)ServicePtrs[snum]) + PTR_DIFF(ptr, &sDefault));
2801 /***************************************************************************
2802 Process a parameter for a particular service number. If snum < 0
2803 then assume we are in the globals
2804 ***************************************************************************/
2805 BOOL lp_do_parameter(int snum, char *pszParmName, char *pszParmValue)
2807 int parmnum, i, slen;
2808 void *parm_ptr = NULL; /* where we are going to store the result */
2809 void *def_ptr = NULL;
2812 param_opt_struct *paramo;
2814 parmnum = map_parameter(pszParmName);
2818 if ((sep=strchr(pszParmName, ':')) != NULL) {
2820 ZERO_STRUCT(vfskey);
2821 pstr_sprintf(vfskey, "%s:%s:",
2822 (snum >= 0) ? lp_servicename(snum) : "global", pszParmName);
2823 slen = strlen(vfskey);
2824 safe_strcat(vfskey, sep+1, sizeof(pstring));
2825 trim_string(vfskey+slen, " ", " ");
2826 paramo = smb_xmalloc(sizeof(param_opt_struct));
2827 paramo->key = strdup(vfskey);
2828 paramo->value = strdup(pszParmValue);
2829 DLIST_ADD(param_opt, paramo);
2834 ("Ignoring unknown parameter \"%s\"\n", pszParmName));
2838 if (parm_table[parmnum].flags & FLAG_DEPRECATED)
2840 DEBUG(1, ("WARNING: The \"%s\" option is deprecated\n",
2844 def_ptr = parm_table[parmnum].ptr;
2846 /* we might point at a service, the default service or a global */
2853 if (parm_table[parmnum].class == P_GLOBAL)
2856 ("Global parameter %s found in service section!\n",
2861 ((char *)ServicePtrs[snum]) + PTR_DIFF(def_ptr,
2867 if (!ServicePtrs[snum]->copymap)
2868 init_copymap(ServicePtrs[snum]);
2870 /* this handles the aliases - set the copymap for other entries with
2871 the same data pointer */
2872 for (i = 0; parm_table[i].label; i++)
2873 if (parm_table[i].ptr == parm_table[parmnum].ptr)
2874 ServicePtrs[snum]->copymap[i] = False;
2877 /* if it is a special case then go ahead */
2878 if (parm_table[parmnum].special)
2880 parm_table[parmnum].special(pszParmValue, (char **)parm_ptr);
2884 /* now switch on the type of variable it is */
2885 switch (parm_table[parmnum].type)
2888 set_boolean(parm_ptr, pszParmValue);
2892 set_boolean(parm_ptr, pszParmValue);
2893 *(BOOL *)parm_ptr = !*(BOOL *)parm_ptr;
2897 *(int *)parm_ptr = atoi(pszParmValue);
2901 *(char *)parm_ptr = *pszParmValue;
2905 sscanf(pszParmValue, "%o", (int *)parm_ptr);
2909 *(char ***)parm_ptr = str_list_make(pszParmValue, NULL);
2913 string_set(parm_ptr, pszParmValue);
2917 string_set(parm_ptr, pszParmValue);
2918 strupper(*(char **)parm_ptr);
2922 pstrcpy((char *)parm_ptr, pszParmValue);
2926 pstrcpy((char *)parm_ptr, pszParmValue);
2927 strupper((char *)parm_ptr);
2931 for (i = 0; parm_table[parmnum].enum_list[i].name;
2936 parm_table[parmnum].enum_list[i].name))
2939 parm_table[parmnum].
2952 /***************************************************************************
2953 Process a parameter.
2954 ***************************************************************************/
2955 static BOOL do_parameter(char *pszParmName, char *pszParmValue)
2957 if (!bInGlobalSection && bGlobalOnly)
2960 DEBUGADD(4, ("doing parameter %s = %s\n", pszParmName, pszParmValue));
2962 return (lp_do_parameter(bInGlobalSection ? -2 : iServiceIndex,
2963 pszParmName, pszParmValue));
2967 /***************************************************************************
2968 print a parameter of the specified type
2969 ***************************************************************************/
2970 static void print_parameter(struct parm_struct *p, void *ptr, FILE * f)
2976 for (i = 0; p->enum_list[i].name; i++)
2978 if (*(int *)ptr == p->enum_list[i].value)
2981 p->enum_list[i].name);
2988 fprintf(f, "%s", BOOLSTR(*(BOOL *)ptr));
2992 fprintf(f, "%s", BOOLSTR(!*(BOOL *)ptr));
2996 fprintf(f, "%d", *(int *)ptr);
3000 fprintf(f, "%c", *(char *)ptr);
3004 fprintf(f, "%s", octal_string(*(int *)ptr));
3008 if ((char ***)ptr && *(char ***)ptr) {
3009 char **list = *(char ***)ptr;
3011 for (; *list; list++)
3012 fprintf(f, "%s%s", *list,
3013 ((*(list+1))?", ":""));
3020 fprintf(f, "%s", (char *)ptr);
3026 if (*(char **)ptr) {
3027 fprintf(f, "%s", *(char **)ptr);
3036 /***************************************************************************
3037 check if two parameters are equal
3038 ***************************************************************************/
3039 static BOOL equal_parameter(parm_type type, void *ptr1, void *ptr2)
3045 return (*((BOOL *)ptr1) == *((BOOL *)ptr2));
3050 return (*((int *)ptr1) == *((int *)ptr2));
3053 return (*((char *)ptr1) == *((char *)ptr2));
3056 return str_list_compare(*(char ***)ptr1, *(char ***)ptr2);
3061 char *p1 = (char *)ptr1, *p2 = (char *)ptr2;
3066 return (p1 == p2 || strequal(p1, p2));
3071 char *p1 = *(char **)ptr1, *p2 = *(char **)ptr2;
3076 return (p1 == p2 || strequal(p1, p2));
3084 /***************************************************************************
3085 Initialize any local varients in the sDefault table.
3086 ***************************************************************************/
3088 void init_locals(void)
3093 /***************************************************************************
3094 Process a new section (service). At this stage all sections are services.
3095 Later we'll have special sections that permit server parameters to be set.
3096 Returns True on success, False on failure.
3097 ***************************************************************************/
3098 static BOOL do_section(char *pszSectionName)
3101 BOOL isglobal = ((strwicmp(pszSectionName, GLOBAL_NAME) == 0) ||
3102 (strwicmp(pszSectionName, GLOBAL_NAME2) == 0));
3105 /* if we were in a global section then do the local inits */
3106 if (bInGlobalSection && !isglobal)
3109 /* if we've just struck a global section, note the fact. */
3110 bInGlobalSection = isglobal;
3112 /* check for multiple global sections */
3113 if (bInGlobalSection)
3115 DEBUG(3, ("Processing section \"[%s]\"\n", pszSectionName));
3119 if (!bInGlobalSection && bGlobalOnly)
3122 /* if we have a current service, tidy it up before moving on */
3125 if (iServiceIndex >= 0)
3126 bRetval = service_ok(iServiceIndex);
3128 /* if all is still well, move to the next record in the services array */
3131 /* We put this here to avoid an odd message order if messages are */
3132 /* issued by the post-processing of a previous section. */
3133 DEBUG(2, ("Processing section \"[%s]\"\n", pszSectionName));
3135 if ((iServiceIndex = add_a_service(&sDefault, pszSectionName))
3138 DEBUG(0, ("Failed to add a new service\n"));
3147 /***************************************************************************
3148 determine if a partcular base parameter is currentl set to the default value.
3149 ***************************************************************************/
3150 static BOOL is_default(int i)
3152 if (!defaults_saved)
3154 switch (parm_table[i].type)
3157 return str_list_compare (parm_table[i].def.lvalue,
3158 *(char ***)parm_table[i].ptr);
3161 return strequal(parm_table[i].def.svalue,
3162 *(char **)parm_table[i].ptr);
3165 return strequal(parm_table[i].def.svalue,
3166 (char *)parm_table[i].ptr);
3169 return parm_table[i].def.bvalue ==
3170 *(BOOL *)parm_table[i].ptr;
3172 return parm_table[i].def.cvalue ==
3173 *(char *)parm_table[i].ptr;
3177 return parm_table[i].def.ivalue ==
3178 *(int *)parm_table[i].ptr;
3186 /***************************************************************************
3187 Display the contents of the global structure.
3188 ***************************************************************************/
3189 static void dump_globals(FILE *f)
3192 param_opt_struct *data;
3195 fprintf(f, "# Global parameters\n[global]\n");
3197 for (i = 0; parm_table[i].label; i++)
3198 if (parm_table[i].class == P_GLOBAL &&
3199 parm_table[i].ptr &&
3200 (i == 0 || (parm_table[i].ptr != parm_table[i - 1].ptr)))
3202 if (defaults_saved && is_default(i))
3204 fprintf(f, "\t%s = ", parm_table[i].label);
3205 print_parameter(&parm_table[i], parm_table[i].ptr, f);
3208 if (param_opt != NULL) {
3211 if (((s=strstr(data->key, "global")) == data->key) &&
3212 (*(s+strlen("global")) == ':')) {
3213 fprintf(f, "\t%s = %s\n", s+strlen("global")+1, data->value);
3221 /***************************************************************************
3222 return True if a local parameter is currently set to the global default
3223 ***************************************************************************/
3224 BOOL lp_is_default(int snum, struct parm_struct *parm)
3226 int pdiff = PTR_DIFF(parm->ptr, &sDefault);
3228 return equal_parameter(parm->type,
3229 ((char *)ServicePtrs[snum]) + pdiff,
3230 ((char *)&sDefault) + pdiff);
3233 /***************************************************************************
3234 Display the contents of a single services record.
3235 ***************************************************************************/
3236 static void dump_a_service(service * pService, FILE * f)
3239 param_opt_struct *data;
3242 if (pService != &sDefault)
3243 fprintf(f, "\n[%s]\n", pService->szService);
3245 for (i = 0; parm_table[i].label; i++)
3246 if (parm_table[i].class == P_LOCAL &&
3247 parm_table[i].ptr &&
3248 (*parm_table[i].label != '-') &&
3249 (i == 0 || (parm_table[i].ptr != parm_table[i - 1].ptr)))
3251 int pdiff = PTR_DIFF(parm_table[i].ptr, &sDefault);
3253 if (pService == &sDefault)
3255 if (defaults_saved && is_default(i))
3260 if (equal_parameter(parm_table[i].type,
3261 ((char *)pService) +
3263 ((char *)&sDefault) +
3268 fprintf(f, "\t%s = ", parm_table[i].label);
3269 print_parameter(&parm_table[i],
3270 ((char *)pService) + pdiff, f);
3273 if (param_opt != NULL) {
3275 sn = (pService == &sDefault) ? "global" : pService->szService;
3277 if (((s=strstr(data->key, sn)) == data->key) &&
3278 (*(s+strlen(sn)) == ':')) {
3279 fprintf(f, "\t%s = %s\n", s+strlen(sn)+1, data->value);
3287 /***************************************************************************
3288 return info about the next service in a service. snum==-1 gives the globals
3290 return NULL when out of parameters
3291 ***************************************************************************/
3292 struct parm_struct *lp_next_parameter(int snum, int *i, int allparameters)
3296 /* do the globals */
3297 for (; parm_table[*i].label; (*i)++)
3299 if (parm_table[*i].class == P_SEPARATOR)
3300 return &parm_table[(*i)++];
3302 if (!parm_table[*i].ptr
3303 || (*parm_table[*i].label == '-'))
3307 && (parm_table[*i].ptr ==
3308 parm_table[(*i) - 1].ptr))
3311 return &parm_table[(*i)++];
3316 service *pService = ServicePtrs[snum];
3318 for (; parm_table[*i].label; (*i)++)
3320 if (parm_table[*i].class == P_SEPARATOR)
3321 return &parm_table[(*i)++];
3323 if (parm_table[*i].class == P_LOCAL &&
3324 parm_table[*i].ptr &&
3325 (*parm_table[*i].label != '-') &&
3327 (parm_table[*i].ptr !=
3328 parm_table[(*i) - 1].ptr)))
3331 PTR_DIFF(parm_table[*i].ptr,
3334 if (allparameters ||
3335 !equal_parameter(parm_table[*i].type,
3336 ((char *)pService) +
3338 ((char *)&sDefault) +
3341 return &parm_table[(*i)++];
3352 /***************************************************************************
3353 Display the contents of a single copy structure.
3354 ***************************************************************************/
3355 static void dump_copy_map(BOOL *pcopymap)
3361 printf("\n\tNon-Copied parameters:\n");
3363 for (i = 0; parm_table[i].label; i++)
3364 if (parm_table[i].class == P_LOCAL &&
3365 parm_table[i].ptr && !pcopymap[i] &&
3366 (i == 0 || (parm_table[i].ptr != parm_table[i - 1].ptr)))
3368 printf("\t\t%s\n", parm_table[i].label);
3373 /***************************************************************************
3374 Return TRUE if the passed service number is within range.
3375 ***************************************************************************/
3377 BOOL lp_snum_ok(int iService)
3379 return (LP_SNUM_OK(iService) && ServicePtrs[iService]->bAvailable);
3382 /***************************************************************************
3383 Auto-load some home services.
3384 ***************************************************************************/
3386 static void lp_add_auto_services(char *str)
3399 homes = lp_servicenumber(HOMES_NAME);
3401 for (p = strtok(s, LIST_SEP); p; p = strtok(NULL, LIST_SEP)) {
3402 char *home = get_user_home_dir(p);
3404 if (lp_servicenumber(p) >= 0)
3407 if (home && homes >= 0)
3408 lp_add_home(p, homes, p, home);
3413 /***************************************************************************
3414 Auto-load one printer.
3415 ***************************************************************************/
3417 void lp_add_one_printer(char *name, char *comment)
3419 int printers = lp_servicenumber(PRINTERS_NAME);
3422 if (lp_servicenumber(name) < 0) {
3423 lp_add_printer(name, printers);
3424 if ((i = lp_servicenumber(name)) >= 0) {
3425 string_set(&ServicePtrs[i]->comment, comment);
3426 ServicePtrs[i]->autoloaded = True;
3431 /* Announce ourselves as a print server */
3433 void update_server_announce_as_printserver(void)
3435 default_server_announce |= SV_TYPE_PRINTQ_SERVER;
3438 /***************************************************************************
3439 Have we loaded a services file yet?
3440 ***************************************************************************/
3442 BOOL lp_loaded(void)
3447 /***************************************************************************
3448 Unload unused services.
3449 ***************************************************************************/
3451 void lp_killunused(BOOL (*snumused) (int))
3454 for (i = 0; i < iNumServices; i++) {
3458 if (!snumused || !snumused(i)) {
3459 ServicePtrs[i]->valid = False;
3460 free_service(ServicePtrs[i]);
3465 /***************************************************************************
3467 ***************************************************************************/
3469 void lp_killservice(int iServiceIn)
3471 if (VALID(iServiceIn)) {
3472 ServicePtrs[iServiceIn]->valid = False;
3473 free_service(ServicePtrs[iServiceIn]);
3477 /***************************************************************************
3478 Save the curent values of all global and sDefault parameters into the
3479 defaults union. This allows swat and testparm to show only the
3480 changed (ie. non-default) parameters.
3481 ***************************************************************************/
3483 static void lp_save_defaults(void)
3486 for (i = 0; parm_table[i].label; i++) {
3487 if (i > 0 && parm_table[i].ptr == parm_table[i - 1].ptr)
3489 switch (parm_table[i].type) {
3491 str_list_copy(&(parm_table[i].def.lvalue),
3492 *(char ***)parm_table[i].ptr);
3496 if (parm_table[i].ptr) {
3497 parm_table[i].def.svalue = strdup(*(char **)parm_table[i].ptr);
3499 parm_table[i].def.svalue = NULL;
3504 if (parm_table[i].ptr) {
3505 parm_table[i].def.svalue = strdup((char *)parm_table[i].ptr);
3507 parm_table[i].def.svalue = NULL;
3512 parm_table[i].def.bvalue =
3513 *(BOOL *)parm_table[i].ptr;
3516 parm_table[i].def.cvalue =
3517 *(char *)parm_table[i].ptr;
3522 parm_table[i].def.ivalue =
3523 *(int *)parm_table[i].ptr;
3529 defaults_saved = True;
3532 /*******************************************************************
3533 Set the server type we will announce as via nmbd.
3534 ********************************************************************/
3536 static void set_server_role(void)
3538 server_role = ROLE_STANDALONE;
3540 switch (lp_security()) {
3542 if (lp_domain_logons())
3543 DEBUG(0, ("Server's Role (logon server) conflicts with share-level security\n"));
3548 if (lp_domain_logons()) {
3549 server_role = ROLE_DOMAIN_PDC;
3552 server_role = ROLE_DOMAIN_MEMBER;
3555 if (lp_domain_logons()) {
3557 if (Globals.bDomainMaster) /* auto or yes */
3558 server_role = ROLE_DOMAIN_PDC;
3560 server_role = ROLE_DOMAIN_BDC;
3564 DEBUG(0, ("Server's Role undefined due to unknown security mode\n"));
3568 DEBUG(10, ("set_server_role: role = "));
3570 switch(server_role) {
3571 case ROLE_STANDALONE:
3572 DEBUGADD(10, ("ROLE_STANDALONE\n"));
3574 case ROLE_DOMAIN_MEMBER:
3575 DEBUGADD(10, ("ROLE_DOMAIN_MEMBER\n"));
3577 case ROLE_DOMAIN_BDC:
3578 DEBUGADD(10, ("ROLE_DOMAIN_BDC\n"));
3580 case ROLE_DOMAIN_PDC:
3581 DEBUGADD(10, ("ROLE_DOMAIN_PDC\n"));
3588 /***************************************************************************
3589 Load the services array from the services file. Return True on success,
3591 ***************************************************************************/
3592 BOOL lp_load(const char *pszFname, BOOL global_only, BOOL save_defaults,
3597 param_opt_struct *data, *pdata;
3599 pstrcpy(n2, pszFname);
3600 standard_sub_basic(current_user_info.smb_name, n2,sizeof(n2));
3602 add_to_file_list(pszFname, n2);
3606 DEBUG(3, ("lp_load: refreshing parameters\n"));
3608 bInGlobalSection = True;
3609 bGlobalOnly = global_only;
3620 if (param_opt != NULL) {
3623 SAFE_FREE(data->key);
3624 SAFE_FREE(data->value);
3632 /* We get sections first, so have to start 'behind' to make up */
3634 bRetval = pm_process(n2, do_section, do_parameter);
3636 /* finish up the last section */
3637 DEBUG(4, ("pm_process() returned %s\n", BOOLSTR(bRetval)));
3639 if (iServiceIndex >= 0)
3640 bRetval = service_ok(iServiceIndex);
3642 lp_add_auto_services(lp_auto_services());
3645 lp_add_ipc("IPC$", True);
3646 lp_add_ipc("ADMIN$", False);
3650 set_default_server_announce_type();
3654 /* Now we check bWINSsupport and set szWINSserver to 127.0.0.1 */
3655 /* if bWINSsupport is true and we are in the client */
3656 if (in_client && Globals.bWINSsupport) {
3657 lp_do_parameter(-1, "wins server", "127.0.0.1");
3665 /***************************************************************************
3666 reset the max number of services
3667 ***************************************************************************/
3668 void lp_resetnumservices(void)
3673 /***************************************************************************
3674 return the max number of services
3675 ***************************************************************************/
3676 int lp_numservices(void)
3678 return (iNumServices);
3681 /***************************************************************************
3682 Display the contents of the services array in human-readable form.
3683 ***************************************************************************/
3684 void lp_dump(FILE *f, BOOL show_defaults, int maxtoprint)
3690 defaults_saved = False;
3695 dump_a_service(&sDefault, f);
3697 for (iService = 0; iService < maxtoprint; iService++)
3698 lp_dump_one(f, show_defaults, iService);
3701 /***************************************************************************
3702 Display the contents of one service in human-readable form.
3703 ***************************************************************************/
3704 void lp_dump_one(FILE * f, BOOL show_defaults, int snum)
3708 if (ServicePtrs[snum]->szService[0] == '\0')
3710 dump_a_service(ServicePtrs[snum], f);
3715 /***************************************************************************
3716 Return the number of the service with the given name, or -1 if it doesn't
3717 exist. Note that this is a DIFFERENT ANIMAL from the internal function
3718 getservicebyname()! This works ONLY if all services have been loaded, and
3719 does not copy the found service.
3720 ***************************************************************************/
3721 int lp_servicenumber(const char *pszServiceName)
3724 fstring serviceName;
3727 for (iService = iNumServices - 1; iService >= 0; iService--)
3729 if (VALID(iService) && ServicePtrs[iService]->szService)
3732 * The substitution here is used to support %U is
3735 fstrcpy(serviceName, ServicePtrs[iService]->szService);
3736 standard_sub_basic(current_user_info.smb_name, serviceName,sizeof(serviceName));
3737 if (strequal(serviceName, pszServiceName))
3743 DEBUG(7,("lp_servicenumber: couldn't find %s\n", pszServiceName));
3748 /*******************************************************************
3749 A useful volume label function.
3750 ********************************************************************/
3752 char *volume_label(int snum)
3754 char *ret = lp_volume(snum);
3756 return lp_servicename(snum);
3761 /*******************************************************************
3762 Set the server type we will announce as via nmbd.
3763 ********************************************************************/
3764 static void set_default_server_announce_type(void)
3766 default_server_announce = 0;
3767 default_server_announce |= SV_TYPE_WORKSTATION;
3768 default_server_announce |= SV_TYPE_SERVER;
3769 default_server_announce |= SV_TYPE_SERVER_UNIX;
3771 switch (lp_announce_as())
3773 case ANNOUNCE_AS_NT_SERVER:
3775 default_server_announce |= SV_TYPE_SERVER_NT;
3776 /* fall through... */
3778 case ANNOUNCE_AS_NT_WORKSTATION:
3780 default_server_announce |= SV_TYPE_NT;
3783 case ANNOUNCE_AS_WIN95:
3785 default_server_announce |= SV_TYPE_WIN95_PLUS;
3788 case ANNOUNCE_AS_WFW:
3790 default_server_announce |= SV_TYPE_WFW;
3799 switch (lp_server_role())
3801 case ROLE_DOMAIN_MEMBER:
3803 default_server_announce |= SV_TYPE_DOMAIN_MEMBER;
3806 case ROLE_DOMAIN_PDC:
3808 default_server_announce |= SV_TYPE_DOMAIN_CTRL;
3811 case ROLE_DOMAIN_BDC:
3813 default_server_announce |= SV_TYPE_DOMAIN_BAKCTRL;
3816 case ROLE_STANDALONE:
3823 if (lp_time_server())
3825 default_server_announce |= SV_TYPE_TIME_SOURCE;
3828 if (lp_host_msdfs())
3830 default_server_announce |= SV_TYPE_DFS_SERVER;
3834 /***********************************************************
3835 returns role of Samba server
3836 ************************************************************/
3838 int lp_server_role(void)
3843 /***********************************************************
3844 If we are PDC then prefer us as DMB
3845 ************************************************************/
3847 BOOL lp_domain_master(void)
3849 if (Globals.bDomainMaster == Auto)
3851 return (lp_server_role() == ROLE_DOMAIN_PDC);
3854 return Globals.bDomainMaster;
3857 /***********************************************************
3858 If we are DMB then prefer us as LMB
3859 ************************************************************/
3861 BOOL lp_preferred_master(void)
3863 if (Globals.bPreferredMaster == Auto)
3865 return (lp_local_master() && lp_domain_master());
3868 return Globals.bPreferredMaster;
3873 /*******************************************************************
3875 ********************************************************************/
3876 void lp_remove_service(int snum)
3878 ServicePtrs[snum]->valid = False;
3881 /*******************************************************************
3883 ********************************************************************/
3884 void lp_copy_service(int snum, char *new_name)
3886 char *oldname = lp_servicename(snum);
3887 do_section(new_name);
3890 snum = lp_servicenumber(new_name);
3892 lp_do_parameter(snum, "copy", oldname);
3897 /*******************************************************************
3898 Get the default server type we will announce as via nmbd.
3899 ********************************************************************/
3900 int lp_default_server_announce(void)
3902 return default_server_announce;
3905 /*******************************************************************
3906 Split the announce version into major and minor numbers.
3907 ********************************************************************/
3908 int lp_major_announce_version(void)
3910 static BOOL got_major = False;
3911 static int major_version = DEFAULT_MAJOR_VERSION;
3916 return major_version;
3919 if ((vers = lp_announce_version()) == NULL)
3920 return major_version;
3922 if ((p = strchr_m(vers, '.')) == 0)
3923 return major_version;
3926 major_version = atoi(vers);
3927 return major_version;
3930 int lp_minor_announce_version(void)
3932 static BOOL got_minor = False;
3933 static int minor_version = DEFAULT_MINOR_VERSION;
3938 return minor_version;
3941 if ((vers = lp_announce_version()) == NULL)
3942 return minor_version;
3944 if ((p = strchr_m(vers, '.')) == 0)
3945 return minor_version;
3948 minor_version = atoi(p);
3949 return minor_version;
3952 /***********************************************************
3953 Set the global name resolution order (used in smbclient).
3954 ************************************************************/
3956 void lp_set_name_resolve_order(char *new_order)
3958 Globals.szNameResolveOrder = new_order;
3961 const char *lp_printername(int snum)
3963 const char *ret = _lp_printername(snum);
3964 if (ret == NULL || (ret != NULL && *ret == '\0'))
3965 ret = lp_const_servicename(snum);
3971 /****************************************************************
3972 Compatibility fn. for 2.2.2 code.....
3973 *****************************************************************/
3975 void get_private_directory(pstring privdir)
3977 pstrcpy (privdir, lp_private_dir());
3981 /****************************************************************
3982 Is netbios alias or name
3983 *****************************************************************/
3985 BOOL is_netbios_alias_or_name(const char *name)
3987 char **netbios_aliases = lp_netbios_aliases();
3989 if (StrCaseCmp(name, global_myname) == 0) {
3993 for (netbios_aliases = lp_netbios_aliases();
3994 netbios_aliases && *netbios_aliases;
3995 netbios_aliases++) {
3996 if (StrCaseCmp(name, *netbios_aliases) == 0) {
4004 /***********************************************************
4005 Allow daemons such as winbindd to fix their logfile name.
4006 ************************************************************/
4008 void lp_set_logfile(const char *name)
4010 extern pstring debugf;
4011 string_set(&Globals.szLogFile, name);
4012 pstrcpy(debugf, name);
4015 /*******************************************************************
4016 Return the NetBIOS called name.
4017 ********************************************************************/
4019 const char *get_called_name(void)
4021 extern fstring local_machine;
4022 static fstring called_name;
4024 if (! *local_machine)
4025 return global_myname;
4028 * Windows NT/2k uses "*SMBSERVER" and XP uses "*SMBSERV"
4029 * arrggg!!! but we've already rewritten the client's
4030 * netbios name at this point...
4033 if (*local_machine) {
4034 if (!StrCaseCmp(local_machine, "_SMBSERVER") || !StrCaseCmp(local_machine, "_SMBSERV")) {
4035 fstrcpy(called_name, get_my_primary_ip());
4036 DEBUG(8,("get_called_name: assuming that client used IP address [%s] as called name.\n",
4042 return local_machine;
4045 /*******************************************************************
4046 Return the max print jobs per queue.
4047 ********************************************************************/
4049 int lp_maxprintjobs(int snum)
4051 int maxjobs = LP_SNUM_OK(snum) ? ServicePtrs[snum]->iMaxPrintJobs : sDefault.iMaxPrintJobs;
4052 if (maxjobs <= 0 || maxjobs >= PRINT_MAX_JOBID)
4053 maxjobs = PRINT_MAX_JOBID - 1;