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
57
#ifdef HAVE_SYS_SYSCTL_H
58
#include <sys/sysctl.h>
63
extern enum protocol_types Protocol;
64
extern userdom_struct current_user_info;
67
#define GLOBAL_NAME "global"
71
#define PRINTERS_NAME "printers"
75
#define HOMES_NAME "homes"
78
/* the special value for the include parameter
79
* to be interpreted not as a file name but to
80
* trigger loading of the global smb.conf options
82
#ifndef INCLUDE_REGISTRY_NAME
83
#define INCLUDE_REGISTRY_NAME "registry"
86
static bool in_client = False; /* Not in the client by default */
87
static struct smbconf_csn conf_last_csn;
89
#define CONFIG_BACKEND_FILE 0
90
#define CONFIG_BACKEND_REGISTRY 1
92
static int config_backend = CONFIG_BACKEND_FILE;
94
/* some helpful bits */
95
#define LP_SNUM_OK(i) (((i) >= 0) && ((i) < iNumServices) && (ServicePtrs != NULL) && ServicePtrs[(i)]->valid)
96
#define VALID(i) (ServicePtrs != NULL && ServicePtrs[i]->valid)
98
#define USERSHARE_VALID 1
99
#define USERSHARE_PENDING_DELETE 2
101
static bool defaults_saved = False;
103
struct param_opt_struct {
104
struct param_opt_struct *prev, *next;
111
* This structure describes global (ie., server-wide) parameters.
118
char *display_charset;
119
char *szPrintcapname;
120
char *szAddPortCommand;
121
char *szEnumPortsCommand;
122
char *szAddPrinterCommand;
123
char *szDeletePrinterCommand;
124
char *szOs2DriverMap;
130
char *szDefaultService;
134
char *szServerString;
135
char *szAutoServices;
136
char *szPasswdProgram;
140
char *szSMBPasswdFile;
142
char *szPassdbBackend;
143
char **szPreloadModules;
144
char *szPasswordServer;
145
char *szSocketOptions;
147
char *szAfsUsernameMap;
148
int iAfsTokenLifetime;
149
char *szLogNtTokenCommand;
155
char **szWINSservers;
157
char *szRemoteAnnounce;
158
char *szRemoteBrowseSync;
159
char *szSocketAddress;
160
char *szNISHomeMapName;
161
char *szAnnounceVersion; /* This is initialised in init_globals */
164
char **szNetbiosAliases;
165
char *szNetbiosScope;
166
char *szNameResolveOrder;
168
char *szAddUserScript;
169
char *szRenameUserScript;
170
char *szDelUserScript;
171
char *szAddGroupScript;
172
char *szDelGroupScript;
173
char *szAddUserToGroupScript;
174
char *szDelUserFromGroupScript;
175
char *szSetPrimaryGroupScript;
176
char *szAddMachineScript;
177
char *szShutdownScript;
178
char *szAbortShutdownScript;
179
char *szUsernameMapScript;
180
char *szCheckPasswordScript;
187
bool bPassdbExpandExplicit;
188
int AlgorithmicRidBase;
189
char *szTemplateHomedir;
190
char *szTemplateShell;
191
char *szWinbindSeparator;
192
bool bWinbindEnumUsers;
193
bool bWinbindEnumGroups;
194
bool bWinbindUseDefaultDomain;
195
bool bWinbindTrustedDomainsOnly;
196
bool bWinbindNestedGroups;
197
int winbind_expand_groups;
198
bool bWinbindRefreshTickets;
199
bool bWinbindOfflineLogon;
200
bool bWinbindNormalizeNames;
201
bool bWinbindRpcOnly;
202
char *szIdmapBackend;
203
char *szIdmapAllocBackend;
204
char *szAddShareCommand;
205
char *szChangeShareCommand;
206
char *szDeleteShareCommand;
208
char *szGuestaccount;
209
char *szManglingMethod;
210
char **szServicesList;
211
char *szUsersharePath;
212
char *szUsershareTemplateShare;
213
char **szUsersharePrefixAllowList;
214
char **szUsersharePrefixDenyList;
221
int open_files_db_hash_size;
230
bool paranoid_server_security;
233
int iMaxSmbdProcesses;
234
bool bDisableSpoolss;
237
bool enhanced_browsing;
243
int announce_as; /* This is initialised in init_globals */
244
int machine_password_timeout;
246
int oplock_break_wait_time;
247
int winbind_cache_time;
248
int winbind_reconnect_delay;
249
int winbind_max_idle_children;
250
char **szWinbindNssInfo;
252
char *szLdapMachineSuffix;
253
char *szLdapUserSuffix;
254
char *szLdapIdmapSuffix;
255
char *szLdapGroupSuffix;
260
int ldap_debug_level;
261
int ldap_debug_threshold;
264
char *szIPrintServer;
266
char **szClusterAddresses;
268
int ldap_passwd_sync;
269
int ldap_replication_sleep;
270
int ldap_timeout; /* This is initialised in init_globals */
271
int ldap_connection_timeout;
274
bool bMsAddPrinterWizard;
279
int iPreferredMaster;
282
char **szInitLogonDelayedHosts;
284
bool bEncryptPasswords;
289
bool bObeyPamRestrictions;
291
int PrintcapCacheTime;
292
bool bLargeReadwrite;
299
bool bBindInterfacesOnly;
300
bool bPamPasswordChange;
301
bool bUnixPasswdSync;
302
bool bPasswdChatDebug;
303
int iPasswdChatTimeout;
307
bool bNTStatusSupport;
309
int iMaxStatCacheSize;
311
bool bAllowTrustedDomains;
315
bool bClientLanManAuth;
316
bool bClientNTLMv2Auth;
317
bool bClientPlaintextAuth;
318
bool bClientUseSpnego;
319
bool bDebugPrefixTimestamp;
320
bool bDebugHiresTimestamp;
324
bool bEnableCoreFiles;
327
bool bHostnameLookups;
328
bool bUnixExtensions;
329
bool bDisableNetbios;
330
char * szDedicatedKeytabFile;
332
bool bDeferSharingViolations;
333
bool bEnablePrivileges;
335
bool bUsershareOwnerOnly;
336
bool bUsershareAllowGuests;
337
bool bRegistryShares;
338
int restrict_anonymous;
339
int name_cache_timeout;
342
int client_ldap_sasl_wrapping;
343
int iUsershareMaxShares;
345
int iIdmapNegativeCacheTime;
349
struct param_opt_struct *param_opt;
350
int cups_connection_timeout;
351
char *szSMBPerfcountModule;
352
bool bMapUntrustedToDomain;
355
static struct global Globals;
358
* This structure describes a single service.
364
time_t usershare_last_mod;
368
char **szInvalidUsers;
376
char *szRootPostExec;
378
char *szPrintcommand;
381
char *szLppausecommand;
382
char *szLpresumecommand;
383
char *szQueuepausecommand;
384
char *szQueueresumecommand;
386
char *szPrintjobUsername;
394
char *szVetoOplockFiles;
400
char **printer_admin;
405
char *szAioWriteBehind;
409
int iMaxReportedPrintJobs;
412
int iCreate_force_mode;
414
int iSecurity_force_mode;
417
int iDir_Security_mask;
418
int iDir_Security_force_mode;
422
int iOplockContentionLimit;
427
bool bRootpreexecClose;
430
bool bShortCasePreserve;
432
bool bHideSpecialFiles;
433
bool bHideUnReadable;
434
bool bHideUnWriteableFiles;
436
bool bAccessBasedShareEnum;
441
bool bAdministrative_share;
447
bool bStoreDosAttributes;
460
bool bStrictAllocate;
463
struct bitmap *copymap;
464
bool bDeleteReadonly;
466
bool bDeleteVetoFiles;
469
bool bDosFiletimeResolution;
470
bool bFakeDirCreateTimes;
476
bool bUseClientDriver;
477
bool bDefaultDevmode;
478
bool bForcePrintername;
480
bool bForceUnknownAclUser;
483
bool bMap_acl_inherit;
486
bool bAclCheckPermissions;
487
bool bAclMapFullControl;
488
bool bAclGroupControl;
490
bool bKernelChangeNotify;
491
int iallocation_roundup_size;
495
int iDirectoryNameCacheSize;
497
struct param_opt_struct *param_opt;
499
char dummy[3]; /* for alignment */
503
/* This is a default service used to prime a services structure */
504
static struct service sDefault = {
506
False, /* not autoloaded */
507
0, /* not a usershare */
508
(time_t)0, /* No last mod time */
509
NULL, /* szService */
511
NULL, /* szUsername */
512
NULL, /* szInvalidUsers */
513
NULL, /* szValidUsers */
514
NULL, /* szAdminUsers */
516
NULL, /* szInclude */
517
NULL, /* szPreExec */
518
NULL, /* szPostExec */
519
NULL, /* szRootPreExec */
520
NULL, /* szRootPostExec */
521
NULL, /* szCupsOptions */
522
NULL, /* szPrintcommand */
523
NULL, /* szLpqcommand */
524
NULL, /* szLprmcommand */
525
NULL, /* szLppausecommand */
526
NULL, /* szLpresumecommand */
527
NULL, /* szQueuepausecommand */
528
NULL, /* szQueueresumecommand */
529
NULL, /* szPrintername */
530
NULL, /* szPrintjobUsername */
531
NULL, /* szDontdescend */
532
NULL, /* szHostsallow */
533
NULL, /* szHostsdeny */
534
NULL, /* szMagicScript */
535
NULL, /* szMagicOutput */
536
NULL, /* szVetoFiles */
537
NULL, /* szHideFiles */
538
NULL, /* szVetoOplockFiles */
540
NULL, /* force user */
541
NULL, /* force group */
543
NULL, /* writelist */
544
NULL, /* printer admin */
547
NULL, /* vfs objects */
548
NULL, /* szMSDfsProxy */
549
NULL, /* szAioWriteBehind */
551
0, /* iMinPrintSpace */
552
1000, /* iMaxPrintJobs */
553
0, /* iMaxReportedPrintJobs */
554
0, /* iWriteCacheSize */
555
0744, /* iCreate_mask */
556
0000, /* iCreate_force_mode */
557
0777, /* iSecurity_mask */
558
0, /* iSecurity_force_mode */
559
0755, /* iDir_mask */
560
0000, /* iDir_force_mode */
561
0777, /* iDir_Security_mask */
562
0, /* iDir_Security_force_mode */
563
0, /* iMaxConnections */
564
CASE_LOWER, /* iDefaultCase */
565
DEFAULT_PRINTING, /* iPrinting */
566
2, /* iOplockContentionLimit */
568
1024, /* iBlock_size */
569
0, /* iDfreeCacheTime */
570
False, /* bPreexecClose */
571
False, /* bRootpreexecClose */
572
Auto, /* case sensitive */
573
True, /* case preserve */
574
True, /* short case preserve */
575
True, /* bHideDotFiles */
576
False, /* bHideSpecialFiles */
577
False, /* bHideUnReadable */
578
False, /* bHideUnWriteableFiles */
579
True, /* bBrowseable */
580
False, /* bAccessBasedShareEnum */
581
True, /* bAvailable */
582
True, /* bRead_only */
583
True, /* bNo_set_dir */
584
False, /* bGuest_only */
585
False, /* bAdministrative_share */
586
False, /* bGuest_ok */
587
False, /* bPrint_ok */
588
False, /* bMap_system */
589
False, /* bMap_hidden */
590
True, /* bMap_archive */
591
False, /* bStoreDosAttributes */
592
False, /* bDmapiSupport */
594
Auto, /* iStrictLocking */
595
True, /* bPosixLocking */
596
True, /* bShareModes */
598
True, /* bLevel2OpLocks */
599
False, /* bOnlyUser */
600
True, /* bMangledNames */
601
True, /* bWidelinks */
602
True, /* bSymlinks */
603
False, /* bSyncAlways */
604
False, /* bStrictAllocate */
605
False, /* bStrictSync */
606
'~', /* magic char */
608
False, /* bDeleteReadonly */
609
False, /* bFakeOplocks */
610
False, /* bDeleteVetoFiles */
611
False, /* bDosFilemode */
612
True, /* bDosFiletimes */
613
False, /* bDosFiletimeResolution */
614
False, /* bFakeDirCreateTimes */
615
True, /* bBlockingLocks */
616
False, /* bInheritPerms */
617
False, /* bInheritACLS */
618
False, /* bInheritOwner */
619
False, /* bMSDfsRoot */
620
False, /* bUseClientDriver */
621
True, /* bDefaultDevmode */
622
False, /* bForcePrintername */
623
True, /* bNTAclSupport */
624
False, /* bForceUnknownAclUser */
625
False, /* bUseSendfile */
626
False, /* bProfileAcls */
627
False, /* bMap_acl_inherit */
628
False, /* bAfs_Share */
629
False, /* bEASupport */
630
True, /* bAclCheckPermissions */
631
True, /* bAclMapFullControl */
632
False, /* bAclGroupControl */
633
True, /* bChangeNotify */
634
True, /* bKernelChangeNotify */
635
SMB_ROUNDUP_ALLOCATION_SIZE, /* iallocation_roundup_size */
636
0, /* iAioReadSize */
637
0, /* iAioWriteSize */
638
MAP_READONLY_YES, /* iMap_readonly */
639
#ifdef BROKEN_DIRECTORY_HANDLING
640
0, /* iDirectoryNameCacheSize */
642
100, /* iDirectoryNameCacheSize */
644
Auto, /* ismb_encrypt */
645
NULL, /* Parametric options */
650
/* local variables */
651
static struct service **ServicePtrs = NULL;
652
static int iNumServices = 0;
653
static int iServiceIndex = 0;
654
static struct db_context *ServiceHash;
655
static int *invalid_services = NULL;
656
static int num_invalid_services = 0;
657
static bool bInGlobalSection = True;
658
static bool bGlobalOnly = False;
659
static int server_role;
660
static int default_server_announce;
662
#define NUMPARAMETERS (sizeof(parm_table) / sizeof(struct parm_struct))
664
/* prototypes for the special type handlers */
665
static bool handle_include( int snum, const char *pszParmValue, char **ptr);
666
static bool handle_copy( int snum, const char *pszParmValue, char **ptr);
667
static bool handle_netbios_name( int snum, const char *pszParmValue, char **ptr);
668
static bool handle_idmap_uid( int snum, const char *pszParmValue, char **ptr);
669
static bool handle_idmap_gid( int snum, const char *pszParmValue, char **ptr);
670
static bool handle_debug_list( int snum, const char *pszParmValue, char **ptr );
671
static bool handle_workgroup( int snum, const char *pszParmValue, char **ptr );
672
static bool handle_netbios_aliases( int snum, const char *pszParmValue, char **ptr );
673
static bool handle_netbios_scope( int snum, const char *pszParmValue, char **ptr );
674
static bool handle_charset( int snum, const char *pszParmValue, char **ptr );
675
static bool handle_printing( int snum, const char *pszParmValue, char **ptr);
676
static bool handle_ldap_debug_level( int snum, const char *pszParmValue, char **ptr);
678
static void set_server_role(void);
679
static void set_default_server_announce_type(void);
680
static void set_allowed_client_auth(void);
682
static void *lp_local_ptr(struct service *service, void *ptr);
684
static void add_to_file_list(const char *fname, const char *subfname);
686
static const struct enum_list enum_protocol[] = {
687
{PROTOCOL_NT1, "NT1"},
688
{PROTOCOL_LANMAN2, "LANMAN2"},
689
{PROTOCOL_LANMAN1, "LANMAN1"},
690
{PROTOCOL_CORE, "CORE"},
691
{PROTOCOL_COREPLUS, "COREPLUS"},
692
{PROTOCOL_COREPLUS, "CORE+"},
696
static const struct enum_list enum_security[] = {
697
{SEC_SHARE, "SHARE"},
699
{SEC_SERVER, "SERVER"},
700
{SEC_DOMAIN, "DOMAIN"},
707
static const struct enum_list enum_printing[] = {
708
{PRINT_SYSV, "sysv"},
710
{PRINT_HPUX, "hpux"},
714
{PRINT_LPRNG, "lprng"},
715
{PRINT_CUPS, "cups"},
716
{PRINT_IPRINT, "iprint"},
718
{PRINT_LPROS2, "os2"},
720
{PRINT_TEST, "test"},
722
#endif /* DEVELOPER */
726
static const struct enum_list enum_ldap_sasl_wrapping[] = {
728
{ADS_AUTH_SASL_SIGN, "sign"},
729
{ADS_AUTH_SASL_SEAL, "seal"},
733
static const struct enum_list enum_ldap_ssl[] = {
734
{LDAP_SSL_OFF, "no"},
735
{LDAP_SSL_OFF, "off"},
736
{LDAP_SSL_START_TLS, "start tls"},
737
{LDAP_SSL_START_TLS, "start_tls"},
741
static const struct enum_list enum_ldap_passwd_sync[] = {
742
{LDAP_PASSWD_SYNC_OFF, "no"},
743
{LDAP_PASSWD_SYNC_OFF, "off"},
744
{LDAP_PASSWD_SYNC_ON, "yes"},
745
{LDAP_PASSWD_SYNC_ON, "on"},
746
{LDAP_PASSWD_SYNC_ONLY, "only"},
750
/* Types of machine we can announce as. */
751
#define ANNOUNCE_AS_NT_SERVER 1
752
#define ANNOUNCE_AS_WIN95 2
753
#define ANNOUNCE_AS_WFW 3
754
#define ANNOUNCE_AS_NT_WORKSTATION 4
756
static const struct enum_list enum_announce_as[] = {
757
{ANNOUNCE_AS_NT_SERVER, "NT"},
758
{ANNOUNCE_AS_NT_SERVER, "NT Server"},
759
{ANNOUNCE_AS_NT_WORKSTATION, "NT Workstation"},
760
{ANNOUNCE_AS_WIN95, "win95"},
761
{ANNOUNCE_AS_WFW, "WfW"},
765
static const struct enum_list enum_map_readonly[] = {
766
{MAP_READONLY_NO, "no"},
767
{MAP_READONLY_NO, "false"},
768
{MAP_READONLY_NO, "0"},
769
{MAP_READONLY_YES, "yes"},
770
{MAP_READONLY_YES, "true"},
771
{MAP_READONLY_YES, "1"},
772
{MAP_READONLY_PERMISSIONS, "permissions"},
773
{MAP_READONLY_PERMISSIONS, "perms"},
777
static const struct enum_list enum_case[] = {
778
{CASE_LOWER, "lower"},
779
{CASE_UPPER, "upper"},
783
static const struct enum_list enum_bool_auto[] = {
794
/* Client-side offline caching policy types */
795
#define CSC_POLICY_MANUAL 0
796
#define CSC_POLICY_DOCUMENTS 1
797
#define CSC_POLICY_PROGRAMS 2
798
#define CSC_POLICY_DISABLE 3
800
static const struct enum_list enum_csc_policy[] = {
801
{CSC_POLICY_MANUAL, "manual"},
802
{CSC_POLICY_DOCUMENTS, "documents"},
803
{CSC_POLICY_PROGRAMS, "programs"},
804
{CSC_POLICY_DISABLE, "disable"},
808
/* SMB signing types. */
809
static const struct enum_list enum_smb_signing_vals[] = {
821
{Required, "required"},
822
{Required, "mandatory"},
824
{Required, "forced"},
825
{Required, "enforced"},
829
/* ACL compatibility options. */
830
static const struct enum_list enum_acl_compat_vals[] = {
831
{ ACL_COMPAT_AUTO, "auto" },
832
{ ACL_COMPAT_WINNT, "winnt" },
833
{ ACL_COMPAT_WIN2K, "win2k" },
838
Do you want session setups at user level security with a invalid
839
password to be rejected or allowed in as guest? WinNT rejects them
840
but it can be a pain as it means "net view" needs to use a password
842
You have 3 choices in the setting of map_to_guest:
844
"Never" means session setups with an invalid password
845
are rejected. This is the default.
847
"Bad User" means session setups with an invalid password
848
are rejected, unless the username does not exist, in which case it
849
is treated as a guest login
851
"Bad Password" means session setups with an invalid password
852
are treated as a guest login
854
Note that map_to_guest only has an effect in user or server
858
static const struct enum_list enum_map_to_guest[] = {
859
{NEVER_MAP_TO_GUEST, "Never"},
860
{MAP_TO_GUEST_ON_BAD_USER, "Bad User"},
861
{MAP_TO_GUEST_ON_BAD_PASSWORD, "Bad Password"},
862
{MAP_TO_GUEST_ON_BAD_UID, "Bad Uid"},
866
/* Config backend options */
868
static const struct enum_list enum_config_backend[] = {
869
{CONFIG_BACKEND_FILE, "file"},
870
{CONFIG_BACKEND_REGISTRY, "registry"},
874
/* ADS kerberos ticket verification options */
876
static const struct enum_list enum_kerberos_method[] = {
877
{KERBEROS_VERIFY_SECRETS, "default"},
878
{KERBEROS_VERIFY_SECRETS, "secrets only"},
879
{KERBEROS_VERIFY_SYSTEM_KEYTAB, "system keytab"},
880
{KERBEROS_VERIFY_DEDICATED_KEYTAB, "dedicated keytab"},
881
{KERBEROS_VERIFY_SECRETS_AND_KEYTAB, "secrets and keytab"},
885
/* Note: We do not initialise the defaults union - it is not allowed in ANSI C
887
* The FLAG_HIDE is explicit. Parameters set this way do NOT appear in any edit
888
* screen in SWAT. This is used to exclude parameters as well as to squash all
889
* parameters that have been duplicated by pseudonyms.
891
* NOTE: To display a parameter in BASIC view set FLAG_BASIC
892
* Any parameter that does NOT have FLAG_ADVANCED will not disply at all
893
* Set FLAG_SHARE and FLAG_PRINT to specifically display parameters in
896
* NOTE2: Handling of duplicated (synonym) parameters:
897
* Only the first occurance of a parameter should be enabled by FLAG_BASIC
898
* and/or FLAG_ADVANCED. All duplicates following the first mention should be
899
* set to FLAG_HIDE. ie: Make you must place the parameter that has the preferred
900
* name first, and all synonyms must follow it with the FLAG_HIDE attribute.
903
static struct parm_struct parm_table[] = {
904
{N_("Base Options"), P_SEP, P_SEPARATOR},
907
.label = "dos charset",
910
.ptr = &Globals.dos_charset,
911
.special = handle_charset,
913
.flags = FLAG_ADVANCED
916
.label = "unix charset",
919
.ptr = &Globals.unix_charset,
920
.special = handle_charset,
922
.flags = FLAG_ADVANCED
925
.label = "display charset",
928
.ptr = &Globals.display_charset,
929
.special = handle_charset,
931
.flags = FLAG_ADVANCED
937
.ptr = &sDefault.comment,
940
.flags = FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT
946
.ptr = &sDefault.szPath,
949
.flags = FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT,
952
.label = "directory",
955
.ptr = &sDefault.szPath,
961
.label = "workgroup",
964
.ptr = &Globals.szWorkgroup,
965
.special = handle_workgroup,
967
.flags = FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD,
974
.ptr = &Globals.szRealm,
977
.flags = FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD,
981
.label = "netbios name",
984
.ptr = &Globals.szNetbiosName,
985
.special = handle_netbios_name,
987
.flags = FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD,
990
.label = "netbios aliases",
993
.ptr = &Globals.szNetbiosAliases,
994
.special = handle_netbios_aliases,
996
.flags = FLAG_ADVANCED,
999
.label = "netbios scope",
1001
.p_class = P_GLOBAL,
1002
.ptr = &Globals.szNetbiosScope,
1003
.special = handle_netbios_scope,
1005
.flags = FLAG_ADVANCED,
1008
.label = "server string",
1010
.p_class = P_GLOBAL,
1011
.ptr = &Globals.szServerString,
1014
.flags = FLAG_BASIC | FLAG_ADVANCED,
1017
.label = "interfaces",
1019
.p_class = P_GLOBAL,
1020
.ptr = &Globals.szInterfaces,
1023
.flags = FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD,
1026
.label = "bind interfaces only",
1028
.p_class = P_GLOBAL,
1029
.ptr = &Globals.bBindInterfacesOnly,
1032
.flags = FLAG_ADVANCED | FLAG_WIZARD,
1035
.label = "config backend",
1037
.p_class = P_GLOBAL,
1038
.ptr = &Globals.ConfigBackend,
1040
.enum_list = enum_config_backend,
1041
.flags = FLAG_HIDE|FLAG_ADVANCED|FLAG_META,
1044
{N_("Security Options"), P_SEP, P_SEPARATOR},
1047
.label = "security",
1049
.p_class = P_GLOBAL,
1050
.ptr = &Globals.security,
1052
.enum_list = enum_security,
1053
.flags = FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD,
1056
.label = "auth methods",
1058
.p_class = P_GLOBAL,
1059
.ptr = &Globals.AuthMethods,
1062
.flags = FLAG_ADVANCED,
1065
.label = "encrypt passwords",
1067
.p_class = P_GLOBAL,
1068
.ptr = &Globals.bEncryptPasswords,
1071
.flags = FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD,
1074
.label = "update encrypted",
1076
.p_class = P_GLOBAL,
1077
.ptr = &Globals.bUpdateEncrypt,
1080
.flags = FLAG_ADVANCED,
1083
.label = "client schannel",
1085
.p_class = P_GLOBAL,
1086
.ptr = &Globals.clientSchannel,
1088
.enum_list = enum_bool_auto,
1089
.flags = FLAG_BASIC | FLAG_ADVANCED,
1092
.label = "server schannel",
1094
.p_class = P_GLOBAL,
1095
.ptr = &Globals.serverSchannel,
1097
.enum_list = enum_bool_auto,
1098
.flags = FLAG_BASIC | FLAG_ADVANCED,
1101
.label = "allow trusted domains",
1103
.p_class = P_GLOBAL,
1104
.ptr = &Globals.bAllowTrustedDomains,
1107
.flags = FLAG_ADVANCED,
1110
.label = "map to guest",
1112
.p_class = P_GLOBAL,
1113
.ptr = &Globals.map_to_guest,
1115
.enum_list = enum_map_to_guest,
1116
.flags = FLAG_ADVANCED,
1119
.label = "null passwords",
1121
.p_class = P_GLOBAL,
1122
.ptr = &Globals.bNullPasswords,
1125
.flags = FLAG_ADVANCED,
1128
.label = "obey pam restrictions",
1130
.p_class = P_GLOBAL,
1131
.ptr = &Globals.bObeyPamRestrictions,
1134
.flags = FLAG_ADVANCED,
1137
.label = "password server",
1139
.p_class = P_GLOBAL,
1140
.ptr = &Globals.szPasswordServer,
1143
.flags = FLAG_ADVANCED | FLAG_WIZARD,
1146
.label = "smb passwd file",
1148
.p_class = P_GLOBAL,
1149
.ptr = &Globals.szSMBPasswdFile,
1152
.flags = FLAG_ADVANCED,
1155
.label = "private dir",
1157
.p_class = P_GLOBAL,
1158
.ptr = &Globals.szPrivateDir,
1161
.flags = FLAG_ADVANCED,
1164
.label = "passdb backend",
1166
.p_class = P_GLOBAL,
1167
.ptr = &Globals.szPassdbBackend,
1170
.flags = FLAG_ADVANCED | FLAG_WIZARD,
1173
.label = "algorithmic rid base",
1175
.p_class = P_GLOBAL,
1176
.ptr = &Globals.AlgorithmicRidBase,
1179
.flags = FLAG_ADVANCED,
1182
.label = "root directory",
1184
.p_class = P_GLOBAL,
1185
.ptr = &Globals.szRootdir,
1188
.flags = FLAG_ADVANCED,
1191
.label = "root dir",
1193
.p_class = P_GLOBAL,
1194
.ptr = &Globals.szRootdir,
1202
.p_class = P_GLOBAL,
1203
.ptr = &Globals.szRootdir,
1209
.label = "guest account",
1211
.p_class = P_GLOBAL,
1212
.ptr = &Globals.szGuestaccount,
1215
.flags = FLAG_BASIC | FLAG_ADVANCED,
1218
.label = "enable privileges",
1220
.p_class = P_GLOBAL,
1221
.ptr = &Globals.bEnablePrivileges,
1224
.flags = FLAG_ADVANCED,
1228
.label = "pam password change",
1230
.p_class = P_GLOBAL,
1231
.ptr = &Globals.bPamPasswordChange,
1234
.flags = FLAG_ADVANCED,
1237
.label = "passwd program",
1239
.p_class = P_GLOBAL,
1240
.ptr = &Globals.szPasswdProgram,
1243
.flags = FLAG_ADVANCED,
1246
.label = "passwd chat",
1248
.p_class = P_GLOBAL,
1249
.ptr = &Globals.szPasswdChat,
1252
.flags = FLAG_ADVANCED,
1255
.label = "passwd chat debug",
1257
.p_class = P_GLOBAL,
1258
.ptr = &Globals.bPasswdChatDebug,
1261
.flags = FLAG_ADVANCED,
1264
.label = "passwd chat timeout",
1266
.p_class = P_GLOBAL,
1267
.ptr = &Globals.iPasswdChatTimeout,
1270
.flags = FLAG_ADVANCED,
1273
.label = "check password script",
1275
.p_class = P_GLOBAL,
1276
.ptr = &Globals.szCheckPasswordScript,
1279
.flags = FLAG_ADVANCED,
1282
.label = "username map",
1284
.p_class = P_GLOBAL,
1285
.ptr = &Globals.szUsernameMap,
1288
.flags = FLAG_ADVANCED,
1291
.label = "password level",
1293
.p_class = P_GLOBAL,
1294
.ptr = &Globals.pwordlevel,
1297
.flags = FLAG_ADVANCED,
1300
.label = "username level",
1302
.p_class = P_GLOBAL,
1303
.ptr = &Globals.unamelevel,
1306
.flags = FLAG_ADVANCED,
1309
.label = "unix password sync",
1311
.p_class = P_GLOBAL,
1312
.ptr = &Globals.bUnixPasswdSync,
1315
.flags = FLAG_ADVANCED,
1318
.label = "restrict anonymous",
1320
.p_class = P_GLOBAL,
1321
.ptr = &Globals.restrict_anonymous,
1324
.flags = FLAG_ADVANCED,
1327
.label = "lanman auth",
1329
.p_class = P_GLOBAL,
1330
.ptr = &Globals.bLanmanAuth,
1333
.flags = FLAG_ADVANCED,
1336
.label = "ntlm auth",
1338
.p_class = P_GLOBAL,
1339
.ptr = &Globals.bNTLMAuth,
1342
.flags = FLAG_ADVANCED,
1345
.label = "client NTLMv2 auth",
1347
.p_class = P_GLOBAL,
1348
.ptr = &Globals.bClientNTLMv2Auth,
1351
.flags = FLAG_ADVANCED,
1354
.label = "client lanman auth",
1356
.p_class = P_GLOBAL,
1357
.ptr = &Globals.bClientLanManAuth,
1360
.flags = FLAG_ADVANCED,
1363
.label = "client plaintext auth",
1365
.p_class = P_GLOBAL,
1366
.ptr = &Globals.bClientPlaintextAuth,
1369
.flags = FLAG_ADVANCED,
1372
.label = "username",
1375
.ptr = &sDefault.szUsername,
1378
.flags = FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE,
1384
.ptr = &sDefault.szUsername,
1393
.ptr = &sDefault.szUsername,
1399
.label = "invalid users",
1402
.ptr = &sDefault.szInvalidUsers,
1405
.flags = FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE,
1408
.label = "valid users",
1411
.ptr = &sDefault.szValidUsers,
1414
.flags = FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE,
1417
.label = "admin users",
1420
.ptr = &sDefault.szAdminUsers,
1423
.flags = FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE,
1426
.label = "read list",
1429
.ptr = &sDefault.readlist,
1432
.flags = FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE,
1435
.label = "write list",
1438
.ptr = &sDefault.writelist,
1441
.flags = FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE,
1444
.label = "printer admin",
1447
.ptr = &sDefault.printer_admin,
1450
.flags = FLAG_ADVANCED | FLAG_GLOBAL | FLAG_PRINT | FLAG_DEPRECATED,
1453
.label = "force user",
1456
.ptr = &sDefault.force_user,
1459
.flags = FLAG_ADVANCED | FLAG_SHARE,
1462
.label = "force group",
1465
.ptr = &sDefault.force_group,
1468
.flags = FLAG_ADVANCED | FLAG_SHARE,
1474
.ptr = &sDefault.force_group,
1477
.flags = FLAG_ADVANCED,
1480
.label = "read only",
1483
.ptr = &sDefault.bRead_only,
1486
.flags = FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE,
1489
.label = "write ok",
1492
.ptr = &sDefault.bRead_only,
1498
.label = "writeable",
1501
.ptr = &sDefault.bRead_only,
1507
.label = "writable",
1510
.ptr = &sDefault.bRead_only,
1516
.label = "acl check permissions",
1519
.ptr = &sDefault.bAclCheckPermissions,
1522
.flags = FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE,
1525
.label = "acl group control",
1528
.ptr = &sDefault.bAclGroupControl,
1531
.flags = FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE,
1534
.label = "acl map full control",
1537
.ptr = &sDefault.bAclMapFullControl,
1540
.flags = FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE,
1543
.label = "create mask",
1546
.ptr = &sDefault.iCreate_mask,
1549
.flags = FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE,
1552
.label = "create mode",
1555
.ptr = &sDefault.iCreate_mask,
1561
.label = "force create mode",
1564
.ptr = &sDefault.iCreate_force_mode,
1567
.flags = FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE,
1570
.label = "security mask",
1573
.ptr = &sDefault.iSecurity_mask,
1576
.flags = FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE,
1579
.label = "force security mode",
1582
.ptr = &sDefault.iSecurity_force_mode,
1585
.flags = FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE,
1588
.label = "directory mask",
1591
.ptr = &sDefault.iDir_mask,
1594
.flags = FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE,
1597
.label = "directory mode",
1600
.ptr = &sDefault.iDir_mask,
1603
.flags = FLAG_ADVANCED | FLAG_GLOBAL,
1606
.label = "force directory mode",
1609
.ptr = &sDefault.iDir_force_mode,
1612
.flags = FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE,
1615
.label = "directory security mask",
1618
.ptr = &sDefault.iDir_Security_mask,
1621
.flags = FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE,
1624
.label = "force directory security mode",
1627
.ptr = &sDefault.iDir_Security_force_mode,
1630
.flags = FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE,
1633
.label = "force unknown acl user",
1636
.ptr = &sDefault.bForceUnknownAclUser,
1639
.flags = FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE,
1642
.label = "inherit permissions",
1645
.ptr = &sDefault.bInheritPerms,
1648
.flags = FLAG_ADVANCED | FLAG_SHARE,
1651
.label = "inherit acls",
1654
.ptr = &sDefault.bInheritACLS,
1657
.flags = FLAG_ADVANCED | FLAG_SHARE,
1660
.label = "inherit owner",
1663
.ptr = &sDefault.bInheritOwner,
1666
.flags = FLAG_ADVANCED | FLAG_SHARE,
1669
.label = "guest only",
1672
.ptr = &sDefault.bGuest_only,
1675
.flags = FLAG_ADVANCED | FLAG_SHARE,
1678
.label = "only guest",
1681
.ptr = &sDefault.bGuest_only,
1687
.label = "administrative share",
1690
.ptr = &sDefault.bAdministrative_share,
1693
.flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT,
1697
.label = "guest ok",
1700
.ptr = &sDefault.bGuest_ok,
1703
.flags = FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT,
1709
.ptr = &sDefault.bGuest_ok,
1715
.label = "only user",
1718
.ptr = &sDefault.bOnlyUser,
1721
.flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_DEPRECATED,
1724
.label = "hosts allow",
1727
.ptr = &sDefault.szHostsallow,
1730
.flags = FLAG_GLOBAL | FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT,
1733
.label = "allow hosts",
1736
.ptr = &sDefault.szHostsallow,
1742
.label = "hosts deny",
1745
.ptr = &sDefault.szHostsdeny,
1748
.flags = FLAG_GLOBAL | FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT,
1751
.label = "deny hosts",
1754
.ptr = &sDefault.szHostsdeny,
1760
.label = "preload modules",
1762
.p_class = P_GLOBAL,
1763
.ptr = &Globals.szPreloadModules,
1766
.flags = FLAG_ADVANCED | FLAG_GLOBAL,
1769
.label = "dedicated keytab file",
1771
.p_class = P_GLOBAL,
1772
.ptr = &Globals.szDedicatedKeytabFile,
1775
.flags = FLAG_ADVANCED,
1778
.label = "kerberos method",
1780
.p_class = P_GLOBAL,
1781
.ptr = &Globals.iKerberosMethod,
1783
.enum_list = enum_kerberos_method,
1784
.flags = FLAG_ADVANCED,
1787
.label = "map untrusted to domain",
1789
.p_class = P_GLOBAL,
1790
.ptr = &Globals.bMapUntrustedToDomain,
1793
.flags = FLAG_ADVANCED | FLAG_GLOBAL,
1797
{N_("Logging Options"), P_SEP, P_SEPARATOR},
1800
.label = "log level",
1802
.p_class = P_GLOBAL,
1803
.ptr = &Globals.szLogLevel,
1804
.special = handle_debug_list,
1806
.flags = FLAG_ADVANCED,
1809
.label = "debuglevel",
1811
.p_class = P_GLOBAL,
1812
.ptr = &Globals.szLogLevel,
1813
.special = handle_debug_list,
1820
.p_class = P_GLOBAL,
1821
.ptr = &Globals.syslog,
1824
.flags = FLAG_ADVANCED,
1827
.label = "syslog only",
1829
.p_class = P_GLOBAL,
1830
.ptr = &Globals.bSyslogOnly,
1833
.flags = FLAG_ADVANCED,
1836
.label = "log file",
1838
.p_class = P_GLOBAL,
1839
.ptr = &Globals.szLogFile,
1842
.flags = FLAG_ADVANCED,
1845
.label = "max log size",
1847
.p_class = P_GLOBAL,
1848
.ptr = &Globals.max_log_size,
1851
.flags = FLAG_ADVANCED,
1854
.label = "debug timestamp",
1856
.p_class = P_GLOBAL,
1857
.ptr = &Globals.bTimestampLogs,
1860
.flags = FLAG_ADVANCED,
1863
.label = "timestamp logs",
1865
.p_class = P_GLOBAL,
1866
.ptr = &Globals.bTimestampLogs,
1869
.flags = FLAG_ADVANCED,
1872
.label = "debug prefix timestamp",
1874
.p_class = P_GLOBAL,
1875
.ptr = &Globals.bDebugPrefixTimestamp,
1878
.flags = FLAG_ADVANCED,
1881
.label = "debug hires timestamp",
1883
.p_class = P_GLOBAL,
1884
.ptr = &Globals.bDebugHiresTimestamp,
1887
.flags = FLAG_ADVANCED,
1890
.label = "debug pid",
1892
.p_class = P_GLOBAL,
1893
.ptr = &Globals.bDebugPid,
1896
.flags = FLAG_ADVANCED,
1899
.label = "debug uid",
1901
.p_class = P_GLOBAL,
1902
.ptr = &Globals.bDebugUid,
1905
.flags = FLAG_ADVANCED,
1908
.label = "debug class",
1910
.p_class = P_GLOBAL,
1911
.ptr = &Globals.bDebugClass,
1914
.flags = FLAG_ADVANCED,
1917
.label = "enable core files",
1919
.p_class = P_GLOBAL,
1920
.ptr = &Globals.bEnableCoreFiles,
1923
.flags = FLAG_ADVANCED,
1926
{N_("Protocol Options"), P_SEP, P_SEPARATOR},
1929
.label = "allocation roundup size",
1932
.ptr = &sDefault.iallocation_roundup_size,
1935
.flags = FLAG_ADVANCED,
1938
.label = "aio read size",
1941
.ptr = &sDefault.iAioReadSize,
1944
.flags = FLAG_ADVANCED,
1947
.label = "aio write size",
1950
.ptr = &sDefault.iAioWriteSize,
1953
.flags = FLAG_ADVANCED,
1956
.label = "aio write behind",
1959
.ptr = &sDefault.szAioWriteBehind,
1962
.flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
1965
.label = "smb ports",
1967
.p_class = P_GLOBAL,
1968
.ptr = &Globals.smb_ports,
1971
.flags = FLAG_ADVANCED,
1974
.label = "large readwrite",
1976
.p_class = P_GLOBAL,
1977
.ptr = &Globals.bLargeReadwrite,
1980
.flags = FLAG_ADVANCED,
1983
.label = "max protocol",
1985
.p_class = P_GLOBAL,
1986
.ptr = &Globals.maxprotocol,
1988
.enum_list = enum_protocol,
1989
.flags = FLAG_ADVANCED,
1992
.label = "protocol",
1994
.p_class = P_GLOBAL,
1995
.ptr = &Globals.maxprotocol,
1997
.enum_list = enum_protocol,
1998
.flags = FLAG_ADVANCED,
2001
.label = "min protocol",
2003
.p_class = P_GLOBAL,
2004
.ptr = &Globals.minprotocol,
2006
.enum_list = enum_protocol,
2007
.flags = FLAG_ADVANCED,
2010
.label = "min receivefile size",
2012
.p_class = P_GLOBAL,
2013
.ptr = &Globals.iminreceivefile,
2016
.flags = FLAG_ADVANCED,
2019
.label = "read raw",
2021
.p_class = P_GLOBAL,
2022
.ptr = &Globals.bReadRaw,
2025
.flags = FLAG_ADVANCED,
2028
.label = "write raw",
2030
.p_class = P_GLOBAL,
2031
.ptr = &Globals.bWriteRaw,
2034
.flags = FLAG_ADVANCED,
2037
.label = "disable netbios",
2039
.p_class = P_GLOBAL,
2040
.ptr = &Globals.bDisableNetbios,
2043
.flags = FLAG_ADVANCED,
2046
.label = "reset on zero vc",
2048
.p_class = P_GLOBAL,
2049
.ptr = &Globals.bResetOnZeroVC,
2052
.flags = FLAG_ADVANCED,
2055
.label = "acl compatibility",
2057
.p_class = P_GLOBAL,
2058
.ptr = &Globals.iAclCompat,
2060
.enum_list = enum_acl_compat_vals,
2061
.flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
2064
.label = "defer sharing violations",
2066
.p_class = P_GLOBAL,
2067
.ptr = &Globals.bDeferSharingViolations,
2070
.flags = FLAG_ADVANCED | FLAG_GLOBAL,
2073
.label = "ea support",
2076
.ptr = &sDefault.bEASupport,
2079
.flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
2082
.label = "nt acl support",
2085
.ptr = &sDefault.bNTAclSupport,
2088
.flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
2091
.label = "nt pipe support",
2093
.p_class = P_GLOBAL,
2094
.ptr = &Globals.bNTPipeSupport,
2097
.flags = FLAG_ADVANCED,
2100
.label = "nt status support",
2102
.p_class = P_GLOBAL,
2103
.ptr = &Globals.bNTStatusSupport,
2106
.flags = FLAG_ADVANCED,
2109
.label = "profile acls",
2112
.ptr = &sDefault.bProfileAcls,
2115
.flags = FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE,
2118
.label = "announce version",
2120
.p_class = P_GLOBAL,
2121
.ptr = &Globals.szAnnounceVersion,
2124
.flags = FLAG_ADVANCED,
2127
.label = "announce as",
2129
.p_class = P_GLOBAL,
2130
.ptr = &Globals.announce_as,
2132
.enum_list = enum_announce_as,
2133
.flags = FLAG_ADVANCED,
2136
.label = "map acl inherit",
2139
.ptr = &sDefault.bMap_acl_inherit,
2142
.flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
2145
.label = "afs share",
2148
.ptr = &sDefault.bAfs_Share,
2151
.flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
2156
.p_class = P_GLOBAL,
2157
.ptr = &Globals.max_mux,
2160
.flags = FLAG_ADVANCED,
2163
.label = "max xmit",
2165
.p_class = P_GLOBAL,
2166
.ptr = &Globals.max_xmit,
2169
.flags = FLAG_ADVANCED,
2172
.label = "name resolve order",
2174
.p_class = P_GLOBAL,
2175
.ptr = &Globals.szNameResolveOrder,
2178
.flags = FLAG_ADVANCED | FLAG_WIZARD,
2183
.p_class = P_GLOBAL,
2184
.ptr = &Globals.max_ttl,
2187
.flags = FLAG_ADVANCED,
2190
.label = "max wins ttl",
2192
.p_class = P_GLOBAL,
2193
.ptr = &Globals.max_wins_ttl,
2196
.flags = FLAG_ADVANCED,
2199
.label = "min wins ttl",
2201
.p_class = P_GLOBAL,
2202
.ptr = &Globals.min_wins_ttl,
2205
.flags = FLAG_ADVANCED,
2208
.label = "time server",
2210
.p_class = P_GLOBAL,
2211
.ptr = &Globals.bTimeServer,
2214
.flags = FLAG_ADVANCED,
2217
.label = "unix extensions",
2219
.p_class = P_GLOBAL,
2220
.ptr = &Globals.bUnixExtensions,
2223
.flags = FLAG_ADVANCED,
2226
.label = "use spnego",
2228
.p_class = P_GLOBAL,
2229
.ptr = &Globals.bUseSpnego,
2232
.flags = FLAG_ADVANCED,
2235
.label = "client signing",
2237
.p_class = P_GLOBAL,
2238
.ptr = &Globals.client_signing,
2240
.enum_list = enum_smb_signing_vals,
2241
.flags = FLAG_ADVANCED,
2244
.label = "server signing",
2246
.p_class = P_GLOBAL,
2247
.ptr = &Globals.server_signing,
2249
.enum_list = enum_smb_signing_vals,
2250
.flags = FLAG_ADVANCED,
2253
.label = "smb encrypt",
2256
.ptr = &sDefault.ismb_encrypt,
2258
.enum_list = enum_smb_signing_vals,
2259
.flags = FLAG_ADVANCED,
2262
.label = "client use spnego",
2264
.p_class = P_GLOBAL,
2265
.ptr = &Globals.bClientUseSpnego,
2268
.flags = FLAG_ADVANCED,
2271
.label = "client ldap sasl wrapping",
2273
.p_class = P_GLOBAL,
2274
.ptr = &Globals.client_ldap_sasl_wrapping,
2276
.enum_list = enum_ldap_sasl_wrapping,
2277
.flags = FLAG_ADVANCED,
2280
.label = "enable asu support",
2282
.p_class = P_GLOBAL,
2283
.ptr = &Globals.bASUSupport,
2286
.flags = FLAG_ADVANCED,
2289
.label = "svcctl list",
2291
.p_class = P_GLOBAL,
2292
.ptr = &Globals.szServicesList,
2295
.flags = FLAG_ADVANCED,
2298
{N_("Tuning Options"), P_SEP, P_SEPARATOR},
2301
.label = "block size",
2304
.ptr = &sDefault.iBlock_size,
2307
.flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
2310
.label = "deadtime",
2312
.p_class = P_GLOBAL,
2313
.ptr = &Globals.deadtime,
2316
.flags = FLAG_ADVANCED,
2319
.label = "getwd cache",
2321
.p_class = P_GLOBAL,
2322
.ptr = &Globals.getwd_cache,
2325
.flags = FLAG_ADVANCED,
2328
.label = "keepalive",
2330
.p_class = P_GLOBAL,
2331
.ptr = &Globals.iKeepalive,
2334
.flags = FLAG_ADVANCED,
2337
.label = "change notify",
2340
.ptr = &sDefault.bChangeNotify,
2343
.flags = FLAG_ADVANCED | FLAG_SHARE,
2346
.label = "directory name cache size",
2349
.ptr = &sDefault.iDirectoryNameCacheSize,
2352
.flags = FLAG_ADVANCED | FLAG_SHARE,
2355
.label = "kernel change notify",
2358
.ptr = &sDefault.bKernelChangeNotify,
2361
.flags = FLAG_ADVANCED | FLAG_SHARE,
2364
.label = "lpq cache time",
2366
.p_class = P_GLOBAL,
2367
.ptr = &Globals.lpqcachetime,
2370
.flags = FLAG_ADVANCED,
2373
.label = "max smbd processes",
2375
.p_class = P_GLOBAL,
2376
.ptr = &Globals.iMaxSmbdProcesses,
2379
.flags = FLAG_ADVANCED,
2382
.label = "max connections",
2385
.ptr = &sDefault.iMaxConnections,
2388
.flags = FLAG_ADVANCED | FLAG_SHARE,
2391
.label = "paranoid server security",
2393
.p_class = P_GLOBAL,
2394
.ptr = &Globals.paranoid_server_security,
2397
.flags = FLAG_ADVANCED,
2400
.label = "max disk size",
2402
.p_class = P_GLOBAL,
2403
.ptr = &Globals.maxdisksize,
2406
.flags = FLAG_ADVANCED,
2409
.label = "max open files",
2411
.p_class = P_GLOBAL,
2412
.ptr = &Globals.max_open_files,
2415
.flags = FLAG_ADVANCED,
2418
.label = "min print space",
2421
.ptr = &sDefault.iMinPrintSpace,
2424
.flags = FLAG_ADVANCED | FLAG_PRINT,
2427
.label = "socket options",
2429
.p_class = P_GLOBAL,
2430
.ptr = &Globals.szSocketOptions,
2433
.flags = FLAG_ADVANCED,
2436
.label = "strict allocate",
2439
.ptr = &sDefault.bStrictAllocate,
2442
.flags = FLAG_ADVANCED | FLAG_SHARE,
2445
.label = "strict sync",
2448
.ptr = &sDefault.bStrictSync,
2451
.flags = FLAG_ADVANCED | FLAG_SHARE,
2454
.label = "sync always",
2457
.ptr = &sDefault.bSyncAlways,
2460
.flags = FLAG_ADVANCED | FLAG_SHARE,
2463
.label = "use mmap",
2465
.p_class = P_GLOBAL,
2466
.ptr = &Globals.bUseMmap,
2469
.flags = FLAG_ADVANCED,
2472
.label = "use sendfile",
2475
.ptr = &sDefault.bUseSendfile,
2478
.flags = FLAG_ADVANCED | FLAG_SHARE,
2481
.label = "hostname lookups",
2483
.p_class = P_GLOBAL,
2484
.ptr = &Globals.bHostnameLookups,
2487
.flags = FLAG_ADVANCED,
2490
.label = "write cache size",
2493
.ptr = &sDefault.iWriteCacheSize,
2496
.flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_DEPRECATED,
2499
.label = "name cache timeout",
2501
.p_class = P_GLOBAL,
2502
.ptr = &Globals.name_cache_timeout,
2505
.flags = FLAG_ADVANCED,
2508
.label = "ctdbd socket",
2510
.p_class = P_GLOBAL,
2511
.ptr = &Globals.ctdbdSocket,
2514
.flags = FLAG_ADVANCED | FLAG_GLOBAL,
2517
.label = "cluster addresses",
2519
.p_class = P_GLOBAL,
2520
.ptr = &Globals.szClusterAddresses,
2523
.flags = FLAG_ADVANCED | FLAG_GLOBAL,
2526
.label = "clustering",
2528
.p_class = P_GLOBAL,
2529
.ptr = &Globals.clustering,
2532
.flags = FLAG_ADVANCED | FLAG_GLOBAL,
2535
{N_("Printing Options"), P_SEP, P_SEPARATOR},
2538
.label = "max reported print jobs",
2541
.ptr = &sDefault.iMaxReportedPrintJobs,
2544
.flags = FLAG_ADVANCED | FLAG_PRINT,
2547
.label = "max print jobs",
2550
.ptr = &sDefault.iMaxPrintJobs,
2553
.flags = FLAG_ADVANCED | FLAG_PRINT,
2556
.label = "load printers",
2558
.p_class = P_GLOBAL,
2559
.ptr = &Globals.bLoadPrinters,
2562
.flags = FLAG_ADVANCED | FLAG_PRINT,
2565
.label = "printcap cache time",
2567
.p_class = P_GLOBAL,
2568
.ptr = &Globals.PrintcapCacheTime,
2571
.flags = FLAG_ADVANCED | FLAG_PRINT,
2574
.label = "printcap name",
2576
.p_class = P_GLOBAL,
2577
.ptr = &Globals.szPrintcapname,
2580
.flags = FLAG_ADVANCED | FLAG_PRINT,
2583
.label = "printcap",
2585
.p_class = P_GLOBAL,
2586
.ptr = &Globals.szPrintcapname,
2592
.label = "printable",
2595
.ptr = &sDefault.bPrint_ok,
2598
.flags = FLAG_ADVANCED | FLAG_PRINT,
2601
.label = "print ok",
2604
.ptr = &sDefault.bPrint_ok,
2610
.label = "printing",
2613
.ptr = &sDefault.iPrinting,
2614
.special = handle_printing,
2615
.enum_list = enum_printing,
2616
.flags = FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL,
2619
.label = "cups options",
2622
.ptr = &sDefault.szCupsOptions,
2625
.flags = FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL,
2628
.label = "cups server",
2630
.p_class = P_GLOBAL,
2631
.ptr = &Globals.szCupsServer,
2634
.flags = FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL,
2637
.label = "cups connection timeout",
2639
.p_class = P_GLOBAL,
2640
.ptr = &Globals.cups_connection_timeout,
2643
.flags = FLAG_ADVANCED,
2646
.label = "iprint server",
2648
.p_class = P_GLOBAL,
2649
.ptr = &Globals.szIPrintServer,
2652
.flags = FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL,
2655
.label = "print command",
2658
.ptr = &sDefault.szPrintcommand,
2661
.flags = FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL,
2664
.label = "disable spoolss",
2666
.p_class = P_GLOBAL,
2667
.ptr = &Globals.bDisableSpoolss,
2670
.flags = FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL,
2673
.label = "enable spoolss",
2675
.p_class = P_GLOBAL,
2676
.ptr = &Globals.bDisableSpoolss,
2682
.label = "lpq command",
2685
.ptr = &sDefault.szLpqcommand,
2688
.flags = FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL,
2691
.label = "lprm command",
2694
.ptr = &sDefault.szLprmcommand,
2697
.flags = FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL,
2700
.label = "lppause command",
2703
.ptr = &sDefault.szLppausecommand,
2706
.flags = FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL,
2709
.label = "lpresume command",
2712
.ptr = &sDefault.szLpresumecommand,
2715
.flags = FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL,
2718
.label = "queuepause command",
2721
.ptr = &sDefault.szQueuepausecommand,
2724
.flags = FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL,
2727
.label = "queueresume command",
2730
.ptr = &sDefault.szQueueresumecommand,
2733
.flags = FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL,
2736
.label = "addport command",
2738
.p_class = P_GLOBAL,
2739
.ptr = &Globals.szAddPortCommand,
2742
.flags = FLAG_ADVANCED,
2745
.label = "enumports command",
2747
.p_class = P_GLOBAL,
2748
.ptr = &Globals.szEnumPortsCommand,
2751
.flags = FLAG_ADVANCED,
2754
.label = "addprinter command",
2756
.p_class = P_GLOBAL,
2757
.ptr = &Globals.szAddPrinterCommand,
2760
.flags = FLAG_ADVANCED,
2763
.label = "deleteprinter command",
2765
.p_class = P_GLOBAL,
2766
.ptr = &Globals.szDeletePrinterCommand,
2769
.flags = FLAG_ADVANCED,
2772
.label = "show add printer wizard",
2774
.p_class = P_GLOBAL,
2775
.ptr = &Globals.bMsAddPrinterWizard,
2778
.flags = FLAG_ADVANCED,
2781
.label = "os2 driver map",
2783
.p_class = P_GLOBAL,
2784
.ptr = &Globals.szOs2DriverMap,
2787
.flags = FLAG_ADVANCED,
2791
.label = "printer name",
2794
.ptr = &sDefault.szPrintername,
2797
.flags = FLAG_ADVANCED | FLAG_PRINT,
2803
.ptr = &sDefault.szPrintername,
2809
.label = "use client driver",
2812
.ptr = &sDefault.bUseClientDriver,
2815
.flags = FLAG_ADVANCED | FLAG_PRINT,
2818
.label = "default devmode",
2821
.ptr = &sDefault.bDefaultDevmode,
2824
.flags = FLAG_ADVANCED | FLAG_PRINT,
2827
.label = "force printername",
2830
.ptr = &sDefault.bForcePrintername,
2833
.flags = FLAG_ADVANCED | FLAG_PRINT,
2836
.label = "printjob username",
2839
.ptr = &sDefault.szPrintjobUsername,
2842
.flags = FLAG_ADVANCED | FLAG_PRINT,
2845
{N_("Filename Handling"), P_SEP, P_SEPARATOR},
2848
.label = "mangling method",
2850
.p_class = P_GLOBAL,
2851
.ptr = &Globals.szManglingMethod,
2854
.flags = FLAG_ADVANCED,
2857
.label = "mangle prefix",
2859
.p_class = P_GLOBAL,
2860
.ptr = &Globals.mangle_prefix,
2863
.flags = FLAG_ADVANCED,
2867
.label = "default case",
2870
.ptr = &sDefault.iDefaultCase,
2872
.enum_list = enum_case,
2873
.flags = FLAG_ADVANCED | FLAG_SHARE,
2876
.label = "case sensitive",
2879
.ptr = &sDefault.iCaseSensitive,
2881
.enum_list = enum_bool_auto,
2882
.flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
2885
.label = "casesignames",
2888
.ptr = &sDefault.iCaseSensitive,
2890
.enum_list = enum_bool_auto,
2891
.flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL | FLAG_HIDE,
2894
.label = "preserve case",
2897
.ptr = &sDefault.bCasePreserve,
2900
.flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
2903
.label = "short preserve case",
2906
.ptr = &sDefault.bShortCasePreserve,
2909
.flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
2912
.label = "mangling char",
2915
.ptr = &sDefault.magic_char,
2918
.flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
2921
.label = "hide dot files",
2924
.ptr = &sDefault.bHideDotFiles,
2927
.flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
2930
.label = "hide special files",
2933
.ptr = &sDefault.bHideSpecialFiles,
2936
.flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
2939
.label = "hide unreadable",
2942
.ptr = &sDefault.bHideUnReadable,
2945
.flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
2948
.label = "hide unwriteable files",
2951
.ptr = &sDefault.bHideUnWriteableFiles,
2954
.flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
2957
.label = "delete veto files",
2960
.ptr = &sDefault.bDeleteVetoFiles,
2963
.flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
2966
.label = "veto files",
2969
.ptr = &sDefault.szVetoFiles,
2972
.flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
2975
.label = "hide files",
2978
.ptr = &sDefault.szHideFiles,
2981
.flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
2984
.label = "veto oplock files",
2987
.ptr = &sDefault.szVetoOplockFiles,
2990
.flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
2993
.label = "map archive",
2996
.ptr = &sDefault.bMap_archive,
2999
.flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
3002
.label = "map hidden",
3005
.ptr = &sDefault.bMap_hidden,
3008
.flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
3011
.label = "map system",
3014
.ptr = &sDefault.bMap_system,
3017
.flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
3020
.label = "map readonly",
3023
.ptr = &sDefault.iMap_readonly,
3025
.enum_list = enum_map_readonly,
3026
.flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
3029
.label = "mangled names",
3032
.ptr = &sDefault.bMangledNames,
3035
.flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
3038
.label = "max stat cache size",
3040
.p_class = P_GLOBAL,
3041
.ptr = &Globals.iMaxStatCacheSize,
3044
.flags = FLAG_ADVANCED,
3047
.label = "stat cache",
3049
.p_class = P_GLOBAL,
3050
.ptr = &Globals.bStatCache,
3053
.flags = FLAG_ADVANCED,
3056
.label = "store dos attributes",
3059
.ptr = &sDefault.bStoreDosAttributes,
3062
.flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
3065
.label = "dmapi support",
3068
.ptr = &sDefault.bDmapiSupport,
3071
.flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
3075
{N_("Domain Options"), P_SEP, P_SEPARATOR},
3078
.label = "machine password timeout",
3080
.p_class = P_GLOBAL,
3081
.ptr = &Globals.machine_password_timeout,
3084
.flags = FLAG_ADVANCED | FLAG_WIZARD,
3087
{N_("Logon Options"), P_SEP, P_SEPARATOR},
3090
.label = "add user script",
3092
.p_class = P_GLOBAL,
3093
.ptr = &Globals.szAddUserScript,
3096
.flags = FLAG_ADVANCED,
3099
.label = "rename user script",
3101
.p_class = P_GLOBAL,
3102
.ptr = &Globals.szRenameUserScript,
3105
.flags = FLAG_ADVANCED,
3108
.label = "delete user script",
3110
.p_class = P_GLOBAL,
3111
.ptr = &Globals.szDelUserScript,
3114
.flags = FLAG_ADVANCED,
3117
.label = "add group script",
3119
.p_class = P_GLOBAL,
3120
.ptr = &Globals.szAddGroupScript,
3123
.flags = FLAG_ADVANCED,
3126
.label = "delete group script",
3128
.p_class = P_GLOBAL,
3129
.ptr = &Globals.szDelGroupScript,
3132
.flags = FLAG_ADVANCED,
3135
.label = "add user to group script",
3137
.p_class = P_GLOBAL,
3138
.ptr = &Globals.szAddUserToGroupScript,
3141
.flags = FLAG_ADVANCED,
3144
.label = "delete user from group script",
3146
.p_class = P_GLOBAL,
3147
.ptr = &Globals.szDelUserFromGroupScript,
3150
.flags = FLAG_ADVANCED,
3153
.label = "set primary group script",
3155
.p_class = P_GLOBAL,
3156
.ptr = &Globals.szSetPrimaryGroupScript,
3159
.flags = FLAG_ADVANCED,
3162
.label = "add machine script",
3164
.p_class = P_GLOBAL,
3165
.ptr = &Globals.szAddMachineScript,
3168
.flags = FLAG_ADVANCED,
3171
.label = "shutdown script",
3173
.p_class = P_GLOBAL,
3174
.ptr = &Globals.szShutdownScript,
3177
.flags = FLAG_ADVANCED,
3180
.label = "abort shutdown script",
3182
.p_class = P_GLOBAL,
3183
.ptr = &Globals.szAbortShutdownScript,
3186
.flags = FLAG_ADVANCED,
3189
.label = "username map script",
3191
.p_class = P_GLOBAL,
3192
.ptr = &Globals.szUsernameMapScript,
3195
.flags = FLAG_ADVANCED,
3198
.label = "logon script",
3200
.p_class = P_GLOBAL,
3201
.ptr = &Globals.szLogonScript,
3204
.flags = FLAG_ADVANCED,
3207
.label = "logon path",
3209
.p_class = P_GLOBAL,
3210
.ptr = &Globals.szLogonPath,
3213
.flags = FLAG_ADVANCED,
3216
.label = "logon drive",
3218
.p_class = P_GLOBAL,
3219
.ptr = &Globals.szLogonDrive,
3222
.flags = FLAG_ADVANCED,
3225
.label = "logon home",
3227
.p_class = P_GLOBAL,
3228
.ptr = &Globals.szLogonHome,
3231
.flags = FLAG_ADVANCED,
3234
.label = "domain logons",
3236
.p_class = P_GLOBAL,
3237
.ptr = &Globals.bDomainLogons,
3240
.flags = FLAG_ADVANCED,
3244
.label = "init logon delayed hosts",
3246
.p_class = P_GLOBAL,
3247
.ptr = &Globals.szInitLogonDelayedHosts,
3250
.flags = FLAG_ADVANCED,
3254
.label = "init logon delay",
3256
.p_class = P_GLOBAL,
3257
.ptr = &Globals.InitLogonDelay,
3260
.flags = FLAG_ADVANCED,
3264
{N_("Browse Options"), P_SEP, P_SEPARATOR},
3267
.label = "os level",
3269
.p_class = P_GLOBAL,
3270
.ptr = &Globals.os_level,
3273
.flags = FLAG_BASIC | FLAG_ADVANCED,
3276
.label = "lm announce",
3278
.p_class = P_GLOBAL,
3279
.ptr = &Globals.lm_announce,
3281
.enum_list = enum_bool_auto,
3282
.flags = FLAG_ADVANCED,
3285
.label = "lm interval",
3287
.p_class = P_GLOBAL,
3288
.ptr = &Globals.lm_interval,
3291
.flags = FLAG_ADVANCED,
3294
.label = "preferred master",
3296
.p_class = P_GLOBAL,
3297
.ptr = &Globals.iPreferredMaster,
3299
.enum_list = enum_bool_auto,
3300
.flags = FLAG_BASIC | FLAG_ADVANCED,
3303
.label = "prefered master",
3305
.p_class = P_GLOBAL,
3306
.ptr = &Globals.iPreferredMaster,
3308
.enum_list = enum_bool_auto,
3312
.label = "local master",
3314
.p_class = P_GLOBAL,
3315
.ptr = &Globals.bLocalMaster,
3318
.flags = FLAG_BASIC | FLAG_ADVANCED,
3321
.label = "domain master",
3323
.p_class = P_GLOBAL,
3324
.ptr = &Globals.iDomainMaster,
3326
.enum_list = enum_bool_auto,
3327
.flags = FLAG_BASIC | FLAG_ADVANCED,
3330
.label = "browse list",
3332
.p_class = P_GLOBAL,
3333
.ptr = &Globals.bBrowseList,
3336
.flags = FLAG_ADVANCED,
3339
.label = "browseable",
3342
.ptr = &sDefault.bBrowseable,
3345
.flags = FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT,
3348
.label = "access based share enum",
3351
.ptr = &sDefault.bAccessBasedShareEnum,
3354
.flags = FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE
3357
.label = "browsable",
3360
.ptr = &sDefault.bBrowseable,
3366
.label = "enhanced browsing",
3368
.p_class = P_GLOBAL,
3369
.ptr = &Globals.enhanced_browsing,
3372
.flags = FLAG_ADVANCED,
3375
{N_("WINS Options"), P_SEP, P_SEPARATOR},
3378
.label = "dns proxy",
3380
.p_class = P_GLOBAL,
3381
.ptr = &Globals.bDNSproxy,
3384
.flags = FLAG_ADVANCED,
3387
.label = "wins proxy",
3389
.p_class = P_GLOBAL,
3390
.ptr = &Globals.bWINSproxy,
3393
.flags = FLAG_ADVANCED,
3396
.label = "wins server",
3398
.p_class = P_GLOBAL,
3399
.ptr = &Globals.szWINSservers,
3402
.flags = FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD,
3405
.label = "wins support",
3407
.p_class = P_GLOBAL,
3408
.ptr = &Globals.bWINSsupport,
3411
.flags = FLAG_BASIC | FLAG_ADVANCED | FLAG_WIZARD,
3414
.label = "wins hook",
3416
.p_class = P_GLOBAL,
3417
.ptr = &Globals.szWINSHook,
3420
.flags = FLAG_ADVANCED,
3423
{N_("Locking Options"), P_SEP, P_SEPARATOR},
3426
.label = "blocking locks",
3429
.ptr = &sDefault.bBlockingLocks,
3432
.flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
3435
.label = "csc policy",
3438
.ptr = &sDefault.iCSCPolicy,
3440
.enum_list = enum_csc_policy,
3441
.flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
3444
.label = "fake oplocks",
3447
.ptr = &sDefault.bFakeOplocks,
3450
.flags = FLAG_ADVANCED | FLAG_SHARE,
3453
.label = "kernel oplocks",
3455
.p_class = P_GLOBAL,
3456
.ptr = &Globals.bKernelOplocks,
3459
.flags = FLAG_ADVANCED | FLAG_GLOBAL,
3465
.ptr = &sDefault.bLocking,
3468
.flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
3471
.label = "lock spin time",
3473
.p_class = P_GLOBAL,
3474
.ptr = &Globals.iLockSpinTime,
3477
.flags = FLAG_ADVANCED | FLAG_GLOBAL,
3483
.ptr = &sDefault.bOpLocks,
3486
.flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
3489
.label = "level2 oplocks",
3492
.ptr = &sDefault.bLevel2OpLocks,
3495
.flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
3498
.label = "oplock break wait time",
3500
.p_class = P_GLOBAL,
3501
.ptr = &Globals.oplock_break_wait_time,
3504
.flags = FLAG_ADVANCED | FLAG_GLOBAL,
3507
.label = "oplock contention limit",
3510
.ptr = &sDefault.iOplockContentionLimit,
3513
.flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
3516
.label = "posix locking",
3519
.ptr = &sDefault.bPosixLocking,
3522
.flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
3525
.label = "strict locking",
3528
.ptr = &sDefault.iStrictLocking,
3530
.enum_list = enum_bool_auto,
3531
.flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
3534
.label = "share modes",
3537
.ptr = &sDefault.bShareModes,
3540
.flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL | FLAG_DEPRECATED,
3543
{N_("Ldap Options"), P_SEP, P_SEPARATOR},
3546
.label = "ldap admin dn",
3548
.p_class = P_GLOBAL,
3549
.ptr = &Globals.szLdapAdminDn,
3552
.flags = FLAG_ADVANCED,
3555
.label = "ldap delete dn",
3557
.p_class = P_GLOBAL,
3558
.ptr = &Globals.ldap_delete_dn,
3561
.flags = FLAG_ADVANCED,
3564
.label = "ldap group suffix",
3566
.p_class = P_GLOBAL,
3567
.ptr = &Globals.szLdapGroupSuffix,
3570
.flags = FLAG_ADVANCED,
3573
.label = "ldap idmap suffix",
3575
.p_class = P_GLOBAL,
3576
.ptr = &Globals.szLdapIdmapSuffix,
3579
.flags = FLAG_ADVANCED,
3582
.label = "ldap machine suffix",
3584
.p_class = P_GLOBAL,
3585
.ptr = &Globals.szLdapMachineSuffix,
3588
.flags = FLAG_ADVANCED,
3591
.label = "ldap passwd sync",
3593
.p_class = P_GLOBAL,
3594
.ptr = &Globals.ldap_passwd_sync,
3596
.enum_list = enum_ldap_passwd_sync,
3597
.flags = FLAG_ADVANCED,
3600
.label = "ldap password sync",
3602
.p_class = P_GLOBAL,
3603
.ptr = &Globals.ldap_passwd_sync,
3605
.enum_list = enum_ldap_passwd_sync,
3609
.label = "ldap replication sleep",
3611
.p_class = P_GLOBAL,
3612
.ptr = &Globals.ldap_replication_sleep,
3615
.flags = FLAG_ADVANCED,
3618
.label = "ldap suffix",
3620
.p_class = P_GLOBAL,
3621
.ptr = &Globals.szLdapSuffix,
3624
.flags = FLAG_ADVANCED,
3627
.label = "ldap ssl",
3629
.p_class = P_GLOBAL,
3630
.ptr = &Globals.ldap_ssl,
3632
.enum_list = enum_ldap_ssl,
3633
.flags = FLAG_ADVANCED,
3636
.label = "ldap ssl ads",
3638
.p_class = P_GLOBAL,
3639
.ptr = &Globals.ldap_ssl_ads,
3642
.flags = FLAG_ADVANCED,
3645
.label = "ldap timeout",
3647
.p_class = P_GLOBAL,
3648
.ptr = &Globals.ldap_timeout,
3651
.flags = FLAG_ADVANCED,
3654
.label = "ldap connection timeout",
3656
.p_class = P_GLOBAL,
3657
.ptr = &Globals.ldap_connection_timeout,
3660
.flags = FLAG_ADVANCED,
3663
.label = "ldap page size",
3665
.p_class = P_GLOBAL,
3666
.ptr = &Globals.ldap_page_size,
3669
.flags = FLAG_ADVANCED,
3672
.label = "ldap user suffix",
3674
.p_class = P_GLOBAL,
3675
.ptr = &Globals.szLdapUserSuffix,
3678
.flags = FLAG_ADVANCED,
3681
.label = "ldap debug level",
3683
.p_class = P_GLOBAL,
3684
.ptr = &Globals.ldap_debug_level,
3685
.special = handle_ldap_debug_level,
3687
.flags = FLAG_ADVANCED,
3690
.label = "ldap debug threshold",
3692
.p_class = P_GLOBAL,
3693
.ptr = &Globals.ldap_debug_threshold,
3696
.flags = FLAG_ADVANCED,
3699
{N_("EventLog Options"), P_SEP, P_SEPARATOR},
3702
.label = "eventlog list",
3704
.p_class = P_GLOBAL,
3705
.ptr = &Globals.szEventLogs,
3708
.flags = FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE,
3711
{N_("Miscellaneous Options"), P_SEP, P_SEPARATOR},
3714
.label = "add share command",
3716
.p_class = P_GLOBAL,
3717
.ptr = &Globals.szAddShareCommand,
3720
.flags = FLAG_ADVANCED,
3723
.label = "change share command",
3725
.p_class = P_GLOBAL,
3726
.ptr = &Globals.szChangeShareCommand,
3729
.flags = FLAG_ADVANCED,
3732
.label = "delete share command",
3734
.p_class = P_GLOBAL,
3735
.ptr = &Globals.szDeleteShareCommand,
3738
.flags = FLAG_ADVANCED,
3741
.label = "config file",
3743
.p_class = P_GLOBAL,
3744
.ptr = &Globals.szConfigFile,
3747
.flags = FLAG_HIDE|FLAG_META,
3752
.p_class = P_GLOBAL,
3753
.ptr = &Globals.szAutoServices,
3756
.flags = FLAG_ADVANCED,
3759
.label = "auto services",
3761
.p_class = P_GLOBAL,
3762
.ptr = &Globals.szAutoServices,
3765
.flags = FLAG_ADVANCED,
3768
.label = "lock directory",
3770
.p_class = P_GLOBAL,
3771
.ptr = &Globals.szLockDir,
3774
.flags = FLAG_ADVANCED,
3777
.label = "lock dir",
3779
.p_class = P_GLOBAL,
3780
.ptr = &Globals.szLockDir,
3786
.label = "state directory",
3788
.p_class = P_GLOBAL,
3789
.ptr = &Globals.szStateDir,
3792
.flags = FLAG_ADVANCED,
3795
.label = "cache directory",
3797
.p_class = P_GLOBAL,
3798
.ptr = &Globals.szCacheDir,
3801
.flags = FLAG_ADVANCED,
3804
.label = "pid directory",
3806
.p_class = P_GLOBAL,
3807
.ptr = &Globals.szPidDir,
3810
.flags = FLAG_ADVANCED,
3814
.label = "utmp directory",
3816
.p_class = P_GLOBAL,
3817
.ptr = &Globals.szUtmpDir,
3820
.flags = FLAG_ADVANCED,
3823
.label = "wtmp directory",
3825
.p_class = P_GLOBAL,
3826
.ptr = &Globals.szWtmpDir,
3829
.flags = FLAG_ADVANCED,
3834
.p_class = P_GLOBAL,
3835
.ptr = &Globals.bUtmp,
3838
.flags = FLAG_ADVANCED,
3842
.label = "default service",
3844
.p_class = P_GLOBAL,
3845
.ptr = &Globals.szDefaultService,
3848
.flags = FLAG_ADVANCED,
3853
.p_class = P_GLOBAL,
3854
.ptr = &Globals.szDefaultService,
3857
.flags = FLAG_ADVANCED,
3860
.label = "message command",
3862
.p_class = P_GLOBAL,
3863
.ptr = &Globals.szMsgCommand,
3866
.flags = FLAG_ADVANCED,
3869
.label = "dfree cache time",
3872
.ptr = &sDefault.iDfreeCacheTime,
3875
.flags = FLAG_ADVANCED,
3878
.label = "dfree command",
3881
.ptr = &sDefault.szDfree,
3884
.flags = FLAG_ADVANCED,
3887
.label = "get quota command",
3889
.p_class = P_GLOBAL,
3890
.ptr = &Globals.szGetQuota,
3893
.flags = FLAG_ADVANCED,
3896
.label = "set quota command",
3898
.p_class = P_GLOBAL,
3899
.ptr = &Globals.szSetQuota,
3902
.flags = FLAG_ADVANCED,
3905
.label = "remote announce",
3907
.p_class = P_GLOBAL,
3908
.ptr = &Globals.szRemoteAnnounce,
3911
.flags = FLAG_ADVANCED,
3914
.label = "remote browse sync",
3916
.p_class = P_GLOBAL,
3917
.ptr = &Globals.szRemoteBrowseSync,
3920
.flags = FLAG_ADVANCED,
3923
.label = "socket address",
3925
.p_class = P_GLOBAL,
3926
.ptr = &Globals.szSocketAddress,
3929
.flags = FLAG_ADVANCED,
3932
.label = "homedir map",
3934
.p_class = P_GLOBAL,
3935
.ptr = &Globals.szNISHomeMapName,
3938
.flags = FLAG_ADVANCED,
3941
.label = "afs username map",
3943
.p_class = P_GLOBAL,
3944
.ptr = &Globals.szAfsUsernameMap,
3947
.flags = FLAG_ADVANCED,
3950
.label = "afs token lifetime",
3952
.p_class = P_GLOBAL,
3953
.ptr = &Globals.iAfsTokenLifetime,
3956
.flags = FLAG_ADVANCED,
3959
.label = "log nt token command",
3961
.p_class = P_GLOBAL,
3962
.ptr = &Globals.szLogNtTokenCommand,
3965
.flags = FLAG_ADVANCED,
3968
.label = "time offset",
3970
.p_class = P_GLOBAL,
3971
.ptr = &extra_time_offset,
3974
.flags = FLAG_ADVANCED,
3977
.label = "NIS homedir",
3979
.p_class = P_GLOBAL,
3980
.ptr = &Globals.bNISHomeMap,
3983
.flags = FLAG_ADVANCED,
3989
.ptr = &sDefault.valid,
3998
.ptr = &sDefault.szCopy,
3999
.special = handle_copy,
4007
.ptr = &sDefault.szInclude,
4008
.special = handle_include,
4010
.flags = FLAG_HIDE|FLAG_META,
4016
.ptr = &sDefault.szPreExec,
4019
.flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT,
4025
.ptr = &sDefault.szPreExec,
4028
.flags = FLAG_ADVANCED,
4031
.label = "preexec close",
4034
.ptr = &sDefault.bPreexecClose,
4037
.flags = FLAG_ADVANCED | FLAG_SHARE,
4040
.label = "postexec",
4043
.ptr = &sDefault.szPostExec,
4046
.flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT,
4049
.label = "root preexec",
4052
.ptr = &sDefault.szRootPreExec,
4055
.flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT,
4058
.label = "root preexec close",
4061
.ptr = &sDefault.bRootpreexecClose,
4064
.flags = FLAG_ADVANCED | FLAG_SHARE,
4067
.label = "root postexec",
4070
.ptr = &sDefault.szRootPostExec,
4073
.flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT,
4076
.label = "available",
4079
.ptr = &sDefault.bAvailable,
4082
.flags = FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT,
4085
.label = "registry shares",
4087
.p_class = P_GLOBAL,
4088
.ptr = &Globals.bRegistryShares,
4091
.flags = FLAG_ADVANCED,
4094
.label = "usershare allow guests",
4096
.p_class = P_GLOBAL,
4097
.ptr = &Globals.bUsershareAllowGuests,
4100
.flags = FLAG_ADVANCED,
4103
.label = "usershare max shares",
4105
.p_class = P_GLOBAL,
4106
.ptr = &Globals.iUsershareMaxShares,
4109
.flags = FLAG_ADVANCED,
4112
.label = "usershare owner only",
4114
.p_class = P_GLOBAL,
4115
.ptr = &Globals.bUsershareOwnerOnly,
4118
.flags = FLAG_ADVANCED,
4121
.label = "usershare path",
4123
.p_class = P_GLOBAL,
4124
.ptr = &Globals.szUsersharePath,
4127
.flags = FLAG_ADVANCED,
4130
.label = "usershare prefix allow list",
4132
.p_class = P_GLOBAL,
4133
.ptr = &Globals.szUsersharePrefixAllowList,
4136
.flags = FLAG_ADVANCED,
4139
.label = "usershare prefix deny list",
4141
.p_class = P_GLOBAL,
4142
.ptr = &Globals.szUsersharePrefixDenyList,
4145
.flags = FLAG_ADVANCED,
4148
.label = "usershare template share",
4150
.p_class = P_GLOBAL,
4151
.ptr = &Globals.szUsershareTemplateShare,
4154
.flags = FLAG_ADVANCED,
4160
.ptr = &sDefault.volume,
4163
.flags = FLAG_ADVANCED | FLAG_SHARE,
4169
.ptr = &sDefault.fstype,
4172
.flags = FLAG_ADVANCED | FLAG_SHARE,
4175
.label = "set directory",
4178
.ptr = &sDefault.bNo_set_dir,
4181
.flags = FLAG_ADVANCED | FLAG_SHARE,
4184
.label = "wide links",
4187
.ptr = &sDefault.bWidelinks,
4190
.flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
4193
.label = "follow symlinks",
4196
.ptr = &sDefault.bSymlinks,
4199
.flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
4202
.label = "dont descend",
4205
.ptr = &sDefault.szDontdescend,
4208
.flags = FLAG_ADVANCED | FLAG_SHARE,
4211
.label = "magic script",
4214
.ptr = &sDefault.szMagicScript,
4217
.flags = FLAG_ADVANCED | FLAG_SHARE,
4220
.label = "magic output",
4223
.ptr = &sDefault.szMagicOutput,
4226
.flags = FLAG_ADVANCED | FLAG_SHARE,
4229
.label = "delete readonly",
4232
.ptr = &sDefault.bDeleteReadonly,
4235
.flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
4238
.label = "dos filemode",
4241
.ptr = &sDefault.bDosFilemode,
4244
.flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
4247
.label = "dos filetimes",
4250
.ptr = &sDefault.bDosFiletimes,
4253
.flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
4256
.label = "dos filetime resolution",
4259
.ptr = &sDefault.bDosFiletimeResolution,
4262
.flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
4265
.label = "fake directory create times",
4268
.ptr = &sDefault.bFakeDirCreateTimes,
4271
.flags = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
4274
.label = "panic action",
4276
.p_class = P_GLOBAL,
4277
.ptr = &Globals.szPanicAction,
4280
.flags = FLAG_ADVANCED,
4283
.label = "perfcount module",
4285
.p_class = P_GLOBAL,
4286
.ptr = &Globals.szSMBPerfcountModule,
4289
.flags = FLAG_ADVANCED,
4292
{N_("VFS module options"), P_SEP, P_SEPARATOR},
4295
.label = "vfs objects",
4298
.ptr = &sDefault.szVfsObjects,
4301
.flags = FLAG_ADVANCED | FLAG_SHARE,
4304
.label = "vfs object",
4307
.ptr = &sDefault.szVfsObjects,
4314
{N_("MSDFS options"), P_SEP, P_SEPARATOR},
4317
.label = "msdfs root",
4320
.ptr = &sDefault.bMSDfsRoot,
4323
.flags = FLAG_ADVANCED | FLAG_SHARE,
4326
.label = "msdfs proxy",
4329
.ptr = &sDefault.szMSDfsProxy,
4332
.flags = FLAG_ADVANCED | FLAG_SHARE,
4335
.label = "host msdfs",
4337
.p_class = P_GLOBAL,
4338
.ptr = &Globals.bHostMSDfs,
4341
.flags = FLAG_ADVANCED,
4344
{N_("Winbind options"), P_SEP, P_SEPARATOR},
4347
.label = "passdb expand explicit",
4349
.p_class = P_GLOBAL,
4350
.ptr = &Globals.bPassdbExpandExplicit,
4353
.flags = FLAG_ADVANCED,
4356
.label = "idmap backend",
4358
.p_class = P_GLOBAL,
4359
.ptr = &Globals.szIdmapBackend,
4362
.flags = FLAG_ADVANCED,
4365
.label = "idmap alloc backend",
4367
.p_class = P_GLOBAL,
4368
.ptr = &Globals.szIdmapAllocBackend,
4371
.flags = FLAG_ADVANCED,
4374
.label = "idmap cache time",
4376
.p_class = P_GLOBAL,
4377
.ptr = &Globals.iIdmapCacheTime,
4380
.flags = FLAG_ADVANCED,
4383
.label = "idmap negative cache time",
4385
.p_class = P_GLOBAL,
4386
.ptr = &Globals.iIdmapNegativeCacheTime,
4389
.flags = FLAG_ADVANCED,
4392
.label = "idmap uid",
4394
.p_class = P_GLOBAL,
4395
.ptr = &Globals.szIdmapUID,
4396
.special = handle_idmap_uid,
4398
.flags = FLAG_ADVANCED,
4401
.label = "winbind uid",
4403
.p_class = P_GLOBAL,
4404
.ptr = &Globals.szIdmapUID,
4405
.special = handle_idmap_uid,
4410
.label = "idmap gid",
4412
.p_class = P_GLOBAL,
4413
.ptr = &Globals.szIdmapGID,
4414
.special = handle_idmap_gid,
4416
.flags = FLAG_ADVANCED,
4419
.label = "winbind gid",
4421
.p_class = P_GLOBAL,
4422
.ptr = &Globals.szIdmapGID,
4423
.special = handle_idmap_gid,
4428
.label = "template homedir",
4430
.p_class = P_GLOBAL,
4431
.ptr = &Globals.szTemplateHomedir,
4434
.flags = FLAG_ADVANCED,
4437
.label = "template shell",
4439
.p_class = P_GLOBAL,
4440
.ptr = &Globals.szTemplateShell,
4443
.flags = FLAG_ADVANCED,
4446
.label = "winbind separator",
4448
.p_class = P_GLOBAL,
4449
.ptr = &Globals.szWinbindSeparator,
4452
.flags = FLAG_ADVANCED,
4455
.label = "winbind cache time",
4457
.p_class = P_GLOBAL,
4458
.ptr = &Globals.winbind_cache_time,
4461
.flags = FLAG_ADVANCED,
4464
.label = "winbind reconnect delay",
4466
.p_class = P_GLOBAL,
4467
.ptr = &Globals.winbind_reconnect_delay,
4470
.flags = FLAG_ADVANCED,
4473
.label = "winbind enum users",
4475
.p_class = P_GLOBAL,
4476
.ptr = &Globals.bWinbindEnumUsers,
4479
.flags = FLAG_ADVANCED,
4482
.label = "winbind enum groups",
4484
.p_class = P_GLOBAL,
4485
.ptr = &Globals.bWinbindEnumGroups,
4488
.flags = FLAG_ADVANCED,
4491
.label = "winbind use default domain",
4493
.p_class = P_GLOBAL,
4494
.ptr = &Globals.bWinbindUseDefaultDomain,
4497
.flags = FLAG_ADVANCED,
4500
.label = "winbind trusted domains only",
4502
.p_class = P_GLOBAL,
4503
.ptr = &Globals.bWinbindTrustedDomainsOnly,
4506
.flags = FLAG_ADVANCED,
4509
.label = "winbind nested groups",
4511
.p_class = P_GLOBAL,
4512
.ptr = &Globals.bWinbindNestedGroups,
4515
.flags = FLAG_ADVANCED,
4518
.label = "winbind expand groups",
4520
.p_class = P_GLOBAL,
4521
.ptr = &Globals.winbind_expand_groups,
4524
.flags = FLAG_ADVANCED,
4527
.label = "winbind nss info",
4529
.p_class = P_GLOBAL,
4530
.ptr = &Globals.szWinbindNssInfo,
4533
.flags = FLAG_ADVANCED,
4536
.label = "winbind refresh tickets",
4538
.p_class = P_GLOBAL,
4539
.ptr = &Globals.bWinbindRefreshTickets,
4542
.flags = FLAG_ADVANCED,
4545
.label = "winbind offline logon",
4547
.p_class = P_GLOBAL,
4548
.ptr = &Globals.bWinbindOfflineLogon,
4551
.flags = FLAG_ADVANCED,
4554
.label = "winbind normalize names",
4556
.p_class = P_GLOBAL,
4557
.ptr = &Globals.bWinbindNormalizeNames,
4560
.flags = FLAG_ADVANCED,
4563
.label = "winbind rpc only",
4565
.p_class = P_GLOBAL,
4566
.ptr = &Globals.bWinbindRpcOnly,
4569
.flags = FLAG_ADVANCED,
4572
{NULL, P_BOOL, P_NONE, NULL, NULL, NULL, 0}
4575
/***************************************************************************
4576
Initialise the sDefault parameter structure for the printer values.
4577
***************************************************************************/
4579
static void init_printer_values(struct service *pService)
4581
/* choose defaults depending on the type of printing */
4582
switch (pService->iPrinting) {
4587
string_set(&pService->szLpqcommand, "lpq -P'%p'");
4588
string_set(&pService->szLprmcommand, "lprm -P'%p' %j");
4589
string_set(&pService->szPrintcommand, "lpr -r -P'%p' %s");
4594
string_set(&pService->szLpqcommand, "lpq -P'%p'");
4595
string_set(&pService->szLprmcommand, "lprm -P'%p' %j");
4596
string_set(&pService->szPrintcommand, "lpr -r -P'%p' %s");
4597
string_set(&pService->szQueuepausecommand, "lpc stop '%p'");
4598
string_set(&pService->szQueueresumecommand, "lpc start '%p'");
4599
string_set(&pService->szLppausecommand, "lpc hold '%p' %j");
4600
string_set(&pService->szLpresumecommand, "lpc release '%p' %j");
4606
/* set the lpq command to contain the destination printer
4607
name only. This is used by cups_queue_get() */
4608
string_set(&pService->szLpqcommand, "%p");
4609
string_set(&pService->szLprmcommand, "");
4610
string_set(&pService->szPrintcommand, "");
4611
string_set(&pService->szLppausecommand, "");
4612
string_set(&pService->szLpresumecommand, "");
4613
string_set(&pService->szQueuepausecommand, "");
4614
string_set(&pService->szQueueresumecommand, "");
4616
string_set(&pService->szLpqcommand, "lpq -P'%p'");
4617
string_set(&pService->szLprmcommand, "lprm -P'%p' %j");
4618
string_set(&pService->szPrintcommand, "lpr -P'%p' %s; rm %s");
4619
string_set(&pService->szLppausecommand, "lp -i '%p-%j' -H hold");
4620
string_set(&pService->szLpresumecommand, "lp -i '%p-%j' -H resume");
4621
string_set(&pService->szQueuepausecommand, "disable '%p'");
4622
string_set(&pService->szQueueresumecommand, "enable '%p'");
4623
#endif /* HAVE_CUPS */
4628
string_set(&pService->szLpqcommand, "lpstat -o%p");
4629
string_set(&pService->szLprmcommand, "cancel %p-%j");
4630
string_set(&pService->szPrintcommand, "lp -c -d%p %s; rm %s");
4631
string_set(&pService->szQueuepausecommand, "disable %p");
4632
string_set(&pService->szQueueresumecommand, "enable %p");
4634
string_set(&pService->szLppausecommand, "lp -i %p-%j -H hold");
4635
string_set(&pService->szLpresumecommand, "lp -i %p-%j -H resume");
4640
string_set(&pService->szLpqcommand, "lpq -P%p");
4641
string_set(&pService->szLprmcommand, "lprm -P%p %j");
4642
string_set(&pService->szPrintcommand, "lp -r -P%p %s");
4648
string_set(&pService->szPrintcommand, "vlp print %p %s");
4649
string_set(&pService->szLpqcommand, "vlp lpq %p");
4650
string_set(&pService->szLprmcommand, "vlp lprm %p %j");
4651
string_set(&pService->szLppausecommand, "vlp lppause %p %j");
4652
string_set(&pService->szLpresumecommand, "vlp lpresume %p %j");
4653
string_set(&pService->szQueuepausecommand, "vlp queuepause %p");
4654
string_set(&pService->szQueueresumecommand, "vlp queueresume %p");
4656
#endif /* DEVELOPER */
4661
* Function to return the default value for the maximum number of open
4662
* file descriptors permitted. This function tries to consult the
4663
* kernel-level (sysctl) and ulimit (getrlimit()) values and goes
4664
* the smaller of those.
4666
static int max_open_files(void)
4668
int sysctl_max = MAX_OPEN_FILES;
4669
int rlimit_max = MAX_OPEN_FILES;
4671
#ifdef HAVE_SYSCTLBYNAME
4673
size_t size = sizeof(sysctl_max);
4674
sysctlbyname("kern.maxfilesperproc", &sysctl_max, &size, NULL,
4679
#if (defined(HAVE_GETRLIMIT) && defined(RLIMIT_NOFILE))
4685
if (getrlimit(RLIMIT_NOFILE, &rl) == 0)
4686
rlimit_max = rl.rlim_cur;
4688
#if defined(RLIM_INFINITY)
4689
if(rl.rlim_cur == RLIM_INFINITY)
4690
rlimit_max = MAX_OPEN_FILES;
4695
return MIN(sysctl_max, rlimit_max);
4699
* Common part of freeing allocated data for one parameter.
4701
static void free_one_parameter_common(void *parm_ptr,
4702
struct parm_struct parm)
4704
if ((parm.type == P_STRING) ||
4705
(parm.type == P_USTRING))
4707
string_free((char**)parm_ptr);
4708
} else if (parm.type == P_LIST) {
4709
TALLOC_FREE(*((char***)parm_ptr));
4714
* Free the allocated data for one parameter for a share
4715
* given as a service struct.
4717
static void free_one_parameter(struct service *service,
4718
struct parm_struct parm)
4722
if (parm.p_class != P_LOCAL) {
4726
parm_ptr = lp_local_ptr(service, parm.ptr);
4728
free_one_parameter_common(parm_ptr, parm);
4732
* Free the allocated parameter data of a share given
4733
* as a service struct.
4735
static void free_parameters(struct service *service)
4739
for (i=0; parm_table[i].label; i++) {
4740
free_one_parameter(service, parm_table[i]);
4745
* Free the allocated data for one parameter for a given share
4746
* specified by an snum.
4748
static void free_one_parameter_by_snum(int snum, struct parm_struct parm)
4752
if (parm.ptr == NULL) {
4757
parm_ptr = parm.ptr;
4758
} else if (parm.p_class != P_LOCAL) {
4761
parm_ptr = lp_local_ptr_by_snum(snum, parm.ptr);
4764
free_one_parameter_common(parm_ptr, parm);
4768
* Free the allocated parameter data for a share specified
4771
static void free_parameters_by_snum(int snum)
4775
for (i=0; parm_table[i].label; i++) {
4776
free_one_parameter_by_snum(snum, parm_table[i]);
4781
* Free the allocated global parameters.
4783
static void free_global_parameters(void)
4785
free_parameters_by_snum(GLOBAL_SECTION_SNUM);
4788
/***************************************************************************
4789
Initialise the global parameter structure.
4790
***************************************************************************/
4792
static void init_globals(bool first_time_only)
4794
static bool done_init = False;
4798
/* If requested to initialize only once and we've already done it... */
4799
if (first_time_only && done_init) {
4800
/* ... then we have nothing more to do */
4805
/* The logfile can be set before this is invoked. Free it if so. */
4806
if (Globals.szLogFile != NULL) {
4807
string_free(&Globals.szLogFile);
4808
Globals.szLogFile = NULL;
4812
free_global_parameters();
4815
memset((void *)&Globals, '\0', sizeof(Globals));
4817
for (i = 0; parm_table[i].label; i++) {
4818
if ((parm_table[i].type == P_STRING ||
4819
parm_table[i].type == P_USTRING) &&
4822
string_set((char **)parm_table[i].ptr, "");
4826
string_set(&sDefault.fstype, FSTYPE_STRING);
4827
string_set(&sDefault.szPrintjobUsername, "%U");
4829
init_printer_values(&sDefault);
4832
DEBUG(3, ("Initialising global parameters\n"));
4834
string_set(&Globals.szSMBPasswdFile, get_dyn_SMB_PASSWD_FILE());
4835
string_set(&Globals.szPrivateDir, get_dyn_PRIVATE_DIR());
4837
/* use the new 'hash2' method by default, with a prefix of 1 */
4838
string_set(&Globals.szManglingMethod, "hash2");
4839
Globals.mangle_prefix = 1;
4841
string_set(&Globals.szGuestaccount, GUEST_ACCOUNT);
4843
/* using UTF8 by default allows us to support all chars */
4844
string_set(&Globals.unix_charset, DEFAULT_UNIX_CHARSET);
4846
#if defined(HAVE_NL_LANGINFO) && defined(CODESET)
4847
/* If the system supports nl_langinfo(), try to grab the value
4848
from the user's locale */
4849
string_set(&Globals.display_charset, "LOCALE");
4851
string_set(&Globals.display_charset, DEFAULT_DISPLAY_CHARSET);
4854
/* Use codepage 850 as a default for the dos character set */
4855
string_set(&Globals.dos_charset, DEFAULT_DOS_CHARSET);
4858
* Allow the default PASSWD_CHAT to be overridden in local.h.
4860
string_set(&Globals.szPasswdChat, DEFAULT_PASSWD_CHAT);
4862
set_global_myname(myhostname());
4863
string_set(&Globals.szNetbiosName,global_myname());
4865
set_global_myworkgroup(WORKGROUP);
4866
string_set(&Globals.szWorkgroup, lp_workgroup());
4868
string_set(&Globals.szPasswdProgram, "");
4869
string_set(&Globals.szLockDir, get_dyn_LOCKDIR());
4870
string_set(&Globals.szStateDir, get_dyn_STATEDIR());
4871
string_set(&Globals.szCacheDir, get_dyn_CACHEDIR());
4872
string_set(&Globals.szPidDir, get_dyn_PIDDIR());
4873
string_set(&Globals.szSocketAddress, "0.0.0.0");
4875
if (asprintf(&s, "Samba %s", samba_version_string()) < 0) {
4876
smb_panic("init_globals: ENOMEM");
4878
string_set(&Globals.szServerString, s);
4880
if (asprintf(&s, "%d.%d", DEFAULT_MAJOR_VERSION,
4881
DEFAULT_MINOR_VERSION) < 0) {
4882
smb_panic("init_globals: ENOMEM");
4884
string_set(&Globals.szAnnounceVersion, s);
4887
string_set(&Globals.szPanicAction, "/bin/sleep 999999999");
4890
string_set(&Globals.szSocketOptions, DEFAULT_SOCKET_OPTIONS);
4892
string_set(&Globals.szLogonDrive, "");
4893
/* %N is the NIS auto.home server if -DAUTOHOME is used, else same as %L */
4894
string_set(&Globals.szLogonHome, "\\\\%N\\%U");
4895
string_set(&Globals.szLogonPath, "\\\\%N\\%U\\profile");
4897
string_set(&Globals.szNameResolveOrder, "lmhosts wins host bcast");
4898
string_set(&Globals.szPasswordServer, "*");
4900
Globals.AlgorithmicRidBase = BASE_RID;
4902
Globals.bLoadPrinters = True;
4903
Globals.PrintcapCacheTime = 750; /* 12.5 minutes */
4905
Globals.ConfigBackend = config_backend;
4907
/* Was 65535 (0xFFFF). 0x4101 matches W2K and causes major speed improvements... */
4908
/* Discovered by 2 days of pain by Don McCall @ HP :-). */
4909
Globals.max_xmit = 0x4104;
4910
Globals.max_mux = 50; /* This is *needed* for profile support. */
4911
Globals.lpqcachetime = 30; /* changed to handle large print servers better -- jerry */
4912
Globals.bDisableSpoolss = False;
4913
Globals.iMaxSmbdProcesses = 0;/* no limit specified */
4914
Globals.pwordlevel = 0;
4915
Globals.unamelevel = 0;
4916
Globals.deadtime = 0;
4917
Globals.getwd_cache = true;
4918
Globals.bLargeReadwrite = True;
4919
Globals.max_log_size = 5000;
4920
Globals.max_open_files = max_open_files();
4921
Globals.open_files_db_hash_size = SMB_OPEN_DATABASE_TDB_HASH_SIZE;
4922
Globals.maxprotocol = PROTOCOL_NT1;
4923
Globals.minprotocol = PROTOCOL_CORE;
4924
Globals.security = SEC_USER;
4925
Globals.paranoid_server_security = True;
4926
Globals.bEncryptPasswords = True;
4927
Globals.bUpdateEncrypt = False;
4928
Globals.clientSchannel = Auto;
4929
Globals.serverSchannel = Auto;
4930
Globals.bReadRaw = True;
4931
Globals.bWriteRaw = True;
4932
Globals.bNullPasswords = False;
4933
Globals.bObeyPamRestrictions = False;
4935
Globals.bSyslogOnly = False;
4936
Globals.bTimestampLogs = True;
4937
string_set(&Globals.szLogLevel, "0");
4938
Globals.bDebugPrefixTimestamp = False;
4939
Globals.bDebugHiresTimestamp = False;
4940
Globals.bDebugPid = False;
4941
Globals.bDebugUid = False;
4942
Globals.bDebugClass = False;
4943
Globals.bEnableCoreFiles = True;
4944
Globals.max_ttl = 60 * 60 * 24 * 3; /* 3 days default. */
4945
Globals.max_wins_ttl = 60 * 60 * 24 * 6; /* 6 days default. */
4946
Globals.min_wins_ttl = 60 * 60 * 6; /* 6 hours default. */
4947
Globals.machine_password_timeout = 60 * 60 * 24 * 7; /* 7 days default. */
4948
Globals.lm_announce = 2; /* = Auto: send only if LM clients found */
4949
Globals.lm_interval = 60;
4950
Globals.announce_as = ANNOUNCE_AS_NT_SERVER;
4951
#if (defined(HAVE_NETGROUP) && defined(WITH_AUTOMOUNT))
4952
Globals.bNISHomeMap = False;
4953
#ifdef WITH_NISPLUS_HOME
4954
string_set(&Globals.szNISHomeMapName, "auto_home.org_dir");
4956
string_set(&Globals.szNISHomeMapName, "auto.home");
4959
Globals.bTimeServer = False;
4960
Globals.bBindInterfacesOnly = False;
4961
Globals.bUnixPasswdSync = False;
4962
Globals.bPamPasswordChange = False;
4963
Globals.bPasswdChatDebug = False;
4964
Globals.iPasswdChatTimeout = 2; /* 2 second default. */
4965
Globals.bNTPipeSupport = True; /* Do NT pipes by default. */
4966
Globals.bNTStatusSupport = True; /* Use NT status by default. */
4967
Globals.bStatCache = True; /* use stat cache by default */
4968
Globals.iMaxStatCacheSize = 256; /* 256k by default */
4969
Globals.restrict_anonymous = 0;
4970
Globals.bClientLanManAuth = False; /* Do NOT use the LanMan hash if it is available */
4971
Globals.bClientPlaintextAuth = False; /* Do NOT use a plaintext password even if is requested by the server */
4972
Globals.bLanmanAuth = False; /* Do NOT use the LanMan hash, even if it is supplied */
4973
Globals.bNTLMAuth = True; /* Do use NTLMv1 if it is supplied by the client (otherwise NTLMv2) */
4974
Globals.bClientNTLMv2Auth = False; /* Client should not use NTLMv2, as we can't tell that the server supports it. */
4975
/* Note, that we will use NTLM2 session security (which is different), if it is available */
4977
Globals.map_to_guest = 0; /* By Default, "Never" */
4978
Globals.oplock_break_wait_time = 0; /* By Default, 0 msecs. */
4979
Globals.enhanced_browsing = true;
4980
Globals.iLockSpinTime = WINDOWS_MINIMUM_LOCK_TIMEOUT_MS; /* msec. */
4981
#ifdef MMAP_BLACKLIST
4982
Globals.bUseMmap = False;
4984
Globals.bUseMmap = True;
4986
Globals.bUnixExtensions = True;
4987
Globals.bResetOnZeroVC = False;
4989
/* hostname lookups can be very expensive and are broken on
4990
a large number of sites (tridge) */
4991
Globals.bHostnameLookups = False;
4993
string_set(&Globals.szPassdbBackend, "tdbsam");
4994
string_set(&Globals.szLdapSuffix, "");
4995
string_set(&Globals.szLdapMachineSuffix, "");
4996
string_set(&Globals.szLdapUserSuffix, "");
4997
string_set(&Globals.szLdapGroupSuffix, "");
4998
string_set(&Globals.szLdapIdmapSuffix, "");
5000
string_set(&Globals.szLdapAdminDn, "");
5001
Globals.ldap_ssl = LDAP_SSL_START_TLS;
5002
Globals.ldap_ssl_ads = False;
5003
Globals.ldap_passwd_sync = LDAP_PASSWD_SYNC_OFF;
5004
Globals.ldap_delete_dn = False;
5005
Globals.ldap_replication_sleep = 1000; /* wait 1 sec for replication */
5006
Globals.ldap_timeout = LDAP_DEFAULT_TIMEOUT;
5007
Globals.ldap_connection_timeout = LDAP_CONNECTION_DEFAULT_TIMEOUT;
5008
Globals.ldap_page_size = LDAP_PAGE_SIZE;
5010
Globals.ldap_debug_level = 0;
5011
Globals.ldap_debug_threshold = 10;
5013
/* This is what we tell the afs client. in reality we set the token
5014
* to never expire, though, when this runs out the afs client will
5015
* forget the token. Set to 0 to get NEVERDATE.*/
5016
Globals.iAfsTokenLifetime = 604800;
5017
Globals.cups_connection_timeout = CUPS_DEFAULT_CONNECTION_TIMEOUT;
5019
/* these parameters are set to defaults that are more appropriate
5020
for the increasing samba install base:
5022
as a member of the workgroup, that will possibly become a
5023
_local_ master browser (lm = True). this is opposed to a forced
5024
local master browser startup (pm = True).
5026
doesn't provide WINS server service by default (wsupp = False),
5027
and doesn't provide domain master browser services by default, either.
5031
Globals.bMsAddPrinterWizard = True;
5032
Globals.os_level = 20;
5033
Globals.bLocalMaster = True;
5034
Globals.iDomainMaster = Auto; /* depending on bDomainLogons */
5035
Globals.bDomainLogons = False;
5036
Globals.bBrowseList = True;
5037
Globals.bWINSsupport = False;
5038
Globals.bWINSproxy = False;
5040
TALLOC_FREE(Globals.szInitLogonDelayedHosts);
5041
Globals.InitLogonDelay = 100; /* 100 ms default delay */
5043
Globals.bDNSproxy = True;
5045
/* this just means to use them if they exist */
5046
Globals.bKernelOplocks = True;
5048
Globals.bAllowTrustedDomains = True;
5049
string_set(&Globals.szIdmapBackend, "tdb");
5051
string_set(&Globals.szTemplateShell, "/bin/false");
5052
string_set(&Globals.szTemplateHomedir, "/home/%D/%U");
5053
string_set(&Globals.szWinbindSeparator, "\\");
5055
string_set(&Globals.szCupsServer, "");
5056
string_set(&Globals.szIPrintServer, "");
5058
string_set(&Globals.ctdbdSocket, "");
5059
Globals.szClusterAddresses = NULL;
5060
Globals.clustering = False;
5062
Globals.winbind_cache_time = 300; /* 5 minutes */
5063
Globals.winbind_reconnect_delay = 30; /* 30 seconds */
5064
Globals.bWinbindEnumUsers = False;
5065
Globals.bWinbindEnumGroups = False;
5066
Globals.bWinbindUseDefaultDomain = False;
5067
Globals.bWinbindTrustedDomainsOnly = False;
5068
Globals.bWinbindNestedGroups = True;
5069
Globals.winbind_expand_groups = 1;
5070
Globals.szWinbindNssInfo = str_list_make_v3(talloc_autofree_context(), "template", NULL);
5071
Globals.bWinbindRefreshTickets = False;
5072
Globals.bWinbindOfflineLogon = False;
5074
Globals.iIdmapCacheTime = 86400 * 7; /* a week by default */
5075
Globals.iIdmapNegativeCacheTime = 120; /* 2 minutes by default */
5077
Globals.bPassdbExpandExplicit = False;
5079
Globals.name_cache_timeout = 660; /* In seconds */
5081
Globals.bUseSpnego = True;
5082
Globals.bClientUseSpnego = True;
5084
Globals.client_signing = Auto;
5085
Globals.server_signing = False;
5087
Globals.bDeferSharingViolations = True;
5088
string_set(&Globals.smb_ports, SMB_PORTS);
5090
Globals.bEnablePrivileges = True;
5091
Globals.bHostMSDfs = True;
5092
Globals.bASUSupport = False;
5094
/* User defined shares. */
5095
if (asprintf(&s, "%s/usershares", get_dyn_STATEDIR()) < 0) {
5096
smb_panic("init_globals: ENOMEM");
5098
string_set(&Globals.szUsersharePath, s);
5100
string_set(&Globals.szUsershareTemplateShare, "");
5101
Globals.iUsershareMaxShares = 100;
5102
/* By default disallow sharing of directories not owned by the sharer. */
5103
Globals.bUsershareOwnerOnly = True;
5104
/* By default disallow guest access to usershares. */
5105
Globals.bUsershareAllowGuests = False;
5107
Globals.iKeepalive = DEFAULT_KEEPALIVE;
5109
/* By default no shares out of the registry */
5110
Globals.bRegistryShares = False;
5112
Globals.iminreceivefile = 0;
5114
Globals.bMapUntrustedToDomain = false;
5117
/*******************************************************************
5118
Convenience routine to grab string parameters into temporary memory
5119
and run standard_sub_basic on them. The buffers can be written to by
5120
callers without affecting the source string.
5121
********************************************************************/
5123
static char *lp_string(const char *s)
5126
TALLOC_CTX *ctx = talloc_tos();
5128
/* The follow debug is useful for tracking down memory problems
5129
especially if you have an inner loop that is calling a lp_*()
5130
function that returns a string. Perhaps this debug should be
5131
present all the time? */
5134
DEBUG(10, ("lp_string(%s)\n", s));
5137
ret = talloc_sub_basic(ctx,
5138
get_current_username(),
5139
current_user_info.domain,
5141
if (trim_char(ret, '\"', '\"')) {
5142
if (strchr(ret,'\"') != NULL) {
5144
ret = talloc_sub_basic(ctx,
5145
get_current_username(),
5146
current_user_info.domain,
5154
In this section all the functions that are used to access the
5155
parameters from the rest of the program are defined
5158
#define FN_GLOBAL_STRING(fn_name,ptr) \
5159
char *fn_name(void) {return(lp_string(*(char **)(ptr) ? *(char **)(ptr) : ""));}
5160
#define FN_GLOBAL_CONST_STRING(fn_name,ptr) \
5161
const char *fn_name(void) {return(*(const char **)(ptr) ? *(const char **)(ptr) : "");}
5162
#define FN_GLOBAL_LIST(fn_name,ptr) \
5163
const char **fn_name(void) {return(*(const char ***)(ptr));}
5164
#define FN_GLOBAL_BOOL(fn_name,ptr) \
5165
bool fn_name(void) {return(*(bool *)(ptr));}
5166
#define FN_GLOBAL_CHAR(fn_name,ptr) \
5167
char fn_name(void) {return(*(char *)(ptr));}
5168
#define FN_GLOBAL_INTEGER(fn_name,ptr) \
5169
int fn_name(void) {return(*(int *)(ptr));}
5171
#define FN_LOCAL_STRING(fn_name,val) \
5172
char *fn_name(int i) {return(lp_string((LP_SNUM_OK(i) && ServicePtrs[(i)]->val) ? ServicePtrs[(i)]->val : sDefault.val));}
5173
#define FN_LOCAL_CONST_STRING(fn_name,val) \
5174
const char *fn_name(int i) {return (const char *)((LP_SNUM_OK(i) && ServicePtrs[(i)]->val) ? ServicePtrs[(i)]->val : sDefault.val);}
5175
#define FN_LOCAL_LIST(fn_name,val) \
5176
const char **fn_name(int i) {return(const char **)(LP_SNUM_OK(i)? ServicePtrs[(i)]->val : sDefault.val);}
5177
#define FN_LOCAL_BOOL(fn_name,val) \
5178
bool fn_name(int i) {return(bool)(LP_SNUM_OK(i)? ServicePtrs[(i)]->val : sDefault.val);}
5179
#define FN_LOCAL_INTEGER(fn_name,val) \
5180
int fn_name(int i) {return(LP_SNUM_OK(i)? ServicePtrs[(i)]->val : sDefault.val);}
5182
#define FN_LOCAL_PARM_BOOL(fn_name,val) \
5183
bool fn_name(const struct share_params *p) {return(bool)(LP_SNUM_OK(p->service)? ServicePtrs[(p->service)]->val : sDefault.val);}
5184
#define FN_LOCAL_PARM_INTEGER(fn_name,val) \
5185
int fn_name(const struct share_params *p) {return(LP_SNUM_OK(p->service)? ServicePtrs[(p->service)]->val : sDefault.val);}
5186
#define FN_LOCAL_PARM_STRING(fn_name,val) \
5187
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));}
5188
#define FN_LOCAL_CHAR(fn_name,val) \
5189
char fn_name(const struct share_params *p) {return(LP_SNUM_OK(p->service)? ServicePtrs[(p->service)]->val : sDefault.val);}
5191
FN_GLOBAL_STRING(lp_smb_ports, &Globals.smb_ports)
5192
FN_GLOBAL_STRING(lp_dos_charset, &Globals.dos_charset)
5193
FN_GLOBAL_STRING(lp_unix_charset, &Globals.unix_charset)
5194
FN_GLOBAL_STRING(lp_display_charset, &Globals.display_charset)
5195
FN_GLOBAL_STRING(lp_logfile, &Globals.szLogFile)
5196
FN_GLOBAL_STRING(lp_configfile, &Globals.szConfigFile)
5197
FN_GLOBAL_STRING(lp_smb_passwd_file, &Globals.szSMBPasswdFile)
5198
FN_GLOBAL_STRING(lp_private_dir, &Globals.szPrivateDir)
5199
FN_GLOBAL_STRING(lp_serverstring, &Globals.szServerString)
5200
FN_GLOBAL_INTEGER(lp_printcap_cache_time, &Globals.PrintcapCacheTime)
5201
FN_GLOBAL_STRING(lp_addport_cmd, &Globals.szAddPortCommand)
5202
FN_GLOBAL_STRING(lp_enumports_cmd, &Globals.szEnumPortsCommand)
5203
FN_GLOBAL_STRING(lp_addprinter_cmd, &Globals.szAddPrinterCommand)
5204
FN_GLOBAL_STRING(lp_deleteprinter_cmd, &Globals.szDeletePrinterCommand)
5205
FN_GLOBAL_STRING(lp_os2_driver_map, &Globals.szOs2DriverMap)
5206
FN_GLOBAL_STRING(lp_lockdir, &Globals.szLockDir)
5207
/* If lp_statedir() and lp_cachedir() are explicitely set during the
5208
* build process or in smb.conf, we use that value. Otherwise they
5209
* default to the value of lp_lockdir(). */
5210
char *lp_statedir(void) {
5211
if ((strcmp(get_dyn_STATEDIR(), get_dyn_LOCKDIR()) != 0) ||
5212
(strcmp(get_dyn_STATEDIR(), Globals.szStateDir) != 0))
5213
return(lp_string(*(char **)(&Globals.szStateDir) ?
5214
*(char **)(&Globals.szStateDir) : ""));
5216
return(lp_string(*(char **)(&Globals.szLockDir) ?
5217
*(char **)(&Globals.szLockDir) : ""));
5219
char *lp_cachedir(void) {
5220
if ((strcmp(get_dyn_CACHEDIR(), get_dyn_LOCKDIR()) != 0) ||
5221
(strcmp(get_dyn_CACHEDIR(), Globals.szCacheDir) != 0))
5222
return(lp_string(*(char **)(&Globals.szCacheDir) ?
5223
*(char **)(&Globals.szCacheDir) : ""));
5225
return(lp_string(*(char **)(&Globals.szLockDir) ?
5226
*(char **)(&Globals.szLockDir) : ""));
5228
FN_GLOBAL_STRING(lp_piddir, &Globals.szPidDir)
5229
FN_GLOBAL_STRING(lp_mangling_method, &Globals.szManglingMethod)
5230
FN_GLOBAL_INTEGER(lp_mangle_prefix, &Globals.mangle_prefix)
5231
FN_GLOBAL_STRING(lp_utmpdir, &Globals.szUtmpDir)
5232
FN_GLOBAL_STRING(lp_wtmpdir, &Globals.szWtmpDir)
5233
FN_GLOBAL_BOOL(lp_utmp, &Globals.bUtmp)
5234
FN_GLOBAL_STRING(lp_rootdir, &Globals.szRootdir)
5235
FN_GLOBAL_STRING(lp_perfcount_module, &Globals.szSMBPerfcountModule)
5236
FN_GLOBAL_STRING(lp_defaultservice, &Globals.szDefaultService)
5237
FN_GLOBAL_STRING(lp_msg_command, &Globals.szMsgCommand)
5238
FN_GLOBAL_STRING(lp_get_quota_command, &Globals.szGetQuota)
5239
FN_GLOBAL_STRING(lp_set_quota_command, &Globals.szSetQuota)
5240
FN_GLOBAL_STRING(lp_auto_services, &Globals.szAutoServices)
5241
FN_GLOBAL_STRING(lp_passwd_program, &Globals.szPasswdProgram)
5242
FN_GLOBAL_STRING(lp_passwd_chat, &Globals.szPasswdChat)
5243
FN_GLOBAL_STRING(lp_passwordserver, &Globals.szPasswordServer)
5244
FN_GLOBAL_STRING(lp_name_resolve_order, &Globals.szNameResolveOrder)
5245
FN_GLOBAL_STRING(lp_realm, &Globals.szRealm)
5246
FN_GLOBAL_CONST_STRING(lp_afs_username_map, &Globals.szAfsUsernameMap)
5247
FN_GLOBAL_INTEGER(lp_afs_token_lifetime, &Globals.iAfsTokenLifetime)
5248
FN_GLOBAL_STRING(lp_log_nt_token_command, &Globals.szLogNtTokenCommand)
5249
FN_GLOBAL_STRING(lp_username_map, &Globals.szUsernameMap)
5250
FN_GLOBAL_CONST_STRING(lp_logon_script, &Globals.szLogonScript)
5251
FN_GLOBAL_CONST_STRING(lp_logon_path, &Globals.szLogonPath)
5252
FN_GLOBAL_CONST_STRING(lp_logon_drive, &Globals.szLogonDrive)
5253
FN_GLOBAL_CONST_STRING(lp_logon_home, &Globals.szLogonHome)
5254
FN_GLOBAL_STRING(lp_remote_announce, &Globals.szRemoteAnnounce)
5255
FN_GLOBAL_STRING(lp_remote_browse_sync, &Globals.szRemoteBrowseSync)
5256
FN_GLOBAL_LIST(lp_wins_server_list, &Globals.szWINSservers)
5257
FN_GLOBAL_LIST(lp_interfaces, &Globals.szInterfaces)
5258
FN_GLOBAL_STRING(lp_nis_home_map_name, &Globals.szNISHomeMapName)
5259
static FN_GLOBAL_STRING(lp_announce_version, &Globals.szAnnounceVersion)
5260
FN_GLOBAL_LIST(lp_netbios_aliases, &Globals.szNetbiosAliases)
5261
/* FN_GLOBAL_STRING(lp_passdb_backend, &Globals.szPassdbBackend)
5262
* lp_passdb_backend() should be replace by the this macro again after
5265
const char *lp_passdb_backend(void)
5267
char *delim, *quote;
5269
delim = strchr( Globals.szPassdbBackend, ' ');
5270
/* no space at all */
5271
if (delim == NULL) {
5275
quote = strchr(Globals.szPassdbBackend, '"');
5276
/* no quote char or non in the first part */
5277
if (quote == NULL || quote > delim) {
5282
quote = strchr(quote+1, '"');
5283
if (quote == NULL) {
5284
DEBUG(0, ("WARNING: Your 'passdb backend' configuration is invalid due to a missing second \" char.\n"));
5286
} else if (*(quote+1) == '\0') {
5287
/* space, fitting quote char, and one backend only */
5290
/* terminate string after the fitting quote char */
5295
DEBUG(0, ("WARNING: Your 'passdb backend' configuration includes multiple backends. This\n"
5296
"is deprecated since Samba 3.0.23. Please check WHATSNEW.txt or the section 'Passdb\n"
5297
"Changes' from the ChangeNotes as part of the Samba HOWTO collection. Only the first\n"
5298
"backend (%s) is used. The rest is ignored.\n", Globals.szPassdbBackend));
5301
return Globals.szPassdbBackend;
5303
FN_GLOBAL_LIST(lp_preload_modules, &Globals.szPreloadModules)
5304
FN_GLOBAL_STRING(lp_panic_action, &Globals.szPanicAction)
5305
FN_GLOBAL_STRING(lp_adduser_script, &Globals.szAddUserScript)
5306
FN_GLOBAL_STRING(lp_renameuser_script, &Globals.szRenameUserScript)
5307
FN_GLOBAL_STRING(lp_deluser_script, &Globals.szDelUserScript)
5309
FN_GLOBAL_CONST_STRING(lp_guestaccount, &Globals.szGuestaccount)
5310
FN_GLOBAL_STRING(lp_addgroup_script, &Globals.szAddGroupScript)
5311
FN_GLOBAL_STRING(lp_delgroup_script, &Globals.szDelGroupScript)
5312
FN_GLOBAL_STRING(lp_addusertogroup_script, &Globals.szAddUserToGroupScript)
5313
FN_GLOBAL_STRING(lp_deluserfromgroup_script, &Globals.szDelUserFromGroupScript)
5314
FN_GLOBAL_STRING(lp_setprimarygroup_script, &Globals.szSetPrimaryGroupScript)
5316
FN_GLOBAL_STRING(lp_addmachine_script, &Globals.szAddMachineScript)
5318
FN_GLOBAL_STRING(lp_shutdown_script, &Globals.szShutdownScript)
5319
FN_GLOBAL_STRING(lp_abort_shutdown_script, &Globals.szAbortShutdownScript)
5320
FN_GLOBAL_STRING(lp_username_map_script, &Globals.szUsernameMapScript)
5322
FN_GLOBAL_STRING(lp_check_password_script, &Globals.szCheckPasswordScript)
5324
FN_GLOBAL_STRING(lp_wins_hook, &Globals.szWINSHook)
5325
FN_GLOBAL_CONST_STRING(lp_template_homedir, &Globals.szTemplateHomedir)
5326
FN_GLOBAL_CONST_STRING(lp_template_shell, &Globals.szTemplateShell)
5327
FN_GLOBAL_CONST_STRING(lp_winbind_separator, &Globals.szWinbindSeparator)
5328
FN_GLOBAL_INTEGER(lp_acl_compatibility, &Globals.iAclCompat)
5329
FN_GLOBAL_BOOL(lp_winbind_enum_users, &Globals.bWinbindEnumUsers)
5330
FN_GLOBAL_BOOL(lp_winbind_enum_groups, &Globals.bWinbindEnumGroups)
5331
FN_GLOBAL_BOOL(lp_winbind_use_default_domain, &Globals.bWinbindUseDefaultDomain)
5332
FN_GLOBAL_BOOL(lp_winbind_trusted_domains_only, &Globals.bWinbindTrustedDomainsOnly)
5333
FN_GLOBAL_BOOL(lp_winbind_nested_groups, &Globals.bWinbindNestedGroups)
5334
FN_GLOBAL_INTEGER(lp_winbind_expand_groups, &Globals.winbind_expand_groups)
5335
FN_GLOBAL_BOOL(lp_winbind_refresh_tickets, &Globals.bWinbindRefreshTickets)
5336
FN_GLOBAL_BOOL(lp_winbind_offline_logon, &Globals.bWinbindOfflineLogon)
5337
FN_GLOBAL_BOOL(lp_winbind_normalize_names, &Globals.bWinbindNormalizeNames)
5338
FN_GLOBAL_BOOL(lp_winbind_rpc_only, &Globals.bWinbindRpcOnly)
5340
FN_GLOBAL_CONST_STRING(lp_idmap_backend, &Globals.szIdmapBackend)
5341
FN_GLOBAL_STRING(lp_idmap_alloc_backend, &Globals.szIdmapAllocBackend)
5342
FN_GLOBAL_INTEGER(lp_idmap_cache_time, &Globals.iIdmapCacheTime)
5343
FN_GLOBAL_INTEGER(lp_idmap_negative_cache_time, &Globals.iIdmapNegativeCacheTime)
5344
FN_GLOBAL_INTEGER(lp_keepalive, &Globals.iKeepalive)
5345
FN_GLOBAL_BOOL(lp_passdb_expand_explicit, &Globals.bPassdbExpandExplicit)
5347
FN_GLOBAL_STRING(lp_ldap_suffix, &Globals.szLdapSuffix)
5348
FN_GLOBAL_STRING(lp_ldap_admin_dn, &Globals.szLdapAdminDn)
5349
FN_GLOBAL_INTEGER(lp_ldap_ssl, &Globals.ldap_ssl)
5350
FN_GLOBAL_BOOL(lp_ldap_ssl_ads, &Globals.ldap_ssl_ads)
5351
FN_GLOBAL_INTEGER(lp_ldap_passwd_sync, &Globals.ldap_passwd_sync)
5352
FN_GLOBAL_BOOL(lp_ldap_delete_dn, &Globals.ldap_delete_dn)
5353
FN_GLOBAL_INTEGER(lp_ldap_replication_sleep, &Globals.ldap_replication_sleep)
5354
FN_GLOBAL_INTEGER(lp_ldap_timeout, &Globals.ldap_timeout)
5355
FN_GLOBAL_INTEGER(lp_ldap_connection_timeout, &Globals.ldap_connection_timeout)
5356
FN_GLOBAL_INTEGER(lp_ldap_page_size, &Globals.ldap_page_size)
5357
FN_GLOBAL_INTEGER(lp_ldap_debug_level, &Globals.ldap_debug_level)
5358
FN_GLOBAL_INTEGER(lp_ldap_debug_threshold, &Globals.ldap_debug_threshold)
5359
FN_GLOBAL_STRING(lp_add_share_cmd, &Globals.szAddShareCommand)
5360
FN_GLOBAL_STRING(lp_change_share_cmd, &Globals.szChangeShareCommand)
5361
FN_GLOBAL_STRING(lp_delete_share_cmd, &Globals.szDeleteShareCommand)
5362
FN_GLOBAL_STRING(lp_usershare_path, &Globals.szUsersharePath)
5363
FN_GLOBAL_LIST(lp_usershare_prefix_allow_list, &Globals.szUsersharePrefixAllowList)
5364
FN_GLOBAL_LIST(lp_usershare_prefix_deny_list, &Globals.szUsersharePrefixDenyList)
5366
FN_GLOBAL_LIST(lp_eventlog_list, &Globals.szEventLogs)
5368
FN_GLOBAL_BOOL(lp_registry_shares, &Globals.bRegistryShares)
5369
FN_GLOBAL_BOOL(lp_usershare_allow_guests, &Globals.bUsershareAllowGuests)
5370
FN_GLOBAL_BOOL(lp_usershare_owner_only, &Globals.bUsershareOwnerOnly)
5371
FN_GLOBAL_BOOL(lp_disable_netbios, &Globals.bDisableNetbios)
5372
FN_GLOBAL_BOOL(lp_reset_on_zero_vc, &Globals.bResetOnZeroVC)
5373
FN_GLOBAL_BOOL(lp_ms_add_printer_wizard, &Globals.bMsAddPrinterWizard)
5374
FN_GLOBAL_BOOL(lp_dns_proxy, &Globals.bDNSproxy)
5375
FN_GLOBAL_BOOL(lp_wins_support, &Globals.bWINSsupport)
5376
FN_GLOBAL_BOOL(lp_we_are_a_wins_server, &Globals.bWINSsupport)
5377
FN_GLOBAL_BOOL(lp_wins_proxy, &Globals.bWINSproxy)
5378
FN_GLOBAL_BOOL(lp_local_master, &Globals.bLocalMaster)
5379
FN_GLOBAL_BOOL(lp_domain_logons, &Globals.bDomainLogons)
5380
FN_GLOBAL_LIST(lp_init_logon_delayed_hosts, &Globals.szInitLogonDelayedHosts)
5381
FN_GLOBAL_INTEGER(lp_init_logon_delay, &Globals.InitLogonDelay)
5382
FN_GLOBAL_BOOL(lp_load_printers, &Globals.bLoadPrinters)
5383
FN_GLOBAL_BOOL(lp_readraw, &Globals.bReadRaw)
5384
FN_GLOBAL_BOOL(lp_large_readwrite, &Globals.bLargeReadwrite)
5385
FN_GLOBAL_BOOL(lp_writeraw, &Globals.bWriteRaw)
5386
FN_GLOBAL_BOOL(lp_null_passwords, &Globals.bNullPasswords)
5387
FN_GLOBAL_BOOL(lp_obey_pam_restrictions, &Globals.bObeyPamRestrictions)
5388
FN_GLOBAL_BOOL(lp_encrypted_passwords, &Globals.bEncryptPasswords)
5389
FN_GLOBAL_BOOL(lp_update_encrypted, &Globals.bUpdateEncrypt)
5390
FN_GLOBAL_INTEGER(lp_client_schannel, &Globals.clientSchannel)
5391
FN_GLOBAL_INTEGER(lp_server_schannel, &Globals.serverSchannel)
5392
FN_GLOBAL_BOOL(lp_syslog_only, &Globals.bSyslogOnly)
5393
FN_GLOBAL_BOOL(lp_timestamp_logs, &Globals.bTimestampLogs)
5394
FN_GLOBAL_BOOL(lp_debug_prefix_timestamp, &Globals.bDebugPrefixTimestamp)
5395
FN_GLOBAL_BOOL(lp_debug_hires_timestamp, &Globals.bDebugHiresTimestamp)
5396
FN_GLOBAL_BOOL(lp_debug_pid, &Globals.bDebugPid)
5397
FN_GLOBAL_BOOL(lp_debug_uid, &Globals.bDebugUid)
5398
FN_GLOBAL_BOOL(lp_debug_class, &Globals.bDebugClass)
5399
FN_GLOBAL_BOOL(lp_enable_core_files, &Globals.bEnableCoreFiles)
5400
FN_GLOBAL_BOOL(lp_browse_list, &Globals.bBrowseList)
5401
FN_GLOBAL_BOOL(lp_nis_home_map, &Globals.bNISHomeMap)
5402
static FN_GLOBAL_BOOL(lp_time_server, &Globals.bTimeServer)
5403
FN_GLOBAL_BOOL(lp_bind_interfaces_only, &Globals.bBindInterfacesOnly)
5404
FN_GLOBAL_BOOL(lp_pam_password_change, &Globals.bPamPasswordChange)
5405
FN_GLOBAL_BOOL(lp_unix_password_sync, &Globals.bUnixPasswdSync)
5406
FN_GLOBAL_BOOL(lp_passwd_chat_debug, &Globals.bPasswdChatDebug)
5407
FN_GLOBAL_INTEGER(lp_passwd_chat_timeout, &Globals.iPasswdChatTimeout)
5408
FN_GLOBAL_BOOL(lp_nt_pipe_support, &Globals.bNTPipeSupport)
5409
FN_GLOBAL_BOOL(lp_nt_status_support, &Globals.bNTStatusSupport)
5410
FN_GLOBAL_BOOL(lp_stat_cache, &Globals.bStatCache)
5411
FN_GLOBAL_INTEGER(lp_max_stat_cache_size, &Globals.iMaxStatCacheSize)
5412
FN_GLOBAL_BOOL(lp_allow_trusted_domains, &Globals.bAllowTrustedDomains)
5413
FN_GLOBAL_BOOL(lp_map_untrusted_to_domain, &Globals.bMapUntrustedToDomain)
5414
FN_GLOBAL_INTEGER(lp_restrict_anonymous, &Globals.restrict_anonymous)
5415
FN_GLOBAL_BOOL(lp_lanman_auth, &Globals.bLanmanAuth)
5416
FN_GLOBAL_BOOL(lp_ntlm_auth, &Globals.bNTLMAuth)
5417
FN_GLOBAL_BOOL(lp_client_plaintext_auth, &Globals.bClientPlaintextAuth)
5418
FN_GLOBAL_BOOL(lp_client_lanman_auth, &Globals.bClientLanManAuth)
5419
FN_GLOBAL_BOOL(lp_client_ntlmv2_auth, &Globals.bClientNTLMv2Auth)
5420
FN_GLOBAL_BOOL(lp_host_msdfs, &Globals.bHostMSDfs)
5421
FN_GLOBAL_BOOL(lp_kernel_oplocks, &Globals.bKernelOplocks)
5422
FN_GLOBAL_BOOL(lp_enhanced_browsing, &Globals.enhanced_browsing)
5423
FN_GLOBAL_BOOL(lp_use_mmap, &Globals.bUseMmap)
5424
FN_GLOBAL_BOOL(lp_unix_extensions, &Globals.bUnixExtensions)
5425
FN_GLOBAL_BOOL(lp_use_spnego, &Globals.bUseSpnego)
5426
FN_GLOBAL_BOOL(lp_client_use_spnego, &Globals.bClientUseSpnego)
5427
FN_GLOBAL_BOOL(lp_hostname_lookups, &Globals.bHostnameLookups)
5428
FN_LOCAL_PARM_BOOL(lp_change_notify, bChangeNotify)
5429
FN_LOCAL_PARM_BOOL(lp_kernel_change_notify, bKernelChangeNotify)
5430
FN_GLOBAL_STRING(lp_dedicated_keytab_file, &Globals.szDedicatedKeytabFile)
5431
FN_GLOBAL_INTEGER(lp_kerberos_method, &Globals.iKerberosMethod)
5432
FN_GLOBAL_BOOL(lp_defer_sharing_violations, &Globals.bDeferSharingViolations)
5433
FN_GLOBAL_BOOL(lp_enable_privileges, &Globals.bEnablePrivileges)
5434
FN_GLOBAL_BOOL(lp_enable_asu_support, &Globals.bASUSupport)
5435
FN_GLOBAL_INTEGER(lp_os_level, &Globals.os_level)
5436
FN_GLOBAL_INTEGER(lp_max_ttl, &Globals.max_ttl)
5437
FN_GLOBAL_INTEGER(lp_max_wins_ttl, &Globals.max_wins_ttl)
5438
FN_GLOBAL_INTEGER(lp_min_wins_ttl, &Globals.min_wins_ttl)
5439
FN_GLOBAL_INTEGER(lp_max_log_size, &Globals.max_log_size)
5440
FN_GLOBAL_INTEGER(lp_max_open_files, &Globals.max_open_files)
5441
FN_GLOBAL_INTEGER(lp_open_files_db_hash_size, &Globals.open_files_db_hash_size)
5442
FN_GLOBAL_INTEGER(lp_maxxmit, &Globals.max_xmit)
5443
FN_GLOBAL_INTEGER(lp_maxmux, &Globals.max_mux)
5444
FN_GLOBAL_INTEGER(lp_passwordlevel, &Globals.pwordlevel)
5445
FN_GLOBAL_INTEGER(lp_usernamelevel, &Globals.unamelevel)
5446
FN_GLOBAL_INTEGER(lp_deadtime, &Globals.deadtime)
5447
FN_GLOBAL_BOOL(lp_getwd_cache, &Globals.getwd_cache)
5448
FN_GLOBAL_INTEGER(lp_maxprotocol, &Globals.maxprotocol)
5449
FN_GLOBAL_INTEGER(lp_minprotocol, &Globals.minprotocol)
5450
FN_GLOBAL_INTEGER(lp_security, &Globals.security)
5451
FN_GLOBAL_LIST(lp_auth_methods, &Globals.AuthMethods)
5452
FN_GLOBAL_BOOL(lp_paranoid_server_security, &Globals.paranoid_server_security)
5453
FN_GLOBAL_INTEGER(lp_maxdisksize, &Globals.maxdisksize)
5454
FN_GLOBAL_INTEGER(lp_lpqcachetime, &Globals.lpqcachetime)
5455
FN_GLOBAL_INTEGER(lp_max_smbd_processes, &Globals.iMaxSmbdProcesses)
5456
FN_GLOBAL_BOOL(_lp_disable_spoolss, &Globals.bDisableSpoolss)
5457
FN_GLOBAL_INTEGER(lp_syslog, &Globals.syslog)
5458
static FN_GLOBAL_INTEGER(lp_announce_as, &Globals.announce_as)
5459
FN_GLOBAL_INTEGER(lp_lm_announce, &Globals.lm_announce)
5460
FN_GLOBAL_INTEGER(lp_lm_interval, &Globals.lm_interval)
5461
FN_GLOBAL_INTEGER(lp_machine_password_timeout, &Globals.machine_password_timeout)
5462
FN_GLOBAL_INTEGER(lp_map_to_guest, &Globals.map_to_guest)
5463
FN_GLOBAL_INTEGER(lp_oplock_break_wait_time, &Globals.oplock_break_wait_time)
5464
FN_GLOBAL_INTEGER(lp_lock_spin_time, &Globals.iLockSpinTime)
5465
FN_GLOBAL_INTEGER(lp_usershare_max_shares, &Globals.iUsershareMaxShares)
5466
FN_GLOBAL_CONST_STRING(lp_socket_options, &Globals.szSocketOptions)
5467
FN_GLOBAL_INTEGER(lp_config_backend, &Globals.ConfigBackend)
5469
FN_LOCAL_STRING(lp_preexec, szPreExec)
5470
FN_LOCAL_STRING(lp_postexec, szPostExec)
5471
FN_LOCAL_STRING(lp_rootpreexec, szRootPreExec)
5472
FN_LOCAL_STRING(lp_rootpostexec, szRootPostExec)
5473
FN_LOCAL_STRING(lp_servicename, szService)
5474
FN_LOCAL_CONST_STRING(lp_const_servicename, szService)
5475
FN_LOCAL_STRING(lp_pathname, szPath)
5476
FN_LOCAL_STRING(lp_dontdescend, szDontdescend)
5477
FN_LOCAL_STRING(lp_username, szUsername)
5478
FN_LOCAL_LIST(lp_invalid_users, szInvalidUsers)
5479
FN_LOCAL_LIST(lp_valid_users, szValidUsers)
5480
FN_LOCAL_LIST(lp_admin_users, szAdminUsers)
5481
FN_GLOBAL_LIST(lp_svcctl_list, &Globals.szServicesList)
5482
FN_LOCAL_STRING(lp_cups_options, szCupsOptions)
5483
FN_GLOBAL_STRING(lp_cups_server, &Globals.szCupsServer)
5484
FN_GLOBAL_STRING(lp_iprint_server, &Globals.szIPrintServer)
5485
FN_GLOBAL_INTEGER(lp_cups_connection_timeout, &Globals.cups_connection_timeout)
5486
FN_GLOBAL_CONST_STRING(lp_ctdbd_socket, &Globals.ctdbdSocket)
5487
FN_GLOBAL_LIST(lp_cluster_addresses, &Globals.szClusterAddresses)
5488
FN_GLOBAL_BOOL(lp_clustering, &Globals.clustering)
5489
FN_LOCAL_STRING(lp_printcommand, szPrintcommand)
5490
FN_LOCAL_STRING(lp_lpqcommand, szLpqcommand)
5491
FN_LOCAL_STRING(lp_lprmcommand, szLprmcommand)
5492
FN_LOCAL_STRING(lp_lppausecommand, szLppausecommand)
5493
FN_LOCAL_STRING(lp_lpresumecommand, szLpresumecommand)
5494
FN_LOCAL_STRING(lp_queuepausecommand, szQueuepausecommand)
5495
FN_LOCAL_STRING(lp_queueresumecommand, szQueueresumecommand)
5496
static FN_LOCAL_STRING(_lp_printername, szPrintername)
5497
FN_LOCAL_CONST_STRING(lp_printjob_username, szPrintjobUsername)
5498
FN_LOCAL_LIST(lp_hostsallow, szHostsallow)
5499
FN_LOCAL_LIST(lp_hostsdeny, szHostsdeny)
5500
FN_LOCAL_STRING(lp_magicscript, szMagicScript)
5501
FN_LOCAL_STRING(lp_magicoutput, szMagicOutput)
5502
FN_LOCAL_STRING(lp_comment, comment)
5503
FN_LOCAL_STRING(lp_force_user, force_user)
5504
FN_LOCAL_STRING(lp_force_group, force_group)
5505
FN_LOCAL_LIST(lp_readlist, readlist)
5506
FN_LOCAL_LIST(lp_writelist, writelist)
5507
FN_LOCAL_LIST(lp_printer_admin, printer_admin)
5508
FN_LOCAL_STRING(lp_fstype, fstype)
5509
FN_LOCAL_LIST(lp_vfs_objects, szVfsObjects)
5510
FN_LOCAL_STRING(lp_msdfs_proxy, szMSDfsProxy)
5511
static FN_LOCAL_STRING(lp_volume, volume)
5512
FN_LOCAL_STRING(lp_veto_files, szVetoFiles)
5513
FN_LOCAL_STRING(lp_hide_files, szHideFiles)
5514
FN_LOCAL_STRING(lp_veto_oplocks, szVetoOplockFiles)
5515
FN_LOCAL_BOOL(lp_msdfs_root, bMSDfsRoot)
5516
FN_LOCAL_STRING(lp_aio_write_behind, szAioWriteBehind)
5517
FN_LOCAL_STRING(lp_dfree_command, szDfree)
5518
FN_LOCAL_BOOL(lp_autoloaded, autoloaded)
5519
FN_LOCAL_BOOL(lp_preexec_close, bPreexecClose)
5520
FN_LOCAL_BOOL(lp_rootpreexec_close, bRootpreexecClose)
5521
FN_LOCAL_INTEGER(lp_casesensitive, iCaseSensitive)
5522
FN_LOCAL_BOOL(lp_preservecase, bCasePreserve)
5523
FN_LOCAL_BOOL(lp_shortpreservecase, bShortCasePreserve)
5524
FN_LOCAL_BOOL(lp_hide_dot_files, bHideDotFiles)
5525
FN_LOCAL_BOOL(lp_hide_special_files, bHideSpecialFiles)
5526
FN_LOCAL_BOOL(lp_hideunreadable, bHideUnReadable)
5527
FN_LOCAL_BOOL(lp_hideunwriteable_files, bHideUnWriteableFiles)
5528
FN_LOCAL_BOOL(lp_browseable, bBrowseable)
5529
FN_LOCAL_BOOL(lp_access_based_share_enum, bAccessBasedShareEnum)
5530
FN_LOCAL_BOOL(lp_readonly, bRead_only)
5531
FN_LOCAL_BOOL(lp_no_set_dir, bNo_set_dir)
5532
FN_LOCAL_BOOL(lp_guest_ok, bGuest_ok)
5533
FN_LOCAL_BOOL(lp_guest_only, bGuest_only)
5534
FN_LOCAL_BOOL(lp_administrative_share, bAdministrative_share)
5535
FN_LOCAL_BOOL(lp_print_ok, bPrint_ok)
5536
FN_LOCAL_BOOL(lp_map_hidden, bMap_hidden)
5537
FN_LOCAL_BOOL(lp_map_archive, bMap_archive)
5538
FN_LOCAL_BOOL(lp_store_dos_attributes, bStoreDosAttributes)
5539
FN_LOCAL_BOOL(lp_dmapi_support, bDmapiSupport)
5540
FN_LOCAL_PARM_BOOL(lp_locking, bLocking)
5541
FN_LOCAL_PARM_INTEGER(lp_strict_locking, iStrictLocking)
5542
FN_LOCAL_PARM_BOOL(lp_posix_locking, bPosixLocking)
5543
FN_LOCAL_BOOL(lp_share_modes, bShareModes)
5544
FN_LOCAL_BOOL(lp_oplocks, bOpLocks)
5545
FN_LOCAL_BOOL(lp_level2_oplocks, bLevel2OpLocks)
5546
FN_LOCAL_BOOL(lp_onlyuser, bOnlyUser)
5547
FN_LOCAL_PARM_BOOL(lp_manglednames, bMangledNames)
5548
FN_LOCAL_BOOL(lp_widelinks, bWidelinks)
5549
FN_LOCAL_BOOL(lp_symlinks, bSymlinks)
5550
FN_LOCAL_BOOL(lp_syncalways, bSyncAlways)
5551
FN_LOCAL_BOOL(lp_strict_allocate, bStrictAllocate)
5552
FN_LOCAL_BOOL(lp_strict_sync, bStrictSync)
5553
FN_LOCAL_BOOL(lp_map_system, bMap_system)
5554
FN_LOCAL_BOOL(lp_delete_readonly, bDeleteReadonly)
5555
FN_LOCAL_BOOL(lp_fake_oplocks, bFakeOplocks)
5556
FN_LOCAL_BOOL(lp_recursive_veto_delete, bDeleteVetoFiles)
5557
FN_LOCAL_BOOL(lp_dos_filemode, bDosFilemode)
5558
FN_LOCAL_BOOL(lp_dos_filetimes, bDosFiletimes)
5559
FN_LOCAL_BOOL(lp_dos_filetime_resolution, bDosFiletimeResolution)
5560
FN_LOCAL_BOOL(lp_fake_dir_create_times, bFakeDirCreateTimes)
5561
FN_LOCAL_BOOL(lp_blocking_locks, bBlockingLocks)
5562
FN_LOCAL_BOOL(lp_inherit_perms, bInheritPerms)
5563
FN_LOCAL_BOOL(lp_inherit_acls, bInheritACLS)
5564
FN_LOCAL_BOOL(lp_inherit_owner, bInheritOwner)
5565
FN_LOCAL_BOOL(lp_use_client_driver, bUseClientDriver)
5566
FN_LOCAL_BOOL(lp_default_devmode, bDefaultDevmode)
5567
FN_LOCAL_BOOL(lp_force_printername, bForcePrintername)
5568
FN_LOCAL_BOOL(lp_nt_acl_support, bNTAclSupport)
5569
FN_LOCAL_BOOL(lp_force_unknown_acl_user, bForceUnknownAclUser)
5570
FN_LOCAL_BOOL(lp_ea_support, bEASupport)
5571
FN_LOCAL_BOOL(_lp_use_sendfile, bUseSendfile)
5572
FN_LOCAL_BOOL(lp_profile_acls, bProfileAcls)
5573
FN_LOCAL_BOOL(lp_map_acl_inherit, bMap_acl_inherit)
5574
FN_LOCAL_BOOL(lp_afs_share, bAfs_Share)
5575
FN_LOCAL_BOOL(lp_acl_check_permissions, bAclCheckPermissions)
5576
FN_LOCAL_BOOL(lp_acl_group_control, bAclGroupControl)
5577
FN_LOCAL_BOOL(lp_acl_map_full_control, bAclMapFullControl)
5578
FN_LOCAL_INTEGER(lp_create_mask, iCreate_mask)
5579
FN_LOCAL_INTEGER(lp_force_create_mode, iCreate_force_mode)
5580
FN_LOCAL_INTEGER(lp_security_mask, iSecurity_mask)
5581
FN_LOCAL_INTEGER(lp_force_security_mode, iSecurity_force_mode)
5582
FN_LOCAL_INTEGER(lp_dir_mask, iDir_mask)
5583
FN_LOCAL_INTEGER(lp_force_dir_mode, iDir_force_mode)
5584
FN_LOCAL_INTEGER(lp_dir_security_mask, iDir_Security_mask)
5585
FN_LOCAL_INTEGER(lp_force_dir_security_mode, iDir_Security_force_mode)
5586
FN_LOCAL_INTEGER(lp_max_connections, iMaxConnections)
5587
FN_LOCAL_INTEGER(lp_defaultcase, iDefaultCase)
5588
FN_LOCAL_INTEGER(lp_minprintspace, iMinPrintSpace)
5589
FN_LOCAL_INTEGER(lp_printing, iPrinting)
5590
FN_LOCAL_INTEGER(lp_max_reported_jobs, iMaxReportedPrintJobs)
5591
FN_LOCAL_INTEGER(lp_oplock_contention_limit, iOplockContentionLimit)
5592
FN_LOCAL_INTEGER(lp_csc_policy, iCSCPolicy)
5593
FN_LOCAL_INTEGER(lp_write_cache_size, iWriteCacheSize)
5594
FN_LOCAL_INTEGER(lp_block_size, iBlock_size)
5595
FN_LOCAL_INTEGER(lp_dfree_cache_time, iDfreeCacheTime)
5596
FN_LOCAL_INTEGER(lp_allocation_roundup_size, iallocation_roundup_size)
5597
FN_LOCAL_INTEGER(lp_aio_read_size, iAioReadSize)
5598
FN_LOCAL_INTEGER(lp_aio_write_size, iAioWriteSize)
5599
FN_LOCAL_INTEGER(lp_map_readonly, iMap_readonly)
5600
FN_LOCAL_INTEGER(lp_directory_name_cache_size, iDirectoryNameCacheSize)
5601
FN_LOCAL_INTEGER(lp_smb_encrypt, ismb_encrypt)
5602
FN_LOCAL_CHAR(lp_magicchar, magic_char)
5603
FN_GLOBAL_INTEGER(lp_winbind_cache_time, &Globals.winbind_cache_time)
5604
FN_GLOBAL_INTEGER(lp_winbind_reconnect_delay, &Globals.winbind_reconnect_delay)
5605
FN_GLOBAL_LIST(lp_winbind_nss_info, &Globals.szWinbindNssInfo)
5606
FN_GLOBAL_INTEGER(lp_algorithmic_rid_base, &Globals.AlgorithmicRidBase)
5607
FN_GLOBAL_INTEGER(lp_name_cache_timeout, &Globals.name_cache_timeout)
5608
FN_GLOBAL_INTEGER(lp_client_signing, &Globals.client_signing)
5609
FN_GLOBAL_INTEGER(lp_server_signing, &Globals.server_signing)
5610
FN_GLOBAL_INTEGER(lp_client_ldap_sasl_wrapping, &Globals.client_ldap_sasl_wrapping)
5612
/* local prototypes */
5614
static int map_parameter(const char *pszParmName);
5615
static int map_parameter_canonical(const char *pszParmName, bool *inverse);
5616
static const char *get_boolean(bool bool_value);
5617
static int getservicebyname(const char *pszServiceName,
5618
struct service *pserviceDest);
5619
static void copy_service(struct service *pserviceDest,
5620
struct service *pserviceSource,
5621
struct bitmap *pcopymapDest);
5622
static bool do_parameter(const char *pszParmName, const char *pszParmValue,
5624
static bool do_section(const char *pszSectionName, void *userdata);
5625
static void init_copymap(struct service *pservice);
5626
static bool hash_a_service(const char *name, int number);
5627
static void free_service_byindex(int iService);
5628
static void free_param_opts(struct param_opt_struct **popts);
5629
static char * canonicalize_servicename(const char *name);
5630
static void show_parameter(int parmIndex);
5631
static bool is_synonym_of(int parm1, int parm2, bool *inverse);
5634
* This is a helper function for parametrical options support. It returns a
5635
* pointer to parametrical option value if it exists or NULL otherwise. Actual
5636
* parametrical functions are quite simple
5638
static struct param_opt_struct *get_parametrics(int snum, const char *type,
5641
bool global_section = False;
5643
struct param_opt_struct *data;
5645
if (snum >= iNumServices) return NULL;
5648
data = Globals.param_opt;
5649
global_section = True;
5651
data = ServicePtrs[snum]->param_opt;
5654
if (asprintf(¶m_key, "%s:%s", type, option) == -1) {
5655
DEBUG(0,("asprintf failed!\n"));
5660
if (strwicmp(data->key, param_key) == 0) {
5661
string_free(¶m_key);
5667
if (!global_section) {
5668
/* Try to fetch the same option but from globals */
5669
/* but only if we are not already working with Globals */
5670
data = Globals.param_opt;
5672
if (strwicmp(data->key, param_key) == 0) {
5673
string_free(¶m_key);
5680
string_free(¶m_key);
5686
#define MISSING_PARAMETER(name) \
5687
DEBUG(0, ("%s(): value is NULL or empty!\n", #name))
5689
/*******************************************************************
5690
convenience routine to return int parameters.
5691
********************************************************************/
5692
static int lp_int(const char *s)
5696
MISSING_PARAMETER(lp_int);
5700
return (int)strtol(s, NULL, 0);
5703
/*******************************************************************
5704
convenience routine to return unsigned long parameters.
5705
********************************************************************/
5706
static unsigned long lp_ulong(const char *s)
5710
MISSING_PARAMETER(lp_ulong);
5714
return strtoul(s, NULL, 0);
5717
/*******************************************************************
5718
convenience routine to return boolean parameters.
5719
********************************************************************/
5720
static bool lp_bool(const char *s)
5725
MISSING_PARAMETER(lp_bool);
5729
if (!set_boolean(s, &ret)) {
5730
DEBUG(0,("lp_bool(%s): value is not boolean!\n",s));
5737
/*******************************************************************
5738
convenience routine to return enum parameters.
5739
********************************************************************/
5740
static int lp_enum(const char *s,const struct enum_list *_enum)
5744
if (!s || !*s || !_enum) {
5745
MISSING_PARAMETER(lp_enum);
5749
for (i=0; _enum[i].name; i++) {
5750
if (strequal(_enum[i].name,s))
5751
return _enum[i].value;
5754
DEBUG(0,("lp_enum(%s,enum): value is not in enum_list!\n",s));
5758
#undef MISSING_PARAMETER
5760
/* DO NOT USE lp_parm_string ANYMORE!!!!
5761
* use lp_parm_const_string or lp_parm_talloc_string
5763
* lp_parm_string is only used to let old modules find this symbol
5765
#undef lp_parm_string
5766
char *lp_parm_string(const char *servicename, const char *type, const char *option);
5767
char *lp_parm_string(const char *servicename, const char *type, const char *option)
5769
return lp_parm_talloc_string(lp_servicenumber(servicename), type, option, NULL);
5772
/* Return parametric option from a given service. Type is a part of option before ':' */
5773
/* Parametric option has following syntax: 'Type: option = value' */
5774
/* the returned value is talloced on the talloc_tos() */
5775
char *lp_parm_talloc_string(int snum, const char *type, const char *option, const char *def)
5777
struct param_opt_struct *data = get_parametrics(snum, type, option);
5779
if (data == NULL||data->value==NULL) {
5781
return lp_string(def);
5787
return lp_string(data->value);
5790
/* Return parametric option from a given service. Type is a part of option before ':' */
5791
/* Parametric option has following syntax: 'Type: option = value' */
5792
const char *lp_parm_const_string(int snum, const char *type, const char *option, const char *def)
5794
struct param_opt_struct *data = get_parametrics(snum, type, option);
5796
if (data == NULL||data->value==NULL)
5802
/* Return parametric option from a given service. Type is a part of option before ':' */
5803
/* Parametric option has following syntax: 'Type: option = value' */
5805
const char **lp_parm_string_list(int snum, const char *type, const char *option, const char **def)
5807
struct param_opt_struct *data = get_parametrics(snum, type, option);
5809
if (data == NULL||data->value==NULL)
5810
return (const char **)def;
5812
if (data->list==NULL) {
5813
data->list = str_list_make_v3(talloc_autofree_context(), data->value, NULL);
5816
return (const char **)data->list;
5819
/* Return parametric option from a given service. Type is a part of option before ':' */
5820
/* Parametric option has following syntax: 'Type: option = value' */
5822
int lp_parm_int(int snum, const char *type, const char *option, int def)
5824
struct param_opt_struct *data = get_parametrics(snum, type, option);
5826
if (data && data->value && *data->value)
5827
return lp_int(data->value);
5832
/* Return parametric option from a given service. Type is a part of option before ':' */
5833
/* Parametric option has following syntax: 'Type: option = value' */
5835
unsigned long lp_parm_ulong(int snum, const char *type, const char *option, unsigned long def)
5837
struct param_opt_struct *data = get_parametrics(snum, type, option);
5839
if (data && data->value && *data->value)
5840
return lp_ulong(data->value);
5845
/* Return parametric option from a given service. Type is a part of option before ':' */
5846
/* Parametric option has following syntax: 'Type: option = value' */
5848
bool lp_parm_bool(int snum, const char *type, const char *option, bool def)
5850
struct param_opt_struct *data = get_parametrics(snum, type, option);
5852
if (data && data->value && *data->value)
5853
return lp_bool(data->value);
5858
/* Return parametric option from a given service. Type is a part of option before ':' */
5859
/* Parametric option has following syntax: 'Type: option = value' */
5861
int lp_parm_enum(int snum, const char *type, const char *option,
5862
const struct enum_list *_enum, int def)
5864
struct param_opt_struct *data = get_parametrics(snum, type, option);
5866
if (data && data->value && *data->value && _enum)
5867
return lp_enum(data->value, _enum);
5873
/***************************************************************************
5874
Initialise a service to the defaults.
5875
***************************************************************************/
5877
static void init_service(struct service *pservice)
5879
memset((char *)pservice, '\0', sizeof(struct service));
5880
copy_service(pservice, &sDefault, NULL);
5885
* free a param_opts structure.
5886
* param_opts handling should be moved to talloc;
5887
* then this whole functions reduces to a TALLOC_FREE().
5890
static void free_param_opts(struct param_opt_struct **popts)
5892
struct param_opt_struct *opt, *next_opt;
5894
if (popts == NULL) {
5898
if (*popts != NULL) {
5899
DEBUG(5, ("Freeing parametrics:\n"));
5902
while (opt != NULL) {
5903
string_free(&opt->key);
5904
string_free(&opt->value);
5905
TALLOC_FREE(opt->list);
5906
next_opt = opt->next;
5913
/***************************************************************************
5914
Free the dynamically allocated parts of a service struct.
5915
***************************************************************************/
5917
static void free_service(struct service *pservice)
5922
if (pservice->szService)
5923
DEBUG(5, ("free_service: Freeing service %s\n",
5924
pservice->szService));
5926
free_parameters(pservice);
5928
string_free(&pservice->szService);
5929
bitmap_free(pservice->copymap);
5931
free_param_opts(&pservice->param_opt);
5933
ZERO_STRUCTP(pservice);
5937
/***************************************************************************
5938
remove a service indexed in the ServicePtrs array from the ServiceHash
5939
and free the dynamically allocated parts
5940
***************************************************************************/
5942
static void free_service_byindex(int idx)
5944
if ( !LP_SNUM_OK(idx) )
5947
ServicePtrs[idx]->valid = False;
5948
invalid_services[num_invalid_services++] = idx;
5950
/* we have to cleanup the hash record */
5952
if (ServicePtrs[idx]->szService) {
5953
char *canon_name = canonicalize_servicename(
5954
ServicePtrs[idx]->szService );
5956
dbwrap_delete_bystring(ServiceHash, canon_name );
5957
TALLOC_FREE(canon_name);
5960
free_service(ServicePtrs[idx]);
5963
/***************************************************************************
5964
Add a new service to the services array initialising it with the given
5966
***************************************************************************/
5968
static int add_a_service(const struct service *pservice, const char *name)
5971
struct service tservice;
5972
int num_to_alloc = iNumServices + 1;
5974
tservice = *pservice;
5976
/* it might already exist */
5978
i = getservicebyname(name, NULL);
5980
/* Clean all parametric options for service */
5981
/* They will be added during parsing again */
5982
free_param_opts(&ServicePtrs[i]->param_opt);
5987
/* find an invalid one */
5989
if (num_invalid_services > 0) {
5990
i = invalid_services[--num_invalid_services];
5993
/* if not, then create one */
5994
if (i == iNumServices) {
5995
struct service **tsp;
5998
tsp = SMB_REALLOC_ARRAY_KEEP_OLD_ON_ERROR(ServicePtrs, struct service *, num_to_alloc);
6000
DEBUG(0,("add_a_service: failed to enlarge ServicePtrs!\n"));
6004
ServicePtrs[iNumServices] = SMB_MALLOC_P(struct service);
6005
if (!ServicePtrs[iNumServices]) {
6006
DEBUG(0,("add_a_service: out of memory!\n"));
6011
/* enlarge invalid_services here for now... */
6012
tinvalid = SMB_REALLOC_ARRAY_KEEP_OLD_ON_ERROR(invalid_services, int,
6014
if (tinvalid == NULL) {
6015
DEBUG(0,("add_a_service: failed to enlarge "
6016
"invalid_services!\n"));
6019
invalid_services = tinvalid;
6021
free_service_byindex(i);
6024
ServicePtrs[i]->valid = True;
6026
init_service(ServicePtrs[i]);
6027
copy_service(ServicePtrs[i], &tservice, NULL);
6029
string_set(&ServicePtrs[i]->szService, name);
6031
DEBUG(8,("add_a_service: Creating snum = %d for %s\n",
6032
i, ServicePtrs[i]->szService));
6034
if (!hash_a_service(ServicePtrs[i]->szService, i)) {
6041
/***************************************************************************
6042
Convert a string to uppercase and remove whitespaces.
6043
***************************************************************************/
6045
static char *canonicalize_servicename(const char *src)
6050
DEBUG(0,("canonicalize_servicename: NULL source name!\n"));
6054
result = talloc_strdup(talloc_tos(), src);
6055
SMB_ASSERT(result != NULL);
6061
/***************************************************************************
6062
Add a name/index pair for the services array to the hash table.
6063
***************************************************************************/
6065
static bool hash_a_service(const char *name, int idx)
6069
if ( !ServiceHash ) {
6070
DEBUG(10,("hash_a_service: creating servicehash\n"));
6071
ServiceHash = db_open_rbt(NULL);
6072
if ( !ServiceHash ) {
6073
DEBUG(0,("hash_a_service: open tdb servicehash failed!\n"));
6078
DEBUG(10,("hash_a_service: hashing index %d for service name %s\n",
6081
canon_name = canonicalize_servicename( name );
6083
dbwrap_store_bystring(ServiceHash, canon_name,
6084
make_tdb_data((uint8 *)&idx, sizeof(idx)),
6087
TALLOC_FREE(canon_name);
6092
/***************************************************************************
6093
Add a new home service, with the specified home directory, defaults coming
6095
***************************************************************************/
6097
bool lp_add_home(const char *pszHomename, int iDefaultService,
6098
const char *user, const char *pszHomedir)
6102
if (pszHomename == NULL || user == NULL || pszHomedir == NULL ||
6103
pszHomedir[0] == '\0') {
6107
i = add_a_service(ServicePtrs[iDefaultService], pszHomename);
6112
if (!(*(ServicePtrs[iDefaultService]->szPath))
6113
|| strequal(ServicePtrs[iDefaultService]->szPath, lp_pathname(GLOBAL_SECTION_SNUM))) {
6114
string_set(&ServicePtrs[i]->szPath, pszHomedir);
6117
if (!(*(ServicePtrs[i]->comment))) {
6118
char *comment = NULL;
6119
if (asprintf(&comment, "Home directory of %s", user) < 0) {
6122
string_set(&ServicePtrs[i]->comment, comment);
6126
/* set the browseable flag from the global default */
6128
ServicePtrs[i]->bBrowseable = sDefault.bBrowseable;
6129
ServicePtrs[i]->bAccessBasedShareEnum = sDefault.bAccessBasedShareEnum;
6131
ServicePtrs[i]->autoloaded = True;
6133
DEBUG(3, ("adding home's share [%s] for user '%s' at '%s'\n", pszHomename,
6134
user, ServicePtrs[i]->szPath ));
6139
/***************************************************************************
6140
Add a new service, based on an old one.
6141
***************************************************************************/
6143
int lp_add_service(const char *pszService, int iDefaultService)
6145
if (iDefaultService < 0) {
6146
return add_a_service(&sDefault, pszService);
6149
return (add_a_service(ServicePtrs[iDefaultService], pszService));
6152
/***************************************************************************
6153
Add the IPC service.
6154
***************************************************************************/
6156
static bool lp_add_ipc(const char *ipc_name, bool guest_ok)
6158
char *comment = NULL;
6159
int i = add_a_service(&sDefault, ipc_name);
6164
if (asprintf(&comment, "IPC Service (%s)",
6165
Globals.szServerString) < 0) {
6169
string_set(&ServicePtrs[i]->szPath, tmpdir());
6170
string_set(&ServicePtrs[i]->szUsername, "");
6171
string_set(&ServicePtrs[i]->comment, comment);
6172
string_set(&ServicePtrs[i]->fstype, "IPC");
6173
ServicePtrs[i]->iMaxConnections = 0;
6174
ServicePtrs[i]->bAvailable = True;
6175
ServicePtrs[i]->bRead_only = True;
6176
ServicePtrs[i]->bGuest_only = False;
6177
ServicePtrs[i]->bAdministrative_share = True;
6178
ServicePtrs[i]->bGuest_ok = guest_ok;
6179
ServicePtrs[i]->bPrint_ok = False;
6180
ServicePtrs[i]->bBrowseable = sDefault.bBrowseable;
6182
DEBUG(3, ("adding IPC service\n"));
6188
/***************************************************************************
6189
Add a new printer service, with defaults coming from service iFrom.
6190
***************************************************************************/
6192
bool lp_add_printer(const char *pszPrintername, int iDefaultService)
6194
const char *comment = "From Printcap";
6195
int i = add_a_service(ServicePtrs[iDefaultService], pszPrintername);
6200
/* note that we do NOT default the availability flag to True - */
6201
/* we take it from the default service passed. This allows all */
6202
/* dynamic printers to be disabled by disabling the [printers] */
6203
/* entry (if/when the 'available' keyword is implemented!). */
6205
/* the printer name is set to the service name. */
6206
string_set(&ServicePtrs[i]->szPrintername, pszPrintername);
6207
string_set(&ServicePtrs[i]->comment, comment);
6209
/* set the browseable flag from the gloabl default */
6210
ServicePtrs[i]->bBrowseable = sDefault.bBrowseable;
6212
/* Printers cannot be read_only. */
6213
ServicePtrs[i]->bRead_only = False;
6214
/* No share modes on printer services. */
6215
ServicePtrs[i]->bShareModes = False;
6216
/* No oplocks on printer services. */
6217
ServicePtrs[i]->bOpLocks = False;
6218
/* Printer services must be printable. */
6219
ServicePtrs[i]->bPrint_ok = True;
6221
DEBUG(3, ("adding printer service %s\n", pszPrintername));
6227
/***************************************************************************
6228
Check whether the given parameter name is valid.
6229
Parametric options (names containing a colon) are considered valid.
6230
***************************************************************************/
6232
bool lp_parameter_is_valid(const char *pszParmName)
6234
return ((map_parameter(pszParmName) != -1) ||
6235
(strchr(pszParmName, ':') != NULL));
6238
/***************************************************************************
6239
Check whether the given name is the name of a global parameter.
6240
Returns True for strings belonging to parameters of class
6241
P_GLOBAL, False for all other strings, also for parametric options
6242
and strings not belonging to any option.
6243
***************************************************************************/
6245
bool lp_parameter_is_global(const char *pszParmName)
6247
int num = map_parameter(pszParmName);
6250
return (parm_table[num].p_class == P_GLOBAL);
6256
/**************************************************************************
6257
Check whether the given name is the canonical name of a parameter.
6258
Returns False if it is not a valid parameter Name.
6259
For parametric options, True is returned.
6260
**************************************************************************/
6262
bool lp_parameter_is_canonical(const char *parm_name)
6264
if (!lp_parameter_is_valid(parm_name)) {
6268
return (map_parameter(parm_name) ==
6269
map_parameter_canonical(parm_name, NULL));
6272
/**************************************************************************
6273
Determine the canonical name for a parameter.
6274
Indicate when it is an inverse (boolean) synonym instead of a
6276
**************************************************************************/
6278
bool lp_canonicalize_parameter(const char *parm_name, const char **canon_parm,
6283
if (!lp_parameter_is_valid(parm_name)) {
6288
num = map_parameter_canonical(parm_name, inverse);
6290
/* parametric option */
6291
*canon_parm = parm_name;
6293
*canon_parm = parm_table[num].label;
6300
/**************************************************************************
6301
Determine the canonical name for a parameter.
6302
Turn the value given into the inverse boolean expression when
6303
the synonym is an invers boolean synonym.
6305
Return True if parm_name is a valid parameter name and
6306
in case it is an invers boolean synonym, if the val string could
6307
successfully be converted to the reverse bool.
6308
Return false in all other cases.
6309
**************************************************************************/
6311
bool lp_canonicalize_parameter_with_value(const char *parm_name,
6313
const char **canon_parm,
6314
const char **canon_val)
6319
if (!lp_parameter_is_valid(parm_name)) {
6325
num = map_parameter_canonical(parm_name, &inverse);
6327
/* parametric option */
6328
*canon_parm = parm_name;
6331
*canon_parm = parm_table[num].label;
6333
if (!lp_invert_boolean(val, canon_val)) {
6345
/***************************************************************************
6346
Map a parameter's string representation to something we can use.
6347
Returns False if the parameter string is not recognised, else TRUE.
6348
***************************************************************************/
6350
static int map_parameter(const char *pszParmName)
6354
if (*pszParmName == '-' && !strequal(pszParmName, "-valid"))
6357
for (iIndex = 0; parm_table[iIndex].label; iIndex++)
6358
if (strwicmp(parm_table[iIndex].label, pszParmName) == 0)
6361
/* Warn only if it isn't parametric option */
6362
if (strchr(pszParmName, ':') == NULL)
6363
DEBUG(1, ("Unknown parameter encountered: \"%s\"\n", pszParmName));
6364
/* We do return 'fail' for parametric options as well because they are
6365
stored in different storage
6370
/***************************************************************************
6371
Map a parameter's string representation to the index of the canonical
6372
form of the parameter (it might be a synonym).
6373
Returns -1 if the parameter string is not recognised.
6374
***************************************************************************/
6376
static int map_parameter_canonical(const char *pszParmName, bool *inverse)
6378
int parm_num, canon_num;
6379
bool loc_inverse = False;
6381
parm_num = map_parameter(pszParmName);
6382
if ((parm_num < 0) || !(parm_table[parm_num].flags & FLAG_HIDE)) {
6383
/* invalid, parametric or no canidate for synonyms ... */
6387
for (canon_num = 0; parm_table[canon_num].label; canon_num++) {
6388
if (is_synonym_of(parm_num, canon_num, &loc_inverse)) {
6389
parm_num = canon_num;
6395
if (inverse != NULL) {
6396
*inverse = loc_inverse;
6401
/***************************************************************************
6402
return true if parameter number parm1 is a synonym of parameter
6403
number parm2 (parm2 being the principal name).
6404
set inverse to True if parm1 is P_BOOLREV and parm2 is P_BOOL,
6406
***************************************************************************/
6408
static bool is_synonym_of(int parm1, int parm2, bool *inverse)
6410
if ((parm_table[parm1].ptr == parm_table[parm2].ptr) &&
6411
(parm_table[parm1].flags & FLAG_HIDE) &&
6412
!(parm_table[parm2].flags & FLAG_HIDE))
6414
if (inverse != NULL) {
6415
if ((parm_table[parm1].type == P_BOOLREV) &&
6416
(parm_table[parm2].type == P_BOOL))
6428
/***************************************************************************
6429
Show one parameter's name, type, [values,] and flags.
6430
(helper functions for show_parameter_list)
6431
***************************************************************************/
6433
static void show_parameter(int parmIndex)
6435
int enumIndex, flagIndex;
6440
const char *type[] = { "P_BOOL", "P_BOOLREV", "P_CHAR", "P_INTEGER",
6441
"P_OCTAL", "P_LIST", "P_STRING", "P_USTRING",
6443
unsigned flags[] = { FLAG_BASIC, FLAG_SHARE, FLAG_PRINT, FLAG_GLOBAL,
6444
FLAG_WIZARD, FLAG_ADVANCED, FLAG_DEVELOPER, FLAG_DEPRECATED,
6445
FLAG_HIDE, FLAG_DOS_STRING};
6446
const char *flag_names[] = { "FLAG_BASIC", "FLAG_SHARE", "FLAG_PRINT",
6447
"FLAG_GLOBAL", "FLAG_WIZARD", "FLAG_ADVANCED", "FLAG_DEVELOPER",
6448
"FLAG_DEPRECATED", "FLAG_HIDE", "FLAG_DOS_STRING", NULL};
6450
printf("%s=%s", parm_table[parmIndex].label,
6451
type[parm_table[parmIndex].type]);
6452
if (parm_table[parmIndex].type == P_ENUM) {
6455
parm_table[parmIndex].enum_list[enumIndex].name;
6459
enumIndex ? "|" : "",
6460
parm_table[parmIndex].enum_list[enumIndex].name);
6465
for (flagIndex=0; flag_names[flagIndex]; flagIndex++) {
6466
if (parm_table[parmIndex].flags & flags[flagIndex]) {
6469
flag_names[flagIndex]);
6474
/* output synonyms */
6476
for (parmIndex2=0; parm_table[parmIndex2].label; parmIndex2++) {
6477
if (is_synonym_of(parmIndex, parmIndex2, &inverse)) {
6478
printf(" (%ssynonym of %s)", inverse ? "inverse " : "",
6479
parm_table[parmIndex2].label);
6480
} else if (is_synonym_of(parmIndex2, parmIndex, &inverse)) {
6482
printf(" (synonyms: ");
6487
printf("%s%s", parm_table[parmIndex2].label,
6488
inverse ? "[i]" : "");
6498
/***************************************************************************
6499
Show all parameter's name, type, [values,] and flags.
6500
***************************************************************************/
6502
void show_parameter_list(void)
6504
int classIndex, parmIndex;
6505
const char *section_names[] = { "local", "global", NULL};
6507
for (classIndex=0; section_names[classIndex]; classIndex++) {
6508
printf("[%s]\n", section_names[classIndex]);
6509
for (parmIndex = 0; parm_table[parmIndex].label; parmIndex++) {
6510
if (parm_table[parmIndex].p_class == classIndex) {
6511
show_parameter(parmIndex);
6517
/***************************************************************************
6518
Check if a given string correctly represents a boolean value.
6519
***************************************************************************/
6521
bool lp_string_is_valid_boolean(const char *parm_value)
6523
return set_boolean(parm_value, NULL);
6526
/***************************************************************************
6527
Get the standard string representation of a boolean value ("yes" or "no")
6528
***************************************************************************/
6530
static const char *get_boolean(bool bool_value)
6532
static const char *yes_str = "yes";
6533
static const char *no_str = "no";
6535
return (bool_value ? yes_str : no_str);
6538
/***************************************************************************
6539
Provide the string of the negated boolean value associated to the boolean
6540
given as a string. Returns False if the passed string does not correctly
6541
represent a boolean.
6542
***************************************************************************/
6544
bool lp_invert_boolean(const char *str, const char **inverse_str)
6548
if (!set_boolean(str, &val)) {
6552
*inverse_str = get_boolean(!val);
6556
/***************************************************************************
6557
Provide the canonical string representation of a boolean value given
6558
as a string. Return True on success, False if the string given does
6559
not correctly represent a boolean.
6560
***************************************************************************/
6562
bool lp_canonicalize_boolean(const char *str, const char**canon_str)
6566
if (!set_boolean(str, &val)) {
6570
*canon_str = get_boolean(val);
6574
/***************************************************************************
6575
Find a service by name. Otherwise works like get_service.
6576
***************************************************************************/
6578
static int getservicebyname(const char *pszServiceName, struct service *pserviceDest)
6584
if (ServiceHash == NULL) {
6588
canon_name = canonicalize_servicename(pszServiceName);
6590
data = dbwrap_fetch_bystring(ServiceHash, canon_name, canon_name);
6592
if ((data.dptr != NULL) && (data.dsize == sizeof(iService))) {
6593
iService = *(int *)data.dptr;
6596
TALLOC_FREE(canon_name);
6598
if ((iService != -1) && (LP_SNUM_OK(iService))
6599
&& (pserviceDest != NULL)) {
6600
copy_service(pserviceDest, ServicePtrs[iService], NULL);
6606
/***************************************************************************
6607
Copy a service structure to another.
6608
If pcopymapDest is NULL then copy all fields
6609
***************************************************************************/
6612
* Add a parametric option to a param_opt_struct,
6613
* replacing old value, if already present.
6615
static void set_param_opt(struct param_opt_struct **opt_list,
6616
const char *opt_name,
6617
const char *opt_value)
6619
struct param_opt_struct *new_opt, *opt;
6622
if (opt_list == NULL) {
6629
/* Traverse destination */
6631
/* If we already have same option, override it */
6632
if (strwicmp(opt->key, opt_name) == 0) {
6633
string_free(&opt->value);
6634
TALLOC_FREE(opt->list);
6635
opt->value = SMB_STRDUP(opt_value);
6642
new_opt = SMB_XMALLOC_P(struct param_opt_struct);
6643
new_opt->key = SMB_STRDUP(opt_name);
6644
new_opt->value = SMB_STRDUP(opt_value);
6645
new_opt->list = NULL;
6646
DLIST_ADD(*opt_list, new_opt);
6650
static void copy_service(struct service *pserviceDest, struct service *pserviceSource,
6651
struct bitmap *pcopymapDest)
6654
bool bcopyall = (pcopymapDest == NULL);
6655
struct param_opt_struct *data;
6657
for (i = 0; parm_table[i].label; i++)
6658
if (parm_table[i].ptr && parm_table[i].p_class == P_LOCAL &&
6659
(bcopyall || bitmap_query(pcopymapDest,i))) {
6660
void *def_ptr = parm_table[i].ptr;
6662
((char *)pserviceSource) + PTR_DIFF(def_ptr,
6665
((char *)pserviceDest) + PTR_DIFF(def_ptr,
6668
switch (parm_table[i].type) {
6671
*(bool *)dest_ptr = *(bool *)src_ptr;
6677
*(int *)dest_ptr = *(int *)src_ptr;
6681
*(char *)dest_ptr = *(char *)src_ptr;
6685
string_set((char **)dest_ptr,
6690
string_set((char **)dest_ptr,
6692
strupper_m(*(char **)dest_ptr);
6695
TALLOC_FREE(*((char ***)dest_ptr));
6696
*((char ***)dest_ptr) = str_list_copy(NULL,
6697
*(const char ***)src_ptr);
6705
init_copymap(pserviceDest);
6706
if (pserviceSource->copymap)
6707
bitmap_copy(pserviceDest->copymap,
6708
pserviceSource->copymap);
6711
data = pserviceSource->param_opt;
6713
set_param_opt(&pserviceDest->param_opt, data->key, data->value);
6718
/***************************************************************************
6719
Check a service for consistency. Return False if the service is in any way
6720
incomplete or faulty, else True.
6721
***************************************************************************/
6723
bool service_ok(int iService)
6728
if (ServicePtrs[iService]->szService[0] == '\0') {
6729
DEBUG(0, ("The following message indicates an internal error:\n"));
6730
DEBUG(0, ("No service name in service entry.\n"));
6734
/* The [printers] entry MUST be printable. I'm all for flexibility, but */
6735
/* I can't see why you'd want a non-printable printer service... */
6736
if (strwicmp(ServicePtrs[iService]->szService, PRINTERS_NAME) == 0) {
6737
if (!ServicePtrs[iService]->bPrint_ok) {
6738
DEBUG(0, ("WARNING: [%s] service MUST be printable!\n",
6739
ServicePtrs[iService]->szService));
6740
ServicePtrs[iService]->bPrint_ok = True;
6742
/* [printers] service must also be non-browsable. */
6743
if (ServicePtrs[iService]->bBrowseable)
6744
ServicePtrs[iService]->bBrowseable = False;
6747
if (ServicePtrs[iService]->szPath[0] == '\0' &&
6748
strwicmp(ServicePtrs[iService]->szService, HOMES_NAME) != 0 &&
6749
ServicePtrs[iService]->szMSDfsProxy[0] == '\0'
6751
DEBUG(0, ("WARNING: No path in service %s - making it unavailable!\n",
6752
ServicePtrs[iService]->szService));
6753
ServicePtrs[iService]->bAvailable = False;
6756
/* If a service is flagged unavailable, log the fact at level 1. */
6757
if (!ServicePtrs[iService]->bAvailable)
6758
DEBUG(1, ("NOTE: Service %s is flagged unavailable.\n",
6759
ServicePtrs[iService]->szService));
6764
static struct smbconf_ctx *lp_smbconf_ctx(void)
6767
static struct smbconf_ctx *conf_ctx = NULL;
6769
if (conf_ctx == NULL) {
6770
werr = smbconf_init(NULL, &conf_ctx, "registry:");
6771
if (!W_ERROR_IS_OK(werr)) {
6772
DEBUG(1, ("error initializing registry configuration: "
6773
"%s\n", win_errstr(werr)));
6781
static bool process_smbconf_service(struct smbconf_service *service)
6786
if (service == NULL) {
6790
ret = do_section(service->name, NULL);
6794
for (count = 0; count < service->num_params; count++) {
6795
ret = do_parameter(service->param_names[count],
6796
service->param_values[count],
6802
if (iServiceIndex >= 0) {
6803
return service_ok(iServiceIndex);
6809
* load a service from registry and activate it
6811
bool process_registry_service(const char *service_name)
6814
struct smbconf_service *service = NULL;
6815
TALLOC_CTX *mem_ctx = talloc_stackframe();
6816
struct smbconf_ctx *conf_ctx = lp_smbconf_ctx();
6819
if (conf_ctx == NULL) {
6823
DEBUG(5, ("process_registry_service: service name %s\n", service_name));
6825
if (!smbconf_share_exists(conf_ctx, service_name)) {
6827
* Registry does not contain data for this service (yet),
6828
* but make sure lp_load doesn't return false.
6834
werr = smbconf_get_share(conf_ctx, mem_ctx, service_name, &service);
6835
if (!W_ERROR_IS_OK(werr)) {
6839
ret = process_smbconf_service(service);
6845
smbconf_changed(conf_ctx, &conf_last_csn, NULL, NULL);
6848
TALLOC_FREE(mem_ctx);
6853
* process_registry_globals
6855
static bool process_registry_globals(void)
6859
add_to_file_list(INCLUDE_REGISTRY_NAME, INCLUDE_REGISTRY_NAME);
6861
ret = do_parameter("registry shares", "yes", NULL);
6866
return process_registry_service(GLOBAL_NAME);
6869
bool process_registry_shares(void)
6873
struct smbconf_service **service = NULL;
6874
uint32_t num_shares = 0;
6875
TALLOC_CTX *mem_ctx = talloc_stackframe();
6876
struct smbconf_ctx *conf_ctx = lp_smbconf_ctx();
6879
if (conf_ctx == NULL) {
6883
werr = smbconf_get_config(conf_ctx, mem_ctx, &num_shares, &service);
6884
if (!W_ERROR_IS_OK(werr)) {
6890
for (count = 0; count < num_shares; count++) {
6891
if (strequal(service[count]->name, GLOBAL_NAME)) {
6894
ret = process_smbconf_service(service[count]);
6901
smbconf_changed(conf_ctx, &conf_last_csn, NULL, NULL);
6904
TALLOC_FREE(mem_ctx);
6908
#define MAX_INCLUDE_DEPTH 100
6910
static uint8_t include_depth;
6912
static struct file_lists {
6913
struct file_lists *next;
6917
} *file_lists = NULL;
6919
/*******************************************************************
6920
Keep a linked list of all config files so we know when one has changed
6921
it's date and needs to be reloaded.
6922
********************************************************************/
6924
static void add_to_file_list(const char *fname, const char *subfname)
6926
struct file_lists *f = file_lists;
6929
if (f->name && !strcmp(f->name, fname))
6935
f = SMB_MALLOC_P(struct file_lists);
6938
f->next = file_lists;
6939
f->name = SMB_STRDUP(fname);
6944
f->subfname = SMB_STRDUP(subfname);
6950
f->modtime = file_modtime(subfname);
6952
time_t t = file_modtime(subfname);
6959
* Free the file lists
6961
static void free_file_list(void)
6963
struct file_lists *f;
6964
struct file_lists *next;
6969
SAFE_FREE( f->name );
6970
SAFE_FREE( f->subfname );
6979
* Utility function for outsiders to check if we're running on registry.
6981
bool lp_config_backend_is_registry(void)
6983
return (lp_config_backend() == CONFIG_BACKEND_REGISTRY);
6987
* Utility function to check if the config backend is FILE.
6989
bool lp_config_backend_is_file(void)
6991
return (lp_config_backend() == CONFIG_BACKEND_FILE);
6994
/*******************************************************************
6995
Check if a config file has changed date.
6996
********************************************************************/
6998
bool lp_file_list_changed(void)
7000
struct file_lists *f = file_lists;
7002
DEBUG(6, ("lp_file_list_changed()\n"));
7008
if (strequal(f->name, INCLUDE_REGISTRY_NAME)) {
7009
struct smbconf_ctx *conf_ctx = lp_smbconf_ctx();
7011
if (conf_ctx == NULL) {
7014
if (smbconf_changed(conf_ctx, &conf_last_csn, NULL,
7017
DEBUGADD(6, ("registry config changed\n"));
7021
n2 = alloc_sub_basic(get_current_username(),
7022
current_user_info.domain,
7027
DEBUGADD(6, ("file %s -> %s last mod_time: %s\n",
7028
f->name, n2, ctime(&f->modtime)));
7030
mod_time = file_modtime(n2);
7033
((f->modtime != mod_time) ||
7034
(f->subfname == NULL) ||
7035
(strcmp(n2, f->subfname) != 0)))
7038
("file %s modified: %s\n", n2,
7040
f->modtime = mod_time;
7041
SAFE_FREE(f->subfname);
7042
f->subfname = n2; /* Passing ownership of
7043
return from alloc_sub_basic
7055
/***************************************************************************
7056
Run standard_sub_basic on netbios name... needed because global_myname
7057
is not accessed through any lp_ macro.
7058
Note: We must *NOT* use string_set() here as ptr points to global_myname.
7059
***************************************************************************/
7061
static bool handle_netbios_name(int snum, const char *pszParmValue, char **ptr)
7064
char *netbios_name = alloc_sub_basic(get_current_username(),
7065
current_user_info.domain,
7068
ret = set_global_myname(netbios_name);
7069
SAFE_FREE(netbios_name);
7070
string_set(&Globals.szNetbiosName,global_myname());
7072
DEBUG(4, ("handle_netbios_name: set global_myname to: %s\n",
7078
static bool handle_charset(int snum, const char *pszParmValue, char **ptr)
7080
if (strcmp(*ptr, pszParmValue) != 0) {
7081
string_set(ptr, pszParmValue);
7089
static bool handle_workgroup(int snum, const char *pszParmValue, char **ptr)
7093
ret = set_global_myworkgroup(pszParmValue);
7094
string_set(&Globals.szWorkgroup,lp_workgroup());
7099
static bool handle_netbios_scope(int snum, const char *pszParmValue, char **ptr)
7103
ret = set_global_scope(pszParmValue);
7104
string_set(&Globals.szNetbiosScope,global_scope());
7109
static bool handle_netbios_aliases(int snum, const char *pszParmValue, char **ptr)
7111
TALLOC_FREE(Globals.szNetbiosAliases);
7112
Globals.szNetbiosAliases = str_list_make_v3(talloc_autofree_context(), pszParmValue, NULL);
7113
return set_netbios_aliases((const char **)Globals.szNetbiosAliases);
7116
/***************************************************************************
7117
Handle the include operation.
7118
***************************************************************************/
7119
static bool bAllowIncludeRegistry = true;
7121
static bool handle_include(int snum, const char *pszParmValue, char **ptr)
7125
if (include_depth >= MAX_INCLUDE_DEPTH) {
7126
DEBUG(0, ("Error: Maximum include depth (%u) exceeded!\n",
7131
if (strequal(pszParmValue, INCLUDE_REGISTRY_NAME)) {
7132
if (!bAllowIncludeRegistry) {
7135
if (bInGlobalSection) {
7138
ret = process_registry_globals();
7142
DEBUG(1, ("\"include = registry\" only effective "
7143
"in %s section\n", GLOBAL_NAME));
7148
fname = alloc_sub_basic(get_current_username(),
7149
current_user_info.domain,
7152
add_to_file_list(pszParmValue, fname);
7154
string_set(ptr, fname);
7156
if (file_exist(fname)) {
7159
ret = pm_process(fname, do_section, do_parameter, NULL);
7165
DEBUG(2, ("Can't find include file %s\n", fname));
7170
/***************************************************************************
7171
Handle the interpretation of the copy parameter.
7172
***************************************************************************/
7174
static bool handle_copy(int snum, const char *pszParmValue, char **ptr)
7178
struct service serviceTemp;
7180
string_set(ptr, pszParmValue);
7182
init_service(&serviceTemp);
7186
DEBUG(3, ("Copying service from service %s\n", pszParmValue));
7188
if ((iTemp = getservicebyname(pszParmValue, &serviceTemp)) >= 0) {
7189
if (iTemp == iServiceIndex) {
7190
DEBUG(0, ("Can't copy service %s - unable to copy self!\n", pszParmValue));
7192
copy_service(ServicePtrs[iServiceIndex],
7194
ServicePtrs[iServiceIndex]->copymap);
7198
DEBUG(0, ("Unable to copy service - source not found: %s\n", pszParmValue));
7202
free_service(&serviceTemp);
7206
static bool handle_ldap_debug_level(int snum, const char *pszParmValue, char **ptr)
7208
Globals.ldap_debug_level = lp_int(pszParmValue);
7209
init_ldap_debugging();
7213
/***************************************************************************
7214
Handle idmap/non unix account uid and gid allocation parameters. The format of these
7219
idmap uid = 1000-1999
7222
We only do simple parsing checks here. The strings are parsed into useful
7223
structures in the idmap daemon code.
7225
***************************************************************************/
7227
/* Some lp_ routines to return idmap [ug]id information */
7229
static uid_t idmap_uid_low, idmap_uid_high;
7230
static gid_t idmap_gid_low, idmap_gid_high;
7232
bool lp_idmap_uid(uid_t *low, uid_t *high)
7234
if (idmap_uid_low == 0 || idmap_uid_high == 0)
7238
*low = idmap_uid_low;
7241
*high = idmap_uid_high;
7246
bool lp_idmap_gid(gid_t *low, gid_t *high)
7248
if (idmap_gid_low == 0 || idmap_gid_high == 0)
7252
*low = idmap_gid_low;
7255
*high = idmap_gid_high;
7260
/* Do some simple checks on "idmap [ug]id" parameter values */
7262
static bool handle_idmap_uid(int snum, const char *pszParmValue, char **ptr)
7266
if (sscanf(pszParmValue, "%u - %u", &low, &high) != 2 || high < low)
7271
string_set(ptr, pszParmValue);
7273
idmap_uid_low = low;
7274
idmap_uid_high = high;
7279
static bool handle_idmap_gid(int snum, const char *pszParmValue, char **ptr)
7283
if (sscanf(pszParmValue, "%u - %u", &low, &high) != 2 || high < low)
7288
string_set(ptr, pszParmValue);
7290
idmap_gid_low = low;
7291
idmap_gid_high = high;
7296
/***************************************************************************
7297
Handle the DEBUG level list.
7298
***************************************************************************/
7300
static bool handle_debug_list( int snum, const char *pszParmValueIn, char **ptr )
7302
string_set(ptr, pszParmValueIn);
7303
return debug_parse_levels(pszParmValueIn);
7306
/***************************************************************************
7307
Handle ldap suffixes - default to ldapsuffix if sub-suffixes are not defined.
7308
***************************************************************************/
7310
static const char *append_ldap_suffix( const char *str )
7312
const char *suffix_string;
7315
suffix_string = talloc_asprintf(talloc_tos(), "%s,%s", str,
7316
Globals.szLdapSuffix );
7317
if ( !suffix_string ) {
7318
DEBUG(0,("append_ldap_suffix: talloc_asprintf() failed!\n"));
7322
return suffix_string;
7325
const char *lp_ldap_machine_suffix(void)
7327
if (Globals.szLdapMachineSuffix[0])
7328
return append_ldap_suffix(Globals.szLdapMachineSuffix);
7330
return lp_string(Globals.szLdapSuffix);
7333
const char *lp_ldap_user_suffix(void)
7335
if (Globals.szLdapUserSuffix[0])
7336
return append_ldap_suffix(Globals.szLdapUserSuffix);
7338
return lp_string(Globals.szLdapSuffix);
7341
const char *lp_ldap_group_suffix(void)
7343
if (Globals.szLdapGroupSuffix[0])
7344
return append_ldap_suffix(Globals.szLdapGroupSuffix);
7346
return lp_string(Globals.szLdapSuffix);
7349
const char *lp_ldap_idmap_suffix(void)
7351
if (Globals.szLdapIdmapSuffix[0])
7352
return append_ldap_suffix(Globals.szLdapIdmapSuffix);
7354
return lp_string(Globals.szLdapSuffix);
7357
/****************************************************************************
7358
set the value for a P_ENUM
7359
***************************************************************************/
7361
static void lp_set_enum_parm( struct parm_struct *parm, const char *pszParmValue,
7366
for (i = 0; parm->enum_list[i].name; i++) {
7367
if ( strequal(pszParmValue, parm->enum_list[i].name)) {
7368
*ptr = parm->enum_list[i].value;
7372
DEBUG(0, ("WARNING: Ignoring invalid value '%s' for parameter '%s'\n",
7373
pszParmValue, parm->label));
7376
/***************************************************************************
7377
***************************************************************************/
7379
static bool handle_printing(int snum, const char *pszParmValue, char **ptr)
7381
static int parm_num = -1;
7384
if ( parm_num == -1 )
7385
parm_num = map_parameter( "printing" );
7387
lp_set_enum_parm( &parm_table[parm_num], pszParmValue, (int*)ptr );
7392
s = ServicePtrs[snum];
7394
init_printer_values( s );
7400
/***************************************************************************
7401
Initialise a copymap.
7402
***************************************************************************/
7404
static void init_copymap(struct service *pservice)
7407
if (pservice->copymap) {
7408
bitmap_free(pservice->copymap);
7410
pservice->copymap = bitmap_allocate(NUMPARAMETERS);
7411
if (!pservice->copymap)
7413
("Couldn't allocate copymap!! (size %d)\n",
7414
(int)NUMPARAMETERS));
7416
for (i = 0; i < NUMPARAMETERS; i++)
7417
bitmap_set(pservice->copymap, i);
7420
/***************************************************************************
7421
Return the local pointer to a parameter given a service struct and the
7422
pointer into the default structure.
7423
***************************************************************************/
7425
static void *lp_local_ptr(struct service *service, void *ptr)
7427
return (void *)(((char *)service) + PTR_DIFF(ptr, &sDefault));
7430
/***************************************************************************
7431
Return the local pointer to a parameter given the service number and the
7432
pointer into the default structure.
7433
***************************************************************************/
7435
void *lp_local_ptr_by_snum(int snum, void *ptr)
7437
return lp_local_ptr(ServicePtrs[snum], ptr);
7440
/***************************************************************************
7441
Process a parameter for a particular service number. If snum < 0
7442
then assume we are in the globals.
7443
***************************************************************************/
7445
bool lp_do_parameter(int snum, const char *pszParmName, const char *pszParmValue)
7448
void *parm_ptr = NULL; /* where we are going to store the result */
7449
void *def_ptr = NULL;
7450
struct param_opt_struct **opt_list;
7452
parmnum = map_parameter(pszParmName);
7455
if (strchr(pszParmName, ':') == NULL) {
7456
DEBUG(0, ("Ignoring unknown parameter \"%s\"\n",
7462
* We've got a parametric option
7465
opt_list = (snum < 0)
7466
? &Globals.param_opt : &ServicePtrs[snum]->param_opt;
7467
set_param_opt(opt_list, pszParmName, pszParmValue);
7472
if (parm_table[parmnum].flags & FLAG_DEPRECATED) {
7473
DEBUG(1, ("WARNING: The \"%s\" option is deprecated\n",
7477
def_ptr = parm_table[parmnum].ptr;
7479
/* we might point at a service, the default service or a global */
7483
if (parm_table[parmnum].p_class == P_GLOBAL) {
7485
("Global parameter %s found in service section!\n",
7489
parm_ptr = lp_local_ptr_by_snum(snum, def_ptr);
7493
if (!ServicePtrs[snum]->copymap)
7494
init_copymap(ServicePtrs[snum]);
7496
/* this handles the aliases - set the copymap for other entries with
7497
the same data pointer */
7498
for (i = 0; parm_table[i].label; i++)
7499
if (parm_table[i].ptr == parm_table[parmnum].ptr)
7500
bitmap_clear(ServicePtrs[snum]->copymap, i);
7503
/* if it is a special case then go ahead */
7504
if (parm_table[parmnum].special) {
7505
return parm_table[parmnum].special(snum, pszParmValue,
7509
/* now switch on the type of variable it is */
7510
switch (parm_table[parmnum].type)
7513
*(bool *)parm_ptr = lp_bool(pszParmValue);
7517
*(bool *)parm_ptr = !lp_bool(pszParmValue);
7521
*(int *)parm_ptr = lp_int(pszParmValue);
7525
*(char *)parm_ptr = *pszParmValue;
7529
i = sscanf(pszParmValue, "%o", (int *)parm_ptr);
7531
DEBUG ( 0, ("Invalid octal number %s\n", pszParmName ));
7536
TALLOC_FREE(*((char ***)parm_ptr));
7537
*(char ***)parm_ptr = str_list_make_v3(
7538
talloc_autofree_context(), pszParmValue, NULL);
7542
string_set((char **)parm_ptr, pszParmValue);
7546
string_set((char **)parm_ptr, pszParmValue);
7547
strupper_m(*(char **)parm_ptr);
7551
lp_set_enum_parm( &parm_table[parmnum], pszParmValue, (int*)parm_ptr );
7560
/***************************************************************************
7561
Process a parameter.
7562
***************************************************************************/
7564
static bool do_parameter(const char *pszParmName, const char *pszParmValue,
7567
if (!bInGlobalSection && bGlobalOnly)
7570
DEBUGADD(4, ("doing parameter %s = %s\n", pszParmName, pszParmValue));
7572
return (lp_do_parameter(bInGlobalSection ? -2 : iServiceIndex,
7573
pszParmName, pszParmValue));
7576
/***************************************************************************
7577
Print a parameter of the specified type.
7578
***************************************************************************/
7580
static void print_parameter(struct parm_struct *p, void *ptr, FILE * f)
7586
for (i = 0; p->enum_list[i].name; i++) {
7587
if (*(int *)ptr == p->enum_list[i].value) {
7589
p->enum_list[i].name);
7596
fprintf(f, "%s", BOOLSTR(*(bool *)ptr));
7600
fprintf(f, "%s", BOOLSTR(!*(bool *)ptr));
7604
fprintf(f, "%d", *(int *)ptr);
7608
fprintf(f, "%c", *(char *)ptr);
7612
char *o = octal_string(*(int *)ptr);
7613
fprintf(f, "%s", o);
7619
if ((char ***)ptr && *(char ***)ptr) {
7620
char **list = *(char ***)ptr;
7621
for (; *list; list++) {
7622
/* surround strings with whitespace in double quotes */
7623
if ( strchr_m( *list, ' ' ) )
7624
fprintf(f, "\"%s\"%s", *list, ((*(list+1))?", ":""));
7626
fprintf(f, "%s%s", *list, ((*(list+1))?", ":""));
7633
if (*(char **)ptr) {
7634
fprintf(f, "%s", *(char **)ptr);
7642
/***************************************************************************
7643
Check if two parameters are equal.
7644
***************************************************************************/
7646
static bool equal_parameter(parm_type type, void *ptr1, void *ptr2)
7651
return (*((bool *)ptr1) == *((bool *)ptr2));
7656
return (*((int *)ptr1) == *((int *)ptr2));
7659
return (*((char *)ptr1) == *((char *)ptr2));
7662
return str_list_equal(*(const char ***)ptr1, *(const char ***)ptr2);
7667
char *p1 = *(char **)ptr1, *p2 = *(char **)ptr2;
7672
return (p1 == p2 || strequal(p1, p2));
7680
/***************************************************************************
7681
Initialize any local varients in the sDefault table.
7682
***************************************************************************/
7684
void init_locals(void)
7689
/***************************************************************************
7690
Process a new section (service). At this stage all sections are services.
7691
Later we'll have special sections that permit server parameters to be set.
7692
Returns True on success, False on failure.
7693
***************************************************************************/
7695
static bool do_section(const char *pszSectionName, void *userdata)
7698
bool isglobal = ((strwicmp(pszSectionName, GLOBAL_NAME) == 0) ||
7699
(strwicmp(pszSectionName, GLOBAL_NAME2) == 0));
7702
/* if we were in a global section then do the local inits */
7703
if (bInGlobalSection && !isglobal)
7706
/* if we've just struck a global section, note the fact. */
7707
bInGlobalSection = isglobal;
7709
/* check for multiple global sections */
7710
if (bInGlobalSection) {
7711
DEBUG(3, ("Processing section \"[%s]\"\n", pszSectionName));
7715
if (!bInGlobalSection && bGlobalOnly)
7718
/* if we have a current service, tidy it up before moving on */
7721
if (iServiceIndex >= 0)
7722
bRetval = service_ok(iServiceIndex);
7724
/* if all is still well, move to the next record in the services array */
7726
/* We put this here to avoid an odd message order if messages are */
7727
/* issued by the post-processing of a previous section. */
7728
DEBUG(2, ("Processing section \"[%s]\"\n", pszSectionName));
7730
if ((iServiceIndex = add_a_service(&sDefault, pszSectionName))
7732
DEBUG(0, ("Failed to add a new service\n"));
7741
/***************************************************************************
7742
Determine if a partcular base parameter is currentl set to the default value.
7743
***************************************************************************/
7745
static bool is_default(int i)
7747
if (!defaults_saved)
7749
switch (parm_table[i].type) {
7751
return str_list_equal((const char **)parm_table[i].def.lvalue,
7752
*(const char ***)parm_table[i].ptr);
7755
return strequal(parm_table[i].def.svalue,
7756
*(char **)parm_table[i].ptr);
7759
return parm_table[i].def.bvalue ==
7760
*(bool *)parm_table[i].ptr;
7762
return parm_table[i].def.cvalue ==
7763
*(char *)parm_table[i].ptr;
7767
return parm_table[i].def.ivalue ==
7768
*(int *)parm_table[i].ptr;
7775
/***************************************************************************
7776
Display the contents of the global structure.
7777
***************************************************************************/
7779
static void dump_globals(FILE *f)
7782
struct param_opt_struct *data;
7784
fprintf(f, "[global]\n");
7786
for (i = 0; parm_table[i].label; i++)
7787
if (parm_table[i].p_class == P_GLOBAL &&
7788
!(parm_table[i].flags & FLAG_META) &&
7789
parm_table[i].ptr &&
7790
(i == 0 || (parm_table[i].ptr != parm_table[i - 1].ptr))) {
7791
if (defaults_saved && is_default(i))
7793
fprintf(f, "\t%s = ", parm_table[i].label);
7794
print_parameter(&parm_table[i], parm_table[i].ptr, f);
7797
if (Globals.param_opt != NULL) {
7798
data = Globals.param_opt;
7800
fprintf(f, "\t%s = %s\n", data->key, data->value);
7807
/***************************************************************************
7808
Return True if a local parameter is currently set to the global default.
7809
***************************************************************************/
7811
bool lp_is_default(int snum, struct parm_struct *parm)
7813
int pdiff = PTR_DIFF(parm->ptr, &sDefault);
7815
return equal_parameter(parm->type,
7816
((char *)ServicePtrs[snum]) + pdiff,
7817
((char *)&sDefault) + pdiff);
7820
/***************************************************************************
7821
Display the contents of a single services record.
7822
***************************************************************************/
7824
static void dump_a_service(struct service *pService, FILE * f)
7827
struct param_opt_struct *data;
7829
if (pService != &sDefault)
7830
fprintf(f, "[%s]\n", pService->szService);
7832
for (i = 0; parm_table[i].label; i++) {
7834
if (parm_table[i].p_class == P_LOCAL &&
7835
!(parm_table[i].flags & FLAG_META) &&
7836
parm_table[i].ptr &&
7837
(*parm_table[i].label != '-') &&
7838
(i == 0 || (parm_table[i].ptr != parm_table[i - 1].ptr)))
7841
int pdiff = PTR_DIFF(parm_table[i].ptr, &sDefault);
7843
if (pService == &sDefault) {
7844
if (defaults_saved && is_default(i))
7847
if (equal_parameter(parm_table[i].type,
7848
((char *)pService) +
7850
((char *)&sDefault) +
7855
fprintf(f, "\t%s = ", parm_table[i].label);
7856
print_parameter(&parm_table[i],
7857
((char *)pService) + pdiff, f);
7862
if (pService->param_opt != NULL) {
7863
data = pService->param_opt;
7865
fprintf(f, "\t%s = %s\n", data->key, data->value);
7871
/***************************************************************************
7872
Display the contents of a parameter of a single services record.
7873
***************************************************************************/
7875
bool dump_a_parameter(int snum, char *parm_name, FILE * f, bool isGlobal)
7878
bool result = False;
7881
fstring local_parm_name;
7883
const char *parm_opt_value;
7885
/* check for parametrical option */
7886
fstrcpy( local_parm_name, parm_name);
7887
parm_opt = strchr( local_parm_name, ':');
7892
if (strlen(parm_opt)) {
7893
parm_opt_value = lp_parm_const_string( snum,
7894
local_parm_name, parm_opt, NULL);
7895
if (parm_opt_value) {
7896
printf( "%s\n", parm_opt_value);
7903
/* check for a key and print the value */
7910
for (i = 0; parm_table[i].label; i++) {
7911
if (strwicmp(parm_table[i].label, parm_name) == 0 &&
7912
!(parm_table[i].flags & FLAG_META) &&
7913
(parm_table[i].p_class == p_class || parm_table[i].flags & flag) &&
7914
parm_table[i].ptr &&
7915
(*parm_table[i].label != '-') &&
7916
(i == 0 || (parm_table[i].ptr != parm_table[i - 1].ptr)))
7921
ptr = parm_table[i].ptr;
7923
struct service *pService = ServicePtrs[snum];
7924
ptr = ((char *)pService) +
7925
PTR_DIFF(parm_table[i].ptr, &sDefault);
7928
print_parameter(&parm_table[i],
7939
/***************************************************************************
7940
Return info about the requested parameter (given as a string).
7941
Return NULL when the string is not a valid parameter name.
7942
***************************************************************************/
7944
struct parm_struct *lp_get_parameter(const char *param_name)
7946
int num = map_parameter(param_name);
7952
return &parm_table[num];
7955
/***************************************************************************
7956
Return info about the next parameter in a service.
7957
snum==GLOBAL_SECTION_SNUM gives the globals.
7958
Return NULL when out of parameters.
7959
***************************************************************************/
7961
struct parm_struct *lp_next_parameter(int snum, int *i, int allparameters)
7964
/* do the globals */
7965
for (; parm_table[*i].label; (*i)++) {
7966
if (parm_table[*i].p_class == P_SEPARATOR)
7967
return &parm_table[(*i)++];
7969
if (!parm_table[*i].ptr
7970
|| (*parm_table[*i].label == '-'))
7974
&& (parm_table[*i].ptr ==
7975
parm_table[(*i) - 1].ptr))
7978
if (is_default(*i) && !allparameters)
7981
return &parm_table[(*i)++];
7984
struct service *pService = ServicePtrs[snum];
7986
for (; parm_table[*i].label; (*i)++) {
7987
if (parm_table[*i].p_class == P_SEPARATOR)
7988
return &parm_table[(*i)++];
7990
if (parm_table[*i].p_class == P_LOCAL &&
7991
parm_table[*i].ptr &&
7992
(*parm_table[*i].label != '-') &&
7994
(parm_table[*i].ptr !=
7995
parm_table[(*i) - 1].ptr)))
7998
PTR_DIFF(parm_table[*i].ptr,
8001
if (allparameters ||
8002
!equal_parameter(parm_table[*i].type,
8003
((char *)pService) +
8005
((char *)&sDefault) +
8008
return &parm_table[(*i)++];
8019
/***************************************************************************
8020
Display the contents of a single copy structure.
8021
***************************************************************************/
8022
static void dump_copy_map(bool *pcopymap)
8028
printf("\n\tNon-Copied parameters:\n");
8030
for (i = 0; parm_table[i].label; i++)
8031
if (parm_table[i].p_class == P_LOCAL &&
8032
parm_table[i].ptr && !pcopymap[i] &&
8033
(i == 0 || (parm_table[i].ptr != parm_table[i - 1].ptr)))
8035
printf("\t\t%s\n", parm_table[i].label);
8040
/***************************************************************************
8041
Return TRUE if the passed service number is within range.
8042
***************************************************************************/
8044
bool lp_snum_ok(int iService)
8046
return (LP_SNUM_OK(iService) && ServicePtrs[iService]->bAvailable);
8049
/***************************************************************************
8050
Auto-load some home services.
8051
***************************************************************************/
8053
static void lp_add_auto_services(char *str)
8063
s = SMB_STRDUP(str);
8067
homes = lp_servicenumber(HOMES_NAME);
8069
for (p = strtok_r(s, LIST_SEP, &saveptr); p;
8070
p = strtok_r(NULL, LIST_SEP, &saveptr)) {
8073
if (lp_servicenumber(p) >= 0)
8076
home = get_user_home_dir(talloc_tos(), p);
8078
if (home && home[0] && homes >= 0)
8079
lp_add_home(p, homes, p, home);
8086
/***************************************************************************
8087
Auto-load one printer.
8088
***************************************************************************/
8090
void lp_add_one_printer(const char *name, const char *comment, void *pdata)
8092
int printers = lp_servicenumber(PRINTERS_NAME);
8095
if (lp_servicenumber(name) < 0) {
8096
lp_add_printer(name, printers);
8097
if ((i = lp_servicenumber(name)) >= 0) {
8098
string_set(&ServicePtrs[i]->comment, comment);
8099
ServicePtrs[i]->autoloaded = True;
8104
/***************************************************************************
8105
Have we loaded a services file yet?
8106
***************************************************************************/
8108
bool lp_loaded(void)
8113
/***************************************************************************
8114
Unload unused services.
8115
***************************************************************************/
8117
void lp_killunused(bool (*snumused) (int))
8120
for (i = 0; i < iNumServices; i++) {
8124
/* don't kill autoloaded or usershare services */
8125
if ( ServicePtrs[i]->autoloaded ||
8126
ServicePtrs[i]->usershare == USERSHARE_VALID) {
8130
if (!snumused || !snumused(i)) {
8131
free_service_byindex(i);
8137
* Kill all except autoloaded and usershare services - convenience wrapper
8139
void lp_kill_all_services(void)
8141
lp_killunused(NULL);
8144
/***************************************************************************
8146
***************************************************************************/
8148
void lp_killservice(int iServiceIn)
8150
if (VALID(iServiceIn)) {
8151
free_service_byindex(iServiceIn);
8155
/***************************************************************************
8156
Save the curent values of all global and sDefault parameters into the
8157
defaults union. This allows swat and testparm to show only the
8158
changed (ie. non-default) parameters.
8159
***************************************************************************/
8161
static void lp_save_defaults(void)
8164
for (i = 0; parm_table[i].label; i++) {
8165
if (i > 0 && parm_table[i].ptr == parm_table[i - 1].ptr)
8167
switch (parm_table[i].type) {
8169
parm_table[i].def.lvalue = str_list_copy(
8170
NULL, *(const char ***)parm_table[i].ptr);
8174
if (parm_table[i].ptr) {
8175
parm_table[i].def.svalue = SMB_STRDUP(*(char **)parm_table[i].ptr);
8177
parm_table[i].def.svalue = NULL;
8182
parm_table[i].def.bvalue =
8183
*(bool *)parm_table[i].ptr;
8186
parm_table[i].def.cvalue =
8187
*(char *)parm_table[i].ptr;
8192
parm_table[i].def.ivalue =
8193
*(int *)parm_table[i].ptr;
8199
defaults_saved = True;
8202
/*******************************************************************
8203
Set the server type we will announce as via nmbd.
8204
********************************************************************/
8206
static const struct srv_role_tab {
8208
const char *role_str;
8209
} srv_role_tab [] = {
8210
{ ROLE_STANDALONE, "ROLE_STANDALONE" },
8211
{ ROLE_DOMAIN_MEMBER, "ROLE_DOMAIN_MEMBER" },
8212
{ ROLE_DOMAIN_BDC, "ROLE_DOMAIN_BDC" },
8213
{ ROLE_DOMAIN_PDC, "ROLE_DOMAIN_PDC" },
8217
const char* server_role_str(uint32 role)
8220
for (i=0; srv_role_tab[i].role_str; i++) {
8221
if (role == srv_role_tab[i].role) {
8222
return srv_role_tab[i].role_str;
8228
static void set_server_role(void)
8230
server_role = ROLE_STANDALONE;
8232
switch (lp_security()) {
8234
if (lp_domain_logons())
8235
DEBUG(0, ("Server's Role (logon server) conflicts with share-level security\n"));
8238
if (lp_domain_logons())
8239
DEBUG(0, ("Server's Role (logon server) conflicts with server-level security\n"));
8240
/* this used to be considered ROLE_DOMAIN_MEMBER but that's just wrong */
8241
server_role = ROLE_STANDALONE;
8244
if (lp_domain_logons()) {
8245
DEBUG(1, ("Server's Role (logon server) NOT ADVISED with domain-level security\n"));
8246
server_role = ROLE_DOMAIN_BDC;
8249
server_role = ROLE_DOMAIN_MEMBER;
8252
if (lp_domain_logons()) {
8253
server_role = ROLE_DOMAIN_PDC;
8256
server_role = ROLE_DOMAIN_MEMBER;
8259
if (lp_domain_logons()) {
8261
if (Globals.iDomainMaster) /* auto or yes */
8262
server_role = ROLE_DOMAIN_PDC;
8264
server_role = ROLE_DOMAIN_BDC;
8268
DEBUG(0, ("Server's Role undefined due to unknown security mode\n"));
8272
DEBUG(10, ("set_server_role: role = %s\n", server_role_str(server_role)));
8275
/***********************************************************
8276
If we should send plaintext/LANMAN passwords in the clinet
8277
************************************************************/
8279
static void set_allowed_client_auth(void)
8281
if (Globals.bClientNTLMv2Auth) {
8282
Globals.bClientLanManAuth = False;
8284
if (!Globals.bClientLanManAuth) {
8285
Globals.bClientPlaintextAuth = False;
8289
/***************************************************************************
8291
The following code allows smbd to read a user defined share file.
8292
Yes, this is my intent. Yes, I'm comfortable with that...
8294
THE FOLLOWING IS SECURITY CRITICAL CODE.
8296
It washes your clothes, it cleans your house, it guards you while you sleep...
8297
Do not f%^k with it....
8298
***************************************************************************/
8300
#define MAX_USERSHARE_FILE_SIZE (10*1024)
8302
/***************************************************************************
8303
Check allowed stat state of a usershare file.
8304
Ensure we print out who is dicking with us so the admin can
8305
get their sorry ass fired.
8306
***************************************************************************/
8308
static bool check_usershare_stat(const char *fname, SMB_STRUCT_STAT *psbuf)
8310
if (!S_ISREG(psbuf->st_mode)) {
8311
DEBUG(0,("check_usershare_stat: file %s owned by uid %u is "
8312
"not a regular file\n",
8313
fname, (unsigned int)psbuf->st_uid ));
8317
/* Ensure this doesn't have the other write bit set. */
8318
if (psbuf->st_mode & S_IWOTH) {
8319
DEBUG(0,("check_usershare_stat: file %s owned by uid %u allows "
8320
"public write. Refusing to allow as a usershare file.\n",
8321
fname, (unsigned int)psbuf->st_uid ));
8325
/* Should be 10k or less. */
8326
if (psbuf->st_size > MAX_USERSHARE_FILE_SIZE) {
8327
DEBUG(0,("check_usershare_stat: file %s owned by uid %u is "
8328
"too large (%u) to be a user share file.\n",
8329
fname, (unsigned int)psbuf->st_uid,
8330
(unsigned int)psbuf->st_size ));
8337
/***************************************************************************
8338
Parse the contents of a usershare file.
8339
***************************************************************************/
8341
enum usershare_err parse_usershare_file(TALLOC_CTX *ctx,
8342
SMB_STRUCT_STAT *psbuf,
8343
const char *servicename,
8347
char **pp_sharepath,
8352
const char **prefixallowlist = lp_usershare_prefix_allow_list();
8353
const char **prefixdenylist = lp_usershare_prefix_deny_list();
8356
SMB_STRUCT_STAT sbuf;
8357
char *sharepath = NULL;
8358
char *comment = NULL;
8360
*pp_sharepath = NULL;
8363
*pallow_guest = False;
8366
return USERSHARE_MALFORMED_FILE;
8369
if (strcmp(lines[0], "#VERSION 1") == 0) {
8371
} else if (strcmp(lines[0], "#VERSION 2") == 0) {
8374
return USERSHARE_MALFORMED_FILE;
8377
return USERSHARE_BAD_VERSION;
8380
if (strncmp(lines[1], "path=", 5) != 0) {
8381
return USERSHARE_MALFORMED_PATH;
8384
sharepath = talloc_strdup(ctx, &lines[1][5]);
8386
return USERSHARE_POSIX_ERR;
8388
trim_string(sharepath, " ", " ");
8390
if (strncmp(lines[2], "comment=", 8) != 0) {
8391
return USERSHARE_MALFORMED_COMMENT_DEF;
8394
comment = talloc_strdup(ctx, &lines[2][8]);
8396
return USERSHARE_POSIX_ERR;
8398
trim_string(comment, " ", " ");
8399
trim_char(comment, '"', '"');
8401
if (strncmp(lines[3], "usershare_acl=", 14) != 0) {
8402
return USERSHARE_MALFORMED_ACL_DEF;
8405
if (!parse_usershare_acl(ctx, &lines[3][14], ppsd)) {
8406
return USERSHARE_ACL_ERR;
8410
if (strncmp(lines[4], "guest_ok=", 9) != 0) {
8411
return USERSHARE_MALFORMED_ACL_DEF;
8413
if (lines[4][9] == 'y') {
8414
*pallow_guest = True;
8418
if (snum != -1 && (strcmp(sharepath, ServicePtrs[snum]->szPath) == 0)) {
8419
/* Path didn't change, no checks needed. */
8420
*pp_sharepath = sharepath;
8421
*pp_comment = comment;
8422
return USERSHARE_OK;
8425
/* The path *must* be absolute. */
8426
if (sharepath[0] != '/') {
8427
DEBUG(2,("parse_usershare_file: share %s: path %s is not an absolute path.\n",
8428
servicename, sharepath));
8429
return USERSHARE_PATH_NOT_ABSOLUTE;
8432
/* If there is a usershare prefix deny list ensure one of these paths
8433
doesn't match the start of the user given path. */
8434
if (prefixdenylist) {
8436
for ( i=0; prefixdenylist[i]; i++ ) {
8437
DEBUG(10,("parse_usershare_file: share %s : checking prefixdenylist[%d]='%s' against %s\n",
8438
servicename, i, prefixdenylist[i], sharepath ));
8439
if (memcmp( sharepath, prefixdenylist[i], strlen(prefixdenylist[i])) == 0) {
8440
DEBUG(2,("parse_usershare_file: share %s path %s starts with one of the "
8441
"usershare prefix deny list entries.\n",
8442
servicename, sharepath));
8443
return USERSHARE_PATH_IS_DENIED;
8448
/* If there is a usershare prefix allow list ensure one of these paths
8449
does match the start of the user given path. */
8451
if (prefixallowlist) {
8453
for ( i=0; prefixallowlist[i]; i++ ) {
8454
DEBUG(10,("parse_usershare_file: share %s checking prefixallowlist[%d]='%s' against %s\n",
8455
servicename, i, prefixallowlist[i], sharepath ));
8456
if (memcmp( sharepath, prefixallowlist[i], strlen(prefixallowlist[i])) == 0) {
8460
if (prefixallowlist[i] == NULL) {
8461
DEBUG(2,("parse_usershare_file: share %s path %s doesn't start with one of the "
8462
"usershare prefix allow list entries.\n",
8463
servicename, sharepath));
8464
return USERSHARE_PATH_NOT_ALLOWED;
8468
/* Ensure this is pointing to a directory. */
8469
dp = sys_opendir(sharepath);
8472
DEBUG(2,("parse_usershare_file: share %s path %s is not a directory.\n",
8473
servicename, sharepath));
8474
return USERSHARE_PATH_NOT_DIRECTORY;
8477
/* Ensure the owner of the usershare file has permission to share
8480
if (sys_stat(sharepath, &sbuf) == -1) {
8481
DEBUG(2,("parse_usershare_file: share %s : stat failed on path %s. %s\n",
8482
servicename, sharepath, strerror(errno) ));
8484
return USERSHARE_POSIX_ERR;
8489
if (!S_ISDIR(sbuf.st_mode)) {
8490
DEBUG(2,("parse_usershare_file: share %s path %s is not a directory.\n",
8491
servicename, sharepath ));
8492
return USERSHARE_PATH_NOT_DIRECTORY;
8495
/* Check if sharing is restricted to owner-only. */
8496
/* psbuf is the stat of the usershare definition file,
8497
sbuf is the stat of the target directory to be shared. */
8499
if (lp_usershare_owner_only()) {
8500
/* root can share anything. */
8501
if ((psbuf->st_uid != 0) && (sbuf.st_uid != psbuf->st_uid)) {
8502
return USERSHARE_PATH_NOT_ALLOWED;
8506
*pp_sharepath = sharepath;
8507
*pp_comment = comment;
8508
return USERSHARE_OK;
8511
/***************************************************************************
8512
Deal with a usershare file.
8515
-1 - Bad name, invalid contents.
8516
- service name already existed and not a usershare, problem
8517
with permissions to share directory etc.
8518
***************************************************************************/
8520
static int process_usershare_file(const char *dir_name, const char *file_name, int snum_template)
8522
SMB_STRUCT_STAT sbuf;
8523
SMB_STRUCT_STAT lsbuf;
8525
char *sharepath = NULL;
8526
char *comment = NULL;
8527
fstring service_name;
8528
char **lines = NULL;
8532
TALLOC_CTX *ctx = NULL;
8533
SEC_DESC *psd = NULL;
8534
bool guest_ok = False;
8536
/* Ensure share name doesn't contain invalid characters. */
8537
if (!validate_net_name(file_name, INVALID_SHARENAME_CHARS, strlen(file_name))) {
8538
DEBUG(0,("process_usershare_file: share name %s contains "
8539
"invalid characters (any of %s)\n",
8540
file_name, INVALID_SHARENAME_CHARS ));
8544
fstrcpy(service_name, file_name);
8546
if (asprintf(&fname, "%s/%s", dir_name, file_name) < 0) {
8549
/* Minimize the race condition by doing an lstat before we
8550
open and fstat. Ensure this isn't a symlink link. */
8552
if (sys_lstat(fname, &lsbuf) != 0) {
8553
DEBUG(0,("process_usershare_file: stat of %s failed. %s\n",
8554
fname, strerror(errno) ));
8559
/* This must be a regular file, not a symlink, directory or
8560
other strange filetype. */
8561
if (!check_usershare_stat(fname, &lsbuf)) {
8567
char *canon_name = canonicalize_servicename(service_name);
8568
TDB_DATA data = dbwrap_fetch_bystring(
8569
ServiceHash, canon_name, canon_name);
8573
if ((data.dptr != NULL) && (data.dsize == sizeof(iService))) {
8574
iService = *(int *)data.dptr;
8576
TALLOC_FREE(canon_name);
8579
if (iService != -1 && ServicePtrs[iService]->usershare_last_mod == lsbuf.st_mtime) {
8580
/* Nothing changed - Mark valid and return. */
8581
DEBUG(10,("process_usershare_file: service %s not changed.\n",
8583
ServicePtrs[iService]->usershare = USERSHARE_VALID;
8588
/* Try and open the file read only - no symlinks allowed. */
8590
fd = sys_open(fname, O_RDONLY|O_NOFOLLOW, 0);
8592
fd = sys_open(fname, O_RDONLY, 0);
8596
DEBUG(0,("process_usershare_file: unable to open %s. %s\n",
8597
fname, strerror(errno) ));
8602
/* Now fstat to be *SURE* it's a regular file. */
8603
if (sys_fstat(fd, &sbuf) != 0) {
8605
DEBUG(0,("process_usershare_file: fstat of %s failed. %s\n",
8606
fname, strerror(errno) ));
8611
/* Is it the same dev/inode as was lstated ? */
8612
if (lsbuf.st_dev != sbuf.st_dev || lsbuf.st_ino != sbuf.st_ino) {
8614
DEBUG(0,("process_usershare_file: fstat of %s is a different file from lstat. "
8615
"Symlink spoofing going on ?\n", fname ));
8620
/* This must be a regular file, not a symlink, directory or
8621
other strange filetype. */
8622
if (!check_usershare_stat(fname, &sbuf)) {
8627
lines = fd_lines_load(fd, &numlines, MAX_USERSHARE_FILE_SIZE, NULL);
8630
if (lines == NULL) {
8631
DEBUG(0,("process_usershare_file: loading file %s owned by %u failed.\n",
8632
fname, (unsigned int)sbuf.st_uid ));
8639
/* Should we allow printers to be shared... ? */
8640
ctx = talloc_init("usershare_sd_xctx");
8646
if (parse_usershare_file(ctx, &sbuf, service_name,
8647
iService, lines, numlines, &sharepath,
8648
&comment, &psd, &guest_ok) != USERSHARE_OK) {
8649
talloc_destroy(ctx);
8656
/* Everything ok - add the service possibly using a template. */
8658
const struct service *sp = &sDefault;
8659
if (snum_template != -1) {
8660
sp = ServicePtrs[snum_template];
8663
if ((iService = add_a_service(sp, service_name)) < 0) {
8664
DEBUG(0, ("process_usershare_file: Failed to add "
8665
"new service %s\n", service_name));
8666
talloc_destroy(ctx);
8670
/* Read only is controlled by usershare ACL below. */
8671
ServicePtrs[iService]->bRead_only = False;
8674
/* Write the ACL of the new/modified share. */
8675
if (!set_share_security(service_name, psd)) {
8676
DEBUG(0, ("process_usershare_file: Failed to set share "
8677
"security for user share %s\n",
8679
lp_remove_service(iService);
8680
talloc_destroy(ctx);
8684
/* If from a template it may be marked invalid. */
8685
ServicePtrs[iService]->valid = True;
8687
/* Set the service as a valid usershare. */
8688
ServicePtrs[iService]->usershare = USERSHARE_VALID;
8690
/* Set guest access. */
8691
if (lp_usershare_allow_guests()) {
8692
ServicePtrs[iService]->bGuest_ok = guest_ok;
8695
/* And note when it was loaded. */
8696
ServicePtrs[iService]->usershare_last_mod = sbuf.st_mtime;
8697
string_set(&ServicePtrs[iService]->szPath, sharepath);
8698
string_set(&ServicePtrs[iService]->comment, comment);
8700
talloc_destroy(ctx);
8705
/***************************************************************************
8706
Checks if a usershare entry has been modified since last load.
8707
***************************************************************************/
8709
static bool usershare_exists(int iService, time_t *last_mod)
8711
SMB_STRUCT_STAT lsbuf;
8712
const char *usersharepath = Globals.szUsersharePath;
8715
if (asprintf(&fname, "%s/%s",
8717
ServicePtrs[iService]->szService) < 0) {
8721
if (sys_lstat(fname, &lsbuf) != 0) {
8726
if (!S_ISREG(lsbuf.st_mode)) {
8732
*last_mod = lsbuf.st_mtime;
8736
/***************************************************************************
8737
Load a usershare service by name. Returns a valid servicenumber or -1.
8738
***************************************************************************/
8740
int load_usershare_service(const char *servicename)
8742
SMB_STRUCT_STAT sbuf;
8743
const char *usersharepath = Globals.szUsersharePath;
8744
int max_user_shares = Globals.iUsershareMaxShares;
8745
int snum_template = -1;
8747
if (*usersharepath == 0 || max_user_shares == 0) {
8751
if (sys_stat(usersharepath, &sbuf) != 0) {
8752
DEBUG(0,("load_usershare_service: stat of %s failed. %s\n",
8753
usersharepath, strerror(errno) ));
8757
if (!S_ISDIR(sbuf.st_mode)) {
8758
DEBUG(0,("load_usershare_service: %s is not a directory.\n",
8764
* This directory must be owned by root, and have the 't' bit set.
8765
* It also must not be writable by "other".
8769
if (sbuf.st_uid != 0 || !(sbuf.st_mode & S_ISVTX) || (sbuf.st_mode & S_IWOTH)) {
8771
if (sbuf.st_uid != 0 || (sbuf.st_mode & S_IWOTH)) {
8773
DEBUG(0,("load_usershare_service: directory %s is not owned by root "
8774
"or does not have the sticky bit 't' set or is writable by anyone.\n",
8779
/* Ensure the template share exists if it's set. */
8780
if (Globals.szUsershareTemplateShare[0]) {
8781
/* We can't use lp_servicenumber here as we are recommending that
8782
template shares have -valid=False set. */
8783
for (snum_template = iNumServices - 1; snum_template >= 0; snum_template--) {
8784
if (ServicePtrs[snum_template]->szService &&
8785
strequal(ServicePtrs[snum_template]->szService,
8786
Globals.szUsershareTemplateShare)) {
8791
if (snum_template == -1) {
8792
DEBUG(0,("load_usershare_service: usershare template share %s "
8793
"does not exist.\n",
8794
Globals.szUsershareTemplateShare ));
8799
return process_usershare_file(usersharepath, servicename, snum_template);
8802
/***************************************************************************
8803
Load all user defined shares from the user share directory.
8804
We only do this if we're enumerating the share list.
8805
This is the function that can delete usershares that have
8807
***************************************************************************/
8809
int load_usershare_shares(void)
8812
SMB_STRUCT_STAT sbuf;
8813
SMB_STRUCT_DIRENT *de;
8814
int num_usershares = 0;
8815
int max_user_shares = Globals.iUsershareMaxShares;
8816
unsigned int num_dir_entries, num_bad_dir_entries, num_tmp_dir_entries;
8817
unsigned int allowed_bad_entries = ((2*max_user_shares)/10);
8818
unsigned int allowed_tmp_entries = ((2*max_user_shares)/10);
8820
int snum_template = -1;
8821
const char *usersharepath = Globals.szUsersharePath;
8822
int ret = lp_numservices();
8824
if (max_user_shares == 0 || *usersharepath == '\0') {
8825
return lp_numservices();
8828
if (sys_stat(usersharepath, &sbuf) != 0) {
8829
DEBUG(0,("load_usershare_shares: stat of %s failed. %s\n",
8830
usersharepath, strerror(errno) ));
8835
* This directory must be owned by root, and have the 't' bit set.
8836
* It also must not be writable by "other".
8840
if (sbuf.st_uid != 0 || !(sbuf.st_mode & S_ISVTX) || (sbuf.st_mode & S_IWOTH)) {
8842
if (sbuf.st_uid != 0 || (sbuf.st_mode & S_IWOTH)) {
8844
DEBUG(0,("load_usershare_shares: directory %s is not owned by root "
8845
"or does not have the sticky bit 't' set or is writable by anyone.\n",
8850
/* Ensure the template share exists if it's set. */
8851
if (Globals.szUsershareTemplateShare[0]) {
8852
/* We can't use lp_servicenumber here as we are recommending that
8853
template shares have -valid=False set. */
8854
for (snum_template = iNumServices - 1; snum_template >= 0; snum_template--) {
8855
if (ServicePtrs[snum_template]->szService &&
8856
strequal(ServicePtrs[snum_template]->szService,
8857
Globals.szUsershareTemplateShare)) {
8862
if (snum_template == -1) {
8863
DEBUG(0,("load_usershare_shares: usershare template share %s "
8864
"does not exist.\n",
8865
Globals.szUsershareTemplateShare ));
8870
/* Mark all existing usershares as pending delete. */
8871
for (iService = iNumServices - 1; iService >= 0; iService--) {
8872
if (VALID(iService) && ServicePtrs[iService]->usershare) {
8873
ServicePtrs[iService]->usershare = USERSHARE_PENDING_DELETE;
8877
dp = sys_opendir(usersharepath);
8879
DEBUG(0,("load_usershare_shares:: failed to open directory %s. %s\n",
8880
usersharepath, strerror(errno) ));
8884
for (num_dir_entries = 0, num_bad_dir_entries = 0, num_tmp_dir_entries = 0;
8885
(de = sys_readdir(dp));
8886
num_dir_entries++ ) {
8888
const char *n = de->d_name;
8890
/* Ignore . and .. */
8892
if ((n[1] == '\0') || (n[1] == '.' && n[2] == '\0')) {
8898
/* Temporary file used when creating a share. */
8899
num_tmp_dir_entries++;
8902
/* Allow 20% tmp entries. */
8903
if (num_tmp_dir_entries > allowed_tmp_entries) {
8904
DEBUG(0,("load_usershare_shares: too many temp entries (%u) "
8905
"in directory %s\n",
8906
num_tmp_dir_entries, usersharepath));
8910
r = process_usershare_file(usersharepath, n, snum_template);
8912
/* Update the services count. */
8914
if (num_usershares >= max_user_shares) {
8915
DEBUG(0,("load_usershare_shares: max user shares reached "
8916
"on file %s in directory %s\n",
8917
n, usersharepath ));
8920
} else if (r == -1) {
8921
num_bad_dir_entries++;
8924
/* Allow 20% bad entries. */
8925
if (num_bad_dir_entries > allowed_bad_entries) {
8926
DEBUG(0,("load_usershare_shares: too many bad entries (%u) "
8927
"in directory %s\n",
8928
num_bad_dir_entries, usersharepath));
8932
/* Allow 20% bad entries. */
8933
if (num_dir_entries > max_user_shares + allowed_bad_entries) {
8934
DEBUG(0,("load_usershare_shares: too many total entries (%u) "
8935
"in directory %s\n",
8936
num_dir_entries, usersharepath));
8943
/* Sweep through and delete any non-refreshed usershares that are
8944
not currently in use. */
8945
for (iService = iNumServices - 1; iService >= 0; iService--) {
8946
if (VALID(iService) && (ServicePtrs[iService]->usershare == USERSHARE_PENDING_DELETE)) {
8947
if (conn_snum_used(iService)) {
8950
/* Remove from the share ACL db. */
8951
DEBUG(10,("load_usershare_shares: Removing deleted usershare %s\n",
8952
lp_servicename(iService) ));
8953
delete_share_security(lp_servicename(iService));
8954
free_service_byindex(iService);
8958
return lp_numservices();
8961
/********************************************************
8962
Destroy global resources allocated in this file
8963
********************************************************/
8965
void gfree_loadparm(void)
8971
/* Free resources allocated to services */
8973
for ( i = 0; i < iNumServices; i++ ) {
8975
free_service_byindex(i);
8979
SAFE_FREE( ServicePtrs );
8982
/* Now release all resources allocated to global
8983
parameters and the default service */
8985
free_global_parameters();
8989
/***************************************************************************
8990
Allow client apps to specify that they are a client
8991
***************************************************************************/
8992
void lp_set_in_client(bool b)
8998
/***************************************************************************
8999
Determine if we're running in a client app
9000
***************************************************************************/
9001
bool lp_is_in_client(void)
9006
/***************************************************************************
9007
Load the services array from the services file. Return True on success,
9009
***************************************************************************/
9011
bool lp_load_ex(const char *pszFname,
9015
bool initialize_globals,
9016
bool allow_include_registry,
9017
bool allow_registry_shares)
9024
DEBUG(3, ("lp_load_ex: refreshing parameters\n"));
9026
bInGlobalSection = True;
9027
bGlobalOnly = global_only;
9028
bAllowIncludeRegistry = allow_include_registry;
9030
init_globals(! initialize_globals);
9035
if (save_defaults) {
9040
free_param_opts(&Globals.param_opt);
9042
/* We get sections first, so have to start 'behind' to make up */
9045
if (lp_config_backend_is_file()) {
9046
n2 = alloc_sub_basic(get_current_username(),
9047
current_user_info.domain,
9050
smb_panic("lp_load_ex: out of memory");
9053
add_to_file_list(pszFname, n2);
9055
bRetval = pm_process(n2, do_section, do_parameter, NULL);
9058
/* finish up the last section */
9059
DEBUG(4, ("pm_process() returned %s\n", BOOLSTR(bRetval)));
9061
if (iServiceIndex >= 0) {
9062
bRetval = service_ok(iServiceIndex);
9066
if (lp_config_backend_is_registry()) {
9067
/* config backend changed to registry in config file */
9069
* We need to use this extra global variable here to
9070
* survive restart: init_globals uses this as a default
9071
* for ConfigBackend. Otherwise, init_globals would
9072
* send us into an endless loop here.
9074
config_backend = CONFIG_BACKEND_REGISTRY;
9076
DEBUG(1, ("lp_load_ex: changing to config backend "
9078
init_globals(false);
9079
lp_kill_all_services();
9080
return lp_load_ex(pszFname, global_only, save_defaults,
9081
add_ipc, initialize_globals,
9082
allow_include_registry,
9083
allow_registry_shares);
9085
} else if (lp_config_backend_is_registry()) {
9086
bRetval = process_registry_globals();
9088
DEBUG(0, ("Illegal config backend given: %d\n",
9089
lp_config_backend()));
9093
if (bRetval && lp_registry_shares() && allow_registry_shares) {
9094
bRetval = process_registry_shares();
9097
lp_add_auto_services(lp_auto_services());
9100
/* When 'restrict anonymous = 2' guest connections to ipc$
9102
lp_add_ipc("IPC$", (lp_restrict_anonymous() < 2));
9103
if ( lp_enable_asu_support() ) {
9104
lp_add_ipc("ADMIN$", false);
9109
set_default_server_announce_type();
9110
set_allowed_client_auth();
9114
/* Now we check bWINSsupport and set szWINSserver to 127.0.0.1 */
9115
/* if bWINSsupport is true and we are in the client */
9116
if (lp_is_in_client() && Globals.bWINSsupport) {
9117
lp_do_parameter(GLOBAL_SECTION_SNUM, "wins server", "127.0.0.1");
9122
bAllowIncludeRegistry = true;
9127
bool lp_load(const char *pszFname,
9131
bool initialize_globals)
9133
return lp_load_ex(pszFname,
9141
bool lp_load_initial_only(const char *pszFname)
9143
return lp_load_ex(pszFname,
9152
bool lp_load_with_registry_shares(const char *pszFname,
9156
bool initialize_globals)
9158
return lp_load_ex(pszFname,
9167
/***************************************************************************
9168
Return the max number of services.
9169
***************************************************************************/
9171
int lp_numservices(void)
9173
return (iNumServices);
9176
/***************************************************************************
9177
Display the contents of the services array in human-readable form.
9178
***************************************************************************/
9180
void lp_dump(FILE *f, bool show_defaults, int maxtoprint)
9185
defaults_saved = False;
9189
dump_a_service(&sDefault, f);
9191
for (iService = 0; iService < maxtoprint; iService++) {
9193
lp_dump_one(f, show_defaults, iService);
9197
/***************************************************************************
9198
Display the contents of one service in human-readable form.
9199
***************************************************************************/
9201
void lp_dump_one(FILE * f, bool show_defaults, int snum)
9204
if (ServicePtrs[snum]->szService[0] == '\0')
9206
dump_a_service(ServicePtrs[snum], f);
9210
/***************************************************************************
9211
Return the number of the service with the given name, or -1 if it doesn't
9212
exist. Note that this is a DIFFERENT ANIMAL from the internal function
9213
getservicebyname()! This works ONLY if all services have been loaded, and
9214
does not copy the found service.
9215
***************************************************************************/
9217
int lp_servicenumber(const char *pszServiceName)
9220
fstring serviceName;
9222
if (!pszServiceName) {
9223
return GLOBAL_SECTION_SNUM;
9226
for (iService = iNumServices - 1; iService >= 0; iService--) {
9227
if (VALID(iService) && ServicePtrs[iService]->szService) {
9229
* The substitution here is used to support %U is
9232
fstrcpy(serviceName, ServicePtrs[iService]->szService);
9233
standard_sub_basic(get_current_username(),
9234
current_user_info.domain,
9235
serviceName,sizeof(serviceName));
9236
if (strequal(serviceName, pszServiceName)) {
9242
if (iService >= 0 && ServicePtrs[iService]->usershare == USERSHARE_VALID) {
9245
if (!usershare_exists(iService, &last_mod)) {
9246
/* Remove the share security tdb entry for it. */
9247
delete_share_security(lp_servicename(iService));
9248
/* Remove it from the array. */
9249
free_service_byindex(iService);
9250
/* Doesn't exist anymore. */
9251
return GLOBAL_SECTION_SNUM;
9254
/* Has it been modified ? If so delete and reload. */
9255
if (ServicePtrs[iService]->usershare_last_mod < last_mod) {
9256
/* Remove it from the array. */
9257
free_service_byindex(iService);
9258
/* and now reload it. */
9259
iService = load_usershare_service(pszServiceName);
9264
DEBUG(7,("lp_servicenumber: couldn't find %s\n", pszServiceName));
9265
return GLOBAL_SECTION_SNUM;
9271
bool share_defined(const char *service_name)
9273
return (lp_servicenumber(service_name) != -1);
9276
struct share_params *get_share_params(TALLOC_CTX *mem_ctx,
9277
const char *sharename)
9279
struct share_params *result;
9283
if (!(sname = SMB_STRDUP(sharename))) {
9287
snum = find_service(sname);
9294
if (!(result = TALLOC_P(mem_ctx, struct share_params))) {
9295
DEBUG(0, ("talloc failed\n"));
9299
result->service = snum;
9303
struct share_iterator *share_list_all(TALLOC_CTX *mem_ctx)
9305
struct share_iterator *result;
9307
if (!(result = TALLOC_P(mem_ctx, struct share_iterator))) {
9308
DEBUG(0, ("talloc failed\n"));
9312
result->next_id = 0;
9316
struct share_params *next_share(struct share_iterator *list)
9318
struct share_params *result;
9320
while (!lp_snum_ok(list->next_id) &&
9321
(list->next_id < lp_numservices())) {
9325
if (list->next_id >= lp_numservices()) {
9329
if (!(result = TALLOC_P(list, struct share_params))) {
9330
DEBUG(0, ("talloc failed\n"));
9334
result->service = list->next_id;
9339
struct share_params *next_printer(struct share_iterator *list)
9341
struct share_params *result;
9343
while ((result = next_share(list)) != NULL) {
9344
if (lp_print_ok(result->service)) {
9352
* This is a hack for a transition period until we transformed all code from
9353
* service numbers to struct share_params.
9356
struct share_params *snum2params_static(int snum)
9358
static struct share_params result;
9359
result.service = snum;
9363
/*******************************************************************
9364
A useful volume label function.
9365
********************************************************************/
9367
const char *volume_label(int snum)
9370
const char *label = lp_volume(snum);
9372
label = lp_servicename(snum);
9375
/* This returns a 33 byte guarenteed null terminated string. */
9376
ret = talloc_strndup(talloc_tos(), label, 32);
9383
/*******************************************************************
9384
Set the server type we will announce as via nmbd.
9385
********************************************************************/
9387
static void set_default_server_announce_type(void)
9389
default_server_announce = 0;
9390
default_server_announce |= SV_TYPE_WORKSTATION;
9391
default_server_announce |= SV_TYPE_SERVER;
9392
default_server_announce |= SV_TYPE_SERVER_UNIX;
9394
/* note that the flag should be set only if we have a
9395
printer service but nmbd doesn't actually load the
9396
services so we can't tell --jerry */
9398
default_server_announce |= SV_TYPE_PRINTQ_SERVER;
9400
switch (lp_announce_as()) {
9401
case ANNOUNCE_AS_NT_SERVER:
9402
default_server_announce |= SV_TYPE_SERVER_NT;
9403
/* fall through... */
9404
case ANNOUNCE_AS_NT_WORKSTATION:
9405
default_server_announce |= SV_TYPE_NT;
9407
case ANNOUNCE_AS_WIN95:
9408
default_server_announce |= SV_TYPE_WIN95_PLUS;
9410
case ANNOUNCE_AS_WFW:
9411
default_server_announce |= SV_TYPE_WFW;
9417
switch (lp_server_role()) {
9418
case ROLE_DOMAIN_MEMBER:
9419
default_server_announce |= SV_TYPE_DOMAIN_MEMBER;
9421
case ROLE_DOMAIN_PDC:
9422
default_server_announce |= SV_TYPE_DOMAIN_CTRL;
9424
case ROLE_DOMAIN_BDC:
9425
default_server_announce |= SV_TYPE_DOMAIN_BAKCTRL;
9427
case ROLE_STANDALONE:
9431
if (lp_time_server())
9432
default_server_announce |= SV_TYPE_TIME_SOURCE;
9434
if (lp_host_msdfs())
9435
default_server_announce |= SV_TYPE_DFS_SERVER;
9438
/***********************************************************
9439
returns role of Samba server
9440
************************************************************/
9442
int lp_server_role(void)
9447
/***********************************************************
9448
If we are PDC then prefer us as DMB
9449
************************************************************/
9451
bool lp_domain_master(void)
9453
if (Globals.iDomainMaster == Auto)
9454
return (lp_server_role() == ROLE_DOMAIN_PDC);
9456
return (bool)Globals.iDomainMaster;
9459
/***********************************************************
9460
If we are DMB then prefer us as LMB
9461
************************************************************/
9463
bool lp_preferred_master(void)
9465
if (Globals.iPreferredMaster == Auto)
9466
return (lp_local_master() && lp_domain_master());
9468
return (bool)Globals.iPreferredMaster;
9471
/*******************************************************************
9473
********************************************************************/
9475
void lp_remove_service(int snum)
9477
ServicePtrs[snum]->valid = False;
9478
invalid_services[num_invalid_services++] = snum;
9481
/*******************************************************************
9483
********************************************************************/
9485
void lp_copy_service(int snum, const char *new_name)
9487
do_section(new_name, NULL);
9489
snum = lp_servicenumber(new_name);
9491
lp_do_parameter(snum, "copy", lp_servicename(snum));
9496
/*******************************************************************
9497
Get the default server type we will announce as via nmbd.
9498
********************************************************************/
9500
int lp_default_server_announce(void)
9502
return default_server_announce;
9505
/*******************************************************************
9506
Split the announce version into major and minor numbers.
9507
********************************************************************/
9509
int lp_major_announce_version(void)
9511
static bool got_major = False;
9512
static int major_version = DEFAULT_MAJOR_VERSION;
9517
return major_version;
9520
if ((vers = lp_announce_version()) == NULL)
9521
return major_version;
9523
if ((p = strchr_m(vers, '.')) == 0)
9524
return major_version;
9527
major_version = atoi(vers);
9528
return major_version;
9531
int lp_minor_announce_version(void)
9533
static bool got_minor = False;
9534
static int minor_version = DEFAULT_MINOR_VERSION;
9539
return minor_version;
9542
if ((vers = lp_announce_version()) == NULL)
9543
return minor_version;
9545
if ((p = strchr_m(vers, '.')) == 0)
9546
return minor_version;
9549
minor_version = atoi(p);
9550
return minor_version;
9553
/***********************************************************
9554
Set the global name resolution order (used in smbclient).
9555
************************************************************/
9557
void lp_set_name_resolve_order(const char *new_order)
9559
string_set(&Globals.szNameResolveOrder, new_order);
9562
const char *lp_printername(int snum)
9564
const char *ret = _lp_printername(snum);
9565
if (ret == NULL || (ret != NULL && *ret == '\0'))
9566
ret = lp_const_servicename(snum);
9572
/***********************************************************
9573
Allow daemons such as winbindd to fix their logfile name.
9574
************************************************************/
9576
void lp_set_logfile(const char *name)
9578
string_set(&Globals.szLogFile, name);
9579
debug_set_logfile(name);
9582
/*******************************************************************
9583
Return the max print jobs per queue.
9584
********************************************************************/
9586
int lp_maxprintjobs(int snum)
9588
int maxjobs = LP_SNUM_OK(snum) ? ServicePtrs[snum]->iMaxPrintJobs : sDefault.iMaxPrintJobs;
9589
if (maxjobs <= 0 || maxjobs >= PRINT_MAX_JOBID)
9590
maxjobs = PRINT_MAX_JOBID - 1;
9595
const char *lp_printcapname(void)
9597
if ((Globals.szPrintcapname != NULL) &&
9598
(Globals.szPrintcapname[0] != '\0'))
9599
return Globals.szPrintcapname;
9601
if (sDefault.iPrinting == PRINT_CUPS) {
9609
if (sDefault.iPrinting == PRINT_BSD)
9610
return "/etc/printcap";
9612
return PRINTCAP_NAME;
9615
/*******************************************************************
9616
Ensure we don't use sendfile if server smb signing is active.
9617
********************************************************************/
9619
static uint32 spoolss_state;
9621
bool lp_disable_spoolss( void )
9623
if ( spoolss_state == SVCCTL_STATE_UNKNOWN )
9624
spoolss_state = _lp_disable_spoolss() ? SVCCTL_STOPPED : SVCCTL_RUNNING;
9626
return spoolss_state == SVCCTL_STOPPED ? True : False;
9629
void lp_set_spoolss_state( uint32 state )
9631
SMB_ASSERT( (state == SVCCTL_STOPPED) || (state == SVCCTL_RUNNING) );
9633
spoolss_state = state;
9636
uint32 lp_get_spoolss_state( void )
9638
return lp_disable_spoolss() ? SVCCTL_STOPPED : SVCCTL_RUNNING;
9641
/*******************************************************************
9642
Ensure we don't use sendfile if server smb signing is active.
9643
********************************************************************/
9645
bool lp_use_sendfile(int snum)
9647
/* Using sendfile blows the brains out of any DOS or Win9x TCP stack... JRA. */
9648
if (Protocol < PROTOCOL_NT1) {
9651
return (_lp_use_sendfile(snum) &&
9652
(get_remote_arch() != RA_WIN95) &&
9653
!srv_is_signing_active());
9656
/*******************************************************************
9657
Turn off sendfile if we find the underlying OS doesn't support it.
9658
********************************************************************/
9660
void set_use_sendfile(int snum, bool val)
9662
if (LP_SNUM_OK(snum))
9663
ServicePtrs[snum]->bUseSendfile = val;
9665
sDefault.bUseSendfile = val;
9668
/*******************************************************************
9669
Turn off storing DOS attributes if this share doesn't support it.
9670
********************************************************************/
9672
void set_store_dos_attributes(int snum, bool val)
9674
if (!LP_SNUM_OK(snum))
9676
ServicePtrs[(snum)]->bStoreDosAttributes = val;
9679
void lp_set_mangling_method(const char *new_method)
9681
string_set(&Globals.szManglingMethod, new_method);
9684
/*******************************************************************
9685
Global state for POSIX pathname processing.
9686
********************************************************************/
9688
static bool posix_pathnames;
9690
bool lp_posix_pathnames(void)
9692
return posix_pathnames;
9695
/*******************************************************************
9696
Change everything needed to ensure POSIX pathname processing (currently
9698
********************************************************************/
9700
void lp_set_posix_pathnames(void)
9702
posix_pathnames = True;
9705
/*******************************************************************
9706
Global state for POSIX lock processing - CIFS unix extensions.
9707
********************************************************************/
9709
bool posix_default_lock_was_set;
9710
static enum brl_flavour posix_cifsx_locktype; /* By default 0 == WINDOWS_LOCK */
9712
enum brl_flavour lp_posix_cifsu_locktype(files_struct *fsp)
9714
if (posix_default_lock_was_set) {
9715
return posix_cifsx_locktype;
9717
return fsp->posix_open ? POSIX_LOCK : WINDOWS_LOCK;
9721
/*******************************************************************
9722
********************************************************************/
9724
void lp_set_posix_default_cifsx_readwrite_locktype(enum brl_flavour val)
9726
posix_default_lock_was_set = True;
9727
posix_cifsx_locktype = val;
9730
int lp_min_receive_file_size(void)
9732
if (Globals.iminreceivefile < 0) {
9735
return MIN(Globals.iminreceivefile, BUFFER_SIZE);
9738
/*******************************************************************
9739
If socket address is an empty character string, it is necessary to
9740
define it as "0.0.0.0".
9741
********************************************************************/
9743
const char *lp_socket_address(void)
9745
char *sock_addr = Globals.szSocketAddress;
9747
if (sock_addr[0] == '\0'){
9748
string_set(&Globals.szSocketAddress, "0.0.0.0");
9750
return Globals.szSocketAddress;
9753
void lp_set_passdb_backend(const char *backend)
9755
string_set(&Globals.szPassdbBackend, backend);