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
10 Copyright (C) Stefan (metze) Metzmacher 2002
11 Copyright (C) Jim McDonough <jmcd@us.ibm.com> 2003
12 Copyright (C) Michael Adam 2008
14 This program is free software; you can redistribute it and/or modify
15 it under the terms of the GNU General Public License as published by
16 the Free Software Foundation; either version 3 of the License, or
17 (at your option) any later version.
19 This program is distributed in the hope that it will be useful,
20 but WITHOUT ANY WARRANTY; without even the implied warranty of
21 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 GNU General Public License for more details.
24 You should have received a copy of the GNU General Public License
25 along with this program. If not, see <http://www.gnu.org/licenses/>.
31 * This module provides suitable callback functions for the params
32 * module. It builds the internal table of service details which is
33 * then used by the rest of the server.
37 * 1) add it to the global or service structure definition
38 * 2) add it to the parm_table
39 * 3) add it to the list of available functions (eg: using FN_GLOBAL_STRING())
40 * 4) If it's a global then initialise it in init_globals. If a local
41 * (ie. service) parameter then initialise it in the sDefault structure
45 * The configuration file is processed sequentially for speed. It is NOT
46 * accessed randomly as happens in 'real' Windows. For this reason, there
47 * is a fair bit of sequence-dependent code here - ie., code which assumes
48 * that certain things happen before others. In particular, the code which
49 * happens at the boundary between sections is delicately poised, so be
58 extern enum protocol_types Protocol
;
59 extern userdom_struct current_user_info
;
62 #define GLOBAL_NAME "global"
66 #define PRINTERS_NAME "printers"
70 #define HOMES_NAME "homes"
73 /* the special value for the include parameter
74 * to be interpreted not as a file name but to
75 * trigger loading of the global smb.conf options
77 #ifndef INCLUDE_REGISTRY_NAME
78 #define INCLUDE_REGISTRY_NAME "registry"
81 static bool in_client
= False
; /* Not in the client by default */
82 static struct smbconf_csn conf_last_csn
;
83 static struct smbconf_ctx
*conf_ctx
= NULL
;
85 #define CONFIG_BACKEND_FILE 0
86 #define CONFIG_BACKEND_REGISTRY 1
88 static int config_backend
= CONFIG_BACKEND_FILE
;
90 /* some helpful bits */
91 #define LP_SNUM_OK(i) (((i) >= 0) && ((i) < iNumServices) && (ServicePtrs != NULL) && ServicePtrs[(i)]->valid)
92 #define VALID(i) (ServicePtrs != NULL && ServicePtrs[i]->valid)
94 #define USERSHARE_VALID 1
95 #define USERSHARE_PENDING_DELETE 2
97 extern int extra_time_offset
;
99 static bool defaults_saved
= False
;
101 typedef struct _param_opt_struct param_opt_struct
;
102 struct _param_opt_struct
{
103 param_opt_struct
*prev
, *next
;
110 * This structure describes global (ie., server-wide) parameters.
117 char *display_charset
;
118 char *szPrintcapname
;
119 char *szAddPortCommand
;
120 char *szEnumPortsCommand
;
121 char *szAddPrinterCommand
;
122 char *szDeletePrinterCommand
;
123 char *szOs2DriverMap
;
127 char *szDefaultService
;
131 char *szServerString
;
132 char *szAutoServices
;
133 char *szPasswdProgram
;
137 char *szSMBPasswdFile
;
139 char *szPassdbBackend
;
140 char **szPreloadModules
;
141 char *szPasswordServer
;
142 char *szSocketOptions
;
144 char *szAfsUsernameMap
;
145 int iAfsTokenLifetime
;
146 char *szLogNtTokenCommand
;
152 char **szWINSservers
;
154 char *szRemoteAnnounce
;
155 char *szRemoteBrowseSync
;
156 char *szSocketAddress
;
157 char *szNISHomeMapName
;
158 char *szAnnounceVersion
; /* This is initialised in init_globals */
161 char **szNetbiosAliases
;
162 char *szNetbiosScope
;
163 char *szNameResolveOrder
;
165 char *szAddUserScript
;
166 char *szRenameUserScript
;
167 char *szDelUserScript
;
168 char *szAddGroupScript
;
169 char *szDelGroupScript
;
170 char *szAddUserToGroupScript
;
171 char *szDelUserFromGroupScript
;
172 char *szSetPrimaryGroupScript
;
173 char *szAddMachineScript
;
174 char *szShutdownScript
;
175 char *szAbortShutdownScript
;
176 char *szUsernameMapScript
;
177 char *szCheckPasswordScript
;
184 bool bPassdbExpandExplicit
;
185 int AlgorithmicRidBase
;
186 char *szTemplateHomedir
;
187 char *szTemplateShell
;
188 char *szWinbindSeparator
;
189 bool bWinbindEnumUsers
;
190 bool bWinbindEnumGroups
;
191 bool bWinbindUseDefaultDomain
;
192 bool bWinbindTrustedDomainsOnly
;
193 bool bWinbindNestedGroups
;
194 int winbind_expand_groups
;
195 bool bWinbindRefreshTickets
;
196 bool bWinbindOfflineLogon
;
197 bool bWinbindNormalizeNames
;
198 bool bWinbindRpcOnly
;
199 char **szIdmapDomains
;
200 char **szIdmapBackend
; /* deprecated */
201 char *szIdmapAllocBackend
;
202 char *szAddShareCommand
;
203 char *szChangeShareCommand
;
204 char *szDeleteShareCommand
;
206 char *szGuestaccount
;
207 char *szManglingMethod
;
208 char **szServicesList
;
209 char *szUsersharePath
;
210 char *szUsershareTemplateShare
;
211 char **szUsersharePrefixAllowList
;
212 char **szUsersharePrefixDenyList
;
219 int open_files_db_hash_size
;
228 bool paranoid_server_security
;
231 int iMaxSmbdProcesses
;
232 bool bDisableSpoolss
;
235 bool enhanced_browsing
;
241 int announce_as
; /* This is initialised in init_globals */
242 int machine_password_timeout
;
244 int oplock_break_wait_time
;
245 int winbind_cache_time
;
246 int winbind_max_idle_children
;
247 char **szWinbindNssInfo
;
249 char *szLdapMachineSuffix
;
250 char *szLdapUserSuffix
;
251 char *szLdapIdmapSuffix
;
252 char *szLdapGroupSuffix
;
256 int ldap_debug_level
;
257 int ldap_debug_threshold
;
260 char *szIPrintServer
;
262 char **szClusterAddresses
;
264 int ldap_passwd_sync
;
265 int ldap_replication_sleep
;
266 int ldap_timeout
; /* This is initialised in init_globals */
267 int ldap_connection_timeout
;
270 bool bMsAddPrinterWizard
;
275 int iPreferredMaster
;
278 bool bEncryptPasswords
;
283 bool bObeyPamRestrictions
;
285 int PrintcapCacheTime
;
286 bool bLargeReadwrite
;
293 bool bBindInterfacesOnly
;
294 bool bPamPasswordChange
;
295 bool bUnixPasswdSync
;
296 bool bPasswdChatDebug
;
297 int iPasswdChatTimeout
;
301 bool bNTStatusSupport
;
303 int iMaxStatCacheSize
;
305 bool bAllowTrustedDomains
;
309 bool bClientLanManAuth
;
310 bool bClientNTLMv2Auth
;
311 bool bClientPlaintextAuth
;
312 bool bClientUseSpnego
;
313 bool bDebugPrefixTimestamp
;
314 bool bDebugHiresTimestamp
;
318 bool bEnableCoreFiles
;
321 bool bHostnameLookups
;
322 bool bUnixExtensions
;
323 bool bDisableNetbios
;
324 bool bUseKerberosKeytab
;
325 bool bDeferSharingViolations
;
326 bool bEnablePrivileges
;
328 bool bUsershareOwnerOnly
;
329 bool bUsershareAllowGuests
;
330 bool bRegistryShares
;
331 int restrict_anonymous
;
332 int name_cache_timeout
;
335 int client_ldap_sasl_wrapping
;
336 int iUsershareMaxShares
;
338 int iIdmapNegativeCacheTime
;
342 param_opt_struct
*param_opt
;
345 static struct global Globals
;
348 * This structure describes a single service.
354 time_t usershare_last_mod
;
358 char **szInvalidUsers
;
366 char *szRootPostExec
;
368 char *szPrintcommand
;
371 char *szLppausecommand
;
372 char *szLpresumecommand
;
373 char *szQueuepausecommand
;
374 char *szQueueresumecommand
;
376 char *szPrintjobUsername
;
384 char *szVetoOplockFiles
;
390 char **printer_admin
;
395 char *szAioWriteBehind
;
399 int iMaxReportedPrintJobs
;
402 int iCreate_force_mode
;
404 int iSecurity_force_mode
;
407 int iDir_Security_mask
;
408 int iDir_Security_force_mode
;
412 int iOplockContentionLimit
;
417 bool bRootpreexecClose
;
420 bool bShortCasePreserve
;
422 bool bHideSpecialFiles
;
423 bool bHideUnReadable
;
424 bool bHideUnWriteableFiles
;
430 bool bAdministrative_share
;
436 bool bStoreDosAttributes
;
449 bool bStrictAllocate
;
452 struct bitmap
*copymap
;
453 bool bDeleteReadonly
;
455 bool bDeleteVetoFiles
;
458 bool bDosFiletimeResolution
;
459 bool bFakeDirCreateTimes
;
465 bool bUseClientDriver
;
466 bool bDefaultDevmode
;
467 bool bForcePrintername
;
469 bool bForceUnknownAclUser
;
472 bool bMap_acl_inherit
;
475 bool bAclCheckPermissions
;
476 bool bAclMapFullControl
;
477 bool bAclGroupControl
;
479 bool bKernelChangeNotify
;
480 int iallocation_roundup_size
;
484 int iDirectoryNameCacheSize
;
486 param_opt_struct
*param_opt
;
488 char dummy
[3]; /* for alignment */
492 /* This is a default service used to prime a services structure */
493 static struct service sDefault
= {
495 False
, /* not autoloaded */
496 0, /* not a usershare */
497 (time_t)0, /* No last mod time */
498 NULL
, /* szService */
500 NULL
, /* szUsername */
501 NULL
, /* szInvalidUsers */
502 NULL
, /* szValidUsers */
503 NULL
, /* szAdminUsers */
505 NULL
, /* szInclude */
506 NULL
, /* szPreExec */
507 NULL
, /* szPostExec */
508 NULL
, /* szRootPreExec */
509 NULL
, /* szRootPostExec */
510 NULL
, /* szCupsOptions */
511 NULL
, /* szPrintcommand */
512 NULL
, /* szLpqcommand */
513 NULL
, /* szLprmcommand */
514 NULL
, /* szLppausecommand */
515 NULL
, /* szLpresumecommand */
516 NULL
, /* szQueuepausecommand */
517 NULL
, /* szQueueresumecommand */
518 NULL
, /* szPrintername */
519 NULL
, /* szPrintjobUsername */
520 NULL
, /* szDontdescend */
521 NULL
, /* szHostsallow */
522 NULL
, /* szHostsdeny */
523 NULL
, /* szMagicScript */
524 NULL
, /* szMagicOutput */
525 NULL
, /* szVetoFiles */
526 NULL
, /* szHideFiles */
527 NULL
, /* szVetoOplockFiles */
529 NULL
, /* force user */
530 NULL
, /* force group */
532 NULL
, /* writelist */
533 NULL
, /* printer admin */
536 NULL
, /* vfs objects */
537 NULL
, /* szMSDfsProxy */
538 NULL
, /* szAioWriteBehind */
540 0, /* iMinPrintSpace */
541 1000, /* iMaxPrintJobs */
542 0, /* iMaxReportedPrintJobs */
543 0, /* iWriteCacheSize */
544 0744, /* iCreate_mask */
545 0000, /* iCreate_force_mode */
546 0777, /* iSecurity_mask */
547 0, /* iSecurity_force_mode */
548 0755, /* iDir_mask */
549 0000, /* iDir_force_mode */
550 0777, /* iDir_Security_mask */
551 0, /* iDir_Security_force_mode */
552 0, /* iMaxConnections */
553 CASE_LOWER
, /* iDefaultCase */
554 DEFAULT_PRINTING
, /* iPrinting */
555 2, /* iOplockContentionLimit */
557 1024, /* iBlock_size */
558 0, /* iDfreeCacheTime */
559 False
, /* bPreexecClose */
560 False
, /* bRootpreexecClose */
561 Auto
, /* case sensitive */
562 True
, /* case preserve */
563 True
, /* short case preserve */
564 True
, /* bHideDotFiles */
565 False
, /* bHideSpecialFiles */
566 False
, /* bHideUnReadable */
567 False
, /* bHideUnWriteableFiles */
568 True
, /* bBrowseable */
569 True
, /* bAvailable */
570 True
, /* bRead_only */
571 True
, /* bNo_set_dir */
572 False
, /* bGuest_only */
573 False
, /* bAdministrative_share */
574 False
, /* bGuest_ok */
575 False
, /* bPrint_ok */
576 False
, /* bMap_system */
577 False
, /* bMap_hidden */
578 True
, /* bMap_archive */
579 False
, /* bStoreDosAttributes */
580 False
, /* bDmapiSupport */
582 Auto
, /* iStrictLocking */
583 True
, /* bPosixLocking */
584 True
, /* bShareModes */
586 True
, /* bLevel2OpLocks */
587 False
, /* bOnlyUser */
588 True
, /* bMangledNames */
589 True
, /* bWidelinks */
590 True
, /* bSymlinks */
591 False
, /* bSyncAlways */
592 False
, /* bStrictAllocate */
593 False
, /* bStrictSync */
594 '~', /* magic char */
596 False
, /* bDeleteReadonly */
597 False
, /* bFakeOplocks */
598 False
, /* bDeleteVetoFiles */
599 False
, /* bDosFilemode */
600 True
, /* bDosFiletimes */
601 False
, /* bDosFiletimeResolution */
602 False
, /* bFakeDirCreateTimes */
603 True
, /* bBlockingLocks */
604 False
, /* bInheritPerms */
605 False
, /* bInheritACLS */
606 False
, /* bInheritOwner */
607 False
, /* bMSDfsRoot */
608 False
, /* bUseClientDriver */
609 True
, /* bDefaultDevmode */
610 False
, /* bForcePrintername */
611 True
, /* bNTAclSupport */
612 False
, /* bForceUnknownAclUser */
613 False
, /* bUseSendfile */
614 False
, /* bProfileAcls */
615 False
, /* bMap_acl_inherit */
616 False
, /* bAfs_Share */
617 False
, /* bEASupport */
618 True
, /* bAclCheckPermissions */
619 True
, /* bAclMapFullControl */
620 False
, /* bAclGroupControl */
621 True
, /* bChangeNotify */
622 True
, /* bKernelChangeNotify */
623 SMB_ROUNDUP_ALLOCATION_SIZE
, /* iallocation_roundup_size */
624 0, /* iAioReadSize */
625 0, /* iAioWriteSize */
626 MAP_READONLY_YES
, /* iMap_readonly */
627 #ifdef BROKEN_DIRECTORY_HANDLING
628 0, /* iDirectoryNameCacheSize */
630 100, /* iDirectoryNameCacheSize */
632 Auto
, /* ismb_encrypt */
633 NULL
, /* Parametric options */
638 /* local variables */
639 static struct service
**ServicePtrs
= NULL
;
640 static int iNumServices
= 0;
641 static int iServiceIndex
= 0;
642 static struct db_context
*ServiceHash
;
643 static int *invalid_services
= NULL
;
644 static int num_invalid_services
= 0;
645 static bool bInGlobalSection
= True
;
646 static bool bGlobalOnly
= False
;
647 static int server_role
;
648 static int default_server_announce
;
650 #define NUMPARAMETERS (sizeof(parm_table) / sizeof(struct parm_struct))
652 /* prototypes for the special type handlers */
653 static bool handle_include( int snum
, const char *pszParmValue
, char **ptr
);
654 static bool handle_copy( int snum
, const char *pszParmValue
, char **ptr
);
655 static bool handle_netbios_name( int snum
, const char *pszParmValue
, char **ptr
);
656 static bool handle_idmap_uid( int snum
, const char *pszParmValue
, char **ptr
);
657 static bool handle_idmap_gid( int snum
, const char *pszParmValue
, char **ptr
);
658 static bool handle_debug_list( int snum
, const char *pszParmValue
, char **ptr
);
659 static bool handle_workgroup( int snum
, const char *pszParmValue
, char **ptr
);
660 static bool handle_netbios_aliases( int snum
, const char *pszParmValue
, char **ptr
);
661 static bool handle_netbios_scope( int snum
, const char *pszParmValue
, char **ptr
);
662 static bool handle_charset( int snum
, const char *pszParmValue
, char **ptr
);
663 static bool handle_printing( int snum
, const char *pszParmValue
, char **ptr
);
664 static bool handle_ldap_debug_level( int snum
, const char *pszParmValue
, char **ptr
);
666 static void set_server_role(void);
667 static void set_default_server_announce_type(void);
668 static void set_allowed_client_auth(void);
670 static const struct enum_list enum_protocol
[] = {
671 {PROTOCOL_NT1
, "NT1"},
672 {PROTOCOL_LANMAN2
, "LANMAN2"},
673 {PROTOCOL_LANMAN1
, "LANMAN1"},
674 {PROTOCOL_CORE
, "CORE"},
675 {PROTOCOL_COREPLUS
, "COREPLUS"},
676 {PROTOCOL_COREPLUS
, "CORE+"},
680 static const struct enum_list enum_security
[] = {
681 {SEC_SHARE
, "SHARE"},
683 {SEC_SERVER
, "SERVER"},
684 {SEC_DOMAIN
, "DOMAIN"},
691 static const struct enum_list enum_printing
[] = {
692 {PRINT_SYSV
, "sysv"},
694 {PRINT_HPUX
, "hpux"},
698 {PRINT_LPRNG
, "lprng"},
699 {PRINT_CUPS
, "cups"},
700 {PRINT_IPRINT
, "iprint"},
702 {PRINT_LPROS2
, "os2"},
704 {PRINT_TEST
, "test"},
706 #endif /* DEVELOPER */
710 static const struct enum_list enum_ldap_sasl_wrapping
[] = {
712 {ADS_AUTH_SASL_SIGN
, "sign"},
713 {ADS_AUTH_SASL_SEAL
, "seal"},
717 static const struct enum_list enum_ldap_ssl
[] = {
718 {LDAP_SSL_OFF
, "no"},
719 {LDAP_SSL_OFF
, "No"},
720 {LDAP_SSL_OFF
, "off"},
721 {LDAP_SSL_OFF
, "Off"},
722 {LDAP_SSL_START_TLS
, "start tls"},
723 {LDAP_SSL_START_TLS
, "Start_tls"},
727 static const struct enum_list enum_ldap_passwd_sync
[] = {
728 {LDAP_PASSWD_SYNC_OFF
, "no"},
729 {LDAP_PASSWD_SYNC_OFF
, "No"},
730 {LDAP_PASSWD_SYNC_OFF
, "off"},
731 {LDAP_PASSWD_SYNC_OFF
, "Off"},
732 {LDAP_PASSWD_SYNC_ON
, "Yes"},
733 {LDAP_PASSWD_SYNC_ON
, "yes"},
734 {LDAP_PASSWD_SYNC_ON
, "on"},
735 {LDAP_PASSWD_SYNC_ON
, "On"},
736 {LDAP_PASSWD_SYNC_ONLY
, "Only"},
737 {LDAP_PASSWD_SYNC_ONLY
, "only"},
741 /* Types of machine we can announce as. */
742 #define ANNOUNCE_AS_NT_SERVER 1
743 #define ANNOUNCE_AS_WIN95 2
744 #define ANNOUNCE_AS_WFW 3
745 #define ANNOUNCE_AS_NT_WORKSTATION 4
747 static const struct enum_list enum_announce_as
[] = {
748 {ANNOUNCE_AS_NT_SERVER
, "NT"},
749 {ANNOUNCE_AS_NT_SERVER
, "NT Server"},
750 {ANNOUNCE_AS_NT_WORKSTATION
, "NT Workstation"},
751 {ANNOUNCE_AS_WIN95
, "win95"},
752 {ANNOUNCE_AS_WFW
, "WfW"},
756 static const struct enum_list enum_map_readonly
[] = {
757 {MAP_READONLY_NO
, "no"},
758 {MAP_READONLY_NO
, "false"},
759 {MAP_READONLY_NO
, "0"},
760 {MAP_READONLY_YES
, "yes"},
761 {MAP_READONLY_YES
, "true"},
762 {MAP_READONLY_YES
, "1"},
763 {MAP_READONLY_PERMISSIONS
, "permissions"},
764 {MAP_READONLY_PERMISSIONS
, "perms"},
768 static const struct enum_list enum_case
[] = {
769 {CASE_LOWER
, "lower"},
770 {CASE_UPPER
, "upper"},
774 static const struct enum_list enum_bool_auto
[] = {
785 /* Client-side offline caching policy types */
786 #define CSC_POLICY_MANUAL 0
787 #define CSC_POLICY_DOCUMENTS 1
788 #define CSC_POLICY_PROGRAMS 2
789 #define CSC_POLICY_DISABLE 3
791 static const struct enum_list enum_csc_policy
[] = {
792 {CSC_POLICY_MANUAL
, "manual"},
793 {CSC_POLICY_DOCUMENTS
, "documents"},
794 {CSC_POLICY_PROGRAMS
, "programs"},
795 {CSC_POLICY_DISABLE
, "disable"},
799 /* SMB signing types. */
800 static const struct enum_list enum_smb_signing_vals
[] = {
812 {Required
, "required"},
813 {Required
, "mandatory"},
815 {Required
, "forced"},
816 {Required
, "enforced"},
820 /* ACL compatibility options. */
821 static const struct enum_list enum_acl_compat_vals
[] = {
822 { ACL_COMPAT_AUTO
, "auto" },
823 { ACL_COMPAT_WINNT
, "winnt" },
824 { ACL_COMPAT_WIN2K
, "win2k" },
829 Do you want session setups at user level security with a invalid
830 password to be rejected or allowed in as guest? WinNT rejects them
831 but it can be a pain as it means "net view" needs to use a password
833 You have 3 choices in the setting of map_to_guest:
835 "Never" means session setups with an invalid password
836 are rejected. This is the default.
838 "Bad User" means session setups with an invalid password
839 are rejected, unless the username does not exist, in which case it
840 is treated as a guest login
842 "Bad Password" means session setups with an invalid password
843 are treated as a guest login
845 Note that map_to_guest only has an effect in user or server
849 static const struct enum_list enum_map_to_guest
[] = {
850 {NEVER_MAP_TO_GUEST
, "Never"},
851 {MAP_TO_GUEST_ON_BAD_USER
, "Bad User"},
852 {MAP_TO_GUEST_ON_BAD_PASSWORD
, "Bad Password"},
853 {MAP_TO_GUEST_ON_BAD_UID
, "Bad Uid"},
857 /* Config backend options */
859 static const struct enum_list enum_config_backend
[] = {
860 {CONFIG_BACKEND_FILE
, "file"},
861 {CONFIG_BACKEND_REGISTRY
, "registry"},
865 /* Note: We do not initialise the defaults union - it is not allowed in ANSI C
867 * The FLAG_HIDE is explicit. Paramters set this way do NOT appear in any edit
868 * screen in SWAT. This is used to exclude parameters as well as to squash all
869 * parameters that have been duplicated by pseudonyms.
871 * NOTE: To display a parameter in BASIC view set FLAG_BASIC
872 * Any parameter that does NOT have FLAG_ADVANCED will not disply at all
873 * Set FLAG_SHARE and FLAG_PRINT to specifically display parameters in
876 * NOTE2: Handling of duplicated (synonym) paramters:
877 * Only the first occurance of a parameter should be enabled by FLAG_BASIC
878 * and/or FLAG_ADVANCED. All duplicates following the first mention should be
879 * set to FLAG_HIDE. ie: Make you must place the parameter that has the preferred
880 * name first, and all synonyms must follow it with the FLAG_HIDE attribute.
883 static struct parm_struct parm_table
[] = {
884 {N_("Base Options"), P_SEP
, P_SEPARATOR
},
887 .label
= "dos charset",
890 .ptr
= &Globals
.dos_charset
,
891 .special
= handle_charset
,
893 .flags
= FLAG_ADVANCED
896 .label
= "unix charset",
899 .ptr
= &Globals
.unix_charset
,
900 .special
= handle_charset
,
902 .flags
= FLAG_ADVANCED
905 .label
= "display charset",
908 .ptr
= &Globals
.display_charset
,
909 .special
= handle_charset
,
911 .flags
= FLAG_ADVANCED
917 .ptr
= &sDefault
.comment
,
920 .flags
= FLAG_BASIC
| FLAG_ADVANCED
| FLAG_SHARE
| FLAG_PRINT
926 .ptr
= &sDefault
.szPath
,
929 .flags
= FLAG_BASIC
| FLAG_ADVANCED
| FLAG_SHARE
| FLAG_PRINT
,
932 .label
= "directory",
935 .ptr
= &sDefault
.szPath
,
941 .label
= "workgroup",
944 .ptr
= &Globals
.szWorkgroup
,
945 .special
= handle_workgroup
,
947 .flags
= FLAG_BASIC
| FLAG_ADVANCED
| FLAG_WIZARD
,
954 .ptr
= &Globals
.szRealm
,
957 .flags
= FLAG_BASIC
| FLAG_ADVANCED
| FLAG_WIZARD
,
961 .label
= "netbios name",
964 .ptr
= &Globals
.szNetbiosName
,
965 .special
= handle_netbios_name
,
967 .flags
= FLAG_BASIC
| FLAG_ADVANCED
| FLAG_WIZARD
,
970 .label
= "netbios aliases",
973 .ptr
= &Globals
.szNetbiosAliases
,
974 .special
= handle_netbios_aliases
,
976 .flags
= FLAG_ADVANCED
,
979 .label
= "netbios scope",
982 .ptr
= &Globals
.szNetbiosScope
,
983 .special
= handle_netbios_scope
,
985 .flags
= FLAG_ADVANCED
,
988 .label
= "server string",
991 .ptr
= &Globals
.szServerString
,
994 .flags
= FLAG_BASIC
| FLAG_ADVANCED
,
997 .label
= "interfaces",
1000 .ptr
= &Globals
.szInterfaces
,
1003 .flags
= FLAG_BASIC
| FLAG_ADVANCED
| FLAG_WIZARD
,
1006 .label
= "bind interfaces only",
1008 .p_class
= P_GLOBAL
,
1009 .ptr
= &Globals
.bBindInterfacesOnly
,
1012 .flags
= FLAG_ADVANCED
| FLAG_WIZARD
,
1015 .label
= "config backend",
1017 .p_class
= P_GLOBAL
,
1018 .ptr
= &Globals
.ConfigBackend
,
1020 .enum_list
= enum_config_backend
,
1021 .flags
= FLAG_ADVANCED
,
1024 {N_("Security Options"), P_SEP
, P_SEPARATOR
},
1027 .label
= "security",
1029 .p_class
= P_GLOBAL
,
1030 .ptr
= &Globals
.security
,
1032 .enum_list
= enum_security
,
1033 .flags
= FLAG_BASIC
| FLAG_ADVANCED
| FLAG_WIZARD
,
1036 .label
= "auth methods",
1038 .p_class
= P_GLOBAL
,
1039 .ptr
= &Globals
.AuthMethods
,
1042 .flags
= FLAG_ADVANCED
,
1045 .label
= "encrypt passwords",
1047 .p_class
= P_GLOBAL
,
1048 .ptr
= &Globals
.bEncryptPasswords
,
1051 .flags
= FLAG_BASIC
| FLAG_ADVANCED
| FLAG_WIZARD
,
1054 .label
= "update encrypted",
1056 .p_class
= P_GLOBAL
,
1057 .ptr
= &Globals
.bUpdateEncrypt
,
1060 .flags
= FLAG_ADVANCED
,
1063 .label
= "client schannel",
1065 .p_class
= P_GLOBAL
,
1066 .ptr
= &Globals
.clientSchannel
,
1068 .enum_list
= enum_bool_auto
,
1069 .flags
= FLAG_BASIC
| FLAG_ADVANCED
,
1072 .label
= "server schannel",
1074 .p_class
= P_GLOBAL
,
1075 .ptr
= &Globals
.serverSchannel
,
1077 .enum_list
= enum_bool_auto
,
1078 .flags
= FLAG_BASIC
| FLAG_ADVANCED
,
1081 .label
= "allow trusted domains",
1083 .p_class
= P_GLOBAL
,
1084 .ptr
= &Globals
.bAllowTrustedDomains
,
1087 .flags
= FLAG_ADVANCED
,
1090 .label
= "map to guest",
1092 .p_class
= P_GLOBAL
,
1093 .ptr
= &Globals
.map_to_guest
,
1095 .enum_list
= enum_map_to_guest
,
1096 .flags
= FLAG_ADVANCED
,
1099 .label
= "null passwords",
1101 .p_class
= P_GLOBAL
,
1102 .ptr
= &Globals
.bNullPasswords
,
1105 .flags
= FLAG_ADVANCED
,
1108 .label
= "obey pam restrictions",
1110 .p_class
= P_GLOBAL
,
1111 .ptr
= &Globals
.bObeyPamRestrictions
,
1114 .flags
= FLAG_ADVANCED
,
1117 .label
= "password server",
1119 .p_class
= P_GLOBAL
,
1120 .ptr
= &Globals
.szPasswordServer
,
1123 .flags
= FLAG_ADVANCED
| FLAG_WIZARD
,
1126 .label
= "smb passwd file",
1128 .p_class
= P_GLOBAL
,
1129 .ptr
= &Globals
.szSMBPasswdFile
,
1132 .flags
= FLAG_ADVANCED
,
1135 .label
= "private dir",
1137 .p_class
= P_GLOBAL
,
1138 .ptr
= &Globals
.szPrivateDir
,
1141 .flags
= FLAG_ADVANCED
,
1144 .label
= "passdb backend",
1146 .p_class
= P_GLOBAL
,
1147 .ptr
= &Globals
.szPassdbBackend
,
1150 .flags
= FLAG_ADVANCED
| FLAG_WIZARD
,
1153 .label
= "algorithmic rid base",
1155 .p_class
= P_GLOBAL
,
1156 .ptr
= &Globals
.AlgorithmicRidBase
,
1159 .flags
= FLAG_ADVANCED
,
1162 .label
= "root directory",
1164 .p_class
= P_GLOBAL
,
1165 .ptr
= &Globals
.szRootdir
,
1168 .flags
= FLAG_ADVANCED
,
1171 .label
= "root dir",
1173 .p_class
= P_GLOBAL
,
1174 .ptr
= &Globals
.szRootdir
,
1182 .p_class
= P_GLOBAL
,
1183 .ptr
= &Globals
.szRootdir
,
1189 .label
= "guest account",
1191 .p_class
= P_GLOBAL
,
1192 .ptr
= &Globals
.szGuestaccount
,
1195 .flags
= FLAG_BASIC
| FLAG_ADVANCED
,
1198 .label
= "enable privileges",
1200 .p_class
= P_GLOBAL
,
1201 .ptr
= &Globals
.bEnablePrivileges
,
1204 .flags
= FLAG_ADVANCED
,
1208 .label
= "pam password change",
1210 .p_class
= P_GLOBAL
,
1211 .ptr
= &Globals
.bPamPasswordChange
,
1214 .flags
= FLAG_ADVANCED
,
1217 .label
= "passwd program",
1219 .p_class
= P_GLOBAL
,
1220 .ptr
= &Globals
.szPasswdProgram
,
1223 .flags
= FLAG_ADVANCED
,
1226 .label
= "passwd chat",
1228 .p_class
= P_GLOBAL
,
1229 .ptr
= &Globals
.szPasswdChat
,
1232 .flags
= FLAG_ADVANCED
,
1235 .label
= "passwd chat debug",
1237 .p_class
= P_GLOBAL
,
1238 .ptr
= &Globals
.bPasswdChatDebug
,
1241 .flags
= FLAG_ADVANCED
,
1244 .label
= "passwd chat timeout",
1246 .p_class
= P_GLOBAL
,
1247 .ptr
= &Globals
.iPasswdChatTimeout
,
1250 .flags
= FLAG_ADVANCED
,
1253 .label
= "check password script",
1255 .p_class
= P_GLOBAL
,
1256 .ptr
= &Globals
.szCheckPasswordScript
,
1259 .flags
= FLAG_ADVANCED
,
1262 .label
= "username map",
1264 .p_class
= P_GLOBAL
,
1265 .ptr
= &Globals
.szUsernameMap
,
1268 .flags
= FLAG_ADVANCED
,
1271 .label
= "password level",
1273 .p_class
= P_GLOBAL
,
1274 .ptr
= &Globals
.pwordlevel
,
1277 .flags
= FLAG_ADVANCED
,
1280 .label
= "username level",
1282 .p_class
= P_GLOBAL
,
1283 .ptr
= &Globals
.unamelevel
,
1286 .flags
= FLAG_ADVANCED
,
1289 .label
= "unix password sync",
1291 .p_class
= P_GLOBAL
,
1292 .ptr
= &Globals
.bUnixPasswdSync
,
1295 .flags
= FLAG_ADVANCED
,
1298 .label
= "restrict anonymous",
1300 .p_class
= P_GLOBAL
,
1301 .ptr
= &Globals
.restrict_anonymous
,
1304 .flags
= FLAG_ADVANCED
,
1307 .label
= "lanman auth",
1309 .p_class
= P_GLOBAL
,
1310 .ptr
= &Globals
.bLanmanAuth
,
1313 .flags
= FLAG_ADVANCED
,
1316 .label
= "ntlm auth",
1318 .p_class
= P_GLOBAL
,
1319 .ptr
= &Globals
.bNTLMAuth
,
1322 .flags
= FLAG_ADVANCED
,
1325 .label
= "client NTLMv2 auth",
1327 .p_class
= P_GLOBAL
,
1328 .ptr
= &Globals
.bClientNTLMv2Auth
,
1331 .flags
= FLAG_ADVANCED
,
1334 .label
= "client lanman auth",
1336 .p_class
= P_GLOBAL
,
1337 .ptr
= &Globals
.bClientLanManAuth
,
1340 .flags
= FLAG_ADVANCED
,
1343 .label
= "client plaintext auth",
1345 .p_class
= P_GLOBAL
,
1346 .ptr
= &Globals
.bClientPlaintextAuth
,
1349 .flags
= FLAG_ADVANCED
,
1352 .label
= "username",
1355 .ptr
= &sDefault
.szUsername
,
1358 .flags
= FLAG_ADVANCED
| FLAG_GLOBAL
| FLAG_SHARE
,
1364 .ptr
= &sDefault
.szUsername
,
1373 .ptr
= &sDefault
.szUsername
,
1379 .label
= "invalid users",
1382 .ptr
= &sDefault
.szInvalidUsers
,
1385 .flags
= FLAG_ADVANCED
| FLAG_GLOBAL
| FLAG_SHARE
,
1388 .label
= "valid users",
1391 .ptr
= &sDefault
.szValidUsers
,
1394 .flags
= FLAG_ADVANCED
| FLAG_GLOBAL
| FLAG_SHARE
,
1397 .label
= "admin users",
1400 .ptr
= &sDefault
.szAdminUsers
,
1403 .flags
= FLAG_ADVANCED
| FLAG_GLOBAL
| FLAG_SHARE
,
1406 .label
= "read list",
1409 .ptr
= &sDefault
.readlist
,
1412 .flags
= FLAG_ADVANCED
| FLAG_GLOBAL
| FLAG_SHARE
,
1415 .label
= "write list",
1418 .ptr
= &sDefault
.writelist
,
1421 .flags
= FLAG_ADVANCED
| FLAG_GLOBAL
| FLAG_SHARE
,
1424 .label
= "printer admin",
1427 .ptr
= &sDefault
.printer_admin
,
1430 .flags
= FLAG_ADVANCED
| FLAG_GLOBAL
| FLAG_PRINT
| FLAG_DEPRECATED
,
1433 .label
= "force user",
1436 .ptr
= &sDefault
.force_user
,
1439 .flags
= FLAG_ADVANCED
| FLAG_SHARE
,
1442 .label
= "force group",
1445 .ptr
= &sDefault
.force_group
,
1448 .flags
= FLAG_ADVANCED
| FLAG_SHARE
,
1454 .ptr
= &sDefault
.force_group
,
1457 .flags
= FLAG_ADVANCED
,
1460 .label
= "read only",
1463 .ptr
= &sDefault
.bRead_only
,
1466 .flags
= FLAG_BASIC
| FLAG_ADVANCED
| FLAG_SHARE
,
1469 .label
= "write ok",
1472 .ptr
= &sDefault
.bRead_only
,
1478 .label
= "writeable",
1481 .ptr
= &sDefault
.bRead_only
,
1487 .label
= "writable",
1490 .ptr
= &sDefault
.bRead_only
,
1496 .label
= "acl check permissions",
1499 .ptr
= &sDefault
.bAclCheckPermissions
,
1502 .flags
= FLAG_ADVANCED
| FLAG_GLOBAL
| FLAG_SHARE
,
1505 .label
= "acl group control",
1508 .ptr
= &sDefault
.bAclGroupControl
,
1511 .flags
= FLAG_ADVANCED
| FLAG_GLOBAL
| FLAG_SHARE
| FLAG_DEPRECATED
,
1514 .label
= "acl map full control",
1517 .ptr
= &sDefault
.bAclMapFullControl
,
1520 .flags
= FLAG_ADVANCED
| FLAG_GLOBAL
| FLAG_SHARE
,
1523 .label
= "create mask",
1526 .ptr
= &sDefault
.iCreate_mask
,
1529 .flags
= FLAG_ADVANCED
| FLAG_GLOBAL
| FLAG_SHARE
,
1532 .label
= "create mode",
1535 .ptr
= &sDefault
.iCreate_mask
,
1541 .label
= "force create mode",
1544 .ptr
= &sDefault
.iCreate_force_mode
,
1547 .flags
= FLAG_ADVANCED
| FLAG_GLOBAL
| FLAG_SHARE
,
1550 .label
= "security mask",
1553 .ptr
= &sDefault
.iSecurity_mask
,
1556 .flags
= FLAG_ADVANCED
| FLAG_GLOBAL
| FLAG_SHARE
,
1559 .label
= "force security mode",
1562 .ptr
= &sDefault
.iSecurity_force_mode
,
1565 .flags
= FLAG_ADVANCED
| FLAG_GLOBAL
| FLAG_SHARE
,
1568 .label
= "directory mask",
1571 .ptr
= &sDefault
.iDir_mask
,
1574 .flags
= FLAG_ADVANCED
| FLAG_GLOBAL
| FLAG_SHARE
,
1577 .label
= "directory mode",
1580 .ptr
= &sDefault
.iDir_mask
,
1583 .flags
= FLAG_ADVANCED
| FLAG_GLOBAL
,
1586 .label
= "force directory mode",
1589 .ptr
= &sDefault
.iDir_force_mode
,
1592 .flags
= FLAG_ADVANCED
| FLAG_GLOBAL
| FLAG_SHARE
,
1595 .label
= "directory security mask",
1598 .ptr
= &sDefault
.iDir_Security_mask
,
1601 .flags
= FLAG_ADVANCED
| FLAG_GLOBAL
| FLAG_SHARE
,
1604 .label
= "force directory security mode",
1607 .ptr
= &sDefault
.iDir_Security_force_mode
,
1610 .flags
= FLAG_ADVANCED
| FLAG_GLOBAL
| FLAG_SHARE
,
1613 .label
= "force unknown acl user",
1616 .ptr
= &sDefault
.bForceUnknownAclUser
,
1619 .flags
= FLAG_ADVANCED
| FLAG_GLOBAL
| FLAG_SHARE
,
1622 .label
= "inherit permissions",
1625 .ptr
= &sDefault
.bInheritPerms
,
1628 .flags
= FLAG_ADVANCED
| FLAG_SHARE
,
1631 .label
= "inherit acls",
1634 .ptr
= &sDefault
.bInheritACLS
,
1637 .flags
= FLAG_ADVANCED
| FLAG_SHARE
,
1640 .label
= "inherit owner",
1643 .ptr
= &sDefault
.bInheritOwner
,
1646 .flags
= FLAG_ADVANCED
| FLAG_SHARE
,
1649 .label
= "guest only",
1652 .ptr
= &sDefault
.bGuest_only
,
1655 .flags
= FLAG_ADVANCED
| FLAG_SHARE
,
1658 .label
= "only guest",
1661 .ptr
= &sDefault
.bGuest_only
,
1667 .label
= "administrative share",
1670 .ptr
= &sDefault
.bAdministrative_share
,
1673 .flags
= FLAG_ADVANCED
| FLAG_SHARE
| FLAG_PRINT
,
1677 .label
= "guest ok",
1680 .ptr
= &sDefault
.bGuest_ok
,
1683 .flags
= FLAG_BASIC
| FLAG_ADVANCED
| FLAG_SHARE
| FLAG_PRINT
,
1689 .ptr
= &sDefault
.bGuest_ok
,
1695 .label
= "only user",
1698 .ptr
= &sDefault
.bOnlyUser
,
1701 .flags
= FLAG_ADVANCED
| FLAG_SHARE
| FLAG_DEPRECATED
,
1704 .label
= "hosts allow",
1707 .ptr
= &sDefault
.szHostsallow
,
1710 .flags
= FLAG_GLOBAL
| FLAG_BASIC
| FLAG_ADVANCED
| FLAG_SHARE
| FLAG_PRINT
,
1713 .label
= "allow hosts",
1716 .ptr
= &sDefault
.szHostsallow
,
1722 .label
= "hosts deny",
1725 .ptr
= &sDefault
.szHostsdeny
,
1728 .flags
= FLAG_GLOBAL
| FLAG_BASIC
| FLAG_ADVANCED
| FLAG_SHARE
| FLAG_PRINT
,
1731 .label
= "deny hosts",
1734 .ptr
= &sDefault
.szHostsdeny
,
1740 .label
= "preload modules",
1742 .p_class
= P_GLOBAL
,
1743 .ptr
= &Globals
.szPreloadModules
,
1746 .flags
= FLAG_ADVANCED
| FLAG_GLOBAL
,
1749 .label
= "use kerberos keytab",
1751 .p_class
= P_GLOBAL
,
1752 .ptr
= &Globals
.bUseKerberosKeytab
,
1755 .flags
= FLAG_ADVANCED
,
1758 {N_("Logging Options"), P_SEP
, P_SEPARATOR
},
1761 .label
= "log level",
1763 .p_class
= P_GLOBAL
,
1764 .ptr
= &Globals
.szLogLevel
,
1765 .special
= handle_debug_list
,
1767 .flags
= FLAG_ADVANCED
,
1770 .label
= "debuglevel",
1772 .p_class
= P_GLOBAL
,
1773 .ptr
= &Globals
.szLogLevel
,
1774 .special
= handle_debug_list
,
1781 .p_class
= P_GLOBAL
,
1782 .ptr
= &Globals
.syslog
,
1785 .flags
= FLAG_ADVANCED
,
1788 .label
= "syslog only",
1790 .p_class
= P_GLOBAL
,
1791 .ptr
= &Globals
.bSyslogOnly
,
1794 .flags
= FLAG_ADVANCED
,
1797 .label
= "log file",
1799 .p_class
= P_GLOBAL
,
1800 .ptr
= &Globals
.szLogFile
,
1803 .flags
= FLAG_ADVANCED
,
1806 .label
= "max log size",
1808 .p_class
= P_GLOBAL
,
1809 .ptr
= &Globals
.max_log_size
,
1812 .flags
= FLAG_ADVANCED
,
1815 .label
= "debug timestamp",
1817 .p_class
= P_GLOBAL
,
1818 .ptr
= &Globals
.bTimestampLogs
,
1821 .flags
= FLAG_ADVANCED
,
1824 .label
= "timestamp logs",
1826 .p_class
= P_GLOBAL
,
1827 .ptr
= &Globals
.bTimestampLogs
,
1830 .flags
= FLAG_ADVANCED
,
1833 .label
= "debug prefix timestamp",
1835 .p_class
= P_GLOBAL
,
1836 .ptr
= &Globals
.bDebugPrefixTimestamp
,
1839 .flags
= FLAG_ADVANCED
,
1842 .label
= "debug hires timestamp",
1844 .p_class
= P_GLOBAL
,
1845 .ptr
= &Globals
.bDebugHiresTimestamp
,
1848 .flags
= FLAG_ADVANCED
,
1851 .label
= "debug pid",
1853 .p_class
= P_GLOBAL
,
1854 .ptr
= &Globals
.bDebugPid
,
1857 .flags
= FLAG_ADVANCED
,
1860 .label
= "debug uid",
1862 .p_class
= P_GLOBAL
,
1863 .ptr
= &Globals
.bDebugUid
,
1866 .flags
= FLAG_ADVANCED
,
1869 .label
= "debug class",
1871 .p_class
= P_GLOBAL
,
1872 .ptr
= &Globals
.bDebugClass
,
1875 .flags
= FLAG_ADVANCED
,
1878 .label
= "enable core files",
1880 .p_class
= P_GLOBAL
,
1881 .ptr
= &Globals
.bEnableCoreFiles
,
1884 .flags
= FLAG_ADVANCED
,
1887 {N_("Protocol Options"), P_SEP
, P_SEPARATOR
},
1890 .label
= "allocation roundup size",
1893 .ptr
= &sDefault
.iallocation_roundup_size
,
1896 .flags
= FLAG_ADVANCED
,
1899 .label
= "aio read size",
1902 .ptr
= &sDefault
.iAioReadSize
,
1905 .flags
= FLAG_ADVANCED
,
1908 .label
= "aio write size",
1911 .ptr
= &sDefault
.iAioWriteSize
,
1914 .flags
= FLAG_ADVANCED
,
1917 .label
= "aio write behind",
1920 .ptr
= &sDefault
.szAioWriteBehind
,
1923 .flags
= FLAG_ADVANCED
| FLAG_SHARE
| FLAG_GLOBAL
,
1926 .label
= "smb ports",
1928 .p_class
= P_GLOBAL
,
1929 .ptr
= &Globals
.smb_ports
,
1932 .flags
= FLAG_ADVANCED
,
1935 .label
= "large readwrite",
1937 .p_class
= P_GLOBAL
,
1938 .ptr
= &Globals
.bLargeReadwrite
,
1941 .flags
= FLAG_ADVANCED
,
1944 .label
= "max protocol",
1946 .p_class
= P_GLOBAL
,
1947 .ptr
= &Globals
.maxprotocol
,
1949 .enum_list
= enum_protocol
,
1950 .flags
= FLAG_ADVANCED
,
1953 .label
= "protocol",
1955 .p_class
= P_GLOBAL
,
1956 .ptr
= &Globals
.maxprotocol
,
1958 .enum_list
= enum_protocol
,
1959 .flags
= FLAG_ADVANCED
,
1962 .label
= "min protocol",
1964 .p_class
= P_GLOBAL
,
1965 .ptr
= &Globals
.minprotocol
,
1967 .enum_list
= enum_protocol
,
1968 .flags
= FLAG_ADVANCED
,
1971 .label
= "min receivefile size",
1973 .p_class
= P_GLOBAL
,
1974 .ptr
= &Globals
.iminreceivefile
,
1977 .flags
= FLAG_ADVANCED
,
1980 .label
= "read raw",
1982 .p_class
= P_GLOBAL
,
1983 .ptr
= &Globals
.bReadRaw
,
1986 .flags
= FLAG_ADVANCED
,
1989 .label
= "write raw",
1991 .p_class
= P_GLOBAL
,
1992 .ptr
= &Globals
.bWriteRaw
,
1995 .flags
= FLAG_ADVANCED
,
1998 .label
= "disable netbios",
2000 .p_class
= P_GLOBAL
,
2001 .ptr
= &Globals
.bDisableNetbios
,
2004 .flags
= FLAG_ADVANCED
,
2007 .label
= "reset on zero vc",
2009 .p_class
= P_GLOBAL
,
2010 .ptr
= &Globals
.bResetOnZeroVC
,
2013 .flags
= FLAG_ADVANCED
,
2016 .label
= "acl compatibility",
2018 .p_class
= P_GLOBAL
,
2019 .ptr
= &Globals
.iAclCompat
,
2021 .enum_list
= enum_acl_compat_vals
,
2022 .flags
= FLAG_ADVANCED
| FLAG_SHARE
| FLAG_GLOBAL
,
2025 .label
= "defer sharing violations",
2027 .p_class
= P_GLOBAL
,
2028 .ptr
= &Globals
.bDeferSharingViolations
,
2031 .flags
= FLAG_ADVANCED
| FLAG_GLOBAL
,
2034 .label
= "ea support",
2037 .ptr
= &sDefault
.bEASupport
,
2040 .flags
= FLAG_ADVANCED
| FLAG_SHARE
| FLAG_GLOBAL
,
2043 .label
= "nt acl support",
2046 .ptr
= &sDefault
.bNTAclSupport
,
2049 .flags
= FLAG_ADVANCED
| FLAG_SHARE
| FLAG_GLOBAL
,
2052 .label
= "nt pipe support",
2054 .p_class
= P_GLOBAL
,
2055 .ptr
= &Globals
.bNTPipeSupport
,
2058 .flags
= FLAG_ADVANCED
,
2061 .label
= "nt status support",
2063 .p_class
= P_GLOBAL
,
2064 .ptr
= &Globals
.bNTStatusSupport
,
2067 .flags
= FLAG_ADVANCED
,
2070 .label
= "profile acls",
2073 .ptr
= &sDefault
.bProfileAcls
,
2076 .flags
= FLAG_ADVANCED
| FLAG_GLOBAL
| FLAG_SHARE
,
2079 .label
= "announce version",
2081 .p_class
= P_GLOBAL
,
2082 .ptr
= &Globals
.szAnnounceVersion
,
2085 .flags
= FLAG_ADVANCED
,
2088 .label
= "announce as",
2090 .p_class
= P_GLOBAL
,
2091 .ptr
= &Globals
.announce_as
,
2093 .enum_list
= enum_announce_as
,
2094 .flags
= FLAG_ADVANCED
,
2097 .label
= "map acl inherit",
2100 .ptr
= &sDefault
.bMap_acl_inherit
,
2103 .flags
= FLAG_ADVANCED
| FLAG_SHARE
| FLAG_GLOBAL
,
2106 .label
= "afs share",
2109 .ptr
= &sDefault
.bAfs_Share
,
2112 .flags
= FLAG_ADVANCED
| FLAG_SHARE
| FLAG_GLOBAL
,
2117 .p_class
= P_GLOBAL
,
2118 .ptr
= &Globals
.max_mux
,
2121 .flags
= FLAG_ADVANCED
,
2124 .label
= "max xmit",
2126 .p_class
= P_GLOBAL
,
2127 .ptr
= &Globals
.max_xmit
,
2130 .flags
= FLAG_ADVANCED
,
2133 .label
= "name resolve order",
2135 .p_class
= P_GLOBAL
,
2136 .ptr
= &Globals
.szNameResolveOrder
,
2139 .flags
= FLAG_ADVANCED
| FLAG_WIZARD
,
2144 .p_class
= P_GLOBAL
,
2145 .ptr
= &Globals
.max_ttl
,
2148 .flags
= FLAG_ADVANCED
,
2151 .label
= "max wins ttl",
2153 .p_class
= P_GLOBAL
,
2154 .ptr
= &Globals
.max_wins_ttl
,
2157 .flags
= FLAG_ADVANCED
,
2160 .label
= "min wins ttl",
2162 .p_class
= P_GLOBAL
,
2163 .ptr
= &Globals
.min_wins_ttl
,
2166 .flags
= FLAG_ADVANCED
,
2169 .label
= "time server",
2171 .p_class
= P_GLOBAL
,
2172 .ptr
= &Globals
.bTimeServer
,
2175 .flags
= FLAG_ADVANCED
,
2178 .label
= "unix extensions",
2180 .p_class
= P_GLOBAL
,
2181 .ptr
= &Globals
.bUnixExtensions
,
2184 .flags
= FLAG_ADVANCED
,
2187 .label
= "use spnego",
2189 .p_class
= P_GLOBAL
,
2190 .ptr
= &Globals
.bUseSpnego
,
2193 .flags
= FLAG_ADVANCED
,
2196 .label
= "client signing",
2198 .p_class
= P_GLOBAL
,
2199 .ptr
= &Globals
.client_signing
,
2201 .enum_list
= enum_smb_signing_vals
,
2202 .flags
= FLAG_ADVANCED
,
2205 .label
= "server signing",
2207 .p_class
= P_GLOBAL
,
2208 .ptr
= &Globals
.server_signing
,
2210 .enum_list
= enum_smb_signing_vals
,
2211 .flags
= FLAG_ADVANCED
,
2214 .label
= "smb encrypt",
2217 .ptr
= &sDefault
.ismb_encrypt
,
2219 .enum_list
= enum_smb_signing_vals
,
2220 .flags
= FLAG_ADVANCED
,
2223 .label
= "client use spnego",
2225 .p_class
= P_GLOBAL
,
2226 .ptr
= &Globals
.bClientUseSpnego
,
2229 .flags
= FLAG_ADVANCED
,
2232 .label
= "client ldap sasl wrapping",
2234 .p_class
= P_GLOBAL
,
2235 .ptr
= &Globals
.client_ldap_sasl_wrapping
,
2237 .enum_list
= enum_ldap_sasl_wrapping
,
2238 .flags
= FLAG_ADVANCED
,
2241 .label
= "enable asu support",
2243 .p_class
= P_GLOBAL
,
2244 .ptr
= &Globals
.bASUSupport
,
2247 .flags
= FLAG_ADVANCED
,
2250 .label
= "svcctl list",
2252 .p_class
= P_GLOBAL
,
2253 .ptr
= &Globals
.szServicesList
,
2256 .flags
= FLAG_ADVANCED
,
2259 {N_("Tuning Options"), P_SEP
, P_SEPARATOR
},
2262 .label
= "block size",
2265 .ptr
= &sDefault
.iBlock_size
,
2268 .flags
= FLAG_ADVANCED
| FLAG_SHARE
| FLAG_GLOBAL
,
2271 .label
= "deadtime",
2273 .p_class
= P_GLOBAL
,
2274 .ptr
= &Globals
.deadtime
,
2277 .flags
= FLAG_ADVANCED
,
2280 .label
= "getwd cache",
2282 .p_class
= P_GLOBAL
,
2283 .ptr
= &Globals
.getwd_cache
,
2286 .flags
= FLAG_ADVANCED
,
2289 .label
= "keepalive",
2291 .p_class
= P_GLOBAL
,
2292 .ptr
= &Globals
.iKeepalive
,
2295 .flags
= FLAG_ADVANCED
,
2298 .label
= "change notify",
2301 .ptr
= &sDefault
.bChangeNotify
,
2304 .flags
= FLAG_ADVANCED
| FLAG_SHARE
,
2307 .label
= "directory name cache size",
2310 .ptr
= &sDefault
.iDirectoryNameCacheSize
,
2313 .flags
= FLAG_ADVANCED
| FLAG_SHARE
,
2316 .label
= "kernel change notify",
2319 .ptr
= &sDefault
.bKernelChangeNotify
,
2322 .flags
= FLAG_ADVANCED
| FLAG_SHARE
,
2325 .label
= "lpq cache time",
2327 .p_class
= P_GLOBAL
,
2328 .ptr
= &Globals
.lpqcachetime
,
2331 .flags
= FLAG_ADVANCED
,
2334 .label
= "max smbd processes",
2336 .p_class
= P_GLOBAL
,
2337 .ptr
= &Globals
.iMaxSmbdProcesses
,
2340 .flags
= FLAG_ADVANCED
,
2343 .label
= "max connections",
2346 .ptr
= &sDefault
.iMaxConnections
,
2349 .flags
= FLAG_ADVANCED
| FLAG_SHARE
,
2352 .label
= "paranoid server security",
2354 .p_class
= P_GLOBAL
,
2355 .ptr
= &Globals
.paranoid_server_security
,
2358 .flags
= FLAG_ADVANCED
,
2361 .label
= "max disk size",
2363 .p_class
= P_GLOBAL
,
2364 .ptr
= &Globals
.maxdisksize
,
2367 .flags
= FLAG_ADVANCED
,
2370 .label
= "max open files",
2372 .p_class
= P_GLOBAL
,
2373 .ptr
= &Globals
.max_open_files
,
2376 .flags
= FLAG_ADVANCED
,
2379 .label
= "min print space",
2382 .ptr
= &sDefault
.iMinPrintSpace
,
2385 .flags
= FLAG_ADVANCED
| FLAG_PRINT
,
2388 .label
= "socket options",
2390 .p_class
= P_GLOBAL
,
2391 .ptr
= &Globals
.szSocketOptions
,
2394 .flags
= FLAG_ADVANCED
,
2397 .label
= "strict allocate",
2400 .ptr
= &sDefault
.bStrictAllocate
,
2403 .flags
= FLAG_ADVANCED
| FLAG_SHARE
,
2406 .label
= "strict sync",
2409 .ptr
= &sDefault
.bStrictSync
,
2412 .flags
= FLAG_ADVANCED
| FLAG_SHARE
,
2415 .label
= "sync always",
2418 .ptr
= &sDefault
.bSyncAlways
,
2421 .flags
= FLAG_ADVANCED
| FLAG_SHARE
,
2424 .label
= "use mmap",
2426 .p_class
= P_GLOBAL
,
2427 .ptr
= &Globals
.bUseMmap
,
2430 .flags
= FLAG_ADVANCED
,
2433 .label
= "use sendfile",
2436 .ptr
= &sDefault
.bUseSendfile
,
2439 .flags
= FLAG_ADVANCED
| FLAG_SHARE
,
2442 .label
= "hostname lookups",
2444 .p_class
= P_GLOBAL
,
2445 .ptr
= &Globals
.bHostnameLookups
,
2448 .flags
= FLAG_ADVANCED
,
2451 .label
= "write cache size",
2454 .ptr
= &sDefault
.iWriteCacheSize
,
2457 .flags
= FLAG_ADVANCED
| FLAG_SHARE
| FLAG_DEPRECATED
,
2460 .label
= "name cache timeout",
2462 .p_class
= P_GLOBAL
,
2463 .ptr
= &Globals
.name_cache_timeout
,
2466 .flags
= FLAG_ADVANCED
,
2469 .label
= "ctdbd socket",
2471 .p_class
= P_GLOBAL
,
2472 .ptr
= &Globals
.ctdbdSocket
,
2475 .flags
= FLAG_ADVANCED
| FLAG_GLOBAL
,
2478 .label
= "cluster addresses",
2480 .p_class
= P_GLOBAL
,
2481 .ptr
= &Globals
.szClusterAddresses
,
2484 .flags
= FLAG_ADVANCED
| FLAG_GLOBAL
,
2487 .label
= "clustering",
2489 .p_class
= P_GLOBAL
,
2490 .ptr
= &Globals
.clustering
,
2493 .flags
= FLAG_ADVANCED
| FLAG_GLOBAL
,
2496 {N_("Printing Options"), P_SEP
, P_SEPARATOR
},
2499 .label
= "max reported print jobs",
2502 .ptr
= &sDefault
.iMaxReportedPrintJobs
,
2505 .flags
= FLAG_ADVANCED
| FLAG_PRINT
,
2508 .label
= "max print jobs",
2511 .ptr
= &sDefault
.iMaxPrintJobs
,
2514 .flags
= FLAG_ADVANCED
| FLAG_PRINT
,
2517 .label
= "load printers",
2519 .p_class
= P_GLOBAL
,
2520 .ptr
= &Globals
.bLoadPrinters
,
2523 .flags
= FLAG_ADVANCED
| FLAG_PRINT
,
2526 .label
= "printcap cache time",
2528 .p_class
= P_GLOBAL
,
2529 .ptr
= &Globals
.PrintcapCacheTime
,
2532 .flags
= FLAG_ADVANCED
| FLAG_PRINT
,
2535 .label
= "printcap name",
2537 .p_class
= P_GLOBAL
,
2538 .ptr
= &Globals
.szPrintcapname
,
2541 .flags
= FLAG_ADVANCED
| FLAG_PRINT
,
2544 .label
= "printcap",
2546 .p_class
= P_GLOBAL
,
2547 .ptr
= &Globals
.szPrintcapname
,
2553 .label
= "printable",
2556 .ptr
= &sDefault
.bPrint_ok
,
2559 .flags
= FLAG_ADVANCED
| FLAG_PRINT
,
2562 .label
= "print ok",
2565 .ptr
= &sDefault
.bPrint_ok
,
2571 .label
= "printing",
2574 .ptr
= &sDefault
.iPrinting
,
2575 .special
= handle_printing
,
2576 .enum_list
= enum_printing
,
2577 .flags
= FLAG_ADVANCED
| FLAG_PRINT
| FLAG_GLOBAL
,
2580 .label
= "cups options",
2583 .ptr
= &sDefault
.szCupsOptions
,
2586 .flags
= FLAG_ADVANCED
| FLAG_PRINT
| FLAG_GLOBAL
,
2589 .label
= "cups server",
2591 .p_class
= P_GLOBAL
,
2592 .ptr
= &Globals
.szCupsServer
,
2595 .flags
= FLAG_ADVANCED
| FLAG_PRINT
| FLAG_GLOBAL
,
2598 .label
= "iprint server",
2600 .p_class
= P_GLOBAL
,
2601 .ptr
= &Globals
.szIPrintServer
,
2604 .flags
= FLAG_ADVANCED
| FLAG_PRINT
| FLAG_GLOBAL
,
2607 .label
= "print command",
2610 .ptr
= &sDefault
.szPrintcommand
,
2613 .flags
= FLAG_ADVANCED
| FLAG_PRINT
| FLAG_GLOBAL
,
2616 .label
= "disable spoolss",
2618 .p_class
= P_GLOBAL
,
2619 .ptr
= &Globals
.bDisableSpoolss
,
2622 .flags
= FLAG_ADVANCED
| FLAG_PRINT
| FLAG_GLOBAL
,
2625 .label
= "enable spoolss",
2627 .p_class
= P_GLOBAL
,
2628 .ptr
= &Globals
.bDisableSpoolss
,
2634 .label
= "lpq command",
2637 .ptr
= &sDefault
.szLpqcommand
,
2640 .flags
= FLAG_ADVANCED
| FLAG_PRINT
| FLAG_GLOBAL
,
2643 .label
= "lprm command",
2646 .ptr
= &sDefault
.szLprmcommand
,
2649 .flags
= FLAG_ADVANCED
| FLAG_PRINT
| FLAG_GLOBAL
,
2652 .label
= "lppause command",
2655 .ptr
= &sDefault
.szLppausecommand
,
2658 .flags
= FLAG_ADVANCED
| FLAG_PRINT
| FLAG_GLOBAL
,
2661 .label
= "lpresume command",
2664 .ptr
= &sDefault
.szLpresumecommand
,
2667 .flags
= FLAG_ADVANCED
| FLAG_PRINT
| FLAG_GLOBAL
,
2670 .label
= "queuepause command",
2673 .ptr
= &sDefault
.szQueuepausecommand
,
2676 .flags
= FLAG_ADVANCED
| FLAG_PRINT
| FLAG_GLOBAL
,
2679 .label
= "queueresume command",
2682 .ptr
= &sDefault
.szQueueresumecommand
,
2685 .flags
= FLAG_ADVANCED
| FLAG_PRINT
| FLAG_GLOBAL
,
2688 .label
= "addport command",
2690 .p_class
= P_GLOBAL
,
2691 .ptr
= &Globals
.szAddPortCommand
,
2694 .flags
= FLAG_ADVANCED
,
2697 .label
= "enumports command",
2699 .p_class
= P_GLOBAL
,
2700 .ptr
= &Globals
.szEnumPortsCommand
,
2703 .flags
= FLAG_ADVANCED
,
2706 .label
= "addprinter command",
2708 .p_class
= P_GLOBAL
,
2709 .ptr
= &Globals
.szAddPrinterCommand
,
2712 .flags
= FLAG_ADVANCED
,
2715 .label
= "deleteprinter command",
2717 .p_class
= P_GLOBAL
,
2718 .ptr
= &Globals
.szDeletePrinterCommand
,
2721 .flags
= FLAG_ADVANCED
,
2724 .label
= "show add printer wizard",
2726 .p_class
= P_GLOBAL
,
2727 .ptr
= &Globals
.bMsAddPrinterWizard
,
2730 .flags
= FLAG_ADVANCED
,
2733 .label
= "os2 driver map",
2735 .p_class
= P_GLOBAL
,
2736 .ptr
= &Globals
.szOs2DriverMap
,
2739 .flags
= FLAG_ADVANCED
,
2743 .label
= "printer name",
2746 .ptr
= &sDefault
.szPrintername
,
2749 .flags
= FLAG_ADVANCED
| FLAG_PRINT
,
2755 .ptr
= &sDefault
.szPrintername
,
2761 .label
= "use client driver",
2764 .ptr
= &sDefault
.bUseClientDriver
,
2767 .flags
= FLAG_ADVANCED
| FLAG_PRINT
,
2770 .label
= "default devmode",
2773 .ptr
= &sDefault
.bDefaultDevmode
,
2776 .flags
= FLAG_ADVANCED
| FLAG_PRINT
,
2779 .label
= "force printername",
2782 .ptr
= &sDefault
.bForcePrintername
,
2785 .flags
= FLAG_ADVANCED
| FLAG_PRINT
,
2788 .label
= "printjob username",
2791 .ptr
= &sDefault
.szPrintjobUsername
,
2794 .flags
= FLAG_ADVANCED
| FLAG_PRINT
,
2797 {N_("Filename Handling"), P_SEP
, P_SEPARATOR
},
2800 .label
= "mangling method",
2802 .p_class
= P_GLOBAL
,
2803 .ptr
= &Globals
.szManglingMethod
,
2806 .flags
= FLAG_ADVANCED
,
2809 .label
= "mangle prefix",
2811 .p_class
= P_GLOBAL
,
2812 .ptr
= &Globals
.mangle_prefix
,
2815 .flags
= FLAG_ADVANCED
,
2819 .label
= "default case",
2822 .ptr
= &sDefault
.iDefaultCase
,
2824 .enum_list
= enum_case
,
2825 .flags
= FLAG_ADVANCED
| FLAG_SHARE
,
2828 .label
= "case sensitive",
2831 .ptr
= &sDefault
.iCaseSensitive
,
2833 .enum_list
= enum_bool_auto
,
2834 .flags
= FLAG_ADVANCED
| FLAG_SHARE
| FLAG_GLOBAL
,
2837 .label
= "casesignames",
2840 .ptr
= &sDefault
.iCaseSensitive
,
2842 .enum_list
= enum_bool_auto
,
2843 .flags
= FLAG_ADVANCED
| FLAG_SHARE
| FLAG_GLOBAL
| FLAG_HIDE
,
2846 .label
= "preserve case",
2849 .ptr
= &sDefault
.bCasePreserve
,
2852 .flags
= FLAG_ADVANCED
| FLAG_SHARE
| FLAG_GLOBAL
,
2855 .label
= "short preserve case",
2858 .ptr
= &sDefault
.bShortCasePreserve
,
2861 .flags
= FLAG_ADVANCED
| FLAG_SHARE
| FLAG_GLOBAL
,
2864 .label
= "mangling char",
2867 .ptr
= &sDefault
.magic_char
,
2870 .flags
= FLAG_ADVANCED
| FLAG_SHARE
| FLAG_GLOBAL
,
2873 .label
= "hide dot files",
2876 .ptr
= &sDefault
.bHideDotFiles
,
2879 .flags
= FLAG_ADVANCED
| FLAG_SHARE
| FLAG_GLOBAL
,
2882 .label
= "hide special files",
2885 .ptr
= &sDefault
.bHideSpecialFiles
,
2888 .flags
= FLAG_ADVANCED
| FLAG_SHARE
| FLAG_GLOBAL
,
2891 .label
= "hide unreadable",
2894 .ptr
= &sDefault
.bHideUnReadable
,
2897 .flags
= FLAG_ADVANCED
| FLAG_SHARE
| FLAG_GLOBAL
,
2900 .label
= "hide unwriteable files",
2903 .ptr
= &sDefault
.bHideUnWriteableFiles
,
2906 .flags
= FLAG_ADVANCED
| FLAG_SHARE
| FLAG_GLOBAL
,
2909 .label
= "delete veto files",
2912 .ptr
= &sDefault
.bDeleteVetoFiles
,
2915 .flags
= FLAG_ADVANCED
| FLAG_SHARE
| FLAG_GLOBAL
,
2918 .label
= "veto files",
2921 .ptr
= &sDefault
.szVetoFiles
,
2924 .flags
= FLAG_ADVANCED
| FLAG_SHARE
| FLAG_GLOBAL
,
2927 .label
= "hide files",
2930 .ptr
= &sDefault
.szHideFiles
,
2933 .flags
= FLAG_ADVANCED
| FLAG_SHARE
| FLAG_GLOBAL
,
2936 .label
= "veto oplock files",
2939 .ptr
= &sDefault
.szVetoOplockFiles
,
2942 .flags
= FLAG_ADVANCED
| FLAG_SHARE
| FLAG_GLOBAL
,
2945 .label
= "map archive",
2948 .ptr
= &sDefault
.bMap_archive
,
2951 .flags
= FLAG_ADVANCED
| FLAG_SHARE
| FLAG_GLOBAL
,
2954 .label
= "map hidden",
2957 .ptr
= &sDefault
.bMap_hidden
,
2960 .flags
= FLAG_ADVANCED
| FLAG_SHARE
| FLAG_GLOBAL
,
2963 .label
= "map system",
2966 .ptr
= &sDefault
.bMap_system
,
2969 .flags
= FLAG_ADVANCED
| FLAG_SHARE
| FLAG_GLOBAL
,
2972 .label
= "map readonly",
2975 .ptr
= &sDefault
.iMap_readonly
,
2977 .enum_list
= enum_map_readonly
,
2978 .flags
= FLAG_ADVANCED
| FLAG_SHARE
| FLAG_GLOBAL
,
2981 .label
= "mangled names",
2984 .ptr
= &sDefault
.bMangledNames
,
2987 .flags
= FLAG_ADVANCED
| FLAG_SHARE
| FLAG_GLOBAL
,
2990 .label
= "max stat cache size",
2992 .p_class
= P_GLOBAL
,
2993 .ptr
= &Globals
.iMaxStatCacheSize
,
2996 .flags
= FLAG_ADVANCED
,
2999 .label
= "stat cache",
3001 .p_class
= P_GLOBAL
,
3002 .ptr
= &Globals
.bStatCache
,
3005 .flags
= FLAG_ADVANCED
,
3008 .label
= "store dos attributes",
3011 .ptr
= &sDefault
.bStoreDosAttributes
,
3014 .flags
= FLAG_ADVANCED
| FLAG_SHARE
| FLAG_GLOBAL
,
3017 .label
= "dmapi support",
3020 .ptr
= &sDefault
.bDmapiSupport
,
3023 .flags
= FLAG_ADVANCED
| FLAG_SHARE
| FLAG_GLOBAL
,
3027 {N_("Domain Options"), P_SEP
, P_SEPARATOR
},
3030 .label
= "machine password timeout",
3032 .p_class
= P_GLOBAL
,
3033 .ptr
= &Globals
.machine_password_timeout
,
3036 .flags
= FLAG_ADVANCED
| FLAG_WIZARD
,
3039 {N_("Logon Options"), P_SEP
, P_SEPARATOR
},
3042 .label
= "add user script",
3044 .p_class
= P_GLOBAL
,
3045 .ptr
= &Globals
.szAddUserScript
,
3048 .flags
= FLAG_ADVANCED
,
3051 .label
= "rename user script",
3053 .p_class
= P_GLOBAL
,
3054 .ptr
= &Globals
.szRenameUserScript
,
3057 .flags
= FLAG_ADVANCED
,
3060 .label
= "delete user script",
3062 .p_class
= P_GLOBAL
,
3063 .ptr
= &Globals
.szDelUserScript
,
3066 .flags
= FLAG_ADVANCED
,
3069 .label
= "add group script",
3071 .p_class
= P_GLOBAL
,
3072 .ptr
= &Globals
.szAddGroupScript
,
3075 .flags
= FLAG_ADVANCED
,
3078 .label
= "delete group script",
3080 .p_class
= P_GLOBAL
,
3081 .ptr
= &Globals
.szDelGroupScript
,
3084 .flags
= FLAG_ADVANCED
,
3087 .label
= "add user to group script",
3089 .p_class
= P_GLOBAL
,
3090 .ptr
= &Globals
.szAddUserToGroupScript
,
3093 .flags
= FLAG_ADVANCED
,
3096 .label
= "delete user from group script",
3098 .p_class
= P_GLOBAL
,
3099 .ptr
= &Globals
.szDelUserFromGroupScript
,
3102 .flags
= FLAG_ADVANCED
,
3105 .label
= "set primary group script",
3107 .p_class
= P_GLOBAL
,
3108 .ptr
= &Globals
.szSetPrimaryGroupScript
,
3111 .flags
= FLAG_ADVANCED
,
3114 .label
= "add machine script",
3116 .p_class
= P_GLOBAL
,
3117 .ptr
= &Globals
.szAddMachineScript
,
3120 .flags
= FLAG_ADVANCED
,
3123 .label
= "shutdown script",
3125 .p_class
= P_GLOBAL
,
3126 .ptr
= &Globals
.szShutdownScript
,
3129 .flags
= FLAG_ADVANCED
,
3132 .label
= "abort shutdown script",
3134 .p_class
= P_GLOBAL
,
3135 .ptr
= &Globals
.szAbortShutdownScript
,
3138 .flags
= FLAG_ADVANCED
,
3141 .label
= "username map script",
3143 .p_class
= P_GLOBAL
,
3144 .ptr
= &Globals
.szUsernameMapScript
,
3147 .flags
= FLAG_ADVANCED
,
3150 .label
= "logon script",
3152 .p_class
= P_GLOBAL
,
3153 .ptr
= &Globals
.szLogonScript
,
3156 .flags
= FLAG_ADVANCED
,
3159 .label
= "logon path",
3161 .p_class
= P_GLOBAL
,
3162 .ptr
= &Globals
.szLogonPath
,
3165 .flags
= FLAG_ADVANCED
,
3168 .label
= "logon drive",
3170 .p_class
= P_GLOBAL
,
3171 .ptr
= &Globals
.szLogonDrive
,
3174 .flags
= FLAG_ADVANCED
,
3177 .label
= "logon home",
3179 .p_class
= P_GLOBAL
,
3180 .ptr
= &Globals
.szLogonHome
,
3183 .flags
= FLAG_ADVANCED
,
3186 .label
= "domain logons",
3188 .p_class
= P_GLOBAL
,
3189 .ptr
= &Globals
.bDomainLogons
,
3192 .flags
= FLAG_ADVANCED
,
3195 {N_("Browse Options"), P_SEP
, P_SEPARATOR
},
3198 .label
= "os level",
3200 .p_class
= P_GLOBAL
,
3201 .ptr
= &Globals
.os_level
,
3204 .flags
= FLAG_BASIC
| FLAG_ADVANCED
,
3207 .label
= "lm announce",
3209 .p_class
= P_GLOBAL
,
3210 .ptr
= &Globals
.lm_announce
,
3212 .enum_list
= enum_bool_auto
,
3213 .flags
= FLAG_ADVANCED
,
3216 .label
= "lm interval",
3218 .p_class
= P_GLOBAL
,
3219 .ptr
= &Globals
.lm_interval
,
3222 .flags
= FLAG_ADVANCED
,
3225 .label
= "preferred master",
3227 .p_class
= P_GLOBAL
,
3228 .ptr
= &Globals
.iPreferredMaster
,
3230 .enum_list
= enum_bool_auto
,
3231 .flags
= FLAG_BASIC
| FLAG_ADVANCED
,
3234 .label
= "prefered master",
3236 .p_class
= P_GLOBAL
,
3237 .ptr
= &Globals
.iPreferredMaster
,
3239 .enum_list
= enum_bool_auto
,
3243 .label
= "local master",
3245 .p_class
= P_GLOBAL
,
3246 .ptr
= &Globals
.bLocalMaster
,
3249 .flags
= FLAG_BASIC
| FLAG_ADVANCED
,
3252 .label
= "domain master",
3254 .p_class
= P_GLOBAL
,
3255 .ptr
= &Globals
.iDomainMaster
,
3257 .enum_list
= enum_bool_auto
,
3258 .flags
= FLAG_BASIC
| FLAG_ADVANCED
,
3261 .label
= "browse list",
3263 .p_class
= P_GLOBAL
,
3264 .ptr
= &Globals
.bBrowseList
,
3267 .flags
= FLAG_ADVANCED
,
3270 .label
= "browseable",
3273 .ptr
= &sDefault
.bBrowseable
,
3276 .flags
= FLAG_BASIC
| FLAG_ADVANCED
| FLAG_SHARE
| FLAG_PRINT
,
3279 .label
= "browsable",
3282 .ptr
= &sDefault
.bBrowseable
,
3288 .label
= "enhanced browsing",
3290 .p_class
= P_GLOBAL
,
3291 .ptr
= &Globals
.enhanced_browsing
,
3294 .flags
= FLAG_ADVANCED
,
3297 {N_("WINS Options"), P_SEP
, P_SEPARATOR
},
3300 .label
= "dns proxy",
3302 .p_class
= P_GLOBAL
,
3303 .ptr
= &Globals
.bDNSproxy
,
3306 .flags
= FLAG_ADVANCED
,
3309 .label
= "wins proxy",
3311 .p_class
= P_GLOBAL
,
3312 .ptr
= &Globals
.bWINSproxy
,
3315 .flags
= FLAG_ADVANCED
,
3318 .label
= "wins server",
3320 .p_class
= P_GLOBAL
,
3321 .ptr
= &Globals
.szWINSservers
,
3324 .flags
= FLAG_BASIC
| FLAG_ADVANCED
| FLAG_WIZARD
,
3327 .label
= "wins support",
3329 .p_class
= P_GLOBAL
,
3330 .ptr
= &Globals
.bWINSsupport
,
3333 .flags
= FLAG_BASIC
| FLAG_ADVANCED
| FLAG_WIZARD
,
3336 .label
= "wins hook",
3338 .p_class
= P_GLOBAL
,
3339 .ptr
= &Globals
.szWINSHook
,
3342 .flags
= FLAG_ADVANCED
,
3345 {N_("Locking Options"), P_SEP
, P_SEPARATOR
},
3348 .label
= "blocking locks",
3351 .ptr
= &sDefault
.bBlockingLocks
,
3354 .flags
= FLAG_ADVANCED
| FLAG_SHARE
| FLAG_GLOBAL
,
3357 .label
= "csc policy",
3360 .ptr
= &sDefault
.iCSCPolicy
,
3362 .enum_list
= enum_csc_policy
,
3363 .flags
= FLAG_ADVANCED
| FLAG_SHARE
| FLAG_GLOBAL
,
3366 .label
= "fake oplocks",
3369 .ptr
= &sDefault
.bFakeOplocks
,
3372 .flags
= FLAG_ADVANCED
| FLAG_SHARE
,
3375 .label
= "kernel oplocks",
3377 .p_class
= P_GLOBAL
,
3378 .ptr
= &Globals
.bKernelOplocks
,
3381 .flags
= FLAG_ADVANCED
| FLAG_GLOBAL
,
3387 .ptr
= &sDefault
.bLocking
,
3390 .flags
= FLAG_ADVANCED
| FLAG_SHARE
| FLAG_GLOBAL
,
3393 .label
= "lock spin time",
3395 .p_class
= P_GLOBAL
,
3396 .ptr
= &Globals
.iLockSpinTime
,
3399 .flags
= FLAG_ADVANCED
| FLAG_GLOBAL
,
3405 .ptr
= &sDefault
.bOpLocks
,
3408 .flags
= FLAG_ADVANCED
| FLAG_SHARE
| FLAG_GLOBAL
,
3411 .label
= "level2 oplocks",
3414 .ptr
= &sDefault
.bLevel2OpLocks
,
3417 .flags
= FLAG_ADVANCED
| FLAG_SHARE
| FLAG_GLOBAL
,
3420 .label
= "oplock break wait time",
3422 .p_class
= P_GLOBAL
,
3423 .ptr
= &Globals
.oplock_break_wait_time
,
3426 .flags
= FLAG_ADVANCED
| FLAG_GLOBAL
,
3429 .label
= "oplock contention limit",
3432 .ptr
= &sDefault
.iOplockContentionLimit
,
3435 .flags
= FLAG_ADVANCED
| FLAG_SHARE
| FLAG_GLOBAL
,
3438 .label
= "posix locking",
3441 .ptr
= &sDefault
.bPosixLocking
,
3444 .flags
= FLAG_ADVANCED
| FLAG_SHARE
| FLAG_GLOBAL
,
3447 .label
= "strict locking",
3450 .ptr
= &sDefault
.iStrictLocking
,
3452 .enum_list
= enum_bool_auto
,
3453 .flags
= FLAG_ADVANCED
| FLAG_SHARE
| FLAG_GLOBAL
,
3456 .label
= "share modes",
3459 .ptr
= &sDefault
.bShareModes
,
3462 .flags
= FLAG_ADVANCED
| FLAG_SHARE
| FLAG_GLOBAL
,
3465 {N_("Ldap Options"), P_SEP
, P_SEPARATOR
},
3468 .label
= "ldap admin dn",
3470 .p_class
= P_GLOBAL
,
3471 .ptr
= &Globals
.szLdapAdminDn
,
3474 .flags
= FLAG_ADVANCED
,
3477 .label
= "ldap delete dn",
3479 .p_class
= P_GLOBAL
,
3480 .ptr
= &Globals
.ldap_delete_dn
,
3483 .flags
= FLAG_ADVANCED
,
3486 .label
= "ldap group suffix",
3488 .p_class
= P_GLOBAL
,
3489 .ptr
= &Globals
.szLdapGroupSuffix
,
3492 .flags
= FLAG_ADVANCED
,
3495 .label
= "ldap idmap suffix",
3497 .p_class
= P_GLOBAL
,
3498 .ptr
= &Globals
.szLdapIdmapSuffix
,
3501 .flags
= FLAG_ADVANCED
,
3504 .label
= "ldap machine suffix",
3506 .p_class
= P_GLOBAL
,
3507 .ptr
= &Globals
.szLdapMachineSuffix
,
3510 .flags
= FLAG_ADVANCED
,
3513 .label
= "ldap passwd sync",
3515 .p_class
= P_GLOBAL
,
3516 .ptr
= &Globals
.ldap_passwd_sync
,
3518 .enum_list
= enum_ldap_passwd_sync
,
3519 .flags
= FLAG_ADVANCED
,
3522 .label
= "ldap password sync",
3524 .p_class
= P_GLOBAL
,
3525 .ptr
= &Globals
.ldap_passwd_sync
,
3527 .enum_list
= enum_ldap_passwd_sync
,
3531 .label
= "ldap replication sleep",
3533 .p_class
= P_GLOBAL
,
3534 .ptr
= &Globals
.ldap_replication_sleep
,
3537 .flags
= FLAG_ADVANCED
,
3540 .label
= "ldap suffix",
3542 .p_class
= P_GLOBAL
,
3543 .ptr
= &Globals
.szLdapSuffix
,
3546 .flags
= FLAG_ADVANCED
,
3549 .label
= "ldap ssl",
3551 .p_class
= P_GLOBAL
,
3552 .ptr
= &Globals
.ldap_ssl
,
3554 .enum_list
= enum_ldap_ssl
,
3555 .flags
= FLAG_ADVANCED
,
3558 .label
= "ldap timeout",
3560 .p_class
= P_GLOBAL
,
3561 .ptr
= &Globals
.ldap_timeout
,
3564 .flags
= FLAG_ADVANCED
,
3567 .label
= "ldap connection timeout",
3569 .p_class
= P_GLOBAL
,
3570 .ptr
= &Globals
.ldap_connection_timeout
,
3573 .flags
= FLAG_ADVANCED
,
3576 .label
= "ldap page size",
3578 .p_class
= P_GLOBAL
,
3579 .ptr
= &Globals
.ldap_page_size
,
3582 .flags
= FLAG_ADVANCED
,
3585 .label
= "ldap user suffix",
3587 .p_class
= P_GLOBAL
,
3588 .ptr
= &Globals
.szLdapUserSuffix
,
3591 .flags
= FLAG_ADVANCED
,
3594 .label
= "ldap debug level",
3596 .p_class
= P_GLOBAL
,
3597 .ptr
= &Globals
.ldap_debug_level
,
3598 .special
= handle_ldap_debug_level
,
3600 .flags
= FLAG_ADVANCED
,
3603 .label
= "ldap debug threshold",
3605 .p_class
= P_GLOBAL
,
3606 .ptr
= &Globals
.ldap_debug_threshold
,
3609 .flags
= FLAG_ADVANCED
,
3612 {N_("EventLog Options"), P_SEP
, P_SEPARATOR
},
3615 .label
= "eventlog list",
3617 .p_class
= P_GLOBAL
,
3618 .ptr
= &Globals
.szEventLogs
,
3621 .flags
= FLAG_ADVANCED
| FLAG_GLOBAL
| FLAG_SHARE
,
3624 {N_("Miscellaneous Options"), P_SEP
, P_SEPARATOR
},
3627 .label
= "add share command",
3629 .p_class
= P_GLOBAL
,
3630 .ptr
= &Globals
.szAddShareCommand
,
3633 .flags
= FLAG_ADVANCED
,
3636 .label
= "change share command",
3638 .p_class
= P_GLOBAL
,
3639 .ptr
= &Globals
.szChangeShareCommand
,
3642 .flags
= FLAG_ADVANCED
,
3645 .label
= "delete share command",
3647 .p_class
= P_GLOBAL
,
3648 .ptr
= &Globals
.szDeleteShareCommand
,
3651 .flags
= FLAG_ADVANCED
,
3654 .label
= "config file",
3656 .p_class
= P_GLOBAL
,
3657 .ptr
= &Globals
.szConfigFile
,
3665 .p_class
= P_GLOBAL
,
3666 .ptr
= &Globals
.szAutoServices
,
3669 .flags
= FLAG_ADVANCED
,
3672 .label
= "auto services",
3674 .p_class
= P_GLOBAL
,
3675 .ptr
= &Globals
.szAutoServices
,
3678 .flags
= FLAG_ADVANCED
,
3681 .label
= "lock directory",
3683 .p_class
= P_GLOBAL
,
3684 .ptr
= &Globals
.szLockDir
,
3687 .flags
= FLAG_ADVANCED
,
3690 .label
= "lock dir",
3692 .p_class
= P_GLOBAL
,
3693 .ptr
= &Globals
.szLockDir
,
3699 .label
= "pid directory",
3701 .p_class
= P_GLOBAL
,
3702 .ptr
= &Globals
.szPidDir
,
3705 .flags
= FLAG_ADVANCED
,
3709 .label
= "utmp directory",
3711 .p_class
= P_GLOBAL
,
3712 .ptr
= &Globals
.szUtmpDir
,
3715 .flags
= FLAG_ADVANCED
,
3718 .label
= "wtmp directory",
3720 .p_class
= P_GLOBAL
,
3721 .ptr
= &Globals
.szWtmpDir
,
3724 .flags
= FLAG_ADVANCED
,
3729 .p_class
= P_GLOBAL
,
3730 .ptr
= &Globals
.bUtmp
,
3733 .flags
= FLAG_ADVANCED
,
3737 .label
= "default service",
3739 .p_class
= P_GLOBAL
,
3740 .ptr
= &Globals
.szDefaultService
,
3743 .flags
= FLAG_ADVANCED
,
3748 .p_class
= P_GLOBAL
,
3749 .ptr
= &Globals
.szDefaultService
,
3752 .flags
= FLAG_ADVANCED
,
3755 .label
= "message command",
3757 .p_class
= P_GLOBAL
,
3758 .ptr
= &Globals
.szMsgCommand
,
3761 .flags
= FLAG_ADVANCED
,
3764 .label
= "dfree cache time",
3767 .ptr
= &sDefault
.iDfreeCacheTime
,
3770 .flags
= FLAG_ADVANCED
,
3773 .label
= "dfree command",
3776 .ptr
= &sDefault
.szDfree
,
3779 .flags
= FLAG_ADVANCED
,
3782 .label
= "get quota command",
3784 .p_class
= P_GLOBAL
,
3785 .ptr
= &Globals
.szGetQuota
,
3788 .flags
= FLAG_ADVANCED
,
3791 .label
= "set quota command",
3793 .p_class
= P_GLOBAL
,
3794 .ptr
= &Globals
.szSetQuota
,
3797 .flags
= FLAG_ADVANCED
,
3800 .label
= "remote announce",
3802 .p_class
= P_GLOBAL
,
3803 .ptr
= &Globals
.szRemoteAnnounce
,
3806 .flags
= FLAG_ADVANCED
,
3809 .label
= "remote browse sync",
3811 .p_class
= P_GLOBAL
,
3812 .ptr
= &Globals
.szRemoteBrowseSync
,
3815 .flags
= FLAG_ADVANCED
,
3818 .label
= "socket address",
3820 .p_class
= P_GLOBAL
,
3821 .ptr
= &Globals
.szSocketAddress
,
3824 .flags
= FLAG_ADVANCED
,
3827 .label
= "homedir map",
3829 .p_class
= P_GLOBAL
,
3830 .ptr
= &Globals
.szNISHomeMapName
,
3833 .flags
= FLAG_ADVANCED
,
3836 .label
= "afs username map",
3838 .p_class
= P_GLOBAL
,
3839 .ptr
= &Globals
.szAfsUsernameMap
,
3842 .flags
= FLAG_ADVANCED
,
3845 .label
= "afs token lifetime",
3847 .p_class
= P_GLOBAL
,
3848 .ptr
= &Globals
.iAfsTokenLifetime
,
3851 .flags
= FLAG_ADVANCED
,
3854 .label
= "log nt token command",
3856 .p_class
= P_GLOBAL
,
3857 .ptr
= &Globals
.szLogNtTokenCommand
,
3860 .flags
= FLAG_ADVANCED
,
3863 .label
= "time offset",
3865 .p_class
= P_GLOBAL
,
3866 .ptr
= &extra_time_offset
,
3869 .flags
= FLAG_ADVANCED
,
3872 .label
= "NIS homedir",
3874 .p_class
= P_GLOBAL
,
3875 .ptr
= &Globals
.bNISHomeMap
,
3878 .flags
= FLAG_ADVANCED
,
3884 .ptr
= &sDefault
.valid
,
3893 .ptr
= &sDefault
.szCopy
,
3894 .special
= handle_copy
,
3902 .ptr
= &sDefault
.szInclude
,
3903 .special
= handle_include
,
3911 .ptr
= &sDefault
.szPreExec
,
3914 .flags
= FLAG_ADVANCED
| FLAG_SHARE
| FLAG_PRINT
,
3920 .ptr
= &sDefault
.szPreExec
,
3923 .flags
= FLAG_ADVANCED
,
3926 .label
= "preexec close",
3929 .ptr
= &sDefault
.bPreexecClose
,
3932 .flags
= FLAG_ADVANCED
| FLAG_SHARE
,
3935 .label
= "postexec",
3938 .ptr
= &sDefault
.szPostExec
,
3941 .flags
= FLAG_ADVANCED
| FLAG_SHARE
| FLAG_PRINT
,
3944 .label
= "root preexec",
3947 .ptr
= &sDefault
.szRootPreExec
,
3950 .flags
= FLAG_ADVANCED
| FLAG_SHARE
| FLAG_PRINT
,
3953 .label
= "root preexec close",
3956 .ptr
= &sDefault
.bRootpreexecClose
,
3959 .flags
= FLAG_ADVANCED
| FLAG_SHARE
,
3962 .label
= "root postexec",
3965 .ptr
= &sDefault
.szRootPostExec
,
3968 .flags
= FLAG_ADVANCED
| FLAG_SHARE
| FLAG_PRINT
,
3971 .label
= "available",
3974 .ptr
= &sDefault
.bAvailable
,
3977 .flags
= FLAG_BASIC
| FLAG_ADVANCED
| FLAG_SHARE
| FLAG_PRINT
,
3980 .label
= "registry shares",
3982 .p_class
= P_GLOBAL
,
3983 .ptr
= &Globals
.bRegistryShares
,
3986 .flags
= FLAG_ADVANCED
,
3989 .label
= "usershare allow guests",
3991 .p_class
= P_GLOBAL
,
3992 .ptr
= &Globals
.bUsershareAllowGuests
,
3995 .flags
= FLAG_ADVANCED
,
3998 .label
= "usershare max shares",
4000 .p_class
= P_GLOBAL
,
4001 .ptr
= &Globals
.iUsershareMaxShares
,
4004 .flags
= FLAG_ADVANCED
,
4007 .label
= "usershare owner only",
4009 .p_class
= P_GLOBAL
,
4010 .ptr
= &Globals
.bUsershareOwnerOnly
,
4013 .flags
= FLAG_ADVANCED
,
4016 .label
= "usershare path",
4018 .p_class
= P_GLOBAL
,
4019 .ptr
= &Globals
.szUsersharePath
,
4022 .flags
= FLAG_ADVANCED
,
4025 .label
= "usershare prefix allow list",
4027 .p_class
= P_GLOBAL
,
4028 .ptr
= &Globals
.szUsersharePrefixAllowList
,
4031 .flags
= FLAG_ADVANCED
,
4034 .label
= "usershare prefix deny list",
4036 .p_class
= P_GLOBAL
,
4037 .ptr
= &Globals
.szUsersharePrefixDenyList
,
4040 .flags
= FLAG_ADVANCED
,
4043 .label
= "usershare template share",
4045 .p_class
= P_GLOBAL
,
4046 .ptr
= &Globals
.szUsershareTemplateShare
,
4049 .flags
= FLAG_ADVANCED
,
4055 .ptr
= &sDefault
.volume
,
4058 .flags
= FLAG_ADVANCED
| FLAG_SHARE
,
4064 .ptr
= &sDefault
.fstype
,
4067 .flags
= FLAG_ADVANCED
| FLAG_SHARE
,
4070 .label
= "set directory",
4073 .ptr
= &sDefault
.bNo_set_dir
,
4076 .flags
= FLAG_ADVANCED
| FLAG_SHARE
,
4079 .label
= "wide links",
4082 .ptr
= &sDefault
.bWidelinks
,
4085 .flags
= FLAG_ADVANCED
| FLAG_SHARE
| FLAG_GLOBAL
,
4088 .label
= "follow symlinks",
4091 .ptr
= &sDefault
.bSymlinks
,
4094 .flags
= FLAG_ADVANCED
| FLAG_SHARE
| FLAG_GLOBAL
,
4097 .label
= "dont descend",
4100 .ptr
= &sDefault
.szDontdescend
,
4103 .flags
= FLAG_ADVANCED
| FLAG_SHARE
,
4106 .label
= "magic script",
4109 .ptr
= &sDefault
.szMagicScript
,
4112 .flags
= FLAG_ADVANCED
| FLAG_SHARE
,
4115 .label
= "magic output",
4118 .ptr
= &sDefault
.szMagicOutput
,
4121 .flags
= FLAG_ADVANCED
| FLAG_SHARE
,
4124 .label
= "delete readonly",
4127 .ptr
= &sDefault
.bDeleteReadonly
,
4130 .flags
= FLAG_ADVANCED
| FLAG_SHARE
| FLAG_GLOBAL
,
4133 .label
= "dos filemode",
4136 .ptr
= &sDefault
.bDosFilemode
,
4139 .flags
= FLAG_ADVANCED
| FLAG_SHARE
| FLAG_GLOBAL
,
4142 .label
= "dos filetimes",
4145 .ptr
= &sDefault
.bDosFiletimes
,
4148 .flags
= FLAG_ADVANCED
| FLAG_SHARE
| FLAG_GLOBAL
,
4151 .label
= "dos filetime resolution",
4154 .ptr
= &sDefault
.bDosFiletimeResolution
,
4157 .flags
= FLAG_ADVANCED
| FLAG_SHARE
| FLAG_GLOBAL
,
4160 .label
= "fake directory create times",
4163 .ptr
= &sDefault
.bFakeDirCreateTimes
,
4166 .flags
= FLAG_ADVANCED
| FLAG_SHARE
| FLAG_GLOBAL
,
4169 .label
= "panic action",
4171 .p_class
= P_GLOBAL
,
4172 .ptr
= &Globals
.szPanicAction
,
4175 .flags
= FLAG_ADVANCED
,
4178 {N_("VFS module options"), P_SEP
, P_SEPARATOR
},
4181 .label
= "vfs objects",
4184 .ptr
= &sDefault
.szVfsObjects
,
4187 .flags
= FLAG_ADVANCED
| FLAG_SHARE
,
4190 .label
= "vfs object",
4193 .ptr
= &sDefault
.szVfsObjects
,
4200 {N_("MSDFS options"), P_SEP
, P_SEPARATOR
},
4203 .label
= "msdfs root",
4206 .ptr
= &sDefault
.bMSDfsRoot
,
4209 .flags
= FLAG_ADVANCED
| FLAG_SHARE
,
4212 .label
= "msdfs proxy",
4215 .ptr
= &sDefault
.szMSDfsProxy
,
4218 .flags
= FLAG_ADVANCED
| FLAG_SHARE
,
4221 .label
= "host msdfs",
4223 .p_class
= P_GLOBAL
,
4224 .ptr
= &Globals
.bHostMSDfs
,
4227 .flags
= FLAG_ADVANCED
,
4230 {N_("Winbind options"), P_SEP
, P_SEPARATOR
},
4233 .label
= "passdb expand explicit",
4235 .p_class
= P_GLOBAL
,
4236 .ptr
= &Globals
.bPassdbExpandExplicit
,
4239 .flags
= FLAG_ADVANCED
,
4242 .label
= "idmap domains",
4244 .p_class
= P_GLOBAL
,
4245 .ptr
= &Globals
.szIdmapDomains
,
4248 .flags
= FLAG_ADVANCED
,
4251 .label
= "idmap backend",
4253 .p_class
= P_GLOBAL
,
4254 .ptr
= &Globals
.szIdmapBackend
,
4257 .flags
= FLAG_ADVANCED
,
4260 .label
= "idmap alloc backend",
4262 .p_class
= P_GLOBAL
,
4263 .ptr
= &Globals
.szIdmapAllocBackend
,
4266 .flags
= FLAG_ADVANCED
,
4269 .label
= "idmap cache time",
4271 .p_class
= P_GLOBAL
,
4272 .ptr
= &Globals
.iIdmapCacheTime
,
4275 .flags
= FLAG_ADVANCED
,
4278 .label
= "idmap negative cache time",
4280 .p_class
= P_GLOBAL
,
4281 .ptr
= &Globals
.iIdmapNegativeCacheTime
,
4284 .flags
= FLAG_ADVANCED
,
4287 .label
= "idmap uid",
4289 .p_class
= P_GLOBAL
,
4290 .ptr
= &Globals
.szIdmapUID
,
4291 .special
= handle_idmap_uid
,
4293 .flags
= FLAG_ADVANCED
,
4296 .label
= "winbind uid",
4298 .p_class
= P_GLOBAL
,
4299 .ptr
= &Globals
.szIdmapUID
,
4300 .special
= handle_idmap_uid
,
4305 .label
= "idmap gid",
4307 .p_class
= P_GLOBAL
,
4308 .ptr
= &Globals
.szIdmapGID
,
4309 .special
= handle_idmap_gid
,
4311 .flags
= FLAG_ADVANCED
,
4314 .label
= "winbind gid",
4316 .p_class
= P_GLOBAL
,
4317 .ptr
= &Globals
.szIdmapGID
,
4318 .special
= handle_idmap_gid
,
4323 .label
= "template homedir",
4325 .p_class
= P_GLOBAL
,
4326 .ptr
= &Globals
.szTemplateHomedir
,
4329 .flags
= FLAG_ADVANCED
,
4332 .label
= "template shell",
4334 .p_class
= P_GLOBAL
,
4335 .ptr
= &Globals
.szTemplateShell
,
4338 .flags
= FLAG_ADVANCED
,
4341 .label
= "winbind separator",
4343 .p_class
= P_GLOBAL
,
4344 .ptr
= &Globals
.szWinbindSeparator
,
4347 .flags
= FLAG_ADVANCED
,
4350 .label
= "winbind cache time",
4352 .p_class
= P_GLOBAL
,
4353 .ptr
= &Globals
.winbind_cache_time
,
4356 .flags
= FLAG_ADVANCED
,
4359 .label
= "winbind enum users",
4361 .p_class
= P_GLOBAL
,
4362 .ptr
= &Globals
.bWinbindEnumUsers
,
4365 .flags
= FLAG_ADVANCED
,
4368 .label
= "winbind enum groups",
4370 .p_class
= P_GLOBAL
,
4371 .ptr
= &Globals
.bWinbindEnumGroups
,
4374 .flags
= FLAG_ADVANCED
,
4377 .label
= "winbind use default domain",
4379 .p_class
= P_GLOBAL
,
4380 .ptr
= &Globals
.bWinbindUseDefaultDomain
,
4383 .flags
= FLAG_ADVANCED
,
4386 .label
= "winbind trusted domains only",
4388 .p_class
= P_GLOBAL
,
4389 .ptr
= &Globals
.bWinbindTrustedDomainsOnly
,
4392 .flags
= FLAG_ADVANCED
,
4395 .label
= "winbind nested groups",
4397 .p_class
= P_GLOBAL
,
4398 .ptr
= &Globals
.bWinbindNestedGroups
,
4401 .flags
= FLAG_ADVANCED
,
4404 .label
= "winbind expand groups",
4406 .p_class
= P_GLOBAL
,
4407 .ptr
= &Globals
.winbind_expand_groups
,
4410 .flags
= FLAG_ADVANCED
,
4413 .label
= "winbind nss info",
4415 .p_class
= P_GLOBAL
,
4416 .ptr
= &Globals
.szWinbindNssInfo
,
4419 .flags
= FLAG_ADVANCED
,
4422 .label
= "winbind refresh tickets",
4424 .p_class
= P_GLOBAL
,
4425 .ptr
= &Globals
.bWinbindRefreshTickets
,
4428 .flags
= FLAG_ADVANCED
,
4431 .label
= "winbind offline logon",
4433 .p_class
= P_GLOBAL
,
4434 .ptr
= &Globals
.bWinbindOfflineLogon
,
4437 .flags
= FLAG_ADVANCED
,
4440 .label
= "winbind normalize names",
4442 .p_class
= P_GLOBAL
,
4443 .ptr
= &Globals
.bWinbindNormalizeNames
,
4446 .flags
= FLAG_ADVANCED
,
4449 .label
= "winbind rpc only",
4451 .p_class
= P_GLOBAL
,
4452 .ptr
= &Globals
.bWinbindRpcOnly
,
4455 .flags
= FLAG_ADVANCED
,
4458 {NULL
, P_BOOL
, P_NONE
, NULL
, NULL
, NULL
, 0}
4461 /***************************************************************************
4462 Initialise the sDefault parameter structure for the printer values.
4463 ***************************************************************************/
4465 static void init_printer_values(struct service
*pService
)
4467 /* choose defaults depending on the type of printing */
4468 switch (pService
->iPrinting
) {
4473 string_set(&pService
->szLpqcommand
, "lpq -P'%p'");
4474 string_set(&pService
->szLprmcommand
, "lprm -P'%p' %j");
4475 string_set(&pService
->szPrintcommand
, "lpr -r -P'%p' %s");
4480 string_set(&pService
->szLpqcommand
, "lpq -P'%p'");
4481 string_set(&pService
->szLprmcommand
, "lprm -P'%p' %j");
4482 string_set(&pService
->szPrintcommand
, "lpr -r -P'%p' %s");
4483 string_set(&pService
->szQueuepausecommand
, "lpc stop '%p'");
4484 string_set(&pService
->szQueueresumecommand
, "lpc start '%p'");
4485 string_set(&pService
->szLppausecommand
, "lpc hold '%p' %j");
4486 string_set(&pService
->szLpresumecommand
, "lpc release '%p' %j");
4492 /* set the lpq command to contain the destination printer
4493 name only. This is used by cups_queue_get() */
4494 string_set(&pService
->szLpqcommand
, "%p");
4495 string_set(&pService
->szLprmcommand
, "");
4496 string_set(&pService
->szPrintcommand
, "");
4497 string_set(&pService
->szLppausecommand
, "");
4498 string_set(&pService
->szLpresumecommand
, "");
4499 string_set(&pService
->szQueuepausecommand
, "");
4500 string_set(&pService
->szQueueresumecommand
, "");
4502 string_set(&pService
->szLpqcommand
, "lpq -P'%p'");
4503 string_set(&pService
->szLprmcommand
, "lprm -P'%p' %j");
4504 string_set(&pService
->szPrintcommand
, "lpr -P'%p' %s; rm %s");
4505 string_set(&pService
->szLppausecommand
, "lp -i '%p-%j' -H hold");
4506 string_set(&pService
->szLpresumecommand
, "lp -i '%p-%j' -H resume");
4507 string_set(&pService
->szQueuepausecommand
, "disable '%p'");
4508 string_set(&pService
->szQueueresumecommand
, "enable '%p'");
4509 #endif /* HAVE_CUPS */
4514 string_set(&pService
->szLpqcommand
, "lpstat -o%p");
4515 string_set(&pService
->szLprmcommand
, "cancel %p-%j");
4516 string_set(&pService
->szPrintcommand
, "lp -c -d%p %s; rm %s");
4517 string_set(&pService
->szQueuepausecommand
, "disable %p");
4518 string_set(&pService
->szQueueresumecommand
, "enable %p");
4520 string_set(&pService
->szLppausecommand
, "lp -i %p-%j -H hold");
4521 string_set(&pService
->szLpresumecommand
, "lp -i %p-%j -H resume");
4526 string_set(&pService
->szLpqcommand
, "lpq -P%p");
4527 string_set(&pService
->szLprmcommand
, "lprm -P%p %j");
4528 string_set(&pService
->szPrintcommand
, "lp -r -P%p %s");
4534 string_set(&pService
->szPrintcommand
, "vlp print %p %s");
4535 string_set(&pService
->szLpqcommand
, "vlp lpq %p");
4536 string_set(&pService
->szLprmcommand
, "vlp lprm %p %j");
4537 string_set(&pService
->szLppausecommand
, "vlp lppause %p %j");
4538 string_set(&pService
->szLpresumecommand
, "vlp lpresum %p %j");
4539 string_set(&pService
->szQueuepausecommand
, "vlp queuepause %p");
4540 string_set(&pService
->szQueueresumecommand
, "vlp queueresume %p");
4542 #endif /* DEVELOPER */
4547 /***************************************************************************
4548 Initialise the global parameter structure.
4549 ***************************************************************************/
4551 static void init_globals(bool first_time_only
)
4553 static bool done_init
= False
;
4557 /* If requested to initialize only once and we've already done it... */
4558 if (first_time_only
&& done_init
) {
4559 /* ... then we have nothing more to do */
4564 /* The logfile can be set before this is invoked. Free it if so. */
4565 if (Globals
.szLogFile
!= NULL
) {
4566 string_free(&Globals
.szLogFile
);
4567 Globals
.szLogFile
= NULL
;
4571 for (i
= 0; parm_table
[i
].label
; i
++) {
4572 if ((parm_table
[i
].type
== P_STRING
||
4573 parm_table
[i
].type
== P_USTRING
) &&
4576 string_free((char **)parm_table
[i
].ptr
);
4581 memset((void *)&Globals
, '\0', sizeof(Globals
));
4583 for (i
= 0; parm_table
[i
].label
; i
++) {
4584 if ((parm_table
[i
].type
== P_STRING
||
4585 parm_table
[i
].type
== P_USTRING
) &&
4588 string_set((char **)parm_table
[i
].ptr
, "");
4592 string_set(&sDefault
.fstype
, FSTYPE_STRING
);
4593 string_set(&sDefault
.szPrintjobUsername
, "%U");
4595 init_printer_values(&sDefault
);
4598 DEBUG(3, ("Initialising global parameters\n"));
4600 string_set(&Globals
.szSMBPasswdFile
, get_dyn_SMB_PASSWD_FILE());
4601 string_set(&Globals
.szPrivateDir
, get_dyn_PRIVATE_DIR());
4603 /* use the new 'hash2' method by default, with a prefix of 1 */
4604 string_set(&Globals
.szManglingMethod
, "hash2");
4605 Globals
.mangle_prefix
= 1;
4607 string_set(&Globals
.szGuestaccount
, GUEST_ACCOUNT
);
4609 /* using UTF8 by default allows us to support all chars */
4610 string_set(&Globals
.unix_charset
, DEFAULT_UNIX_CHARSET
);
4612 #if defined(HAVE_NL_LANGINFO) && defined(CODESET)
4613 /* If the system supports nl_langinfo(), try to grab the value
4614 from the user's locale */
4615 string_set(&Globals
.display_charset
, "LOCALE");
4617 string_set(&Globals
.display_charset
, DEFAULT_DISPLAY_CHARSET
);
4620 /* Use codepage 850 as a default for the dos character set */
4621 string_set(&Globals
.dos_charset
, DEFAULT_DOS_CHARSET
);
4624 * Allow the default PASSWD_CHAT to be overridden in local.h.
4626 string_set(&Globals
.szPasswdChat
, DEFAULT_PASSWD_CHAT
);
4628 set_global_myname(myhostname());
4629 string_set(&Globals
.szNetbiosName
,global_myname());
4631 set_global_myworkgroup(WORKGROUP
);
4632 string_set(&Globals
.szWorkgroup
, lp_workgroup());
4634 string_set(&Globals
.szPasswdProgram
, "");
4635 string_set(&Globals
.szPidDir
, get_dyn_PIDDIR());
4636 string_set(&Globals
.szLockDir
, get_dyn_LOCKDIR());
4637 string_set(&Globals
.szSocketAddress
, "0.0.0.0");
4639 if (asprintf(&s
, "Samba %s", SAMBA_VERSION_STRING
) < 0) {
4640 smb_panic("init_globals: ENOMEM");
4642 string_set(&Globals
.szServerString
, s
);
4644 if (asprintf(&s
, "%d.%d", DEFAULT_MAJOR_VERSION
,
4645 DEFAULT_MINOR_VERSION
) < 0) {
4646 smb_panic("init_globals: ENOMEM");
4648 string_set(&Globals
.szAnnounceVersion
, s
);
4651 string_set(&Globals
.szPanicAction
, "/bin/sleep 999999999");
4654 string_set(&Globals
.szSocketOptions
, DEFAULT_SOCKET_OPTIONS
);
4656 string_set(&Globals
.szLogonDrive
, "");
4657 /* %N is the NIS auto.home server if -DAUTOHOME is used, else same as %L */
4658 string_set(&Globals
.szLogonHome
, "\\\\%N\\%U");
4659 string_set(&Globals
.szLogonPath
, "\\\\%N\\%U\\profile");
4661 string_set(&Globals
.szNameResolveOrder
, "lmhosts wins host bcast");
4662 string_set(&Globals
.szPasswordServer
, "*");
4664 Globals
.AlgorithmicRidBase
= BASE_RID
;
4666 Globals
.bLoadPrinters
= True
;
4667 Globals
.PrintcapCacheTime
= 750; /* 12.5 minutes */
4669 Globals
.ConfigBackend
= config_backend
;
4671 /* Was 65535 (0xFFFF). 0x4101 matches W2K and causes major speed improvements... */
4672 /* Discovered by 2 days of pain by Don McCall @ HP :-). */
4673 Globals
.max_xmit
= 0x4104;
4674 Globals
.max_mux
= 50; /* This is *needed* for profile support. */
4675 Globals
.lpqcachetime
= 30; /* changed to handle large print servers better -- jerry */
4676 Globals
.bDisableSpoolss
= False
;
4677 Globals
.iMaxSmbdProcesses
= 0;/* no limit specified */
4678 Globals
.pwordlevel
= 0;
4679 Globals
.unamelevel
= 0;
4680 Globals
.deadtime
= 0;
4681 Globals
.getwd_cache
= true;
4682 Globals
.bLargeReadwrite
= True
;
4683 Globals
.max_log_size
= 5000;
4684 Globals
.max_open_files
= MAX_OPEN_FILES
;
4685 Globals
.open_files_db_hash_size
= SMB_OPEN_DATABASE_TDB_HASH_SIZE
;
4686 Globals
.maxprotocol
= PROTOCOL_NT1
;
4687 Globals
.minprotocol
= PROTOCOL_CORE
;
4688 Globals
.security
= SEC_USER
;
4689 Globals
.paranoid_server_security
= True
;
4690 Globals
.bEncryptPasswords
= True
;
4691 Globals
.bUpdateEncrypt
= False
;
4692 Globals
.clientSchannel
= Auto
;
4693 Globals
.serverSchannel
= Auto
;
4694 Globals
.bReadRaw
= True
;
4695 Globals
.bWriteRaw
= True
;
4696 Globals
.bNullPasswords
= False
;
4697 Globals
.bObeyPamRestrictions
= False
;
4699 Globals
.bSyslogOnly
= False
;
4700 Globals
.bTimestampLogs
= True
;
4701 string_set(&Globals
.szLogLevel
, "0");
4702 Globals
.bDebugPrefixTimestamp
= False
;
4703 Globals
.bDebugHiresTimestamp
= False
;
4704 Globals
.bDebugPid
= False
;
4705 Globals
.bDebugUid
= False
;
4706 Globals
.bDebugClass
= False
;
4707 Globals
.bEnableCoreFiles
= True
;
4708 Globals
.max_ttl
= 60 * 60 * 24 * 3; /* 3 days default. */
4709 Globals
.max_wins_ttl
= 60 * 60 * 24 * 6; /* 6 days default. */
4710 Globals
.min_wins_ttl
= 60 * 60 * 6; /* 6 hours default. */
4711 Globals
.machine_password_timeout
= 60 * 60 * 24 * 7; /* 7 days default. */
4712 Globals
.lm_announce
= 2; /* = Auto: send only if LM clients found */
4713 Globals
.lm_interval
= 60;
4714 Globals
.announce_as
= ANNOUNCE_AS_NT_SERVER
;
4715 #if (defined(HAVE_NETGROUP) && defined(WITH_AUTOMOUNT))
4716 Globals
.bNISHomeMap
= False
;
4717 #ifdef WITH_NISPLUS_HOME
4718 string_set(&Globals
.szNISHomeMapName
, "auto_home.org_dir");
4720 string_set(&Globals
.szNISHomeMapName
, "auto.home");
4723 Globals
.bTimeServer
= False
;
4724 Globals
.bBindInterfacesOnly
= False
;
4725 Globals
.bUnixPasswdSync
= False
;
4726 Globals
.bPamPasswordChange
= False
;
4727 Globals
.bPasswdChatDebug
= False
;
4728 Globals
.iPasswdChatTimeout
= 2; /* 2 second default. */
4729 Globals
.bNTPipeSupport
= True
; /* Do NT pipes by default. */
4730 Globals
.bNTStatusSupport
= True
; /* Use NT status by default. */
4731 Globals
.bStatCache
= True
; /* use stat cache by default */
4732 Globals
.iMaxStatCacheSize
= 256; /* 256k by default */
4733 Globals
.restrict_anonymous
= 0;
4734 Globals
.bClientLanManAuth
= False
; /* Do NOT use the LanMan hash if it is available */
4735 Globals
.bClientPlaintextAuth
= False
; /* Do NOT use a plaintext password even if is requested by the server */
4736 Globals
.bLanmanAuth
= False
; /* Do NOT use the LanMan hash, even if it is supplied */
4737 Globals
.bNTLMAuth
= True
; /* Do use NTLMv1 if it is supplied by the client (otherwise NTLMv2) */
4738 Globals
.bClientNTLMv2Auth
= False
; /* Client should not use NTLMv2, as we can't tell that the server supports it. */
4739 /* Note, that we will use NTLM2 session security (which is different), if it is available */
4741 Globals
.map_to_guest
= 0; /* By Default, "Never" */
4742 Globals
.oplock_break_wait_time
= 0; /* By Default, 0 msecs. */
4743 Globals
.enhanced_browsing
= true;
4744 Globals
.iLockSpinTime
= WINDOWS_MINIMUM_LOCK_TIMEOUT_MS
; /* msec. */
4745 #ifdef MMAP_BLACKLIST
4746 Globals
.bUseMmap
= False
;
4748 Globals
.bUseMmap
= True
;
4750 Globals
.bUnixExtensions
= True
;
4751 Globals
.bResetOnZeroVC
= False
;
4753 /* hostname lookups can be very expensive and are broken on
4754 a large number of sites (tridge) */
4755 Globals
.bHostnameLookups
= False
;
4757 string_set(&Globals
.szPassdbBackend
, "smbpasswd");
4758 string_set(&Globals
.szLdapSuffix
, "");
4759 string_set(&Globals
.szLdapMachineSuffix
, "");
4760 string_set(&Globals
.szLdapUserSuffix
, "");
4761 string_set(&Globals
.szLdapGroupSuffix
, "");
4762 string_set(&Globals
.szLdapIdmapSuffix
, "");
4764 string_set(&Globals
.szLdapAdminDn
, "");
4765 Globals
.ldap_ssl
= LDAP_SSL_ON
;
4766 Globals
.ldap_passwd_sync
= LDAP_PASSWD_SYNC_OFF
;
4767 Globals
.ldap_delete_dn
= False
;
4768 Globals
.ldap_replication_sleep
= 1000; /* wait 1 sec for replication */
4769 Globals
.ldap_timeout
= LDAP_DEFAULT_TIMEOUT
;
4770 Globals
.ldap_connection_timeout
= LDAP_CONNECTION_DEFAULT_TIMEOUT
;
4771 Globals
.ldap_page_size
= LDAP_PAGE_SIZE
;
4773 Globals
.ldap_debug_level
= 0;
4774 Globals
.ldap_debug_threshold
= 10;
4776 /* This is what we tell the afs client. in reality we set the token
4777 * to never expire, though, when this runs out the afs client will
4778 * forget the token. Set to 0 to get NEVERDATE.*/
4779 Globals
.iAfsTokenLifetime
= 604800;
4781 /* these parameters are set to defaults that are more appropriate
4782 for the increasing samba install base:
4784 as a member of the workgroup, that will possibly become a
4785 _local_ master browser (lm = True). this is opposed to a forced
4786 local master browser startup (pm = True).
4788 doesn't provide WINS server service by default (wsupp = False),
4789 and doesn't provide domain master browser services by default, either.
4793 Globals
.bMsAddPrinterWizard
= True
;
4794 Globals
.os_level
= 20;
4795 Globals
.bLocalMaster
= True
;
4796 Globals
.iDomainMaster
= Auto
; /* depending on bDomainLogons */
4797 Globals
.bDomainLogons
= False
;
4798 Globals
.bBrowseList
= True
;
4799 Globals
.bWINSsupport
= False
;
4800 Globals
.bWINSproxy
= False
;
4802 Globals
.bDNSproxy
= True
;
4804 /* this just means to use them if they exist */
4805 Globals
.bKernelOplocks
= True
;
4807 Globals
.bAllowTrustedDomains
= True
;
4809 string_set(&Globals
.szTemplateShell
, "/bin/false");
4810 string_set(&Globals
.szTemplateHomedir
, "/home/%D/%U");
4811 string_set(&Globals
.szWinbindSeparator
, "\\");
4813 string_set(&Globals
.szCupsServer
, "");
4814 string_set(&Globals
.szIPrintServer
, "");
4816 string_set(&Globals
.ctdbdSocket
, "");
4817 Globals
.szClusterAddresses
= NULL
;
4818 Globals
.clustering
= False
;
4820 Globals
.winbind_cache_time
= 300; /* 5 minutes */
4821 Globals
.bWinbindEnumUsers
= False
;
4822 Globals
.bWinbindEnumGroups
= False
;
4823 Globals
.bWinbindUseDefaultDomain
= False
;
4824 Globals
.bWinbindTrustedDomainsOnly
= False
;
4825 Globals
.bWinbindNestedGroups
= True
;
4826 Globals
.winbind_expand_groups
= 1;
4827 Globals
.szWinbindNssInfo
= str_list_make(NULL
, "template", NULL
);
4828 Globals
.bWinbindRefreshTickets
= False
;
4829 Globals
.bWinbindOfflineLogon
= False
;
4831 Globals
.iIdmapCacheTime
= 900; /* 15 minutes by default */
4832 Globals
.iIdmapNegativeCacheTime
= 120; /* 2 minutes by default */
4834 Globals
.bPassdbExpandExplicit
= False
;
4836 Globals
.name_cache_timeout
= 660; /* In seconds */
4838 Globals
.bUseSpnego
= True
;
4839 Globals
.bClientUseSpnego
= True
;
4841 Globals
.client_signing
= Auto
;
4842 Globals
.server_signing
= False
;
4844 Globals
.bDeferSharingViolations
= True
;
4845 string_set(&Globals
.smb_ports
, SMB_PORTS
);
4847 Globals
.bEnablePrivileges
= True
;
4848 Globals
.bHostMSDfs
= True
;
4849 Globals
.bASUSupport
= False
;
4851 /* User defined shares. */
4852 if (asprintf(&s
, "%s/usershares", get_dyn_STATEDIR()) < 0) {
4853 smb_panic("init_globals: ENOMEM");
4855 string_set(&Globals
.szUsersharePath
, s
);
4857 string_set(&Globals
.szUsershareTemplateShare
, "");
4858 Globals
.iUsershareMaxShares
= 0;
4859 /* By default disallow sharing of directories not owned by the sharer. */
4860 Globals
.bUsershareOwnerOnly
= True
;
4861 /* By default disallow guest access to usershares. */
4862 Globals
.bUsershareAllowGuests
= False
;
4864 Globals
.iKeepalive
= DEFAULT_KEEPALIVE
;
4866 /* By default no shares out of the registry */
4867 Globals
.bRegistryShares
= False
;
4869 Globals
.iminreceivefile
= 0;
4872 /*******************************************************************
4873 Convenience routine to grab string parameters into temporary memory
4874 and run standard_sub_basic on them. The buffers can be written to by
4875 callers without affecting the source string.
4876 ********************************************************************/
4878 static char *lp_string(const char *s
)
4881 TALLOC_CTX
*ctx
= talloc_tos();
4883 /* The follow debug is useful for tracking down memory problems
4884 especially if you have an inner loop that is calling a lp_*()
4885 function that returns a string. Perhaps this debug should be
4886 present all the time? */
4889 DEBUG(10, ("lp_string(%s)\n", s
));
4892 ret
= talloc_sub_basic(ctx
,
4893 get_current_username(),
4894 current_user_info
.domain
,
4896 if (trim_char(ret
, '\"', '\"')) {
4897 if (strchr(ret
,'\"') != NULL
) {
4899 ret
= talloc_sub_basic(ctx
,
4900 get_current_username(),
4901 current_user_info
.domain
,
4909 In this section all the functions that are used to access the
4910 parameters from the rest of the program are defined
4913 #define FN_GLOBAL_STRING(fn_name,ptr) \
4914 char *fn_name(void) {return(lp_string(*(char **)(ptr) ? *(char **)(ptr) : ""));}
4915 #define FN_GLOBAL_CONST_STRING(fn_name,ptr) \
4916 const char *fn_name(void) {return(*(const char **)(ptr) ? *(const char **)(ptr) : "");}
4917 #define FN_GLOBAL_LIST(fn_name,ptr) \
4918 const char **fn_name(void) {return(*(const char ***)(ptr));}
4919 #define FN_GLOBAL_BOOL(fn_name,ptr) \
4920 bool fn_name(void) {return(*(bool *)(ptr));}
4921 #define FN_GLOBAL_CHAR(fn_name,ptr) \
4922 char fn_name(void) {return(*(char *)(ptr));}
4923 #define FN_GLOBAL_INTEGER(fn_name,ptr) \
4924 int fn_name(void) {return(*(int *)(ptr));}
4926 #define FN_LOCAL_STRING(fn_name,val) \
4927 char *fn_name(int i) {return(lp_string((LP_SNUM_OK(i) && ServicePtrs[(i)]->val) ? ServicePtrs[(i)]->val : sDefault.val));}
4928 #define FN_LOCAL_CONST_STRING(fn_name,val) \
4929 const char *fn_name(int i) {return (const char *)((LP_SNUM_OK(i) && ServicePtrs[(i)]->val) ? ServicePtrs[(i)]->val : sDefault.val);}
4930 #define FN_LOCAL_LIST(fn_name,val) \
4931 const char **fn_name(int i) {return(const char **)(LP_SNUM_OK(i)? ServicePtrs[(i)]->val : sDefault.val);}
4932 #define FN_LOCAL_BOOL(fn_name,val) \
4933 bool fn_name(int i) {return(bool)(LP_SNUM_OK(i)? ServicePtrs[(i)]->val : sDefault.val);}
4934 #define FN_LOCAL_INTEGER(fn_name,val) \
4935 int fn_name(int i) {return(LP_SNUM_OK(i)? ServicePtrs[(i)]->val : sDefault.val);}
4937 #define FN_LOCAL_PARM_BOOL(fn_name,val) \
4938 bool fn_name(const struct share_params *p) {return(bool)(LP_SNUM_OK(p->service)? ServicePtrs[(p->service)]->val : sDefault.val);}
4939 #define FN_LOCAL_PARM_INTEGER(fn_name,val) \
4940 int fn_name(const struct share_params *p) {return(LP_SNUM_OK(p->service)? ServicePtrs[(p->service)]->val : sDefault.val);}
4941 #define FN_LOCAL_PARM_STRING(fn_name,val) \
4942 char *fn_name(const struct share_params *p) {return(lp_string((LP_SNUM_OK(p->service) && ServicePtrs[(p->service)]->val) ? ServicePtrs[(p->service)]->val : sDefault.val));}
4943 #define FN_LOCAL_CHAR(fn_name,val) \
4944 char fn_name(const struct share_params *p) {return(LP_SNUM_OK(p->service)? ServicePtrs[(p->service)]->val : sDefault.val);}
4946 FN_GLOBAL_STRING(lp_smb_ports
, &Globals
.smb_ports
)
4947 FN_GLOBAL_STRING(lp_dos_charset
, &Globals
.dos_charset
)
4948 FN_GLOBAL_STRING(lp_unix_charset
, &Globals
.unix_charset
)
4949 FN_GLOBAL_STRING(lp_display_charset
, &Globals
.display_charset
)
4950 FN_GLOBAL_STRING(lp_logfile
, &Globals
.szLogFile
)
4951 FN_GLOBAL_STRING(lp_configfile
, &Globals
.szConfigFile
)
4952 FN_GLOBAL_STRING(lp_smb_passwd_file
, &Globals
.szSMBPasswdFile
)
4953 FN_GLOBAL_STRING(lp_private_dir
, &Globals
.szPrivateDir
)
4954 FN_GLOBAL_STRING(lp_serverstring
, &Globals
.szServerString
)
4955 FN_GLOBAL_INTEGER(lp_printcap_cache_time
, &Globals
.PrintcapCacheTime
)
4956 FN_GLOBAL_STRING(lp_addport_cmd
, &Globals
.szAddPortCommand
)
4957 FN_GLOBAL_STRING(lp_enumports_cmd
, &Globals
.szEnumPortsCommand
)
4958 FN_GLOBAL_STRING(lp_addprinter_cmd
, &Globals
.szAddPrinterCommand
)
4959 FN_GLOBAL_STRING(lp_deleteprinter_cmd
, &Globals
.szDeletePrinterCommand
)
4960 FN_GLOBAL_STRING(lp_os2_driver_map
, &Globals
.szOs2DriverMap
)
4961 FN_GLOBAL_STRING(lp_lockdir
, &Globals
.szLockDir
)
4962 FN_GLOBAL_STRING(lp_piddir
, &Globals
.szPidDir
)
4963 FN_GLOBAL_STRING(lp_mangling_method
, &Globals
.szManglingMethod
)
4964 FN_GLOBAL_INTEGER(lp_mangle_prefix
, &Globals
.mangle_prefix
)
4965 FN_GLOBAL_STRING(lp_utmpdir
, &Globals
.szUtmpDir
)
4966 FN_GLOBAL_STRING(lp_wtmpdir
, &Globals
.szWtmpDir
)
4967 FN_GLOBAL_BOOL(lp_utmp
, &Globals
.bUtmp
)
4968 FN_GLOBAL_STRING(lp_rootdir
, &Globals
.szRootdir
)
4969 FN_GLOBAL_STRING(lp_defaultservice
, &Globals
.szDefaultService
)
4970 FN_GLOBAL_STRING(lp_msg_command
, &Globals
.szMsgCommand
)
4971 FN_GLOBAL_STRING(lp_get_quota_command
, &Globals
.szGetQuota
)
4972 FN_GLOBAL_STRING(lp_set_quota_command
, &Globals
.szSetQuota
)
4973 FN_GLOBAL_STRING(lp_auto_services
, &Globals
.szAutoServices
)
4974 FN_GLOBAL_STRING(lp_passwd_program
, &Globals
.szPasswdProgram
)
4975 FN_GLOBAL_STRING(lp_passwd_chat
, &Globals
.szPasswdChat
)
4976 FN_GLOBAL_STRING(lp_passwordserver
, &Globals
.szPasswordServer
)
4977 FN_GLOBAL_STRING(lp_name_resolve_order
, &Globals
.szNameResolveOrder
)
4978 FN_GLOBAL_STRING(lp_realm
, &Globals
.szRealm
)
4979 FN_GLOBAL_CONST_STRING(lp_afs_username_map
, &Globals
.szAfsUsernameMap
)
4980 FN_GLOBAL_INTEGER(lp_afs_token_lifetime
, &Globals
.iAfsTokenLifetime
)
4981 FN_GLOBAL_STRING(lp_log_nt_token_command
, &Globals
.szLogNtTokenCommand
)
4982 FN_GLOBAL_STRING(lp_username_map
, &Globals
.szUsernameMap
)
4983 FN_GLOBAL_CONST_STRING(lp_logon_script
, &Globals
.szLogonScript
)
4984 FN_GLOBAL_CONST_STRING(lp_logon_path
, &Globals
.szLogonPath
)
4985 FN_GLOBAL_CONST_STRING(lp_logon_drive
, &Globals
.szLogonDrive
)
4986 FN_GLOBAL_CONST_STRING(lp_logon_home
, &Globals
.szLogonHome
)
4987 FN_GLOBAL_STRING(lp_remote_announce
, &Globals
.szRemoteAnnounce
)
4988 FN_GLOBAL_STRING(lp_remote_browse_sync
, &Globals
.szRemoteBrowseSync
)
4989 FN_GLOBAL_LIST(lp_wins_server_list
, &Globals
.szWINSservers
)
4990 FN_GLOBAL_LIST(lp_interfaces
, &Globals
.szInterfaces
)
4991 FN_GLOBAL_STRING(lp_socket_address
, &Globals
.szSocketAddress
)
4992 FN_GLOBAL_STRING(lp_nis_home_map_name
, &Globals
.szNISHomeMapName
)
4993 static FN_GLOBAL_STRING(lp_announce_version
, &Globals
.szAnnounceVersion
)
4994 FN_GLOBAL_LIST(lp_netbios_aliases
, &Globals
.szNetbiosAliases
)
4995 /* FN_GLOBAL_STRING(lp_passdb_backend, &Globals.szPassdbBackend)
4996 * lp_passdb_backend() should be replace by the this macro again after
4999 const char *lp_passdb_backend(void)
5001 char *delim
, *quote
;
5003 delim
= strchr( Globals
.szPassdbBackend
, ' ');
5004 /* no space at all */
5005 if (delim
== NULL
) {
5009 quote
= strchr(Globals
.szPassdbBackend
, '"');
5010 /* no quote char or non in the first part */
5011 if (quote
== NULL
|| quote
> delim
) {
5016 quote
= strchr(quote
+1, '"');
5017 if (quote
== NULL
) {
5018 DEBUG(0, ("WARNING: Your 'passdb backend' configuration is invalid due to a missing second \" char.\n"));
5020 } else if (*(quote
+1) == '\0') {
5021 /* space, fitting quote char, and one backend only */
5024 /* terminate string after the fitting quote char */
5029 DEBUG(0, ("WARNING: Your 'passdb backend' configuration includes multiple backends. This\n"
5030 "is deprecated since Samba 3.0.23. Please check WHATSNEW.txt or the section 'Passdb\n"
5031 "Changes' from the ChangeNotes as part of the Samba HOWTO collection. Only the first\n"
5032 "backend (%s) is used. The rest is ignored.\n", Globals
.szPassdbBackend
));
5035 return Globals
.szPassdbBackend
;
5037 FN_GLOBAL_LIST(lp_preload_modules
, &Globals
.szPreloadModules
)
5038 FN_GLOBAL_STRING(lp_panic_action
, &Globals
.szPanicAction
)
5039 FN_GLOBAL_STRING(lp_adduser_script
, &Globals
.szAddUserScript
)
5040 FN_GLOBAL_STRING(lp_renameuser_script
, &Globals
.szRenameUserScript
)
5041 FN_GLOBAL_STRING(lp_deluser_script
, &Globals
.szDelUserScript
)
5043 FN_GLOBAL_CONST_STRING(lp_guestaccount
, &Globals
.szGuestaccount
)
5044 FN_GLOBAL_STRING(lp_addgroup_script
, &Globals
.szAddGroupScript
)
5045 FN_GLOBAL_STRING(lp_delgroup_script
, &Globals
.szDelGroupScript
)
5046 FN_GLOBAL_STRING(lp_addusertogroup_script
, &Globals
.szAddUserToGroupScript
)
5047 FN_GLOBAL_STRING(lp_deluserfromgroup_script
, &Globals
.szDelUserFromGroupScript
)
5048 FN_GLOBAL_STRING(lp_setprimarygroup_script
, &Globals
.szSetPrimaryGroupScript
)
5050 FN_GLOBAL_STRING(lp_addmachine_script
, &Globals
.szAddMachineScript
)
5052 FN_GLOBAL_STRING(lp_shutdown_script
, &Globals
.szShutdownScript
)
5053 FN_GLOBAL_STRING(lp_abort_shutdown_script
, &Globals
.szAbortShutdownScript
)
5054 FN_GLOBAL_STRING(lp_username_map_script
, &Globals
.szUsernameMapScript
)
5056 FN_GLOBAL_STRING(lp_check_password_script
, &Globals
.szCheckPasswordScript
)
5058 FN_GLOBAL_STRING(lp_wins_hook
, &Globals
.szWINSHook
)
5059 FN_GLOBAL_CONST_STRING(lp_template_homedir
, &Globals
.szTemplateHomedir
)
5060 FN_GLOBAL_CONST_STRING(lp_template_shell
, &Globals
.szTemplateShell
)
5061 FN_GLOBAL_CONST_STRING(lp_winbind_separator
, &Globals
.szWinbindSeparator
)
5062 FN_GLOBAL_INTEGER(lp_acl_compatibility
, &Globals
.iAclCompat
)
5063 FN_GLOBAL_BOOL(lp_winbind_enum_users
, &Globals
.bWinbindEnumUsers
)
5064 FN_GLOBAL_BOOL(lp_winbind_enum_groups
, &Globals
.bWinbindEnumGroups
)
5065 FN_GLOBAL_BOOL(lp_winbind_use_default_domain
, &Globals
.bWinbindUseDefaultDomain
)
5066 FN_GLOBAL_BOOL(lp_winbind_trusted_domains_only
, &Globals
.bWinbindTrustedDomainsOnly
)
5067 FN_GLOBAL_BOOL(lp_winbind_nested_groups
, &Globals
.bWinbindNestedGroups
)
5068 FN_GLOBAL_INTEGER(lp_winbind_expand_groups
, &Globals
.winbind_expand_groups
)
5069 FN_GLOBAL_BOOL(lp_winbind_refresh_tickets
, &Globals
.bWinbindRefreshTickets
)
5070 FN_GLOBAL_BOOL(lp_winbind_offline_logon
, &Globals
.bWinbindOfflineLogon
)
5071 FN_GLOBAL_BOOL(lp_winbind_normalize_names
, &Globals
.bWinbindNormalizeNames
)
5072 FN_GLOBAL_BOOL(lp_winbind_rpc_only
, &Globals
.bWinbindRpcOnly
)
5074 FN_GLOBAL_LIST(lp_idmap_domains
, &Globals
.szIdmapDomains
)
5075 FN_GLOBAL_LIST(lp_idmap_backend
, &Globals
.szIdmapBackend
) /* deprecated */
5076 FN_GLOBAL_STRING(lp_idmap_alloc_backend
, &Globals
.szIdmapAllocBackend
)
5077 FN_GLOBAL_INTEGER(lp_idmap_cache_time
, &Globals
.iIdmapCacheTime
)
5078 FN_GLOBAL_INTEGER(lp_idmap_negative_cache_time
, &Globals
.iIdmapNegativeCacheTime
)
5079 FN_GLOBAL_INTEGER(lp_keepalive
, &Globals
.iKeepalive
)
5080 FN_GLOBAL_BOOL(lp_passdb_expand_explicit
, &Globals
.bPassdbExpandExplicit
)
5082 FN_GLOBAL_STRING(lp_ldap_suffix
, &Globals
.szLdapSuffix
)
5083 FN_GLOBAL_STRING(lp_ldap_admin_dn
, &Globals
.szLdapAdminDn
)
5084 FN_GLOBAL_INTEGER(lp_ldap_ssl
, &Globals
.ldap_ssl
)
5085 FN_GLOBAL_INTEGER(lp_ldap_passwd_sync
, &Globals
.ldap_passwd_sync
)
5086 FN_GLOBAL_BOOL(lp_ldap_delete_dn
, &Globals
.ldap_delete_dn
)
5087 FN_GLOBAL_INTEGER(lp_ldap_replication_sleep
, &Globals
.ldap_replication_sleep
)
5088 FN_GLOBAL_INTEGER(lp_ldap_timeout
, &Globals
.ldap_timeout
)
5089 FN_GLOBAL_INTEGER(lp_ldap_connection_timeout
, &Globals
.ldap_connection_timeout
)
5090 FN_GLOBAL_INTEGER(lp_ldap_page_size
, &Globals
.ldap_page_size
)
5091 FN_GLOBAL_INTEGER(lp_ldap_debug_level
, &Globals
.ldap_debug_level
)
5092 FN_GLOBAL_INTEGER(lp_ldap_debug_threshold
, &Globals
.ldap_debug_threshold
)
5093 FN_GLOBAL_STRING(lp_add_share_cmd
, &Globals
.szAddShareCommand
)
5094 FN_GLOBAL_STRING(lp_change_share_cmd
, &Globals
.szChangeShareCommand
)
5095 FN_GLOBAL_STRING(lp_delete_share_cmd
, &Globals
.szDeleteShareCommand
)
5096 FN_GLOBAL_STRING(lp_usershare_path
, &Globals
.szUsersharePath
)
5097 FN_GLOBAL_LIST(lp_usershare_prefix_allow_list
, &Globals
.szUsersharePrefixAllowList
)
5098 FN_GLOBAL_LIST(lp_usershare_prefix_deny_list
, &Globals
.szUsersharePrefixDenyList
)
5100 FN_GLOBAL_LIST(lp_eventlog_list
, &Globals
.szEventLogs
)
5102 FN_GLOBAL_BOOL(lp_registry_shares
, &Globals
.bRegistryShares
)
5103 FN_GLOBAL_BOOL(lp_usershare_allow_guests
, &Globals
.bUsershareAllowGuests
)
5104 FN_GLOBAL_BOOL(lp_usershare_owner_only
, &Globals
.bUsershareOwnerOnly
)
5105 FN_GLOBAL_BOOL(lp_disable_netbios
, &Globals
.bDisableNetbios
)
5106 FN_GLOBAL_BOOL(lp_reset_on_zero_vc
, &Globals
.bResetOnZeroVC
)
5107 FN_GLOBAL_BOOL(lp_ms_add_printer_wizard
, &Globals
.bMsAddPrinterWizard
)
5108 FN_GLOBAL_BOOL(lp_dns_proxy
, &Globals
.bDNSproxy
)
5109 FN_GLOBAL_BOOL(lp_wins_support
, &Globals
.bWINSsupport
)
5110 FN_GLOBAL_BOOL(lp_we_are_a_wins_server
, &Globals
.bWINSsupport
)
5111 FN_GLOBAL_BOOL(lp_wins_proxy
, &Globals
.bWINSproxy
)
5112 FN_GLOBAL_BOOL(lp_local_master
, &Globals
.bLocalMaster
)
5113 FN_GLOBAL_BOOL(lp_domain_logons
, &Globals
.bDomainLogons
)
5114 FN_GLOBAL_BOOL(lp_load_printers
, &Globals
.bLoadPrinters
)
5115 FN_GLOBAL_BOOL(lp_readraw
, &Globals
.bReadRaw
)
5116 FN_GLOBAL_BOOL(lp_large_readwrite
, &Globals
.bLargeReadwrite
)
5117 FN_GLOBAL_BOOL(lp_writeraw
, &Globals
.bWriteRaw
)
5118 FN_GLOBAL_BOOL(lp_null_passwords
, &Globals
.bNullPasswords
)
5119 FN_GLOBAL_BOOL(lp_obey_pam_restrictions
, &Globals
.bObeyPamRestrictions
)
5120 FN_GLOBAL_BOOL(lp_encrypted_passwords
, &Globals
.bEncryptPasswords
)
5121 FN_GLOBAL_BOOL(lp_update_encrypted
, &Globals
.bUpdateEncrypt
)
5122 FN_GLOBAL_INTEGER(lp_client_schannel
, &Globals
.clientSchannel
)
5123 FN_GLOBAL_INTEGER(lp_server_schannel
, &Globals
.serverSchannel
)
5124 FN_GLOBAL_BOOL(lp_syslog_only
, &Globals
.bSyslogOnly
)
5125 FN_GLOBAL_BOOL(lp_timestamp_logs
, &Globals
.bTimestampLogs
)
5126 FN_GLOBAL_BOOL(lp_debug_prefix_timestamp
, &Globals
.bDebugPrefixTimestamp
)
5127 FN_GLOBAL_BOOL(lp_debug_hires_timestamp
, &Globals
.bDebugHiresTimestamp
)
5128 FN_GLOBAL_BOOL(lp_debug_pid
, &Globals
.bDebugPid
)
5129 FN_GLOBAL_BOOL(lp_debug_uid
, &Globals
.bDebugUid
)
5130 FN_GLOBAL_BOOL(lp_debug_class
, &Globals
.bDebugClass
)
5131 FN_GLOBAL_BOOL(lp_enable_core_files
, &Globals
.bEnableCoreFiles
)
5132 FN_GLOBAL_BOOL(lp_browse_list
, &Globals
.bBrowseList
)
5133 FN_GLOBAL_BOOL(lp_nis_home_map
, &Globals
.bNISHomeMap
)
5134 static FN_GLOBAL_BOOL(lp_time_server
, &Globals
.bTimeServer
)
5135 FN_GLOBAL_BOOL(lp_bind_interfaces_only
, &Globals
.bBindInterfacesOnly
)
5136 FN_GLOBAL_BOOL(lp_pam_password_change
, &Globals
.bPamPasswordChange
)
5137 FN_GLOBAL_BOOL(lp_unix_password_sync
, &Globals
.bUnixPasswdSync
)
5138 FN_GLOBAL_BOOL(lp_passwd_chat_debug
, &Globals
.bPasswdChatDebug
)
5139 FN_GLOBAL_INTEGER(lp_passwd_chat_timeout
, &Globals
.iPasswdChatTimeout
)
5140 FN_GLOBAL_BOOL(lp_nt_pipe_support
, &Globals
.bNTPipeSupport
)
5141 FN_GLOBAL_BOOL(lp_nt_status_support
, &Globals
.bNTStatusSupport
)
5142 FN_GLOBAL_BOOL(lp_stat_cache
, &Globals
.bStatCache
)
5143 FN_GLOBAL_INTEGER(lp_max_stat_cache_size
, &Globals
.iMaxStatCacheSize
)
5144 FN_GLOBAL_BOOL(lp_allow_trusted_domains
, &Globals
.bAllowTrustedDomains
)
5145 FN_GLOBAL_INTEGER(lp_restrict_anonymous
, &Globals
.restrict_anonymous
)
5146 FN_GLOBAL_BOOL(lp_lanman_auth
, &Globals
.bLanmanAuth
)
5147 FN_GLOBAL_BOOL(lp_ntlm_auth
, &Globals
.bNTLMAuth
)
5148 FN_GLOBAL_BOOL(lp_client_plaintext_auth
, &Globals
.bClientPlaintextAuth
)
5149 FN_GLOBAL_BOOL(lp_client_lanman_auth
, &Globals
.bClientLanManAuth
)
5150 FN_GLOBAL_BOOL(lp_client_ntlmv2_auth
, &Globals
.bClientNTLMv2Auth
)
5151 FN_GLOBAL_BOOL(lp_host_msdfs
, &Globals
.bHostMSDfs
)
5152 FN_GLOBAL_BOOL(lp_kernel_oplocks
, &Globals
.bKernelOplocks
)
5153 FN_GLOBAL_BOOL(lp_enhanced_browsing
, &Globals
.enhanced_browsing
)
5154 FN_GLOBAL_BOOL(lp_use_mmap
, &Globals
.bUseMmap
)
5155 FN_GLOBAL_BOOL(lp_unix_extensions
, &Globals
.bUnixExtensions
)
5156 FN_GLOBAL_BOOL(lp_use_spnego
, &Globals
.bUseSpnego
)
5157 FN_GLOBAL_BOOL(lp_client_use_spnego
, &Globals
.bClientUseSpnego
)
5158 FN_GLOBAL_BOOL(lp_hostname_lookups
, &Globals
.bHostnameLookups
)
5159 FN_LOCAL_PARM_BOOL(lp_change_notify
, bChangeNotify
)
5160 FN_LOCAL_PARM_BOOL(lp_kernel_change_notify
, bKernelChangeNotify
)
5161 FN_GLOBAL_BOOL(lp_use_kerberos_keytab
, &Globals
.bUseKerberosKeytab
)
5162 FN_GLOBAL_BOOL(lp_defer_sharing_violations
, &Globals
.bDeferSharingViolations
)
5163 FN_GLOBAL_BOOL(lp_enable_privileges
, &Globals
.bEnablePrivileges
)
5164 FN_GLOBAL_BOOL(lp_enable_asu_support
, &Globals
.bASUSupport
)
5165 FN_GLOBAL_INTEGER(lp_os_level
, &Globals
.os_level
)
5166 FN_GLOBAL_INTEGER(lp_max_ttl
, &Globals
.max_ttl
)
5167 FN_GLOBAL_INTEGER(lp_max_wins_ttl
, &Globals
.max_wins_ttl
)
5168 FN_GLOBAL_INTEGER(lp_min_wins_ttl
, &Globals
.min_wins_ttl
)
5169 FN_GLOBAL_INTEGER(lp_max_log_size
, &Globals
.max_log_size
)
5170 FN_GLOBAL_INTEGER(lp_max_open_files
, &Globals
.max_open_files
)
5171 FN_GLOBAL_INTEGER(lp_open_files_db_hash_size
, &Globals
.open_files_db_hash_size
)
5172 FN_GLOBAL_INTEGER(lp_maxxmit
, &Globals
.max_xmit
)
5173 FN_GLOBAL_INTEGER(lp_maxmux
, &Globals
.max_mux
)
5174 FN_GLOBAL_INTEGER(lp_passwordlevel
, &Globals
.pwordlevel
)
5175 FN_GLOBAL_INTEGER(lp_usernamelevel
, &Globals
.unamelevel
)
5176 FN_GLOBAL_INTEGER(lp_deadtime
, &Globals
.deadtime
)
5177 FN_GLOBAL_BOOL(lp_getwd_cache
, &Globals
.getwd_cache
)
5178 FN_GLOBAL_INTEGER(lp_maxprotocol
, &Globals
.maxprotocol
)
5179 FN_GLOBAL_INTEGER(lp_minprotocol
, &Globals
.minprotocol
)
5180 FN_GLOBAL_INTEGER(lp_security
, &Globals
.security
)
5181 FN_GLOBAL_LIST(lp_auth_methods
, &Globals
.AuthMethods
)
5182 FN_GLOBAL_BOOL(lp_paranoid_server_security
, &Globals
.paranoid_server_security
)
5183 FN_GLOBAL_INTEGER(lp_maxdisksize
, &Globals
.maxdisksize
)
5184 FN_GLOBAL_INTEGER(lp_lpqcachetime
, &Globals
.lpqcachetime
)
5185 FN_GLOBAL_INTEGER(lp_max_smbd_processes
, &Globals
.iMaxSmbdProcesses
)
5186 FN_GLOBAL_BOOL(_lp_disable_spoolss
, &Globals
.bDisableSpoolss
)
5187 FN_GLOBAL_INTEGER(lp_syslog
, &Globals
.syslog
)
5188 static FN_GLOBAL_INTEGER(lp_announce_as
, &Globals
.announce_as
)
5189 FN_GLOBAL_INTEGER(lp_lm_announce
, &Globals
.lm_announce
)
5190 FN_GLOBAL_INTEGER(lp_lm_interval
, &Globals
.lm_interval
)
5191 FN_GLOBAL_INTEGER(lp_machine_password_timeout
, &Globals
.machine_password_timeout
)
5192 FN_GLOBAL_INTEGER(lp_map_to_guest
, &Globals
.map_to_guest
)
5193 FN_GLOBAL_INTEGER(lp_oplock_break_wait_time
, &Globals
.oplock_break_wait_time
)
5194 FN_GLOBAL_INTEGER(lp_lock_spin_time
, &Globals
.iLockSpinTime
)
5195 FN_GLOBAL_INTEGER(lp_usershare_max_shares
, &Globals
.iUsershareMaxShares
)
5196 FN_GLOBAL_CONST_STRING(lp_socket_options
, &Globals
.szSocketOptions
)
5197 FN_GLOBAL_INTEGER(lp_config_backend
, &Globals
.ConfigBackend
)
5199 FN_LOCAL_STRING(lp_preexec
, szPreExec
)
5200 FN_LOCAL_STRING(lp_postexec
, szPostExec
)
5201 FN_LOCAL_STRING(lp_rootpreexec
, szRootPreExec
)
5202 FN_LOCAL_STRING(lp_rootpostexec
, szRootPostExec
)
5203 FN_LOCAL_STRING(lp_servicename
, szService
)
5204 FN_LOCAL_CONST_STRING(lp_const_servicename
, szService
)
5205 FN_LOCAL_STRING(lp_pathname
, szPath
)
5206 FN_LOCAL_STRING(lp_dontdescend
, szDontdescend
)
5207 FN_LOCAL_STRING(lp_username
, szUsername
)
5208 FN_LOCAL_LIST(lp_invalid_users
, szInvalidUsers
)
5209 FN_LOCAL_LIST(lp_valid_users
, szValidUsers
)
5210 FN_LOCAL_LIST(lp_admin_users
, szAdminUsers
)
5211 FN_GLOBAL_LIST(lp_svcctl_list
, &Globals
.szServicesList
)
5212 FN_LOCAL_STRING(lp_cups_options
, szCupsOptions
)
5213 FN_GLOBAL_STRING(lp_cups_server
, &Globals
.szCupsServer
)
5214 FN_GLOBAL_STRING(lp_iprint_server
, &Globals
.szIPrintServer
)
5215 FN_GLOBAL_CONST_STRING(lp_ctdbd_socket
, &Globals
.ctdbdSocket
)
5216 FN_GLOBAL_LIST(lp_cluster_addresses
, &Globals
.szClusterAddresses
)
5217 FN_GLOBAL_BOOL(lp_clustering
, &Globals
.clustering
)
5218 FN_LOCAL_STRING(lp_printcommand
, szPrintcommand
)
5219 FN_LOCAL_STRING(lp_lpqcommand
, szLpqcommand
)
5220 FN_LOCAL_STRING(lp_lprmcommand
, szLprmcommand
)
5221 FN_LOCAL_STRING(lp_lppausecommand
, szLppausecommand
)
5222 FN_LOCAL_STRING(lp_lpresumecommand
, szLpresumecommand
)
5223 FN_LOCAL_STRING(lp_queuepausecommand
, szQueuepausecommand
)
5224 FN_LOCAL_STRING(lp_queueresumecommand
, szQueueresumecommand
)
5225 static FN_LOCAL_STRING(_lp_printername
, szPrintername
)
5226 FN_LOCAL_CONST_STRING(lp_printjob_username
, szPrintjobUsername
)
5227 FN_LOCAL_LIST(lp_hostsallow
, szHostsallow
)
5228 FN_LOCAL_LIST(lp_hostsdeny
, szHostsdeny
)
5229 FN_LOCAL_STRING(lp_magicscript
, szMagicScript
)
5230 FN_LOCAL_STRING(lp_magicoutput
, szMagicOutput
)
5231 FN_LOCAL_STRING(lp_comment
, comment
)
5232 FN_LOCAL_STRING(lp_force_user
, force_user
)
5233 FN_LOCAL_STRING(lp_force_group
, force_group
)
5234 FN_LOCAL_LIST(lp_readlist
, readlist
)
5235 FN_LOCAL_LIST(lp_writelist
, writelist
)
5236 FN_LOCAL_LIST(lp_printer_admin
, printer_admin
)
5237 FN_LOCAL_STRING(lp_fstype
, fstype
)
5238 FN_LOCAL_LIST(lp_vfs_objects
, szVfsObjects
)
5239 FN_LOCAL_STRING(lp_msdfs_proxy
, szMSDfsProxy
)
5240 static FN_LOCAL_STRING(lp_volume
, volume
)
5241 FN_LOCAL_STRING(lp_veto_files
, szVetoFiles
)
5242 FN_LOCAL_STRING(lp_hide_files
, szHideFiles
)
5243 FN_LOCAL_STRING(lp_veto_oplocks
, szVetoOplockFiles
)
5244 FN_LOCAL_BOOL(lp_msdfs_root
, bMSDfsRoot
)
5245 FN_LOCAL_STRING(lp_aio_write_behind
, szAioWriteBehind
)
5246 FN_LOCAL_STRING(lp_dfree_command
, szDfree
)
5247 FN_LOCAL_BOOL(lp_autoloaded
, autoloaded
)
5248 FN_LOCAL_BOOL(lp_preexec_close
, bPreexecClose
)
5249 FN_LOCAL_BOOL(lp_rootpreexec_close
, bRootpreexecClose
)
5250 FN_LOCAL_INTEGER(lp_casesensitive
, iCaseSensitive
)
5251 FN_LOCAL_BOOL(lp_preservecase
, bCasePreserve
)
5252 FN_LOCAL_BOOL(lp_shortpreservecase
, bShortCasePreserve
)
5253 FN_LOCAL_BOOL(lp_hide_dot_files
, bHideDotFiles
)
5254 FN_LOCAL_BOOL(lp_hide_special_files
, bHideSpecialFiles
)
5255 FN_LOCAL_BOOL(lp_hideunreadable
, bHideUnReadable
)
5256 FN_LOCAL_BOOL(lp_hideunwriteable_files
, bHideUnWriteableFiles
)
5257 FN_LOCAL_BOOL(lp_browseable
, bBrowseable
)
5258 FN_LOCAL_BOOL(lp_readonly
, bRead_only
)
5259 FN_LOCAL_BOOL(lp_no_set_dir
, bNo_set_dir
)
5260 FN_LOCAL_BOOL(lp_guest_ok
, bGuest_ok
)
5261 FN_LOCAL_BOOL(lp_guest_only
, bGuest_only
)
5262 FN_LOCAL_BOOL(lp_administrative_share
, bAdministrative_share
)
5263 FN_LOCAL_BOOL(lp_print_ok
, bPrint_ok
)
5264 FN_LOCAL_BOOL(lp_map_hidden
, bMap_hidden
)
5265 FN_LOCAL_BOOL(lp_map_archive
, bMap_archive
)
5266 FN_LOCAL_BOOL(lp_store_dos_attributes
, bStoreDosAttributes
)
5267 FN_LOCAL_BOOL(lp_dmapi_support
, bDmapiSupport
)
5268 FN_LOCAL_PARM_BOOL(lp_locking
, bLocking
)
5269 FN_LOCAL_PARM_INTEGER(lp_strict_locking
, iStrictLocking
)
5270 FN_LOCAL_PARM_BOOL(lp_posix_locking
, bPosixLocking
)
5271 FN_LOCAL_BOOL(lp_share_modes
, bShareModes
)
5272 FN_LOCAL_BOOL(lp_oplocks
, bOpLocks
)
5273 FN_LOCAL_BOOL(lp_level2_oplocks
, bLevel2OpLocks
)
5274 FN_LOCAL_BOOL(lp_onlyuser
, bOnlyUser
)
5275 FN_LOCAL_PARM_BOOL(lp_manglednames
, bMangledNames
)
5276 FN_LOCAL_BOOL(lp_widelinks
, bWidelinks
)
5277 FN_LOCAL_BOOL(lp_symlinks
, bSymlinks
)
5278 FN_LOCAL_BOOL(lp_syncalways
, bSyncAlways
)
5279 FN_LOCAL_BOOL(lp_strict_allocate
, bStrictAllocate
)
5280 FN_LOCAL_BOOL(lp_strict_sync
, bStrictSync
)
5281 FN_LOCAL_BOOL(lp_map_system
, bMap_system
)
5282 FN_LOCAL_BOOL(lp_delete_readonly
, bDeleteReadonly
)
5283 FN_LOCAL_BOOL(lp_fake_oplocks
, bFakeOplocks
)
5284 FN_LOCAL_BOOL(lp_recursive_veto_delete
, bDeleteVetoFiles
)
5285 FN_LOCAL_BOOL(lp_dos_filemode
, bDosFilemode
)
5286 FN_LOCAL_BOOL(lp_dos_filetimes
, bDosFiletimes
)
5287 FN_LOCAL_BOOL(lp_dos_filetime_resolution
, bDosFiletimeResolution
)
5288 FN_LOCAL_BOOL(lp_fake_dir_create_times
, bFakeDirCreateTimes
)
5289 FN_LOCAL_BOOL(lp_blocking_locks
, bBlockingLocks
)
5290 FN_LOCAL_BOOL(lp_inherit_perms
, bInheritPerms
)
5291 FN_LOCAL_BOOL(lp_inherit_acls
, bInheritACLS
)
5292 FN_LOCAL_BOOL(lp_inherit_owner
, bInheritOwner
)
5293 FN_LOCAL_BOOL(lp_use_client_driver
, bUseClientDriver
)
5294 FN_LOCAL_BOOL(lp_default_devmode
, bDefaultDevmode
)
5295 FN_LOCAL_BOOL(lp_force_printername
, bForcePrintername
)
5296 FN_LOCAL_BOOL(lp_nt_acl_support
, bNTAclSupport
)
5297 FN_LOCAL_BOOL(lp_force_unknown_acl_user
, bForceUnknownAclUser
)
5298 FN_LOCAL_BOOL(lp_ea_support
, bEASupport
)
5299 FN_LOCAL_BOOL(_lp_use_sendfile
, bUseSendfile
)
5300 FN_LOCAL_BOOL(lp_profile_acls
, bProfileAcls
)
5301 FN_LOCAL_BOOL(lp_map_acl_inherit
, bMap_acl_inherit
)
5302 FN_LOCAL_BOOL(lp_afs_share
, bAfs_Share
)
5303 FN_LOCAL_BOOL(lp_acl_check_permissions
, bAclCheckPermissions
)
5304 FN_LOCAL_BOOL(lp_acl_group_control
, bAclGroupControl
)
5305 FN_LOCAL_BOOL(lp_acl_map_full_control
, bAclMapFullControl
)
5306 FN_LOCAL_INTEGER(lp_create_mask
, iCreate_mask
)
5307 FN_LOCAL_INTEGER(lp_force_create_mode
, iCreate_force_mode
)
5308 FN_LOCAL_INTEGER(lp_security_mask
, iSecurity_mask
)
5309 FN_LOCAL_INTEGER(lp_force_security_mode
, iSecurity_force_mode
)
5310 FN_LOCAL_INTEGER(lp_dir_mask
, iDir_mask
)
5311 FN_LOCAL_INTEGER(lp_force_dir_mode
, iDir_force_mode
)
5312 FN_LOCAL_INTEGER(lp_dir_security_mask
, iDir_Security_mask
)
5313 FN_LOCAL_INTEGER(lp_force_dir_security_mode
, iDir_Security_force_mode
)
5314 FN_LOCAL_INTEGER(lp_max_connections
, iMaxConnections
)
5315 FN_LOCAL_INTEGER(lp_defaultcase
, iDefaultCase
)
5316 FN_LOCAL_INTEGER(lp_minprintspace
, iMinPrintSpace
)
5317 FN_LOCAL_INTEGER(lp_printing
, iPrinting
)
5318 FN_LOCAL_INTEGER(lp_max_reported_jobs
, iMaxReportedPrintJobs
)
5319 FN_LOCAL_INTEGER(lp_oplock_contention_limit
, iOplockContentionLimit
)
5320 FN_LOCAL_INTEGER(lp_csc_policy
, iCSCPolicy
)
5321 FN_LOCAL_INTEGER(lp_write_cache_size
, iWriteCacheSize
)
5322 FN_LOCAL_INTEGER(lp_block_size
, iBlock_size
)
5323 FN_LOCAL_INTEGER(lp_dfree_cache_time
, iDfreeCacheTime
)
5324 FN_LOCAL_INTEGER(lp_allocation_roundup_size
, iallocation_roundup_size
)
5325 FN_LOCAL_INTEGER(lp_aio_read_size
, iAioReadSize
)
5326 FN_LOCAL_INTEGER(lp_aio_write_size
, iAioWriteSize
)
5327 FN_LOCAL_INTEGER(lp_map_readonly
, iMap_readonly
)
5328 FN_LOCAL_INTEGER(lp_directory_name_cache_size
, iDirectoryNameCacheSize
)
5329 FN_LOCAL_INTEGER(lp_smb_encrypt
, ismb_encrypt
)
5330 FN_LOCAL_CHAR(lp_magicchar
, magic_char
)
5331 FN_GLOBAL_INTEGER(lp_winbind_cache_time
, &Globals
.winbind_cache_time
)
5332 FN_GLOBAL_LIST(lp_winbind_nss_info
, &Globals
.szWinbindNssInfo
)
5333 FN_GLOBAL_INTEGER(lp_algorithmic_rid_base
, &Globals
.AlgorithmicRidBase
)
5334 FN_GLOBAL_INTEGER(lp_name_cache_timeout
, &Globals
.name_cache_timeout
)
5335 FN_GLOBAL_INTEGER(lp_client_signing
, &Globals
.client_signing
)
5336 FN_GLOBAL_INTEGER(lp_server_signing
, &Globals
.server_signing
)
5337 FN_GLOBAL_INTEGER(lp_client_ldap_sasl_wrapping
, &Globals
.client_ldap_sasl_wrapping
)
5339 /* local prototypes */
5341 static int map_parameter(const char *pszParmName
);
5342 static int map_parameter_canonical(const char *pszParmName
, bool *inverse
);
5343 static bool set_boolean(bool *pb
, const char *pszParmValue
);
5344 static const char *get_boolean(bool bool_value
);
5345 static int getservicebyname(const char *pszServiceName
,
5346 struct service
*pserviceDest
);
5347 static void copy_service(struct service
*pserviceDest
,
5348 struct service
*pserviceSource
,
5349 struct bitmap
*pcopymapDest
);
5350 static bool do_parameter(const char *pszParmName
, const char *pszParmValue
,
5352 static bool do_section(const char *pszSectionName
, void *userdata
);
5353 static void init_copymap(struct service
*pservice
);
5354 static bool hash_a_service(const char *name
, int number
);
5355 static void free_service_byindex(int iService
);
5356 static char * canonicalize_servicename(const char *name
);
5357 static void show_parameter(int parmIndex
);
5358 static bool is_synonym_of(int parm1
, int parm2
, bool *inverse
);
5360 /* This is a helper function for parametrical options support. */
5361 /* It returns a pointer to parametrical option value if it exists or NULL otherwise */
5362 /* Actual parametrical functions are quite simple */
5363 static param_opt_struct
*get_parametrics(int snum
, const char *type
, const char *option
)
5365 bool global_section
= False
;
5367 param_opt_struct
*data
;
5369 if (snum
>= iNumServices
) return NULL
;
5372 data
= Globals
.param_opt
;
5373 global_section
= True
;
5375 data
= ServicePtrs
[snum
]->param_opt
;
5378 if (asprintf(¶m_key
, "%s:%s", type
, option
) == -1) {
5379 DEBUG(0,("asprintf failed!\n"));
5384 if (strcmp(data
->key
, param_key
) == 0) {
5385 string_free(¶m_key
);
5391 if (!global_section
) {
5392 /* Try to fetch the same option but from globals */
5393 /* but only if we are not already working with Globals */
5394 data
= Globals
.param_opt
;
5396 if (strcmp(data
->key
, param_key
) == 0) {
5397 string_free(¶m_key
);
5404 string_free(¶m_key
);
5410 #define MISSING_PARAMETER(name) \
5411 DEBUG(0, ("%s(): value is NULL or empty!\n", #name))
5413 /*******************************************************************
5414 convenience routine to return int parameters.
5415 ********************************************************************/
5416 static int lp_int(const char *s
)
5420 MISSING_PARAMETER(lp_int
);
5424 return (int)strtol(s
, NULL
, 0);
5427 /*******************************************************************
5428 convenience routine to return unsigned long parameters.
5429 ********************************************************************/
5430 static unsigned long lp_ulong(const char *s
)
5434 MISSING_PARAMETER(lp_ulong
);
5438 return strtoul(s
, NULL
, 0);
5441 /*******************************************************************
5442 convenience routine to return boolean parameters.
5443 ********************************************************************/
5444 static bool lp_bool(const char *s
)
5449 MISSING_PARAMETER(lp_bool
);
5453 if (!set_boolean(&ret
,s
)) {
5454 DEBUG(0,("lp_bool(%s): value is not boolean!\n",s
));
5461 /*******************************************************************
5462 convenience routine to return enum parameters.
5463 ********************************************************************/
5464 static int lp_enum(const char *s
,const struct enum_list
*_enum
)
5468 if (!s
|| !*s
|| !_enum
) {
5469 MISSING_PARAMETER(lp_enum
);
5473 for (i
=0; _enum
[i
].name
; i
++) {
5474 if (strequal(_enum
[i
].name
,s
))
5475 return _enum
[i
].value
;
5478 DEBUG(0,("lp_enum(%s,enum): value is not in enum_list!\n",s
));
5482 #undef MISSING_PARAMETER
5484 /* DO NOT USE lp_parm_string ANYMORE!!!!
5485 * use lp_parm_const_string or lp_parm_talloc_string
5487 * lp_parm_string is only used to let old modules find this symbol
5489 #undef lp_parm_string
5490 char *lp_parm_string(const char *servicename
, const char *type
, const char *option
);
5491 char *lp_parm_string(const char *servicename
, const char *type
, const char *option
)
5493 return lp_parm_talloc_string(lp_servicenumber(servicename
), type
, option
, NULL
);
5496 /* Return parametric option from a given service. Type is a part of option before ':' */
5497 /* Parametric option has following syntax: 'Type: option = value' */
5498 /* the returned value is talloced on the talloc_tos() */
5499 char *lp_parm_talloc_string(int snum
, const char *type
, const char *option
, const char *def
)
5501 param_opt_struct
*data
= get_parametrics(snum
, type
, option
);
5503 if (data
== NULL
||data
->value
==NULL
) {
5505 return lp_string(def
);
5511 return lp_string(data
->value
);
5514 /* Return parametric option from a given service. Type is a part of option before ':' */
5515 /* Parametric option has following syntax: 'Type: option = value' */
5516 const char *lp_parm_const_string(int snum
, const char *type
, const char *option
, const char *def
)
5518 param_opt_struct
*data
= get_parametrics(snum
, type
, option
);
5520 if (data
== NULL
||data
->value
==NULL
)
5526 /* Return parametric option from a given service. Type is a part of option before ':' */
5527 /* Parametric option has following syntax: 'Type: option = value' */
5529 const char **lp_parm_string_list(int snum
, const char *type
, const char *option
, const char **def
)
5531 param_opt_struct
*data
= get_parametrics(snum
, type
, option
);
5533 if (data
== NULL
||data
->value
==NULL
)
5534 return (const char **)def
;
5536 if (data
->list
==NULL
) {
5537 data
->list
= str_list_make(NULL
, data
->value
, NULL
);
5540 return (const char **)data
->list
;
5543 /* Return parametric option from a given service. Type is a part of option before ':' */
5544 /* Parametric option has following syntax: 'Type: option = value' */
5546 int lp_parm_int(int snum
, const char *type
, const char *option
, int def
)
5548 param_opt_struct
*data
= get_parametrics(snum
, type
, option
);
5550 if (data
&& data
->value
&& *data
->value
)
5551 return lp_int(data
->value
);
5556 /* Return parametric option from a given service. Type is a part of option before ':' */
5557 /* Parametric option has following syntax: 'Type: option = value' */
5559 unsigned long lp_parm_ulong(int snum
, const char *type
, const char *option
, unsigned long def
)
5561 param_opt_struct
*data
= get_parametrics(snum
, type
, option
);
5563 if (data
&& data
->value
&& *data
->value
)
5564 return lp_ulong(data
->value
);
5569 /* Return parametric option from a given service. Type is a part of option before ':' */
5570 /* Parametric option has following syntax: 'Type: option = value' */
5572 bool lp_parm_bool(int snum
, const char *type
, const char *option
, bool def
)
5574 param_opt_struct
*data
= get_parametrics(snum
, type
, option
);
5576 if (data
&& data
->value
&& *data
->value
)
5577 return lp_bool(data
->value
);
5582 /* Return parametric option from a given service. Type is a part of option before ':' */
5583 /* Parametric option has following syntax: 'Type: option = value' */
5585 int lp_parm_enum(int snum
, const char *type
, const char *option
,
5586 const struct enum_list
*_enum
, int def
)
5588 param_opt_struct
*data
= get_parametrics(snum
, type
, option
);
5590 if (data
&& data
->value
&& *data
->value
&& _enum
)
5591 return lp_enum(data
->value
, _enum
);
5597 /***************************************************************************
5598 Initialise a service to the defaults.
5599 ***************************************************************************/
5601 static void init_service(struct service
*pservice
)
5603 memset((char *)pservice
, '\0', sizeof(struct service
));
5604 copy_service(pservice
, &sDefault
, NULL
);
5607 /***************************************************************************
5608 Free the dynamically allocated parts of a service struct.
5609 ***************************************************************************/
5611 static void free_service(struct service
*pservice
)
5614 param_opt_struct
*data
, *pdata
;
5618 if (pservice
->szService
)
5619 DEBUG(5, ("free_service: Freeing service %s\n",
5620 pservice
->szService
));
5622 string_free(&pservice
->szService
);
5623 bitmap_free(pservice
->copymap
);
5625 for (i
= 0; parm_table
[i
].label
; i
++) {
5626 if ((parm_table
[i
].type
== P_STRING
||
5627 parm_table
[i
].type
== P_USTRING
) &&
5628 parm_table
[i
].p_class
== P_LOCAL
)
5629 string_free((char **)
5630 (((char *)pservice
) +
5631 PTR_DIFF(parm_table
[i
].ptr
, &sDefault
)));
5632 else if (parm_table
[i
].type
== P_LIST
&&
5633 parm_table
[i
].p_class
== P_LOCAL
)
5634 TALLOC_FREE(*((char ***)
5635 (((char *)pservice
) +
5636 PTR_DIFF(parm_table
[i
].ptr
,
5640 data
= pservice
->param_opt
;
5642 DEBUG(5,("Freeing parametrics:\n"));
5644 DEBUG(5,("[%s = %s]\n", data
->key
, data
->value
));
5645 string_free(&data
->key
);
5646 string_free(&data
->value
);
5647 TALLOC_FREE(data
->list
);
5653 ZERO_STRUCTP(pservice
);
5657 /***************************************************************************
5658 remove a service indexed in the ServicePtrs array from the ServiceHash
5659 and free the dynamically allocated parts
5660 ***************************************************************************/
5662 static void free_service_byindex(int idx
)
5664 if ( !LP_SNUM_OK(idx
) )
5667 ServicePtrs
[idx
]->valid
= False
;
5668 invalid_services
[num_invalid_services
++] = idx
;
5670 /* we have to cleanup the hash record */
5672 if (ServicePtrs
[idx
]->szService
) {
5673 char *canon_name
= canonicalize_servicename(
5674 ServicePtrs
[idx
]->szService
);
5676 dbwrap_delete_bystring(ServiceHash
, canon_name
);
5677 TALLOC_FREE(canon_name
);
5680 free_service(ServicePtrs
[idx
]);
5683 /***************************************************************************
5684 Add a new service to the services array initialising it with the given
5686 ***************************************************************************/
5688 static int add_a_service(const struct service
*pservice
, const char *name
)
5691 struct service tservice
;
5692 int num_to_alloc
= iNumServices
+ 1;
5693 param_opt_struct
*data
, *pdata
;
5695 tservice
= *pservice
;
5697 /* it might already exist */
5699 i
= getservicebyname(name
, NULL
);
5701 /* Clean all parametric options for service */
5702 /* They will be added during parsing again */
5703 data
= ServicePtrs
[i
]->param_opt
;
5705 string_free(&data
->key
);
5706 string_free(&data
->value
);
5707 TALLOC_FREE(data
->list
);
5712 ServicePtrs
[i
]->param_opt
= NULL
;
5717 /* find an invalid one */
5719 if (num_invalid_services
> 0) {
5720 i
= invalid_services
[--num_invalid_services
];
5723 /* if not, then create one */
5724 if (i
== iNumServices
) {
5725 struct service
**tsp
;
5728 tsp
= SMB_REALLOC_ARRAY_KEEP_OLD_ON_ERROR(ServicePtrs
, struct service
*, num_to_alloc
);
5730 DEBUG(0,("add_a_service: failed to enlarge ServicePtrs!\n"));
5734 ServicePtrs
[iNumServices
] = SMB_MALLOC_P(struct service
);
5735 if (!ServicePtrs
[iNumServices
]) {
5736 DEBUG(0,("add_a_service: out of memory!\n"));
5741 /* enlarge invalid_services here for now... */
5742 tinvalid
= SMB_REALLOC_ARRAY_KEEP_OLD_ON_ERROR(invalid_services
, int,
5744 if (tinvalid
== NULL
) {
5745 DEBUG(0,("add_a_service: failed to enlarge "
5746 "invalid_services!\n"));
5749 invalid_services
= tinvalid
;
5751 free_service_byindex(i
);
5754 ServicePtrs
[i
]->valid
= True
;
5756 init_service(ServicePtrs
[i
]);
5757 copy_service(ServicePtrs
[i
], &tservice
, NULL
);
5759 string_set(&ServicePtrs
[i
]->szService
, name
);
5761 DEBUG(8,("add_a_service: Creating snum = %d for %s\n",
5762 i
, ServicePtrs
[i
]->szService
));
5764 if (!hash_a_service(ServicePtrs
[i
]->szService
, i
)) {
5771 /***************************************************************************
5772 Convert a string to uppercase and remove whitespaces.
5773 ***************************************************************************/
5775 static char *canonicalize_servicename(const char *src
)
5780 DEBUG(0,("canonicalize_servicename: NULL source name!\n"));
5784 result
= talloc_strdup(talloc_tos(), src
);
5785 SMB_ASSERT(result
!= NULL
);
5791 /***************************************************************************
5792 Add a name/index pair for the services array to the hash table.
5793 ***************************************************************************/
5795 static bool hash_a_service(const char *name
, int idx
)
5799 if ( !ServiceHash
) {
5800 DEBUG(10,("hash_a_service: creating servicehash\n"));
5801 ServiceHash
= db_open_rbt(NULL
);
5802 if ( !ServiceHash
) {
5803 DEBUG(0,("hash_a_service: open tdb servicehash failed!\n"));
5808 DEBUG(10,("hash_a_service: hashing index %d for service name %s\n",
5811 canon_name
= canonicalize_servicename( name
);
5813 dbwrap_store_bystring(ServiceHash
, canon_name
,
5814 make_tdb_data((uint8
*)&idx
, sizeof(idx
)),
5817 TALLOC_FREE(canon_name
);
5822 /***************************************************************************
5823 Add a new home service, with the specified home directory, defaults coming
5825 ***************************************************************************/
5827 bool lp_add_home(const char *pszHomename
, int iDefaultService
,
5828 const char *user
, const char *pszHomedir
)
5832 i
= add_a_service(ServicePtrs
[iDefaultService
], pszHomename
);
5837 if (!(*(ServicePtrs
[iDefaultService
]->szPath
))
5838 || strequal(ServicePtrs
[iDefaultService
]->szPath
, lp_pathname(GLOBAL_SECTION_SNUM
))) {
5839 string_set(&ServicePtrs
[i
]->szPath
, pszHomedir
);
5842 if (!(*(ServicePtrs
[i
]->comment
))) {
5843 char *comment
= NULL
;
5844 if (asprintf(&comment
, "Home directory of %s", user
) < 0) {
5847 string_set(&ServicePtrs
[i
]->comment
, comment
);
5851 /* set the browseable flag from the global default */
5853 ServicePtrs
[i
]->bBrowseable
= sDefault
.bBrowseable
;
5855 ServicePtrs
[i
]->autoloaded
= True
;
5857 DEBUG(3, ("adding home's share [%s] for user '%s' at '%s'\n", pszHomename
,
5858 user
, ServicePtrs
[i
]->szPath
));
5863 /***************************************************************************
5864 Add a new service, based on an old one.
5865 ***************************************************************************/
5867 int lp_add_service(const char *pszService
, int iDefaultService
)
5869 if (iDefaultService
< 0) {
5870 return add_a_service(&sDefault
, pszService
);
5873 return (add_a_service(ServicePtrs
[iDefaultService
], pszService
));
5876 /***************************************************************************
5877 Add the IPC service.
5878 ***************************************************************************/
5880 static bool lp_add_ipc(const char *ipc_name
, bool guest_ok
)
5882 char *comment
= NULL
;
5883 int i
= add_a_service(&sDefault
, ipc_name
);
5888 if (asprintf(&comment
, "IPC Service (%s)",
5889 Globals
.szServerString
) < 0) {
5893 string_set(&ServicePtrs
[i
]->szPath
, tmpdir());
5894 string_set(&ServicePtrs
[i
]->szUsername
, "");
5895 string_set(&ServicePtrs
[i
]->comment
, comment
);
5896 string_set(&ServicePtrs
[i
]->fstype
, "IPC");
5897 ServicePtrs
[i
]->iMaxConnections
= 0;
5898 ServicePtrs
[i
]->bAvailable
= True
;
5899 ServicePtrs
[i
]->bRead_only
= True
;
5900 ServicePtrs
[i
]->bGuest_only
= False
;
5901 ServicePtrs
[i
]->bAdministrative_share
= True
;
5902 ServicePtrs
[i
]->bGuest_ok
= guest_ok
;
5903 ServicePtrs
[i
]->bPrint_ok
= False
;
5904 ServicePtrs
[i
]->bBrowseable
= sDefault
.bBrowseable
;
5906 DEBUG(3, ("adding IPC service\n"));
5912 /***************************************************************************
5913 Add a new printer service, with defaults coming from service iFrom.
5914 ***************************************************************************/
5916 bool lp_add_printer(const char *pszPrintername
, int iDefaultService
)
5918 const char *comment
= "From Printcap";
5919 int i
= add_a_service(ServicePtrs
[iDefaultService
], pszPrintername
);
5924 /* note that we do NOT default the availability flag to True - */
5925 /* we take it from the default service passed. This allows all */
5926 /* dynamic printers to be disabled by disabling the [printers] */
5927 /* entry (if/when the 'available' keyword is implemented!). */
5929 /* the printer name is set to the service name. */
5930 string_set(&ServicePtrs
[i
]->szPrintername
, pszPrintername
);
5931 string_set(&ServicePtrs
[i
]->comment
, comment
);
5933 /* set the browseable flag from the gloabl default */
5934 ServicePtrs
[i
]->bBrowseable
= sDefault
.bBrowseable
;
5936 /* Printers cannot be read_only. */
5937 ServicePtrs
[i
]->bRead_only
= False
;
5938 /* No share modes on printer services. */
5939 ServicePtrs
[i
]->bShareModes
= False
;
5940 /* No oplocks on printer services. */
5941 ServicePtrs
[i
]->bOpLocks
= False
;
5942 /* Printer services must be printable. */
5943 ServicePtrs
[i
]->bPrint_ok
= True
;
5945 DEBUG(3, ("adding printer service %s\n", pszPrintername
));
5951 /***************************************************************************
5952 Check whether the given parameter name is valid.
5953 Parametric options (names containing a colon) are considered valid.
5954 ***************************************************************************/
5956 bool lp_parameter_is_valid(const char *pszParmName
)
5958 return ((map_parameter(pszParmName
) != -1) ||
5959 (strchr(pszParmName
, ':') != NULL
));
5962 /***************************************************************************
5963 Check whether the given name is the name of a global parameter.
5964 Returns True for strings belonging to parameters of class
5965 P_GLOBAL, False for all other strings, also for parametric options
5966 and strings not belonging to any option.
5967 ***************************************************************************/
5969 bool lp_parameter_is_global(const char *pszParmName
)
5971 int num
= map_parameter(pszParmName
);
5974 return (parm_table
[num
].p_class
== P_GLOBAL
);
5980 /**************************************************************************
5981 Check whether the given name is the canonical name of a parameter.
5982 Returns False if it is not a valid parameter Name.
5983 For parametric options, True is returned.
5984 **************************************************************************/
5986 bool lp_parameter_is_canonical(const char *parm_name
)
5988 if (!lp_parameter_is_valid(parm_name
)) {
5992 return (map_parameter(parm_name
) ==
5993 map_parameter_canonical(parm_name
, NULL
));
5996 /**************************************************************************
5997 Determine the canonical name for a parameter.
5998 Indicate when it is an inverse (boolean) synonym instead of a
6000 **************************************************************************/
6002 bool lp_canonicalize_parameter(const char *parm_name
, const char **canon_parm
,
6007 if (!lp_parameter_is_valid(parm_name
)) {
6012 num
= map_parameter_canonical(parm_name
, inverse
);
6014 /* parametric option */
6015 *canon_parm
= parm_name
;
6017 *canon_parm
= parm_table
[num
].label
;
6024 /**************************************************************************
6025 Determine the canonical name for a parameter.
6026 Turn the value given into the inverse boolean expression when
6027 the synonym is an invers boolean synonym.
6029 Return True if parm_name is a valid parameter name and
6030 in case it is an invers boolean synonym, if the val string could
6031 successfully be converted to the reverse bool.
6032 Return false in all other cases.
6033 **************************************************************************/
6035 bool lp_canonicalize_parameter_with_value(const char *parm_name
,
6037 const char **canon_parm
,
6038 const char **canon_val
)
6043 if (!lp_parameter_is_valid(parm_name
)) {
6049 num
= map_parameter_canonical(parm_name
, &inverse
);
6051 /* parametric option */
6052 *canon_parm
= parm_name
;
6055 *canon_parm
= parm_table
[num
].label
;
6057 if (!lp_invert_boolean(val
, canon_val
)) {
6069 /***************************************************************************
6070 Map a parameter's string representation to something we can use.
6071 Returns False if the parameter string is not recognised, else TRUE.
6072 ***************************************************************************/
6074 static int map_parameter(const char *pszParmName
)
6078 if (*pszParmName
== '-')
6081 for (iIndex
= 0; parm_table
[iIndex
].label
; iIndex
++)
6082 if (strwicmp(parm_table
[iIndex
].label
, pszParmName
) == 0)
6085 /* Warn only if it isn't parametric option */
6086 if (strchr(pszParmName
, ':') == NULL
)
6087 DEBUG(1, ("Unknown parameter encountered: \"%s\"\n", pszParmName
));
6088 /* We do return 'fail' for parametric options as well because they are
6089 stored in different storage
6094 /***************************************************************************
6095 Map a parameter's string representation to the index of the canonical
6096 form of the parameter (it might be a synonym).
6097 Returns -1 if the parameter string is not recognised.
6098 ***************************************************************************/
6100 static int map_parameter_canonical(const char *pszParmName
, bool *inverse
)
6102 int parm_num
, canon_num
;
6103 bool loc_inverse
= False
;
6105 parm_num
= map_parameter(pszParmName
);
6106 if ((parm_num
< 0) || !(parm_table
[parm_num
].flags
& FLAG_HIDE
)) {
6107 /* invalid, parametric or no canidate for synonyms ... */
6111 for (canon_num
= 0; parm_table
[canon_num
].label
; canon_num
++) {
6112 if (is_synonym_of(parm_num
, canon_num
, &loc_inverse
)) {
6113 parm_num
= canon_num
;
6119 if (inverse
!= NULL
) {
6120 *inverse
= loc_inverse
;
6125 /***************************************************************************
6126 return true if parameter number parm1 is a synonym of parameter
6127 number parm2 (parm2 being the principal name).
6128 set inverse to True if parm1 is P_BOOLREV and parm2 is P_BOOL,
6130 ***************************************************************************/
6132 static bool is_synonym_of(int parm1
, int parm2
, bool *inverse
)
6134 if ((parm_table
[parm1
].ptr
== parm_table
[parm2
].ptr
) &&
6135 (parm_table
[parm1
].flags
& FLAG_HIDE
) &&
6136 !(parm_table
[parm2
].flags
& FLAG_HIDE
))
6138 if (inverse
!= NULL
) {
6139 if ((parm_table
[parm1
].type
== P_BOOLREV
) &&
6140 (parm_table
[parm2
].type
== P_BOOL
))
6152 /***************************************************************************
6153 Show one parameter's name, type, [values,] and flags.
6154 (helper functions for show_parameter_list)
6155 ***************************************************************************/
6157 static void show_parameter(int parmIndex
)
6159 int enumIndex
, flagIndex
;
6164 const char *type
[] = { "P_BOOL", "P_BOOLREV", "P_CHAR", "P_INTEGER",
6165 "P_OCTAL", "P_LIST", "P_STRING", "P_USTRING",
6167 unsigned flags
[] = { FLAG_BASIC
, FLAG_SHARE
, FLAG_PRINT
, FLAG_GLOBAL
,
6168 FLAG_WIZARD
, FLAG_ADVANCED
, FLAG_DEVELOPER
, FLAG_DEPRECATED
,
6169 FLAG_HIDE
, FLAG_DOS_STRING
};
6170 const char *flag_names
[] = { "FLAG_BASIC", "FLAG_SHARE", "FLAG_PRINT",
6171 "FLAG_GLOBAL", "FLAG_WIZARD", "FLAG_ADVANCED", "FLAG_DEVELOPER",
6172 "FLAG_DEPRECATED", "FLAG_HIDE", "FLAG_DOS_STRING", NULL
};
6174 printf("%s=%s", parm_table
[parmIndex
].label
,
6175 type
[parm_table
[parmIndex
].type
]);
6176 if (parm_table
[parmIndex
].type
== P_ENUM
) {
6179 parm_table
[parmIndex
].enum_list
[enumIndex
].name
;
6183 enumIndex
? "|" : "",
6184 parm_table
[parmIndex
].enum_list
[enumIndex
].name
);
6189 for (flagIndex
=0; flag_names
[flagIndex
]; flagIndex
++) {
6190 if (parm_table
[parmIndex
].flags
& flags
[flagIndex
]) {
6193 flag_names
[flagIndex
]);
6198 /* output synonyms */
6200 for (parmIndex2
=0; parm_table
[parmIndex2
].label
; parmIndex2
++) {
6201 if (is_synonym_of(parmIndex
, parmIndex2
, &inverse
)) {
6202 printf(" (%ssynonym of %s)", inverse
? "inverse " : "",
6203 parm_table
[parmIndex2
].label
);
6204 } else if (is_synonym_of(parmIndex2
, parmIndex
, &inverse
)) {
6206 printf(" (synonyms: ");
6211 printf("%s%s", parm_table
[parmIndex2
].label
,
6212 inverse
? "[i]" : "");
6222 /***************************************************************************
6223 Show all parameter's name, type, [values,] and flags.
6224 ***************************************************************************/
6226 void show_parameter_list(void)
6228 int classIndex
, parmIndex
;
6229 const char *section_names
[] = { "local", "global", NULL
};
6231 for (classIndex
=0; section_names
[classIndex
]; classIndex
++) {
6232 printf("[%s]\n", section_names
[classIndex
]);
6233 for (parmIndex
= 0; parm_table
[parmIndex
].label
; parmIndex
++) {
6234 if (parm_table
[parmIndex
].p_class
== classIndex
) {
6235 show_parameter(parmIndex
);
6241 /***************************************************************************
6242 Set a boolean variable from the text value stored in the passed string.
6243 Returns True in success, False if the passed string does not correctly
6244 represent a boolean.
6245 ***************************************************************************/
6247 static bool set_boolean(bool *pb
, const char *pszParmValue
)
6254 if (strwicmp(pszParmValue
, "yes") == 0 ||
6255 strwicmp(pszParmValue
, "true") == 0 ||
6256 strwicmp(pszParmValue
, "1") == 0)
6258 else if (strwicmp(pszParmValue
, "no") == 0 ||
6259 strwicmp(pszParmValue
, "False") == 0 ||
6260 strwicmp(pszParmValue
, "0") == 0)
6264 ("ERROR: Badly formed boolean in configuration file: \"%s\".\n",
6269 if ((pb
!= NULL
) && (bRetval
!= False
)) {
6277 /***************************************************************************
6278 Check if a given string correctly represents a boolean value.
6279 ***************************************************************************/
6281 bool lp_string_is_valid_boolean(const char *parm_value
)
6283 return set_boolean(NULL
, parm_value
);
6286 /***************************************************************************
6287 Get the standard string representation of a boolean value ("yes" or "no")
6288 ***************************************************************************/
6290 static const char *get_boolean(bool bool_value
)
6292 static const char *yes_str
= "yes";
6293 static const char *no_str
= "no";
6295 return (bool_value
? yes_str
: no_str
);
6298 /***************************************************************************
6299 Provide the string of the negated boolean value associated to the boolean
6300 given as a string. Returns False if the passed string does not correctly
6301 represent a boolean.
6302 ***************************************************************************/
6304 bool lp_invert_boolean(const char *str
, const char **inverse_str
)
6308 if (!set_boolean(&val
, str
)) {
6312 *inverse_str
= get_boolean(!val
);
6316 /***************************************************************************
6317 Provide the canonical string representation of a boolean value given
6318 as a string. Return True on success, False if the string given does
6319 not correctly represent a boolean.
6320 ***************************************************************************/
6322 bool lp_canonicalize_boolean(const char *str
, const char**canon_str
)
6326 if (!set_boolean(&val
, str
)) {
6330 *canon_str
= get_boolean(val
);
6334 /***************************************************************************
6335 Find a service by name. Otherwise works like get_service.
6336 ***************************************************************************/
6338 static int getservicebyname(const char *pszServiceName
, struct service
*pserviceDest
)
6344 if (ServiceHash
== NULL
) {
6348 canon_name
= canonicalize_servicename(pszServiceName
);
6350 data
= dbwrap_fetch_bystring(ServiceHash
, canon_name
, canon_name
);
6352 if ((data
.dptr
!= NULL
) && (data
.dsize
== sizeof(iService
))) {
6353 iService
= *(int *)data
.dptr
;
6356 TALLOC_FREE(canon_name
);
6358 if ((iService
!= -1) && (LP_SNUM_OK(iService
))
6359 && (pserviceDest
!= NULL
)) {
6360 copy_service(pserviceDest
, ServicePtrs
[iService
], NULL
);
6366 /***************************************************************************
6367 Copy a service structure to another.
6368 If pcopymapDest is NULL then copy all fields
6369 ***************************************************************************/
6371 static void copy_service(struct service
*pserviceDest
, struct service
*pserviceSource
,
6372 struct bitmap
*pcopymapDest
)
6375 bool bcopyall
= (pcopymapDest
== NULL
);
6376 param_opt_struct
*data
, *pdata
, *paramo
;
6379 for (i
= 0; parm_table
[i
].label
; i
++)
6380 if (parm_table
[i
].ptr
&& parm_table
[i
].p_class
== P_LOCAL
&&
6381 (bcopyall
|| bitmap_query(pcopymapDest
,i
))) {
6382 void *def_ptr
= parm_table
[i
].ptr
;
6384 ((char *)pserviceSource
) + PTR_DIFF(def_ptr
,
6387 ((char *)pserviceDest
) + PTR_DIFF(def_ptr
,
6390 switch (parm_table
[i
].type
) {
6393 *(bool *)dest_ptr
= *(bool *)src_ptr
;
6399 *(int *)dest_ptr
= *(int *)src_ptr
;
6403 *(char *)dest_ptr
= *(char *)src_ptr
;
6407 string_set((char **)dest_ptr
,
6412 string_set((char **)dest_ptr
,
6414 strupper_m(*(char **)dest_ptr
);
6417 TALLOC_FREE(*((char ***)dest_ptr
));
6418 str_list_copy(NULL
, (char ***)dest_ptr
,
6419 *(const char ***)src_ptr
);
6427 init_copymap(pserviceDest
);
6428 if (pserviceSource
->copymap
)
6429 bitmap_copy(pserviceDest
->copymap
,
6430 pserviceSource
->copymap
);
6433 data
= pserviceSource
->param_opt
;
6436 pdata
= pserviceDest
->param_opt
;
6437 /* Traverse destination */
6439 /* If we already have same option, override it */
6440 if (strcmp(pdata
->key
, data
->key
) == 0) {
6441 string_free(&pdata
->value
);
6442 TALLOC_FREE(data
->list
);
6443 pdata
->value
= SMB_STRDUP(data
->value
);
6447 pdata
= pdata
->next
;
6450 paramo
= SMB_XMALLOC_P(param_opt_struct
);
6451 paramo
->key
= SMB_STRDUP(data
->key
);
6452 paramo
->value
= SMB_STRDUP(data
->value
);
6453 paramo
->list
= NULL
;
6454 DLIST_ADD(pserviceDest
->param_opt
, paramo
);
6460 /***************************************************************************
6461 Check a service for consistency. Return False if the service is in any way
6462 incomplete or faulty, else True.
6463 ***************************************************************************/
6465 bool service_ok(int iService
)
6470 if (ServicePtrs
[iService
]->szService
[0] == '\0') {
6471 DEBUG(0, ("The following message indicates an internal error:\n"));
6472 DEBUG(0, ("No service name in service entry.\n"));
6476 /* The [printers] entry MUST be printable. I'm all for flexibility, but */
6477 /* I can't see why you'd want a non-printable printer service... */
6478 if (strwicmp(ServicePtrs
[iService
]->szService
, PRINTERS_NAME
) == 0) {
6479 if (!ServicePtrs
[iService
]->bPrint_ok
) {
6480 DEBUG(0, ("WARNING: [%s] service MUST be printable!\n",
6481 ServicePtrs
[iService
]->szService
));
6482 ServicePtrs
[iService
]->bPrint_ok
= True
;
6484 /* [printers] service must also be non-browsable. */
6485 if (ServicePtrs
[iService
]->bBrowseable
)
6486 ServicePtrs
[iService
]->bBrowseable
= False
;
6489 if (ServicePtrs
[iService
]->szPath
[0] == '\0' &&
6490 strwicmp(ServicePtrs
[iService
]->szService
, HOMES_NAME
) != 0 &&
6491 ServicePtrs
[iService
]->szMSDfsProxy
[0] == '\0'
6493 DEBUG(0, ("WARNING: No path in service %s - making it unavailable!\n",
6494 ServicePtrs
[iService
]->szService
));
6495 ServicePtrs
[iService
]->bAvailable
= False
;
6498 /* If a service is flagged unavailable, log the fact at level 1. */
6499 if (!ServicePtrs
[iService
]->bAvailable
)
6500 DEBUG(1, ("NOTE: Service %s is flagged unavailable.\n",
6501 ServicePtrs
[iService
]->szService
));
6507 * process_registry_globals
6509 static bool process_registry_globals(void)
6512 struct smbconf_service
*service
= NULL
;
6514 TALLOC_CTX
*mem_ctx
= talloc_stackframe();
6517 if (conf_ctx
== NULL
) {
6519 werr
= smbconf_init(NULL
, &conf_ctx
, "registry:");
6520 if (!W_ERROR_IS_OK(werr
)) {
6525 if (!smbconf_share_exists(conf_ctx
, GLOBAL_NAME
)) {
6526 /* nothing to read from the registry yet but make sure lp_load
6527 * doesn't return false */
6532 werr
= smbconf_get_share(conf_ctx
, mem_ctx
, GLOBAL_NAME
, &service
);
6533 if (!W_ERROR_IS_OK(werr
)) {
6537 for (count
= 0; count
< service
->num_params
; count
++) {
6538 ret
= do_parameter(service
->param_names
[count
],
6539 service
->param_values
[count
],
6546 ret
= do_parameter("registry shares", "yes", NULL
);
6548 smbconf_changed(conf_ctx
, &conf_last_csn
, NULL
, NULL
);
6551 TALLOC_FREE(mem_ctx
);
6555 static struct file_lists
{
6556 struct file_lists
*next
;
6560 } *file_lists
= NULL
;
6562 /*******************************************************************
6563 Keep a linked list of all config files so we know when one has changed
6564 it's date and needs to be reloaded.
6565 ********************************************************************/
6567 static void add_to_file_list(const char *fname
, const char *subfname
)
6569 struct file_lists
*f
= file_lists
;
6572 if (f
->name
&& !strcmp(f
->name
, fname
))
6578 f
= SMB_MALLOC_P(struct file_lists
);
6581 f
->next
= file_lists
;
6582 f
->name
= SMB_STRDUP(fname
);
6587 f
->subfname
= SMB_STRDUP(subfname
);
6593 f
->modtime
= file_modtime(subfname
);
6595 time_t t
= file_modtime(subfname
);
6602 * Utility function for outsiders to check if we're running on registry.
6604 bool lp_config_backend_is_registry(void)
6606 return (lp_config_backend() == CONFIG_BACKEND_REGISTRY
);
6610 * Utility function to check if the config backend is FILE.
6612 bool lp_config_backend_is_file(void)
6614 return (lp_config_backend() == CONFIG_BACKEND_FILE
);
6617 /*******************************************************************
6618 Check if a config file has changed date.
6619 ********************************************************************/
6621 bool lp_file_list_changed(void)
6623 struct file_lists
*f
= file_lists
;
6625 DEBUG(6, ("lp_file_list_changed()\n"));
6627 if (lp_config_backend_is_registry()) {
6628 if (conf_ctx
== NULL
) {
6630 werr
= smbconf_init(NULL
, &conf_ctx
, "registry:");
6631 if (!W_ERROR_IS_OK(werr
)) {
6632 DEBUG(0, ("error opening configuration: %s\n",
6637 if (smbconf_changed(conf_ctx
, &conf_last_csn
, NULL
, NULL
)) {
6638 DEBUGADD(6, ("registry config changed\n"));
6647 n2
= alloc_sub_basic(get_current_username(),
6648 current_user_info
.domain
,
6653 DEBUGADD(6, ("file %s -> %s last mod_time: %s\n",
6654 f
->name
, n2
, ctime(&f
->modtime
)));
6656 mod_time
= file_modtime(n2
);
6658 if (mod_time
&& ((f
->modtime
!= mod_time
) || (f
->subfname
== NULL
) || (strcmp(n2
, f
->subfname
) != 0))) {
6660 ("file %s modified: %s\n", n2
,
6662 f
->modtime
= mod_time
;
6663 SAFE_FREE(f
->subfname
);
6664 f
->subfname
= n2
; /* Passing ownership of
6665 return from alloc_sub_basic
6676 /***************************************************************************
6677 Run standard_sub_basic on netbios name... needed because global_myname
6678 is not accessed through any lp_ macro.
6679 Note: We must *NOT* use string_set() here as ptr points to global_myname.
6680 ***************************************************************************/
6682 static bool handle_netbios_name(int snum
, const char *pszParmValue
, char **ptr
)
6685 char *netbios_name
= alloc_sub_basic(get_current_username(),
6686 current_user_info
.domain
,
6689 ret
= set_global_myname(netbios_name
);
6690 SAFE_FREE(netbios_name
);
6691 string_set(&Globals
.szNetbiosName
,global_myname());
6693 DEBUG(4, ("handle_netbios_name: set global_myname to: %s\n",
6699 static bool handle_charset(int snum
, const char *pszParmValue
, char **ptr
)
6701 if (strcmp(*ptr
, pszParmValue
) != 0) {
6702 string_set(ptr
, pszParmValue
);
6710 static bool handle_workgroup(int snum
, const char *pszParmValue
, char **ptr
)
6714 ret
= set_global_myworkgroup(pszParmValue
);
6715 string_set(&Globals
.szWorkgroup
,lp_workgroup());
6720 static bool handle_netbios_scope(int snum
, const char *pszParmValue
, char **ptr
)
6724 ret
= set_global_scope(pszParmValue
);
6725 string_set(&Globals
.szNetbiosScope
,global_scope());
6730 static bool handle_netbios_aliases(int snum
, const char *pszParmValue
, char **ptr
)
6732 TALLOC_FREE(Globals
.szNetbiosAliases
);
6733 Globals
.szNetbiosAliases
= str_list_make(NULL
, pszParmValue
, NULL
);
6734 return set_netbios_aliases((const char **)Globals
.szNetbiosAliases
);
6737 /***************************************************************************
6738 Handle the include operation.
6739 ***************************************************************************/
6740 static bool bAllowIncludeRegistry
= true;
6742 static bool handle_include(int snum
, const char *pszParmValue
, char **ptr
)
6746 if (strequal(pszParmValue
, INCLUDE_REGISTRY_NAME
)) {
6747 if (!bAllowIncludeRegistry
) {
6750 if (bInGlobalSection
) {
6751 return process_registry_globals();
6753 DEBUG(1, ("\"include = registry\" only effective "
6754 "in %s section\n", GLOBAL_NAME
));
6759 fname
= alloc_sub_basic(get_current_username(),
6760 current_user_info
.domain
,
6763 add_to_file_list(pszParmValue
, fname
);
6765 string_set(ptr
, fname
);
6767 if (file_exist(fname
, NULL
)) {
6768 bool ret
= pm_process(fname
, do_section
, do_parameter
, NULL
);
6773 DEBUG(2, ("Can't find include file %s\n", fname
));
6778 /***************************************************************************
6779 Handle the interpretation of the copy parameter.
6780 ***************************************************************************/
6782 static bool handle_copy(int snum
, const char *pszParmValue
, char **ptr
)
6786 struct service serviceTemp
;
6788 string_set(ptr
, pszParmValue
);
6790 init_service(&serviceTemp
);
6794 DEBUG(3, ("Copying service from service %s\n", pszParmValue
));
6796 if ((iTemp
= getservicebyname(pszParmValue
, &serviceTemp
)) >= 0) {
6797 if (iTemp
== iServiceIndex
) {
6798 DEBUG(0, ("Can't copy service %s - unable to copy self!\n", pszParmValue
));
6800 copy_service(ServicePtrs
[iServiceIndex
],
6802 ServicePtrs
[iServiceIndex
]->copymap
);
6806 DEBUG(0, ("Unable to copy service - source not found: %s\n", pszParmValue
));
6810 free_service(&serviceTemp
);
6814 static bool handle_ldap_debug_level(int snum
, const char *pszParmValue
, char **ptr
)
6816 Globals
.ldap_debug_level
= lp_int(pszParmValue
);
6817 init_ldap_debugging();
6821 /***************************************************************************
6822 Handle idmap/non unix account uid and gid allocation parameters. The format of these
6827 idmap uid = 1000-1999
6830 We only do simple parsing checks here. The strings are parsed into useful
6831 structures in the idmap daemon code.
6833 ***************************************************************************/
6835 /* Some lp_ routines to return idmap [ug]id information */
6837 static uid_t idmap_uid_low
, idmap_uid_high
;
6838 static gid_t idmap_gid_low
, idmap_gid_high
;
6840 bool lp_idmap_uid(uid_t
*low
, uid_t
*high
)
6842 if (idmap_uid_low
== 0 || idmap_uid_high
== 0)
6846 *low
= idmap_uid_low
;
6849 *high
= idmap_uid_high
;
6854 bool lp_idmap_gid(gid_t
*low
, gid_t
*high
)
6856 if (idmap_gid_low
== 0 || idmap_gid_high
== 0)
6860 *low
= idmap_gid_low
;
6863 *high
= idmap_gid_high
;
6868 /* Do some simple checks on "idmap [ug]id" parameter values */
6870 static bool handle_idmap_uid(int snum
, const char *pszParmValue
, char **ptr
)
6874 if (sscanf(pszParmValue
, "%u - %u", &low
, &high
) != 2 || high
< low
)
6879 string_set(ptr
, pszParmValue
);
6881 idmap_uid_low
= low
;
6882 idmap_uid_high
= high
;
6887 static bool handle_idmap_gid(int snum
, const char *pszParmValue
, char **ptr
)
6891 if (sscanf(pszParmValue
, "%u - %u", &low
, &high
) != 2 || high
< low
)
6896 string_set(ptr
, pszParmValue
);
6898 idmap_gid_low
= low
;
6899 idmap_gid_high
= high
;
6904 /***************************************************************************
6905 Handle the DEBUG level list.
6906 ***************************************************************************/
6908 static bool handle_debug_list( int snum
, const char *pszParmValueIn
, char **ptr
)
6910 string_set(ptr
, pszParmValueIn
);
6911 return debug_parse_levels(pszParmValueIn
);
6914 /***************************************************************************
6915 Handle ldap suffixes - default to ldapsuffix if sub-suffixes are not defined.
6916 ***************************************************************************/
6918 static const char *append_ldap_suffix( const char *str
)
6920 const char *suffix_string
;
6923 suffix_string
= talloc_asprintf(talloc_tos(), "%s,%s", str
,
6924 Globals
.szLdapSuffix
);
6925 if ( !suffix_string
) {
6926 DEBUG(0,("append_ldap_suffix: talloc_asprintf() failed!\n"));
6930 return suffix_string
;
6933 const char *lp_ldap_machine_suffix(void)
6935 if (Globals
.szLdapMachineSuffix
[0])
6936 return append_ldap_suffix(Globals
.szLdapMachineSuffix
);
6938 return lp_string(Globals
.szLdapSuffix
);
6941 const char *lp_ldap_user_suffix(void)
6943 if (Globals
.szLdapUserSuffix
[0])
6944 return append_ldap_suffix(Globals
.szLdapUserSuffix
);
6946 return lp_string(Globals
.szLdapSuffix
);
6949 const char *lp_ldap_group_suffix(void)
6951 if (Globals
.szLdapGroupSuffix
[0])
6952 return append_ldap_suffix(Globals
.szLdapGroupSuffix
);
6954 return lp_string(Globals
.szLdapSuffix
);
6957 const char *lp_ldap_idmap_suffix(void)
6959 if (Globals
.szLdapIdmapSuffix
[0])
6960 return append_ldap_suffix(Globals
.szLdapIdmapSuffix
);
6962 return lp_string(Globals
.szLdapSuffix
);
6965 /****************************************************************************
6966 set the value for a P_ENUM
6967 ***************************************************************************/
6969 static void lp_set_enum_parm( struct parm_struct
*parm
, const char *pszParmValue
,
6974 for (i
= 0; parm
->enum_list
[i
].name
; i
++) {
6975 if ( strequal(pszParmValue
, parm
->enum_list
[i
].name
)) {
6976 *ptr
= parm
->enum_list
[i
].value
;
6982 /***************************************************************************
6983 ***************************************************************************/
6985 static bool handle_printing(int snum
, const char *pszParmValue
, char **ptr
)
6987 static int parm_num
= -1;
6990 if ( parm_num
== -1 )
6991 parm_num
= map_parameter( "printing" );
6993 lp_set_enum_parm( &parm_table
[parm_num
], pszParmValue
, (int*)ptr
);
6998 s
= ServicePtrs
[snum
];
7000 init_printer_values( s
);
7006 /***************************************************************************
7007 Initialise a copymap.
7008 ***************************************************************************/
7010 static void init_copymap(struct service
*pservice
)
7013 if (pservice
->copymap
) {
7014 bitmap_free(pservice
->copymap
);
7016 pservice
->copymap
= bitmap_allocate(NUMPARAMETERS
);
7017 if (!pservice
->copymap
)
7019 ("Couldn't allocate copymap!! (size %d)\n",
7020 (int)NUMPARAMETERS
));
7022 for (i
= 0; i
< NUMPARAMETERS
; i
++)
7023 bitmap_set(pservice
->copymap
, i
);
7026 /***************************************************************************
7027 Return the local pointer to a parameter given the service number and the
7028 pointer into the default structure.
7029 ***************************************************************************/
7031 void *lp_local_ptr(int snum
, void *ptr
)
7033 return (void *)(((char *)ServicePtrs
[snum
]) + PTR_DIFF(ptr
, &sDefault
));
7036 /***************************************************************************
7037 Process a parameter for a particular service number. If snum < 0
7038 then assume we are in the globals.
7039 ***************************************************************************/
7041 bool lp_do_parameter(int snum
, const char *pszParmName
, const char *pszParmValue
)
7043 int parmnum
, i
, slen
;
7044 void *parm_ptr
= NULL
; /* where we are going to store the result */
7045 void *def_ptr
= NULL
;
7046 char *param_key
= NULL
;
7048 param_opt_struct
*paramo
, *data
;
7051 parmnum
= map_parameter(pszParmName
);
7054 if ((sep
=strchr(pszParmName
, ':')) != NULL
) {
7055 TALLOC_CTX
*frame
= talloc_stackframe();
7058 param_key
= talloc_asprintf(frame
, "%s:", pszParmName
);
7063 slen
= strlen(param_key
);
7064 param_key
= talloc_asprintf_append(param_key
, sep
+1);
7069 trim_char(param_key
+slen
, ' ', ' ');
7071 data
= (snum
< 0) ? Globals
.param_opt
:
7072 ServicePtrs
[snum
]->param_opt
;
7073 /* Traverse destination */
7075 /* If we already have same option, override it */
7076 if (strcmp(data
->key
, param_key
) == 0) {
7077 string_free(&data
->value
);
7078 TALLOC_FREE(data
->list
);
7079 data
->value
= SMB_STRDUP(pszParmValue
);
7086 paramo
= SMB_XMALLOC_P(param_opt_struct
);
7087 paramo
->key
= SMB_STRDUP(param_key
);
7088 paramo
->value
= SMB_STRDUP(pszParmValue
);
7089 paramo
->list
= NULL
;
7091 DLIST_ADD(Globals
.param_opt
, paramo
);
7093 DLIST_ADD(ServicePtrs
[snum
]->param_opt
, paramo
);
7101 DEBUG(0, ("Ignoring unknown parameter \"%s\"\n", pszParmName
));
7105 if (parm_table
[parmnum
].flags
& FLAG_DEPRECATED
) {
7106 DEBUG(1, ("WARNING: The \"%s\" option is deprecated\n",
7110 def_ptr
= parm_table
[parmnum
].ptr
;
7112 /* we might point at a service, the default service or a global */
7116 if (parm_table
[parmnum
].p_class
== P_GLOBAL
) {
7118 ("Global parameter %s found in service section!\n",
7123 ((char *)ServicePtrs
[snum
]) + PTR_DIFF(def_ptr
,
7128 if (!ServicePtrs
[snum
]->copymap
)
7129 init_copymap(ServicePtrs
[snum
]);
7131 /* this handles the aliases - set the copymap for other entries with
7132 the same data pointer */
7133 for (i
= 0; parm_table
[i
].label
; i
++)
7134 if (parm_table
[i
].ptr
== parm_table
[parmnum
].ptr
)
7135 bitmap_clear(ServicePtrs
[snum
]->copymap
, i
);
7138 /* if it is a special case then go ahead */
7139 if (parm_table
[parmnum
].special
) {
7140 parm_table
[parmnum
].special(snum
, pszParmValue
, (char **)parm_ptr
);
7144 /* now switch on the type of variable it is */
7145 switch (parm_table
[parmnum
].type
)
7148 *(bool *)parm_ptr
= lp_bool(pszParmValue
);
7152 *(bool *)parm_ptr
= !lp_bool(pszParmValue
);
7156 *(int *)parm_ptr
= lp_int(pszParmValue
);
7160 *(char *)parm_ptr
= *pszParmValue
;
7164 i
= sscanf(pszParmValue
, "%o", (int *)parm_ptr
);
7166 DEBUG ( 0, ("Invalid octal number %s\n", pszParmName
));
7171 TALLOC_FREE(*((char ***)parm_ptr
));
7172 *(char ***)parm_ptr
= str_list_make(
7173 NULL
, pszParmValue
, NULL
);
7177 string_set((char **)parm_ptr
, pszParmValue
);
7181 string_set((char **)parm_ptr
, pszParmValue
);
7182 strupper_m(*(char **)parm_ptr
);
7186 lp_set_enum_parm( &parm_table
[parmnum
], pszParmValue
, (int*)parm_ptr
);
7195 /***************************************************************************
7196 Process a parameter.
7197 ***************************************************************************/
7199 static bool do_parameter(const char *pszParmName
, const char *pszParmValue
,
7202 if (!bInGlobalSection
&& bGlobalOnly
)
7205 DEBUGADD(4, ("doing parameter %s = %s\n", pszParmName
, pszParmValue
));
7207 return (lp_do_parameter(bInGlobalSection
? -2 : iServiceIndex
,
7208 pszParmName
, pszParmValue
));
7211 /***************************************************************************
7212 Print a parameter of the specified type.
7213 ***************************************************************************/
7215 static void print_parameter(struct parm_struct
*p
, void *ptr
, FILE * f
)
7221 for (i
= 0; p
->enum_list
[i
].name
; i
++) {
7222 if (*(int *)ptr
== p
->enum_list
[i
].value
) {
7224 p
->enum_list
[i
].name
);
7231 fprintf(f
, "%s", BOOLSTR(*(bool *)ptr
));
7235 fprintf(f
, "%s", BOOLSTR(!*(bool *)ptr
));
7239 fprintf(f
, "%d", *(int *)ptr
);
7243 fprintf(f
, "%c", *(char *)ptr
);
7247 char *o
= octal_string(*(int *)ptr
);
7248 fprintf(f
, "%s", o
);
7254 if ((char ***)ptr
&& *(char ***)ptr
) {
7255 char **list
= *(char ***)ptr
;
7256 for (; *list
; list
++) {
7257 /* surround strings with whitespace in double quotes */
7258 if ( strchr_m( *list
, ' ' ) )
7259 fprintf(f
, "\"%s\"%s", *list
, ((*(list
+1))?", ":""));
7261 fprintf(f
, "%s%s", *list
, ((*(list
+1))?", ":""));
7268 if (*(char **)ptr
) {
7269 fprintf(f
, "%s", *(char **)ptr
);
7277 /***************************************************************************
7278 Check if two parameters are equal.
7279 ***************************************************************************/
7281 static bool equal_parameter(parm_type type
, void *ptr1
, void *ptr2
)
7286 return (*((bool *)ptr1
) == *((bool *)ptr2
));
7291 return (*((int *)ptr1
) == *((int *)ptr2
));
7294 return (*((char *)ptr1
) == *((char *)ptr2
));
7297 return str_list_compare(*(char ***)ptr1
, *(char ***)ptr2
);
7302 char *p1
= *(char **)ptr1
, *p2
= *(char **)ptr2
;
7307 return (p1
== p2
|| strequal(p1
, p2
));
7315 /***************************************************************************
7316 Initialize any local varients in the sDefault table.
7317 ***************************************************************************/
7319 void init_locals(void)
7324 /***************************************************************************
7325 Process a new section (service). At this stage all sections are services.
7326 Later we'll have special sections that permit server parameters to be set.
7327 Returns True on success, False on failure.
7328 ***************************************************************************/
7330 static bool do_section(const char *pszSectionName
, void *userdata
)
7333 bool isglobal
= ((strwicmp(pszSectionName
, GLOBAL_NAME
) == 0) ||
7334 (strwicmp(pszSectionName
, GLOBAL_NAME2
) == 0));
7337 /* if we were in a global section then do the local inits */
7338 if (bInGlobalSection
&& !isglobal
)
7341 /* if we've just struck a global section, note the fact. */
7342 bInGlobalSection
= isglobal
;
7344 /* check for multiple global sections */
7345 if (bInGlobalSection
) {
7346 DEBUG(3, ("Processing section \"[%s]\"\n", pszSectionName
));
7350 if (!bInGlobalSection
&& bGlobalOnly
)
7353 /* if we have a current service, tidy it up before moving on */
7356 if (iServiceIndex
>= 0)
7357 bRetval
= service_ok(iServiceIndex
);
7359 /* if all is still well, move to the next record in the services array */
7361 /* We put this here to avoid an odd message order if messages are */
7362 /* issued by the post-processing of a previous section. */
7363 DEBUG(2, ("Processing section \"[%s]\"\n", pszSectionName
));
7365 if ((iServiceIndex
= add_a_service(&sDefault
, pszSectionName
))
7367 DEBUG(0, ("Failed to add a new service\n"));
7376 /***************************************************************************
7377 Determine if a partcular base parameter is currentl set to the default value.
7378 ***************************************************************************/
7380 static bool is_default(int i
)
7382 if (!defaults_saved
)
7384 switch (parm_table
[i
].type
) {
7386 return str_list_compare (parm_table
[i
].def
.lvalue
,
7387 *(char ***)parm_table
[i
].ptr
);
7390 return strequal(parm_table
[i
].def
.svalue
,
7391 *(char **)parm_table
[i
].ptr
);
7394 return parm_table
[i
].def
.bvalue
==
7395 *(bool *)parm_table
[i
].ptr
;
7397 return parm_table
[i
].def
.cvalue
==
7398 *(char *)parm_table
[i
].ptr
;
7402 return parm_table
[i
].def
.ivalue
==
7403 *(int *)parm_table
[i
].ptr
;
7410 /***************************************************************************
7411 Display the contents of the global structure.
7412 ***************************************************************************/
7414 static void dump_globals(FILE *f
)
7417 param_opt_struct
*data
;
7419 fprintf(f
, "[global]\n");
7421 for (i
= 0; parm_table
[i
].label
; i
++)
7422 if (parm_table
[i
].p_class
== P_GLOBAL
&&
7423 parm_table
[i
].ptr
&&
7424 (i
== 0 || (parm_table
[i
].ptr
!= parm_table
[i
- 1].ptr
))) {
7425 if (defaults_saved
&& is_default(i
))
7427 fprintf(f
, "\t%s = ", parm_table
[i
].label
);
7428 print_parameter(&parm_table
[i
], parm_table
[i
].ptr
, f
);
7431 if (Globals
.param_opt
!= NULL
) {
7432 data
= Globals
.param_opt
;
7434 fprintf(f
, "\t%s = %s\n", data
->key
, data
->value
);
7441 /***************************************************************************
7442 Return True if a local parameter is currently set to the global default.
7443 ***************************************************************************/
7445 bool lp_is_default(int snum
, struct parm_struct
*parm
)
7447 int pdiff
= PTR_DIFF(parm
->ptr
, &sDefault
);
7449 return equal_parameter(parm
->type
,
7450 ((char *)ServicePtrs
[snum
]) + pdiff
,
7451 ((char *)&sDefault
) + pdiff
);
7454 /***************************************************************************
7455 Display the contents of a single services record.
7456 ***************************************************************************/
7458 static void dump_a_service(struct service
*pService
, FILE * f
)
7461 param_opt_struct
*data
;
7463 if (pService
!= &sDefault
)
7464 fprintf(f
, "[%s]\n", pService
->szService
);
7466 for (i
= 0; parm_table
[i
].label
; i
++) {
7468 if (parm_table
[i
].p_class
== P_LOCAL
&&
7469 parm_table
[i
].ptr
&&
7470 (*parm_table
[i
].label
!= '-') &&
7471 (i
== 0 || (parm_table
[i
].ptr
!= parm_table
[i
- 1].ptr
)))
7474 int pdiff
= PTR_DIFF(parm_table
[i
].ptr
, &sDefault
);
7476 if (pService
== &sDefault
) {
7477 if (defaults_saved
&& is_default(i
))
7480 if (equal_parameter(parm_table
[i
].type
,
7481 ((char *)pService
) +
7483 ((char *)&sDefault
) +
7488 fprintf(f
, "\t%s = ", parm_table
[i
].label
);
7489 print_parameter(&parm_table
[i
],
7490 ((char *)pService
) + pdiff
, f
);
7495 if (pService
->param_opt
!= NULL
) {
7496 data
= pService
->param_opt
;
7498 fprintf(f
, "\t%s = %s\n", data
->key
, data
->value
);
7504 /***************************************************************************
7505 Display the contents of a parameter of a single services record.
7506 ***************************************************************************/
7508 bool dump_a_parameter(int snum
, char *parm_name
, FILE * f
, bool isGlobal
)
7511 bool result
= False
;
7514 fstring local_parm_name
;
7516 const char *parm_opt_value
;
7518 /* check for parametrical option */
7519 fstrcpy( local_parm_name
, parm_name
);
7520 parm_opt
= strchr( local_parm_name
, ':');
7525 if (strlen(parm_opt
)) {
7526 parm_opt_value
= lp_parm_const_string( snum
,
7527 local_parm_name
, parm_opt
, NULL
);
7528 if (parm_opt_value
) {
7529 printf( "%s\n", parm_opt_value
);
7536 /* check for a key and print the value */
7543 for (i
= 0; parm_table
[i
].label
; i
++) {
7544 if (strwicmp(parm_table
[i
].label
, parm_name
) == 0 &&
7545 (parm_table
[i
].p_class
== p_class
|| parm_table
[i
].flags
& flag
) &&
7546 parm_table
[i
].ptr
&&
7547 (*parm_table
[i
].label
!= '-') &&
7548 (i
== 0 || (parm_table
[i
].ptr
!= parm_table
[i
- 1].ptr
)))
7553 ptr
= parm_table
[i
].ptr
;
7555 struct service
*pService
= ServicePtrs
[snum
];
7556 ptr
= ((char *)pService
) +
7557 PTR_DIFF(parm_table
[i
].ptr
, &sDefault
);
7560 print_parameter(&parm_table
[i
],
7571 /***************************************************************************
7572 Return info about the requested parameter (given as a string).
7573 Return NULL when the string is not a valid parameter name.
7574 ***************************************************************************/
7576 struct parm_struct
*lp_get_parameter(const char *param_name
)
7578 int num
= map_parameter(param_name
);
7584 return &parm_table
[num
];
7587 /***************************************************************************
7588 Return info about the next parameter in a service.
7589 snum==GLOBAL_SECTION_SNUM gives the globals.
7590 Return NULL when out of parameters.
7591 ***************************************************************************/
7593 struct parm_struct
*lp_next_parameter(int snum
, int *i
, int allparameters
)
7596 /* do the globals */
7597 for (; parm_table
[*i
].label
; (*i
)++) {
7598 if (parm_table
[*i
].p_class
== P_SEPARATOR
)
7599 return &parm_table
[(*i
)++];
7601 if (!parm_table
[*i
].ptr
7602 || (*parm_table
[*i
].label
== '-'))
7606 && (parm_table
[*i
].ptr
==
7607 parm_table
[(*i
) - 1].ptr
))
7610 if (is_default(*i
) && !allparameters
)
7613 return &parm_table
[(*i
)++];
7616 struct service
*pService
= ServicePtrs
[snum
];
7618 for (; parm_table
[*i
].label
; (*i
)++) {
7619 if (parm_table
[*i
].p_class
== P_SEPARATOR
)
7620 return &parm_table
[(*i
)++];
7622 if (parm_table
[*i
].p_class
== P_LOCAL
&&
7623 parm_table
[*i
].ptr
&&
7624 (*parm_table
[*i
].label
!= '-') &&
7626 (parm_table
[*i
].ptr
!=
7627 parm_table
[(*i
) - 1].ptr
)))
7630 PTR_DIFF(parm_table
[*i
].ptr
,
7633 if (allparameters
||
7634 !equal_parameter(parm_table
[*i
].type
,
7635 ((char *)pService
) +
7637 ((char *)&sDefault
) +
7640 return &parm_table
[(*i
)++];
7651 /***************************************************************************
7652 Display the contents of a single copy structure.
7653 ***************************************************************************/
7654 static void dump_copy_map(bool *pcopymap
)
7660 printf("\n\tNon-Copied parameters:\n");
7662 for (i
= 0; parm_table
[i
].label
; i
++)
7663 if (parm_table
[i
].p_class
== P_LOCAL
&&
7664 parm_table
[i
].ptr
&& !pcopymap
[i
] &&
7665 (i
== 0 || (parm_table
[i
].ptr
!= parm_table
[i
- 1].ptr
)))
7667 printf("\t\t%s\n", parm_table
[i
].label
);
7672 /***************************************************************************
7673 Return TRUE if the passed service number is within range.
7674 ***************************************************************************/
7676 bool lp_snum_ok(int iService
)
7678 return (LP_SNUM_OK(iService
) && ServicePtrs
[iService
]->bAvailable
);
7681 /***************************************************************************
7682 Auto-load some home services.
7683 ***************************************************************************/
7685 static void lp_add_auto_services(char *str
)
7695 s
= SMB_STRDUP(str
);
7699 homes
= lp_servicenumber(HOMES_NAME
);
7701 for (p
= strtok_r(s
, LIST_SEP
, &saveptr
); p
;
7702 p
= strtok_r(NULL
, LIST_SEP
, &saveptr
)) {
7705 if (lp_servicenumber(p
) >= 0)
7708 home
= get_user_home_dir(talloc_tos(), p
);
7710 if (home
&& homes
>= 0)
7711 lp_add_home(p
, homes
, p
, home
);
7718 /***************************************************************************
7719 Auto-load one printer.
7720 ***************************************************************************/
7722 void lp_add_one_printer(char *name
, char *comment
)
7724 int printers
= lp_servicenumber(PRINTERS_NAME
);
7727 if (lp_servicenumber(name
) < 0) {
7728 lp_add_printer(name
, printers
);
7729 if ((i
= lp_servicenumber(name
)) >= 0) {
7730 string_set(&ServicePtrs
[i
]->comment
, comment
);
7731 ServicePtrs
[i
]->autoloaded
= True
;
7736 /***************************************************************************
7737 Have we loaded a services file yet?
7738 ***************************************************************************/
7740 bool lp_loaded(void)
7745 /***************************************************************************
7746 Unload unused services.
7747 ***************************************************************************/
7749 void lp_killunused(bool (*snumused
) (int))
7752 for (i
= 0; i
< iNumServices
; i
++) {
7756 /* don't kill autoloaded or usershare services */
7757 if ( ServicePtrs
[i
]->autoloaded
||
7758 ServicePtrs
[i
]->usershare
== USERSHARE_VALID
) {
7762 if (!snumused
|| !snumused(i
)) {
7763 free_service_byindex(i
);
7769 * Kill all except autoloaded and usershare services - convenience wrapper
7771 void lp_kill_all_services(void)
7773 lp_killunused(NULL
);
7776 /***************************************************************************
7778 ***************************************************************************/
7780 void lp_killservice(int iServiceIn
)
7782 if (VALID(iServiceIn
)) {
7783 free_service_byindex(iServiceIn
);
7787 /***************************************************************************
7788 Save the curent values of all global and sDefault parameters into the
7789 defaults union. This allows swat and testparm to show only the
7790 changed (ie. non-default) parameters.
7791 ***************************************************************************/
7793 static void lp_save_defaults(void)
7796 for (i
= 0; parm_table
[i
].label
; i
++) {
7797 if (i
> 0 && parm_table
[i
].ptr
== parm_table
[i
- 1].ptr
)
7799 switch (parm_table
[i
].type
) {
7802 NULL
, &(parm_table
[i
].def
.lvalue
),
7803 *(const char ***)parm_table
[i
].ptr
);
7807 if (parm_table
[i
].ptr
) {
7808 parm_table
[i
].def
.svalue
= SMB_STRDUP(*(char **)parm_table
[i
].ptr
);
7810 parm_table
[i
].def
.svalue
= NULL
;
7815 parm_table
[i
].def
.bvalue
=
7816 *(bool *)parm_table
[i
].ptr
;
7819 parm_table
[i
].def
.cvalue
=
7820 *(char *)parm_table
[i
].ptr
;
7825 parm_table
[i
].def
.ivalue
=
7826 *(int *)parm_table
[i
].ptr
;
7832 defaults_saved
= True
;
7835 /*******************************************************************
7836 Set the server type we will announce as via nmbd.
7837 ********************************************************************/
7839 static const struct srv_role_tab
{
7841 const char *role_str
;
7842 } srv_role_tab
[] = {
7843 { ROLE_STANDALONE
, "ROLE_STANDALONE" },
7844 { ROLE_DOMAIN_MEMBER
, "ROLE_DOMAIN_MEMBER" },
7845 { ROLE_DOMAIN_BDC
, "ROLE_DOMAIN_BDC" },
7846 { ROLE_DOMAIN_PDC
, "ROLE_DOMAIN_PDC" },
7850 const char* server_role_str(uint32 role
)
7853 for (i
=0; srv_role_tab
[i
].role_str
; i
++) {
7854 if (role
== srv_role_tab
[i
].role
) {
7855 return srv_role_tab
[i
].role_str
;
7861 static void set_server_role(void)
7863 server_role
= ROLE_STANDALONE
;
7865 switch (lp_security()) {
7867 if (lp_domain_logons())
7868 DEBUG(0, ("Server's Role (logon server) conflicts with share-level security\n"));
7871 if (lp_domain_logons())
7872 DEBUG(0, ("Server's Role (logon server) conflicts with server-level security\n"));
7873 /* this used to be considered ROLE_DOMAIN_MEMBER but that's just wrong */
7874 server_role
= ROLE_STANDALONE
;
7877 if (lp_domain_logons()) {
7878 DEBUG(1, ("Server's Role (logon server) NOT ADVISED with domain-level security\n"));
7879 server_role
= ROLE_DOMAIN_BDC
;
7882 server_role
= ROLE_DOMAIN_MEMBER
;
7885 if (lp_domain_logons()) {
7886 server_role
= ROLE_DOMAIN_PDC
;
7889 server_role
= ROLE_DOMAIN_MEMBER
;
7892 if (lp_domain_logons()) {
7894 if (Globals
.iDomainMaster
) /* auto or yes */
7895 server_role
= ROLE_DOMAIN_PDC
;
7897 server_role
= ROLE_DOMAIN_BDC
;
7901 DEBUG(0, ("Server's Role undefined due to unknown security mode\n"));
7905 DEBUG(10, ("set_server_role: role = %s\n", server_role_str(server_role
)));
7908 /***********************************************************
7909 If we should send plaintext/LANMAN passwords in the clinet
7910 ************************************************************/
7912 static void set_allowed_client_auth(void)
7914 if (Globals
.bClientNTLMv2Auth
) {
7915 Globals
.bClientLanManAuth
= False
;
7917 if (!Globals
.bClientLanManAuth
) {
7918 Globals
.bClientPlaintextAuth
= False
;
7922 /***************************************************************************
7924 The following code allows smbd to read a user defined share file.
7925 Yes, this is my intent. Yes, I'm comfortable with that...
7927 THE FOLLOWING IS SECURITY CRITICAL CODE.
7929 It washes your clothes, it cleans your house, it guards you while you sleep...
7930 Do not f%^k with it....
7931 ***************************************************************************/
7933 #define MAX_USERSHARE_FILE_SIZE (10*1024)
7935 /***************************************************************************
7936 Check allowed stat state of a usershare file.
7937 Ensure we print out who is dicking with us so the admin can
7938 get their sorry ass fired.
7939 ***************************************************************************/
7941 static bool check_usershare_stat(const char *fname
, SMB_STRUCT_STAT
*psbuf
)
7943 if (!S_ISREG(psbuf
->st_mode
)) {
7944 DEBUG(0,("check_usershare_stat: file %s owned by uid %u is "
7945 "not a regular file\n",
7946 fname
, (unsigned int)psbuf
->st_uid
));
7950 /* Ensure this doesn't have the other write bit set. */
7951 if (psbuf
->st_mode
& S_IWOTH
) {
7952 DEBUG(0,("check_usershare_stat: file %s owned by uid %u allows "
7953 "public write. Refusing to allow as a usershare file.\n",
7954 fname
, (unsigned int)psbuf
->st_uid
));
7958 /* Should be 10k or less. */
7959 if (psbuf
->st_size
> MAX_USERSHARE_FILE_SIZE
) {
7960 DEBUG(0,("check_usershare_stat: file %s owned by uid %u is "
7961 "too large (%u) to be a user share file.\n",
7962 fname
, (unsigned int)psbuf
->st_uid
,
7963 (unsigned int)psbuf
->st_size
));
7970 /***************************************************************************
7971 Parse the contents of a usershare file.
7972 ***************************************************************************/
7974 enum usershare_err
parse_usershare_file(TALLOC_CTX
*ctx
,
7975 SMB_STRUCT_STAT
*psbuf
,
7976 const char *servicename
,
7980 char **pp_sharepath
,
7985 const char **prefixallowlist
= lp_usershare_prefix_allow_list();
7986 const char **prefixdenylist
= lp_usershare_prefix_deny_list();
7989 SMB_STRUCT_STAT sbuf
;
7990 char *sharepath
= NULL
;
7991 char *comment
= NULL
;
7993 *pp_sharepath
= NULL
;
7996 *pallow_guest
= False
;
7999 return USERSHARE_MALFORMED_FILE
;
8002 if (strcmp(lines
[0], "#VERSION 1") == 0) {
8004 } else if (strcmp(lines
[0], "#VERSION 2") == 0) {
8007 return USERSHARE_MALFORMED_FILE
;
8010 return USERSHARE_BAD_VERSION
;
8013 if (strncmp(lines
[1], "path=", 5) != 0) {
8014 return USERSHARE_MALFORMED_PATH
;
8017 sharepath
= talloc_strdup(ctx
, &lines
[1][5]);
8019 return USERSHARE_POSIX_ERR
;
8021 trim_string(sharepath
, " ", " ");
8023 if (strncmp(lines
[2], "comment=", 8) != 0) {
8024 return USERSHARE_MALFORMED_COMMENT_DEF
;
8027 comment
= talloc_strdup(ctx
, &lines
[2][8]);
8029 return USERSHARE_POSIX_ERR
;
8031 trim_string(comment
, " ", " ");
8032 trim_char(comment
, '"', '"');
8034 if (strncmp(lines
[3], "usershare_acl=", 14) != 0) {
8035 return USERSHARE_MALFORMED_ACL_DEF
;
8038 if (!parse_usershare_acl(ctx
, &lines
[3][14], ppsd
)) {
8039 return USERSHARE_ACL_ERR
;
8043 if (strncmp(lines
[4], "guest_ok=", 9) != 0) {
8044 return USERSHARE_MALFORMED_ACL_DEF
;
8046 if (lines
[4][9] == 'y') {
8047 *pallow_guest
= True
;
8051 if (snum
!= -1 && (strcmp(sharepath
, ServicePtrs
[snum
]->szPath
) == 0)) {
8052 /* Path didn't change, no checks needed. */
8053 *pp_sharepath
= sharepath
;
8054 *pp_comment
= comment
;
8055 return USERSHARE_OK
;
8058 /* The path *must* be absolute. */
8059 if (sharepath
[0] != '/') {
8060 DEBUG(2,("parse_usershare_file: share %s: path %s is not an absolute path.\n",
8061 servicename
, sharepath
));
8062 return USERSHARE_PATH_NOT_ABSOLUTE
;
8065 /* If there is a usershare prefix deny list ensure one of these paths
8066 doesn't match the start of the user given path. */
8067 if (prefixdenylist
) {
8069 for ( i
=0; prefixdenylist
[i
]; i
++ ) {
8070 DEBUG(10,("parse_usershare_file: share %s : checking prefixdenylist[%d]='%s' against %s\n",
8071 servicename
, i
, prefixdenylist
[i
], sharepath
));
8072 if (memcmp( sharepath
, prefixdenylist
[i
], strlen(prefixdenylist
[i
])) == 0) {
8073 DEBUG(2,("parse_usershare_file: share %s path %s starts with one of the "
8074 "usershare prefix deny list entries.\n",
8075 servicename
, sharepath
));
8076 return USERSHARE_PATH_IS_DENIED
;
8081 /* If there is a usershare prefix allow list ensure one of these paths
8082 does match the start of the user given path. */
8084 if (prefixallowlist
) {
8086 for ( i
=0; prefixallowlist
[i
]; i
++ ) {
8087 DEBUG(10,("parse_usershare_file: share %s checking prefixallowlist[%d]='%s' against %s\n",
8088 servicename
, i
, prefixallowlist
[i
], sharepath
));
8089 if (memcmp( sharepath
, prefixallowlist
[i
], strlen(prefixallowlist
[i
])) == 0) {
8093 if (prefixallowlist
[i
] == NULL
) {
8094 DEBUG(2,("parse_usershare_file: share %s path %s doesn't start with one of the "
8095 "usershare prefix allow list entries.\n",
8096 servicename
, sharepath
));
8097 return USERSHARE_PATH_NOT_ALLOWED
;
8101 /* Ensure this is pointing to a directory. */
8102 dp
= sys_opendir(sharepath
);
8105 DEBUG(2,("parse_usershare_file: share %s path %s is not a directory.\n",
8106 servicename
, sharepath
));
8107 return USERSHARE_PATH_NOT_DIRECTORY
;
8110 /* Ensure the owner of the usershare file has permission to share
8113 if (sys_stat(sharepath
, &sbuf
) == -1) {
8114 DEBUG(2,("parse_usershare_file: share %s : stat failed on path %s. %s\n",
8115 servicename
, sharepath
, strerror(errno
) ));
8117 return USERSHARE_POSIX_ERR
;
8122 if (!S_ISDIR(sbuf
.st_mode
)) {
8123 DEBUG(2,("parse_usershare_file: share %s path %s is not a directory.\n",
8124 servicename
, sharepath
));
8125 return USERSHARE_PATH_NOT_DIRECTORY
;
8128 /* Check if sharing is restricted to owner-only. */
8129 /* psbuf is the stat of the usershare definition file,
8130 sbuf is the stat of the target directory to be shared. */
8132 if (lp_usershare_owner_only()) {
8133 /* root can share anything. */
8134 if ((psbuf
->st_uid
!= 0) && (sbuf
.st_uid
!= psbuf
->st_uid
)) {
8135 return USERSHARE_PATH_NOT_ALLOWED
;
8139 *pp_sharepath
= sharepath
;
8140 *pp_comment
= comment
;
8141 return USERSHARE_OK
;
8144 /***************************************************************************
8145 Deal with a usershare file.
8148 -1 - Bad name, invalid contents.
8149 - service name already existed and not a usershare, problem
8150 with permissions to share directory etc.
8151 ***************************************************************************/
8153 static int process_usershare_file(const char *dir_name
, const char *file_name
, int snum_template
)
8155 SMB_STRUCT_STAT sbuf
;
8156 SMB_STRUCT_STAT lsbuf
;
8158 char *sharepath
= NULL
;
8159 char *comment
= NULL
;
8160 fstring service_name
;
8161 char **lines
= NULL
;
8165 TALLOC_CTX
*ctx
= NULL
;
8166 SEC_DESC
*psd
= NULL
;
8167 bool guest_ok
= False
;
8169 /* Ensure share name doesn't contain invalid characters. */
8170 if (!validate_net_name(file_name
, INVALID_SHARENAME_CHARS
, strlen(file_name
))) {
8171 DEBUG(0,("process_usershare_file: share name %s contains "
8172 "invalid characters (any of %s)\n",
8173 file_name
, INVALID_SHARENAME_CHARS
));
8177 fstrcpy(service_name
, file_name
);
8179 if (asprintf(&fname
, "%s/%s", dir_name
, file_name
) < 0) {
8182 /* Minimize the race condition by doing an lstat before we
8183 open and fstat. Ensure this isn't a symlink link. */
8185 if (sys_lstat(fname
, &lsbuf
) != 0) {
8186 DEBUG(0,("process_usershare_file: stat of %s failed. %s\n",
8187 fname
, strerror(errno
) ));
8192 /* This must be a regular file, not a symlink, directory or
8193 other strange filetype. */
8194 if (!check_usershare_stat(fname
, &lsbuf
)) {
8200 char *canon_name
= canonicalize_servicename(service_name
);
8201 TDB_DATA data
= dbwrap_fetch_bystring(
8202 ServiceHash
, canon_name
, canon_name
);
8206 if ((data
.dptr
!= NULL
) && (data
.dsize
== sizeof(iService
))) {
8207 iService
= *(int *)data
.dptr
;
8209 TALLOC_FREE(canon_name
);
8212 if (iService
!= -1 && ServicePtrs
[iService
]->usershare_last_mod
== lsbuf
.st_mtime
) {
8213 /* Nothing changed - Mark valid and return. */
8214 DEBUG(10,("process_usershare_file: service %s not changed.\n",
8216 ServicePtrs
[iService
]->usershare
= USERSHARE_VALID
;
8221 /* Try and open the file read only - no symlinks allowed. */
8223 fd
= sys_open(fname
, O_RDONLY
|O_NOFOLLOW
, 0);
8225 fd
= sys_open(fname
, O_RDONLY
, 0);
8229 DEBUG(0,("process_usershare_file: unable to open %s. %s\n",
8230 fname
, strerror(errno
) ));
8235 /* Now fstat to be *SURE* it's a regular file. */
8236 if (sys_fstat(fd
, &sbuf
) != 0) {
8238 DEBUG(0,("process_usershare_file: fstat of %s failed. %s\n",
8239 fname
, strerror(errno
) ));
8244 /* Is it the same dev/inode as was lstated ? */
8245 if (lsbuf
.st_dev
!= sbuf
.st_dev
|| lsbuf
.st_ino
!= sbuf
.st_ino
) {
8247 DEBUG(0,("process_usershare_file: fstat of %s is a different file from lstat. "
8248 "Symlink spoofing going on ?\n", fname
));
8253 /* This must be a regular file, not a symlink, directory or
8254 other strange filetype. */
8255 if (!check_usershare_stat(fname
, &sbuf
)) {
8260 lines
= fd_lines_load(fd
, &numlines
, MAX_USERSHARE_FILE_SIZE
);
8263 if (lines
== NULL
) {
8264 DEBUG(0,("process_usershare_file: loading file %s owned by %u failed.\n",
8265 fname
, (unsigned int)sbuf
.st_uid
));
8272 /* Should we allow printers to be shared... ? */
8273 ctx
= talloc_init("usershare_sd_xctx");
8275 file_lines_free(lines
);
8279 if (parse_usershare_file(ctx
, &sbuf
, service_name
,
8280 iService
, lines
, numlines
, &sharepath
,
8281 &comment
, &psd
, &guest_ok
) != USERSHARE_OK
) {
8282 talloc_destroy(ctx
);
8283 file_lines_free(lines
);
8287 file_lines_free(lines
);
8289 /* Everything ok - add the service possibly using a template. */
8291 const struct service
*sp
= &sDefault
;
8292 if (snum_template
!= -1) {
8293 sp
= ServicePtrs
[snum_template
];
8296 if ((iService
= add_a_service(sp
, service_name
)) < 0) {
8297 DEBUG(0, ("process_usershare_file: Failed to add "
8298 "new service %s\n", service_name
));
8299 talloc_destroy(ctx
);
8303 /* Read only is controlled by usershare ACL below. */
8304 ServicePtrs
[iService
]->bRead_only
= False
;
8307 /* Write the ACL of the new/modified share. */
8308 if (!set_share_security(service_name
, psd
)) {
8309 DEBUG(0, ("process_usershare_file: Failed to set share "
8310 "security for user share %s\n",
8312 lp_remove_service(iService
);
8313 talloc_destroy(ctx
);
8317 /* If from a template it may be marked invalid. */
8318 ServicePtrs
[iService
]->valid
= True
;
8320 /* Set the service as a valid usershare. */
8321 ServicePtrs
[iService
]->usershare
= USERSHARE_VALID
;
8323 /* Set guest access. */
8324 if (lp_usershare_allow_guests()) {
8325 ServicePtrs
[iService
]->bGuest_ok
= guest_ok
;
8328 /* And note when it was loaded. */
8329 ServicePtrs
[iService
]->usershare_last_mod
= sbuf
.st_mtime
;
8330 string_set(&ServicePtrs
[iService
]->szPath
, sharepath
);
8331 string_set(&ServicePtrs
[iService
]->comment
, comment
);
8333 talloc_destroy(ctx
);
8338 /***************************************************************************
8339 Checks if a usershare entry has been modified since last load.
8340 ***************************************************************************/
8342 static bool usershare_exists(int iService
, time_t *last_mod
)
8344 SMB_STRUCT_STAT lsbuf
;
8345 const char *usersharepath
= Globals
.szUsersharePath
;
8348 if (asprintf(&fname
, "%s/%s",
8350 ServicePtrs
[iService
]->szService
) < 0) {
8354 if (sys_lstat(fname
, &lsbuf
) != 0) {
8359 if (!S_ISREG(lsbuf
.st_mode
)) {
8365 *last_mod
= lsbuf
.st_mtime
;
8369 /***************************************************************************
8370 Load a usershare service by name. Returns a valid servicenumber or -1.
8371 ***************************************************************************/
8373 int load_usershare_service(const char *servicename
)
8375 SMB_STRUCT_STAT sbuf
;
8376 const char *usersharepath
= Globals
.szUsersharePath
;
8377 int max_user_shares
= Globals
.iUsershareMaxShares
;
8378 int snum_template
= -1;
8380 if (*usersharepath
== 0 || max_user_shares
== 0) {
8384 if (sys_stat(usersharepath
, &sbuf
) != 0) {
8385 DEBUG(0,("load_usershare_service: stat of %s failed. %s\n",
8386 usersharepath
, strerror(errno
) ));
8390 if (!S_ISDIR(sbuf
.st_mode
)) {
8391 DEBUG(0,("load_usershare_service: %s is not a directory.\n",
8397 * This directory must be owned by root, and have the 't' bit set.
8398 * It also must not be writable by "other".
8402 if (sbuf
.st_uid
!= 0 || !(sbuf
.st_mode
& S_ISVTX
) || (sbuf
.st_mode
& S_IWOTH
)) {
8404 if (sbuf
.st_uid
!= 0 || (sbuf
.st_mode
& S_IWOTH
)) {
8406 DEBUG(0,("load_usershare_service: directory %s is not owned by root "
8407 "or does not have the sticky bit 't' set or is writable by anyone.\n",
8412 /* Ensure the template share exists if it's set. */
8413 if (Globals
.szUsershareTemplateShare
[0]) {
8414 /* We can't use lp_servicenumber here as we are recommending that
8415 template shares have -valid=False set. */
8416 for (snum_template
= iNumServices
- 1; snum_template
>= 0; snum_template
--) {
8417 if (ServicePtrs
[snum_template
]->szService
&&
8418 strequal(ServicePtrs
[snum_template
]->szService
,
8419 Globals
.szUsershareTemplateShare
)) {
8424 if (snum_template
== -1) {
8425 DEBUG(0,("load_usershare_service: usershare template share %s "
8426 "does not exist.\n",
8427 Globals
.szUsershareTemplateShare
));
8432 return process_usershare_file(usersharepath
, servicename
, snum_template
);
8435 /***************************************************************************
8436 Load all user defined shares from the user share directory.
8437 We only do this if we're enumerating the share list.
8438 This is the function that can delete usershares that have
8440 ***************************************************************************/
8442 int load_usershare_shares(void)
8445 SMB_STRUCT_STAT sbuf
;
8446 SMB_STRUCT_DIRENT
*de
;
8447 int num_usershares
= 0;
8448 int max_user_shares
= Globals
.iUsershareMaxShares
;
8449 unsigned int num_dir_entries
, num_bad_dir_entries
, num_tmp_dir_entries
;
8450 unsigned int allowed_bad_entries
= ((2*max_user_shares
)/10);
8451 unsigned int allowed_tmp_entries
= ((2*max_user_shares
)/10);
8453 int snum_template
= -1;
8454 const char *usersharepath
= Globals
.szUsersharePath
;
8455 int ret
= lp_numservices();
8457 if (max_user_shares
== 0 || *usersharepath
== '\0') {
8458 return lp_numservices();
8461 if (sys_stat(usersharepath
, &sbuf
) != 0) {
8462 DEBUG(0,("load_usershare_shares: stat of %s failed. %s\n",
8463 usersharepath
, strerror(errno
) ));
8468 * This directory must be owned by root, and have the 't' bit set.
8469 * It also must not be writable by "other".
8473 if (sbuf
.st_uid
!= 0 || !(sbuf
.st_mode
& S_ISVTX
) || (sbuf
.st_mode
& S_IWOTH
)) {
8475 if (sbuf
.st_uid
!= 0 || (sbuf
.st_mode
& S_IWOTH
)) {
8477 DEBUG(0,("load_usershare_shares: directory %s is not owned by root "
8478 "or does not have the sticky bit 't' set or is writable by anyone.\n",
8483 /* Ensure the template share exists if it's set. */
8484 if (Globals
.szUsershareTemplateShare
[0]) {
8485 /* We can't use lp_servicenumber here as we are recommending that
8486 template shares have -valid=False set. */
8487 for (snum_template
= iNumServices
- 1; snum_template
>= 0; snum_template
--) {
8488 if (ServicePtrs
[snum_template
]->szService
&&
8489 strequal(ServicePtrs
[snum_template
]->szService
,
8490 Globals
.szUsershareTemplateShare
)) {
8495 if (snum_template
== -1) {
8496 DEBUG(0,("load_usershare_shares: usershare template share %s "
8497 "does not exist.\n",
8498 Globals
.szUsershareTemplateShare
));
8503 /* Mark all existing usershares as pending delete. */
8504 for (iService
= iNumServices
- 1; iService
>= 0; iService
--) {
8505 if (VALID(iService
) && ServicePtrs
[iService
]->usershare
) {
8506 ServicePtrs
[iService
]->usershare
= USERSHARE_PENDING_DELETE
;
8510 dp
= sys_opendir(usersharepath
);
8512 DEBUG(0,("load_usershare_shares:: failed to open directory %s. %s\n",
8513 usersharepath
, strerror(errno
) ));
8517 for (num_dir_entries
= 0, num_bad_dir_entries
= 0, num_tmp_dir_entries
= 0;
8518 (de
= sys_readdir(dp
));
8519 num_dir_entries
++ ) {
8521 const char *n
= de
->d_name
;
8523 /* Ignore . and .. */
8525 if ((n
[1] == '\0') || (n
[1] == '.' && n
[2] == '\0')) {
8531 /* Temporary file used when creating a share. */
8532 num_tmp_dir_entries
++;
8535 /* Allow 20% tmp entries. */
8536 if (num_tmp_dir_entries
> allowed_tmp_entries
) {
8537 DEBUG(0,("load_usershare_shares: too many temp entries (%u) "
8538 "in directory %s\n",
8539 num_tmp_dir_entries
, usersharepath
));
8543 r
= process_usershare_file(usersharepath
, n
, snum_template
);
8545 /* Update the services count. */
8547 if (num_usershares
>= max_user_shares
) {
8548 DEBUG(0,("load_usershare_shares: max user shares reached "
8549 "on file %s in directory %s\n",
8550 n
, usersharepath
));
8553 } else if (r
== -1) {
8554 num_bad_dir_entries
++;
8557 /* Allow 20% bad entries. */
8558 if (num_bad_dir_entries
> allowed_bad_entries
) {
8559 DEBUG(0,("load_usershare_shares: too many bad entries (%u) "
8560 "in directory %s\n",
8561 num_bad_dir_entries
, usersharepath
));
8565 /* Allow 20% bad entries. */
8566 if (num_dir_entries
> max_user_shares
+ allowed_bad_entries
) {
8567 DEBUG(0,("load_usershare_shares: too many total entries (%u) "
8568 "in directory %s\n",
8569 num_dir_entries
, usersharepath
));
8576 /* Sweep through and delete any non-refreshed usershares that are
8577 not currently in use. */
8578 for (iService
= iNumServices
- 1; iService
>= 0; iService
--) {
8579 if (VALID(iService
) && (ServicePtrs
[iService
]->usershare
== USERSHARE_PENDING_DELETE
)) {
8580 if (conn_snum_used(iService
)) {
8583 /* Remove from the share ACL db. */
8584 DEBUG(10,("load_usershare_shares: Removing deleted usershare %s\n",
8585 lp_servicename(iService
) ));
8586 delete_share_security(lp_servicename(iService
));
8587 free_service_byindex(iService
);
8591 return lp_numservices();
8594 /********************************************************
8595 Destroy global resources allocated in this file
8596 ********************************************************/
8598 void gfree_loadparm(void)
8600 struct file_lists
*f
;
8601 struct file_lists
*next
;
8604 /* Free the file lists */
8609 SAFE_FREE( f
->name
);
8610 SAFE_FREE( f
->subfname
);
8615 /* Free resources allocated to services */
8617 for ( i
= 0; i
< iNumServices
; i
++ ) {
8619 free_service_byindex(i
);
8623 SAFE_FREE( ServicePtrs
);
8626 /* Now release all resources allocated to global
8627 parameters and the default service */
8629 for (i
= 0; parm_table
[i
].label
; i
++)
8631 if ( parm_table
[i
].type
== P_STRING
8632 || parm_table
[i
].type
== P_USTRING
)
8634 string_free( (char**)parm_table
[i
].ptr
);
8636 else if (parm_table
[i
].type
== P_LIST
) {
8637 TALLOC_FREE( *((char***)parm_table
[i
].ptr
) );
8643 /***************************************************************************
8644 Allow client apps to specify that they are a client
8645 ***************************************************************************/
8646 void lp_set_in_client(bool b
)
8652 /***************************************************************************
8653 Determine if we're running in a client app
8654 ***************************************************************************/
8655 bool lp_is_in_client(void)
8663 /***************************************************************************
8664 Load the services array from the services file. Return True on success,
8666 ***************************************************************************/
8668 bool lp_load_ex(const char *pszFname
,
8672 bool initialize_globals
,
8673 bool allow_include_registry
)
8677 param_opt_struct
*data
, *pdata
;
8681 DEBUG(3, ("lp_load_ex: refreshing parameters\n"));
8683 bInGlobalSection
= True
;
8684 bGlobalOnly
= global_only
;
8685 bAllowIncludeRegistry
= allow_include_registry
;
8687 init_globals(! initialize_globals
);
8690 if (save_defaults
) {
8695 if (Globals
.param_opt
!= NULL
) {
8696 data
= Globals
.param_opt
;
8698 string_free(&data
->key
);
8699 string_free(&data
->value
);
8700 TALLOC_FREE(data
->list
);
8705 Globals
.param_opt
= NULL
;
8708 if (lp_config_backend_is_file()) {
8709 n2
= alloc_sub_basic(get_current_username(),
8710 current_user_info
.domain
,
8713 smb_panic("lp_load_ex: out of memory");
8716 add_to_file_list(pszFname
, n2
);
8718 /* We get sections first, so have to start 'behind' to make up */
8720 bRetval
= pm_process(n2
, do_section
, do_parameter
, NULL
);
8723 /* finish up the last section */
8724 DEBUG(4, ("pm_process() returned %s\n", BOOLSTR(bRetval
)));
8726 if (iServiceIndex
>= 0) {
8727 bRetval
= service_ok(iServiceIndex
);
8731 if (lp_config_backend_is_registry()) {
8732 /* config backend changed to registry in config file */
8734 * We need to use this extra global variable here to
8735 * survive restart: init_globals uses this as a default
8736 * for ConfigBackend. Otherwise, init_globals would
8737 * send us into an endless loop here.
8739 config_backend
= CONFIG_BACKEND_REGISTRY
;
8741 DEBUG(1, ("lp_load_ex: changing to config backend "
8743 init_globals(false);
8744 lp_kill_all_services();
8745 return lp_load_ex(pszFname
, global_only
, save_defaults
,
8746 add_ipc
, initialize_globals
,
8747 allow_include_registry
);
8749 } else if (lp_config_backend_is_registry()) {
8750 bRetval
= process_registry_globals();
8752 DEBUG(0, ("Illegal config backend given: %d\n",
8753 lp_config_backend()));
8757 lp_add_auto_services(lp_auto_services());
8760 /* When 'restrict anonymous = 2' guest connections to ipc$
8762 lp_add_ipc("IPC$", (lp_restrict_anonymous() < 2));
8763 if ( lp_enable_asu_support() ) {
8764 lp_add_ipc("ADMIN$", false);
8769 set_default_server_announce_type();
8770 set_allowed_client_auth();
8774 /* Now we check bWINSsupport and set szWINSserver to 127.0.0.1 */
8775 /* if bWINSsupport is true and we are in the client */
8776 if (lp_is_in_client() && Globals
.bWINSsupport
) {
8777 lp_do_parameter(GLOBAL_SECTION_SNUM
, "wins server", "127.0.0.1");
8782 bAllowIncludeRegistry
= true;
8787 bool lp_load(const char *pszFname
,
8791 bool initialize_globals
)
8793 return lp_load_ex(pszFname
,
8801 bool lp_load_initial_only(const char *pszFname
)
8803 return lp_load_ex(pszFname
,
8811 /***************************************************************************
8812 Reset the max number of services.
8813 ***************************************************************************/
8815 void lp_resetnumservices(void)
8820 /***************************************************************************
8821 Return the max number of services.
8822 ***************************************************************************/
8824 int lp_numservices(void)
8826 return (iNumServices
);
8829 /***************************************************************************
8830 Display the contents of the services array in human-readable form.
8831 ***************************************************************************/
8833 void lp_dump(FILE *f
, bool show_defaults
, int maxtoprint
)
8838 defaults_saved
= False
;
8842 dump_a_service(&sDefault
, f
);
8844 for (iService
= 0; iService
< maxtoprint
; iService
++) {
8846 lp_dump_one(f
, show_defaults
, iService
);
8850 /***************************************************************************
8851 Display the contents of one service in human-readable form.
8852 ***************************************************************************/
8854 void lp_dump_one(FILE * f
, bool show_defaults
, int snum
)
8857 if (ServicePtrs
[snum
]->szService
[0] == '\0')
8859 dump_a_service(ServicePtrs
[snum
], f
);
8863 /***************************************************************************
8864 Return the number of the service with the given name, or -1 if it doesn't
8865 exist. Note that this is a DIFFERENT ANIMAL from the internal function
8866 getservicebyname()! This works ONLY if all services have been loaded, and
8867 does not copy the found service.
8868 ***************************************************************************/
8870 int lp_servicenumber(const char *pszServiceName
)
8873 fstring serviceName
;
8875 if (!pszServiceName
) {
8876 return GLOBAL_SECTION_SNUM
;
8879 for (iService
= iNumServices
- 1; iService
>= 0; iService
--) {
8880 if (VALID(iService
) && ServicePtrs
[iService
]->szService
) {
8882 * The substitution here is used to support %U is
8885 fstrcpy(serviceName
, ServicePtrs
[iService
]->szService
);
8886 standard_sub_basic(get_current_username(),
8887 current_user_info
.domain
,
8888 serviceName
,sizeof(serviceName
));
8889 if (strequal(serviceName
, pszServiceName
)) {
8895 if (iService
>= 0 && ServicePtrs
[iService
]->usershare
== USERSHARE_VALID
) {
8898 if (!usershare_exists(iService
, &last_mod
)) {
8899 /* Remove the share security tdb entry for it. */
8900 delete_share_security(lp_servicename(iService
));
8901 /* Remove it from the array. */
8902 free_service_byindex(iService
);
8903 /* Doesn't exist anymore. */
8904 return GLOBAL_SECTION_SNUM
;
8907 /* Has it been modified ? If so delete and reload. */
8908 if (ServicePtrs
[iService
]->usershare_last_mod
< last_mod
) {
8909 /* Remove it from the array. */
8910 free_service_byindex(iService
);
8911 /* and now reload it. */
8912 iService
= load_usershare_service(pszServiceName
);
8917 DEBUG(7,("lp_servicenumber: couldn't find %s\n", pszServiceName
));
8918 return GLOBAL_SECTION_SNUM
;
8924 bool share_defined(const char *service_name
)
8926 return (lp_servicenumber(service_name
) != -1);
8929 struct share_params
*get_share_params(TALLOC_CTX
*mem_ctx
,
8930 const char *sharename
)
8932 struct share_params
*result
;
8936 if (!(sname
= SMB_STRDUP(sharename
))) {
8940 snum
= find_service(sname
);
8947 if (!(result
= TALLOC_P(mem_ctx
, struct share_params
))) {
8948 DEBUG(0, ("talloc failed\n"));
8952 result
->service
= snum
;
8956 struct share_iterator
*share_list_all(TALLOC_CTX
*mem_ctx
)
8958 struct share_iterator
*result
;
8960 if (!(result
= TALLOC_P(mem_ctx
, struct share_iterator
))) {
8961 DEBUG(0, ("talloc failed\n"));
8965 result
->next_id
= 0;
8969 struct share_params
*next_share(struct share_iterator
*list
)
8971 struct share_params
*result
;
8973 while (!lp_snum_ok(list
->next_id
) &&
8974 (list
->next_id
< lp_numservices())) {
8978 if (list
->next_id
>= lp_numservices()) {
8982 if (!(result
= TALLOC_P(list
, struct share_params
))) {
8983 DEBUG(0, ("talloc failed\n"));
8987 result
->service
= list
->next_id
;
8992 struct share_params
*next_printer(struct share_iterator
*list
)
8994 struct share_params
*result
;
8996 while ((result
= next_share(list
)) != NULL
) {
8997 if (lp_print_ok(result
->service
)) {
9005 * This is a hack for a transition period until we transformed all code from
9006 * service numbers to struct share_params.
9009 struct share_params
*snum2params_static(int snum
)
9011 static struct share_params result
;
9012 result
.service
= snum
;
9016 /*******************************************************************
9017 A useful volume label function.
9018 ********************************************************************/
9020 const char *volume_label(int snum
)
9023 const char *label
= lp_volume(snum
);
9025 label
= lp_servicename(snum
);
9028 /* This returns a 33 byte guarenteed null terminated string. */
9029 ret
= talloc_strndup(talloc_tos(), label
, 32);
9036 /*******************************************************************
9037 Set the server type we will announce as via nmbd.
9038 ********************************************************************/
9040 static void set_default_server_announce_type(void)
9042 default_server_announce
= 0;
9043 default_server_announce
|= SV_TYPE_WORKSTATION
;
9044 default_server_announce
|= SV_TYPE_SERVER
;
9045 default_server_announce
|= SV_TYPE_SERVER_UNIX
;
9047 /* note that the flag should be set only if we have a
9048 printer service but nmbd doesn't actually load the
9049 services so we can't tell --jerry */
9051 default_server_announce
|= SV_TYPE_PRINTQ_SERVER
;
9053 switch (lp_announce_as()) {
9054 case ANNOUNCE_AS_NT_SERVER
:
9055 default_server_announce
|= SV_TYPE_SERVER_NT
;
9056 /* fall through... */
9057 case ANNOUNCE_AS_NT_WORKSTATION
:
9058 default_server_announce
|= SV_TYPE_NT
;
9060 case ANNOUNCE_AS_WIN95
:
9061 default_server_announce
|= SV_TYPE_WIN95_PLUS
;
9063 case ANNOUNCE_AS_WFW
:
9064 default_server_announce
|= SV_TYPE_WFW
;
9070 switch (lp_server_role()) {
9071 case ROLE_DOMAIN_MEMBER
:
9072 default_server_announce
|= SV_TYPE_DOMAIN_MEMBER
;
9074 case ROLE_DOMAIN_PDC
:
9075 default_server_announce
|= SV_TYPE_DOMAIN_CTRL
;
9077 case ROLE_DOMAIN_BDC
:
9078 default_server_announce
|= SV_TYPE_DOMAIN_BAKCTRL
;
9080 case ROLE_STANDALONE
:
9084 if (lp_time_server())
9085 default_server_announce
|= SV_TYPE_TIME_SOURCE
;
9087 if (lp_host_msdfs())
9088 default_server_announce
|= SV_TYPE_DFS_SERVER
;
9091 /***********************************************************
9092 returns role of Samba server
9093 ************************************************************/
9095 int lp_server_role(void)
9100 /***********************************************************
9101 If we are PDC then prefer us as DMB
9102 ************************************************************/
9104 bool lp_domain_master(void)
9106 if (Globals
.iDomainMaster
== Auto
)
9107 return (lp_server_role() == ROLE_DOMAIN_PDC
);
9109 return (bool)Globals
.iDomainMaster
;
9112 /***********************************************************
9113 If we are DMB then prefer us as LMB
9114 ************************************************************/
9116 bool lp_preferred_master(void)
9118 if (Globals
.iPreferredMaster
== Auto
)
9119 return (lp_local_master() && lp_domain_master());
9121 return (bool)Globals
.iPreferredMaster
;
9124 /*******************************************************************
9126 ********************************************************************/
9128 void lp_remove_service(int snum
)
9130 ServicePtrs
[snum
]->valid
= False
;
9131 invalid_services
[num_invalid_services
++] = snum
;
9134 /*******************************************************************
9136 ********************************************************************/
9138 void lp_copy_service(int snum
, const char *new_name
)
9140 do_section(new_name
, NULL
);
9142 snum
= lp_servicenumber(new_name
);
9144 lp_do_parameter(snum
, "copy", lp_servicename(snum
));
9149 /*******************************************************************
9150 Get the default server type we will announce as via nmbd.
9151 ********************************************************************/
9153 int lp_default_server_announce(void)
9155 return default_server_announce
;
9158 /*******************************************************************
9159 Split the announce version into major and minor numbers.
9160 ********************************************************************/
9162 int lp_major_announce_version(void)
9164 static bool got_major
= False
;
9165 static int major_version
= DEFAULT_MAJOR_VERSION
;
9170 return major_version
;
9173 if ((vers
= lp_announce_version()) == NULL
)
9174 return major_version
;
9176 if ((p
= strchr_m(vers
, '.')) == 0)
9177 return major_version
;
9180 major_version
= atoi(vers
);
9181 return major_version
;
9184 int lp_minor_announce_version(void)
9186 static bool got_minor
= False
;
9187 static int minor_version
= DEFAULT_MINOR_VERSION
;
9192 return minor_version
;
9195 if ((vers
= lp_announce_version()) == NULL
)
9196 return minor_version
;
9198 if ((p
= strchr_m(vers
, '.')) == 0)
9199 return minor_version
;
9202 minor_version
= atoi(p
);
9203 return minor_version
;
9206 /***********************************************************
9207 Set the global name resolution order (used in smbclient).
9208 ************************************************************/
9210 void lp_set_name_resolve_order(const char *new_order
)
9212 string_set(&Globals
.szNameResolveOrder
, new_order
);
9215 const char *lp_printername(int snum
)
9217 const char *ret
= _lp_printername(snum
);
9218 if (ret
== NULL
|| (ret
!= NULL
&& *ret
== '\0'))
9219 ret
= lp_const_servicename(snum
);
9225 /***********************************************************
9226 Allow daemons such as winbindd to fix their logfile name.
9227 ************************************************************/
9229 void lp_set_logfile(const char *name
)
9231 string_set(&Globals
.szLogFile
, name
);
9232 debug_set_logfile(name
);
9235 /*******************************************************************
9236 Return the max print jobs per queue.
9237 ********************************************************************/
9239 int lp_maxprintjobs(int snum
)
9241 int maxjobs
= LP_SNUM_OK(snum
) ? ServicePtrs
[snum
]->iMaxPrintJobs
: sDefault
.iMaxPrintJobs
;
9242 if (maxjobs
<= 0 || maxjobs
>= PRINT_MAX_JOBID
)
9243 maxjobs
= PRINT_MAX_JOBID
- 1;
9248 const char *lp_printcapname(void)
9250 if ((Globals
.szPrintcapname
!= NULL
) &&
9251 (Globals
.szPrintcapname
[0] != '\0'))
9252 return Globals
.szPrintcapname
;
9254 if (sDefault
.iPrinting
== PRINT_CUPS
) {
9262 if (sDefault
.iPrinting
== PRINT_BSD
)
9263 return "/etc/printcap";
9265 return PRINTCAP_NAME
;
9268 /*******************************************************************
9269 Ensure we don't use sendfile if server smb signing is active.
9270 ********************************************************************/
9272 static uint32 spoolss_state
;
9274 bool lp_disable_spoolss( void )
9276 if ( spoolss_state
== SVCCTL_STATE_UNKNOWN
)
9277 spoolss_state
= _lp_disable_spoolss() ? SVCCTL_STOPPED
: SVCCTL_RUNNING
;
9279 return spoolss_state
== SVCCTL_STOPPED
? True
: False
;
9282 void lp_set_spoolss_state( uint32 state
)
9284 SMB_ASSERT( (state
== SVCCTL_STOPPED
) || (state
== SVCCTL_RUNNING
) );
9286 spoolss_state
= state
;
9289 uint32
lp_get_spoolss_state( void )
9291 return lp_disable_spoolss() ? SVCCTL_STOPPED
: SVCCTL_RUNNING
;
9294 /*******************************************************************
9295 Ensure we don't use sendfile if server smb signing is active.
9296 ********************************************************************/
9298 bool lp_use_sendfile(int snum
)
9300 /* Using sendfile blows the brains out of any DOS or Win9x TCP stack... JRA. */
9301 if (Protocol
< PROTOCOL_NT1
) {
9304 return (_lp_use_sendfile(snum
) &&
9305 (get_remote_arch() != RA_WIN95
) &&
9306 !srv_is_signing_active());
9309 /*******************************************************************
9310 Turn off sendfile if we find the underlying OS doesn't support it.
9311 ********************************************************************/
9313 void set_use_sendfile(int snum
, bool val
)
9315 if (LP_SNUM_OK(snum
))
9316 ServicePtrs
[snum
]->bUseSendfile
= val
;
9318 sDefault
.bUseSendfile
= val
;
9321 /*******************************************************************
9322 Turn off storing DOS attributes if this share doesn't support it.
9323 ********************************************************************/
9325 void set_store_dos_attributes(int snum
, bool val
)
9327 if (!LP_SNUM_OK(snum
))
9329 ServicePtrs
[(snum
)]->bStoreDosAttributes
= val
;
9332 void lp_set_mangling_method(const char *new_method
)
9334 string_set(&Globals
.szManglingMethod
, new_method
);
9337 /*******************************************************************
9338 Global state for POSIX pathname processing.
9339 ********************************************************************/
9341 static bool posix_pathnames
;
9343 bool lp_posix_pathnames(void)
9345 return posix_pathnames
;
9348 /*******************************************************************
9349 Change everything needed to ensure POSIX pathname processing (currently
9351 ********************************************************************/
9353 void lp_set_posix_pathnames(void)
9355 posix_pathnames
= True
;
9358 /*******************************************************************
9359 Global state for POSIX lock processing - CIFS unix extensions.
9360 ********************************************************************/
9362 bool posix_default_lock_was_set
;
9363 static enum brl_flavour posix_cifsx_locktype
; /* By default 0 == WINDOWS_LOCK */
9365 enum brl_flavour
lp_posix_cifsu_locktype(files_struct
*fsp
)
9367 if (posix_default_lock_was_set
) {
9368 return posix_cifsx_locktype
;
9370 return fsp
->posix_open
? POSIX_LOCK
: WINDOWS_LOCK
;
9374 /*******************************************************************
9375 ********************************************************************/
9377 void lp_set_posix_default_cifsx_readwrite_locktype(enum brl_flavour val
)
9379 posix_default_lock_was_set
= True
;
9380 posix_cifsx_locktype
= val
;
9383 int lp_min_receive_file_size(void)
9385 if (Globals
.iminreceivefile
< 0) {
9388 return MIN(Globals
.iminreceivefile
, BUFFER_SIZE
);